tscircuit 0.0.1995 → 0.0.1996

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -334,7 +334,7 @@ ${face.svg()}`;return svgStr+=`" >
334
334
  `).map(x4=>x4.match(/\(([^)]+)\)/)[1]).map(parseSinglePoint)}function parseArrayOfLineStrings(str){return str.split(`
335
335
  `).map(x4=>x4.match(/\(([^)]+)\)/)[1]).map(parseLineString).reduce((acc,x4)=>[...acc,...x4],[])}function parseWKT(str){if(str.startsWith("POINT")){let pointStr=str.replace(/^POINT \(/,"").replace(/\)$/,"");return parseSinglePoint(pointStr)}else if(str.startsWith("MULTIPOINT")){let multiPointStr=str.replace(/^MULTIPOINT \(/,"").replace(/\)$/,"");return parseMultiPoint(multiPointStr)}else if(str.startsWith("LINESTRING")){let lineStr=str.replace(/^LINESTRING \(/,"").replace(/\)$/,"");return parseLineString(lineStr)}else if(str.startsWith("MULTILINESTRING")){let multilineStr=str.replace(/^MULTILINESTRING /,"");return parseMultiLineString(multilineStr)}else{if(str.startsWith("POLYGON")||str.startsWith("MULTIPOLYGON"))return parsePolygon(str);if(str.startsWith("GEOMETRYCOLLECTION")){let regex=/(?<type>POINT|LINESTRING|POLYGON|MULTIPOINT|MULTILINESTRING|MULTIPOLYGON) \((?:[^\(\)]|\([^\)]*\))*\)/g,wktArray=str.match(regex);return wktArray[0].startsWith("GEOMETRYCOLLECTION")&&(wktArray[0]=wktArray[0].replace("GEOMETRYCOLLECTION (","")),wktArray.map(parseWKT).map(x4=>x4 instanceof Array?x4:[x4]).reduce((acc,x4)=>[...acc,...x4],[])}else{if(isArrayOfPoints(str))return parseArrayOfPoints(str);if(isArrayOfLines(str))return parseArrayOfLineStrings(str)}}return[]}function isArrayOfPoints(str){return str.split(`
336
336
  `)?.every(str2=>str2.includes("POINT"))}function isArrayOfLines(str){return str.split(`
337
- `)?.every(str2=>str2.includes("LINESTRING"))}function isWktString(str){return str.startsWith("POINT")||isArrayOfPoints(str)||str.startsWith("LINESTRING")||isArrayOfLines(str)||str.startsWith("MULTILINESTRING")||str.startsWith("POLYGON")||str.startsWith("MULTIPOINT")||str.startsWith("MULTIPOLYGON")||str.startsWith("GEOMETRYCOLLECTION")}Flatten.isWktString=isWktString;Flatten.parseWKT=parseWKT;Flatten.BooleanOperations=BooleanOperations;Flatten.Relations=Relations;var package_default={name:"@tscircuit/capacity-autorouter",main:"./dist/index.js",version:"0.0.624",type:"module",files:["dist"],scripts:{start:"cosmos",build:"tsup ./lib/index.ts --minify terser --external @tscircuit/core --external circuit-to-svg --format esm --dts --sourcemap",bench:"bun test tests/spatial-index-bench.test.ts",format:"biome format --write .","format:check":"biome format .","vercel-build":"cosmos-export","run-sample":"bun scripts/run-sample.ts","repomix:lib":"repomix --ignore 'testing/**,**/TwoRouteHighDensitySolver/**,**/RouteStitchingSolver/**,solvers/CapacitySegmentPointOptimizer/CapacitySegmentPointOptimizer.ts' lib","bug-report":"bun run scripts/download-bug-report.ts","bug-report-with-test":"bun run scripts/create-bug-report-test.ts"},devDependencies:{"@biomejs/biome":"^1.9.4","@radix-ui/react-icons":"^1.3.2","@radix-ui/react-menubar":"^1.1.14","@react-hook/resize-observer":"^2.0.2","@resvg/resvg-js":"^2.6.2","@tsci/seveibar.dataset-srj13":"git+https://github.com/tscircuit/dataset-srj13.git#56db70039aeb28a76540fe951b5a96be60f9e949","@tsci/tscircuit.dataset-srj16-bga-breakouts":"git+https://github.com/tscircuit/dataset-srj16-bga-breakouts.git#e8b2e70e1f50a0dba3ad977e140766f53b9b75fb","@tsci/tscircuit.dataset-srj19-bga-passive-overlays":"git+https://github.com/tscircuit/dataset-srj19.git#5104d03ed72a9090d76ea1f42ae9f4bc439f7534","@tsci/tscircuit.dataset-srj20-partial-bga-breakouts":"git+https://github.com/tscircuit/dataset-srj20.git#9384fb8f45fb479b97178ddfa42fc74c69afbbec","@tsci/tscircuit.dataset-srj12-bus-routing":"git+https://github.com/tscircuit/dataset-srj12-bus-routing.git#ba82f86a7d1288566b7144eb8661ad2549c5f328","@tscircuit/autorouting-dataset-01":"git+https://github.com/tscircuit/autorouting-dataset-01.git#f9c0a8fe11e9bc05064bdafdf61f33eb38fa2b8e","@tscircuit/checks":"^0.0.126","@tscircuit/circuit-json-util":"^0.0.94","@tscircuit/core":"0.0.337","@tscircuit/curvy-trace-solver":"^0.0.10","@tscircuit/dataset-srj05":"git+https://github.com/tscircuit/dataset-srj05.git#9a49c126a89c083dc4d2b72cd17184735f637762","@tscircuit/fixed-via-hypergraph-solver":"https://codeload.github.com/tscircuit/fixed-via-hypergraph-solver/tar.gz/bed37a6201b5dd07c9cc68b828917ecc20d6d049","@tscircuit/hypergraph":"^0.0.71","@tscircuit/jumper-topology-generator":"^0.0.4","@tscircuit/krt-wasm":"^0.1.0","@tscircuit/math-utils":"^0.0.36","@tscircuit/rectdiff":"git+https://github.com/tscircuit/rectdiff.git#a26f062441ed6baa679655fe10374b01017dcf98","@tscircuit/solver-utils":"^0.0.16","@types/bun":"^1.2.23","@types/fast-json-stable-stringify":"^2.1.2","@types/object-hash":"^3.0.6","@types/rbush":"^4.0.0","@types/react":"^19.0.8","@types/react-dom":"^19.0.3","@vercel/node":"^5.1.7","@vitejs/plugin-react":"^4.3.4","bun-match-svg":"^0.0.14","circuit-json-to-connectivity-map":"^0.0.19","circuit-json":"^0.0.419","circuit-to-svg":"^0.0.220",clsx:"^2.1.1","dataset-srj11-45-degree":"git+https://github.com/tscircuit/dataset-srj11-45-degree.git#c49dd43c38f85fa2777c7d67393df413ca8d5a75","dataset-srj18":"git+https://github.com/tscircuit/dataset-srj18.git#fceb58cbb1b479561f45f37393a0a343b5bed62c",flatbush:"^4.4.0","graphics-debug":"0.0.94","high-density-dataset-z04":"git+https://github.com/tscircuit/high-density-dataset-z04.git#b9128ed52f5a50102b6526319be1d4ec33dca2c2","kicad-to-circuit-json":"0.0.77",kleur:"^4.1.5","looks-same":"9","pcb-poly-hyper-graph":"https://codeload.github.com/tscircuit/pcb-poly-hyper-graph/tar.gz/80db1463c4a47506eeda15b2c14d59679de900f8",rbush:"^4.0.1",react:"18","react-cosmos":"^6.2.3","react-cosmos-plugin-vite":"^6.2.0","react-dom":"18","react-konva":"18",recharts:"^2.15.1","tailwind-merge":"^3.2.0",terser:"^5.43.1","tiny-hypergraph":"git+https://github.com/tscircuit/tiny-hypergraph.git#c9aa5b7c9da5e007e2fff5d5c360490551fe3329","tiny-hypergraph-poly":"git+https://github.com/tscircuit/tiny-hypergraph.git#7b93b4c",tsup:"^8.3.6",typescript:"^5.9.3","use-mouse-matrix-transform":"^1.3.0",vite:"^6.0.11","vite-tsconfig-paths":"^5.1.4","zdwiel-dataset":"git+https://github.com/dwiel/tscircuit-benchmark.git#be36518b5bf51755dae92c230061ab3cf4e3e063","high-density-repair01":"git+https://github.com/tscircuit/high-density-repair01.git#44853f591f596fc1ef266e63b90082d409834bf0","high-density-repair02":"https://codeload.github.com/tscircuit/high-density-repair02/tar.gz/2afc0cbba3bf2f7eb6b9cd33615d21e9ad9352d4","high-density-repair03":"git+https://github.com/tscircuit/high-density-repair03.git#db73a5f","@tscircuit/high-density-a01":"git+https://github.com/tscircuit/high-density-a01.git#9a3a3d"},dependencies:{"fast-json-stable-stringify":"^2.1.0","object-hash":"^3.0.0","stack-svgs":"^0.0.1"}};init_dist2();init_dist4();init_dist2();init_dist6();var import_react=__toESM(require_react(),1),import_react_reconciler=__toESM(require_react_reconciler(),1),import_constants=__toESM(require_constants(),1);init_zod();init_dist2();init_dist2();init_zod();init_dist2();init_dist2();init_zod();init_dist2();var e2={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},t=e7=>(e7 instanceof Float64Array||e7 instanceof Float32Array||Array.isArray(e7)&&e7.every(e8=>typeof e8=="number"))&&[6,16].some(t54=>e7.length===t54),n=t54=>t54 instanceof DOMMatrix||t54 instanceof h||typeof t54=="object"&&Object.keys(e2).every(e7=>t54&&e7 in t54),r3=e7=>{let n3=new h,r6=Array.from(e7);if(!t(r6))throw TypeError(`CSSMatrix: "${r6.join(",")}" must be an array with 6/16 numbers.`);if(r6.length===16){let[e8,t54,i3,a3,o6,s6,c6,l7,u6,d4,f4,p5,m4,h3,g4,_3]=r6;n3.m11=e8,n3.a=e8,n3.m21=o6,n3.c=o6,n3.m31=u6,n3.m41=m4,n3.e=m4,n3.m12=t54,n3.b=t54,n3.m22=s6,n3.d=s6,n3.m32=d4,n3.m42=h3,n3.f=h3,n3.m13=i3,n3.m23=c6,n3.m33=f4,n3.m43=g4,n3.m14=a3,n3.m24=l7,n3.m34=p5,n3.m44=_3}else if(r6.length===6){let[e8,t54,i3,a3,o6,s6]=r6;n3.m11=e8,n3.a=e8,n3.m12=t54,n3.b=t54,n3.m21=i3,n3.c=i3,n3.m22=a3,n3.d=a3,n3.m41=o6,n3.e=o6,n3.m42=s6,n3.f=s6}return n3},i=e7=>{if(n(e7))return r3([e7.m11,e7.m12,e7.m13,e7.m14,e7.m21,e7.m22,e7.m23,e7.m24,e7.m31,e7.m32,e7.m33,e7.m34,e7.m41,e7.m42,e7.m43,e7.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(e7)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},a=e7=>{if(typeof e7!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(e7)}" is not a string.`);let t54=String(e7).replace(/\s/g,""),n3=new h,i3=`CSSMatrix: invalid transform string "${e7}"`;return t54.split(")").filter(e8=>e8).forEach(e8=>{let[t55,a3]=e8.split("(");if(!a3)throw TypeError(i3);let o6=a3.split(",").map(e10=>e10.includes("rad")?180/Math.PI*parseFloat(e10):parseFloat(e10)),[s6,c6,l7,u6]=o6,d4=[s6,c6,l7],f4=[s6,c6,l7,u6];if(t55==="perspective"&&s6&&[c6,l7].every(e10=>e10===void 0))n3.m34=-1/s6;else if(t55.includes("matrix")&&[6,16].includes(o6.length)&&o6.every(e10=>!Number.isNaN(+e10))){let e10=o6.map(e11=>Math.abs(e11)<1e-6?0:e11);n3.multiplySelf(r3(e10))}else if(t55==="translate3d"&&d4.every(e10=>!Number.isNaN(+e10)))n3.translateSelf(s6,c6,l7);else if(t55==="translate"&&s6&&l7===void 0)n3.translateSelf(s6,c6||0,0);else if(t55==="rotate3d"&&f4.every(e10=>!Number.isNaN(+e10))&&u6)n3.rotateAxisAngleSelf(s6,c6,l7,u6);else if(t55==="rotate"&&s6&&[c6,l7].every(e10=>e10===void 0))n3.rotateSelf(0,0,s6);else if(t55==="scale3d"&&d4.every(e10=>!Number.isNaN(+e10))&&d4.some(e10=>e10!==1))n3.scaleSelf(s6,c6,l7);else if(t55==="scale"&&!Number.isNaN(s6)&&(s6!==1||c6!==1)&&l7===void 0){let e10=Number.isNaN(+c6)?s6:c6;n3.scaleSelf(s6,e10,1)}else if(t55==="skew"&&(s6||!Number.isNaN(s6)&&c6)&&l7===void 0)n3.skewSelf(s6,c6||0);else if(["translate","rotate","scale","skew"].some(e10=>t55.includes(e10))&&/[XYZ]/.test(t55)&&s6&&[c6,l7].every(e10=>e10===void 0))if(t55==="skewX"||t55==="skewY")n3[t55==="skewX"?"skewXSelf":"skewYSelf"](s6);else{let e10=t55.replace(/[XYZ]/,""),r6=t55.replace(e10,""),i6=["X","Y","Z"].indexOf(r6),a4=e10==="scale"?1:0,o7=e10+"Self",c7=[i6===0?s6:a4,i6===1?s6:a4,i6===2?s6:a4];n3[o7](...c7)}else throw TypeError(i3)}),n3},o=(e7,t54)=>t54?[e7.a,e7.b,e7.c,e7.d,e7.e,e7.f]:[e7.m11,e7.m12,e7.m13,e7.m14,e7.m21,e7.m22,e7.m23,e7.m24,e7.m31,e7.m32,e7.m33,e7.m34,e7.m41,e7.m42,e7.m43,e7.m44],s2=(e7,t54,n3)=>{let r6=new h;return r6.m41=e7,r6.e=e7,r6.m42=t54,r6.f=t54,r6.m43=n3,r6},c=(e7,t54,n3)=>{let r6=new h,i3=Math.PI/180,a3=e7*i3,o6=t54*i3,s6=n3*i3,c6=Math.cos(a3),l7=-Math.sin(a3),u6=Math.cos(o6),d4=-Math.sin(o6),f4=Math.cos(s6),p5=-Math.sin(s6),m4=u6*f4,g4=-u6*p5;r6.m11=m4,r6.a=m4,r6.m12=g4,r6.b=g4,r6.m13=d4;let _3=l7*d4*f4+c6*p5;r6.m21=_3,r6.c=_3;let v3=c6*f4-l7*d4*p5;return r6.m22=v3,r6.d=v3,r6.m23=-l7*u6,r6.m31=l7*p5-c6*d4*f4,r6.m32=l7*f4+c6*d4*p5,r6.m33=c6*u6,r6},l=(e7=0,t54=0,n3=0,r6=0)=>{let i3=new h,a3=Math.sqrt(e7*e7+t54*t54+n3*n3);if(a3===0)return i3;let o6=e7/a3,s6=t54/a3,c6=n3/a3,l7=Math.PI/360*r6,u6=Math.sin(l7),d4=Math.cos(l7),f4=u6*u6,p5=o6*o6,m4=s6*s6,g4=c6*c6,_3=1-2*(m4+g4)*f4;i3.m11=_3,i3.a=_3;let v3=2*(o6*s6*f4+c6*u6*d4);i3.m12=v3,i3.b=v3,i3.m13=2*(o6*c6*f4-s6*u6*d4);let y3=2*(s6*o6*f4-c6*u6*d4);i3.m21=y3,i3.c=y3;let b4=1-2*(g4+p5)*f4;return i3.m22=b4,i3.d=b4,i3.m23=2*(s6*c6*f4+o6*u6*d4),i3.m31=2*(c6*o6*f4+s6*u6*d4),i3.m32=2*(c6*s6*f4-o6*u6*d4),i3.m33=1-2*(p5+m4)*f4,i3},u3=(e7,t54,n3)=>{let r6=new h;return r6.m11=e7,r6.a=e7,r6.m22=t54,r6.d=t54,r6.m33=n3,r6},d=(e7,t54)=>{let n3=new h;if(e7){let t55=e7*Math.PI/180,r6=Math.tan(t55);n3.m21=r6,n3.c=r6}if(t54){let e8=t54*Math.PI/180,r6=Math.tan(e8);n3.m12=r6,n3.b=r6}return n3},f=e7=>d(e7,0),p=e7=>d(0,e7),m=(e7,t54)=>r3([t54.m11*e7.m11+t54.m12*e7.m21+t54.m13*e7.m31+t54.m14*e7.m41,t54.m11*e7.m12+t54.m12*e7.m22+t54.m13*e7.m32+t54.m14*e7.m42,t54.m11*e7.m13+t54.m12*e7.m23+t54.m13*e7.m33+t54.m14*e7.m43,t54.m11*e7.m14+t54.m12*e7.m24+t54.m13*e7.m34+t54.m14*e7.m44,t54.m21*e7.m11+t54.m22*e7.m21+t54.m23*e7.m31+t54.m24*e7.m41,t54.m21*e7.m12+t54.m22*e7.m22+t54.m23*e7.m32+t54.m24*e7.m42,t54.m21*e7.m13+t54.m22*e7.m23+t54.m23*e7.m33+t54.m24*e7.m43,t54.m21*e7.m14+t54.m22*e7.m24+t54.m23*e7.m34+t54.m24*e7.m44,t54.m31*e7.m11+t54.m32*e7.m21+t54.m33*e7.m31+t54.m34*e7.m41,t54.m31*e7.m12+t54.m32*e7.m22+t54.m33*e7.m32+t54.m34*e7.m42,t54.m31*e7.m13+t54.m32*e7.m23+t54.m33*e7.m33+t54.m34*e7.m43,t54.m31*e7.m14+t54.m32*e7.m24+t54.m33*e7.m34+t54.m34*e7.m44,t54.m41*e7.m11+t54.m42*e7.m21+t54.m43*e7.m31+t54.m44*e7.m41,t54.m41*e7.m12+t54.m42*e7.m22+t54.m43*e7.m32+t54.m44*e7.m42,t54.m41*e7.m13+t54.m42*e7.m23+t54.m43*e7.m33+t54.m44*e7.m43,t54.m41*e7.m14+t54.m42*e7.m24+t54.m43*e7.m34+t54.m44*e7.m44]),_a3,h=(_a3=class{constructor(e7){return this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0,this.m11=1,this.m12=0,this.m13=0,this.m14=0,this.m21=0,this.m22=1,this.m23=0,this.m24=0,this.m31=0,this.m32=0,this.m33=1,this.m34=0,this.m41=0,this.m42=0,this.m43=0,this.m44=1,e7?this.setMatrixValue(e7):this}get isIdentity(){return this.m11===1&&this.m12===0&&this.m13===0&&this.m14===0&&this.m21===0&&this.m22===1&&this.m23===0&&this.m24===0&&this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m41===0&&this.m42===0&&this.m43===0&&this.m44===1}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(e7){return typeof e7=="string"&&e7.length&&e7!=="none"?a(e7):Array.isArray(e7)||e7 instanceof Float64Array||e7 instanceof Float32Array?r3(e7):typeof e7=="object"?i(e7):this}toFloat32Array(e7){return Float32Array.from(o(this,e7))}toFloat64Array(e7){return Float64Array.from(o(this,e7))}toString(){let{is2D:e7}=this,t54=this.toFloat64Array(e7).join(", ");return`${e7?"matrix":"matrix3d"}(${t54})`}toJSON(){let{is2D:e7,isIdentity:t54}=this;return{...this,is2D:e7,isIdentity:t54}}multiply(e7){return m(this,e7)}translate(e7,t54,n3){return this.multiply(s2(e7,t54??0,n3??0))}scale(e7,t54,n3){return this.multiply(u3(e7,t54??e7,n3??1))}rotate(e7,t54,n3){let r6=e7,i3=t54||0,a3=n3||0;return typeof e7=="number"&&t54===void 0&&n3===void 0&&(a3=r6,r6=0,i3=0),this.multiply(c(r6,i3,a3))}rotateAxisAngle(e7=0,t54=0,n3=0,r6=0){if([e7,t54,n3,r6].some(e8=>!Number.isFinite(e8)))throw TypeError("CSSMatrix: expecting 4 values");return Math.sqrt(e7*e7+t54*t54+n3*n3)===0?i(this):this.multiply(l(e7,t54,n3,r6))}skewX(e7){return this.multiply(f(e7))}skewY(e7){return this.multiply(p(e7))}skew(e7,t54){return this.multiply(d(e7,t54))}multiplySelf(e7){let t54=m(this,e7);return Object.assign(this,t54),this}translateSelf(e7,t54,n3){return this.multiplySelf(s2(e7,t54??0,n3??0))}scaleSelf(e7,t54,n3){return this.multiplySelf(u3(e7,t54??e7,n3??1))}rotateSelf(e7,t54,n3){let r6=e7,i3=t54||0,a3=n3||0;return typeof e7=="number"&&t54===void 0&&n3===void 0&&(a3=r6,r6=0,i3=0),this.multiplySelf(c(r6,i3,a3))}rotateAxisAngleSelf(e7=0,t54=0,n3=0,r6=0){if([e7,t54,n3,r6].some(e8=>!Number.isFinite(e8)))throw TypeError("CSSMatrix: expecting 4 values");return Math.sqrt(e7*e7+t54*t54+n3*n3)===0?this:this.multiplySelf(l(e7,t54,n3,r6))}skewXSelf(e7){return this.multiplySelf(f(e7))}skewYSelf(e7){return this.multiplySelf(p(e7))}skewSelf(e7,t54){return this.multiplySelf(d(e7,t54))}transformPoint(e7){let t54=this.m11*e7.x+this.m21*e7.y+this.m31*e7.z+this.m41*e7.w,n3=this.m12*e7.x+this.m22*e7.y+this.m32*e7.z+this.m42*e7.w,r6=this.m13*e7.x+this.m23*e7.y+this.m33*e7.z+this.m43*e7.w,i3=this.m14*e7.x+this.m24*e7.y+this.m34*e7.z+this.m44*e7.w;return e7 instanceof DOMPoint?new DOMPoint(t54,n3,r6,i3):{x:t54,y:n3,z:r6,w:i3}}},__publicField(_a3,"Translate",s2),__publicField(_a3,"Rotate",c),__publicField(_a3,"RotateAxisAngle",l),__publicField(_a3,"Scale",u3),__publicField(_a3,"SkewX",f),__publicField(_a3,"SkewY",p),__publicField(_a3,"Skew",d),__publicField(_a3,"Multiply",m),__publicField(_a3,"fromArray",r3),__publicField(_a3,"fromMatrix",i),__publicField(_a3,"fromString",a),__publicField(_a3,"toArray",o),__publicField(_a3,"isCompatibleArray",t),__publicField(_a3,"isCompatibleObject",n),_a3);var version="2.2.1",midPoint=([ax3,ay3],[bx3,by3],t54)=>[ax3+(bx3-ax3)*t54,ay3+(by3-ay3)*t54],distanceSquareRoot=(a3,b4)=>Math.sqrt((a3[0]-b4[0])*(a3[0]-b4[0])+(a3[1]-b4[1])*(a3[1]-b4[1])),getLineLength=(x12,y12,x22,y22)=>distanceSquareRoot([x12,y12],[x22,y22]),getPointAtLineLength=(x12,y12,x22,y22,distance8)=>{let point6={x:x12,y:y12};if(typeof distance8=="number"){let length4=distanceSquareRoot([x12,y12],[x22,y22]);if(distance8<=0)point6={x:x12,y:y12};else if(distance8>=length4)point6={x:x22,y:y22};else{let[x4,y3]=midPoint([x12,y12],[x22,y22],distance8/length4);point6={x:x4,y:y3}}}return point6},getLineBBox=(x12,y12,x22,y22)=>{let{min,max:max2}=Math;return[min(x12,x22),min(y12,y22),max2(x12,x22),max2(y12,y22)]},lineTools={getLineBBox,getLineLength,getPointAtLineLength},arcLength=(rx3,ry3,theta)=>{let halfTheta=theta/2,sinHalfTheta=Math.sin(halfTheta),cosHalfTheta=Math.cos(halfTheta),term1=rx3**2*sinHalfTheta**2,term2=ry3**2*cosHalfTheta**2,length4=Math.sqrt(term1+term2)*theta;return Math.abs(length4)},arcPoint=(cx3,cy3,rx3,ry3,alpha,theta)=>{let{sin:sin6,cos:cos6}=Math,cosA=cos6(alpha),sinA=sin6(alpha),x4=rx3*cos6(theta),y3=ry3*sin6(theta);return[cx3+cosA*x4-sinA*y3,cy3+sinA*x4+cosA*y3]},angleBetween=(v02,v12)=>{let{x:v0x,y:v0y}=v02,{x:v1x,y:v1y}=v12,p5=v0x*v1x+v0y*v1y,n3=Math.sqrt((v0x**2+v0y**2)*(v1x**2+v1y**2));return(v0x*v1y-v0y*v1x<0?-1:1)*Math.acos(p5/n3)},getArcProps=(x12,y12,RX,RY,angle,LAF,SF2,x4,y3)=>{let{abs,sin:sin6,cos:cos6,sqrt,PI:PI7}=Math,rx3=abs(RX),ry3=abs(RY),xRotRad=(angle%360+360)%360*(PI7/180);if(x12===x4&&y12===y3)return{rx:rx3,ry:ry3,startAngle:0,endAngle:0,center:{x:x4,y:y3}};if(rx3===0||ry3===0)return{rx:rx3,ry:ry3,startAngle:0,endAngle:0,center:{x:(x4+x12)/2,y:(y3+y12)/2}};let dx3=(x12-x4)/2,dy3=(y12-y3)/2,transformedPoint={x:cos6(xRotRad)*dx3+sin6(xRotRad)*dy3,y:-sin6(xRotRad)*dx3+cos6(xRotRad)*dy3},radiiCheck=transformedPoint.x**2/rx3**2+transformedPoint.y**2/ry3**2;radiiCheck>1&&(rx3*=sqrt(radiiCheck),ry3*=sqrt(radiiCheck));let cRadicand=(rx3**2*ry3**2-rx3**2*transformedPoint.y**2-ry3**2*transformedPoint.x**2)/(rx3**2*transformedPoint.y**2+ry3**2*transformedPoint.x**2);cRadicand=cRadicand<0?0:cRadicand;let cCoef=(LAF!==SF2?1:-1)*sqrt(cRadicand),transformedCenter={x:cCoef*(rx3*transformedPoint.y/ry3),y:cCoef*(-(ry3*transformedPoint.x)/rx3)},center2={x:cos6(xRotRad)*transformedCenter.x-sin6(xRotRad)*transformedCenter.y+(x12+x4)/2,y:sin6(xRotRad)*transformedCenter.x+cos6(xRotRad)*transformedCenter.y+(y12+y3)/2},startVector={x:(transformedPoint.x-transformedCenter.x)/rx3,y:(transformedPoint.y-transformedCenter.y)/ry3},startAngle=angleBetween({x:1,y:0},startVector),sweepAngle=angleBetween(startVector,{x:(-transformedPoint.x-transformedCenter.x)/rx3,y:(-transformedPoint.y-transformedCenter.y)/ry3});return!SF2&&sweepAngle>0?sweepAngle-=2*PI7:SF2&&sweepAngle<0&&(sweepAngle+=2*PI7),sweepAngle%=2*PI7,{center:center2,startAngle,endAngle:startAngle+sweepAngle,rx:rx3,ry:ry3}},getArcLength=(x12,y12,RX,RY,angle,LAF,SF2,x4,y3)=>{let{rx:rx3,ry:ry3,startAngle,endAngle}=getArcProps(x12,y12,RX,RY,angle,LAF,SF2,x4,y3);return arcLength(rx3,ry3,endAngle-startAngle)},getPointAtArcLength=(x12,y12,RX,RY,angle,LAF,SF2,x4,y3,distance8)=>{let point6={x:x12,y:y12},{center:center2,rx:rx3,ry:ry3,startAngle,endAngle}=getArcProps(x12,y12,RX,RY,angle,LAF,SF2,x4,y3);if(typeof distance8=="number"){let length4=arcLength(rx3,ry3,endAngle-startAngle);if(distance8<=0)point6={x:x12,y:y12};else if(distance8>=length4)point6={x:x4,y:y3};else{if(x12===x4&&y12===y3)return{x:x4,y:y3};if(rx3===0||ry3===0)return getPointAtLineLength(x12,y12,x4,y3,distance8);let{PI:PI7,cos:cos6,sin:sin6}=Math,sweepAngle=endAngle-startAngle,xRotRad=(angle%360+360)%360*(PI7/180),alpha=startAngle+sweepAngle*(distance8/length4),ellipseComponentX=rx3*cos6(alpha),ellipseComponentY=ry3*sin6(alpha);point6={x:cos6(xRotRad)*ellipseComponentX-sin6(xRotRad)*ellipseComponentY+center2.x,y:sin6(xRotRad)*ellipseComponentX+cos6(xRotRad)*ellipseComponentY+center2.y}}}return point6},getArcBBox=(x12,y12,RX,RY,angle,LAF,SF2,x4,y3)=>{let{center:center2,rx:rx3,ry:ry3,startAngle,endAngle}=getArcProps(x12,y12,RX,RY,angle,LAF,SF2,x4,y3),deltaAngle=endAngle-startAngle,{min,max:max2,tan:tan6,atan2,PI:PI7}=Math,{x:cx3,y:cy3}=center2,alpha=angle*PI7/180,tangent=tan6(alpha),theta=atan2(-ry3*tangent,rx3),angle1=theta,angle2=theta+PI7,angle3=atan2(ry3,rx3*tangent),angle4=angle3+PI7,xArray=[x4],yArray=[y3],xMin=min(x12,x4),xMax=max2(x12,x4),yMin=min(y12,y3),yMax=max2(y12,y3),pP2=arcPoint(cx3,cy3,rx3,ry3,alpha,endAngle-deltaAngle*1e-5),pP3=arcPoint(cx3,cy3,rx3,ry3,alpha,endAngle-deltaAngle*.99999);if(pP2[0]>xMax||pP3[0]>xMax){let p12=arcPoint(cx3,cy3,rx3,ry3,alpha,angle1);xArray.push(p12[0]),yArray.push(p12[1])}if(pP2[0]<xMin||pP3[0]<xMin){let p22=arcPoint(cx3,cy3,rx3,ry3,alpha,angle2);xArray.push(p22[0]),yArray.push(p22[1])}if(pP2[1]<yMin||pP3[1]<yMin){let p42=arcPoint(cx3,cy3,rx3,ry3,alpha,angle4);xArray.push(p42[0]),yArray.push(p42[1])}if(pP2[1]>yMax||pP3[1]>yMax){let p32=arcPoint(cx3,cy3,rx3,ry3,alpha,angle3);xArray.push(p32[0]),yArray.push(p32[1])}return xMin=min.apply([],xArray),yMin=min.apply([],yArray),xMax=max2.apply([],xArray),yMax=max2.apply([],yArray),[xMin,yMin,xMax,yMax]},arcTools={angleBetween,arcLength,arcPoint,getArcBBox,getArcLength,getArcProps,getPointAtArcLength},Tvalues=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],Cvalues=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],deriveBezier=points=>{let dpoints=[];for(let p5=points,d4=p5.length,c6=d4-1;d4>1;d4-=1,c6-=1){let list=[];for(let j5=0;j5<c6;j5+=1)list.push({x:c6*(p5[j5+1].x-p5[j5].x),y:c6*(p5[j5+1].y-p5[j5].y),t:0});dpoints.push(list),p5=list}return dpoints},computeBezier=(points,t54)=>{if(t54===0)return points[0].t=0,points[0];let order=points.length-1;if(t54===1)return points[order].t=1,points[order];let mt3=1-t54,p5=points;if(order===0)return points[0].t=t54,points[0];if(order===1)return{x:mt3*p5[0].x+t54*p5[1].x,y:mt3*p5[0].y+t54*p5[1].y,t:t54};let mt22=mt3*mt3,t210=t54*t54,a3=0,b4=0,c6=0,d4=0;return order===2?(p5=[p5[0],p5[1],p5[2],{x:0,y:0}],a3=mt22,b4=mt3*t54*2,c6=t210):order===3&&(a3=mt22*mt3,b4=mt22*t54*3,c6=mt3*t210*3,d4=t54*t210),{x:a3*p5[0].x+b4*p5[1].x+c6*p5[2].x+d4*p5[3].x,y:a3*p5[0].y+b4*p5[1].y+c6*p5[2].y+d4*p5[3].y,t:t54}},calculateBezier=(derivativeFn,t54)=>{let d4=derivativeFn(t54),l7=d4.x*d4.x+d4.y*d4.y;return Math.sqrt(l7)},bezierLength=derivativeFn=>{let len=Tvalues.length,sum=0;for(let i3=0,t54;i3<len;i3++)t54=.5*Tvalues[i3]+.5,sum+=Cvalues[i3]*calculateBezier(derivativeFn,t54);return .5*sum},getBezierLength=curve=>{let points=[];for(let idx=0,len=curve.length,step=2;idx<len;idx+=step)points.push({x:curve[idx],y:curve[idx+1]});let dpoints=deriveBezier(points);return bezierLength(t54=>computeBezier(dpoints[0],t54))},CBEZIER_MINMAX_EPSILON=1e-8,minmaxQ=([v12,cp3,v22])=>{let min=Math.min(v12,v22),max2=Math.max(v12,v22);if(cp3>=v12?v22>=cp3:v22<=cp3)return[min,max2];let E4=(v12*v22-cp3*cp3)/(v12-2*cp3+v22);return E4<min?[E4,max2]:[min,E4]},minmaxC=([v12,cp1,cp22,v22])=>{let K4=v12-3*cp1+3*cp22-v22;if(Math.abs(K4)<1e-8)return v12===v22&&v12===cp1?[v12,v22]:minmaxQ([v12,-.5*v12+1.5*cp1,v12-3*cp1+3*cp22]);let T6=-v12*cp22+v12*v22-cp1*cp22-cp1*v22+cp1*cp1+cp22*cp22;if(T6<=0)return[Math.min(v12,v22),Math.max(v12,v22)];let S7=Math.sqrt(T6),min=Math.min(v12,v22),max2=Math.max(v12,v22),L5=v12-2*cp1+cp22;for(let R6=(L5+S7)/K4,i3=1;i3<=2;R6=(L5-S7)/K4,i3++)if(R6>0&&R6<1){let Q5=v12*(1-R6)*(1-R6)*(1-R6)+cp1*3*(1-R6)*(1-R6)*R6+cp22*3*(1-R6)*R6*R6+v22*R6*R6*R6;Q5<min&&(min=Q5),Q5>max2&&(max2=Q5)}return[min,max2]},bezierTools={bezierLength,calculateBezier,CBEZIER_MINMAX_EPSILON,computeBezier,Cvalues,deriveBezier,getBezierLength,minmaxC,minmaxQ,Tvalues},getPointAtCubicSegmentLength=([x12,y12,c1x,c1y,c2x,c2y,x22,y22],t54)=>{let t110=1-t54;return{x:t110**3*x12+3*t110**2*t54*c1x+3*t110*t54**2*c2x+t54**3*x22,y:t110**3*y12+3*t110**2*t54*c1y+3*t110*t54**2*c2y+t54**3*y22}},getCubicLength=(x12,y12,c1x,c1y,c2x,c2y,x22,y22)=>getBezierLength([x12,y12,c1x,c1y,c2x,c2y,x22,y22]),getPointAtCubicLength=(x12,y12,c1x,c1y,c2x,c2y,x22,y22,distance8)=>{let distanceIsNumber=typeof distance8=="number",point6={x:x12,y:y12};if(distanceIsNumber){let currentLength=getBezierLength([x12,y12,c1x,c1y,c2x,c2y,x22,y22]);distance8<=0||(distance8>=currentLength?point6={x:x22,y:y22}:point6=getPointAtCubicSegmentLength([x12,y12,c1x,c1y,c2x,c2y,x22,y22],distance8/currentLength))}return point6},getCubicBBox=(x12,y12,c1x,c1y,c2x,c2y,x22,y22)=>{let cxMinMax=minmaxC([x12,c1x,c2x,x22]),cyMinMax=minmaxC([y12,c1y,c2y,y22]);return[cxMinMax[0],cyMinMax[0],cxMinMax[1],cyMinMax[1]]},cubicTools={getCubicBBox,getCubicLength,getPointAtCubicLength,getPointAtCubicSegmentLength},getPointAtQuadSegmentLength=([x12,y12,cx3,cy3,x22,y22],t54)=>{let t110=1-t54;return{x:t110**2*x12+2*t110*t54*cx3+t54**2*x22,y:t110**2*y12+2*t110*t54*cy3+t54**2*y22}},getQuadLength=(x12,y12,cx3,cy3,x22,y22)=>getBezierLength([x12,y12,cx3,cy3,x22,y22]),getPointAtQuadLength=(x12,y12,cx3,cy3,x22,y22,distance8)=>{let distanceIsNumber=typeof distance8=="number",point6={x:x12,y:y12};if(distanceIsNumber){let currentLength=getBezierLength([x12,y12,cx3,cy3,x22,y22]);distance8<=0||(distance8>=currentLength?point6={x:x22,y:y22}:point6=getPointAtQuadSegmentLength([x12,y12,cx3,cy3,x22,y22],distance8/currentLength))}return point6},getQuadBBox=(x12,y12,cx3,cy3,x22,y22)=>{let cxMinMax=minmaxQ([x12,cx3,x22]),cyMinMax=minmaxQ([y12,cy3,y22]);return[cxMinMax[0],cyMinMax[0],cxMinMax[1],cyMinMax[1]]},quadTools={getPointAtQuadLength,getPointAtQuadSegmentLength,getQuadBBox,getQuadLength},polygonArea=polygon2=>{let n3=polygon2.length,i3=-1,a3,b4=polygon2[n3-1],area=0;for(;++i3<n3;)a3=b4,b4=polygon2[i3],area+=a3[1]*b4[0]-a3[0]*b4[1];return area/2},polygonLength=polygon2=>polygon2.reduce((length4,point6,i3)=>i3?length4+distanceSquareRoot(polygon2[i3-1],point6):0,0),polygonCentroid=polygon2=>{if(polygon2.length===0)return[0,0];let sumX=0,sumY=0;for(let[x4,y3]of polygon2)sumX+=x4,sumY+=y3;let count=polygon2.length;return[sumX/count,sumY/count]},polygonTools={polygonArea,polygonLength,polygonCentroid},rotateVector=(x4,y3,rad)=>{let{sin:sin6,cos:cos6}=Math;return{x:x4*cos6(rad)-y3*sin6(rad),y:x4*sin6(rad)+y3*cos6(rad)}},roundTo=(n3,round)=>{let pow=round>=1?10**round:1;return round>0?Math.round(n3*pow)/pow:Math.round(n3)},defaultOptions2={origin:[0,0,0],round:4},paramsCounts={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},finalizeSegment=path=>{let pathCommand=path.pathValue[path.segmentStart],relativeCommand=pathCommand.toLowerCase(),{data}=path;for(;data.length>=paramsCounts[relativeCommand]&&(relativeCommand==="m"&&data.length>2?(path.segments.push([pathCommand].concat(data.splice(0,2))),relativeCommand="l",pathCommand=pathCommand==="m"?"l":"L"):path.segments.push([pathCommand].concat(data.splice(0,paramsCounts[relativeCommand]))),!!paramsCounts[relativeCommand]););},error="SVGPathCommanderError",scanFlag=path=>{let{index,pathValue}=path,code=pathValue.charCodeAt(index);if(code===48){path.param=0,path.index+=1;return}if(code===49){path.param=1,path.index+=1;return}path.err=`${error}: invalid Arc flag "${pathValue[index]}", expecting 0 or 1 at index ${index}`},isDigit=code=>code>=48&&code<=57,invalidPathValue="Invalid path value",scanParam=path=>{let{max:max2,pathValue,index:start}=path,index=start,zeroFirst=!1,hasCeiling=!1,hasDecimal=!1,hasDot=!1,ch2;if(index>=max2){path.err=`${error}: ${invalidPathValue} at index ${index}, "pathValue" is missing param`;return}if(ch2=pathValue.charCodeAt(index),(ch2===43||ch2===45)&&(index+=1,ch2=pathValue.charCodeAt(index)),!isDigit(ch2)&&ch2!==46){path.err=`${error}: ${invalidPathValue} at index ${index}, "${pathValue[index]}" is not a number`;return}if(ch2!==46){if(zeroFirst=ch2===48,index+=1,ch2=pathValue.charCodeAt(index),zeroFirst&&index<max2&&ch2&&isDigit(ch2)){path.err=`${error}: ${invalidPathValue} at index ${start}, "${pathValue[start]}" illegal number`;return}for(;index<max2&&isDigit(pathValue.charCodeAt(index));)index+=1,hasCeiling=!0;ch2=pathValue.charCodeAt(index)}if(ch2===46){for(hasDot=!0,index+=1;isDigit(pathValue.charCodeAt(index));)index+=1,hasDecimal=!0;ch2=pathValue.charCodeAt(index)}if(ch2===101||ch2===69){if(hasDot&&!hasCeiling&&!hasDecimal){path.err=`${error}: ${invalidPathValue} at index ${index}, "${pathValue[index]}" invalid float exponent`;return}if(index+=1,ch2=pathValue.charCodeAt(index),(ch2===43||ch2===45)&&(index+=1),index<max2&&isDigit(pathValue.charCodeAt(index)))for(;index<max2&&isDigit(pathValue.charCodeAt(index));)index+=1;else{path.err=`${error}: ${invalidPathValue} at index ${index}, "${pathValue[index]}" invalid integer exponent`;return}}path.index=index,path.param=+path.pathValue.slice(start,index)},isSpace=ch2=>[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(ch2),skipSpaces=path=>{let{pathValue,max:max2}=path;for(;path.index<max2&&isSpace(pathValue.charCodeAt(path.index));)path.index+=1},isPathCommand=code=>{switch(code|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},isDigitStart=code=>isDigit(code)||code===43||code===45||code===46,isArcCommand=code=>(code|32)===97,isMoveCommand=code=>{switch(code|32){case 109:case 77:return!0;default:return!1}},scanSegment=path=>{let{max:max2,pathValue,index,segments}=path,cmdCode=pathValue.charCodeAt(index),reqParams=paramsCounts[pathValue[index].toLowerCase()];if(path.segmentStart=index,!isPathCommand(cmdCode)){path.err=`${error}: ${invalidPathValue} "${pathValue[index]}" is not a path command at index ${index}`;return}let lastSegment=segments[segments.length-1];if(!isMoveCommand(cmdCode)&&lastSegment?.[0]?.toLocaleLowerCase()==="z"){path.err=`${error}: ${invalidPathValue} "${pathValue[index]}" is not a MoveTo path command at index ${index}`;return}if(path.index+=1,skipSpaces(path),path.data=[],!reqParams){finalizeSegment(path);return}for(;;){for(let i3=reqParams;i3>0;i3-=1){if(isArcCommand(cmdCode)&&(i3===3||i3===4)?scanFlag(path):scanParam(path),path.err.length)return;path.data.push(path.param),skipSpaces(path),path.index<max2&&pathValue.charCodeAt(path.index)===44&&(path.index+=1,skipSpaces(path))}if(path.index>=path.max||!isDigitStart(pathValue.charCodeAt(path.index)))break}finalizeSegment(path)},PathParser=class{constructor(pathString){this.segments=[],this.pathValue=pathString,this.max=pathString.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}},parsePathString=pathInput=>{if(typeof pathInput!="string")return pathInput.slice(0);let path=new PathParser(pathInput);for(skipSpaces(path);path.index<path.max&&!path.err.length;)scanSegment(path);if(!path.err.length)path.segments.length&&(path.segments[0][0]="M");else throw TypeError(path.err);return path.segments},absolutizeSegment=(segment2,index,lastX,lastY)=>{let[pathCommand]=segment2,absCommand=pathCommand.toUpperCase();if(index===0||absCommand===pathCommand)return segment2;if(absCommand==="A")return[absCommand,segment2[1],segment2[2],segment2[3],segment2[4],segment2[5],segment2[6]+lastX,segment2[7]+lastY];if(absCommand==="V")return[absCommand,segment2[1]+lastY];if(absCommand==="H")return[absCommand,segment2[1]+lastX];if(absCommand==="L")return[absCommand,segment2[1]+lastX,segment2[2]+lastY];{let absValues=[],seglen=segment2.length;for(let j5=1;j5<seglen;j5+=1)absValues.push(segment2[j5]+(j5%2?lastX:lastY));return[absCommand].concat(absValues)}},iterate=(path,iterator)=>{let x4=0,y3=0,mx3=0,my3=0,i3=0;for(;i3<path.length;){let segment2=path[i3],[pathCommand]=segment2,absCommand=pathCommand.toUpperCase(),isRelative=absCommand!==pathCommand,iteratorResult=iterator(segment2,i3,x4,y3);if(iteratorResult===!1)break;if(absCommand==="Z")x4=mx3,y3=my3;else if(absCommand==="H")x4=segment2[1]+(isRelative?x4:0);else if(absCommand==="V")y3=segment2[1]+(isRelative?y3:0);else{let segLen=segment2.length;x4=segment2[segLen-2]+(isRelative?x4:0),y3=segment2[segLen-1]+(isRelative?y3:0),absCommand==="M"&&(mx3=x4,my3=y3)}iteratorResult&&(path[i3]=iteratorResult),i3+=1}return path},pathToAbsolute=pathInput=>iterate(parsePathString(pathInput),absolutizeSegment),relativizeSegment=(segment2,index,lastX,lastY)=>{let[pathCommand]=segment2,relCommand=pathCommand.toLowerCase();if(index===0||pathCommand===relCommand)return segment2;if(relCommand==="a")return[relCommand,segment2[1],segment2[2],segment2[3],segment2[4],segment2[5],segment2[6]-lastX,segment2[7]-lastY];if(relCommand==="v")return[relCommand,segment2[1]-lastY];if(relCommand==="h")return[relCommand,segment2[1]-lastX];if(relCommand==="l")return[relCommand,segment2[1]-lastX,segment2[2]-lastY];{let relValues=[],seglen=segment2.length;for(let j5=1;j5<seglen;j5+=1)relValues.push(segment2[j5]-(j5%2?lastX:lastY));return[relCommand].concat(relValues)}},pathToRelative=pathInput=>iterate(parsePathString(pathInput),relativizeSegment),arcToCubic=(X12,Y12,RX,RY,angle,LAF,SF2,X22,Y22,recursive)=>{let x12=X12,y12=Y12,rx3=RX,ry3=RY,x22=X22,y22=Y22,d120=Math.PI*120/180,rad=Math.PI/180*(+angle||0),res2=[],xy3,f12,f22,cx3,cy3;if(recursive)[f12,f22,cx3,cy3]=recursive;else{xy3=rotateVector(x12,y12,-rad),x12=xy3.x,y12=xy3.y,xy3=rotateVector(x22,y22,-rad),x22=xy3.x,y22=xy3.y;let x4=(x12-x22)/2,y3=(y12-y22)/2,h3=x4*x4/(rx3*rx3)+y3*y3/(ry3*ry3);h3>1&&(h3=Math.sqrt(h3),rx3*=h3,ry3*=h3);let rx22=rx3*rx3,ry22=ry3*ry3,k5=(LAF===SF2?-1:1)*Math.sqrt(Math.abs((rx22*ry22-rx22*y3*y3-ry22*x4*x4)/(rx22*y3*y3+ry22*x4*x4)));cx3=k5*rx3*y3/ry3+(x12+x22)/2,cy3=k5*-ry3*x4/rx3+(y12+y22)/2,f12=Math.asin(((y12-cy3)/ry3*10**9>>0)/10**9),f22=Math.asin(((y22-cy3)/ry3*10**9>>0)/10**9),f12=x12<cx3?Math.PI-f12:f12,f22=x22<cx3?Math.PI-f22:f22,f12<0&&(f12=Math.PI*2+f12),f22<0&&(f22=Math.PI*2+f22),SF2&&f12>f22&&(f12-=Math.PI*2),!SF2&&f22>f12&&(f22-=Math.PI*2)}let df3=f22-f12;if(Math.abs(df3)>d120){let f2old=f22,x2old=x22,y2old=y22;f22=f12+d120*(SF2&&f22>f12?1:-1),x22=cx3+rx3*Math.cos(f22),y22=cy3+ry3*Math.sin(f22),res2=arcToCubic(x22,y22,rx3,ry3,angle,0,SF2,x2old,y2old,[f22,f2old,cx3,cy3])}df3=f22-f12;let c12=Math.cos(f12),s12=Math.sin(f12),c22=Math.cos(f22),s22=Math.sin(f22),t54=Math.tan(df3/4),hx3=4/3*rx3*t54,hy3=4/3*ry3*t54,m12=[x12,y12],m22=[x12+hx3*s12,y12-hy3*c12],m32=[x22+hx3*s22,y22-hy3*c22],m4=[x22,y22];if(m22[0]=2*m12[0]-m22[0],m22[1]=2*m12[1]-m22[1],recursive)return[m22[0],m22[1],m32[0],m32[1],m4[0],m4[1]].concat(res2);res2=[m22[0],m22[1],m32[0],m32[1],m4[0],m4[1]].concat(res2);let newres=[];for(let i3=0,ii3=res2.length;i3<ii3;i3+=1)newres[i3]=i3%2?rotateVector(res2[i3-1],res2[i3],rad).y:rotateVector(res2[i3],res2[i3+1],rad).x;return newres},quadToCubic=(x12,y12,qx3,qy3,x22,y22)=>{let r13=.3333333333333333,r23=2/3;return[r13*x12+r23*qx3,r13*y12+r23*qy3,r13*x22+r23*qx3,r13*y22+r23*qy3,x22,y22]},lineToCubic=(x12,y12,x22,y22)=>{let c12=midPoint([x12,y12],[x22,y22],.3333333333333333),c22=midPoint([x12,y12],[x22,y22],2/3);return[c12[0],c12[1],c22[0],c22[1],x22,y22]},segmentToCubic=(segment2,params)=>{let pathCommand=segment2[0],values=segment2.slice(1).map(Number),[x4,y3]=values,{x1:px1,y1:py1}=params;return"TQ".includes(pathCommand)||(params.qx=null,params.qy=null),pathCommand==="M"?(params.mx=x4,params.my=y3,params.x=x4,params.y=y3,segment2):pathCommand==="A"?["C"].concat(arcToCubic(px1,py1,values[0],values[1],values[2],values[3],values[4],values[5],values[6])):pathCommand==="Q"?(params.qx=x4,params.qy=y3,["C"].concat(quadToCubic(px1,py1,values[0],values[1],values[2],values[3]))):pathCommand==="L"?["C"].concat(lineToCubic(px1,py1,x4,y3)):pathCommand==="Z"?["C"].concat(lineToCubic(px1,py1,params.mx,params.my)):segment2},normalizeSegment=(segment2,params)=>{let[pathCommand]=segment2,absCommand=pathCommand.toUpperCase(),isRelative=pathCommand!==absCommand,{x1:px1,y1:py1,x2:px22,y2:py22,x:x4,y:y3}=params,values=segment2.slice(1),absValues=values.map((n3,j5)=>n3+(isRelative?j5%2?y3:x4:0));if("TQ".includes(absCommand)||(params.qx=null,params.qy=null),absCommand==="A")return absValues=values.slice(0,-2).concat(values[5]+(isRelative?x4:0),values[6]+(isRelative?y3:0)),["A"].concat(absValues);if(absCommand==="H")return["L",segment2[1]+(isRelative?x4:0),py1];if(absCommand==="V")return["L",px1,segment2[1]+(isRelative?y3:0)];if(absCommand==="L")return["L",segment2[1]+(isRelative?x4:0),segment2[2]+(isRelative?y3:0)];if(absCommand==="M")return["M",segment2[1]+(isRelative?x4:0),segment2[2]+(isRelative?y3:0)];if(absCommand==="C")return["C"].concat(absValues);if(absCommand==="S"){let x12=px1*2-px22,y12=py1*2-py22;return params.x1=x12,params.y1=y12,["C",x12,y12].concat(absValues)}else if(absCommand==="T"){let qx3=px1*2-(params.qx?params.qx:0),qy3=py1*2-(params.qy?params.qy:0);return params.qx=qx3,params.qy=qy3,["Q",qx3,qy3].concat(absValues)}else if(absCommand==="Q"){let[nqx,nqy]=absValues;return params.qx=nqx,params.qy=nqy,["Q"].concat(absValues)}else if(absCommand==="Z")return["Z"];return segment2},paramsParser={mx:0,my:0,x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},pathToCurve=pathInput=>{let params={...paramsParser},path=parsePathString(pathInput);return iterate(path,(seg,index,lastX,lastY)=>{params.x=lastX,params.y=lastY;let normalSegment=normalizeSegment(seg,params);normalSegment[0]==="M"&&(params.mx=normalSegment[1],params.my=normalSegment[2]);let result=segmentToCubic(normalSegment,params);result[0]==="C"&&result.length>7&&(path.splice(index+1,0,["C"].concat(result.slice(7))),result=result.slice(0,7));let seglen=result.length;return params.x1=+result[seglen-2],params.y1=+result[seglen-1],params.x2=+result[seglen-4]||params.x1,params.y2=+result[seglen-3]||params.y1,result})},pathToString=(path,roundOption)=>{let pathLen=path.length,{round}=defaultOptions2,segment2=path[0],result="";round=roundOption==="off"||typeof roundOption=="number"&&roundOption>=0?roundOption:typeof round=="number"&&round>=0?round:"off";for(let i3=0;i3<pathLen;i3+=1){segment2=path[i3];let[pathCommand]=segment2,values=segment2.slice(1);if(result+=pathCommand,round==="off")result+=values.join(" ");else{let j5=0,valLen=values.length;for(;j5<valLen;)result+=roundTo(values[j5],round),j5!==valLen-1&&(result+=" "),j5+=1}}return result},getPathBBox=pathInput=>{if(!pathInput)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let path=parsePathString(pathInput),pathCommand="M",mx3=0,my3=0,{max:max2,min}=Math,xMin=1/0,yMin=1/0,xMax=-1/0,yMax=-1/0,minX=0,minY=0,maxX=0,maxY=0,paramX1=0,paramY1=0,paramX2=0,paramY2=0,paramQX=0,paramQY=0;iterate(path,(seg,index,lastX,lastY)=>{[pathCommand]=seg;let absCommand=pathCommand.toUpperCase(),absoluteSegment=absCommand!==pathCommand?absolutizeSegment(seg,index,lastX,lastY):seg.slice(0),normalSegment=absCommand==="V"?["L",lastX,absoluteSegment[1]]:absCommand==="H"?["L",absoluteSegment[1],lastY]:absoluteSegment;if([pathCommand]=normalSegment,"TQ".includes(absCommand)||(paramQX=0,paramQY=0),pathCommand==="M")[,mx3,my3]=normalSegment,minX=mx3,minY=my3,maxX=mx3,maxY=my3;else if(pathCommand==="L")[minX,minY,maxX,maxY]=getLineBBox(lastX,lastY,normalSegment[1],normalSegment[2]);else if(pathCommand==="A")[minX,minY,maxX,maxY]=getArcBBox(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4],normalSegment[5],normalSegment[6],normalSegment[7]);else if(pathCommand==="S"){let cp1x=paramX1*2-paramX2,cp1y=paramY1*2-paramY2;[minX,minY,maxX,maxY]=getCubicBBox(lastX,lastY,cp1x,cp1y,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4])}else pathCommand==="C"?[minX,minY,maxX,maxY]=getCubicBBox(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4],normalSegment[5],normalSegment[6]):pathCommand==="T"?(paramQX=paramX1*2-paramQX,paramQY=paramY1*2-paramQY,[minX,minY,maxX,maxY]=getQuadBBox(lastX,lastY,paramQX,paramQY,normalSegment[1],normalSegment[2])):pathCommand==="Q"?(paramQX=normalSegment[1],paramQY=normalSegment[2],[minX,minY,maxX,maxY]=getQuadBBox(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4])):pathCommand==="Z"&&([minX,minY,maxX,maxY]=getLineBBox(lastX,lastY,mx3,my3));xMin=min(minX,xMin),yMin=min(minY,yMin),xMax=max2(maxX,xMax),yMax=max2(maxY,yMax),[paramX1,paramY1]=pathCommand==="Z"?[mx3,my3]:normalSegment.slice(-2),[paramX2,paramY2]=pathCommand==="C"?[normalSegment[3],normalSegment[4]]:pathCommand==="S"?[normalSegment[1],normalSegment[2]]:[paramX1,paramY1]});let width=xMax-xMin,height=yMax-yMin;return{width,height,x:xMin,y:yMin,x2:xMax,y2:yMax,cx:xMin+width/2,cy:yMin+height/2,cz:Math.max(width,height)+Math.min(width,height)/2}},getTotalLength=pathInput=>{let path=parsePathString(pathInput),paramX1=0,paramY1=0,paramX2=0,paramY2=0,paramQX=0,paramQY=0,pathCommand="M",mx3=0,my3=0,totalLength=0;return iterate(path,(seg,index,lastX,lastY)=>{[pathCommand]=seg;let absCommand=pathCommand.toUpperCase(),absoluteSegment=absCommand!==pathCommand?absolutizeSegment(seg,index,lastX,lastY):seg.slice(0),normalSegment=absCommand==="V"?["L",lastX,absoluteSegment[1]]:absCommand==="H"?["L",absoluteSegment[1],lastY]:absoluteSegment;if([pathCommand]=normalSegment,"TQ".includes(absCommand)||(paramQX=0,paramQY=0),pathCommand==="M")[,mx3,my3]=normalSegment;else if(pathCommand==="L")totalLength+=getLineLength(lastX,lastY,normalSegment[1],normalSegment[2]);else if(pathCommand==="A")totalLength+=getArcLength(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4],normalSegment[5],normalSegment[6],normalSegment[7]);else if(pathCommand==="S"){let cp1x=paramX1*2-paramX2,cp1y=paramY1*2-paramY2;totalLength+=getCubicLength(lastX,lastY,cp1x,cp1y,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4])}else pathCommand==="C"?totalLength+=getCubicLength(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4],normalSegment[5],normalSegment[6]):pathCommand==="T"?(paramQX=paramX1*2-paramQX,paramQY=paramY1*2-paramQY,totalLength+=getQuadLength(lastX,lastY,paramQX,paramQY,normalSegment[1],normalSegment[2])):pathCommand==="Q"?(paramQX=normalSegment[1],paramQY=normalSegment[2],totalLength+=getQuadLength(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4])):pathCommand==="Z"&&(totalLength+=getLineLength(lastX,lastY,mx3,my3));[paramX1,paramY1]=pathCommand==="Z"?[mx3,my3]:normalSegment.slice(-2),[paramX2,paramY2]=pathCommand==="C"?[normalSegment[3],normalSegment[4]]:pathCommand==="S"?[normalSegment[1],normalSegment[2]]:[paramX1,paramY1]}),totalLength},DISTANCE_EPSILON=1e-5,normalizePath=pathInput=>{let path=parsePathString(pathInput),params={...paramsParser};return iterate(path,(seg,_3,lastX,lastY)=>{params.x=lastX,params.y=lastY;let result=normalizeSegment(seg,params),seglen=result.length;return params.x1=+result[seglen-2],params.y1=+result[seglen-1],params.x2=+result[seglen-4]||params.x1,params.y2=+result[seglen-3]||params.y1,result})},getPointAtLength=(pathInput,distance8)=>{let path=normalizePath(pathInput),isM=!1,data=[],x4=0,y3=0,[mx3,my3]=path[0].slice(1),distanceIsNumber=typeof distance8=="number",point6={x:mx3,y:my3},length4=0,POINT=point6,totalLength=0;return!distanceIsNumber||distance8<1e-5?point6:(iterate(path,(seg,_3,lastX,lastY)=>{let pathCommand=seg[0];if(isM=pathCommand==="M",data=isM?data:[lastX,lastY].concat(seg.slice(1)),isM?([,mx3,my3]=seg,point6={x:mx3,y:my3},length4=0):pathCommand==="L"?(point6=getPointAtLineLength(data[0],data[1],data[2],data[3],distance8-totalLength),length4=getLineLength(data[0],data[1],data[2],data[3])):pathCommand==="A"?(point6=getPointAtArcLength(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8],distance8-totalLength),length4=getArcLength(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8])):pathCommand==="C"?(point6=getPointAtCubicLength(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],distance8-totalLength),length4=getCubicLength(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7])):pathCommand==="Q"?(point6=getPointAtQuadLength(data[0],data[1],data[2],data[3],data[4],data[5],distance8-totalLength),length4=getQuadLength(data[0],data[1],data[2],data[3],data[4],data[5])):pathCommand==="Z"&&(data=[lastX,lastY,mx3,my3],point6={x:mx3,y:my3},length4=getLineLength(data[0],data[1],data[2],data[3])),[x4,y3]=data.slice(-2),totalLength<distance8)POINT=point6;else return!1;totalLength+=length4}),distance8>totalLength-1e-5?{x:x4,y:y3}:POINT)},getPropertiesAtLength=(pathInput,distance8)=>{let pathArray=parsePathString(pathInput),pathTemp=pathArray.slice(0),pathLength4=getTotalLength(pathTemp),index=pathTemp.length-1,lengthAtSegment=0,length4=0,segment2=pathArray[0];if(index<=0||!distance8||!Number.isFinite(distance8))return{segment:segment2,index:0,length:length4,lengthAtSegment};if(distance8>=pathLength4)return pathTemp=pathArray.slice(0,-1),lengthAtSegment=getTotalLength(pathTemp),length4=pathLength4-lengthAtSegment,segment2=pathArray[index],{segment:segment2,index,length:length4,lengthAtSegment};let segments=[];for(;index>0;)segment2=pathTemp[index],pathTemp=pathTemp.slice(0,-1),lengthAtSegment=getTotalLength(pathTemp),length4=pathLength4-lengthAtSegment,pathLength4=lengthAtSegment,segments.push({segment:segment2,index,length:length4,lengthAtSegment}),index-=1;return segments.find(({lengthAtSegment:l7})=>l7<=distance8)},getPropertiesAtPoint=(pathInput,point6)=>{let path=parsePathString(pathInput),normalPath=normalizePath(path),pathLength4=getTotalLength(normalPath),distanceTo=p5=>{let dx3=p5.x-point6.x,dy3=p5.y-point6.y;return dx3*dx3+dy3*dy3},precision=8,scan,closest={x:0,y:0},scanDistance=0,bestLength=0,bestDistance=1/0;for(let scanLength=0;scanLength<=pathLength4;scanLength+=precision)scan=getPointAtLength(normalPath,scanLength),scanDistance=distanceTo(scan),scanDistance<bestDistance&&(closest=scan,bestLength=scanLength,bestDistance=scanDistance);precision/=2;let before,after,beforeLength=0,afterLength=0,beforeDistance=0,afterDistance=0;for(;precision>1e-6&&(beforeLength=bestLength-precision,before=getPointAtLength(normalPath,beforeLength),beforeDistance=distanceTo(before),afterLength=bestLength+precision,after=getPointAtLength(normalPath,afterLength),afterDistance=distanceTo(after),beforeLength>=0&&beforeDistance<bestDistance?(closest=before,bestLength=beforeLength,bestDistance=beforeDistance):afterLength<=pathLength4&&afterDistance<bestDistance?(closest=after,bestLength=afterLength,bestDistance=afterDistance):precision/=2,!(precision<1e-5)););let segment2=getPropertiesAtLength(path,bestLength);return{closest,distance:Math.sqrt(bestDistance),segment:segment2}},getClosestPoint=(pathInput,point6)=>getPropertiesAtPoint(pathInput,point6).closest,getCubicSegArea=(x12,y12,c1x,c1y,c2x,c2y,x22,y22)=>3*((y22-y12)*(c1x+c2x)-(x22-x12)*(c1y+c2y)+c1y*(x12-c2x)-c1x*(y12-c2y)+y22*(c2x+x12/3)-x22*(c2y+y12/3))/20,getPathArea=path=>{let x4=0,y3=0,len=0;return pathToCurve(path).map(seg=>seg[0]==="M"?([,x4,y3]=seg,0):(len=getCubicSegArea(x4,y3,seg[1],seg[2],seg[3],seg[4],seg[5],seg[6]),[x4,y3]=seg.slice(-2),len)).reduce((a3,b4)=>a3+b4,0)},getDrawDirection=path=>getPathArea(pathToCurve(path))>=0,getSegmentAtLength=(pathInput,distance8)=>getPropertiesAtLength(pathInput,distance8).segment,getSegmentOfPoint=(path,point6)=>getPropertiesAtPoint(path,point6).segment,isPathArray=path=>Array.isArray(path)&&path.every(seg=>{let lk2=seg[0].toLowerCase();return paramsCounts[lk2]===seg.length-1&&"achlmqstvz".includes(lk2)&&seg.slice(1).every(Number.isFinite)})&&path.length>0,isAbsoluteArray=path=>isPathArray(path)&&path.every(([x4])=>x4===x4.toUpperCase()),isNormalizedArray=path=>isAbsoluteArray(path)&&path.every(([pc3])=>"ACLMQZ".includes(pc3)),isPolygonArray=path=>isNormalizedArray(path)&&path.every(([pc3])=>"MLVHZ".includes(pc3)),isCurveArray=path=>isNormalizedArray(path)&&path.every(([pc3])=>"MC".includes(pc3)),isPointInStroke=(pathInput,point6)=>{let{distance:distance8}=getPropertiesAtPoint(pathInput,point6);return Math.abs(distance8)<DISTANCE_EPSILON},isRelativeArray=path=>isPathArray(path)&&path.slice(1).every(([pc3])=>pc3===pc3.toLowerCase()),isValidPath=pathString=>{if(typeof pathString!="string"||!pathString.length)return!1;let path=new PathParser(pathString);for(skipSpaces(path);path.index<path.max&&!path.err.length;)scanSegment(path);return!path.err.length&&"mM".includes(path.segments[0][0])};function samplePolygon(path){let points=[],[mx3,my3]=[0,0];return iterate(path,seg=>{let cmd=seg[0];if(cmd==="M")[mx3,my3]=[seg[1],seg[2]],points.push([mx3,my3]);else if(cmd==="L")points.push([seg[1],seg[2]]);else if(cmd==="C")points.push([seg[5],seg[6]]);else if(cmd==="A")points.push([seg[6],seg[7]]);else if(cmd==="Z")points.push([mx3,my3]);else throw new TypeError(`${error}: path command "${cmd}" is not supported`)}),points}var shapeParams={line:["x1","y1","x2","y2"],circle:["cx","cy","r"],ellipse:["cx","cy","rx","ry"],rect:["width","height","x","y","rx","ry"],polygon:["points"],polyline:["points"],glyph:["d"]},isElement=node=>node!=null&&typeof node=="object"&&node.nodeType===1,getLinePath=attr=>{let{x1:x12,y1:y12,x2:x22,y2:y22}=attr;return[x12,y12,x22,y22]=[x12,y12,x22,y22].map(a3=>+a3),[["M",x12,y12],["L",x22,y22]]},getPolyPath=attr=>{let pathArray=[],points=(attr.points||"").trim().split(/[\s|,]/).map(a3=>+a3),index=0;for(;index<points.length;)pathArray.push([index?"L":"M",points[index],points[index+1]]),index+=2;return attr.type==="polygon"?[...pathArray,["z"]]:pathArray},getCirclePath=attr=>{let{cx:cx3,cy:cy3,r:r6}=attr;return[cx3,cy3,r6]=[cx3,cy3,r6].map(a3=>+a3),[["M",cx3-r6,cy3],["a",r6,r6,0,1,0,2*r6,0],["a",r6,r6,0,1,0,-2*r6,0]]},getEllipsePath=attr=>{let{cx:cx3,cy:cy3}=attr,rx3=attr.rx||0,ry3=attr.ry||rx3;return[cx3,cy3,rx3,ry3]=[cx3,cy3,rx3,ry3].map(a3=>+a3),[["M",cx3-rx3,cy3],["a",rx3,ry3,0,1,0,2*rx3,0],["a",rx3,ry3,0,1,0,-2*rx3,0]]},getRectanglePath=attr=>{let x4=+attr.x||0,y3=+attr.y||0,w4=+attr.width,h3=+attr.height,rx3=+(attr.rx||0),ry3=+(attr.ry||rx3);return rx3||ry3?(rx3*2>w4&&(rx3-=(rx3*2-w4)/2),ry3*2>h3&&(ry3-=(ry3*2-h3)/2),[["M",x4+rx3,y3],["h",w4-rx3*2],["s",rx3,0,rx3,ry3],["v",h3-ry3*2],["s",0,ry3,-rx3,ry3],["h",-w4+rx3*2],["s",-rx3,0,-rx3,-ry3],["v",-h3+ry3*2],["s",0,-ry3,rx3,-ry3]]):[["M",x4,y3],["h",w4],["v",h3],["H",x4],["Z"]]},shapeToPathArray=element=>{let supportedShapes=Object.keys(shapeParams),targetIsElement=isElement(element),tagName=targetIsElement?element.tagName:null;if(tagName&&[...supportedShapes,"path"].every(s6=>tagName!==s6))throw TypeError(`${error}: "${tagName}" is not SVGElement`);let type=targetIsElement?tagName:element.type,shapeAttrs=shapeParams[type],config={type};targetIsElement?shapeAttrs.forEach(p5=>{config[p5]=element.getAttribute(p5)}):Object.assign(config,element);let pathArray=[];return type==="circle"?pathArray=getCirclePath(config):type==="ellipse"?pathArray=getEllipsePath(config):["polyline","polygon"].includes(type)?pathArray=getPolyPath(config):type==="rect"?pathArray=getRectanglePath(config):type==="line"?pathArray=getLinePath(config):["glyph","path"].includes(type)&&(pathArray=parsePathString(targetIsElement?element.getAttribute("d")||"":element.d||"")),isPathArray(pathArray)&&pathArray.length?pathArray:!1},shapeToPath=(element,replace,ownerDocument)=>{let doc=ownerDocument||document,supportedShapes=Object.keys(shapeParams),targetIsElement=isElement(element),tagName=targetIsElement?element.tagName:null;if(tagName==="path")throw TypeError(`${error}: "${tagName}" is already SVGPathElement`);if(tagName&&supportedShapes.every(s6=>tagName!==s6))throw TypeError(`${error}: "${tagName}" is not SVGElement`);let path=doc.createElementNS("http://www.w3.org/2000/svg","path"),type=targetIsElement?tagName:element.type,shapeAttrs=shapeParams[type],config={type},round=defaultOptions2.round,pathArray=shapeToPathArray(element),description=pathArray&&pathArray.length?pathToString(pathArray,round):"";if(targetIsElement){shapeAttrs.forEach(p5=>{config[p5]=element.getAttribute(p5)});for(let i3=0;i3<element.attributes.length;i3++){let attr=element.attributes[i3];attr&&!shapeAttrs.includes(attr.name)&&path.setAttribute(attr.name,attr.value)}}else Object.assign(config,element),Object.keys(config).forEach(k5=>{!shapeAttrs.includes(k5)&&k5!=="type"&&path.setAttribute(k5.replace(/[A-Z]/g,m4=>`-${m4.toLowerCase()}`),config[k5])});return isValidPath(description)?(path.setAttribute("d",description),replace&&targetIsElement&&(element.before(path,element),element.remove()),path):!1},isMultiPath=path=>{if(typeof path=="string"){let matches=path.match(/[Mm]/g);return matches?matches.length>1:!1}if(isPathArray(path)){let moveCount=0;for(let segment2 of path)if(segment2[0].toUpperCase()==="M"&&(moveCount++,moveCount>1))return!0;return!1}throw new TypeError(error+": expected string or PathArray")};function isPolylineArray(path){return isNormalizedArray(path)&&path.every(([pc3])=>"MLVH".includes(pc3))}var isClosedPath=path=>path[path.length-1][0].toUpperCase()==="Z",shortenSegment=(segment2,normalSegment,params,prevCommand)=>{let[pathCommand]=segment2,{round:defaultRound}=defaultOptions2,round=typeof defaultRound=="number"?defaultRound:4,normalValues=normalSegment.slice(1),{x1:x12,y1:y12,x2:x22,y2:y22,x:x4,y:y3}=params,[nx3,ny3]=normalValues.slice(-2),result=segment2;if("TQ".includes(pathCommand)||(params.qx=null,params.qy=null),pathCommand==="L"){if(roundTo(x4,round)===roundTo(nx3,round))return["V",ny3];if(roundTo(y3,round)===roundTo(ny3,round))return["H",nx3]}else if(pathCommand==="C"){let[nx1,ny1]=normalValues;if(params.x1=nx1,params.y1=ny1,"CS".includes(prevCommand)&&(roundTo(nx1,round)===roundTo(x12*2-x22,round)&&roundTo(ny1,round)===roundTo(y12*2-y22,round)||roundTo(x12,round)===roundTo(x22*2-x4,round)&&roundTo(y12,round)===roundTo(y22*2-y3,round)))return["S",normalValues[2],normalValues[3],normalValues[4],normalValues[5]]}else if(pathCommand==="Q"){let[qx3,qy3]=normalValues;if(params.qx=qx3,params.qy=qy3,"QT".includes(prevCommand)&&roundTo(qx3,round)===roundTo(x12*2-x22,round)&&roundTo(qy3,round)===roundTo(y12*2-y22,round))return["T",normalValues[2],normalValues[3]]}return result},roundSegment=(segment2,roundOption)=>{let values=segment2.slice(1).map(n3=>roundTo(n3,roundOption));return[segment2[0]].concat(values)},optimizePath=(pathInput,roundOption)=>{let path=pathToAbsolute(pathInput),round=typeof roundOption=="number"&&roundOption>=0?roundOption:2,optimParams={...paramsParser},allPathCommands=[],pathCommand="M",prevCommand="Z";return iterate(path,(seg,i3,lastX,lastY)=>{optimParams.x=lastX,optimParams.y=lastY;let normalizedSegment=normalizeSegment(seg,optimParams),result=seg;if(pathCommand=seg[0],allPathCommands[i3]=pathCommand,i3){prevCommand=allPathCommands[i3-1];let shortSegment=shortenSegment(seg,normalizedSegment,optimParams,prevCommand),absSegment=roundSegment(shortSegment,round),absString=absSegment.join(""),relSegment=roundSegment(relativizeSegment(shortSegment,i3,lastX,lastY),round),relString=relSegment.join("");result=absString.length<relString.length?absSegment:relSegment}let seglen=normalizedSegment.length;return optimParams.x1=+normalizedSegment[seglen-2],optimParams.y1=+normalizedSegment[seglen-1],optimParams.x2=+normalizedSegment[seglen-4]||optimParams.x1,optimParams.y2=+normalizedSegment[seglen-3]||optimParams.y1,result})},reversePath=pathInput=>{let absolutePath=pathToAbsolute(pathInput),normalizedPath=normalizePath(absolutePath),pLen=absolutePath.length,isClosed=absolutePath[pLen-1][0]==="Z",reversedPath=iterate(absolutePath,(segment2,i3)=>{let normalizedSegment=normalizedPath[i3],prevSeg=i3&&absolutePath[i3-1],prevCommand=prevSeg&&prevSeg[0],nextSeg=absolutePath[i3+1],nextCommand=nextSeg&&nextSeg[0],pathCommand=segment2[0],[x4,y3]=normalizedPath[i3?i3-1:pLen-1].slice(-2),result=segment2;switch(pathCommand){case"M":result=isClosed?["Z"]:[pathCommand,x4,y3];break;case"A":result=[pathCommand,segment2[1],segment2[2],segment2[3],segment2[4],segment2[5]===1?0:1,x4,y3];break;case"C":nextSeg&&nextCommand==="S"?result=["S",segment2[1],segment2[2],x4,y3]:result=[pathCommand,segment2[3],segment2[4],segment2[1],segment2[2],x4,y3];break;case"S":prevCommand&&"CS".includes(prevCommand)&&(!nextSeg||nextCommand!=="S")?result=["C",normalizedSegment[3],normalizedSegment[4],normalizedSegment[1],normalizedSegment[2],x4,y3]:result=[pathCommand,normalizedSegment[1],normalizedSegment[2],x4,y3];break;case"Q":nextSeg&&nextCommand==="T"?result=["T",x4,y3]:result=[pathCommand,segment2[1],segment2[2],x4,y3];break;case"T":prevCommand&&"QT".includes(prevCommand)&&(!nextSeg||nextCommand!=="T")?result=["Q",normalizedSegment[1],normalizedSegment[2],x4,y3]:result=[pathCommand,x4,y3];break;case"Z":result=["M",x4,y3];break;case"H":result=[pathCommand,x4];break;case"V":result=[pathCommand,y3];break;default:result=[pathCommand].concat(segment2.slice(1,-2),x4,y3)}return result});return isClosed?reversedPath.reverse():[reversedPath[0]].concat(reversedPath.slice(1).reverse())},splitPath=pathInput=>{let composite=[],parsedPath=parsePathString(pathInput),path=[],pi3=-1,x4=0,y3=0,mx3=0,my3=0;return iterate(parsedPath,(seg,_3,prevX,prevY)=>{let cmd=seg[0],absCommand=cmd.toUpperCase(),isRelative=cmd===cmd.toLowerCase(),values=seg.slice(1);absCommand==="M"?(pi3+=1,[x4,y3]=values,x4+=isRelative?prevX:0,y3+=isRelative?prevY:0,mx3=x4,my3=y3,path=[isRelative?[absCommand,mx3,my3]:seg]):(absCommand==="Z"?(x4=mx3,y3=my3):absCommand==="H"?([,x4]=seg,x4+=isRelative?prevX:0):absCommand==="V"?([,y3]=seg,y3+=isRelative?prevY:0):([x4,y3]=seg.slice(-2),x4+=isRelative?prevX:0,y3+=isRelative?prevY:0),path.push(seg)),composite[pi3]=path}),composite},getSVGMatrix=transform7=>{let matrix2=new h,{origin}=transform7,[originX,originY]=origin,{translate:translate6}=transform7,{rotate:rotate5}=transform7,{skew}=transform7,{scale:scale6}=transform7;return Array.isArray(translate6)&&translate6.length>=2&&translate6.every(x4=>!Number.isNaN(+x4))&&translate6.some(x4=>x4!==0)?matrix2=matrix2.translate(...translate6):typeof translate6=="number"&&!Number.isNaN(translate6)&&(matrix2=matrix2.translate(translate6)),(rotate5||skew||scale6)&&(matrix2=matrix2.translate(originX,originY),Array.isArray(rotate5)&&rotate5.length>=2&&rotate5.every(x4=>!Number.isNaN(+x4))&&rotate5.some(x4=>x4!==0)?matrix2=matrix2.rotate(...rotate5):typeof rotate5=="number"&&!Number.isNaN(rotate5)&&(matrix2=matrix2.rotate(rotate5)),Array.isArray(skew)&&skew.length===2&&skew.every(x4=>!Number.isNaN(+x4))&&skew.some(x4=>x4!==0)?(matrix2=skew[0]?matrix2.skewX(skew[0]):matrix2,matrix2=skew[1]?matrix2.skewY(skew[1]):matrix2):typeof skew=="number"&&!Number.isNaN(skew)&&(matrix2=matrix2.skewX(skew)),Array.isArray(scale6)&&scale6.length>=2&&scale6.every(x4=>!Number.isNaN(+x4))&&scale6.some(x4=>x4!==1)?matrix2=matrix2.scale(...scale6):typeof scale6=="number"&&!Number.isNaN(scale6)&&(matrix2=matrix2.scale(scale6)),matrix2=matrix2.translate(-originX,-originY)),matrix2},translatePoint=(cssm,v3)=>{let m4=h.Translate(v3[0],v3[1],v3[2]);return[,,,m4.m44]=v3,m4=cssm.multiply(m4),[m4.m41,m4.m42,m4.m43,m4.m44]},projection2d=(m4,point2D,origin)=>{let[originX,originY,originZ]=origin,[x4,y3,z5]=translatePoint(m4,[point2D[0],point2D[1],0,1]),relativePositionX=x4-originX,relativePositionY=y3-originY,relativePositionZ=z5-originZ;return[relativePositionX*(Math.abs(originZ)/Math.abs(relativePositionZ)||1)+originX,relativePositionY*(Math.abs(originZ)/Math.abs(relativePositionZ)||1)+originY]},transformPath=(pathInput,transform7)=>{let x4=0,y3=0,lx3=0,ly3=0,j5=0,jj=0,path=parsePathString(pathInput),transformProps=transform7&&Object.keys(transform7);if(!transform7||transformProps&&!transformProps.length)return path.slice(0);transform7.origin||Object.assign(transform7,{origin:defaultOptions2.origin});let origin=transform7.origin,matrixInstance=getSVGMatrix(transform7);return matrixInstance.isIdentity?path.slice(0):iterate(path,(seg,index,lastX,lastY)=>{let[pathCommand]=seg,absCommand=pathCommand.toUpperCase(),absoluteSegment=absCommand!==pathCommand?absolutizeSegment(seg,index,lastX,lastY):seg.slice(0),result=absCommand==="A"?["C"].concat(arcToCubic(lastX,lastY,absoluteSegment[1],absoluteSegment[2],absoluteSegment[3],absoluteSegment[4],absoluteSegment[5],absoluteSegment[6],absoluteSegment[7])):absCommand==="V"?["L",lastX,absoluteSegment[1]]:absCommand==="H"?["L",absoluteSegment[1],lastY]:absoluteSegment;pathCommand=result[0];let isLongArc=pathCommand==="C"&&result.length>7,tempSegment=isLongArc?result.slice(0,7):result.slice(0);if(isLongArc&&(path.splice(index+1,0,["C"].concat(result.slice(7))),result=tempSegment),pathCommand==="L")[lx3,ly3]=projection2d(matrixInstance,[result[1],result[2]],origin),x4!==lx3&&y3!==ly3?result=["L",lx3,ly3]:y3===ly3?result=["H",lx3]:x4===lx3&&(result=["V",ly3]);else for(j5=1,jj=result.length;j5<jj;j5+=2)[lx3,ly3]=projection2d(matrixInstance,[+result[j5],+result[j5+1]],origin),result[j5]=lx3,result[j5+1]=ly3;return x4=lx3,y3=ly3,result})},reverseCurve=path=>{let rotatedCurve=path.slice(1).map((x4,i3,curveOnly)=>i3?curveOnly[i3-1].slice(-2).concat(x4.slice(1)):path[0].slice(1).concat(x4.slice(1))).map(x4=>x4.map((_3,i3)=>x4[x4.length-i3-2*(1-i3%2)])).reverse();return[["M"].concat(rotatedCurve[0].slice(0,2))].concat(rotatedCurve.map(x4=>["C"].concat(x4.slice(2))))},roundPath=(path,roundOption)=>{let{round}=defaultOptions2;return round=roundOption==="off"||typeof roundOption=="number"&&roundOption>=0?roundOption:typeof round=="number"&&round>=0?round:"off",round==="off"?path.slice(0):iterate(path,segment2=>roundSegment(segment2,round))},fixPath=pathInput=>{let pathArray=parsePathString(pathInput);if(isClosedPath(pathArray)){let normalArray=normalizePath(pathArray),length4=pathArray.length,segBeforeZ=length4-2,[mx3,my3]=normalArray[0].slice(1),[x4,y3]=normalArray[segBeforeZ].slice(-2);mx3===x4&&my3===y3&&pathArray.splice(length4-1,1)}};function splitCubicSegment(x12,y12,x22,y22,x32,y3,x4,y4,t54){let[px01,py01]=midPoint([x12,y12],[x22,y22],t54),[px12,py12]=midPoint([x22,y22],[x32,y3],t54),[px23,py23]=midPoint([x32,y3],[x4,y4],t54),[cx0,cy0]=midPoint([px01,py01],[px12,py12],t54),[cx1,cy1]=midPoint([px12,py12],[px23,py23],t54),[px3,py3]=midPoint([cx0,cy0],[cx1,cy1],t54);return[[x12,y12,px01,py01,cx0,cy0,px3,py3],[px3,py3,cx1,cy1,px23,py23,x4,y4]]}var pathToPolyline=path=>{let normal=normalizePath(path);if(!isPolygonArray(normal)&&!isPolylineArray(normal))throw TypeError(`${error}: pathValue is not a polyline/polygon`);if(!isClosedPath(normal))return normal;let result=[normal[0]],[mx3,my3]=normal[0].slice(1);for(let i3=1;i3<normal.length;i3++){let seg=normal[i3];seg[0].toUpperCase()==="Z"?result.push(["L",mx3,my3]):result.push(seg)}return result};function splitLineToCount(x12,y12,x22,y22,count){if(count<=1)return[[x12,y12,x22,y22]];let result=[],dx3=x22-x12,dy3=y22-y12,currentX=x12,currentY=y12,i3=0;for(;i3<count;){let t54=1/(count-i3),nextX=x12+t54*dx3,nextY=y12+t54*dy3;result.push([currentX,currentY,nextX,nextY]),currentX=nextX,currentY=nextY,i3++}return result}function getPathSplits(path,target){if(target<=1)throw new TypeError(`${error}: target must be >= 2`);let totalLength=getTotalLength(path);if(totalLength===0)return Array(path.length).fill(1);let idealSegLen=totalLength/target,isPoly=isPolylineArray(path),splits=[1],lengths=[0];iterate(path,(seg,i3,prevX,prevY)=>{if(i3>0){let[endX,endY]=seg.slice(-2),segLen=isPoly?getLineLength(prevX,prevY,endX,endY):getCubicLength(prevX,prevY,seg[1],seg[2],seg[3],seg[4],seg[5],seg[6]);lengths.push(segLen),splits.push(1)}});let totalAllocated=1;for(let i3=1;i3<lengths.length;i3++){let segLen=lengths[i3],desired=segLen>idealSegLen?Math.round(segLen/idealSegLen):1;splits[i3]=desired,totalAllocated+=desired}let diff=target-totalAllocated;if(diff!==0){let candidates=[];for(let i3=1;i3<lengths.length;i3++)lengths[i3]>0&&candidates.push([i3,lengths[i3]]);let cLen=candidates.length;if(diff<0){candidates.sort((a3,b4)=>a3[1]-b4[1]);for(let i3=0;i3<cLen;i3++){let idx=candidates[i3][0];if(splits[idx]>1&&candidates[i3][1]>0&&(splits[idx]--,diff++),diff===0)break;i3===cLen-1&&(i3=0)}}else if(diff>0){candidates.sort((a3,b4)=>b4[1]-a3[1]);for(let i3=0;i3<cLen;i3++){let idx=candidates[i3][0];if(candidates[i3][1]>0&&(splits[idx]++,diff--),diff===0)break;i3===cLen-1&&(i3=0)}}}return splits}function splitLinePathToCount(path,target){if(path.length<2||target<=1)return path;let splits=getPathSplits(path,target),totalAdded=0,newPath=[path[0]],pathLen=path.length,currentX=path[0][1],currentY=path[0][2];for(let i3=1;i3<pathLen;i3++){let[endX,endY]=path[i3].slice(1),count=splits[i3];if(count>=1){let subLines=splitLineToCount(currentX,currentY,endX,endY,count);for(let sub of subLines)newPath.push(["L",sub[2],sub[3]]),totalAdded++}currentX=endX,currentY=endY}return newPath.length!==target&&console.warn(`${error}: requested ${target} segments, got ${newPath.length}. Adjusted on last segment.`),newPath}function splitCubicToCount(x12,y12,x22,y22,x32,y3,x4,y4,count){if(count<=1)return[[x12,y12,x22,y22,x32,y3,x4,y4]];let result=[],cx1=x12,cy1=y12,cx22=x22,cy22=y22,cx3=x32,cy3=y3,cx4=x4,cy4=y4,i3=0;for(;i3<count;){let t54=1/(count-i3),[first,second]=splitCubicSegment(cx1,cy1,cx22,cy22,cx3,cy3,cx4,cy4,t54);result.push(first),[cx1,cy1,cx22,cy22,cx3,cy3,cx4,cy4]=second,i3++}return result}function splitCurvePathToCount(path,target){if(path.length<2||target<=1)return path;let splits=getPathSplits(path,target),totalAdded=0,newPath=[path[0]],pathLen=path.length,currentX=path[0][1],currentY=path[0][2];for(let i3=1;i3<pathLen;i3++){let seg=path[i3],[endX,endY]=seg.slice(-2),count=splits[i3];if(count>=1){let subs=splitCubicToCount(currentX,currentY,seg[1],seg[2],seg[3],seg[4],seg[5],seg[6],count);for(let sub of subs)newPath.push(["C",sub[2],sub[3],sub[4],sub[5],sub[6],sub[7]]),totalAdded++}currentX=endX,currentY=endY}return newPath.length!==target&&console.warn(`${error}: requested ${target} segments, got ${newPath.length}.`),newPath}function getRotations(a3){let pathLen=a3.length,pointCount=pathLen-1,path,result=[];for(let idx=0;idx<pathLen;idx++){path=[];for(let i3=0;i3<pathLen;i3++){let oldSegIdx=idx+i3,seg;if(i3===0||a3[oldSegIdx]&&a3[oldSegIdx][0]==="M"){seg=a3[oldSegIdx],path.push(["M",...seg.slice(-2)]);continue}oldSegIdx>=pathLen&&(oldSegIdx-=pointCount),path.push(a3[oldSegIdx])}result.push(path)}return result}function getRotatedPath(pathA,pathB,computedRotations){let rotations=computedRotations||getRotations(pathA);if(pathA.length!==pathB.length)throw new TypeError(error+": paths must have the same number of segments after equalization");let bestIndex=0,minDistanceSq=1/0;for(let ri3=0;ri3<rotations.length;ri3++){let rotation5=rotations[ri3],rLen=rotation5.length,sumDistSq=0;for(let i3=0;i3<rLen;i3++){let segA=rotation5[i3],segB=pathB[i3],endA=segA.slice(-2),endB=segB.slice(-2),dx3=endA[0]-endB[0],dy3=endA[1]-endB[1];sumDistSq+=dx3*dx3+dy3*dy3}sumDistSq<minDistanceSq&&(minDistanceSq=sumDistSq,bestIndex=ri3)}return rotations[bestIndex]}var equalizeSegmentsDefaults={mode:"auto",sampleSize:10,roundValues:4,reverse:!0,close:!1,target:void 0},equalizeSegments=(path1,path2,initialCfg={})=>{let{close,mode,reverse,roundValues,target:initialTarget}=Object.assign(equalizeSegmentsDefaults,initialCfg),p12=normalizePath(path1),p22=normalizePath(path2);fixPath(p12),fixPath(p22);let bothPoly=(isPolygonArray(p12)||isPolylineArray(p12))&&(isPolygonArray(p22)||isPolylineArray(p22));bothPoly&&mode==="auto"?(p12=pathToPolyline(p12),p22=pathToPolyline(p22)):(bothPoly=!1,p12=pathToCurve(p12),p22=pathToCurve(p22));let area1=polygonArea(samplePolygon(p12)),area2=polygonArea(samplePolygon(p22));reverse!==!1&&Math.sign(area1)!==Math.sign(area2)&&(p22=reversePath(p22));let segCount1=p12.length,segCount2=p22.length,minTarget=Math.max(segCount1,segCount2),target=minTarget;if(typeof initialTarget!="number"){let avgLen=(getTotalLength(p12)+getTotalLength(p22))/2,avgSegLen=avgLen/Math.max(segCount1,segCount2),idealSegCount=Math.max(minTarget,Math.round(avgLen/Math.max(avgSegLen,1)));target=Math.min(idealSegCount,Math.max(segCount1,segCount2)*3)}else initialTarget>=minTarget?target=initialTarget:console.warn('equalizeSegments "target" option: '+initialTarget+", expected >= "+minTarget);let equalP1=p12,equalP2=p22;return bothPoly?(equalP1=splitLinePathToCount(p12,target),equalP2=splitLinePathToCount(p22,target)):(equalP1=splitCurvePathToCount(p12,target),equalP2=splitCurvePathToCount(p22,target)),equalP2=getRotatedPath(equalP2,equalP1),typeof roundValues=="number"&&roundValues!==4&&(equalP1=roundPath(equalP1,roundValues),equalP2=roundPath(equalP2,roundValues)),close&&(equalP1.push(["Z"]),equalP2.push(["Z"])),[equalP1,equalP2]},isPointInsideBBox=(bbox,[x4,y3])=>{let[minX,minY,maxX,maxY]=bbox;return x4>=minX&&x4<=maxX&&y3>=minY&&y3<=maxY},boundingBoxIntersect=(a3,b4)=>{let[ax1,ay1,ax22,ay22]=a3,[bx1,by1,bx22,by22]=b4;return isPointInsideBBox(b4,[ax1,ay1])||isPointInsideBBox(b4,[ax22,ay1])||isPointInsideBBox(b4,[ax1,ay22])||isPointInsideBBox(b4,[ax22,ay22])||isPointInsideBBox(a3,[bx1,by1])||isPointInsideBBox(a3,[bx22,by1])||isPointInsideBBox(a3,[bx1,by22])||isPointInsideBBox(a3,[bx22,by22])||(ax1<bx22&&ax1>bx1||bx1<ax22&&bx1>ax1)&&(ay1<by22&&ay1>by1||by1<ay22&&by1>ay1)},createPlaceholder=([atx,aty])=>[["M",atx,aty],["L",atx+.001,aty],["L",atx+.001,aty+.001],["L",atx,aty+.001],["L",atx,aty],["Z"]];function getBestMatch(target,candidates){let targetBBox=target.bbox,potentialCandidates=[];for(let i3=0;i3<candidates.length;i3++){let{bbox,size:size3}=candidates[i3],dx3=targetBBox.cx-bbox.cx,dy3=targetBBox.cy-bbox.cy,centeredDistance=Math.sqrt(dx3*dx3+dy3*dy3),sizeDifference=Math.abs(target.size-size3)/Math.max(target.size,size3,1e-6),hasOverlap=isPointInsideBBox([targetBBox.x,targetBBox.y,targetBBox.x2,targetBBox.y2],[bbox.cx,bbox.cy])||isPointInsideBBox([bbox.x,bbox.y,bbox.x2,bbox.y2],[targetBBox.cx,targetBBox.cy]),boxIntersect=boundingBoxIntersect([targetBBox.x,targetBBox.y,targetBBox.x2,targetBBox.y2],[bbox.x,bbox.y,bbox.x2,bbox.y2]);potentialCandidates.push({index:i3,hasOverlap,boxIntersect,sizeDifference,centeredDistance})}let overlaping=potentialCandidates.filter(c6=>c6.hasOverlap&&c6.boxIntersect);if(overlaping.length>0){let best=overlaping[0];for(let i3=1;i3<overlaping.length;i3++)overlaping[i3].centeredDistance<best.centeredDistance&&(best=overlaping[i3]);return candidates.splice(best.index,1)[0]}return null}function matchPaths(fromPaths,toPaths){let pairs5=[];for(fromPaths.sort((a3,b4)=>b4.size-a3.size),toPaths.sort((a3,b4)=>b4.size-a3.size);fromPaths.length>0;){let from=fromPaths.shift(),bestTo=getBestMatch(from,toPaths);if(bestTo)pairs5.push([from.path,bestTo.path]);else{let fromCentroid=[from.bbox.cx,from.bbox.cy];pairs5.push([from.path,createPlaceholder(fromCentroid)])}}for(;toPaths.length>0;){let to3=toPaths.shift(),toCentroid=[to3.bbox.cx,to3.bbox.cy];pairs5.push([createPlaceholder(toCentroid),to3.path])}return pairs5}var classifyPaths=paths=>{let outers=[],inners=[];for(let path of paths){let signedArea3=polygonArea(samplePolygon(path)),bbox=getPathBBox(path),feature={isPoly:isPolygonArray(path)||isPolylineArray(path),size:bbox.width*bbox.height,path,signedArea:signedArea3,area:Math.abs(signedArea3),bbox};signedArea3>0?outers.push(feature):inners.push(feature)}return{outers,inners}},equalizePathsDefaults={mode:"auto",roundValues:4,close:!1,sampleSize:10},equalizePaths=(pathInput1,pathInput2,initialCfg={})=>{let cfg=Object.assign(equalizePathsDefaults,initialCfg),p12=normalizePath(pathInput1),p22=normalizePath(pathInput2),multi1=isMultiPath(p12),multi2=isMultiPath(p22);if(!multi1&&!multi2)return equalizeSegments(p12,p22,cfg);let globalArea1=polygonArea(samplePolygon(p12)),globalArea2=polygonArea(samplePolygon(p22)),path1=p12,path2=p22;Math.sign(globalArea1)<0&&(path1=reversePath(path1)),Math.sign(globalArea2)<0&&(path2=reversePath(path2));let multiPath1=splitPath(path1),multiPath2=splitPath(path2),{outers:outers1,inners:inners1}=classifyPaths(multiPath1),{outers:outers2,inners:inners2}=classifyPaths(multiPath2),outerPairs=matchPaths(outers1,outers2),innerPairs=matchPaths(inners1,inners2),equalizedPairs=[];for(let[from,to3]of[...outerPairs,...innerPairs]){let[eqFrom,eqTo]=equalizeSegments(from,to3,{...cfg,reverse:!1});equalizedPairs.push([eqFrom,eqTo])}return[equalizedPairs.map(p5=>p5[0]).flat(),equalizedPairs.map(p5=>p5[1]).flat()]},intersect2=(x12,y12,x22,y22,x32,y3,x4,y4)=>{if(Math.max(x12,x22)<Math.min(x32,x4)||Math.min(x12,x22)>Math.max(x32,x4)||Math.max(y12,y22)<Math.min(y3,y4)||Math.min(y12,y22)>Math.max(y3,y4))return;let nx3=(x12*y22-y12*x22)*(x32-x4)-(x12-x22)*(x32*y4-y3*x4),ny3=(x12*y22-y12*x22)*(y3-y4)-(y12-y22)*(x32*y4-y3*x4),denominator=(x12-x22)*(y3-y4)-(y12-y22)*(x32-x4);if(!denominator)return;let px3=nx3/denominator,py3=ny3/denominator,px22=roundTo(px3,2),py22=roundTo(py3,2);if(!(px22<roundTo(Math.min(x12,x22),2)||px22>roundTo(Math.max(x12,x22),2)||px22<roundTo(Math.min(x32,x4),2)||px22>roundTo(Math.max(x32,x4),2)||py22<roundTo(Math.min(y12,y22),2)||py22>roundTo(Math.max(y12,y22),2)||py22<roundTo(Math.min(y3,y4),2)||py22>roundTo(Math.max(y3,y4),2)))return{x:px3,y:py3}},interHelper=(bez1,bez2,config)=>{let bbox1=getCubicBBox(...bez1),bbox2=getCubicBBox(...bez2),{justCount,epsilon}=Object.assign({justCount:!0,epsilon:DISTANCE_EPSILON},config);if(!boundingBoxIntersect(bbox1,bbox2))return justCount?0:[];let l12=getCubicLength(...bez1),l22=getCubicLength(...bez2),n12=Math.max(l12/5>>0,1),n22=Math.max(l22/5>>0,1),points1=[],points2=[],xy3={},res2=justCount?0:[];for(let i3=0;i3<n12+1;i3++){let p5=getPointAtCubicLength(...bez1,i3/n12*l12);points1.push({x:p5.x,y:p5.y,t:i3/n12})}for(let i3=0;i3<n22+1;i3++){let p5=getPointAtCubicLength(...bez2,i3/n22*l22);points2.push({x:p5.x,y:p5.y,t:i3/n22})}for(let i3=0;i3<n12;i3++)for(let j5=0;j5<n22;j5++){let maxLimit=1+epsilon,di3=points1[i3],di1=points1[i3+1],dj2=points2[j5],dj1=points2[j5+1],ci3=Math.abs(di1.x-di3.x)<.001?"y":"x",cj2=Math.abs(dj1.x-dj2.x)<.001?"y":"x",is4=intersect2(di3.x,di3.y,di1.x,di1.y,dj2.x,dj2.y,dj1.x,dj1.y);if(is4){if(xy3[is4.x.toFixed(4)]==is4.y.toFixed(4))continue;xy3[is4.x.toFixed(4)]=is4.y.toFixed(4);let t110=di3.t+Math.abs((is4[ci3]-di3[ci3])/(di1[ci3]-di3[ci3]))*(di1.t-di3.t),t210=dj2.t+Math.abs((is4[cj2]-dj2[cj2])/(dj1[cj2]-dj2[cj2]))*(dj1.t-dj2.t);t110>=0&&t110<=maxLimit&&t210>=0&&t210<=maxLimit&&(justCount?res2++:res2.push({x:is4.x,y:is4.y,t1:Math.min(t110,1),t2:Math.min(t210,1)}))}}return res2},pathsIntersection=(pathInput1,pathInput2,justCount=!0)=>{let path1=pathToCurve(pathInput1),path2=pathToCurve(pathInput2),x12=0,y12=0,x22=0,y22=0,x1m=0,y1m=0,x2m=0,y2m=0,bez1=[x12,y12,x12,y12,x1m,y1m,x1m,y1m],bez2=[x22,y22,x22,y22,x2m,y2m,x2m,y2m],countResult=0,pointsResult=[],pathLen1=path1.length,pathLen2=path2.length;for(let i3=0;i3<pathLen1;i3++){let seg1=path1[i3];if(seg1[0]=="M")x12=seg1[1],y12=seg1[2],x1m=x12,y1m=y12;else{seg1[0]=="C"?(bez1=[x12,y12,seg1[1],seg1[2],seg1[3],seg1[4],seg1[5],seg1[6]],x12=bez1[6],y12=bez1[7]):(bez1=[x12,y12,x12,y12,x1m,y1m,x1m,y1m],x12=x1m,y12=y1m);for(let j5=0;j5<pathLen2;j5++){let seg2=path2[j5];seg2[0]=="M"?(x22=seg2[1],y22=seg2[2],x2m=x22,y2m=y22):seg2[0]=="C"&&(bez2=[x22,y22,seg2[1],seg2[2],seg2[3],seg2[4],seg2[5],seg2[6]],x22=bez2[6],y22=bez2[7]);let intr=interHelper(bez1,bez2,{justCount});justCount?countResult+=intr:pointsResult.push(...intr)}}}return justCount?countResult:pointsResult},_a4,SVGPathCommander=(_a4=class{constructor(pathValue,config){let instanceOptions=config||{},undefPath=typeof pathValue>"u";if(undefPath||!pathValue.length)throw TypeError(`${error}: "pathValue" is ${undefPath?"undefined":"empty"}`);this.segments=parsePathString(pathValue);let{round:roundOption,origin:originOption}=instanceOptions,round;Number.isInteger(roundOption)||roundOption==="off"?round=roundOption:round=defaultOptions2.round;let origin=defaultOptions2.origin;if(Array.isArray(originOption)&&originOption.length>=2){let[originX,originY,originZ]=originOption.map(Number);origin=[Number.isNaN(originX)?0:originX,Number.isNaN(originY)?0:originY,Number.isNaN(originZ)?0:originZ]}return this.round=round,this.origin=origin,this}get bbox(){return getPathBBox(this.segments)}get length(){return getTotalLength(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(length4){return getPointAtLength(this.segments,length4)}toAbsolute(){let{segments}=this;return this.segments=pathToAbsolute(segments),this}toRelative(){let{segments}=this;return this.segments=pathToRelative(segments),this}toCurve(){let{segments}=this;return this.segments=pathToCurve(segments),this}reverse(onlySubpath){let{segments}=this,split=splitPath(segments),subPath=split.length>1?split:!1,absoluteMultiPath=subPath?subPath.map((x4,i3)=>onlySubpath?i3?reversePath(x4):x4.slice(0):reversePath(x4)):segments.slice(0),path=[];return subPath?path=absoluteMultiPath.flat(1):path=onlySubpath?segments:reversePath(segments),this.segments=path.slice(0),this}normalize(){let{segments}=this;return this.segments=normalizePath(segments),this}optimize(){let{segments}=this;return this.segments=optimizePath(segments,this.round==="off"?2:this.round),this}transform(source){if(!source||typeof source!="object"||typeof source=="object"&&!["translate","rotate","skew","scale"].some(x4=>x4 in source))return this;let{segments,origin:[cx3,cy3,cz2]}=this,transform7={};for(let[k5,v3]of Object.entries(source))k5==="skew"&&Array.isArray(v3)||(k5==="rotate"||k5==="translate"||k5==="origin"||k5==="scale")&&Array.isArray(v3)?transform7[k5]=v3.map(Number):k5!=="origin"&&typeof Number(v3)=="number"&&(transform7[k5]=Number(v3));let{origin}=transform7;if(Array.isArray(origin)&&origin.length>=2){let[originX,originY,originZ]=origin.map(Number);transform7.origin=[Number.isNaN(originX)?cx3:originX,Number.isNaN(originY)?cy3:originY,originZ||cz2]}else transform7.origin=[cx3,cy3,cz2];return this.segments=transformPath(segments,transform7),this}flipX(){let{cx:cx3,cy:cy3}=this.bbox;return this.transform({rotate:[0,180,0],origin:[cx3,cy3,0]}),this}flipY(){let{cx:cx3,cy:cy3}=this.bbox;return this.transform({rotate:[180,0,0],origin:[cx3,cy3,0]}),this}toString(){return pathToString(this.segments,this.round)}dispose(){Object.keys(this).forEach(key=>delete this[key])}},__publicField(_a4,"options",defaultOptions2),__publicField(_a4,"CSSMatrix",h),__publicField(_a4,"arcTools",arcTools),__publicField(_a4,"bezierTools",bezierTools),__publicField(_a4,"cubicTools",cubicTools),__publicField(_a4,"lineTools",lineTools),__publicField(_a4,"polygonTools",polygonTools),__publicField(_a4,"quadTools",quadTools),__publicField(_a4,"pathToAbsolute",pathToAbsolute),__publicField(_a4,"pathToRelative",pathToRelative),__publicField(_a4,"pathToCurve",pathToCurve),__publicField(_a4,"pathToString",pathToString),__publicField(_a4,"distanceSquareRoot",distanceSquareRoot),__publicField(_a4,"midPoint",midPoint),__publicField(_a4,"rotateVector",rotateVector),__publicField(_a4,"roundTo",roundTo),__publicField(_a4,"parsePathString",parsePathString),__publicField(_a4,"finalizeSegment",finalizeSegment),__publicField(_a4,"invalidPathValue",invalidPathValue),__publicField(_a4,"isArcCommand",isArcCommand),__publicField(_a4,"isDigit",isDigit),__publicField(_a4,"isDigitStart",isDigitStart),__publicField(_a4,"isMoveCommand",isMoveCommand),__publicField(_a4,"isPathCommand",isPathCommand),__publicField(_a4,"isSpace",isSpace),__publicField(_a4,"paramsCount",paramsCounts),__publicField(_a4,"paramsParser",paramsParser),__publicField(_a4,"PathParser",PathParser),__publicField(_a4,"scanFlag",scanFlag),__publicField(_a4,"scanParam",scanParam),__publicField(_a4,"scanSegment",scanSegment),__publicField(_a4,"skipSpaces",skipSpaces),__publicField(_a4,"distanceEpsilon",DISTANCE_EPSILON),__publicField(_a4,"fixPath",fixPath),__publicField(_a4,"getClosestPoint",getClosestPoint),__publicField(_a4,"getDrawDirection",getDrawDirection),__publicField(_a4,"getPathArea",getPathArea),__publicField(_a4,"getPathBBox",getPathBBox),__publicField(_a4,"getPointAtLength",getPointAtLength),__publicField(_a4,"getPropertiesAtLength",getPropertiesAtLength),__publicField(_a4,"getPropertiesAtPoint",getPropertiesAtPoint),__publicField(_a4,"getSegmentAtLength",getSegmentAtLength),__publicField(_a4,"getSegmentOfPoint",getSegmentOfPoint),__publicField(_a4,"getTotalLength",getTotalLength),__publicField(_a4,"isAbsoluteArray",isAbsoluteArray),__publicField(_a4,"isCurveArray",isCurveArray),__publicField(_a4,"isPolygonArray",isPolygonArray),__publicField(_a4,"isNormalizedArray",isNormalizedArray),__publicField(_a4,"isPathArray",isPathArray),__publicField(_a4,"isPointInStroke",isPointInStroke),__publicField(_a4,"isRelativeArray",isRelativeArray),__publicField(_a4,"isValidPath",isValidPath),__publicField(_a4,"samplePolygon",samplePolygon),__publicField(_a4,"shapeParams",shapeParams),__publicField(_a4,"shapeToPath",shapeToPath),__publicField(_a4,"shapeToPathArray",shapeToPathArray),__publicField(_a4,"absolutizeSegment",absolutizeSegment),__publicField(_a4,"arcToCubic",arcToCubic),__publicField(_a4,"getSVGMatrix",getSVGMatrix),__publicField(_a4,"iterate",iterate),__publicField(_a4,"lineToCubic",lineToCubic),__publicField(_a4,"normalizePath",normalizePath),__publicField(_a4,"normalizeSegment",normalizeSegment),__publicField(_a4,"optimizePath",optimizePath),__publicField(_a4,"projection2d",projection2d),__publicField(_a4,"quadToCubic",quadToCubic),__publicField(_a4,"relativizeSegment",relativizeSegment),__publicField(_a4,"reverseCurve",reverseCurve),__publicField(_a4,"reversePath",reversePath),__publicField(_a4,"roundPath",roundPath),__publicField(_a4,"roundSegment",roundSegment),__publicField(_a4,"segmentToCubic",segmentToCubic),__publicField(_a4,"shortenSegment",shortenSegment),__publicField(_a4,"splitPath",splitPath),__publicField(_a4,"equalizePaths",equalizePaths),__publicField(_a4,"equalizeSegments",equalizeSegments),__publicField(_a4,"splitCubicSegment",splitCubicSegment),__publicField(_a4,"transformPath",transformPath),__publicField(_a4,"isPointInsideBBox",isPointInsideBBox),__publicField(_a4,"pathsIntersection",pathsIntersection),__publicField(_a4,"boundingBoxIntersect",boundingBoxIntersect),__publicField(_a4,"isMultiPath",isMultiPath),__publicField(_a4,"isClosedPath",isClosedPath),__publicField(_a4,"isPolylineArray",isPolylineArray),__publicField(_a4,"version",version),_a4),src_default=SVGPathCommander;init_dist2();init_dist5();init_dist2();var import_react2=__toESM(require_react(),1);init_dist5();init_zod();init_zod();init_dist2();function createMap(){return new IndexedMap}var IndexedMap=class _IndexedMap{constructor(){__publicField(this,"index",{});__publicField(this,"array",[])}size(){return this.array.length}empty(){return this.array.length===0}itemAt(index){return this.array[index]}contains(key){return this.index[key.id()]!==void 0}find(key){let i3=this.index[key.id()];return i3===void 0?void 0:this.array[i3]}setDefault(key,factory){let i3=this.index[key.id()];if(i3===void 0){let pair=new Pair(key,factory());return this.index[key.id()]=this.array.length,this.array.push(pair),pair}else return this.array[i3]}insert(key,value){let pair=new Pair(key,value),i3=this.index[key.id()];return i3===void 0?(this.index[key.id()]=this.array.length,this.array.push(pair)):this.array[i3]=pair,pair}erase(key){let i3=this.index[key.id()];if(i3===void 0)return;this.index[key.id()]=void 0;let pair=this.array[i3],last=this.array.pop();return pair!==last&&(this.array[i3]=last,this.index[last.first.id()]=i3),pair}copy(){let copy=new _IndexedMap;for(let i3=0;i3<this.array.length;i3++){let pair=this.array[i3].copy();copy.array[i3]=pair,copy.index[pair.first.id()]=i3}return copy}},Pair=class _Pair{constructor(first,second){__publicField(this,"first");__publicField(this,"second");this.first=first,this.second=second}copy(){return new _Pair(this.first,this.second)}};var Variable=class{constructor(name=""){__publicField(this,"_name");__publicField(this,"_value",0);__publicField(this,"_context",null);__publicField(this,"_id",VarId++);this._name=name}id(){return this._id}name(){return this._name}setName(name){this._name=name}context(){return this._context}setContext(context){this._context=context}value(){return this._value}setValue(value){this._value=value}plus(value){return new Expression(this,value)}minus(value){return new Expression(this,typeof value=="number"?-value:[-1,value])}multiply(coefficient){return new Expression([coefficient,this])}divide(coefficient){return new Expression([1/coefficient,this])}toJSON(){return{name:this._name,value:this._value}}toString(){return this._context+"["+this._name+":"+this._value+"]"}},VarId=0;var Expression=class _Expression{constructor(){__publicField(this,"_terms");__publicField(this,"_constant");let parsed=parseArgs(arguments);this._terms=parsed.terms,this._constant=parsed.constant}terms(){return this._terms}constant(){return this._constant}value(){let result=this._constant;for(let i3=0,n3=this._terms.size();i3<n3;i3++){let pair=this._terms.itemAt(i3);result+=pair.first.value()*pair.second}return result}plus(value){return new _Expression(this,value)}minus(value){return new _Expression(this,typeof value=="number"?-value:[-1,value])}multiply(coefficient){return new _Expression([coefficient,this])}divide(coefficient){return new _Expression([1/coefficient,this])}isConstant(){return this._terms.size()==0}toString(){let result=this._terms.array.map(function(pair){return pair.second+"*"+pair.first.toString()}).join(" + ");return!this.isConstant()&&this._constant!==0&&(result+=" + "),result+=this._constant,result}};function parseArgs(args){let constant=0,factory=()=>0,terms=createMap();for(let i3=0,n3=args.length;i3<n3;++i3){let item=args[i3];if(typeof item=="number")constant+=item;else if(item instanceof Variable)terms.setDefault(item,factory).second+=1;else if(item instanceof Expression){constant+=item.constant();let terms2=item.terms();for(let j5=0,k5=terms2.size();j5<k5;j5++){let termPair=terms2.itemAt(j5);terms.setDefault(termPair.first,factory).second+=termPair.second}}else if(item instanceof Array){if(item.length!==2)throw new Error("array must have length 2");let value=item[0],value2=item[1];if(typeof value!="number")throw new Error("array item 0 must be a number");if(value2 instanceof Variable)terms.setDefault(value2,factory).second+=value;else if(value2 instanceof Expression){constant+=value2.constant()*value;let terms2=value2.terms();for(let j5=0,k5=terms2.size();j5<k5;j5++){let termPair=terms2.itemAt(j5);terms.setDefault(termPair.first,factory).second+=termPair.second*value}}else throw new Error("array item 1 must be a variable or expression")}else throw new Error("invalid Expression argument: "+item)}return{terms,constant}}var _Strength=class _Strength{static create(a3,b4,c6,w4=1){let result=0;return result+=Math.max(0,Math.min(1e3,a3*w4))*1e6,result+=Math.max(0,Math.min(1e3,b4*w4))*1e3,result+=Math.max(0,Math.min(1e3,c6*w4)),result}static clip(value){return Math.max(0,Math.min(_Strength.required,value))}};__publicField(_Strength,"required",_Strength.create(1e3,1e3,1e3)),__publicField(_Strength,"strong",_Strength.create(1,0,0)),__publicField(_Strength,"medium",_Strength.create(0,1,0)),__publicField(_Strength,"weak",_Strength.create(0,0,1));var Strength=_Strength;var Operator;(function(Operator2){Operator2[Operator2.Le=0]="Le",Operator2[Operator2.Ge=1]="Ge",Operator2[Operator2.Eq=2]="Eq"})(Operator||(Operator={}));var Constraint=class{constructor(expression,operator,rhs,strength=Strength.required){__publicField(this,"_expression");__publicField(this,"_operator");__publicField(this,"_strength");__publicField(this,"_id",CnId++);this._operator=operator,this._strength=Strength.clip(strength),rhs===void 0&&expression instanceof Expression?this._expression=expression:this._expression=expression.minus(rhs)}id(){return this._id}expression(){return this._expression}op(){return this._operator}strength(){return this._strength}toString(){return this._expression.toString()+" "+["<=",">=","="][this._operator]+" 0 ("+this._strength.toString()+")"}},CnId=0;var Solver=class{constructor(){__publicField(this,"maxIterations",1e3);__publicField(this,"_cnMap",createCnMap());__publicField(this,"_rowMap",createRowMap());__publicField(this,"_varMap",createVarMap());__publicField(this,"_editMap",createEditMap());__publicField(this,"_infeasibleRows",[]);__publicField(this,"_objective",new Row);__publicField(this,"_artificial",null);__publicField(this,"_idTick",0)}createConstraint(lhs,operator,rhs,strength=Strength.required){let cn3=new Constraint(lhs,operator,rhs,strength);return this.addConstraint(cn3),cn3}addConstraint(constraint){if(this._cnMap.find(constraint)!==void 0)throw new Error("duplicate constraint");let data=this._createRow(constraint),row=data.row,tag=data.tag,subject=this._chooseSubject(row,tag);if(subject.type()===SymbolType.Invalid&&row.allDummies())if(nearZero(row.constant()))subject=tag.marker;else throw new Error("unsatisfiable constraint");if(subject.type()===SymbolType.Invalid){if(!this._addWithArtificialVariable(row))throw new Error("unsatisfiable constraint")}else row.solveFor(subject),this._substitute(subject,row),this._rowMap.insert(subject,row);this._cnMap.insert(constraint,tag),this._optimize(this._objective)}removeConstraint(constraint){let cnPair=this._cnMap.erase(constraint);if(cnPair===void 0)throw new Error("unknown constraint");this._removeConstraintEffects(constraint,cnPair.second);let marker=cnPair.second.marker,rowPair=this._rowMap.erase(marker);if(rowPair===void 0){let leaving=this._getMarkerLeavingSymbol(marker);if(leaving.type()===SymbolType.Invalid)throw new Error("failed to find leaving row");rowPair=this._rowMap.erase(leaving),rowPair.second.solveForEx(leaving,marker),this._substitute(marker,rowPair.second)}this._optimize(this._objective)}hasConstraint(constraint){return this._cnMap.contains(constraint)}getConstraints(){return this._cnMap.array.map(({first})=>first)}addEditVariable(variable,strength){if(this._editMap.find(variable)!==void 0)throw new Error("duplicate edit variable");if(strength=Strength.clip(strength),strength===Strength.required)throw new Error("bad required strength");let expr=new Expression(variable),cn3=new Constraint(expr,Operator.Eq,void 0,strength);this.addConstraint(cn3);let info={tag:this._cnMap.find(cn3).second,constraint:cn3,constant:0};this._editMap.insert(variable,info)}removeEditVariable(variable){let editPair=this._editMap.erase(variable);if(editPair===void 0)throw new Error("unknown edit variable");this.removeConstraint(editPair.second.constraint)}hasEditVariable(variable){return this._editMap.contains(variable)}suggestValue(variable,value){let editPair=this._editMap.find(variable);if(editPair===void 0)throw new Error("unknown edit variable");let rows=this._rowMap,info=editPair.second,delta=value-info.constant;info.constant=value;let marker=info.tag.marker,rowPair=rows.find(marker);if(rowPair!==void 0){rowPair.second.add(-delta)<0&&this._infeasibleRows.push(marker),this._dualOptimize();return}let other=info.tag.other;if(rowPair=rows.find(other),rowPair!==void 0){rowPair.second.add(delta)<0&&this._infeasibleRows.push(other),this._dualOptimize();return}for(let i3=0,n3=rows.size();i3<n3;++i3){let rowPair2=rows.itemAt(i3),row=rowPair2.second,coeff=row.coefficientFor(marker);coeff!==0&&row.add(delta*coeff)<0&&rowPair2.first.type()!==SymbolType.External&&this._infeasibleRows.push(rowPair2.first)}this._dualOptimize()}updateVariables(){let vars=this._varMap,rows=this._rowMap;for(let i3=0,n3=vars.size();i3<n3;++i3){let pair=vars.itemAt(i3),rowPair=rows.find(pair.second);rowPair!==void 0?pair.first.setValue(rowPair.second.constant()):pair.first.setValue(0)}}_getVarSymbol(variable){let factory=()=>this._makeSymbol(SymbolType.External);return this._varMap.setDefault(variable,factory).second}_createRow(constraint){let expr=constraint.expression(),row=new Row(expr.constant()),terms=expr.terms();for(let i3=0,n3=terms.size();i3<n3;++i3){let termPair=terms.itemAt(i3);if(!nearZero(termPair.second)){let symbol=this._getVarSymbol(termPair.first),basicPair=this._rowMap.find(symbol);basicPair!==void 0?row.insertRow(basicPair.second,termPair.second):row.insertSymbol(symbol,termPair.second)}}let objective=this._objective,strength=constraint.strength(),tag={marker:INVALID_SYMBOL,other:INVALID_SYMBOL};switch(constraint.op()){case Operator.Le:case Operator.Ge:{let coeff=constraint.op()===Operator.Le?1:-1,slack=this._makeSymbol(SymbolType.Slack);if(tag.marker=slack,row.insertSymbol(slack,coeff),strength<Strength.required){let error2=this._makeSymbol(SymbolType.Error);tag.other=error2,row.insertSymbol(error2,-coeff),objective.insertSymbol(error2,strength)}break}case Operator.Eq:{if(strength<Strength.required){let errplus=this._makeSymbol(SymbolType.Error),errminus=this._makeSymbol(SymbolType.Error);tag.marker=errplus,tag.other=errminus,row.insertSymbol(errplus,-1),row.insertSymbol(errminus,1),objective.insertSymbol(errplus,strength),objective.insertSymbol(errminus,strength)}else{let dummy=this._makeSymbol(SymbolType.Dummy);tag.marker=dummy,row.insertSymbol(dummy)}break}}return row.constant()<0&&row.reverseSign(),{row,tag}}_chooseSubject(row,tag){let cells=row.cells();for(let i3=0,n3=cells.size();i3<n3;++i3){let pair=cells.itemAt(i3);if(pair.first.type()===SymbolType.External)return pair.first}let type=tag.marker.type();return(type===SymbolType.Slack||type===SymbolType.Error)&&row.coefficientFor(tag.marker)<0?tag.marker:(type=tag.other.type(),(type===SymbolType.Slack||type===SymbolType.Error)&&row.coefficientFor(tag.other)<0?tag.other:INVALID_SYMBOL)}_addWithArtificialVariable(row){let art=this._makeSymbol(SymbolType.Slack);this._rowMap.insert(art,row.copy()),this._artificial=row.copy(),this._optimize(this._artificial);let success=nearZero(this._artificial.constant());this._artificial=null;let pair=this._rowMap.erase(art);if(pair!==void 0){let basicRow=pair.second;if(basicRow.isConstant())return success;let entering=this._anyPivotableSymbol(basicRow);if(entering.type()===SymbolType.Invalid)return!1;basicRow.solveForEx(art,entering),this._substitute(entering,basicRow),this._rowMap.insert(entering,basicRow)}let rows=this._rowMap;for(let i3=0,n3=rows.size();i3<n3;++i3)rows.itemAt(i3).second.removeSymbol(art);return this._objective.removeSymbol(art),success}_substitute(symbol,row){let rows=this._rowMap;for(let i3=0,n3=rows.size();i3<n3;++i3){let pair=rows.itemAt(i3);pair.second.substitute(symbol,row),pair.second.constant()<0&&pair.first.type()!==SymbolType.External&&this._infeasibleRows.push(pair.first)}this._objective.substitute(symbol,row),this._artificial&&this._artificial.substitute(symbol,row)}_optimize(objective){let iterations=0;for(;iterations<this.maxIterations;){let entering=this._getEnteringSymbol(objective);if(entering.type()===SymbolType.Invalid)return;let leaving=this._getLeavingSymbol(entering);if(leaving.type()===SymbolType.Invalid)throw new Error("the objective is unbounded");let row=this._rowMap.erase(leaving).second;row.solveForEx(leaving,entering),this._substitute(entering,row),this._rowMap.insert(entering,row),iterations++}throw new Error("solver iterations exceeded")}_dualOptimize(){let rows=this._rowMap,infeasible=this._infeasibleRows;for(;infeasible.length!==0;){let leaving=infeasible.pop(),pair=rows.find(leaving);if(pair!==void 0&&pair.second.constant()<0){let entering=this._getDualEnteringSymbol(pair.second);if(entering.type()===SymbolType.Invalid)throw new Error("dual optimize failed");let row=pair.second;rows.erase(leaving),row.solveForEx(leaving,entering),this._substitute(entering,row),rows.insert(entering,row)}}}_getEnteringSymbol(objective){let cells=objective.cells();for(let i3=0,n3=cells.size();i3<n3;++i3){let pair=cells.itemAt(i3),symbol=pair.first;if(pair.second<0&&symbol.type()!==SymbolType.Dummy)return symbol}return INVALID_SYMBOL}_getDualEnteringSymbol(row){let ratio=Number.MAX_VALUE,entering=INVALID_SYMBOL,cells=row.cells();for(let i3=0,n3=cells.size();i3<n3;++i3){let pair=cells.itemAt(i3),symbol=pair.first,c6=pair.second;if(c6>0&&symbol.type()!==SymbolType.Dummy){let r6=this._objective.coefficientFor(symbol)/c6;r6<ratio&&(ratio=r6,entering=symbol)}}return entering}_getLeavingSymbol(entering){let ratio=Number.MAX_VALUE,found=INVALID_SYMBOL,rows=this._rowMap;for(let i3=0,n3=rows.size();i3<n3;++i3){let pair=rows.itemAt(i3),symbol=pair.first;if(symbol.type()!==SymbolType.External){let row=pair.second,temp=row.coefficientFor(entering);if(temp<0){let temp_ratio=-row.constant()/temp;temp_ratio<ratio&&(ratio=temp_ratio,found=symbol)}}}return found}_getMarkerLeavingSymbol(marker){let dmax=Number.MAX_VALUE,r12=dmax,r22=dmax,invalid=INVALID_SYMBOL,first=invalid,second=invalid,third=invalid,rows=this._rowMap;for(let i3=0,n3=rows.size();i3<n3;++i3){let pair=rows.itemAt(i3),row=pair.second,c6=row.coefficientFor(marker);if(c6===0)continue;let symbol=pair.first;if(symbol.type()===SymbolType.External)third=symbol;else if(c6<0){let r6=-row.constant()/c6;r6<r12&&(r12=r6,first=symbol)}else{let r6=row.constant()/c6;r6<r22&&(r22=r6,second=symbol)}}return first!==invalid?first:second!==invalid?second:third}_removeConstraintEffects(cn3,tag){tag.marker.type()===SymbolType.Error&&this._removeMarkerEffects(tag.marker,cn3.strength()),tag.other.type()===SymbolType.Error&&this._removeMarkerEffects(tag.other,cn3.strength())}_removeMarkerEffects(marker,strength){let pair=this._rowMap.find(marker);pair!==void 0?this._objective.insertRow(pair.second,-strength):this._objective.insertSymbol(marker,-strength)}_anyPivotableSymbol(row){let cells=row.cells();for(let i3=0,n3=cells.size();i3<n3;++i3){let pair=cells.itemAt(i3),type=pair.first.type();if(type===SymbolType.Slack||type===SymbolType.Error)return pair.first}return INVALID_SYMBOL}_makeSymbol(type){return new Symbol2(type,this._idTick++)}};function nearZero(value){let eps=1e-8;return value<0?-value<eps:value<eps}function createCnMap(){return createMap()}function createRowMap(){return createMap()}function createVarMap(){return createMap()}function createEditMap(){return createMap()}var SymbolType;(function(SymbolType2){SymbolType2[SymbolType2.Invalid=0]="Invalid",SymbolType2[SymbolType2.External=1]="External",SymbolType2[SymbolType2.Slack=2]="Slack",SymbolType2[SymbolType2.Error=3]="Error",SymbolType2[SymbolType2.Dummy=4]="Dummy"})(SymbolType||(SymbolType={}));var Symbol2=class{constructor(type,id3){__publicField(this,"_id");__publicField(this,"_type");this._id=id3,this._type=type}id(){return this._id}type(){return this._type}},INVALID_SYMBOL=new Symbol2(SymbolType.Invalid,-1),Row=class _Row{constructor(constant=0){__publicField(this,"_cellMap",createMap());__publicField(this,"_constant");this._constant=constant}cells(){return this._cellMap}constant(){return this._constant}isConstant(){return this._cellMap.empty()}allDummies(){let cells=this._cellMap;for(let i3=0,n3=cells.size();i3<n3;++i3)if(cells.itemAt(i3).first.type()!==SymbolType.Dummy)return!1;return!0}copy(){let theCopy=new _Row(this._constant);return theCopy._cellMap=this._cellMap.copy(),theCopy}add(value){return this._constant+=value}insertSymbol(symbol,coefficient=1){let pair=this._cellMap.setDefault(symbol,()=>0);nearZero(pair.second+=coefficient)&&this._cellMap.erase(symbol)}insertRow(other,coefficient=1){this._constant+=other._constant*coefficient;let cells=other._cellMap;for(let i3=0,n3=cells.size();i3<n3;++i3){let pair=cells.itemAt(i3);this.insertSymbol(pair.first,pair.second*coefficient)}}removeSymbol(symbol){this._cellMap.erase(symbol)}reverseSign(){this._constant=-this._constant;let cells=this._cellMap;for(let i3=0,n3=cells.size();i3<n3;++i3){let pair=cells.itemAt(i3);pair.second=-pair.second}}solveFor(symbol){let cells=this._cellMap,coeff=-1/cells.erase(symbol).second;this._constant*=coeff;for(let i3=0,n3=cells.size();i3<n3;++i3)cells.itemAt(i3).second*=coeff}solveForEx(lhs,rhs){this.insertSymbol(lhs,-1),this.solveFor(rhs)}coefficientFor(symbol){let pair=this._cellMap.find(symbol);return pair!==void 0?pair.second:0}substitute(symbol,row){let pair=this._cellMap.erase(symbol);pair!==void 0&&this.insertRow(row,pair.second)}};var import_debug9=__toESM(require_browser(),1);init_dist7();var import_react3=__toESM(require_react(),1);init_dist2();var import_debug10=__toESM(require_browser(),1);init_dist7();init_dist2();init_dist2();var import_react4=__toESM(require_react(),1);init_dist4();init_dist7();init_dist7();init_dist7();init_dist4();init_dist2();init_dist7();init_dist7();init_src();init_dist7();init_dist4();init_dist7();init_dist4();init_dist7();init_dist4();init_dist4();init_dist7();init_dist7();init_dist4();init_dist7();init_dist7();init_dist4();init_dist7();init_dist7();init_dist4();init_dist7();init_dist4();init_dist7();init_dist7();init_dist7();init_dist7();init_dist7();init_dist4();var rotatePoint=(point6,angleDegrees)=>{let angle=angleDegrees*Math.PI/180;return{x:point6.x*Math.cos(angle)-point6.y*Math.sin(angle),y:point6.x*Math.sin(angle)+point6.y*Math.cos(angle)}},getRotatedRectPoints=({x:x4,y:y3,width,height,ccwRotation})=>{let halfWidth=width/2,halfHeight=height/2;return[{x:-halfWidth,y:-halfHeight},{x:halfWidth,y:-halfHeight},{x:halfWidth,y:halfHeight},{x:-halfWidth,y:halfHeight}].map(point6=>{let rotated=rotatePoint(point6,ccwRotation);return{x:x4+rotated.x,y:y3+rotated.y}})},getPillCenterLineForPad=pad2=>{let ccwRotation=pad2.shape==="rotated_pill"?pad2.ccw_rotation:0,halfLineLength=Math.max(Math.max(pad2.width,pad2.height)/2-pad2.radius,0),axis=pad2.width>=pad2.height?{x:halfLineLength,y:0}:{x:0,y:halfLineLength},rotatedAxis=rotatePoint(axis,ccwRotation);return{start:{x:pad2.x-rotatedAxis.x,y:pad2.y-rotatedAxis.y},end:{x:pad2.x+rotatedAxis.x,y:pad2.y+rotatedAxis.y},radius:pad2.radius}},getPolygonPointsForPad=pad2=>{if(pad2.type==="pcb_smtpad"){if(pad2.shape==="polygon")return pad2.points;if(pad2.shape==="rotated_rect")return getRotatedRectPoints({x:pad2.x,y:pad2.y,width:pad2.width,height:pad2.height,ccwRotation:pad2.ccw_rotation})}if(pad2.type==="pcb_plated_hole"&&"rect_pad_width"in pad2&&"rect_pad_height"in pad2)return getRotatedRectPoints({x:pad2.x,y:pad2.y,width:pad2.rect_pad_width,height:pad2.rect_pad_height,ccwRotation:"rect_ccw_rotation"in pad2&&typeof pad2.rect_ccw_rotation=="number"?pad2.rect_ccw_rotation:0});throw new Error(`Expected polygonal pad geometry, got ${pad2.type} with shape "${pad2.shape}"`)},getPolygonEdges3=points=>points.map((point6,index)=>[point6,points[(index+1)%points.length]]),getClosestPointsBetweenSegments=(a12,a22,b12,b22)=>{let intersection=getSegmentIntersection(a12,a22,b12,b22);if(intersection)return{distance:0,pointOnA:intersection,pointOnB:intersection,center:intersection};let candidates=[{pointOnA:a12,pointOnB:pointToSegmentClosestPoint(a12,b12,b22)},{pointOnA:a22,pointOnB:pointToSegmentClosestPoint(a22,b12,b22)},{pointOnA:pointToSegmentClosestPoint(b12,a12,a22),pointOnB:b12},{pointOnA:pointToSegmentClosestPoint(b22,a12,a22),pointOnB:b22}],best=candidates[0],bestDistanceSquared=distSq(best.pointOnA,best.pointOnB);for(let candidate of candidates.slice(1)){let candidateDistanceSquared=distSq(candidate.pointOnA,candidate.pointOnB);candidateDistanceSquared<bestDistanceSquared&&(best=candidate,bestDistanceSquared=candidateDistanceSquared)}return{distance:segmentToSegmentMinDistance(a12,a22,b12,b22),pointOnA:best.pointOnA,pointOnB:best.pointOnB,center:{x:(best.pointOnA.x+best.pointOnB.x)/2,y:(best.pointOnA.y+best.pointOnB.y)/2}}},getSegmentToPolygonClearanceFromPoints=(start,end,polygon2)=>{if(polygon2.length<3)return{distance:Number.POSITIVE_INFINITY,center:start};let intersections=getPolygonEdges3(polygon2).map(([edgeStart,edgeEnd])=>getSegmentIntersection(start,end,edgeStart,edgeEnd)).filter(point6=>point6!==null);if(intersections.length>0){let dx3=end.x-start.x,dy3=end.y-start.y,lengthSquared=dx3*dx3+dy3*dy3;return intersections.sort((a3,b4)=>{let ta3=((a3.x-start.x)*dx3+(a3.y-start.y)*dy3)/lengthSquared,tb2=((b4.x-start.x)*dx3+(b4.y-start.y)*dy3)/lengthSquared;return ta3-tb2}),{distance:0,center:intersections[0]}}if(isPointInsidePolygon(start,polygon2)||isPointInsidePolygon(end,polygon2))return{distance:0,center:{x:(start.x+end.x)/2,y:(start.y+end.y)/2}};let best=getClosestPointsBetweenSegments(start,end,polygon2[0],polygon2[1]);for(let[edgeStart,edgeEnd]of getPolygonEdges3(polygon2).slice(1)){let candidate=getClosestPointsBetweenSegments(start,end,edgeStart,edgeEnd);candidate.distance<best.distance&&(best=candidate)}return{distance:best.distance,center:best.center}},getSegmentToPolygonClearance=(segment2,polygon2)=>getSegmentToPolygonClearanceFromPoints({x:segment2.x1,y:segment2.y1},{x:segment2.x2,y:segment2.y2},polygon2),getSegmentToPillClearance=(segment2,pad2)=>{let pill=getPillCenterLineForPad(pad2),closest=getClosestPointsBetweenSegments({x:segment2.x1,y:segment2.y1},{x:segment2.x2,y:segment2.y2},pill.start,pill.end);return{distance:closest.distance,center:closest.center,radius:pill.radius}};function getDistanceBetweenPoints(pointA,pointB){return Math.sqrt((pointB.x-pointA.x)**2+(pointB.y-pointA.y)**2)}var POINT_ON_SEGMENT_TOLERANCE_MM=1e-9;function isPointOnSegment3(point6,segment2){let crossProduct=(point6.y-segment2.start.y)*(segment2.end.x-segment2.start.x)-(point6.x-segment2.start.x)*(segment2.end.y-segment2.start.y);if(Math.abs(crossProduct)>POINT_ON_SEGMENT_TOLERANCE_MM)return!1;let dotProduct=(point6.x-segment2.start.x)*(segment2.end.x-segment2.start.x)+(point6.y-segment2.start.y)*(segment2.end.y-segment2.start.y);if(dotProduct<-POINT_ON_SEGMENT_TOLERANCE_MM)return!1;let squaredLength=(segment2.end.x-segment2.start.x)**2+(segment2.end.y-segment2.start.y)**2;return dotProduct<=squaredLength+POINT_ON_SEGMENT_TOLERANCE_MM}function isPointInPad(point6,pad2){if(pad2.type==="pcb_smtpad"){if(pad2.shape==="circle")return getDistanceBetweenPoints(point6,pad2)<=pad2.radius;if(pad2.shape==="rect"){let halfWidth=pad2.width/2,halfHeight=pad2.height/2;return Math.abs(point6.x-pad2.x)<=halfWidth&&Math.abs(point6.y-pad2.y)<=halfHeight}if(pad2.shape==="rotated_rect"){let dx3=point6.x-pad2.x,dy3=point6.y-pad2.y,angle=-pad2.ccw_rotation,rotatedX=dx3*Math.cos(angle)-dy3*Math.sin(angle),rotatedY=dx3*Math.sin(angle)+dy3*Math.cos(angle);return Math.abs(rotatedX)<=pad2.width/2&&Math.abs(rotatedY)<=pad2.height/2}if(pad2.shape==="pill"||pad2.shape==="rotated_pill"){if(pad2.shape==="rotated_pill"){let pill=getPillCenterLineForPad(pad2);return pointToSegmentDistance(point6,pill.start,pill.end)<=pill.radius}let halfWidth=pad2.width/2,halfHeight=pad2.height/2,radius=pad2.radius;if(Math.abs(point6.x-pad2.x)<=halfWidth-radius&&Math.abs(point6.y-pad2.y)<=halfHeight)return!0;let cornerX=Math.max(Math.abs(point6.x-pad2.x)-(halfWidth-radius),0),cornerY=Math.max(Math.abs(point6.y-pad2.y)-(halfHeight-radius),0);return cornerX*cornerX+cornerY*cornerY<=radius*radius}if(pad2.shape==="polygon"){let inside2=!1;for(let i3=0,j5=pad2.points.length-1;i3<pad2.points.length;j5=i3++){let pi3=pad2.points[i3],pj2=pad2.points[j5];if(isPointOnSegment3(point6,{start:pi3,end:pj2}))return!0;pi3.y>point6.y!=pj2.y>point6.y&&point6.x<(pj2.x-pi3.x)*(point6.y-pi3.y)/(pj2.y-pi3.y)+pi3.x&&(inside2=!inside2)}return inside2}}if(pad2.type==="pcb_plated_hole"){if(pad2.shape==="circle")return getDistanceBetweenPoints(point6,pad2)<=pad2.outer_diameter/2;if(pad2.shape==="oval"||pad2.shape==="pill")return Math.abs(point6.x-pad2.x)<=pad2.outer_width/2&&Math.abs(point6.y-pad2.y)<=pad2.outer_height/2;if(pad2.shape==="circular_hole_with_rect_pad"||pad2.shape==="pill_hole_with_rect_pad")return Math.abs(point6.x-pad2.x)<=pad2.rect_pad_width/2&&Math.abs(point6.y-pad2.y)<=pad2.rect_pad_height/2}return!1}function distance5(x12,y12,x22,y22){return Math.sqrt((x22-x12)**2+(y22-y12)**2)}var addStartAndEndPortIdsIfMissing=soup=>{let pcbPorts=soup.filter(item=>item.type==="pcb_port"),pcbSmtPads=soup.filter(item=>item.type==="pcb_smtpad"),pcbTraces=soup.filter(item=>item.type==="pcb_trace");function findPortIdOverlappingPoint(point6,options={}){let traceWidth=options.traceWidth||0,directPort=pcbPorts.find(port=>distance5(port.x,port.y,point6.x,point6.y)<.01);if(directPort)return directPort.pcb_port_id;if(options.isFirstOrLastPoint){let smtPad=pcbSmtPads.find(pad2=>{if(pad2.shape==="rect")return Math.abs(point6.x-pad2.x)<pad2.width/2+traceWidth/2&&Math.abs(point6.y-pad2.y)<pad2.height/2+traceWidth/2;if(pad2.shape==="circle")return distance5(point6.x,point6.y,pad2.x,pad2.y)<pad2.radius;if(pad2.shape==="pill"||pad2.shape==="rotated_pill")return isPointInPad(point6,pad2)});if(smtPad)return smtPad.pcb_port_id??null}return null}for(let trace of pcbTraces)for(let index=0;index<trace.route.length;index++){let segment2=trace.route[index],isFirstOrLastPoint=index===0||index===trace.route.length-1;if(segment2.route_type==="wire"){if(!segment2.start_pcb_port_id&&index===0){let startPortId=findPortIdOverlappingPoint(segment2,{isFirstOrLastPoint,traceWidth:segment2.width});startPortId&&(segment2.start_pcb_port_id=startPortId)}if(!segment2.end_pcb_port_id&&index===trace.route.length-1){let endPortId=findPortIdOverlappingPoint(segment2,{isFirstOrLastPoint,traceWidth:segment2.width});endPortId&&(segment2.end_pcb_port_id=endPortId)}}}},CIRCUIT_JSON_ID_PATTERN=/\b(?:pcb|source|schematic|subcircuit)_[a-z0-9_]+\b/i,sanitizeReadableName=(candidate,id3,fallbackLabel)=>!candidate||candidate===id3||CIRCUIT_JSON_ID_PATTERN.test(candidate)?fallbackLabel:candidate,firstReadableName=(candidates,id3)=>{for(let candidate of candidates){let readableName=sanitizeReadableName(candidate,id3,"");if(readableName)return readableName}return""},getReadableNameForComponent=(circuitJson,pcbComponentId)=>sanitizeReadableName(getReadableNameForElement(circuitJson,pcbComponentId),pcbComponentId,"component"),getReadableNameForPort=(circuitJson,pcbPortId)=>{let pcbPort=circuitJson.find(element=>element.type==="pcb_port"&&element.pcb_port_id===pcbPortId);if(pcbPort?.type==="pcb_port"){let sourcePort=circuitJson.find(element=>element.type==="source_port"&&element.source_port_id===pcbPort.source_port_id),sourceComponent=sourcePort?.type==="source_port"?circuitJson.find(element=>element.type==="source_component"&&element.source_component_id===sourcePort.source_component_id):null,readableSourceComponentName=firstReadableName([sourceComponent?.type==="source_component"?sourceComponent.name:null],sourceComponent?.type==="source_component"?sourceComponent.source_component_id:""),readableSourcePortName=firstReadableName([sourcePort?.type==="source_port"?sourcePort.name:null,sourcePort?.type==="source_port"?sourcePort.pin_number?.toString():null,sourcePort?.type==="source_port"?sourcePort.port_hints?.[0]:null],sourcePort?.type==="source_port"?sourcePort.source_port_id:"");if(readableSourceComponentName&&readableSourcePortName)return`${readableSourceComponentName}.${readableSourcePortName}`;if(readableSourcePortName)return readableSourcePortName}return sanitizeReadableName(getReadableNameForPcbPort(circuitJson,pcbPortId)??getReadableNameForElement(circuitJson,pcbPortId),pcbPortId,"port")};var getReadableNameForElementId=(circuitJson,elementId)=>sanitizeReadableName(getReadableNameForElement(circuitJson,elementId),elementId,"element"),containsCircuitJsonId=message=>CIRCUIT_JSON_ID_PATTERN.test(message);function checkEachPcbPortConnectedToPcbTraces(circuitJson){addStartAndEndPortIdsIfMissing(circuitJson);let sourceTraces=circuitJson.filter(item=>item.type==="source_trace"),pcbPorts=circuitJson.filter(item=>item.type==="pcb_port"),errors=[],connectivityMap=getFullConnectivityMapFromCircuitJson(circuitJson),sourcePortToPcbPort=new Map;for(let pcbPort of pcbPorts)sourcePortToPcbPort.set(pcbPort.source_port_id,pcbPort);for(let sourceTrace of sourceTraces){let connectedSourcePortIds=sourceTrace.connected_source_port_ids;if(connectedSourcePortIds.length<2)continue;let pcbPortsInTrace=[],missingPcbPorts=[];for(let sourcePortId of connectedSourcePortIds){let pcbPort=sourcePortToPcbPort.get(sourcePortId);pcbPort?pcbPortsInTrace.push(pcbPort):missingPcbPorts.push(sourcePortId)}if(pcbPortsInTrace.length<2)continue;let firstPcbPort=pcbPortsInTrace[0],referenceNetId=connectivityMap.getNetConnectedToId(firstPcbPort.pcb_port_id);connectivityMap.getIdsConnectedToNet(referenceNetId).filter(id3=>circuitJson.some(element=>element.type==="pcb_trace"&&("pcb_trace_id"in element&&element.pcb_trace_id===id3||"route_id"in element&&element.route_id===id3))).length===0&&new Set(pcbPortsInTrace.map(p5=>p5.pcb_component_id)).size>1&&errors.push({type:"pcb_port_not_connected_error",message:`Ports [${pcbPortsInTrace.map(p5=>getReadableNameForPort(circuitJson,p5.pcb_port_id)).join(", ")}] are not connected together through the same net.`,error_type:"pcb_port_not_connected_error",pcb_port_ids:pcbPortsInTrace.map(p5=>p5.pcb_port_id),pcb_component_ids:pcbPortsInTrace.map(p5=>p5.pcb_component_id).filter(id3=>id3!==void 0),pcb_port_not_connected_error_id:`pcb_port_not_connected_error_trace_${sourceTrace.source_trace_id}`})}return errors}var SpatialObjectIndex=class{constructor({objects,getBounds:getBounds3,getId,CELL_SIZE}){__publicField(this,"buckets");__publicField(this,"objectsById");__publicField(this,"getBounds");__publicField(this,"getId");__publicField(this,"CELL_SIZE",.4);__publicField(this,"_idCounter",0);this.buckets=new Map,this.objectsById=new Map,this.getBounds=getBounds3,this.getId=getId??(()=>this._getNextId()),this.CELL_SIZE=CELL_SIZE??this.CELL_SIZE;for(let obj of objects)this.addObject(obj)}_getNextId(){return`${this._idCounter++}`}addObject(obj){let bounds=this.getBounds(obj),spatialIndexId=this.getId(obj),objWithId={...obj,spatialIndexId};this.objectsById.set(spatialIndexId,objWithId);let minBucketX=Math.floor(bounds.minX/this.CELL_SIZE),minBucketY=Math.floor(bounds.minY/this.CELL_SIZE),maxBucketX=Math.floor(bounds.maxX/this.CELL_SIZE),maxBucketY=Math.floor(bounds.maxY/this.CELL_SIZE);for(let bx3=minBucketX;bx3<=maxBucketX;bx3++)for(let by3=minBucketY;by3<=maxBucketY;by3++){let bucketKey=`${bx3}x${by3}`,bucket=this.buckets.get(bucketKey);bucket?bucket.push(objWithId):this.buckets.set(bucketKey,[objWithId])}}removeObject(id3){let obj=this.objectsById.get(id3);if(!obj)return!1;this.objectsById.delete(id3);let bounds=this.getBounds(obj),minBucketX=Math.floor(bounds.minX/this.CELL_SIZE),minBucketY=Math.floor(bounds.minY/this.CELL_SIZE),maxBucketX=Math.floor(bounds.maxX/this.CELL_SIZE),maxBucketY=Math.floor(bounds.maxY/this.CELL_SIZE);for(let bx3=minBucketX;bx3<=maxBucketX;bx3++)for(let by3=minBucketY;by3<=maxBucketY;by3++){let bucketKey=`${bx3}x${by3}`,bucket=this.buckets.get(bucketKey);if(bucket){let index=bucket.findIndex(item=>item.spatialIndexId===id3);index!==-1&&(bucket.splice(index,1),bucket.length===0&&this.buckets.delete(bucketKey))}}return!0}getBucketKey(x4,y3){return`${Math.floor(x4/this.CELL_SIZE)}x${Math.floor(y3/this.CELL_SIZE)}`}getObjectsInBounds(bounds,margin=0){let objects=[],addedIds=new Set,minBucketX=Math.floor((bounds.minX-margin)/this.CELL_SIZE),minBucketY=Math.floor((bounds.minY-margin)/this.CELL_SIZE),maxBucketX=Math.floor((bounds.maxX+margin)/this.CELL_SIZE),maxBucketY=Math.floor((bounds.maxY+margin)/this.CELL_SIZE);for(let bx3=minBucketX;bx3<=maxBucketX;bx3++)for(let by3=minBucketY;by3<=maxBucketY;by3++){let bucketKey=`${bx3}x${by3}`,bucket=this.buckets.get(bucketKey)||[];for(let obj of bucket){let id3=obj.spatialIndexId;addedIds.has(id3)||(addedIds.add(id3),objects.push(obj))}}return objects}},jlcMinTolerances={min_trace_width:.1,min_via_hole_edge_to_via_hole_edge_clearance:.1,min_plated_hole_drill_edge_to_drill_edge_clearance:.15,min_trace_to_pad_edge_clearance:.1,min_pad_edge_to_pad_edge_clearance:.1,min_board_edge_clearance:.2,min_via_hole_diameter:.2,min_via_pad_diameter:.3},DEFAULT_TRACE_MARGIN=.1,DEFAULT_TRACE_THICKNESS=jlcMinTolerances.min_trace_width,DEFAULT_VIA_DIAMETER=jlcMinTolerances.min_via_pad_diameter,DEFAULT_VIA_BOARD_MARGIN=jlcMinTolerances.min_board_edge_clearance,DEFAULT_SAME_NET_VIA_MARGIN=jlcMinTolerances.min_via_hole_edge_to_via_hole_edge_clearance,DEFAULT_DIFFERENT_NET_VIA_MARGIN=jlcMinTolerances.min_via_hole_edge_to_via_hole_edge_clearance,DEFAULT_PAD_PAD_CLEARANCE=jlcMinTolerances.min_pad_edge_to_pad_edge_clearance,DEFAULT_PAD_TRACE_CLEARANCE=jlcMinTolerances.min_trace_to_pad_edge_clearance,EPSILON2=.005,getPcbBoard=circuitJson=>circuitJson.find(el3=>el3.type==="pcb_board"),getBoardDrcValue=(board,key)=>board?.[key];function getLayersOfPcbElement(obj){return obj.type==="pcb_trace_segment"?[obj.layer]:obj.type==="pcb_smtpad"?[obj.layer]:obj.type==="pcb_plated_hole"?Array.isArray(obj.layers)?obj.layers:[...all_layers]:obj.type==="pcb_hole"?[...all_layers]:obj.type==="pcb_via"?Array.isArray(obj.layers)?obj.layers:[...all_layers]:obj.type==="pcb_keepout"?Array.isArray(obj.layers)?obj.layers:[]:[]}var getClosestPointBetweenSegmentAndBounds=(segment2,bounds)=>{let p12={x:segment2.x1,y:segment2.y1},p22={x:segment2.x2,y:segment2.y2},minX=bounds.minX,minY=bounds.minY,maxX=bounds.maxX,maxY=bounds.maxY;if(p12.x===p22.x&&p12.y===p22.y){let closestX=Math.max(minX,Math.min(maxX,p12.x)),closestY=Math.max(minY,Math.min(maxY,p12.y));return closestX===p12.x&&closestY===p12.y?{x:p12.x,y:p12.y}:{x:closestX,y:closestY}}let dx3=p22.x-p12.x,dy3=p22.y-p12.y,tMinX=dx3!==0?(minX-p12.x)/dx3:Number.NEGATIVE_INFINITY,tMaxX=dx3!==0?(maxX-p12.x)/dx3:Number.POSITIVE_INFINITY,tMinY=dy3!==0?(minY-p12.y)/dy3:Number.NEGATIVE_INFINITY,tMaxY=dy3!==0?(maxY-p12.y)/dy3:Number.POSITIVE_INFINITY,tEnter=Math.max(Math.min(tMinX,tMaxX),Math.min(tMinY,tMaxY)),tExit=Math.min(Math.max(tMinX,tMaxX),Math.max(tMinY,tMaxY));if(tEnter<=tExit&&tExit>=0&&tEnter<=1){let t54=Math.max(0,Math.min(1,tEnter));return{x:p12.x+t54*dx3,y:p12.y+t54*dy3}}let closestToP1={x:Math.max(minX,Math.min(maxX,p12.x)),y:Math.max(minY,Math.min(maxY,p12.y))},closestToP2={x:Math.max(minX,Math.min(maxX,p22.x)),y:Math.max(minY,Math.min(maxY,p22.y))},distToP1Squared=(closestToP1.x-p12.x)**2+(closestToP1.y-p12.y)**2,distToP2Squared=(closestToP2.x-p22.x)**2+(closestToP2.y-p22.y)**2,edges=[{start:{x:minX,y:minY},end:{x:maxX,y:minY}},{start:{x:maxX,y:minY},end:{x:maxX,y:maxY}},{start:{x:maxX,y:maxY},end:{x:minX,y:maxY}},{start:{x:minX,y:maxY},end:{x:minX,y:minY}}],minDistance=Math.min(distToP1Squared,distToP2Squared),closestPoint=distToP1Squared<=distToP2Squared?closestToP1:closestToP2,clamp22=(value,min,max2)=>Math.max(min,Math.min(max2,value));for(let edge of edges){let va3={x:p22.x-p12.x,y:p22.y-p12.y},vb2={x:edge.end.x-edge.start.x,y:edge.end.y-edge.start.y},w4={x:p12.x-edge.start.x,y:p12.y-edge.start.y},dotAA=va3.x*va3.x+va3.y*va3.y,dotAB=va3.x*vb2.x+va3.y*vb2.y,dotAW=va3.x*w4.x+va3.y*w4.y,dotBB=vb2.x*vb2.x+vb2.y*vb2.y,dotBW=vb2.x*w4.x+vb2.y*w4.y,denominator=dotAA*dotBB-dotAB*dotAB;if(Math.abs(denominator)<1e-10)continue;let tA2=(dotAB*dotBW-dotBB*dotAW)/denominator,tB=(dotAA*dotBW-dotAB*dotAW)/denominator;tA2=clamp22(tA2,0,1),tB=clamp22(tB,0,1);let closestOnSegment={x:p12.x+tA2*va3.x,y:p12.y+tA2*va3.y},closestOnEdge={x:edge.start.x+tB*vb2.x,y:edge.start.y+tB*vb2.y},dx22=closestOnSegment.x-closestOnEdge.x,dy22=closestOnSegment.y-closestOnEdge.y,distSquared=dx22*dx22+dy22*dy22;distSquared<minDistance&&(minDistance=distSquared,closestPoint={x:(closestOnSegment.x+closestOnEdge.x)/2,y:(closestOnSegment.y+closestOnEdge.y)/2})}return closestPoint},getClosestPointBetweenSegments=(segmentA,segmentB)=>{let a12={x:segmentA.x1,y:segmentA.y1},a22={x:segmentA.x2,y:segmentA.y2},b12={x:segmentB.x1,y:segmentB.y1},b22={x:segmentB.x2,y:segmentB.y2},va3={x:a22.x-a12.x,y:a22.y-a12.y},vb2={x:b22.x-b12.x,y:b22.y-b12.y},lenSqrA=va3.x*va3.x+va3.y*va3.y,lenSqrB=vb2.x*vb2.x+vb2.y*vb2.y;if(lenSqrA===0||lenSqrB===0){if(lenSqrA===0&&lenSqrB===0)return{x:(a12.x+b12.x)/2,y:(a12.y+b12.y)/2};if(lenSqrA===0){let t210=clamp4(((a12.x-b12.x)*vb2.x+(a12.y-b12.y)*vb2.y)/lenSqrB,0,1),closestOnB2={x:b12.x+t210*vb2.x,y:b12.y+t210*vb2.y};return{x:(a12.x+closestOnB2.x)/2,y:(a12.y+closestOnB2.y)/2}}let t54=clamp4(((b12.x-a12.x)*va3.x+(b12.y-a12.y)*va3.y)/lenSqrA,0,1),closestOnA2={x:a12.x+t54*va3.x,y:a12.y+t54*va3.y};return{x:(closestOnA2.x+b12.x)/2,y:(closestOnA2.y+b12.y)/2}}let w4={x:a12.x-b12.x,y:a12.y-b12.y},dotAA=va3.x*va3.x+va3.y*va3.y,dotAB=va3.x*vb2.x+va3.y*vb2.y,dotAW=va3.x*w4.x+va3.y*w4.y,dotBB=vb2.x*vb2.x+vb2.y*vb2.y,dotBW=vb2.x*w4.x+vb2.y*w4.y,denominator=dotAA*dotBB-dotAB*dotAB;if(denominator<1e-10)return closestPointsParallelSegments(a12,a22,b12,b22,va3,vb2,lenSqrA,lenSqrB);let tA2=(dotAB*dotBW-dotBB*dotAW)/denominator,tB=(dotAA*dotBW-dotAB*dotAW)/denominator;tA2=clamp4(tA2,0,1),tB=clamp4(tB,0,1),tB=(tA2*dotAB+dotBW)/dotBB,tB=clamp4(tB,0,1),tA2=(tB*dotAB-dotAW)/dotAA,tA2=clamp4(tA2,0,1);let closestOnA={x:a12.x+tA2*va3.x,y:a12.y+tA2*va3.y},closestOnB={x:b12.x+tB*vb2.x,y:b12.y+tB*vb2.y},dx3=closestOnA.x-closestOnB.x,dy3=closestOnA.y-closestOnB.y,distance32=Math.sqrt(dx3*dx3+dy3*dy3);return{x:(closestOnA.x+closestOnB.x)/2,y:(closestOnA.y+closestOnB.y)/2}},closestPointsParallelSegments=(a12,a22,b12,b22,va3,vb2,lenSqrA,lenSqrB)=>{let tA2=((b12.x-a12.x)*va3.x+(b12.y-a12.y)*va3.y)/lenSqrA;tA2=clamp4(tA2,0,1);let pointOnA1={x:a12.x+tA2*va3.x,y:a12.y+tA2*va3.y},tA22=((b22.x-a12.x)*va3.x+(b22.y-a12.y)*va3.y)/lenSqrA;tA22=clamp4(tA22,0,1);let pointOnA2={x:a12.x+tA22*va3.x,y:a12.y+tA22*va3.y},tB=((a12.x-b12.x)*vb2.x+(a12.y-b12.y)*vb2.y)/lenSqrB;tB=clamp4(tB,0,1);let pointOnB1={x:b12.x+tB*vb2.x,y:b12.y+tB*vb2.y},tB2=((a22.x-b12.x)*vb2.x+(a22.y-b12.y)*vb2.y)/lenSqrB;tB2=clamp4(tB2,0,1);let pointOnB2={x:b12.x+tB2*vb2.x,y:b12.y+tB2*vb2.y},closestPair=[{pointA:pointOnA1,pointB:b12,distance:Math.sqrt((pointOnA1.x-b12.x)**2+(pointOnA1.y-b12.y)**2)},{pointA:pointOnA2,pointB:b22,distance:Math.sqrt((pointOnA2.x-b22.x)**2+(pointOnA2.y-b22.y)**2)},{pointA:a12,pointB:pointOnB1,distance:Math.sqrt((a12.x-pointOnB1.x)**2+(a12.y-pointOnB1.y)**2)},{pointA:a22,pointB:pointOnB2,distance:Math.sqrt((a22.x-pointOnB2.x)**2+(a22.y-pointOnB2.y)**2)}].reduce((closest,current3)=>current3.distance<closest.distance?current3:closest);return{x:(closestPair.pointA.x+closestPair.pointB.x)/2,y:(closestPair.pointA.y+closestPair.pointB.y)/2}},clamp4=(value,min,max2)=>Math.max(min,Math.min(max2,value)),getCollidableBounds=collidable=>{if(collidable.type==="pcb_trace_segment")return{minX:Math.min(collidable.x1,collidable.x2),minY:Math.min(collidable.y1,collidable.y2),maxX:Math.max(collidable.x1,collidable.x2),maxY:Math.max(collidable.y1,collidable.y2)};if(collidable.type==="pcb_smtpad"||collidable.type==="pcb_plated_hole"){if(collidable.type==="pcb_smtpad"&&(collidable.shape==="rotated_rect"||collidable.shape==="polygon")||collidable.type==="pcb_plated_hole"&&"rect_pad_width"in collidable&&"rect_pad_height"in collidable){let polygonPoints=getPolygonPointsForPad(collidable);return{minX:Math.min(...polygonPoints.map(point6=>point6.x)),minY:Math.min(...polygonPoints.map(point6=>point6.y)),maxX:Math.max(...polygonPoints.map(point6=>point6.x)),maxY:Math.max(...polygonPoints.map(point6=>point6.y))}}if(collidable.type==="pcb_smtpad"&&collidable.shape==="rotated_pill"){let pill=getPillCenterLineForPad(collidable);return{minX:Math.min(pill.start.x,pill.end.x)-pill.radius,minY:Math.min(pill.start.y,pill.end.y)-pill.radius,maxX:Math.max(pill.start.x,pill.end.x)+pill.radius,maxY:Math.max(pill.start.y,pill.end.y)+pill.radius}}}return getBoundsOfPcbElements([collidable])};function getPcbPortIdsConnectedToRoutePoint(routePoint){return routePoint.route_type!=="wire"?[]:[routePoint.start_pcb_port_id,routePoint.end_pcb_port_id].filter(portId=>!!portId)}function getPcbPortIdsConnectedToTrace(trace){let connectedPcbPorts=new Set;for(let segment2 of trace.route)for(let portId of getPcbPortIdsConnectedToRoutePoint(segment2))connectedPcbPorts.add(portId);return Array.from(connectedPcbPorts)}function getPcbPortIdsConnectedToTraces(traces){let connectedPorts=new Set;for(let trace of traces)for(let portId of getPcbPortIdsConnectedToTrace(trace))connectedPorts.add(portId);return Array.from(connectedPorts)}var getRadiusOfCircuitJsonElement=obj=>{if(obj.type==="pcb_via"||obj.type==="pcb_plated_hole"&&obj.shape==="circle")return obj.outer_diameter/2;if(obj.type==="pcb_hole"&&obj.hole_shape==="circle")return obj.hole_diameter/2;if(obj.type==="pcb_smtpad"&&obj.shape==="circle")return obj.radius;throw new Error(`Could not determine radius of element: ${JSON.stringify(obj)}`)};function checkEachPcbTraceNonOverlapping(circuitJson,{connMap,minClearance}={}){let errors=[];addStartAndEndPortIdsIfMissing(circuitJson),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_trace_to_pad_edge_clearance")??DEFAULT_TRACE_MARGIN);let pcbTraceSegments=cju_default(circuitJson).pcb_trace.list().flatMap(pcbTrace=>{let segments=[];for(let i3=0;i3<pcbTrace.route.length-1;i3++){let p12=pcbTrace.route[i3],p22=pcbTrace.route[i3+1];p12.route_type==="wire"&&p22.route_type==="wire"&&p12.layer===p22.layer&&segments.push({type:"pcb_trace_segment",pcb_trace_id:pcbTrace.pcb_trace_id,_pcbTrace:pcbTrace,thickness:"width"in p12?p12.width:"width"in p22?p22.width:DEFAULT_TRACE_THICKNESS,layer:p12.layer,x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y})}return segments}),pcbSmtPads=cju_default(circuitJson).pcb_smtpad.list(),pcbPlatedHoles=cju_default(circuitJson).pcb_plated_hole.list(),pcbHoles=cju_default(circuitJson).pcb_hole.list(),pcbVias=cju_default(circuitJson).pcb_via.list(),pcbKeepouts=cju_default(circuitJson).pcb_keepout.list(),allObjects=[...pcbTraceSegments,...pcbSmtPads,...pcbPlatedHoles,...pcbHoles,...pcbVias,...pcbKeepouts],spatialIndex=new SpatialObjectIndex({objects:allObjects,getBounds:getCollidableBounds}),getReadableName=id3=>getReadableNameForElement(circuitJson,id3),constructErrorMessage=(traceName,otherName,gap)=>gap<0?`PCB trace ${traceName} overlaps with ${otherName} (accidental contact)`:`PCB trace ${traceName} is too close to ${otherName} (gap: ${gap.toFixed(3)}mm)`,errorIds=new Set;for(let segmentA of pcbTraceSegments){let requiredMargin=minClearance,bounds=getCollidableBounds(segmentA),nearbyObjects=spatialIndex.getObjectsInBounds(bounds,requiredMargin+segmentA.thickness/2);if(!(segmentA.x1===segmentA.x2&&segmentA.y1===segmentA.y2))for(let obj of nearbyObjects){if(!getLayersOfPcbElement(obj).includes(segmentA.layer))continue;if(obj.type==="pcb_trace_segment"){let segmentB=obj;if(segmentA.layer!==segmentB.layer||connMap.areIdsConnected(segmentA.pcb_trace_id,segmentB.pcb_trace_id))continue;let gap2=segmentToSegmentMinDistance({x:segmentA.x1,y:segmentA.y1},{x:segmentA.x2,y:segmentA.y2},{x:segmentB.x1,y:segmentB.y1},{x:segmentB.x2,y:segmentB.y2})-segmentA.thickness/2-segmentB.thickness/2;if(gap2>minClearance-EPSILON2)continue;let pcb_trace_error_id=`overlap_${segmentA.pcb_trace_id}_${segmentB.pcb_trace_id}`,pcb_trace_error_id_reverse=`overlap_${segmentB.pcb_trace_id}_${segmentA.pcb_trace_id}`;if(errorIds.has(pcb_trace_error_id)||errorIds.has(pcb_trace_error_id_reverse))continue;errorIds.add(pcb_trace_error_id),errors.push({type:"pcb_trace_error",error_type:"pcb_trace_error",message:constructErrorMessage(getReadableName(segmentA.pcb_trace_id),getReadableName(segmentB.pcb_trace_id),gap2),pcb_trace_id:segmentA.pcb_trace_id,source_trace_id:"",pcb_trace_error_id,pcb_component_ids:[],center:getClosestPointBetweenSegments(segmentA,segmentB),pcb_port_ids:getPcbPortIdsConnectedToTraces([segmentA._pcbTrace,segmentB._pcbTrace])});continue}let primaryObjId=getPrimaryId(obj);if(connMap.areIdsConnected(segmentA.pcb_trace_id,"pcb_trace_id"in obj?obj.pcb_trace_id:primaryObjId))continue;if(obj.type==="pcb_via"||obj.type==="pcb_plated_hole"&&obj.shape==="circle"||obj.type==="pcb_hole"||obj.type==="pcb_smtpad"&&obj.shape==="circle"){let radius=getRadiusOfCircuitJsonElement(obj),gap2=segmentToCircleMinDistance({x:segmentA.x1,y:segmentA.y1},{x:segmentA.x2,y:segmentA.y2},{x:obj.x,y:obj.y,radius})-segmentA.thickness/2;if(gap2>minClearance-EPSILON2)continue;let pcb_trace_error_id=`overlap_${segmentA.pcb_trace_id}_${primaryObjId}`;if(errorIds.has(pcb_trace_error_id))continue;errorIds.add(pcb_trace_error_id),errors.push({type:"pcb_trace_error",error_type:"pcb_trace_error",message:constructErrorMessage(getReadableName(segmentA.pcb_trace_id),`${obj.type} "${getReadableName(getPrimaryId(obj))}"`,gap2),pcb_trace_id:segmentA.pcb_trace_id,center:getClosestPointBetweenSegmentAndBounds(segmentA,getCollidableBounds(obj)),source_trace_id:"",pcb_trace_error_id,pcb_component_ids:["pcb_component_id"in obj?obj.pcb_component_id:void 0].filter(Boolean),pcb_port_ids:[...getPcbPortIdsConnectedToTraces([segmentA._pcbTrace]),"pcb_port_id"in obj?obj.pcb_port_id:void 0].filter(Boolean)})}if(obj.type==="pcb_smtpad"&&(obj.shape==="pill"||obj.shape==="rotated_pill")){let{distance:distance32,center:center2,radius}=getSegmentToPillClearance(segmentA,obj),gap2=distance32-segmentA.thickness/2-radius;if(gap2>minClearance-EPSILON2)continue;let pcb_trace_error_id=`overlap_${segmentA.pcb_trace_id}_${primaryObjId}`;if(errorIds.has(pcb_trace_error_id))continue;errorIds.add(pcb_trace_error_id),errors.push({type:"pcb_trace_error",error_type:"pcb_trace_error",message:constructErrorMessage(getReadableName(segmentA.pcb_trace_id),`${obj.type} "${getReadableName(getPrimaryId(obj))}"`,gap2),pcb_trace_id:segmentA.pcb_trace_id,center:center2,source_trace_id:"",pcb_trace_error_id,pcb_component_ids:["pcb_component_id"in obj?obj.pcb_component_id:void 0].filter(Boolean),pcb_port_ids:[...getPcbPortIdsConnectedToTraces([segmentA._pcbTrace]),"pcb_port_id"in obj?obj.pcb_port_id:void 0].filter(Boolean)});continue}if(obj.type==="pcb_smtpad"&&(obj.shape==="rotated_rect"||obj.shape==="polygon")||obj.type==="pcb_plated_hole"&&"rect_pad_width"in obj&&"rect_pad_height"in obj){let padOutline=getPolygonPointsForPad(obj),{distance:distance32,center:center2}=getSegmentToPolygonClearance(segmentA,padOutline),gap2=distance32-segmentA.thickness/2;if(gap2>minClearance-EPSILON2)continue;let pcb_trace_error_id=`overlap_${segmentA.pcb_trace_id}_${primaryObjId}`;if(errorIds.has(pcb_trace_error_id))continue;errorIds.add(pcb_trace_error_id),errors.push({type:"pcb_trace_error",error_type:"pcb_trace_error",message:constructErrorMessage(getReadableName(segmentA.pcb_trace_id),`${obj.type} "${getReadableName(getPrimaryId(obj))}"`,gap2),pcb_trace_id:segmentA.pcb_trace_id,center:center2,source_trace_id:"",pcb_trace_error_id,pcb_component_ids:["pcb_component_id"in obj?obj.pcb_component_id:void 0].filter(Boolean),pcb_port_ids:[...getPcbPortIdsConnectedToTraces([segmentA._pcbTrace]),"pcb_port_id"in obj?obj.pcb_port_id:void 0].filter(Boolean)});continue}let gap=segmentToBoundsMinDistance({x:segmentA.x1,y:segmentA.y1},{x:segmentA.x2,y:segmentA.y2},getCollidableBounds(obj))-segmentA.thickness/2;if(gap+EPSILON2<requiredMargin){let pcb_trace_error_id=`overlap_${segmentA.pcb_trace_id}_${primaryObjId}`;if(errorIds.has(pcb_trace_error_id))continue;errorIds.add(pcb_trace_error_id),errors.push({type:"pcb_trace_error",error_type:"pcb_trace_error",message:constructErrorMessage(getReadableName(segmentA.pcb_trace_id),`${obj.type} "${getReadableName(getPrimaryId(obj))}"`,gap),pcb_trace_id:segmentA.pcb_trace_id,source_trace_id:"",pcb_trace_error_id,pcb_component_ids:["pcb_component_id"in obj?obj.pcb_component_id:void 0].filter(Boolean),center:getClosestPointBetweenSegmentAndBounds(segmentA,getCollidableBounds(obj)),pcb_port_ids:[...getPcbPortIdsConnectedToTraces([segmentA._pcbTrace]),"pcb_port_id"in obj?obj.pcb_port_id:void 0].filter(Boolean)})}}}return errors}function checkViasOffBoard(circuitJson){let board=getPcbBoard(circuitJson);if(!board)return[];let vias=circuitJson.filter(el3=>el3.type==="pcb_via");if(vias.length===0)return[];if(board.width===void 0||board.height===void 0)return[];let boardEdgeClearance=getBoardDrcValue(board,"min_board_edge_clearance")??jlcMinTolerances.min_board_edge_clearance,boardMinX=board.center.x-board.width/2,boardMaxX=board.center.x+board.width/2,boardMinY=board.center.y-board.height/2,boardMaxY=board.center.y+board.height/2,errors=[];for(let via of vias){let viaRadius=via.outer_diameter/2,viaMinX=via.x-viaRadius,viaMaxX=via.x+viaRadius,viaMinY=via.y-viaRadius,viaMaxY=via.y+viaRadius;if(viaMinX<boardMinX+boardEdgeClearance||viaMaxX>boardMaxX-boardEdgeClearance||viaMinY<boardMinY+boardEdgeClearance||viaMaxY>boardMaxY-boardEdgeClearance){let viaName=getReadableNameForElement(circuitJson,via.pcb_via_id);errors.push({type:"pcb_placement_error",pcb_placement_error_id:`out_of_board_${via.pcb_via_id}`,message:`Via ${viaName} is outside or crossing the board boundary`,error_type:"pcb_placement_error"})}}return errors}function isPolygonCCW(poly){return poly.area()>=0}function rectanglePolygon({center:center2,size:size3,rotationDeg=0}){let cx3=center2.x,cy3=center2.y,hw2=size3.width/2,hh3=size3.height/2,corners=[new Point$3(cx3-hw2,cy3-hh3),new Point$3(cx3+hw2,cy3-hh3),new Point$3(cx3+hw2,cy3+hh3),new Point$3(cx3-hw2,cy3+hh3)],poly=new Polygon$1(corners);if(rotationDeg){let matrix2=rotateDEG(rotationDeg,cx3,cy3),rotatedCorners=corners.map(pt3=>{let p5=applyToPoint(matrix2,{x:pt3.x,y:pt3.y});return new Point$3(p5.x,p5.y)});poly=new Polygon$1(rotatedCorners)}return isPolygonCCW(poly)||poly.reverse(),poly}function boardToPolygon({board}){if(board.outline&&board.outline.length>0){let points=board.outline.map(p5=>new Point$3(p5.x,p5.y)),poly=new Polygon$1(points);return isPolygonCCW(poly)||poly.reverse(),poly}return board.center&&typeof board.width=="number"&&typeof board.height=="number"?rectanglePolygon({center:board.center,size:{width:board.width,height:board.height},rotationDeg:0}):null}function getComponentName({circuitJson,component}){if(component.source_component_id){let sourceComponent=circuitJson.find(el3=>el3.type==="source_component"&&el3.source_component_id===component.source_component_id);if(sourceComponent&&"name"in sourceComponent&&sourceComponent.name)return sourceComponent.name}return getReadableNameForComponent(circuitJson,component.pcb_component_id)}function computeOverlapDistance(compPoly,boardPoly,componentCenter,componentWidth,componentHeight,rotationDeg){let centerPoint=new Point$3(componentCenter.x,componentCenter.y);if(!boardPoly.contains(centerPoint)){let dist=boardPoly.distanceTo(centerPoint);return Array.isArray(dist)?dist[0]:Number(dist)||0}let hw2=componentWidth/2,hh3=componentHeight/2,corners=[{x:componentCenter.x-hw2,y:componentCenter.y-hh3},{x:componentCenter.x+hw2,y:componentCenter.y-hh3},{x:componentCenter.x+hw2,y:componentCenter.y+hh3},{x:componentCenter.x-hw2,y:componentCenter.y+hh3}],midpoints=[];for(let i3=0;i3<4;i3++){let next2=(i3+1)%4;midpoints.push({x:(corners[i3].x+corners[next2].x)/2,y:(corners[i3].y+corners[next2].y)/2})}let matrix2=rotateDEG(rotationDeg,componentCenter.x,componentCenter.y),rotatePoint22=pt3=>{let p5=applyToPoint(matrix2,pt3);return new Point$3(p5.x,p5.y)},rotatedPoints=corners.concat(midpoints).map(rotatePoint22),maxDistance=0;for(let pt3 of rotatedPoints)if(!boardPoly.contains(pt3)){let dist=boardPoly.distanceTo(pt3),d4=Array.isArray(dist)?dist[0]:Number(dist)||0;d4>maxDistance&&(maxDistance=d4)}if(maxDistance>0)return maxDistance;try{let intersection=BooleanOperations.intersect(compPoly,boardPoly),intersectionArea=0;intersection?Array.isArray(intersection)?intersectionArea=intersection.reduce((sum,p5)=>sum+(typeof p5.area=="function"?p5.area():0),0):typeof intersection.area=="function"?intersectionArea=intersection.area():intersectionArea=0:intersectionArea=0;let compArea=compPoly.area();if(intersectionArea>0&&intersectionArea<compArea){let overlapRatio=1-intersectionArea/compArea,compWidth=Math.abs(componentWidth),compHeight=Math.abs(componentHeight);return Math.min(compWidth,compHeight)*overlapRatio}else return .1}catch{return .1}}function getRepositionSuggestion({componentPoly,boardPoly}){let boardBox=boardPoly.box,componentBox=componentPoly.box,deltaX=0,deltaY=0;if(componentBox.xmin<boardBox.xmin?deltaX=boardBox.xmin-componentBox.xmin:componentBox.xmax>boardBox.xmax&&(deltaX=boardBox.xmax-componentBox.xmax),componentBox.ymin<boardBox.ymin?deltaY=boardBox.ymin-componentBox.ymin:componentBox.ymax>boardBox.ymax&&(deltaY=boardBox.ymax-componentBox.ymax),deltaX===0&&deltaY===0)return null;let xDir=deltaX>=0?"right":"left",yDir=deltaY>=0?"up":"down",absDx=Math.abs(Math.round(deltaX*100)/100),absDy=Math.abs(Math.round(deltaY*100)/100);return absDx>0&&absDy>0?`Try moving it ${absDx}mm ${xDir} and ${absDy}mm ${yDir} to fit within the board edge.`:absDx>0?`Try moving it ${absDx}mm ${xDir} to fit within the board edge.`:`Try moving it ${absDy}mm ${yDir} to fit within the board edge.`}function checkPcbComponentsOutOfBoard(circuitJson){let board=circuitJson.find(el3=>el3.type==="pcb_board");if(!board)return[];let boardPoly=boardToPolygon({board});if(!boardPoly)return[];let components=circuitJson.filter(el3=>el3.type==="pcb_component");if(components.length===0)return[];let errors=[];for(let c6 of components){if(c6.is_allowed_to_be_off_board||!c6.center||typeof c6.width!="number"||typeof c6.height!="number"||c6.width<=0||c6.height<=0)continue;let compPoly=rectanglePolygon({center:c6.center,size:{width:c6.width,height:c6.height},rotationDeg:0});if(compPoly.area()===0||boardPoly.contains(compPoly))continue;let overlapDistance=computeOverlapDistance(compPoly,boardPoly,c6.center,c6.width,c6.height,0),compName=getComponentName({circuitJson,component:c6}),overlapDistanceMm=Math.round(overlapDistance*100)/100,repositionSuggestion=getRepositionSuggestion({componentPoly:compPoly,boardPoly});errors.push({type:"pcb_component_outside_board_error",error_type:"pcb_component_outside_board_error",pcb_component_outside_board_error_id:`pcb_component_outside_board_${c6.pcb_component_id}`,message:`Component ${compName} extends outside board boundaries by ${overlapDistanceMm}mm.${repositionSuggestion?` ${repositionSuggestion}`:""}`,pcb_component_id:c6.pcb_component_id,pcb_board_id:board.pcb_board_id,component_center:c6.center,component_bounds:{min_x:compPoly.box.xmin,max_x:compPoly.box.xmax,min_y:compPoly.box.ymin,max_y:compPoly.box.ymax},subcircuit_id:c6.subcircuit_id,source_component_id:c6.source_component_id})}return errors}function distance22(a3,b4){return Math.hypot(a3.x-b4.x,a3.y-b4.y)}function viasAreAtSameLocation(a3,b4){return distance22(a3,b4)<=EPSILON2}function checkSameNetViaSpacing(circuitJson,{connMap,minClearance}={}){let vias=circuitJson.filter(el3=>el3.type==="pcb_via");if(vias.length<2)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_via_hole_edge_to_via_hole_edge_clearance")??jlcMinTolerances.min_via_hole_edge_to_via_hole_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let errors=[],reported=new Set;for(let i3=0;i3<vias.length;i3++)for(let j5=i3+1;j5<vias.length;j5++){let viaA=vias[i3],viaB=vias[j5];if(viasAreAtSameLocation(viaA,viaB)||!connMap.areIdsConnected(viaA.pcb_via_id,viaB.pcb_via_id))continue;let gap=distance22(viaA,viaB)-viaA.hole_diameter/2-viaB.hole_diameter/2;if(gap+EPSILON2>=minClearance)continue;let pairId=[viaA.pcb_via_id,viaB.pcb_via_id].sort().join("_");reported.has(pairId)||(reported.add(pairId),errors.push({type:"pcb_via_clearance_error",pcb_error_id:`same_net_vias_close_${pairId}`,message:`Vias ${getReadableNameForElement(circuitJson,viaA.pcb_via_id)} and ${getReadableNameForElement(circuitJson,viaB.pcb_via_id)} are too close together (gap: ${gap.toFixed(3)}mm)`,error_type:"pcb_via_clearance_error",pcb_via_ids:[viaA.pcb_via_id,viaB.pcb_via_id],minimum_clearance:minClearance,actual_clearance:gap,pcb_center:{x:(viaA.x+viaB.x)/2,y:(viaA.y+viaB.y)/2}}))}return errors}function checkDifferentNetViaSpacing(circuitJson,{connMap,minClearance}={}){let vias=circuitJson.filter(el3=>el3.type==="pcb_via");if(vias.length<2)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_via_hole_edge_to_via_hole_edge_clearance")??jlcMinTolerances.min_via_hole_edge_to_via_hole_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let errors=[],reported=new Set;for(let i3=0;i3<vias.length;i3++)for(let j5=i3+1;j5<vias.length;j5++){let viaA=vias[i3],viaB=vias[j5];if(viasAreAtSameLocation(viaA,viaB)||connMap.areIdsConnected(viaA.pcb_via_id,viaB.pcb_via_id))continue;let gap=distance22(viaA,viaB)-viaA.hole_diameter/2-viaB.hole_diameter/2;if(gap+EPSILON2>=minClearance)continue;let pairId=[viaA.pcb_via_id,viaB.pcb_via_id].sort().join("_");reported.has(pairId)||(reported.add(pairId),errors.push({type:"pcb_via_clearance_error",pcb_error_id:`different_net_vias_close_${pairId}`,message:`Vias ${getReadableNameForElement(circuitJson,viaA.pcb_via_id)} and ${getReadableNameForElement(circuitJson,viaB.pcb_via_id)} from different nets are too close together (gap: ${gap.toFixed(3)}mm)`,error_type:"pcb_via_clearance_error",pcb_via_ids:[viaA.pcb_via_id,viaB.pcb_via_id],minimum_clearance:minClearance,actual_clearance:gap,pcb_center:{x:(viaA.x+viaB.x)/2,y:(viaA.y+viaB.y)/2}}))}return errors}function checkSourceTracesHavePcbTraces(circuitJson){let errors=[],sourceTraces=circuitJson.filter(el3=>el3.type==="source_trace"),pcbTraces=circuitJson.filter(el3=>el3.type==="pcb_trace"),pcbPorts=circuitJson.filter(el3=>el3.type==="pcb_port"),sourcePortToPcbPort=new Map(pcbPorts.map(pcbPort=>[pcbPort.source_port_id,pcbPort])),connectivityMap=getFullConnectivityMapFromCircuitJson(circuitJson);for(let sourceTrace of sourceTraces){if(!sourceTrace.connected_source_port_ids?.length||(sourceTrace.connected_source_net_ids?.length??0)>0||sourceTrace.connected_source_port_ids.length<2)continue;if(!pcbTraces.some(pcbTrace=>connectivityMap.areIdsConnected(sourceTrace.source_trace_id,pcbTrace.pcb_trace_id))){let connectedPcbPorts=sourceTrace.connected_source_port_ids.map(sourcePortId=>sourcePortToPcbPort.get(sourcePortId)).filter(pcbPort=>pcbPort!==void 0),connectedPcbComponentIds=Array.from(new Set(connectedPcbPorts.map(port=>port.pcb_component_id).filter(id3=>id3!==void 0)));errors.push({type:"pcb_trace_missing_error",pcb_trace_missing_error_id:`pcb_trace_missing_${sourceTrace.source_trace_id}`,error_type:"pcb_trace_missing_error",message:`Trace [${sourceTrace.display_name&&!containsCircuitJsonId(sourceTrace.display_name)?sourceTrace.display_name:"trace"}] is not connected (it has no PCB trace)`,source_trace_id:sourceTrace.source_trace_id,pcb_component_ids:connectedPcbComponentIds,pcb_port_ids:connectedPcbPorts.map(port=>port.pcb_port_id)})}}return errors}function getBoardPolygonPoints(board){if(board.outline&&board.outline.length>0)return board.outline.map(p5=>({x:p5.x,y:p5.y}));if(board.center&&typeof board.width=="number"&&typeof board.height=="number"){let cx3=board.center.x,cy3=board.center.y,hw2=board.width/2,hh3=board.height/2;return[{x:cx3-hw2,y:cy3-hh3},{x:cx3+hw2,y:cy3-hh3},{x:cx3+hw2,y:cy3+hh3},{x:cx3-hw2,y:cy3+hh3}]}return null}function checkPcbTracesOutOfBoard(circuitJson,config={}){let errors=[],board=getPcbBoard(circuitJson);if(!board)return errors;let margin=config.margin??getBoardDrcValue(board,"min_board_edge_clearance")??jlcMinTolerances.min_board_edge_clearance,boardPoints=getBoardPolygonPoints(board);if(!boardPoints)return errors;let pcbTraces=cju_default(circuitJson).pcb_trace.list();for(let trace of pcbTraces)if(!(trace.route.length<2))for(let i3=0;i3<trace.route.length-1;i3++){let p12=trace.route[i3],p22=trace.route[i3+1];if(p12.route_type!=="wire"||p22.route_type!=="wire")continue;let traceWidth="width"in p12?p12.width:"width"in p22?p22.width:.1,segmentStart={x:p12.x,y:p12.y},segmentEnd={x:p22.x,y:p22.y},minDistance=Number.POSITIVE_INFINITY;for(let j5=0;j5<boardPoints.length;j5++){let edgeStart=boardPoints[j5],edgeEnd=boardPoints[(j5+1)%boardPoints.length],distance32=segmentToSegmentMinDistance(segmentStart,segmentEnd,edgeStart,edgeEnd);distance32<minDistance&&(minDistance=distance32)}let minimumDistance=traceWidth/2+margin;if(minDistance<minimumDistance){let error2={type:"pcb_trace_error",error_type:"pcb_trace_error",pcb_trace_error_id:`trace_too_close_to_board_${trace.pcb_trace_id}_segment_${i3}`,message:`Trace too close to board edge (${minDistance.toFixed(3)}mm < ${minimumDistance.toFixed(3)}mm required, margin: ${margin}mm)`,pcb_trace_id:trace.pcb_trace_id,source_trace_id:trace.source_trace_id||"",center:{x:(segmentStart.x+segmentEnd.x)/2,y:(segmentStart.y+segmentEnd.y)/2},pcb_component_ids:[],pcb_port_ids:[]};errors.push(error2)}}return errors}function getElementLayers(elem){return elem.type==="pcb_courtyard_circle"||elem.type==="pcb_courtyard_outline"||elem.type==="pcb_courtyard_polygon"||elem.type==="pcb_courtyard_rect"?[elem.layer]:getLayersOfPcbElement(elem)}function doLayersOverlap(layers1,layers2){return layers1.length===0||layers2.length===0?!0:layers1.some(l7=>layers2.includes(l7))}function doPcbElementsOverlap(elem1,elem2){let layers1=getElementLayers(elem1),layers2=getElementLayers(elem2);if(!doLayersOverlap(layers1,layers2))return!1;let bounds1=getBoundsOfPcbElements([elem1]),bounds2=getBoundsOfPcbElements([elem2]);return doBoundsOverlap(bounds1,bounds2)}var isCourtyardElement=element=>element.type==="pcb_courtyard_circle"||element.type==="pcb_courtyard_outline"||element.type==="pcb_courtyard_polygon"||element.type==="pcb_courtyard_rect",formatOverlapElementDescription=(circuitJson,element)=>{if("pcb_port_id"in element&&element.pcb_port_id)return getReadableNameForPort(circuitJson,element.pcb_port_id);let id3=getPrimaryId(element),readableName=getReadableNameForElementId(circuitJson,id3);return readableName==="element"?`[${id3}]`:readableName};function checkPcbComponentOverlap(circuitJson){let errors=[],connMap=getFullConnectivityMapFromCircuitJson(circuitJson),smtPads=cju_default(circuitJson).pcb_smtpad.list(),platedHoles=cju_default(circuitJson).pcb_plated_hole.list(),holes=cju_default(circuitJson).pcb_hole.list(),courtyards=circuitJson.filter(isCourtyardElement),componentMap=new Map;for(let pad2 of smtPads){let componentId=pad2.pcb_component_id||`standalone_pad_${getPrimaryId(pad2)}`;componentMap.has(componentId)||componentMap.set(componentId,{component_id:componentId,elements:[]}),componentMap.get(componentId).elements.push(pad2)}for(let hole of platedHoles){let componentId=hole.pcb_component_id||`standalone_plated_hole_${getPrimaryId(hole)}`;componentMap.has(componentId)||componentMap.set(componentId,{component_id:componentId,elements:[]}),componentMap.get(componentId).elements.push(hole)}for(let hole of holes){let componentId=hole.pcb_component_id||`standalone_hole_${getPrimaryId(hole)}`;componentMap.has(componentId)||componentMap.set(componentId,{component_id:componentId,elements:[hole]})}for(let courtyard of courtyards){let componentId=courtyard.pcb_component_id;componentMap.has(componentId)||componentMap.set(componentId,{component_id:componentId,elements:[]}),componentMap.get(componentId).elements.push(courtyard)}for(let[componentId,componentData]of componentMap)componentData.elements.length>0&&(componentData.bounds=getBoundsOfPcbElements(componentData.elements));let componentsWithElements=Array.from(componentMap.values());for(let i3=0;i3<componentsWithElements.length;i3++)for(let j5=i3+1;j5<componentsWithElements.length;j5++){let comp1=componentsWithElements[i3],comp2=componentsWithElements[j5];if(!(!comp1.bounds||!comp2.bounds)&&doBoundsOverlap(comp1.bounds,comp2.bounds))for(let elem1 of comp1.elements)for(let elem2 of comp2.elements){let id1=getPrimaryId(elem1),id22=getPrimaryId(elem2);if(!((isCourtyardElement(elem1)||isCourtyardElement(elem2))&&elem1.type!=="pcb_hole"&&elem2.type!=="pcb_hole")&&!(elem1.type==="pcb_smtpad"&&elem2.type==="pcb_smtpad"&&connMap.areIdsConnected(id1,id22))&&doPcbElementsOverlap(elem1,elem2)){let elem1Description=formatOverlapElementDescription(circuitJson,elem1),elem2Description=formatOverlapElementDescription(circuitJson,elem2),error2={type:"pcb_footprint_overlap_error",pcb_error_id:`pcb_footprint_overlap_${id1}_${id22}`,error_type:"pcb_footprint_overlap_error",message:`${elem1.type} ${elem1Description} overlaps with ${elem2.type} ${elem2Description}`};(elem1.type==="pcb_smtpad"||elem2.type==="pcb_smtpad")&&(error2.pcb_smtpad_ids=[],elem1.type==="pcb_smtpad"&&error2.pcb_smtpad_ids.push(id1),elem2.type==="pcb_smtpad"&&error2.pcb_smtpad_ids.push(id22)),(elem1.type==="pcb_plated_hole"||elem2.type==="pcb_plated_hole")&&(error2.pcb_plated_hole_ids=[],elem1.type==="pcb_plated_hole"&&error2.pcb_plated_hole_ids.push(id1),elem2.type==="pcb_plated_hole"&&error2.pcb_plated_hole_ids.push(id22)),(elem1.type==="pcb_hole"||elem2.type==="pcb_hole")&&(error2.pcb_hole_ids=[],elem1.type==="pcb_hole"&&error2.pcb_hole_ids.push(id1),elem2.type==="pcb_hole"&&error2.pcb_hole_ids.push(id22)),errors.push(error2)}}}return errors}var formatMm=value=>{let rounded=Math.round(value*1e3)/1e3;return`${Number(rounded.toFixed(3))}mm`},getPadBounds=pad2=>getBoundsOfPcbElements([pad2]),getPadCenter=pad2=>{let bounds=getPadBounds(pad2);return midpoint({x:bounds.minX,y:bounds.minY},{x:bounds.maxX,y:bounds.maxY})},getPadRadius=pad2=>{let bounds=getPadBounds(pad2);return Math.min(bounds.maxX-bounds.minX,bounds.maxY-bounds.minY)/2},isCircularPad=pad2=>pad2.shape==="circle",isPillPad=pad2=>pad2.type==="pcb_smtpad"&&(pad2.shape==="pill"||pad2.shape==="rotated_pill"),getCircleShape=pad2=>{let center2=getPadCenter(pad2);return{kind:"circle",x:center2.x,y:center2.y,radius:getPadRadius(pad2)}},getPolygonShape=pad2=>{if(pad2.type==="pcb_smtpad"&&(pad2.shape==="polygon"||pad2.shape==="rotated_rect"))return{kind:"polygon",points:getPolygonPointsForPad(pad2)};if(pad2.type==="pcb_plated_hole"&&"rect_pad_width"in pad2&&"rect_pad_height"in pad2)return{kind:"polygon",points:getPolygonPointsForPad(pad2)};let bounds=getPadBounds(pad2);return{kind:"polygon",points:[{x:bounds.minX,y:bounds.minY},{x:bounds.maxX,y:bounds.minY},{x:bounds.maxX,y:bounds.maxY},{x:bounds.minX,y:bounds.maxY}]}},getPadToPadGap=(padA,padB)=>{if(isPillPad(padA)&&isPillPad(padB)){let pillA=getPillCenterLineForPad(padA),pillB=getPillCenterLineForPad(padB);return segmentToSegmentMinDistance(pillA.start,pillA.end,pillB.start,pillB.end)-pillA.radius-pillB.radius}if(isPillPad(padA)&&isCircularPad(padB)){let pill=getPillCenterLineForPad(padA);return segmentToCircleMinDistance(pill.start,pill.end,getCircleShape(padB))-pill.radius}if(isCircularPad(padA)&&isPillPad(padB)){let pill=getPillCenterLineForPad(padB);return segmentToCircleMinDistance(pill.start,pill.end,getCircleShape(padA))-pill.radius}if(isPillPad(padA)){let pill=getPillCenterLineForPad(padA);return getSegmentToPolygonClearanceFromPoints(pill.start,pill.end,getPolygonShape(padB).points).distance-pill.radius}if(isPillPad(padB)){let pill=getPillCenterLineForPad(padB);return getSegmentToPolygonClearanceFromPoints(pill.start,pill.end,getPolygonShape(padA).points).distance-pill.radius}return isCircularPad(padA)&&isCircularPad(padB)?distanceBetweenCircleAndCircle(getCircleShape(padA),getCircleShape(padB)):isCircularPad(padA)?distanceBetweenCircleAndPolygon(getCircleShape(padA),getPolygonShape(padB)):isCircularPad(padB)?distanceBetweenCircleAndPolygon(getCircleShape(padB),getPolygonShape(padA)):distanceBetweenPolygonAndPolygon(getPolygonShape(padA),getPolygonShape(padB))},getPads=circuitJson=>[...cju_default(circuitJson).pcb_smtpad.list(),...cju_default(circuitJson).pcb_plated_hole.list()],getTraceSegments=circuitJson=>cju_default(circuitJson).pcb_trace.list().flatMap(pcbTrace=>{let segments=[];for(let i3=0;i3<pcbTrace.route.length-1;i3++){let p12=pcbTrace.route[i3],p22=pcbTrace.route[i3+1];p12.route_type==="wire"&&p22.route_type==="wire"&&p12.layer===p22.layer&&segments.push({type:"pcb_trace_segment",pcb_trace_id:pcbTrace.pcb_trace_id,_pcbTrace:pcbTrace,thickness:"width"in p12?p12.width:"width"in p22?p22.width:DEFAULT_TRACE_THICKNESS,layer:p12.layer,x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y})}return segments});function checkPadPadClearance(circuitJson,{connMap,minClearance}={}){let pads=getPads(circuitJson);if(pads.length<2)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_pad_edge_to_pad_edge_clearance")??jlcMinTolerances.min_pad_edge_to_pad_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let spatialIndex=new SpatialObjectIndex({objects:pads,getBounds:getPadBounds,getId:pad2=>getPrimaryId(pad2)}),errors=new Map;for(let padA of pads){let padAId=getPrimaryId(padA),nearbyPads=spatialIndex.getObjectsInBounds(getPadBounds(padA),minClearance);for(let padB of nearbyPads){let padBId=getPrimaryId(padB);if(padAId===padBId||!getLayersOfPcbElement(padA).some(layer=>getLayersOfPcbElement(padB).includes(layer))||connMap.areIdsConnected(padAId,padBId))continue;let pairId=[padAId,padBId].sort().join("_"),gap=getPadToPadGap(padA,padB);if(gap+EPSILON2>=minClearance)continue;let centerA=getPadCenter(padA),centerB=getPadCenter(padB),nextError={type:"pcb_pad_pad_clearance_error",pcb_pad_pad_clearance_error_id:`pad_pad_clearance_${pairId}`,error_type:"pcb_pad_pad_clearance_error",message:`Pads ${getReadableNameForElement(circuitJson,padAId)} and ${getReadableNameForElement(circuitJson,padBId)} are too close (clearance: ${formatMm(gap)}, minimum: ${formatMm(minClearance)})`,pcb_pad_ids:[padAId,padBId],minimum_clearance:minClearance,actual_clearance:gap,center:{x:(centerA.x+centerB.x)/2,y:(centerA.y+centerB.y)/2}};errors.has(pairId)||errors.set(pairId,nextError)}}return Array.from(errors.values())}function checkPadTraceClearance(circuitJson,{connMap,minClearance}={}){let pads=getPads(circuitJson),segments=getTraceSegments(circuitJson);if(pads.length===0||segments.length===0)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_trace_to_pad_edge_clearance")??jlcMinTolerances.min_trace_to_pad_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let spatialIndex=new SpatialObjectIndex({objects:pads,getBounds:getPadBounds,getId:pad2=>getPrimaryId(pad2)}),errors=new Map;for(let segment2 of segments){let nearbyPads=spatialIndex.getObjectsInBounds(getCollidableBounds(segment2),minClearance+segment2.thickness/2);for(let pad2 of nearbyPads){let padId=getPrimaryId(pad2);if(!getLayersOfPcbElement(pad2).includes(segment2.layer)||connMap.areIdsConnected(segment2.pcb_trace_id,padId))continue;let center2=getPadCenter(pad2),gap=pad2.type==="pcb_smtpad"&&(pad2.shape==="pill"||pad2.shape==="rotated_pill")?(()=>{let{distance:distance32,radius}=getSegmentToPillClearance(segment2,pad2);return distance32-segment2.thickness/2-radius})():isCircularPad(pad2)?segmentToCircleMinDistance({x:segment2.x1,y:segment2.y1},{x:segment2.x2,y:segment2.y2},{x:center2.x,y:center2.y,radius:getPadRadius(pad2)})-segment2.thickness/2:segmentToBoundsMinDistance({x:segment2.x1,y:segment2.y1},{x:segment2.x2,y:segment2.y2},getPadBounds(pad2))-segment2.thickness/2;if(gap+EPSILON2>=minClearance)continue;let pairId=`${padId}_${segment2.pcb_trace_id}`,nextError={type:"pcb_pad_trace_clearance_error",pcb_pad_trace_clearance_error_id:`pad_trace_clearance_${pairId}`,error_type:"pcb_pad_trace_clearance_error",message:`Pad ${getReadableNameForElement(circuitJson,padId)} and trace ${getReadableNameForElement(circuitJson,segment2.pcb_trace_id)} are too close (clearance: ${formatMm(gap)}, minimum: ${formatMm(minClearance)})`,pcb_pad_id:padId,pcb_trace_id:segment2.pcb_trace_id,minimum_clearance:minClearance,actual_clearance:gap,center:{x:(center2.x+(segment2.x1+segment2.x2)/2)/2,y:(center2.y+(segment2.y1+segment2.y2)/2)/2}},current3=errors.get(pairId);(!current3||gap<current3.gap)&&errors.set(pairId,{error:nextError,gap})}}return Array.from(errors.values()).map(({error:error2})=>error2)}var getClosestPointOnSegment=(point6,segmentStart,segmentEnd)=>{let dx3=segmentEnd.x-segmentStart.x,dy3=segmentEnd.y-segmentStart.y,lengthSquared=dx3*dx3+dy3*dy3;if(lengthSquared===0)return segmentStart;let t54=Math.max(0,Math.min(1,((point6.x-segmentStart.x)*dx3+(point6.y-segmentStart.y)*dy3)/lengthSquared));return{x:segmentStart.x+t54*dx3,y:segmentStart.y+t54*dy3}};function checkViaTraceClearance(circuitJson,{connMap,minClearance}={}){let vias=circuitJson.filter(el3=>el3.type==="pcb_via"),segments=getTraceSegments(circuitJson);if(vias.length===0||segments.length===0)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_trace_to_pad_edge_clearance")??jlcMinTolerances.min_trace_to_pad_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let errors=new Map;for(let via of vias){let viaRadius=via.outer_diameter/2;for(let segment2 of segments){if(!getLayersOfPcbElement(via).includes(segment2.layer)||connMap.areIdsConnected(segment2.pcb_trace_id,via.pcb_via_id))continue;let gap=segmentToCircleMinDistance({x:segment2.x1,y:segment2.y1},{x:segment2.x2,y:segment2.y2},{x:via.x,y:via.y,radius:viaRadius})-segment2.thickness/2;if(gap+EPSILON2>=minClearance)continue;let closestPoint=getClosestPointOnSegment({x:via.x,y:via.y},{x:segment2.x1,y:segment2.y1},{x:segment2.x2,y:segment2.y2}),pairId=`${via.pcb_via_id}_${segment2.pcb_trace_id}`,nextError={type:"pcb_via_trace_clearance_error",pcb_via_trace_clearance_error_id:`via_trace_clearance_${pairId}`,error_type:"pcb_via_trace_clearance_error",message:`Via ${getReadableNameForElement(circuitJson,via.pcb_via_id)} and trace ${getReadableNameForElement(circuitJson,segment2.pcb_trace_id)} are too close (clearance: ${formatMm(gap)}, minimum: ${formatMm(minClearance)})`,pcb_via_id:via.pcb_via_id,pcb_trace_id:segment2.pcb_trace_id,minimum_clearance:minClearance,actual_clearance:gap,center:{x:(via.x+closestPoint.x)/2,y:(via.y+closestPoint.y)/2}},current3=errors.get(pairId);(!current3||gap<current3.gap)&&errors.set(pairId,{error:nextError,gap})}}return Array.from(errors.values()).map(({error:error2})=>error2)}function checkPinMustBeConnected(circuitJson){let errors=[],sourceComponents=circuitJson.filter(el3=>"source_component_id"in el3&&(el3.type==="source_component"||el3.type.startsWith("source_simple_"))),sourcePorts=circuitJson.filter(el3=>el3.type==="source_port"),sourceTraces=circuitJson.filter(el3=>el3.type==="source_trace"),connectedPortIds=new Set;for(let trace of sourceTraces)for(let portId of trace.connected_source_port_ids??[])connectedPortIds.add(portId);let componentInternalConnections=new Map;for(let component of sourceComponents)"internally_connected_source_port_ids"in component&&component.internally_connected_source_port_ids&&componentInternalConnections.set(component.source_component_id,component.internally_connected_source_port_ids);for(let internalGroups of componentInternalConnections.values())for(let group of internalGroups)if(group.some(portId=>connectedPortIds.has(portId)))for(let portId of group)connectedPortIds.add(portId);for(let port of sourcePorts)if(port.must_be_connected===!0&&!connectedPortIds.has(port.source_port_id)){let componentName=sourceComponents.find(c6=>c6.source_component_id===port.source_component_id)?.name??"Unknown";errors.push({type:"source_pin_must_be_connected_error",source_pin_must_be_connected_error_id:`source_pin_must_be_connected_error_${port.source_port_id}`,error_type:"source_pin_must_be_connected_error",message:`Port ${port.name} on ${componentName} must be connected but is floating`,source_component_id:port.source_component_id??"",source_port_id:port.source_port_id,subcircuit_id:port.subcircuit_id})}return errors}var PIN_ATTRIBUTE_KEYS=["must_be_connected","provides_power","requires_power","provides_ground","requires_ground","provides_voltage","requires_voltage","do_not_connect","include_in_board_pinout","can_use_internal_pullup","is_using_internal_pullup","needs_external_pullup","can_use_internal_pulldown","is_using_internal_pulldown","needs_external_pulldown","can_use_open_drain","is_using_open_drain","can_use_push_pull","is_using_push_pull","should_have_decoupling_capacitor","recommended_decoupling_capacitor_capacitance","is_configured_for_i2c_sda","is_configured_for_i2c_scl","is_configured_for_spi_mosi","is_configured_for_spi_miso","is_configured_for_spi_sck","is_configured_for_spi_cs","is_configured_for_uart_tx","is_configured_for_uart_rx","supports_i2c_sda","supports_i2c_scl","supports_spi_mosi","supports_spi_miso","supports_spi_sck","supports_spi_cs","supports_uart_tx","supports_uart_rx"];function hasAnyPinAttribute(port){return PIN_ATTRIBUTE_KEYS.some(key=>port[key]!==void 0)}function checkAllPinsInComponentAreUnderspecified(circuitJson){let warnings=[],db3=cju_default(circuitJson),sourceComponents=db3.source_component.list(),sourcePorts=db3.source_port.list(),portsByComponent=new Map;for(let port of sourcePorts){if(!port.source_component_id)continue;let existing=portsByComponent.get(port.source_component_id)??[];existing.push(port),portsByComponent.set(port.source_component_id,existing)}for(let component of sourceComponents){if(component.ftype!=="simple_chip")continue;let componentPorts=portsByComponent.get(component.source_component_id)??[];componentPorts.length===0||componentPorts.some(port=>hasAnyPinAttribute(port))||warnings.push({type:"source_component_pins_underspecified_warning",source_component_pins_underspecified_warning_id:`source_component_pins_underspecified_warning_${component.source_component_id}`,warning_type:"source_component_pins_underspecified_warning",message:`All pins on ${component.name} are underspecified (no pinAttributes set)`,source_component_id:component.source_component_id,source_port_ids:componentPorts.map(port=>port.source_port_id),subcircuit_id:componentPorts[0]?.subcircuit_id})}return warnings}function checkNoPowerPinDefined(circuitJson){let warnings=[],db3=cju_default(circuitJson),sourceComponents=db3.source_component.list(),sourcePorts=db3.source_port.list(),portsByComponent=new Map;for(let port of sourcePorts){if(!port.source_component_id)continue;let existing=portsByComponent.get(port.source_component_id)??[];existing.push(port),portsByComponent.set(port.source_component_id,existing)}for(let component of sourceComponents){if(component.ftype!=="simple_chip")continue;let componentPorts=portsByComponent.get(component.source_component_id)??[];componentPorts.length===0||componentPorts.some(port=>port.requires_power===!0)||warnings.push({type:"source_no_power_pin_defined_warning",source_no_power_pin_defined_warning_id:`source_no_power_pin_defined_warning_${component.source_component_id}`,warning_type:"source_no_power_pin_defined_warning",message:`${component.name} has no pin with requires_power=true`,source_component_id:component.source_component_id,source_port_ids:componentPorts.map(port=>port.source_port_id),subcircuit_id:componentPorts[0]?.subcircuit_id})}return warnings}function checkNoGroundPinDefined(circuitJson){let warnings=[],db3=cju_default(circuitJson),sourceComponents=db3.source_component.list(),sourcePorts=db3.source_port.list(),portsByComponent=new Map;for(let port of sourcePorts){if(!port.source_component_id)continue;let existing=portsByComponent.get(port.source_component_id)??[];existing.push(port),portsByComponent.set(port.source_component_id,existing)}for(let component of sourceComponents){if(component.ftype!=="simple_chip")continue;let componentPorts=portsByComponent.get(component.source_component_id)??[];componentPorts.length===0||componentPorts.some(port=>port.requires_ground===!0)||warnings.push({type:"source_no_ground_pin_defined_warning",source_no_ground_pin_defined_warning_id:`source_no_ground_pin_defined_warning_${component.source_component_id}`,warning_type:"source_no_ground_pin_defined_warning",message:`${component.name} has no pin with requires_ground=true`,source_component_id:component.source_component_id,source_port_ids:componentPorts.map(port=>port.source_port_id),subcircuit_id:componentPorts[0]?.subcircuit_id})}return warnings}function getFacingDirectionFromInsertionDirection(component){switch(component.insertion_direction){case"from_left":return"x-";case"from_right":return"x+";case"from_front":return"y+";case"from_back":return"y-";case"from_above":return null;default:return null}}function getFacingDirection(component){if(component.insertion_direction)return getFacingDirectionFromInsertionDirection(component);if(!component.center||!component.cable_insertion_center)return null;let dx3=component.cable_insertion_center.x-component.center.x,dy3=component.cable_insertion_center.y-component.center.y;return Math.abs(dx3)<1e-6&&Math.abs(dy3)<1e-6?null:Math.abs(dx3)>=Math.abs(dy3)?dx3>=0?"x+":"x-":dy3>=0?"y+":"y-"}function getRecommendedFacingDirection(component,bounds){if(!component.center)return null;let distances=[{direction:"x-",distance:component.center.x-bounds.minX},{direction:"x+",distance:bounds.maxX-component.center.x},{direction:"y-",distance:component.center.y-bounds.minY},{direction:"y+",distance:bounds.maxY-component.center.y}];return distances.sort((a3,b4)=>a3.distance-b4.distance),distances[0]?.direction??null}function checkConnectorAccessibleOrientation(circuitJson){let board=circuitJson.find(el3=>el3.type==="pcb_board");if(!board)return[];let bounds=(()=>{try{return getBoardBounds(board)}catch{return null}})();if(!bounds)return[];let warnings=[],components=circuitJson.filter(el3=>el3.type==="pcb_component");for(let component of components){let facingDirection=getFacingDirection(component),recommendedFacingDirection=getRecommendedFacingDirection(component,bounds);if(!facingDirection||!recommendedFacingDirection||facingDirection===recommendedFacingDirection)continue;let componentName=getReadableNameForComponent(circuitJson,component.pcb_component_id);warnings.push({type:"pcb_connector_not_in_accessible_orientation_warning",warning_type:"pcb_connector_not_in_accessible_orientation_warning",pcb_connector_not_in_accessible_orientation_warning_id:`pcb_connector_not_in_accessible_orientation_warning_${component.pcb_component_id}`,message:`${componentName} is facing ${facingDirection} but should face ${recommendedFacingDirection} so the connector is accessible from the board edge`,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,pcb_board_id:board.pcb_board_id,facing_direction:facingDirection,recommended_facing_direction:recommendedFacingDirection,subcircuit_id:component.subcircuit_id})}return warnings}function getCourtyardPolygon(el3){if(el3.type==="pcb_courtyard_rect"){let hw2=el3.width/2,hh3=el3.height/2,corners=[{x:-hw2,y:-hh3},{x:+hw2,y:-hh3},{x:+hw2,y:+hh3},{x:-hw2,y:+hh3}],angle=(el3.ccw_rotation??0)*Math.PI/180,cos6=Math.cos(angle),sin6=Math.sin(angle);return corners.map(({x:x4,y:y3})=>({x:el3.center.x+x4*cos6-y3*sin6,y:el3.center.y+x4*sin6+y3*cos6}))}return el3.type==="pcb_courtyard_circle"?Array.from({length:32},(_3,i3)=>{let a3=2*Math.PI*i3/32;return{x:el3.center.x+el3.radius*Math.cos(a3),y:el3.center.y+el3.radius*Math.sin(a3)}}):el3.outline}function getComponentName2(circuitJson,pcbComponentId){let pcbComponent=circuitJson.find(el3=>el3.type==="pcb_component"&&el3.pcb_component_id===pcbComponentId);if(pcbComponent?.type!=="pcb_component")return pcbComponentId;let sourceComponent=circuitJson.find(el3=>el3.type==="source_component"&&el3.source_component_id===pcbComponent.source_component_id);return sourceComponent?.type==="source_component"&&sourceComponent.name?sourceComponent.name:pcbComponentId}function polygonsOverlap(polyA,polyB){if(polyA.some(p5=>isPointInsidePolygon(p5,polyB))||polyB.some(p5=>isPointInsidePolygon(p5,polyA)))return!0;for(let i3=0;i3<polyA.length;i3++){let a12=polyA[i3],a22=polyA[(i3+1)%polyA.length];for(let j5=0;j5<polyB.length;j5++){let b12=polyB[j5],b22=polyB[(j5+1)%polyB.length];if(doSegmentsIntersect(a12,a22,b12,b22))return!0}}return!1}function checkCourtyardOverlap(circuitJson){let courtyards=circuitJson.filter(el3=>el3.type==="pcb_courtyard_rect"||el3.type==="pcb_courtyard_circle"||el3.type==="pcb_courtyard_outline"),byComponent=new Map;for(let el3 of courtyards){let id3=el3.pcb_component_id;byComponent.has(id3)||byComponent.set(id3,[]),byComponent.get(id3).push(el3)}let componentIds=Array.from(byComponent.keys()),errors=[];for(let i3=0;i3<componentIds.length;i3++)for(let j5=i3+1;j5<componentIds.length;j5++){let idA=componentIds[i3],idB=componentIds[j5],overlapping=!1;outer:for(let a3 of byComponent.get(idA))for(let b4 of byComponent.get(idB)){if("layer"in a3&&"layer"in b4&&a3.layer!==b4.layer)continue;let polyA=getCourtyardPolygon(a3),polyB=getCourtyardPolygon(b4);if(polygonsOverlap(polyA,polyB)){overlapping=!0;break outer}}overlapping&&errors.push({type:"pcb_courtyard_overlap_error",pcb_error_id:`pcb_courtyard_overlap_${idA}_${idB}`,error_type:"pcb_courtyard_overlap_error",message:`Courtyard of ${getComponentName2(circuitJson,idA)} overlaps with courtyard of ${getComponentName2(circuitJson,idB)}`,pcb_component_ids:[idA,idB]})}return errors}function getRoutePointCenter(point6){return point6.route_type==="through_pad"?{x:(point6.start.x+point6.end.x)/2,y:(point6.start.y+point6.end.y)/2}:{x:point6.x,y:point6.y}}function routePointConnectsToAnotherExpectedPort(point6,expectedPorts,missingPcbPortId,padMap){return point6.route_type!=="wire"?!1:expectedPorts.some(expectedPort=>!expectedPort.pcb_port_id||expectedPort.pcb_port_id===missingPcbPortId?!1:padMap.get(expectedPort.pcb_port_id)?.some(pad2=>isPointInPad({x:point6.x,y:point6.y},pad2))??!1)}function getMissingConnectionErrorCenter({firstPoint,lastPoint,port,expectedPorts,padMap}){let errorLocation,firstWirePoint=firstPoint.route_type==="wire"?firstPoint:void 0,lastWirePoint=lastPoint.route_type==="wire"?lastPoint:void 0,firstWirePointReferencesPort=getPcbPortIdsConnectedToRoutePoint(firstPoint).includes(port.pcb_port_id),lastWirePointReferencesPort=getPcbPortIdsConnectedToRoutePoint(lastPoint).includes(port.pcb_port_id);firstWirePointReferencesPort&&firstWirePoint?errorLocation=firstWirePoint:lastWirePointReferencesPort&&lastWirePoint||routePointConnectsToAnotherExpectedPort(firstPoint,expectedPorts,port.pcb_port_id,padMap)&&lastWirePoint?errorLocation=lastWirePoint:routePointConnectsToAnotherExpectedPort(lastPoint,expectedPorts,port.pcb_port_id,padMap)&&firstWirePoint?errorLocation=firstWirePoint:firstWirePoint&&lastWirePoint?errorLocation=distance22(firstWirePoint,port)<=distance22(lastWirePoint,port)?firstWirePoint:lastWirePoint:firstWirePoint?errorLocation=firstWirePoint:lastWirePoint&&(errorLocation=lastWirePoint);let firstPointCenter=getRoutePointCenter(firstPoint),lastPointCenter=getRoutePointCenter(lastPoint);return errorLocation?{x:errorLocation.x,y:errorLocation.y}:{x:(firstPointCenter.x+lastPointCenter.x)/2,y:(firstPointCenter.y+lastPointCenter.y)/2}}function checkTracesAreContiguous(circuitJson){let errors=[],pcbPorts=circuitJson.filter(el3=>el3.type==="pcb_port"),pcbTraces=circuitJson.filter(el3=>el3.type==="pcb_trace"),sourceTraces=circuitJson.filter(el3=>el3.type==="source_trace"),pcbSmtPads=circuitJson.filter(el3=>el3.type==="pcb_smtpad"),pcbPlatedHoles=circuitJson.filter(el3=>el3.type==="pcb_plated_hole"),padMap=new Map,pcbConnectivityMap=new PcbConnectivityMap(circuitJson);for(let pad2 of pcbSmtPads)pad2.pcb_port_id&&padMap.set(pad2.pcb_port_id,[...padMap.get(pad2.pcb_port_id)??[],pad2]);for(let hole of pcbPlatedHoles)hole.pcb_port_id&&padMap.set(hole.pcb_port_id,[...padMap.get(hole.pcb_port_id)??[],hole]);for(let trace of pcbTraces){if(trace.route.length===0)continue;let firstPoint=trace.route[0],lastPoint=trace.route[trace.route.length-1],sourceTrace=sourceTraces.find(st3=>st3.source_trace_id===trace.source_trace_id),expectedPorts=sourceTrace?pcbPorts.filter(port=>sourceTrace.connected_source_port_ids?.includes(port.source_port_id)):[];for(let i3=1;i3<trace.route.length-1;i3++){let prevPoint=trace.route[i3-1],currentPoint=trace.route[i3],nextPoint=trace.route[i3+1];if(currentPoint.route_type==="via"){let prevIsWire=prevPoint.route_type==="wire",nextIsWire=nextPoint.route_type==="wire";if(prevIsWire&&nextIsWire){let prevAligned=Math.abs(prevPoint.x-currentPoint.x)<.01&&Math.abs(prevPoint.y-currentPoint.y)<.01,nextAligned=Math.abs(nextPoint.x-currentPoint.x)<.01&&Math.abs(nextPoint.y-currentPoint.y)<.01;if(!prevAligned||!nextAligned){let traceName2=getReadableNameForPcbTrace(circuitJson,trace.pcb_trace_id);errors.push({type:"pcb_trace_error",message:`Via in trace [${traceName2}] is misaligned at position {x: ${currentPoint.x}, y: ${currentPoint.y}}.`,source_trace_id:sourceTrace?.source_trace_id||trace.source_trace_id||`!${trace.pcb_trace_id}`,error_type:"pcb_trace_error",pcb_trace_id:trace.pcb_trace_id,pcb_trace_error_id:`misaligned_via_${trace.pcb_trace_id}_${i3}`,pcb_component_ids:[],pcb_port_ids:[]})}}}}let traceName=getReadableNameForPcbTrace(circuitJson,trace.pcb_trace_id);for(let port of expectedPorts){if(!port.pcb_port_id)continue;let pads=padMap.get(port.pcb_port_id);if(!pads?.length)continue;let isConnectedByRoutedSourceTrace=!1;for(let candidateTrace of pcbConnectivityMap.getAllTracesConnectedToTrace(trace.pcb_trace_id)){if(candidateTrace.pcb_trace_id===trace.pcb_trace_id||!candidateTrace.source_trace_id)continue;let candidateSourceTrace=sourceTraces.find(st3=>st3.source_trace_id===candidateTrace.source_trace_id);if(!(!sourceTrace||candidateTrace.source_trace_id!==sourceTrace.source_trace_id&&!candidateSourceTrace?.connected_source_port_ids.includes(port.source_port_id))&&getPcbPortIdsConnectedToTrace(candidateTrace).includes(port.pcb_port_id)){isConnectedByRoutedSourceTrace=!0;break}}if(isConnectedByRoutedSourceTrace)continue;let isFirstPointConnected=firstPoint.route_type==="wire"&&pads.some(pad2=>isPointInPad({x:firstPoint.x,y:firstPoint.y},pad2)),isLastPointConnected=lastPoint.route_type==="wire"&&pads.some(pad2=>isPointInPad({x:lastPoint.x,y:lastPoint.y},pad2));if(!isFirstPointConnected&&!isLastPointConnected){let portName=getReadableNameForPcbPort(circuitJson,port.pcb_port_id).replace("pcb_port",""),padType=pads[0].type.replace(/pcb_/,""),errorCenter=getMissingConnectionErrorCenter({firstPoint,lastPoint,port,expectedPorts,padMap});errors.push({type:"pcb_trace_error",message:`Trace [${traceName}] is missing a connection to ${padType}${portName}`,source_trace_id:sourceTrace?.source_trace_id||trace.source_trace_id||`!${trace.pcb_trace_id}`,error_type:"pcb_trace_error",pcb_trace_id:trace.pcb_trace_id,pcb_trace_error_id:`missing_connection_${trace.pcb_trace_id}_${port.pcb_port_id}`,center:errorCenter,pcb_component_ids:[],pcb_port_ids:[port.pcb_port_id]})}}if(expectedPorts.length===0){let firstConnectsToAnyPad=!1,lastConnectsToAnyPad=!1,endpointsAreSame=firstPoint.route_type==="wire"&&lastPoint.route_type==="wire"&&Math.abs(firstPoint.x-lastPoint.x)<.01&&Math.abs(firstPoint.y-lastPoint.y)<.01;for(let pads of padMap.values())firstPoint.route_type==="wire"&&pads.some(pad2=>isPointInPad({x:firstPoint.x,y:firstPoint.y},pad2))&&(firstConnectsToAnyPad=!0),lastPoint.route_type==="wire"&&pads.some(pad2=>isPointInPad({x:lastPoint.x,y:lastPoint.y},pad2))&&(lastConnectsToAnyPad=!0);!firstConnectsToAnyPad&&firstPoint.route_type==="wire"&&errors.push({type:"pcb_trace_error",message:`Trace [${traceName}] has disconnected endpoint at (${firstPoint.x.toFixed(2)}, ${firstPoint.y.toFixed(2)})`,source_trace_id:sourceTrace?.source_trace_id||trace.source_trace_id||`!${trace.pcb_trace_id}`,error_type:"pcb_trace_error",pcb_trace_id:trace.pcb_trace_id,pcb_trace_error_id:`disconnected_endpoint_${trace.pcb_trace_id}_start`,center:{x:firstPoint.x,y:firstPoint.y},pcb_component_ids:[],pcb_port_ids:[]}),!lastConnectsToAnyPad&&lastPoint.route_type==="wire"&&!(endpointsAreSame&&!firstConnectsToAnyPad)&&errors.push({type:"pcb_trace_error",message:`Trace [${traceName}] has disconnected endpoint at (${lastPoint.x.toFixed(2)}, ${lastPoint.y.toFixed(2)})`,source_trace_id:sourceTrace?.source_trace_id||trace.source_trace_id||`!${trace.pcb_trace_id}`,error_type:"pcb_trace_error",pcb_trace_id:trace.pcb_trace_id,pcb_trace_error_id:`disconnected_endpoint_${trace.pcb_trace_id}_end`,center:{x:lastPoint.x,y:lastPoint.y},pcb_component_ids:[],pcb_port_ids:[]})}}return errors}async function runAllPlacementChecks(circuitJson){return[...checkViasOffBoard(circuitJson),...checkPcbComponentsOutOfBoard(circuitJson),...checkPcbComponentOverlap(circuitJson),...checkPadPadClearance(circuitJson),...checkPadTraceClearance(circuitJson),...checkCourtyardOverlap(circuitJson),...checkConnectorAccessibleOrientation(circuitJson)]}async function runAllNetlistChecks(circuitJson){return[...checkPinMustBeConnected(circuitJson)]}async function runAllPinSpecificationChecks(circuitJson){return[...checkAllPinsInComponentAreUnderspecified(circuitJson),...checkNoPowerPinDefined(circuitJson),...checkNoGroundPinDefined(circuitJson)]}async function runAllRoutingChecks(circuitJson){return[...checkEachPcbPortConnectedToPcbTraces(circuitJson),...checkSourceTracesHavePcbTraces(circuitJson),...checkEachPcbTraceNonOverlapping(circuitJson),...checkViaTraceClearance(circuitJson),...checkSameNetViaSpacing(circuitJson),...checkDifferentNetViaSpacing(circuitJson),...checkTracesAreContiguous(circuitJson),...checkPcbTracesOutOfBoard(circuitJson)]}init_dist7();init_dist();init_dist7();init_dist2();var import_object_hash=__toESM(require_object_hash(),1),import_object_hash2=__toESM(require_object_hash(),1),import_object_hash3=__toESM(require_object_hash(),1);var t2=Object.create,e6=Object.defineProperty,n2=Object.getOwnPropertyDescriptor,o3=Object.getOwnPropertyNames,i2=Object.getPrototypeOf,s3=Object.prototype.hasOwnProperty,r4=(t54,e7)=>function(){return e7||(0,t54[o3(t54)[0]])((e7={exports:{}}).exports,e7),e7.exports},a2=(t54,n3)=>{for(var o6 in n3)e6(t54,o6,{get:n3[o6],enumerable:!0})},c4=(r6,a3,c6)=>(c6=r6!=null?t2(i2(r6)):{},((t54,i3,r7,a4)=>{if(i3&&typeof i3=="object"||typeof i3=="function")for(let c7 of o3(i3))s3.call(t54,c7)||c7===r7||e6(t54,c7,{get:()=>i3[c7],enumerable:!(a4=n2(i3,c7))||a4.enumerable});return t54})(!a3&&r6&&r6.__esModule?c6:e6(c6,"default",{value:r6,enumerable:!0}),r6)),l6=r4({"node_modules/is-buffer/index.js"(t54,e7){function n3(t55){return!!t55.constructor&&typeof t55.constructor.isBuffer=="function"&&t55.constructor.isBuffer(t55)}e7.exports=function(t55){return t55!=null&&(n3(t55)||(function(t56){return typeof t56.readFloatLE=="function"&&typeof t56.slice=="function"&&n3(t56.slice(0,0))})(t55)||!!t55._isBuffer)}}}),h2=r4({"node_modules/kind-of/index.js"(t54,e7){var n3=l6(),o6=Object.prototype.toString;e7.exports=function(t55){if(t55===void 0)return"undefined";if(t55===null)return"null";if(t55===!0||t55===!1||t55 instanceof Boolean)return"boolean";if(typeof t55=="string"||t55 instanceof String)return"string";if(typeof t55=="number"||t55 instanceof Number)return"number";if(typeof t55=="function"||t55 instanceof Function)return"function";if(Array.isArray!==void 0&&Array.isArray(t55))return"array";if(t55 instanceof RegExp)return"regexp";if(t55 instanceof Date)return"date";var e8=o6.call(t55);return e8==="[object RegExp]"?"regexp":e8==="[object Date]"?"date":e8==="[object Arguments]"?"arguments":e8==="[object Error]"?"error":n3(t55)?"buffer":e8==="[object Set]"?"set":e8==="[object WeakSet]"?"weakset":e8==="[object Map]"?"map":e8==="[object WeakMap]"?"weakmap":e8==="[object Symbol]"?"symbol":e8==="[object Int8Array]"?"int8array":e8==="[object Uint8Array]"?"uint8array":e8==="[object Uint8ClampedArray]"?"uint8clampedarray":e8==="[object Int16Array]"?"int16array":e8==="[object Uint16Array]"?"uint16array":e8==="[object Int32Array]"?"int32array":e8==="[object Uint32Array]"?"uint32array":e8==="[object Float32Array]"?"float32array":e8==="[object Float64Array]"?"float64array":"object"}}}),d3=r4({"node_modules/rename-keys/index.js"(t54,e7){(function(){function t55(t56,e8){if(typeof e8!="function")return t56;var n3={};for(var o6 in t56)Object.prototype.hasOwnProperty.call(t56,o6)&&(n3[e8(o6,t56[o6])||o6]=t56[o6]);return n3}e7!==void 0&&e7.exports?e7.exports=t55:typeof define=="function"&&define.amd?define([],function(){return t55}):window.rename=t55})()}}),u4=r4({"node_modules/deep-rename-keys/index.js"(t54,e7){var n3=h2(),o6=d3();e7.exports=function t55(e8,i3){var s6=n3(e8);if(s6!=="object"&&s6!=="array")throw new Error("expected an object");var r6=[];for(var a3 in s6==="object"&&(e8=o6(e8,i3),r6={}),e8)if(e8.hasOwnProperty(a3)){var c6=e8[a3];n3(c6)==="object"||n3(c6)==="array"?r6[a3]=t55(c6,i3):r6[a3]=c6}return r6}}}),p3=r4({"node_modules/xml-reader/node_modules/eventemitter3/index.js"(t54,e7){var n3=Object.prototype.hasOwnProperty,o6="~";function i3(){}function s6(t55,e8,n4){this.fn=t55,this.context=e8,this.once=n4||!1}function r6(){this._events=new i3,this._eventsCount=0}Object.create&&(i3.prototype=Object.create(null),new i3().__proto__||(o6=!1)),r6.prototype.eventNames=function(){var t55,e8,i6=[];if(this._eventsCount===0)return i6;for(e8 in t55=this._events)n3.call(t55,e8)&&i6.push(o6?e8.slice(1):e8);return Object.getOwnPropertySymbols?i6.concat(Object.getOwnPropertySymbols(t55)):i6},r6.prototype.listeners=function(t55,e8){var n4=o6?o6+t55:t55,i6=this._events[n4];if(e8)return!!i6;if(!i6)return[];if(i6.fn)return[i6.fn];for(var s7=0,r7=i6.length,a3=new Array(r7);s7<r7;s7++)a3[s7]=i6[s7].fn;return a3},r6.prototype.emit=function(t55,e8,n4,i6,s7,r7){var a3=o6?o6+t55:t55;if(!this._events[a3])return!1;var c6,l7,h3=this._events[a3],d4=arguments.length;if(h3.fn){switch(h3.once&&this.removeListener(t55,h3.fn,void 0,!0),d4){case 1:return h3.fn.call(h3.context),!0;case 2:return h3.fn.call(h3.context,e8),!0;case 3:return h3.fn.call(h3.context,e8,n4),!0;case 4:return h3.fn.call(h3.context,e8,n4,i6),!0;case 5:return h3.fn.call(h3.context,e8,n4,i6,s7),!0;case 6:return h3.fn.call(h3.context,e8,n4,i6,s7,r7),!0}for(l7=1,c6=new Array(d4-1);l7<d4;l7++)c6[l7-1]=arguments[l7];h3.fn.apply(h3.context,c6)}else{var u6,p5=h3.length;for(l7=0;l7<p5;l7++)switch(h3[l7].once&&this.removeListener(t55,h3[l7].fn,void 0,!0),d4){case 1:h3[l7].fn.call(h3[l7].context);break;case 2:h3[l7].fn.call(h3[l7].context,e8);break;case 3:h3[l7].fn.call(h3[l7].context,e8,n4);break;case 4:h3[l7].fn.call(h3[l7].context,e8,n4,i6);break;default:if(!c6)for(u6=1,c6=new Array(d4-1);u6<d4;u6++)c6[u6-1]=arguments[u6];h3[l7].fn.apply(h3[l7].context,c6)}}return!0},r6.prototype.on=function(t55,e8,n4){var i6=new s6(e8,n4||this),r7=o6?o6+t55:t55;return this._events[r7]?this._events[r7].fn?this._events[r7]=[this._events[r7],i6]:this._events[r7].push(i6):(this._events[r7]=i6,this._eventsCount++),this},r6.prototype.once=function(t55,e8,n4){var i6=new s6(e8,n4||this,!0),r7=o6?o6+t55:t55;return this._events[r7]?this._events[r7].fn?this._events[r7]=[this._events[r7],i6]:this._events[r7].push(i6):(this._events[r7]=i6,this._eventsCount++),this},r6.prototype.removeListener=function(t55,e8,n4,s7){var r7=o6?o6+t55:t55;if(!this._events[r7])return this;if(!e8)return--this._eventsCount===0?this._events=new i3:delete this._events[r7],this;var a3=this._events[r7];if(a3.fn)a3.fn!==e8||s7&&!a3.once||n4&&a3.context!==n4||(--this._eventsCount===0?this._events=new i3:delete this._events[r7]);else{for(var c6=0,l7=[],h3=a3.length;c6<h3;c6++)(a3[c6].fn!==e8||s7&&!a3[c6].once||n4&&a3[c6].context!==n4)&&l7.push(a3[c6]);l7.length?this._events[r7]=l7.length===1?l7[0]:l7:--this._eventsCount===0?this._events=new i3:delete this._events[r7]}return this},r6.prototype.removeAllListeners=function(t55){var e8;return t55?(e8=o6?o6+t55:t55,this._events[e8]&&(--this._eventsCount===0?this._events=new i3:delete this._events[e8])):(this._events=new i3,this._eventsCount=0),this},r6.prototype.off=r6.prototype.removeListener,r6.prototype.addListener=r6.prototype.on,r6.prototype.setMaxListeners=function(){return this},r6.prefixed=o6,r6.EventEmitter=r6,e7!==void 0&&(e7.exports=r6)}}),m3=r4({"node_modules/xml-lexer/node_modules/eventemitter3/index.js"(t54,e7){var n3=Object.prototype.hasOwnProperty,o6="~";function i3(){}function s6(t55,e8,n4){this.fn=t55,this.context=e8,this.once=n4||!1}function r6(){this._events=new i3,this._eventsCount=0}Object.create&&(i3.prototype=Object.create(null),new i3().__proto__||(o6=!1)),r6.prototype.eventNames=function(){var t55,e8,i6=[];if(this._eventsCount===0)return i6;for(e8 in t55=this._events)n3.call(t55,e8)&&i6.push(o6?e8.slice(1):e8);return Object.getOwnPropertySymbols?i6.concat(Object.getOwnPropertySymbols(t55)):i6},r6.prototype.listeners=function(t55,e8){var n4=o6?o6+t55:t55,i6=this._events[n4];if(e8)return!!i6;if(!i6)return[];if(i6.fn)return[i6.fn];for(var s7=0,r7=i6.length,a3=new Array(r7);s7<r7;s7++)a3[s7]=i6[s7].fn;return a3},r6.prototype.emit=function(t55,e8,n4,i6,s7,r7){var a3=o6?o6+t55:t55;if(!this._events[a3])return!1;var c6,l7,h3=this._events[a3],d4=arguments.length;if(h3.fn){switch(h3.once&&this.removeListener(t55,h3.fn,void 0,!0),d4){case 1:return h3.fn.call(h3.context),!0;case 2:return h3.fn.call(h3.context,e8),!0;case 3:return h3.fn.call(h3.context,e8,n4),!0;case 4:return h3.fn.call(h3.context,e8,n4,i6),!0;case 5:return h3.fn.call(h3.context,e8,n4,i6,s7),!0;case 6:return h3.fn.call(h3.context,e8,n4,i6,s7,r7),!0}for(l7=1,c6=new Array(d4-1);l7<d4;l7++)c6[l7-1]=arguments[l7];h3.fn.apply(h3.context,c6)}else{var u6,p5=h3.length;for(l7=0;l7<p5;l7++)switch(h3[l7].once&&this.removeListener(t55,h3[l7].fn,void 0,!0),d4){case 1:h3[l7].fn.call(h3[l7].context);break;case 2:h3[l7].fn.call(h3[l7].context,e8);break;case 3:h3[l7].fn.call(h3[l7].context,e8,n4);break;case 4:h3[l7].fn.call(h3[l7].context,e8,n4,i6);break;default:if(!c6)for(u6=1,c6=new Array(d4-1);u6<d4;u6++)c6[u6-1]=arguments[u6];h3[l7].fn.apply(h3[l7].context,c6)}}return!0},r6.prototype.on=function(t55,e8,n4){var i6=new s6(e8,n4||this),r7=o6?o6+t55:t55;return this._events[r7]?this._events[r7].fn?this._events[r7]=[this._events[r7],i6]:this._events[r7].push(i6):(this._events[r7]=i6,this._eventsCount++),this},r6.prototype.once=function(t55,e8,n4){var i6=new s6(e8,n4||this,!0),r7=o6?o6+t55:t55;return this._events[r7]?this._events[r7].fn?this._events[r7]=[this._events[r7],i6]:this._events[r7].push(i6):(this._events[r7]=i6,this._eventsCount++),this},r6.prototype.removeListener=function(t55,e8,n4,s7){var r7=o6?o6+t55:t55;if(!this._events[r7])return this;if(!e8)return--this._eventsCount===0?this._events=new i3:delete this._events[r7],this;var a3=this._events[r7];if(a3.fn)a3.fn!==e8||s7&&!a3.once||n4&&a3.context!==n4||(--this._eventsCount===0?this._events=new i3:delete this._events[r7]);else{for(var c6=0,l7=[],h3=a3.length;c6<h3;c6++)(a3[c6].fn!==e8||s7&&!a3[c6].once||n4&&a3[c6].context!==n4)&&l7.push(a3[c6]);l7.length?this._events[r7]=l7.length===1?l7[0]:l7:--this._eventsCount===0?this._events=new i3:delete this._events[r7]}return this},r6.prototype.removeAllListeners=function(t55){var e8;return t55?(e8=o6?o6+t55:t55,this._events[e8]&&(--this._eventsCount===0?this._events=new i3:delete this._events[e8])):(this._events=new i3,this._eventsCount=0),this},r6.prototype.off=r6.prototype.removeListener,r6.prototype.addListener=r6.prototype.on,r6.prototype.setMaxListeners=function(){return this},r6.prefixed=o6,r6.EventEmitter=r6,e7!==void 0&&(e7.exports=r6)}}),g3=r4({"node_modules/xml-lexer/dist/lexer.js"(t54,e7){function n3(t55,e8,n4){return e8 in t55?Object.defineProperty(t55,e8,{value:n4,enumerable:!0,configurable:!0,writable:!0}):t55[e8]=n4,t55}var o6=m3(),i3=function(){},s6={data:"state-data",cdata:"state-cdata",tagBegin:"state-tag-begin",tagName:"state-tag-name",tagEnd:"state-tag-end",attributeNameStart:"state-attribute-name-start",attributeName:"state-attribute-name",attributeNameEnd:"state-attribute-name-end",attributeValueBegin:"state-attribute-value-begin",attributeValue:"state-attribute-value"},r6={lt:"action-lt",gt:"action-gt",space:"action-space",equal:"action-equal",quote:"action-quote",slash:"action-slash",char:"action-char",error:"action-error"},a3={text:"text",openTag:"open-tag",closeTag:"close-tag",attributeName:"attribute-name",attributeValue:"attribute-value"},c6={" ":r6.space," ":r6.space,"\n":r6.space,"\r":r6.space,"<":r6.lt,">":r6.gt,'"':r6.quote,"'":r6.quote,"=":r6.equal,"/":r6.slash};e7.exports={State:s6,Action:r6,Type:a3,create:function(t55){var e8,l7,h3,d4,u6,p5,m4,g4,f4,y3;t55=Object.assign({debug:!1},t55);var _3=new o6,b4=s6.data,x4="",v3="",S7="",I4="",P6="",M5="",C6=function(e10,n4){if(v3[0]!=="?"&&v3[0]!=="!"){var o7={type:e10,value:n4};t55.debug&&console.log("emit:",o7),_3.emit("data",o7)}};_3.stateMachine=(n3(y3={},s6.data,(n3(e8={},r6.lt,function(){x4.trim()&&C6(a3.text,x4),v3="",P6=!1,b4=s6.tagBegin}),n3(e8,r6.char,function(t56){x4+=t56}),e8)),n3(y3,s6.cdata,n3({},r6.char,function(t56){(x4+=t56).substr(-3)==="]]>"&&(C6(a3.text,x4.slice(0,-3)),x4="",b4=s6.data)})),n3(y3,s6.tagBegin,(n3(l7={},r6.space,i3),n3(l7,r6.char,function(t56){v3=t56,b4=s6.tagName}),n3(l7,r6.slash,function(){v3="",P6=!0}),l7)),n3(y3,s6.tagName,(n3(h3={},r6.space,function(){P6?b4=s6.tagEnd:(b4=s6.attributeNameStart,C6(a3.openTag,v3))}),n3(h3,r6.gt,function(){C6(P6?a3.closeTag:a3.openTag,v3),x4="",b4=s6.data}),n3(h3,r6.slash,function(){b4=s6.tagEnd,C6(a3.openTag,v3)}),n3(h3,r6.char,function(t56){(v3+=t56)==="![CDATA["&&(b4=s6.cdata,x4="",v3="")}),h3)),n3(y3,s6.tagEnd,(n3(d4={},r6.gt,function(){C6(a3.closeTag,v3),x4="",b4=s6.data}),n3(d4,r6.char,i3),d4)),n3(y3,s6.attributeNameStart,(n3(u6={},r6.char,function(t56){S7=t56,b4=s6.attributeName}),n3(u6,r6.gt,function(){x4="",b4=s6.data}),n3(u6,r6.space,i3),n3(u6,r6.slash,function(){P6=!0,b4=s6.tagEnd}),u6)),n3(y3,s6.attributeName,(n3(p5={},r6.space,function(){b4=s6.attributeNameEnd}),n3(p5,r6.equal,function(){C6(a3.attributeName,S7),b4=s6.attributeValueBegin}),n3(p5,r6.gt,function(){I4="",C6(a3.attributeName,S7),C6(a3.attributeValue,I4),x4="",b4=s6.data}),n3(p5,r6.slash,function(){P6=!0,I4="",C6(a3.attributeName,S7),C6(a3.attributeValue,I4),b4=s6.tagEnd}),n3(p5,r6.char,function(t56){S7+=t56}),p5)),n3(y3,s6.attributeNameEnd,(n3(m4={},r6.space,i3),n3(m4,r6.equal,function(){C6(a3.attributeName,S7),b4=s6.attributeValueBegin}),n3(m4,r6.gt,function(){I4="",C6(a3.attributeName,S7),C6(a3.attributeValue,I4),x4="",b4=s6.data}),n3(m4,r6.char,function(t56){I4="",C6(a3.attributeName,S7),C6(a3.attributeValue,I4),S7=t56,b4=s6.attributeName}),m4)),n3(y3,s6.attributeValueBegin,(n3(g4={},r6.space,i3),n3(g4,r6.quote,function(t56){M5=t56,I4="",b4=s6.attributeValue}),n3(g4,r6.gt,function(){C6(a3.attributeValue,I4=""),x4="",b4=s6.data}),n3(g4,r6.char,function(t56){M5="",I4=t56,b4=s6.attributeValue}),g4)),n3(y3,s6.attributeValue,(n3(f4={},r6.space,function(t56){M5?I4+=t56:(C6(a3.attributeValue,I4),b4=s6.attributeNameStart)}),n3(f4,r6.quote,function(t56){M5===t56?(C6(a3.attributeValue,I4),b4=s6.attributeNameStart):I4+=t56}),n3(f4,r6.gt,function(t56){M5?I4+=t56:(C6(a3.attributeValue,I4),x4="",b4=s6.data)}),n3(f4,r6.slash,function(t56){M5?I4+=t56:(C6(a3.attributeValue,I4),P6=!0,b4=s6.tagEnd)}),n3(f4,r6.char,function(t56){I4+=t56}),f4)),y3);var N3=function(e10){t55.debug&&console.log(b4,e10);var n4=_3.stateMachine[b4],o7=n4[(function(t56){return c6[t56]||r6.char})(e10)]||n4[r6.error]||n4[r6.char];o7(e10)};return _3.write=function(t56){for(var e10=t56.length,n4=0;n4<e10;n4++)N3(t56[n4])},_3}}}}),f3=r4({"node_modules/xml-reader/dist/reader.js"(t54,e7){var n3=p3(),o6=g3(),i3=o6.Type,s6={element:"element",text:"text"},r6=function(t55){return Object.assign({name:"",type:s6.element,value:"",parent:null,attributes:{},children:[]},t55)},a3=function(t55){t55=Object.assign({stream:!1,parentNodes:!0,doneEvent:"done",tagPrefix:"tag:",emitTopLevelOnly:!1,debug:!1},t55);var e8=void 0,a4=void 0,c6=void 0,l7=void 0,h3=new n3,d4=function(n4){switch(n4.type){case i3.openTag:if(c6===null)(c6=a4).name=n4.value;else{var o7=r6({name:n4.value,parent:c6});c6.children.push(o7),c6=o7}break;case i3.closeTag:var d6=c6.parent;if(t55.parentNodes||(c6.parent=null),c6.name!==n4.value)break;t55.stream&&d6===a4&&(a4.children=[],c6.parent=null),t55.emitTopLevelOnly&&d6!==a4||(h3.emit(t55.tagPrefix+c6.name,c6),h3.emit("tag",c6.name,c6)),c6===a4&&(e8.removeAllListeners("data"),h3.emit(t55.doneEvent,c6),a4=null),c6=d6;break;case i3.text:c6&&c6.children.push(r6({type:s6.text,value:n4.value,parent:t55.parentNodes?c6:null}));break;case i3.attributeName:l7=n4.value,c6.attributes[l7]="";break;case i3.attributeValue:c6.attributes[l7]=n4.value}};return h3.reset=function(){(e8=o6.create({debug:t55.debug})).on("data",d4),a4=r6(),c6=null,l7="",h3.parse=e8.write},h3.reset(),h3};e7.exports={parseSync:function(t55,e8){e8=Object.assign({},e8,{stream:!1,tagPrefix:":"});var n4=a3(e8),o7=void 0;return n4.on("done",function(t56){o7=t56}),n4.parse(t55),o7},create:a3,NodeType:s6}}}),y=r4({"node_modules/binary-search-bounds/search-bounds.js"(t54,e7){function n3(t55,e8,n4,o7,i6){for(var s7=i6+1;o7<=i6;){var r7=o7+i6>>>1,a4=t55[r7];(n4!==void 0?n4(a4,e8):a4-e8)>=0?(s7=r7,i6=r7-1):o7=r7+1}return s7}function o6(t55,e8,n4,o7,i6){for(var s7=i6+1;o7<=i6;){var r7=o7+i6>>>1,a4=t55[r7];(n4!==void 0?n4(a4,e8):a4-e8)>0?(s7=r7,i6=r7-1):o7=r7+1}return s7}function i3(t55,e8,n4,o7,i6){for(var s7=o7-1;o7<=i6;){var r7=o7+i6>>>1,a4=t55[r7];(n4!==void 0?n4(a4,e8):a4-e8)<0?(s7=r7,o7=r7+1):i6=r7-1}return s7}function s6(t55,e8,n4,o7,i6){for(var s7=o7-1;o7<=i6;){var r7=o7+i6>>>1,a4=t55[r7];(n4!==void 0?n4(a4,e8):a4-e8)<=0?(s7=r7,o7=r7+1):i6=r7-1}return s7}function r6(t55,e8,n4,o7,i6){for(;o7<=i6;){var s7=o7+i6>>>1,r7=t55[s7],a4=n4!==void 0?n4(r7,e8):r7-e8;if(a4===0)return s7;a4<=0?o7=s7+1:i6=s7-1}return-1}function a3(t55,e8,n4,o7,i6,s7){return typeof n4=="function"?s7(t55,e8,n4,o7===void 0?0:0|o7,i6===void 0?t55.length-1:0|i6):s7(t55,e8,void 0,n4===void 0?0:0|n4,o7===void 0?t55.length-1:0|o7)}e7.exports={ge:function(t55,e8,o7,i6,s7){return a3(t55,e8,o7,i6,s7,n3)},gt:function(t55,e8,n4,i6,s7){return a3(t55,e8,n4,i6,s7,o6)},lt:function(t55,e8,n4,o7,s7){return a3(t55,e8,n4,o7,s7,i3)},le:function(t55,e8,n4,o7,i6){return a3(t55,e8,n4,o7,i6,s6)},eq:function(t55,e8,n4,o7,i6){return a3(t55,e8,n4,o7,i6,r6)}}}}),_=r4({"node_modules/two-product/two-product.js"(t54,e7){e7.exports=function(t55,e8,o6){var i3=t55*e8,s6=n3*t55,r6=s6-(s6-t55),a3=t55-r6,c6=n3*e8,l7=c6-(c6-e8),h3=e8-l7,d4=a3*h3-(i3-r6*l7-a3*l7-r6*h3);return o6?(o6[0]=d4,o6[1]=i3,o6):[d4,i3]};var n3=+(Math.pow(2,27)+1)}}),b2=r4({"node_modules/robust-sum/robust-sum.js"(t54,e7){e7.exports=function(t55,e8){var n3=0|t55.length,o6=0|e8.length;if(n3===1&&o6===1)return(function(t56,e10){var n4=t56+e10,o7=n4-t56,i6=n4-o7,s7=e10-o7,r7=t56-i6,a4=r7+s7;return a4?[a4,n4]:[n4]})(t55[0],e8[0]);var i3,s6,r6=new Array(n3+o6),a3=0,c6=0,l7=0,h3=Math.abs,d4=t55[c6],u6=h3(d4),p5=e8[l7],m4=h3(p5);u6<m4?(s6=d4,(c6+=1)<n3&&(u6=h3(d4=t55[c6]))):(s6=p5,(l7+=1)<o6&&(m4=h3(p5=e8[l7]))),c6<n3&&u6<m4||l7>=o6?(i3=d4,(c6+=1)<n3&&(u6=h3(d4=t55[c6]))):(i3=p5,(l7+=1)<o6&&(m4=h3(p5=e8[l7])));for(var g4,f4,y3=i3+s6,_3=y3-i3,b4=s6-_3,x4=b4,v3=y3;c6<n3&&l7<o6;)u6<m4?(i3=d4,(c6+=1)<n3&&(u6=h3(d4=t55[c6]))):(i3=p5,(l7+=1)<o6&&(m4=h3(p5=e8[l7]))),(b4=(s6=x4)-(_3=(y3=i3+s6)-i3))&&(r6[a3++]=b4),x4=v3-((g4=v3+y3)-(f4=g4-v3))+(y3-f4),v3=g4;for(;c6<n3;)(b4=(s6=x4)-(_3=(y3=(i3=d4)+s6)-i3))&&(r6[a3++]=b4),x4=v3-((g4=v3+y3)-(f4=g4-v3))+(y3-f4),v3=g4,(c6+=1)<n3&&(d4=t55[c6]);for(;l7<o6;)(b4=(s6=x4)-(_3=(y3=(i3=p5)+s6)-i3))&&(r6[a3++]=b4),x4=v3-((g4=v3+y3)-(f4=g4-v3))+(y3-f4),v3=g4,(l7+=1)<o6&&(p5=e8[l7]);return x4&&(r6[a3++]=x4),v3&&(r6[a3++]=v3),a3||(r6[a3++]=0),r6.length=a3,r6}}}),x=r4({"node_modules/two-sum/two-sum.js"(t54,e7){e7.exports=function(t55,e8,n3){var o6=t55+e8,i3=o6-t55,s6=e8-i3,r6=t55-(o6-i3);return n3?(n3[0]=r6+s6,n3[1]=o6,n3):[r6+s6,o6]}}}),v2=r4({"node_modules/robust-scale/robust-scale.js"(t54,e7){var n3=_(),o6=x();e7.exports=function(t55,e8){var i3=t55.length;if(i3===1){var s6=n3(t55[0],e8);return s6[0]?s6:[s6[1]]}var r6=new Array(2*i3),a3=[.1,.1],c6=[.1,.1],l7=0;n3(t55[0],e8,a3),a3[0]&&(r6[l7++]=a3[0]);for(var h3=1;h3<i3;++h3){n3(t55[h3],e8,c6);var d4=a3[1];o6(d4,c6[0],a3),a3[0]&&(r6[l7++]=a3[0]);var u6=c6[1],p5=a3[1],m4=u6+p5,g4=p5-(m4-u6);a3[1]=m4,g4&&(r6[l7++]=g4)}return a3[1]&&(r6[l7++]=a3[1]),l7===0&&(r6[l7++]=0),r6.length=l7,r6}}}),S6=r4({"node_modules/robust-subtract/robust-diff.js"(t54,e7){e7.exports=function(t55,e8){var n3=0|t55.length,o6=0|e8.length;if(n3===1&&o6===1)return(function(t56,e10){var n4=t56+e10,o7=n4-t56,i6=n4-o7,s7=e10-o7,r7=t56-i6,a4=r7+s7;return a4?[a4,n4]:[n4]})(t55[0],-e8[0]);var i3,s6,r6=new Array(n3+o6),a3=0,c6=0,l7=0,h3=Math.abs,d4=t55[c6],u6=h3(d4),p5=-e8[l7],m4=h3(p5);u6<m4?(s6=d4,(c6+=1)<n3&&(u6=h3(d4=t55[c6]))):(s6=p5,(l7+=1)<o6&&(m4=h3(p5=-e8[l7]))),c6<n3&&u6<m4||l7>=o6?(i3=d4,(c6+=1)<n3&&(u6=h3(d4=t55[c6]))):(i3=p5,(l7+=1)<o6&&(m4=h3(p5=-e8[l7])));for(var g4,f4,y3=i3+s6,_3=y3-i3,b4=s6-_3,x4=b4,v3=y3;c6<n3&&l7<o6;)u6<m4?(i3=d4,(c6+=1)<n3&&(u6=h3(d4=t55[c6]))):(i3=p5,(l7+=1)<o6&&(m4=h3(p5=-e8[l7]))),(b4=(s6=x4)-(_3=(y3=i3+s6)-i3))&&(r6[a3++]=b4),x4=v3-((g4=v3+y3)-(f4=g4-v3))+(y3-f4),v3=g4;for(;c6<n3;)(b4=(s6=x4)-(_3=(y3=(i3=d4)+s6)-i3))&&(r6[a3++]=b4),x4=v3-((g4=v3+y3)-(f4=g4-v3))+(y3-f4),v3=g4,(c6+=1)<n3&&(d4=t55[c6]);for(;l7<o6;)(b4=(s6=x4)-(_3=(y3=(i3=p5)+s6)-i3))&&(r6[a3++]=b4),x4=v3-((g4=v3+y3)-(f4=g4-v3))+(y3-f4),v3=g4,(l7+=1)<o6&&(p5=-e8[l7]);return x4&&(r6[a3++]=x4),v3&&(r6[a3++]=v3),a3||(r6[a3++]=0),r6.length=a3,r6}}}),I3=r4({"node_modules/robust-orientation/orientation.js"(t54,e7){var n3=_(),o6=b2(),i3=v2(),s6=S6();function r6(t55,e8,n4,o7){return function(n5,i6,s7){var r7=t55(t55(e8(i6[1],s7[0]),e8(-s7[1],i6[0])),t55(e8(n5[1],i6[0]),e8(-i6[1],n5[0]))),a4=t55(e8(n5[1],s7[0]),e8(-s7[1],n5[0])),c7=o7(r7,a4);return c7[c7.length-1]}}function a3(t55,e8,n4,o7){return function(i6,s7,r7,a4){var c7=t55(t55(n4(t55(e8(r7[1],a4[0]),e8(-a4[1],r7[0])),s7[2]),t55(n4(t55(e8(s7[1],a4[0]),e8(-a4[1],s7[0])),-r7[2]),n4(t55(e8(s7[1],r7[0]),e8(-r7[1],s7[0])),a4[2]))),t55(n4(t55(e8(s7[1],a4[0]),e8(-a4[1],s7[0])),i6[2]),t55(n4(t55(e8(i6[1],a4[0]),e8(-a4[1],i6[0])),-s7[2]),n4(t55(e8(i6[1],s7[0]),e8(-s7[1],i6[0])),a4[2])))),l10=t55(t55(n4(t55(e8(r7[1],a4[0]),e8(-a4[1],r7[0])),i6[2]),t55(n4(t55(e8(i6[1],a4[0]),e8(-a4[1],i6[0])),-r7[2]),n4(t55(e8(i6[1],r7[0]),e8(-r7[1],i6[0])),a4[2]))),t55(n4(t55(e8(s7[1],r7[0]),e8(-r7[1],s7[0])),i6[2]),t55(n4(t55(e8(i6[1],r7[0]),e8(-r7[1],i6[0])),-s7[2]),n4(t55(e8(i6[1],s7[0]),e8(-s7[1],i6[0])),r7[2])))),h4=o7(c7,l10);return h4[h4.length-1]}}function c6(t55,e8,n4,o7){return function(i6,s7,r7,a4,c7){var l10=t55(t55(t55(n4(t55(n4(t55(e8(a4[1],c7[0]),e8(-c7[1],a4[0])),r7[2]),t55(n4(t55(e8(r7[1],c7[0]),e8(-c7[1],r7[0])),-a4[2]),n4(t55(e8(r7[1],a4[0]),e8(-a4[1],r7[0])),c7[2]))),s7[3]),t55(n4(t55(n4(t55(e8(a4[1],c7[0]),e8(-c7[1],a4[0])),s7[2]),t55(n4(t55(e8(s7[1],c7[0]),e8(-c7[1],s7[0])),-a4[2]),n4(t55(e8(s7[1],a4[0]),e8(-a4[1],s7[0])),c7[2]))),-r7[3]),n4(t55(n4(t55(e8(r7[1],c7[0]),e8(-c7[1],r7[0])),s7[2]),t55(n4(t55(e8(s7[1],c7[0]),e8(-c7[1],s7[0])),-r7[2]),n4(t55(e8(s7[1],r7[0]),e8(-r7[1],s7[0])),c7[2]))),a4[3]))),t55(n4(t55(n4(t55(e8(r7[1],a4[0]),e8(-a4[1],r7[0])),s7[2]),t55(n4(t55(e8(s7[1],a4[0]),e8(-a4[1],s7[0])),-r7[2]),n4(t55(e8(s7[1],r7[0]),e8(-r7[1],s7[0])),a4[2]))),-c7[3]),t55(n4(t55(n4(t55(e8(a4[1],c7[0]),e8(-c7[1],a4[0])),s7[2]),t55(n4(t55(e8(s7[1],c7[0]),e8(-c7[1],s7[0])),-a4[2]),n4(t55(e8(s7[1],a4[0]),e8(-a4[1],s7[0])),c7[2]))),i6[3]),n4(t55(n4(t55(e8(a4[1],c7[0]),e8(-c7[1],a4[0])),i6[2]),t55(n4(t55(e8(i6[1],c7[0]),e8(-c7[1],i6[0])),-a4[2]),n4(t55(e8(i6[1],a4[0]),e8(-a4[1],i6[0])),c7[2]))),-s7[3])))),t55(t55(n4(t55(n4(t55(e8(s7[1],c7[0]),e8(-c7[1],s7[0])),i6[2]),t55(n4(t55(e8(i6[1],c7[0]),e8(-c7[1],i6[0])),-s7[2]),n4(t55(e8(i6[1],s7[0]),e8(-s7[1],i6[0])),c7[2]))),a4[3]),t55(n4(t55(n4(t55(e8(s7[1],a4[0]),e8(-a4[1],s7[0])),i6[2]),t55(n4(t55(e8(i6[1],a4[0]),e8(-a4[1],i6[0])),-s7[2]),n4(t55(e8(i6[1],s7[0]),e8(-s7[1],i6[0])),a4[2]))),-c7[3]),n4(t55(n4(t55(e8(r7[1],a4[0]),e8(-a4[1],r7[0])),s7[2]),t55(n4(t55(e8(s7[1],a4[0]),e8(-a4[1],s7[0])),-r7[2]),n4(t55(e8(s7[1],r7[0]),e8(-r7[1],s7[0])),a4[2]))),i6[3]))),t55(n4(t55(n4(t55(e8(r7[1],a4[0]),e8(-a4[1],r7[0])),i6[2]),t55(n4(t55(e8(i6[1],a4[0]),e8(-a4[1],i6[0])),-r7[2]),n4(t55(e8(i6[1],r7[0]),e8(-r7[1],i6[0])),a4[2]))),-s7[3]),t55(n4(t55(n4(t55(e8(s7[1],a4[0]),e8(-a4[1],s7[0])),i6[2]),t55(n4(t55(e8(i6[1],a4[0]),e8(-a4[1],i6[0])),-s7[2]),n4(t55(e8(i6[1],s7[0]),e8(-s7[1],i6[0])),a4[2]))),r7[3]),n4(t55(n4(t55(e8(s7[1],r7[0]),e8(-r7[1],s7[0])),i6[2]),t55(n4(t55(e8(i6[1],r7[0]),e8(-r7[1],i6[0])),-s7[2]),n4(t55(e8(i6[1],s7[0]),e8(-s7[1],i6[0])),r7[2]))),-a4[3]))))),h4=t55(t55(t55(n4(t55(n4(t55(e8(a4[1],c7[0]),e8(-c7[1],a4[0])),r7[2]),t55(n4(t55(e8(r7[1],c7[0]),e8(-c7[1],r7[0])),-a4[2]),n4(t55(e8(r7[1],a4[0]),e8(-a4[1],r7[0])),c7[2]))),i6[3]),n4(t55(n4(t55(e8(a4[1],c7[0]),e8(-c7[1],a4[0])),i6[2]),t55(n4(t55(e8(i6[1],c7[0]),e8(-c7[1],i6[0])),-a4[2]),n4(t55(e8(i6[1],a4[0]),e8(-a4[1],i6[0])),c7[2]))),-r7[3])),t55(n4(t55(n4(t55(e8(r7[1],c7[0]),e8(-c7[1],r7[0])),i6[2]),t55(n4(t55(e8(i6[1],c7[0]),e8(-c7[1],i6[0])),-r7[2]),n4(t55(e8(i6[1],r7[0]),e8(-r7[1],i6[0])),c7[2]))),a4[3]),n4(t55(n4(t55(e8(r7[1],a4[0]),e8(-a4[1],r7[0])),i6[2]),t55(n4(t55(e8(i6[1],a4[0]),e8(-a4[1],i6[0])),-r7[2]),n4(t55(e8(i6[1],r7[0]),e8(-r7[1],i6[0])),a4[2]))),-c7[3]))),t55(t55(n4(t55(n4(t55(e8(r7[1],c7[0]),e8(-c7[1],r7[0])),s7[2]),t55(n4(t55(e8(s7[1],c7[0]),e8(-c7[1],s7[0])),-r7[2]),n4(t55(e8(s7[1],r7[0]),e8(-r7[1],s7[0])),c7[2]))),i6[3]),n4(t55(n4(t55(e8(r7[1],c7[0]),e8(-c7[1],r7[0])),i6[2]),t55(n4(t55(e8(i6[1],c7[0]),e8(-c7[1],i6[0])),-r7[2]),n4(t55(e8(i6[1],r7[0]),e8(-r7[1],i6[0])),c7[2]))),-s7[3])),t55(n4(t55(n4(t55(e8(s7[1],c7[0]),e8(-c7[1],s7[0])),i6[2]),t55(n4(t55(e8(i6[1],c7[0]),e8(-c7[1],i6[0])),-s7[2]),n4(t55(e8(i6[1],s7[0]),e8(-s7[1],i6[0])),c7[2]))),r7[3]),n4(t55(n4(t55(e8(s7[1],r7[0]),e8(-r7[1],s7[0])),i6[2]),t55(n4(t55(e8(i6[1],r7[0]),e8(-r7[1],i6[0])),-s7[2]),n4(t55(e8(i6[1],s7[0]),e8(-s7[1],i6[0])),r7[2]))),-c7[3])))),d6=o7(l10,h4);return d6[d6.length-1]}}function l7(t55){return(t55===3?r6:t55===4?a3:c6)(o6,n3,i3,s6)}var h3=l7(3),d4=l7(4),u6=[function(){return 0},function(){return 0},function(t55,e8){return e8[0]-t55[0]},function(t55,e8,n4){var o7,i6=(t55[1]-n4[1])*(e8[0]-n4[0]),s7=(t55[0]-n4[0])*(e8[1]-n4[1]),r7=i6-s7;if(i6>0){if(s7<=0)return r7;o7=i6+s7}else{if(!(i6<0)||s7>=0)return r7;o7=-(i6+s7)}var a4=33306690738754716e-32*o7;return r7>=a4||r7<=-a4?r7:h3(t55,e8,n4)},function(t55,e8,n4,o7){var i6=t55[0]-o7[0],s7=e8[0]-o7[0],r7=n4[0]-o7[0],a4=t55[1]-o7[1],c7=e8[1]-o7[1],l10=n4[1]-o7[1],h4=t55[2]-o7[2],u10=e8[2]-o7[2],p6=n4[2]-o7[2],m5=s7*l10,g4=r7*c7,f4=r7*a4,y3=i6*l10,_3=i6*c7,b4=s7*a4,x4=h4*(m5-g4)+u10*(f4-y3)+p6*(_3-b4),v3=7771561172376103e-31*((Math.abs(m5)+Math.abs(g4))*Math.abs(h4)+(Math.abs(f4)+Math.abs(y3))*Math.abs(u10)+(Math.abs(_3)+Math.abs(b4))*Math.abs(p6));return x4>v3||-x4>v3?x4:d4(t55,e8,n4,o7)}];function p5(t55){var e8=u6[t55.length];return e8||(e8=u6[t55.length]=l7(t55.length)),e8.apply(void 0,t55)}function m4(t55,e8,n4,o7,i6,s7,r7){return function(e10,n5,a4,c7,l10){switch(arguments.length){case 0:case 1:return 0;case 2:return o7(e10,n5);case 3:return i6(e10,n5,a4);case 4:return s7(e10,n5,a4,c7);case 5:return r7(e10,n5,a4,c7,l10)}for(var h4=new Array(arguments.length),d6=0;d6<arguments.length;++d6)h4[d6]=arguments[d6];return t55(h4)}}(function(){for(;u6.length<=5;)u6.push(l7(u6.length));e7.exports=m4.apply(void 0,[p5].concat(u6));for(var t55=0;t55<=5;++t55)e7.exports[t55]=u6[t55]})()}}),P2=r4({"node_modules/cdt2d/lib/monotone.js"(t54,e7){var n3=y(),o6=I3()[3];function i3(t55,e8,n4,o7,i6){this.a=t55,this.b=e8,this.idx=n4,this.lowerIds=o7,this.upperIds=i6}function s6(t55,e8,n4,o7){this.a=t55,this.b=e8,this.type=n4,this.idx=o7}function r6(t55,e8){var n4=t55.a[0]-e8.a[0]||t55.a[1]-e8.a[1]||t55.type-e8.type;return n4||(t55.type!==0&&(n4=o6(t55.a,t55.b,e8.b))?n4:t55.idx-e8.idx)}function a3(t55,e8){return o6(t55.a,t55.b,e8)}function c6(t55,e8,i6,s7,r7){for(var c7=n3.lt(e8,s7,a3),l10=n3.gt(e8,s7,a3),h4=c7;h4<l10;++h4){for(var d6=e8[h4],u6=d6.lowerIds,p5=u6.length;p5>1&&o6(i6[u6[p5-2]],i6[u6[p5-1]],s7)>0;)t55.push([u6[p5-1],u6[p5-2],r7]),p5-=1;u6.length=p5,u6.push(r7);var m4=d6.upperIds;for(p5=m4.length;p5>1&&o6(i6[m4[p5-2]],i6[m4[p5-1]],s7)<0;)t55.push([m4[p5-2],m4[p5-1],r7]),p5-=1;m4.length=p5,m4.push(r7)}}function l7(t55,e8){var n4;return(n4=t55.a[0]<e8.a[0]?o6(t55.a,t55.b,e8.a):o6(e8.b,e8.a,t55.a))?n4:(n4=e8.b[0]<t55.b[0]?o6(t55.a,t55.b,e8.b):o6(e8.b,e8.a,t55.b))||t55.idx-e8.idx}function h3(t55,e8,o7){var s7=n3.le(t55,o7,l7),r7=t55[s7],a4=r7.upperIds,c7=a4[a4.length-1];r7.upperIds=[c7],t55.splice(s7+1,0,new i3(o7.a,o7.b,o7.idx,[c7],a4))}function d4(t55,e8,o7){var i6=o7.a;o7.a=o7.b,o7.b=i6;var s7=n3.eq(t55,o7,l7),r7=t55[s7];t55[s7-1].upperIds=r7.upperIds,t55.splice(s7,1)}e7.exports=function(t55,e8){for(var n4=t55.length,o7=e8.length,a4=[],l10=0;l10<n4;++l10)a4.push(new s6(t55[l10],null,0,l10));for(l10=0;l10<o7;++l10){var u6=e8[l10],p5=t55[u6[0]],m4=t55[u6[1]];p5[0]<m4[0]?a4.push(new s6(p5,m4,2,l10),new s6(m4,p5,1,l10)):p5[0]>m4[0]&&a4.push(new s6(m4,p5,2,l10),new s6(p5,m4,1,l10))}a4.sort(r6);for(var g4=a4[0].a[0]-(1+Math.abs(a4[0].a[0]))*Math.pow(2,-52),f4=[new i3([g4,1],[g4,0],-1,[],[],[],[])],y3=[],_3=(l10=0,a4.length);l10<_3;++l10){var b4=a4[l10],x4=b4.type;x4===0?c6(y3,f4,t55,b4.a,b4.idx):x4===2?h3(f4,t55,b4):d4(f4,t55,b4)}return y3}}}),M3=r4({"node_modules/cdt2d/lib/triangulation.js"(t54,e7){var n3=y();function o6(t55,e8){this.stars=t55,this.edges=e8}e7.exports=function(t55,e8){for(var n4=new Array(t55),i6=0;i6<t55;++i6)n4[i6]=[];return new o6(n4,e8)};var i3=o6.prototype;function s6(t55,e8,n4){for(var o7=1,i6=t55.length;o7<i6;o7+=2)if(t55[o7-1]===e8&&t55[o7]===n4)return t55[o7-1]=t55[i6-2],t55[o7]=t55[i6-1],void(t55.length=i6-2)}i3.isConstraint=(function(){var t55=[0,0];function e8(t56,e10){return t56[0]-e10[0]||t56[1]-e10[1]}return function(o7,i6){return t55[0]=Math.min(o7,i6),t55[1]=Math.max(o7,i6),n3.eq(this.edges,t55,e8)>=0}})(),i3.removeTriangle=function(t55,e8,n4){var o7=this.stars;s6(o7[t55],e8,n4),s6(o7[e8],n4,t55),s6(o7[n4],t55,e8)},i3.addTriangle=function(t55,e8,n4){var o7=this.stars;o7[t55].push(e8,n4),o7[e8].push(n4,t55),o7[n4].push(t55,e8)},i3.opposite=function(t55,e8){for(var n4=this.stars[e8],o7=1,i6=n4.length;o7<i6;o7+=2)if(n4[o7]===t55)return n4[o7-1];return-1},i3.flip=function(t55,e8){var n4=this.opposite(t55,e8),o7=this.opposite(e8,t55);this.removeTriangle(t55,e8,n4),this.removeTriangle(e8,t55,o7),this.addTriangle(t55,o7,n4),this.addTriangle(e8,n4,o7)},i3.edges=function(){for(var t55=this.stars,e8=[],n4=0,o7=t55.length;n4<o7;++n4)for(var i6=t55[n4],s7=0,r6=i6.length;s7<r6;s7+=2)e8.push([i6[s7],i6[s7+1]]);return e8},i3.cells=function(){for(var t55=this.stars,e8=[],n4=0,o7=t55.length;n4<o7;++n4)for(var i6=t55[n4],s7=0,r6=i6.length;s7<r6;s7+=2){var a3=i6[s7],c6=i6[s7+1];n4<Math.min(a3,c6)&&e8.push([n4,a3,c6])}return e8}}}),C5=r4({"node_modules/robust-in-sphere/in-sphere.js"(t54,e7){var n3=_(),o6=b2(),i3=S6(),s6=v2();function r6(t55){return(t55===3?a3:t55===4?c6:t55===5?l7:h3)(o6,i3,n3,s6)}function a3(t55,e8,n4,o7){return function(i6,s7,r7){var a4=n4(i6[0],i6[0]),c7=o7(a4,s7[0]),l10=o7(a4,r7[0]),h4=n4(s7[0],s7[0]),d6=o7(h4,i6[0]),u10=o7(h4,r7[0]),p6=n4(r7[0],r7[0]),m4=o7(p6,i6[0]),g4=o7(p6,s7[0]),f4=t55(e8(g4,u10),e8(d6,c7)),y3=e8(m4,l10),_3=e8(f4,y3);return _3[_3.length-1]}}function c6(t55,e8,n4,o7){return function(i6,s7,r7,a4){var c7=t55(n4(i6[0],i6[0]),n4(i6[1],i6[1])),l10=o7(c7,s7[0]),h4=o7(c7,r7[0]),d6=o7(c7,a4[0]),u10=t55(n4(s7[0],s7[0]),n4(s7[1],s7[1])),p6=o7(u10,i6[0]),m4=o7(u10,r7[0]),g4=o7(u10,a4[0]),f4=t55(n4(r7[0],r7[0]),n4(r7[1],r7[1])),y3=o7(f4,i6[0]),_3=o7(f4,s7[0]),b4=o7(f4,a4[0]),x4=t55(n4(a4[0],a4[0]),n4(a4[1],a4[1])),v3=o7(x4,i6[0]),S7=o7(x4,s7[0]),I4=o7(x4,r7[0]),P6=t55(t55(o7(e8(I4,b4),s7[1]),t55(o7(e8(S7,g4),-r7[1]),o7(e8(_3,m4),a4[1]))),t55(o7(e8(S7,g4),i6[1]),t55(o7(e8(v3,d6),-s7[1]),o7(e8(p6,l10),a4[1])))),M5=t55(t55(o7(e8(I4,b4),i6[1]),t55(o7(e8(v3,d6),-r7[1]),o7(e8(y3,h4),a4[1]))),t55(o7(e8(_3,m4),i6[1]),t55(o7(e8(y3,h4),-s7[1]),o7(e8(p6,l10),r7[1])))),C6=e8(P6,M5);return C6[C6.length-1]}}function l7(t55,e8,n4,o7){return function(i6,s7,r7,a4,c7){var l10=t55(n4(i6[0],i6[0]),t55(n4(i6[1],i6[1]),n4(i6[2],i6[2]))),h4=o7(l10,s7[0]),d6=o7(l10,r7[0]),u10=o7(l10,a4[0]),p6=o7(l10,c7[0]),m4=t55(n4(s7[0],s7[0]),t55(n4(s7[1],s7[1]),n4(s7[2],s7[2]))),g4=o7(m4,i6[0]),f4=o7(m4,r7[0]),y3=o7(m4,a4[0]),_3=o7(m4,c7[0]),b4=t55(n4(r7[0],r7[0]),t55(n4(r7[1],r7[1]),n4(r7[2],r7[2]))),x4=o7(b4,i6[0]),v3=o7(b4,s7[0]),S7=o7(b4,a4[0]),I4=o7(b4,c7[0]),P6=t55(n4(a4[0],a4[0]),t55(n4(a4[1],a4[1]),n4(a4[2],a4[2]))),M5=o7(P6,i6[0]),C6=o7(P6,s7[0]),N3=o7(P6,r7[0]),T6=o7(P6,c7[0]),w4=t55(n4(c7[0],c7[0]),t55(n4(c7[1],c7[1]),n4(c7[2],c7[2]))),R6=o7(w4,i6[0]),E4=o7(w4,s7[0]),A7=o7(w4,r7[0]),O3=o7(w4,a4[0]),L5=t55(t55(t55(o7(t55(o7(e8(O3,T6),r7[1]),t55(o7(e8(A7,I4),-a4[1]),o7(e8(N3,S7),c7[1]))),s7[2]),t55(o7(t55(o7(e8(O3,T6),s7[1]),t55(o7(e8(E4,_3),-a4[1]),o7(e8(C6,y3),c7[1]))),-r7[2]),o7(t55(o7(e8(A7,I4),s7[1]),t55(o7(e8(E4,_3),-r7[1]),o7(e8(v3,f4),c7[1]))),a4[2]))),t55(o7(t55(o7(e8(N3,S7),s7[1]),t55(o7(e8(C6,y3),-r7[1]),o7(e8(v3,f4),a4[1]))),-c7[2]),t55(o7(t55(o7(e8(O3,T6),s7[1]),t55(o7(e8(E4,_3),-a4[1]),o7(e8(C6,y3),c7[1]))),i6[2]),o7(t55(o7(e8(O3,T6),i6[1]),t55(o7(e8(R6,p6),-a4[1]),o7(e8(M5,u10),c7[1]))),-s7[2])))),t55(t55(o7(t55(o7(e8(E4,_3),i6[1]),t55(o7(e8(R6,p6),-s7[1]),o7(e8(g4,h4),c7[1]))),a4[2]),t55(o7(t55(o7(e8(C6,y3),i6[1]),t55(o7(e8(M5,u10),-s7[1]),o7(e8(g4,h4),a4[1]))),-c7[2]),o7(t55(o7(e8(N3,S7),s7[1]),t55(o7(e8(C6,y3),-r7[1]),o7(e8(v3,f4),a4[1]))),i6[2]))),t55(o7(t55(o7(e8(N3,S7),i6[1]),t55(o7(e8(M5,u10),-r7[1]),o7(e8(x4,d6),a4[1]))),-s7[2]),t55(o7(t55(o7(e8(C6,y3),i6[1]),t55(o7(e8(M5,u10),-s7[1]),o7(e8(g4,h4),a4[1]))),r7[2]),o7(t55(o7(e8(v3,f4),i6[1]),t55(o7(e8(x4,d6),-s7[1]),o7(e8(g4,h4),r7[1]))),-a4[2]))))),D4=t55(t55(t55(o7(t55(o7(e8(O3,T6),r7[1]),t55(o7(e8(A7,I4),-a4[1]),o7(e8(N3,S7),c7[1]))),i6[2]),o7(t55(o7(e8(O3,T6),i6[1]),t55(o7(e8(R6,p6),-a4[1]),o7(e8(M5,u10),c7[1]))),-r7[2])),t55(o7(t55(o7(e8(A7,I4),i6[1]),t55(o7(e8(R6,p6),-r7[1]),o7(e8(x4,d6),c7[1]))),a4[2]),o7(t55(o7(e8(N3,S7),i6[1]),t55(o7(e8(M5,u10),-r7[1]),o7(e8(x4,d6),a4[1]))),-c7[2]))),t55(t55(o7(t55(o7(e8(A7,I4),s7[1]),t55(o7(e8(E4,_3),-r7[1]),o7(e8(v3,f4),c7[1]))),i6[2]),o7(t55(o7(e8(A7,I4),i6[1]),t55(o7(e8(R6,p6),-r7[1]),o7(e8(x4,d6),c7[1]))),-s7[2])),t55(o7(t55(o7(e8(E4,_3),i6[1]),t55(o7(e8(R6,p6),-s7[1]),o7(e8(g4,h4),c7[1]))),r7[2]),o7(t55(o7(e8(v3,f4),i6[1]),t55(o7(e8(x4,d6),-s7[1]),o7(e8(g4,h4),r7[1]))),-c7[2])))),z5=e8(L5,D4);return z5[z5.length-1]}}function h3(t55,e8,n4,o7){return function(i6,s7,r7,a4,c7,l10){var h4=t55(t55(n4(i6[0],i6[0]),n4(i6[1],i6[1])),t55(n4(i6[2],i6[2]),n4(i6[3],i6[3]))),d6=o7(h4,s7[0]),u10=o7(h4,r7[0]),p6=o7(h4,a4[0]),m4=o7(h4,c7[0]),g4=o7(h4,l10[0]),f4=t55(t55(n4(s7[0],s7[0]),n4(s7[1],s7[1])),t55(n4(s7[2],s7[2]),n4(s7[3],s7[3]))),y3=o7(f4,i6[0]),_3=o7(f4,r7[0]),b4=o7(f4,a4[0]),x4=o7(f4,c7[0]),v3=o7(f4,l10[0]),S7=t55(t55(n4(r7[0],r7[0]),n4(r7[1],r7[1])),t55(n4(r7[2],r7[2]),n4(r7[3],r7[3]))),I4=o7(S7,i6[0]),P6=o7(S7,s7[0]),M5=o7(S7,a4[0]),C6=o7(S7,c7[0]),N3=o7(S7,l10[0]),T6=t55(t55(n4(a4[0],a4[0]),n4(a4[1],a4[1])),t55(n4(a4[2],a4[2]),n4(a4[3],a4[3]))),w4=o7(T6,i6[0]),R6=o7(T6,s7[0]),E4=o7(T6,r7[0]),A7=o7(T6,c7[0]),O3=o7(T6,l10[0]),L5=t55(t55(n4(c7[0],c7[0]),n4(c7[1],c7[1])),t55(n4(c7[2],c7[2]),n4(c7[3],c7[3]))),D4=o7(L5,i6[0]),z5=o7(L5,s7[0]),k5=o7(L5,r7[0]),F7=o7(L5,a4[0]),j5=o7(L5,l10[0]),Y4=t55(t55(n4(l10[0],l10[0]),n4(l10[1],l10[1])),t55(n4(l10[2],l10[2]),n4(l10[3],l10[3]))),X5=o7(Y4,i6[0]),$3=o7(Y4,s7[0]),B5=o7(Y4,r7[0]),H3=o7(Y4,a4[0]),W6=o7(Y4,c7[0]),V4=t55(t55(t55(o7(t55(t55(o7(t55(o7(e8(W6,j5),a4[1]),t55(o7(e8(H3,O3),-c7[1]),o7(e8(F7,A7),l10[1]))),r7[2]),o7(t55(o7(e8(W6,j5),r7[1]),t55(o7(e8(B5,N3),-c7[1]),o7(e8(k5,C6),l10[1]))),-a4[2])),t55(o7(t55(o7(e8(H3,O3),r7[1]),t55(o7(e8(B5,N3),-a4[1]),o7(e8(E4,M5),l10[1]))),c7[2]),o7(t55(o7(e8(F7,A7),r7[1]),t55(o7(e8(k5,C6),-a4[1]),o7(e8(E4,M5),c7[1]))),-l10[2]))),s7[3]),t55(o7(t55(t55(o7(t55(o7(e8(W6,j5),a4[1]),t55(o7(e8(H3,O3),-c7[1]),o7(e8(F7,A7),l10[1]))),s7[2]),o7(t55(o7(e8(W6,j5),s7[1]),t55(o7(e8($3,v3),-c7[1]),o7(e8(z5,x4),l10[1]))),-a4[2])),t55(o7(t55(o7(e8(H3,O3),s7[1]),t55(o7(e8($3,v3),-a4[1]),o7(e8(R6,b4),l10[1]))),c7[2]),o7(t55(o7(e8(F7,A7),s7[1]),t55(o7(e8(z5,x4),-a4[1]),o7(e8(R6,b4),c7[1]))),-l10[2]))),-r7[3]),o7(t55(t55(o7(t55(o7(e8(W6,j5),r7[1]),t55(o7(e8(B5,N3),-c7[1]),o7(e8(k5,C6),l10[1]))),s7[2]),o7(t55(o7(e8(W6,j5),s7[1]),t55(o7(e8($3,v3),-c7[1]),o7(e8(z5,x4),l10[1]))),-r7[2])),t55(o7(t55(o7(e8(B5,N3),s7[1]),t55(o7(e8($3,v3),-r7[1]),o7(e8(P6,_3),l10[1]))),c7[2]),o7(t55(o7(e8(k5,C6),s7[1]),t55(o7(e8(z5,x4),-r7[1]),o7(e8(P6,_3),c7[1]))),-l10[2]))),a4[3]))),t55(t55(o7(t55(t55(o7(t55(o7(e8(H3,O3),r7[1]),t55(o7(e8(B5,N3),-a4[1]),o7(e8(E4,M5),l10[1]))),s7[2]),o7(t55(o7(e8(H3,O3),s7[1]),t55(o7(e8($3,v3),-a4[1]),o7(e8(R6,b4),l10[1]))),-r7[2])),t55(o7(t55(o7(e8(B5,N3),s7[1]),t55(o7(e8($3,v3),-r7[1]),o7(e8(P6,_3),l10[1]))),a4[2]),o7(t55(o7(e8(E4,M5),s7[1]),t55(o7(e8(R6,b4),-r7[1]),o7(e8(P6,_3),a4[1]))),-l10[2]))),-c7[3]),o7(t55(t55(o7(t55(o7(e8(F7,A7),r7[1]),t55(o7(e8(k5,C6),-a4[1]),o7(e8(E4,M5),c7[1]))),s7[2]),o7(t55(o7(e8(F7,A7),s7[1]),t55(o7(e8(z5,x4),-a4[1]),o7(e8(R6,b4),c7[1]))),-r7[2])),t55(o7(t55(o7(e8(k5,C6),s7[1]),t55(o7(e8(z5,x4),-r7[1]),o7(e8(P6,_3),c7[1]))),a4[2]),o7(t55(o7(e8(E4,M5),s7[1]),t55(o7(e8(R6,b4),-r7[1]),o7(e8(P6,_3),a4[1]))),-c7[2]))),l10[3])),t55(o7(t55(t55(o7(t55(o7(e8(W6,j5),a4[1]),t55(o7(e8(H3,O3),-c7[1]),o7(e8(F7,A7),l10[1]))),s7[2]),o7(t55(o7(e8(W6,j5),s7[1]),t55(o7(e8($3,v3),-c7[1]),o7(e8(z5,x4),l10[1]))),-a4[2])),t55(o7(t55(o7(e8(H3,O3),s7[1]),t55(o7(e8($3,v3),-a4[1]),o7(e8(R6,b4),l10[1]))),c7[2]),o7(t55(o7(e8(F7,A7),s7[1]),t55(o7(e8(z5,x4),-a4[1]),o7(e8(R6,b4),c7[1]))),-l10[2]))),i6[3]),o7(t55(t55(o7(t55(o7(e8(W6,j5),a4[1]),t55(o7(e8(H3,O3),-c7[1]),o7(e8(F7,A7),l10[1]))),i6[2]),o7(t55(o7(e8(W6,j5),i6[1]),t55(o7(e8(X5,g4),-c7[1]),o7(e8(D4,m4),l10[1]))),-a4[2])),t55(o7(t55(o7(e8(H3,O3),i6[1]),t55(o7(e8(X5,g4),-a4[1]),o7(e8(w4,p6),l10[1]))),c7[2]),o7(t55(o7(e8(F7,A7),i6[1]),t55(o7(e8(D4,m4),-a4[1]),o7(e8(w4,p6),c7[1]))),-l10[2]))),-s7[3])))),t55(t55(t55(o7(t55(t55(o7(t55(o7(e8(W6,j5),s7[1]),t55(o7(e8($3,v3),-c7[1]),o7(e8(z5,x4),l10[1]))),i6[2]),o7(t55(o7(e8(W6,j5),i6[1]),t55(o7(e8(X5,g4),-c7[1]),o7(e8(D4,m4),l10[1]))),-s7[2])),t55(o7(t55(o7(e8($3,v3),i6[1]),t55(o7(e8(X5,g4),-s7[1]),o7(e8(y3,d6),l10[1]))),c7[2]),o7(t55(o7(e8(z5,x4),i6[1]),t55(o7(e8(D4,m4),-s7[1]),o7(e8(y3,d6),c7[1]))),-l10[2]))),a4[3]),o7(t55(t55(o7(t55(o7(e8(H3,O3),s7[1]),t55(o7(e8($3,v3),-a4[1]),o7(e8(R6,b4),l10[1]))),i6[2]),o7(t55(o7(e8(H3,O3),i6[1]),t55(o7(e8(X5,g4),-a4[1]),o7(e8(w4,p6),l10[1]))),-s7[2])),t55(o7(t55(o7(e8($3,v3),i6[1]),t55(o7(e8(X5,g4),-s7[1]),o7(e8(y3,d6),l10[1]))),a4[2]),o7(t55(o7(e8(R6,b4),i6[1]),t55(o7(e8(w4,p6),-s7[1]),o7(e8(y3,d6),a4[1]))),-l10[2]))),-c7[3])),t55(o7(t55(t55(o7(t55(o7(e8(F7,A7),s7[1]),t55(o7(e8(z5,x4),-a4[1]),o7(e8(R6,b4),c7[1]))),i6[2]),o7(t55(o7(e8(F7,A7),i6[1]),t55(o7(e8(D4,m4),-a4[1]),o7(e8(w4,p6),c7[1]))),-s7[2])),t55(o7(t55(o7(e8(z5,x4),i6[1]),t55(o7(e8(D4,m4),-s7[1]),o7(e8(y3,d6),c7[1]))),a4[2]),o7(t55(o7(e8(R6,b4),i6[1]),t55(o7(e8(w4,p6),-s7[1]),o7(e8(y3,d6),a4[1]))),-c7[2]))),l10[3]),o7(t55(t55(o7(t55(o7(e8(H3,O3),r7[1]),t55(o7(e8(B5,N3),-a4[1]),o7(e8(E4,M5),l10[1]))),s7[2]),o7(t55(o7(e8(H3,O3),s7[1]),t55(o7(e8($3,v3),-a4[1]),o7(e8(R6,b4),l10[1]))),-r7[2])),t55(o7(t55(o7(e8(B5,N3),s7[1]),t55(o7(e8($3,v3),-r7[1]),o7(e8(P6,_3),l10[1]))),a4[2]),o7(t55(o7(e8(E4,M5),s7[1]),t55(o7(e8(R6,b4),-r7[1]),o7(e8(P6,_3),a4[1]))),-l10[2]))),i6[3]))),t55(t55(o7(t55(t55(o7(t55(o7(e8(H3,O3),r7[1]),t55(o7(e8(B5,N3),-a4[1]),o7(e8(E4,M5),l10[1]))),i6[2]),o7(t55(o7(e8(H3,O3),i6[1]),t55(o7(e8(X5,g4),-a4[1]),o7(e8(w4,p6),l10[1]))),-r7[2])),t55(o7(t55(o7(e8(B5,N3),i6[1]),t55(o7(e8(X5,g4),-r7[1]),o7(e8(I4,u10),l10[1]))),a4[2]),o7(t55(o7(e8(E4,M5),i6[1]),t55(o7(e8(w4,p6),-r7[1]),o7(e8(I4,u10),a4[1]))),-l10[2]))),-s7[3]),o7(t55(t55(o7(t55(o7(e8(H3,O3),s7[1]),t55(o7(e8($3,v3),-a4[1]),o7(e8(R6,b4),l10[1]))),i6[2]),o7(t55(o7(e8(H3,O3),i6[1]),t55(o7(e8(X5,g4),-a4[1]),o7(e8(w4,p6),l10[1]))),-s7[2])),t55(o7(t55(o7(e8($3,v3),i6[1]),t55(o7(e8(X5,g4),-s7[1]),o7(e8(y3,d6),l10[1]))),a4[2]),o7(t55(o7(e8(R6,b4),i6[1]),t55(o7(e8(w4,p6),-s7[1]),o7(e8(y3,d6),a4[1]))),-l10[2]))),r7[3])),t55(o7(t55(t55(o7(t55(o7(e8(B5,N3),s7[1]),t55(o7(e8($3,v3),-r7[1]),o7(e8(P6,_3),l10[1]))),i6[2]),o7(t55(o7(e8(B5,N3),i6[1]),t55(o7(e8(X5,g4),-r7[1]),o7(e8(I4,u10),l10[1]))),-s7[2])),t55(o7(t55(o7(e8($3,v3),i6[1]),t55(o7(e8(X5,g4),-s7[1]),o7(e8(y3,d6),l10[1]))),r7[2]),o7(t55(o7(e8(P6,_3),i6[1]),t55(o7(e8(I4,u10),-s7[1]),o7(e8(y3,d6),r7[1]))),-l10[2]))),-a4[3]),o7(t55(t55(o7(t55(o7(e8(E4,M5),s7[1]),t55(o7(e8(R6,b4),-r7[1]),o7(e8(P6,_3),a4[1]))),i6[2]),o7(t55(o7(e8(E4,M5),i6[1]),t55(o7(e8(w4,p6),-r7[1]),o7(e8(I4,u10),a4[1]))),-s7[2])),t55(o7(t55(o7(e8(R6,b4),i6[1]),t55(o7(e8(w4,p6),-s7[1]),o7(e8(y3,d6),a4[1]))),r7[2]),o7(t55(o7(e8(P6,_3),i6[1]),t55(o7(e8(I4,u10),-s7[1]),o7(e8(y3,d6),r7[1]))),-a4[2]))),l10[3]))))),U5=t55(t55(t55(o7(t55(t55(o7(t55(o7(e8(W6,j5),a4[1]),t55(o7(e8(H3,O3),-c7[1]),o7(e8(F7,A7),l10[1]))),r7[2]),o7(t55(o7(e8(W6,j5),r7[1]),t55(o7(e8(B5,N3),-c7[1]),o7(e8(k5,C6),l10[1]))),-a4[2])),t55(o7(t55(o7(e8(H3,O3),r7[1]),t55(o7(e8(B5,N3),-a4[1]),o7(e8(E4,M5),l10[1]))),c7[2]),o7(t55(o7(e8(F7,A7),r7[1]),t55(o7(e8(k5,C6),-a4[1]),o7(e8(E4,M5),c7[1]))),-l10[2]))),i6[3]),t55(o7(t55(t55(o7(t55(o7(e8(W6,j5),a4[1]),t55(o7(e8(H3,O3),-c7[1]),o7(e8(F7,A7),l10[1]))),i6[2]),o7(t55(o7(e8(W6,j5),i6[1]),t55(o7(e8(X5,g4),-c7[1]),o7(e8(D4,m4),l10[1]))),-a4[2])),t55(o7(t55(o7(e8(H3,O3),i6[1]),t55(o7(e8(X5,g4),-a4[1]),o7(e8(w4,p6),l10[1]))),c7[2]),o7(t55(o7(e8(F7,A7),i6[1]),t55(o7(e8(D4,m4),-a4[1]),o7(e8(w4,p6),c7[1]))),-l10[2]))),-r7[3]),o7(t55(t55(o7(t55(o7(e8(W6,j5),r7[1]),t55(o7(e8(B5,N3),-c7[1]),o7(e8(k5,C6),l10[1]))),i6[2]),o7(t55(o7(e8(W6,j5),i6[1]),t55(o7(e8(X5,g4),-c7[1]),o7(e8(D4,m4),l10[1]))),-r7[2])),t55(o7(t55(o7(e8(B5,N3),i6[1]),t55(o7(e8(X5,g4),-r7[1]),o7(e8(I4,u10),l10[1]))),c7[2]),o7(t55(o7(e8(k5,C6),i6[1]),t55(o7(e8(D4,m4),-r7[1]),o7(e8(I4,u10),c7[1]))),-l10[2]))),a4[3]))),t55(t55(o7(t55(t55(o7(t55(o7(e8(H3,O3),r7[1]),t55(o7(e8(B5,N3),-a4[1]),o7(e8(E4,M5),l10[1]))),i6[2]),o7(t55(o7(e8(H3,O3),i6[1]),t55(o7(e8(X5,g4),-a4[1]),o7(e8(w4,p6),l10[1]))),-r7[2])),t55(o7(t55(o7(e8(B5,N3),i6[1]),t55(o7(e8(X5,g4),-r7[1]),o7(e8(I4,u10),l10[1]))),a4[2]),o7(t55(o7(e8(E4,M5),i6[1]),t55(o7(e8(w4,p6),-r7[1]),o7(e8(I4,u10),a4[1]))),-l10[2]))),-c7[3]),o7(t55(t55(o7(t55(o7(e8(F7,A7),r7[1]),t55(o7(e8(k5,C6),-a4[1]),o7(e8(E4,M5),c7[1]))),i6[2]),o7(t55(o7(e8(F7,A7),i6[1]),t55(o7(e8(D4,m4),-a4[1]),o7(e8(w4,p6),c7[1]))),-r7[2])),t55(o7(t55(o7(e8(k5,C6),i6[1]),t55(o7(e8(D4,m4),-r7[1]),o7(e8(I4,u10),c7[1]))),a4[2]),o7(t55(o7(e8(E4,M5),i6[1]),t55(o7(e8(w4,p6),-r7[1]),o7(e8(I4,u10),a4[1]))),-c7[2]))),l10[3])),t55(o7(t55(t55(o7(t55(o7(e8(W6,j5),r7[1]),t55(o7(e8(B5,N3),-c7[1]),o7(e8(k5,C6),l10[1]))),s7[2]),o7(t55(o7(e8(W6,j5),s7[1]),t55(o7(e8($3,v3),-c7[1]),o7(e8(z5,x4),l10[1]))),-r7[2])),t55(o7(t55(o7(e8(B5,N3),s7[1]),t55(o7(e8($3,v3),-r7[1]),o7(e8(P6,_3),l10[1]))),c7[2]),o7(t55(o7(e8(k5,C6),s7[1]),t55(o7(e8(z5,x4),-r7[1]),o7(e8(P6,_3),c7[1]))),-l10[2]))),i6[3]),o7(t55(t55(o7(t55(o7(e8(W6,j5),r7[1]),t55(o7(e8(B5,N3),-c7[1]),o7(e8(k5,C6),l10[1]))),i6[2]),o7(t55(o7(e8(W6,j5),i6[1]),t55(o7(e8(X5,g4),-c7[1]),o7(e8(D4,m4),l10[1]))),-r7[2])),t55(o7(t55(o7(e8(B5,N3),i6[1]),t55(o7(e8(X5,g4),-r7[1]),o7(e8(I4,u10),l10[1]))),c7[2]),o7(t55(o7(e8(k5,C6),i6[1]),t55(o7(e8(D4,m4),-r7[1]),o7(e8(I4,u10),c7[1]))),-l10[2]))),-s7[3])))),t55(t55(t55(o7(t55(t55(o7(t55(o7(e8(W6,j5),s7[1]),t55(o7(e8($3,v3),-c7[1]),o7(e8(z5,x4),l10[1]))),i6[2]),o7(t55(o7(e8(W6,j5),i6[1]),t55(o7(e8(X5,g4),-c7[1]),o7(e8(D4,m4),l10[1]))),-s7[2])),t55(o7(t55(o7(e8($3,v3),i6[1]),t55(o7(e8(X5,g4),-s7[1]),o7(e8(y3,d6),l10[1]))),c7[2]),o7(t55(o7(e8(z5,x4),i6[1]),t55(o7(e8(D4,m4),-s7[1]),o7(e8(y3,d6),c7[1]))),-l10[2]))),r7[3]),o7(t55(t55(o7(t55(o7(e8(B5,N3),s7[1]),t55(o7(e8($3,v3),-r7[1]),o7(e8(P6,_3),l10[1]))),i6[2]),o7(t55(o7(e8(B5,N3),i6[1]),t55(o7(e8(X5,g4),-r7[1]),o7(e8(I4,u10),l10[1]))),-s7[2])),t55(o7(t55(o7(e8($3,v3),i6[1]),t55(o7(e8(X5,g4),-s7[1]),o7(e8(y3,d6),l10[1]))),r7[2]),o7(t55(o7(e8(P6,_3),i6[1]),t55(o7(e8(I4,u10),-s7[1]),o7(e8(y3,d6),r7[1]))),-l10[2]))),-c7[3])),t55(o7(t55(t55(o7(t55(o7(e8(k5,C6),s7[1]),t55(o7(e8(z5,x4),-r7[1]),o7(e8(P6,_3),c7[1]))),i6[2]),o7(t55(o7(e8(k5,C6),i6[1]),t55(o7(e8(D4,m4),-r7[1]),o7(e8(I4,u10),c7[1]))),-s7[2])),t55(o7(t55(o7(e8(z5,x4),i6[1]),t55(o7(e8(D4,m4),-s7[1]),o7(e8(y3,d6),c7[1]))),r7[2]),o7(t55(o7(e8(P6,_3),i6[1]),t55(o7(e8(I4,u10),-s7[1]),o7(e8(y3,d6),r7[1]))),-c7[2]))),l10[3]),o7(t55(t55(o7(t55(o7(e8(F7,A7),r7[1]),t55(o7(e8(k5,C6),-a4[1]),o7(e8(E4,M5),c7[1]))),s7[2]),o7(t55(o7(e8(F7,A7),s7[1]),t55(o7(e8(z5,x4),-a4[1]),o7(e8(R6,b4),c7[1]))),-r7[2])),t55(o7(t55(o7(e8(k5,C6),s7[1]),t55(o7(e8(z5,x4),-r7[1]),o7(e8(P6,_3),c7[1]))),a4[2]),o7(t55(o7(e8(E4,M5),s7[1]),t55(o7(e8(R6,b4),-r7[1]),o7(e8(P6,_3),a4[1]))),-c7[2]))),i6[3]))),t55(t55(o7(t55(t55(o7(t55(o7(e8(F7,A7),r7[1]),t55(o7(e8(k5,C6),-a4[1]),o7(e8(E4,M5),c7[1]))),i6[2]),o7(t55(o7(e8(F7,A7),i6[1]),t55(o7(e8(D4,m4),-a4[1]),o7(e8(w4,p6),c7[1]))),-r7[2])),t55(o7(t55(o7(e8(k5,C6),i6[1]),t55(o7(e8(D4,m4),-r7[1]),o7(e8(I4,u10),c7[1]))),a4[2]),o7(t55(o7(e8(E4,M5),i6[1]),t55(o7(e8(w4,p6),-r7[1]),o7(e8(I4,u10),a4[1]))),-c7[2]))),-s7[3]),o7(t55(t55(o7(t55(o7(e8(F7,A7),s7[1]),t55(o7(e8(z5,x4),-a4[1]),o7(e8(R6,b4),c7[1]))),i6[2]),o7(t55(o7(e8(F7,A7),i6[1]),t55(o7(e8(D4,m4),-a4[1]),o7(e8(w4,p6),c7[1]))),-s7[2])),t55(o7(t55(o7(e8(z5,x4),i6[1]),t55(o7(e8(D4,m4),-s7[1]),o7(e8(y3,d6),c7[1]))),a4[2]),o7(t55(o7(e8(R6,b4),i6[1]),t55(o7(e8(w4,p6),-s7[1]),o7(e8(y3,d6),a4[1]))),-c7[2]))),r7[3])),t55(o7(t55(t55(o7(t55(o7(e8(k5,C6),s7[1]),t55(o7(e8(z5,x4),-r7[1]),o7(e8(P6,_3),c7[1]))),i6[2]),o7(t55(o7(e8(k5,C6),i6[1]),t55(o7(e8(D4,m4),-r7[1]),o7(e8(I4,u10),c7[1]))),-s7[2])),t55(o7(t55(o7(e8(z5,x4),i6[1]),t55(o7(e8(D4,m4),-s7[1]),o7(e8(y3,d6),c7[1]))),r7[2]),o7(t55(o7(e8(P6,_3),i6[1]),t55(o7(e8(I4,u10),-s7[1]),o7(e8(y3,d6),r7[1]))),-c7[2]))),-a4[3]),o7(t55(t55(o7(t55(o7(e8(E4,M5),s7[1]),t55(o7(e8(R6,b4),-r7[1]),o7(e8(P6,_3),a4[1]))),i6[2]),o7(t55(o7(e8(E4,M5),i6[1]),t55(o7(e8(w4,p6),-r7[1]),o7(e8(I4,u10),a4[1]))),-s7[2])),t55(o7(t55(o7(e8(R6,b4),i6[1]),t55(o7(e8(w4,p6),-s7[1]),o7(e8(y3,d6),a4[1]))),r7[2]),o7(t55(o7(e8(P6,_3),i6[1]),t55(o7(e8(I4,u10),-s7[1]),o7(e8(y3,d6),r7[1]))),-a4[2]))),c7[3]))))),G3=e8(V4,U5);return G3[G3.length-1]}}var d4=[function(){return 0},function(){return 0},function(){return 0}];function u6(t55){var e8=d4[t55.length];return e8||(e8=d4[t55.length]=r6(t55.length)),e8.apply(void 0,t55)}function p5(t55,e8,n4,o7,i6,s7,r7,a4){return function(e10,n5,c7,l10,h4,d6){switch(arguments.length){case 0:case 1:return 0;case 2:return o7(e10,n5);case 3:return i6(e10,n5,c7);case 4:return s7(e10,n5,c7,l10);case 5:return r7(e10,n5,c7,l10,h4);case 6:return a4(e10,n5,c7,l10,h4,d6)}for(var u10=new Array(arguments.length),p6=0;p6<arguments.length;++p6)u10[p6]=arguments[p6];return t55(u10)}}(function(){for(;d4.length<=6;)d4.push(r6(d4.length));e7.exports=p5.apply(void 0,[u6].concat(d4));for(var t55=0;t55<=6;++t55)e7.exports[t55]=d4[t55]})()}}),N2=r4({"node_modules/cdt2d/lib/delaunay.js"(t54,e7){var n3=C5()[4];y();function o6(t55,e8,o7,i3,s6,r6){var a3=e8.opposite(i3,s6);if(!(a3<0)){if(s6<i3){var c6=i3;i3=s6,s6=c6,c6=r6,r6=a3,a3=c6}e8.isConstraint(i3,s6)||n3(t55[i3],t55[s6],t55[r6],t55[a3])<0&&o7.push(i3,s6)}}e7.exports=function(t55,e8){for(var i3=[],s6=t55.length,r6=e8.stars,a3=0;a3<s6;++a3)for(var c6=r6[a3],l7=1;l7<c6.length;l7+=2)if(!((p5=c6[l7])<a3)&&!e8.isConstraint(a3,p5)){for(var h3=c6[l7-1],d4=-1,u6=1;u6<c6.length;u6+=2)if(c6[u6-1]===p5){d4=c6[u6];break}d4<0||n3(t55[a3],t55[p5],t55[h3],t55[d4])<0&&i3.push(a3,p5)}for(;i3.length>0;){for(var p5=i3.pop(),m4=(h3=-1,d4=-1,c6=r6[a3=i3.pop()],1);m4<c6.length;m4+=2){var g4=c6[m4-1],f4=c6[m4];g4===p5?d4=f4:f4===p5&&(h3=g4)}h3<0||d4<0||n3(t55[a3],t55[p5],t55[h3],t55[d4])>=0||(e8.flip(a3,p5),o6(t55,e8,i3,h3,a3,d4),o6(t55,e8,i3,a3,d4,h3),o6(t55,e8,i3,d4,p5,h3),o6(t55,e8,i3,p5,h3,d4))}}}}),T3=r4({"node_modules/cdt2d/lib/filter.js"(t54,e7){var n3=y();function o6(t55,e8,n4,o7,i6,s6,r6){this.cells=t55,this.neighbor=e8,this.flags=o7,this.constraint=n4,this.active=i6,this.next=s6,this.boundary=r6}function i3(t55,e8){return t55[0]-e8[0]||t55[1]-e8[1]||t55[2]-e8[2]}e7.exports=function(t55,e8,n4){var s6=(function(t56,e10){for(var n5=t56.cells(),s7=n5.length,r7=0;r7<s7;++r7){var a4=(y4=n5[r7])[0],c7=y4[1],l10=y4[2];c7<l10?c7<a4&&(y4[0]=c7,y4[1]=l10,y4[2]=a4):l10<a4&&(y4[0]=l10,y4[1]=a4,y4[2]=c7)}n5.sort(i3);var h4=new Array(s7);for(r7=0;r7<h4.length;++r7)h4[r7]=0;var d6=[],u10=[],p6=new Array(3*s7),m5=new Array(3*s7),g5=null;e10&&(g5=[]);var f6=new o6(n5,p6,m5,h4,d6,u10,g5);for(r7=0;r7<s7;++r7)for(var y4=n5[r7],_3=0;_3<3;++_3){a4=y4[_3],c7=y4[(_3+1)%3];var b4=p6[3*r7+_3]=f6.locate(c7,a4,t56.opposite(c7,a4)),x4=m5[3*r7+_3]=t56.isConstraint(a4,c7);b4<0&&(x4?u10.push(r7):(d6.push(r7),h4[r7]=1),e10&&g5.push([c7,a4,-1]))}return f6})(t55,n4);if(e8===0)return n4?s6.cells.concat(s6.boundary):s6.cells;for(var r6=1,a3=s6.active,c6=s6.next,l7=s6.flags,h3=s6.cells,d4=s6.constraint,u6=s6.neighbor;a3.length>0||c6.length>0;){for(;a3.length>0;){var p5=a3.pop();if(l7[p5]!==-r6){l7[p5]=r6,h3[p5];for(var m4=0;m4<3;++m4){var g4=u6[3*p5+m4];g4>=0&&l7[g4]===0&&(d4[3*p5+m4]?c6.push(g4):(a3.push(g4),l7[g4]=r6))}}}var f4=c6;c6=a3,a3=f4,c6.length=0,r6=-r6}var y3=(function(t56,e10,n5){for(var o7=0,i6=0;i6<t56.length;++i6)e10[i6]===n5&&(t56[o7++]=t56[i6]);return t56.length=o7,t56})(h3,l7,e8);return n4?y3.concat(s6.boundary):y3},o6.prototype.locate=(function(){var t55=[0,0,0];return function(e8,o7,s6){var r6=e8,a3=o7,c6=s6;return o7<s6?o7<e8&&(r6=o7,a3=s6,c6=e8):s6<e8&&(r6=s6,a3=e8,c6=o7),r6<0?-1:(t55[0]=r6,t55[1]=a3,t55[2]=c6,n3.eq(this.cells,t55,i3))}})()}}),w3=r4({"node_modules/cdt2d/cdt2d.js"(t54,e7){var n3=P2(),o6=M3(),i3=N2(),s6=T3();function r6(t55){return[Math.min(t55[0],t55[1]),Math.max(t55[0],t55[1])]}function a3(t55,e8){return t55[0]-e8[0]||t55[1]-e8[1]}function c6(t55,e8,n4){return e8 in t55?t55[e8]:n4}e7.exports=function(t55,e8,l7){Array.isArray(e8)?(l7=l7||{},e8=e8||[]):(l7=e8||{},e8=[]);var h3=!!c6(l7,"delaunay",!0),d4=!!c6(l7,"interior",!0),u6=!!c6(l7,"exterior",!0),p5=!!c6(l7,"infinity",!1);if(!d4&&!u6||t55.length===0)return[];var m4=n3(t55,e8);if(h3||d4!==u6||p5){for(var g4=o6(t55.length,(function(t56){return t56.map(r6).sort(a3)})(e8)),f4=0;f4<m4.length;++f4){var y3=m4[f4];g4.addTriangle(y3[0],y3[1],y3[2])}return h3&&i3(t55,g4),u6?d4?p5?s6(g4,0,p5):g4.cells():s6(g4,1,p5):s6(g4,-1)}return m4}}}),R5={0:"M0.301025 0.257813 L0.206593 0.283385 L0.122042 0.361307 L0.075923 0.474441 L0.064942 0.642221 L0.091296 0.78289 L0.159376 0.899463 L0.257104 0.961214 L0.344948 0.961214 L0.442678 0.899463 L0.510757 0.78289 L0.537111 0.642221 L0.526131 0.474441 L0.480012 0.361307 L0.39546 0.283385 L0.301025 0.257813",1:"M0.220426 0.40845 L0.381626 0.270996 L0.381626 0.948966",2:"M0.110409 0.39212 L0.125621 0.342293 L0.170571 0.295823 L0.244237 0.26431 L0.291518 0.257813 L0.373319 0.263799 L0.434683 0.290705 L0.468239 0.331966 L0.480292 0.379913 L0.479492 0.411806 L0.465088 0.465192 L0.402571 0.568988 L0.245134 0.766438 L0.07959 0.948045 L0.522462 0.948045",3:"M0.081606 0.345073 L0.119154 0.315633 L0.178996 0.284091 L0.255265 0.257813 L0.349133 0.263062 L0.43127 0.289348 L0.48994 0.336662 L0.525141 0.394491 L0.513407 0.457577 L0.466472 0.504892 L0.384334 0.541692 L0.290464 0.56272 L0.20833 0.573235 L0.290464 0.583749 L0.384334 0.610035 L0.466472 0.652092 L0.519274 0.709922 L0.531007 0.773007 L0.50754 0.841351 L0.454738 0.899179 L0.3726 0.946494 L0.310412 0.961214 L0.209503 0.959111 L0.127367 0.946494 L0.071046 0.929671",4:"M0.418494 0.270996 L0.048828 0.724199 L0.553224 0.724199 M0.414181 0.578167 L0.414181 0.94897",5:"M0.074951 0.270996 L0.074951 0.614701 L0.267655 0.5695 L0.405247 0.586502 L0.460002 0.617189 L0.498028 0.660731 L0.527101 0.779401 L0.513352 0.841049 L0.477274 0.889568 L0.406378 0.93463 L0.324445 0.958337 L0.247399 0.962139 L0.182516 0.949767 L0.130068 0.925508 L0.074951 0.875607 M0.074951 0.270996 L0.527101 0.270996",6:"M0.428549 0.257813 L0.341433 0.285053 L0.26073 0.312099 L0.192188 0.360182 L0.138902 0.410969 L0.098219 0.500422 L0.070249 0.584267 L0.067264 0.670716 L0.065164 0.756863 L0.087163 0.820973 L0.108168 0.861042 L0.157916 0.913131 L0.210981 0.948192 L0.29279 0.961214 L0.384548 0.956206 L0.456409 0.924151 L0.507262 0.881077 L0.5349 0.821975 L0.537111 0.771889 L0.521634 0.718798 L0.498418 0.67372 L0.463042 0.636657 L0.414398 0.613617 L0.34696 0.598591 L0.28284 0.595587 L0.215403 0.605604 L0.145756 0.641665 L0.109274 0.678729 L0.064942 0.724006",7:"M0.071534 0.270996 L0.530519 0.270996 L0.495935 0.291702 L0.477752 0.305407 L0.435186 0.346112 L0.412067 0.374136 L0.388565 0.40796 L0.365315 0.448098 L0.342943 0.495062 L0.322081 0.549366 L0.303364 0.611524 L0.287416 0.68205 L0.270077 0.80465 L0.26253 0.94897",8:"M0.286761 0.257813 L0.210684 0.27162 L0.1414 0.305622 L0.092494 0.382125 L0.111513 0.450128 L0.16857 0.502193 L0.228345 0.539382 L0.377781 0.594635 L0.470161 0.645637 L0.52586 0.706203 L0.538087 0.792269 L0.506841 0.87621 L0.438915 0.927212 L0.339743 0.961214 L0.263666 0.959089 L0.174004 0.929337 L0.102003 0.881523 L0.063965 0.811395 L0.066682 0.741266 L0.102003 0.671139 L0.180797 0.608448 L0.259591 0.580822 L0.358762 0.548945 L0.456576 0.49688 L0.486463 0.446941 L0.487822 0.362999 L0.453859 0.302434 L0.384574 0.265245 L0.286761 0.257813",9:"M0.511026 0.437812 L0.491026 0.347812 L0.451026 0.297812 L0.391026 0.267812 L0.311026 0.257813 L0.231026 0.267812 L0.161026 0.297812 L0.111026 0.347812 L0.091026 0.417812 L0.111026 0.487812 L0.161026 0.537812 L0.231026 0.567812 L0.311026 0.577812 L0.391026 0.557812 L0.451026 0.517812 L0.491026 0.477812 L0.511026 0.437812 M0.510026 0.438812 L0.434026 0.636812 L0.381026 0.777812 L0.337026 0.879812 L0.301026 0.957812","!":"M0.301026 0.270996 L0.301026 0.749566 M0.251466 0.94897 L0.350587 0.94897",'"':"M0.16504 0.270996 L0.16504 0.523022 M0.437013 0.270996 L0.437013 0.523022","#":"M0.20958 0.282227 L0.146515 0.949754 M0.461844 0.282227 L0.398779 0.949754 M0.032999 0.526969 L0.600587 0.452796 M0.001465 0.82366 L0.569055 0.749486",$:"M0.307121 0.240234 L0.307121 1.083502 M0.490031 0.415915 L0.404676 0.328075 L0.23396 0.310507 L0.136407 0.398347 L0.099828 0.521324 L0.124213 0.591596 L0.197379 0.644299 L0.429061 0.697003 L0.502224 0.749708 L0.526613 0.837547 L0.477836 0.960526 L0.355897 1.013228 L0.197379 0.99566 L0.112021 0.942957 L0.07544 0.837547","'":"M0.301026 0.270996 L0.301026 0.523022","(":"M0.413087 0.241211 L0.372337 0.28347 L0.331589 0.334184 L0.290838 0.393349 L0.25009 0.460965 L0.219528 0.528584 L0.199153 0.5962 L0.188966 0.655364 L0.199153 0.714529 L0.219528 0.782146 L0.25009 0.849764 L0.290838 0.91738 L0.331589 0.976544 L0.372337 1.027258 L0.413087 1.069491",")":"M0.188966 0.241211 L0.229716 0.28347 L0.270466 0.334184 L0.311213 0.393349 L0.351964 0.460965 L0.382526 0.528584 L0.4029 0.5962 L0.413087 0.655364 L0.4029 0.714529 L0.382526 0.782146 L0.351964 0.849764 L0.311213 0.91738 L0.270466 0.976544 L0.229716 1.027258 L0.188966 1.069491","*":"M0.301026 0.458702 L0.301026 0.681942 M0.301026 0.458702 L0.520997 0.536834 M0.301026 0.458702 L0.439954 0.257813 M0.301026 0.458702 L0.162098 0.257813 M0.301026 0.458702 L0.081055 0.536834","+":"M0.042969 0.66845 L0.559083 0.66845 M0.301023 0.428223 L0.301023 0.908661",",":"M0.38672 0.852051 L0.215333 1.030661 L0.301025 1.119971","-":"M0.173829 0.686035 L0.428224 0.686035",".":"M0.362549 0.851074 L0.239503 0.851074","/":"M0.062501 1.035249 L0.539551 0.270996","<":"M0.559083 0.441895 L0.042969 0.66939 L0.042969 0.66939 L0.559083 0.896902","=":"M0.042969 0.545898 L0.559083 0.545898 M0.042969 0.80837 L0.559083 0.80837",">":"M0.042969 0.441895 L0.559083 0.66939 L0.559083 0.66939 L0.042969 0.896902",A:"M0.018067 0.94897 L0.290179 0.270996 L0.583986 0.94897 M0.155303 0.684521 L0.433548 0.684521",B:"M0.063965 0.94897 L0.063965 0.278953 L0.209356 0.270996 L0.342486 0.294394 L0.432179 0.37292 L0.418224 0.48773 L0.312686 0.549166 L0.084728 0.575531 L0.306377 0.589434 L0.468877 0.647456 L0.538087 0.736658 L0.5324 0.85202 L0.501247 0.902983 L0.42355 0.944398 L0.063965 0.94897",C:"M0.529054 0.419847 L0.498425 0.345196 L0.442238 0.292341 L0.33583 0.257813 L0.257199 0.268357 L0.187906 0.303748 L0.120243 0.385432 L0.072998 0.599844 L0.110073 0.815385 L0.165381 0.902183 L0.222883 0.942801 L0.334904 0.961214 L0.43253 0.937679 L0.504816 0.868999 L0.529054 0.772065",D:"M0.064454 0.94897 L0.071838 0.285078 L0.171217 0.270996 L0.247348 0.272633 L0.37101 0.306078 L0.462461 0.378304 L0.514748 0.475555 L0.535591 0.576392 L0.537599 0.652313 L0.528065 0.717381 L0.508562 0.772419 L0.445948 0.855695 L0.362356 0.90871 L0.225203 0.945862 L0.064454 0.94897",E:"M0.080078 0.270996 L0.080078 0.94897 M0.080078 0.270996 L0.521974 0.270996 M0.080078 0.609981 L0.389405 0.609981 M0.080078 0.94897 L0.521974 0.94897",F:"M0.086426 0.270996 L0.086426 0.94897 M0.091304 0.275607 L0.515626 0.275607 M0.091304 0.607677 L0.447344 0.607677",G:"M0.498034 0.284943 L0.374621 0.257813 L0.244219 0.268648 L0.160577 0.311997 L0.094556 0.398116 L0.056397 0.58404 L0.076752 0.785532 L0.120865 0.858197 L0.188947 0.916734 L0.271008 0.953591 L0.357069 0.961214 L0.43715 0.932047 L0.501262 0.858539 L0.545656 0.648611 L0.329595 0.648131",H:"M0.066895 0.270996 L0.066895 0.94897 M0.066895 0.595658 L0.530009 0.595658 M0.535157 0.270996 L0.535157 0.94897",I:"M0.301026 0.270996 L0.301026 0.94897",J:"M0.506839 0.270996 L0.507814 0.782193 L0.498468 0.846168 L0.480733 0.880789 L0.455864 0.90832 L0.426095 0.929408 L0.360746 0.954812 L0.302508 0.962139 L0.223573 0.953638 L0.16538 0.930312 L0.137072 0.907715 L0.116428 0.880312 L0.102822 0.848819 L0.095633 0.813947 L0.094239 0.776413",K:"M0.035401 0.270996 L0.035401 0.94897 M0.502258 0.316194 L0.035401 0.687823 M0.212484 0.582361 L0.566652 0.933903",L:"M0.07544 0.270996 L0.07544 0.94897 L0.526613 0.94897",M:"M0.042481 0.94897 L0.042481 0.270996 L0.301027 0.712492 L0.559571 0.270996 L0.559571 0.94897",N:"M0.067871 0.94897 L0.067871 0.270996 L0.534181 0.94897 L0.525031 0.270996",O:"M0.287293 0.961214 L0.19843 0.933567 L0.1172 0.849451 L0.057129 0.563945 L0.114348 0.350255 L0.18455 0.289392 L0.306101 0.257813 L0.42054 0.29572 L0.487543 0.365003 L0.544923 0.625294 L0.516366 0.789624 L0.465476 0.884596 L0.375084 0.949287 L0.287293 0.961214",P:"M0.070557 0.94897 L0.070557 0.28379 L0.20704 0.270996 L0.329134 0.278993 L0.408525 0.300514 L0.444022 0.317908 L0.500637 0.368929 L0.525796 0.423728 L0.531496 0.50384 L0.508934 0.554205 L0.473724 0.582043 L0.417577 0.604365 L0.336375 0.620372 L0.226014 0.629268 L0.082368 0.630258",Q:"M0.282435 1.050813 L0.195447 1.019646 L0.115933 0.924817 L0.057129 0.602943 L0.113139 0.362034 L0.18186 0.293418 L0.300844 0.257813 L0.412868 0.300553 L0.478457 0.37866 L0.534625 0.672103 L0.506671 0.857367 L0.456855 0.964437 L0.368371 1.037368 L0.282435 1.050813 M0.341225 0.815559 L0.544923 1.070653",R:"M0.034912 0.944112 L0.034912 0.288556 L0.227127 0.270996 L0.362038 0.276867 L0.443423 0.294907 L0.477644 0.309614 L0.505809 0.328757 L0.526616 0.352817 L0.544963 0.418061 L0.543241 0.475921 L0.524463 0.517817 L0.49076 0.546518 L0.444265 0.564799 L0.355195 0.578739 L0.047653 0.589627 M0.303054 0.617306 L0.56714 0.94897",S:"M0.483037 0.364333 L0.407613 0.267477 L0.22883 0.257813 L0.128623 0.327565 L0.087712 0.455539 L0.104656 0.518727 L0.168054 0.573307 L0.41928 0.617318 L0.503796 0.669342 L0.535157 0.759324 L0.493846 0.900055 L0.367668 0.961214 L0.205436 0.956661 L0.116711 0.907038 L0.066895 0.790334",T:"M0.022949 0.270996 L0.579103 0.270996 M0.309284 0.270996 L0.309284 0.94897",U:"M0.072022 0.270996 L0.07308 0.648875 L0.080372 0.75167 L0.099024 0.827813 L0.134786 0.885729 L0.181571 0.924023 L0.251464 0.95168 L0.339655 0.962139 L0.401553 0.951668 L0.45232 0.924086 L0.482701 0.891771 L0.495745 0.870529 L0.515699 0.81637 L0.525014 0.744626 L0.530031 0.272017",V:"M0.027832 0.270996 L0.320083 0.94897 L0.57422 0.270996",W:"M0 0.270996 L0.079799 0.940377 L0.285198 0.472884 L0.505255 0.94897 L0.602052 0.270996",X:"M0.009034 0.270996 L0.586805 0.94897 M0.593019 0.270996 L0.015246 0.94897",Y:"M0.018067 0.270996 L0.293132 0.574135 M0.583986 0.271959 L0.294954 0.57606 L0.305277 0.94897",Z:"M0.053711 0.270996 L0.548341 0.270996 L0.053711 0.94897 L0.548341 0.94897","[":"M0.404542 0.240234 L0.197511 0.240234 L0.197511 1.069424 L0.404542 1.069424","\\":"M0.062501 0.270996 L0.539551 1.035249","]":"M0.19751 0.240234 L0.404542 0.240234 L0.404542 1.069424 L0.19751 1.069424","^":"M0.035156 0.523931 L0.301024 0.270996 L0.566896 0.523931",_:"M0 1.160601 L0.602052 1.160601",a:"M0.527101 0.439941 L0.527101 0.973965 M0.527101 0.553824 L0.451366 0.477535 L0.376759 0.439941 L0.263722 0.439941 L0.187989 0.477535 L0.112255 0.553824 L0.074951 0.66881 L0.074951 0.745099 L0.112255 0.85898 L0.187989 0.93527 L0.263722 0.973965 L0.376759 0.973965 L0.451366 0.93527 L0.527101 0.85898",b:"M0.07666 0.240234 L0.07666 0.959985 M0.07666 0.582737 L0.151822 0.514237 L0.225865 0.480483 L0.338045 0.480483 L0.413211 0.514237 L0.488374 0.582737 L0.525392 0.685983 L0.525392 0.754485 L0.488374 0.856739 L0.413211 0.92524 L0.338045 0.959985 L0.225865 0.959985 L0.151822 0.92524 L0.07666 0.856739",c:"M0.512452 0.553823 L0.441624 0.477535 L0.371854 0.439941 L0.26614 0.439941 L0.195312 0.477535 L0.124486 0.553823 L0.0896 0.668808 L0.0896 0.745099 L0.124486 0.858979 L0.195312 0.93527 L0.26614 0.973965 L0.371854 0.973965 L0.441624 0.93527 L0.512452 0.858979",d:"M0.525392 0.240234 L0.525392 0.959985 M0.525392 0.582737 L0.450232 0.514237 L0.376189 0.480483 L0.264006 0.480483 L0.188844 0.514237 L0.11368 0.582737 L0.076661 0.685983 L0.076661 0.754485 L0.11368 0.856739 L0.188844 0.92524 L0.264006 0.959985 L0.376189 0.959985 L0.450232 0.92524 L0.525392 0.856739",e:"M0.059571 0.668808 L0.542482 0.668808 M0.542482 0.592521 L0.502641 0.516231 L0.461594 0.477535 L0.381914 0.439941 L0.261186 0.439941 L0.180299 0.477535 L0.099412 0.553823 L0.059571 0.668808 L0.059571 0.745099 L0.099412 0.858979 L0.180299 0.93527 L0.261186 0.973965 L0.381914 0.973965 L0.461594 0.93527 L0.542482 0.858979",f:"M0.512941 0.240234 L0.406984 0.240234 L0.301026 0.274346 L0.248047 0.374731 L0.248047 0.946817 M0.089112 0.476088 L0.459965 0.476088",g:"M0.525392 0.439941 L0.525392 0.989395 L0.488373 1.091918 L0.45023 1.126757 L0.376189 1.160601 L0.264004 1.160601 L0.188844 1.126757 L0.113681 1.058075 L0.076661 0.954555 M0.525392 0.542467 L0.45023 0.473786 L0.376189 0.439941 L0.264004 0.439941 L0.188844 0.473786 L0.113681 0.542467 L0.076661 0.645988 L0.076661 0.714669 L0.113681 0.817193 L0.188844 0.885875 L0.264004 0.920713 L0.376189 0.920713 L0.45023 0.885875 L0.525392 0.817193",h:"M0.092041 0.240234 L0.092041 0.946817 M0.092041 0.61058 L0.205937 0.509225 L0.282214 0.476086 L0.396109 0.476086 L0.47187 0.509225 L0.510011 0.61058 L0.510011 0.946817",i:"M0.261026 0.240234 L0.341026 0.240234 M0.300978 0.476089 L0.300978 0.946817",j:"M0.3853 0.240234 L0.447023 0.240234 M0.416159 0.465708 L0.416159 1.011689 L0.383887 1.108586 L0.252832 1.140264 L0.15503 1.108586",k:"M0.065186 0.240234 L0.065186 0.946817 M0.493824 0.476086 L0.065186 0.812323 M0.236758 0.677829 L0.536867 0.946817",l:"M0.301026 0.234863 L0.301026 0.946441",m:"M0.050538 0.439941 L0.050538 0.960796 M0.050538 0.588758 L0.114405 0.476607 L0.157178 0.439941 L0.236864 0.439941 L0.279637 0.476607 L0.32241 0.588758 L0.32241 0.960796 M0.32241 0.588758 L0.386281 0.476607 L0.428467 0.439941 L0.50874 0.439941 L0.551515 0.476607 L0.551515 0.960796",n:"M0.092041 0.439941 L0.092041 0.960796 M0.092041 0.588758 L0.205936 0.476607 L0.282216 0.439941 L0.396113 0.439941 L0.471871 0.476607 L0.510011 0.588758 L0.510011 0.960796",o:"M0.247175 0.439941 L0.175178 0.477535 L0.103186 0.553823 L0.066895 0.668808 L0.066895 0.745099 L0.103186 0.858979 L0.175178 0.93527 L0.247175 0.973965 L0.354874 0.973965 L0.426872 0.93527 L0.498866 0.858979 L0.535157 0.745099 L0.535157 0.668808 L0.498866 0.553823 L0.426872 0.477535 L0.354874 0.439941 L0.247175 0.439941",p:"M0.076904 0.439941 L0.076904 1.154244 M0.076904 0.541563 L0.151986 0.473487 L0.225944 0.439941 L0.338005 0.439941 L0.413087 0.473487 L0.488166 0.541563 L0.525148 0.644169 L0.525148 0.712246 L0.488166 0.813866 L0.413087 0.881942 L0.338005 0.916471 L0.225944 0.916471 L0.151986 0.881942 L0.076904 0.813866",q:"M0.525148 0.441895 L0.525148 1.156195 M0.525148 0.5435 L0.450067 0.47544 L0.376106 0.441895 L0.264042 0.441895 L0.188966 0.47544 L0.113885 0.5435 L0.076905 0.646108 L0.076905 0.714187 L0.113885 0.815809 L0.188966 0.883886 L0.264042 0.918418 L0.376106 0.918418 L0.450067 0.883886 L0.525148 0.815809",r:"M0.107422 0.439941 L0.107422 0.960796 M0.107422 0.663164 L0.155824 0.551014 L0.252626 0.476607 L0.349428 0.439941 L0.49463 0.439941",s:"M0.475556 0.477535 L0.400757 0.439941 L0.276092 0.439941 L0.176361 0.477535 L0.101563 0.553823 L0.101563 0.630112 L0.176361 0.668808 L0.301024 0.668808 L0.425688 0.745099 L0.50049 0.821387 L0.50049 0.897677 L0.425688 0.93527 L0.325956 0.973965 L0.201295 0.973965 L0.126496 0.93527 L0.101563 0.858979",t:"M0.246032 0.297852 L0.246032 0.826549 L0.301023 0.919323 L0.411011 0.950848 L0.520997 0.950848 M0.081055 0.515799 L0.466004 0.515799",u:"M0.092041 0.454102 L0.092041 0.826134 L0.13018 0.937211 L0.205936 0.974954 L0.319832 0.974954 L0.396113 0.937211 L0.510011 0.826134 M0.510011 0.454102 L0.510011 0.974954",v:"M0.048828 0.453125 L0.301026 0.961719 M0.553224 0.453125 L0.301026 0.961719",w:"M0 0.453125 L0.150512 0.961719 M0.301024 0.453125 L0.150512 0.961719 M0.301024 0.453125 L0.451539 0.961719 M0.602052 0.453125 L0.451539 0.961719",x:"M0.03711 0.453125 L0.564943 0.961719 M0.564943 0.453125 L0.03711 0.961719",y:"M0.084618 0.453125 L0.320232 0.921476 M0.55713 0.453125 L0.320232 0.921476 L0.242119 1.055289 L0.163369 1.122196 L0.084618 1.155166 L0.044922 1.155166",z:"M0.505373 0.452148 L0.09668 0.961651 M0.09668 0.452148 L0.505373 0.452148 M0.09668 0.961651 L0.505373 0.961651"},E3={};for(let t54 in R5){E3[t54]=[];let e7=R5[t54].split("M").slice(1).map(t55=>t55.split("L").map(t56=>t56.trim().split(" ").map(parseFloat)));for(let n3 of e7)for(let e8=0;e8<n3.length-1;e8++)E3[t54].push({x1:n3[e8][0],y1:1-n3[e8][1],x2:n3[e8+1][0],y2:1-n3[e8+1][1]})}new TextEncoder,(()=>{let t54=new Uint8Array(4);new Uint32Array(t54.buffer)[0]=1,t54[0]})(),globalThis.Int8Array,globalThis.Uint8Array,globalThis.Int16Array,globalThis.Uint16Array,globalThis.Int32Array,globalThis.Uint32Array,globalThis.BigUint64Array,globalThis.BigInt64Array,globalThis.Float32Array,globalThis.Float64Array;var A6=[];for(let t54=0;t54<256;t54++){let e7=t54;for(let t55=0;t55<8;t55++)1&e7?e7=3988292384^e7>>>1:e7>>>=1;A6[t54]=e7}var O2=new Uint16Array([255]),L3=(new Uint8Array(O2.buffer)[0],new Uint16Array([255]));new Uint8Array(L3.buffer)[0],new Uint8Array(0),Uint8Array.of(137,80,78,71,13,10,26,10),new TextDecoder("latin1");function D3(){return D3=Object.assign?Object.assign.bind():function(t54){for(var e7=1;e7<arguments.length;e7++){var n3=arguments[e7];for(var o6 in n3)({}).hasOwnProperty.call(n3,o6)&&(t54[o6]=n3[o6])}return t54},D3.apply(null,arguments)}function z3(t54,e7){return(z3=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t55,e8){return t55.__proto__=e8,t55})(t54,e7)}function k3(t54){return(k3=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t55){return t55.__proto__||Object.getPrototypeOf(t55)})(t54)}function F6(){try{var t54=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(F6=function(){return!!t54})()}function j3(t54){var e7=typeof Map=="function"?new Map:void 0;return j3=function(t55){if(t55===null||!(function(t56){try{return Function.toString.call(t56).indexOf("[native code]")!==-1}catch{return typeof t56=="function"}})(t55))return t55;if(typeof t55!="function")throw new TypeError("Super expression must either be null or a function");if(e7!==void 0){if(e7.has(t55))return e7.get(t55);e7.set(t55,n3)}function n3(){return(function(t56,e8,n4){if(F6())return Reflect.construct.apply(null,arguments);var o6=[null];o6.push.apply(o6,e8);var i3=new(t56.bind.apply(t56,o6));return n4&&z3(i3,n4.prototype),i3})(t55,arguments,k3(this).constructor)}return n3.prototype=Object.create(t55.prototype,{constructor:{value:n3,enumerable:!1,writable:!0,configurable:!0}}),z3(n3,t55)},j3(t54)}var Y3={1:`Passed invalid arguments to hsl, please pass multiple numbers e.g. hsl(360, 0.75, 0.4) or an object e.g. rgb({ hue: 255, saturation: 0.4, lightness: 0.75 }).
337
+ `)?.every(str2=>str2.includes("LINESTRING"))}function isWktString(str){return str.startsWith("POINT")||isArrayOfPoints(str)||str.startsWith("LINESTRING")||isArrayOfLines(str)||str.startsWith("MULTILINESTRING")||str.startsWith("POLYGON")||str.startsWith("MULTIPOINT")||str.startsWith("MULTIPOLYGON")||str.startsWith("GEOMETRYCOLLECTION")}Flatten.isWktString=isWktString;Flatten.parseWKT=parseWKT;Flatten.BooleanOperations=BooleanOperations;Flatten.Relations=Relations;var package_default={name:"@tscircuit/capacity-autorouter",main:"./dist/index.js",version:"0.0.625",type:"module",files:["dist"],scripts:{start:"cosmos",build:"tsup ./lib/index.ts --minify terser --external @tscircuit/core --external circuit-to-svg --format esm --dts --sourcemap",bench:"bun test tests/spatial-index-bench.test.ts",format:"biome format --write .","format:check":"biome format .","vercel-build":"cosmos-export","run-sample":"bun scripts/run-sample.ts","repomix:lib":"repomix --ignore 'testing/**,**/TwoRouteHighDensitySolver/**,**/RouteStitchingSolver/**,solvers/CapacitySegmentPointOptimizer/CapacitySegmentPointOptimizer.ts' lib","bug-report":"bun run scripts/download-bug-report.ts","bug-report-with-test":"bun run scripts/create-bug-report-test.ts"},devDependencies:{"@biomejs/biome":"^1.9.4","@radix-ui/react-icons":"^1.3.2","@radix-ui/react-menubar":"^1.1.14","@react-hook/resize-observer":"^2.0.2","@resvg/resvg-js":"^2.6.2","@tsci/seveibar.dataset-srj13":"git+https://github.com/tscircuit/dataset-srj13.git#56db70039aeb28a76540fe951b5a96be60f9e949","@tsci/tscircuit.dataset-srj16-bga-breakouts":"git+https://github.com/tscircuit/dataset-srj16-bga-breakouts.git#e8b2e70e1f50a0dba3ad977e140766f53b9b75fb","@tsci/tscircuit.dataset-srj19-bga-passive-overlays":"git+https://github.com/tscircuit/dataset-srj19.git#5104d03ed72a9090d76ea1f42ae9f4bc439f7534","@tsci/tscircuit.dataset-srj20-partial-bga-breakouts":"git+https://github.com/tscircuit/dataset-srj20.git#9384fb8f45fb479b97178ddfa42fc74c69afbbec","@tsci/tscircuit.dataset-srj12-bus-routing":"git+https://github.com/tscircuit/dataset-srj12-bus-routing.git#ba82f86a7d1288566b7144eb8661ad2549c5f328","@tscircuit/autorouting-dataset-01":"git+https://github.com/tscircuit/autorouting-dataset-01.git#f9c0a8fe11e9bc05064bdafdf61f33eb38fa2b8e","@tscircuit/checks":"^0.0.126","@tscircuit/circuit-json-util":"^0.0.94","@tscircuit/core":"0.0.337","@tscircuit/curvy-trace-solver":"^0.0.10","@tscircuit/dataset-srj05":"git+https://github.com/tscircuit/dataset-srj05.git#9a49c126a89c083dc4d2b72cd17184735f637762","@tscircuit/fixed-via-hypergraph-solver":"https://codeload.github.com/tscircuit/fixed-via-hypergraph-solver/tar.gz/bed37a6201b5dd07c9cc68b828917ecc20d6d049","@tscircuit/hypergraph":"^0.0.71","@tscircuit/jumper-topology-generator":"^0.0.4","@tscircuit/krt-wasm":"^0.1.0","@tscircuit/math-utils":"^0.0.36","@tscircuit/rectdiff":"git+https://github.com/tscircuit/rectdiff.git#a26f062441ed6baa679655fe10374b01017dcf98","@tscircuit/solver-utils":"^0.0.16","@types/bun":"^1.2.23","@types/fast-json-stable-stringify":"^2.1.2","@types/object-hash":"^3.0.6","@types/rbush":"^4.0.0","@types/react":"^19.0.8","@types/react-dom":"^19.0.3","@vercel/node":"^5.1.7","@vitejs/plugin-react":"^4.3.4","bun-match-svg":"^0.0.14","circuit-json-to-connectivity-map":"^0.0.19","circuit-json":"^0.0.419","circuit-to-svg":"^0.0.220",clsx:"^2.1.1","dataset-srj11-45-degree":"git+https://github.com/tscircuit/dataset-srj11-45-degree.git#c49dd43c38f85fa2777c7d67393df413ca8d5a75","dataset-srj18":"git+https://github.com/tscircuit/dataset-srj18.git#fceb58cbb1b479561f45f37393a0a343b5bed62c",flatbush:"^4.4.0","graphics-debug":"0.0.94","high-density-dataset-z04":"git+https://github.com/tscircuit/high-density-dataset-z04.git#b9128ed52f5a50102b6526319be1d4ec33dca2c2","kicad-to-circuit-json":"0.0.77",kleur:"^4.1.5","looks-same":"9","pcb-poly-hyper-graph":"https://codeload.github.com/tscircuit/pcb-poly-hyper-graph/tar.gz/80db1463c4a47506eeda15b2c14d59679de900f8",rbush:"^4.0.1",react:"18","react-cosmos":"^6.2.3","react-cosmos-plugin-vite":"^6.2.0","react-dom":"18","react-konva":"18",recharts:"^2.15.1","tailwind-merge":"^3.2.0",terser:"^5.43.1","tiny-hypergraph":"git+https://github.com/tscircuit/tiny-hypergraph.git#c9aa5b7c9da5e007e2fff5d5c360490551fe3329","tiny-hypergraph-poly":"git+https://github.com/tscircuit/tiny-hypergraph.git#7b93b4c",tsup:"^8.3.6",typescript:"^5.9.3","use-mouse-matrix-transform":"^1.3.0",vite:"^6.0.11","vite-tsconfig-paths":"^5.1.4","zdwiel-dataset":"git+https://github.com/dwiel/tscircuit-benchmark.git#be36518b5bf51755dae92c230061ab3cf4e3e063","high-density-repair01":"git+https://github.com/tscircuit/high-density-repair01.git#44853f591f596fc1ef266e63b90082d409834bf0","high-density-repair02":"https://codeload.github.com/tscircuit/high-density-repair02/tar.gz/2afc0cbba3bf2f7eb6b9cd33615d21e9ad9352d4","high-density-repair03":"git+https://github.com/tscircuit/high-density-repair03.git#db73a5f","@tscircuit/high-density-a01":"git+https://github.com/tscircuit/high-density-a01.git#9a3a3d"},dependencies:{"fast-json-stable-stringify":"^2.1.0","object-hash":"^3.0.0","stack-svgs":"^0.0.1"}};init_dist2();init_dist4();init_dist2();init_dist6();var import_react=__toESM(require_react(),1),import_react_reconciler=__toESM(require_react_reconciler(),1),import_constants=__toESM(require_constants(),1);init_zod();init_dist2();init_dist2();init_zod();init_dist2();init_dist2();init_zod();init_dist2();var e2={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},t=e7=>(e7 instanceof Float64Array||e7 instanceof Float32Array||Array.isArray(e7)&&e7.every(e8=>typeof e8=="number"))&&[6,16].some(t54=>e7.length===t54),n=t54=>t54 instanceof DOMMatrix||t54 instanceof h||typeof t54=="object"&&Object.keys(e2).every(e7=>t54&&e7 in t54),r3=e7=>{let n3=new h,r6=Array.from(e7);if(!t(r6))throw TypeError(`CSSMatrix: "${r6.join(",")}" must be an array with 6/16 numbers.`);if(r6.length===16){let[e8,t54,i3,a3,o6,s6,c6,l7,u6,d4,f4,p5,m4,h3,g4,_3]=r6;n3.m11=e8,n3.a=e8,n3.m21=o6,n3.c=o6,n3.m31=u6,n3.m41=m4,n3.e=m4,n3.m12=t54,n3.b=t54,n3.m22=s6,n3.d=s6,n3.m32=d4,n3.m42=h3,n3.f=h3,n3.m13=i3,n3.m23=c6,n3.m33=f4,n3.m43=g4,n3.m14=a3,n3.m24=l7,n3.m34=p5,n3.m44=_3}else if(r6.length===6){let[e8,t54,i3,a3,o6,s6]=r6;n3.m11=e8,n3.a=e8,n3.m12=t54,n3.b=t54,n3.m21=i3,n3.c=i3,n3.m22=a3,n3.d=a3,n3.m41=o6,n3.e=o6,n3.m42=s6,n3.f=s6}return n3},i=e7=>{if(n(e7))return r3([e7.m11,e7.m12,e7.m13,e7.m14,e7.m21,e7.m22,e7.m23,e7.m24,e7.m31,e7.m32,e7.m33,e7.m34,e7.m41,e7.m42,e7.m43,e7.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(e7)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},a=e7=>{if(typeof e7!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(e7)}" is not a string.`);let t54=String(e7).replace(/\s/g,""),n3=new h,i3=`CSSMatrix: invalid transform string "${e7}"`;return t54.split(")").filter(e8=>e8).forEach(e8=>{let[t55,a3]=e8.split("(");if(!a3)throw TypeError(i3);let o6=a3.split(",").map(e10=>e10.includes("rad")?180/Math.PI*parseFloat(e10):parseFloat(e10)),[s6,c6,l7,u6]=o6,d4=[s6,c6,l7],f4=[s6,c6,l7,u6];if(t55==="perspective"&&s6&&[c6,l7].every(e10=>e10===void 0))n3.m34=-1/s6;else if(t55.includes("matrix")&&[6,16].includes(o6.length)&&o6.every(e10=>!Number.isNaN(+e10))){let e10=o6.map(e11=>Math.abs(e11)<1e-6?0:e11);n3.multiplySelf(r3(e10))}else if(t55==="translate3d"&&d4.every(e10=>!Number.isNaN(+e10)))n3.translateSelf(s6,c6,l7);else if(t55==="translate"&&s6&&l7===void 0)n3.translateSelf(s6,c6||0,0);else if(t55==="rotate3d"&&f4.every(e10=>!Number.isNaN(+e10))&&u6)n3.rotateAxisAngleSelf(s6,c6,l7,u6);else if(t55==="rotate"&&s6&&[c6,l7].every(e10=>e10===void 0))n3.rotateSelf(0,0,s6);else if(t55==="scale3d"&&d4.every(e10=>!Number.isNaN(+e10))&&d4.some(e10=>e10!==1))n3.scaleSelf(s6,c6,l7);else if(t55==="scale"&&!Number.isNaN(s6)&&(s6!==1||c6!==1)&&l7===void 0){let e10=Number.isNaN(+c6)?s6:c6;n3.scaleSelf(s6,e10,1)}else if(t55==="skew"&&(s6||!Number.isNaN(s6)&&c6)&&l7===void 0)n3.skewSelf(s6,c6||0);else if(["translate","rotate","scale","skew"].some(e10=>t55.includes(e10))&&/[XYZ]/.test(t55)&&s6&&[c6,l7].every(e10=>e10===void 0))if(t55==="skewX"||t55==="skewY")n3[t55==="skewX"?"skewXSelf":"skewYSelf"](s6);else{let e10=t55.replace(/[XYZ]/,""),r6=t55.replace(e10,""),i6=["X","Y","Z"].indexOf(r6),a4=e10==="scale"?1:0,o7=e10+"Self",c7=[i6===0?s6:a4,i6===1?s6:a4,i6===2?s6:a4];n3[o7](...c7)}else throw TypeError(i3)}),n3},o=(e7,t54)=>t54?[e7.a,e7.b,e7.c,e7.d,e7.e,e7.f]:[e7.m11,e7.m12,e7.m13,e7.m14,e7.m21,e7.m22,e7.m23,e7.m24,e7.m31,e7.m32,e7.m33,e7.m34,e7.m41,e7.m42,e7.m43,e7.m44],s2=(e7,t54,n3)=>{let r6=new h;return r6.m41=e7,r6.e=e7,r6.m42=t54,r6.f=t54,r6.m43=n3,r6},c=(e7,t54,n3)=>{let r6=new h,i3=Math.PI/180,a3=e7*i3,o6=t54*i3,s6=n3*i3,c6=Math.cos(a3),l7=-Math.sin(a3),u6=Math.cos(o6),d4=-Math.sin(o6),f4=Math.cos(s6),p5=-Math.sin(s6),m4=u6*f4,g4=-u6*p5;r6.m11=m4,r6.a=m4,r6.m12=g4,r6.b=g4,r6.m13=d4;let _3=l7*d4*f4+c6*p5;r6.m21=_3,r6.c=_3;let v3=c6*f4-l7*d4*p5;return r6.m22=v3,r6.d=v3,r6.m23=-l7*u6,r6.m31=l7*p5-c6*d4*f4,r6.m32=l7*f4+c6*d4*p5,r6.m33=c6*u6,r6},l=(e7=0,t54=0,n3=0,r6=0)=>{let i3=new h,a3=Math.sqrt(e7*e7+t54*t54+n3*n3);if(a3===0)return i3;let o6=e7/a3,s6=t54/a3,c6=n3/a3,l7=Math.PI/360*r6,u6=Math.sin(l7),d4=Math.cos(l7),f4=u6*u6,p5=o6*o6,m4=s6*s6,g4=c6*c6,_3=1-2*(m4+g4)*f4;i3.m11=_3,i3.a=_3;let v3=2*(o6*s6*f4+c6*u6*d4);i3.m12=v3,i3.b=v3,i3.m13=2*(o6*c6*f4-s6*u6*d4);let y3=2*(s6*o6*f4-c6*u6*d4);i3.m21=y3,i3.c=y3;let b4=1-2*(g4+p5)*f4;return i3.m22=b4,i3.d=b4,i3.m23=2*(s6*c6*f4+o6*u6*d4),i3.m31=2*(c6*o6*f4+s6*u6*d4),i3.m32=2*(c6*s6*f4-o6*u6*d4),i3.m33=1-2*(p5+m4)*f4,i3},u3=(e7,t54,n3)=>{let r6=new h;return r6.m11=e7,r6.a=e7,r6.m22=t54,r6.d=t54,r6.m33=n3,r6},d=(e7,t54)=>{let n3=new h;if(e7){let t55=e7*Math.PI/180,r6=Math.tan(t55);n3.m21=r6,n3.c=r6}if(t54){let e8=t54*Math.PI/180,r6=Math.tan(e8);n3.m12=r6,n3.b=r6}return n3},f=e7=>d(e7,0),p=e7=>d(0,e7),m=(e7,t54)=>r3([t54.m11*e7.m11+t54.m12*e7.m21+t54.m13*e7.m31+t54.m14*e7.m41,t54.m11*e7.m12+t54.m12*e7.m22+t54.m13*e7.m32+t54.m14*e7.m42,t54.m11*e7.m13+t54.m12*e7.m23+t54.m13*e7.m33+t54.m14*e7.m43,t54.m11*e7.m14+t54.m12*e7.m24+t54.m13*e7.m34+t54.m14*e7.m44,t54.m21*e7.m11+t54.m22*e7.m21+t54.m23*e7.m31+t54.m24*e7.m41,t54.m21*e7.m12+t54.m22*e7.m22+t54.m23*e7.m32+t54.m24*e7.m42,t54.m21*e7.m13+t54.m22*e7.m23+t54.m23*e7.m33+t54.m24*e7.m43,t54.m21*e7.m14+t54.m22*e7.m24+t54.m23*e7.m34+t54.m24*e7.m44,t54.m31*e7.m11+t54.m32*e7.m21+t54.m33*e7.m31+t54.m34*e7.m41,t54.m31*e7.m12+t54.m32*e7.m22+t54.m33*e7.m32+t54.m34*e7.m42,t54.m31*e7.m13+t54.m32*e7.m23+t54.m33*e7.m33+t54.m34*e7.m43,t54.m31*e7.m14+t54.m32*e7.m24+t54.m33*e7.m34+t54.m34*e7.m44,t54.m41*e7.m11+t54.m42*e7.m21+t54.m43*e7.m31+t54.m44*e7.m41,t54.m41*e7.m12+t54.m42*e7.m22+t54.m43*e7.m32+t54.m44*e7.m42,t54.m41*e7.m13+t54.m42*e7.m23+t54.m43*e7.m33+t54.m44*e7.m43,t54.m41*e7.m14+t54.m42*e7.m24+t54.m43*e7.m34+t54.m44*e7.m44]),_a3,h=(_a3=class{constructor(e7){return this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0,this.m11=1,this.m12=0,this.m13=0,this.m14=0,this.m21=0,this.m22=1,this.m23=0,this.m24=0,this.m31=0,this.m32=0,this.m33=1,this.m34=0,this.m41=0,this.m42=0,this.m43=0,this.m44=1,e7?this.setMatrixValue(e7):this}get isIdentity(){return this.m11===1&&this.m12===0&&this.m13===0&&this.m14===0&&this.m21===0&&this.m22===1&&this.m23===0&&this.m24===0&&this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m41===0&&this.m42===0&&this.m43===0&&this.m44===1}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(e7){return typeof e7=="string"&&e7.length&&e7!=="none"?a(e7):Array.isArray(e7)||e7 instanceof Float64Array||e7 instanceof Float32Array?r3(e7):typeof e7=="object"?i(e7):this}toFloat32Array(e7){return Float32Array.from(o(this,e7))}toFloat64Array(e7){return Float64Array.from(o(this,e7))}toString(){let{is2D:e7}=this,t54=this.toFloat64Array(e7).join(", ");return`${e7?"matrix":"matrix3d"}(${t54})`}toJSON(){let{is2D:e7,isIdentity:t54}=this;return{...this,is2D:e7,isIdentity:t54}}multiply(e7){return m(this,e7)}translate(e7,t54,n3){return this.multiply(s2(e7,t54??0,n3??0))}scale(e7,t54,n3){return this.multiply(u3(e7,t54??e7,n3??1))}rotate(e7,t54,n3){let r6=e7,i3=t54||0,a3=n3||0;return typeof e7=="number"&&t54===void 0&&n3===void 0&&(a3=r6,r6=0,i3=0),this.multiply(c(r6,i3,a3))}rotateAxisAngle(e7=0,t54=0,n3=0,r6=0){if([e7,t54,n3,r6].some(e8=>!Number.isFinite(e8)))throw TypeError("CSSMatrix: expecting 4 values");return Math.sqrt(e7*e7+t54*t54+n3*n3)===0?i(this):this.multiply(l(e7,t54,n3,r6))}skewX(e7){return this.multiply(f(e7))}skewY(e7){return this.multiply(p(e7))}skew(e7,t54){return this.multiply(d(e7,t54))}multiplySelf(e7){let t54=m(this,e7);return Object.assign(this,t54),this}translateSelf(e7,t54,n3){return this.multiplySelf(s2(e7,t54??0,n3??0))}scaleSelf(e7,t54,n3){return this.multiplySelf(u3(e7,t54??e7,n3??1))}rotateSelf(e7,t54,n3){let r6=e7,i3=t54||0,a3=n3||0;return typeof e7=="number"&&t54===void 0&&n3===void 0&&(a3=r6,r6=0,i3=0),this.multiplySelf(c(r6,i3,a3))}rotateAxisAngleSelf(e7=0,t54=0,n3=0,r6=0){if([e7,t54,n3,r6].some(e8=>!Number.isFinite(e8)))throw TypeError("CSSMatrix: expecting 4 values");return Math.sqrt(e7*e7+t54*t54+n3*n3)===0?this:this.multiplySelf(l(e7,t54,n3,r6))}skewXSelf(e7){return this.multiplySelf(f(e7))}skewYSelf(e7){return this.multiplySelf(p(e7))}skewSelf(e7,t54){return this.multiplySelf(d(e7,t54))}transformPoint(e7){let t54=this.m11*e7.x+this.m21*e7.y+this.m31*e7.z+this.m41*e7.w,n3=this.m12*e7.x+this.m22*e7.y+this.m32*e7.z+this.m42*e7.w,r6=this.m13*e7.x+this.m23*e7.y+this.m33*e7.z+this.m43*e7.w,i3=this.m14*e7.x+this.m24*e7.y+this.m34*e7.z+this.m44*e7.w;return e7 instanceof DOMPoint?new DOMPoint(t54,n3,r6,i3):{x:t54,y:n3,z:r6,w:i3}}},__publicField(_a3,"Translate",s2),__publicField(_a3,"Rotate",c),__publicField(_a3,"RotateAxisAngle",l),__publicField(_a3,"Scale",u3),__publicField(_a3,"SkewX",f),__publicField(_a3,"SkewY",p),__publicField(_a3,"Skew",d),__publicField(_a3,"Multiply",m),__publicField(_a3,"fromArray",r3),__publicField(_a3,"fromMatrix",i),__publicField(_a3,"fromString",a),__publicField(_a3,"toArray",o),__publicField(_a3,"isCompatibleArray",t),__publicField(_a3,"isCompatibleObject",n),_a3);var version="2.2.1",midPoint=([ax3,ay3],[bx3,by3],t54)=>[ax3+(bx3-ax3)*t54,ay3+(by3-ay3)*t54],distanceSquareRoot=(a3,b4)=>Math.sqrt((a3[0]-b4[0])*(a3[0]-b4[0])+(a3[1]-b4[1])*(a3[1]-b4[1])),getLineLength=(x12,y12,x22,y22)=>distanceSquareRoot([x12,y12],[x22,y22]),getPointAtLineLength=(x12,y12,x22,y22,distance8)=>{let point6={x:x12,y:y12};if(typeof distance8=="number"){let length4=distanceSquareRoot([x12,y12],[x22,y22]);if(distance8<=0)point6={x:x12,y:y12};else if(distance8>=length4)point6={x:x22,y:y22};else{let[x4,y3]=midPoint([x12,y12],[x22,y22],distance8/length4);point6={x:x4,y:y3}}}return point6},getLineBBox=(x12,y12,x22,y22)=>{let{min,max:max2}=Math;return[min(x12,x22),min(y12,y22),max2(x12,x22),max2(y12,y22)]},lineTools={getLineBBox,getLineLength,getPointAtLineLength},arcLength=(rx3,ry3,theta)=>{let halfTheta=theta/2,sinHalfTheta=Math.sin(halfTheta),cosHalfTheta=Math.cos(halfTheta),term1=rx3**2*sinHalfTheta**2,term2=ry3**2*cosHalfTheta**2,length4=Math.sqrt(term1+term2)*theta;return Math.abs(length4)},arcPoint=(cx3,cy3,rx3,ry3,alpha,theta)=>{let{sin:sin6,cos:cos6}=Math,cosA=cos6(alpha),sinA=sin6(alpha),x4=rx3*cos6(theta),y3=ry3*sin6(theta);return[cx3+cosA*x4-sinA*y3,cy3+sinA*x4+cosA*y3]},angleBetween=(v02,v12)=>{let{x:v0x,y:v0y}=v02,{x:v1x,y:v1y}=v12,p5=v0x*v1x+v0y*v1y,n3=Math.sqrt((v0x**2+v0y**2)*(v1x**2+v1y**2));return(v0x*v1y-v0y*v1x<0?-1:1)*Math.acos(p5/n3)},getArcProps=(x12,y12,RX,RY,angle,LAF,SF2,x4,y3)=>{let{abs,sin:sin6,cos:cos6,sqrt,PI:PI7}=Math,rx3=abs(RX),ry3=abs(RY),xRotRad=(angle%360+360)%360*(PI7/180);if(x12===x4&&y12===y3)return{rx:rx3,ry:ry3,startAngle:0,endAngle:0,center:{x:x4,y:y3}};if(rx3===0||ry3===0)return{rx:rx3,ry:ry3,startAngle:0,endAngle:0,center:{x:(x4+x12)/2,y:(y3+y12)/2}};let dx3=(x12-x4)/2,dy3=(y12-y3)/2,transformedPoint={x:cos6(xRotRad)*dx3+sin6(xRotRad)*dy3,y:-sin6(xRotRad)*dx3+cos6(xRotRad)*dy3},radiiCheck=transformedPoint.x**2/rx3**2+transformedPoint.y**2/ry3**2;radiiCheck>1&&(rx3*=sqrt(radiiCheck),ry3*=sqrt(radiiCheck));let cRadicand=(rx3**2*ry3**2-rx3**2*transformedPoint.y**2-ry3**2*transformedPoint.x**2)/(rx3**2*transformedPoint.y**2+ry3**2*transformedPoint.x**2);cRadicand=cRadicand<0?0:cRadicand;let cCoef=(LAF!==SF2?1:-1)*sqrt(cRadicand),transformedCenter={x:cCoef*(rx3*transformedPoint.y/ry3),y:cCoef*(-(ry3*transformedPoint.x)/rx3)},center2={x:cos6(xRotRad)*transformedCenter.x-sin6(xRotRad)*transformedCenter.y+(x12+x4)/2,y:sin6(xRotRad)*transformedCenter.x+cos6(xRotRad)*transformedCenter.y+(y12+y3)/2},startVector={x:(transformedPoint.x-transformedCenter.x)/rx3,y:(transformedPoint.y-transformedCenter.y)/ry3},startAngle=angleBetween({x:1,y:0},startVector),sweepAngle=angleBetween(startVector,{x:(-transformedPoint.x-transformedCenter.x)/rx3,y:(-transformedPoint.y-transformedCenter.y)/ry3});return!SF2&&sweepAngle>0?sweepAngle-=2*PI7:SF2&&sweepAngle<0&&(sweepAngle+=2*PI7),sweepAngle%=2*PI7,{center:center2,startAngle,endAngle:startAngle+sweepAngle,rx:rx3,ry:ry3}},getArcLength=(x12,y12,RX,RY,angle,LAF,SF2,x4,y3)=>{let{rx:rx3,ry:ry3,startAngle,endAngle}=getArcProps(x12,y12,RX,RY,angle,LAF,SF2,x4,y3);return arcLength(rx3,ry3,endAngle-startAngle)},getPointAtArcLength=(x12,y12,RX,RY,angle,LAF,SF2,x4,y3,distance8)=>{let point6={x:x12,y:y12},{center:center2,rx:rx3,ry:ry3,startAngle,endAngle}=getArcProps(x12,y12,RX,RY,angle,LAF,SF2,x4,y3);if(typeof distance8=="number"){let length4=arcLength(rx3,ry3,endAngle-startAngle);if(distance8<=0)point6={x:x12,y:y12};else if(distance8>=length4)point6={x:x4,y:y3};else{if(x12===x4&&y12===y3)return{x:x4,y:y3};if(rx3===0||ry3===0)return getPointAtLineLength(x12,y12,x4,y3,distance8);let{PI:PI7,cos:cos6,sin:sin6}=Math,sweepAngle=endAngle-startAngle,xRotRad=(angle%360+360)%360*(PI7/180),alpha=startAngle+sweepAngle*(distance8/length4),ellipseComponentX=rx3*cos6(alpha),ellipseComponentY=ry3*sin6(alpha);point6={x:cos6(xRotRad)*ellipseComponentX-sin6(xRotRad)*ellipseComponentY+center2.x,y:sin6(xRotRad)*ellipseComponentX+cos6(xRotRad)*ellipseComponentY+center2.y}}}return point6},getArcBBox=(x12,y12,RX,RY,angle,LAF,SF2,x4,y3)=>{let{center:center2,rx:rx3,ry:ry3,startAngle,endAngle}=getArcProps(x12,y12,RX,RY,angle,LAF,SF2,x4,y3),deltaAngle=endAngle-startAngle,{min,max:max2,tan:tan6,atan2,PI:PI7}=Math,{x:cx3,y:cy3}=center2,alpha=angle*PI7/180,tangent=tan6(alpha),theta=atan2(-ry3*tangent,rx3),angle1=theta,angle2=theta+PI7,angle3=atan2(ry3,rx3*tangent),angle4=angle3+PI7,xArray=[x4],yArray=[y3],xMin=min(x12,x4),xMax=max2(x12,x4),yMin=min(y12,y3),yMax=max2(y12,y3),pP2=arcPoint(cx3,cy3,rx3,ry3,alpha,endAngle-deltaAngle*1e-5),pP3=arcPoint(cx3,cy3,rx3,ry3,alpha,endAngle-deltaAngle*.99999);if(pP2[0]>xMax||pP3[0]>xMax){let p12=arcPoint(cx3,cy3,rx3,ry3,alpha,angle1);xArray.push(p12[0]),yArray.push(p12[1])}if(pP2[0]<xMin||pP3[0]<xMin){let p22=arcPoint(cx3,cy3,rx3,ry3,alpha,angle2);xArray.push(p22[0]),yArray.push(p22[1])}if(pP2[1]<yMin||pP3[1]<yMin){let p42=arcPoint(cx3,cy3,rx3,ry3,alpha,angle4);xArray.push(p42[0]),yArray.push(p42[1])}if(pP2[1]>yMax||pP3[1]>yMax){let p32=arcPoint(cx3,cy3,rx3,ry3,alpha,angle3);xArray.push(p32[0]),yArray.push(p32[1])}return xMin=min.apply([],xArray),yMin=min.apply([],yArray),xMax=max2.apply([],xArray),yMax=max2.apply([],yArray),[xMin,yMin,xMax,yMax]},arcTools={angleBetween,arcLength,arcPoint,getArcBBox,getArcLength,getArcProps,getPointAtArcLength},Tvalues=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],Cvalues=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],deriveBezier=points=>{let dpoints=[];for(let p5=points,d4=p5.length,c6=d4-1;d4>1;d4-=1,c6-=1){let list=[];for(let j5=0;j5<c6;j5+=1)list.push({x:c6*(p5[j5+1].x-p5[j5].x),y:c6*(p5[j5+1].y-p5[j5].y),t:0});dpoints.push(list),p5=list}return dpoints},computeBezier=(points,t54)=>{if(t54===0)return points[0].t=0,points[0];let order=points.length-1;if(t54===1)return points[order].t=1,points[order];let mt3=1-t54,p5=points;if(order===0)return points[0].t=t54,points[0];if(order===1)return{x:mt3*p5[0].x+t54*p5[1].x,y:mt3*p5[0].y+t54*p5[1].y,t:t54};let mt22=mt3*mt3,t210=t54*t54,a3=0,b4=0,c6=0,d4=0;return order===2?(p5=[p5[0],p5[1],p5[2],{x:0,y:0}],a3=mt22,b4=mt3*t54*2,c6=t210):order===3&&(a3=mt22*mt3,b4=mt22*t54*3,c6=mt3*t210*3,d4=t54*t210),{x:a3*p5[0].x+b4*p5[1].x+c6*p5[2].x+d4*p5[3].x,y:a3*p5[0].y+b4*p5[1].y+c6*p5[2].y+d4*p5[3].y,t:t54}},calculateBezier=(derivativeFn,t54)=>{let d4=derivativeFn(t54),l7=d4.x*d4.x+d4.y*d4.y;return Math.sqrt(l7)},bezierLength=derivativeFn=>{let len=Tvalues.length,sum=0;for(let i3=0,t54;i3<len;i3++)t54=.5*Tvalues[i3]+.5,sum+=Cvalues[i3]*calculateBezier(derivativeFn,t54);return .5*sum},getBezierLength=curve=>{let points=[];for(let idx=0,len=curve.length,step=2;idx<len;idx+=step)points.push({x:curve[idx],y:curve[idx+1]});let dpoints=deriveBezier(points);return bezierLength(t54=>computeBezier(dpoints[0],t54))},CBEZIER_MINMAX_EPSILON=1e-8,minmaxQ=([v12,cp3,v22])=>{let min=Math.min(v12,v22),max2=Math.max(v12,v22);if(cp3>=v12?v22>=cp3:v22<=cp3)return[min,max2];let E4=(v12*v22-cp3*cp3)/(v12-2*cp3+v22);return E4<min?[E4,max2]:[min,E4]},minmaxC=([v12,cp1,cp22,v22])=>{let K4=v12-3*cp1+3*cp22-v22;if(Math.abs(K4)<1e-8)return v12===v22&&v12===cp1?[v12,v22]:minmaxQ([v12,-.5*v12+1.5*cp1,v12-3*cp1+3*cp22]);let T6=-v12*cp22+v12*v22-cp1*cp22-cp1*v22+cp1*cp1+cp22*cp22;if(T6<=0)return[Math.min(v12,v22),Math.max(v12,v22)];let S7=Math.sqrt(T6),min=Math.min(v12,v22),max2=Math.max(v12,v22),L5=v12-2*cp1+cp22;for(let R6=(L5+S7)/K4,i3=1;i3<=2;R6=(L5-S7)/K4,i3++)if(R6>0&&R6<1){let Q5=v12*(1-R6)*(1-R6)*(1-R6)+cp1*3*(1-R6)*(1-R6)*R6+cp22*3*(1-R6)*R6*R6+v22*R6*R6*R6;Q5<min&&(min=Q5),Q5>max2&&(max2=Q5)}return[min,max2]},bezierTools={bezierLength,calculateBezier,CBEZIER_MINMAX_EPSILON,computeBezier,Cvalues,deriveBezier,getBezierLength,minmaxC,minmaxQ,Tvalues},getPointAtCubicSegmentLength=([x12,y12,c1x,c1y,c2x,c2y,x22,y22],t54)=>{let t110=1-t54;return{x:t110**3*x12+3*t110**2*t54*c1x+3*t110*t54**2*c2x+t54**3*x22,y:t110**3*y12+3*t110**2*t54*c1y+3*t110*t54**2*c2y+t54**3*y22}},getCubicLength=(x12,y12,c1x,c1y,c2x,c2y,x22,y22)=>getBezierLength([x12,y12,c1x,c1y,c2x,c2y,x22,y22]),getPointAtCubicLength=(x12,y12,c1x,c1y,c2x,c2y,x22,y22,distance8)=>{let distanceIsNumber=typeof distance8=="number",point6={x:x12,y:y12};if(distanceIsNumber){let currentLength=getBezierLength([x12,y12,c1x,c1y,c2x,c2y,x22,y22]);distance8<=0||(distance8>=currentLength?point6={x:x22,y:y22}:point6=getPointAtCubicSegmentLength([x12,y12,c1x,c1y,c2x,c2y,x22,y22],distance8/currentLength))}return point6},getCubicBBox=(x12,y12,c1x,c1y,c2x,c2y,x22,y22)=>{let cxMinMax=minmaxC([x12,c1x,c2x,x22]),cyMinMax=minmaxC([y12,c1y,c2y,y22]);return[cxMinMax[0],cyMinMax[0],cxMinMax[1],cyMinMax[1]]},cubicTools={getCubicBBox,getCubicLength,getPointAtCubicLength,getPointAtCubicSegmentLength},getPointAtQuadSegmentLength=([x12,y12,cx3,cy3,x22,y22],t54)=>{let t110=1-t54;return{x:t110**2*x12+2*t110*t54*cx3+t54**2*x22,y:t110**2*y12+2*t110*t54*cy3+t54**2*y22}},getQuadLength=(x12,y12,cx3,cy3,x22,y22)=>getBezierLength([x12,y12,cx3,cy3,x22,y22]),getPointAtQuadLength=(x12,y12,cx3,cy3,x22,y22,distance8)=>{let distanceIsNumber=typeof distance8=="number",point6={x:x12,y:y12};if(distanceIsNumber){let currentLength=getBezierLength([x12,y12,cx3,cy3,x22,y22]);distance8<=0||(distance8>=currentLength?point6={x:x22,y:y22}:point6=getPointAtQuadSegmentLength([x12,y12,cx3,cy3,x22,y22],distance8/currentLength))}return point6},getQuadBBox=(x12,y12,cx3,cy3,x22,y22)=>{let cxMinMax=minmaxQ([x12,cx3,x22]),cyMinMax=minmaxQ([y12,cy3,y22]);return[cxMinMax[0],cyMinMax[0],cxMinMax[1],cyMinMax[1]]},quadTools={getPointAtQuadLength,getPointAtQuadSegmentLength,getQuadBBox,getQuadLength},polygonArea=polygon2=>{let n3=polygon2.length,i3=-1,a3,b4=polygon2[n3-1],area=0;for(;++i3<n3;)a3=b4,b4=polygon2[i3],area+=a3[1]*b4[0]-a3[0]*b4[1];return area/2},polygonLength=polygon2=>polygon2.reduce((length4,point6,i3)=>i3?length4+distanceSquareRoot(polygon2[i3-1],point6):0,0),polygonCentroid=polygon2=>{if(polygon2.length===0)return[0,0];let sumX=0,sumY=0;for(let[x4,y3]of polygon2)sumX+=x4,sumY+=y3;let count=polygon2.length;return[sumX/count,sumY/count]},polygonTools={polygonArea,polygonLength,polygonCentroid},rotateVector=(x4,y3,rad)=>{let{sin:sin6,cos:cos6}=Math;return{x:x4*cos6(rad)-y3*sin6(rad),y:x4*sin6(rad)+y3*cos6(rad)}},roundTo=(n3,round)=>{let pow=round>=1?10**round:1;return round>0?Math.round(n3*pow)/pow:Math.round(n3)},defaultOptions2={origin:[0,0,0],round:4},paramsCounts={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},finalizeSegment=path=>{let pathCommand=path.pathValue[path.segmentStart],relativeCommand=pathCommand.toLowerCase(),{data}=path;for(;data.length>=paramsCounts[relativeCommand]&&(relativeCommand==="m"&&data.length>2?(path.segments.push([pathCommand].concat(data.splice(0,2))),relativeCommand="l",pathCommand=pathCommand==="m"?"l":"L"):path.segments.push([pathCommand].concat(data.splice(0,paramsCounts[relativeCommand]))),!!paramsCounts[relativeCommand]););},error="SVGPathCommanderError",scanFlag=path=>{let{index,pathValue}=path,code=pathValue.charCodeAt(index);if(code===48){path.param=0,path.index+=1;return}if(code===49){path.param=1,path.index+=1;return}path.err=`${error}: invalid Arc flag "${pathValue[index]}", expecting 0 or 1 at index ${index}`},isDigit=code=>code>=48&&code<=57,invalidPathValue="Invalid path value",scanParam=path=>{let{max:max2,pathValue,index:start}=path,index=start,zeroFirst=!1,hasCeiling=!1,hasDecimal=!1,hasDot=!1,ch2;if(index>=max2){path.err=`${error}: ${invalidPathValue} at index ${index}, "pathValue" is missing param`;return}if(ch2=pathValue.charCodeAt(index),(ch2===43||ch2===45)&&(index+=1,ch2=pathValue.charCodeAt(index)),!isDigit(ch2)&&ch2!==46){path.err=`${error}: ${invalidPathValue} at index ${index}, "${pathValue[index]}" is not a number`;return}if(ch2!==46){if(zeroFirst=ch2===48,index+=1,ch2=pathValue.charCodeAt(index),zeroFirst&&index<max2&&ch2&&isDigit(ch2)){path.err=`${error}: ${invalidPathValue} at index ${start}, "${pathValue[start]}" illegal number`;return}for(;index<max2&&isDigit(pathValue.charCodeAt(index));)index+=1,hasCeiling=!0;ch2=pathValue.charCodeAt(index)}if(ch2===46){for(hasDot=!0,index+=1;isDigit(pathValue.charCodeAt(index));)index+=1,hasDecimal=!0;ch2=pathValue.charCodeAt(index)}if(ch2===101||ch2===69){if(hasDot&&!hasCeiling&&!hasDecimal){path.err=`${error}: ${invalidPathValue} at index ${index}, "${pathValue[index]}" invalid float exponent`;return}if(index+=1,ch2=pathValue.charCodeAt(index),(ch2===43||ch2===45)&&(index+=1),index<max2&&isDigit(pathValue.charCodeAt(index)))for(;index<max2&&isDigit(pathValue.charCodeAt(index));)index+=1;else{path.err=`${error}: ${invalidPathValue} at index ${index}, "${pathValue[index]}" invalid integer exponent`;return}}path.index=index,path.param=+path.pathValue.slice(start,index)},isSpace=ch2=>[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(ch2),skipSpaces=path=>{let{pathValue,max:max2}=path;for(;path.index<max2&&isSpace(pathValue.charCodeAt(path.index));)path.index+=1},isPathCommand=code=>{switch(code|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},isDigitStart=code=>isDigit(code)||code===43||code===45||code===46,isArcCommand=code=>(code|32)===97,isMoveCommand=code=>{switch(code|32){case 109:case 77:return!0;default:return!1}},scanSegment=path=>{let{max:max2,pathValue,index,segments}=path,cmdCode=pathValue.charCodeAt(index),reqParams=paramsCounts[pathValue[index].toLowerCase()];if(path.segmentStart=index,!isPathCommand(cmdCode)){path.err=`${error}: ${invalidPathValue} "${pathValue[index]}" is not a path command at index ${index}`;return}let lastSegment=segments[segments.length-1];if(!isMoveCommand(cmdCode)&&lastSegment?.[0]?.toLocaleLowerCase()==="z"){path.err=`${error}: ${invalidPathValue} "${pathValue[index]}" is not a MoveTo path command at index ${index}`;return}if(path.index+=1,skipSpaces(path),path.data=[],!reqParams){finalizeSegment(path);return}for(;;){for(let i3=reqParams;i3>0;i3-=1){if(isArcCommand(cmdCode)&&(i3===3||i3===4)?scanFlag(path):scanParam(path),path.err.length)return;path.data.push(path.param),skipSpaces(path),path.index<max2&&pathValue.charCodeAt(path.index)===44&&(path.index+=1,skipSpaces(path))}if(path.index>=path.max||!isDigitStart(pathValue.charCodeAt(path.index)))break}finalizeSegment(path)},PathParser=class{constructor(pathString){this.segments=[],this.pathValue=pathString,this.max=pathString.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}},parsePathString=pathInput=>{if(typeof pathInput!="string")return pathInput.slice(0);let path=new PathParser(pathInput);for(skipSpaces(path);path.index<path.max&&!path.err.length;)scanSegment(path);if(!path.err.length)path.segments.length&&(path.segments[0][0]="M");else throw TypeError(path.err);return path.segments},absolutizeSegment=(segment2,index,lastX,lastY)=>{let[pathCommand]=segment2,absCommand=pathCommand.toUpperCase();if(index===0||absCommand===pathCommand)return segment2;if(absCommand==="A")return[absCommand,segment2[1],segment2[2],segment2[3],segment2[4],segment2[5],segment2[6]+lastX,segment2[7]+lastY];if(absCommand==="V")return[absCommand,segment2[1]+lastY];if(absCommand==="H")return[absCommand,segment2[1]+lastX];if(absCommand==="L")return[absCommand,segment2[1]+lastX,segment2[2]+lastY];{let absValues=[],seglen=segment2.length;for(let j5=1;j5<seglen;j5+=1)absValues.push(segment2[j5]+(j5%2?lastX:lastY));return[absCommand].concat(absValues)}},iterate=(path,iterator)=>{let x4=0,y3=0,mx3=0,my3=0,i3=0;for(;i3<path.length;){let segment2=path[i3],[pathCommand]=segment2,absCommand=pathCommand.toUpperCase(),isRelative=absCommand!==pathCommand,iteratorResult=iterator(segment2,i3,x4,y3);if(iteratorResult===!1)break;if(absCommand==="Z")x4=mx3,y3=my3;else if(absCommand==="H")x4=segment2[1]+(isRelative?x4:0);else if(absCommand==="V")y3=segment2[1]+(isRelative?y3:0);else{let segLen=segment2.length;x4=segment2[segLen-2]+(isRelative?x4:0),y3=segment2[segLen-1]+(isRelative?y3:0),absCommand==="M"&&(mx3=x4,my3=y3)}iteratorResult&&(path[i3]=iteratorResult),i3+=1}return path},pathToAbsolute=pathInput=>iterate(parsePathString(pathInput),absolutizeSegment),relativizeSegment=(segment2,index,lastX,lastY)=>{let[pathCommand]=segment2,relCommand=pathCommand.toLowerCase();if(index===0||pathCommand===relCommand)return segment2;if(relCommand==="a")return[relCommand,segment2[1],segment2[2],segment2[3],segment2[4],segment2[5],segment2[6]-lastX,segment2[7]-lastY];if(relCommand==="v")return[relCommand,segment2[1]-lastY];if(relCommand==="h")return[relCommand,segment2[1]-lastX];if(relCommand==="l")return[relCommand,segment2[1]-lastX,segment2[2]-lastY];{let relValues=[],seglen=segment2.length;for(let j5=1;j5<seglen;j5+=1)relValues.push(segment2[j5]-(j5%2?lastX:lastY));return[relCommand].concat(relValues)}},pathToRelative=pathInput=>iterate(parsePathString(pathInput),relativizeSegment),arcToCubic=(X12,Y12,RX,RY,angle,LAF,SF2,X22,Y22,recursive)=>{let x12=X12,y12=Y12,rx3=RX,ry3=RY,x22=X22,y22=Y22,d120=Math.PI*120/180,rad=Math.PI/180*(+angle||0),res2=[],xy3,f12,f22,cx3,cy3;if(recursive)[f12,f22,cx3,cy3]=recursive;else{xy3=rotateVector(x12,y12,-rad),x12=xy3.x,y12=xy3.y,xy3=rotateVector(x22,y22,-rad),x22=xy3.x,y22=xy3.y;let x4=(x12-x22)/2,y3=(y12-y22)/2,h3=x4*x4/(rx3*rx3)+y3*y3/(ry3*ry3);h3>1&&(h3=Math.sqrt(h3),rx3*=h3,ry3*=h3);let rx22=rx3*rx3,ry22=ry3*ry3,k5=(LAF===SF2?-1:1)*Math.sqrt(Math.abs((rx22*ry22-rx22*y3*y3-ry22*x4*x4)/(rx22*y3*y3+ry22*x4*x4)));cx3=k5*rx3*y3/ry3+(x12+x22)/2,cy3=k5*-ry3*x4/rx3+(y12+y22)/2,f12=Math.asin(((y12-cy3)/ry3*10**9>>0)/10**9),f22=Math.asin(((y22-cy3)/ry3*10**9>>0)/10**9),f12=x12<cx3?Math.PI-f12:f12,f22=x22<cx3?Math.PI-f22:f22,f12<0&&(f12=Math.PI*2+f12),f22<0&&(f22=Math.PI*2+f22),SF2&&f12>f22&&(f12-=Math.PI*2),!SF2&&f22>f12&&(f22-=Math.PI*2)}let df3=f22-f12;if(Math.abs(df3)>d120){let f2old=f22,x2old=x22,y2old=y22;f22=f12+d120*(SF2&&f22>f12?1:-1),x22=cx3+rx3*Math.cos(f22),y22=cy3+ry3*Math.sin(f22),res2=arcToCubic(x22,y22,rx3,ry3,angle,0,SF2,x2old,y2old,[f22,f2old,cx3,cy3])}df3=f22-f12;let c12=Math.cos(f12),s12=Math.sin(f12),c22=Math.cos(f22),s22=Math.sin(f22),t54=Math.tan(df3/4),hx3=4/3*rx3*t54,hy3=4/3*ry3*t54,m12=[x12,y12],m22=[x12+hx3*s12,y12-hy3*c12],m32=[x22+hx3*s22,y22-hy3*c22],m4=[x22,y22];if(m22[0]=2*m12[0]-m22[0],m22[1]=2*m12[1]-m22[1],recursive)return[m22[0],m22[1],m32[0],m32[1],m4[0],m4[1]].concat(res2);res2=[m22[0],m22[1],m32[0],m32[1],m4[0],m4[1]].concat(res2);let newres=[];for(let i3=0,ii3=res2.length;i3<ii3;i3+=1)newres[i3]=i3%2?rotateVector(res2[i3-1],res2[i3],rad).y:rotateVector(res2[i3],res2[i3+1],rad).x;return newres},quadToCubic=(x12,y12,qx3,qy3,x22,y22)=>{let r13=.3333333333333333,r23=2/3;return[r13*x12+r23*qx3,r13*y12+r23*qy3,r13*x22+r23*qx3,r13*y22+r23*qy3,x22,y22]},lineToCubic=(x12,y12,x22,y22)=>{let c12=midPoint([x12,y12],[x22,y22],.3333333333333333),c22=midPoint([x12,y12],[x22,y22],2/3);return[c12[0],c12[1],c22[0],c22[1],x22,y22]},segmentToCubic=(segment2,params)=>{let pathCommand=segment2[0],values=segment2.slice(1).map(Number),[x4,y3]=values,{x1:px1,y1:py1}=params;return"TQ".includes(pathCommand)||(params.qx=null,params.qy=null),pathCommand==="M"?(params.mx=x4,params.my=y3,params.x=x4,params.y=y3,segment2):pathCommand==="A"?["C"].concat(arcToCubic(px1,py1,values[0],values[1],values[2],values[3],values[4],values[5],values[6])):pathCommand==="Q"?(params.qx=x4,params.qy=y3,["C"].concat(quadToCubic(px1,py1,values[0],values[1],values[2],values[3]))):pathCommand==="L"?["C"].concat(lineToCubic(px1,py1,x4,y3)):pathCommand==="Z"?["C"].concat(lineToCubic(px1,py1,params.mx,params.my)):segment2},normalizeSegment=(segment2,params)=>{let[pathCommand]=segment2,absCommand=pathCommand.toUpperCase(),isRelative=pathCommand!==absCommand,{x1:px1,y1:py1,x2:px22,y2:py22,x:x4,y:y3}=params,values=segment2.slice(1),absValues=values.map((n3,j5)=>n3+(isRelative?j5%2?y3:x4:0));if("TQ".includes(absCommand)||(params.qx=null,params.qy=null),absCommand==="A")return absValues=values.slice(0,-2).concat(values[5]+(isRelative?x4:0),values[6]+(isRelative?y3:0)),["A"].concat(absValues);if(absCommand==="H")return["L",segment2[1]+(isRelative?x4:0),py1];if(absCommand==="V")return["L",px1,segment2[1]+(isRelative?y3:0)];if(absCommand==="L")return["L",segment2[1]+(isRelative?x4:0),segment2[2]+(isRelative?y3:0)];if(absCommand==="M")return["M",segment2[1]+(isRelative?x4:0),segment2[2]+(isRelative?y3:0)];if(absCommand==="C")return["C"].concat(absValues);if(absCommand==="S"){let x12=px1*2-px22,y12=py1*2-py22;return params.x1=x12,params.y1=y12,["C",x12,y12].concat(absValues)}else if(absCommand==="T"){let qx3=px1*2-(params.qx?params.qx:0),qy3=py1*2-(params.qy?params.qy:0);return params.qx=qx3,params.qy=qy3,["Q",qx3,qy3].concat(absValues)}else if(absCommand==="Q"){let[nqx,nqy]=absValues;return params.qx=nqx,params.qy=nqy,["Q"].concat(absValues)}else if(absCommand==="Z")return["Z"];return segment2},paramsParser={mx:0,my:0,x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},pathToCurve=pathInput=>{let params={...paramsParser},path=parsePathString(pathInput);return iterate(path,(seg,index,lastX,lastY)=>{params.x=lastX,params.y=lastY;let normalSegment=normalizeSegment(seg,params);normalSegment[0]==="M"&&(params.mx=normalSegment[1],params.my=normalSegment[2]);let result=segmentToCubic(normalSegment,params);result[0]==="C"&&result.length>7&&(path.splice(index+1,0,["C"].concat(result.slice(7))),result=result.slice(0,7));let seglen=result.length;return params.x1=+result[seglen-2],params.y1=+result[seglen-1],params.x2=+result[seglen-4]||params.x1,params.y2=+result[seglen-3]||params.y1,result})},pathToString=(path,roundOption)=>{let pathLen=path.length,{round}=defaultOptions2,segment2=path[0],result="";round=roundOption==="off"||typeof roundOption=="number"&&roundOption>=0?roundOption:typeof round=="number"&&round>=0?round:"off";for(let i3=0;i3<pathLen;i3+=1){segment2=path[i3];let[pathCommand]=segment2,values=segment2.slice(1);if(result+=pathCommand,round==="off")result+=values.join(" ");else{let j5=0,valLen=values.length;for(;j5<valLen;)result+=roundTo(values[j5],round),j5!==valLen-1&&(result+=" "),j5+=1}}return result},getPathBBox=pathInput=>{if(!pathInput)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let path=parsePathString(pathInput),pathCommand="M",mx3=0,my3=0,{max:max2,min}=Math,xMin=1/0,yMin=1/0,xMax=-1/0,yMax=-1/0,minX=0,minY=0,maxX=0,maxY=0,paramX1=0,paramY1=0,paramX2=0,paramY2=0,paramQX=0,paramQY=0;iterate(path,(seg,index,lastX,lastY)=>{[pathCommand]=seg;let absCommand=pathCommand.toUpperCase(),absoluteSegment=absCommand!==pathCommand?absolutizeSegment(seg,index,lastX,lastY):seg.slice(0),normalSegment=absCommand==="V"?["L",lastX,absoluteSegment[1]]:absCommand==="H"?["L",absoluteSegment[1],lastY]:absoluteSegment;if([pathCommand]=normalSegment,"TQ".includes(absCommand)||(paramQX=0,paramQY=0),pathCommand==="M")[,mx3,my3]=normalSegment,minX=mx3,minY=my3,maxX=mx3,maxY=my3;else if(pathCommand==="L")[minX,minY,maxX,maxY]=getLineBBox(lastX,lastY,normalSegment[1],normalSegment[2]);else if(pathCommand==="A")[minX,minY,maxX,maxY]=getArcBBox(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4],normalSegment[5],normalSegment[6],normalSegment[7]);else if(pathCommand==="S"){let cp1x=paramX1*2-paramX2,cp1y=paramY1*2-paramY2;[minX,minY,maxX,maxY]=getCubicBBox(lastX,lastY,cp1x,cp1y,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4])}else pathCommand==="C"?[minX,minY,maxX,maxY]=getCubicBBox(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4],normalSegment[5],normalSegment[6]):pathCommand==="T"?(paramQX=paramX1*2-paramQX,paramQY=paramY1*2-paramQY,[minX,minY,maxX,maxY]=getQuadBBox(lastX,lastY,paramQX,paramQY,normalSegment[1],normalSegment[2])):pathCommand==="Q"?(paramQX=normalSegment[1],paramQY=normalSegment[2],[minX,minY,maxX,maxY]=getQuadBBox(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4])):pathCommand==="Z"&&([minX,minY,maxX,maxY]=getLineBBox(lastX,lastY,mx3,my3));xMin=min(minX,xMin),yMin=min(minY,yMin),xMax=max2(maxX,xMax),yMax=max2(maxY,yMax),[paramX1,paramY1]=pathCommand==="Z"?[mx3,my3]:normalSegment.slice(-2),[paramX2,paramY2]=pathCommand==="C"?[normalSegment[3],normalSegment[4]]:pathCommand==="S"?[normalSegment[1],normalSegment[2]]:[paramX1,paramY1]});let width=xMax-xMin,height=yMax-yMin;return{width,height,x:xMin,y:yMin,x2:xMax,y2:yMax,cx:xMin+width/2,cy:yMin+height/2,cz:Math.max(width,height)+Math.min(width,height)/2}},getTotalLength=pathInput=>{let path=parsePathString(pathInput),paramX1=0,paramY1=0,paramX2=0,paramY2=0,paramQX=0,paramQY=0,pathCommand="M",mx3=0,my3=0,totalLength=0;return iterate(path,(seg,index,lastX,lastY)=>{[pathCommand]=seg;let absCommand=pathCommand.toUpperCase(),absoluteSegment=absCommand!==pathCommand?absolutizeSegment(seg,index,lastX,lastY):seg.slice(0),normalSegment=absCommand==="V"?["L",lastX,absoluteSegment[1]]:absCommand==="H"?["L",absoluteSegment[1],lastY]:absoluteSegment;if([pathCommand]=normalSegment,"TQ".includes(absCommand)||(paramQX=0,paramQY=0),pathCommand==="M")[,mx3,my3]=normalSegment;else if(pathCommand==="L")totalLength+=getLineLength(lastX,lastY,normalSegment[1],normalSegment[2]);else if(pathCommand==="A")totalLength+=getArcLength(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4],normalSegment[5],normalSegment[6],normalSegment[7]);else if(pathCommand==="S"){let cp1x=paramX1*2-paramX2,cp1y=paramY1*2-paramY2;totalLength+=getCubicLength(lastX,lastY,cp1x,cp1y,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4])}else pathCommand==="C"?totalLength+=getCubicLength(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4],normalSegment[5],normalSegment[6]):pathCommand==="T"?(paramQX=paramX1*2-paramQX,paramQY=paramY1*2-paramQY,totalLength+=getQuadLength(lastX,lastY,paramQX,paramQY,normalSegment[1],normalSegment[2])):pathCommand==="Q"?(paramQX=normalSegment[1],paramQY=normalSegment[2],totalLength+=getQuadLength(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4])):pathCommand==="Z"&&(totalLength+=getLineLength(lastX,lastY,mx3,my3));[paramX1,paramY1]=pathCommand==="Z"?[mx3,my3]:normalSegment.slice(-2),[paramX2,paramY2]=pathCommand==="C"?[normalSegment[3],normalSegment[4]]:pathCommand==="S"?[normalSegment[1],normalSegment[2]]:[paramX1,paramY1]}),totalLength},DISTANCE_EPSILON=1e-5,normalizePath=pathInput=>{let path=parsePathString(pathInput),params={...paramsParser};return iterate(path,(seg,_3,lastX,lastY)=>{params.x=lastX,params.y=lastY;let result=normalizeSegment(seg,params),seglen=result.length;return params.x1=+result[seglen-2],params.y1=+result[seglen-1],params.x2=+result[seglen-4]||params.x1,params.y2=+result[seglen-3]||params.y1,result})},getPointAtLength=(pathInput,distance8)=>{let path=normalizePath(pathInput),isM=!1,data=[],x4=0,y3=0,[mx3,my3]=path[0].slice(1),distanceIsNumber=typeof distance8=="number",point6={x:mx3,y:my3},length4=0,POINT=point6,totalLength=0;return!distanceIsNumber||distance8<1e-5?point6:(iterate(path,(seg,_3,lastX,lastY)=>{let pathCommand=seg[0];if(isM=pathCommand==="M",data=isM?data:[lastX,lastY].concat(seg.slice(1)),isM?([,mx3,my3]=seg,point6={x:mx3,y:my3},length4=0):pathCommand==="L"?(point6=getPointAtLineLength(data[0],data[1],data[2],data[3],distance8-totalLength),length4=getLineLength(data[0],data[1],data[2],data[3])):pathCommand==="A"?(point6=getPointAtArcLength(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8],distance8-totalLength),length4=getArcLength(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8])):pathCommand==="C"?(point6=getPointAtCubicLength(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],distance8-totalLength),length4=getCubicLength(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7])):pathCommand==="Q"?(point6=getPointAtQuadLength(data[0],data[1],data[2],data[3],data[4],data[5],distance8-totalLength),length4=getQuadLength(data[0],data[1],data[2],data[3],data[4],data[5])):pathCommand==="Z"&&(data=[lastX,lastY,mx3,my3],point6={x:mx3,y:my3},length4=getLineLength(data[0],data[1],data[2],data[3])),[x4,y3]=data.slice(-2),totalLength<distance8)POINT=point6;else return!1;totalLength+=length4}),distance8>totalLength-1e-5?{x:x4,y:y3}:POINT)},getPropertiesAtLength=(pathInput,distance8)=>{let pathArray=parsePathString(pathInput),pathTemp=pathArray.slice(0),pathLength4=getTotalLength(pathTemp),index=pathTemp.length-1,lengthAtSegment=0,length4=0,segment2=pathArray[0];if(index<=0||!distance8||!Number.isFinite(distance8))return{segment:segment2,index:0,length:length4,lengthAtSegment};if(distance8>=pathLength4)return pathTemp=pathArray.slice(0,-1),lengthAtSegment=getTotalLength(pathTemp),length4=pathLength4-lengthAtSegment,segment2=pathArray[index],{segment:segment2,index,length:length4,lengthAtSegment};let segments=[];for(;index>0;)segment2=pathTemp[index],pathTemp=pathTemp.slice(0,-1),lengthAtSegment=getTotalLength(pathTemp),length4=pathLength4-lengthAtSegment,pathLength4=lengthAtSegment,segments.push({segment:segment2,index,length:length4,lengthAtSegment}),index-=1;return segments.find(({lengthAtSegment:l7})=>l7<=distance8)},getPropertiesAtPoint=(pathInput,point6)=>{let path=parsePathString(pathInput),normalPath=normalizePath(path),pathLength4=getTotalLength(normalPath),distanceTo=p5=>{let dx3=p5.x-point6.x,dy3=p5.y-point6.y;return dx3*dx3+dy3*dy3},precision=8,scan,closest={x:0,y:0},scanDistance=0,bestLength=0,bestDistance=1/0;for(let scanLength=0;scanLength<=pathLength4;scanLength+=precision)scan=getPointAtLength(normalPath,scanLength),scanDistance=distanceTo(scan),scanDistance<bestDistance&&(closest=scan,bestLength=scanLength,bestDistance=scanDistance);precision/=2;let before,after,beforeLength=0,afterLength=0,beforeDistance=0,afterDistance=0;for(;precision>1e-6&&(beforeLength=bestLength-precision,before=getPointAtLength(normalPath,beforeLength),beforeDistance=distanceTo(before),afterLength=bestLength+precision,after=getPointAtLength(normalPath,afterLength),afterDistance=distanceTo(after),beforeLength>=0&&beforeDistance<bestDistance?(closest=before,bestLength=beforeLength,bestDistance=beforeDistance):afterLength<=pathLength4&&afterDistance<bestDistance?(closest=after,bestLength=afterLength,bestDistance=afterDistance):precision/=2,!(precision<1e-5)););let segment2=getPropertiesAtLength(path,bestLength);return{closest,distance:Math.sqrt(bestDistance),segment:segment2}},getClosestPoint=(pathInput,point6)=>getPropertiesAtPoint(pathInput,point6).closest,getCubicSegArea=(x12,y12,c1x,c1y,c2x,c2y,x22,y22)=>3*((y22-y12)*(c1x+c2x)-(x22-x12)*(c1y+c2y)+c1y*(x12-c2x)-c1x*(y12-c2y)+y22*(c2x+x12/3)-x22*(c2y+y12/3))/20,getPathArea=path=>{let x4=0,y3=0,len=0;return pathToCurve(path).map(seg=>seg[0]==="M"?([,x4,y3]=seg,0):(len=getCubicSegArea(x4,y3,seg[1],seg[2],seg[3],seg[4],seg[5],seg[6]),[x4,y3]=seg.slice(-2),len)).reduce((a3,b4)=>a3+b4,0)},getDrawDirection=path=>getPathArea(pathToCurve(path))>=0,getSegmentAtLength=(pathInput,distance8)=>getPropertiesAtLength(pathInput,distance8).segment,getSegmentOfPoint=(path,point6)=>getPropertiesAtPoint(path,point6).segment,isPathArray=path=>Array.isArray(path)&&path.every(seg=>{let lk2=seg[0].toLowerCase();return paramsCounts[lk2]===seg.length-1&&"achlmqstvz".includes(lk2)&&seg.slice(1).every(Number.isFinite)})&&path.length>0,isAbsoluteArray=path=>isPathArray(path)&&path.every(([x4])=>x4===x4.toUpperCase()),isNormalizedArray=path=>isAbsoluteArray(path)&&path.every(([pc3])=>"ACLMQZ".includes(pc3)),isPolygonArray=path=>isNormalizedArray(path)&&path.every(([pc3])=>"MLVHZ".includes(pc3)),isCurveArray=path=>isNormalizedArray(path)&&path.every(([pc3])=>"MC".includes(pc3)),isPointInStroke=(pathInput,point6)=>{let{distance:distance8}=getPropertiesAtPoint(pathInput,point6);return Math.abs(distance8)<DISTANCE_EPSILON},isRelativeArray=path=>isPathArray(path)&&path.slice(1).every(([pc3])=>pc3===pc3.toLowerCase()),isValidPath=pathString=>{if(typeof pathString!="string"||!pathString.length)return!1;let path=new PathParser(pathString);for(skipSpaces(path);path.index<path.max&&!path.err.length;)scanSegment(path);return!path.err.length&&"mM".includes(path.segments[0][0])};function samplePolygon(path){let points=[],[mx3,my3]=[0,0];return iterate(path,seg=>{let cmd=seg[0];if(cmd==="M")[mx3,my3]=[seg[1],seg[2]],points.push([mx3,my3]);else if(cmd==="L")points.push([seg[1],seg[2]]);else if(cmd==="C")points.push([seg[5],seg[6]]);else if(cmd==="A")points.push([seg[6],seg[7]]);else if(cmd==="Z")points.push([mx3,my3]);else throw new TypeError(`${error}: path command "${cmd}" is not supported`)}),points}var shapeParams={line:["x1","y1","x2","y2"],circle:["cx","cy","r"],ellipse:["cx","cy","rx","ry"],rect:["width","height","x","y","rx","ry"],polygon:["points"],polyline:["points"],glyph:["d"]},isElement=node=>node!=null&&typeof node=="object"&&node.nodeType===1,getLinePath=attr=>{let{x1:x12,y1:y12,x2:x22,y2:y22}=attr;return[x12,y12,x22,y22]=[x12,y12,x22,y22].map(a3=>+a3),[["M",x12,y12],["L",x22,y22]]},getPolyPath=attr=>{let pathArray=[],points=(attr.points||"").trim().split(/[\s|,]/).map(a3=>+a3),index=0;for(;index<points.length;)pathArray.push([index?"L":"M",points[index],points[index+1]]),index+=2;return attr.type==="polygon"?[...pathArray,["z"]]:pathArray},getCirclePath=attr=>{let{cx:cx3,cy:cy3,r:r6}=attr;return[cx3,cy3,r6]=[cx3,cy3,r6].map(a3=>+a3),[["M",cx3-r6,cy3],["a",r6,r6,0,1,0,2*r6,0],["a",r6,r6,0,1,0,-2*r6,0]]},getEllipsePath=attr=>{let{cx:cx3,cy:cy3}=attr,rx3=attr.rx||0,ry3=attr.ry||rx3;return[cx3,cy3,rx3,ry3]=[cx3,cy3,rx3,ry3].map(a3=>+a3),[["M",cx3-rx3,cy3],["a",rx3,ry3,0,1,0,2*rx3,0],["a",rx3,ry3,0,1,0,-2*rx3,0]]},getRectanglePath=attr=>{let x4=+attr.x||0,y3=+attr.y||0,w4=+attr.width,h3=+attr.height,rx3=+(attr.rx||0),ry3=+(attr.ry||rx3);return rx3||ry3?(rx3*2>w4&&(rx3-=(rx3*2-w4)/2),ry3*2>h3&&(ry3-=(ry3*2-h3)/2),[["M",x4+rx3,y3],["h",w4-rx3*2],["s",rx3,0,rx3,ry3],["v",h3-ry3*2],["s",0,ry3,-rx3,ry3],["h",-w4+rx3*2],["s",-rx3,0,-rx3,-ry3],["v",-h3+ry3*2],["s",0,-ry3,rx3,-ry3]]):[["M",x4,y3],["h",w4],["v",h3],["H",x4],["Z"]]},shapeToPathArray=element=>{let supportedShapes=Object.keys(shapeParams),targetIsElement=isElement(element),tagName=targetIsElement?element.tagName:null;if(tagName&&[...supportedShapes,"path"].every(s6=>tagName!==s6))throw TypeError(`${error}: "${tagName}" is not SVGElement`);let type=targetIsElement?tagName:element.type,shapeAttrs=shapeParams[type],config={type};targetIsElement?shapeAttrs.forEach(p5=>{config[p5]=element.getAttribute(p5)}):Object.assign(config,element);let pathArray=[];return type==="circle"?pathArray=getCirclePath(config):type==="ellipse"?pathArray=getEllipsePath(config):["polyline","polygon"].includes(type)?pathArray=getPolyPath(config):type==="rect"?pathArray=getRectanglePath(config):type==="line"?pathArray=getLinePath(config):["glyph","path"].includes(type)&&(pathArray=parsePathString(targetIsElement?element.getAttribute("d")||"":element.d||"")),isPathArray(pathArray)&&pathArray.length?pathArray:!1},shapeToPath=(element,replace,ownerDocument)=>{let doc=ownerDocument||document,supportedShapes=Object.keys(shapeParams),targetIsElement=isElement(element),tagName=targetIsElement?element.tagName:null;if(tagName==="path")throw TypeError(`${error}: "${tagName}" is already SVGPathElement`);if(tagName&&supportedShapes.every(s6=>tagName!==s6))throw TypeError(`${error}: "${tagName}" is not SVGElement`);let path=doc.createElementNS("http://www.w3.org/2000/svg","path"),type=targetIsElement?tagName:element.type,shapeAttrs=shapeParams[type],config={type},round=defaultOptions2.round,pathArray=shapeToPathArray(element),description=pathArray&&pathArray.length?pathToString(pathArray,round):"";if(targetIsElement){shapeAttrs.forEach(p5=>{config[p5]=element.getAttribute(p5)});for(let i3=0;i3<element.attributes.length;i3++){let attr=element.attributes[i3];attr&&!shapeAttrs.includes(attr.name)&&path.setAttribute(attr.name,attr.value)}}else Object.assign(config,element),Object.keys(config).forEach(k5=>{!shapeAttrs.includes(k5)&&k5!=="type"&&path.setAttribute(k5.replace(/[A-Z]/g,m4=>`-${m4.toLowerCase()}`),config[k5])});return isValidPath(description)?(path.setAttribute("d",description),replace&&targetIsElement&&(element.before(path,element),element.remove()),path):!1},isMultiPath=path=>{if(typeof path=="string"){let matches=path.match(/[Mm]/g);return matches?matches.length>1:!1}if(isPathArray(path)){let moveCount=0;for(let segment2 of path)if(segment2[0].toUpperCase()==="M"&&(moveCount++,moveCount>1))return!0;return!1}throw new TypeError(error+": expected string or PathArray")};function isPolylineArray(path){return isNormalizedArray(path)&&path.every(([pc3])=>"MLVH".includes(pc3))}var isClosedPath=path=>path[path.length-1][0].toUpperCase()==="Z",shortenSegment=(segment2,normalSegment,params,prevCommand)=>{let[pathCommand]=segment2,{round:defaultRound}=defaultOptions2,round=typeof defaultRound=="number"?defaultRound:4,normalValues=normalSegment.slice(1),{x1:x12,y1:y12,x2:x22,y2:y22,x:x4,y:y3}=params,[nx3,ny3]=normalValues.slice(-2),result=segment2;if("TQ".includes(pathCommand)||(params.qx=null,params.qy=null),pathCommand==="L"){if(roundTo(x4,round)===roundTo(nx3,round))return["V",ny3];if(roundTo(y3,round)===roundTo(ny3,round))return["H",nx3]}else if(pathCommand==="C"){let[nx1,ny1]=normalValues;if(params.x1=nx1,params.y1=ny1,"CS".includes(prevCommand)&&(roundTo(nx1,round)===roundTo(x12*2-x22,round)&&roundTo(ny1,round)===roundTo(y12*2-y22,round)||roundTo(x12,round)===roundTo(x22*2-x4,round)&&roundTo(y12,round)===roundTo(y22*2-y3,round)))return["S",normalValues[2],normalValues[3],normalValues[4],normalValues[5]]}else if(pathCommand==="Q"){let[qx3,qy3]=normalValues;if(params.qx=qx3,params.qy=qy3,"QT".includes(prevCommand)&&roundTo(qx3,round)===roundTo(x12*2-x22,round)&&roundTo(qy3,round)===roundTo(y12*2-y22,round))return["T",normalValues[2],normalValues[3]]}return result},roundSegment=(segment2,roundOption)=>{let values=segment2.slice(1).map(n3=>roundTo(n3,roundOption));return[segment2[0]].concat(values)},optimizePath=(pathInput,roundOption)=>{let path=pathToAbsolute(pathInput),round=typeof roundOption=="number"&&roundOption>=0?roundOption:2,optimParams={...paramsParser},allPathCommands=[],pathCommand="M",prevCommand="Z";return iterate(path,(seg,i3,lastX,lastY)=>{optimParams.x=lastX,optimParams.y=lastY;let normalizedSegment=normalizeSegment(seg,optimParams),result=seg;if(pathCommand=seg[0],allPathCommands[i3]=pathCommand,i3){prevCommand=allPathCommands[i3-1];let shortSegment=shortenSegment(seg,normalizedSegment,optimParams,prevCommand),absSegment=roundSegment(shortSegment,round),absString=absSegment.join(""),relSegment=roundSegment(relativizeSegment(shortSegment,i3,lastX,lastY),round),relString=relSegment.join("");result=absString.length<relString.length?absSegment:relSegment}let seglen=normalizedSegment.length;return optimParams.x1=+normalizedSegment[seglen-2],optimParams.y1=+normalizedSegment[seglen-1],optimParams.x2=+normalizedSegment[seglen-4]||optimParams.x1,optimParams.y2=+normalizedSegment[seglen-3]||optimParams.y1,result})},reversePath=pathInput=>{let absolutePath=pathToAbsolute(pathInput),normalizedPath=normalizePath(absolutePath),pLen=absolutePath.length,isClosed=absolutePath[pLen-1][0]==="Z",reversedPath=iterate(absolutePath,(segment2,i3)=>{let normalizedSegment=normalizedPath[i3],prevSeg=i3&&absolutePath[i3-1],prevCommand=prevSeg&&prevSeg[0],nextSeg=absolutePath[i3+1],nextCommand=nextSeg&&nextSeg[0],pathCommand=segment2[0],[x4,y3]=normalizedPath[i3?i3-1:pLen-1].slice(-2),result=segment2;switch(pathCommand){case"M":result=isClosed?["Z"]:[pathCommand,x4,y3];break;case"A":result=[pathCommand,segment2[1],segment2[2],segment2[3],segment2[4],segment2[5]===1?0:1,x4,y3];break;case"C":nextSeg&&nextCommand==="S"?result=["S",segment2[1],segment2[2],x4,y3]:result=[pathCommand,segment2[3],segment2[4],segment2[1],segment2[2],x4,y3];break;case"S":prevCommand&&"CS".includes(prevCommand)&&(!nextSeg||nextCommand!=="S")?result=["C",normalizedSegment[3],normalizedSegment[4],normalizedSegment[1],normalizedSegment[2],x4,y3]:result=[pathCommand,normalizedSegment[1],normalizedSegment[2],x4,y3];break;case"Q":nextSeg&&nextCommand==="T"?result=["T",x4,y3]:result=[pathCommand,segment2[1],segment2[2],x4,y3];break;case"T":prevCommand&&"QT".includes(prevCommand)&&(!nextSeg||nextCommand!=="T")?result=["Q",normalizedSegment[1],normalizedSegment[2],x4,y3]:result=[pathCommand,x4,y3];break;case"Z":result=["M",x4,y3];break;case"H":result=[pathCommand,x4];break;case"V":result=[pathCommand,y3];break;default:result=[pathCommand].concat(segment2.slice(1,-2),x4,y3)}return result});return isClosed?reversedPath.reverse():[reversedPath[0]].concat(reversedPath.slice(1).reverse())},splitPath=pathInput=>{let composite=[],parsedPath=parsePathString(pathInput),path=[],pi3=-1,x4=0,y3=0,mx3=0,my3=0;return iterate(parsedPath,(seg,_3,prevX,prevY)=>{let cmd=seg[0],absCommand=cmd.toUpperCase(),isRelative=cmd===cmd.toLowerCase(),values=seg.slice(1);absCommand==="M"?(pi3+=1,[x4,y3]=values,x4+=isRelative?prevX:0,y3+=isRelative?prevY:0,mx3=x4,my3=y3,path=[isRelative?[absCommand,mx3,my3]:seg]):(absCommand==="Z"?(x4=mx3,y3=my3):absCommand==="H"?([,x4]=seg,x4+=isRelative?prevX:0):absCommand==="V"?([,y3]=seg,y3+=isRelative?prevY:0):([x4,y3]=seg.slice(-2),x4+=isRelative?prevX:0,y3+=isRelative?prevY:0),path.push(seg)),composite[pi3]=path}),composite},getSVGMatrix=transform7=>{let matrix2=new h,{origin}=transform7,[originX,originY]=origin,{translate:translate6}=transform7,{rotate:rotate5}=transform7,{skew}=transform7,{scale:scale6}=transform7;return Array.isArray(translate6)&&translate6.length>=2&&translate6.every(x4=>!Number.isNaN(+x4))&&translate6.some(x4=>x4!==0)?matrix2=matrix2.translate(...translate6):typeof translate6=="number"&&!Number.isNaN(translate6)&&(matrix2=matrix2.translate(translate6)),(rotate5||skew||scale6)&&(matrix2=matrix2.translate(originX,originY),Array.isArray(rotate5)&&rotate5.length>=2&&rotate5.every(x4=>!Number.isNaN(+x4))&&rotate5.some(x4=>x4!==0)?matrix2=matrix2.rotate(...rotate5):typeof rotate5=="number"&&!Number.isNaN(rotate5)&&(matrix2=matrix2.rotate(rotate5)),Array.isArray(skew)&&skew.length===2&&skew.every(x4=>!Number.isNaN(+x4))&&skew.some(x4=>x4!==0)?(matrix2=skew[0]?matrix2.skewX(skew[0]):matrix2,matrix2=skew[1]?matrix2.skewY(skew[1]):matrix2):typeof skew=="number"&&!Number.isNaN(skew)&&(matrix2=matrix2.skewX(skew)),Array.isArray(scale6)&&scale6.length>=2&&scale6.every(x4=>!Number.isNaN(+x4))&&scale6.some(x4=>x4!==1)?matrix2=matrix2.scale(...scale6):typeof scale6=="number"&&!Number.isNaN(scale6)&&(matrix2=matrix2.scale(scale6)),matrix2=matrix2.translate(-originX,-originY)),matrix2},translatePoint=(cssm,v3)=>{let m4=h.Translate(v3[0],v3[1],v3[2]);return[,,,m4.m44]=v3,m4=cssm.multiply(m4),[m4.m41,m4.m42,m4.m43,m4.m44]},projection2d=(m4,point2D,origin)=>{let[originX,originY,originZ]=origin,[x4,y3,z5]=translatePoint(m4,[point2D[0],point2D[1],0,1]),relativePositionX=x4-originX,relativePositionY=y3-originY,relativePositionZ=z5-originZ;return[relativePositionX*(Math.abs(originZ)/Math.abs(relativePositionZ)||1)+originX,relativePositionY*(Math.abs(originZ)/Math.abs(relativePositionZ)||1)+originY]},transformPath=(pathInput,transform7)=>{let x4=0,y3=0,lx3=0,ly3=0,j5=0,jj=0,path=parsePathString(pathInput),transformProps=transform7&&Object.keys(transform7);if(!transform7||transformProps&&!transformProps.length)return path.slice(0);transform7.origin||Object.assign(transform7,{origin:defaultOptions2.origin});let origin=transform7.origin,matrixInstance=getSVGMatrix(transform7);return matrixInstance.isIdentity?path.slice(0):iterate(path,(seg,index,lastX,lastY)=>{let[pathCommand]=seg,absCommand=pathCommand.toUpperCase(),absoluteSegment=absCommand!==pathCommand?absolutizeSegment(seg,index,lastX,lastY):seg.slice(0),result=absCommand==="A"?["C"].concat(arcToCubic(lastX,lastY,absoluteSegment[1],absoluteSegment[2],absoluteSegment[3],absoluteSegment[4],absoluteSegment[5],absoluteSegment[6],absoluteSegment[7])):absCommand==="V"?["L",lastX,absoluteSegment[1]]:absCommand==="H"?["L",absoluteSegment[1],lastY]:absoluteSegment;pathCommand=result[0];let isLongArc=pathCommand==="C"&&result.length>7,tempSegment=isLongArc?result.slice(0,7):result.slice(0);if(isLongArc&&(path.splice(index+1,0,["C"].concat(result.slice(7))),result=tempSegment),pathCommand==="L")[lx3,ly3]=projection2d(matrixInstance,[result[1],result[2]],origin),x4!==lx3&&y3!==ly3?result=["L",lx3,ly3]:y3===ly3?result=["H",lx3]:x4===lx3&&(result=["V",ly3]);else for(j5=1,jj=result.length;j5<jj;j5+=2)[lx3,ly3]=projection2d(matrixInstance,[+result[j5],+result[j5+1]],origin),result[j5]=lx3,result[j5+1]=ly3;return x4=lx3,y3=ly3,result})},reverseCurve=path=>{let rotatedCurve=path.slice(1).map((x4,i3,curveOnly)=>i3?curveOnly[i3-1].slice(-2).concat(x4.slice(1)):path[0].slice(1).concat(x4.slice(1))).map(x4=>x4.map((_3,i3)=>x4[x4.length-i3-2*(1-i3%2)])).reverse();return[["M"].concat(rotatedCurve[0].slice(0,2))].concat(rotatedCurve.map(x4=>["C"].concat(x4.slice(2))))},roundPath=(path,roundOption)=>{let{round}=defaultOptions2;return round=roundOption==="off"||typeof roundOption=="number"&&roundOption>=0?roundOption:typeof round=="number"&&round>=0?round:"off",round==="off"?path.slice(0):iterate(path,segment2=>roundSegment(segment2,round))},fixPath=pathInput=>{let pathArray=parsePathString(pathInput);if(isClosedPath(pathArray)){let normalArray=normalizePath(pathArray),length4=pathArray.length,segBeforeZ=length4-2,[mx3,my3]=normalArray[0].slice(1),[x4,y3]=normalArray[segBeforeZ].slice(-2);mx3===x4&&my3===y3&&pathArray.splice(length4-1,1)}};function splitCubicSegment(x12,y12,x22,y22,x32,y3,x4,y4,t54){let[px01,py01]=midPoint([x12,y12],[x22,y22],t54),[px12,py12]=midPoint([x22,y22],[x32,y3],t54),[px23,py23]=midPoint([x32,y3],[x4,y4],t54),[cx0,cy0]=midPoint([px01,py01],[px12,py12],t54),[cx1,cy1]=midPoint([px12,py12],[px23,py23],t54),[px3,py3]=midPoint([cx0,cy0],[cx1,cy1],t54);return[[x12,y12,px01,py01,cx0,cy0,px3,py3],[px3,py3,cx1,cy1,px23,py23,x4,y4]]}var pathToPolyline=path=>{let normal=normalizePath(path);if(!isPolygonArray(normal)&&!isPolylineArray(normal))throw TypeError(`${error}: pathValue is not a polyline/polygon`);if(!isClosedPath(normal))return normal;let result=[normal[0]],[mx3,my3]=normal[0].slice(1);for(let i3=1;i3<normal.length;i3++){let seg=normal[i3];seg[0].toUpperCase()==="Z"?result.push(["L",mx3,my3]):result.push(seg)}return result};function splitLineToCount(x12,y12,x22,y22,count){if(count<=1)return[[x12,y12,x22,y22]];let result=[],dx3=x22-x12,dy3=y22-y12,currentX=x12,currentY=y12,i3=0;for(;i3<count;){let t54=1/(count-i3),nextX=x12+t54*dx3,nextY=y12+t54*dy3;result.push([currentX,currentY,nextX,nextY]),currentX=nextX,currentY=nextY,i3++}return result}function getPathSplits(path,target){if(target<=1)throw new TypeError(`${error}: target must be >= 2`);let totalLength=getTotalLength(path);if(totalLength===0)return Array(path.length).fill(1);let idealSegLen=totalLength/target,isPoly=isPolylineArray(path),splits=[1],lengths=[0];iterate(path,(seg,i3,prevX,prevY)=>{if(i3>0){let[endX,endY]=seg.slice(-2),segLen=isPoly?getLineLength(prevX,prevY,endX,endY):getCubicLength(prevX,prevY,seg[1],seg[2],seg[3],seg[4],seg[5],seg[6]);lengths.push(segLen),splits.push(1)}});let totalAllocated=1;for(let i3=1;i3<lengths.length;i3++){let segLen=lengths[i3],desired=segLen>idealSegLen?Math.round(segLen/idealSegLen):1;splits[i3]=desired,totalAllocated+=desired}let diff=target-totalAllocated;if(diff!==0){let candidates=[];for(let i3=1;i3<lengths.length;i3++)lengths[i3]>0&&candidates.push([i3,lengths[i3]]);let cLen=candidates.length;if(diff<0){candidates.sort((a3,b4)=>a3[1]-b4[1]);for(let i3=0;i3<cLen;i3++){let idx=candidates[i3][0];if(splits[idx]>1&&candidates[i3][1]>0&&(splits[idx]--,diff++),diff===0)break;i3===cLen-1&&(i3=0)}}else if(diff>0){candidates.sort((a3,b4)=>b4[1]-a3[1]);for(let i3=0;i3<cLen;i3++){let idx=candidates[i3][0];if(candidates[i3][1]>0&&(splits[idx]++,diff--),diff===0)break;i3===cLen-1&&(i3=0)}}}return splits}function splitLinePathToCount(path,target){if(path.length<2||target<=1)return path;let splits=getPathSplits(path,target),totalAdded=0,newPath=[path[0]],pathLen=path.length,currentX=path[0][1],currentY=path[0][2];for(let i3=1;i3<pathLen;i3++){let[endX,endY]=path[i3].slice(1),count=splits[i3];if(count>=1){let subLines=splitLineToCount(currentX,currentY,endX,endY,count);for(let sub of subLines)newPath.push(["L",sub[2],sub[3]]),totalAdded++}currentX=endX,currentY=endY}return newPath.length!==target&&console.warn(`${error}: requested ${target} segments, got ${newPath.length}. Adjusted on last segment.`),newPath}function splitCubicToCount(x12,y12,x22,y22,x32,y3,x4,y4,count){if(count<=1)return[[x12,y12,x22,y22,x32,y3,x4,y4]];let result=[],cx1=x12,cy1=y12,cx22=x22,cy22=y22,cx3=x32,cy3=y3,cx4=x4,cy4=y4,i3=0;for(;i3<count;){let t54=1/(count-i3),[first,second]=splitCubicSegment(cx1,cy1,cx22,cy22,cx3,cy3,cx4,cy4,t54);result.push(first),[cx1,cy1,cx22,cy22,cx3,cy3,cx4,cy4]=second,i3++}return result}function splitCurvePathToCount(path,target){if(path.length<2||target<=1)return path;let splits=getPathSplits(path,target),totalAdded=0,newPath=[path[0]],pathLen=path.length,currentX=path[0][1],currentY=path[0][2];for(let i3=1;i3<pathLen;i3++){let seg=path[i3],[endX,endY]=seg.slice(-2),count=splits[i3];if(count>=1){let subs=splitCubicToCount(currentX,currentY,seg[1],seg[2],seg[3],seg[4],seg[5],seg[6],count);for(let sub of subs)newPath.push(["C",sub[2],sub[3],sub[4],sub[5],sub[6],sub[7]]),totalAdded++}currentX=endX,currentY=endY}return newPath.length!==target&&console.warn(`${error}: requested ${target} segments, got ${newPath.length}.`),newPath}function getRotations(a3){let pathLen=a3.length,pointCount=pathLen-1,path,result=[];for(let idx=0;idx<pathLen;idx++){path=[];for(let i3=0;i3<pathLen;i3++){let oldSegIdx=idx+i3,seg;if(i3===0||a3[oldSegIdx]&&a3[oldSegIdx][0]==="M"){seg=a3[oldSegIdx],path.push(["M",...seg.slice(-2)]);continue}oldSegIdx>=pathLen&&(oldSegIdx-=pointCount),path.push(a3[oldSegIdx])}result.push(path)}return result}function getRotatedPath(pathA,pathB,computedRotations){let rotations=computedRotations||getRotations(pathA);if(pathA.length!==pathB.length)throw new TypeError(error+": paths must have the same number of segments after equalization");let bestIndex=0,minDistanceSq=1/0;for(let ri3=0;ri3<rotations.length;ri3++){let rotation5=rotations[ri3],rLen=rotation5.length,sumDistSq=0;for(let i3=0;i3<rLen;i3++){let segA=rotation5[i3],segB=pathB[i3],endA=segA.slice(-2),endB=segB.slice(-2),dx3=endA[0]-endB[0],dy3=endA[1]-endB[1];sumDistSq+=dx3*dx3+dy3*dy3}sumDistSq<minDistanceSq&&(minDistanceSq=sumDistSq,bestIndex=ri3)}return rotations[bestIndex]}var equalizeSegmentsDefaults={mode:"auto",sampleSize:10,roundValues:4,reverse:!0,close:!1,target:void 0},equalizeSegments=(path1,path2,initialCfg={})=>{let{close,mode,reverse,roundValues,target:initialTarget}=Object.assign(equalizeSegmentsDefaults,initialCfg),p12=normalizePath(path1),p22=normalizePath(path2);fixPath(p12),fixPath(p22);let bothPoly=(isPolygonArray(p12)||isPolylineArray(p12))&&(isPolygonArray(p22)||isPolylineArray(p22));bothPoly&&mode==="auto"?(p12=pathToPolyline(p12),p22=pathToPolyline(p22)):(bothPoly=!1,p12=pathToCurve(p12),p22=pathToCurve(p22));let area1=polygonArea(samplePolygon(p12)),area2=polygonArea(samplePolygon(p22));reverse!==!1&&Math.sign(area1)!==Math.sign(area2)&&(p22=reversePath(p22));let segCount1=p12.length,segCount2=p22.length,minTarget=Math.max(segCount1,segCount2),target=minTarget;if(typeof initialTarget!="number"){let avgLen=(getTotalLength(p12)+getTotalLength(p22))/2,avgSegLen=avgLen/Math.max(segCount1,segCount2),idealSegCount=Math.max(minTarget,Math.round(avgLen/Math.max(avgSegLen,1)));target=Math.min(idealSegCount,Math.max(segCount1,segCount2)*3)}else initialTarget>=minTarget?target=initialTarget:console.warn('equalizeSegments "target" option: '+initialTarget+", expected >= "+minTarget);let equalP1=p12,equalP2=p22;return bothPoly?(equalP1=splitLinePathToCount(p12,target),equalP2=splitLinePathToCount(p22,target)):(equalP1=splitCurvePathToCount(p12,target),equalP2=splitCurvePathToCount(p22,target)),equalP2=getRotatedPath(equalP2,equalP1),typeof roundValues=="number"&&roundValues!==4&&(equalP1=roundPath(equalP1,roundValues),equalP2=roundPath(equalP2,roundValues)),close&&(equalP1.push(["Z"]),equalP2.push(["Z"])),[equalP1,equalP2]},isPointInsideBBox=(bbox,[x4,y3])=>{let[minX,minY,maxX,maxY]=bbox;return x4>=minX&&x4<=maxX&&y3>=minY&&y3<=maxY},boundingBoxIntersect=(a3,b4)=>{let[ax1,ay1,ax22,ay22]=a3,[bx1,by1,bx22,by22]=b4;return isPointInsideBBox(b4,[ax1,ay1])||isPointInsideBBox(b4,[ax22,ay1])||isPointInsideBBox(b4,[ax1,ay22])||isPointInsideBBox(b4,[ax22,ay22])||isPointInsideBBox(a3,[bx1,by1])||isPointInsideBBox(a3,[bx22,by1])||isPointInsideBBox(a3,[bx1,by22])||isPointInsideBBox(a3,[bx22,by22])||(ax1<bx22&&ax1>bx1||bx1<ax22&&bx1>ax1)&&(ay1<by22&&ay1>by1||by1<ay22&&by1>ay1)},createPlaceholder=([atx,aty])=>[["M",atx,aty],["L",atx+.001,aty],["L",atx+.001,aty+.001],["L",atx,aty+.001],["L",atx,aty],["Z"]];function getBestMatch(target,candidates){let targetBBox=target.bbox,potentialCandidates=[];for(let i3=0;i3<candidates.length;i3++){let{bbox,size:size3}=candidates[i3],dx3=targetBBox.cx-bbox.cx,dy3=targetBBox.cy-bbox.cy,centeredDistance=Math.sqrt(dx3*dx3+dy3*dy3),sizeDifference=Math.abs(target.size-size3)/Math.max(target.size,size3,1e-6),hasOverlap=isPointInsideBBox([targetBBox.x,targetBBox.y,targetBBox.x2,targetBBox.y2],[bbox.cx,bbox.cy])||isPointInsideBBox([bbox.x,bbox.y,bbox.x2,bbox.y2],[targetBBox.cx,targetBBox.cy]),boxIntersect=boundingBoxIntersect([targetBBox.x,targetBBox.y,targetBBox.x2,targetBBox.y2],[bbox.x,bbox.y,bbox.x2,bbox.y2]);potentialCandidates.push({index:i3,hasOverlap,boxIntersect,sizeDifference,centeredDistance})}let overlaping=potentialCandidates.filter(c6=>c6.hasOverlap&&c6.boxIntersect);if(overlaping.length>0){let best=overlaping[0];for(let i3=1;i3<overlaping.length;i3++)overlaping[i3].centeredDistance<best.centeredDistance&&(best=overlaping[i3]);return candidates.splice(best.index,1)[0]}return null}function matchPaths(fromPaths,toPaths){let pairs5=[];for(fromPaths.sort((a3,b4)=>b4.size-a3.size),toPaths.sort((a3,b4)=>b4.size-a3.size);fromPaths.length>0;){let from=fromPaths.shift(),bestTo=getBestMatch(from,toPaths);if(bestTo)pairs5.push([from.path,bestTo.path]);else{let fromCentroid=[from.bbox.cx,from.bbox.cy];pairs5.push([from.path,createPlaceholder(fromCentroid)])}}for(;toPaths.length>0;){let to3=toPaths.shift(),toCentroid=[to3.bbox.cx,to3.bbox.cy];pairs5.push([createPlaceholder(toCentroid),to3.path])}return pairs5}var classifyPaths=paths=>{let outers=[],inners=[];for(let path of paths){let signedArea3=polygonArea(samplePolygon(path)),bbox=getPathBBox(path),feature={isPoly:isPolygonArray(path)||isPolylineArray(path),size:bbox.width*bbox.height,path,signedArea:signedArea3,area:Math.abs(signedArea3),bbox};signedArea3>0?outers.push(feature):inners.push(feature)}return{outers,inners}},equalizePathsDefaults={mode:"auto",roundValues:4,close:!1,sampleSize:10},equalizePaths=(pathInput1,pathInput2,initialCfg={})=>{let cfg=Object.assign(equalizePathsDefaults,initialCfg),p12=normalizePath(pathInput1),p22=normalizePath(pathInput2),multi1=isMultiPath(p12),multi2=isMultiPath(p22);if(!multi1&&!multi2)return equalizeSegments(p12,p22,cfg);let globalArea1=polygonArea(samplePolygon(p12)),globalArea2=polygonArea(samplePolygon(p22)),path1=p12,path2=p22;Math.sign(globalArea1)<0&&(path1=reversePath(path1)),Math.sign(globalArea2)<0&&(path2=reversePath(path2));let multiPath1=splitPath(path1),multiPath2=splitPath(path2),{outers:outers1,inners:inners1}=classifyPaths(multiPath1),{outers:outers2,inners:inners2}=classifyPaths(multiPath2),outerPairs=matchPaths(outers1,outers2),innerPairs=matchPaths(inners1,inners2),equalizedPairs=[];for(let[from,to3]of[...outerPairs,...innerPairs]){let[eqFrom,eqTo]=equalizeSegments(from,to3,{...cfg,reverse:!1});equalizedPairs.push([eqFrom,eqTo])}return[equalizedPairs.map(p5=>p5[0]).flat(),equalizedPairs.map(p5=>p5[1]).flat()]},intersect2=(x12,y12,x22,y22,x32,y3,x4,y4)=>{if(Math.max(x12,x22)<Math.min(x32,x4)||Math.min(x12,x22)>Math.max(x32,x4)||Math.max(y12,y22)<Math.min(y3,y4)||Math.min(y12,y22)>Math.max(y3,y4))return;let nx3=(x12*y22-y12*x22)*(x32-x4)-(x12-x22)*(x32*y4-y3*x4),ny3=(x12*y22-y12*x22)*(y3-y4)-(y12-y22)*(x32*y4-y3*x4),denominator=(x12-x22)*(y3-y4)-(y12-y22)*(x32-x4);if(!denominator)return;let px3=nx3/denominator,py3=ny3/denominator,px22=roundTo(px3,2),py22=roundTo(py3,2);if(!(px22<roundTo(Math.min(x12,x22),2)||px22>roundTo(Math.max(x12,x22),2)||px22<roundTo(Math.min(x32,x4),2)||px22>roundTo(Math.max(x32,x4),2)||py22<roundTo(Math.min(y12,y22),2)||py22>roundTo(Math.max(y12,y22),2)||py22<roundTo(Math.min(y3,y4),2)||py22>roundTo(Math.max(y3,y4),2)))return{x:px3,y:py3}},interHelper=(bez1,bez2,config)=>{let bbox1=getCubicBBox(...bez1),bbox2=getCubicBBox(...bez2),{justCount,epsilon}=Object.assign({justCount:!0,epsilon:DISTANCE_EPSILON},config);if(!boundingBoxIntersect(bbox1,bbox2))return justCount?0:[];let l12=getCubicLength(...bez1),l22=getCubicLength(...bez2),n12=Math.max(l12/5>>0,1),n22=Math.max(l22/5>>0,1),points1=[],points2=[],xy3={},res2=justCount?0:[];for(let i3=0;i3<n12+1;i3++){let p5=getPointAtCubicLength(...bez1,i3/n12*l12);points1.push({x:p5.x,y:p5.y,t:i3/n12})}for(let i3=0;i3<n22+1;i3++){let p5=getPointAtCubicLength(...bez2,i3/n22*l22);points2.push({x:p5.x,y:p5.y,t:i3/n22})}for(let i3=0;i3<n12;i3++)for(let j5=0;j5<n22;j5++){let maxLimit=1+epsilon,di3=points1[i3],di1=points1[i3+1],dj2=points2[j5],dj1=points2[j5+1],ci3=Math.abs(di1.x-di3.x)<.001?"y":"x",cj2=Math.abs(dj1.x-dj2.x)<.001?"y":"x",is4=intersect2(di3.x,di3.y,di1.x,di1.y,dj2.x,dj2.y,dj1.x,dj1.y);if(is4){if(xy3[is4.x.toFixed(4)]==is4.y.toFixed(4))continue;xy3[is4.x.toFixed(4)]=is4.y.toFixed(4);let t110=di3.t+Math.abs((is4[ci3]-di3[ci3])/(di1[ci3]-di3[ci3]))*(di1.t-di3.t),t210=dj2.t+Math.abs((is4[cj2]-dj2[cj2])/(dj1[cj2]-dj2[cj2]))*(dj1.t-dj2.t);t110>=0&&t110<=maxLimit&&t210>=0&&t210<=maxLimit&&(justCount?res2++:res2.push({x:is4.x,y:is4.y,t1:Math.min(t110,1),t2:Math.min(t210,1)}))}}return res2},pathsIntersection=(pathInput1,pathInput2,justCount=!0)=>{let path1=pathToCurve(pathInput1),path2=pathToCurve(pathInput2),x12=0,y12=0,x22=0,y22=0,x1m=0,y1m=0,x2m=0,y2m=0,bez1=[x12,y12,x12,y12,x1m,y1m,x1m,y1m],bez2=[x22,y22,x22,y22,x2m,y2m,x2m,y2m],countResult=0,pointsResult=[],pathLen1=path1.length,pathLen2=path2.length;for(let i3=0;i3<pathLen1;i3++){let seg1=path1[i3];if(seg1[0]=="M")x12=seg1[1],y12=seg1[2],x1m=x12,y1m=y12;else{seg1[0]=="C"?(bez1=[x12,y12,seg1[1],seg1[2],seg1[3],seg1[4],seg1[5],seg1[6]],x12=bez1[6],y12=bez1[7]):(bez1=[x12,y12,x12,y12,x1m,y1m,x1m,y1m],x12=x1m,y12=y1m);for(let j5=0;j5<pathLen2;j5++){let seg2=path2[j5];seg2[0]=="M"?(x22=seg2[1],y22=seg2[2],x2m=x22,y2m=y22):seg2[0]=="C"&&(bez2=[x22,y22,seg2[1],seg2[2],seg2[3],seg2[4],seg2[5],seg2[6]],x22=bez2[6],y22=bez2[7]);let intr=interHelper(bez1,bez2,{justCount});justCount?countResult+=intr:pointsResult.push(...intr)}}}return justCount?countResult:pointsResult},_a4,SVGPathCommander=(_a4=class{constructor(pathValue,config){let instanceOptions=config||{},undefPath=typeof pathValue>"u";if(undefPath||!pathValue.length)throw TypeError(`${error}: "pathValue" is ${undefPath?"undefined":"empty"}`);this.segments=parsePathString(pathValue);let{round:roundOption,origin:originOption}=instanceOptions,round;Number.isInteger(roundOption)||roundOption==="off"?round=roundOption:round=defaultOptions2.round;let origin=defaultOptions2.origin;if(Array.isArray(originOption)&&originOption.length>=2){let[originX,originY,originZ]=originOption.map(Number);origin=[Number.isNaN(originX)?0:originX,Number.isNaN(originY)?0:originY,Number.isNaN(originZ)?0:originZ]}return this.round=round,this.origin=origin,this}get bbox(){return getPathBBox(this.segments)}get length(){return getTotalLength(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(length4){return getPointAtLength(this.segments,length4)}toAbsolute(){let{segments}=this;return this.segments=pathToAbsolute(segments),this}toRelative(){let{segments}=this;return this.segments=pathToRelative(segments),this}toCurve(){let{segments}=this;return this.segments=pathToCurve(segments),this}reverse(onlySubpath){let{segments}=this,split=splitPath(segments),subPath=split.length>1?split:!1,absoluteMultiPath=subPath?subPath.map((x4,i3)=>onlySubpath?i3?reversePath(x4):x4.slice(0):reversePath(x4)):segments.slice(0),path=[];return subPath?path=absoluteMultiPath.flat(1):path=onlySubpath?segments:reversePath(segments),this.segments=path.slice(0),this}normalize(){let{segments}=this;return this.segments=normalizePath(segments),this}optimize(){let{segments}=this;return this.segments=optimizePath(segments,this.round==="off"?2:this.round),this}transform(source){if(!source||typeof source!="object"||typeof source=="object"&&!["translate","rotate","skew","scale"].some(x4=>x4 in source))return this;let{segments,origin:[cx3,cy3,cz2]}=this,transform7={};for(let[k5,v3]of Object.entries(source))k5==="skew"&&Array.isArray(v3)||(k5==="rotate"||k5==="translate"||k5==="origin"||k5==="scale")&&Array.isArray(v3)?transform7[k5]=v3.map(Number):k5!=="origin"&&typeof Number(v3)=="number"&&(transform7[k5]=Number(v3));let{origin}=transform7;if(Array.isArray(origin)&&origin.length>=2){let[originX,originY,originZ]=origin.map(Number);transform7.origin=[Number.isNaN(originX)?cx3:originX,Number.isNaN(originY)?cy3:originY,originZ||cz2]}else transform7.origin=[cx3,cy3,cz2];return this.segments=transformPath(segments,transform7),this}flipX(){let{cx:cx3,cy:cy3}=this.bbox;return this.transform({rotate:[0,180,0],origin:[cx3,cy3,0]}),this}flipY(){let{cx:cx3,cy:cy3}=this.bbox;return this.transform({rotate:[180,0,0],origin:[cx3,cy3,0]}),this}toString(){return pathToString(this.segments,this.round)}dispose(){Object.keys(this).forEach(key=>delete this[key])}},__publicField(_a4,"options",defaultOptions2),__publicField(_a4,"CSSMatrix",h),__publicField(_a4,"arcTools",arcTools),__publicField(_a4,"bezierTools",bezierTools),__publicField(_a4,"cubicTools",cubicTools),__publicField(_a4,"lineTools",lineTools),__publicField(_a4,"polygonTools",polygonTools),__publicField(_a4,"quadTools",quadTools),__publicField(_a4,"pathToAbsolute",pathToAbsolute),__publicField(_a4,"pathToRelative",pathToRelative),__publicField(_a4,"pathToCurve",pathToCurve),__publicField(_a4,"pathToString",pathToString),__publicField(_a4,"distanceSquareRoot",distanceSquareRoot),__publicField(_a4,"midPoint",midPoint),__publicField(_a4,"rotateVector",rotateVector),__publicField(_a4,"roundTo",roundTo),__publicField(_a4,"parsePathString",parsePathString),__publicField(_a4,"finalizeSegment",finalizeSegment),__publicField(_a4,"invalidPathValue",invalidPathValue),__publicField(_a4,"isArcCommand",isArcCommand),__publicField(_a4,"isDigit",isDigit),__publicField(_a4,"isDigitStart",isDigitStart),__publicField(_a4,"isMoveCommand",isMoveCommand),__publicField(_a4,"isPathCommand",isPathCommand),__publicField(_a4,"isSpace",isSpace),__publicField(_a4,"paramsCount",paramsCounts),__publicField(_a4,"paramsParser",paramsParser),__publicField(_a4,"PathParser",PathParser),__publicField(_a4,"scanFlag",scanFlag),__publicField(_a4,"scanParam",scanParam),__publicField(_a4,"scanSegment",scanSegment),__publicField(_a4,"skipSpaces",skipSpaces),__publicField(_a4,"distanceEpsilon",DISTANCE_EPSILON),__publicField(_a4,"fixPath",fixPath),__publicField(_a4,"getClosestPoint",getClosestPoint),__publicField(_a4,"getDrawDirection",getDrawDirection),__publicField(_a4,"getPathArea",getPathArea),__publicField(_a4,"getPathBBox",getPathBBox),__publicField(_a4,"getPointAtLength",getPointAtLength),__publicField(_a4,"getPropertiesAtLength",getPropertiesAtLength),__publicField(_a4,"getPropertiesAtPoint",getPropertiesAtPoint),__publicField(_a4,"getSegmentAtLength",getSegmentAtLength),__publicField(_a4,"getSegmentOfPoint",getSegmentOfPoint),__publicField(_a4,"getTotalLength",getTotalLength),__publicField(_a4,"isAbsoluteArray",isAbsoluteArray),__publicField(_a4,"isCurveArray",isCurveArray),__publicField(_a4,"isPolygonArray",isPolygonArray),__publicField(_a4,"isNormalizedArray",isNormalizedArray),__publicField(_a4,"isPathArray",isPathArray),__publicField(_a4,"isPointInStroke",isPointInStroke),__publicField(_a4,"isRelativeArray",isRelativeArray),__publicField(_a4,"isValidPath",isValidPath),__publicField(_a4,"samplePolygon",samplePolygon),__publicField(_a4,"shapeParams",shapeParams),__publicField(_a4,"shapeToPath",shapeToPath),__publicField(_a4,"shapeToPathArray",shapeToPathArray),__publicField(_a4,"absolutizeSegment",absolutizeSegment),__publicField(_a4,"arcToCubic",arcToCubic),__publicField(_a4,"getSVGMatrix",getSVGMatrix),__publicField(_a4,"iterate",iterate),__publicField(_a4,"lineToCubic",lineToCubic),__publicField(_a4,"normalizePath",normalizePath),__publicField(_a4,"normalizeSegment",normalizeSegment),__publicField(_a4,"optimizePath",optimizePath),__publicField(_a4,"projection2d",projection2d),__publicField(_a4,"quadToCubic",quadToCubic),__publicField(_a4,"relativizeSegment",relativizeSegment),__publicField(_a4,"reverseCurve",reverseCurve),__publicField(_a4,"reversePath",reversePath),__publicField(_a4,"roundPath",roundPath),__publicField(_a4,"roundSegment",roundSegment),__publicField(_a4,"segmentToCubic",segmentToCubic),__publicField(_a4,"shortenSegment",shortenSegment),__publicField(_a4,"splitPath",splitPath),__publicField(_a4,"equalizePaths",equalizePaths),__publicField(_a4,"equalizeSegments",equalizeSegments),__publicField(_a4,"splitCubicSegment",splitCubicSegment),__publicField(_a4,"transformPath",transformPath),__publicField(_a4,"isPointInsideBBox",isPointInsideBBox),__publicField(_a4,"pathsIntersection",pathsIntersection),__publicField(_a4,"boundingBoxIntersect",boundingBoxIntersect),__publicField(_a4,"isMultiPath",isMultiPath),__publicField(_a4,"isClosedPath",isClosedPath),__publicField(_a4,"isPolylineArray",isPolylineArray),__publicField(_a4,"version",version),_a4),src_default=SVGPathCommander;init_dist2();init_dist5();init_dist2();var import_react2=__toESM(require_react(),1);init_dist5();init_zod();init_zod();init_dist2();function createMap(){return new IndexedMap}var IndexedMap=class _IndexedMap{constructor(){__publicField(this,"index",{});__publicField(this,"array",[])}size(){return this.array.length}empty(){return this.array.length===0}itemAt(index){return this.array[index]}contains(key){return this.index[key.id()]!==void 0}find(key){let i3=this.index[key.id()];return i3===void 0?void 0:this.array[i3]}setDefault(key,factory){let i3=this.index[key.id()];if(i3===void 0){let pair=new Pair(key,factory());return this.index[key.id()]=this.array.length,this.array.push(pair),pair}else return this.array[i3]}insert(key,value){let pair=new Pair(key,value),i3=this.index[key.id()];return i3===void 0?(this.index[key.id()]=this.array.length,this.array.push(pair)):this.array[i3]=pair,pair}erase(key){let i3=this.index[key.id()];if(i3===void 0)return;this.index[key.id()]=void 0;let pair=this.array[i3],last=this.array.pop();return pair!==last&&(this.array[i3]=last,this.index[last.first.id()]=i3),pair}copy(){let copy=new _IndexedMap;for(let i3=0;i3<this.array.length;i3++){let pair=this.array[i3].copy();copy.array[i3]=pair,copy.index[pair.first.id()]=i3}return copy}},Pair=class _Pair{constructor(first,second){__publicField(this,"first");__publicField(this,"second");this.first=first,this.second=second}copy(){return new _Pair(this.first,this.second)}};var Variable=class{constructor(name=""){__publicField(this,"_name");__publicField(this,"_value",0);__publicField(this,"_context",null);__publicField(this,"_id",VarId++);this._name=name}id(){return this._id}name(){return this._name}setName(name){this._name=name}context(){return this._context}setContext(context){this._context=context}value(){return this._value}setValue(value){this._value=value}plus(value){return new Expression(this,value)}minus(value){return new Expression(this,typeof value=="number"?-value:[-1,value])}multiply(coefficient){return new Expression([coefficient,this])}divide(coefficient){return new Expression([1/coefficient,this])}toJSON(){return{name:this._name,value:this._value}}toString(){return this._context+"["+this._name+":"+this._value+"]"}},VarId=0;var Expression=class _Expression{constructor(){__publicField(this,"_terms");__publicField(this,"_constant");let parsed=parseArgs(arguments);this._terms=parsed.terms,this._constant=parsed.constant}terms(){return this._terms}constant(){return this._constant}value(){let result=this._constant;for(let i3=0,n3=this._terms.size();i3<n3;i3++){let pair=this._terms.itemAt(i3);result+=pair.first.value()*pair.second}return result}plus(value){return new _Expression(this,value)}minus(value){return new _Expression(this,typeof value=="number"?-value:[-1,value])}multiply(coefficient){return new _Expression([coefficient,this])}divide(coefficient){return new _Expression([1/coefficient,this])}isConstant(){return this._terms.size()==0}toString(){let result=this._terms.array.map(function(pair){return pair.second+"*"+pair.first.toString()}).join(" + ");return!this.isConstant()&&this._constant!==0&&(result+=" + "),result+=this._constant,result}};function parseArgs(args){let constant=0,factory=()=>0,terms=createMap();for(let i3=0,n3=args.length;i3<n3;++i3){let item=args[i3];if(typeof item=="number")constant+=item;else if(item instanceof Variable)terms.setDefault(item,factory).second+=1;else if(item instanceof Expression){constant+=item.constant();let terms2=item.terms();for(let j5=0,k5=terms2.size();j5<k5;j5++){let termPair=terms2.itemAt(j5);terms.setDefault(termPair.first,factory).second+=termPair.second}}else if(item instanceof Array){if(item.length!==2)throw new Error("array must have length 2");let value=item[0],value2=item[1];if(typeof value!="number")throw new Error("array item 0 must be a number");if(value2 instanceof Variable)terms.setDefault(value2,factory).second+=value;else if(value2 instanceof Expression){constant+=value2.constant()*value;let terms2=value2.terms();for(let j5=0,k5=terms2.size();j5<k5;j5++){let termPair=terms2.itemAt(j5);terms.setDefault(termPair.first,factory).second+=termPair.second*value}}else throw new Error("array item 1 must be a variable or expression")}else throw new Error("invalid Expression argument: "+item)}return{terms,constant}}var _Strength=class _Strength{static create(a3,b4,c6,w4=1){let result=0;return result+=Math.max(0,Math.min(1e3,a3*w4))*1e6,result+=Math.max(0,Math.min(1e3,b4*w4))*1e3,result+=Math.max(0,Math.min(1e3,c6*w4)),result}static clip(value){return Math.max(0,Math.min(_Strength.required,value))}};__publicField(_Strength,"required",_Strength.create(1e3,1e3,1e3)),__publicField(_Strength,"strong",_Strength.create(1,0,0)),__publicField(_Strength,"medium",_Strength.create(0,1,0)),__publicField(_Strength,"weak",_Strength.create(0,0,1));var Strength=_Strength;var Operator;(function(Operator2){Operator2[Operator2.Le=0]="Le",Operator2[Operator2.Ge=1]="Ge",Operator2[Operator2.Eq=2]="Eq"})(Operator||(Operator={}));var Constraint=class{constructor(expression,operator,rhs,strength=Strength.required){__publicField(this,"_expression");__publicField(this,"_operator");__publicField(this,"_strength");__publicField(this,"_id",CnId++);this._operator=operator,this._strength=Strength.clip(strength),rhs===void 0&&expression instanceof Expression?this._expression=expression:this._expression=expression.minus(rhs)}id(){return this._id}expression(){return this._expression}op(){return this._operator}strength(){return this._strength}toString(){return this._expression.toString()+" "+["<=",">=","="][this._operator]+" 0 ("+this._strength.toString()+")"}},CnId=0;var Solver=class{constructor(){__publicField(this,"maxIterations",1e3);__publicField(this,"_cnMap",createCnMap());__publicField(this,"_rowMap",createRowMap());__publicField(this,"_varMap",createVarMap());__publicField(this,"_editMap",createEditMap());__publicField(this,"_infeasibleRows",[]);__publicField(this,"_objective",new Row);__publicField(this,"_artificial",null);__publicField(this,"_idTick",0)}createConstraint(lhs,operator,rhs,strength=Strength.required){let cn3=new Constraint(lhs,operator,rhs,strength);return this.addConstraint(cn3),cn3}addConstraint(constraint){if(this._cnMap.find(constraint)!==void 0)throw new Error("duplicate constraint");let data=this._createRow(constraint),row=data.row,tag=data.tag,subject=this._chooseSubject(row,tag);if(subject.type()===SymbolType.Invalid&&row.allDummies())if(nearZero(row.constant()))subject=tag.marker;else throw new Error("unsatisfiable constraint");if(subject.type()===SymbolType.Invalid){if(!this._addWithArtificialVariable(row))throw new Error("unsatisfiable constraint")}else row.solveFor(subject),this._substitute(subject,row),this._rowMap.insert(subject,row);this._cnMap.insert(constraint,tag),this._optimize(this._objective)}removeConstraint(constraint){let cnPair=this._cnMap.erase(constraint);if(cnPair===void 0)throw new Error("unknown constraint");this._removeConstraintEffects(constraint,cnPair.second);let marker=cnPair.second.marker,rowPair=this._rowMap.erase(marker);if(rowPair===void 0){let leaving=this._getMarkerLeavingSymbol(marker);if(leaving.type()===SymbolType.Invalid)throw new Error("failed to find leaving row");rowPair=this._rowMap.erase(leaving),rowPair.second.solveForEx(leaving,marker),this._substitute(marker,rowPair.second)}this._optimize(this._objective)}hasConstraint(constraint){return this._cnMap.contains(constraint)}getConstraints(){return this._cnMap.array.map(({first})=>first)}addEditVariable(variable,strength){if(this._editMap.find(variable)!==void 0)throw new Error("duplicate edit variable");if(strength=Strength.clip(strength),strength===Strength.required)throw new Error("bad required strength");let expr=new Expression(variable),cn3=new Constraint(expr,Operator.Eq,void 0,strength);this.addConstraint(cn3);let info={tag:this._cnMap.find(cn3).second,constraint:cn3,constant:0};this._editMap.insert(variable,info)}removeEditVariable(variable){let editPair=this._editMap.erase(variable);if(editPair===void 0)throw new Error("unknown edit variable");this.removeConstraint(editPair.second.constraint)}hasEditVariable(variable){return this._editMap.contains(variable)}suggestValue(variable,value){let editPair=this._editMap.find(variable);if(editPair===void 0)throw new Error("unknown edit variable");let rows=this._rowMap,info=editPair.second,delta=value-info.constant;info.constant=value;let marker=info.tag.marker,rowPair=rows.find(marker);if(rowPair!==void 0){rowPair.second.add(-delta)<0&&this._infeasibleRows.push(marker),this._dualOptimize();return}let other=info.tag.other;if(rowPair=rows.find(other),rowPair!==void 0){rowPair.second.add(delta)<0&&this._infeasibleRows.push(other),this._dualOptimize();return}for(let i3=0,n3=rows.size();i3<n3;++i3){let rowPair2=rows.itemAt(i3),row=rowPair2.second,coeff=row.coefficientFor(marker);coeff!==0&&row.add(delta*coeff)<0&&rowPair2.first.type()!==SymbolType.External&&this._infeasibleRows.push(rowPair2.first)}this._dualOptimize()}updateVariables(){let vars=this._varMap,rows=this._rowMap;for(let i3=0,n3=vars.size();i3<n3;++i3){let pair=vars.itemAt(i3),rowPair=rows.find(pair.second);rowPair!==void 0?pair.first.setValue(rowPair.second.constant()):pair.first.setValue(0)}}_getVarSymbol(variable){let factory=()=>this._makeSymbol(SymbolType.External);return this._varMap.setDefault(variable,factory).second}_createRow(constraint){let expr=constraint.expression(),row=new Row(expr.constant()),terms=expr.terms();for(let i3=0,n3=terms.size();i3<n3;++i3){let termPair=terms.itemAt(i3);if(!nearZero(termPair.second)){let symbol=this._getVarSymbol(termPair.first),basicPair=this._rowMap.find(symbol);basicPair!==void 0?row.insertRow(basicPair.second,termPair.second):row.insertSymbol(symbol,termPair.second)}}let objective=this._objective,strength=constraint.strength(),tag={marker:INVALID_SYMBOL,other:INVALID_SYMBOL};switch(constraint.op()){case Operator.Le:case Operator.Ge:{let coeff=constraint.op()===Operator.Le?1:-1,slack=this._makeSymbol(SymbolType.Slack);if(tag.marker=slack,row.insertSymbol(slack,coeff),strength<Strength.required){let error2=this._makeSymbol(SymbolType.Error);tag.other=error2,row.insertSymbol(error2,-coeff),objective.insertSymbol(error2,strength)}break}case Operator.Eq:{if(strength<Strength.required){let errplus=this._makeSymbol(SymbolType.Error),errminus=this._makeSymbol(SymbolType.Error);tag.marker=errplus,tag.other=errminus,row.insertSymbol(errplus,-1),row.insertSymbol(errminus,1),objective.insertSymbol(errplus,strength),objective.insertSymbol(errminus,strength)}else{let dummy=this._makeSymbol(SymbolType.Dummy);tag.marker=dummy,row.insertSymbol(dummy)}break}}return row.constant()<0&&row.reverseSign(),{row,tag}}_chooseSubject(row,tag){let cells=row.cells();for(let i3=0,n3=cells.size();i3<n3;++i3){let pair=cells.itemAt(i3);if(pair.first.type()===SymbolType.External)return pair.first}let type=tag.marker.type();return(type===SymbolType.Slack||type===SymbolType.Error)&&row.coefficientFor(tag.marker)<0?tag.marker:(type=tag.other.type(),(type===SymbolType.Slack||type===SymbolType.Error)&&row.coefficientFor(tag.other)<0?tag.other:INVALID_SYMBOL)}_addWithArtificialVariable(row){let art=this._makeSymbol(SymbolType.Slack);this._rowMap.insert(art,row.copy()),this._artificial=row.copy(),this._optimize(this._artificial);let success=nearZero(this._artificial.constant());this._artificial=null;let pair=this._rowMap.erase(art);if(pair!==void 0){let basicRow=pair.second;if(basicRow.isConstant())return success;let entering=this._anyPivotableSymbol(basicRow);if(entering.type()===SymbolType.Invalid)return!1;basicRow.solveForEx(art,entering),this._substitute(entering,basicRow),this._rowMap.insert(entering,basicRow)}let rows=this._rowMap;for(let i3=0,n3=rows.size();i3<n3;++i3)rows.itemAt(i3).second.removeSymbol(art);return this._objective.removeSymbol(art),success}_substitute(symbol,row){let rows=this._rowMap;for(let i3=0,n3=rows.size();i3<n3;++i3){let pair=rows.itemAt(i3);pair.second.substitute(symbol,row),pair.second.constant()<0&&pair.first.type()!==SymbolType.External&&this._infeasibleRows.push(pair.first)}this._objective.substitute(symbol,row),this._artificial&&this._artificial.substitute(symbol,row)}_optimize(objective){let iterations=0;for(;iterations<this.maxIterations;){let entering=this._getEnteringSymbol(objective);if(entering.type()===SymbolType.Invalid)return;let leaving=this._getLeavingSymbol(entering);if(leaving.type()===SymbolType.Invalid)throw new Error("the objective is unbounded");let row=this._rowMap.erase(leaving).second;row.solveForEx(leaving,entering),this._substitute(entering,row),this._rowMap.insert(entering,row),iterations++}throw new Error("solver iterations exceeded")}_dualOptimize(){let rows=this._rowMap,infeasible=this._infeasibleRows;for(;infeasible.length!==0;){let leaving=infeasible.pop(),pair=rows.find(leaving);if(pair!==void 0&&pair.second.constant()<0){let entering=this._getDualEnteringSymbol(pair.second);if(entering.type()===SymbolType.Invalid)throw new Error("dual optimize failed");let row=pair.second;rows.erase(leaving),row.solveForEx(leaving,entering),this._substitute(entering,row),rows.insert(entering,row)}}}_getEnteringSymbol(objective){let cells=objective.cells();for(let i3=0,n3=cells.size();i3<n3;++i3){let pair=cells.itemAt(i3),symbol=pair.first;if(pair.second<0&&symbol.type()!==SymbolType.Dummy)return symbol}return INVALID_SYMBOL}_getDualEnteringSymbol(row){let ratio=Number.MAX_VALUE,entering=INVALID_SYMBOL,cells=row.cells();for(let i3=0,n3=cells.size();i3<n3;++i3){let pair=cells.itemAt(i3),symbol=pair.first,c6=pair.second;if(c6>0&&symbol.type()!==SymbolType.Dummy){let r6=this._objective.coefficientFor(symbol)/c6;r6<ratio&&(ratio=r6,entering=symbol)}}return entering}_getLeavingSymbol(entering){let ratio=Number.MAX_VALUE,found=INVALID_SYMBOL,rows=this._rowMap;for(let i3=0,n3=rows.size();i3<n3;++i3){let pair=rows.itemAt(i3),symbol=pair.first;if(symbol.type()!==SymbolType.External){let row=pair.second,temp=row.coefficientFor(entering);if(temp<0){let temp_ratio=-row.constant()/temp;temp_ratio<ratio&&(ratio=temp_ratio,found=symbol)}}}return found}_getMarkerLeavingSymbol(marker){let dmax=Number.MAX_VALUE,r12=dmax,r22=dmax,invalid=INVALID_SYMBOL,first=invalid,second=invalid,third=invalid,rows=this._rowMap;for(let i3=0,n3=rows.size();i3<n3;++i3){let pair=rows.itemAt(i3),row=pair.second,c6=row.coefficientFor(marker);if(c6===0)continue;let symbol=pair.first;if(symbol.type()===SymbolType.External)third=symbol;else if(c6<0){let r6=-row.constant()/c6;r6<r12&&(r12=r6,first=symbol)}else{let r6=row.constant()/c6;r6<r22&&(r22=r6,second=symbol)}}return first!==invalid?first:second!==invalid?second:third}_removeConstraintEffects(cn3,tag){tag.marker.type()===SymbolType.Error&&this._removeMarkerEffects(tag.marker,cn3.strength()),tag.other.type()===SymbolType.Error&&this._removeMarkerEffects(tag.other,cn3.strength())}_removeMarkerEffects(marker,strength){let pair=this._rowMap.find(marker);pair!==void 0?this._objective.insertRow(pair.second,-strength):this._objective.insertSymbol(marker,-strength)}_anyPivotableSymbol(row){let cells=row.cells();for(let i3=0,n3=cells.size();i3<n3;++i3){let pair=cells.itemAt(i3),type=pair.first.type();if(type===SymbolType.Slack||type===SymbolType.Error)return pair.first}return INVALID_SYMBOL}_makeSymbol(type){return new Symbol2(type,this._idTick++)}};function nearZero(value){let eps=1e-8;return value<0?-value<eps:value<eps}function createCnMap(){return createMap()}function createRowMap(){return createMap()}function createVarMap(){return createMap()}function createEditMap(){return createMap()}var SymbolType;(function(SymbolType2){SymbolType2[SymbolType2.Invalid=0]="Invalid",SymbolType2[SymbolType2.External=1]="External",SymbolType2[SymbolType2.Slack=2]="Slack",SymbolType2[SymbolType2.Error=3]="Error",SymbolType2[SymbolType2.Dummy=4]="Dummy"})(SymbolType||(SymbolType={}));var Symbol2=class{constructor(type,id3){__publicField(this,"_id");__publicField(this,"_type");this._id=id3,this._type=type}id(){return this._id}type(){return this._type}},INVALID_SYMBOL=new Symbol2(SymbolType.Invalid,-1),Row=class _Row{constructor(constant=0){__publicField(this,"_cellMap",createMap());__publicField(this,"_constant");this._constant=constant}cells(){return this._cellMap}constant(){return this._constant}isConstant(){return this._cellMap.empty()}allDummies(){let cells=this._cellMap;for(let i3=0,n3=cells.size();i3<n3;++i3)if(cells.itemAt(i3).first.type()!==SymbolType.Dummy)return!1;return!0}copy(){let theCopy=new _Row(this._constant);return theCopy._cellMap=this._cellMap.copy(),theCopy}add(value){return this._constant+=value}insertSymbol(symbol,coefficient=1){let pair=this._cellMap.setDefault(symbol,()=>0);nearZero(pair.second+=coefficient)&&this._cellMap.erase(symbol)}insertRow(other,coefficient=1){this._constant+=other._constant*coefficient;let cells=other._cellMap;for(let i3=0,n3=cells.size();i3<n3;++i3){let pair=cells.itemAt(i3);this.insertSymbol(pair.first,pair.second*coefficient)}}removeSymbol(symbol){this._cellMap.erase(symbol)}reverseSign(){this._constant=-this._constant;let cells=this._cellMap;for(let i3=0,n3=cells.size();i3<n3;++i3){let pair=cells.itemAt(i3);pair.second=-pair.second}}solveFor(symbol){let cells=this._cellMap,coeff=-1/cells.erase(symbol).second;this._constant*=coeff;for(let i3=0,n3=cells.size();i3<n3;++i3)cells.itemAt(i3).second*=coeff}solveForEx(lhs,rhs){this.insertSymbol(lhs,-1),this.solveFor(rhs)}coefficientFor(symbol){let pair=this._cellMap.find(symbol);return pair!==void 0?pair.second:0}substitute(symbol,row){let pair=this._cellMap.erase(symbol);pair!==void 0&&this.insertRow(row,pair.second)}};var import_debug9=__toESM(require_browser(),1);init_dist7();var import_react3=__toESM(require_react(),1);init_dist2();var import_debug10=__toESM(require_browser(),1);init_dist7();init_dist2();init_dist2();var import_react4=__toESM(require_react(),1);init_dist4();init_dist7();init_dist7();init_dist7();init_dist4();init_dist2();init_dist7();init_dist7();init_src();init_dist7();init_dist4();init_dist7();init_dist4();init_dist7();init_dist4();init_dist4();init_dist7();init_dist7();init_dist4();init_dist7();init_dist7();init_dist4();init_dist7();init_dist7();init_dist4();init_dist7();init_dist4();init_dist7();init_dist7();init_dist7();init_dist7();init_dist7();init_dist4();var rotatePoint=(point6,angleDegrees)=>{let angle=angleDegrees*Math.PI/180;return{x:point6.x*Math.cos(angle)-point6.y*Math.sin(angle),y:point6.x*Math.sin(angle)+point6.y*Math.cos(angle)}},getRotatedRectPoints=({x:x4,y:y3,width,height,ccwRotation})=>{let halfWidth=width/2,halfHeight=height/2;return[{x:-halfWidth,y:-halfHeight},{x:halfWidth,y:-halfHeight},{x:halfWidth,y:halfHeight},{x:-halfWidth,y:halfHeight}].map(point6=>{let rotated=rotatePoint(point6,ccwRotation);return{x:x4+rotated.x,y:y3+rotated.y}})},getPillCenterLineForPad=pad2=>{let ccwRotation=pad2.shape==="rotated_pill"?pad2.ccw_rotation:0,halfLineLength=Math.max(Math.max(pad2.width,pad2.height)/2-pad2.radius,0),axis=pad2.width>=pad2.height?{x:halfLineLength,y:0}:{x:0,y:halfLineLength},rotatedAxis=rotatePoint(axis,ccwRotation);return{start:{x:pad2.x-rotatedAxis.x,y:pad2.y-rotatedAxis.y},end:{x:pad2.x+rotatedAxis.x,y:pad2.y+rotatedAxis.y},radius:pad2.radius}},getPolygonPointsForPad=pad2=>{if(pad2.type==="pcb_smtpad"){if(pad2.shape==="polygon")return pad2.points;if(pad2.shape==="rotated_rect")return getRotatedRectPoints({x:pad2.x,y:pad2.y,width:pad2.width,height:pad2.height,ccwRotation:pad2.ccw_rotation})}if(pad2.type==="pcb_plated_hole"&&"rect_pad_width"in pad2&&"rect_pad_height"in pad2)return getRotatedRectPoints({x:pad2.x,y:pad2.y,width:pad2.rect_pad_width,height:pad2.rect_pad_height,ccwRotation:"rect_ccw_rotation"in pad2&&typeof pad2.rect_ccw_rotation=="number"?pad2.rect_ccw_rotation:0});throw new Error(`Expected polygonal pad geometry, got ${pad2.type} with shape "${pad2.shape}"`)},getPolygonEdges3=points=>points.map((point6,index)=>[point6,points[(index+1)%points.length]]),getClosestPointsBetweenSegments=(a12,a22,b12,b22)=>{let intersection=getSegmentIntersection(a12,a22,b12,b22);if(intersection)return{distance:0,pointOnA:intersection,pointOnB:intersection,center:intersection};let candidates=[{pointOnA:a12,pointOnB:pointToSegmentClosestPoint(a12,b12,b22)},{pointOnA:a22,pointOnB:pointToSegmentClosestPoint(a22,b12,b22)},{pointOnA:pointToSegmentClosestPoint(b12,a12,a22),pointOnB:b12},{pointOnA:pointToSegmentClosestPoint(b22,a12,a22),pointOnB:b22}],best=candidates[0],bestDistanceSquared=distSq(best.pointOnA,best.pointOnB);for(let candidate of candidates.slice(1)){let candidateDistanceSquared=distSq(candidate.pointOnA,candidate.pointOnB);candidateDistanceSquared<bestDistanceSquared&&(best=candidate,bestDistanceSquared=candidateDistanceSquared)}return{distance:segmentToSegmentMinDistance(a12,a22,b12,b22),pointOnA:best.pointOnA,pointOnB:best.pointOnB,center:{x:(best.pointOnA.x+best.pointOnB.x)/2,y:(best.pointOnA.y+best.pointOnB.y)/2}}},getSegmentToPolygonClearanceFromPoints=(start,end,polygon2)=>{if(polygon2.length<3)return{distance:Number.POSITIVE_INFINITY,center:start};let intersections=getPolygonEdges3(polygon2).map(([edgeStart,edgeEnd])=>getSegmentIntersection(start,end,edgeStart,edgeEnd)).filter(point6=>point6!==null);if(intersections.length>0){let dx3=end.x-start.x,dy3=end.y-start.y,lengthSquared=dx3*dx3+dy3*dy3;return intersections.sort((a3,b4)=>{let ta3=((a3.x-start.x)*dx3+(a3.y-start.y)*dy3)/lengthSquared,tb2=((b4.x-start.x)*dx3+(b4.y-start.y)*dy3)/lengthSquared;return ta3-tb2}),{distance:0,center:intersections[0]}}if(isPointInsidePolygon(start,polygon2)||isPointInsidePolygon(end,polygon2))return{distance:0,center:{x:(start.x+end.x)/2,y:(start.y+end.y)/2}};let best=getClosestPointsBetweenSegments(start,end,polygon2[0],polygon2[1]);for(let[edgeStart,edgeEnd]of getPolygonEdges3(polygon2).slice(1)){let candidate=getClosestPointsBetweenSegments(start,end,edgeStart,edgeEnd);candidate.distance<best.distance&&(best=candidate)}return{distance:best.distance,center:best.center}},getSegmentToPolygonClearance=(segment2,polygon2)=>getSegmentToPolygonClearanceFromPoints({x:segment2.x1,y:segment2.y1},{x:segment2.x2,y:segment2.y2},polygon2),getSegmentToPillClearance=(segment2,pad2)=>{let pill=getPillCenterLineForPad(pad2),closest=getClosestPointsBetweenSegments({x:segment2.x1,y:segment2.y1},{x:segment2.x2,y:segment2.y2},pill.start,pill.end);return{distance:closest.distance,center:closest.center,radius:pill.radius}};function getDistanceBetweenPoints(pointA,pointB){return Math.sqrt((pointB.x-pointA.x)**2+(pointB.y-pointA.y)**2)}var POINT_ON_SEGMENT_TOLERANCE_MM=1e-9;function isPointOnSegment3(point6,segment2){let crossProduct=(point6.y-segment2.start.y)*(segment2.end.x-segment2.start.x)-(point6.x-segment2.start.x)*(segment2.end.y-segment2.start.y);if(Math.abs(crossProduct)>POINT_ON_SEGMENT_TOLERANCE_MM)return!1;let dotProduct=(point6.x-segment2.start.x)*(segment2.end.x-segment2.start.x)+(point6.y-segment2.start.y)*(segment2.end.y-segment2.start.y);if(dotProduct<-POINT_ON_SEGMENT_TOLERANCE_MM)return!1;let squaredLength=(segment2.end.x-segment2.start.x)**2+(segment2.end.y-segment2.start.y)**2;return dotProduct<=squaredLength+POINT_ON_SEGMENT_TOLERANCE_MM}function isPointInPad(point6,pad2){if(pad2.type==="pcb_smtpad"){if(pad2.shape==="circle")return getDistanceBetweenPoints(point6,pad2)<=pad2.radius;if(pad2.shape==="rect"){let halfWidth=pad2.width/2,halfHeight=pad2.height/2;return Math.abs(point6.x-pad2.x)<=halfWidth&&Math.abs(point6.y-pad2.y)<=halfHeight}if(pad2.shape==="rotated_rect"){let dx3=point6.x-pad2.x,dy3=point6.y-pad2.y,angle=-pad2.ccw_rotation,rotatedX=dx3*Math.cos(angle)-dy3*Math.sin(angle),rotatedY=dx3*Math.sin(angle)+dy3*Math.cos(angle);return Math.abs(rotatedX)<=pad2.width/2&&Math.abs(rotatedY)<=pad2.height/2}if(pad2.shape==="pill"||pad2.shape==="rotated_pill"){if(pad2.shape==="rotated_pill"){let pill=getPillCenterLineForPad(pad2);return pointToSegmentDistance(point6,pill.start,pill.end)<=pill.radius}let halfWidth=pad2.width/2,halfHeight=pad2.height/2,radius=pad2.radius;if(Math.abs(point6.x-pad2.x)<=halfWidth-radius&&Math.abs(point6.y-pad2.y)<=halfHeight)return!0;let cornerX=Math.max(Math.abs(point6.x-pad2.x)-(halfWidth-radius),0),cornerY=Math.max(Math.abs(point6.y-pad2.y)-(halfHeight-radius),0);return cornerX*cornerX+cornerY*cornerY<=radius*radius}if(pad2.shape==="polygon"){let inside2=!1;for(let i3=0,j5=pad2.points.length-1;i3<pad2.points.length;j5=i3++){let pi3=pad2.points[i3],pj2=pad2.points[j5];if(isPointOnSegment3(point6,{start:pi3,end:pj2}))return!0;pi3.y>point6.y!=pj2.y>point6.y&&point6.x<(pj2.x-pi3.x)*(point6.y-pi3.y)/(pj2.y-pi3.y)+pi3.x&&(inside2=!inside2)}return inside2}}if(pad2.type==="pcb_plated_hole"){if(pad2.shape==="circle")return getDistanceBetweenPoints(point6,pad2)<=pad2.outer_diameter/2;if(pad2.shape==="oval"||pad2.shape==="pill")return Math.abs(point6.x-pad2.x)<=pad2.outer_width/2&&Math.abs(point6.y-pad2.y)<=pad2.outer_height/2;if(pad2.shape==="circular_hole_with_rect_pad"||pad2.shape==="pill_hole_with_rect_pad")return Math.abs(point6.x-pad2.x)<=pad2.rect_pad_width/2&&Math.abs(point6.y-pad2.y)<=pad2.rect_pad_height/2}return!1}function distance5(x12,y12,x22,y22){return Math.sqrt((x22-x12)**2+(y22-y12)**2)}var addStartAndEndPortIdsIfMissing=soup=>{let pcbPorts=soup.filter(item=>item.type==="pcb_port"),pcbSmtPads=soup.filter(item=>item.type==="pcb_smtpad"),pcbTraces=soup.filter(item=>item.type==="pcb_trace");function findPortIdOverlappingPoint(point6,options={}){let traceWidth=options.traceWidth||0,directPort=pcbPorts.find(port=>distance5(port.x,port.y,point6.x,point6.y)<.01);if(directPort)return directPort.pcb_port_id;if(options.isFirstOrLastPoint){let smtPad=pcbSmtPads.find(pad2=>{if(pad2.shape==="rect")return Math.abs(point6.x-pad2.x)<pad2.width/2+traceWidth/2&&Math.abs(point6.y-pad2.y)<pad2.height/2+traceWidth/2;if(pad2.shape==="circle")return distance5(point6.x,point6.y,pad2.x,pad2.y)<pad2.radius;if(pad2.shape==="pill"||pad2.shape==="rotated_pill")return isPointInPad(point6,pad2)});if(smtPad)return smtPad.pcb_port_id??null}return null}for(let trace of pcbTraces)for(let index=0;index<trace.route.length;index++){let segment2=trace.route[index],isFirstOrLastPoint=index===0||index===trace.route.length-1;if(segment2.route_type==="wire"){if(!segment2.start_pcb_port_id&&index===0){let startPortId=findPortIdOverlappingPoint(segment2,{isFirstOrLastPoint,traceWidth:segment2.width});startPortId&&(segment2.start_pcb_port_id=startPortId)}if(!segment2.end_pcb_port_id&&index===trace.route.length-1){let endPortId=findPortIdOverlappingPoint(segment2,{isFirstOrLastPoint,traceWidth:segment2.width});endPortId&&(segment2.end_pcb_port_id=endPortId)}}}},CIRCUIT_JSON_ID_PATTERN=/\b(?:pcb|source|schematic|subcircuit)_[a-z0-9_]+\b/i,sanitizeReadableName=(candidate,id3,fallbackLabel)=>!candidate||candidate===id3||CIRCUIT_JSON_ID_PATTERN.test(candidate)?fallbackLabel:candidate,firstReadableName=(candidates,id3)=>{for(let candidate of candidates){let readableName=sanitizeReadableName(candidate,id3,"");if(readableName)return readableName}return""},getReadableNameForComponent=(circuitJson,pcbComponentId)=>sanitizeReadableName(getReadableNameForElement(circuitJson,pcbComponentId),pcbComponentId,"component"),getReadableNameForPort=(circuitJson,pcbPortId)=>{let pcbPort=circuitJson.find(element=>element.type==="pcb_port"&&element.pcb_port_id===pcbPortId);if(pcbPort?.type==="pcb_port"){let sourcePort=circuitJson.find(element=>element.type==="source_port"&&element.source_port_id===pcbPort.source_port_id),sourceComponent=sourcePort?.type==="source_port"?circuitJson.find(element=>element.type==="source_component"&&element.source_component_id===sourcePort.source_component_id):null,readableSourceComponentName=firstReadableName([sourceComponent?.type==="source_component"?sourceComponent.name:null],sourceComponent?.type==="source_component"?sourceComponent.source_component_id:""),readableSourcePortName=firstReadableName([sourcePort?.type==="source_port"?sourcePort.name:null,sourcePort?.type==="source_port"?sourcePort.pin_number?.toString():null,sourcePort?.type==="source_port"?sourcePort.port_hints?.[0]:null],sourcePort?.type==="source_port"?sourcePort.source_port_id:"");if(readableSourceComponentName&&readableSourcePortName)return`${readableSourceComponentName}.${readableSourcePortName}`;if(readableSourcePortName)return readableSourcePortName}return sanitizeReadableName(getReadableNameForPcbPort(circuitJson,pcbPortId)??getReadableNameForElement(circuitJson,pcbPortId),pcbPortId,"port")};var getReadableNameForElementId=(circuitJson,elementId)=>sanitizeReadableName(getReadableNameForElement(circuitJson,elementId),elementId,"element"),containsCircuitJsonId=message=>CIRCUIT_JSON_ID_PATTERN.test(message);function checkEachPcbPortConnectedToPcbTraces(circuitJson){addStartAndEndPortIdsIfMissing(circuitJson);let sourceTraces=circuitJson.filter(item=>item.type==="source_trace"),pcbPorts=circuitJson.filter(item=>item.type==="pcb_port"),errors=[],connectivityMap=getFullConnectivityMapFromCircuitJson(circuitJson),sourcePortToPcbPort=new Map;for(let pcbPort of pcbPorts)sourcePortToPcbPort.set(pcbPort.source_port_id,pcbPort);for(let sourceTrace of sourceTraces){let connectedSourcePortIds=sourceTrace.connected_source_port_ids;if(connectedSourcePortIds.length<2)continue;let pcbPortsInTrace=[],missingPcbPorts=[];for(let sourcePortId of connectedSourcePortIds){let pcbPort=sourcePortToPcbPort.get(sourcePortId);pcbPort?pcbPortsInTrace.push(pcbPort):missingPcbPorts.push(sourcePortId)}if(pcbPortsInTrace.length<2)continue;let firstPcbPort=pcbPortsInTrace[0],referenceNetId=connectivityMap.getNetConnectedToId(firstPcbPort.pcb_port_id);connectivityMap.getIdsConnectedToNet(referenceNetId).filter(id3=>circuitJson.some(element=>element.type==="pcb_trace"&&("pcb_trace_id"in element&&element.pcb_trace_id===id3||"route_id"in element&&element.route_id===id3))).length===0&&new Set(pcbPortsInTrace.map(p5=>p5.pcb_component_id)).size>1&&errors.push({type:"pcb_port_not_connected_error",message:`Ports [${pcbPortsInTrace.map(p5=>getReadableNameForPort(circuitJson,p5.pcb_port_id)).join(", ")}] are not connected together through the same net.`,error_type:"pcb_port_not_connected_error",pcb_port_ids:pcbPortsInTrace.map(p5=>p5.pcb_port_id),pcb_component_ids:pcbPortsInTrace.map(p5=>p5.pcb_component_id).filter(id3=>id3!==void 0),pcb_port_not_connected_error_id:`pcb_port_not_connected_error_trace_${sourceTrace.source_trace_id}`})}return errors}var SpatialObjectIndex=class{constructor({objects,getBounds:getBounds3,getId,CELL_SIZE}){__publicField(this,"buckets");__publicField(this,"objectsById");__publicField(this,"getBounds");__publicField(this,"getId");__publicField(this,"CELL_SIZE",.4);__publicField(this,"_idCounter",0);this.buckets=new Map,this.objectsById=new Map,this.getBounds=getBounds3,this.getId=getId??(()=>this._getNextId()),this.CELL_SIZE=CELL_SIZE??this.CELL_SIZE;for(let obj of objects)this.addObject(obj)}_getNextId(){return`${this._idCounter++}`}addObject(obj){let bounds=this.getBounds(obj),spatialIndexId=this.getId(obj),objWithId={...obj,spatialIndexId};this.objectsById.set(spatialIndexId,objWithId);let minBucketX=Math.floor(bounds.minX/this.CELL_SIZE),minBucketY=Math.floor(bounds.minY/this.CELL_SIZE),maxBucketX=Math.floor(bounds.maxX/this.CELL_SIZE),maxBucketY=Math.floor(bounds.maxY/this.CELL_SIZE);for(let bx3=minBucketX;bx3<=maxBucketX;bx3++)for(let by3=minBucketY;by3<=maxBucketY;by3++){let bucketKey=`${bx3}x${by3}`,bucket=this.buckets.get(bucketKey);bucket?bucket.push(objWithId):this.buckets.set(bucketKey,[objWithId])}}removeObject(id3){let obj=this.objectsById.get(id3);if(!obj)return!1;this.objectsById.delete(id3);let bounds=this.getBounds(obj),minBucketX=Math.floor(bounds.minX/this.CELL_SIZE),minBucketY=Math.floor(bounds.minY/this.CELL_SIZE),maxBucketX=Math.floor(bounds.maxX/this.CELL_SIZE),maxBucketY=Math.floor(bounds.maxY/this.CELL_SIZE);for(let bx3=minBucketX;bx3<=maxBucketX;bx3++)for(let by3=minBucketY;by3<=maxBucketY;by3++){let bucketKey=`${bx3}x${by3}`,bucket=this.buckets.get(bucketKey);if(bucket){let index=bucket.findIndex(item=>item.spatialIndexId===id3);index!==-1&&(bucket.splice(index,1),bucket.length===0&&this.buckets.delete(bucketKey))}}return!0}getBucketKey(x4,y3){return`${Math.floor(x4/this.CELL_SIZE)}x${Math.floor(y3/this.CELL_SIZE)}`}getObjectsInBounds(bounds,margin=0){let objects=[],addedIds=new Set,minBucketX=Math.floor((bounds.minX-margin)/this.CELL_SIZE),minBucketY=Math.floor((bounds.minY-margin)/this.CELL_SIZE),maxBucketX=Math.floor((bounds.maxX+margin)/this.CELL_SIZE),maxBucketY=Math.floor((bounds.maxY+margin)/this.CELL_SIZE);for(let bx3=minBucketX;bx3<=maxBucketX;bx3++)for(let by3=minBucketY;by3<=maxBucketY;by3++){let bucketKey=`${bx3}x${by3}`,bucket=this.buckets.get(bucketKey)||[];for(let obj of bucket){let id3=obj.spatialIndexId;addedIds.has(id3)||(addedIds.add(id3),objects.push(obj))}}return objects}},jlcMinTolerances={min_trace_width:.1,min_via_hole_edge_to_via_hole_edge_clearance:.1,min_plated_hole_drill_edge_to_drill_edge_clearance:.15,min_trace_to_pad_edge_clearance:.1,min_pad_edge_to_pad_edge_clearance:.1,min_board_edge_clearance:.2,min_via_hole_diameter:.2,min_via_pad_diameter:.3},DEFAULT_TRACE_MARGIN=.1,DEFAULT_TRACE_THICKNESS=jlcMinTolerances.min_trace_width,DEFAULT_VIA_DIAMETER=jlcMinTolerances.min_via_pad_diameter,DEFAULT_VIA_BOARD_MARGIN=jlcMinTolerances.min_board_edge_clearance,DEFAULT_SAME_NET_VIA_MARGIN=jlcMinTolerances.min_via_hole_edge_to_via_hole_edge_clearance,DEFAULT_DIFFERENT_NET_VIA_MARGIN=jlcMinTolerances.min_via_hole_edge_to_via_hole_edge_clearance,DEFAULT_PAD_PAD_CLEARANCE=jlcMinTolerances.min_pad_edge_to_pad_edge_clearance,DEFAULT_PAD_TRACE_CLEARANCE=jlcMinTolerances.min_trace_to_pad_edge_clearance,EPSILON2=.005,getPcbBoard=circuitJson=>circuitJson.find(el3=>el3.type==="pcb_board"),getBoardDrcValue=(board,key)=>board?.[key];function getLayersOfPcbElement(obj){return obj.type==="pcb_trace_segment"?[obj.layer]:obj.type==="pcb_smtpad"?[obj.layer]:obj.type==="pcb_plated_hole"?Array.isArray(obj.layers)?obj.layers:[...all_layers]:obj.type==="pcb_hole"?[...all_layers]:obj.type==="pcb_via"?Array.isArray(obj.layers)?obj.layers:[...all_layers]:obj.type==="pcb_keepout"?Array.isArray(obj.layers)?obj.layers:[]:[]}var getClosestPointBetweenSegmentAndBounds=(segment2,bounds)=>{let p12={x:segment2.x1,y:segment2.y1},p22={x:segment2.x2,y:segment2.y2},minX=bounds.minX,minY=bounds.minY,maxX=bounds.maxX,maxY=bounds.maxY;if(p12.x===p22.x&&p12.y===p22.y){let closestX=Math.max(minX,Math.min(maxX,p12.x)),closestY=Math.max(minY,Math.min(maxY,p12.y));return closestX===p12.x&&closestY===p12.y?{x:p12.x,y:p12.y}:{x:closestX,y:closestY}}let dx3=p22.x-p12.x,dy3=p22.y-p12.y,tMinX=dx3!==0?(minX-p12.x)/dx3:Number.NEGATIVE_INFINITY,tMaxX=dx3!==0?(maxX-p12.x)/dx3:Number.POSITIVE_INFINITY,tMinY=dy3!==0?(minY-p12.y)/dy3:Number.NEGATIVE_INFINITY,tMaxY=dy3!==0?(maxY-p12.y)/dy3:Number.POSITIVE_INFINITY,tEnter=Math.max(Math.min(tMinX,tMaxX),Math.min(tMinY,tMaxY)),tExit=Math.min(Math.max(tMinX,tMaxX),Math.max(tMinY,tMaxY));if(tEnter<=tExit&&tExit>=0&&tEnter<=1){let t54=Math.max(0,Math.min(1,tEnter));return{x:p12.x+t54*dx3,y:p12.y+t54*dy3}}let closestToP1={x:Math.max(minX,Math.min(maxX,p12.x)),y:Math.max(minY,Math.min(maxY,p12.y))},closestToP2={x:Math.max(minX,Math.min(maxX,p22.x)),y:Math.max(minY,Math.min(maxY,p22.y))},distToP1Squared=(closestToP1.x-p12.x)**2+(closestToP1.y-p12.y)**2,distToP2Squared=(closestToP2.x-p22.x)**2+(closestToP2.y-p22.y)**2,edges=[{start:{x:minX,y:minY},end:{x:maxX,y:minY}},{start:{x:maxX,y:minY},end:{x:maxX,y:maxY}},{start:{x:maxX,y:maxY},end:{x:minX,y:maxY}},{start:{x:minX,y:maxY},end:{x:minX,y:minY}}],minDistance=Math.min(distToP1Squared,distToP2Squared),closestPoint=distToP1Squared<=distToP2Squared?closestToP1:closestToP2,clamp22=(value,min,max2)=>Math.max(min,Math.min(max2,value));for(let edge of edges){let va3={x:p22.x-p12.x,y:p22.y-p12.y},vb2={x:edge.end.x-edge.start.x,y:edge.end.y-edge.start.y},w4={x:p12.x-edge.start.x,y:p12.y-edge.start.y},dotAA=va3.x*va3.x+va3.y*va3.y,dotAB=va3.x*vb2.x+va3.y*vb2.y,dotAW=va3.x*w4.x+va3.y*w4.y,dotBB=vb2.x*vb2.x+vb2.y*vb2.y,dotBW=vb2.x*w4.x+vb2.y*w4.y,denominator=dotAA*dotBB-dotAB*dotAB;if(Math.abs(denominator)<1e-10)continue;let tA2=(dotAB*dotBW-dotBB*dotAW)/denominator,tB=(dotAA*dotBW-dotAB*dotAW)/denominator;tA2=clamp22(tA2,0,1),tB=clamp22(tB,0,1);let closestOnSegment={x:p12.x+tA2*va3.x,y:p12.y+tA2*va3.y},closestOnEdge={x:edge.start.x+tB*vb2.x,y:edge.start.y+tB*vb2.y},dx22=closestOnSegment.x-closestOnEdge.x,dy22=closestOnSegment.y-closestOnEdge.y,distSquared=dx22*dx22+dy22*dy22;distSquared<minDistance&&(minDistance=distSquared,closestPoint={x:(closestOnSegment.x+closestOnEdge.x)/2,y:(closestOnSegment.y+closestOnEdge.y)/2})}return closestPoint},getClosestPointBetweenSegments=(segmentA,segmentB)=>{let a12={x:segmentA.x1,y:segmentA.y1},a22={x:segmentA.x2,y:segmentA.y2},b12={x:segmentB.x1,y:segmentB.y1},b22={x:segmentB.x2,y:segmentB.y2},va3={x:a22.x-a12.x,y:a22.y-a12.y},vb2={x:b22.x-b12.x,y:b22.y-b12.y},lenSqrA=va3.x*va3.x+va3.y*va3.y,lenSqrB=vb2.x*vb2.x+vb2.y*vb2.y;if(lenSqrA===0||lenSqrB===0){if(lenSqrA===0&&lenSqrB===0)return{x:(a12.x+b12.x)/2,y:(a12.y+b12.y)/2};if(lenSqrA===0){let t210=clamp4(((a12.x-b12.x)*vb2.x+(a12.y-b12.y)*vb2.y)/lenSqrB,0,1),closestOnB2={x:b12.x+t210*vb2.x,y:b12.y+t210*vb2.y};return{x:(a12.x+closestOnB2.x)/2,y:(a12.y+closestOnB2.y)/2}}let t54=clamp4(((b12.x-a12.x)*va3.x+(b12.y-a12.y)*va3.y)/lenSqrA,0,1),closestOnA2={x:a12.x+t54*va3.x,y:a12.y+t54*va3.y};return{x:(closestOnA2.x+b12.x)/2,y:(closestOnA2.y+b12.y)/2}}let w4={x:a12.x-b12.x,y:a12.y-b12.y},dotAA=va3.x*va3.x+va3.y*va3.y,dotAB=va3.x*vb2.x+va3.y*vb2.y,dotAW=va3.x*w4.x+va3.y*w4.y,dotBB=vb2.x*vb2.x+vb2.y*vb2.y,dotBW=vb2.x*w4.x+vb2.y*w4.y,denominator=dotAA*dotBB-dotAB*dotAB;if(denominator<1e-10)return closestPointsParallelSegments(a12,a22,b12,b22,va3,vb2,lenSqrA,lenSqrB);let tA2=(dotAB*dotBW-dotBB*dotAW)/denominator,tB=(dotAA*dotBW-dotAB*dotAW)/denominator;tA2=clamp4(tA2,0,1),tB=clamp4(tB,0,1),tB=(tA2*dotAB+dotBW)/dotBB,tB=clamp4(tB,0,1),tA2=(tB*dotAB-dotAW)/dotAA,tA2=clamp4(tA2,0,1);let closestOnA={x:a12.x+tA2*va3.x,y:a12.y+tA2*va3.y},closestOnB={x:b12.x+tB*vb2.x,y:b12.y+tB*vb2.y},dx3=closestOnA.x-closestOnB.x,dy3=closestOnA.y-closestOnB.y,distance32=Math.sqrt(dx3*dx3+dy3*dy3);return{x:(closestOnA.x+closestOnB.x)/2,y:(closestOnA.y+closestOnB.y)/2}},closestPointsParallelSegments=(a12,a22,b12,b22,va3,vb2,lenSqrA,lenSqrB)=>{let tA2=((b12.x-a12.x)*va3.x+(b12.y-a12.y)*va3.y)/lenSqrA;tA2=clamp4(tA2,0,1);let pointOnA1={x:a12.x+tA2*va3.x,y:a12.y+tA2*va3.y},tA22=((b22.x-a12.x)*va3.x+(b22.y-a12.y)*va3.y)/lenSqrA;tA22=clamp4(tA22,0,1);let pointOnA2={x:a12.x+tA22*va3.x,y:a12.y+tA22*va3.y},tB=((a12.x-b12.x)*vb2.x+(a12.y-b12.y)*vb2.y)/lenSqrB;tB=clamp4(tB,0,1);let pointOnB1={x:b12.x+tB*vb2.x,y:b12.y+tB*vb2.y},tB2=((a22.x-b12.x)*vb2.x+(a22.y-b12.y)*vb2.y)/lenSqrB;tB2=clamp4(tB2,0,1);let pointOnB2={x:b12.x+tB2*vb2.x,y:b12.y+tB2*vb2.y},closestPair=[{pointA:pointOnA1,pointB:b12,distance:Math.sqrt((pointOnA1.x-b12.x)**2+(pointOnA1.y-b12.y)**2)},{pointA:pointOnA2,pointB:b22,distance:Math.sqrt((pointOnA2.x-b22.x)**2+(pointOnA2.y-b22.y)**2)},{pointA:a12,pointB:pointOnB1,distance:Math.sqrt((a12.x-pointOnB1.x)**2+(a12.y-pointOnB1.y)**2)},{pointA:a22,pointB:pointOnB2,distance:Math.sqrt((a22.x-pointOnB2.x)**2+(a22.y-pointOnB2.y)**2)}].reduce((closest,current3)=>current3.distance<closest.distance?current3:closest);return{x:(closestPair.pointA.x+closestPair.pointB.x)/2,y:(closestPair.pointA.y+closestPair.pointB.y)/2}},clamp4=(value,min,max2)=>Math.max(min,Math.min(max2,value)),getCollidableBounds=collidable=>{if(collidable.type==="pcb_trace_segment")return{minX:Math.min(collidable.x1,collidable.x2),minY:Math.min(collidable.y1,collidable.y2),maxX:Math.max(collidable.x1,collidable.x2),maxY:Math.max(collidable.y1,collidable.y2)};if(collidable.type==="pcb_smtpad"||collidable.type==="pcb_plated_hole"){if(collidable.type==="pcb_smtpad"&&(collidable.shape==="rotated_rect"||collidable.shape==="polygon")||collidable.type==="pcb_plated_hole"&&"rect_pad_width"in collidable&&"rect_pad_height"in collidable){let polygonPoints=getPolygonPointsForPad(collidable);return{minX:Math.min(...polygonPoints.map(point6=>point6.x)),minY:Math.min(...polygonPoints.map(point6=>point6.y)),maxX:Math.max(...polygonPoints.map(point6=>point6.x)),maxY:Math.max(...polygonPoints.map(point6=>point6.y))}}if(collidable.type==="pcb_smtpad"&&collidable.shape==="rotated_pill"){let pill=getPillCenterLineForPad(collidable);return{minX:Math.min(pill.start.x,pill.end.x)-pill.radius,minY:Math.min(pill.start.y,pill.end.y)-pill.radius,maxX:Math.max(pill.start.x,pill.end.x)+pill.radius,maxY:Math.max(pill.start.y,pill.end.y)+pill.radius}}}return getBoundsOfPcbElements([collidable])};function getPcbPortIdsConnectedToRoutePoint(routePoint){return routePoint.route_type!=="wire"?[]:[routePoint.start_pcb_port_id,routePoint.end_pcb_port_id].filter(portId=>!!portId)}function getPcbPortIdsConnectedToTrace(trace){let connectedPcbPorts=new Set;for(let segment2 of trace.route)for(let portId of getPcbPortIdsConnectedToRoutePoint(segment2))connectedPcbPorts.add(portId);return Array.from(connectedPcbPorts)}function getPcbPortIdsConnectedToTraces(traces){let connectedPorts=new Set;for(let trace of traces)for(let portId of getPcbPortIdsConnectedToTrace(trace))connectedPorts.add(portId);return Array.from(connectedPorts)}var getRadiusOfCircuitJsonElement=obj=>{if(obj.type==="pcb_via"||obj.type==="pcb_plated_hole"&&obj.shape==="circle")return obj.outer_diameter/2;if(obj.type==="pcb_hole"&&obj.hole_shape==="circle")return obj.hole_diameter/2;if(obj.type==="pcb_smtpad"&&obj.shape==="circle")return obj.radius;throw new Error(`Could not determine radius of element: ${JSON.stringify(obj)}`)};function checkEachPcbTraceNonOverlapping(circuitJson,{connMap,minClearance}={}){let errors=[];addStartAndEndPortIdsIfMissing(circuitJson),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_trace_to_pad_edge_clearance")??DEFAULT_TRACE_MARGIN);let pcbTraceSegments=cju_default(circuitJson).pcb_trace.list().flatMap(pcbTrace=>{let segments=[];for(let i3=0;i3<pcbTrace.route.length-1;i3++){let p12=pcbTrace.route[i3],p22=pcbTrace.route[i3+1];p12.route_type==="wire"&&p22.route_type==="wire"&&p12.layer===p22.layer&&segments.push({type:"pcb_trace_segment",pcb_trace_id:pcbTrace.pcb_trace_id,_pcbTrace:pcbTrace,thickness:"width"in p12?p12.width:"width"in p22?p22.width:DEFAULT_TRACE_THICKNESS,layer:p12.layer,x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y})}return segments}),pcbSmtPads=cju_default(circuitJson).pcb_smtpad.list(),pcbPlatedHoles=cju_default(circuitJson).pcb_plated_hole.list(),pcbHoles=cju_default(circuitJson).pcb_hole.list(),pcbVias=cju_default(circuitJson).pcb_via.list(),pcbKeepouts=cju_default(circuitJson).pcb_keepout.list(),allObjects=[...pcbTraceSegments,...pcbSmtPads,...pcbPlatedHoles,...pcbHoles,...pcbVias,...pcbKeepouts],spatialIndex=new SpatialObjectIndex({objects:allObjects,getBounds:getCollidableBounds}),getReadableName=id3=>getReadableNameForElement(circuitJson,id3),constructErrorMessage=(traceName,otherName,gap)=>gap<0?`PCB trace ${traceName} overlaps with ${otherName} (accidental contact)`:`PCB trace ${traceName} is too close to ${otherName} (gap: ${gap.toFixed(3)}mm)`,errorIds=new Set;for(let segmentA of pcbTraceSegments){let requiredMargin=minClearance,bounds=getCollidableBounds(segmentA),nearbyObjects=spatialIndex.getObjectsInBounds(bounds,requiredMargin+segmentA.thickness/2);if(!(segmentA.x1===segmentA.x2&&segmentA.y1===segmentA.y2))for(let obj of nearbyObjects){if(!getLayersOfPcbElement(obj).includes(segmentA.layer))continue;if(obj.type==="pcb_trace_segment"){let segmentB=obj;if(segmentA.layer!==segmentB.layer||connMap.areIdsConnected(segmentA.pcb_trace_id,segmentB.pcb_trace_id))continue;let gap2=segmentToSegmentMinDistance({x:segmentA.x1,y:segmentA.y1},{x:segmentA.x2,y:segmentA.y2},{x:segmentB.x1,y:segmentB.y1},{x:segmentB.x2,y:segmentB.y2})-segmentA.thickness/2-segmentB.thickness/2;if(gap2>minClearance-EPSILON2)continue;let pcb_trace_error_id=`overlap_${segmentA.pcb_trace_id}_${segmentB.pcb_trace_id}`,pcb_trace_error_id_reverse=`overlap_${segmentB.pcb_trace_id}_${segmentA.pcb_trace_id}`;if(errorIds.has(pcb_trace_error_id)||errorIds.has(pcb_trace_error_id_reverse))continue;errorIds.add(pcb_trace_error_id),errors.push({type:"pcb_trace_error",error_type:"pcb_trace_error",message:constructErrorMessage(getReadableName(segmentA.pcb_trace_id),getReadableName(segmentB.pcb_trace_id),gap2),pcb_trace_id:segmentA.pcb_trace_id,source_trace_id:"",pcb_trace_error_id,pcb_component_ids:[],center:getClosestPointBetweenSegments(segmentA,segmentB),pcb_port_ids:getPcbPortIdsConnectedToTraces([segmentA._pcbTrace,segmentB._pcbTrace])});continue}let primaryObjId=getPrimaryId(obj);if(connMap.areIdsConnected(segmentA.pcb_trace_id,"pcb_trace_id"in obj?obj.pcb_trace_id:primaryObjId))continue;if(obj.type==="pcb_via"||obj.type==="pcb_plated_hole"&&obj.shape==="circle"||obj.type==="pcb_hole"||obj.type==="pcb_smtpad"&&obj.shape==="circle"){let radius=getRadiusOfCircuitJsonElement(obj),gap2=segmentToCircleMinDistance({x:segmentA.x1,y:segmentA.y1},{x:segmentA.x2,y:segmentA.y2},{x:obj.x,y:obj.y,radius})-segmentA.thickness/2;if(gap2>minClearance-EPSILON2)continue;let pcb_trace_error_id=`overlap_${segmentA.pcb_trace_id}_${primaryObjId}`;if(errorIds.has(pcb_trace_error_id))continue;errorIds.add(pcb_trace_error_id),errors.push({type:"pcb_trace_error",error_type:"pcb_trace_error",message:constructErrorMessage(getReadableName(segmentA.pcb_trace_id),`${obj.type} "${getReadableName(getPrimaryId(obj))}"`,gap2),pcb_trace_id:segmentA.pcb_trace_id,center:getClosestPointBetweenSegmentAndBounds(segmentA,getCollidableBounds(obj)),source_trace_id:"",pcb_trace_error_id,pcb_component_ids:["pcb_component_id"in obj?obj.pcb_component_id:void 0].filter(Boolean),pcb_port_ids:[...getPcbPortIdsConnectedToTraces([segmentA._pcbTrace]),"pcb_port_id"in obj?obj.pcb_port_id:void 0].filter(Boolean)})}if(obj.type==="pcb_smtpad"&&(obj.shape==="pill"||obj.shape==="rotated_pill")){let{distance:distance32,center:center2,radius}=getSegmentToPillClearance(segmentA,obj),gap2=distance32-segmentA.thickness/2-radius;if(gap2>minClearance-EPSILON2)continue;let pcb_trace_error_id=`overlap_${segmentA.pcb_trace_id}_${primaryObjId}`;if(errorIds.has(pcb_trace_error_id))continue;errorIds.add(pcb_trace_error_id),errors.push({type:"pcb_trace_error",error_type:"pcb_trace_error",message:constructErrorMessage(getReadableName(segmentA.pcb_trace_id),`${obj.type} "${getReadableName(getPrimaryId(obj))}"`,gap2),pcb_trace_id:segmentA.pcb_trace_id,center:center2,source_trace_id:"",pcb_trace_error_id,pcb_component_ids:["pcb_component_id"in obj?obj.pcb_component_id:void 0].filter(Boolean),pcb_port_ids:[...getPcbPortIdsConnectedToTraces([segmentA._pcbTrace]),"pcb_port_id"in obj?obj.pcb_port_id:void 0].filter(Boolean)});continue}if(obj.type==="pcb_smtpad"&&(obj.shape==="rotated_rect"||obj.shape==="polygon")||obj.type==="pcb_plated_hole"&&"rect_pad_width"in obj&&"rect_pad_height"in obj){let padOutline=getPolygonPointsForPad(obj),{distance:distance32,center:center2}=getSegmentToPolygonClearance(segmentA,padOutline),gap2=distance32-segmentA.thickness/2;if(gap2>minClearance-EPSILON2)continue;let pcb_trace_error_id=`overlap_${segmentA.pcb_trace_id}_${primaryObjId}`;if(errorIds.has(pcb_trace_error_id))continue;errorIds.add(pcb_trace_error_id),errors.push({type:"pcb_trace_error",error_type:"pcb_trace_error",message:constructErrorMessage(getReadableName(segmentA.pcb_trace_id),`${obj.type} "${getReadableName(getPrimaryId(obj))}"`,gap2),pcb_trace_id:segmentA.pcb_trace_id,center:center2,source_trace_id:"",pcb_trace_error_id,pcb_component_ids:["pcb_component_id"in obj?obj.pcb_component_id:void 0].filter(Boolean),pcb_port_ids:[...getPcbPortIdsConnectedToTraces([segmentA._pcbTrace]),"pcb_port_id"in obj?obj.pcb_port_id:void 0].filter(Boolean)});continue}let gap=segmentToBoundsMinDistance({x:segmentA.x1,y:segmentA.y1},{x:segmentA.x2,y:segmentA.y2},getCollidableBounds(obj))-segmentA.thickness/2;if(gap+EPSILON2<requiredMargin){let pcb_trace_error_id=`overlap_${segmentA.pcb_trace_id}_${primaryObjId}`;if(errorIds.has(pcb_trace_error_id))continue;errorIds.add(pcb_trace_error_id),errors.push({type:"pcb_trace_error",error_type:"pcb_trace_error",message:constructErrorMessage(getReadableName(segmentA.pcb_trace_id),`${obj.type} "${getReadableName(getPrimaryId(obj))}"`,gap),pcb_trace_id:segmentA.pcb_trace_id,source_trace_id:"",pcb_trace_error_id,pcb_component_ids:["pcb_component_id"in obj?obj.pcb_component_id:void 0].filter(Boolean),center:getClosestPointBetweenSegmentAndBounds(segmentA,getCollidableBounds(obj)),pcb_port_ids:[...getPcbPortIdsConnectedToTraces([segmentA._pcbTrace]),"pcb_port_id"in obj?obj.pcb_port_id:void 0].filter(Boolean)})}}}return errors}function checkViasOffBoard(circuitJson){let board=getPcbBoard(circuitJson);if(!board)return[];let vias=circuitJson.filter(el3=>el3.type==="pcb_via");if(vias.length===0)return[];if(board.width===void 0||board.height===void 0)return[];let boardEdgeClearance=getBoardDrcValue(board,"min_board_edge_clearance")??jlcMinTolerances.min_board_edge_clearance,boardMinX=board.center.x-board.width/2,boardMaxX=board.center.x+board.width/2,boardMinY=board.center.y-board.height/2,boardMaxY=board.center.y+board.height/2,errors=[];for(let via of vias){let viaRadius=via.outer_diameter/2,viaMinX=via.x-viaRadius,viaMaxX=via.x+viaRadius,viaMinY=via.y-viaRadius,viaMaxY=via.y+viaRadius;if(viaMinX<boardMinX+boardEdgeClearance||viaMaxX>boardMaxX-boardEdgeClearance||viaMinY<boardMinY+boardEdgeClearance||viaMaxY>boardMaxY-boardEdgeClearance){let viaName=getReadableNameForElement(circuitJson,via.pcb_via_id);errors.push({type:"pcb_placement_error",pcb_placement_error_id:`out_of_board_${via.pcb_via_id}`,message:`Via ${viaName} is outside or crossing the board boundary`,error_type:"pcb_placement_error"})}}return errors}function isPolygonCCW(poly){return poly.area()>=0}function rectanglePolygon({center:center2,size:size3,rotationDeg=0}){let cx3=center2.x,cy3=center2.y,hw2=size3.width/2,hh3=size3.height/2,corners=[new Point$3(cx3-hw2,cy3-hh3),new Point$3(cx3+hw2,cy3-hh3),new Point$3(cx3+hw2,cy3+hh3),new Point$3(cx3-hw2,cy3+hh3)],poly=new Polygon$1(corners);if(rotationDeg){let matrix2=rotateDEG(rotationDeg,cx3,cy3),rotatedCorners=corners.map(pt3=>{let p5=applyToPoint(matrix2,{x:pt3.x,y:pt3.y});return new Point$3(p5.x,p5.y)});poly=new Polygon$1(rotatedCorners)}return isPolygonCCW(poly)||poly.reverse(),poly}function boardToPolygon({board}){if(board.outline&&board.outline.length>0){let points=board.outline.map(p5=>new Point$3(p5.x,p5.y)),poly=new Polygon$1(points);return isPolygonCCW(poly)||poly.reverse(),poly}return board.center&&typeof board.width=="number"&&typeof board.height=="number"?rectanglePolygon({center:board.center,size:{width:board.width,height:board.height},rotationDeg:0}):null}function getComponentName({circuitJson,component}){if(component.source_component_id){let sourceComponent=circuitJson.find(el3=>el3.type==="source_component"&&el3.source_component_id===component.source_component_id);if(sourceComponent&&"name"in sourceComponent&&sourceComponent.name)return sourceComponent.name}return getReadableNameForComponent(circuitJson,component.pcb_component_id)}function computeOverlapDistance(compPoly,boardPoly,componentCenter,componentWidth,componentHeight,rotationDeg){let centerPoint=new Point$3(componentCenter.x,componentCenter.y);if(!boardPoly.contains(centerPoint)){let dist=boardPoly.distanceTo(centerPoint);return Array.isArray(dist)?dist[0]:Number(dist)||0}let hw2=componentWidth/2,hh3=componentHeight/2,corners=[{x:componentCenter.x-hw2,y:componentCenter.y-hh3},{x:componentCenter.x+hw2,y:componentCenter.y-hh3},{x:componentCenter.x+hw2,y:componentCenter.y+hh3},{x:componentCenter.x-hw2,y:componentCenter.y+hh3}],midpoints=[];for(let i3=0;i3<4;i3++){let next2=(i3+1)%4;midpoints.push({x:(corners[i3].x+corners[next2].x)/2,y:(corners[i3].y+corners[next2].y)/2})}let matrix2=rotateDEG(rotationDeg,componentCenter.x,componentCenter.y),rotatePoint22=pt3=>{let p5=applyToPoint(matrix2,pt3);return new Point$3(p5.x,p5.y)},rotatedPoints=corners.concat(midpoints).map(rotatePoint22),maxDistance=0;for(let pt3 of rotatedPoints)if(!boardPoly.contains(pt3)){let dist=boardPoly.distanceTo(pt3),d4=Array.isArray(dist)?dist[0]:Number(dist)||0;d4>maxDistance&&(maxDistance=d4)}if(maxDistance>0)return maxDistance;try{let intersection=BooleanOperations.intersect(compPoly,boardPoly),intersectionArea=0;intersection?Array.isArray(intersection)?intersectionArea=intersection.reduce((sum,p5)=>sum+(typeof p5.area=="function"?p5.area():0),0):typeof intersection.area=="function"?intersectionArea=intersection.area():intersectionArea=0:intersectionArea=0;let compArea=compPoly.area();if(intersectionArea>0&&intersectionArea<compArea){let overlapRatio=1-intersectionArea/compArea,compWidth=Math.abs(componentWidth),compHeight=Math.abs(componentHeight);return Math.min(compWidth,compHeight)*overlapRatio}else return .1}catch{return .1}}function getRepositionSuggestion({componentPoly,boardPoly}){let boardBox=boardPoly.box,componentBox=componentPoly.box,deltaX=0,deltaY=0;if(componentBox.xmin<boardBox.xmin?deltaX=boardBox.xmin-componentBox.xmin:componentBox.xmax>boardBox.xmax&&(deltaX=boardBox.xmax-componentBox.xmax),componentBox.ymin<boardBox.ymin?deltaY=boardBox.ymin-componentBox.ymin:componentBox.ymax>boardBox.ymax&&(deltaY=boardBox.ymax-componentBox.ymax),deltaX===0&&deltaY===0)return null;let xDir=deltaX>=0?"right":"left",yDir=deltaY>=0?"up":"down",absDx=Math.abs(Math.round(deltaX*100)/100),absDy=Math.abs(Math.round(deltaY*100)/100);return absDx>0&&absDy>0?`Try moving it ${absDx}mm ${xDir} and ${absDy}mm ${yDir} to fit within the board edge.`:absDx>0?`Try moving it ${absDx}mm ${xDir} to fit within the board edge.`:`Try moving it ${absDy}mm ${yDir} to fit within the board edge.`}function checkPcbComponentsOutOfBoard(circuitJson){let board=circuitJson.find(el3=>el3.type==="pcb_board");if(!board)return[];let boardPoly=boardToPolygon({board});if(!boardPoly)return[];let components=circuitJson.filter(el3=>el3.type==="pcb_component");if(components.length===0)return[];let errors=[];for(let c6 of components){if(c6.is_allowed_to_be_off_board||!c6.center||typeof c6.width!="number"||typeof c6.height!="number"||c6.width<=0||c6.height<=0)continue;let compPoly=rectanglePolygon({center:c6.center,size:{width:c6.width,height:c6.height},rotationDeg:0});if(compPoly.area()===0||boardPoly.contains(compPoly))continue;let overlapDistance=computeOverlapDistance(compPoly,boardPoly,c6.center,c6.width,c6.height,0),compName=getComponentName({circuitJson,component:c6}),overlapDistanceMm=Math.round(overlapDistance*100)/100,repositionSuggestion=getRepositionSuggestion({componentPoly:compPoly,boardPoly});errors.push({type:"pcb_component_outside_board_error",error_type:"pcb_component_outside_board_error",pcb_component_outside_board_error_id:`pcb_component_outside_board_${c6.pcb_component_id}`,message:`Component ${compName} extends outside board boundaries by ${overlapDistanceMm}mm.${repositionSuggestion?` ${repositionSuggestion}`:""}`,pcb_component_id:c6.pcb_component_id,pcb_board_id:board.pcb_board_id,component_center:c6.center,component_bounds:{min_x:compPoly.box.xmin,max_x:compPoly.box.xmax,min_y:compPoly.box.ymin,max_y:compPoly.box.ymax},subcircuit_id:c6.subcircuit_id,source_component_id:c6.source_component_id})}return errors}function distance22(a3,b4){return Math.hypot(a3.x-b4.x,a3.y-b4.y)}function viasAreAtSameLocation(a3,b4){return distance22(a3,b4)<=EPSILON2}function checkSameNetViaSpacing(circuitJson,{connMap,minClearance}={}){let vias=circuitJson.filter(el3=>el3.type==="pcb_via");if(vias.length<2)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_via_hole_edge_to_via_hole_edge_clearance")??jlcMinTolerances.min_via_hole_edge_to_via_hole_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let errors=[],reported=new Set;for(let i3=0;i3<vias.length;i3++)for(let j5=i3+1;j5<vias.length;j5++){let viaA=vias[i3],viaB=vias[j5];if(viasAreAtSameLocation(viaA,viaB)||!connMap.areIdsConnected(viaA.pcb_via_id,viaB.pcb_via_id))continue;let gap=distance22(viaA,viaB)-viaA.hole_diameter/2-viaB.hole_diameter/2;if(gap+EPSILON2>=minClearance)continue;let pairId=[viaA.pcb_via_id,viaB.pcb_via_id].sort().join("_");reported.has(pairId)||(reported.add(pairId),errors.push({type:"pcb_via_clearance_error",pcb_error_id:`same_net_vias_close_${pairId}`,message:`Vias ${getReadableNameForElement(circuitJson,viaA.pcb_via_id)} and ${getReadableNameForElement(circuitJson,viaB.pcb_via_id)} are too close together (gap: ${gap.toFixed(3)}mm)`,error_type:"pcb_via_clearance_error",pcb_via_ids:[viaA.pcb_via_id,viaB.pcb_via_id],minimum_clearance:minClearance,actual_clearance:gap,pcb_center:{x:(viaA.x+viaB.x)/2,y:(viaA.y+viaB.y)/2}}))}return errors}function checkDifferentNetViaSpacing(circuitJson,{connMap,minClearance}={}){let vias=circuitJson.filter(el3=>el3.type==="pcb_via");if(vias.length<2)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_via_hole_edge_to_via_hole_edge_clearance")??jlcMinTolerances.min_via_hole_edge_to_via_hole_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let errors=[],reported=new Set;for(let i3=0;i3<vias.length;i3++)for(let j5=i3+1;j5<vias.length;j5++){let viaA=vias[i3],viaB=vias[j5];if(viasAreAtSameLocation(viaA,viaB)||connMap.areIdsConnected(viaA.pcb_via_id,viaB.pcb_via_id))continue;let gap=distance22(viaA,viaB)-viaA.hole_diameter/2-viaB.hole_diameter/2;if(gap+EPSILON2>=minClearance)continue;let pairId=[viaA.pcb_via_id,viaB.pcb_via_id].sort().join("_");reported.has(pairId)||(reported.add(pairId),errors.push({type:"pcb_via_clearance_error",pcb_error_id:`different_net_vias_close_${pairId}`,message:`Vias ${getReadableNameForElement(circuitJson,viaA.pcb_via_id)} and ${getReadableNameForElement(circuitJson,viaB.pcb_via_id)} from different nets are too close together (gap: ${gap.toFixed(3)}mm)`,error_type:"pcb_via_clearance_error",pcb_via_ids:[viaA.pcb_via_id,viaB.pcb_via_id],minimum_clearance:minClearance,actual_clearance:gap,pcb_center:{x:(viaA.x+viaB.x)/2,y:(viaA.y+viaB.y)/2}}))}return errors}function checkSourceTracesHavePcbTraces(circuitJson){let errors=[],sourceTraces=circuitJson.filter(el3=>el3.type==="source_trace"),pcbTraces=circuitJson.filter(el3=>el3.type==="pcb_trace"),pcbPorts=circuitJson.filter(el3=>el3.type==="pcb_port"),sourcePortToPcbPort=new Map(pcbPorts.map(pcbPort=>[pcbPort.source_port_id,pcbPort])),connectivityMap=getFullConnectivityMapFromCircuitJson(circuitJson);for(let sourceTrace of sourceTraces){if(!sourceTrace.connected_source_port_ids?.length||(sourceTrace.connected_source_net_ids?.length??0)>0||sourceTrace.connected_source_port_ids.length<2)continue;if(!pcbTraces.some(pcbTrace=>connectivityMap.areIdsConnected(sourceTrace.source_trace_id,pcbTrace.pcb_trace_id))){let connectedPcbPorts=sourceTrace.connected_source_port_ids.map(sourcePortId=>sourcePortToPcbPort.get(sourcePortId)).filter(pcbPort=>pcbPort!==void 0),connectedPcbComponentIds=Array.from(new Set(connectedPcbPorts.map(port=>port.pcb_component_id).filter(id3=>id3!==void 0)));errors.push({type:"pcb_trace_missing_error",pcb_trace_missing_error_id:`pcb_trace_missing_${sourceTrace.source_trace_id}`,error_type:"pcb_trace_missing_error",message:`Trace [${sourceTrace.display_name&&!containsCircuitJsonId(sourceTrace.display_name)?sourceTrace.display_name:"trace"}] is not connected (it has no PCB trace)`,source_trace_id:sourceTrace.source_trace_id,pcb_component_ids:connectedPcbComponentIds,pcb_port_ids:connectedPcbPorts.map(port=>port.pcb_port_id)})}}return errors}function getBoardPolygonPoints(board){if(board.outline&&board.outline.length>0)return board.outline.map(p5=>({x:p5.x,y:p5.y}));if(board.center&&typeof board.width=="number"&&typeof board.height=="number"){let cx3=board.center.x,cy3=board.center.y,hw2=board.width/2,hh3=board.height/2;return[{x:cx3-hw2,y:cy3-hh3},{x:cx3+hw2,y:cy3-hh3},{x:cx3+hw2,y:cy3+hh3},{x:cx3-hw2,y:cy3+hh3}]}return null}function checkPcbTracesOutOfBoard(circuitJson,config={}){let errors=[],board=getPcbBoard(circuitJson);if(!board)return errors;let margin=config.margin??getBoardDrcValue(board,"min_board_edge_clearance")??jlcMinTolerances.min_board_edge_clearance,boardPoints=getBoardPolygonPoints(board);if(!boardPoints)return errors;let pcbTraces=cju_default(circuitJson).pcb_trace.list();for(let trace of pcbTraces)if(!(trace.route.length<2))for(let i3=0;i3<trace.route.length-1;i3++){let p12=trace.route[i3],p22=trace.route[i3+1];if(p12.route_type!=="wire"||p22.route_type!=="wire")continue;let traceWidth="width"in p12?p12.width:"width"in p22?p22.width:.1,segmentStart={x:p12.x,y:p12.y},segmentEnd={x:p22.x,y:p22.y},minDistance=Number.POSITIVE_INFINITY;for(let j5=0;j5<boardPoints.length;j5++){let edgeStart=boardPoints[j5],edgeEnd=boardPoints[(j5+1)%boardPoints.length],distance32=segmentToSegmentMinDistance(segmentStart,segmentEnd,edgeStart,edgeEnd);distance32<minDistance&&(minDistance=distance32)}let minimumDistance=traceWidth/2+margin;if(minDistance<minimumDistance){let error2={type:"pcb_trace_error",error_type:"pcb_trace_error",pcb_trace_error_id:`trace_too_close_to_board_${trace.pcb_trace_id}_segment_${i3}`,message:`Trace too close to board edge (${minDistance.toFixed(3)}mm < ${minimumDistance.toFixed(3)}mm required, margin: ${margin}mm)`,pcb_trace_id:trace.pcb_trace_id,source_trace_id:trace.source_trace_id||"",center:{x:(segmentStart.x+segmentEnd.x)/2,y:(segmentStart.y+segmentEnd.y)/2},pcb_component_ids:[],pcb_port_ids:[]};errors.push(error2)}}return errors}function getElementLayers(elem){return elem.type==="pcb_courtyard_circle"||elem.type==="pcb_courtyard_outline"||elem.type==="pcb_courtyard_polygon"||elem.type==="pcb_courtyard_rect"?[elem.layer]:getLayersOfPcbElement(elem)}function doLayersOverlap(layers1,layers2){return layers1.length===0||layers2.length===0?!0:layers1.some(l7=>layers2.includes(l7))}function doPcbElementsOverlap(elem1,elem2){let layers1=getElementLayers(elem1),layers2=getElementLayers(elem2);if(!doLayersOverlap(layers1,layers2))return!1;let bounds1=getBoundsOfPcbElements([elem1]),bounds2=getBoundsOfPcbElements([elem2]);return doBoundsOverlap(bounds1,bounds2)}var isCourtyardElement=element=>element.type==="pcb_courtyard_circle"||element.type==="pcb_courtyard_outline"||element.type==="pcb_courtyard_polygon"||element.type==="pcb_courtyard_rect",formatOverlapElementDescription=(circuitJson,element)=>{if("pcb_port_id"in element&&element.pcb_port_id)return getReadableNameForPort(circuitJson,element.pcb_port_id);let id3=getPrimaryId(element),readableName=getReadableNameForElementId(circuitJson,id3);return readableName==="element"?`[${id3}]`:readableName};function checkPcbComponentOverlap(circuitJson){let errors=[],connMap=getFullConnectivityMapFromCircuitJson(circuitJson),smtPads=cju_default(circuitJson).pcb_smtpad.list(),platedHoles=cju_default(circuitJson).pcb_plated_hole.list(),holes=cju_default(circuitJson).pcb_hole.list(),courtyards=circuitJson.filter(isCourtyardElement),componentMap=new Map;for(let pad2 of smtPads){let componentId=pad2.pcb_component_id||`standalone_pad_${getPrimaryId(pad2)}`;componentMap.has(componentId)||componentMap.set(componentId,{component_id:componentId,elements:[]}),componentMap.get(componentId).elements.push(pad2)}for(let hole of platedHoles){let componentId=hole.pcb_component_id||`standalone_plated_hole_${getPrimaryId(hole)}`;componentMap.has(componentId)||componentMap.set(componentId,{component_id:componentId,elements:[]}),componentMap.get(componentId).elements.push(hole)}for(let hole of holes){let componentId=hole.pcb_component_id||`standalone_hole_${getPrimaryId(hole)}`;componentMap.has(componentId)||componentMap.set(componentId,{component_id:componentId,elements:[hole]})}for(let courtyard of courtyards){let componentId=courtyard.pcb_component_id;componentMap.has(componentId)||componentMap.set(componentId,{component_id:componentId,elements:[]}),componentMap.get(componentId).elements.push(courtyard)}for(let[componentId,componentData]of componentMap)componentData.elements.length>0&&(componentData.bounds=getBoundsOfPcbElements(componentData.elements));let componentsWithElements=Array.from(componentMap.values());for(let i3=0;i3<componentsWithElements.length;i3++)for(let j5=i3+1;j5<componentsWithElements.length;j5++){let comp1=componentsWithElements[i3],comp2=componentsWithElements[j5];if(!(!comp1.bounds||!comp2.bounds)&&doBoundsOverlap(comp1.bounds,comp2.bounds))for(let elem1 of comp1.elements)for(let elem2 of comp2.elements){let id1=getPrimaryId(elem1),id22=getPrimaryId(elem2);if(!((isCourtyardElement(elem1)||isCourtyardElement(elem2))&&elem1.type!=="pcb_hole"&&elem2.type!=="pcb_hole")&&!(elem1.type==="pcb_smtpad"&&elem2.type==="pcb_smtpad"&&connMap.areIdsConnected(id1,id22))&&doPcbElementsOverlap(elem1,elem2)){let elem1Description=formatOverlapElementDescription(circuitJson,elem1),elem2Description=formatOverlapElementDescription(circuitJson,elem2),error2={type:"pcb_footprint_overlap_error",pcb_error_id:`pcb_footprint_overlap_${id1}_${id22}`,error_type:"pcb_footprint_overlap_error",message:`${elem1.type} ${elem1Description} overlaps with ${elem2.type} ${elem2Description}`};(elem1.type==="pcb_smtpad"||elem2.type==="pcb_smtpad")&&(error2.pcb_smtpad_ids=[],elem1.type==="pcb_smtpad"&&error2.pcb_smtpad_ids.push(id1),elem2.type==="pcb_smtpad"&&error2.pcb_smtpad_ids.push(id22)),(elem1.type==="pcb_plated_hole"||elem2.type==="pcb_plated_hole")&&(error2.pcb_plated_hole_ids=[],elem1.type==="pcb_plated_hole"&&error2.pcb_plated_hole_ids.push(id1),elem2.type==="pcb_plated_hole"&&error2.pcb_plated_hole_ids.push(id22)),(elem1.type==="pcb_hole"||elem2.type==="pcb_hole")&&(error2.pcb_hole_ids=[],elem1.type==="pcb_hole"&&error2.pcb_hole_ids.push(id1),elem2.type==="pcb_hole"&&error2.pcb_hole_ids.push(id22)),errors.push(error2)}}}return errors}var formatMm=value=>{let rounded=Math.round(value*1e3)/1e3;return`${Number(rounded.toFixed(3))}mm`},getPadBounds=pad2=>getBoundsOfPcbElements([pad2]),getPadCenter=pad2=>{let bounds=getPadBounds(pad2);return midpoint({x:bounds.minX,y:bounds.minY},{x:bounds.maxX,y:bounds.maxY})},getPadRadius=pad2=>{let bounds=getPadBounds(pad2);return Math.min(bounds.maxX-bounds.minX,bounds.maxY-bounds.minY)/2},isCircularPad=pad2=>pad2.shape==="circle",isPillPad=pad2=>pad2.type==="pcb_smtpad"&&(pad2.shape==="pill"||pad2.shape==="rotated_pill"),getCircleShape=pad2=>{let center2=getPadCenter(pad2);return{kind:"circle",x:center2.x,y:center2.y,radius:getPadRadius(pad2)}},getPolygonShape=pad2=>{if(pad2.type==="pcb_smtpad"&&(pad2.shape==="polygon"||pad2.shape==="rotated_rect"))return{kind:"polygon",points:getPolygonPointsForPad(pad2)};if(pad2.type==="pcb_plated_hole"&&"rect_pad_width"in pad2&&"rect_pad_height"in pad2)return{kind:"polygon",points:getPolygonPointsForPad(pad2)};let bounds=getPadBounds(pad2);return{kind:"polygon",points:[{x:bounds.minX,y:bounds.minY},{x:bounds.maxX,y:bounds.minY},{x:bounds.maxX,y:bounds.maxY},{x:bounds.minX,y:bounds.maxY}]}},getPadToPadGap=(padA,padB)=>{if(isPillPad(padA)&&isPillPad(padB)){let pillA=getPillCenterLineForPad(padA),pillB=getPillCenterLineForPad(padB);return segmentToSegmentMinDistance(pillA.start,pillA.end,pillB.start,pillB.end)-pillA.radius-pillB.radius}if(isPillPad(padA)&&isCircularPad(padB)){let pill=getPillCenterLineForPad(padA);return segmentToCircleMinDistance(pill.start,pill.end,getCircleShape(padB))-pill.radius}if(isCircularPad(padA)&&isPillPad(padB)){let pill=getPillCenterLineForPad(padB);return segmentToCircleMinDistance(pill.start,pill.end,getCircleShape(padA))-pill.radius}if(isPillPad(padA)){let pill=getPillCenterLineForPad(padA);return getSegmentToPolygonClearanceFromPoints(pill.start,pill.end,getPolygonShape(padB).points).distance-pill.radius}if(isPillPad(padB)){let pill=getPillCenterLineForPad(padB);return getSegmentToPolygonClearanceFromPoints(pill.start,pill.end,getPolygonShape(padA).points).distance-pill.radius}return isCircularPad(padA)&&isCircularPad(padB)?distanceBetweenCircleAndCircle(getCircleShape(padA),getCircleShape(padB)):isCircularPad(padA)?distanceBetweenCircleAndPolygon(getCircleShape(padA),getPolygonShape(padB)):isCircularPad(padB)?distanceBetweenCircleAndPolygon(getCircleShape(padB),getPolygonShape(padA)):distanceBetweenPolygonAndPolygon(getPolygonShape(padA),getPolygonShape(padB))},getPads=circuitJson=>[...cju_default(circuitJson).pcb_smtpad.list(),...cju_default(circuitJson).pcb_plated_hole.list()],getTraceSegments=circuitJson=>cju_default(circuitJson).pcb_trace.list().flatMap(pcbTrace=>{let segments=[];for(let i3=0;i3<pcbTrace.route.length-1;i3++){let p12=pcbTrace.route[i3],p22=pcbTrace.route[i3+1];p12.route_type==="wire"&&p22.route_type==="wire"&&p12.layer===p22.layer&&segments.push({type:"pcb_trace_segment",pcb_trace_id:pcbTrace.pcb_trace_id,_pcbTrace:pcbTrace,thickness:"width"in p12?p12.width:"width"in p22?p22.width:DEFAULT_TRACE_THICKNESS,layer:p12.layer,x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y})}return segments});function checkPadPadClearance(circuitJson,{connMap,minClearance}={}){let pads=getPads(circuitJson);if(pads.length<2)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_pad_edge_to_pad_edge_clearance")??jlcMinTolerances.min_pad_edge_to_pad_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let spatialIndex=new SpatialObjectIndex({objects:pads,getBounds:getPadBounds,getId:pad2=>getPrimaryId(pad2)}),errors=new Map;for(let padA of pads){let padAId=getPrimaryId(padA),nearbyPads=spatialIndex.getObjectsInBounds(getPadBounds(padA),minClearance);for(let padB of nearbyPads){let padBId=getPrimaryId(padB);if(padAId===padBId||!getLayersOfPcbElement(padA).some(layer=>getLayersOfPcbElement(padB).includes(layer))||connMap.areIdsConnected(padAId,padBId))continue;let pairId=[padAId,padBId].sort().join("_"),gap=getPadToPadGap(padA,padB);if(gap+EPSILON2>=minClearance)continue;let centerA=getPadCenter(padA),centerB=getPadCenter(padB),nextError={type:"pcb_pad_pad_clearance_error",pcb_pad_pad_clearance_error_id:`pad_pad_clearance_${pairId}`,error_type:"pcb_pad_pad_clearance_error",message:`Pads ${getReadableNameForElement(circuitJson,padAId)} and ${getReadableNameForElement(circuitJson,padBId)} are too close (clearance: ${formatMm(gap)}, minimum: ${formatMm(minClearance)})`,pcb_pad_ids:[padAId,padBId],minimum_clearance:minClearance,actual_clearance:gap,center:{x:(centerA.x+centerB.x)/2,y:(centerA.y+centerB.y)/2}};errors.has(pairId)||errors.set(pairId,nextError)}}return Array.from(errors.values())}function checkPadTraceClearance(circuitJson,{connMap,minClearance}={}){let pads=getPads(circuitJson),segments=getTraceSegments(circuitJson);if(pads.length===0||segments.length===0)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_trace_to_pad_edge_clearance")??jlcMinTolerances.min_trace_to_pad_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let spatialIndex=new SpatialObjectIndex({objects:pads,getBounds:getPadBounds,getId:pad2=>getPrimaryId(pad2)}),errors=new Map;for(let segment2 of segments){let nearbyPads=spatialIndex.getObjectsInBounds(getCollidableBounds(segment2),minClearance+segment2.thickness/2);for(let pad2 of nearbyPads){let padId=getPrimaryId(pad2);if(!getLayersOfPcbElement(pad2).includes(segment2.layer)||connMap.areIdsConnected(segment2.pcb_trace_id,padId))continue;let center2=getPadCenter(pad2),gap=pad2.type==="pcb_smtpad"&&(pad2.shape==="pill"||pad2.shape==="rotated_pill")?(()=>{let{distance:distance32,radius}=getSegmentToPillClearance(segment2,pad2);return distance32-segment2.thickness/2-radius})():isCircularPad(pad2)?segmentToCircleMinDistance({x:segment2.x1,y:segment2.y1},{x:segment2.x2,y:segment2.y2},{x:center2.x,y:center2.y,radius:getPadRadius(pad2)})-segment2.thickness/2:segmentToBoundsMinDistance({x:segment2.x1,y:segment2.y1},{x:segment2.x2,y:segment2.y2},getPadBounds(pad2))-segment2.thickness/2;if(gap+EPSILON2>=minClearance)continue;let pairId=`${padId}_${segment2.pcb_trace_id}`,nextError={type:"pcb_pad_trace_clearance_error",pcb_pad_trace_clearance_error_id:`pad_trace_clearance_${pairId}`,error_type:"pcb_pad_trace_clearance_error",message:`Pad ${getReadableNameForElement(circuitJson,padId)} and trace ${getReadableNameForElement(circuitJson,segment2.pcb_trace_id)} are too close (clearance: ${formatMm(gap)}, minimum: ${formatMm(minClearance)})`,pcb_pad_id:padId,pcb_trace_id:segment2.pcb_trace_id,minimum_clearance:minClearance,actual_clearance:gap,center:{x:(center2.x+(segment2.x1+segment2.x2)/2)/2,y:(center2.y+(segment2.y1+segment2.y2)/2)/2}},current3=errors.get(pairId);(!current3||gap<current3.gap)&&errors.set(pairId,{error:nextError,gap})}}return Array.from(errors.values()).map(({error:error2})=>error2)}var getClosestPointOnSegment=(point6,segmentStart,segmentEnd)=>{let dx3=segmentEnd.x-segmentStart.x,dy3=segmentEnd.y-segmentStart.y,lengthSquared=dx3*dx3+dy3*dy3;if(lengthSquared===0)return segmentStart;let t54=Math.max(0,Math.min(1,((point6.x-segmentStart.x)*dx3+(point6.y-segmentStart.y)*dy3)/lengthSquared));return{x:segmentStart.x+t54*dx3,y:segmentStart.y+t54*dy3}};function checkViaTraceClearance(circuitJson,{connMap,minClearance}={}){let vias=circuitJson.filter(el3=>el3.type==="pcb_via"),segments=getTraceSegments(circuitJson);if(vias.length===0||segments.length===0)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_trace_to_pad_edge_clearance")??jlcMinTolerances.min_trace_to_pad_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let errors=new Map;for(let via of vias){let viaRadius=via.outer_diameter/2;for(let segment2 of segments){if(!getLayersOfPcbElement(via).includes(segment2.layer)||connMap.areIdsConnected(segment2.pcb_trace_id,via.pcb_via_id))continue;let gap=segmentToCircleMinDistance({x:segment2.x1,y:segment2.y1},{x:segment2.x2,y:segment2.y2},{x:via.x,y:via.y,radius:viaRadius})-segment2.thickness/2;if(gap+EPSILON2>=minClearance)continue;let closestPoint=getClosestPointOnSegment({x:via.x,y:via.y},{x:segment2.x1,y:segment2.y1},{x:segment2.x2,y:segment2.y2}),pairId=`${via.pcb_via_id}_${segment2.pcb_trace_id}`,nextError={type:"pcb_via_trace_clearance_error",pcb_via_trace_clearance_error_id:`via_trace_clearance_${pairId}`,error_type:"pcb_via_trace_clearance_error",message:`Via ${getReadableNameForElement(circuitJson,via.pcb_via_id)} and trace ${getReadableNameForElement(circuitJson,segment2.pcb_trace_id)} are too close (clearance: ${formatMm(gap)}, minimum: ${formatMm(minClearance)})`,pcb_via_id:via.pcb_via_id,pcb_trace_id:segment2.pcb_trace_id,minimum_clearance:minClearance,actual_clearance:gap,center:{x:(via.x+closestPoint.x)/2,y:(via.y+closestPoint.y)/2}},current3=errors.get(pairId);(!current3||gap<current3.gap)&&errors.set(pairId,{error:nextError,gap})}}return Array.from(errors.values()).map(({error:error2})=>error2)}function checkPinMustBeConnected(circuitJson){let errors=[],sourceComponents=circuitJson.filter(el3=>"source_component_id"in el3&&(el3.type==="source_component"||el3.type.startsWith("source_simple_"))),sourcePorts=circuitJson.filter(el3=>el3.type==="source_port"),sourceTraces=circuitJson.filter(el3=>el3.type==="source_trace"),connectedPortIds=new Set;for(let trace of sourceTraces)for(let portId of trace.connected_source_port_ids??[])connectedPortIds.add(portId);let componentInternalConnections=new Map;for(let component of sourceComponents)"internally_connected_source_port_ids"in component&&component.internally_connected_source_port_ids&&componentInternalConnections.set(component.source_component_id,component.internally_connected_source_port_ids);for(let internalGroups of componentInternalConnections.values())for(let group of internalGroups)if(group.some(portId=>connectedPortIds.has(portId)))for(let portId of group)connectedPortIds.add(portId);for(let port of sourcePorts)if(port.must_be_connected===!0&&!connectedPortIds.has(port.source_port_id)){let componentName=sourceComponents.find(c6=>c6.source_component_id===port.source_component_id)?.name??"Unknown";errors.push({type:"source_pin_must_be_connected_error",source_pin_must_be_connected_error_id:`source_pin_must_be_connected_error_${port.source_port_id}`,error_type:"source_pin_must_be_connected_error",message:`Port ${port.name} on ${componentName} must be connected but is floating`,source_component_id:port.source_component_id??"",source_port_id:port.source_port_id,subcircuit_id:port.subcircuit_id})}return errors}var PIN_ATTRIBUTE_KEYS=["must_be_connected","provides_power","requires_power","provides_ground","requires_ground","provides_voltage","requires_voltage","do_not_connect","include_in_board_pinout","can_use_internal_pullup","is_using_internal_pullup","needs_external_pullup","can_use_internal_pulldown","is_using_internal_pulldown","needs_external_pulldown","can_use_open_drain","is_using_open_drain","can_use_push_pull","is_using_push_pull","should_have_decoupling_capacitor","recommended_decoupling_capacitor_capacitance","is_configured_for_i2c_sda","is_configured_for_i2c_scl","is_configured_for_spi_mosi","is_configured_for_spi_miso","is_configured_for_spi_sck","is_configured_for_spi_cs","is_configured_for_uart_tx","is_configured_for_uart_rx","supports_i2c_sda","supports_i2c_scl","supports_spi_mosi","supports_spi_miso","supports_spi_sck","supports_spi_cs","supports_uart_tx","supports_uart_rx"];function hasAnyPinAttribute(port){return PIN_ATTRIBUTE_KEYS.some(key=>port[key]!==void 0)}function checkAllPinsInComponentAreUnderspecified(circuitJson){let warnings=[],db3=cju_default(circuitJson),sourceComponents=db3.source_component.list(),sourcePorts=db3.source_port.list(),portsByComponent=new Map;for(let port of sourcePorts){if(!port.source_component_id)continue;let existing=portsByComponent.get(port.source_component_id)??[];existing.push(port),portsByComponent.set(port.source_component_id,existing)}for(let component of sourceComponents){if(component.ftype!=="simple_chip")continue;let componentPorts=portsByComponent.get(component.source_component_id)??[];componentPorts.length===0||componentPorts.some(port=>hasAnyPinAttribute(port))||warnings.push({type:"source_component_pins_underspecified_warning",source_component_pins_underspecified_warning_id:`source_component_pins_underspecified_warning_${component.source_component_id}`,warning_type:"source_component_pins_underspecified_warning",message:`All pins on ${component.name} are underspecified (no pinAttributes set)`,source_component_id:component.source_component_id,source_port_ids:componentPorts.map(port=>port.source_port_id),subcircuit_id:componentPorts[0]?.subcircuit_id})}return warnings}function checkNoPowerPinDefined(circuitJson){let warnings=[],db3=cju_default(circuitJson),sourceComponents=db3.source_component.list(),sourcePorts=db3.source_port.list(),portsByComponent=new Map;for(let port of sourcePorts){if(!port.source_component_id)continue;let existing=portsByComponent.get(port.source_component_id)??[];existing.push(port),portsByComponent.set(port.source_component_id,existing)}for(let component of sourceComponents){if(component.ftype!=="simple_chip")continue;let componentPorts=portsByComponent.get(component.source_component_id)??[];componentPorts.length===0||componentPorts.some(port=>port.requires_power===!0)||warnings.push({type:"source_no_power_pin_defined_warning",source_no_power_pin_defined_warning_id:`source_no_power_pin_defined_warning_${component.source_component_id}`,warning_type:"source_no_power_pin_defined_warning",message:`${component.name} has no pin with requires_power=true`,source_component_id:component.source_component_id,source_port_ids:componentPorts.map(port=>port.source_port_id),subcircuit_id:componentPorts[0]?.subcircuit_id})}return warnings}function checkNoGroundPinDefined(circuitJson){let warnings=[],db3=cju_default(circuitJson),sourceComponents=db3.source_component.list(),sourcePorts=db3.source_port.list(),portsByComponent=new Map;for(let port of sourcePorts){if(!port.source_component_id)continue;let existing=portsByComponent.get(port.source_component_id)??[];existing.push(port),portsByComponent.set(port.source_component_id,existing)}for(let component of sourceComponents){if(component.ftype!=="simple_chip")continue;let componentPorts=portsByComponent.get(component.source_component_id)??[];componentPorts.length===0||componentPorts.some(port=>port.requires_ground===!0)||warnings.push({type:"source_no_ground_pin_defined_warning",source_no_ground_pin_defined_warning_id:`source_no_ground_pin_defined_warning_${component.source_component_id}`,warning_type:"source_no_ground_pin_defined_warning",message:`${component.name} has no pin with requires_ground=true`,source_component_id:component.source_component_id,source_port_ids:componentPorts.map(port=>port.source_port_id),subcircuit_id:componentPorts[0]?.subcircuit_id})}return warnings}function getFacingDirectionFromInsertionDirection(component){switch(component.insertion_direction){case"from_left":return"x-";case"from_right":return"x+";case"from_front":return"y+";case"from_back":return"y-";case"from_above":return null;default:return null}}function getFacingDirection(component){if(component.insertion_direction)return getFacingDirectionFromInsertionDirection(component);if(!component.center||!component.cable_insertion_center)return null;let dx3=component.cable_insertion_center.x-component.center.x,dy3=component.cable_insertion_center.y-component.center.y;return Math.abs(dx3)<1e-6&&Math.abs(dy3)<1e-6?null:Math.abs(dx3)>=Math.abs(dy3)?dx3>=0?"x+":"x-":dy3>=0?"y+":"y-"}function getRecommendedFacingDirection(component,bounds){if(!component.center)return null;let distances=[{direction:"x-",distance:component.center.x-bounds.minX},{direction:"x+",distance:bounds.maxX-component.center.x},{direction:"y-",distance:component.center.y-bounds.minY},{direction:"y+",distance:bounds.maxY-component.center.y}];return distances.sort((a3,b4)=>a3.distance-b4.distance),distances[0]?.direction??null}function checkConnectorAccessibleOrientation(circuitJson){let board=circuitJson.find(el3=>el3.type==="pcb_board");if(!board)return[];let bounds=(()=>{try{return getBoardBounds(board)}catch{return null}})();if(!bounds)return[];let warnings=[],components=circuitJson.filter(el3=>el3.type==="pcb_component");for(let component of components){let facingDirection=getFacingDirection(component),recommendedFacingDirection=getRecommendedFacingDirection(component,bounds);if(!facingDirection||!recommendedFacingDirection||facingDirection===recommendedFacingDirection)continue;let componentName=getReadableNameForComponent(circuitJson,component.pcb_component_id);warnings.push({type:"pcb_connector_not_in_accessible_orientation_warning",warning_type:"pcb_connector_not_in_accessible_orientation_warning",pcb_connector_not_in_accessible_orientation_warning_id:`pcb_connector_not_in_accessible_orientation_warning_${component.pcb_component_id}`,message:`${componentName} is facing ${facingDirection} but should face ${recommendedFacingDirection} so the connector is accessible from the board edge`,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,pcb_board_id:board.pcb_board_id,facing_direction:facingDirection,recommended_facing_direction:recommendedFacingDirection,subcircuit_id:component.subcircuit_id})}return warnings}function getCourtyardPolygon(el3){if(el3.type==="pcb_courtyard_rect"){let hw2=el3.width/2,hh3=el3.height/2,corners=[{x:-hw2,y:-hh3},{x:+hw2,y:-hh3},{x:+hw2,y:+hh3},{x:-hw2,y:+hh3}],angle=(el3.ccw_rotation??0)*Math.PI/180,cos6=Math.cos(angle),sin6=Math.sin(angle);return corners.map(({x:x4,y:y3})=>({x:el3.center.x+x4*cos6-y3*sin6,y:el3.center.y+x4*sin6+y3*cos6}))}return el3.type==="pcb_courtyard_circle"?Array.from({length:32},(_3,i3)=>{let a3=2*Math.PI*i3/32;return{x:el3.center.x+el3.radius*Math.cos(a3),y:el3.center.y+el3.radius*Math.sin(a3)}}):el3.outline}function getComponentName2(circuitJson,pcbComponentId){let pcbComponent=circuitJson.find(el3=>el3.type==="pcb_component"&&el3.pcb_component_id===pcbComponentId);if(pcbComponent?.type!=="pcb_component")return pcbComponentId;let sourceComponent=circuitJson.find(el3=>el3.type==="source_component"&&el3.source_component_id===pcbComponent.source_component_id);return sourceComponent?.type==="source_component"&&sourceComponent.name?sourceComponent.name:pcbComponentId}function polygonsOverlap(polyA,polyB){if(polyA.some(p5=>isPointInsidePolygon(p5,polyB))||polyB.some(p5=>isPointInsidePolygon(p5,polyA)))return!0;for(let i3=0;i3<polyA.length;i3++){let a12=polyA[i3],a22=polyA[(i3+1)%polyA.length];for(let j5=0;j5<polyB.length;j5++){let b12=polyB[j5],b22=polyB[(j5+1)%polyB.length];if(doSegmentsIntersect(a12,a22,b12,b22))return!0}}return!1}function checkCourtyardOverlap(circuitJson){let courtyards=circuitJson.filter(el3=>el3.type==="pcb_courtyard_rect"||el3.type==="pcb_courtyard_circle"||el3.type==="pcb_courtyard_outline"),byComponent=new Map;for(let el3 of courtyards){let id3=el3.pcb_component_id;byComponent.has(id3)||byComponent.set(id3,[]),byComponent.get(id3).push(el3)}let componentIds=Array.from(byComponent.keys()),errors=[];for(let i3=0;i3<componentIds.length;i3++)for(let j5=i3+1;j5<componentIds.length;j5++){let idA=componentIds[i3],idB=componentIds[j5],overlapping=!1;outer:for(let a3 of byComponent.get(idA))for(let b4 of byComponent.get(idB)){if("layer"in a3&&"layer"in b4&&a3.layer!==b4.layer)continue;let polyA=getCourtyardPolygon(a3),polyB=getCourtyardPolygon(b4);if(polygonsOverlap(polyA,polyB)){overlapping=!0;break outer}}overlapping&&errors.push({type:"pcb_courtyard_overlap_error",pcb_error_id:`pcb_courtyard_overlap_${idA}_${idB}`,error_type:"pcb_courtyard_overlap_error",message:`Courtyard of ${getComponentName2(circuitJson,idA)} overlaps with courtyard of ${getComponentName2(circuitJson,idB)}`,pcb_component_ids:[idA,idB]})}return errors}function getRoutePointCenter(point6){return point6.route_type==="through_pad"?{x:(point6.start.x+point6.end.x)/2,y:(point6.start.y+point6.end.y)/2}:{x:point6.x,y:point6.y}}function routePointConnectsToAnotherExpectedPort(point6,expectedPorts,missingPcbPortId,padMap){return point6.route_type!=="wire"?!1:expectedPorts.some(expectedPort=>!expectedPort.pcb_port_id||expectedPort.pcb_port_id===missingPcbPortId?!1:padMap.get(expectedPort.pcb_port_id)?.some(pad2=>isPointInPad({x:point6.x,y:point6.y},pad2))??!1)}function getMissingConnectionErrorCenter({firstPoint,lastPoint,port,expectedPorts,padMap}){let errorLocation,firstWirePoint=firstPoint.route_type==="wire"?firstPoint:void 0,lastWirePoint=lastPoint.route_type==="wire"?lastPoint:void 0,firstWirePointReferencesPort=getPcbPortIdsConnectedToRoutePoint(firstPoint).includes(port.pcb_port_id),lastWirePointReferencesPort=getPcbPortIdsConnectedToRoutePoint(lastPoint).includes(port.pcb_port_id);firstWirePointReferencesPort&&firstWirePoint?errorLocation=firstWirePoint:lastWirePointReferencesPort&&lastWirePoint||routePointConnectsToAnotherExpectedPort(firstPoint,expectedPorts,port.pcb_port_id,padMap)&&lastWirePoint?errorLocation=lastWirePoint:routePointConnectsToAnotherExpectedPort(lastPoint,expectedPorts,port.pcb_port_id,padMap)&&firstWirePoint?errorLocation=firstWirePoint:firstWirePoint&&lastWirePoint?errorLocation=distance22(firstWirePoint,port)<=distance22(lastWirePoint,port)?firstWirePoint:lastWirePoint:firstWirePoint?errorLocation=firstWirePoint:lastWirePoint&&(errorLocation=lastWirePoint);let firstPointCenter=getRoutePointCenter(firstPoint),lastPointCenter=getRoutePointCenter(lastPoint);return errorLocation?{x:errorLocation.x,y:errorLocation.y}:{x:(firstPointCenter.x+lastPointCenter.x)/2,y:(firstPointCenter.y+lastPointCenter.y)/2}}function checkTracesAreContiguous(circuitJson){let errors=[],pcbPorts=circuitJson.filter(el3=>el3.type==="pcb_port"),pcbTraces=circuitJson.filter(el3=>el3.type==="pcb_trace"),sourceTraces=circuitJson.filter(el3=>el3.type==="source_trace"),pcbSmtPads=circuitJson.filter(el3=>el3.type==="pcb_smtpad"),pcbPlatedHoles=circuitJson.filter(el3=>el3.type==="pcb_plated_hole"),padMap=new Map,pcbConnectivityMap=new PcbConnectivityMap(circuitJson);for(let pad2 of pcbSmtPads)pad2.pcb_port_id&&padMap.set(pad2.pcb_port_id,[...padMap.get(pad2.pcb_port_id)??[],pad2]);for(let hole of pcbPlatedHoles)hole.pcb_port_id&&padMap.set(hole.pcb_port_id,[...padMap.get(hole.pcb_port_id)??[],hole]);for(let trace of pcbTraces){if(trace.route.length===0)continue;let firstPoint=trace.route[0],lastPoint=trace.route[trace.route.length-1],sourceTrace=sourceTraces.find(st3=>st3.source_trace_id===trace.source_trace_id),expectedPorts=sourceTrace?pcbPorts.filter(port=>sourceTrace.connected_source_port_ids?.includes(port.source_port_id)):[];for(let i3=1;i3<trace.route.length-1;i3++){let prevPoint=trace.route[i3-1],currentPoint=trace.route[i3],nextPoint=trace.route[i3+1];if(currentPoint.route_type==="via"){let prevIsWire=prevPoint.route_type==="wire",nextIsWire=nextPoint.route_type==="wire";if(prevIsWire&&nextIsWire){let prevAligned=Math.abs(prevPoint.x-currentPoint.x)<.01&&Math.abs(prevPoint.y-currentPoint.y)<.01,nextAligned=Math.abs(nextPoint.x-currentPoint.x)<.01&&Math.abs(nextPoint.y-currentPoint.y)<.01;if(!prevAligned||!nextAligned){let traceName2=getReadableNameForPcbTrace(circuitJson,trace.pcb_trace_id);errors.push({type:"pcb_trace_error",message:`Via in trace [${traceName2}] is misaligned at position {x: ${currentPoint.x}, y: ${currentPoint.y}}.`,source_trace_id:sourceTrace?.source_trace_id||trace.source_trace_id||`!${trace.pcb_trace_id}`,error_type:"pcb_trace_error",pcb_trace_id:trace.pcb_trace_id,pcb_trace_error_id:`misaligned_via_${trace.pcb_trace_id}_${i3}`,pcb_component_ids:[],pcb_port_ids:[]})}}}}let traceName=getReadableNameForPcbTrace(circuitJson,trace.pcb_trace_id);for(let port of expectedPorts){if(!port.pcb_port_id)continue;let pads=padMap.get(port.pcb_port_id);if(!pads?.length)continue;let isConnectedByRoutedSourceTrace=!1;for(let candidateTrace of pcbConnectivityMap.getAllTracesConnectedToTrace(trace.pcb_trace_id)){if(candidateTrace.pcb_trace_id===trace.pcb_trace_id||!candidateTrace.source_trace_id)continue;let candidateSourceTrace=sourceTraces.find(st3=>st3.source_trace_id===candidateTrace.source_trace_id);if(!(!sourceTrace||candidateTrace.source_trace_id!==sourceTrace.source_trace_id&&!candidateSourceTrace?.connected_source_port_ids.includes(port.source_port_id))&&getPcbPortIdsConnectedToTrace(candidateTrace).includes(port.pcb_port_id)){isConnectedByRoutedSourceTrace=!0;break}}if(isConnectedByRoutedSourceTrace)continue;let isFirstPointConnected=firstPoint.route_type==="wire"&&pads.some(pad2=>isPointInPad({x:firstPoint.x,y:firstPoint.y},pad2)),isLastPointConnected=lastPoint.route_type==="wire"&&pads.some(pad2=>isPointInPad({x:lastPoint.x,y:lastPoint.y},pad2));if(!isFirstPointConnected&&!isLastPointConnected){let portName=getReadableNameForPcbPort(circuitJson,port.pcb_port_id).replace("pcb_port",""),padType=pads[0].type.replace(/pcb_/,""),errorCenter=getMissingConnectionErrorCenter({firstPoint,lastPoint,port,expectedPorts,padMap});errors.push({type:"pcb_trace_error",message:`Trace [${traceName}] is missing a connection to ${padType}${portName}`,source_trace_id:sourceTrace?.source_trace_id||trace.source_trace_id||`!${trace.pcb_trace_id}`,error_type:"pcb_trace_error",pcb_trace_id:trace.pcb_trace_id,pcb_trace_error_id:`missing_connection_${trace.pcb_trace_id}_${port.pcb_port_id}`,center:errorCenter,pcb_component_ids:[],pcb_port_ids:[port.pcb_port_id]})}}if(expectedPorts.length===0){let firstConnectsToAnyPad=!1,lastConnectsToAnyPad=!1,endpointsAreSame=firstPoint.route_type==="wire"&&lastPoint.route_type==="wire"&&Math.abs(firstPoint.x-lastPoint.x)<.01&&Math.abs(firstPoint.y-lastPoint.y)<.01;for(let pads of padMap.values())firstPoint.route_type==="wire"&&pads.some(pad2=>isPointInPad({x:firstPoint.x,y:firstPoint.y},pad2))&&(firstConnectsToAnyPad=!0),lastPoint.route_type==="wire"&&pads.some(pad2=>isPointInPad({x:lastPoint.x,y:lastPoint.y},pad2))&&(lastConnectsToAnyPad=!0);!firstConnectsToAnyPad&&firstPoint.route_type==="wire"&&errors.push({type:"pcb_trace_error",message:`Trace [${traceName}] has disconnected endpoint at (${firstPoint.x.toFixed(2)}, ${firstPoint.y.toFixed(2)})`,source_trace_id:sourceTrace?.source_trace_id||trace.source_trace_id||`!${trace.pcb_trace_id}`,error_type:"pcb_trace_error",pcb_trace_id:trace.pcb_trace_id,pcb_trace_error_id:`disconnected_endpoint_${trace.pcb_trace_id}_start`,center:{x:firstPoint.x,y:firstPoint.y},pcb_component_ids:[],pcb_port_ids:[]}),!lastConnectsToAnyPad&&lastPoint.route_type==="wire"&&!(endpointsAreSame&&!firstConnectsToAnyPad)&&errors.push({type:"pcb_trace_error",message:`Trace [${traceName}] has disconnected endpoint at (${lastPoint.x.toFixed(2)}, ${lastPoint.y.toFixed(2)})`,source_trace_id:sourceTrace?.source_trace_id||trace.source_trace_id||`!${trace.pcb_trace_id}`,error_type:"pcb_trace_error",pcb_trace_id:trace.pcb_trace_id,pcb_trace_error_id:`disconnected_endpoint_${trace.pcb_trace_id}_end`,center:{x:lastPoint.x,y:lastPoint.y},pcb_component_ids:[],pcb_port_ids:[]})}}return errors}async function runAllPlacementChecks(circuitJson){return[...checkViasOffBoard(circuitJson),...checkPcbComponentsOutOfBoard(circuitJson),...checkPcbComponentOverlap(circuitJson),...checkPadPadClearance(circuitJson),...checkPadTraceClearance(circuitJson),...checkCourtyardOverlap(circuitJson),...checkConnectorAccessibleOrientation(circuitJson)]}async function runAllNetlistChecks(circuitJson){return[...checkPinMustBeConnected(circuitJson)]}async function runAllPinSpecificationChecks(circuitJson){return[...checkAllPinsInComponentAreUnderspecified(circuitJson),...checkNoPowerPinDefined(circuitJson),...checkNoGroundPinDefined(circuitJson)]}async function runAllRoutingChecks(circuitJson){return[...checkEachPcbPortConnectedToPcbTraces(circuitJson),...checkSourceTracesHavePcbTraces(circuitJson),...checkEachPcbTraceNonOverlapping(circuitJson),...checkViaTraceClearance(circuitJson),...checkSameNetViaSpacing(circuitJson),...checkDifferentNetViaSpacing(circuitJson),...checkTracesAreContiguous(circuitJson),...checkPcbTracesOutOfBoard(circuitJson)]}init_dist7();init_dist();init_dist7();init_dist2();var import_object_hash=__toESM(require_object_hash(),1),import_object_hash2=__toESM(require_object_hash(),1),import_object_hash3=__toESM(require_object_hash(),1);var t2=Object.create,e6=Object.defineProperty,n2=Object.getOwnPropertyDescriptor,o3=Object.getOwnPropertyNames,i2=Object.getPrototypeOf,s3=Object.prototype.hasOwnProperty,r4=(t54,e7)=>function(){return e7||(0,t54[o3(t54)[0]])((e7={exports:{}}).exports,e7),e7.exports},a2=(t54,n3)=>{for(var o6 in n3)e6(t54,o6,{get:n3[o6],enumerable:!0})},c4=(r6,a3,c6)=>(c6=r6!=null?t2(i2(r6)):{},((t54,i3,r7,a4)=>{if(i3&&typeof i3=="object"||typeof i3=="function")for(let c7 of o3(i3))s3.call(t54,c7)||c7===r7||e6(t54,c7,{get:()=>i3[c7],enumerable:!(a4=n2(i3,c7))||a4.enumerable});return t54})(!a3&&r6&&r6.__esModule?c6:e6(c6,"default",{value:r6,enumerable:!0}),r6)),l6=r4({"node_modules/is-buffer/index.js"(t54,e7){function n3(t55){return!!t55.constructor&&typeof t55.constructor.isBuffer=="function"&&t55.constructor.isBuffer(t55)}e7.exports=function(t55){return t55!=null&&(n3(t55)||(function(t56){return typeof t56.readFloatLE=="function"&&typeof t56.slice=="function"&&n3(t56.slice(0,0))})(t55)||!!t55._isBuffer)}}}),h2=r4({"node_modules/kind-of/index.js"(t54,e7){var n3=l6(),o6=Object.prototype.toString;e7.exports=function(t55){if(t55===void 0)return"undefined";if(t55===null)return"null";if(t55===!0||t55===!1||t55 instanceof Boolean)return"boolean";if(typeof t55=="string"||t55 instanceof String)return"string";if(typeof t55=="number"||t55 instanceof Number)return"number";if(typeof t55=="function"||t55 instanceof Function)return"function";if(Array.isArray!==void 0&&Array.isArray(t55))return"array";if(t55 instanceof RegExp)return"regexp";if(t55 instanceof Date)return"date";var e8=o6.call(t55);return e8==="[object RegExp]"?"regexp":e8==="[object Date]"?"date":e8==="[object Arguments]"?"arguments":e8==="[object Error]"?"error":n3(t55)?"buffer":e8==="[object Set]"?"set":e8==="[object WeakSet]"?"weakset":e8==="[object Map]"?"map":e8==="[object WeakMap]"?"weakmap":e8==="[object Symbol]"?"symbol":e8==="[object Int8Array]"?"int8array":e8==="[object Uint8Array]"?"uint8array":e8==="[object Uint8ClampedArray]"?"uint8clampedarray":e8==="[object Int16Array]"?"int16array":e8==="[object Uint16Array]"?"uint16array":e8==="[object Int32Array]"?"int32array":e8==="[object Uint32Array]"?"uint32array":e8==="[object Float32Array]"?"float32array":e8==="[object Float64Array]"?"float64array":"object"}}}),d3=r4({"node_modules/rename-keys/index.js"(t54,e7){(function(){function t55(t56,e8){if(typeof e8!="function")return t56;var n3={};for(var o6 in t56)Object.prototype.hasOwnProperty.call(t56,o6)&&(n3[e8(o6,t56[o6])||o6]=t56[o6]);return n3}e7!==void 0&&e7.exports?e7.exports=t55:typeof define=="function"&&define.amd?define([],function(){return t55}):window.rename=t55})()}}),u4=r4({"node_modules/deep-rename-keys/index.js"(t54,e7){var n3=h2(),o6=d3();e7.exports=function t55(e8,i3){var s6=n3(e8);if(s6!=="object"&&s6!=="array")throw new Error("expected an object");var r6=[];for(var a3 in s6==="object"&&(e8=o6(e8,i3),r6={}),e8)if(e8.hasOwnProperty(a3)){var c6=e8[a3];n3(c6)==="object"||n3(c6)==="array"?r6[a3]=t55(c6,i3):r6[a3]=c6}return r6}}}),p3=r4({"node_modules/xml-reader/node_modules/eventemitter3/index.js"(t54,e7){var n3=Object.prototype.hasOwnProperty,o6="~";function i3(){}function s6(t55,e8,n4){this.fn=t55,this.context=e8,this.once=n4||!1}function r6(){this._events=new i3,this._eventsCount=0}Object.create&&(i3.prototype=Object.create(null),new i3().__proto__||(o6=!1)),r6.prototype.eventNames=function(){var t55,e8,i6=[];if(this._eventsCount===0)return i6;for(e8 in t55=this._events)n3.call(t55,e8)&&i6.push(o6?e8.slice(1):e8);return Object.getOwnPropertySymbols?i6.concat(Object.getOwnPropertySymbols(t55)):i6},r6.prototype.listeners=function(t55,e8){var n4=o6?o6+t55:t55,i6=this._events[n4];if(e8)return!!i6;if(!i6)return[];if(i6.fn)return[i6.fn];for(var s7=0,r7=i6.length,a3=new Array(r7);s7<r7;s7++)a3[s7]=i6[s7].fn;return a3},r6.prototype.emit=function(t55,e8,n4,i6,s7,r7){var a3=o6?o6+t55:t55;if(!this._events[a3])return!1;var c6,l7,h3=this._events[a3],d4=arguments.length;if(h3.fn){switch(h3.once&&this.removeListener(t55,h3.fn,void 0,!0),d4){case 1:return h3.fn.call(h3.context),!0;case 2:return h3.fn.call(h3.context,e8),!0;case 3:return h3.fn.call(h3.context,e8,n4),!0;case 4:return h3.fn.call(h3.context,e8,n4,i6),!0;case 5:return h3.fn.call(h3.context,e8,n4,i6,s7),!0;case 6:return h3.fn.call(h3.context,e8,n4,i6,s7,r7),!0}for(l7=1,c6=new Array(d4-1);l7<d4;l7++)c6[l7-1]=arguments[l7];h3.fn.apply(h3.context,c6)}else{var u6,p5=h3.length;for(l7=0;l7<p5;l7++)switch(h3[l7].once&&this.removeListener(t55,h3[l7].fn,void 0,!0),d4){case 1:h3[l7].fn.call(h3[l7].context);break;case 2:h3[l7].fn.call(h3[l7].context,e8);break;case 3:h3[l7].fn.call(h3[l7].context,e8,n4);break;case 4:h3[l7].fn.call(h3[l7].context,e8,n4,i6);break;default:if(!c6)for(u6=1,c6=new Array(d4-1);u6<d4;u6++)c6[u6-1]=arguments[u6];h3[l7].fn.apply(h3[l7].context,c6)}}return!0},r6.prototype.on=function(t55,e8,n4){var i6=new s6(e8,n4||this),r7=o6?o6+t55:t55;return this._events[r7]?this._events[r7].fn?this._events[r7]=[this._events[r7],i6]:this._events[r7].push(i6):(this._events[r7]=i6,this._eventsCount++),this},r6.prototype.once=function(t55,e8,n4){var i6=new s6(e8,n4||this,!0),r7=o6?o6+t55:t55;return this._events[r7]?this._events[r7].fn?this._events[r7]=[this._events[r7],i6]:this._events[r7].push(i6):(this._events[r7]=i6,this._eventsCount++),this},r6.prototype.removeListener=function(t55,e8,n4,s7){var r7=o6?o6+t55:t55;if(!this._events[r7])return this;if(!e8)return--this._eventsCount===0?this._events=new i3:delete this._events[r7],this;var a3=this._events[r7];if(a3.fn)a3.fn!==e8||s7&&!a3.once||n4&&a3.context!==n4||(--this._eventsCount===0?this._events=new i3:delete this._events[r7]);else{for(var c6=0,l7=[],h3=a3.length;c6<h3;c6++)(a3[c6].fn!==e8||s7&&!a3[c6].once||n4&&a3[c6].context!==n4)&&l7.push(a3[c6]);l7.length?this._events[r7]=l7.length===1?l7[0]:l7:--this._eventsCount===0?this._events=new i3:delete this._events[r7]}return this},r6.prototype.removeAllListeners=function(t55){var e8;return t55?(e8=o6?o6+t55:t55,this._events[e8]&&(--this._eventsCount===0?this._events=new i3:delete this._events[e8])):(this._events=new i3,this._eventsCount=0),this},r6.prototype.off=r6.prototype.removeListener,r6.prototype.addListener=r6.prototype.on,r6.prototype.setMaxListeners=function(){return this},r6.prefixed=o6,r6.EventEmitter=r6,e7!==void 0&&(e7.exports=r6)}}),m3=r4({"node_modules/xml-lexer/node_modules/eventemitter3/index.js"(t54,e7){var n3=Object.prototype.hasOwnProperty,o6="~";function i3(){}function s6(t55,e8,n4){this.fn=t55,this.context=e8,this.once=n4||!1}function r6(){this._events=new i3,this._eventsCount=0}Object.create&&(i3.prototype=Object.create(null),new i3().__proto__||(o6=!1)),r6.prototype.eventNames=function(){var t55,e8,i6=[];if(this._eventsCount===0)return i6;for(e8 in t55=this._events)n3.call(t55,e8)&&i6.push(o6?e8.slice(1):e8);return Object.getOwnPropertySymbols?i6.concat(Object.getOwnPropertySymbols(t55)):i6},r6.prototype.listeners=function(t55,e8){var n4=o6?o6+t55:t55,i6=this._events[n4];if(e8)return!!i6;if(!i6)return[];if(i6.fn)return[i6.fn];for(var s7=0,r7=i6.length,a3=new Array(r7);s7<r7;s7++)a3[s7]=i6[s7].fn;return a3},r6.prototype.emit=function(t55,e8,n4,i6,s7,r7){var a3=o6?o6+t55:t55;if(!this._events[a3])return!1;var c6,l7,h3=this._events[a3],d4=arguments.length;if(h3.fn){switch(h3.once&&this.removeListener(t55,h3.fn,void 0,!0),d4){case 1:return h3.fn.call(h3.context),!0;case 2:return h3.fn.call(h3.context,e8),!0;case 3:return h3.fn.call(h3.context,e8,n4),!0;case 4:return h3.fn.call(h3.context,e8,n4,i6),!0;case 5:return h3.fn.call(h3.context,e8,n4,i6,s7),!0;case 6:return h3.fn.call(h3.context,e8,n4,i6,s7,r7),!0}for(l7=1,c6=new Array(d4-1);l7<d4;l7++)c6[l7-1]=arguments[l7];h3.fn.apply(h3.context,c6)}else{var u6,p5=h3.length;for(l7=0;l7<p5;l7++)switch(h3[l7].once&&this.removeListener(t55,h3[l7].fn,void 0,!0),d4){case 1:h3[l7].fn.call(h3[l7].context);break;case 2:h3[l7].fn.call(h3[l7].context,e8);break;case 3:h3[l7].fn.call(h3[l7].context,e8,n4);break;case 4:h3[l7].fn.call(h3[l7].context,e8,n4,i6);break;default:if(!c6)for(u6=1,c6=new Array(d4-1);u6<d4;u6++)c6[u6-1]=arguments[u6];h3[l7].fn.apply(h3[l7].context,c6)}}return!0},r6.prototype.on=function(t55,e8,n4){var i6=new s6(e8,n4||this),r7=o6?o6+t55:t55;return this._events[r7]?this._events[r7].fn?this._events[r7]=[this._events[r7],i6]:this._events[r7].push(i6):(this._events[r7]=i6,this._eventsCount++),this},r6.prototype.once=function(t55,e8,n4){var i6=new s6(e8,n4||this,!0),r7=o6?o6+t55:t55;return this._events[r7]?this._events[r7].fn?this._events[r7]=[this._events[r7],i6]:this._events[r7].push(i6):(this._events[r7]=i6,this._eventsCount++),this},r6.prototype.removeListener=function(t55,e8,n4,s7){var r7=o6?o6+t55:t55;if(!this._events[r7])return this;if(!e8)return--this._eventsCount===0?this._events=new i3:delete this._events[r7],this;var a3=this._events[r7];if(a3.fn)a3.fn!==e8||s7&&!a3.once||n4&&a3.context!==n4||(--this._eventsCount===0?this._events=new i3:delete this._events[r7]);else{for(var c6=0,l7=[],h3=a3.length;c6<h3;c6++)(a3[c6].fn!==e8||s7&&!a3[c6].once||n4&&a3[c6].context!==n4)&&l7.push(a3[c6]);l7.length?this._events[r7]=l7.length===1?l7[0]:l7:--this._eventsCount===0?this._events=new i3:delete this._events[r7]}return this},r6.prototype.removeAllListeners=function(t55){var e8;return t55?(e8=o6?o6+t55:t55,this._events[e8]&&(--this._eventsCount===0?this._events=new i3:delete this._events[e8])):(this._events=new i3,this._eventsCount=0),this},r6.prototype.off=r6.prototype.removeListener,r6.prototype.addListener=r6.prototype.on,r6.prototype.setMaxListeners=function(){return this},r6.prefixed=o6,r6.EventEmitter=r6,e7!==void 0&&(e7.exports=r6)}}),g3=r4({"node_modules/xml-lexer/dist/lexer.js"(t54,e7){function n3(t55,e8,n4){return e8 in t55?Object.defineProperty(t55,e8,{value:n4,enumerable:!0,configurable:!0,writable:!0}):t55[e8]=n4,t55}var o6=m3(),i3=function(){},s6={data:"state-data",cdata:"state-cdata",tagBegin:"state-tag-begin",tagName:"state-tag-name",tagEnd:"state-tag-end",attributeNameStart:"state-attribute-name-start",attributeName:"state-attribute-name",attributeNameEnd:"state-attribute-name-end",attributeValueBegin:"state-attribute-value-begin",attributeValue:"state-attribute-value"},r6={lt:"action-lt",gt:"action-gt",space:"action-space",equal:"action-equal",quote:"action-quote",slash:"action-slash",char:"action-char",error:"action-error"},a3={text:"text",openTag:"open-tag",closeTag:"close-tag",attributeName:"attribute-name",attributeValue:"attribute-value"},c6={" ":r6.space," ":r6.space,"\n":r6.space,"\r":r6.space,"<":r6.lt,">":r6.gt,'"':r6.quote,"'":r6.quote,"=":r6.equal,"/":r6.slash};e7.exports={State:s6,Action:r6,Type:a3,create:function(t55){var e8,l7,h3,d4,u6,p5,m4,g4,f4,y3;t55=Object.assign({debug:!1},t55);var _3=new o6,b4=s6.data,x4="",v3="",S7="",I4="",P6="",M5="",C6=function(e10,n4){if(v3[0]!=="?"&&v3[0]!=="!"){var o7={type:e10,value:n4};t55.debug&&console.log("emit:",o7),_3.emit("data",o7)}};_3.stateMachine=(n3(y3={},s6.data,(n3(e8={},r6.lt,function(){x4.trim()&&C6(a3.text,x4),v3="",P6=!1,b4=s6.tagBegin}),n3(e8,r6.char,function(t56){x4+=t56}),e8)),n3(y3,s6.cdata,n3({},r6.char,function(t56){(x4+=t56).substr(-3)==="]]>"&&(C6(a3.text,x4.slice(0,-3)),x4="",b4=s6.data)})),n3(y3,s6.tagBegin,(n3(l7={},r6.space,i3),n3(l7,r6.char,function(t56){v3=t56,b4=s6.tagName}),n3(l7,r6.slash,function(){v3="",P6=!0}),l7)),n3(y3,s6.tagName,(n3(h3={},r6.space,function(){P6?b4=s6.tagEnd:(b4=s6.attributeNameStart,C6(a3.openTag,v3))}),n3(h3,r6.gt,function(){C6(P6?a3.closeTag:a3.openTag,v3),x4="",b4=s6.data}),n3(h3,r6.slash,function(){b4=s6.tagEnd,C6(a3.openTag,v3)}),n3(h3,r6.char,function(t56){(v3+=t56)==="![CDATA["&&(b4=s6.cdata,x4="",v3="")}),h3)),n3(y3,s6.tagEnd,(n3(d4={},r6.gt,function(){C6(a3.closeTag,v3),x4="",b4=s6.data}),n3(d4,r6.char,i3),d4)),n3(y3,s6.attributeNameStart,(n3(u6={},r6.char,function(t56){S7=t56,b4=s6.attributeName}),n3(u6,r6.gt,function(){x4="",b4=s6.data}),n3(u6,r6.space,i3),n3(u6,r6.slash,function(){P6=!0,b4=s6.tagEnd}),u6)),n3(y3,s6.attributeName,(n3(p5={},r6.space,function(){b4=s6.attributeNameEnd}),n3(p5,r6.equal,function(){C6(a3.attributeName,S7),b4=s6.attributeValueBegin}),n3(p5,r6.gt,function(){I4="",C6(a3.attributeName,S7),C6(a3.attributeValue,I4),x4="",b4=s6.data}),n3(p5,r6.slash,function(){P6=!0,I4="",C6(a3.attributeName,S7),C6(a3.attributeValue,I4),b4=s6.tagEnd}),n3(p5,r6.char,function(t56){S7+=t56}),p5)),n3(y3,s6.attributeNameEnd,(n3(m4={},r6.space,i3),n3(m4,r6.equal,function(){C6(a3.attributeName,S7),b4=s6.attributeValueBegin}),n3(m4,r6.gt,function(){I4="",C6(a3.attributeName,S7),C6(a3.attributeValue,I4),x4="",b4=s6.data}),n3(m4,r6.char,function(t56){I4="",C6(a3.attributeName,S7),C6(a3.attributeValue,I4),S7=t56,b4=s6.attributeName}),m4)),n3(y3,s6.attributeValueBegin,(n3(g4={},r6.space,i3),n3(g4,r6.quote,function(t56){M5=t56,I4="",b4=s6.attributeValue}),n3(g4,r6.gt,function(){C6(a3.attributeValue,I4=""),x4="",b4=s6.data}),n3(g4,r6.char,function(t56){M5="",I4=t56,b4=s6.attributeValue}),g4)),n3(y3,s6.attributeValue,(n3(f4={},r6.space,function(t56){M5?I4+=t56:(C6(a3.attributeValue,I4),b4=s6.attributeNameStart)}),n3(f4,r6.quote,function(t56){M5===t56?(C6(a3.attributeValue,I4),b4=s6.attributeNameStart):I4+=t56}),n3(f4,r6.gt,function(t56){M5?I4+=t56:(C6(a3.attributeValue,I4),x4="",b4=s6.data)}),n3(f4,r6.slash,function(t56){M5?I4+=t56:(C6(a3.attributeValue,I4),P6=!0,b4=s6.tagEnd)}),n3(f4,r6.char,function(t56){I4+=t56}),f4)),y3);var N3=function(e10){t55.debug&&console.log(b4,e10);var n4=_3.stateMachine[b4],o7=n4[(function(t56){return c6[t56]||r6.char})(e10)]||n4[r6.error]||n4[r6.char];o7(e10)};return _3.write=function(t56){for(var e10=t56.length,n4=0;n4<e10;n4++)N3(t56[n4])},_3}}}}),f3=r4({"node_modules/xml-reader/dist/reader.js"(t54,e7){var n3=p3(),o6=g3(),i3=o6.Type,s6={element:"element",text:"text"},r6=function(t55){return Object.assign({name:"",type:s6.element,value:"",parent:null,attributes:{},children:[]},t55)},a3=function(t55){t55=Object.assign({stream:!1,parentNodes:!0,doneEvent:"done",tagPrefix:"tag:",emitTopLevelOnly:!1,debug:!1},t55);var e8=void 0,a4=void 0,c6=void 0,l7=void 0,h3=new n3,d4=function(n4){switch(n4.type){case i3.openTag:if(c6===null)(c6=a4).name=n4.value;else{var o7=r6({name:n4.value,parent:c6});c6.children.push(o7),c6=o7}break;case i3.closeTag:var d6=c6.parent;if(t55.parentNodes||(c6.parent=null),c6.name!==n4.value)break;t55.stream&&d6===a4&&(a4.children=[],c6.parent=null),t55.emitTopLevelOnly&&d6!==a4||(h3.emit(t55.tagPrefix+c6.name,c6),h3.emit("tag",c6.name,c6)),c6===a4&&(e8.removeAllListeners("data"),h3.emit(t55.doneEvent,c6),a4=null),c6=d6;break;case i3.text:c6&&c6.children.push(r6({type:s6.text,value:n4.value,parent:t55.parentNodes?c6:null}));break;case i3.attributeName:l7=n4.value,c6.attributes[l7]="";break;case i3.attributeValue:c6.attributes[l7]=n4.value}};return h3.reset=function(){(e8=o6.create({debug:t55.debug})).on("data",d4),a4=r6(),c6=null,l7="",h3.parse=e8.write},h3.reset(),h3};e7.exports={parseSync:function(t55,e8){e8=Object.assign({},e8,{stream:!1,tagPrefix:":"});var n4=a3(e8),o7=void 0;return n4.on("done",function(t56){o7=t56}),n4.parse(t55),o7},create:a3,NodeType:s6}}}),y=r4({"node_modules/binary-search-bounds/search-bounds.js"(t54,e7){function n3(t55,e8,n4,o7,i6){for(var s7=i6+1;o7<=i6;){var r7=o7+i6>>>1,a4=t55[r7];(n4!==void 0?n4(a4,e8):a4-e8)>=0?(s7=r7,i6=r7-1):o7=r7+1}return s7}function o6(t55,e8,n4,o7,i6){for(var s7=i6+1;o7<=i6;){var r7=o7+i6>>>1,a4=t55[r7];(n4!==void 0?n4(a4,e8):a4-e8)>0?(s7=r7,i6=r7-1):o7=r7+1}return s7}function i3(t55,e8,n4,o7,i6){for(var s7=o7-1;o7<=i6;){var r7=o7+i6>>>1,a4=t55[r7];(n4!==void 0?n4(a4,e8):a4-e8)<0?(s7=r7,o7=r7+1):i6=r7-1}return s7}function s6(t55,e8,n4,o7,i6){for(var s7=o7-1;o7<=i6;){var r7=o7+i6>>>1,a4=t55[r7];(n4!==void 0?n4(a4,e8):a4-e8)<=0?(s7=r7,o7=r7+1):i6=r7-1}return s7}function r6(t55,e8,n4,o7,i6){for(;o7<=i6;){var s7=o7+i6>>>1,r7=t55[s7],a4=n4!==void 0?n4(r7,e8):r7-e8;if(a4===0)return s7;a4<=0?o7=s7+1:i6=s7-1}return-1}function a3(t55,e8,n4,o7,i6,s7){return typeof n4=="function"?s7(t55,e8,n4,o7===void 0?0:0|o7,i6===void 0?t55.length-1:0|i6):s7(t55,e8,void 0,n4===void 0?0:0|n4,o7===void 0?t55.length-1:0|o7)}e7.exports={ge:function(t55,e8,o7,i6,s7){return a3(t55,e8,o7,i6,s7,n3)},gt:function(t55,e8,n4,i6,s7){return a3(t55,e8,n4,i6,s7,o6)},lt:function(t55,e8,n4,o7,s7){return a3(t55,e8,n4,o7,s7,i3)},le:function(t55,e8,n4,o7,i6){return a3(t55,e8,n4,o7,i6,s6)},eq:function(t55,e8,n4,o7,i6){return a3(t55,e8,n4,o7,i6,r6)}}}}),_=r4({"node_modules/two-product/two-product.js"(t54,e7){e7.exports=function(t55,e8,o6){var i3=t55*e8,s6=n3*t55,r6=s6-(s6-t55),a3=t55-r6,c6=n3*e8,l7=c6-(c6-e8),h3=e8-l7,d4=a3*h3-(i3-r6*l7-a3*l7-r6*h3);return o6?(o6[0]=d4,o6[1]=i3,o6):[d4,i3]};var n3=+(Math.pow(2,27)+1)}}),b2=r4({"node_modules/robust-sum/robust-sum.js"(t54,e7){e7.exports=function(t55,e8){var n3=0|t55.length,o6=0|e8.length;if(n3===1&&o6===1)return(function(t56,e10){var n4=t56+e10,o7=n4-t56,i6=n4-o7,s7=e10-o7,r7=t56-i6,a4=r7+s7;return a4?[a4,n4]:[n4]})(t55[0],e8[0]);var i3,s6,r6=new Array(n3+o6),a3=0,c6=0,l7=0,h3=Math.abs,d4=t55[c6],u6=h3(d4),p5=e8[l7],m4=h3(p5);u6<m4?(s6=d4,(c6+=1)<n3&&(u6=h3(d4=t55[c6]))):(s6=p5,(l7+=1)<o6&&(m4=h3(p5=e8[l7]))),c6<n3&&u6<m4||l7>=o6?(i3=d4,(c6+=1)<n3&&(u6=h3(d4=t55[c6]))):(i3=p5,(l7+=1)<o6&&(m4=h3(p5=e8[l7])));for(var g4,f4,y3=i3+s6,_3=y3-i3,b4=s6-_3,x4=b4,v3=y3;c6<n3&&l7<o6;)u6<m4?(i3=d4,(c6+=1)<n3&&(u6=h3(d4=t55[c6]))):(i3=p5,(l7+=1)<o6&&(m4=h3(p5=e8[l7]))),(b4=(s6=x4)-(_3=(y3=i3+s6)-i3))&&(r6[a3++]=b4),x4=v3-((g4=v3+y3)-(f4=g4-v3))+(y3-f4),v3=g4;for(;c6<n3;)(b4=(s6=x4)-(_3=(y3=(i3=d4)+s6)-i3))&&(r6[a3++]=b4),x4=v3-((g4=v3+y3)-(f4=g4-v3))+(y3-f4),v3=g4,(c6+=1)<n3&&(d4=t55[c6]);for(;l7<o6;)(b4=(s6=x4)-(_3=(y3=(i3=p5)+s6)-i3))&&(r6[a3++]=b4),x4=v3-((g4=v3+y3)-(f4=g4-v3))+(y3-f4),v3=g4,(l7+=1)<o6&&(p5=e8[l7]);return x4&&(r6[a3++]=x4),v3&&(r6[a3++]=v3),a3||(r6[a3++]=0),r6.length=a3,r6}}}),x=r4({"node_modules/two-sum/two-sum.js"(t54,e7){e7.exports=function(t55,e8,n3){var o6=t55+e8,i3=o6-t55,s6=e8-i3,r6=t55-(o6-i3);return n3?(n3[0]=r6+s6,n3[1]=o6,n3):[r6+s6,o6]}}}),v2=r4({"node_modules/robust-scale/robust-scale.js"(t54,e7){var n3=_(),o6=x();e7.exports=function(t55,e8){var i3=t55.length;if(i3===1){var s6=n3(t55[0],e8);return s6[0]?s6:[s6[1]]}var r6=new Array(2*i3),a3=[.1,.1],c6=[.1,.1],l7=0;n3(t55[0],e8,a3),a3[0]&&(r6[l7++]=a3[0]);for(var h3=1;h3<i3;++h3){n3(t55[h3],e8,c6);var d4=a3[1];o6(d4,c6[0],a3),a3[0]&&(r6[l7++]=a3[0]);var u6=c6[1],p5=a3[1],m4=u6+p5,g4=p5-(m4-u6);a3[1]=m4,g4&&(r6[l7++]=g4)}return a3[1]&&(r6[l7++]=a3[1]),l7===0&&(r6[l7++]=0),r6.length=l7,r6}}}),S6=r4({"node_modules/robust-subtract/robust-diff.js"(t54,e7){e7.exports=function(t55,e8){var n3=0|t55.length,o6=0|e8.length;if(n3===1&&o6===1)return(function(t56,e10){var n4=t56+e10,o7=n4-t56,i6=n4-o7,s7=e10-o7,r7=t56-i6,a4=r7+s7;return a4?[a4,n4]:[n4]})(t55[0],-e8[0]);var i3,s6,r6=new Array(n3+o6),a3=0,c6=0,l7=0,h3=Math.abs,d4=t55[c6],u6=h3(d4),p5=-e8[l7],m4=h3(p5);u6<m4?(s6=d4,(c6+=1)<n3&&(u6=h3(d4=t55[c6]))):(s6=p5,(l7+=1)<o6&&(m4=h3(p5=-e8[l7]))),c6<n3&&u6<m4||l7>=o6?(i3=d4,(c6+=1)<n3&&(u6=h3(d4=t55[c6]))):(i3=p5,(l7+=1)<o6&&(m4=h3(p5=-e8[l7])));for(var g4,f4,y3=i3+s6,_3=y3-i3,b4=s6-_3,x4=b4,v3=y3;c6<n3&&l7<o6;)u6<m4?(i3=d4,(c6+=1)<n3&&(u6=h3(d4=t55[c6]))):(i3=p5,(l7+=1)<o6&&(m4=h3(p5=-e8[l7]))),(b4=(s6=x4)-(_3=(y3=i3+s6)-i3))&&(r6[a3++]=b4),x4=v3-((g4=v3+y3)-(f4=g4-v3))+(y3-f4),v3=g4;for(;c6<n3;)(b4=(s6=x4)-(_3=(y3=(i3=d4)+s6)-i3))&&(r6[a3++]=b4),x4=v3-((g4=v3+y3)-(f4=g4-v3))+(y3-f4),v3=g4,(c6+=1)<n3&&(d4=t55[c6]);for(;l7<o6;)(b4=(s6=x4)-(_3=(y3=(i3=p5)+s6)-i3))&&(r6[a3++]=b4),x4=v3-((g4=v3+y3)-(f4=g4-v3))+(y3-f4),v3=g4,(l7+=1)<o6&&(p5=-e8[l7]);return x4&&(r6[a3++]=x4),v3&&(r6[a3++]=v3),a3||(r6[a3++]=0),r6.length=a3,r6}}}),I3=r4({"node_modules/robust-orientation/orientation.js"(t54,e7){var n3=_(),o6=b2(),i3=v2(),s6=S6();function r6(t55,e8,n4,o7){return function(n5,i6,s7){var r7=t55(t55(e8(i6[1],s7[0]),e8(-s7[1],i6[0])),t55(e8(n5[1],i6[0]),e8(-i6[1],n5[0]))),a4=t55(e8(n5[1],s7[0]),e8(-s7[1],n5[0])),c7=o7(r7,a4);return c7[c7.length-1]}}function a3(t55,e8,n4,o7){return function(i6,s7,r7,a4){var c7=t55(t55(n4(t55(e8(r7[1],a4[0]),e8(-a4[1],r7[0])),s7[2]),t55(n4(t55(e8(s7[1],a4[0]),e8(-a4[1],s7[0])),-r7[2]),n4(t55(e8(s7[1],r7[0]),e8(-r7[1],s7[0])),a4[2]))),t55(n4(t55(e8(s7[1],a4[0]),e8(-a4[1],s7[0])),i6[2]),t55(n4(t55(e8(i6[1],a4[0]),e8(-a4[1],i6[0])),-s7[2]),n4(t55(e8(i6[1],s7[0]),e8(-s7[1],i6[0])),a4[2])))),l10=t55(t55(n4(t55(e8(r7[1],a4[0]),e8(-a4[1],r7[0])),i6[2]),t55(n4(t55(e8(i6[1],a4[0]),e8(-a4[1],i6[0])),-r7[2]),n4(t55(e8(i6[1],r7[0]),e8(-r7[1],i6[0])),a4[2]))),t55(n4(t55(e8(s7[1],r7[0]),e8(-r7[1],s7[0])),i6[2]),t55(n4(t55(e8(i6[1],r7[0]),e8(-r7[1],i6[0])),-s7[2]),n4(t55(e8(i6[1],s7[0]),e8(-s7[1],i6[0])),r7[2])))),h4=o7(c7,l10);return h4[h4.length-1]}}function c6(t55,e8,n4,o7){return function(i6,s7,r7,a4,c7){var l10=t55(t55(t55(n4(t55(n4(t55(e8(a4[1],c7[0]),e8(-c7[1],a4[0])),r7[2]),t55(n4(t55(e8(r7[1],c7[0]),e8(-c7[1],r7[0])),-a4[2]),n4(t55(e8(r7[1],a4[0]),e8(-a4[1],r7[0])),c7[2]))),s7[3]),t55(n4(t55(n4(t55(e8(a4[1],c7[0]),e8(-c7[1],a4[0])),s7[2]),t55(n4(t55(e8(s7[1],c7[0]),e8(-c7[1],s7[0])),-a4[2]),n4(t55(e8(s7[1],a4[0]),e8(-a4[1],s7[0])),c7[2]))),-r7[3]),n4(t55(n4(t55(e8(r7[1],c7[0]),e8(-c7[1],r7[0])),s7[2]),t55(n4(t55(e8(s7[1],c7[0]),e8(-c7[1],s7[0])),-r7[2]),n4(t55(e8(s7[1],r7[0]),e8(-r7[1],s7[0])),c7[2]))),a4[3]))),t55(n4(t55(n4(t55(e8(r7[1],a4[0]),e8(-a4[1],r7[0])),s7[2]),t55(n4(t55(e8(s7[1],a4[0]),e8(-a4[1],s7[0])),-r7[2]),n4(t55(e8(s7[1],r7[0]),e8(-r7[1],s7[0])),a4[2]))),-c7[3]),t55(n4(t55(n4(t55(e8(a4[1],c7[0]),e8(-c7[1],a4[0])),s7[2]),t55(n4(t55(e8(s7[1],c7[0]),e8(-c7[1],s7[0])),-a4[2]),n4(t55(e8(s7[1],a4[0]),e8(-a4[1],s7[0])),c7[2]))),i6[3]),n4(t55(n4(t55(e8(a4[1],c7[0]),e8(-c7[1],a4[0])),i6[2]),t55(n4(t55(e8(i6[1],c7[0]),e8(-c7[1],i6[0])),-a4[2]),n4(t55(e8(i6[1],a4[0]),e8(-a4[1],i6[0])),c7[2]))),-s7[3])))),t55(t55(n4(t55(n4(t55(e8(s7[1],c7[0]),e8(-c7[1],s7[0])),i6[2]),t55(n4(t55(e8(i6[1],c7[0]),e8(-c7[1],i6[0])),-s7[2]),n4(t55(e8(i6[1],s7[0]),e8(-s7[1],i6[0])),c7[2]))),a4[3]),t55(n4(t55(n4(t55(e8(s7[1],a4[0]),e8(-a4[1],s7[0])),i6[2]),t55(n4(t55(e8(i6[1],a4[0]),e8(-a4[1],i6[0])),-s7[2]),n4(t55(e8(i6[1],s7[0]),e8(-s7[1],i6[0])),a4[2]))),-c7[3]),n4(t55(n4(t55(e8(r7[1],a4[0]),e8(-a4[1],r7[0])),s7[2]),t55(n4(t55(e8(s7[1],a4[0]),e8(-a4[1],s7[0])),-r7[2]),n4(t55(e8(s7[1],r7[0]),e8(-r7[1],s7[0])),a4[2]))),i6[3]))),t55(n4(t55(n4(t55(e8(r7[1],a4[0]),e8(-a4[1],r7[0])),i6[2]),t55(n4(t55(e8(i6[1],a4[0]),e8(-a4[1],i6[0])),-r7[2]),n4(t55(e8(i6[1],r7[0]),e8(-r7[1],i6[0])),a4[2]))),-s7[3]),t55(n4(t55(n4(t55(e8(s7[1],a4[0]),e8(-a4[1],s7[0])),i6[2]),t55(n4(t55(e8(i6[1],a4[0]),e8(-a4[1],i6[0])),-s7[2]),n4(t55(e8(i6[1],s7[0]),e8(-s7[1],i6[0])),a4[2]))),r7[3]),n4(t55(n4(t55(e8(s7[1],r7[0]),e8(-r7[1],s7[0])),i6[2]),t55(n4(t55(e8(i6[1],r7[0]),e8(-r7[1],i6[0])),-s7[2]),n4(t55(e8(i6[1],s7[0]),e8(-s7[1],i6[0])),r7[2]))),-a4[3]))))),h4=t55(t55(t55(n4(t55(n4(t55(e8(a4[1],c7[0]),e8(-c7[1],a4[0])),r7[2]),t55(n4(t55(e8(r7[1],c7[0]),e8(-c7[1],r7[0])),-a4[2]),n4(t55(e8(r7[1],a4[0]),e8(-a4[1],r7[0])),c7[2]))),i6[3]),n4(t55(n4(t55(e8(a4[1],c7[0]),e8(-c7[1],a4[0])),i6[2]),t55(n4(t55(e8(i6[1],c7[0]),e8(-c7[1],i6[0])),-a4[2]),n4(t55(e8(i6[1],a4[0]),e8(-a4[1],i6[0])),c7[2]))),-r7[3])),t55(n4(t55(n4(t55(e8(r7[1],c7[0]),e8(-c7[1],r7[0])),i6[2]),t55(n4(t55(e8(i6[1],c7[0]),e8(-c7[1],i6[0])),-r7[2]),n4(t55(e8(i6[1],r7[0]),e8(-r7[1],i6[0])),c7[2]))),a4[3]),n4(t55(n4(t55(e8(r7[1],a4[0]),e8(-a4[1],r7[0])),i6[2]),t55(n4(t55(e8(i6[1],a4[0]),e8(-a4[1],i6[0])),-r7[2]),n4(t55(e8(i6[1],r7[0]),e8(-r7[1],i6[0])),a4[2]))),-c7[3]))),t55(t55(n4(t55(n4(t55(e8(r7[1],c7[0]),e8(-c7[1],r7[0])),s7[2]),t55(n4(t55(e8(s7[1],c7[0]),e8(-c7[1],s7[0])),-r7[2]),n4(t55(e8(s7[1],r7[0]),e8(-r7[1],s7[0])),c7[2]))),i6[3]),n4(t55(n4(t55(e8(r7[1],c7[0]),e8(-c7[1],r7[0])),i6[2]),t55(n4(t55(e8(i6[1],c7[0]),e8(-c7[1],i6[0])),-r7[2]),n4(t55(e8(i6[1],r7[0]),e8(-r7[1],i6[0])),c7[2]))),-s7[3])),t55(n4(t55(n4(t55(e8(s7[1],c7[0]),e8(-c7[1],s7[0])),i6[2]),t55(n4(t55(e8(i6[1],c7[0]),e8(-c7[1],i6[0])),-s7[2]),n4(t55(e8(i6[1],s7[0]),e8(-s7[1],i6[0])),c7[2]))),r7[3]),n4(t55(n4(t55(e8(s7[1],r7[0]),e8(-r7[1],s7[0])),i6[2]),t55(n4(t55(e8(i6[1],r7[0]),e8(-r7[1],i6[0])),-s7[2]),n4(t55(e8(i6[1],s7[0]),e8(-s7[1],i6[0])),r7[2]))),-c7[3])))),d6=o7(l10,h4);return d6[d6.length-1]}}function l7(t55){return(t55===3?r6:t55===4?a3:c6)(o6,n3,i3,s6)}var h3=l7(3),d4=l7(4),u6=[function(){return 0},function(){return 0},function(t55,e8){return e8[0]-t55[0]},function(t55,e8,n4){var o7,i6=(t55[1]-n4[1])*(e8[0]-n4[0]),s7=(t55[0]-n4[0])*(e8[1]-n4[1]),r7=i6-s7;if(i6>0){if(s7<=0)return r7;o7=i6+s7}else{if(!(i6<0)||s7>=0)return r7;o7=-(i6+s7)}var a4=33306690738754716e-32*o7;return r7>=a4||r7<=-a4?r7:h3(t55,e8,n4)},function(t55,e8,n4,o7){var i6=t55[0]-o7[0],s7=e8[0]-o7[0],r7=n4[0]-o7[0],a4=t55[1]-o7[1],c7=e8[1]-o7[1],l10=n4[1]-o7[1],h4=t55[2]-o7[2],u10=e8[2]-o7[2],p6=n4[2]-o7[2],m5=s7*l10,g4=r7*c7,f4=r7*a4,y3=i6*l10,_3=i6*c7,b4=s7*a4,x4=h4*(m5-g4)+u10*(f4-y3)+p6*(_3-b4),v3=7771561172376103e-31*((Math.abs(m5)+Math.abs(g4))*Math.abs(h4)+(Math.abs(f4)+Math.abs(y3))*Math.abs(u10)+(Math.abs(_3)+Math.abs(b4))*Math.abs(p6));return x4>v3||-x4>v3?x4:d4(t55,e8,n4,o7)}];function p5(t55){var e8=u6[t55.length];return e8||(e8=u6[t55.length]=l7(t55.length)),e8.apply(void 0,t55)}function m4(t55,e8,n4,o7,i6,s7,r7){return function(e10,n5,a4,c7,l10){switch(arguments.length){case 0:case 1:return 0;case 2:return o7(e10,n5);case 3:return i6(e10,n5,a4);case 4:return s7(e10,n5,a4,c7);case 5:return r7(e10,n5,a4,c7,l10)}for(var h4=new Array(arguments.length),d6=0;d6<arguments.length;++d6)h4[d6]=arguments[d6];return t55(h4)}}(function(){for(;u6.length<=5;)u6.push(l7(u6.length));e7.exports=m4.apply(void 0,[p5].concat(u6));for(var t55=0;t55<=5;++t55)e7.exports[t55]=u6[t55]})()}}),P2=r4({"node_modules/cdt2d/lib/monotone.js"(t54,e7){var n3=y(),o6=I3()[3];function i3(t55,e8,n4,o7,i6){this.a=t55,this.b=e8,this.idx=n4,this.lowerIds=o7,this.upperIds=i6}function s6(t55,e8,n4,o7){this.a=t55,this.b=e8,this.type=n4,this.idx=o7}function r6(t55,e8){var n4=t55.a[0]-e8.a[0]||t55.a[1]-e8.a[1]||t55.type-e8.type;return n4||(t55.type!==0&&(n4=o6(t55.a,t55.b,e8.b))?n4:t55.idx-e8.idx)}function a3(t55,e8){return o6(t55.a,t55.b,e8)}function c6(t55,e8,i6,s7,r7){for(var c7=n3.lt(e8,s7,a3),l10=n3.gt(e8,s7,a3),h4=c7;h4<l10;++h4){for(var d6=e8[h4],u6=d6.lowerIds,p5=u6.length;p5>1&&o6(i6[u6[p5-2]],i6[u6[p5-1]],s7)>0;)t55.push([u6[p5-1],u6[p5-2],r7]),p5-=1;u6.length=p5,u6.push(r7);var m4=d6.upperIds;for(p5=m4.length;p5>1&&o6(i6[m4[p5-2]],i6[m4[p5-1]],s7)<0;)t55.push([m4[p5-2],m4[p5-1],r7]),p5-=1;m4.length=p5,m4.push(r7)}}function l7(t55,e8){var n4;return(n4=t55.a[0]<e8.a[0]?o6(t55.a,t55.b,e8.a):o6(e8.b,e8.a,t55.a))?n4:(n4=e8.b[0]<t55.b[0]?o6(t55.a,t55.b,e8.b):o6(e8.b,e8.a,t55.b))||t55.idx-e8.idx}function h3(t55,e8,o7){var s7=n3.le(t55,o7,l7),r7=t55[s7],a4=r7.upperIds,c7=a4[a4.length-1];r7.upperIds=[c7],t55.splice(s7+1,0,new i3(o7.a,o7.b,o7.idx,[c7],a4))}function d4(t55,e8,o7){var i6=o7.a;o7.a=o7.b,o7.b=i6;var s7=n3.eq(t55,o7,l7),r7=t55[s7];t55[s7-1].upperIds=r7.upperIds,t55.splice(s7,1)}e7.exports=function(t55,e8){for(var n4=t55.length,o7=e8.length,a4=[],l10=0;l10<n4;++l10)a4.push(new s6(t55[l10],null,0,l10));for(l10=0;l10<o7;++l10){var u6=e8[l10],p5=t55[u6[0]],m4=t55[u6[1]];p5[0]<m4[0]?a4.push(new s6(p5,m4,2,l10),new s6(m4,p5,1,l10)):p5[0]>m4[0]&&a4.push(new s6(m4,p5,2,l10),new s6(p5,m4,1,l10))}a4.sort(r6);for(var g4=a4[0].a[0]-(1+Math.abs(a4[0].a[0]))*Math.pow(2,-52),f4=[new i3([g4,1],[g4,0],-1,[],[],[],[])],y3=[],_3=(l10=0,a4.length);l10<_3;++l10){var b4=a4[l10],x4=b4.type;x4===0?c6(y3,f4,t55,b4.a,b4.idx):x4===2?h3(f4,t55,b4):d4(f4,t55,b4)}return y3}}}),M3=r4({"node_modules/cdt2d/lib/triangulation.js"(t54,e7){var n3=y();function o6(t55,e8){this.stars=t55,this.edges=e8}e7.exports=function(t55,e8){for(var n4=new Array(t55),i6=0;i6<t55;++i6)n4[i6]=[];return new o6(n4,e8)};var i3=o6.prototype;function s6(t55,e8,n4){for(var o7=1,i6=t55.length;o7<i6;o7+=2)if(t55[o7-1]===e8&&t55[o7]===n4)return t55[o7-1]=t55[i6-2],t55[o7]=t55[i6-1],void(t55.length=i6-2)}i3.isConstraint=(function(){var t55=[0,0];function e8(t56,e10){return t56[0]-e10[0]||t56[1]-e10[1]}return function(o7,i6){return t55[0]=Math.min(o7,i6),t55[1]=Math.max(o7,i6),n3.eq(this.edges,t55,e8)>=0}})(),i3.removeTriangle=function(t55,e8,n4){var o7=this.stars;s6(o7[t55],e8,n4),s6(o7[e8],n4,t55),s6(o7[n4],t55,e8)},i3.addTriangle=function(t55,e8,n4){var o7=this.stars;o7[t55].push(e8,n4),o7[e8].push(n4,t55),o7[n4].push(t55,e8)},i3.opposite=function(t55,e8){for(var n4=this.stars[e8],o7=1,i6=n4.length;o7<i6;o7+=2)if(n4[o7]===t55)return n4[o7-1];return-1},i3.flip=function(t55,e8){var n4=this.opposite(t55,e8),o7=this.opposite(e8,t55);this.removeTriangle(t55,e8,n4),this.removeTriangle(e8,t55,o7),this.addTriangle(t55,o7,n4),this.addTriangle(e8,n4,o7)},i3.edges=function(){for(var t55=this.stars,e8=[],n4=0,o7=t55.length;n4<o7;++n4)for(var i6=t55[n4],s7=0,r6=i6.length;s7<r6;s7+=2)e8.push([i6[s7],i6[s7+1]]);return e8},i3.cells=function(){for(var t55=this.stars,e8=[],n4=0,o7=t55.length;n4<o7;++n4)for(var i6=t55[n4],s7=0,r6=i6.length;s7<r6;s7+=2){var a3=i6[s7],c6=i6[s7+1];n4<Math.min(a3,c6)&&e8.push([n4,a3,c6])}return e8}}}),C5=r4({"node_modules/robust-in-sphere/in-sphere.js"(t54,e7){var n3=_(),o6=b2(),i3=S6(),s6=v2();function r6(t55){return(t55===3?a3:t55===4?c6:t55===5?l7:h3)(o6,i3,n3,s6)}function a3(t55,e8,n4,o7){return function(i6,s7,r7){var a4=n4(i6[0],i6[0]),c7=o7(a4,s7[0]),l10=o7(a4,r7[0]),h4=n4(s7[0],s7[0]),d6=o7(h4,i6[0]),u10=o7(h4,r7[0]),p6=n4(r7[0],r7[0]),m4=o7(p6,i6[0]),g4=o7(p6,s7[0]),f4=t55(e8(g4,u10),e8(d6,c7)),y3=e8(m4,l10),_3=e8(f4,y3);return _3[_3.length-1]}}function c6(t55,e8,n4,o7){return function(i6,s7,r7,a4){var c7=t55(n4(i6[0],i6[0]),n4(i6[1],i6[1])),l10=o7(c7,s7[0]),h4=o7(c7,r7[0]),d6=o7(c7,a4[0]),u10=t55(n4(s7[0],s7[0]),n4(s7[1],s7[1])),p6=o7(u10,i6[0]),m4=o7(u10,r7[0]),g4=o7(u10,a4[0]),f4=t55(n4(r7[0],r7[0]),n4(r7[1],r7[1])),y3=o7(f4,i6[0]),_3=o7(f4,s7[0]),b4=o7(f4,a4[0]),x4=t55(n4(a4[0],a4[0]),n4(a4[1],a4[1])),v3=o7(x4,i6[0]),S7=o7(x4,s7[0]),I4=o7(x4,r7[0]),P6=t55(t55(o7(e8(I4,b4),s7[1]),t55(o7(e8(S7,g4),-r7[1]),o7(e8(_3,m4),a4[1]))),t55(o7(e8(S7,g4),i6[1]),t55(o7(e8(v3,d6),-s7[1]),o7(e8(p6,l10),a4[1])))),M5=t55(t55(o7(e8(I4,b4),i6[1]),t55(o7(e8(v3,d6),-r7[1]),o7(e8(y3,h4),a4[1]))),t55(o7(e8(_3,m4),i6[1]),t55(o7(e8(y3,h4),-s7[1]),o7(e8(p6,l10),r7[1])))),C6=e8(P6,M5);return C6[C6.length-1]}}function l7(t55,e8,n4,o7){return function(i6,s7,r7,a4,c7){var l10=t55(n4(i6[0],i6[0]),t55(n4(i6[1],i6[1]),n4(i6[2],i6[2]))),h4=o7(l10,s7[0]),d6=o7(l10,r7[0]),u10=o7(l10,a4[0]),p6=o7(l10,c7[0]),m4=t55(n4(s7[0],s7[0]),t55(n4(s7[1],s7[1]),n4(s7[2],s7[2]))),g4=o7(m4,i6[0]),f4=o7(m4,r7[0]),y3=o7(m4,a4[0]),_3=o7(m4,c7[0]),b4=t55(n4(r7[0],r7[0]),t55(n4(r7[1],r7[1]),n4(r7[2],r7[2]))),x4=o7(b4,i6[0]),v3=o7(b4,s7[0]),S7=o7(b4,a4[0]),I4=o7(b4,c7[0]),P6=t55(n4(a4[0],a4[0]),t55(n4(a4[1],a4[1]),n4(a4[2],a4[2]))),M5=o7(P6,i6[0]),C6=o7(P6,s7[0]),N3=o7(P6,r7[0]),T6=o7(P6,c7[0]),w4=t55(n4(c7[0],c7[0]),t55(n4(c7[1],c7[1]),n4(c7[2],c7[2]))),R6=o7(w4,i6[0]),E4=o7(w4,s7[0]),A7=o7(w4,r7[0]),O3=o7(w4,a4[0]),L5=t55(t55(t55(o7(t55(o7(e8(O3,T6),r7[1]),t55(o7(e8(A7,I4),-a4[1]),o7(e8(N3,S7),c7[1]))),s7[2]),t55(o7(t55(o7(e8(O3,T6),s7[1]),t55(o7(e8(E4,_3),-a4[1]),o7(e8(C6,y3),c7[1]))),-r7[2]),o7(t55(o7(e8(A7,I4),s7[1]),t55(o7(e8(E4,_3),-r7[1]),o7(e8(v3,f4),c7[1]))),a4[2]))),t55(o7(t55(o7(e8(N3,S7),s7[1]),t55(o7(e8(C6,y3),-r7[1]),o7(e8(v3,f4),a4[1]))),-c7[2]),t55(o7(t55(o7(e8(O3,T6),s7[1]),t55(o7(e8(E4,_3),-a4[1]),o7(e8(C6,y3),c7[1]))),i6[2]),o7(t55(o7(e8(O3,T6),i6[1]),t55(o7(e8(R6,p6),-a4[1]),o7(e8(M5,u10),c7[1]))),-s7[2])))),t55(t55(o7(t55(o7(e8(E4,_3),i6[1]),t55(o7(e8(R6,p6),-s7[1]),o7(e8(g4,h4),c7[1]))),a4[2]),t55(o7(t55(o7(e8(C6,y3),i6[1]),t55(o7(e8(M5,u10),-s7[1]),o7(e8(g4,h4),a4[1]))),-c7[2]),o7(t55(o7(e8(N3,S7),s7[1]),t55(o7(e8(C6,y3),-r7[1]),o7(e8(v3,f4),a4[1]))),i6[2]))),t55(o7(t55(o7(e8(N3,S7),i6[1]),t55(o7(e8(M5,u10),-r7[1]),o7(e8(x4,d6),a4[1]))),-s7[2]),t55(o7(t55(o7(e8(C6,y3),i6[1]),t55(o7(e8(M5,u10),-s7[1]),o7(e8(g4,h4),a4[1]))),r7[2]),o7(t55(o7(e8(v3,f4),i6[1]),t55(o7(e8(x4,d6),-s7[1]),o7(e8(g4,h4),r7[1]))),-a4[2]))))),D4=t55(t55(t55(o7(t55(o7(e8(O3,T6),r7[1]),t55(o7(e8(A7,I4),-a4[1]),o7(e8(N3,S7),c7[1]))),i6[2]),o7(t55(o7(e8(O3,T6),i6[1]),t55(o7(e8(R6,p6),-a4[1]),o7(e8(M5,u10),c7[1]))),-r7[2])),t55(o7(t55(o7(e8(A7,I4),i6[1]),t55(o7(e8(R6,p6),-r7[1]),o7(e8(x4,d6),c7[1]))),a4[2]),o7(t55(o7(e8(N3,S7),i6[1]),t55(o7(e8(M5,u10),-r7[1]),o7(e8(x4,d6),a4[1]))),-c7[2]))),t55(t55(o7(t55(o7(e8(A7,I4),s7[1]),t55(o7(e8(E4,_3),-r7[1]),o7(e8(v3,f4),c7[1]))),i6[2]),o7(t55(o7(e8(A7,I4),i6[1]),t55(o7(e8(R6,p6),-r7[1]),o7(e8(x4,d6),c7[1]))),-s7[2])),t55(o7(t55(o7(e8(E4,_3),i6[1]),t55(o7(e8(R6,p6),-s7[1]),o7(e8(g4,h4),c7[1]))),r7[2]),o7(t55(o7(e8(v3,f4),i6[1]),t55(o7(e8(x4,d6),-s7[1]),o7(e8(g4,h4),r7[1]))),-c7[2])))),z5=e8(L5,D4);return z5[z5.length-1]}}function h3(t55,e8,n4,o7){return function(i6,s7,r7,a4,c7,l10){var h4=t55(t55(n4(i6[0],i6[0]),n4(i6[1],i6[1])),t55(n4(i6[2],i6[2]),n4(i6[3],i6[3]))),d6=o7(h4,s7[0]),u10=o7(h4,r7[0]),p6=o7(h4,a4[0]),m4=o7(h4,c7[0]),g4=o7(h4,l10[0]),f4=t55(t55(n4(s7[0],s7[0]),n4(s7[1],s7[1])),t55(n4(s7[2],s7[2]),n4(s7[3],s7[3]))),y3=o7(f4,i6[0]),_3=o7(f4,r7[0]),b4=o7(f4,a4[0]),x4=o7(f4,c7[0]),v3=o7(f4,l10[0]),S7=t55(t55(n4(r7[0],r7[0]),n4(r7[1],r7[1])),t55(n4(r7[2],r7[2]),n4(r7[3],r7[3]))),I4=o7(S7,i6[0]),P6=o7(S7,s7[0]),M5=o7(S7,a4[0]),C6=o7(S7,c7[0]),N3=o7(S7,l10[0]),T6=t55(t55(n4(a4[0],a4[0]),n4(a4[1],a4[1])),t55(n4(a4[2],a4[2]),n4(a4[3],a4[3]))),w4=o7(T6,i6[0]),R6=o7(T6,s7[0]),E4=o7(T6,r7[0]),A7=o7(T6,c7[0]),O3=o7(T6,l10[0]),L5=t55(t55(n4(c7[0],c7[0]),n4(c7[1],c7[1])),t55(n4(c7[2],c7[2]),n4(c7[3],c7[3]))),D4=o7(L5,i6[0]),z5=o7(L5,s7[0]),k5=o7(L5,r7[0]),F7=o7(L5,a4[0]),j5=o7(L5,l10[0]),Y4=t55(t55(n4(l10[0],l10[0]),n4(l10[1],l10[1])),t55(n4(l10[2],l10[2]),n4(l10[3],l10[3]))),X5=o7(Y4,i6[0]),$3=o7(Y4,s7[0]),B5=o7(Y4,r7[0]),H3=o7(Y4,a4[0]),W6=o7(Y4,c7[0]),V4=t55(t55(t55(o7(t55(t55(o7(t55(o7(e8(W6,j5),a4[1]),t55(o7(e8(H3,O3),-c7[1]),o7(e8(F7,A7),l10[1]))),r7[2]),o7(t55(o7(e8(W6,j5),r7[1]),t55(o7(e8(B5,N3),-c7[1]),o7(e8(k5,C6),l10[1]))),-a4[2])),t55(o7(t55(o7(e8(H3,O3),r7[1]),t55(o7(e8(B5,N3),-a4[1]),o7(e8(E4,M5),l10[1]))),c7[2]),o7(t55(o7(e8(F7,A7),r7[1]),t55(o7(e8(k5,C6),-a4[1]),o7(e8(E4,M5),c7[1]))),-l10[2]))),s7[3]),t55(o7(t55(t55(o7(t55(o7(e8(W6,j5),a4[1]),t55(o7(e8(H3,O3),-c7[1]),o7(e8(F7,A7),l10[1]))),s7[2]),o7(t55(o7(e8(W6,j5),s7[1]),t55(o7(e8($3,v3),-c7[1]),o7(e8(z5,x4),l10[1]))),-a4[2])),t55(o7(t55(o7(e8(H3,O3),s7[1]),t55(o7(e8($3,v3),-a4[1]),o7(e8(R6,b4),l10[1]))),c7[2]),o7(t55(o7(e8(F7,A7),s7[1]),t55(o7(e8(z5,x4),-a4[1]),o7(e8(R6,b4),c7[1]))),-l10[2]))),-r7[3]),o7(t55(t55(o7(t55(o7(e8(W6,j5),r7[1]),t55(o7(e8(B5,N3),-c7[1]),o7(e8(k5,C6),l10[1]))),s7[2]),o7(t55(o7(e8(W6,j5),s7[1]),t55(o7(e8($3,v3),-c7[1]),o7(e8(z5,x4),l10[1]))),-r7[2])),t55(o7(t55(o7(e8(B5,N3),s7[1]),t55(o7(e8($3,v3),-r7[1]),o7(e8(P6,_3),l10[1]))),c7[2]),o7(t55(o7(e8(k5,C6),s7[1]),t55(o7(e8(z5,x4),-r7[1]),o7(e8(P6,_3),c7[1]))),-l10[2]))),a4[3]))),t55(t55(o7(t55(t55(o7(t55(o7(e8(H3,O3),r7[1]),t55(o7(e8(B5,N3),-a4[1]),o7(e8(E4,M5),l10[1]))),s7[2]),o7(t55(o7(e8(H3,O3),s7[1]),t55(o7(e8($3,v3),-a4[1]),o7(e8(R6,b4),l10[1]))),-r7[2])),t55(o7(t55(o7(e8(B5,N3),s7[1]),t55(o7(e8($3,v3),-r7[1]),o7(e8(P6,_3),l10[1]))),a4[2]),o7(t55(o7(e8(E4,M5),s7[1]),t55(o7(e8(R6,b4),-r7[1]),o7(e8(P6,_3),a4[1]))),-l10[2]))),-c7[3]),o7(t55(t55(o7(t55(o7(e8(F7,A7),r7[1]),t55(o7(e8(k5,C6),-a4[1]),o7(e8(E4,M5),c7[1]))),s7[2]),o7(t55(o7(e8(F7,A7),s7[1]),t55(o7(e8(z5,x4),-a4[1]),o7(e8(R6,b4),c7[1]))),-r7[2])),t55(o7(t55(o7(e8(k5,C6),s7[1]),t55(o7(e8(z5,x4),-r7[1]),o7(e8(P6,_3),c7[1]))),a4[2]),o7(t55(o7(e8(E4,M5),s7[1]),t55(o7(e8(R6,b4),-r7[1]),o7(e8(P6,_3),a4[1]))),-c7[2]))),l10[3])),t55(o7(t55(t55(o7(t55(o7(e8(W6,j5),a4[1]),t55(o7(e8(H3,O3),-c7[1]),o7(e8(F7,A7),l10[1]))),s7[2]),o7(t55(o7(e8(W6,j5),s7[1]),t55(o7(e8($3,v3),-c7[1]),o7(e8(z5,x4),l10[1]))),-a4[2])),t55(o7(t55(o7(e8(H3,O3),s7[1]),t55(o7(e8($3,v3),-a4[1]),o7(e8(R6,b4),l10[1]))),c7[2]),o7(t55(o7(e8(F7,A7),s7[1]),t55(o7(e8(z5,x4),-a4[1]),o7(e8(R6,b4),c7[1]))),-l10[2]))),i6[3]),o7(t55(t55(o7(t55(o7(e8(W6,j5),a4[1]),t55(o7(e8(H3,O3),-c7[1]),o7(e8(F7,A7),l10[1]))),i6[2]),o7(t55(o7(e8(W6,j5),i6[1]),t55(o7(e8(X5,g4),-c7[1]),o7(e8(D4,m4),l10[1]))),-a4[2])),t55(o7(t55(o7(e8(H3,O3),i6[1]),t55(o7(e8(X5,g4),-a4[1]),o7(e8(w4,p6),l10[1]))),c7[2]),o7(t55(o7(e8(F7,A7),i6[1]),t55(o7(e8(D4,m4),-a4[1]),o7(e8(w4,p6),c7[1]))),-l10[2]))),-s7[3])))),t55(t55(t55(o7(t55(t55(o7(t55(o7(e8(W6,j5),s7[1]),t55(o7(e8($3,v3),-c7[1]),o7(e8(z5,x4),l10[1]))),i6[2]),o7(t55(o7(e8(W6,j5),i6[1]),t55(o7(e8(X5,g4),-c7[1]),o7(e8(D4,m4),l10[1]))),-s7[2])),t55(o7(t55(o7(e8($3,v3),i6[1]),t55(o7(e8(X5,g4),-s7[1]),o7(e8(y3,d6),l10[1]))),c7[2]),o7(t55(o7(e8(z5,x4),i6[1]),t55(o7(e8(D4,m4),-s7[1]),o7(e8(y3,d6),c7[1]))),-l10[2]))),a4[3]),o7(t55(t55(o7(t55(o7(e8(H3,O3),s7[1]),t55(o7(e8($3,v3),-a4[1]),o7(e8(R6,b4),l10[1]))),i6[2]),o7(t55(o7(e8(H3,O3),i6[1]),t55(o7(e8(X5,g4),-a4[1]),o7(e8(w4,p6),l10[1]))),-s7[2])),t55(o7(t55(o7(e8($3,v3),i6[1]),t55(o7(e8(X5,g4),-s7[1]),o7(e8(y3,d6),l10[1]))),a4[2]),o7(t55(o7(e8(R6,b4),i6[1]),t55(o7(e8(w4,p6),-s7[1]),o7(e8(y3,d6),a4[1]))),-l10[2]))),-c7[3])),t55(o7(t55(t55(o7(t55(o7(e8(F7,A7),s7[1]),t55(o7(e8(z5,x4),-a4[1]),o7(e8(R6,b4),c7[1]))),i6[2]),o7(t55(o7(e8(F7,A7),i6[1]),t55(o7(e8(D4,m4),-a4[1]),o7(e8(w4,p6),c7[1]))),-s7[2])),t55(o7(t55(o7(e8(z5,x4),i6[1]),t55(o7(e8(D4,m4),-s7[1]),o7(e8(y3,d6),c7[1]))),a4[2]),o7(t55(o7(e8(R6,b4),i6[1]),t55(o7(e8(w4,p6),-s7[1]),o7(e8(y3,d6),a4[1]))),-c7[2]))),l10[3]),o7(t55(t55(o7(t55(o7(e8(H3,O3),r7[1]),t55(o7(e8(B5,N3),-a4[1]),o7(e8(E4,M5),l10[1]))),s7[2]),o7(t55(o7(e8(H3,O3),s7[1]),t55(o7(e8($3,v3),-a4[1]),o7(e8(R6,b4),l10[1]))),-r7[2])),t55(o7(t55(o7(e8(B5,N3),s7[1]),t55(o7(e8($3,v3),-r7[1]),o7(e8(P6,_3),l10[1]))),a4[2]),o7(t55(o7(e8(E4,M5),s7[1]),t55(o7(e8(R6,b4),-r7[1]),o7(e8(P6,_3),a4[1]))),-l10[2]))),i6[3]))),t55(t55(o7(t55(t55(o7(t55(o7(e8(H3,O3),r7[1]),t55(o7(e8(B5,N3),-a4[1]),o7(e8(E4,M5),l10[1]))),i6[2]),o7(t55(o7(e8(H3,O3),i6[1]),t55(o7(e8(X5,g4),-a4[1]),o7(e8(w4,p6),l10[1]))),-r7[2])),t55(o7(t55(o7(e8(B5,N3),i6[1]),t55(o7(e8(X5,g4),-r7[1]),o7(e8(I4,u10),l10[1]))),a4[2]),o7(t55(o7(e8(E4,M5),i6[1]),t55(o7(e8(w4,p6),-r7[1]),o7(e8(I4,u10),a4[1]))),-l10[2]))),-s7[3]),o7(t55(t55(o7(t55(o7(e8(H3,O3),s7[1]),t55(o7(e8($3,v3),-a4[1]),o7(e8(R6,b4),l10[1]))),i6[2]),o7(t55(o7(e8(H3,O3),i6[1]),t55(o7(e8(X5,g4),-a4[1]),o7(e8(w4,p6),l10[1]))),-s7[2])),t55(o7(t55(o7(e8($3,v3),i6[1]),t55(o7(e8(X5,g4),-s7[1]),o7(e8(y3,d6),l10[1]))),a4[2]),o7(t55(o7(e8(R6,b4),i6[1]),t55(o7(e8(w4,p6),-s7[1]),o7(e8(y3,d6),a4[1]))),-l10[2]))),r7[3])),t55(o7(t55(t55(o7(t55(o7(e8(B5,N3),s7[1]),t55(o7(e8($3,v3),-r7[1]),o7(e8(P6,_3),l10[1]))),i6[2]),o7(t55(o7(e8(B5,N3),i6[1]),t55(o7(e8(X5,g4),-r7[1]),o7(e8(I4,u10),l10[1]))),-s7[2])),t55(o7(t55(o7(e8($3,v3),i6[1]),t55(o7(e8(X5,g4),-s7[1]),o7(e8(y3,d6),l10[1]))),r7[2]),o7(t55(o7(e8(P6,_3),i6[1]),t55(o7(e8(I4,u10),-s7[1]),o7(e8(y3,d6),r7[1]))),-l10[2]))),-a4[3]),o7(t55(t55(o7(t55(o7(e8(E4,M5),s7[1]),t55(o7(e8(R6,b4),-r7[1]),o7(e8(P6,_3),a4[1]))),i6[2]),o7(t55(o7(e8(E4,M5),i6[1]),t55(o7(e8(w4,p6),-r7[1]),o7(e8(I4,u10),a4[1]))),-s7[2])),t55(o7(t55(o7(e8(R6,b4),i6[1]),t55(o7(e8(w4,p6),-s7[1]),o7(e8(y3,d6),a4[1]))),r7[2]),o7(t55(o7(e8(P6,_3),i6[1]),t55(o7(e8(I4,u10),-s7[1]),o7(e8(y3,d6),r7[1]))),-a4[2]))),l10[3]))))),U5=t55(t55(t55(o7(t55(t55(o7(t55(o7(e8(W6,j5),a4[1]),t55(o7(e8(H3,O3),-c7[1]),o7(e8(F7,A7),l10[1]))),r7[2]),o7(t55(o7(e8(W6,j5),r7[1]),t55(o7(e8(B5,N3),-c7[1]),o7(e8(k5,C6),l10[1]))),-a4[2])),t55(o7(t55(o7(e8(H3,O3),r7[1]),t55(o7(e8(B5,N3),-a4[1]),o7(e8(E4,M5),l10[1]))),c7[2]),o7(t55(o7(e8(F7,A7),r7[1]),t55(o7(e8(k5,C6),-a4[1]),o7(e8(E4,M5),c7[1]))),-l10[2]))),i6[3]),t55(o7(t55(t55(o7(t55(o7(e8(W6,j5),a4[1]),t55(o7(e8(H3,O3),-c7[1]),o7(e8(F7,A7),l10[1]))),i6[2]),o7(t55(o7(e8(W6,j5),i6[1]),t55(o7(e8(X5,g4),-c7[1]),o7(e8(D4,m4),l10[1]))),-a4[2])),t55(o7(t55(o7(e8(H3,O3),i6[1]),t55(o7(e8(X5,g4),-a4[1]),o7(e8(w4,p6),l10[1]))),c7[2]),o7(t55(o7(e8(F7,A7),i6[1]),t55(o7(e8(D4,m4),-a4[1]),o7(e8(w4,p6),c7[1]))),-l10[2]))),-r7[3]),o7(t55(t55(o7(t55(o7(e8(W6,j5),r7[1]),t55(o7(e8(B5,N3),-c7[1]),o7(e8(k5,C6),l10[1]))),i6[2]),o7(t55(o7(e8(W6,j5),i6[1]),t55(o7(e8(X5,g4),-c7[1]),o7(e8(D4,m4),l10[1]))),-r7[2])),t55(o7(t55(o7(e8(B5,N3),i6[1]),t55(o7(e8(X5,g4),-r7[1]),o7(e8(I4,u10),l10[1]))),c7[2]),o7(t55(o7(e8(k5,C6),i6[1]),t55(o7(e8(D4,m4),-r7[1]),o7(e8(I4,u10),c7[1]))),-l10[2]))),a4[3]))),t55(t55(o7(t55(t55(o7(t55(o7(e8(H3,O3),r7[1]),t55(o7(e8(B5,N3),-a4[1]),o7(e8(E4,M5),l10[1]))),i6[2]),o7(t55(o7(e8(H3,O3),i6[1]),t55(o7(e8(X5,g4),-a4[1]),o7(e8(w4,p6),l10[1]))),-r7[2])),t55(o7(t55(o7(e8(B5,N3),i6[1]),t55(o7(e8(X5,g4),-r7[1]),o7(e8(I4,u10),l10[1]))),a4[2]),o7(t55(o7(e8(E4,M5),i6[1]),t55(o7(e8(w4,p6),-r7[1]),o7(e8(I4,u10),a4[1]))),-l10[2]))),-c7[3]),o7(t55(t55(o7(t55(o7(e8(F7,A7),r7[1]),t55(o7(e8(k5,C6),-a4[1]),o7(e8(E4,M5),c7[1]))),i6[2]),o7(t55(o7(e8(F7,A7),i6[1]),t55(o7(e8(D4,m4),-a4[1]),o7(e8(w4,p6),c7[1]))),-r7[2])),t55(o7(t55(o7(e8(k5,C6),i6[1]),t55(o7(e8(D4,m4),-r7[1]),o7(e8(I4,u10),c7[1]))),a4[2]),o7(t55(o7(e8(E4,M5),i6[1]),t55(o7(e8(w4,p6),-r7[1]),o7(e8(I4,u10),a4[1]))),-c7[2]))),l10[3])),t55(o7(t55(t55(o7(t55(o7(e8(W6,j5),r7[1]),t55(o7(e8(B5,N3),-c7[1]),o7(e8(k5,C6),l10[1]))),s7[2]),o7(t55(o7(e8(W6,j5),s7[1]),t55(o7(e8($3,v3),-c7[1]),o7(e8(z5,x4),l10[1]))),-r7[2])),t55(o7(t55(o7(e8(B5,N3),s7[1]),t55(o7(e8($3,v3),-r7[1]),o7(e8(P6,_3),l10[1]))),c7[2]),o7(t55(o7(e8(k5,C6),s7[1]),t55(o7(e8(z5,x4),-r7[1]),o7(e8(P6,_3),c7[1]))),-l10[2]))),i6[3]),o7(t55(t55(o7(t55(o7(e8(W6,j5),r7[1]),t55(o7(e8(B5,N3),-c7[1]),o7(e8(k5,C6),l10[1]))),i6[2]),o7(t55(o7(e8(W6,j5),i6[1]),t55(o7(e8(X5,g4),-c7[1]),o7(e8(D4,m4),l10[1]))),-r7[2])),t55(o7(t55(o7(e8(B5,N3),i6[1]),t55(o7(e8(X5,g4),-r7[1]),o7(e8(I4,u10),l10[1]))),c7[2]),o7(t55(o7(e8(k5,C6),i6[1]),t55(o7(e8(D4,m4),-r7[1]),o7(e8(I4,u10),c7[1]))),-l10[2]))),-s7[3])))),t55(t55(t55(o7(t55(t55(o7(t55(o7(e8(W6,j5),s7[1]),t55(o7(e8($3,v3),-c7[1]),o7(e8(z5,x4),l10[1]))),i6[2]),o7(t55(o7(e8(W6,j5),i6[1]),t55(o7(e8(X5,g4),-c7[1]),o7(e8(D4,m4),l10[1]))),-s7[2])),t55(o7(t55(o7(e8($3,v3),i6[1]),t55(o7(e8(X5,g4),-s7[1]),o7(e8(y3,d6),l10[1]))),c7[2]),o7(t55(o7(e8(z5,x4),i6[1]),t55(o7(e8(D4,m4),-s7[1]),o7(e8(y3,d6),c7[1]))),-l10[2]))),r7[3]),o7(t55(t55(o7(t55(o7(e8(B5,N3),s7[1]),t55(o7(e8($3,v3),-r7[1]),o7(e8(P6,_3),l10[1]))),i6[2]),o7(t55(o7(e8(B5,N3),i6[1]),t55(o7(e8(X5,g4),-r7[1]),o7(e8(I4,u10),l10[1]))),-s7[2])),t55(o7(t55(o7(e8($3,v3),i6[1]),t55(o7(e8(X5,g4),-s7[1]),o7(e8(y3,d6),l10[1]))),r7[2]),o7(t55(o7(e8(P6,_3),i6[1]),t55(o7(e8(I4,u10),-s7[1]),o7(e8(y3,d6),r7[1]))),-l10[2]))),-c7[3])),t55(o7(t55(t55(o7(t55(o7(e8(k5,C6),s7[1]),t55(o7(e8(z5,x4),-r7[1]),o7(e8(P6,_3),c7[1]))),i6[2]),o7(t55(o7(e8(k5,C6),i6[1]),t55(o7(e8(D4,m4),-r7[1]),o7(e8(I4,u10),c7[1]))),-s7[2])),t55(o7(t55(o7(e8(z5,x4),i6[1]),t55(o7(e8(D4,m4),-s7[1]),o7(e8(y3,d6),c7[1]))),r7[2]),o7(t55(o7(e8(P6,_3),i6[1]),t55(o7(e8(I4,u10),-s7[1]),o7(e8(y3,d6),r7[1]))),-c7[2]))),l10[3]),o7(t55(t55(o7(t55(o7(e8(F7,A7),r7[1]),t55(o7(e8(k5,C6),-a4[1]),o7(e8(E4,M5),c7[1]))),s7[2]),o7(t55(o7(e8(F7,A7),s7[1]),t55(o7(e8(z5,x4),-a4[1]),o7(e8(R6,b4),c7[1]))),-r7[2])),t55(o7(t55(o7(e8(k5,C6),s7[1]),t55(o7(e8(z5,x4),-r7[1]),o7(e8(P6,_3),c7[1]))),a4[2]),o7(t55(o7(e8(E4,M5),s7[1]),t55(o7(e8(R6,b4),-r7[1]),o7(e8(P6,_3),a4[1]))),-c7[2]))),i6[3]))),t55(t55(o7(t55(t55(o7(t55(o7(e8(F7,A7),r7[1]),t55(o7(e8(k5,C6),-a4[1]),o7(e8(E4,M5),c7[1]))),i6[2]),o7(t55(o7(e8(F7,A7),i6[1]),t55(o7(e8(D4,m4),-a4[1]),o7(e8(w4,p6),c7[1]))),-r7[2])),t55(o7(t55(o7(e8(k5,C6),i6[1]),t55(o7(e8(D4,m4),-r7[1]),o7(e8(I4,u10),c7[1]))),a4[2]),o7(t55(o7(e8(E4,M5),i6[1]),t55(o7(e8(w4,p6),-r7[1]),o7(e8(I4,u10),a4[1]))),-c7[2]))),-s7[3]),o7(t55(t55(o7(t55(o7(e8(F7,A7),s7[1]),t55(o7(e8(z5,x4),-a4[1]),o7(e8(R6,b4),c7[1]))),i6[2]),o7(t55(o7(e8(F7,A7),i6[1]),t55(o7(e8(D4,m4),-a4[1]),o7(e8(w4,p6),c7[1]))),-s7[2])),t55(o7(t55(o7(e8(z5,x4),i6[1]),t55(o7(e8(D4,m4),-s7[1]),o7(e8(y3,d6),c7[1]))),a4[2]),o7(t55(o7(e8(R6,b4),i6[1]),t55(o7(e8(w4,p6),-s7[1]),o7(e8(y3,d6),a4[1]))),-c7[2]))),r7[3])),t55(o7(t55(t55(o7(t55(o7(e8(k5,C6),s7[1]),t55(o7(e8(z5,x4),-r7[1]),o7(e8(P6,_3),c7[1]))),i6[2]),o7(t55(o7(e8(k5,C6),i6[1]),t55(o7(e8(D4,m4),-r7[1]),o7(e8(I4,u10),c7[1]))),-s7[2])),t55(o7(t55(o7(e8(z5,x4),i6[1]),t55(o7(e8(D4,m4),-s7[1]),o7(e8(y3,d6),c7[1]))),r7[2]),o7(t55(o7(e8(P6,_3),i6[1]),t55(o7(e8(I4,u10),-s7[1]),o7(e8(y3,d6),r7[1]))),-c7[2]))),-a4[3]),o7(t55(t55(o7(t55(o7(e8(E4,M5),s7[1]),t55(o7(e8(R6,b4),-r7[1]),o7(e8(P6,_3),a4[1]))),i6[2]),o7(t55(o7(e8(E4,M5),i6[1]),t55(o7(e8(w4,p6),-r7[1]),o7(e8(I4,u10),a4[1]))),-s7[2])),t55(o7(t55(o7(e8(R6,b4),i6[1]),t55(o7(e8(w4,p6),-s7[1]),o7(e8(y3,d6),a4[1]))),r7[2]),o7(t55(o7(e8(P6,_3),i6[1]),t55(o7(e8(I4,u10),-s7[1]),o7(e8(y3,d6),r7[1]))),-a4[2]))),c7[3]))))),G3=e8(V4,U5);return G3[G3.length-1]}}var d4=[function(){return 0},function(){return 0},function(){return 0}];function u6(t55){var e8=d4[t55.length];return e8||(e8=d4[t55.length]=r6(t55.length)),e8.apply(void 0,t55)}function p5(t55,e8,n4,o7,i6,s7,r7,a4){return function(e10,n5,c7,l10,h4,d6){switch(arguments.length){case 0:case 1:return 0;case 2:return o7(e10,n5);case 3:return i6(e10,n5,c7);case 4:return s7(e10,n5,c7,l10);case 5:return r7(e10,n5,c7,l10,h4);case 6:return a4(e10,n5,c7,l10,h4,d6)}for(var u10=new Array(arguments.length),p6=0;p6<arguments.length;++p6)u10[p6]=arguments[p6];return t55(u10)}}(function(){for(;d4.length<=6;)d4.push(r6(d4.length));e7.exports=p5.apply(void 0,[u6].concat(d4));for(var t55=0;t55<=6;++t55)e7.exports[t55]=d4[t55]})()}}),N2=r4({"node_modules/cdt2d/lib/delaunay.js"(t54,e7){var n3=C5()[4];y();function o6(t55,e8,o7,i3,s6,r6){var a3=e8.opposite(i3,s6);if(!(a3<0)){if(s6<i3){var c6=i3;i3=s6,s6=c6,c6=r6,r6=a3,a3=c6}e8.isConstraint(i3,s6)||n3(t55[i3],t55[s6],t55[r6],t55[a3])<0&&o7.push(i3,s6)}}e7.exports=function(t55,e8){for(var i3=[],s6=t55.length,r6=e8.stars,a3=0;a3<s6;++a3)for(var c6=r6[a3],l7=1;l7<c6.length;l7+=2)if(!((p5=c6[l7])<a3)&&!e8.isConstraint(a3,p5)){for(var h3=c6[l7-1],d4=-1,u6=1;u6<c6.length;u6+=2)if(c6[u6-1]===p5){d4=c6[u6];break}d4<0||n3(t55[a3],t55[p5],t55[h3],t55[d4])<0&&i3.push(a3,p5)}for(;i3.length>0;){for(var p5=i3.pop(),m4=(h3=-1,d4=-1,c6=r6[a3=i3.pop()],1);m4<c6.length;m4+=2){var g4=c6[m4-1],f4=c6[m4];g4===p5?d4=f4:f4===p5&&(h3=g4)}h3<0||d4<0||n3(t55[a3],t55[p5],t55[h3],t55[d4])>=0||(e8.flip(a3,p5),o6(t55,e8,i3,h3,a3,d4),o6(t55,e8,i3,a3,d4,h3),o6(t55,e8,i3,d4,p5,h3),o6(t55,e8,i3,p5,h3,d4))}}}}),T3=r4({"node_modules/cdt2d/lib/filter.js"(t54,e7){var n3=y();function o6(t55,e8,n4,o7,i6,s6,r6){this.cells=t55,this.neighbor=e8,this.flags=o7,this.constraint=n4,this.active=i6,this.next=s6,this.boundary=r6}function i3(t55,e8){return t55[0]-e8[0]||t55[1]-e8[1]||t55[2]-e8[2]}e7.exports=function(t55,e8,n4){var s6=(function(t56,e10){for(var n5=t56.cells(),s7=n5.length,r7=0;r7<s7;++r7){var a4=(y4=n5[r7])[0],c7=y4[1],l10=y4[2];c7<l10?c7<a4&&(y4[0]=c7,y4[1]=l10,y4[2]=a4):l10<a4&&(y4[0]=l10,y4[1]=a4,y4[2]=c7)}n5.sort(i3);var h4=new Array(s7);for(r7=0;r7<h4.length;++r7)h4[r7]=0;var d6=[],u10=[],p6=new Array(3*s7),m5=new Array(3*s7),g5=null;e10&&(g5=[]);var f6=new o6(n5,p6,m5,h4,d6,u10,g5);for(r7=0;r7<s7;++r7)for(var y4=n5[r7],_3=0;_3<3;++_3){a4=y4[_3],c7=y4[(_3+1)%3];var b4=p6[3*r7+_3]=f6.locate(c7,a4,t56.opposite(c7,a4)),x4=m5[3*r7+_3]=t56.isConstraint(a4,c7);b4<0&&(x4?u10.push(r7):(d6.push(r7),h4[r7]=1),e10&&g5.push([c7,a4,-1]))}return f6})(t55,n4);if(e8===0)return n4?s6.cells.concat(s6.boundary):s6.cells;for(var r6=1,a3=s6.active,c6=s6.next,l7=s6.flags,h3=s6.cells,d4=s6.constraint,u6=s6.neighbor;a3.length>0||c6.length>0;){for(;a3.length>0;){var p5=a3.pop();if(l7[p5]!==-r6){l7[p5]=r6,h3[p5];for(var m4=0;m4<3;++m4){var g4=u6[3*p5+m4];g4>=0&&l7[g4]===0&&(d4[3*p5+m4]?c6.push(g4):(a3.push(g4),l7[g4]=r6))}}}var f4=c6;c6=a3,a3=f4,c6.length=0,r6=-r6}var y3=(function(t56,e10,n5){for(var o7=0,i6=0;i6<t56.length;++i6)e10[i6]===n5&&(t56[o7++]=t56[i6]);return t56.length=o7,t56})(h3,l7,e8);return n4?y3.concat(s6.boundary):y3},o6.prototype.locate=(function(){var t55=[0,0,0];return function(e8,o7,s6){var r6=e8,a3=o7,c6=s6;return o7<s6?o7<e8&&(r6=o7,a3=s6,c6=e8):s6<e8&&(r6=s6,a3=e8,c6=o7),r6<0?-1:(t55[0]=r6,t55[1]=a3,t55[2]=c6,n3.eq(this.cells,t55,i3))}})()}}),w3=r4({"node_modules/cdt2d/cdt2d.js"(t54,e7){var n3=P2(),o6=M3(),i3=N2(),s6=T3();function r6(t55){return[Math.min(t55[0],t55[1]),Math.max(t55[0],t55[1])]}function a3(t55,e8){return t55[0]-e8[0]||t55[1]-e8[1]}function c6(t55,e8,n4){return e8 in t55?t55[e8]:n4}e7.exports=function(t55,e8,l7){Array.isArray(e8)?(l7=l7||{},e8=e8||[]):(l7=e8||{},e8=[]);var h3=!!c6(l7,"delaunay",!0),d4=!!c6(l7,"interior",!0),u6=!!c6(l7,"exterior",!0),p5=!!c6(l7,"infinity",!1);if(!d4&&!u6||t55.length===0)return[];var m4=n3(t55,e8);if(h3||d4!==u6||p5){for(var g4=o6(t55.length,(function(t56){return t56.map(r6).sort(a3)})(e8)),f4=0;f4<m4.length;++f4){var y3=m4[f4];g4.addTriangle(y3[0],y3[1],y3[2])}return h3&&i3(t55,g4),u6?d4?p5?s6(g4,0,p5):g4.cells():s6(g4,1,p5):s6(g4,-1)}return m4}}}),R5={0:"M0.301025 0.257813 L0.206593 0.283385 L0.122042 0.361307 L0.075923 0.474441 L0.064942 0.642221 L0.091296 0.78289 L0.159376 0.899463 L0.257104 0.961214 L0.344948 0.961214 L0.442678 0.899463 L0.510757 0.78289 L0.537111 0.642221 L0.526131 0.474441 L0.480012 0.361307 L0.39546 0.283385 L0.301025 0.257813",1:"M0.220426 0.40845 L0.381626 0.270996 L0.381626 0.948966",2:"M0.110409 0.39212 L0.125621 0.342293 L0.170571 0.295823 L0.244237 0.26431 L0.291518 0.257813 L0.373319 0.263799 L0.434683 0.290705 L0.468239 0.331966 L0.480292 0.379913 L0.479492 0.411806 L0.465088 0.465192 L0.402571 0.568988 L0.245134 0.766438 L0.07959 0.948045 L0.522462 0.948045",3:"M0.081606 0.345073 L0.119154 0.315633 L0.178996 0.284091 L0.255265 0.257813 L0.349133 0.263062 L0.43127 0.289348 L0.48994 0.336662 L0.525141 0.394491 L0.513407 0.457577 L0.466472 0.504892 L0.384334 0.541692 L0.290464 0.56272 L0.20833 0.573235 L0.290464 0.583749 L0.384334 0.610035 L0.466472 0.652092 L0.519274 0.709922 L0.531007 0.773007 L0.50754 0.841351 L0.454738 0.899179 L0.3726 0.946494 L0.310412 0.961214 L0.209503 0.959111 L0.127367 0.946494 L0.071046 0.929671",4:"M0.418494 0.270996 L0.048828 0.724199 L0.553224 0.724199 M0.414181 0.578167 L0.414181 0.94897",5:"M0.074951 0.270996 L0.074951 0.614701 L0.267655 0.5695 L0.405247 0.586502 L0.460002 0.617189 L0.498028 0.660731 L0.527101 0.779401 L0.513352 0.841049 L0.477274 0.889568 L0.406378 0.93463 L0.324445 0.958337 L0.247399 0.962139 L0.182516 0.949767 L0.130068 0.925508 L0.074951 0.875607 M0.074951 0.270996 L0.527101 0.270996",6:"M0.428549 0.257813 L0.341433 0.285053 L0.26073 0.312099 L0.192188 0.360182 L0.138902 0.410969 L0.098219 0.500422 L0.070249 0.584267 L0.067264 0.670716 L0.065164 0.756863 L0.087163 0.820973 L0.108168 0.861042 L0.157916 0.913131 L0.210981 0.948192 L0.29279 0.961214 L0.384548 0.956206 L0.456409 0.924151 L0.507262 0.881077 L0.5349 0.821975 L0.537111 0.771889 L0.521634 0.718798 L0.498418 0.67372 L0.463042 0.636657 L0.414398 0.613617 L0.34696 0.598591 L0.28284 0.595587 L0.215403 0.605604 L0.145756 0.641665 L0.109274 0.678729 L0.064942 0.724006",7:"M0.071534 0.270996 L0.530519 0.270996 L0.495935 0.291702 L0.477752 0.305407 L0.435186 0.346112 L0.412067 0.374136 L0.388565 0.40796 L0.365315 0.448098 L0.342943 0.495062 L0.322081 0.549366 L0.303364 0.611524 L0.287416 0.68205 L0.270077 0.80465 L0.26253 0.94897",8:"M0.286761 0.257813 L0.210684 0.27162 L0.1414 0.305622 L0.092494 0.382125 L0.111513 0.450128 L0.16857 0.502193 L0.228345 0.539382 L0.377781 0.594635 L0.470161 0.645637 L0.52586 0.706203 L0.538087 0.792269 L0.506841 0.87621 L0.438915 0.927212 L0.339743 0.961214 L0.263666 0.959089 L0.174004 0.929337 L0.102003 0.881523 L0.063965 0.811395 L0.066682 0.741266 L0.102003 0.671139 L0.180797 0.608448 L0.259591 0.580822 L0.358762 0.548945 L0.456576 0.49688 L0.486463 0.446941 L0.487822 0.362999 L0.453859 0.302434 L0.384574 0.265245 L0.286761 0.257813",9:"M0.511026 0.437812 L0.491026 0.347812 L0.451026 0.297812 L0.391026 0.267812 L0.311026 0.257813 L0.231026 0.267812 L0.161026 0.297812 L0.111026 0.347812 L0.091026 0.417812 L0.111026 0.487812 L0.161026 0.537812 L0.231026 0.567812 L0.311026 0.577812 L0.391026 0.557812 L0.451026 0.517812 L0.491026 0.477812 L0.511026 0.437812 M0.510026 0.438812 L0.434026 0.636812 L0.381026 0.777812 L0.337026 0.879812 L0.301026 0.957812","!":"M0.301026 0.270996 L0.301026 0.749566 M0.251466 0.94897 L0.350587 0.94897",'"':"M0.16504 0.270996 L0.16504 0.523022 M0.437013 0.270996 L0.437013 0.523022","#":"M0.20958 0.282227 L0.146515 0.949754 M0.461844 0.282227 L0.398779 0.949754 M0.032999 0.526969 L0.600587 0.452796 M0.001465 0.82366 L0.569055 0.749486",$:"M0.307121 0.240234 L0.307121 1.083502 M0.490031 0.415915 L0.404676 0.328075 L0.23396 0.310507 L0.136407 0.398347 L0.099828 0.521324 L0.124213 0.591596 L0.197379 0.644299 L0.429061 0.697003 L0.502224 0.749708 L0.526613 0.837547 L0.477836 0.960526 L0.355897 1.013228 L0.197379 0.99566 L0.112021 0.942957 L0.07544 0.837547","'":"M0.301026 0.270996 L0.301026 0.523022","(":"M0.413087 0.241211 L0.372337 0.28347 L0.331589 0.334184 L0.290838 0.393349 L0.25009 0.460965 L0.219528 0.528584 L0.199153 0.5962 L0.188966 0.655364 L0.199153 0.714529 L0.219528 0.782146 L0.25009 0.849764 L0.290838 0.91738 L0.331589 0.976544 L0.372337 1.027258 L0.413087 1.069491",")":"M0.188966 0.241211 L0.229716 0.28347 L0.270466 0.334184 L0.311213 0.393349 L0.351964 0.460965 L0.382526 0.528584 L0.4029 0.5962 L0.413087 0.655364 L0.4029 0.714529 L0.382526 0.782146 L0.351964 0.849764 L0.311213 0.91738 L0.270466 0.976544 L0.229716 1.027258 L0.188966 1.069491","*":"M0.301026 0.458702 L0.301026 0.681942 M0.301026 0.458702 L0.520997 0.536834 M0.301026 0.458702 L0.439954 0.257813 M0.301026 0.458702 L0.162098 0.257813 M0.301026 0.458702 L0.081055 0.536834","+":"M0.042969 0.66845 L0.559083 0.66845 M0.301023 0.428223 L0.301023 0.908661",",":"M0.38672 0.852051 L0.215333 1.030661 L0.301025 1.119971","-":"M0.173829 0.686035 L0.428224 0.686035",".":"M0.362549 0.851074 L0.239503 0.851074","/":"M0.062501 1.035249 L0.539551 0.270996","<":"M0.559083 0.441895 L0.042969 0.66939 L0.042969 0.66939 L0.559083 0.896902","=":"M0.042969 0.545898 L0.559083 0.545898 M0.042969 0.80837 L0.559083 0.80837",">":"M0.042969 0.441895 L0.559083 0.66939 L0.559083 0.66939 L0.042969 0.896902",A:"M0.018067 0.94897 L0.290179 0.270996 L0.583986 0.94897 M0.155303 0.684521 L0.433548 0.684521",B:"M0.063965 0.94897 L0.063965 0.278953 L0.209356 0.270996 L0.342486 0.294394 L0.432179 0.37292 L0.418224 0.48773 L0.312686 0.549166 L0.084728 0.575531 L0.306377 0.589434 L0.468877 0.647456 L0.538087 0.736658 L0.5324 0.85202 L0.501247 0.902983 L0.42355 0.944398 L0.063965 0.94897",C:"M0.529054 0.419847 L0.498425 0.345196 L0.442238 0.292341 L0.33583 0.257813 L0.257199 0.268357 L0.187906 0.303748 L0.120243 0.385432 L0.072998 0.599844 L0.110073 0.815385 L0.165381 0.902183 L0.222883 0.942801 L0.334904 0.961214 L0.43253 0.937679 L0.504816 0.868999 L0.529054 0.772065",D:"M0.064454 0.94897 L0.071838 0.285078 L0.171217 0.270996 L0.247348 0.272633 L0.37101 0.306078 L0.462461 0.378304 L0.514748 0.475555 L0.535591 0.576392 L0.537599 0.652313 L0.528065 0.717381 L0.508562 0.772419 L0.445948 0.855695 L0.362356 0.90871 L0.225203 0.945862 L0.064454 0.94897",E:"M0.080078 0.270996 L0.080078 0.94897 M0.080078 0.270996 L0.521974 0.270996 M0.080078 0.609981 L0.389405 0.609981 M0.080078 0.94897 L0.521974 0.94897",F:"M0.086426 0.270996 L0.086426 0.94897 M0.091304 0.275607 L0.515626 0.275607 M0.091304 0.607677 L0.447344 0.607677",G:"M0.498034 0.284943 L0.374621 0.257813 L0.244219 0.268648 L0.160577 0.311997 L0.094556 0.398116 L0.056397 0.58404 L0.076752 0.785532 L0.120865 0.858197 L0.188947 0.916734 L0.271008 0.953591 L0.357069 0.961214 L0.43715 0.932047 L0.501262 0.858539 L0.545656 0.648611 L0.329595 0.648131",H:"M0.066895 0.270996 L0.066895 0.94897 M0.066895 0.595658 L0.530009 0.595658 M0.535157 0.270996 L0.535157 0.94897",I:"M0.301026 0.270996 L0.301026 0.94897",J:"M0.506839 0.270996 L0.507814 0.782193 L0.498468 0.846168 L0.480733 0.880789 L0.455864 0.90832 L0.426095 0.929408 L0.360746 0.954812 L0.302508 0.962139 L0.223573 0.953638 L0.16538 0.930312 L0.137072 0.907715 L0.116428 0.880312 L0.102822 0.848819 L0.095633 0.813947 L0.094239 0.776413",K:"M0.035401 0.270996 L0.035401 0.94897 M0.502258 0.316194 L0.035401 0.687823 M0.212484 0.582361 L0.566652 0.933903",L:"M0.07544 0.270996 L0.07544 0.94897 L0.526613 0.94897",M:"M0.042481 0.94897 L0.042481 0.270996 L0.301027 0.712492 L0.559571 0.270996 L0.559571 0.94897",N:"M0.067871 0.94897 L0.067871 0.270996 L0.534181 0.94897 L0.525031 0.270996",O:"M0.287293 0.961214 L0.19843 0.933567 L0.1172 0.849451 L0.057129 0.563945 L0.114348 0.350255 L0.18455 0.289392 L0.306101 0.257813 L0.42054 0.29572 L0.487543 0.365003 L0.544923 0.625294 L0.516366 0.789624 L0.465476 0.884596 L0.375084 0.949287 L0.287293 0.961214",P:"M0.070557 0.94897 L0.070557 0.28379 L0.20704 0.270996 L0.329134 0.278993 L0.408525 0.300514 L0.444022 0.317908 L0.500637 0.368929 L0.525796 0.423728 L0.531496 0.50384 L0.508934 0.554205 L0.473724 0.582043 L0.417577 0.604365 L0.336375 0.620372 L0.226014 0.629268 L0.082368 0.630258",Q:"M0.282435 1.050813 L0.195447 1.019646 L0.115933 0.924817 L0.057129 0.602943 L0.113139 0.362034 L0.18186 0.293418 L0.300844 0.257813 L0.412868 0.300553 L0.478457 0.37866 L0.534625 0.672103 L0.506671 0.857367 L0.456855 0.964437 L0.368371 1.037368 L0.282435 1.050813 M0.341225 0.815559 L0.544923 1.070653",R:"M0.034912 0.944112 L0.034912 0.288556 L0.227127 0.270996 L0.362038 0.276867 L0.443423 0.294907 L0.477644 0.309614 L0.505809 0.328757 L0.526616 0.352817 L0.544963 0.418061 L0.543241 0.475921 L0.524463 0.517817 L0.49076 0.546518 L0.444265 0.564799 L0.355195 0.578739 L0.047653 0.589627 M0.303054 0.617306 L0.56714 0.94897",S:"M0.483037 0.364333 L0.407613 0.267477 L0.22883 0.257813 L0.128623 0.327565 L0.087712 0.455539 L0.104656 0.518727 L0.168054 0.573307 L0.41928 0.617318 L0.503796 0.669342 L0.535157 0.759324 L0.493846 0.900055 L0.367668 0.961214 L0.205436 0.956661 L0.116711 0.907038 L0.066895 0.790334",T:"M0.022949 0.270996 L0.579103 0.270996 M0.309284 0.270996 L0.309284 0.94897",U:"M0.072022 0.270996 L0.07308 0.648875 L0.080372 0.75167 L0.099024 0.827813 L0.134786 0.885729 L0.181571 0.924023 L0.251464 0.95168 L0.339655 0.962139 L0.401553 0.951668 L0.45232 0.924086 L0.482701 0.891771 L0.495745 0.870529 L0.515699 0.81637 L0.525014 0.744626 L0.530031 0.272017",V:"M0.027832 0.270996 L0.320083 0.94897 L0.57422 0.270996",W:"M0 0.270996 L0.079799 0.940377 L0.285198 0.472884 L0.505255 0.94897 L0.602052 0.270996",X:"M0.009034 0.270996 L0.586805 0.94897 M0.593019 0.270996 L0.015246 0.94897",Y:"M0.018067 0.270996 L0.293132 0.574135 M0.583986 0.271959 L0.294954 0.57606 L0.305277 0.94897",Z:"M0.053711 0.270996 L0.548341 0.270996 L0.053711 0.94897 L0.548341 0.94897","[":"M0.404542 0.240234 L0.197511 0.240234 L0.197511 1.069424 L0.404542 1.069424","\\":"M0.062501 0.270996 L0.539551 1.035249","]":"M0.19751 0.240234 L0.404542 0.240234 L0.404542 1.069424 L0.19751 1.069424","^":"M0.035156 0.523931 L0.301024 0.270996 L0.566896 0.523931",_:"M0 1.160601 L0.602052 1.160601",a:"M0.527101 0.439941 L0.527101 0.973965 M0.527101 0.553824 L0.451366 0.477535 L0.376759 0.439941 L0.263722 0.439941 L0.187989 0.477535 L0.112255 0.553824 L0.074951 0.66881 L0.074951 0.745099 L0.112255 0.85898 L0.187989 0.93527 L0.263722 0.973965 L0.376759 0.973965 L0.451366 0.93527 L0.527101 0.85898",b:"M0.07666 0.240234 L0.07666 0.959985 M0.07666 0.582737 L0.151822 0.514237 L0.225865 0.480483 L0.338045 0.480483 L0.413211 0.514237 L0.488374 0.582737 L0.525392 0.685983 L0.525392 0.754485 L0.488374 0.856739 L0.413211 0.92524 L0.338045 0.959985 L0.225865 0.959985 L0.151822 0.92524 L0.07666 0.856739",c:"M0.512452 0.553823 L0.441624 0.477535 L0.371854 0.439941 L0.26614 0.439941 L0.195312 0.477535 L0.124486 0.553823 L0.0896 0.668808 L0.0896 0.745099 L0.124486 0.858979 L0.195312 0.93527 L0.26614 0.973965 L0.371854 0.973965 L0.441624 0.93527 L0.512452 0.858979",d:"M0.525392 0.240234 L0.525392 0.959985 M0.525392 0.582737 L0.450232 0.514237 L0.376189 0.480483 L0.264006 0.480483 L0.188844 0.514237 L0.11368 0.582737 L0.076661 0.685983 L0.076661 0.754485 L0.11368 0.856739 L0.188844 0.92524 L0.264006 0.959985 L0.376189 0.959985 L0.450232 0.92524 L0.525392 0.856739",e:"M0.059571 0.668808 L0.542482 0.668808 M0.542482 0.592521 L0.502641 0.516231 L0.461594 0.477535 L0.381914 0.439941 L0.261186 0.439941 L0.180299 0.477535 L0.099412 0.553823 L0.059571 0.668808 L0.059571 0.745099 L0.099412 0.858979 L0.180299 0.93527 L0.261186 0.973965 L0.381914 0.973965 L0.461594 0.93527 L0.542482 0.858979",f:"M0.512941 0.240234 L0.406984 0.240234 L0.301026 0.274346 L0.248047 0.374731 L0.248047 0.946817 M0.089112 0.476088 L0.459965 0.476088",g:"M0.525392 0.439941 L0.525392 0.989395 L0.488373 1.091918 L0.45023 1.126757 L0.376189 1.160601 L0.264004 1.160601 L0.188844 1.126757 L0.113681 1.058075 L0.076661 0.954555 M0.525392 0.542467 L0.45023 0.473786 L0.376189 0.439941 L0.264004 0.439941 L0.188844 0.473786 L0.113681 0.542467 L0.076661 0.645988 L0.076661 0.714669 L0.113681 0.817193 L0.188844 0.885875 L0.264004 0.920713 L0.376189 0.920713 L0.45023 0.885875 L0.525392 0.817193",h:"M0.092041 0.240234 L0.092041 0.946817 M0.092041 0.61058 L0.205937 0.509225 L0.282214 0.476086 L0.396109 0.476086 L0.47187 0.509225 L0.510011 0.61058 L0.510011 0.946817",i:"M0.261026 0.240234 L0.341026 0.240234 M0.300978 0.476089 L0.300978 0.946817",j:"M0.3853 0.240234 L0.447023 0.240234 M0.416159 0.465708 L0.416159 1.011689 L0.383887 1.108586 L0.252832 1.140264 L0.15503 1.108586",k:"M0.065186 0.240234 L0.065186 0.946817 M0.493824 0.476086 L0.065186 0.812323 M0.236758 0.677829 L0.536867 0.946817",l:"M0.301026 0.234863 L0.301026 0.946441",m:"M0.050538 0.439941 L0.050538 0.960796 M0.050538 0.588758 L0.114405 0.476607 L0.157178 0.439941 L0.236864 0.439941 L0.279637 0.476607 L0.32241 0.588758 L0.32241 0.960796 M0.32241 0.588758 L0.386281 0.476607 L0.428467 0.439941 L0.50874 0.439941 L0.551515 0.476607 L0.551515 0.960796",n:"M0.092041 0.439941 L0.092041 0.960796 M0.092041 0.588758 L0.205936 0.476607 L0.282216 0.439941 L0.396113 0.439941 L0.471871 0.476607 L0.510011 0.588758 L0.510011 0.960796",o:"M0.247175 0.439941 L0.175178 0.477535 L0.103186 0.553823 L0.066895 0.668808 L0.066895 0.745099 L0.103186 0.858979 L0.175178 0.93527 L0.247175 0.973965 L0.354874 0.973965 L0.426872 0.93527 L0.498866 0.858979 L0.535157 0.745099 L0.535157 0.668808 L0.498866 0.553823 L0.426872 0.477535 L0.354874 0.439941 L0.247175 0.439941",p:"M0.076904 0.439941 L0.076904 1.154244 M0.076904 0.541563 L0.151986 0.473487 L0.225944 0.439941 L0.338005 0.439941 L0.413087 0.473487 L0.488166 0.541563 L0.525148 0.644169 L0.525148 0.712246 L0.488166 0.813866 L0.413087 0.881942 L0.338005 0.916471 L0.225944 0.916471 L0.151986 0.881942 L0.076904 0.813866",q:"M0.525148 0.441895 L0.525148 1.156195 M0.525148 0.5435 L0.450067 0.47544 L0.376106 0.441895 L0.264042 0.441895 L0.188966 0.47544 L0.113885 0.5435 L0.076905 0.646108 L0.076905 0.714187 L0.113885 0.815809 L0.188966 0.883886 L0.264042 0.918418 L0.376106 0.918418 L0.450067 0.883886 L0.525148 0.815809",r:"M0.107422 0.439941 L0.107422 0.960796 M0.107422 0.663164 L0.155824 0.551014 L0.252626 0.476607 L0.349428 0.439941 L0.49463 0.439941",s:"M0.475556 0.477535 L0.400757 0.439941 L0.276092 0.439941 L0.176361 0.477535 L0.101563 0.553823 L0.101563 0.630112 L0.176361 0.668808 L0.301024 0.668808 L0.425688 0.745099 L0.50049 0.821387 L0.50049 0.897677 L0.425688 0.93527 L0.325956 0.973965 L0.201295 0.973965 L0.126496 0.93527 L0.101563 0.858979",t:"M0.246032 0.297852 L0.246032 0.826549 L0.301023 0.919323 L0.411011 0.950848 L0.520997 0.950848 M0.081055 0.515799 L0.466004 0.515799",u:"M0.092041 0.454102 L0.092041 0.826134 L0.13018 0.937211 L0.205936 0.974954 L0.319832 0.974954 L0.396113 0.937211 L0.510011 0.826134 M0.510011 0.454102 L0.510011 0.974954",v:"M0.048828 0.453125 L0.301026 0.961719 M0.553224 0.453125 L0.301026 0.961719",w:"M0 0.453125 L0.150512 0.961719 M0.301024 0.453125 L0.150512 0.961719 M0.301024 0.453125 L0.451539 0.961719 M0.602052 0.453125 L0.451539 0.961719",x:"M0.03711 0.453125 L0.564943 0.961719 M0.564943 0.453125 L0.03711 0.961719",y:"M0.084618 0.453125 L0.320232 0.921476 M0.55713 0.453125 L0.320232 0.921476 L0.242119 1.055289 L0.163369 1.122196 L0.084618 1.155166 L0.044922 1.155166",z:"M0.505373 0.452148 L0.09668 0.961651 M0.09668 0.452148 L0.505373 0.452148 M0.09668 0.961651 L0.505373 0.961651"},E3={};for(let t54 in R5){E3[t54]=[];let e7=R5[t54].split("M").slice(1).map(t55=>t55.split("L").map(t56=>t56.trim().split(" ").map(parseFloat)));for(let n3 of e7)for(let e8=0;e8<n3.length-1;e8++)E3[t54].push({x1:n3[e8][0],y1:1-n3[e8][1],x2:n3[e8+1][0],y2:1-n3[e8+1][1]})}new TextEncoder,(()=>{let t54=new Uint8Array(4);new Uint32Array(t54.buffer)[0]=1,t54[0]})(),globalThis.Int8Array,globalThis.Uint8Array,globalThis.Int16Array,globalThis.Uint16Array,globalThis.Int32Array,globalThis.Uint32Array,globalThis.BigUint64Array,globalThis.BigInt64Array,globalThis.Float32Array,globalThis.Float64Array;var A6=[];for(let t54=0;t54<256;t54++){let e7=t54;for(let t55=0;t55<8;t55++)1&e7?e7=3988292384^e7>>>1:e7>>>=1;A6[t54]=e7}var O2=new Uint16Array([255]),L3=(new Uint8Array(O2.buffer)[0],new Uint16Array([255]));new Uint8Array(L3.buffer)[0],new Uint8Array(0),Uint8Array.of(137,80,78,71,13,10,26,10),new TextDecoder("latin1");function D3(){return D3=Object.assign?Object.assign.bind():function(t54){for(var e7=1;e7<arguments.length;e7++){var n3=arguments[e7];for(var o6 in n3)({}).hasOwnProperty.call(n3,o6)&&(t54[o6]=n3[o6])}return t54},D3.apply(null,arguments)}function z3(t54,e7){return(z3=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t55,e8){return t55.__proto__=e8,t55})(t54,e7)}function k3(t54){return(k3=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t55){return t55.__proto__||Object.getPrototypeOf(t55)})(t54)}function F6(){try{var t54=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(F6=function(){return!!t54})()}function j3(t54){var e7=typeof Map=="function"?new Map:void 0;return j3=function(t55){if(t55===null||!(function(t56){try{return Function.toString.call(t56).indexOf("[native code]")!==-1}catch{return typeof t56=="function"}})(t55))return t55;if(typeof t55!="function")throw new TypeError("Super expression must either be null or a function");if(e7!==void 0){if(e7.has(t55))return e7.get(t55);e7.set(t55,n3)}function n3(){return(function(t56,e8,n4){if(F6())return Reflect.construct.apply(null,arguments);var o6=[null];o6.push.apply(o6,e8);var i3=new(t56.bind.apply(t56,o6));return n4&&z3(i3,n4.prototype),i3})(t55,arguments,k3(this).constructor)}return n3.prototype=Object.create(t55.prototype,{constructor:{value:n3,enumerable:!1,writable:!0,configurable:!0}}),z3(n3,t55)},j3(t54)}var Y3={1:`Passed invalid arguments to hsl, please pass multiple numbers e.g. hsl(360, 0.75, 0.4) or an object e.g. rgb({ hue: 255, saturation: 0.4, lightness: 0.75 }).
338
338
 
339
339
  `,2:`Passed invalid arguments to hsla, please pass multiple numbers e.g. hsla(360, 0.75, 0.4, 0.7) or an object e.g. rgb({ hue: 255, saturation: 0.4, lightness: 0.75, alpha: 0.7 }).
340
340
 
@@ -627,7 +627,7 @@ ${t54.width.toFixed(2)}x${t54.height.toFixed(2)}`,layer:`z${t54.availableZ.join(
627
627
  `),$L2=(t54,e7)=>{let n3=.005*t54.topology.portZ[e7];return{x:t54.topology.portX[e7]+n3,y:t54.topology.portY[e7]+n3}},BL=(t54,e7)=>gL([t54.topology.portZ[e7]])??"z0",HL=(t54,e7)=>{let n3=t54.topology.portMetadata?.[e7];return`port: ${n3?.serializedPortId??n3?.portId??`port-${e7}`}`},WL=(t54,e7)=>`z: ${t54.topology.portZ[e7]}`,VL=(t54,e7)=>((t55,e8,n3)=>{let o6=t55.topology.portZ[e8],i3=t55.topology.portZ[n3];return o6===i3?`z: ${o6}`:`z: ${o6} -> ${i3}`})(t54,t54.problem.routeStartPort[e7],t54.problem.routeEndPort[e7]),UL=(t54,e7)=>`net: ${t54.problem.routeNet[e7]}`,GL=.05,ZL={r:255,g:64,b:64,a:.72},qL="rgba(220, 38, 38, 0.98)",JL2="rgba(220, 38, 38, 0.12)",KL="10 6",QL=(...t54)=>t54.filter(t55=>!!t55).join(`
628
628
  `),tD=t54=>Math.min(1,Math.max(0,t54)),eD=(t54,e7,n3)=>Math.round(t54+(e7-t54)*n3),nD=({r:t54,g:e7,b:n3,a:o6})=>`rgba(${t54}, ${e7}, ${n3}, ${o6})`,oD=(t54,e7)=>{let n3=t54.problem.routeMetadata?.[e7];return n3?.connectionId??n3?.mutuallyConnectedNetworkId??`route-${e7}`},iD=t54=>typeof t54.centerRouteId=="number",sD=(t54,e7)=>iD(t54)?e7===t54.centerRouteId?1:.5:1,rD=(t54,e7)=>{let n3=t54.match(/^(rgba|hsla)\((.*),\s*([0-9]*\.?[0-9]+)\)$/);if(!n3)return t54;let[,o6,i3,s6]=n3,r6=tD(Number(s6)*e7);return`${o6}(${i3}, ${Number(r6.toFixed(3))})`},aD=(t54,e7,n3=.8)=>((t55,e8,n4=.8)=>{let o6=`${t55.problem.routeNet[e8]}:${oD(t55,e8)}`,i3=0;for(let t56=0;t56<o6.length;t56++)i3=17777*o6.charCodeAt(t56)+((i3<<5)-i3);return`hsla(${Math.abs(i3)%360}, 70%, 50%, ${n4})`})(t54,e7,n3*sD(t54,e7)),cD=(t54,e7)=>`net: ${t54.problem.routeNet[e7]}`,lD=(t54,e7)=>{let n3=t54.topology.regionMetadata?.[e7],o6=n3?.polygon;if(Array.isArray(o6)&&o6.length>=3){let t55=o6.map(t56=>t56.x),e8=o6.map(t56=>t56.y);return{minX:Math.min(...t55),maxX:Math.max(...t55),minY:Math.min(...e8),maxY:Math.max(...e8)}}let i3=n3?.bounds;if(i3&&typeof i3.minX=="number"&&typeof i3.maxX=="number"&&typeof i3.minY=="number"&&typeof i3.maxY=="number")return i3;let s6=t54.topology.regionWidth[e7],r6=t54.topology.regionHeight[e7],a3=t54.topology.regionCenterX[e7],c6=t54.topology.regionCenterY[e7];return{minX:a3-s6/2,maxX:a3+s6/2,minY:c6-r6/2,maxY:c6+r6/2}},hD=(t54,e7)=>({x:t54.topology.regionCenterX[e7],y:t54.topology.regionCenterY[e7]}),dD=(t54,e7)=>{let n3=t54.topology.regionMetadata?.[e7],o6=Array.isArray(n3?.availableZ)?n3.availableZ.filter(t55=>typeof t55=="number"&&Number.isInteger(t55)&&t55>=0):[];if(o6.length>0)return gL(o6)??"z0";let i3=fL(t54.topology.regionAvailableZMask?.[e7]??0);if(i3.length>0)return gL(i3)??"z0";let s6=[...new Set((t54.topology.regionIncidentPorts[e7]??[]).map(e8=>t54.topology.portZ[e8]))].sort((t55,e8)=>t55-e8);return gL(s6)??"z0"},uD=(t54,e7)=>{let n3=t54.state.regionIntersectionCaches[e7],o6=n3?.existingRegionCost??0,i3=t54.state.regionCongestionCost[e7]??0,s6=t54.problem.regionNetId[e7];return QL(`region: region-${e7}`,`net: ${s6===-1?"free":`${s6}`}`,t54.getAdditionalRegionLabel(e7),`cost: ${o6.toFixed(3)}`,`congestion: ${i3.toFixed(3)}`,`same layer X: ${n3?.existingSameLayerIntersections??0}`,`trans X: ${n3?.existingCrossingLayerIntersections??0}`,`entry exit X: ${n3?.existingEntryExitLayerChanges??0}`)},pD=(t54,e7)=>{let n3=t54.topology.regionMetadata?.[e7];return n3?.isConnectionRegion?{r:255,g:100,b:255,a:.6}:n3?.isThroughJumper?{r:100,g:200,b:100,a:.5}:n3?.isPad?{r:255,g:200,b:100,a:.5}:n3?.layer==="bottom"?{r:52,g:152,b:219,a:.08}:{r:200,g:200,b:255,a:.1}},mD=(t54,e7)=>{let n3=pD(t54,e7),o6=tD(t54.state.regionIntersectionCaches[e7]?.existingRegionCost??0);return nD((s6=ZL,r6=o6**.8,{r:eD((i3=n3).r,s6.r,r6),g:eD(i3.g,s6.g,r6),b:eD(i3.b,s6.b,r6),a:Number((i3.a+(s6.a-i3.a)*r6).toFixed(3))}));var i3,s6,r6},gD=(t54,e7)=>{let n3=((t55,e8)=>({x:t55.topology.portX[e8],y:t55.topology.portY[e8]}))(t54,e7),o6=.005*t54.topology.portZ[e7];return{x:n3.x+o6,y:n3.y+o6}},fD=gD,yD=(t54,e7)=>gL([t54.topology.portZ[e7]])??"z0",_D=(t54,e7)=>{let n3=t54.topology.portMetadata?.[e7];return`port: ${n3?.serializedPortId??n3?.portId??`port-${e7}`}`},bD=(t54,e7,n3)=>{if(n3!==void 0)return`net: ${t54.problem.routeNet[n3]}`;let o6=t54.state.portAssignment[e7];if(o6>=0)return`net: ${o6}`;let i3=new Set;for(let n4=0;n4<t54.problem.routeCount;n4++)t54.problem.routeStartPort[n4]!==e7&&t54.problem.routeEndPort[n4]!==e7||i3.add(t54.problem.routeNet[n4]);return i3.size!==0?`net: ${Array.from(i3).sort((t55,e8)=>t55-e8).join(", ")}`:void 0},xD=(t54,e7)=>`z: ${t54.topology.portZ[e7]}`,vD=(t54,e7,n3)=>{let o6=t54.topology.portZ[e7],i3=t54.topology.portZ[n3];return o6===i3?`z: ${o6}`:`z: ${o6} -> ${i3}`},SD=(t54,e7)=>vD(t54,t54.problem.routeStartPort[e7],t54.problem.routeEndPort[e7]),ID=(t54,e7,n3)=>QL(_D(t54,e7),((t55,e8)=>{let n4=t55.topology.incidentPortRegion[e8]?.[0],o6=t55.topology.incidentPortRegion[e8]?.[1];return`connects: region-${n4??"?"} <-> region-${o6??"?"}`})(t54,e7),bD(t54,e7,n3)),PD=(t54,e7,n3,o6)=>{let i3=t54.topology.portZ[n3];return i3!==t54.topology.portZ[o6]?{strokeColor:rD("rgba(22, 160, 133, 0.95)",sD(t54,e7)),strokeDash:"2 4 2"}:i3>0?{strokeColor:rD("rgba(52, 152, 219, 0.95)",sD(t54,e7)),strokeDash:"3 2"}:{strokeColor:aD(t54,e7)}},MD=(t54,e7)=>{for(let n3=0;n3<t54.problem.routeCount;n3++)if(t54.problem.routeStartPort[n3]===e7||t54.problem.routeEndPort[n3]===e7)return!0;return!1},CD=(t54,e7,n3)=>{let o6=((t55,e8)=>{let n4=new Set;for(let o7=0;o7<e8.length;o7++)if(e8[o7]===1)for(let e10 of t55.topology.incidentPortRegion[o7]??[])n4.add(e10);return n4})(t54,n3),i3="rgba(245, 158, 11, 0.95)",s6="rgba(245, 158, 11, 0.08)";for(let n4 of o6){let o7=t54.topology.regionMetadata?.[n4],r6=o7?.polygon,a3=lD(t54,n4),c6=hD(t54,n4),l7=a3.maxX-a3.minX,h3=a3.maxY-a3.minY,d4=dD(t54,n4),u6=QL("section region",uD(t54,n4));Array.isArray(r6)&&r6.length>=3?e7.polygons.push({points:r6,fill:s6,stroke:i3,strokeWidth:2,layer:d4,label:u6}):e7.rects.push({center:c6,width:Math.max(l7-GL,.05),height:Math.max(h3-GL,.05),fill:s6,stroke:i3,layer:d4,label:u6})}for(let o7=0;o7<n3.length;o7++)n3[o7]===1&&e7.circles.push({center:fD(t54,o7),radius:.07,fill:"rgba(251, 191, 36, 0.18)",stroke:i3,layer:yD(t54,o7),label:QL(ID(t54,o7),xD(t54,o7),"section port")})},ND=(t54,e7={})=>{let n3={arrows:[],circles:[],infiniteLines:[],lines:[],points:[],polygons:[],rects:[],texts:[],title:"Tiny HyperGraph",coordinateSystem:"cartesian"},o6=((t55,e8)=>{if(!e8?.highlightSectionMask)return;let n4=e8.sectionPortMask??t55.problem.portSectionMask;if(n4.length!==t55.topology.portCount)return;let o7=0,i6=0;for(let t56=0;t56<n4.length;t56++)n4[t56]===1?o7+=1:i6+=1;return o7!==0&&i6!==0?n4:void 0})(t54,e7),i3=(t55=>{let e8=t55.getStaticallyUnroutableRoutes();if(e8.length!==0)return new Set(e8.map(t56=>t56.routeId))})(t54);for(let e8=0;e8<t54.topology.regionCount;e8++){let o7=t54.topology.regionMetadata?.[e8],i6=o7?.polygon,s7=lD(t54,e8),r7=hD(t54,e8),a3=s7.maxX-s7.minX,c6=s7.maxY-s7.minY,l7=dD(t54,e8),h3=nD(pD(t54,e8));Array.isArray(i6)&&i6.length>=3?n3.polygons.push({points:i6,fill:h3,layer:l7}):n3.rects.push({center:r7,width:Math.max(a3-GL,.05),height:Math.max(c6-GL,.05),fill:mD(t54,e8),layer:l7,label:uD(t54,e8)})}if(((t55,e8,n4)=>{for(let o7=0;o7<t55.problem.routeCount;o7++){if(n4&&!n4.has(o7))continue;let i6=t55.problem.routeStartPort[o7],s7=t55.problem.routeEndPort[o7],r7=gD(t55,i6),a3=gD(t55,s7),c6=aD(t55,o7),l7=oD(t55,o7),h3=cD(t55,o7);e8.points.push({x:r7.x,y:r7.y,color:c6,layer:yD(t55,i6),label:QL(`route: ${l7}`,h3,"endpoint: start",_D(t55,i6),xD(t55,i6))}),e8.points.push({x:a3.x,y:a3.y,color:c6,layer:yD(t55,s7),label:QL(`route: ${l7}`,h3,"endpoint: end",_D(t55,s7),xD(t55,s7))})}})(t54,n3,i3),t54.iterations===0){for(let t55 of n3.polygons)t55.stroke="rgba(128, 128, 128, 0.5)";for(let t55 of n3.rects)t55.stroke="rgba(128, 128, 128, 0.5)"}if(t54.iterations===0){for(let i6=0;i6<t54.topology.portCount;i6++){let s7=o6?.[i6]===1;e7.showOnlySectionPortsOnIdle&&!s7||n3.circles.push({center:fD(t54,i6),radius:.05,fill:t54.topology.portZ[i6]>0?"rgba(52, 152, 219, 0.55)":"rgba(128, 128, 128, 0.5)",layer:yD(t54,i6),label:QL(ID(t54,i6),xD(t54,i6))})}i3?((t55,e8)=>{for(let n4 of t55.getStaticallyUnroutableRoutes()){let{routeId:o7,connectionId:i6,startPortId:s7,endPortId:r7}=n4,a3=$L2(t55,s7),c6=$L2(t55,r7),l7=XL(`static reachability failed: ${i6}`,UL(t55,o7),n4.startRegionId?`startRegionId: ${n4.startRegionId}`:void 0,n4.endRegionId?`endRegionId: ${n4.endRegionId}`:void 0,n4.pointIds.length>=2?`points: ${n4.pointIds.join(" -> ")}`:void 0,VL(t55,o7));e8.lines.push({points:[a3,c6],strokeColor:jL,strokeDash:"8 4",label:l7}),e8.circles.push({center:a3,radius:.12,fill:YL,stroke:jL,layer:BL(t55,s7),label:XL(l7,"endpoint: start",HL(t55,s7),WL(t55,s7))}),e8.circles.push({center:c6,radius:.12,fill:YL,stroke:jL,layer:BL(t55,r7),label:XL(l7,"endpoint: end",HL(t55,r7),WL(t55,r7))})}})(t54,n3):e7.showInitialRouteHints!==!1&&((t55,e8)=>{for(let n4=0;n4<t55.problem.routeCount;n4++){let o7=t55.problem.routeStartPort[n4],i6=t55.problem.routeEndPort[n4],s7=gD(t55,o7),r7=gD(t55,i6),a3={x:(s7.x+r7.x)/2,y:(s7.y+r7.y)/2};e8.lines.push({points:[s7,r7],strokeColor:aD(t55,n4),strokeDash:"3 3",label:QL(oD(t55,n4),SD(t55,n4))}),e8.points.push({x:a3.x,y:a3.y,color:aD(t55,n4,1),label:QL(oD(t55,n4),SD(t55,n4))})}})(t54,n3)}else((t55,e8)=>{for(let n4=0;n4<t55.state.regionSegments.length;n4++){let o7=t55.state.regionSegments[n4]??[];for(let[i6,s7,r7]of o7)e8.lines.push({points:[gD(t55,s7),gD(t55,r7)],label:QL(`route: ${oD(t55,i6)}`,`region: region-${n4}`,vD(t55,s7,r7)),...PD(t55,i6,s7,r7)})}})(t54,n3),((t55,e8)=>{let n4=new Set;for(let o7=0;o7<t55.state.regionSegments.length;o7++){let i6=t55.state.regionSegments[o7]??[];for(let[o8,s7,r7]of i6)for(let i8 of[s7,r7]){let s8=`${o8}:${i8}`;if(n4.has(s8))continue;n4.add(s8);let r8=gD(t55,i8);e8.points.push({x:r8.x,y:r8.y,color:aD(t55,o8,1),layer:yD(t55,i8),label:QL(`route: ${oD(t55,o8)}`,_D(t55,i8),bD(t55,i8,o8),xD(t55,i8))})}}})(t54,n3),(t55=>iD(t55)&&t55.showUnassignedPortsInVisualization===!0)(t54)&&((t55,e8)=>{for(let n4=0;n4<t55.topology.portCount;n4++)t55.state.portAssignment[n4]>=0||MD(t55,n4)||e8.circles.push({center:fD(t55,n4),radius:.04,fill:t55.topology.portZ[n4]>0?"rgba(52, 152, 219, 0.2)":"rgba(128, 128, 128, 0.2)",stroke:t55.topology.portZ[n4]>0?"rgba(52, 152, 219, 0.6)":"rgba(128, 128, 128, 0.6)",layer:yD(t55,n4),label:QL(ID(t55,n4),xD(t55,n4),"state: unassigned")})})(t54,n3),iD(t54)||(((t55,e8)=>{let n4=t55.state.currentRouteId;if(n4===void 0||t55.solved)return;let o7=t55.problem.routeStartPort[n4],i6=t55.problem.routeEndPort[n4],s7=gD(t55,o7),r7=gD(t55,i6),a3=aD(t55,n4),c6=oD(t55,n4);e8.lines.push({points:[s7,r7],strokeColor:a3,strokeDash:"10 5",label:QL(c6,SD(t55,n4))})})(t54,n3),((t55,e8)=>{if(t55.solved)return;let n4=t55.state.currentRouteId,o7=t55.state.candidateQueue.toArray().sort((t56,e10)=>t56.f-e10.f).slice(0,10);for(let i8=0;i8<o7.length;i8++){let s8=o7[i8],r8=gD(t55,s8.portId),a3=i8===0;e8.points.push({x:r8.x,y:r8.y,color:a3?"green":"rgba(128, 128, 128, 0.25)",layer:yD(t55,s8.portId),label:QL(ID(t55,s8.portId,n4),xD(t55,s8.portId),`g: ${s8.g.toFixed(2)}`,`h: ${s8.h.toFixed(2)}`,`f: ${s8.f.toFixed(2)}`)})}let i6=o7[0];if(!i6)return;let s7=[],r7=i6;for(;r7;)s7.unshift(gD(t55,r7.portId)),r7=r7.prevCandidate;s7.length>1&&e8.lines.push({points:s7,strokeColor:n4!==void 0?aD(t55,n4):"rgba(0, 160, 120, 0.9)"})})(t54,n3));o6&&CD(t54,n3,o6),((t55,e8)=>{if(t55.failed)for(let n4 of t55.getNeverSuccessfullyRoutedRoutes()){let{routeId:o7,connectionId:i6,attempts:s7,startPortId:r7,endPortId:a3}=n4,c6=cD(t55,o7),l7=fD(t55,r7),h3=fD(t55,a3),d4=QL(`never routed: ${i6}`,`attempts: ${s7}`,c6,n4.startRegionId?`startRegionId: ${n4.startRegionId}`:void 0,n4.endRegionId?`endRegionId: ${n4.endRegionId}`:void 0);e8.lines.push({points:[{x:0,y:0},{x:l7.x,y:l7.y}],strokeColor:qL,strokeDash:KL,layer:yD(t55,r7),label:QL(d4,"origin guide","endpoint: start")}),e8.circles.push({center:l7,radius:1,fill:JL2,stroke:qL,layer:yD(t55,r7),label:QL(d4,"endpoint: start",_D(t55,r7),xD(t55,r7))}),e8.lines.push({points:[{x:0,y:0},{x:h3.x,y:h3.y}],strokeColor:qL,strokeDash:KL,layer:yD(t55,a3),label:QL(d4,"origin guide","endpoint: end")}),e8.circles.push({center:h3,radius:1,fill:JL2,stroke:qL,layer:yD(t55,a3),label:QL(d4,"endpoint: end",_D(t55,a3),xD(t55,a3))})}})(t54,n3);let s6=t54.state.unroutedRoutes.length+(t54.state.currentRouteId===void 0?0:1),r6=o6?o6.reduce((t55,e8)=>t55+ +(e8===1),0):0;return n3.title=["Tiny HyperGraph",`iter=${t54.iterations}`,`pending=${s6}`,o6?`sectionPorts=${r6}`:void 0,i3?`staticReachabilityFailed=${i3.size}`:void 0,t54.failed?"failed":t54.solved?"solved":"running"].filter(Boolean).join(" | "),n3},TD=5e4,wD=()=>({netIds:new Int32Array(0),lesserAngles:new Int32Array(0),greaterAngles:new Int32Array(0),layerMasks:new Int32Array(0),existingCrossingLayerIntersections:0,existingSameLayerIntersections:0,existingEntryExitLayerChanges:0,existingRegionCost:0,existingSegmentCount:0}),RD=t54=>({netIds:new Int32Array(t54.netIds),lesserAngles:new Int32Array(t54.lesserAngles),greaterAngles:new Int32Array(t54.greaterAngles),layerMasks:new Int32Array(t54.layerMasks),existingCrossingLayerIntersections:t54.existingCrossingLayerIntersections,existingSameLayerIntersections:t54.existingSameLayerIntersections,existingEntryExitLayerChanges:t54.existingEntryExitLayerChanges,existingRegionCost:t54.existingRegionCost,existingSegmentCount:t54.existingSegmentCount}),ED=t54=>{return{portAssignment:new Int32Array(t54.portAssignment),regionSegments:(e7=t54.regionSegments,e7.map(t55=>t55.map(([t56,e8,n3])=>[t56,e8,n3]))),regionIntersectionCaches:t54.regionIntersectionCaches.map(RD),regionCongestionCost:new Float64Array(t54.regionCongestionCost),ripCount:t54.ripCount};var e7},AD=(t54,e7)=>{e7&&(e7.minViaPadDiameter!==void 0&&(t54.minViaPadDiameter=e7.minViaPadDiameter),e7.DISTANCE_TO_COST!==void 0&&(t54.DISTANCE_TO_COST=e7.DISTANCE_TO_COST),e7.RIP_THRESHOLD_START!==void 0&&(t54.RIP_THRESHOLD_START=e7.RIP_THRESHOLD_START),e7.RIP_THRESHOLD_END!==void 0&&(t54.RIP_THRESHOLD_END=e7.RIP_THRESHOLD_END),e7.RIP_THRESHOLD_RAMP_ATTEMPTS!==void 0&&(t54.RIP_THRESHOLD_RAMP_ATTEMPTS=e7.RIP_THRESHOLD_RAMP_ATTEMPTS),e7.RIP_CONGESTION_REGION_COST_FACTOR!==void 0&&(t54.RIP_CONGESTION_REGION_COST_FACTOR=e7.RIP_CONGESTION_REGION_COST_FACTOR),e7.USE_LAZY_ROUTE_HEURISTIC!==void 0&&(t54.USE_LAZY_ROUTE_HEURISTIC=e7.USE_LAZY_ROUTE_HEURISTIC),e7.USE_SPARSE_CANDIDATE_STORAGE!==void 0&&(t54.USE_SPARSE_CANDIDATE_STORAGE=e7.USE_SPARSE_CANDIDATE_STORAGE),e7.MAX_ITERATIONS!==void 0&&(t54.MAX_ITERATIONS=e7.MAX_ITERATIONS),e7.VERBOSE!==void 0&&(t54.VERBOSE=e7.VERBOSE),e7.STATIC_REACHABILITY_PRECHECK!==void 0&&(t54.STATIC_REACHABILITY_PRECHECK=e7.STATIC_REACHABILITY_PRECHECK),e7.STATIC_REACHABILITY_PRECHECK_MAX_HOPS!==void 0&&(t54.STATIC_REACHABILITY_PRECHECK_MAX_HOPS=e7.STATIC_REACHABILITY_PRECHECK_MAX_HOPS),e7.ACCEPT_BEST_SOLUTION_ON_TIMEOUT!==void 0&&(t54.ACCEPT_BEST_SOLUTION_ON_TIMEOUT=e7.ACCEPT_BEST_SOLUTION_ON_TIMEOUT),e7.GREEDY_FINAL_ROUTE_ITERS!==void 0&&(t54.GREEDY_FINAL_ROUTE_ITERS=e7.GREEDY_FINAL_ROUTE_ITERS))},OD=t54=>({minViaPadDiameter:t54.minViaPadDiameter,DISTANCE_TO_COST:t54.DISTANCE_TO_COST,RIP_THRESHOLD_START:t54.RIP_THRESHOLD_START,RIP_THRESHOLD_END:t54.RIP_THRESHOLD_END,RIP_THRESHOLD_RAMP_ATTEMPTS:t54.RIP_THRESHOLD_RAMP_ATTEMPTS,RIP_CONGESTION_REGION_COST_FACTOR:t54.RIP_CONGESTION_REGION_COST_FACTOR,USE_LAZY_ROUTE_HEURISTIC:t54.USE_LAZY_ROUTE_HEURISTIC,USE_SPARSE_CANDIDATE_STORAGE:t54.USE_SPARSE_CANDIDATE_STORAGE,MAX_ITERATIONS:t54.MAX_ITERATIONS,VERBOSE:t54.VERBOSE,STATIC_REACHABILITY_PRECHECK:t54.STATIC_REACHABILITY_PRECHECK,STATIC_REACHABILITY_PRECHECK_MAX_HOPS:t54.STATIC_REACHABILITY_PRECHECK_MAX_HOPS,ACCEPT_BEST_SOLUTION_ON_TIMEOUT:t54.ACCEPT_BEST_SOLUTION_ON_TIMEOUT,GREEDY_FINAL_ROUTE_ITERS:t54.GREEDY_FINAL_ROUTE_ITERS}),LD=(t54,e7)=>t54.f-e7.f,DD=class extends Tt2{constructor(t54,e7,n3){super();__publicField(this,"topology");__publicField(this,"problem");__publicField(this,"state");__publicField(this,"_problemSetup");__publicField(this,"routeAttemptCountByRouteId");__publicField(this,"routeSuccessCountByRouteId");__publicField(this,"bestSolvedStateSnapshot");__publicField(this,"bestSolvedStateSummary");__publicField(this,"hasLoggedNeverSuccessfullyRoutedRoutes",!1);__publicField(this,"staticallyUnroutableRoutes",[]);__publicField(this,"segmentGeometryScratch",{lesserAngle:0,greaterAngle:0,layerMask:0,entryExitLayerChanges:0});__publicField(this,"DISTANCE_TO_COST",.05);__publicField(this,"minViaPadDiameter",CL);__publicField(this,"RIP_THRESHOLD_START",.05);__publicField(this,"RIP_THRESHOLD_END",.8);__publicField(this,"RIP_THRESHOLD_RAMP_ATTEMPTS",50);__publicField(this,"RIP_CONGESTION_REGION_COST_FACTOR",.1);__publicField(this,"USE_LAZY_ROUTE_HEURISTIC",!1);__publicField(this,"USE_SPARSE_CANDIDATE_STORAGE",!1);__publicField(this,"MAX_ITERATIONS",1e6);__publicField(this,"VERBOSE",!1);__publicField(this,"STATIC_REACHABILITY_PRECHECK",!0);__publicField(this,"STATIC_REACHABILITY_PRECHECK_MAX_HOPS",16);__publicField(this,"ACCEPT_BEST_SOLUTION_ON_TIMEOUT",!0);__publicField(this,"GREEDY_FINAL_ROUTE_ITERS",4);this.topology=t54,this.problem=e7,AD(this,n3),this.state={portAssignment:new Int32Array(t54.portCount).fill(-1),regionSegments:Array.from({length:t54.regionCount},()=>[]),regionIntersectionCaches:Array.from({length:t54.regionCount},()=>wD()),currentRouteId:void 0,currentRouteNetId:void 0,unroutedRoutes:FL(e7.routeCount),candidateQueue:new RL([],LD),candidateBestCostByHopId:this.USE_SPARSE_CANDIDATE_STORAGE?new Map:new Float64Array(t54.portCount*t54.regionCount),candidateBestCostGenerationByHopId:this.USE_SPARSE_CANDIDATE_STORAGE?new Map:new Uint32Array(t54.portCount*t54.regionCount),candidateBestCostGeneration:1,goalPortId:-1,ripCount:0,regionCongestionCost:new Float64Array(t54.regionCount).fill(0)},this.routeAttemptCountByRouteId=new Uint32Array(e7.routeCount),this.routeSuccessCountByRouteId=new Uint32Array(e7.routeCount)}get problemSetup(){return this._problemSetup||(this._problemSetup=this.computeProblemSetup()),this._problemSetup}computeProblemSetup(){let{topology:t54,problem:e7}=this,n3=this.USE_LAZY_ROUTE_HEURISTIC?void 0:new Float64Array(t54.portCount*e7.routeCount),o6=t54.portX,i3=t54.portY,s6=Array.from({length:t54.portCount},()=>new Set);for(let r6=0;r6<e7.routeCount;r6++)if(s6[e7.routeStartPort[r6]].add(e7.routeNet[r6]),s6[e7.routeEndPort[r6]].add(e7.routeNet[r6]),n3){let s7=e7.routeEndPort[r6],a3=o6[s7],c6=i3[s7];for(let s8=0;s8<t54.portCount;s8++){let t55=o6[s8]-a3,l7=i3[s8]-c6;n3[s8*e7.routeCount+r6]=Math.hypot(t55,l7)*this.DISTANCE_TO_COST}}return{portHCostToEndOfRoute:n3,portEndpointNetIds:s6}}_setup(){if(this.problemSetup,this.STATIC_REACHABILITY_PRECHECK){let t54=kL2({topology:this.topology,problem:this.problem,problemSetup:this.problemSetup,portAssignment:this.state.portAssignment,routeIds:this.state.unroutedRoutes,maxPrecheckHops:Math.max(0,this.STATIC_REACHABILITY_PRECHECK_MAX_HOPS),getStartingNextRegionId:(t55,e7)=>this.getStartingNextRegionId(t55,e7),getRouteSummary:t55=>this.getRouteSummary(t55)});this.staticallyUnroutableRoutes=t54,t54.length>0&&(this.failed=!0,this.error=(t55=>{let e7=t55.slice(0,5).map(t56=>{let e8=t56.pointIds.length>=2?`${t56.pointIds[0]}->${t56.pointIds[1]}`:`${t56.startPortId}->${t56.endPortId}`;return`${t56.connectionId} (${e8})`}).join(", "),n3=t55.length-5;return["Static reachability precheck failed:",`${t55.length} route(s) have no legal path under the current reservation and start-region rules`,n3>0?`${e7}, +${n3} more`:e7].join(" ")})(t54),this.stats={...this.stats,staticallyUnroutableRouteCount:t54.length})}}_step(){let{problem:t54,topology:e7,state:n3}=this;if(n3.currentRouteId===void 0){if(n3.unroutedRoutes.length===0)return void this.onAllRoutesRouted();n3.currentRouteId=n3.unroutedRoutes.shift(),n3.currentRouteNetId=t54.routeNet[n3.currentRouteId],this.routeAttemptCountByRouteId[n3.currentRouteId]+=1,this.resetCandidateBestCosts();let e8=t54.routeStartPort[n3.currentRouteId];n3.candidateQueue.clear();let o7=this.getStartingNextRegionId(n3.currentRouteId,e8);if(o7===void 0)return this.failed=!0,void(this.error=`Start port ${e8} has no incident regions`);this.setCandidateBestCost(this.getHopId(e8,o7),0),n3.candidateQueue.queue({nextRegionId:o7,portId:e8,f:0,g:0,h:0}),n3.goalPortId=t54.routeEndPort[n3.currentRouteId]}let o6=n3.candidateQueue.dequeue();if(!o6)return void this.onOutOfCandidates();let i3=this.getHopId(o6.portId,o6.nextRegionId);if(o6.g>this.getCandidateBestCost(i3)||this.isRegionReservedForDifferentNet(o6.nextRegionId))return;let s6=e7.regionIncidentPorts[o6.nextRegionId];for(let i6 of s6){let s7=n3.portAssignment[i6];if(this.isPortReservedForDifferentNet(i6))continue;if(i6===n3.goalPortId){if(s7!==-1&&s7!==n3.currentRouteNetId)continue;return void this.onPathFound(o6)}if(s7!==-1&&s7!==n3.currentRouteNetId||i6===o6.portId||t54.portSectionMask[i6]===0)continue;let r6=this.computeG(o6,i6);if(!Number.isFinite(r6))continue;let a3=this.computeH(i6),c6=e7.incidentPortRegion[i6][0]===o6.nextRegionId?e7.incidentPortRegion[i6][1]:e7.incidentPortRegion[i6][0];if(c6===void 0||this.isRegionReservedForDifferentNet(c6))continue;let l7={prevRegionId:o6.nextRegionId,nextRegionId:c6,portId:i6,g:r6,h:a3,f:r6+a3,prevCandidate:o6};if(i6===n3.goalPortId)return void this.onPathFound(l7);let h3=this.getHopId(i6,c6);r6>=this.getCandidateBestCost(h3)||(this.setCandidateBestCost(h3,r6),n3.candidateQueue.queue(l7))}}resetCandidateBestCosts(){let{state:t54}=this;if(t54.candidateBestCostGeneration===4294967295)return t54.candidateBestCostByHopId instanceof Map&&t54.candidateBestCostByHopId.clear(),t54.candidateBestCostGenerationByHopId instanceof Map?t54.candidateBestCostGenerationByHopId.clear():t54.candidateBestCostGenerationByHopId.fill(0),void(t54.candidateBestCostGeneration=1);t54.candidateBestCostGeneration+=1}getCandidateBestCost(t54){let{state:e7}=this,n3=e7.candidateBestCostGenerationByHopId;return(n3 instanceof Map?n3.get(t54):n3[t54])===e7.candidateBestCostGeneration?e7.candidateBestCostByHopId instanceof Map?e7.candidateBestCostByHopId.get(t54):e7.candidateBestCostByHopId[t54]:Number.POSITIVE_INFINITY}setCandidateBestCost(t54,e7){let{state:n3}=this;n3.candidateBestCostGenerationByHopId instanceof Map?n3.candidateBestCostGenerationByHopId.set(t54,n3.candidateBestCostGeneration):n3.candidateBestCostGenerationByHopId[t54]=n3.candidateBestCostGeneration,n3.candidateBestCostByHopId instanceof Map?n3.candidateBestCostByHopId.set(t54,e7):n3.candidateBestCostByHopId[t54]=e7}getHopId(t54,e7){return t54*this.topology.regionCount+e7}getStartingNextRegionId(t54,e7){let n3=this.topology.incidentPortRegion[e7]??[],o6=this.problem.routeNet[t54];return n3.find(t55=>this.problem.regionNetId[t55]===-1)??n3.find(t55=>this.problem.regionNetId[t55]===o6)??n3[0]}isPortReservedForDifferentNet(t54){let e7=this.problemSetup.portEndpointNetIds[t54];if(!e7)return!1;for(let t55 of e7)if(t55!==this.state.currentRouteNetId)return!0;return!1}isRegionReservedForDifferentNet(t54){let e7=this.problem.regionNetId[t54];return e7!==-1&&e7!==this.state.currentRouteNetId}isKnownSingleLayerRegion(t54){let e7=this.topology.regionAvailableZMask?.[t54]??0;return NL(e7)}computeRegionCostForRegion(t54,e7,n3,o6,i3){return((t55,e8,n4,o7,i6,s6,r6=0,a3=.3)=>TL(t55*e8,n4,o7,i6,s6,r6,a3))(this.topology.regionWidth[t54],this.topology.regionHeight[t54],e7,n3,o6,i3,this.topology.regionAvailableZMask?.[t54]??0,this.minViaPadDiameter)}populateSegmentGeometryScratch(t54,e7,n3){let{topology:o6}=this,i3=this.segmentGeometryScratch,s6=o6.incidentPortRegion[e7],r6=o6.incidentPortRegion[n3],a3=s6[0]===t54||s6[1]!==t54?o6.portAngleForRegion1[e7]:o6.portAngleForRegion2?.[e7]??o6.portAngleForRegion1[e7],c6=r6[0]===t54||r6[1]!==t54?o6.portAngleForRegion1[n3]:o6.portAngleForRegion2?.[n3]??o6.portAngleForRegion1[n3],l7=o6.portZ[e7],h3=o6.portZ[n3];return i3.lesserAngle=a3<c6?a3:c6,i3.greaterAngle=a3<c6?c6:a3,i3.layerMask=1<<l7|1<<h3,i3.entryExitLayerChanges=l7!==h3?1:0,i3}appendSegmentToRegionCache(t54,e7,n3){let{state:o6}=this,i3=o6.regionIntersectionCaches[t54],s6=this.populateSegmentGeometryScratch(t54,e7,n3),[r6,a3,c6]=wL(i3,o6.currentRouteNetId,s6.lesserAngle,s6.greaterAngle,s6.layerMask,s6.entryExitLayerChanges),l7=i3.netIds.length+1,h3=new Int32Array(l7);h3.set(i3.netIds),h3[l7-1]=o6.currentRouteNetId;let d4=new Int32Array(l7);d4.set(i3.lesserAngles),d4[l7-1]=s6.lesserAngle;let u6=new Int32Array(l7);u6.set(i3.greaterAngles),u6[l7-1]=s6.greaterAngle;let p5=new Int32Array(l7);p5.set(i3.layerMasks),p5[l7-1]=s6.layerMask;let m4=i3.existingSameLayerIntersections+r6,g4=i3.existingCrossingLayerIntersections+a3,f4=i3.existingEntryExitLayerChanges+c6,y3=d4.length;o6.regionIntersectionCaches[t54]={netIds:h3,lesserAngles:d4,greaterAngles:u6,layerMasks:p5,existingSameLayerIntersections:m4,existingCrossingLayerIntersections:g4,existingEntryExitLayerChanges:f4,existingSegmentCount:y3,existingRegionCost:this.computeRegionCostForRegion(t54,m4,g4,f4,y3)}}getSolvedPathSegments(t54){let{state:e7}=this,n3=[],o6=t54;for(;o6;)n3.unshift(o6),o6=o6.prevCandidate;let i3=[];for(let t55=1;t55<n3.length;t55++)i3.push({regionId:n3[t55-1].nextRegionId,fromPortId:n3[t55-1].portId,toPortId:n3[t55].portId});let s6=n3[n3.length-1];return s6&&s6.portId!==e7.goalPortId&&i3.push({regionId:s6.nextRegionId,fromPortId:s6.portId,toPortId:e7.goalPortId}),i3}resetRoutingStateForRerip(){let{topology:t54,problem:e7,state:n3}=this;n3.portAssignment.fill(-1),n3.regionSegments=Array.from({length:t54.regionCount},()=>[]),n3.regionIntersectionCaches=Array.from({length:t54.regionCount},()=>wD()),n3.currentRouteNetId=void 0,n3.currentRouteId=void 0,n3.unroutedRoutes=EL(FL(e7.routeCount),n3.ripCount),n3.candidateQueue.clear(),this.resetCandidateBestCosts(),n3.goalPortId=-1}getMaxRegionCost(){let{topology:t54,state:e7}=this,n3=0;for(let o6=0;o6<t54.regionCount;o6++){let t55=e7.regionIntersectionCaches[o6]?.existingRegionCost??0;n3=Math.max(n3,t55)}return n3}getRouteMetadata(t54){return this.problem.routeMetadata?.[t54]}getRouteConnectionId(t54){let e7=this.getRouteMetadata(t54)?.connectionId;return typeof e7=="string"?e7:`route-${t54}`}getRouteSummary(t54){return(({problem:t55,routeId:e7,getRouteMetadata:n3,getRouteConnectionId:o6})=>{let i3=n3?.(e7)??AL(t55,e7);return{routeId:e7,connectionId:o6?.(e7)??LL(t55,e7),startPortId:t55.routeStartPort[e7],endPortId:t55.routeEndPort[e7],startRegionId:typeof i3?.startRegionId=="string"?i3.startRegionId:void 0,endRegionId:typeof i3?.endRegionId=="string"?i3.endRegionId:void 0,pointIds:OL2(i3)}})({problem:this.problem,routeId:t54,getRouteMetadata:t55=>this.getRouteMetadata(t55),getRouteConnectionId:t55=>this.getRouteConnectionId(t55)})}getAdditionalRegionLabel(t54){}getNeverSuccessfullyRoutedRoutes(){let t54=[];for(let e7=0;e7<this.problem.routeCount;e7++){let n3=this.routeAttemptCountByRouteId[e7];n3===0||this.routeSuccessCountByRouteId[e7]>0||t54.push({...this.getRouteSummary(e7),attempts:n3})}return t54}getStaticallyUnroutableRoutes(){return this.staticallyUnroutableRoutes}logNeverSuccessfullyRoutedRoutes(){if(!this.VERBOSE||this.hasLoggedNeverSuccessfullyRoutedRoutes)return;let t54=this.getNeverSuccessfullyRoutedRoutes();if(this.hasLoggedNeverSuccessfullyRoutedRoutes=!0,t54.length!==0){console.log(["[TinyHyperGraphSolver:never-routed-summary]",`count=${t54.length}`].join(" "));for(let e7 of t54){let t55=e7.pointIds.length>=2?`${e7.pointIds[0]}->${e7.pointIds[1]}`:"unknown";console.log(["[TinyHyperGraphSolver:never-routed]",`routeId=${e7.routeId}`,`connectionId=${e7.connectionId}`,`attempts=${e7.attempts}`,`pointPath=${t55}`,`startRegionId=${e7.startRegionId??"unknown"}`,`endRegionId=${e7.endRegionId??"unknown"}`].join(" "))}}}logRipEvent(t54,e7,n3={}){this.VERBOSE&&console.log(["[TinyHyperGraphSolver:rip]",`ripCount=${this.state.ripCount}`,`maxRegionCostBeforeRip=${e7.toFixed(3)}`,`reason=${t54}`,...Object.entries(n3).map(([t55,e8])=>`${t55}=${typeof e8=="number"?Number.isInteger(e8)?String(e8):e8.toFixed(3):e8}`)].join(" "))}compareRegionCostSummaries(t54,e7){return t54.maxRegionCost!==e7.maxRegionCost?t54.maxRegionCost-e7.maxRegionCost:t54.totalRegionCost-e7.totalRegionCost}captureBestSolvedState(t54){this.bestSolvedStateSummary&&this.compareRegionCostSummaries(t54,this.bestSolvedStateSummary)>=0||(this.bestSolvedStateSummary=t54,this.bestSolvedStateSnapshot=ED({portAssignment:this.state.portAssignment,regionSegments:this.state.regionSegments,regionIntersectionCaches:this.state.regionIntersectionCaches,regionCongestionCost:this.state.regionCongestionCost,ripCount:this.state.ripCount}))}restoreBestSolvedState(){if(!this.bestSolvedStateSnapshot)return;let t54=ED(this.bestSolvedStateSnapshot);this.state.portAssignment=t54.portAssignment,this.state.regionSegments=t54.regionSegments,this.state.regionIntersectionCaches=t54.regionIntersectionCaches,this.state.regionCongestionCost=t54.regionCongestionCost,this.state.ripCount=t54.ripCount,this.state.currentRouteId=void 0,this.state.currentRouteNetId=void 0,this.state.unroutedRoutes=[],this.state.candidateQueue.clear(),this.resetCandidateBestCosts(),this.state.goalPortId=-1}getRemainingRouteIdsForGreedyFinalRoute(){let t54=new Set(this.state.unroutedRoutes);return this.state.currentRouteId!==void 0&&t54.add(this.state.currentRouteId),[...t54]}applySnapshotToGreedyFinalRouteSolver(t54,e7,n3){let o6=ED(e7);t54.state.portAssignment=o6.portAssignment,t54.state.regionSegments=o6.regionSegments,t54.state.regionIntersectionCaches=o6.regionIntersectionCaches,t54.state.regionCongestionCost=o6.regionCongestionCost,t54.state.ripCount=0,t54.state.currentRouteId=void 0,t54.state.currentRouteNetId=void 0,t54.state.unroutedRoutes=[...n3],t54.state.candidateQueue.clear(),t54.resetCandidateBestCosts(),t54.state.goalPortId=-1}summarizeSolvedState(t54){let e7=0,n3=0;for(let o6 of t54.state.regionIntersectionCaches){let t55=o6.existingRegionCost;e7=Math.max(e7,t55),n3+=t55}return{maxRegionCost:e7,totalRegionCost:n3}}tryGreedyFinalRouteAcceptance(){let t54=Math.max(0,Math.floor(this.GREEDY_FINAL_ROUTE_ITERS));if(t54===0)return!1;let e7=this.getRemainingRouteIdsForGreedyFinalRoute();if(e7.length===0)return!1;let n3=ED({portAssignment:this.state.portAssignment,regionSegments:this.state.regionSegments,regionIntersectionCaches:this.state.regionIntersectionCaches,regionCongestionCost:this.state.regionCongestionCost,ripCount:this.state.ripCount});for(let o6=0;o6<t54;o6++){let t55=o6===0?e7:EL(e7,this.state.ripCount+o6),i3=new zD(this.topology,this.problem,{...OD(this),ACCEPT_BEST_SOLUTION_ON_TIMEOUT:!1,GREEDY_FINAL_ROUTE_ITERS:0,MAX_ITERATIONS:TD,RIP_THRESHOLD_RAMP_ATTEMPTS:0,STATIC_REACHABILITY_PRECHECK:!1});if(this.applySnapshotToGreedyFinalRouteSolver(i3,n3,t55),i3.solve(),i3.solved&&!i3.failed)return this.bestSolvedStateSnapshot=ED({portAssignment:i3.state.portAssignment,regionSegments:i3.state.regionSegments,regionIntersectionCaches:i3.state.regionIntersectionCaches,regionCongestionCost:i3.state.regionCongestionCost,ripCount:i3.state.ripCount}),this.bestSolvedStateSummary=this.summarizeSolvedState(i3),this.restoreBestSolvedState(),this.stats={...this.stats,acceptedGreedyFinalRouteOnTimeout:!0,greedyFinalRouteIter:o6,greedyFinalRouteRemainingRouteCount:e7.length,greedyFinalRouteMaxIterations:TD,neverSuccessfullyRoutedRouteCount:0,maxRegionCost:this.bestSolvedStateSummary.maxRegionCost,totalRegionCost:this.bestSolvedStateSummary.totalRegionCost,bestMaxRegionCost:this.bestSolvedStateSummary.maxRegionCost,bestTotalRegionCost:this.bestSolvedStateSummary.totalRegionCost},this.solved=!0,this.failed=!1,this.error=null,!0}return this.stats={...this.stats,greedyFinalRouteAttemptCount:t54,greedyFinalRouteRemainingRouteCount:e7.length,greedyFinalRouteMaxIterations:TD},!1}onAllRoutesRouted(){let{topology:t54,state:e7}=this,n3=this.RIP_THRESHOLD_RAMP_ATTEMPTS<=0?1:Math.min(1,e7.ripCount/this.RIP_THRESHOLD_RAMP_ATTEMPTS),o6=this.RIP_THRESHOLD_START+(this.RIP_THRESHOLD_END-this.RIP_THRESHOLD_START)*n3,i3=[],s6=new Float64Array(t54.regionCount),r6=0,a3=0;for(let n4=0;n4<t54.regionCount;n4++){let t55=e7.regionIntersectionCaches[n4]?.existingRegionCost??0;s6[n4]=t55,r6=Math.max(r6,t55),a3+=t55,t55>o6&&i3.push(n4)}if(this.captureBestSolvedState({maxRegionCost:r6,totalRegionCost:a3}),this.stats={...this.stats,currentRipThreshold:o6,hotRegionCount:i3.length,maxRegionCost:r6,totalRegionCost:a3,bestMaxRegionCost:this.bestSolvedStateSummary?.maxRegionCost,bestTotalRegionCost:this.bestSolvedStateSummary?.totalRegionCost,ripCount:e7.ripCount},i3.length===0||e7.ripCount>=this.RIP_THRESHOLD_RAMP_ATTEMPTS)this.solved=!0;else{for(let n4=0;n4<t54.regionCount;n4++)e7.regionCongestionCost[n4]+=s6[n4]*this.RIP_CONGESTION_REGION_COST_FACTOR;e7.ripCount+=1,this.resetRoutingStateForRerip(),this.stats={...this.stats,ripCount:e7.ripCount,maxRegionCostBeforeRip:r6,reripRegionCount:i3.length},this.logRipEvent("hot_regions",r6,{hotRegionCount:i3.length,currentRipThreshold:o6})}}onOutOfCandidates(){let{topology:t54,state:e7}=this,n3=e7.currentRouteId,o6=this.getMaxRegionCost();for(let n4=0;n4<t54.regionCount;n4++){let t55=e7.regionIntersectionCaches[n4]?.existingRegionCost??0;e7.regionCongestionCost[n4]+=t55*this.RIP_CONGESTION_REGION_COST_FACTOR}e7.ripCount+=1,this.resetRoutingStateForRerip(),this.stats={...this.stats,ripCount:e7.ripCount,maxRegionCost:o6,maxRegionCostBeforeRip:o6,reripReason:"out_of_candidates"},this.logRipEvent("out_of_candidates",o6,{...n3===void 0?{}:{routeId:n3,connectionId:this.getRouteConnectionId(n3)}})}onPathFound(t54){let{state:e7}=this,n3=e7.currentRouteId;if(n3===void 0)return;this.routeSuccessCountByRouteId[n3]+=1;let o6=this.getSolvedPathSegments(t54);for(let{regionId:t55,fromPortId:i3,toPortId:s6}of o6)e7.regionSegments[t55].push([n3,i3,s6]),e7.portAssignment[i3]=e7.currentRouteNetId,e7.portAssignment[s6]=e7.currentRouteNetId,this.appendSegmentToRegionCache(t55,i3,s6);e7.candidateQueue.clear(),e7.currentRouteNetId=void 0,e7.currentRouteId=void 0}computeG(t54,e7){let{state:n3}=this,o6=t54.nextRegionId,i3=n3.regionIntersectionCaches[o6],s6=this.populateSegmentGeometryScratch(o6,t54.portId,e7),[r6,a3,c6]=wL(i3,n3.currentRouteNetId,s6.lesserAngle,s6.greaterAngle,s6.layerMask,s6.entryExitLayerChanges);if(r6>0&&this.isKnownSingleLayerRegion(o6))return Number.POSITIVE_INFINITY;let l7=this.computeRegionCostForRegion(o6,i3.existingSameLayerIntersections+r6,i3.existingCrossingLayerIntersections+a3,i3.existingEntryExitLayerChanges+c6,i3.existingSegmentCount+1)-i3.existingRegionCost;return t54.g+l7+n3.regionCongestionCost[o6]+(this.problem.portPenalty?.[e7]??0)}tryFinalAcceptance(){let t54=this.getNeverSuccessfullyRoutedRoutes();if(this.stats={...this.stats,neverSuccessfullyRoutedRouteCount:t54.length},this.ACCEPT_BEST_SOLUTION_ON_TIMEOUT&&this.bestSolvedStateSnapshot&&this.bestSolvedStateSummary)return this.restoreBestSolvedState(),this.stats={...this.stats,acceptedBestSolutionOnTimeout:!0,maxRegionCost:this.bestSolvedStateSummary.maxRegionCost,totalRegionCost:this.bestSolvedStateSummary.totalRegionCost,bestMaxRegionCost:this.bestSolvedStateSummary.maxRegionCost,bestTotalRegionCost:this.bestSolvedStateSummary.totalRegionCost},this.solved=!0,this.failed=!1,void(this.error=null);this.ACCEPT_BEST_SOLUTION_ON_TIMEOUT&&this.tryGreedyFinalRouteAcceptance()||this.logNeverSuccessfullyRoutedRoutes()}computeH(t54){let e7=this.problemSetup.portHCostToEndOfRoute;if(e7)return e7[t54*this.problem.routeCount+this.state.currentRouteId];let n3=this.problem.routeEndPort[this.state.currentRouteId],o6=this.topology.portX[t54]-this.topology.portX[n3],i3=this.topology.portY[t54]-this.topology.portY[n3];return Math.hypot(o6,i3)*this.DISTANCE_TO_COST}visualize(){return ND(this)}getOutput(){return ML(this)}},zD=class extends DD{computeG(t54,e7){return t54.g}},kD=t54=>{let e7=typeof t54.d?.netId=="number"?t54.d.netId:typeof t54.d?.NetId=="number"?t54.d.NetId:void 0;return Number.isFinite(e7)?e7:void 0},FD=t54=>{let e7=new Set;for(let n4 of t54.connections??[])e7.add(n4.startRegionId),e7.add(n4.endRegionId);let n3=new Set(t54.regions.filter(t55=>(t56=>{if(t56.d?._containsObstacle!==!0)return!1;if(t56.d?._containsTarget!==!0)return!0;let e8=kD(t56);return e8===void 0||e8===-1})(t55)&&!e7.has(t55.regionId)).map(t55=>t55.regionId));if(n3.size===0)return t54;let o6=t54.ports.filter(t55=>!n3.has(t55.region1Id)&&!n3.has(t55.region2Id)),i3=(t54.connections??[]).find(t55=>n3.has(t55.startRegionId)||n3.has(t55.endRegionId));if(i3)throw new Error(`Connection "${i3.connectionId}" references full-obstacle region`);return{...t54,regions:t54.regions.filter(t55=>!n3.has(t55.regionId)),ports:o6}},jD=t54=>{let e7=t54.d?.bounds;if(e7)return e7;let n3=t54.d?.center,o6=t54.d?.width,i3=t54.d?.height;return n3&&typeof n3.x=="number"&&typeof n3.y=="number"&&typeof o6=="number"&&typeof i3=="number"?{minX:n3.x-o6/2,maxX:n3.x+o6/2,minY:n3.y-i3/2,maxY:n3.y+i3/2}:{minX:0,maxX:0,minY:0,maxY:0}},YD=t54=>Number(t54.d?.x??0),XD=t54=>Number(t54.d?.y??0),$D=(t54,e7)=>{if(!e7)return 0;let n3=jD(e7),o6=YD(t54),i3=XD(t54),s6=n3.minX<=o6&&o6<=n3.maxX,r6=n3.minY<=i3&&i3<=n3.maxY;if(r6&&o6>=n3.maxX){let t55=Math.max(n3.maxY-n3.minY,1e-9),e8=(i3-n3.minY)/t55;return Math.round(9e3*e8)}if(s6&&i3>=n3.maxY){let t55=Math.max(n3.maxX-n3.minX,1e-9),e8=(n3.maxX-o6)/t55;return 9e3+Math.round(9e3*e8)}if(r6&&o6<=n3.minX){let t55=Math.max(n3.maxY-n3.minY,1e-9),e8=(n3.maxY-i3)/t55;return 18e3+Math.round(9e3*e8)}if(s6&&i3<=n3.minY){let t55=Math.max(n3.maxX-n3.minX,1e-9),e8=(o6-n3.minX)/t55;return 27e3+Math.round(9e3*e8)}let a3=Math.abs(o6-n3.minX),c6=Math.abs(o6-n3.maxX),l7=Math.abs(i3-n3.minY),h3=Math.abs(i3-n3.maxY),d4=Math.min(a3,c6,l7,h3),u6=Math.max(n3.maxX-n3.minX,1e-9),p5=Math.max(n3.maxY-n3.minY,1e-9);if(d4===c6){let t55=(i3-n3.minY)/p5;return Math.round(9e3*t55)}if(d4===h3){let t55=(n3.maxX-o6)/u6;return 9e3+Math.round(9e3*t55)}if(d4===a3){let t55=(n3.maxY-i3)/p5;return 18e3+Math.round(9e3*t55)}let m4=(o6-n3.minX)/u6;return 27e3+Math.round(9e3*m4)},BD=(t54,e7)=>{if(t54)return[...t54.pointIds].sort((t55,n3)=>{let o6=e7.get(t55),i3=e7.get(n3),s6=Number(o6?.d?.distToCentermostPortOnZ??Number.POSITIVE_INFINITY),r6=Number(i3?.d?.distToCentermostPortOnZ??Number.POSITIVE_INFINITY);if(s6!==r6)return s6-r6;let a3=Number(o6?.d?.z??0),c6=Number(i3?.d?.z??0);return a3!==c6?a3-c6:t55.localeCompare(n3)})[0]},HD=t54=>{let e7=FD(t54),n3=new Map,o6=new Map,i3=new Map,s6=new Map((e7.solvedRoutes??[]).map(t55=>[t55.connection.connectionId,t55]));e7.regions.forEach((t55,e8)=>{n3.set(t55.regionId,e8)}),e7.ports.forEach((t55,e8)=>{o6.set(t55.portId,e8),i3.set(t55.portId,t55)});let r6=e7.regions.length,a3=e7.ports.length,c6=e7.regions.map(t55=>t55.pointIds.map(t56=>o6.get(t56)).filter(t56=>t56!==void 0)),l7=Array.from({length:a3},()=>[]),h3=new Float64Array(r6),d4=new Float64Array(r6),u6=new Float64Array(r6),p5=new Float64Array(r6),m4=new Int32Array(r6),g4=new Int32Array(r6).fill(-1),f4=new Int8Array(r6);e7.regions.forEach((t55,e8)=>{let n4=(t56=>{let e10=jD(t56),n5=typeof t56.d?.width=="number"?t56.d.width:e10.maxX-e10.minX,o8=typeof t56.d?.height=="number"?t56.d.height:e10.maxY-e10.minY;return{centerX:typeof t56.d?.center?.x=="number"?t56.d.center.x:(e10.minX+e10.maxX)/2,centerY:typeof t56.d?.center?.y=="number"?t56.d.center.y:(e10.minY+e10.maxY)/2,width:n5,height:o8}})(t55);h3[e8]=n4.width,d4[e8]=n4.height,u6[e8]=n4.centerX,p5[e8]=n4.centerY,m4[e8]=(t56=>{let e10=t56.d?.availableZ;if(!Array.isArray(e10))return 0;let n5=0;for(let t57 of e10)!Number.isInteger(t57)||t57<0||t57>=31||(n5|=1<<t57);return n5})(t55);let o7=kD(t55);o7!==void 0&&(g4[e8]=o7,f4[e8]=1)});let y3=new Int32Array(a3),_3=new Int32Array(a3),b4=new Float64Array(a3),x4=new Float64Array(a3),v3=new Int32Array(a3);e7.ports.forEach((t55,o7)=>{let i6=n3.get(t55.region1Id),s7=n3.get(t55.region2Id);if(i6===void 0||s7===void 0)throw new Error(`Port "${t55.portId}" references missing regions "${t55.region1Id}" or "${t55.region2Id}"`);l7[o7]=[i6,s7],b4[o7]=YD(t55),x4[o7]=XD(t55),v3[o7]=(t56=>{let e8=Number(t56.d?.z??0);return Number.isFinite(e8)?e8:0})(t55),y3[o7]=$D(t55,e7.regions[i6]),_3[o7]=$D(t55,e7.regions[s7])});let S7=e7.regions.map((t55,e8)=>((t56,e10)=>{let n4=t56.d&&typeof t56.d=="object"&&!Array.isArray(t56.d)?{...t56.d}:{value:t56.d};return n4.layer=e10,Object.defineProperty(n4,"serializedRegionId",{value:t56.regionId,enumerable:!1,configurable:!0,writable:!0}),n4})(t55,(t56=>gL(fL(m4[t56]))??gL((c6[t56]??[]).map(t57=>v3[t57]))??"z0")(e8))),I4=e7.ports.map((t55,e8)=>((t56,e10)=>{let n4=t56.d&&typeof t56.d=="object"&&!Array.isArray(t56.d)?{...t56.d}:{value:t56.d};return n4.layer=e10,Object.defineProperty(n4,"serializedPortId",{value:t56.portId,enumerable:!1,configurable:!0,writable:!0}),n4})(t55,gL([v3[e8]])??"z0")),P6=e7.connections??[],M5=new Map,C6=0,N3=t55=>{let e8=t55.mutuallyConnectedNetworkId??t55.connectionId,n4=M5.get(e8);return n4===void 0&&(n4=C6++,M5.set(e8,n4)),n4},T6=Array.from({length:r6},()=>new Set),w4=(t55,e8)=>{let o7=n3.get(t55);if(o7===void 0)throw new Error(`Connection references missing region "${t55}"`);T6[o7].add(e8)};P6.forEach(t55=>{let e8=N3(t55);w4(t55.startRegionId,e8),w4(t55.endRegionId,e8)}),T6.forEach((t55,e8)=>{f4[e8]!==1&&t55.size===1&&(g4[e8]=[...t55][0])});let R6=P6.map(t55=>{let n4=s6.get(t55.connectionId),o7=((t56,e8)=>t56.ports.filter(t57=>t57.region1Id===e8.startRegionId&&t57.region2Id===e8.endRegionId||t57.region2Id===e8.startRegionId&&t57.region1Id===e8.endRegionId).map(t57=>t57.portId))(e7,t55);return{connection:t55,solvedRoute:n4,sharedPortIds:o7}}).filter(({solvedRoute:t55,sharedPortIds:e8})=>e8.length===0||(t55?.path.length??0)>1),E4=R6.length,A7=new Int8Array(a3).fill(1),O3=new Int32Array(E4),L5=new Int32Array(E4),D4=new Int32Array(E4);R6.forEach(({connection:t55,solvedRoute:n4},s7)=>{let r7=BD(e7.regions.find(e8=>e8.regionId===t55.startRegionId),i3),a4=BD(e7.regions.find(e8=>e8.regionId===t55.endRegionId),i3),c7=n4?.path[0]?.portId??r7,l10=n4?.path[n4.path.length-1]?.portId??a4,h4=c7!==void 0?o6.get(c7):void 0,d6=l10!==void 0?o6.get(l10):void 0;if(h4===void 0||d6===void 0)throw new Error(`Connection "${t55.connectionId}" could not be mapped to route endpoints`);O3[s7]=h4,L5[s7]=d6,D4[s7]=N3(t55)});let z5={portCount:a3,regionCount:r6,regionIncidentPorts:c6,incidentPortRegion:l7,regionWidth:h3,regionHeight:d4,regionCenterX:u6,regionCenterY:p5,regionAvailableZMask:m4,regionMetadata:S7,portAngleForRegion1:y3,portAngleForRegion2:_3,portX:b4,portY:x4,portZ:v3,portMetadata:I4},k5={routeCount:E4,portSectionMask:A7,routeMetadata:R6.map(({connection:t55})=>t55),routeStartPort:O3,routeEndPort:L5,routeNet:D4,regionNetId:g4},F7=[],j5=[];for(let{solvedRoute:t55}of R6){if(!t55){F7.push([]),j5.push([]);continue}let e8=[],i6=[];for(let s7=1;s7<t55.path.length;s7++){let r7=t55.path[s7-1],a4=t55.path[s7],c7=r7?.portId,l10=a4?.portId,h4=c7!==void 0?o6.get(c7):void 0,d6=l10!==void 0?o6.get(l10):void 0;if(h4===void 0||d6===void 0)continue;let u10=typeof r7?.nextRegionId=="string"?r7.nextRegionId:typeof a4?.lastRegionId=="string"?a4.lastRegionId:void 0;e8.push([h4,d6]),i6.push(u10!==void 0?n3.get(u10):void 0)}F7.push(e8),j5.push(i6)}return{topology:z5,problem:k5,solution:{solvedRoutePathSegments:F7,solvedRoutePathRegionIds:j5}}},WD=t54=>typeof t54=="object"&&t54!==null,VD=t54=>Array.isArray(t54)?t54.map(t55=>VD(t55)):WD(t54)?Object.fromEntries(Object.entries(t54).map(([t55,e7])=>[t55,VD(e7)])):t54,UD=t54=>WD(t54)?{...t54}:t54===void 0?{}:{value:t54},GD=(t54,e7=0)=>typeof t54=="number"&&Number.isFinite(t54)?t54:e7,ZD=t54=>({x:GD(t54.d?.x),y:GD(t54.d?.y)}),qD=t54=>[t54.region1Id,t54.region2Id].sort().join("\0"),JD=(t54,e7)=>Math.hypot(t54.x-e7.x,t54.y-e7.y),KD=t54=>{let e7=Math.hypot(t54.x,t54.y);if(!(e7<=1e-9))return{x:t54.x/e7,y:t54.y/e7}},QD=t54=>{let e7=t54?.d?.center;if(WD(e7))return{x:GD(e7.x),y:GD(e7.y)};let n3=(t55=>{let e8=t55?.d?.bounds;if(WD(e8)&&typeof e8.minX=="number"&&typeof e8.maxX=="number"&&typeof e8.minY=="number"&&typeof e8.maxY=="number")return{minX:e8.minX,maxX:e8.maxX,minY:e8.minY,maxY:e8.maxY};let n4=t55?.d?.center,o6=GD(t55?.d?.width),i3=GD(t55?.d?.height);if(WD(n4)){let t56=GD(n4.x),e10=GD(n4.y);return{minX:t56-o6/2,maxX:t56+o6/2,minY:e10-i3/2,maxY:e10+i3/2}}return{minX:0,maxX:0,minY:0,maxY:0}})(t54);return{x:(n3.minX+n3.maxX)/2,y:(n3.minY+n3.maxY)/2}},tz=(t54,e7)=>{let n3=qD(t54),o6=ZD(t54),i3,s6=Number.POSITIVE_INFINITY;for(let r6 of e7){if(r6.portId===t54.portId||qD(r6)!==n3)continue;let e8=JD(o6,ZD(r6));e8<=1e-9||e8>=s6||(i3=r6,s6=e8)}return i3},ez=(t54,e7,n3)=>{let o6=ZD(t54);if(e7){let t55=ZD(e7),n4=KD({x:o6.x-t55.x,y:o6.y-t55.y});if(n4)return n4}return((t55,e8)=>{let n4=QD(e8.get(t55.region1Id)),o7=QD(e8.get(t55.region2Id));return KD({x:-(o7.y-n4.y),y:o7.x-n4.x})??{x:1,y:0}})(t54,n3)},nz=(t54,e7,n3)=>{let o6=`${t54}::dup${e7}`;if(!n3.has(o6))return n3.add(o6),o6;for(let t55=2;;t55++){let e8=`${o6}-${t55}`;if(!n3.has(e8))return n3.add(e8),e8}},oz=(t54,e7,n3)=>{let o6=t54.indexOf(e7);o6!==-1?t54.splice(o6+1,0,...n3):t54.push(...n3)},iz=(t54,e7)=>{let n3=t54.portMetadata?.[e7];if(WD(n3)){if(typeof n3.serializedPortId=="string")return n3.serializedPortId;if(typeof n3.portId=="string")return n3.portId}return`port-${e7}`},sz=(t54,e7)=>({routeCount:1,portSectionMask:new Int8Array(t54.portSectionMask),routeMetadata:t54.routeMetadata===void 0?void 0:[t54.routeMetadata[e7]],routeStartPort:Int32Array.from([t54.routeStartPort[e7]]),routeEndPort:Int32Array.from([t54.routeEndPort[e7]]),routeNet:Int32Array.from([t54.routeNet[e7]]),regionNetId:new Int32Array(t54.regionNetId),portPenalty:t54.portPenalty===void 0?void 0:new Float64Array(t54.portPenalty)}),rz=t54=>{let e7=new Set;for(let n3 of t54.state.regionSegments)for(let[,t55,o6]of n3)e7.add(t55),e7.add(o6);return e7.size===0&&t54.problem.routeCount===1&&(e7.add(t54.problem.routeStartPort[0]),e7.add(t54.problem.routeEndPort[0])),e7},az=class extends Tt2{constructor(t54,e7={}){super();__publicField(this,"serializedHyperGraph");__publicField(this,"options");__publicField(this,"revisedSerializedHyperGraph");__publicField(this,"report",{portUseCounts:{},duplicatedPorts:[]});this.serializedHyperGraph=t54,this.options=e7}getDuplicatePortProximity(){return this.options.duplicatePortProximity??.05}getIndividualRouteSolveOptions(){return{RIP_THRESHOLD_RAMP_ATTEMPTS:0,STATIC_REACHABILITY_PRECHECK:!1,...this.options.routeSolveOptions}}getPortUseCounts(){let{topology:t54,problem:e7}=HD(this.serializedHyperGraph),n3=new Map;for(let o6=0;o6<e7.routeCount;o6++){let i3=sz(e7,o6),s6=new DD(t54,i3,this.getIndividualRouteSolveOptions());if(s6.solve(),!s6.solved||s6.failed)throw new Error(`Route ${o6} could not be solved independently: ${s6.error??"unknown error"}`);for(let e8 of rz(s6)){let o7=iz(t54,e8);n3.set(o7,(n3.get(o7)??0)+1)}}return n3}duplicateCongestedPorts(t54){let e7=this.getDuplicatePortProximity();if(!(e7>0))throw new Error("duplicatePortProximity must be greater than zero");let{solvedRoutes:n3,...o6}=this.serializedHyperGraph,i3=this.serializedHyperGraph.regions.map(t55=>({...t55,pointIds:[...t55.pointIds],d:VD(t55.d)})),s6=this.serializedHyperGraph.ports.map(t55=>({...t55,d:VD(t55.d)})),r6=new Map(i3.map(t55=>[t55.regionId,t55])),a3=new Map(s6.map(t55=>[t55.portId,t55])),c6=new Set(s6.map(t55=>t55.portId)),l7=[];for(let[n4,o7]of[...t54.entries()].sort(([t55],[e8])=>t55.localeCompare(e8))){if(o7<=1)continue;let t55=a3.get(n4);if(!t55)continue;let i6=o7-1,h3=tz(t55,this.serializedHyperGraph.ports),d4=ez(t55,h3,r6),u6=ZD(t55),p5=[];for(let r7=1;r7<=i6;r7++){let a4=nz(n4,r7,c6),l10=e7*r7/(i6+1),h4=UD(VD(t55.d));h4.x=u6.x+d4.x*l10,h4.y=u6.y+d4.y*l10,h4.duplicatedFromPortId=n4,h4.duplicateIndex=r7,h4.duplicatePortUseCount=o7,h4.duplicatePortProximity=e7,h4.repairReason="congested-port",s6.push({...t55,portId:a4,d:h4}),p5.push(a4)}for(let e8 of[t55.region1Id,t55.region2Id]){let t56=r6.get(e8);t56&&oz(t56.pointIds,n4,p5)}l7.push({sourcePortId:n4,duplicatePortIds:p5,useCount:o7})}return this.report={portUseCounts:Object.fromEntries([...t54.entries()].sort()),duplicatedPorts:l7},{...o6,regions:i3,ports:s6,connections:this.serializedHyperGraph.connections===void 0?void 0:VD(this.serializedHyperGraph.connections)}}_setup(){try{let t54=this.getPortUseCounts();this.revisedSerializedHyperGraph=this.duplicateCongestedPorts(t54),this.stats={...this.stats,duplicateSourcePortCount:this.report.duplicatedPorts.length,duplicatedPortCount:this.report.duplicatedPorts.reduce((t55,e7)=>t55+e7.duplicatePortIds.length,0)},this.solved=!0}catch(t54){this.failed=!0,this.error=t54 instanceof Error?t54.message:String(t54)}}_step(){this.failed||(this.solved=!0)}getOutput(){if(!this.revisedSerializedHyperGraph||this.failed)throw new Error("DuplicateCongestedPortSolver does not have a repaired topology output");return this.revisedSerializedHyperGraph}},cz=(t54,e7)=>{AD(t54,e7),e7&&(e7.MAX_RIPS!==void 0&&(t54.MAX_RIPS=e7.MAX_RIPS),e7.MAX_RIPS_WITHOUT_MAX_REGION_COST_IMPROVEMENT!==void 0&&(t54.MAX_RIPS_WITHOUT_MAX_REGION_COST_IMPROVEMENT=e7.MAX_RIPS_WITHOUT_MAX_REGION_COST_IMPROVEMENT),e7.EXTRA_RIPS_AFTER_BEATING_BASELINE_MAX_REGION_COST!==void 0&&(t54.EXTRA_RIPS_AFTER_BEATING_BASELINE_MAX_REGION_COST=e7.EXTRA_RIPS_AFTER_BEATING_BASELINE_MAX_REGION_COST))},lz=t54=>t54.map(t55=>t55.map(([t56,e7,n3])=>[t56,e7,n3])),hz=t54=>({netIds:new Int32Array(t54.netIds),lesserAngles:new Int32Array(t54.lesserAngles),greaterAngles:new Int32Array(t54.greaterAngles),layerMasks:new Int32Array(t54.layerMasks),existingCrossingLayerIntersections:t54.existingCrossingLayerIntersections,existingSameLayerIntersections:t54.existingSameLayerIntersections,existingEntryExitLayerChanges:t54.existingEntryExitLayerChanges,existingRegionCost:t54.existingRegionCost,existingSegmentCount:t54.existingSegmentCount}),dz=t54=>({portAssignment:new Int32Array(t54.portAssignment),regionSegments:lz(t54.regionSegments),regionIntersectionCaches:t54.regionIntersectionCaches.map(hz)}),uz=(t54,e7)=>{let n3=dz(e7);t54.state.portAssignment=n3.portAssignment,t54.state.regionSegments=n3.regionSegments,t54.state.regionIntersectionCaches=n3.regionIntersectionCaches},pz=t54=>{let e7=0,n3=0;for(let o6=0;o6<t54.length;o6++){let i3=t54[o6]?.existingRegionCost??0;e7=Math.max(e7,i3),n3+=i3}return{maxRegionCost:e7,totalRegionCost:n3}},mz=(t54,e7)=>t54.maxRegionCost!==e7.maxRegionCost?t54.maxRegionCost-e7.maxRegionCost:t54.totalRegionCost-e7.totalRegionCost,gz=(t54,e7,n3)=>{let o6=t54.incidentPortRegion[e7]??[],i3=t54.incidentPortRegion[n3]??[],s6=o6.find(t55=>i3.includes(t55));if(s6===void 0)throw new Error(`Ports ${e7} and ${n3} do not share a region`);return s6},fz=(t54,e7,n3,o6)=>{let i3=n3.solvedRoutePathSegments[o6]??[],s6=n3.solvedRoutePathRegionIds?.[o6]??[],r6=e7.routeStartPort[o6],a3=e7.routeEndPort[o6];if(i3.length===0){if(r6===a3)return{orderedPortIds:[r6],orderedRegionIds:[]};throw new Error(`Route ${o6} does not have an existing solved path`)}let c6=new Map;i3.forEach(([t55,e8],n4)=>{let o7={segmentIndex:n4,fromPortId:t55,toPortId:e8,regionId:s6[n4]},i6=c6.get(t55)??[];i6.push(o7),c6.set(t55,i6);let r7=c6.get(e8)??[];r7.push(o7),c6.set(e8,r7)});let l7=[r6],h3=[],d4=new Set,u6,p5=r6;for(;p5!==a3;){let e8=(c6.get(p5)??[]).filter(({segmentIndex:t55,fromPortId:e10,toPortId:n5})=>d4.has(t55)?!1:(e10===p5?n5:e10)!==u6);if(e8.length!==1)throw new Error(`Route ${o6} is not a single ordered path from ${r6} to ${a3}`);let n4=e8[0],i6=n4.fromPortId===p5?n4.toPortId:n4.fromPortId;d4.add(n4.segmentIndex),h3.push(n4.regionId??gz(t54,n4.fromPortId,n4.toPortId)),l7.push(i6),u6=p5,p5=i6}if(d4.size!==i3.length)throw new Error(`Route ${o6} contains disconnected solved segments`);return{orderedPortIds:l7,orderedRegionIds:h3}},yz=(t54,e7,n3,o6)=>{let i3=new DD(t54,e7,o6);return((t55,e8)=>{t55.state.portAssignment.fill(-1),t55.state.regionSegments=Array.from({length:t55.topology.regionCount},()=>[]),t55.state.regionIntersectionCaches=Array.from({length:t55.topology.regionCount},()=>wD()),t55.state.currentRouteId=void 0,t55.state.currentRouteNetId=void 0,t55.state.unroutedRoutes=[],t55.state.candidateQueue.clear(),t55.resetCandidateBestCosts(),t55.state.goalPortId=-1,t55.state.ripCount=0,t55.state.regionCongestionCost.fill(0);for(let n4=0;n4<e8.length;n4++)for(let[o7,i6,s6]of e8[n4]??[])t55.state.currentRouteNetId=t55.problem.routeNet[o7],t55.state.regionSegments[n4].push([o7,i6,s6]),t55.state.portAssignment[i6]=t55.state.currentRouteNetId,t55.state.portAssignment[s6]=t55.state.currentRouteNetId,t55.appendSegmentToRegionCache(n4,i6,s6);t55.state.currentRouteId=void 0,t55.state.currentRouteNetId=void 0,t55.solved=!0,t55.failed=!1,t55.error=null})(i3,n3),i3},_z=(t54,e7,n3)=>{let o6=new Int32Array(e7.routeStartPort),i3=new Int32Array(e7.routeEndPort),s6=Array.from({length:e7.routeCount},(t55,e8)=>({routeId:e8,fixedSegments:[]})),r6=[];for(let a3=0;a3<e7.routeCount;a3++){let c6=s6[a3],{orderedPortIds:l7,orderedRegionIds:h3}=fz(t54,e7,n3,a3),d4=[],u6;for(let t55=0;t55<l7.length;t55++){let n4=l7[t55],o7=e7.portSectionMask[n4]===1;o7&&u6===void 0?u6=t55:o7||u6===void 0||(d4.push({startIndex:u6,endIndex:t55-1}),u6=void 0)}if(u6!==void 0&&d4.push({startIndex:u6,endIndex:l7.length-1}),d4.length===0){for(let t55=1;t55<l7.length;t55++)c6.fixedSegments.push({regionId:h3[t55-1],fromPortId:l7[t55-1],toPortId:l7[t55]});continue}if(d4.length>1)throw new Error(`Route ${a3} enters the section multiple times; only one contiguous section span is currently supported`);let p5=d4[0],m4=Math.max(0,p5.startIndex-1),g4=Math.min(l7.length-1,p5.endIndex+1);if(g4<=m4)throw new Error(`Route ${a3} does not have a valid section span`);for(let t55=1;t55<=m4;t55++)c6.fixedSegments.push({regionId:h3[t55-1],fromPortId:l7[t55-1],toPortId:l7[t55]});for(let t55=g4+1;t55<l7.length;t55++)c6.fixedSegments.push({regionId:h3[t55-1],fromPortId:l7[t55-1],toPortId:l7[t55]});c6.activeStartPortId=l7[m4],c6.activeEndPortId=l7[g4],c6.forcedStartRegionId=h3[m4],o6[a3]=c6.activeStartPortId,i3[a3]=c6.activeEndPortId,r6.push(a3)}return{sectionProblem:{routeCount:e7.routeCount,portSectionMask:new Int8Array(e7.portSectionMask),routeMetadata:e7.routeMetadata,routeStartPort:o6,routeEndPort:i3,routeNet:new Int32Array(e7.routeNet),regionNetId:new Int32Array(e7.regionNetId),portPenalty:e7.portPenalty===void 0?void 0:new Float64Array(e7.portPenalty)},routePlans:s6,activeRouteIds:r6}},bz=(t54,e7,n3)=>_z(t54,e7,n3).activeRouteIds,xz=class extends DD{constructor(t54,e7,n3,o6,i3,s6,r6,a3){super(t54,e7,a3);__publicField(this,"routePlans");__publicField(this,"activeRouteIds");__publicField(this,"mutableRegionIds");__publicField(this,"immutableRegionSummary");__publicField(this,"baselineSummary");__publicField(this,"bestSnapshot");__publicField(this,"fixedSnapshot");__publicField(this,"bestSummary");__publicField(this,"baselineBeatRipCount");__publicField(this,"previousBestMaxRegionCost",Number.POSITIVE_INFINITY);__publicField(this,"ripsSinceBestMaxRegionCostImprovement",0);__publicField(this,"MAX_RIPS",Number.POSITIVE_INFINITY);__publicField(this,"MAX_RIPS_WITHOUT_MAX_REGION_COST_IMPROVEMENT",Number.POSITIVE_INFINITY);__publicField(this,"EXTRA_RIPS_AFTER_BEATING_BASELINE_MAX_REGION_COST",Number.POSITIVE_INFINITY);this.routePlans=n3,this.activeRouteIds=o6,this.mutableRegionIds=i3,this.immutableRegionSummary=s6,this.baselineSummary=r6,cz(this,a3),this.state.unroutedRoutes=[...o6],this.applyFixedSegments(),this.fixedSnapshot=dz({portAssignment:this.state.portAssignment,regionSegments:this.state.regionSegments,regionIntersectionCaches:this.state.regionIntersectionCaches})}applyFixedSegments(){for(let t54 of this.routePlans)for(let{regionId:e7,fromPortId:n3,toPortId:o6}of t54.fixedSegments)this.state.currentRouteNetId=this.problem.routeNet[t54.routeId],this.state.regionSegments[e7].push([t54.routeId,n3,o6]),this.state.portAssignment[n3]=this.state.currentRouteNetId,this.state.portAssignment[o6]=this.state.currentRouteNetId,this.appendSegmentToRegionCache(e7,n3,o6);this.state.currentRouteId=void 0,this.state.currentRouteNetId=void 0}captureBestState(t54){this.bestSummary&&mz(t54,this.bestSummary)>=0||(this.bestSummary=t54,this.bestSnapshot=dz({portAssignment:this.state.portAssignment,regionSegments:this.state.regionSegments,regionIntersectionCaches:this.state.regionIntersectionCaches}))}restoreBestState(){this.bestSnapshot&&(uz(this,this.bestSnapshot),this.state.currentRouteId=void 0,this.state.currentRouteNetId=void 0,this.state.unroutedRoutes=[],this.state.candidateQueue.clear(),this.resetCandidateBestCosts(),this.state.goalPortId=-1)}getStartingNextRegionId(t54,e7){let n3=this.routePlans[t54]?.forcedStartRegionId;return n3!==void 0?n3:super.getStartingNextRegionId(t54,e7)}resetRoutingStateForRerip(){if(!this.fixedSnapshot)return super.resetRoutingStateForRerip(),this.state.unroutedRoutes=EL([...this.activeRouteIds],this.state.ripCount),void this.applyFixedSegments();uz(this,this.fixedSnapshot),this.state.currentRouteId=void 0,this.state.currentRouteNetId=void 0,this.state.unroutedRoutes=EL([...this.activeRouteIds],this.state.ripCount),this.state.candidateQueue.clear(),this.resetCandidateBestCosts(),this.state.goalPortId=-1}onAllRoutesRouted(){let{state:t54}=this,e7=Math.min(this.MAX_RIPS,this.RIP_THRESHOLD_RAMP_ATTEMPTS),n3=e7<=0?1:Math.min(1,t54.ripCount/e7),o6=this.RIP_THRESHOLD_START+(this.RIP_THRESHOLD_END-this.RIP_THRESHOLD_START)*n3,i3=[],s6=new Float64Array(this.mutableRegionIds.length),r6=0,a3=0;for(let e8=0;e8<this.mutableRegionIds.length;e8++){let n4=this.mutableRegionIds[e8],c7=t54.regionIntersectionCaches[n4]?.existingRegionCost??0;s6[e8]=c7,r6=Math.max(r6,c7),a3+=c7,c7>o6&&i3.push(n4)}let c6=Math.max(this.immutableRegionSummary.maxRegionCost,r6),l7=this.immutableRegionSummary.totalRegionCost+a3;this.captureBestState({maxRegionCost:c6,totalRegionCost:l7});let h3=this.bestSummary??{maxRegionCost:c6,totalRegionCost:l7};if(h3.maxRegionCost<this.previousBestMaxRegionCost-Number.EPSILON?(this.previousBestMaxRegionCost=h3.maxRegionCost,this.ripsSinceBestMaxRegionCostImprovement=0):this.ripsSinceBestMaxRegionCostImprovement+=1,this.baselineBeatRipCount===void 0&&h3.maxRegionCost<this.baselineSummary.maxRegionCost-Number.EPSILON&&(this.baselineBeatRipCount=t54.ripCount),this.stats={...this.stats,activeRouteCount:this.activeRouteIds.length,currentRipThreshold:o6,hotRegionCount:i3.length,maxRegionCost:c6,totalRegionCost:l7,bestMaxRegionCost:h3.maxRegionCost,bestTotalRegionCost:h3.totalRegionCost,ripCount:t54.ripCount},i3.length===0||t54.ripCount>=e7||this.ripsSinceBestMaxRegionCostImprovement>=this.MAX_RIPS_WITHOUT_MAX_REGION_COST_IMPROVEMENT||this.baselineBeatRipCount!==void 0&&t54.ripCount-this.baselineBeatRipCount>=this.EXTRA_RIPS_AFTER_BEATING_BASELINE_MAX_REGION_COST)return this.restoreBestState(),void(this.solved=!0);for(let e8=0;e8<this.mutableRegionIds.length;e8++){let n4=this.mutableRegionIds[e8];t54.regionCongestionCost[n4]+=s6[e8]*this.RIP_CONGESTION_REGION_COST_FACTOR}t54.ripCount+=1,this.resetRoutingStateForRerip(),this.stats={...this.stats,ripCount:t54.ripCount,reripRegionCount:i3.length}}onOutOfCandidates(){let{state:t54}=this;for(let e7 of this.mutableRegionIds){let n3=t54.regionIntersectionCaches[e7]?.existingRegionCost??0;t54.regionCongestionCost[e7]+=n3*this.RIP_CONGESTION_REGION_COST_FACTOR}t54.ripCount+=1,this.resetRoutingStateForRerip(),this.stats={...this.stats,ripCount:t54.ripCount,reripReason:"out_of_candidates"}}tryFinalAcceptance(){if(this.bestSnapshot)return this.restoreBestState(),void(this.solved=!0);this.fixedSnapshot&&uz(this,this.fixedSnapshot),this.state.currentRouteId=void 0,this.state.currentRouteNetId=void 0,this.state.unroutedRoutes=[...this.activeRouteIds],this.state.candidateQueue.clear(),this.resetCandidateBestCosts(),this.state.goalPortId=-1,this.stats={...this.stats,acceptedFixedSectionStateOnTimeout:!0},this.solved=!0}visualize(){return ND(this,{highlightSectionMask:!0,showInitialRouteHints:!1,showOnlySectionPortsOnIdle:!0})}},vz=class extends Tt2{constructor(t54,e7,n3,o6){super();__publicField(this,"topology");__publicField(this,"problem");__publicField(this,"initialSolution");__publicField(this,"baselineSolver");__publicField(this,"baselineSummary");__publicField(this,"sectionBaselineSummary");__publicField(this,"outsideSectionBaselineSummary");__publicField(this,"sectionRegionIds");__publicField(this,"optimizedSolver");__publicField(this,"sectionSolver");__publicField(this,"activeRouteIds",[]);__publicField(this,"DISTANCE_TO_COST",.05);__publicField(this,"minViaPadDiameter",CL);__publicField(this,"VERBOSE",!1);__publicField(this,"RIP_THRESHOLD_START",.05);__publicField(this,"RIP_THRESHOLD_END",.8);__publicField(this,"RIP_THRESHOLD_RAMP_ATTEMPTS",50);__publicField(this,"MAX_RIPS",Number.POSITIVE_INFINITY);__publicField(this,"MAX_RIPS_WITHOUT_MAX_REGION_COST_IMPROVEMENT",10);__publicField(this,"EXTRA_RIPS_AFTER_BEATING_BASELINE_MAX_REGION_COST",10);__publicField(this,"RIP_CONGESTION_REGION_COST_FACTOR",.1);__publicField(this,"MAX_ITERATIONS",1e6);__publicField(this,"STATIC_REACHABILITY_PRECHECK",!1);__publicField(this,"STATIC_REACHABILITY_PRECHECK_MAX_HOPS",16);__publicField(this,"ACCEPT_BEST_SOLUTION_ON_TIMEOUT",!0);__publicField(this,"GREEDY_FINAL_ROUTE_ITERS",4);this.topology=t54,this.problem=e7,this.initialSolution=n3,cz(this,o6),this.baselineSolver=((t55,e8,n4,o7)=>{let i3=Array.from({length:t55.regionCount},()=>[]);for(let o8=0;o8<e8.routeCount;o8++){let{orderedPortIds:s6,orderedRegionIds:r6}=fz(t55,e8,n4,o8);for(let t56=1;t56<s6.length;t56++){let e10=s6[t56-1],n5=s6[t56];i3[r6[t56-1]].push([o8,e10,n5])}}return yz(t55,e8,i3,o7)})(t54,e7,n3,OD(this)),this.baselineSummary=pz(this.baselineSolver.state.regionIntersectionCaches),this.sectionRegionIds=((t55,e8)=>{let n4=new Set;for(let o7=0;o7<e8.portSectionMask.length;o7++)if(e8.portSectionMask[o7]===1)for(let e10 of t55.incidentPortRegion[o7]??[])n4.add(e10);return[...n4]})(t54,e7),this.sectionBaselineSummary=((t55,e8)=>{let n4=0,o7=0;for(let i3 of e8){let e10=t55[i3]?.existingRegionCost??0;n4=Math.max(n4,e10),o7+=e10}return{maxRegionCost:n4,totalRegionCost:o7}})(this.baselineSolver.state.regionIntersectionCaches,this.sectionRegionIds),this.outsideSectionBaselineSummary=((t55,e8)=>{let n4=new Set(e8),o7=0,i3=0;for(let e10=0;e10<t55.length;e10++){if(n4.has(e10))continue;let s6=t55[e10]?.existingRegionCost??0;o7=Math.max(o7,s6),i3+=s6}return{maxRegionCost:o7,totalRegionCost:i3}})(this.baselineSolver.state.regionIntersectionCaches,this.sectionRegionIds),this.applySectionRipPolicy()}applySectionRipPolicy(){this.RIP_THRESHOLD_START=.05,this.RIP_THRESHOLD_END=Math.max(this.RIP_THRESHOLD_START,this.sectionBaselineSummary.maxRegionCost),this.MAX_RIPS=Math.min(this.MAX_RIPS,20)}_setup(){this.applySectionRipPolicy();let{sectionProblem:t54,routePlans:e7,activeRouteIds:n3}=_z(this.topology,this.problem,this.initialSolution);if(this.activeRouteIds=n3,n3.length===0)return this.optimizedSolver=this.baselineSolver,this.stats={...this.stats,activeRouteCount:0,initialMaxRegionCost:this.baselineSummary.maxRegionCost,finalMaxRegionCost:this.baselineSummary.maxRegionCost,optimized:!1},void(this.solved=!0);var o6;this.sectionSolver=new xz(this.topology,t54,e7,n3,this.sectionRegionIds,this.outsideSectionBaselineSummary,this.baselineSummary,{...OD(o6=this),MAX_RIPS:o6.MAX_RIPS,MAX_RIPS_WITHOUT_MAX_REGION_COST_IMPROVEMENT:o6.MAX_RIPS_WITHOUT_MAX_REGION_COST_IMPROVEMENT,EXTRA_RIPS_AFTER_BEATING_BASELINE_MAX_REGION_COST:o6.EXTRA_RIPS_AFTER_BEATING_BASELINE_MAX_REGION_COST}),this.activeSubSolver=this.sectionSolver,this.stats={...this.stats,sectionBaselineMaxRegionCost:this.sectionBaselineSummary.maxRegionCost,sectionBaselineTotalRegionCost:this.sectionBaselineSummary.totalRegionCost,effectiveRipThresholdStart:this.RIP_THRESHOLD_START,effectiveRipThresholdEnd:this.RIP_THRESHOLD_END,effectiveMaxRips:this.MAX_RIPS}}_step(){if(!this.sectionSolver)return void(this.solved=!0);if(this.sectionSolver.step(),this.stats={...this.stats,...this.sectionSolver.stats,activeRouteCount:this.activeRouteIds.length},this.sectionSolver.failed)return this.optimizedSolver=this.baselineSolver,this.stats={...this.stats,initialMaxRegionCost:this.baselineSummary.maxRegionCost,initialTotalRegionCost:this.baselineSummary.totalRegionCost,finalMaxRegionCost:this.baselineSummary.maxRegionCost,finalTotalRegionCost:this.baselineSummary.totalRegionCost,optimized:!1,sectionSearchFailedFallbackToBaseline:!0,sectionSearchError:this.sectionSolver.error},void(this.solved=!0);if(!this.sectionSolver.solved)return;let t54=yz(this.topology,this.problem,lz(this.sectionSolver.state.regionSegments),OD(this)),e7=pz(t54.state.regionIntersectionCaches),n3=mz(e7,this.baselineSummary)<0;this.optimizedSolver=n3?t54:this.baselineSolver;let o6=n3?e7:this.baselineSummary;this.stats={...this.stats,initialMaxRegionCost:this.baselineSummary.maxRegionCost,initialTotalRegionCost:this.baselineSummary.totalRegionCost,candidateMaxRegionCost:e7.maxRegionCost,candidateTotalRegionCost:e7.totalRegionCost,finalMaxRegionCost:o6.maxRegionCost,finalTotalRegionCost:o6.totalRegionCost,optimized:n3},this.solved=!0}tryFinalAcceptance(){this.optimizedSolver=this.baselineSolver,this.stats={...this.stats,initialMaxRegionCost:this.baselineSummary.maxRegionCost,initialTotalRegionCost:this.baselineSummary.totalRegionCost,finalMaxRegionCost:this.baselineSummary.maxRegionCost,finalTotalRegionCost:this.baselineSummary.totalRegionCost,optimized:!1,sectionSolverTimeoutFallbackToBaseline:!0},this.solved=!0,this.failed=!1,this.error=null}getSolvedSolver(){if(!this.solved||this.failed||!this.optimizedSolver)throw new Error("TinyHyperGraphSectionSolver does not have a solved output yet");return this.optimizedSolver}visualize(){return this.optimizedSolver?ND(this.optimizedSolver,{highlightSectionMask:!0}):this.sectionSolver?this.sectionSolver.visualize():ND(this.baselineSolver,{highlightSectionMask:!0,showInitialRouteHints:!1,showOnlySectionPortsOnIdle:!0})}getOutput(){return this.getSolvedSolver().getOutput()}},Sz=["self-touch","onehop-all","onehop-touch","twohop-all","twohop-touch"],Iz={"self-all":0,"self-touch":0,"onehop-all":1,"onehop-touch":1,"twohop-all":2,"twohop-touch":2,"threehop-all":3,"threehop-touch":3,"fourhop-all":4,"fourhop-touch":4},Pz=(t54,e7)=>{let n3=new Set(e7);for(let o6 of e7)for(let e8 of t54.regionIncidentPorts[o6]??[])for(let o7 of t54.incidentPortRegion[e8]??[])n3.add(o7);return[...n3]},Mz=(t54,e7,n3)=>{let o6=[...new Set(e7)];for(let e8=0;e8<n3;e8+=1)o6=Pz(t54,o6);return o6},Cz=(t54,e7,n3)=>e7.flatMap(e8=>n3.map(n4=>((t55,e10,n5)=>({label:`hot-${e10}-${n5}`,family:n5,regionIds:Mz(t55,[e10],Iz[n5]),portSelectionRule:n5.endsWith("-all")?"all-incident-regions-selected":"touches-selected-region"}))(t54,e8,n4))),Nz={RIP_THRESHOLD_RAMP_ATTEMPTS:5},Tz={DISTANCE_TO_COST:.05,RIP_THRESHOLD_RAMP_ATTEMPTS:16,RIP_CONGESTION_REGION_COST_FACTOR:.1,MAX_ITERATIONS:5e4,MAX_RIPS_WITHOUT_MAX_REGION_COST_IMPROVEMENT:6,EXTRA_RIPS_AFTER_BEATING_BASELINE_MAX_REGION_COST:Number.POSITIVE_INFINITY},wz=t54=>t54.state.regionIntersectionCaches.reduce((t55,e7)=>Math.max(t55,e7.existingRegionCost),0),Rz=(t54,e7)=>{let n3=HD(t54),o6=new vz(n3.topology,n3.problem,n3.solution,e7);return wz(o6.baselineSolver)},Ez=(t54,e7,n3)=>{let o6=new Set(e7);return Int8Array.from({length:t54.portCount},(e8,i3)=>{let s6=t54.incidentPortRegion[i3]??[];return n3==="touches-selected-region"?s6.some(t55=>o6.has(t55))?1:0:s6.length>0&&s6.every(t55=>o6.has(t55))?1:0})},Az=(t54,e7)=>({routeCount:t54.routeCount,portSectionMask:e7,routeMetadata:t54.routeMetadata,routeStartPort:new Int32Array(t54.routeStartPort),routeEndPort:new Int32Array(t54.routeEndPort),routeNet:new Int32Array(t54.routeNet),regionNetId:new Int32Array(t54.regionNetId),portPenalty:t54.portPenalty===void 0?void 0:new Float64Array(t54.portPenalty)}),Oz=(t54,e7,n3,o6,i3,s6)=>{let r6=performance.now(),a3=performance.now(),c6=new vz(e7,n3,o6,s6),l7=wz(c6.baselineSolver),h3=performance.now()-a3,d4,u6,p5=l7,m4=new Int8Array(e7.portCount),g4=0,f4=0,y3=0,_3=0,b4=0,x4=0,v3=0,S7=new Set,I4=i3?.maxHotRegions??s6.MAX_HOT_REGIONS??2;for(let r7 of((t55,e8,n4,o7)=>{let i6=t55.state.regionIntersectionCaches.map((t56,e10)=>({regionId:e10,regionCost:t56.existingRegionCost})).filter(({regionCost:t56})=>t56>0).sort((t56,e10)=>e10.regionCost-t56.regionCost).slice(0,n4).map(({regionId:t56})=>t56);return Cz(e8,i6,o7)})(t54,e7,I4,i3?.candidateFamilies??[...Sz])){let t55=Az(n3,Ez(e7,r7.regionIds,r7.portSelectionRule));g4+=1;let i6=t55.portSectionMask.join(",");if(S7.has(i6))y3+=1;else{S7.add(i6);try{let n4=performance.now(),i8=bz(e7,t55,o6);if(_3+=performance.now()-n4,i8.length===0)continue;f4+=1;let a4=performance.now(),c7=new vz(e7,t55,o6,s6);b4+=performance.now()-a4;let l10=performance.now();if(c7.solve(),x4+=performance.now()-l10,c7.failed||!c7.solved)continue;if(Number(c7.stats.finalMaxRegionCost??wz(c7.getSolvedSolver()))<p5-1e-9){let e8=performance.now(),n5=Rz(c7.getOutput(),s6);v3+=performance.now()-e8,n5<p5-1e-9&&(p5=n5,m4=new Int8Array(t55.portSectionMask),d4=r7.label,u6=r7.family)}}catch{}}}return{portSectionMask:m4,baselineMaxRegionCost:l7,finalMaxRegionCost:p5,generatedCandidateCount:g4,candidateCount:f4,duplicateCandidateCount:y3,totalMs:performance.now()-r6,baselineEvaluationMs:h3,candidateEligibilityMs:_3,candidateInitMs:b4,candidateSolveMs:x4,candidateReplayScoreMs:v3,winningCandidateLabel:d4,winningCandidateFamily:u6}},Lz=class extends Rt2{constructor(t54){super(t54);__publicField(this,"initialVisualizationSolver");__publicField(this,"selectedSectionMask");__publicField(this,"selectedSectionCandidateLabel");__publicField(this,"selectedSectionCandidateFamily");__publicField(this,"pipelineDef",[{solverName:"solveGraph",solverClass:DD,getConstructorParams:t54=>{let{topology:e7,problem:n3}=t54.loadHyperGraph(t54.inputProblem.serializedHyperGraph);return[e7,n3,t54.getSolveGraphOptions()]}},{solverName:"optimizeSection",solverClass:vz,getConstructorParams:t54=>t54.getSectionStageParams()}]);this.MAX_ITERATIONS=2e5}loadHyperGraph(t54){return HD(t54)}getSolveGraphOptions(){return{...Nz,...this.inputProblem.minViaPadDiameter===void 0?{}:{minViaPadDiameter:this.inputProblem.minViaPadDiameter},...this.inputProblem.solveGraphOptions}}getSectionSolverOptions(){return{...Tz,...this.inputProblem.minViaPadDiameter===void 0?{}:{minViaPadDiameter:this.inputProblem.minViaPadDiameter},...this.inputProblem.sectionSolverOptions}}getSectionStageParams(){let t54=this.getStageOutput("solveGraph");if(!t54)throw new Error("solveGraph did not produce a solved serialized hypergraph");let e7=this.getSolver("solveGraph");if(!e7)throw new Error("solveGraph solver is unavailable");let n3=this.getSectionSolverOptions(),{topology:o6,problem:i3,solution:s6}=this.loadHyperGraph(t54),r6=this.inputProblem.createSectionMask?this.inputProblem.createSectionMask({serializedHyperGraph:this.inputProblem.serializedHyperGraph,solvedSerializedHyperGraph:t54,solvedSolver:e7,topology:o6,problem:i3,solution:s6}):(()=>{let t55=Oz(e7,o6,i3,s6,this.inputProblem.sectionSearchConfig,n3);return this.selectedSectionCandidateLabel=t55.winningCandidateLabel,this.selectedSectionCandidateFamily=t55.winningCandidateFamily,this.stats={...this.stats,sectionSearchGeneratedCandidateCount:t55.generatedCandidateCount,sectionSearchCandidateCount:t55.candidateCount,sectionSearchDuplicateCandidateCount:t55.duplicateCandidateCount,sectionSearchBaselineMaxRegionCost:t55.baselineMaxRegionCost,sectionSearchFinalMaxRegionCost:t55.finalMaxRegionCost,sectionSearchDelta:t55.baselineMaxRegionCost-t55.finalMaxRegionCost,selectedSectionCandidateLabel:t55.winningCandidateLabel??null,selectedSectionCandidateFamily:t55.winningCandidateFamily??null,sectionSearchMs:t55.totalMs,sectionSearchBaselineEvaluationMs:t55.baselineEvaluationMs,sectionSearchCandidateEligibilityMs:t55.candidateEligibilityMs,sectionSearchCandidateInitMs:t55.candidateInitMs,sectionSearchCandidateSolveMs:t55.candidateSolveMs,sectionSearchCandidateReplayScoreMs:t55.candidateReplayScoreMs},t55.portSectionMask})();return this.selectedSectionMask=new Int8Array(r6),i3.portSectionMask=new Int8Array(r6),this.stats={...this.stats,sectionMaskPortCount:[...r6].filter(t55=>t55===1).length},[o6,i3,s6,n3]}getInitialVisualizationSolver(){if(!this.initialVisualizationSolver){let{topology:t54,problem:e7}=this.loadHyperGraph(this.inputProblem.serializedHyperGraph);this.initialVisualizationSolver=new DD(t54,e7,this.getSolveGraphOptions())}return this.initialVisualizationSolver}initialVisualize(){return this.getInitialVisualizationSolver().visualize()}visualize(){return this.iterations===0?this.initialVisualize()??super.visualize():super.visualize()}getOutput(){return this.getStageOutput("optimizeSection")??this.getStageOutput("solveGraph")??null}tryFinalAcceptance(){this.getStageOutput("solveGraph")&&(this.stats={...this.stats,acceptedSolveGraphOutputOnSectionPipelineTimeout:!0},this.activeSubSolver=void 0,this.solved=!0,this.failed=!1,this.error=null)}},Dz=(new Int32Array(0),t54=>typeof t54=="object"&&t54!==null?t54:{}),zz=t54=>typeof t54=="object"&&t54!==null?t54:{},kz=1e-6,Fz={DISTANCE_TO_COST:.05,RIP_THRESHOLD_START:.05,RIP_THRESHOLD_END:.8,RIP_CONGESTION_REGION_COST_FACTOR:.1,ACCEPT_BEST_SOLUTION_ON_TIMEOUT:!0,GREEDY_FINAL_ROUTE_ITERS:4},jz={DISTANCE_TO_COST:.05,RIP_THRESHOLD_START:.05,RIP_THRESHOLD_END:.8,RIP_CONGESTION_REGION_COST_FACTOR:.1,ACCEPT_BEST_SOLUTION_ON_TIMEOUT:!0,GREEDY_FINAL_ROUTE_ITERS:4,MAX_RIPS_WITHOUT_MAX_REGION_COST_IMPROVEMENT:6,EXTRA_RIPS_AFTER_BEATING_BASELINE_MAX_REGION_COST:Number.POSITIVE_INFINITY},Yz=t54=>Math.max(t54,.01),Xz=t54=>Number.isFinite(t54)?{minViaPadDiameter:t54}:{},$z=(t54,e7)=>{let n3=Yz(t54);return{...Fz,...Xz(e7),USE_SPARSE_CANDIDATE_STORAGE:!0,RIP_THRESHOLD_RAMP_ATTEMPTS:Math.ceil(10*n3),MAX_ITERATIONS:Math.ceil(2e6*n3)}},Bz=(t54,e7)=>{let n3=Yz(t54);return{...jz,...Xz(e7),USE_SPARSE_CANDIDATE_STORAGE:!0,RIP_THRESHOLD_RAMP_ATTEMPTS:Math.ceil(16*n3),MAX_ITERATIONS:Math.ceil(1e6*n3)}},Hz=t54=>(t54.solveGraphOptions?.MAX_ITERATIONS??1e6)+(t54.sectionSolverOptions?.MAX_ITERATIONS??1e6)+1e6,Wz=(t54,e7)=>t54.simpleRouteConnection?.pointsToConnect[e7],Vz=t54=>{let e7=Wz(t54.routeMetadata,t54.endpointIndex);if(!e7)return t54.fallbackZ;let n3=ho2(e7).map(e8=>Co2(e8,t54.layerCount));return t54.regionAvailableZ.find(t55=>n3.includes(t55))??t54.fallbackZ},Uz=t54=>{let e7=t54.d,n3=e7.bounds;return{capacityMeshNodeId:t54.d.capacityMeshNodeId,center:{x:t54.d.center.x,y:t54.d.center.y},width:t54.d.width,height:t54.d.height,availableZ:[...t54.d.availableZ],...n3?{bounds:{minX:n3.minX,maxX:n3.maxX,minY:n3.minY,maxY:n3.maxY}}:{},_containsObstacle:t54.d._containsObstacle,_containsTarget:t54.d._containsTarget,_offBoardConnectionId:t54.d._offBoardConnectionId,_offBoardConnectedCapacityMeshNodeIds:t54.d._offBoardConnectedCapacityMeshNodeIds===void 0?void 0:[...t54.d._offBoardConnectedCapacityMeshNodeIds],_qfpRegionType:e7._qfpRegionType,_isNarrowQfpPadGap:e7._isNarrowQfpPadGap}},Gz=t54=>{let e7=t54.d;return{portId:t54.d.portId,x:t54.d.x,y:t54.d.y,z:t54.d.z,prevPortPointId:e7.prevPortPointId,nextPortPointId:e7.nextPortPointId,distToCentermostPortOnZ:t54.d.distToCentermostPortOnZ,tinyHypergraphPortPenalty:t54.d.tinyHypergraphPortPenalty,cramped:t54.d.cramped}},Zz=t54=>{let e7=new Map;for(let n3=0;n3<t54.problem.routeNet.length;n3++){let o6=t54.problem.routeMetadata?.[n3],i3=o6?.mutuallyConnectedNetworkId??o6?.connectionId;typeof i3=="string"&&e7.set(i3,t54.problem.routeNet[n3])}for(let n3=0;n3<t54.problem.regionNetId.length;n3++){let o6=t54.topology.regionMetadata?.[n3]?._tinyTerminalNetId;if(typeof o6!="string")continue;let i3=e7.get(o6);i3!==void 0&&(t54.problem.regionNetId[n3]=i3)}},qz=t54=>{if(t54.problem.metadataPortPenaltiesApplied)return 0;let e7=0,n3=t54.problem.portPenalty?new Float64Array(t54.problem.portPenalty):new Float64Array(t54.topology.portCount);for(let o6=0;o6<t54.topology.portCount;o6++){let i3=Number(t54.topology.portMetadata?.[o6]?.tinyHypergraphPortPenalty);!Number.isFinite(i3)||i3<=0||(n3[o6]+=i3,e7++)}return e7>0&&(t54.problem.portPenalty=n3),t54.problem.metadataPortPenaltiesApplied=!0,e7},Jz=class extends Lz{constructor(t54){super(t54);__publicField(this,"configuredSolvers",new WeakSet);__publicField(this,"duplicatePortPenaltyCount",0);__publicField(this,"metadataPortPenaltyCount",0);__publicField(this,"crampedPortPenaltyCount",0);this.MAX_ITERATIONS=Hz(t54)}loadHyperGraph(t54){let e7=super.loadHyperGraph(t54),n3=qz(e7),{duplicatePortPenaltyCount:o6,crampedPortPenaltyCount:i3}=(t55=>{let e8=0,n4=0,o7=t55.problem.portPenalty?new Float64Array(t55.problem.portPenalty):new Float64Array(t55.topology.portCount);for(let i6=0;i6<t55.topology.portCount;i6++){let s6=t55.topology.portMetadata?.[i6];typeof s6?.duplicatedFromPortId=="string"&&(o7[i6]+=150,e8++),s6?.cramped&&(o7[i6]+=150,n4++)}return(e8>0||n4>0)&&(t55.problem.portPenalty=o7),{duplicatePortPenaltyCount:e8,crampedPortPenaltyCount:n4}})(e7);return Zz(e7),this.metadataPortPenaltyCount=Math.max(this.metadataPortPenaltyCount,n3),this.duplicatePortPenaltyCount=Math.max(this.duplicatePortPenaltyCount,o6),this.crampedPortPenaltyCount=Math.max(this.crampedPortPenaltyCount,i3),e7}_step(){try{super._step()}catch(t54){if(this.tryAcceptSolveGraphWithoutSerializedOutput(t54)||this.trySkipOptimizeSection(t54))return;throw t54}this.configureSolver(this.activeSubSolver)}getInitialVisualizationSolver(){let t54=super.getInitialVisualizationSolver();return this.configureSolver(t54),t54}getSolvedTinySolver(){let t54=this.getSolver("optimizeSection");if(t54?.solved&&!t54.failed)return t54.getSolvedSolver();let e7=this.getSolver("solveGraph");if(e7?.solved&&!e7.failed)return e7;throw new Error("TinyHyperGraph section pipeline does not have a solved graph")}configureSolver(t54){if(t54&&!this.configuredSolvers.has(t54)){if(t54 instanceof vz||t54 instanceof DD){let e7=t54;qz(e7),Zz(e7)}this.configuredSolvers.add(t54)}}trySkipOptimizeSection(t54){if(this.getCurrentStageName()!=="optimizeSection")return!1;let e7=this.getStageOutput("solveGraph");return!!e7&&(this.pipelineOutputs.optimizeSection=e7,this.finishWithExistingSolverState({sectionOptimizationSkipped:!0,sectionOptimizationError:t54 instanceof Error?t54.message:String(t54)}),!0)}tryAcceptSolveGraphWithoutSerializedOutput(t54){if(this.getCurrentStageName()!=="solveGraph")return!1;let e7=this.getSolver("solveGraph");return!(!e7?.solved||e7.failed)&&(this.finishWithExistingSolverState({solveGraphSerializationSkipped:!0,sectionOptimizationSkipped:!0,sectionOptimizationError:t54 instanceof Error?t54.message:String(t54)}),!0)}finishWithExistingSolverState(t54){this.currentPipelineStageIndex=this.pipelineDef.length,this.activeSubSolver=null,this.solved=!0,this.failed=!1,this.error=null,this.stats={...this.stats,...t54}}},Kz=class extends Fo2{constructor(t54){super();__publicField(this,"params");__publicField(this,"tinyPipelineSolver");__publicField(this,"duplicateCongestedPortReport");__publicField(this,"duplicateCongestedPortError");__publicField(this,"duplicatedPortCount",0);__publicField(this,"inputNodeWithPortPoints");__publicField(this,"originalRegionById");__publicField(this,"originalRegionIds");this.params=t54;let e7=(t55=>{let e8=t55.graph.regions.map(t56=>({regionId:t56.regionId,pointIds:t56.ports.map(t57=>t57.d.portId),d:Uz(t56)})),n4=t55.graph.ports.map(t56=>({portId:t56.d.portId,region1Id:t56.region1.regionId,region2Id:t56.region2.regionId,d:Gz(t56)})),o7=t55.connections.map(t56=>({connectionId:t56.connectionId,mutuallyConnectedNetworkId:t56.mutuallyConnectedNetworkId??t56.connectionId,startRegionId:t56.startRegion.regionId,endRegionId:t56.endRegion.regionId,simpleRouteConnection:t56.simpleRouteConnection})),i6=[],s7=new Map,r7=t56=>{let e10=t56.mutuallyConnectedNetworkId??t56.connectionId,n5=s7.get(e10);return n5===void 0&&(n5=s7.size,s7.set(e10,n5)),n5};for(let o8 of t55.connections){let s8={connectionId:o8.connectionId,mutuallyConnectedNetworkId:o8.mutuallyConnectedNetworkId??o8.connectionId,simpleRouteConnection:o8.simpleRouteConnection},a3=r7(s8),c6=Wz(s8,0),l7=Wz(s8,1),h3=o8.startRegion.d.availableZ[0]??0,d4=o8.endRegion.d.availableZ[0]??0,u6=Vz({routeMetadata:s8,endpointIndex:0,fallbackZ:h3,regionAvailableZ:o8.startRegion.d.availableZ,layerCount:t55.layerCount}),p5=Vz({routeMetadata:s8,endpointIndex:1,fallbackZ:d4,regionAvailableZ:o8.endRegion.d.availableZ,layerCount:t55.layerCount}),m4=`tiny-terminal:start-region:${o8.connectionId}`,g4=`tiny-terminal:end-region:${o8.connectionId}`,f4=`tiny-terminal:start-port:${o8.connectionId}`,y3=`tiny-terminal:end-port:${o8.connectionId}`;e8.push({regionId:m4,pointIds:[f4],d:{capacityMeshNodeId:m4,center:{x:c6?.x??o8.startRegion.d.center.x,y:c6?.y??o8.startRegion.d.center.y},width:kz,height:kz,availableZ:[u6],_containsTarget:!0,_tinyTerminal:!0,_tinyTerminalNetId:o8.mutuallyConnectedNetworkId??o8.connectionId,netId:a3}}),e8.push({regionId:g4,pointIds:[y3],d:{capacityMeshNodeId:g4,center:{x:l7?.x??o8.endRegion.d.center.x,y:l7?.y??o8.endRegion.d.center.y},width:kz,height:kz,availableZ:[p5],_containsTarget:!0,_tinyTerminal:!0,_tinyTerminalNetId:o8.mutuallyConnectedNetworkId??o8.connectionId,netId:a3}}),n4.push({portId:f4,region1Id:o8.startRegion.regionId,region2Id:m4,d:{portId:f4,x:c6?.x??o8.startRegion.d.center.x,y:c6?.y??o8.startRegion.d.center.y,z:u6,distToCentermostPortOnZ:0,_tinyTerminal:!0}}),n4.push({portId:y3,region1Id:o8.endRegion.regionId,region2Id:g4,d:{portId:y3,x:l7?.x??o8.endRegion.d.center.x,y:l7?.y??o8.endRegion.d.center.y,z:p5,distToCentermostPortOnZ:0,_tinyTerminal:!0}});let _3=e8.find(t56=>t56.regionId===o8.startRegion.regionId),b4=e8.find(t56=>t56.regionId===o8.endRegion.regionId);_3?.pointIds.push(f4),b4?.pointIds.push(y3),i6.push({connection:{connectionId:o8.connectionId},path:[{portId:f4},{portId:y3}]})}return{regions:e8,ports:n4,connections:o7,solvedRoutes:i6}})(t54),n3=e7;if(t54.connections.length<=180){let o7=new az(e7,{duplicatePortProximity:.05,routeSolveOptions:{...Xz(t54.minViaPadDiameter),USE_SPARSE_CANDIDATE_STORAGE:!0,ACCEPT_BEST_SOLUTION_ON_TIMEOUT:!0,GREEDY_FINAL_ROUTE_ITERS:4,MAX_ITERATIONS:Math.ceil(2e6*Yz(t54.effort)),RIP_THRESHOLD_RAMP_ATTEMPTS:0,STATIC_REACHABILITY_PRECHECK:!0}});o7.solve(),o7.failed?this.duplicateCongestedPortError=o7.error??"unknown error":(this.duplicateCongestedPortReport=o7.report,n3=o7.getOutput())}else this.duplicateCongestedPortError=`Skipped for ${t54.connections.length} connections`;this.duplicatedPortCount=this.duplicateCongestedPortReport?.duplicatedPorts.reduce((t55,e8)=>t55+e8.duplicatePortIds.length,0)??0;let o6=(i3={...n3,solvedRoutes:e7.solvedRoutes},s6=t54.effort,r6=t54.minViaPadDiameter,{serializedHyperGraph:i3,createSectionMask:({topology:t55})=>new Int8Array(t55.portCount),solveGraphOptions:$z(s6,r6),sectionSolverOptions:Bz(s6,r6)});var i3,s6,r6;this.tinyPipelineSolver=new Jz(o6),this.MAX_ITERATIONS=Hz(o6),this.originalRegionById=new Map(t54.graph.regions.map(t55=>[t55.regionId,t55])),this.originalRegionIds=new Set(this.originalRegionById.keys()),this.inputNodeWithPortPoints=((t55,e8)=>{let n4=new Map(e8.regions.map(t56=>[t56.regionId,t56])),o7=new Map(e8.ports.map(t56=>[t56.portId,t56]));return t55.graph.regions.map(t56=>{let e10=n4.get(t56.regionId),i6=(e10?.pointIds??t56.ports.map(t57=>t57.d.portId)).map(t57=>o7.get(t57)).filter(t57=>t57&&!zz(t57.d)._tinyTerminal).map(t57=>{let e11=t57,o8=zz(e11.d),i8=n4.get(e11.region1Id),s7=n4.get(e11.region2Id),r7=!!(Dz(i8?.d)._offBoardConnectionId??Dz(s7?.d)._offBoardConnectionId);return{portPointId:e11.portId,x:Number(o8.x??0),y:Number(o8.y??0),z:Number(o8.z??0),prevPortPointId:typeof o8.prevPortPointId=="string"?o8.prevPortPointId:void 0,nextPortPointId:typeof o8.nextPortPointId=="string"?o8.nextPortPointId:void 0,connectionNodeIds:[e11.region1Id,e11.region2Id],distToCentermostPortOnZ:Number(o8.distToCentermostPortOnZ??0),cramped:!!o8.cramped,connectsToOffBoardNode:r7}});return{capacityMeshNodeId:t56.d.capacityMeshNodeId,center:t56.d.center,width:t56.d.width,height:t56.d.height,portPoints:i6,availableZ:t56.d.availableZ,_containsObstacle:t56.d._containsObstacle,_containsTarget:t56.d._containsTarget,_offBoardConnectionId:t56.d._offBoardConnectionId,_offBoardConnectedCapacityMeshNodeIds:t56.d._offBoardConnectedCapacityMeshNodeIds,_qfpRegionType:t56.d._qfpRegionType,_isNarrowQfpPadGap:t56.d._isNarrowQfpPadGap}})})(t54,n3)}getSolverName(){return"TinyHypergraphPortPointPathingSolver"}_step(){try{this.tinyPipelineSolver.step()}catch(t55){throw this.error=`${this.getSolverName()} error: ${t55}`,this.failed=!0,t55}let t54=this.tinyPipelineSolver.getSolver("optimizeSection"),e7=this.getCurrentTinySolver();this.solved=this.tinyPipelineSolver.solved,this.failed=this.tinyPipelineSolver.failed,this.error=this.tinyPipelineSolver.error??null,this.progress=this.tinyPipelineSolver.progress,this.stats={duplicateCongestedPortSourceCount:this.duplicateCongestedPortReport?.duplicatedPorts.length??0,duplicateCongestedPortCount:this.duplicateCongestedPortReport?.duplicatedPorts.reduce((t55,e8)=>t55+e8.duplicatePortIds.length,0)??0,duplicateCongestedPortFallbackToOriginal:!!this.duplicateCongestedPortError,duplicateCongestedPortPenalty:this.duplicatedPortCount>0?150:0,duplicateCongestedPortPenaltyCount:this.tinyPipelineSolver.duplicatePortPenaltyCount,metadataPortPenaltyCount:this.tinyPipelineSolver.metadataPortPenaltyCount,crampedPortPenalty:150,crampedPortPenaltyCount:this.tinyPipelineSolver.crampedPortPenaltyCount,duplicateCongestedPortError:this.duplicateCongestedPortError,...this.tinyPipelineSolver.stats??{},...e7?.stats??{},...t54?.stats??{},currentStage:this.tinyPipelineSolver.getCurrentStageName(),stageStats:this.tinyPipelineSolver.getStageStats()},this.activeSubSolver=this.tinyPipelineSolver.activeSubSolver??null}preview(){return this.visualize()}getCurrentTinySolver(){let t54=this.tinyPipelineSolver.getSolver("optimizeSection");return t54?.solved&&!t54.failed?t54.getSolvedSolver():this.tinyPipelineSolver.getSolver("solveGraph")||void 0}getSolvedTinySolver(){return this.tinyPipelineSolver.getSolvedTinySolver()}getRouteMetadata(t54,e7){return t54.problem.routeMetadata?.[e7]}createAssignedPortPoint(t54,e7,n3){let o6=this.getRouteMetadata(t54,e7),i3=o6?(t55=>t55.simpleRouteConnection?.name??t55.connectionId)(o6):`route-${e7}`,s6=o6?(t55=>t55.simpleRouteConnection?.rootConnectionName??t55.mutuallyConnectedNetworkId)(o6):void 0,r6=t54.topology.portMetadata?.[n3];return{portPointId:String(r6?.serializedPortId??r6?.portId??`tiny-port-${n3}`),x:t54.topology.portX[n3],y:t54.topology.portY[n3],z:t54.topology.portZ[n3],connectionName:i3,rootConnectionName:s6,prevPortPointId:typeof r6?.prevPortPointId=="string"?r6.prevPortPointId:void 0,nextPortPointId:typeof r6?.nextPortPointId=="string"?r6.nextPortPointId:void 0}}getOutput(){let t54=this.getSolvedTinySolver(),e7=[],n3=t54.state.regionSegments,o6=t54.topology.regionMetadata??[];for(let i3=0;i3<n3.length;i3++){let s6=o6[i3]?.capacityMeshNodeId;if(!s6||!this.originalRegionIds.has(s6))continue;let r6=this.originalRegionById.get(s6);if(!r6)continue;let a3=n3[i3].map(([e8,n4,o7])=>{let i6=this.createAssignedPortPoint(t54,e8,n4),s7=this.createAssignedPortPoint(t54,e8,o7);return i6.portPointId&&s7.portPointId&&(i6.nextPortPointId=s7.portPointId,s7.prevPortPointId=i6.portPointId),[i6,s7]}),c6=a3.flat();c6.length!==0&&e7.push({capacityMeshNodeId:r6.d.capacityMeshNodeId,center:r6.d.center,width:r6.d.width,height:r6.d.height,portPoints:c6,portPointsInPairs:a3,availableZ:r6.d.availableZ})}return{nodesWithPortPoints:e7,inputNodeWithPortPoints:this.inputNodeWithPortPoints}}computeNodePf(t54){let e7=this.getOutput().nodesWithPortPoints.find(e8=>e8.capacityMeshNodeId===t54.capacityMeshNodeId),n3=this.originalRegionById.get(t54.capacityMeshNodeId);if(!e7||!n3)return null;let o6=nr2(e7);return yr2(n3.d,o6.numSameLayerCrossings,o6.numEntryExitLayerChanges,o6.numTransitionPairCrossings)}tryFinalAcceptance(){}getConstructorParams(){return[this.params]}visualize(){return this.tinyPipelineSolver.visualize()}},Qz=(t54,e7)=>{if(!t54||t54==="none")return t54;try{let n3=st2(t54);return`rgba(${n3.red},${n3.green},${n3.blue},${e7})`}catch{return vo2(t54,1-e7)}},tk=(t54,e7=.25)=>{let n3=Oo2({...t54,obstacles:[]});return{...n3,points:[],lines:n3.lines?.map(t55=>({...t55,strokeColor:Qz(t55.strokeColor,e7)})),rects:n3.rects?.map(t55=>({...t55,fill:Qz(t55.fill,e7),stroke:Qz(t55.stroke,e7)})),circles:n3.circles?.map(t55=>({...t55,fill:Qz(t55.fill,e7),stroke:Qz(t55.stroke,e7)}))}};function ek(t54,e7){return t54.x>=e7.center.x-e7.width/2&&t54.x<=e7.center.x+e7.width/2&&t54.y>=e7.center.y-e7.height/2&&t54.y<=e7.center.y+e7.height/2}var nk="escape-via:",ok=1e-4,ik=t54=>t54.obstacleId??[t54.layers.join("."),t54.center.x.toFixed(4),t54.center.y.toFixed(4),t54.width.toFixed(4),t54.height.toFixed(4)].join(":"),sk=(t54,e7,n3=1e-4)=>me2(t54,e7)<=n3,rk=class extends Fo2{constructor(t54,e7={}){super();__publicField(this,"ogSrj");__publicField(this,"viaDiameter");__publicField(this,"viaRadius");__publicField(this,"minTraceWidth");__publicField(this,"obstacleMargin");__publicField(this,"escapeOffset");__publicField(this,"requiredTraceClearance");__publicField(this,"requiredViaToViaClearance");__publicField(this,"outputSrj");__publicField(this,"escapeViaMetadataByPointId");__publicField(this,"createdEscapeVias");__publicField(this,"nextEscapeViaIndex",0);this.ogSrj=t54,this.viaDiameter=e7.viaDiameter??Eo2(t54).padDiameter,this.viaRadius=this.viaDiameter/2,this.minTraceWidth=e7.minTraceWidth??t54.minTraceWidth,this.obstacleMargin=e7.obstacleMargin??t54.defaultObstacleMargin??.15,this.escapeOffset=this.viaRadius+Math.max(this.minTraceWidth/2,this.obstacleMargin),this.requiredTraceClearance=this.minTraceWidth/2+this.obstacleMargin/2,this.requiredViaToViaClearance=this.viaDiameter+this.obstacleMargin,this.outputSrj=t54,this.escapeViaMetadataByPointId=new Map,this.createdEscapeVias=[]}getSolverName(){return"EscapeViaLocationSolver"}getConnectionNetIds(t54){return new Set([t54.name,t54.rootConnectionName,t54.netConnectionName,...t54.mergedConnectionNames??[]].filter(t55=>!!t55))}obstacleMatchesConnectionNet(t54,e7){return t54.connectedTo.some(t55=>e7.has(t55))}getObstacleZs(t54){return t54.zLayers&&t54.zLayers.length>0?t54.zLayers:t54.layers.map(t55=>Co2(t55,this.ogSrj.layerCount))}getViaSpanLayers(t54,e7){let n3=Co2(t54,this.ogSrj.layerCount),o6=Co2(e7,this.ogSrj.layerCount),i3=Math.min(n3,o6),s6=Math.max(n3,o6),r6=Array.from({length:s6-i3+1},(t55,e8)=>i3+e8);return{zLayers:r6,layers:r6.map(t55=>po2(t55,this.ogSrj.layerCount))}}createEscapeViaObstacle(t54){let{escapeVia:e7,connectionNetIds:n3}=t54,{layers:o6,zLayers:i3}=this.getViaSpanLayers(e7.sourceLayer,e7.targetLayer);return{obstacleId:`escape-via-obstacle:${e7.pointId}`,type:"rect",layers:o6,zLayers:i3,center:{x:e7.x,y:e7.y},width:this.viaDiameter,height:this.viaDiameter,connectedTo:Array.from(n3)}}selectSourceObstacle(t54){let{point:e7,sourceLayer:n3,connectionNetIds:o6}=t54;return this.ogSrj.obstacles.filter(t55=>!t55.isCopperPour&&t55.layers.includes(n3)&&ek(e7,t55)).sort((t55,n4)=>{let i3=t55.connectedTo.includes(e7.pointId??"")||t55.connectedTo.includes(e7.pcb_port_id??"")||this.obstacleMatchesConnectionNet(t55,o6);return i3!==(n4.connectedTo.includes(e7.pointId??"")||n4.connectedTo.includes(e7.pcb_port_id??"")||this.obstacleMatchesConnectionNet(n4,o6))?i3?-1:1:t55.width*t55.height-n4.width*n4.height})[0]}getCandidatePositions(t54,e7){if(!e7)return this.dedupeCandidatePositions([{x:t54.x+this.escapeOffset,y:t54.y},{x:t54.x-this.escapeOffset,y:t54.y},{x:t54.x,y:t54.y+this.escapeOffset},{x:t54.x,y:t54.y-this.escapeOffset},{x:t54.x+this.escapeOffset,y:t54.y+this.escapeOffset},{x:t54.x+this.escapeOffset,y:t54.y-this.escapeOffset},{x:t54.x-this.escapeOffset,y:t54.y+this.escapeOffset},{x:t54.x-this.escapeOffset,y:t54.y-this.escapeOffset}]);let n3=e7.center.x-e7.width/2,o6=e7.center.x+e7.width/2,i3=e7.center.y-e7.height/2,s6=e7.center.y+e7.height/2,r6=n3-this.escapeOffset,a3=o6+this.escapeOffset,c6=i3-this.escapeOffset,l7=s6+this.escapeOffset,h3=this.getEdgeSamples(i3,s6,t54.y),d4=this.getEdgeSamples(n3,o6,t54.x),u6=[];for(let t55 of h3)u6.push({x:r6,y:t55},{x:a3,y:t55});for(let t55 of d4)u6.push({x:t55,y:c6},{x:t55,y:l7});return this.dedupeCandidatePositions(u6)}dedupeCandidatePositions(t54){let e7=[];for(let n3 of t54)e7.some(t55=>sk(t55,n3))||e7.push(n3);return e7}pushEdgeSample(t54,e7,n3,o6){let i3=Math.max(n3,Math.min(o6,e7));t54.some(t55=>Math.abs(t55-i3)<=ok)||t54.push(i3)}getEdgeSamples(t54,e7,n3){let o6=[],i3=e7-t54;if(this.pushEdgeSample(o6,n3,t54,e7),i3<=ok)return o6;this.pushEdgeSample(o6,t54,t54,e7),this.pushEdgeSample(o6,e7,t54,e7),this.pushEdgeSample(o6,(t54+e7)/2,t54,e7);let s6=Math.max(t54,Math.min(e7,n3)),r6=Math.max(this.requiredViaToViaClearance,ok),a3=Math.ceil(i3/r6);for(let n4=1;n4<=a3;n4++){let i6=n4*r6;this.pushEdgeSample(o6,s6+i6,t54,e7),this.pushEdgeSample(o6,s6-i6,t54,e7)}return o6}isInsideBoard(t54){return t54.x>=this.ogSrj.bounds.minX+this.viaRadius&&t54.x<=this.ogSrj.bounds.maxX-this.viaRadius&&t54.y>=this.ogSrj.bounds.minY+this.viaRadius&&t54.y<=this.ogSrj.bounds.maxY-this.viaRadius&&(!(this.ogSrj.outline&&this.ogSrj.outline.length>=3)||ya2(t54,this.ogSrj.outline))}hasClearEscapePath(t54){let{sourcePoint:e7,candidate:n3,sourceLayer:o6,sourceObstacle:i3}=t54;if(this.ogSrj.outline&&this.ogSrj.outline.length>=3&&_a5({start:e7,end:n3,polygon:this.ogSrj.outline,margin:this.requiredTraceClearance}))return!1;for(let t55 of this.ogSrj.obstacles){if(t55===i3||!t55.layers.includes(o6))continue;if(ek(n3,t55))return!1;let s6=Tc2(t55);if(Math.min(...s6.map(t56=>ca2(e7,n3,t56.start,t56.end)))+ok<this.requiredTraceClearance)return!1}return!0}getBoardBoundarySegments(){if(this.ogSrj.outline&&this.ogSrj.outline.length>=3)return this.ogSrj.outline.map((t55,e8)=>({start:t55,end:this.ogSrj.outline[(e8+1)%this.ogSrj.outline.length]}));let{minX:t54,maxX:e7,minY:n3,maxY:o6}=this.ogSrj.bounds;return[{start:{x:t54,y:n3},end:{x:e7,y:n3}},{start:{x:e7,y:n3},end:{x:e7,y:o6}},{start:{x:e7,y:o6},end:{x:t54,y:o6}},{start:{x:t54,y:o6},end:{x:t54,y:n3}}]}getRayProbeDistance(){let{minX:t54,maxX:e7,minY:n3,maxY:o6}=this.ogSrj.bounds;return 2*Math.hypot(e7-t54,o6-n3)+this.viaDiameter}getRayIntersectionDistance(t54){let{rayStart:e7,rayEnd:n3,segmentStart:o6,segmentEnd:i3}=t54;if(!he2(e7,n3,o6,i3))return null;let s6=ge2(e7,n3,o6,i3);if(!s6)return null;let r6=me2(e7,s6);return r6<=ok?null:r6}getProjectedFreeSpace(t54){let{sourcePoint:e7,candidate:n3}=t54,o6=n3.x-e7.x,i3=n3.y-e7.y;return Math.abs(o6)<=ok||Math.abs(i3)<=ok?this.getProjectedFreeSpaceAlongDirection({...t54,direction:{x:o6,y:i3},travelDistance:me2(e7,n3)}):Math.min(this.getProjectedFreeSpaceAlongDirection({...t54,direction:{x:0,y:Math.sign(i3)},travelDistance:Math.abs(i3)}),this.getProjectedFreeSpaceAlongDirection({...t54,direction:{x:Math.sign(o6),y:Math.sign(i3)},travelDistance:me2(e7,n3)}),this.getProjectedFreeSpaceAlongDirection({...t54,direction:{x:Math.sign(o6),y:0},travelDistance:Math.abs(o6)}))}getProjectedFreeSpaceAlongDirection(t54){let{sourcePoint:e7,sourceLayer:n3,sourceObstacle:o6,direction:i3,travelDistance:s6}=t54,r6=Math.hypot(i3.x,i3.y);if(r6<=ok||s6<=ok)return 0;let a3=this.getRayProbeDistance(),c6=i3.x/r6,l7=i3.y/r6,h3={x:e7.x+c6*a3,y:e7.y+l7*a3},d4=Number.POSITIVE_INFINITY;for(let t55 of this.ogSrj.obstacles)if(t55!==o6&&t55.layers.includes(n3))for(let n4 of Tc2(t55)){let t56=this.getRayIntersectionDistance({rayStart:e7,rayEnd:h3,segmentStart:n4.start,segmentEnd:n4.end});t56!==null&&(d4=Math.min(d4,t56))}for(let t55 of this.getBoardBoundarySegments()){let n4=this.getRayIntersectionDistance({rayStart:e7,rayEnd:h3,segmentStart:t55.start,segmentEnd:t55.end});n4!==null&&(d4=Math.min(d4,n4))}return Number.isFinite(d4)?Math.max(0,d4-s6):0}getMinBlockingClearance(t54){let{candidate:e7,connectionNetIds:n3,sourceZ:o6,targetZ:i3}=t54,s6=Math.min(o6,i3),r6=Math.max(o6,i3),a3=Number.POSITIVE_INFINITY;for(let t55 of this.ogSrj.obstacles){let n4=this.getObstacleZs(t55);if(!n4.some(t56=>t56>=s6&&t56<=r6)||t55.isCopperPour&&!n4.includes(o6))continue;let i6=Oe2(e7,t55)-this.viaRadius;if(a3=Math.min(a3,i6),a3+ok<this.obstacleMargin)return a3}return a3}getMinPlacedEscapeViaClearance(t54){let e7=Number.POSITIVE_INFINITY;for(let n3 of this.createdEscapeVias){let o6=me2(t54,n3)-this.viaDiameter;if(e7=Math.min(e7,o6),e7+ok<this.obstacleMargin)return e7}return e7}selectPointOwner(t54){let{point:e7,groupConnections:n3,matchingCopperPours:o6}=t54,i3=jr2(e7),s6=n3.map(t55=>({connection:t55,pointIndex:t55.pointsToConnect.findIndex(t56=>jr2(t56)===i3)})).filter(t55=>t55.pointIndex!==-1);return s6.length===0?null:(s6.sort((t55,e8)=>{let n4=o6.some(e10=>this.obstacleMatchesConnectionNet(e10,this.getConnectionNetIds(t55.connection)));return n4!==o6.some(t56=>this.obstacleMatchesConnectionNet(t56,this.getConnectionNetIds(e8.connection)))?n4?-1:1:t55.pointIndex-e8.pointIndex}),s6[0])}findBestEscapeViaCandidate(t54){let{connection:e7,point:n3,pointIndex:o6,matchingCopperPours:i3,connectionNetIds:s6,sourceObstacle:r6}=t54;if(!co2(n3))return null;let a3=n3.layer,c6=Co2(a3,this.ogSrj.layerCount),l7=r6??this.selectSourceObstacle({point:n3,sourceLayer:a3,connectionNetIds:s6}),h3=this.getCandidatePositions(n3,l7),d4=null;for(let t55 of i3){let i6=t55.layers[0];if(!i6||i6===a3)continue;let r7=Co2(i6,this.ogSrj.layerCount),u6=ik(t55);for(let p5 of h3){if(!this.isInsideBoard(p5)||!ek(p5,t55)||!this.hasClearEscapePath({sourcePoint:n3,candidate:p5,sourceLayer:a3,sourceObstacle:l7}))continue;let h4=this.getMinBlockingClearance({candidate:p5,connectionNetIds:s6,sourceZ:c6,targetZ:r7});if(h4+ok<this.obstacleMargin)continue;let m4=this.getMinPlacedEscapeViaClearance(p5);if(m4+ok<this.obstacleMargin)continue;let g4=this.getProjectedFreeSpace({sourcePoint:n3,candidate:p5,sourceLayer:a3,sourceObstacle:l7}),f4=Math.min(g4,3),y3=100*h4-me2(n3,p5)-.5*Math.abs(r7-c6)+2*f4+(Number.isFinite(m4)?10*Math.min(m4,this.requiredViaToViaClearance):0);(!d4||y3>d4.score)&&(d4={pointId:`${nk}${e7.name}:${n3.pointId??`p${o6}`}:${i6}:${this.nextEscapeViaIndex++}`,x:p5.x,y:p5.y,connectionName:e7.name,rootConnectionName:e7.rootConnectionName??e7.name,sourcePointIndex:o6,sourcePointId:n3.pointId,sourceLayer:a3,targetLayer:i6,targetPourKey:u6,score:y3})}}return d4}buildPointPlacementPlans(t54){let{mergedConnection:e7,groupConnections:n3,matchingCopperPours:o6,connectionNetIds:i3}=t54,s6=[];for(let t55 of e7.pointsToConnect){let e8=this.selectPointOwner({point:t55,groupConnections:n3,matchingCopperPours:o6});if(!e8)continue;let r6=co2(t55)?this.selectSourceObstacle({point:t55,sourceLayer:t55.layer,connectionNetIds:i3}):void 0,a3=co2(t55)?this.getCandidatePositions(t55,r6).length:0;s6.push({point:t55,pointOwner:e8,sourceObstacle:r6,candidateCount:a3})}return s6.sort((t55,e8)=>{if(t55.candidateCount!==e8.candidateCount)return t55.candidateCount-e8.candidateCount;let n4=(t55.sourceObstacle?.width??0)*(t55.sourceObstacle?.height??0),o7=(e8.sourceObstacle?.width??0)*(e8.sourceObstacle?.height??0);return n4!==o7?n4-o7:t55.pointOwner.pointIndex-e8.pointOwner.pointIndex})}_step(){let t54=this.ogSrj.obstacles.filter(t55=>t55.isCopperPour),e7=this.ogSrj.connections,n3=new Map(e7.map(t55=>[t55.name,t55])),o6=e7.map(t55=>structuredClone(t55)),i3=new Map(o6.map(t55=>[t55.name,t55])),s6=structuredClone(this.ogSrj.obstacles),r6=Yr2([...e7]);for(let e8 of r6){let o7=(e8.mergedConnectionNames??[e8.name]).map(t55=>n3.get(t55)).filter(t55=>t55!==void 0);if(o7.length===0)continue;let r7=new Set;for(let t55 of o7)for(let e10 of this.getConnectionNetIds(t55))r7.add(e10);let a3=t54.filter(t55=>this.obstacleMatchesConnectionNet(t55,r7));if(a3.length===0)continue;let c6=new Map,l7=new Map,h3=this.buildPointPlacementPlans({mergedConnection:e8,groupConnections:o7,matchingCopperPours:a3,connectionNetIds:r7});for(let{point:t55,pointOwner:e10,sourceObstacle:n4}of h3){let o8=this.findBestEscapeViaCandidate({connection:e10.connection,point:t55,pointIndex:e10.pointIndex,matchingCopperPours:a3,connectionNetIds:r7,sourceObstacle:n4});if(!o8)continue;let h4=i3.get(e10.connection.name);if(!h4||h4.pointsToConnect.some(t56=>co2(t56)&&t56.layer===o8.sourceLayer&&sk(t56,o8)))continue;h4.pointsToConnect.push({x:o8.x,y:o8.y,layer:o8.sourceLayer,pointId:o8.pointId,terminalVia:{toLayer:o8.targetLayer,viaDiameter:this.viaDiameter}}),this.escapeViaMetadataByPointId.set(o8.pointId,o8),this.createdEscapeVias.push(o8),s6.push(this.createEscapeViaObstacle({escapeVia:o8,connectionNetIds:this.getConnectionNetIds(e10.connection)}));let d4=c6.get(o8.targetPourKey);d4?d4.push(o8.pointId):c6.set(o8.targetPourKey,[o8.pointId]),l7.has(o8.targetPourKey)||l7.set(o8.targetPourKey,e10.connection.name)}for(let[t55,e10]of c6.entries()){if(e10.length<=1)continue;let n4=l7.get(t55);if(!n4)continue;let o8=i3.get(n4);o8&&(o8.externallyConnectedPointIds=[...o8.externallyConnectedPointIds??[],e10])}}this.outputSrj={...structuredClone(this.ogSrj),connections:o6,obstacles:s6},this.solved=!0}getOutputSimpleRouteJson(){return structuredClone(this.outputSrj)}getEscapeViaMetadataByPointId(){return new Map(this.escapeViaMetadataByPointId)}visualize(){return{title:"Escape Via Location Solver",points:this.outputSrj.connections.flatMap(t54=>t54.pointsToConnect.map(e7=>({x:e7.x,y:e7.y,color:e7.pointId?.startsWith(nk)===!0?"#0f766e":"#dc2626",label:e7.pointId?.startsWith(nk)===!0?`${t54.name}
629
629
  escape via`:t54.name}))),lines:this.createdEscapeVias.map(t54=>{let e7=this.outputSrj.connections.find(e8=>e8.name===t54.connectionName)?.pointsToConnect[t54.sourcePointIndex]??null;return{points:e7?[{x:e7.x,y:e7.y},{x:t54.x,y:t54.y}]:[{x:t54.x,y:t54.y}],strokeColor:"#0f766e"}}),circles:this.createdEscapeVias.map(t54=>({center:{x:t54.x,y:t54.y},radius:this.viaRadius,strokeColor:"#0f766e",label:`${t54.connectionName}
630
- ${t54.targetLayer}`})),rects:this.outputSrj.obstacles.filter(t54=>!t54.isCopperPour).map(t54=>({...t54,fill:"rgba(220,38,38,0.12)"}))}}},ak=t54=>({...t54}),ck=t54=>({...t54,route:t54.route?.map(ak),vias:t54.vias?.map(t55=>({...t55}))}),lk=t54=>t54.map(ck),hk="#0000FF",dk=.15,uk=1e-6,pk=.1,mk=["top","bottom","left","right"],gk=t54=>t54.x*t54.x+t54.y*t54.y,fk=(t54,e7)=>({x:t54.x-e7.x,y:t54.y-e7.y}),yk=(t54,e7,n3)=>{let o6=fk(n3,e7),i3=gk(o6);if(i3<=uk)return Math.sqrt(gk(fk(t54,e7)));let s6=(a3=fk(t54,e7),c6=o6,r6=(a3.x*c6.x+a3.y*c6.y)/i3,Math.max(0,Math.min(1,r6)));var r6,a3,c6;let l7={x:e7.x+o6.x*s6,y:e7.y+o6.y*s6};return Math.sqrt(gk(fk(t54,l7)))},_k=t54=>t54?.z===1?"bottom":"top",bk=(t54,e7,n3)=>(t54.z??0)===(e7.z??0)&&(e7.z??0)===(n3.z??0)&&(t54.x===e7.x&&e7.x===n3.x||t54.y===e7.y&&e7.y===n3.y),xk=(t54,e7,n3)=>{let o6=n3?.get(t54);if(o6)return o6;let i3=t54.route??[],s6=t54.traceThickness??dk,r6=Number.POSITIVE_INFINITY,a3=Number.POSITIVE_INFINITY,c6=Number.NEGATIVE_INFINITY,l7=Number.NEGATIVE_INFINITY,h3=!1,d4=(t55,e8,n4)=>{r6=Math.min(r6,t55-n4),a3=Math.min(a3,e8-n4),c6=Math.max(c6,t55+n4),l7=Math.max(l7,e8+n4),h3=!0},u6={segments:[],segmentsByLayer:{top:[],bottom:[]},vias:(t54.vias??[]).map(n4=>{let o7=(n4.diameter??t54.viaDiameter??.3)/2;return d4(n4.x,n4.y,o7),{center:{x:n4.x,y:n4.y},radius:o7,routeIndex:e7}}),bounds:{minX:0,minY:0,maxX:0,maxY:0}};for(let t55=0;t55<i3.length-1;){let n4=i3[t55],o7=t55+1,r7=i3[o7],a4=s6/2;for(n4&&d4(n4.x,n4.y,a4),r7&&d4(r7.x,r7.y,a4);o7<i3.length-1;){let t56=i3[o7],e8=i3[o7+1];if(!n4||!t56||!e8||_k(n4)!==_k(t56)||_k(t56)!==_k(e8)||!bk(n4,t56,e8))break;o7+=1,r7=e8,d4(e8.x,e8.y,a4)}if(!n4||!r7){t55+=1;continue}let c7=_k(n4),l10={start:n4,end:r7,routeIndex:e7,pointIndex:t55,endPointIndex:o7,thickness:s6,halfThickness:a4,layer:c7,minX:Math.min(n4.x,r7.x)-a4,maxX:Math.max(n4.x,r7.x)+a4,minY:Math.min(n4.y,r7.y)-a4,maxY:Math.max(n4.y,r7.y)+a4};u6.segments.push(l10),u6.segmentsByLayer[c7].push(l10),t55=o7}if(!h3)for(let t55 of i3)d4(t55.x,t55.y,s6/2);return u6.bounds=h3?{minX:r6,minY:a3,maxX:c6,maxY:l7}:{minX:0,minY:0,maxX:0,maxY:0},n3?.set(t54,u6),u6},vk=(t54,e7,n3)=>e7.x<=Math.max(t54.x,n3.x)+uk&&e7.x>=Math.min(t54.x,n3.x)-uk&&e7.y<=Math.max(t54.y,n3.y)+uk&&e7.y>=Math.min(t54.y,n3.y)-uk,Sk=(t54,e7,n3)=>(e7.y-t54.y)*(n3.x-e7.x)-(e7.x-t54.x)*(n3.y-e7.y),Ik=(t54,e7,n3,o6)=>((t55,e8,n4,o7)=>{let i3=Sk(t55,e8,n4),s6=Sk(t55,e8,o7),r6=Sk(n4,o7,t55),a3=Sk(n4,o7,e8);return!!(Math.abs(i3)<=uk&&vk(t55,n4,e8))||!!(Math.abs(s6)<=uk&&vk(t55,o7,e8))||!!(Math.abs(r6)<=uk&&vk(n4,t55,o7))||!!(Math.abs(a3)<=uk&&vk(n4,e8,o7))||i3>0!=s6>0&&r6>0!=a3>0})(t54,e7,n3,o6)?0:Math.min(yk(t54,n3,o6),yk(e7,n3,o6),yk(n3,t54,e7),yk(o6,t54,e7)),Pk=(t54,e7)=>Math.abs(t54.x-e7.x)<=uk&&Math.abs(t54.y-e7.y)<=uk,Mk=(t54,e7)=>Pk(t54.start,e7.start)||Pk(t54.start,e7.end)||Pk(t54.end,e7.start)||Pk(t54.end,e7.end),Ck=t54=>{if(!t54)return[];let e7=[t54.connectionName,t54.rootConnectionName].filter(t55=>!!t55);return Array.from(new Set(e7))},Nk=(t54,e7)=>{let n3=Ck(t54),o6=Ck(e7);return n3.length!==0&&o6.length!==0&&n3.some(t55=>o6.includes(t55))},Tk=(t54,e7,n3)=>t54.minX-n3<=e7.maxX&&t54.maxX+n3>=e7.minX&&t54.minY-n3<=e7.maxY&&t54.maxY+n3>=e7.minY,wk=(t54,e7,n3)=>{let o6=n3+t54.halfThickness+e7.halfThickness-uk;return t54.minX-n3<=e7.maxX&&t54.maxX+n3>=e7.minX&&t54.minY-n3<=e7.maxY&&t54.maxY+n3>=e7.minY&&o6>0},Rk=(t54,e7,n3,o6)=>{let i3=o6+n3.halfThickness+e7-uk,s6=t54.x-i3,r6=t54.x+i3,a3=t54.y-i3,c6=t54.y+i3;return s6<=n3.maxX&&r6>=n3.minX&&a3<=n3.maxY&&c6>=n3.minY},Ek=(t54,e7)=>{let n3=new WeakMap,o6=t54.map((t55,e8)=>xk(t55,e8,n3)),i3=[],s6=new Set,r6=t55=>{s6.has(t55.label)||(s6.add(t55.label),i3.push(t55))};for(let n4=0;n4<o6.length;n4+=1){let i6=o6[n4];if(i6)for(let s7=n4+1;s7<o6.length;s7+=1){let a3=o6[s7];if(a3&&!Nk(t54[n4],t54[s7])&&Tk(i6.bounds,a3.bounds,e7)){for(let t55 of["top","bottom"]){let o7=i6.segmentsByLayer[t55],c6=a3.segmentsByLayer[t55];for(let i8 of o7)for(let o8 of c6){if(Mk(i8,o8)||!wk(i8,o8,e7))continue;let a4=e7+(i8.thickness+o8.thickness)/2-uk;Ik(i8.start,i8.end,o8.start,o8.end)>=a4||r6({center:{x:(Math.max(i8.minX-e7,o8.minX-e7)+Math.min(i8.maxX+e7,o8.maxX+e7))/2,y:(Math.max(i8.minY-e7,o8.minY-e7)+Math.min(i8.maxY+e7,o8.maxY+e7))/2},label:`trace-violation:${n4}:s${i8.pointIndex}:${s7}:s${o8.pointIndex}:${t55}`})}}for(let t55 of i6.segments)for(let[o7,i8]of a3.vias.entries()){if(!Rk(i8.center,i8.radius,t55,e7))continue;let a4=e7+t55.halfThickness+i8.radius-uk;yk(i8.center,t55.start,t55.end)>=a4||r6({center:i8.center,label:`trace-violation:${n4}:s${t55.pointIndex}:${s7}:v${o7}`})}for(let t55 of a3.segments)for(let[o7,a4]of i6.vias.entries()){if(!Rk(a4.center,a4.radius,t55,e7))continue;let i8=e7+t55.halfThickness+a4.radius-uk;yk(a4.center,t55.start,t55.end)>=i8||r6({center:a4.center,label:`trace-violation:${n4}:v${o7}:${s7}:s${t55.pointIndex}`})}}}}return(t55=>{let e8=[];for(let n4 of t55){let t56=e8.find(t57=>{return e10=t57.center,o7=n4.center,Math.hypot(e10.x-o7.x,e10.y-o7.y)<=.28;var e10,o7});t56?(t56.center={x:(t56.center.x*t56.count+n4.center.x)/(t56.count+1),y:(t56.center.y*t56.count+n4.center.y)/(t56.count+1)},t56.labels.push(n4.label),t56.count+=1):e8.push({center:n4.center,labels:[n4.label],count:1})}return e8.map((t56,e10)=>({center:t56.center,radius:Math.min(.3,.2+.035*Math.sqrt(t56.count-1)),stroke:"#f59e0b",fill:"rgba(245, 158, 11, 0.46)",label:t56.count===1?t56.labels[0]:`trace-violations:${e10}:count-${t56.count}`}))})(i3)},Ak=({routeIndexes:t54,layers:e7,routePointIndexes:n3})=>`${t54[0]}:${e7[0]}:${n3[0].join(",")}:${t54[1]}:${e7[1]}:${n3[1].join(",")}`,Ok=(t54,e7,n3,o6,i3,s6,r6)=>{let a3=((t55,e8,n4,o7,i6,s7)=>t55<n4?`${t55}:${e8}:${i6.join(",")}:${n4}:${o7}:${s7.join(",")}`:`${n4}:${o7}:${s7.join(",")}:${t55}:${e8}:${i6.join(",")}`)(e7,n3,o6,i3,s6,r6),c6=t54.get(a3);if(c6){let[t55,n4]=e7<o6?[s6,r6]:[r6,s6];for(let e8 of t55)c6.routePointIndexes[0].includes(e8)||c6.routePointIndexes[0].push(e8);for(let t56 of n4)c6.routePointIndexes[1].includes(t56)||c6.routePointIndexes[1].push(t56);return c6.routePointIndexes[0].sort((t56,e8)=>t56-e8),void c6.routePointIndexes[1].sort((t56,e8)=>t56-e8)}e7<o6?t54.set(a3,{routeIndexes:[e7,o6],layers:[n3,i3],routePointIndexes:[[...new Set(s6)].sort((t55,e8)=>t55-e8),[...new Set(r6)].sort((t55,e8)=>t55-e8)]}):t54.set(a3,{routeIndexes:[o6,e7],layers:[i3,n3],routePointIndexes:[[...new Set(r6)].sort((t55,e8)=>t55-e8),[...new Set(s6)].sort((t55,e8)=>t55-e8)]})},Lk=t54=>{let e7=[];for(let n3=t54.pointIndex;n3<=t54.endPointIndex;n3+=1)e7.push(n3);return e7},Dk=(t54,e7)=>!e7||t54.some(t55=>e7.has(t55)),zk=(t54,e7)=>{let n3=t54.route??[],o6=[];for(let t55=0;t55<n3.length;t55+=1){let i3=n3[t55];i3&&Math.abs(i3.x-e7.center.x)<=uk&&Math.abs(i3.y-e7.center.y)<=uk&&o6.push(t55)}return o6},kk=(t54,e7,n3)=>t54.minX-n3<=e7.maxX&&t54.maxX+n3>=e7.minX&&t54.minY-n3<=e7.maxY&&t54.maxY+n3>=e7.minY,Fk=(t54,e7,n3)=>{let o6=n3+t54.halfThickness+e7.halfThickness-uk;return t54.minX-n3<=e7.maxX&&t54.maxX+n3>=e7.minX&&t54.minY-n3<=e7.maxY&&t54.maxY+n3>=e7.minY&&o6>0},jk=(t54,e7,n3,o6)=>{let i3=o6+n3.halfThickness+e7-uk,s6=t54.x-i3,r6=t54.x+i3,a3=t54.y-i3,c6=t54.y+i3;return s6<=n3.maxX&&r6>=n3.minX&&a3<=n3.maxY&&c6>=n3.minY},Yk=(t54,e7,n3)=>{let o6=n3+t54.radius+e7.radius-uk;return Math.abs(t54.center.x-e7.center.x)<=o6&&Math.abs(t54.center.y-e7.center.y)<=o6},Xk=(t54,e7,n3,o6,i3)=>{let s6=t54.map((t55,e8)=>xk(t55,e8,o6)),r6=new Map;if(e7.size===0)return[];let a3=Array.from(e7),c6=new Map,l7=t55=>{let e8=c6.get(t55);if(e8)return e8;let o7=s6[t55];if(!o7)return[];let i6=[];for(let e10=0;e10<s6.length;e10+=1){if(e10===t55)continue;let r7=s6[e10];r7&&kk(o7.bounds,r7.bounds,n3)&&i6.push(e10)}return c6.set(t55,i6),i6};for(let t55 of a3){let o7=s6[t55];if(!o7)continue;let a4=l7(t55),c7=i3?.get(t55);for(let l10 of o7.segments){let o8=Lk(l10);if(Dk(o8,c7))for(let c8 of a4){if(t55>c8&&e7.has(c8))continue;let a6=s6[c8];if(!a6)continue;let h3=i3?.get(c8),d4=a6.segmentsByLayer[l10.layer];for(let t56 of d4){let e8=Lk(t56);if(!Dk(e8,h3)||Mk(l10,t56)||!Fk(l10,t56,n3))continue;let i6=n3+(l10.thickness+t56.thickness)/2-uk;Ik(l10.start,l10.end,t56.start,t56.end)<i6&&Ok(r6,l10.routeIndex,l10.layer,t56.routeIndex,t56.layer,o8,e8)}}}}for(let o7 of a3){let a4=s6[o7];if(!a4)continue;let c7=l7(o7),h3=i3?.get(o7);for(let l10 of a4.vias){let a6=zk(t54[l10.routeIndex],l10);if(Dk(a6,h3))for(let t55 of c7){if(o7>t55&&e7.has(t55))continue;let c8=s6[t55];if(!c8)continue;let h4=i3?.get(t55);for(let t56 of c8.segments){let e8=Lk(t56);if(!Dk(e8,h4)||!jk(l10.center,l10.radius,t56,n3))continue;let o8=n3+t56.thickness/2+l10.radius-uk;yk(l10.center,t56.start,t56.end)<o8&&Ok(r6,t56.routeIndex,t56.layer,l10.routeIndex,"via",e8,a6)}}}}for(let e8 of a3){let o7=s6[e8];if(!o7)continue;let a4=l7(e8),c7=i3?.get(e8);for(let e10 of o7.segments){let o8=Lk(e10);if(Dk(o8,c7))for(let c8 of a4){let a6=s6[c8];if(!a6)continue;let l10=i3?.get(c8);for(let i6 of a6.vias){let s7=zk(t54[i6.routeIndex],i6);if(!Dk(s7,l10)||!jk(i6.center,i6.radius,e10,n3))continue;let a7=n3+e10.thickness/2+i6.radius-uk;yk(i6.center,e10.start,e10.end)<a7&&Ok(r6,e10.routeIndex,e10.layer,i6.routeIndex,"via",o8,s7)}}}}for(let o7 of a3){let a4=s6[o7];if(!a4)continue;let c7=l7(o7),h3=i3?.get(o7);for(let l10 of a4.vias){let a6=zk(t54[l10.routeIndex],l10);if(Dk(a6,h3))for(let h4 of c7){if(o7>h4&&e7.has(h4))continue;let c8=s6[h4];if(!c8)continue;let d4=i3?.get(h4);for(let e8 of c8.vias){let o8=zk(t54[e8.routeIndex],e8);if(!Dk(o8,d4)||!Yk(l10,e8,n3))continue;let i6=n3+l10.radius+e8.radius-uk;Math.hypot(l10.center.x-e8.center.x,l10.center.y-e8.center.y)<i6&&Ok(r6,l10.routeIndex,"via",e8.routeIndex,"via",a6,o8)}}}}return Array.from(r6.values())},$k=(t54,e7)=>t54.x>=e7.minX-uk&&t54.x<=e7.maxX+uk&&t54.y>=e7.minY-uk&&t54.y<=e7.maxY+uk,Bk=(t54,e7,n3)=>{switch(e7){case"left":return{minX:t54.minX,maxX:t54.minX+n3,minY:t54.minY,maxY:t54.maxY};case"right":return{minX:t54.maxX-n3,maxX:t54.maxX,minY:t54.minY,maxY:t54.maxY};case"top":return{minX:t54.minX,maxX:t54.maxX,minY:t54.maxY-n3,maxY:t54.maxY};case"bottom":return{minX:t54.minX,maxX:t54.maxX,minY:t54.minY,maxY:t54.minY+n3}}},Hk=(t54,e7,n3)=>{let o6=e7.x-t54.x,i3=e7.y-t54.y,s6=0,r6=1,a3=(t55,e8)=>{if(Math.abs(t55)<=uk)return e8>=-1e-6;let n4=e8/t55;return t55<0?!(n4>r6)&&(n4>s6&&(s6=n4),!0):!(n4<s6)&&(n4<r6&&(r6=n4),!0)};if(!(a3(-o6,t54.x-n3.minX)&&a3(o6,n3.maxX-t54.x)&&a3(-i3,t54.y-n3.minY)&&a3(i3,n3.maxY-t54.y)))return 0;let c6=Math.hypot(o6,i3);return Math.max(0,r6-s6)*c6},Wk=(t54,e7)=>mk.filter(n3=>{switch(n3){case"left":return Math.abs(t54.x-e7.minX)<=uk;case"right":return Math.abs(t54.x-e7.maxX)<=uk;case"top":return Math.abs(t54.y-e7.maxY)<=uk;case"bottom":return Math.abs(t54.y-e7.minY)<=uk}return!1}),Vk=(t54,e7)=>{let n3=[];return t54.x<e7.minX-uk&&n3.push("left"),t54.x>e7.maxX+uk&&n3.push("right"),t54.y>e7.maxY+uk&&n3.push("top"),t54.y<e7.minY-uk&&n3.push("bottom"),n3},Uk=(t54,e7,n3)=>{let o6=e7.x-t54.x,i3=e7.y-t54.y;switch(n3){case"left":case"right":return Math.abs(o6)<=uk&&Math.abs(i3)>uk;case"top":case"bottom":return Math.abs(i3)<=uk&&Math.abs(o6)>uk}},Gk=(t54,e7,n3)=>{let o6=[],i3=Math.max(n3,uk),s6=Math.min(.1,i3/4);for(let n4=0;n4<t54.length;n4+=1){let r6=t54[n4],a3=r6?.route??[];for(let t55=0;t55<a3.length-1;t55+=1){let c6=a3[t55],l7=a3[t55+1];if(!c6||!l7)continue;let h3=Vk(c6,e7),d4=Vk(l7,e7),u6=Wk(c6,e7),p5=Wk(l7,e7),m4=mk.filter(t56=>!(Hk(c6,l7,Bk(e7,t56,i3))<=s6)&&!!Uk(c6,l7,t56)),g4=!$k(c6,e7)||!$k(l7,e7),f4=Array.from(new Set([...m4,...h3,...d4]));(g4||f4.length!==0)&&o6.push({routeIndex:n4,connectionName:r6.connectionName??r6.rootConnectionName??`route-${n4}`,segmentIndex:t55,touchedSides:f4,startSides:u6,endSides:p5,start:c6,end:l7})}}return o6},Zk=t54=>t54?.center&&t54.width&&t54.height?{minX:t54.center.x-t54.width/2,maxX:t54.center.x+t54.width/2,minY:t54.center.y-t54.height/2,maxY:t54.center.y+t54.height/2,width:t54.width,height:t54.height,center:t54.center}:null,qk=t54=>t54==="bottom"?hk:"#FF0000",Jk=t54=>{let e7=t54.route??[],n3=[];if(e7.length<2)return n3;let o6=_k(e7[0]),i3=[e7[0]];for(let s6=1;s6<e7.length;s6+=1){let r6=e7[s6],a3=_k(r6);a3===o6?i3.push(r6):(i3.length>=2&&n3.push({points:i3,strokeColor:qk(o6),strokeWidth:t54.traceThickness??dk,label:t54.connectionName??"route"}),o6=a3,i3=[e7[s6-1],r6])}return i3.length>=2&&n3.push({points:i3,strokeColor:qk(o6),strokeWidth:t54.traceThickness??dk,label:t54.connectionName??"route"}),n3},Kk=(t54,e7)=>({title:`HighDensityRepair02 Initial State (margin=${e7})`,routes:t54}),Qk=t54=>{let e7=[];for(let n3 of t54){let t55=e7[e7.length-1];t55&&t55.z===n3.z&&Pk(t55,n3)||e7.push(n3)}return e7},tF=(t54,e7,n3)=>{let o6=Math.max(0,t54.minX-e7.maxX,e7.minX-t54.maxX),i3=Math.max(0,t54.minY-e7.maxY,e7.minY-t54.maxY);return Math.hypot(o6,i3)<=n3+uk},eF2=(t54,e7)=>{let n3=Number.POSITIVE_INFINITY;for(let o6 of t54.segments)for(let t55 of e7.segments){if(o6.layer!==t55.layer)continue;let e8=Ik(o6.start,o6.end,t55.start,t55.end)-(o6.thickness+t55.thickness)/2;n3=Math.min(n3,e8)}return n3},nF=({currentRoutes:t54,candidateRoutes:e7,candidateRouteIndexes:n3,maximumAllowedClearance:o6})=>{let i3=new WeakMap,s6=new WeakMap,r6=[],a3=Array.from(n3).sort((t55,e8)=>t55-e8),c6=t54.map((t55,e8)=>xk(t55,e8,i3)),l7=e7.map((t55,e8)=>xk(t55,e8,s6)),h3=new Set;for(let t55 of a3)for(let n4=0;n4<e7.length;n4+=1){if(n4===t55)continue;let e8=Math.min(t55,n4),i6=Math.max(t55,n4),s7=`${e8}:${i6}`;if(h3.has(s7))continue;h3.add(s7);let a4=l7[e8],d4=l7[i6];if(!a4||!d4||!tF(a4.bounds,d4.bounds,o6))continue;let u6=eF2(a4,d4);if(!Number.isFinite(u6)||u6>o6+uk||!c6[e8]||!c6[i6])continue;let p5=eF2(c6[e8],c6[i6]);!Number.isFinite(p5)||u6>=p5-uk||r6.push({routeIndexes:[e8,i6],previousClearance:p5,nextClearance:u6})}return r6},oF=.001,iF=(t54,e7)=>t54.map(t55=>{let n3=t55.route??[];return n3.length===0?t55:{...t55,route:n3.map((t56,o6)=>o6===0||o6===n3.length-1?((t57,e8)=>{let n4={...t57};return Math.abs(n4.x-e8.minX)<=oF?n4.x=e8.minX:Math.abs(n4.x-e8.maxX)<=oF&&(n4.x=e8.maxX),Math.abs(n4.y-e8.minY)<=oF?n4.y=e8.minY:Math.abs(n4.y-e8.maxY)<=oF&&(n4.y=e8.maxY),n4})(t56,e7):t56)}}),sF=(t54,e7)=>Array.from(e7).flatMap(e8=>Jk(t54[e8]).map(t55=>({...t55,strokeColor:"#000000",strokeWidth:t55.strokeWidth,label:`candidate:${t55.label}`}))),rF=(t54,e7,n3,o6,i3)=>{let s6="rgba(0, 0, 0, 0)";switch(e7){case"left":return{center:{x:t54.minX+n3/2,y:t54.center.y},width:n3,height:t54.height,stroke:s6,fill:o6,label:i3};case"right":return{center:{x:t54.maxX-n3/2,y:t54.center.y},width:n3,height:t54.height,stroke:s6,fill:o6,label:i3};case"top":return{center:{x:t54.center.x,y:t54.maxY-n3/2},width:t54.width,height:n3,stroke:s6,fill:o6,label:i3};case"bottom":return{center:{x:t54.center.x,y:t54.minY+n3/2},width:t54.width,height:n3,stroke:s6,fill:o6,label:i3}}},aF=({routes:t54,candidateRoutes:e7,candidateRouteIndexes:n3,originalRoutes:o6,boundary:i3,side:s6,margin:r6,rejected:a3,rejectionReason:c6})=>{let l7=Array.from(n3).map(t55=>e7[t55].connectionName??`route-${t55}`);return{title:a3?`${s6} move rejected (${c6})`:`${s6} move accepted`,routes:a3?t54:e7,originalRoutes:o6,activeSide:s6,candidateRouteNames:l7,overlayLines:a3?sF(e7,n3):[],overlayRects:[rF(i3,s6,r6,a3?"rgba(220, 38, 38, 0.14)":"rgba(16, 185, 129, 0.14)",a3?`rejected:${s6}`:`accepted:${s6}`)]}},cF=(t54,e7,n3,o6)=>{let i3=(t54?.adjacentObstacles??[]).some(t55=>((t56,e8,n4,o7)=>{let i6=(t57=>t57.center&&t57.width&&t57.height?{minX:t57.center.x-t57.width/2,maxX:t57.center.x+t57.width/2,minY:t57.center.y-t57.height/2,maxY:t57.center.y+t57.height/2}:null)(t56);if(!i6)return!1;switch(n4){case"left":return i6.maxX>=e8.minX-uk&&i6.minX<=e8.minX+o7+uk;case"right":return i6.minX<=e8.maxX+uk&&i6.maxX>=e8.maxX-o7-uk;case"top":return i6.minY<=e8.maxY+uk&&i6.maxY>=e8.maxY-o7-uk;case"bottom":return i6.maxY>=e8.minY-uk&&i6.minY<=e8.minY+o7+uk}})(t55,e7,n3,o6));return{hasObstacle:i3,moveAmount:i3?o6:o6/2}},lF=({start:t54,end:e7,side:n3,boundary:o6,amount:i3,targetAxisValue:s6})=>{let r6=(({side:t55,boundary:e8,amount:n4,targetAxisValue:o7})=>{let i6=o7??(()=>{switch(t55){case"left":return e8.minX+n4;case"right":return e8.maxX-n4;case"top":return e8.maxY-n4;case"bottom":return e8.minY+n4}})();switch(t55){case"left":case"right":return Math.min(Math.max(i6,e8.minX),e8.maxX);case"top":case"bottom":return Math.min(Math.max(i6,e8.minY),e8.maxY)}})({side:n3,boundary:o6,amount:i3,targetAxisValue:s6});switch(n3){case"left":case"right":return Qk([t54,{x:r6,y:t54.y,z:t54.z},{x:r6,y:e7.y,z:e7.z},e7]);case"top":case"bottom":return Qk([t54,{x:t54.x,y:r6,z:t54.z},{x:e7.x,y:r6,z:e7.z},e7])}},hF=(t54,e7,n3,o6,i3,s6,r6,a3=!1)=>{let c6=t54.route??[];if(c6.length<2||e7.length===0)return ck(t54);let l7=a3?i3:Math.max(i3,s6),h3=((t55,e8)=>{switch(t55){case"left":return{x:e8,y:0};case"right":return{x:-e8,y:0};case"top":return{x:0,y:-e8};case"bottom":return{x:0,y:e8}}})(o6,l7);if(a3||(t54.vias?.length??0)>0||c6.length>2){let n4=ck(t54),o7=n4.route??[];for(let t55 of e7){let e8=o7[t55];e8&&(o7[t55]={...e8,x:e8.x+h3.x,y:e8.y+h3.y})}for(let o8 of n4.vias??[])e7.some(e8=>{let n5=t54.route?.[e8];return!!n5&&Pk(n5,o8)})&&(o8.x+=h3.x,o8.y+=h3.y);return n4}let d4=ck(t54);if(c6.length===2&&e7.length===2&&e7[0]===0&&e7[1]===1){let e8=c6[0],i6=c6[1];return ck({...t54,route:lF({start:e8,end:i6,side:o6,boundary:n3,amount:l7,targetAxisValue:r6})})}return d4},dF=(t54,e7,n3)=>{switch(n3){case"left":return t54.x-e7.minX;case"right":return e7.maxX-t54.x;case"top":return e7.maxY-t54.y;case"bottom":return t54.y-e7.minY}},uF=(t54,e7,n3)=>{let o6=(t55=>{let e8=t55.route??[];if(e8.length===0)return[];let n4=[];for(let t56=0;t56<e8.length;t56+=1){let o7=e8[t56];if(!o7)continue;t56===0||t56===e8.length-1||n4.push(o7);let i3=e8[t56+1];i3&&n4.push({x:(o7.x+i3.x)/2,y:(o7.y+i3.y)/2})}return n4})(t54);return o6.length===0?Number.POSITIVE_INFINITY:o6.reduce((t55,o7)=>Math.min(t55,dF(o7,e7,n3)),Number.POSITIVE_INFINITY)},pF=(t54,e7,n3=[])=>{let o6=t54.route??[],i3=[],s6=new Set,r6=e7.length===0||e7.includes("via");if(o6.length===2)return[0,1];let a3=t55=>{if(t55<=0||t55>=o6.length-1||s6.has(t55))return;let n4=o6[t55];n4&&(r6||e7.includes(_k(n4)))&&(s6.add(t55),i3.push(t55))};if(n3.length>0)for(let t55 of n3)a3(t55);else for(let t55=1;t55<o6.length-1;t55+=1)a3(t55);for(let t55=0;t55<i3.length;t55+=1){let e8=i3[t55],n4=o6[e8];if(n4)for(let t56=1;t56<o6.length-1;t56+=1){if(s6.has(t56))continue;let e10=o6[t56];e10&&e10.z!==n4.z&&Pk(e10,n4)&&(s6.add(t56),i3.push(t56))}}return i3.sort((t55,e8)=>t55-e8),i3},mF=(t54,e7)=>Math.max(0,...(t54.route??[]).map(t55=>Math.max(e7.minX-t55.x,t55.x-e7.maxX,e7.minY-t55.y,t55.y-e7.maxY,0))),gF=(t54,e7,n3,o6)=>dF(t54,e7,n3)<=o6+uk,fF=(t54,e7,n3,o6)=>{let i3=t54.route??[],s6=[],r6=new Set,a3=1,c6=i3.length-2;for(;a3<i3.length-1&&Pk(i3[a3],i3[0]);)a3+=1;for(;c6>0&&Pk(i3[c6],i3[i3.length-1]);)c6-=1;for(let t55=a3;t55<=c6;t55+=1)gF(i3[t55],e7,n3,o6)&&(r6.add(t55),s6.push(t55));for(let t55=0;t55<s6.length;t55+=1){let e8=i3[s6[t55]];if(e8)for(let t56=a3;t56<=c6;t56+=1){if(r6.has(t56))continue;let n4=i3[t56];n4&&n4.z!==e8.z&&Pk(n4,e8)&&(r6.add(t56),s6.push(t56))}}return s6.length===0&&i3.length===2&&i3.some(t55=>gF(t55,e7,n3,o6))?[0,1]:(s6.sort((t55,e8)=>t55-e8),s6)},yF=(t54,e7,n3)=>{let o6=t54.route??[],i3=n3===0?o6[0]:o6[o6.length-1];return i3?mk.filter(t55=>dF(i3,e7,t55)<=uk):[]},_F=(t54,e7,n3)=>{let o6=t54.route??[],i3=e7.route??[];if(o6.length===0||i3.length===0)return!0;for(let e8 of[0,-1]){let o7=yF(t54,n3,e8);if(o7.length===0)continue;let s6=e8===0?i3[0]:i3[i3.length-1];if(!s6)return!1;for(let t55 of o7)if(dF(s6,n3,t55)>uk)return!1}return!0},bF=(t54,e7)=>Math.hypot(e7.x-t54.x,e7.y-t54.y),xF=(t54,e7,n3,o6)=>{let i3=t54.route??[];if(i3.length===0)return"none";let s6=!1;for(let t55=0;t55<i3.length;t55+=1){let r6=i3[t55];if(r6&&gF(r6,e7,n3,o6)){if(t55!==0&&t55!==i3.length-1)return"interior";s6=!0}}for(let t55=0;t55<i3.length-1;t55+=1){let s7=i3[t55],r6=i3[t55+1];if(s7&&r6&&gF(s7,e7,n3,o6)&&gF(r6,e7,n3,o6)&&!(bF(s7,r6)<=uk))return"interior"}return s6?"endpoint":"none"},vF=({currentRoutes:t54,routeIndex:e7,side:n3,moveSide:o6=n3,boundary:i3,margin:s6,moveAmount:r6,geometryCache:a3})=>{let c6=t54[e7],l7=(c6.route?.length??0)===2,h3=fF(c6,i3,n3,s6);if(h3.length===0)return null;let d4=new Set,u6=new Map,p5=new Set,m4=t54.slice(),g4=!1,f4="overlap",y3=new Set([e7]),_3=new Map([[e7,new Set]]),b4=new Map([[e7,new Set]]),x4=[e7],v3=0,S7=null,I4=null,P6=null,M5=null,C6=t55=>new Set(t55.map(t56=>Ak(t56))),N3=()=>S7||(S7=Xk(t54,d4,s6,a3,u6),S7),T6=()=>P6||(P6=Xk(t54,d4,0,a3,u6),P6),w4=()=>M5||(M5=Xk(m4,d4,0,a3,u6),M5);for(;v3<x4.length&&!g4;){let c7=x4[v3];if(v3+=1,y3.delete(c7),d4.has(c7))continue;let l10=m4[c7],h4=Array.from(_3.get(c7)??[]),T7=Array.from(b4.get(c7)??[]);_3.delete(c7),b4.delete(c7);let w6=c7===e7?fF(l10,i3,n3,s6):pF(l10,h4,T7);if(w6.length===0){if(c7===e7)return null;g4=!0,f4="eventual-overlap";break}let R6=l10.route??[],E4=c7===e7?void 0:o6==="left"||o6==="right"?(R6[w6[0]]?.x??0)+(o6==="left"?r6:-r6):(R6[w6[0]]?.y??0)+(o6==="top"?-r6:r6);m4[c7]=hF(l10,w6,i3,o6,r6,s6,E4,c7!==e7),d4.add(c7),u6.set(c7,new Set(w6)),S7=null,I4=null,P6=null,M5=null,(l10.route?.length??0)===2&&p5.add(c7);let A7=mF(t54[c7],i3);if(mF(m4[c7],i3)>A7+1e-6){g4=!0,f4="boundary";break}if(!_F(t54[c7],m4[c7],i3)){g4=!0,f4="endpoint-boundary";break}let O3=Xk(m4,new Set([c7]),s6,a3,new Map([[c7,new Set(w6)]]));for(let t55 of O3){if(C6(N3()).has(Ak(t55)))continue;let[e8,n4]=t55.routeIndexes,o7=d4.has(e8),i6=d4.has(n4);if(o7&&i6)continue;let s7=o7?n4:e8,r7=o7?t55.layers[1]:t55.layers[0],a4=o7?t55.routePointIndexes[1]:t55.routePointIndexes[0];if(d4.has(s7)||y3.has(s7)){if(y3.has(s7)){let t56=_3.get(s7)??new Set;t56.add(r7),_3.set(s7,t56);let e10=b4.get(s7)??new Set;for(let t57 of a4)e10.add(t57);b4.set(s7,e10)}}else y3.add(s7),x4.push(s7),_3.set(s7,new Set([r7])),b4.set(s7,new Set(a4))}}if(!g4&&d4.size>1){let t55=C6(N3()),e8=C6(I4||(I4=Xk(m4,d4,s6,a3,u6),I4));for(let n4 of e8)if(!t55.has(n4)){g4=!0,f4="eventual-overlap";break}}if(!g4&&d4.size>1){let t55=C6(T6()),e8=C6(w4());for(let n4 of e8)if(!t55.has(n4)){g4=!0,f4="eventual-overlap";break}}if(!g4){let e8=new Set(Xk(t54,d4,0,a3).map(t55=>Ak(t55))),n4=Xk(m4,d4,0,a3);for(let t55 of n4){let n5=Ak(t55);if(!e8.has(n5)){g4=!0,f4="eventual-overlap";break}}}return g4||(({currentRoutes:t55,candidateRoutes:e10,candidateRouteIndexes:n4,boundary:o7,activeSide:i6})=>{let s7=mk.filter(t56=>t56!==i6),r7=[];for(let i8 of n4){let n5=t55[i8],a4=e10[i8];if(n5&&a4)for(let t56 of s7){let e11=uF(n5,o7,t56),s8=uF(a4,o7,t56);e11>uk&&s8<=uk&&r7.push({routeIndex:i8,side:t56,previousClearance:e11,nextClearance:s8})}}return r7})({currentRoutes:t54,candidateRoutes:m4,candidateRouteIndexes:d4,boundary:i3,activeSide:n3}).length>0&&(g4=!0,f4="boundary-touch"),g4||(({currentRoutes:t55,candidateRoutes:e10,candidateRouteIndexes:n4,geometryCache:o7,currentConflicts:i6,candidateConflicts:s7})=>{let r7=i6??Xk(t55,n4,0,o7),a4=s7??Xk(e10,n4,0,o7),c7=new Set(r7.map(t56=>Ak(t56)));return a4.filter(t56=>{let o8=Ak(t56);if(c7.has(o8))return!1;let[i8,s8]=t56.routeIndexes,[r8,a6]=t56.layers,l10=n4.has(i8),h4=n4.has(s8);if(l10&&h4)return!1;let d6=l10?a6:r8,u10=e10[l10?s8:i8];return!!u10&&pF(u10,[d6]).length===0})})({currentRoutes:t54,candidateRoutes:m4,candidateRouteIndexes:d4,geometryCache:a3,currentConflicts:T6(),candidateConflicts:w4()}).length>0&&(g4=!0,f4="fixed-trace-touch"),g4||nF({currentRoutes:t54,candidateRoutes:m4,candidateRouteIndexes:d4,maximumAllowedClearance:Math.min(s6/2,pk)}).length>0&&(g4=!0,f4="trace-clearance"),!g4&&((t55,e8,n4,o7,i6,s7)=>Array.from(n4).some(n5=>{let r7=t55[n5],a4=e8[n5];return mk.filter(t56=>t56!==i6).some(t56=>{let e10=xF(r7,o7,t56,s7),n6=xF(a4,o7,t56,s7);return e10==="none"&&n6!=="none"})}))(t54,m4,d4,i3,n3,s6)&&(g4=!0,f4="side-regression"),{isTwoPointRoute:l7,movableIndexes:h3,candidateRouteIndexes:d4,movedTwoPointRouteIndexes:p5,candidateRoutes:m4,rejected:g4,rejectionReason:f4}},SF=(t54,e7,n3,o6,i3)=>{let s6=t54.route??[];if(e7.length===0)return null;if(o6==="top"||o6==="bottom"){let t55=e7.reduce((t56,e8)=>t56+(s6[e8]?.x??n3.center.x),0)/e7.length;return t55<n3.center.x-i3/2?"right":t55>n3.center.x+i3/2?"left":null}let r6=e7.reduce((t55,e8)=>t55+(s6[e8]?.y??n3.center.y),0)/e7.length;return r6>n3.center.y+i3/2?"bottom":r6<n3.center.y-i3/2?"top":null},IF=({side:t54,sample:e7,boundary:n3,margin:o6,repairedRoutes:i3,frames:s6,captureProgressFrames:r6,lockedTwoPointRoutes:a3,geometryCache:c6,allowTwoPointWithoutObstacle:l7=!1})=>{let{hasObstacle:h3,moveAmount:d4}=cF(e7,n3,t54,o6);r6&&s6.push(((t55,e8,n4,o7,i6,s7)=>({title:`${n4} boundary analysis: move=${i6.toFixed(3)} (${s7?"obstacle-side":"clear-side"})`,routes:t55,activeSide:n4,overlayRects:[rF(e8,n4,o7,"rgba(245, 158, 11, 0.16)",`strip:${n4}`)]}))(lk(i3),n3,t54,o6,d4,h3));let u6=new Set,p5=0;for(let e8=0;e8<i3.length;e8+=1){if(u6.has(e8)||a3.has(e8))continue;let m4=i3[e8];if((m4.route?.length??0)===2&&!h3&&!l7)continue;let g4=vF({currentRoutes:i3,routeIndex:e8,side:t54,boundary:n3,margin:o6,moveAmount:d4,geometryCache:c6});if(g4){if(g4.rejected){let s7=SF(m4,g4.movableIndexes,n3,t54,o6);if(s7){let r7=vF({currentRoutes:i3,routeIndex:e8,side:t54,moveSide:s7,boundary:n3,margin:o6,moveAmount:d4,geometryCache:c6});r7&&!r7.rejected&&(g4=r7)}}if(r6&&s6.push(aF({routes:lk(i3),candidateRoutes:g4.candidateRoutes,candidateRouteIndexes:g4.candidateRouteIndexes,originalRoutes:g4.rejected?void 0:Array.from(g4.candidateRouteIndexes).map(t55=>ck(i3[t55])),boundary:n3,side:t54,margin:o6,rejected:g4.rejected,rejectionReason:g4.rejectionReason})),!g4.rejected){i3.splice(0,i3.length,...g4.candidateRoutes);for(let t55 of g4.movedTwoPointRouteIndexes)a3.add(t55);p5+=1}u6.add(e8)}}return{movesAccepted:p5}},PF=(t54,e7,n3,o6)=>gF(t54,e7,n3,o6),MF=(t54,e7,n3,o6)=>{switch(n3){case"left":return{...t54,x:Math.min(e7.minX+o6,e7.maxX)};case"right":return{...t54,x:Math.max(e7.maxX-o6,e7.minX)};case"top":return{...t54,y:Math.max(e7.maxY-o6,e7.minY)};case"bottom":return{...t54,y:Math.min(e7.minY+o6,e7.maxY)}}},CF=t54=>`${t54.routeIndexes[0]}:${t54.layers[0]}:${t54.routeIndexes[1]}:${t54.layers[1]}`,NF2=t54=>{if(!t54)return[];let e7=[t54.connectionName,t54.rootConnectionName].filter(t55=>!!t55);return Array.from(new Set(e7))},TF=(t54,e7)=>{let n3=NF2(t54),o6=NF2(e7);return n3.length!==0&&o6.length!==0&&n3.some(t55=>o6.includes(t55))},wF=(t54,e7,n3)=>t54?Gk([t54],e7,n3).length:0,RF2=(t54,e7,n3,o6)=>{let i3=new Set(Xk(t54,new Set([n3]),o6).map(Ak));return Xk(e7,new Set([n3]),o6).some(t55=>!i3.has(Ak(t55)))},EF=(t54,e7,n3)=>Gk(t54,e7,n3).length,AF=t54=>{if(!t54)return[];let e7=[t54.connectionName,t54.rootConnectionName].filter(t55=>!!t55);return Array.from(new Set(e7))},OF2=(t54,e7)=>Xk(t54,new Set(t54.map((t55,e8)=>e8)),pk,e7).filter(e8=>!(e8.layers[0]==="via"&&e8.layers[1]==="via"||((t55,e10)=>{let n3=AF(t55),o6=AF(e10);return n3.length!==0&&o6.length!==0&&n3.some(t56=>o6.includes(t56))})(t54[e8.routeIndexes[0]],t54[e8.routeIndexes[1]]))).length,LF=t54=>{let e7=mk;return[...e7.slice(t54%e7.length),...e7.slice(0,t54%e7.length)]},DF=(t54,e7,n3=!1)=>{let o6=Zk(t54?.nodeWithPortPoints),i3=o6?((t55,e8)=>t55.map(t56=>{let n4=t56.route??[],o7=!1,i6=n4.map(t57=>{let n5=t57.x,i8=t57.y;return n5<e8.minX?n5=e8.minX:n5>e8.maxX&&(n5=e8.maxX),i8<e8.minY?i8=e8.minY:i8>e8.maxY&&(i8=e8.maxY),n5===t57.x&&i8===t57.y?t57:(o7=!0,{...t57,x:n5,y:i8})});return o7?{...t56,route:i6}:t56}))(iF(lk(t54?.nodeHdRoutes??[]),o6),o6):lk(t54?.nodeHdRoutes??[]),s6=Math.max(e7??.4,.05),r6=lk(i3);if(!o6)return{boundary:null,baseRoutes:i3,repairedRoutes:r6,margin:s6,frames:[{title:"HighDensityRepair02 Missing Boundary",routes:r6}]};let a3=n3?[Kk(lk(r6),s6)]:[],c6=new WeakMap,l7=EF(r6,o6,s6);for(let e8=0;e8<1;e8+=1){let i6=new Set,h4=0;for(let l10 of LF(e8)){let{movesAccepted:d8}=IF({side:l10,sample:t54,boundary:o6,frames:a3,margin:s6,repairedRoutes:r6,captureProgressFrames:n3,lockedTwoPointRoutes:i6,geometryCache:c6,allowTwoPointWithoutObstacle:e8>=1});h4+=d8}let d6=EF(r6,o6,s6);if(h4===0||d6===0||d6>=l7)break;l7=d6}let h3=lk(r6),d4=OF2(r6,c6);return(({routes:t55,boundary:e8,margin:n4,geometryCache:o7})=>{let i6=Gk(t55,e8,n4);if(i6.length===0)return{movesAccepted:0};let s7=new Map;for(let t56 of i6){let e10=s7.get(t56.routeIndex)??new Set;for(let n5 of t56.touchedSides)e10.add(n5);s7.set(t56.routeIndex,e10)}let r7=[8e-6,.01,n4/4,n4/2,n4+8e-6],a4=0,c7=(i8,s8,r8)=>{let a6=s8.route??[];if(a6.length<2)return!1;let c8={...s8,route:Qk(a6)};if((c8.route?.length??0)<2)return!1;let l11=t55.slice();if(l11[i8]=c8,wF(l11[i8],e8,n4)>=r8)return!1;let h6=e10=>TF(t55[e10.routeIndexes[0]],t55[e10.routeIndexes[1]]),d8=new Set(Xk(t55,new Set([i8]),0,o7).filter(t56=>!h6(t56)).map(CF));return!Xk(l11,new Set([i8]),0,o7).filter(t56=>!h6(t56)).some(t56=>!d8.has(CF(t56)))&&!(nF({currentRoutes:t55,candidateRoutes:l11,candidateRouteIndexes:new Set([i8]),maximumAllowedClearance:Math.min(n4/2,pk)}).filter(e10=>!TF(t55[e10.routeIndexes[0]],t55[e10.routeIndexes[1]])).length>0||(t55[i8]=c8,0))},l10=(n5,o8,i8,s8)=>{if(o8.length===0)return!1;for(let a6 of r7){let r8=t55[n5],l11=ck(r8),h6=l11.route??[],d8=!1;for(let t56 of o8){let n6=h6[t56];n6&&(h6[t56]=MF(n6,e8,i8,a6),d8=!0)}if(!d8)return!1;if(c7(n5,l11,s8))return!0}return!1},h4=(t56,n5)=>{let o8=[];return n5==="top"||n5==="bottom"?(Math.abs(t56.x-e8.minX)<=uk&&o8.push("left"),Math.abs(t56.x-e8.maxX)<=uk&&o8.push("right")):(Math.abs(t56.y-e8.minY)<=uk&&o8.push("bottom"),Math.abs(t56.y-e8.maxY)<=uk&&o8.push("top")),o8},d6=(o8,i8,s8)=>{let a6=t55[o8],l11=a6.route??[];if(l11.length!==2)return!1;let[d8,u6]=l11;if(!PF(d8,e8,i8,n4)||!PF(u6,e8,i8,n4))return!1;let p5=h4(d8,i8),m4=h4(u6,i8);for(let t56 of r7){let n5=MF(d8,e8,i8,t56),r8=MF(u6,e8,i8,t56);for(let o10 of p5)n5=MF(n5,e8,o10,t56);for(let n6 of m4)r8=MF(r8,e8,n6,t56);let l12={...a6,route:[d8,n5,r8,u6]};if(c7(o8,l12,s8))return!0}return!1};for(let[o8,i8]of s7)if(t55[o8])for(let s8 of i8){let i10=!0;for(;i10;){i10=!1;let r8=t55[o8].route??[];if(r8.length===2){let i11=wF(t55[o8],e8,n4);i11>0&&d6(o8,s8,i11)&&(a4+=1);break}if(r8.length<3)break;let c8=wF(t55[o8],e8,n4);if(c8===0)break;let h6=[];for(let t56=1;t56<r8.length-1;t56+=1){let o10=r8[t56];o10&&PF(o10,e8,s8,n4)&&h6.push(t56)}if(h6.length===0)break;if(l10(o8,h6,s8,c8)){a4+=1,i10=!0;continue}let u6=!1,p5=c8,m4=0;for(;m4<h6.length;){let i11=m4;for(;i11+1<h6.length&&h6[i11+1]===h6[i11]+1;)i11+=1;l10(o8,h6.slice(m4,i11+1),s8,p5)&&(a4+=1,u6=!0,p5=wF(t55[o8],e8,n4)),m4=i11+1}if(!u6){let i11=t55[o8].route??[],r10=c8;for(let c10=1;c10<i11.length-1;c10+=1){let h7=i11[c10];h7&&PF(h7,e8,s8,n4)&&l10(o8,[c10],s8,r10)&&(a4+=1,u6=!0,r10=wF(t55[o8],e8,n4))}}u6&&(i10=!0)}}for(let[o8,i8]of s7){let s8=t55[o8];if(!s8)continue;let r8=s8.route??[];if(r8.length<=2)continue;let c8=wF(t55[o8],e8,n4);if(c8!==0)for(let l11 of i8){if(!r8.every(t56=>PF(t56,e8,l11,n4)))continue;let i10=r8[0]?.z;if(!r8.every(t56=>t56.z===i10))continue;let h6={...s8,route:[r8[0],r8[r8.length-1]]},u6=t55[o8];t55[o8]=h6,d6(o8,l11,c8)?a4+=1:t55[o8]=u6;break}}})({routes:h3,boundary:o6,margin:s6,geometryCache:c6}),OF2(h3,c6)<=d4&&r6.splice(0,r6.length,...h3),(({routes:t55,boundary:e8,clearanceMargin:n4})=>{for(let o7=0;o7<t55.length;o7+=1){let i6=t55[o7];if((i6.route??[]).length<=2)continue;let s7=n4,r7=Math.max(e8.width/2-uk,0),a4=Math.max(e8.height/2-uk,0),c7=Math.min(s7,r7),l10=Math.min(s7,a4),h4=ck(i6),d6=h4.route??[],u6=!1;for(let t56=1;t56<d6.length-1;t56+=1){let n5=d6[t56];if(!n5)continue;let o8=Math.min(Math.max(n5.x,e8.minX+c7),e8.maxX-c7),i8=Math.min(Math.max(n5.y,e8.minY+l10),e8.maxY-l10);(Math.abs(o8-n5.x)>uk||Math.abs(i8-n5.y)>uk)&&(n5.x=o8,n5.y=i8,u6=!0)}if(!u6||(h4.route=Qk(d6),(h4.route?.length??0)<2))continue;let p5=lk(t55);p5[o7]=h4;let m4=RF2(t55,p5,o7,0),g4=RF2(t55,p5,o7,n4),f4=nF({currentRoutes:t55,candidateRoutes:p5,candidateRouteIndexes:new Set([o7]),maximumAllowedClearance:n4}).length>0;m4||g4||f4||(t55[o7]=h4)}})({routes:r6,boundary:o6,clearanceMargin:s6}),a3.push(((t55,e8,n4)=>({title:`HighDensityRepair02 Final State (margin=${n4})`,routes:t55,originalRoutes:e8}))(lk(r6),lk(i3),s6)),{boundary:o6,baseRoutes:i3,repairedRoutes:r6,frames:a3,margin:s6}},zF=class extends Tt2{constructor(t54={}){super();__publicField(this,"params");__publicField(this,"frames",[]);__publicField(this,"currentFrameIndex",0);__publicField(this,"showBoundryViolationMarkers");__publicField(this,"repairedRoutes",[]);this.params=t54,this.showBoundryViolationMarkers=t54.showBoundryViolationMarkers??!1}_setup(){this.buildFrames();let t54=this.getCurrentBoundryViolationCount(),e7=this.getCurrentTraceViolationCount();this.stats={boundryViolationCount:t54,traceViolationCount:e7,margin:this.params.margin??.4,frames:this.frames.length,currentFrame:this.currentFrameIndex}}_step(){if(this.frames.length<=1){let t55=this.getCurrentBoundryViolationCount(),e8=this.getCurrentTraceViolationCount();return this.showBoundryViolationMarkers=!0,this.stats={...this.stats,boundryViolationCount:t55,traceViolationCount:e8},void(this.solved=!0)}this.currentFrameIndex<this.frames.length-1&&(this.currentFrameIndex+=1);let t54=this.getCurrentBoundryViolationCount(),e7=this.getCurrentTraceViolationCount();this.stats={boundryViolationCount:t54,traceViolationCount:e7,margin:this.params.margin??.4,frames:this.frames.length,currentFrame:this.currentFrameIndex,title:this.frames[this.currentFrameIndex]?.title},this.currentFrameIndex>=this.frames.length-1&&(this.showBoundryViolationMarkers=!0,this.solved=!0)}getConstructorParams(){return[this.params]}getOutput(){let t54=this.getCurrentTraceViolationCount();return{margin:this.params.margin??.4,repairedRoutes:this.repairedRoutes,frameCount:this.frames.length,traceViolationCount:t54}}setShowBoundryViolationMarkers(t54){this.showBoundryViolationMarkers=t54}buildFrames(){let t54=DF(this.params.sample,this.params.margin,this.params.captureProgressFrames??!1);this.frames=t54.frames,this.repairedRoutes=t54.repairedRoutes}getCurrentFrame(){let t54=this.params.sample;return this.frames[this.currentFrameIndex]??{title:"HighDensityRepair02",routes:lk(t54?.nodeHdRoutes??[])}}getBoundryViolationsForFrame(t54){let e7=Zk(this.params.sample?.nodeWithPortPoints);return e7?Gk(t54.routes,e7,this.params.margin??.4):[]}getCurrentBoundryViolationCount(){return this.getBoundryViolationsForFrame(this.getCurrentFrame()).length}getRouteNetNames(t54){if(!t54)return[];let e7=[t54.connectionName,t54.rootConnectionName].filter(t55=>!!t55);return Array.from(new Set(e7))}areRoutesSameNet(t54,e7){let n3=this.getRouteNetNames(t54),o6=this.getRouteNetNames(e7);return n3.length!==0&&o6.length!==0&&n3.some(t55=>o6.includes(t55))}getCurrentTraceViolationCount(){let t54=this.getCurrentFrame().routes,e7=new Set(t54.map((t55,e8)=>e8));return Xk(t54,e7,pk).filter(e8=>!(e8.layers[0]==="via"&&e8.layers[1]==="via"||this.areRoutesSameNet(t54[e8.routeIndexes[0]],t54[e8.routeIndexes[1]]))).length}visualize(){let t54=this.params.sample,e7=t54?.nodeWithPortPoints,n3=t54?.adjacentObstacles??[],o6=this.getCurrentFrame(),i3=Zk(e7),s6=i3&&e7?.capacityMeshNodeId?[{center:i3.center,width:i3.width,height:i3.height,stroke:"#1d4ed8",fill:"rgba(29, 78, 216, 0.08)",label:e7.capacityMeshNodeId}]:i3?[{center:i3.center,width:i3.width,height:i3.height,stroke:"#1d4ed8",fill:"rgba(29, 78, 216, 0.08)",label:"capacity-node"}]:[],r6=n3.filter(t55=>t55.center&&t55.width&&t55.height).map((t55,e8)=>({center:t55.center,width:t55.width,height:t55.height,stroke:t55.type==="oval"?"#a855f7":"#dc2626",fill:t55.type==="oval"?"rgba(168, 85, 247, 0.12)":"rgba(220, 38, 38, 0.08)",label:t55.type?`obstacle:${t55.type}:${e8}`:`obstacle:${e8}`})),a3=this.showBoundryViolationMarkers&&i3?this.getBoundryViolationsForFrame(o6).map(t55=>{let e8=t55.end.x-t55.start.x,n4=t55.end.y-t55.start.y,o7=Math.max(Math.hypot(e8,n4),.2),i6=Math.abs(e8)>=Math.abs(n4);return{center:{x:(t55.start.x+t55.end.x)/2,y:(t55.start.y+t55.end.y)/2},width:i6?o7:.18,height:i6?.18:o7,stroke:"#b45309",fill:"rgba(250, 204, 21, 0.45)",label:`boundry-violation:${t55.routeIndex}:${t55.segmentIndex}`}}):[],c6=this.showBoundryViolationMarkers?Ek(o6.routes,pk):[],l7=[...(e7?.portPoints??[]).map(t55=>({x:t55.x,y:t55.y,color:"#0f766e",label:t55.connectionName??t55.portPointId??"port-point"})),...o6.routes.flatMap(t55=>t55.route??[]).map(t55=>({x:t55.x,y:t55.y,color:_k(t55)==="bottom"?hk:"#0ea5e9",label:""})),...o6.overlayPoints??[]],h3=[...(o6.originalRoutes??[]).flatMap(t55=>Jk(t55).map(t56=>({...t56,strokeColor:"#111111",strokeWidth:Math.max(.6*t56.strokeWidth,.05),label:`original:${t56.label}`}))),...o6.routes.filter(t55=>(t55.route?.length??0)>=2).flatMap(t55=>Jk(t55)),...o6.overlayLines??[]],d4=o6.routes.flatMap(t55=>(t55.vias??[]).map(e8=>({center:{x:e8.x,y:e8.y},radius:(e8.diameter??t55.viaDiameter??.3)/2,stroke:"#7c3aed",fill:"rgba(124, 58, 237, 0.2)",label:t55.connectionName?`via:${t55.connectionName}`:"via"})));return d4.push(...c6),{coordinateSystem:"cartesian",title:o6.title,rects:[...s6,...r6,...o6.overlayRects??[],...a3],points:l7,lines:h3,circles:d4,arrows:o6.overlayArrows}}},kF=(t54,e7=0)=>({minX:t54.center.x-t54.width/2-e7,maxX:t54.center.x+t54.width/2+e7,minY:t54.center.y-t54.height/2-e7,maxY:t54.center.y+t54.height/2+e7}),FF=(t54,e7,n3=0)=>{let o6=kF(e7,n3);return t54.x>=o6.minX&&t54.x<=o6.maxX&&t54.y>=o6.minY&&t54.y<=o6.maxY},jF=(t54,e7)=>t54.route.length>0&&e7.some(e8=>(t55=>(t55.zLayers?.length??t55.layers?.length??0)>1)(e8)&&((t55,e10)=>t55.connectedTo.includes(e10.connectionName)||e10.rootConnectionName!==void 0&&t55.connectedTo.includes(e10.rootConnectionName))(e8,t54)&&t54.route.every(t55=>((t56,e10)=>{let n3=e10.width/2,o6=e10.height/2;return Math.abs(t56.x-e10.center.x)<=n3&&Math.abs(t56.y-e10.center.y)<=o6})(t55,e8))),YF2=(t54,e7,n3)=>{if(t54.regionId){let n4=e7.findIndex(e8=>e8.capacityMeshNodeId===t54.regionId);if(n4!==-1)return n4}let o6=[...t54.route.map(({x:t55,y:e8})=>({x:t55,y:e8})),...t54.vias.map(({x:t55,y:e8})=>({x:t55,y:e8}))];for(let t55=0;t55<e7.length;t55++){let i3=e7[t55];if(o6.every(t56=>FF(t56,i3,n3)))return t55}return-1},XF=(t54,e7)=>({connectionName:t54.connectionName??e7.connectionName,rootConnectionName:t54.rootConnectionName??e7.rootConnectionName,regionId:t54.capacityMeshNodeId??e7.regionId,traceThickness:t54.traceThickness??e7.traceThickness,viaDiameter:t54.viaDiameter??e7.viaDiameter,route:t54.route?.map(t55=>({x:t55.x,y:t55.y,z:t55.z??0}))??e7.route,vias:t54.vias?.map(t55=>({x:t55.x,y:t55.y}))??e7.vias,jumpers:e7.jumpers}),$F=(t54,e7,n3)=>{let o6=kF(t54,n3);return e7.search(o6).filter(t55=>{return e8=o6,n4=(t56=>({minX:t56.center.x-t56.width/2,maxX:t56.center.x+t56.width/2,minY:t56.center.y-t56.height/2,maxY:t56.center.y+t56.height/2}))(t55),e8.minX<=n4.maxX&&e8.maxX>=n4.minX&&e8.minY<=n4.maxY&&e8.maxY>=n4.minY;var e8,n4}).map(t55=>({type:t55.type,center:t55.center,width:t55.width,height:t55.height}))},BF=class extends Fo2{constructor(t54){super();__publicField(this,"repairMargin");__publicField(this,"sampleEntries");__publicField(this,"originalHdRoutes");__publicField(this,"originalNodeWithPortPoints");__publicField(this,"originalObstacles");__publicField(this,"obstacleSHI");__publicField(this,"colorMap");__publicField(this,"repairedRoutesByIndex",new Map);__publicField(this,"activeSampleIndex",0);__publicField(this,"activeSubSolver",null);__publicField(this,"latestVisualization",{});this.repairMargin=t54.repairMargin??.2,this.originalHdRoutes=t54.hdRoutes,this.originalNodeWithPortPoints=t54.nodeWithPortPoints,this.originalObstacles=t54.obstacles,this.obstacleSHI=new oa2("flatbush",this.originalObstacles),this.colorMap=t54.colorMap??{};let e7=new Map;for(let n4=0;n4<t54.hdRoutes.length;n4++){if(jF(t54.hdRoutes[n4],t54.obstacles))continue;let o6=YF2(t54.hdRoutes[n4],t54.nodeWithPortPoints,this.repairMargin);if(o6===-1)continue;let i3=e7.get(o6)??[];i3.push(n4),e7.set(o6,i3)}let n3=Array.from(e7.entries()).map(([e8,n4])=>{let o6=t54.nodeWithPortPoints[e8];return{node:o6,routeIndexes:n4,sample:{nodeWithPortPoints:{capacityMeshNodeId:o6.capacityMeshNodeId,center:o6.center,width:o6.width,height:o6.height,portPoints:o6.portPoints.map(t55=>({x:t55.x,y:t55.y,z:t55.z,connectionName:t55.connectionName,portPointId:t55.portPointId,prevPortPointId:t55.prevPortPointId,nextPortPointId:t55.nextPortPointId}))},nodeHdRoutes:n4.map(e10=>{return{capacityMeshNodeId:(n5=t54.hdRoutes[e10]).regionId,connectionName:n5.connectionName,rootConnectionName:n5.rootConnectionName,route:n5.route.map(t55=>({x:t55.x,y:t55.y,z:t55.z})),traceThickness:n5.traceThickness,vias:n5.vias.map(t55=>({x:t55.x,y:t55.y,diameter:n5.viaDiameter})),viaDiameter:n5.viaDiameter};var n5}),adjacentObstacles:$F(o6,this.obstacleSHI,this.repairMargin)}}});this.sampleEntries=t54.maxSampleEntries!==void 0&&n3.length>t54.maxSampleEntries?[]:n3,this.MAX_ITERATIONS=Math.max(1e3*this.sampleEntries.length,1e5),this.stats={sampleCount:this.sampleEntries.length,skippedSampleCount:n3.length>this.sampleEntries.length?n3.length:0,repairedNodeCount:0,repairedRouteCount:0}}getSolverName(){return"Pipeline4HighDensityRepairSolver"}getConstructorParams(){return[{nodeWithPortPoints:this.sampleEntries.map(t54=>t54.node),hdRoutes:this.originalHdRoutes,obstacles:this.originalObstacles,repairMargin:this.repairMargin,colorMap:this.colorMap}]}_step(){let t54=this.sampleEntries[this.activeSampleIndex];if(t54){if(this.activeSubSolver){if(this.activeSubSolver.step(),this.latestVisualization=this.activeSubSolver.visualize(),this.activeSubSolver.failed)return this.failed=!0,this.error=this.activeSubSolver.error??`High density repair failed for node ${t54.node.capacityMeshNodeId}`,void(this.activeSubSolver=null);if(!this.activeSubSolver.solved)return;let e7=this.activeSubSolver.getOutput().repairedRoutes;for(let n3=0;n3<t54.routeIndexes.length;n3++){let o6=t54.routeIndexes[n3],i3=this.originalHdRoutes[o6],s6=e7[n3];this.repairedRoutesByIndex.set(o6,s6?XF(s6,i3):i3)}return this.activeSubSolver=null,this.activeSampleIndex+=1,this.stats={sampleCount:this.sampleEntries.length,repairedNodeCount:this.activeSampleIndex,repairedRouteCount:this.repairedRoutesByIndex.size},void(this.activeSampleIndex>=this.sampleEntries.length&&(this.solved=!0))}this.activeSubSolver=new zF({sample:t54.sample,margin:this.repairMargin}),this.latestVisualization=this.activeSubSolver.visualize()}else this.solved=!0}getOutput(){return this.originalHdRoutes.map((t54,e7)=>this.repairedRoutesByIndex.get(e7)??t54)}visualize(){if(this.activeSubSolver)return this.activeSubSolver.visualize();if(!this.solved)return this.latestVisualization;let t54=[],e7=[];for(let n3 of this.getOutput()){let o6=this.colorMap[n3.connectionName]??"#0ea5e9";for(let e8=0;e8<n3.route.length-1;e8++){let i3=n3.route[e8],s6=n3.route[e8+1];i3.z===s6.z&&t54.push({points:[{x:i3.x,y:i3.y},{x:s6.x,y:s6.y}],strokeColor:i3.z===0?o6:vo2(o6,.5),strokeWidth:n3.traceThickness,layer:`z${i3.z}`,strokeDash:i3.z!==0?[.1,.3]:void 0})}for(let t55 of n3.vias)e7.push({center:{x:t55.x,y:t55.y},radius:n3.viaDiameter/2,stroke:o6,fill:"rgba(14,165,233,0.12)"})}return{title:"Pipeline4 High Density Repair",lines:t54,circles:e7}}},HF=1e-9,WF=1.25,VF=(t54,e7)=>t54<e7?-1:t54>e7?1:0,UF=(t54,e7)=>VF(t54.z,e7.z)||VF(t54.x,e7.x)||VF(t54.y,e7.y),GF=t54=>`${t54.z.toFixed(6)}:${t54.x.toFixed(6)}:${t54.y.toFixed(6)}`,ZF=t54=>{let e7=t54.route.map(GF).join("|"),n3=[...t54.route].reverse().map(GF).join("|");return e7<=n3?e7:n3},qF=(t54,e7)=>{let n3=t54.connectionName.localeCompare(e7.connectionName);if(n3!==0)return n3;let o6=(t54.rootConnectionName??"").localeCompare(e7.rootConnectionName??"");if(o6!==0)return o6;let i3=ZF(t54).localeCompare(ZF(e7));return i3!==0?i3:VF(t54.traceThickness,e7.traceThickness)||VF(t54.viaDiameter,e7.viaDiameter)||VF(t54.route.length,e7.route.length)||VF(t54.vias.length,e7.vias.length)||VF(t54.jumpers?.length??0,e7.jumpers?.length??0)},JF=1e5,KF=.001,QF=class extends Fo2{constructor(t54){super();__publicField(this,"mergedHdRoute");__publicField(this,"remainingHdRoutes");__publicField(this,"start");__publicField(this,"end");__publicField(this,"colorMap");__publicField(this,"allowedLayerTransitionPointKeys");let e7=[...t54.hdRoutes].sort(qF);if(this.remainingHdRoutes=e7,this.colorMap=t54.colorMap??{},this.allowedLayerTransitionPointKeys=t54.allowedLayerTransitionPointKeys,e7.length===0){this.start=t54.start,this.end=t54.end;let n4=[{x:t54.start.x,y:t54.start.y,z:t54.start.z}],o7=[];if(t54.start.z!==t54.end.z){if(t54.allowedLayerTransitionPointKeys&&!t54.allowedLayerTransitionPointKeys.has(hg(t54.start)))return this.failed=!0,void(this.error=`Layer transition at ${hg(t54.start)} is not allowed`);n4.push({x:t54.start.x,y:t54.start.y,z:t54.end.z}),o7.push({x:t54.start.x,y:t54.start.y})}return n4.push({x:t54.end.x,y:t54.end.y,z:t54.end.z}),this.mergedHdRoute={connectionName:t54.connectionName,rootConnectionName:e7[0]?.rootConnectionName,route:n4,vias:o7,jumpers:[],viaDiameter:t54.defaultViaDiameter??.3,traceThickness:t54.defaultTraceThickness??.15},void(this.solved=!0)}let n3=1/0,o6=e7[0],i3="start-to-end";for(let s7 of e7){let e8=s7.route[0],r7=s7.route[s7.route.length-1],a4=me2(t54.start,e8),c7=me2(t54.start,r7),l10=me2(t54.end,e8),h3=me2(t54.end,r7),d4=Math.min(a4,c7,l10,h3);(d4<n3-HF||Math.abs(d4-n3)<=HF&&qF(s7,o6)<0)&&(n3=d4,o6=s7,i3=Math.min(l10,h3)<Math.min(a4,c7)-HF||Math.abs(Math.min(l10,h3)-Math.min(a4,c7))<=HF&&UF(t54.end,t54.start)<0?"end-to-start":"start-to-end")}i3==="start-to-end"?(this.start=t54.start,this.end=t54.end):(this.start=t54.end,this.end=t54.start);let s6=o6.route[0],r6=o6.route[o6.route.length-1],a3=me2(this.start,s6),c6=me2(this.start,r6),l7=a3<c6-HF||Math.abs(a3-c6)<=HF&&UF(s6,r6)<=0?s6:r6;this.mergedHdRoute={connectionName:t54.connectionName,rootConnectionName:o6.rootConnectionName,route:[{x:this.start.x,y:this.start.y,z:l7.z}],vias:[],jumpers:[],viaDiameter:o6.viaDiameter,traceThickness:o6.traceThickness}}getSolverName(){return"SingleHighDensityRouteStitchSolver3"}getDisjointedRoute(){for(let t54 of this.remainingHdRoutes)if([t54.route[0],t54.route[t54.route.length-1]].some(e7=>!this.remainingHdRoutes.some(n3=>n3===t54?!1:[n3.route[0],n3.route[n3.route.length-1]].some(t55=>t55.z===e7.z&&me2(e7,t55)<.001))))return{firstRoute:t54};return{firstRoute:this.remainingHdRoutes[0]}}_step(){if(this.remainingHdRoutes.length===0){let t55=this.mergedHdRoute.route[this.mergedHdRoute.route.length-1];return me2(t55,this.end)>KF&&me2(t55,this.end)<=WF&&this.mergedHdRoute.route.push({x:this.end.x,y:this.end.y,z:t55.z}),void(this.solved=!0)}let t54=this.mergedHdRoute.route[this.mergedHdRoute.route.length-1],e7=-1,n3="first",o6=1/0;for(let i6=0;i6<this.remainingHdRoutes.length;i6++){let s7=this.remainingHdRoutes[i6],r6=s7.route[0],a3=s7.route[s7.route.length-1],c6=me2(t54,r6),l7=me2(t54,a3),h3=1/0;t54.z===r6.z?c6<KF?h3=c6:c6<=1&&(h3=JF+c6):c6<KF&&(!this.allowedLayerTransitionPointKeys||this.allowedLayerTransitionPointKeys.has(hg(r6)))&&(h3=1e3+c6),h3<o6&&(o6=h3,e7=i6,n3="first");let d4=1/0;t54.z===a3.z?l7<KF?d4=l7:l7<=1&&(d4=JF+l7):l7<KF&&(!this.allowedLayerTransitionPointKeys||this.allowedLayerTransitionPointKeys.has(hg(a3)))&&(d4=1e3+l7),d4<o6&&(o6=d4,e7=i6,n3="last")}if(e7===-1)return void(this.remainingHdRoutes=[]);let i3=this.remainingHdRoutes[e7],s6;this.remainingHdRoutes.splice(e7,1),s6=n3==="first"?i3.route:(t55=>{let e8=[...t55].reverse().map(t56=>{let{toNextSegmentType:e10,...n4}=t56;return n4});for(let n4=0;n4<t55.length-1;n4++){let o7=t55[n4]?.toNextSegmentType;if(!o7)continue;let i6=t55.length-n4-2;e8[i6]={...e8[i6],toNextSegmentType:o7}}return e8})(i3.route),s6.length>0&&me2(t54,s6[0])<KF&&t54.z===s6[0].z?(s6[0].toNextSegmentType&&(t54.toNextSegmentType=s6[0].toNextSegmentType),this.mergedHdRoute.route.push(...s6.slice(1))):this.mergedHdRoute.route.push(...s6),this.mergedHdRoute.vias.push(...i3.vias),i3.jumpers&&this.mergedHdRoute.jumpers.push(...i3.jumpers)}visualize(){let t54={points:[],lines:[],circles:[],rects:[],title:"Single High Density Route Stitch Solver 3"};if(t54.points?.push({x:this.start.x,y:this.start.y,color:"green",label:"Start"},{x:this.end.x,y:this.end.y,color:"red",label:"End"}),this.mergedHdRoute&&this.mergedHdRoute.route.length>1){t54.lines?.push({points:this.mergedHdRoute.route.map(t55=>({x:t55.x,y:t55.y})),strokeColor:"green"});for(let e7 of this.mergedHdRoute.route)t54.points?.push({x:e7.x,y:e7.y,color:"green"});for(let e7 of this.mergedHdRoute.vias)t54.circles?.push({center:{x:e7.x,y:e7.y},radius:this.mergedHdRoute.viaDiameter/2,fill:"green"});if(this.mergedHdRoute.jumpers&&this.mergedHdRoute.jumpers.length>0){let e7=Gr2(this.mergedHdRoute.jumpers,{color:"green",label:this.mergedHdRoute.connectionName});t54.rects.push(...e7.rects??[]),t54.lines.push(...e7.lines??[])}}for(let e7 of this.remainingHdRoutes){t54.lines?.push({points:e7.route.map(t55=>({x:t55.x,y:t55.y})),strokeColor:"orange"});for(let n3 of e7.route)t54.points?.push({x:n3.x,y:n3.y,color:"orange"});for(let n3 of e7.vias)t54.circles?.push({center:{x:n3.x,y:n3.y},radius:e7.viaDiameter/2,fill:"orange"});if(e7.jumpers&&e7.jumpers.length>0){let n3=Gr2(e7.jumpers,{color:"orange",label:e7.connectionName});t54.rects.push(...n3.rects??[]),t54.lines.push(...n3.lines??[])}}return t54}},tj=class{constructor(){__publicField(this,"endpointClusters",new Map)}getEndpointKey(t54,e7){let n3=this.endpointClusters.get(t54)??[],o6,i3=1/0;for(let t55 of n3){if(t55.point.z!==e7.z)continue;let n4=me2(t55.point,e7);n4<=.1&&(n4<i3-HF||Math.abs(n4-i3)<=HF&&(!o6||UF(t55.point,o6.point)<0))&&(o6=t55,i3=n4)}if(o6)return o6.key;let s6=`${t54}:endpoint_${n3.length}`;return n3.push({key:s6,point:{x:e7.x,y:e7.y,z:e7.z}}),this.endpointClusters.set(t54,n3),s6}getClusters(t54){return this.endpointClusters.get(t54)??[]}getClosestEndpointKey(t54,e7,n3){let o6=null,i3=null,s6=1/0;for(let r6 of e7){let e8=[r6.route[0],r6.route[r6.route.length-1]];for(let r7 of e8){let e10=me2(n3,r7),a3=this.getEndpointKey(t54,r7);(e10<s6-HF||Math.abs(e10-s6)<=HF&&(o6===null||a3.localeCompare(o6)<0||a3===o6&&i3!==null&&UF(r7,i3)<0))&&(s6=e10,o6=a3,i3=r7)}}return o6}},ej=(t54,e7,n3)=>{let o6=t54.get(e7)??[];o6.some(t55=>t55.nextHash===n3.nextHash&&t55.routeIndex===n3.routeIndex)||(o6.push(n3),t54.set(e7,o6))},nj=t54=>{let e7=[...t54.possibleEndpoints].sort(UF),n3=e7.reduce((e8,n4)=>{let o7=me2(n4,t54.globalStart),i6=me2(e8,t54.globalStart);return o7<i6-HF||Math.abs(o7-i6)<=HF&&UF(n4,e8)<0?n4:e8}),o6=e7.filter(t55=>t55!==n3),i3=(o6.length>0?o6:t54.possibleEndpoints).reduce((e8,n4)=>{let o7=me2(n4,t54.globalEnd),i6=me2(e8,t54.globalEnd);return o7<i6-HF||Math.abs(o7-i6)<=HF&&UF(n4,e8)<0?n4:e8});return{start:n3,end:i3}},oj=t54=>{let e7=[...t54.terminals].sort(UF)[0],n3=me2(t54.islandEndpoint,e7);for(let o6 of t54.terminals.slice(1)){let i3=me2(t54.islandEndpoint,o6);(i3<n3-HF||Math.abs(i3-n3)<=HF&&UF(o6,e7)<0)&&(e7=o6,n3=i3)}return n3<=WF?e7:t54.islandEndpoint},ij=t54=>{if(t54.hdRoutes.length<=2)return t54.hdRoutes;let e7=[...t54.hdRoutes].sort(qF),n3=t54.endpointIndex.getClosestEndpointKey(t54.connectionName,e7,t54.start),o6=t54.endpointIndex.getClosestEndpointKey(t54.connectionName,e7,t54.end);if(!n3||!o6||n3===o6)return e7;let i3=new Map;for(let n4=0;n4<e7.length;n4++){let o7=e7[n4],s7=t54.endpointIndex.getEndpointKey(t54.connectionName,o7.route[0]),r7=t54.endpointIndex.getEndpointKey(t54.connectionName,o7.route[o7.route.length-1]);ej(i3,s7,{nextHash:r7,routeIndex:n4}),ej(i3,r7,{nextHash:s7,routeIndex:n4})}let s6=[...t54.endpointIndex.getClusters(t54.connectionName)].sort((t55,e8)=>UF(t55.point,e8.point));for(let t55=0;t55<s6.length;t55++){let e8=s6[t55];for(let n4=t55+1;n4<s6.length;n4++){let t56=s6[n4];e8.point.z===t56.point.z&&(me2(e8.point,t56.point)>1||(ej(i3,e8.key,{nextHash:t56.key,routeIndex:null}),ej(i3,t56.key,{nextHash:e8.key,routeIndex:null})))}}for(let[t55,n4]of i3.entries())i3.set(t55,[...n4].sort((t56,n5)=>{if(t56.routeIndex===null&&n5.routeIndex!==null)return 1;if(t56.routeIndex!==null&&n5.routeIndex===null)return-1;if(t56.routeIndex!==null&&n5.routeIndex!==null){let o7=qF(e7[t56.routeIndex],e7[n5.routeIndex]);if(o7!==0)return o7}return t56.nextHash.localeCompare(n5.nextHash)}));let r6=[n3],a3=new Set([n3]),c6=new Map;for(;r6.length>0;){let t55=r6.shift();if(t55===o6)break;for(let e8 of i3.get(t55)??[])a3.has(e8.nextHash)||(a3.add(e8.nextHash),c6.set(e8.nextHash,{prevHash:t55,routeIndex:e8.routeIndex}),r6.push(e8.nextHash))}if(!a3.has(o6))return e7;let l7=[],h3=o6;for(;h3!==n3;){let t55=c6.get(h3);if(!t55)return e7;t55.routeIndex!==null&&l7.push(t55.routeIndex),h3=t55.prevHash}if(l7.length===0)return t54.hdRoutes;let d4=l7.reverse().map(t55=>e7[t55]);return d4.length>0&&!t54.canStitchBetweenTerminals({connectionName:t54.connectionName,hdRoutes:d4,start:t54.start,end:t54.end})?e7:d4},sj=class extends Fo2{constructor(t54){super();__publicField(this,"unsolvedRoutes");__publicField(this,"activeSolver",null);__publicField(this,"mergedHdRoutes",[]);__publicField(this,"colorMap",{});__publicField(this,"defaultTraceThickness");__publicField(this,"defaultViaDiameter");__publicField(this,"allowedLayerTransitionPointKeys");__publicField(this,"endpointIndex",new tj);this.colorMap=t54.colorMap??{},this.allowedLayerTransitionPointKeys=t54.allowedLayerTransitionPointKeys;let e7=[...t54.hdRoutes].sort(qF),n3=e7[0];this.defaultTraceThickness=n3?.traceThickness??.15,this.defaultViaDiameter=n3?.viaDiameter??t54.defaultViaDiameter??.3;let o6=new Vr2({}),i3=[],s6=new Map;for(let t55=0;t55<e7.length;t55++){let n4=e7[t55],o7=n4.route[0],s7=n4.route[n4.route.length-1];i3.push([`route_island_${t55}`,this.endpointIndex.getEndpointKey(n4.connectionName,o7),this.endpointIndex.getEndpointKey(n4.connectionName,s7)])}o6.addConnections(i3);for(let t55 of i3)for(let e8 of t55.slice(1))s6.set(e8,(s6.get(e8)??0)+1);this.unsolvedRoutes=[];let r6=Array.from(new Set(Object.values(o6.idToNetMap)));for(let n4 of r6){let i6=o6.getIdsConnectedToNet(n4),r7=e7.filter((t55,e8)=>i6.includes(`route_island_${e8}`));if(r7.length===0)continue;let a4=t54.connections.find(t55=>t55.name===r7[0].connectionName),c6=r7.flatMap(t55=>[t55.route[0],t55.route[t55.route.length-1]]),l7=new Map,h3=[];for(let t55 of c6){let e8=this.endpointIndex.getEndpointKey(r7[0].connectionName,t55);l7.has(e8)||l7.set(e8,t55),s6.get(e8)===1&&h3.push(t55)}let d4=h3.length>0?h3:[...l7.values()];if(d4.length===0)continue;let u6,p5;if(d4.length>=2){let e8={...a4.pointsToConnect[0],z:Co2(lo2(a4.pointsToConnect[0]),t54.layerCount)},n5={...a4.pointsToConnect[1],z:Co2(lo2(a4.pointsToConnect[1]),t54.layerCount)};({start:u6,end:p5}=nj({possibleEndpoints:d4,globalStart:e8,globalEnd:n5})),me2(u6,a4.pointsToConnect[1])<me2(p5,a4.pointsToConnect[0])&&([u6,p5]=[p5,u6]),u6=oj({islandEndpoint:u6,terminals:[e8,n5]}),p5=oj({islandEndpoint:p5,terminals:[e8,n5]})}else u6={...a4.pointsToConnect[0],z:Co2(lo2(a4.pointsToConnect[0]),t54.layerCount)},p5={...a4.pointsToConnect[1],z:Co2(lo2(a4.pointsToConnect[1]),t54.layerCount)};let m4=ij({connectionName:r7[0].connectionName,hdRoutes:r7,start:u6,end:p5,endpointIndex:this.endpointIndex,canStitchBetweenTerminals:t55=>this.canStitchBetweenTerminals(t55)});this.unsolvedRoutes.push({connectionName:r7[0].connectionName,hdRoutes:m4,start:u6,end:p5})}let a3=new Map;for(let t55 of this.unsolvedRoutes){let e8=a3.get(t55.connectionName);e8?e8.push(t55):a3.set(t55.connectionName,[t55])}this.unsolvedRoutes=Array.from(a3.entries()).flatMap(([n4,o7])=>{let i6=t54.connections.find(t55=>t55.name===n4),s7=o7.some(t55=>t55.hdRoutes.some(t56=>t56.route.length<2)),r7=o7.length>1&&(t55=>{for(let e8=0;e8<t55.length;e8++)for(let n5=e8+1;n5<t55.length;n5++){let o8=[t55[e8].start,t55[e8].end],i8=[t55[n5].start,t55[n5].end];for(let t56 of o8)for(let e10 of i8)if(t56.z===e10.z&&me2(t56,e10)<=1)return!0}return!1})(o7);if(!i6)return o7;let a4={...i6.pointsToConnect[0],z:Co2(lo2(i6.pointsToConnect[0]),t54.layerCount)},c6={...i6.pointsToConnect[1],z:Co2(lo2(i6.pointsToConnect[1]),t54.layerCount)},l7=o7.flatMap(t55=>t55.hdRoutes),h3=o7.length>1?this.getSharedRootPathRoutes({connectionName:n4,rootConnectionName:i6.rootConnectionName??l7[0]?.rootConnectionName,hdRoutes:l7,allHdRoutes:e7,start:a4,end:c6}):null;return s7||r7||h3?[{connectionName:n4,hdRoutes:h3??ij({connectionName:n4,hdRoutes:l7,start:a4,end:c6,endpointIndex:this.endpointIndex,canStitchBetweenTerminals:t55=>this.canStitchBetweenTerminals(t55)}),start:a4,end:c6}]:o7}),this.MAX_ITERATIONS=1e5}getSolverName(){return"MultipleHighDensityRouteStitchSolver3"}canStitchBetweenTerminals(t54){let e7=new QF({connectionName:t54.connectionName,hdRoutes:t54.hdRoutes,start:t54.start,end:t54.end,colorMap:this.colorMap,defaultTraceThickness:this.defaultTraceThickness,defaultViaDiameter:this.defaultViaDiameter,allowedLayerTransitionPointKeys:this.allowedLayerTransitionPointKeys});for(;!e7.solved&&!e7.failed&&e7.iterations<e7.MAX_ITERATIONS;)e7.step();if(e7.failed)return!1;let n3=e7.mergedHdRoute.route[0],o6=e7.mergedHdRoute.route[e7.mergedHdRoute.route.length-1],i3=me2(n3,t54.start)+me2(o6,t54.end),s6=me2(n3,t54.end)+me2(o6,t54.start);return Math.min(i3,s6)<=WF}getSharedRootPathRoutes(t54){let e7=t54.rootConnectionName;if(!e7)return null;let n3=new Set(t54.hdRoutes),o6=t54.allHdRoutes.filter(t55=>(t55.rootConnectionName??t55.connectionName)===e7);if(o6.every(t55=>n3.has(t55)))return null;let i3=ij({connectionName:t54.connectionName,hdRoutes:o6,start:t54.start,end:t54.end,endpointIndex:this.endpointIndex,canStitchBetweenTerminals:t55=>this.canStitchBetweenTerminals(t55)});return!i3.some(t55=>!n3.has(t55))||i3.length>=o6.length?null:i3}_step(){if(this.activeSolver)return this.activeSolver.step(),void(this.activeSolver.solved?(this.activeSolver instanceof QF&&this.mergedHdRoutes.push(this.activeSolver.mergedHdRoute),this.activeSolver=null):this.activeSolver.failed&&(this.failed=!0,this.error=this.activeSolver.error));let t54=this.unsolvedRoutes.pop();t54?this.activeSolver=new QF({connectionName:t54.connectionName,hdRoutes:t54.hdRoutes,start:t54.start,end:t54.end,colorMap:this.colorMap,defaultTraceThickness:this.defaultTraceThickness,defaultViaDiameter:this.defaultViaDiameter,allowedLayerTransitionPointKeys:this.allowedLayerTransitionPointKeys}):this.solved=!0}visualize(){let t54={points:[],lines:[],circles:[],rects:[],title:"Multiple High Density Route Stitch Solver 3"};if(this.activeSolver){let e7=this.activeSolver.visualize();e7.points?.length&&t54.points?.push(...e7.points),e7.lines?.length&&t54.lines?.push(...e7.lines),e7.circles?.length&&t54.circles?.push(...e7.circles),e7.rects?.length&&(t54.rects||(t54.rects=[]),t54.rects.push(...e7.rects))}for(let[e7,n3]of this.mergedHdRoutes.entries()){let o6=this.colorMap[n3.connectionName]??`hsl(120, 100%, ${40+10*e7%40}%)`;for(let e8=0;e8<n3.route.length-1;e8++){let i3=n3.route[e8],s6=n3.route[e8+1],r6=i3.z!==0?vo2(o6,.5):o6;t54.lines?.push({points:[{x:i3.x,y:i3.y},{x:s6.x,y:s6.y}],strokeColor:r6,strokeWidth:n3.traceThickness})}for(let e8 of n3.route){let n4=e8.z!==0?vo2(o6,.5):o6;t54.points?.push({x:e8.x,y:e8.y,color:n4})}for(let e8 of n3.vias)t54.circles?.push({center:{x:e8.x,y:e8.y},radius:n3.viaDiameter/2,fill:o6});if(n3.jumpers&&n3.jumpers.length>0){let e8=Gr2(n3.jumpers,{color:o6,label:n3.connectionName});t54.rects.push(...e8.rects??[]),t54.lines.push(...e8.lines??[])}}return t54}},rj=t54=>(t54%360+360)%360,aj=t54=>{let e7=rj(t54);return[0,90,180,270].some(t55=>Math.min(Math.abs(e7-t55),360-Math.abs(e7-t55))<=.01)},cj=(t54,e7)=>{let{ccwRotationDegrees:n3,...o6}=t54,i3=(t55=>{let e8=rj(t55),n4=[0,90,180,270];for(let t56 of n4)if(Math.min(Math.abs(e8-t56),360-Math.abs(e8-t56))<=.01)return t56;return null})(e7);return i3===90||i3===270?{...o6,width:t54.height,height:t54.width}:o6},lj=t54=>"layers"in t54?t54.layers:[t54.layer],hj=(t54,e7)=>!(lj(t54).length>0&&!lj(t54).some(t55=>e7.layers.includes(t55)))&&xe2(t54,ze2(e7)),dj=(t54,e7)=>{let{minX:n3,maxX:o6,minY:i3,maxY:s6}=ze2(e7);return{x:Math.max(n3,Math.min(o6,t54.x)),y:Math.max(i3,Math.min(s6,t54.y))}},uj=(t54,e7)=>t54.obstacleId??`${t54.componentId??"obstacle"}_${e7}`,pj=(t54,e7={})=>{let n3=t54.ccwRotationDegrees;if(typeof n3!="number"||!Number.isFinite(n3))return[t54];if(aj(n3))return[cj(t54,n3)];let{ccwRotationDegrees:o6,...i3}=t54,s6={center:t54.center,width:t54.width,height:t54.height,rotation:n3},r6=(t55=>{let e8=Math.max(t55.width,t55.height),n4=Math.min(t55.width,t55.height);return t55.obstacleId?.startsWith("trace_obstacle_")?Math.max(2,Math.ceil(e8/.75)):n4<=0?2:e8/n4<2||n4>=.9?null:Math.max(2,Math.ceil(e8/.75))})(t54),a3=e7.useSparseCenterlineApproximation?(t55=>{let{center:e8,width:n4,height:o7,rotation:i6}=t55,s7=Math.max(n4,o7),r7=Math.min(n4,o7),a4=Math.max(1,Math.ceil(s7/(2*r7))),c7=s7/a4,l7=i6*Math.PI/180,h3=Math.cos(l7),d4=Math.sin(l7),u6=[];for(let t56=0;t56<a4;t56++){let i8=(t56-a4/2+.5)*c7,s8=n4>=o7?i8*h3:-i8*d4,l10=n4>=o7?i8*d4:i8*h3;u6.push({center:{x:e8.x+s8,y:e8.y+l10},width:r7,height:r7})}return u6})(s6):r6===null?((t55,e8)=>{let{center:n4,width:o7,height:i6,rotation:s7}=t55,r7=Math.max(1,Math.ceil(o7/e8)),a4=Math.max(1,Math.ceil(i6/e8)),c7=o7/r7,l7=i6/a4,h3=s7*Math.PI/180,d4=Math.cos(h3),u6=Math.sin(h3),p5=[];for(let t56=0;t56<r7;t56++){let e10=(t56-r7/2+.5)*c7;for(let t57=0;t57<a4;t57++){let o8=(t57-a4/2+.5)*l7;p5.push({center:{x:n4.x+e10*d4-o8*u6,y:n4.y+e10*u6+o8*d4},width:Math.abs(c7*d4)+Math.abs(l7*u6),height:Math.abs(c7*u6)+Math.abs(l7*d4)})}}return p5})(s6,(t55=>t55.obstacleId?.startsWith("trace_obstacle_")?.75:.4)(t54)):t54.obstacleId?.startsWith("trace_obstacle_")?(function(t55,e8=2){let{center:n4,width:o7,height:i6,rotation:s7}=t55,r7=[],a4=Math.max(1,Math.ceil(e8)),c7=s7*Math.PI/180,l7=Math.cos(c7),h3=Math.sin(c7);if(o7>=i6){let t56=o7/a4;for(let e10=0;e10<a4;e10++){let o8=(e10-a4/2+.5)*t56,s8=o8*l7,c8=o8*h3,d4=Math.abs(t56*l7)+Math.abs(i6*h3),u6=Math.abs(t56*h3)+Math.abs(i6*l7);r7.push({center:{x:n4.x+s8,y:n4.y+c8},width:d4,height:u6})}}else{let t56=i6/a4;for(let e10=0;e10<a4;e10++){let i8=(e10-a4/2+.5)*t56,s8=-i8*h3,c8=i8*l7,d4=Math.abs(o7*l7)+Math.abs(t56*h3),u6=Math.abs(o7*h3)+Math.abs(t56*l7);r7.push({center:{x:n4.x+s8,y:n4.y+c8},width:d4,height:u6})}}return r7})(s6,r6):((t55,e8)=>{let{center:n4,width:o7,height:i6,rotation:s7}=t55,r7=Math.max(o7,i6),a4=Math.min(o7,i6),c7=Math.max(1,Math.ceil(e8)),l7=r7/c7,h3=s7*Math.PI/180,d4=Math.cos(h3),u6=Math.sin(h3),p5=Math.max(l7,.75*a4),m4=[];for(let t56=0;t56<c7;t56++){let e10=(t56-c7/2+.5)*l7,s8=o7>=i6?e10*d4:-e10*u6,r8=o7>=i6?e10*u6:e10*d4;m4.push({center:{x:n4.x+s8,y:n4.y+r8},width:p5,height:p5})}return m4})(s6,r6),c6=t54.connectedTo.length>0?a3.reduce((e8,n4,o7)=>{let i6=a3[e8],s7=(i6.center.x-t54.center.x)**2+(i6.center.y-t54.center.y)**2;return(n4.center.x-t54.center.x)**2+(n4.center.y-t54.center.y)**2<s7?o7:e8},0):-1;return a3.map((t55,e8)=>({...i3,obstacleId:e8===c6?i3.obstacleId:i3.obstacleId?`${i3.obstacleId}_approx_${e8}`:void 0,connectedTo:e8===c6?i3.connectedTo:[],center:t55.center,width:t55.width,height:t55.height}))},mj=t54=>{let e7=new Map,n3=new Map,o6=new Map,i3=t54.obstacles.filter(t55=>t55.connectedTo.length>0&&typeof t55.ccwRotationDegrees=="number"&&Number.isFinite(t55.ccwRotationDegrees)&&!aj(t55.ccwRotationDegrees)).length>20;for(let[s7,r6]of t54.obstacles.entries()){let t55=pj(r6,{useSparseCenterlineApproximation:i3&&r6.connectedTo.length>0&&!r6.obstacleId?.startsWith("trace_obstacle_")}),a3=uj(r6,s7);n3.set(a3,t55),o6.set(a3,r6);for(let n4 of t55){let t56=[n4.center.x.toFixed(6),n4.center.y.toFixed(6),n4.width.toFixed(6),n4.height.toFixed(6),n4.layers.join(",")].join(":"),o7=e7.get(t56);o7?o7.connectedTo=[...new Set([...o7.connectedTo,...n4.connectedTo])]:e7.set(t56,n4)}}let s6=t54.connections.map(t55=>({...t55,pointsToConnect:t55.pointsToConnect.map(t56=>{let e8=(t57=>[t57.pointId,t57.pcb_port_id].filter(t58=>!!t58))(t56);if(e8.length===0)return t56;for(let[i6,s7]of o6){if(!e8.some(t57=>s7.connectedTo.includes(t57))||!hj(t56,s7))continue;let o7=n3.get(i6)??[];if(o7.length===0)continue;if(o7.some(e10=>hj(t56,e10)))return t56;let r6=o7[0],a3=Number.POSITIVE_INFINITY;for(let e10 of o7){let n4=me2(dj(t56,e10),t56);n4<a3&&(a3=n4,r6=e10)}return{...t56,...dj(t56,r6)}}return t56})}));return{...t54,connections:s6,obstacles:[...e7.values()]}},gj=.001,fj=t54=>t54.route_type==="wire",yj=t54=>t54.route_type==="via",_j=t54=>t54.route_type==="through_obstacle",bj=(t54,e7,n3)=>{let o6=Co2(t54,n3),i3=Co2(e7,n3),s6=Math.min(o6,i3),r6=Math.max(o6,i3);return Array.from({length:r6-s6+1},(t55,e8)=>po2(s6+e8,n3))},xj=({obstacleId:t54,start:e7,end:n3,width:o6,layer:i3,connectedTo:s6})=>{let r6=n3.x-e7.x,a3=n3.y-e7.y,c6=Math.hypot(r6,a3);return c6<=gj?null:{obstacleId:t54,type:"rect",layers:[i3],center:{x:(e7.x+n3.x)/2,y:(e7.y+n3.y)/2},width:c6,height:Math.max(o6,gj),ccwRotationDegrees:180*Math.atan2(a3,r6)/Math.PI,connectedTo:s6}};function vj(t54){if(!t54)return t54;let e7=(t55=>{if(!t55)return[];let e8=[],n3=Eo2(t55);for(let[o6,i3]of(t55.traces??[]).entries()){let s6=i3.connectsTo??[];for(let r6=0;r6<i3.route.length;r6++){let a3=i3.route[r6];if(yj(a3)){let c6=a3.via_diameter??n3.padDiameter;e8.push({obstacleId:`trace_obstacle_${i3.pcb_trace_id}_${o6}_${r6}_via`,type:"rect",layers:bj(a3.from_layer,a3.to_layer,t55.layerCount),center:{x:a3.x,y:a3.y},width:Math.max(c6,gj),height:Math.max(c6,gj),connectedTo:s6});continue}if(_j(a3)){let n4=xj({obstacleId:`trace_obstacle_${i3.pcb_trace_id}_${o6}_${r6}_through`,start:a3.start,end:a3.end,width:a3.width,layer:a3.from_layer,connectedTo:s6});n4&&(n4.layers=bj(a3.from_layer,a3.to_layer,t55.layerCount),e8.push(n4))}}for(let t56=0;t56<i3.route.length-1;t56++){let n4=i3.route[t56],r6=i3.route[t56+1];if(!fj(n4)||!fj(r6)||n4.layer!==r6.layer)continue;let a3=xj({obstacleId:`trace_obstacle_${i3.pcb_trace_id}_${o6}_${t56}_wire`,start:n4,end:r6,width:n4.width,layer:n4.layer,connectedTo:s6});a3&&e8.push(a3)}}return e8})(t54);return e7.length===0?t54:{...t54,obstacles:[...t54.obstacles??[],...e7]}}var Sj=t54=>{let e7=t54.obstacles.filter(e8=>!((t55,e10)=>!(t56=>(t56.connectedTo?.length??0)>0||(t56.offBoardConnectsTo?.length??0)>0||t56.netIsAssignable===!0)(t55)&&(e10.outline&&e10.outline.length>=3?!Ie2(t55,e10.outline):!De2({minX:t55.center.x-t55.width/2,maxX:t55.center.x+t55.width/2,minY:t55.center.y-t55.height/2,maxY:t55.center.y+t55.height/2},e10.bounds)))(e8,t54)),n3=e7.length!==t54.obstacles.length,o6=n3&&t54.outline&&t54.outline.length>=3?(t55=>{if(t55.width&&t55.height&&t55.center){let e10=t55.width/2,n5=t55.height/2;return{minX:t55.center.x-e10,minY:t55.center.y-n5,maxX:t55.center.x+e10,maxY:t55.center.y+n5,width:t55.width,height:t55.height,center:{x:t55.center.x,y:t55.center.y}}}if(!t55.outline||t55.outline.length===0)throw new Error("Unable to compute board bounds. pcb_board must include width/height/center or a non-empty outline.");let e8=Number.POSITIVE_INFINITY,n4=Number.POSITIVE_INFINITY,o7=Number.NEGATIVE_INFINITY,i3=Number.NEGATIVE_INFINITY;for(let s7 of t55.outline)e8=Math.min(e8,s7.x),n4=Math.min(n4,s7.y),o7=Math.max(o7,s7.x),i3=Math.max(i3,s7.y);let s6=o7-e8,r6=i3-n4;return{minX:e8,minY:n4,maxX:o7,maxY:i3,width:s6,height:r6,center:{x:e8+s6/2,y:n4+r6/2}}})({type:"pcb_board",pcb_board_id:"__autorouting_board_outline__",center:{x:0,y:0},thickness:1,num_layers:t54.layerCount,material:"fr4",outline:t54.outline}):t54.bounds;return n3?{...t54,obstacles:e7,bounds:o6}:t54},Ij=class extends Fo2{constructor(t54){super();__publicField(this,"inputSrj");__publicField(this,"outputSrj");this.inputSrj=t54,this.MAX_ITERATIONS=1}_step(){let t54=vj(this.inputSrj)??this.inputSrj;this.outputSrj=mj(Sj(t54)),this.solved=!0}getOutputSimpleRouteJson(){if(!this.outputSrj)throw new Error("PreprocessSimpleRouteJsonSolver has not solved yet");return this.outputSrj}getConstructorParams(){return[this.inputSrj]}visualize(){return this.outputSrj?Wo2(Oo2({...this.outputSrj,traces:[]}),tk(this.outputSrj)):{lines:[],points:[],rects:[],circles:[]}}};function Pj(t54,e7,n3,o6={}){return{solverName:t54,solverClass:e7,getConstructorParams:n3,onSolved:o6.onSolved}}var Mj=class extends Fo2{constructor(t54,e7={}){super();__publicField(this,"srj");__publicField(this,"opts");__publicField(this,"preprocessSimpleRouteJsonSolver");__publicField(this,"escapeViaLocationSolver");__publicField(this,"netToPointPairsSolver");__publicField(this,"nodeSolver");__publicField(this,"nodeDimensionSubdivisionSolver");__publicField(this,"nodeTargetMerger");__publicField(this,"edgeSolver");__publicField(this,"colorMap");__publicField(this,"highDensityRouteSolver");__publicField(this,"highDensityForceImproveSolver");__publicField(this,"highDensityRepairSolver");__publicField(this,"highDensityStitchSolver");__publicField(this,"globalDrcForceImproveSolver");__publicField(this,"singleLayerNodeMerger");__publicField(this,"strawSolver");__publicField(this,"deadEndSolver");__publicField(this,"traceSimplificationSolver");__publicField(this,"availableSegmentPointSolver");__publicField(this,"portPointPathingSolver");__publicField(this,"multiSectionPortPointOptimizer");__publicField(this,"uniformPortDistributionSolver");__publicField(this,"traceWidthSolver");__publicField(this,"necessaryCrampedPortPointSolver");__publicField(this,"viaDiameter");__publicField(this,"viaHoleDiameter");__publicField(this,"minTraceWidth");__publicField(this,"effort");__publicField(this,"maxNodeDimension");__publicField(this,"maxNodeRatio");__publicField(this,"minNodeArea");__publicField(this,"startTimeOfPhase");__publicField(this,"endTimeOfPhase");__publicField(this,"timeSpentOnPhase");__publicField(this,"activeSubSolver",null);__publicField(this,"connMap");__publicField(this,"srjWithEscapeViaLocations");__publicField(this,"srjWithPointPairs");__publicField(this,"originalSrj");__publicField(this,"capacityNodes",null);__publicField(this,"capacityEdges",null);__publicField(this,"highDensityNodePortPoints");__publicField(this,"cacheProvider",null);__publicField(this,"pipelineDef",[Pj("preprocessSimpleRouteJsonSolver",Ij,t54=>[t54.originalSrj],{onSolved:t54=>{t54.setSimpleRouteJson(t54.preprocessSimpleRouteJsonSolver.getOutputSimpleRouteJson())}}),Pj("escapeViaLocationSolver",rk,t54=>[t54.srj,{viaDiameter:t54.viaDiameter,minTraceWidth:t54.minTraceWidth,obstacleMargin:t54.srj.defaultObstacleMargin??.15}],{onSolved:t54=>{t54.srjWithEscapeViaLocations=t54.escapeViaLocationSolver?.getOutputSimpleRouteJson()}}),Pj("netToPointPairsSolver",Wr2,t54=>[t54.srjWithEscapeViaLocations??t54.srj,t54.colorMap],{onSolved:t54=>{t54.srjWithPointPairs=t54.netToPointPairsSolver?.getNewSimpleRouteJson(),t54.colorMap=xo2(t54.srjWithPointPairs,t54.connMap),t54.connMap=ko2(t54.srjWithPointPairs)}}),Pj("nodeSolver",Hn2,t54=>[{simpleRouteJson:t54.srjWithPointPairs,maxGapFillPasses:4}],{onSolved:t54=>{t54.capacityNodes=t54.nodeSolver?.getOutput().meshNodes??[]}}),Pj("nodeDimensionSubdivisionSolver",mL,t54=>[t54.capacityNodes,t54.maxNodeDimension,t54.maxNodeRatio,t54.minNodeArea],{onSolved:t54=>{t54.capacityNodes=t54.nodeDimensionSubdivisionSolver?.outputNodes??[]}}),Pj("edgeSolver",Ho2,t54=>[t54.capacityNodes],{onSolved:t54=>{t54.capacityEdges=t54.edgeSolver?.edges}}),Pj("availableSegmentPointSolver",Yo2,t54=>[{nodes:t54.capacityNodes,edges:t54.capacityEdges||[],traceWidth:t54.minTraceWidth,colorMap:t54.colorMap,shouldReturnCrampedPortPoints:!0}]),Pj("necessaryCrampedPortPointSolver",lg,t54=>[{capacityMeshNodes:t54.capacityNodes,sharedEdgeSegments:t54.availableSegmentPointSolver.getOutput(),simpleRouteJson:t54.srjWithPointPairs,numberOfCrampedPortPointsToKeep:5}]),Pj("portPointPathingSolver",Kz,t54=>{let e7=t54.necessaryCrampedPortPointSolver?.getOutput()??t54.availableSegmentPointSolver.getOutput(),{graph:n3,connections:o6}=bg({capacityMeshNodes:t54.capacityNodes,layerCount:t54.srj.layerCount,segmentPortPoints:e7.flatMap(t55=>t55.portPoints),simpleRouteJsonConnections:t54.srjWithPointPairs.connections});return[{graph:n3,connections:o6,layerCount:t54.srj.layerCount,effort:t54.effort,minViaPadDiameter:t54.viaDiameter,flags:{FORCE_CENTER_FIRST:!0,RIPPING_ENABLED:!0},weights:{SHUFFLE_SEED:0,MEMORY_PF_FACTOR:4,CENTER_OFFSET_DIST_PENALTY_FACTOR:0,CENTER_OFFSET_FOCUS_SHIFT:0,NODE_PF_FACTOR:0,LAYER_CHANGE_COST:0,RIPPING_PF_COST:0,NODE_PF_MAX_PENALTY:100,BASE_CANDIDATE_COST:.6,MAX_ITERATIONS_PER_PATH:0,RANDOM_WALK_DISTANCE:0,START_RIPPING_PF_THRESHOLD:.3,END_RIPPING_PF_THRESHOLD:1,MAX_RIPS:1e3,RANDOM_RIP_FRACTION:.3,STRAIGHT_LINE_DEVIATION_PENALTY_FACTOR:4,GREEDY_MULTIPLIER:.7,MIN_ALLOWED_BOARD_SCORE:-1e4}}]}),Pj("uniformPortDistributionSolver",ro2,t54=>[{nodeWithPortPoints:t54.portPointPathingSolver?.getOutput().nodesWithPortPoints??[],inputNodesWithPortPoints:t54.portPointPathingSolver?.getOutput().inputNodeWithPortPoints??[],minTraceWidth:t54.minTraceWidth,obstacles:t54.srj.obstacles,layerCount:t54.srj.layerCount}]),Pj("highDensityRouteSolver",ur2,t54=>{let e7=t54.uniformPortDistributionSolver?.getOutput()??[],n3=t54.portPointPathingSolver?.getOutput().nodesWithPortPoints??[],o6=e7.length>0?e7:n3;return t54.highDensityNodePortPoints=structuredClone(o6),[{nodePortPoints:o6,nodePfById:new Map((t54.portPointPathingSolver?.getOutput().inputNodeWithPortPoints??[]).map(e8=>[e8.capacityMeshNodeId,t54.portPointPathingSolver?.computeNodePf(e8)??null])),colorMap:t54.colorMap,connMap:t54.connMap,viaDiameter:t54.viaDiameter,traceWidth:t54.minTraceWidth,obstacleMargin:t54.srj.defaultObstacleMargin??.15,obstacles:t54.srj.obstacles,layerCount:t54.srj.layerCount,useGrowShrinkHighDensityIntraNodeSolver:!0}]}),Pj("highDensityForceImproveSolver",Ef2,t54=>[{nodeWithPortPoints:t54.highDensityNodePortPoints??[],hdRoutes:t54.highDensityRouteSolver.routes,colorMap:t54.colorMap,totalStepsPerNode:Math.max(20,Math.round(60*t54.effort)),nodeAssignmentMargin:t54.srj.defaultObstacleMargin??.2}]),Pj("highDensityRepairSolver",BF,t54=>[{nodeWithPortPoints:t54.highDensityNodePortPoints??[],hdRoutes:t54.highDensityForceImproveSolver?.getOutput()??t54.highDensityRouteSolver.routes,obstacles:t54.srj.obstacles,colorMap:t54.colorMap,repairMargin:t54.srj.defaultObstacleMargin??.2}]),Pj("highDensityStitchSolver",sj,t54=>[{connections:t54.srjWithPointPairs.connections,hdRoutes:t54.highDensityRepairSolver?.getOutput()??t54.highDensityForceImproveSolver?.getOutput()??t54.highDensityRouteSolver.routes,colorMap:t54.colorMap,layerCount:t54.srj.layerCount,defaultViaDiameter:t54.viaDiameter}]),Pj("traceSimplificationSolver",Ma2,t54=>[{hdRoutes:t54.highDensityStitchSolver.mergedHdRoutes,obstacles:t54.srj.obstacles,connMap:t54.connMap,colorMap:t54.colorMap,outline:t54.srj.outline,defaultViaDiameter:t54.viaDiameter,layerCount:t54.srj.layerCount,minTraceToPadEdgeClearance:t54.srj.minTraceToPadEdgeClearance,iterations:2}]),Pj("traceWidthSolver",Na2,t54=>[{hdRoutes:t54.traceSimplificationSolver.simplifiedHdRoutes,obstacles:t54.srj.obstacles,connMap:t54.connMap,colorMap:t54.colorMap,minTraceWidth:t54.minTraceWidth,connection:t54.srj.connections,obstacleMargin:t54.srj.minTraceToPadEdgeClearance??.15,layerCount:t54.srj.layerCount}]),Pj("globalDrcForceImproveSolver",pL,t54=>[{srj:t54.srjWithPointPairs,hdRoutes:t54.traceWidthSolver.getHdRoutesWithWidths(),effort:t54.effort}])]);__publicField(this,"currentPipelineStepIndex",0);this.srj=t54,this.opts=e7,this.originalSrj=t54,this.opts={...e7};let n3=this.opts;if(this.effort=n3.effort??1,this.MAX_ITERATIONS=1e8*this.effort,this.maxNodeDimension=n3.maxNodeDimension??16,this.maxNodeRatio=n3.maxNodeRatio??6,this.minNodeArea=n3.minNodeArea??.1**2,this.setSimpleRouteJson(t54),n3.capacityDepth===void 0){let t55=this.srj.bounds.maxX-this.srj.bounds.minX,e8=this.srj.bounds.maxY-this.srj.bounds.minY,o6=Math.max(t55,e8),i3=n3.targetMinCapacity??.5;n3.capacityDepth=fr2(o6,i3)}this.cacheProvider=n3.cacheProvider===void 0?Zn2():n3.cacheProvider===null?null:n3.cacheProvider,this.startTimeOfPhase={},this.endTimeOfPhase={},this.timeSpentOnPhase={}}setSimpleRouteJson(t54){this.srj=t54;let e7=Eo2(this.srj);this.viaDiameter=e7.padDiameter,this.viaHoleDiameter=e7.holeDiameter,this.minTraceWidth=this.srj.minTraceWidth,this.connMap=ko2(this.srj),this.colorMap=xo2(this.srj,this.connMap)}getConstructorParams(){return[this.srj,this.opts]}_step(){let t54=this.pipelineDef[this.currentPipelineStepIndex];if(!t54)return void(this.solved=!0);if(this.activeSubSolver)return this.activeSubSolver.step(),void(this.activeSubSolver.solved?(this.endTimeOfPhase[t54.solverName]=performance.now(),this.timeSpentOnPhase[t54.solverName]=this.endTimeOfPhase[t54.solverName]-this.startTimeOfPhase[t54.solverName],t54.onSolved?.(this),this.activeSubSolver=null,this.currentPipelineStepIndex++):this.activeSubSolver.failed&&(this.error=this.activeSubSolver?.error,this.failed=!0,this.activeSubSolver=null));let e7=t54.getConstructorParams(this);this.activeSubSolver=new t54.solverClass(...e7),this[t54.solverName]=this.activeSubSolver,this.timeSpentOnPhase[t54.solverName]=0,this.startTimeOfPhase[t54.solverName]=performance.now()}solveUntilPhase(t54){for(;this.getCurrentPhase()!==t54;)this.step()}getCurrentPhase(){return this.pipelineDef[this.currentPipelineStepIndex]?.solverName??"none"}visualize(){if(!this.solved&&this.activeSubSolver)return this.activeSubSolver.visualize();let t54=this.escapeViaLocationSolver?.visualize(),e7=this.netToPointPairsSolver?.visualize(),n3=this.nodeSolver?.visualize(),o6=this.nodeDimensionSubdivisionSolver?.visualize(),i3=this.nodeTargetMerger?.visualize(),s6=this.singleLayerNodeMerger?.visualize(),r6=this.strawSolver?.visualize(),a3=this.edgeSolver?.visualize(),c6=this.deadEndSolver?.visualize(),l7=this.availableSegmentPointSolver?.visualize(),h3=this.portPointPathingSolver?.visualize(),d4=this.multiSectionPortPointOptimizer?.visualize(),u6=this.uniformPortDistributionSolver?.visualize(),p5=this.highDensityRouteSolver?.visualize(),m4=this.highDensityForceImproveSolver?.visualize(),g4=this.highDensityRepairSolver?.visualize(),f4=this.highDensityStitchSolver?.visualize(),y3=this.traceSimplificationSolver?.visualize(),_3=this.necessaryCrampedPortPointSolver?.visualize(),b4=(this.highDensityRouteSolver?.visualize(),this.originalSrj),x4=b4.outline,v3=[];if(v3.push({points:[{x:b4.bounds?.minX??-50,y:b4.bounds?.minY??-50},{x:b4.bounds?.maxX??50,y:b4.bounds?.minY??-50},{x:b4.bounds?.maxX??50,y:b4.bounds?.maxY??50},{x:b4.bounds?.minX??-50,y:b4.bounds?.maxY??50},{x:b4.bounds?.minX??-50,y:b4.bounds?.minY??-50}],strokeColor:"rgba(255,0,0,0.25)"}),x4&&x4.length>=2){let t55=x4.map(t56=>({x:t56.x,y:t56.y}));t55.push({...t55[0]}),v3.push({points:t55,strokeColor:"rgba(0, 136, 255, 0.95)"})}let S7=Mo2(b4),I4={points:[...b4.connections.flatMap(t55=>t55.pointsToConnect.map(e8=>({...e8,layer:To2(e8,b4.layerCount),label:`${t55.name} ${e8.pcb_port_id??""}`})))],rects:[...(b4.obstacles??[]).filter(t55=>!t55.isCopperPour).map(t55=>({...t55,fill:t55.layers?.includes("top")?"rgba(255,0,0,0.25)":t55.layers?.includes("bottom")?"rgba(0,0,255,0.25)":"rgba(255,0,0,0.25)",layer:wo2(t55,b4.layerCount),label:S7(t55)}))],lines:v3},P6=tk(b4),M5=[Wo2(I4,P6),t54,e7,n3,o6,i3,s6,r6,a3,c6,l7,_3,h3,d4,u6,p5?Wo2(I4,p5):null,m4,g4,f4,y3,this.solved?Wo2(I4,tk(this.originalSrj),Oo2(this.getOutputSimpleRouteJson())):null].filter(Boolean);return Wo2(...M5)}preview(){if(this.highDensityRouteSolver){let t54=[];for(let e7=this.highDensityRouteSolver.routes.length-1;e7>=0;e7--){let n3=this.highDensityRouteSolver.routes[e7];if(t54.push({points:n3.route.map(t55=>({x:t55.x,y:t55.y})),strokeColor:this.colorMap[n3.connectionName]}),t54.length>200)break}return{lines:t54}}return this.portPointPathingSolver?this.portPointPathingSolver.preview():this.netToPointPairsSolver?this.netToPointPairsSolver.visualize():this.escapeViaLocationSolver?this.escapeViaLocationSolver.visualize():this.preprocessSimpleRouteJsonSolver?this.preprocessSimpleRouteJsonSolver.visualize():{}}_getOutputHdRoutes(){return this.globalDrcForceImproveSolver?.getOutput()??this.traceWidthSolver?.getHdRoutesWithWidths()??this.traceSimplificationSolver?.simplifiedHdRoutes??this.highDensityStitchSolver.mergedHdRoutes}getOutputSimplifiedPcbTraces(){if(!this.solved||!this.highDensityRouteSolver)throw new Error("Cannot get output before solving is complete");let t54=[],e7=this._getOutputHdRoutes();for(let n3 of this.netToPointPairsSolver?.newConnections??[]){let o6=n3.netConnectionName??this.originalSrj.connections.find(t55=>t55.name===n3.name)?.netConnectionName,i3=e7.filter(t55=>t55.connectionName===n3.name);for(let e8=0;e8<i3.length;e8++){let s6=i3[e8],r6={type:"pcb_trace",pcb_trace_id:`${n3.name}_${e8}`,connection_name:o6??n3.rootConnectionName??n3.name,route:_o2(s6,this.srj.layerCount,{connectionPoints:n3.pointsToConnect,defaultViaHoleDiameter:this.viaHoleDiameter,obstacles:this.srj.obstacles,connMap:this.connMap})};t54.push(r6)}}return t54}getOutputSimpleRouteJson(){return{...this.originalSrj,traces:this.getOutputSimplifiedPcbTraces()}}},Cj=t54=>/\/solve\/?$/.test(t54)?t54.replace(/\/+$/,""):`${t54.replace(/\/+$/,"")}/solve`,Nj=(t54,e7,n3)=>{let o6=(t55=>{let e8=new Map;for(let n4 of t55.portPoints)n4.rootConnectionName&&!e8.has(n4.connectionName)&&e8.set(n4.connectionName,n4.rootConnectionName);return e8})(t54);return e7.map(t55=>({connectionName:t55.connectionName,rootConnectionName:t55.rootConnectionName??o6.get(t55.connectionName)??void 0,traceThickness:t55.traceThickness??n3.traceWidth,viaDiameter:t55.viaDiameter??n3.viaDiameter,route:(t55.route??[]).map(t56=>({x:t56.x,y:t56.y,z:t56.z,...t56.insideJumperPad?{insideJumperPad:!0}:{}})),vias:(t55.vias??[]).map(t56=>({x:t56.x,y:t56.y})),...t55.jumpers?{jumpers:t55.jumpers}:{}}))},Tj=(t54,e7)=>{if(t54.length===0)return null;let n3=Math.min(Math.max(e7,0),1),o6=(t54.length-1)*n3,i3=Math.floor(o6),s6=Math.ceil(o6),r6=t54[i3],a3=t54[s6];return i3===s6?r6:r6+(a3-r6)*(o6-i3)},wj=t54=>new Set(t54.portPoints.map(t55=>t55.connectionName)).size,Rj=t54=>!(wj(t54)<3)&&(t54.availableZ?.length??0)!==1,Ej=t54=>t54?.MULTI_HEAD_POLYLINE_SOLVER?"MultiHeadPolyLineIntraNodeSolver3":t54?.CLOSED_FORM_SINGLE_TRANSITION?"SingleTransitionIntraNodeSolver":t54?.CLOSED_FORM_TWO_TRACE_SAME_LAYER?"TwoCrossingRoutesHighDensitySolver":t54?.CLOSED_FORM_TWO_TRACE_TRANSITION_CROSSING?"SingleTransitionCrossingRouteSolver":t54?.HIGH_DENSITY_A01?"HighDensitySolverA01":t54?.HIGH_DENSITY_A03?"HighDensitySolverA03":"SingleHighDensityRouteSolver6_VertHorzLayer_FutureCost",Aj=t54=>{if(t54 instanceof ki2){let e8=Ej(t54.hyperParameters);return t54.cacheHit?`${e8} [cached]`:e8}if(t54 instanceof Oi2)return Ej(t54.hyperParameters);if(t54&&typeof t54=="object"&&"getSolverName"in t54&&typeof t54.getSolverName=="function")return t54.getSolverName();let e7=t54?.constructor;return typeof e7?.name=="string"?e7.name:"unknown"},Oj=t54=>t54.winningSolver?Aj(t54.winningSolver):Aj(t54),Lj=class extends Fo2{constructor({nodePortPoints:t54,colorMap:e7,connMap:n3,viaDiameter:o6,traceWidth:i3,obstacleMargin:s6,obstacles:r6,layerCount:a3,nodePfById:c6,hdCacheBaseUrl:l7,fetchImpl:h3}){super();__publicField(this,"unsolvedNodePortPoints");__publicField(this,"colorMap");__publicField(this,"connMap");__publicField(this,"viaDiameter");__publicField(this,"traceWidth");__publicField(this,"obstacleMargin");__publicField(this,"obstacles");__publicField(this,"layerCount");__publicField(this,"hdCacheBaseUrl");__publicField(this,"fetchImpl");__publicField(this,"nodePfById");__publicField(this,"routes",[]);__publicField(this,"nodeSolveMetadataById",new Map);__publicField(this,"launchedRemoteSolves",!1);__publicField(this,"solvedRoutesByNodeIndex",new Map);__publicField(this,"failedNodeResults",[]);__publicField(this,"remoteResponseMeasurements",[]);this.unsolvedNodePortPoints=t54,this.colorMap=e7??{},this.connMap=n3,this.viaDiameter=o6??.3,this.traceWidth=i3??.15,this.obstacleMargin=s6??.15,this.obstacles=r6??[],this.layerCount=a3??2,this.hdCacheBaseUrl=l7??"https://hd-cache.tscircuit.com",this.fetchImpl=(h3??globalThis.fetch).bind(globalThis),this.nodePfById=c6 instanceof Map?new Map(c6):new Map(Object.entries(c6??{})),this.pendingEffects=[],this.stats={localDirectNodeCount:0,localSolvedNodeCount:0,localFallbackNodeCount:0,remoteFallbackNodeCount:0,remoteRequestsStarted:0,remoteRequestsCompleted:0,remoteResponseSampleCount:0,remoteKOrderSampleCount:0,slowestRemoteResponseMs:null,slowestRemoteResponseNodeId:null,p50RemoteResponseMs:null,p50RemoteKOrder:null,p95RemoteKOrder:null,remoteSources:{}}}getSolverName(){return"Pipeline5HdCacheHighDensitySolver"}computeProgress(){return this.unsolvedNodePortPoints.length===0?1:this.nodeSolveMetadataById.size/this.unsolvedNodePortPoints.length}solveNodeLocally(t54,e7,n3={}){let o6=new Ks2({nodeWithPortPoints:t54,colorMap:this.colorMap,connMap:this.connMap,viaDiameter:this.viaDiameter,traceWidth:this.traceWidth,obstacleMargin:this.obstacleMargin,obstacles:this.obstacles,layerCount:this.layerCount});if(o6.solve(),o6.failed){let e8=o6.error??`Local intra-node solver failed for ${t54.capacityMeshNodeId}`,i6=wj(t54);return this.failedNodeResults.push({node:t54,error:n3.remoteFailure&&n3.resolution==="local-fallback"?`Remote solve failed (${n3.remoteFailure}); local fallback failed (${e8})`:e8}),void this.recordNodeSolveMetadata(t54,{status:"failed",resolution:"failed",solverType:Oj(o6),supervisorType:o6.getSolverName(),iterations:o6.iterations,pairCount:i6,routeCount:0,remoteAttempt:n3.resolution==="local-fallback"?{attempted:!0,endpoint:Cj(this.hdCacheBaseUrl),source:"error",durationMs:n3.remoteDurationMs,error:n3.remoteFailure??e8}:{attempted:!1},error:e8})}this.solvedRoutesByNodeIndex.set(e7,o6.solvedRoutes);let i3=wj(t54);this.recordNodeSolveMetadata(t54,{status:"solved",resolution:n3.resolution??"local",solverType:Oj(o6),supervisorType:o6.getSolverName(),iterations:o6.iterations,pairCount:i3,routeCount:o6.solvedRoutes.length,remoteAttempt:n3.resolution==="local-fallback"?{attempted:!0,endpoint:Cj(this.hdCacheBaseUrl),source:"error",durationMs:n3.remoteDurationMs,error:n3.remoteFailure}:{attempted:!1}}),n3.resolution==="local-fallback"?(this.stats.localFallbackNodeCount+=1,this.stats.remoteFallbackNodeCount+=1):this.stats.localDirectNodeCount+=1,this.stats.localSolvedNodeCount+=1}async solveNodeViaHdCache(t54,e7){let n3=Cj(this.hdCacheBaseUrl),o6={"content-type":"application/json"},i3={nodeWithPortPoints:t54},s6=JSON.stringify(i3),r6=Date.now(),a3,c6,l7,h3=null,d4=null;try{let i6=await this.fetchImpl(n3,{method:"POST",headers:o6,body:s6});if(a3=i6.status,c6=i6.ok,l7=await i6.text(),h3=Date.now()-r6,d4=l7?JSON.parse(l7):null,!i6.ok)throw new Error(d4?.message??l7??`hd-cache request failed with status ${i6.status}`);if(!d4?.ok||d4.routes===null)throw new Error(d4?.message??`hd-cache returned no routes for ${t54.capacityMeshNodeId}`);let u10=Nj(t54,d4.routes,{traceWidth:this.traceWidth,viaDiameter:this.viaDiameter});this.solvedRoutesByNodeIndex.set(e7,u10),this.recordNodeSolveMetadata(t54,{status:"solved",resolution:"remote",solverType:`hd-cache.tscircuit.com [${d4.source}]`,iterations:null,pairCount:wj(t54),routeCount:u10.length,remoteAttempt:{attempted:!0,endpoint:Cj(this.hdCacheBaseUrl),source:d4.source,durationMs:h3}}),this.recordRemoteSource(d4.source)}catch(u10){h3??(h3=Date.now()-r6);let p5=(t55=>t55 instanceof Error?t55.message:String(t55))(u10);this.recordFailedHdCacheRequest({nodeId:t54.capacityMeshNodeId,pairCount:wj(t54),failedAt:new Date().toISOString(),durationMs:h3,error:p5,url:n3,request:{method:"POST",headers:o6,body:s6,bodyJson:i3},response:a3!==void 0||c6!==void 0||l7!==void 0||d4!==null?{status:a3,ok:c6,text:l7,body:d4}:void 0}),this.recordRemoteSource("error"),this.solveNodeLocally(t54,e7,{resolution:"local-fallback",remoteFailure:p5,remoteDurationMs:h3})}finally{this.recordRemoteResponseMetrics(t54.capacityMeshNodeId,h3??Date.now()-r6,(u6=d4?.kOrder,typeof u6=="number"&&Number.isFinite(u6)?d4.kOrder:null)),this.stats.remoteRequestsCompleted+=1}var u6}launchRemoteSolves(){let t54=[];this.unsolvedNodePortPoints.forEach((e7,n3)=>{if(!Rj(e7))return void this.solveNodeLocally(e7,n3);let o6={name:`hd-cache:${e7.capacityMeshNodeId}`,promise:Promise.resolve()};o6.promise=this.solveNodeViaHdCache(e7,n3).finally(()=>{this.pendingEffects=this.pendingEffects?.filter(t55=>t55!==o6)}),t54.push(o6)}),this.pendingEffects=t54,this.stats.remoteRequestsStarted=t54.length}recordRemoteSource(t54){this.stats.remoteSources[t54]=(this.stats.remoteSources[t54]??0)+1}recordRemoteResponseMetrics(t54,e7,n3){this.remoteResponseMeasurements.push({nodeId:t54,durationMs:e7,kOrder:n3}),this.stats.remoteResponseSampleCount=this.remoteResponseMeasurements.length,this.stats.remoteKOrderSampleCount=this.remoteResponseMeasurements.filter(t55=>t55.kOrder!==null).length;let o6=null;for(let t55 of this.remoteResponseMeasurements)(!o6||t55.durationMs>o6.durationMs)&&(o6=t55);this.stats.slowestRemoteResponseMs=o6?.durationMs??null,this.stats.slowestRemoteResponseNodeId=o6?.nodeId??null;let i3=this.remoteResponseMeasurements.map(t55=>t55.durationMs).sort((t55,e8)=>t55-e8);this.stats.p50RemoteResponseMs=Tj(i3,.5);let s6=this.remoteResponseMeasurements.map(t55=>t55.kOrder).filter(t55=>t55!==null).sort((t55,e8)=>t55-e8);this.stats.p50RemoteKOrder=Tj(s6,.5),this.stats.p95RemoteKOrder=Tj(s6,.95)}recordFailedHdCacheRequest(t54){let e7=(()=>{if(typeof window>"u")return null;let t55=window;return Array.isArray(t55.__FAILED_HD_CACHE_REQUESTS)||(t55.__FAILED_HD_CACHE_REQUESTS=[]),t55.__FAILED_HD_CACHE_REQUESTS})();e7&&e7.push(t54)}recordNodeSolveMetadata(t54,e7){this.nodeSolveMetadataById.set(t54.capacityMeshNodeId,{...e7,node:t54,nodePf:this.nodePfById.get(t54.capacityMeshNodeId)??null})}ensureFailedNodeMetadata(){for(let t54 of this.failedNodeResults)this.nodeSolveMetadataById.has(t54.node.capacityMeshNodeId)||this.recordNodeSolveMetadata(t54.node,{status:"failed",resolution:"failed",solverType:"unknown",iterations:null,pairCount:wj(t54.node),routeCount:0,remoteAttempt:{attempted:Rj(t54.node),source:"error",error:t54.error},error:t54.error})}getVisibleRoutes(){if(this.solved)return this.routes;let t54=[];for(let e7=0;e7<this.unsolvedNodePortPoints.length;e7++)t54.push(...this.solvedRoutesByNodeIndex.get(e7)??[]);return t54}createNodeMarkerLabel(t54,e7){return["hd_node_marker",`node: ${t54}`,`status: ${e7.status}`,`resolution: ${e7.resolution}`,`solver: ${e7.solverType}`,...e7.supervisorType?[`supervisor: ${e7.supervisorType}`]:[],...e7.iterations!==null?[`iterations: ${e7.iterations}`]:[],`pairCount: ${e7.pairCount}`,`routes: ${e7.routeCount}`,`nodePf: ${e7.nodePf??"n/a"}`,"remoteAttempted: "+(e7.remoteAttempt.attempted?"yes":"no"),...e7.remoteAttempt.source?[`remoteSource: ${e7.remoteAttempt.source}`]:[],...e7.remoteAttempt.durationMs!==void 0?[`remoteDurationMs: ${e7.remoteAttempt.durationMs}`]:[],...e7.remoteAttempt.error?[`remoteError: ${e7.remoteAttempt.error}`]:[],`portPoints: ${e7.node.portPoints.length}`,...e7.error?[`error: ${e7.error}`]:[]].join(`
630
+ ${t54.targetLayer}`})),rects:this.outputSrj.obstacles.filter(t54=>!t54.isCopperPour).map(t54=>({...t54,fill:"rgba(220,38,38,0.12)"}))}}},ak=t54=>({...t54}),ck=t54=>({...t54,route:t54.route?.map(ak),vias:t54.vias?.map(t55=>({...t55}))}),lk=t54=>t54.map(ck),hk="#0000FF",dk=.15,uk=1e-6,pk=.1,mk=["top","bottom","left","right"],gk=t54=>t54.x*t54.x+t54.y*t54.y,fk=(t54,e7)=>({x:t54.x-e7.x,y:t54.y-e7.y}),yk=(t54,e7,n3)=>{let o6=fk(n3,e7),i3=gk(o6);if(i3<=uk)return Math.sqrt(gk(fk(t54,e7)));let s6=(a3=fk(t54,e7),c6=o6,r6=(a3.x*c6.x+a3.y*c6.y)/i3,Math.max(0,Math.min(1,r6)));var r6,a3,c6;let l7={x:e7.x+o6.x*s6,y:e7.y+o6.y*s6};return Math.sqrt(gk(fk(t54,l7)))},_k=t54=>t54?.z===1?"bottom":"top",bk=(t54,e7,n3)=>(t54.z??0)===(e7.z??0)&&(e7.z??0)===(n3.z??0)&&(t54.x===e7.x&&e7.x===n3.x||t54.y===e7.y&&e7.y===n3.y),xk=(t54,e7,n3)=>{let o6=n3?.get(t54);if(o6)return o6;let i3=t54.route??[],s6=t54.traceThickness??dk,r6=Number.POSITIVE_INFINITY,a3=Number.POSITIVE_INFINITY,c6=Number.NEGATIVE_INFINITY,l7=Number.NEGATIVE_INFINITY,h3=!1,d4=(t55,e8,n4)=>{r6=Math.min(r6,t55-n4),a3=Math.min(a3,e8-n4),c6=Math.max(c6,t55+n4),l7=Math.max(l7,e8+n4),h3=!0},u6={segments:[],segmentsByLayer:{top:[],bottom:[]},vias:(t54.vias??[]).map(n4=>{let o7=(n4.diameter??t54.viaDiameter??.3)/2;return d4(n4.x,n4.y,o7),{center:{x:n4.x,y:n4.y},radius:o7,routeIndex:e7}}),bounds:{minX:0,minY:0,maxX:0,maxY:0}};for(let t55=0;t55<i3.length-1;){let n4=i3[t55],o7=t55+1,r7=i3[o7],a4=s6/2;for(n4&&d4(n4.x,n4.y,a4),r7&&d4(r7.x,r7.y,a4);o7<i3.length-1;){let t56=i3[o7],e8=i3[o7+1];if(!n4||!t56||!e8||_k(n4)!==_k(t56)||_k(t56)!==_k(e8)||!bk(n4,t56,e8))break;o7+=1,r7=e8,d4(e8.x,e8.y,a4)}if(!n4||!r7){t55+=1;continue}let c7=_k(n4),l10={start:n4,end:r7,routeIndex:e7,pointIndex:t55,endPointIndex:o7,thickness:s6,halfThickness:a4,layer:c7,minX:Math.min(n4.x,r7.x)-a4,maxX:Math.max(n4.x,r7.x)+a4,minY:Math.min(n4.y,r7.y)-a4,maxY:Math.max(n4.y,r7.y)+a4};u6.segments.push(l10),u6.segmentsByLayer[c7].push(l10),t55=o7}if(!h3)for(let t55 of i3)d4(t55.x,t55.y,s6/2);return u6.bounds=h3?{minX:r6,minY:a3,maxX:c6,maxY:l7}:{minX:0,minY:0,maxX:0,maxY:0},n3?.set(t54,u6),u6},vk=(t54,e7,n3)=>e7.x<=Math.max(t54.x,n3.x)+uk&&e7.x>=Math.min(t54.x,n3.x)-uk&&e7.y<=Math.max(t54.y,n3.y)+uk&&e7.y>=Math.min(t54.y,n3.y)-uk,Sk=(t54,e7,n3)=>(e7.y-t54.y)*(n3.x-e7.x)-(e7.x-t54.x)*(n3.y-e7.y),Ik=(t54,e7,n3,o6)=>((t55,e8,n4,o7)=>{let i3=Sk(t55,e8,n4),s6=Sk(t55,e8,o7),r6=Sk(n4,o7,t55),a3=Sk(n4,o7,e8);return!!(Math.abs(i3)<=uk&&vk(t55,n4,e8))||!!(Math.abs(s6)<=uk&&vk(t55,o7,e8))||!!(Math.abs(r6)<=uk&&vk(n4,t55,o7))||!!(Math.abs(a3)<=uk&&vk(n4,e8,o7))||i3>0!=s6>0&&r6>0!=a3>0})(t54,e7,n3,o6)?0:Math.min(yk(t54,n3,o6),yk(e7,n3,o6),yk(n3,t54,e7),yk(o6,t54,e7)),Pk=(t54,e7)=>Math.abs(t54.x-e7.x)<=uk&&Math.abs(t54.y-e7.y)<=uk,Mk=(t54,e7)=>Pk(t54.start,e7.start)||Pk(t54.start,e7.end)||Pk(t54.end,e7.start)||Pk(t54.end,e7.end),Ck=t54=>{if(!t54)return[];let e7=[t54.connectionName,t54.rootConnectionName].filter(t55=>!!t55);return Array.from(new Set(e7))},Nk=(t54,e7)=>{let n3=Ck(t54),o6=Ck(e7);return n3.length!==0&&o6.length!==0&&n3.some(t55=>o6.includes(t55))},Tk=(t54,e7,n3)=>t54.minX-n3<=e7.maxX&&t54.maxX+n3>=e7.minX&&t54.minY-n3<=e7.maxY&&t54.maxY+n3>=e7.minY,wk=(t54,e7,n3)=>{let o6=n3+t54.halfThickness+e7.halfThickness-uk;return t54.minX-n3<=e7.maxX&&t54.maxX+n3>=e7.minX&&t54.minY-n3<=e7.maxY&&t54.maxY+n3>=e7.minY&&o6>0},Rk=(t54,e7,n3,o6)=>{let i3=o6+n3.halfThickness+e7-uk,s6=t54.x-i3,r6=t54.x+i3,a3=t54.y-i3,c6=t54.y+i3;return s6<=n3.maxX&&r6>=n3.minX&&a3<=n3.maxY&&c6>=n3.minY},Ek=(t54,e7)=>{let n3=new WeakMap,o6=t54.map((t55,e8)=>xk(t55,e8,n3)),i3=[],s6=new Set,r6=t55=>{s6.has(t55.label)||(s6.add(t55.label),i3.push(t55))};for(let n4=0;n4<o6.length;n4+=1){let i6=o6[n4];if(i6)for(let s7=n4+1;s7<o6.length;s7+=1){let a3=o6[s7];if(a3&&!Nk(t54[n4],t54[s7])&&Tk(i6.bounds,a3.bounds,e7)){for(let t55 of["top","bottom"]){let o7=i6.segmentsByLayer[t55],c6=a3.segmentsByLayer[t55];for(let i8 of o7)for(let o8 of c6){if(Mk(i8,o8)||!wk(i8,o8,e7))continue;let a4=e7+(i8.thickness+o8.thickness)/2-uk;Ik(i8.start,i8.end,o8.start,o8.end)>=a4||r6({center:{x:(Math.max(i8.minX-e7,o8.minX-e7)+Math.min(i8.maxX+e7,o8.maxX+e7))/2,y:(Math.max(i8.minY-e7,o8.minY-e7)+Math.min(i8.maxY+e7,o8.maxY+e7))/2},label:`trace-violation:${n4}:s${i8.pointIndex}:${s7}:s${o8.pointIndex}:${t55}`})}}for(let t55 of i6.segments)for(let[o7,i8]of a3.vias.entries()){if(!Rk(i8.center,i8.radius,t55,e7))continue;let a4=e7+t55.halfThickness+i8.radius-uk;yk(i8.center,t55.start,t55.end)>=a4||r6({center:i8.center,label:`trace-violation:${n4}:s${t55.pointIndex}:${s7}:v${o7}`})}for(let t55 of a3.segments)for(let[o7,a4]of i6.vias.entries()){if(!Rk(a4.center,a4.radius,t55,e7))continue;let i8=e7+t55.halfThickness+a4.radius-uk;yk(a4.center,t55.start,t55.end)>=i8||r6({center:a4.center,label:`trace-violation:${n4}:v${o7}:${s7}:s${t55.pointIndex}`})}}}}return(t55=>{let e8=[];for(let n4 of t55){let t56=e8.find(t57=>{return e10=t57.center,o7=n4.center,Math.hypot(e10.x-o7.x,e10.y-o7.y)<=.28;var e10,o7});t56?(t56.center={x:(t56.center.x*t56.count+n4.center.x)/(t56.count+1),y:(t56.center.y*t56.count+n4.center.y)/(t56.count+1)},t56.labels.push(n4.label),t56.count+=1):e8.push({center:n4.center,labels:[n4.label],count:1})}return e8.map((t56,e10)=>({center:t56.center,radius:Math.min(.3,.2+.035*Math.sqrt(t56.count-1)),stroke:"#f59e0b",fill:"rgba(245, 158, 11, 0.46)",label:t56.count===1?t56.labels[0]:`trace-violations:${e10}:count-${t56.count}`}))})(i3)},Ak=({routeIndexes:t54,layers:e7,routePointIndexes:n3})=>`${t54[0]}:${e7[0]}:${n3[0].join(",")}:${t54[1]}:${e7[1]}:${n3[1].join(",")}`,Ok=(t54,e7,n3,o6,i3,s6,r6)=>{let a3=((t55,e8,n4,o7,i6,s7)=>t55<n4?`${t55}:${e8}:${i6.join(",")}:${n4}:${o7}:${s7.join(",")}`:`${n4}:${o7}:${s7.join(",")}:${t55}:${e8}:${i6.join(",")}`)(e7,n3,o6,i3,s6,r6),c6=t54.get(a3);if(c6){let[t55,n4]=e7<o6?[s6,r6]:[r6,s6];for(let e8 of t55)c6.routePointIndexes[0].includes(e8)||c6.routePointIndexes[0].push(e8);for(let t56 of n4)c6.routePointIndexes[1].includes(t56)||c6.routePointIndexes[1].push(t56);return c6.routePointIndexes[0].sort((t56,e8)=>t56-e8),void c6.routePointIndexes[1].sort((t56,e8)=>t56-e8)}e7<o6?t54.set(a3,{routeIndexes:[e7,o6],layers:[n3,i3],routePointIndexes:[[...new Set(s6)].sort((t55,e8)=>t55-e8),[...new Set(r6)].sort((t55,e8)=>t55-e8)]}):t54.set(a3,{routeIndexes:[o6,e7],layers:[i3,n3],routePointIndexes:[[...new Set(r6)].sort((t55,e8)=>t55-e8),[...new Set(s6)].sort((t55,e8)=>t55-e8)]})},Lk=t54=>{let e7=[];for(let n3=t54.pointIndex;n3<=t54.endPointIndex;n3+=1)e7.push(n3);return e7},Dk=(t54,e7)=>!e7||t54.some(t55=>e7.has(t55)),zk=(t54,e7)=>{let n3=t54.route??[],o6=[];for(let t55=0;t55<n3.length;t55+=1){let i3=n3[t55];i3&&Math.abs(i3.x-e7.center.x)<=uk&&Math.abs(i3.y-e7.center.y)<=uk&&o6.push(t55)}return o6},kk=(t54,e7,n3)=>t54.minX-n3<=e7.maxX&&t54.maxX+n3>=e7.minX&&t54.minY-n3<=e7.maxY&&t54.maxY+n3>=e7.minY,Fk=(t54,e7,n3)=>{let o6=n3+t54.halfThickness+e7.halfThickness-uk;return t54.minX-n3<=e7.maxX&&t54.maxX+n3>=e7.minX&&t54.minY-n3<=e7.maxY&&t54.maxY+n3>=e7.minY&&o6>0},jk=(t54,e7,n3,o6)=>{let i3=o6+n3.halfThickness+e7-uk,s6=t54.x-i3,r6=t54.x+i3,a3=t54.y-i3,c6=t54.y+i3;return s6<=n3.maxX&&r6>=n3.minX&&a3<=n3.maxY&&c6>=n3.minY},Yk=(t54,e7,n3)=>{let o6=n3+t54.radius+e7.radius-uk;return Math.abs(t54.center.x-e7.center.x)<=o6&&Math.abs(t54.center.y-e7.center.y)<=o6},Xk=(t54,e7,n3,o6,i3)=>{let s6=t54.map((t55,e8)=>xk(t55,e8,o6)),r6=new Map;if(e7.size===0)return[];let a3=Array.from(e7),c6=new Map,l7=t55=>{let e8=c6.get(t55);if(e8)return e8;let o7=s6[t55];if(!o7)return[];let i6=[];for(let e10=0;e10<s6.length;e10+=1){if(e10===t55)continue;let r7=s6[e10];r7&&kk(o7.bounds,r7.bounds,n3)&&i6.push(e10)}return c6.set(t55,i6),i6};for(let t55 of a3){let o7=s6[t55];if(!o7)continue;let a4=l7(t55),c7=i3?.get(t55);for(let l10 of o7.segments){let o8=Lk(l10);if(Dk(o8,c7))for(let c8 of a4){if(t55>c8&&e7.has(c8))continue;let a6=s6[c8];if(!a6)continue;let h3=i3?.get(c8),d4=a6.segmentsByLayer[l10.layer];for(let t56 of d4){let e8=Lk(t56);if(!Dk(e8,h3)||Mk(l10,t56)||!Fk(l10,t56,n3))continue;let i6=n3+(l10.thickness+t56.thickness)/2-uk;Ik(l10.start,l10.end,t56.start,t56.end)<i6&&Ok(r6,l10.routeIndex,l10.layer,t56.routeIndex,t56.layer,o8,e8)}}}}for(let o7 of a3){let a4=s6[o7];if(!a4)continue;let c7=l7(o7),h3=i3?.get(o7);for(let l10 of a4.vias){let a6=zk(t54[l10.routeIndex],l10);if(Dk(a6,h3))for(let t55 of c7){if(o7>t55&&e7.has(t55))continue;let c8=s6[t55];if(!c8)continue;let h4=i3?.get(t55);for(let t56 of c8.segments){let e8=Lk(t56);if(!Dk(e8,h4)||!jk(l10.center,l10.radius,t56,n3))continue;let o8=n3+t56.thickness/2+l10.radius-uk;yk(l10.center,t56.start,t56.end)<o8&&Ok(r6,t56.routeIndex,t56.layer,l10.routeIndex,"via",e8,a6)}}}}for(let e8 of a3){let o7=s6[e8];if(!o7)continue;let a4=l7(e8),c7=i3?.get(e8);for(let e10 of o7.segments){let o8=Lk(e10);if(Dk(o8,c7))for(let c8 of a4){let a6=s6[c8];if(!a6)continue;let l10=i3?.get(c8);for(let i6 of a6.vias){let s7=zk(t54[i6.routeIndex],i6);if(!Dk(s7,l10)||!jk(i6.center,i6.radius,e10,n3))continue;let a7=n3+e10.thickness/2+i6.radius-uk;yk(i6.center,e10.start,e10.end)<a7&&Ok(r6,e10.routeIndex,e10.layer,i6.routeIndex,"via",o8,s7)}}}}for(let o7 of a3){let a4=s6[o7];if(!a4)continue;let c7=l7(o7),h3=i3?.get(o7);for(let l10 of a4.vias){let a6=zk(t54[l10.routeIndex],l10);if(Dk(a6,h3))for(let h4 of c7){if(o7>h4&&e7.has(h4))continue;let c8=s6[h4];if(!c8)continue;let d4=i3?.get(h4);for(let e8 of c8.vias){let o8=zk(t54[e8.routeIndex],e8);if(!Dk(o8,d4)||!Yk(l10,e8,n3))continue;let i6=n3+l10.radius+e8.radius-uk;Math.hypot(l10.center.x-e8.center.x,l10.center.y-e8.center.y)<i6&&Ok(r6,l10.routeIndex,"via",e8.routeIndex,"via",a6,o8)}}}}return Array.from(r6.values())},$k=(t54,e7)=>t54.x>=e7.minX-uk&&t54.x<=e7.maxX+uk&&t54.y>=e7.minY-uk&&t54.y<=e7.maxY+uk,Bk=(t54,e7,n3)=>{switch(e7){case"left":return{minX:t54.minX,maxX:t54.minX+n3,minY:t54.minY,maxY:t54.maxY};case"right":return{minX:t54.maxX-n3,maxX:t54.maxX,minY:t54.minY,maxY:t54.maxY};case"top":return{minX:t54.minX,maxX:t54.maxX,minY:t54.maxY-n3,maxY:t54.maxY};case"bottom":return{minX:t54.minX,maxX:t54.maxX,minY:t54.minY,maxY:t54.minY+n3}}},Hk=(t54,e7,n3)=>{let o6=e7.x-t54.x,i3=e7.y-t54.y,s6=0,r6=1,a3=(t55,e8)=>{if(Math.abs(t55)<=uk)return e8>=-1e-6;let n4=e8/t55;return t55<0?!(n4>r6)&&(n4>s6&&(s6=n4),!0):!(n4<s6)&&(n4<r6&&(r6=n4),!0)};if(!(a3(-o6,t54.x-n3.minX)&&a3(o6,n3.maxX-t54.x)&&a3(-i3,t54.y-n3.minY)&&a3(i3,n3.maxY-t54.y)))return 0;let c6=Math.hypot(o6,i3);return Math.max(0,r6-s6)*c6},Wk=(t54,e7)=>mk.filter(n3=>{switch(n3){case"left":return Math.abs(t54.x-e7.minX)<=uk;case"right":return Math.abs(t54.x-e7.maxX)<=uk;case"top":return Math.abs(t54.y-e7.maxY)<=uk;case"bottom":return Math.abs(t54.y-e7.minY)<=uk}return!1}),Vk=(t54,e7)=>{let n3=[];return t54.x<e7.minX-uk&&n3.push("left"),t54.x>e7.maxX+uk&&n3.push("right"),t54.y>e7.maxY+uk&&n3.push("top"),t54.y<e7.minY-uk&&n3.push("bottom"),n3},Uk=(t54,e7,n3)=>{let o6=e7.x-t54.x,i3=e7.y-t54.y;switch(n3){case"left":case"right":return Math.abs(o6)<=uk&&Math.abs(i3)>uk;case"top":case"bottom":return Math.abs(i3)<=uk&&Math.abs(o6)>uk}},Gk=(t54,e7,n3)=>{let o6=[],i3=Math.max(n3,uk),s6=Math.min(.1,i3/4);for(let n4=0;n4<t54.length;n4+=1){let r6=t54[n4],a3=r6?.route??[];for(let t55=0;t55<a3.length-1;t55+=1){let c6=a3[t55],l7=a3[t55+1];if(!c6||!l7)continue;let h3=Vk(c6,e7),d4=Vk(l7,e7),u6=Wk(c6,e7),p5=Wk(l7,e7),m4=mk.filter(t56=>!(Hk(c6,l7,Bk(e7,t56,i3))<=s6)&&!!Uk(c6,l7,t56)),g4=!$k(c6,e7)||!$k(l7,e7),f4=Array.from(new Set([...m4,...h3,...d4]));(g4||f4.length!==0)&&o6.push({routeIndex:n4,connectionName:r6.connectionName??r6.rootConnectionName??`route-${n4}`,segmentIndex:t55,touchedSides:f4,startSides:u6,endSides:p5,start:c6,end:l7})}}return o6},Zk=t54=>t54?.center&&t54.width&&t54.height?{minX:t54.center.x-t54.width/2,maxX:t54.center.x+t54.width/2,minY:t54.center.y-t54.height/2,maxY:t54.center.y+t54.height/2,width:t54.width,height:t54.height,center:t54.center}:null,qk=t54=>t54==="bottom"?hk:"#FF0000",Jk=t54=>{let e7=t54.route??[],n3=[];if(e7.length<2)return n3;let o6=_k(e7[0]),i3=[e7[0]];for(let s6=1;s6<e7.length;s6+=1){let r6=e7[s6],a3=_k(r6);a3===o6?i3.push(r6):(i3.length>=2&&n3.push({points:i3,strokeColor:qk(o6),strokeWidth:t54.traceThickness??dk,label:t54.connectionName??"route"}),o6=a3,i3=[e7[s6-1],r6])}return i3.length>=2&&n3.push({points:i3,strokeColor:qk(o6),strokeWidth:t54.traceThickness??dk,label:t54.connectionName??"route"}),n3},Kk=(t54,e7)=>({title:`HighDensityRepair02 Initial State (margin=${e7})`,routes:t54}),Qk=t54=>{let e7=[];for(let n3 of t54){let t55=e7[e7.length-1];t55&&t55.z===n3.z&&Pk(t55,n3)||e7.push(n3)}return e7},tF=(t54,e7,n3)=>{let o6=Math.max(0,t54.minX-e7.maxX,e7.minX-t54.maxX),i3=Math.max(0,t54.minY-e7.maxY,e7.minY-t54.maxY);return Math.hypot(o6,i3)<=n3+uk},eF2=(t54,e7)=>{let n3=Number.POSITIVE_INFINITY;for(let o6 of t54.segments)for(let t55 of e7.segments){if(o6.layer!==t55.layer)continue;let e8=Ik(o6.start,o6.end,t55.start,t55.end)-(o6.thickness+t55.thickness)/2;n3=Math.min(n3,e8)}return n3},nF=({currentRoutes:t54,candidateRoutes:e7,candidateRouteIndexes:n3,maximumAllowedClearance:o6})=>{let i3=new WeakMap,s6=new WeakMap,r6=[],a3=Array.from(n3).sort((t55,e8)=>t55-e8),c6=t54.map((t55,e8)=>xk(t55,e8,i3)),l7=e7.map((t55,e8)=>xk(t55,e8,s6)),h3=new Set;for(let t55 of a3)for(let n4=0;n4<e7.length;n4+=1){if(n4===t55)continue;let e8=Math.min(t55,n4),i6=Math.max(t55,n4),s7=`${e8}:${i6}`;if(h3.has(s7))continue;h3.add(s7);let a4=l7[e8],d4=l7[i6];if(!a4||!d4||!tF(a4.bounds,d4.bounds,o6))continue;let u6=eF2(a4,d4);if(!Number.isFinite(u6)||u6>o6+uk||!c6[e8]||!c6[i6])continue;let p5=eF2(c6[e8],c6[i6]);!Number.isFinite(p5)||u6>=p5-uk||r6.push({routeIndexes:[e8,i6],previousClearance:p5,nextClearance:u6})}return r6},oF=.001,iF=(t54,e7)=>t54.map(t55=>{let n3=t55.route??[];return n3.length===0?t55:{...t55,route:n3.map((t56,o6)=>o6===0||o6===n3.length-1?((t57,e8)=>{let n4={...t57};return Math.abs(n4.x-e8.minX)<=oF?n4.x=e8.minX:Math.abs(n4.x-e8.maxX)<=oF&&(n4.x=e8.maxX),Math.abs(n4.y-e8.minY)<=oF?n4.y=e8.minY:Math.abs(n4.y-e8.maxY)<=oF&&(n4.y=e8.maxY),n4})(t56,e7):t56)}}),sF=(t54,e7)=>Array.from(e7).flatMap(e8=>Jk(t54[e8]).map(t55=>({...t55,strokeColor:"#000000",strokeWidth:t55.strokeWidth,label:`candidate:${t55.label}`}))),rF=(t54,e7,n3,o6,i3)=>{let s6="rgba(0, 0, 0, 0)";switch(e7){case"left":return{center:{x:t54.minX+n3/2,y:t54.center.y},width:n3,height:t54.height,stroke:s6,fill:o6,label:i3};case"right":return{center:{x:t54.maxX-n3/2,y:t54.center.y},width:n3,height:t54.height,stroke:s6,fill:o6,label:i3};case"top":return{center:{x:t54.center.x,y:t54.maxY-n3/2},width:t54.width,height:n3,stroke:s6,fill:o6,label:i3};case"bottom":return{center:{x:t54.center.x,y:t54.minY+n3/2},width:t54.width,height:n3,stroke:s6,fill:o6,label:i3}}},aF=({routes:t54,candidateRoutes:e7,candidateRouteIndexes:n3,originalRoutes:o6,boundary:i3,side:s6,margin:r6,rejected:a3,rejectionReason:c6})=>{let l7=Array.from(n3).map(t55=>e7[t55].connectionName??`route-${t55}`);return{title:a3?`${s6} move rejected (${c6})`:`${s6} move accepted`,routes:a3?t54:e7,originalRoutes:o6,activeSide:s6,candidateRouteNames:l7,overlayLines:a3?sF(e7,n3):[],overlayRects:[rF(i3,s6,r6,a3?"rgba(220, 38, 38, 0.14)":"rgba(16, 185, 129, 0.14)",a3?`rejected:${s6}`:`accepted:${s6}`)]}},cF=(t54,e7,n3,o6)=>{let i3=(t54?.adjacentObstacles??[]).some(t55=>((t56,e8,n4,o7)=>{let i6=(t57=>t57.center&&t57.width&&t57.height?{minX:t57.center.x-t57.width/2,maxX:t57.center.x+t57.width/2,minY:t57.center.y-t57.height/2,maxY:t57.center.y+t57.height/2}:null)(t56);if(!i6)return!1;switch(n4){case"left":return i6.maxX>=e8.minX-uk&&i6.minX<=e8.minX+o7+uk;case"right":return i6.minX<=e8.maxX+uk&&i6.maxX>=e8.maxX-o7-uk;case"top":return i6.minY<=e8.maxY+uk&&i6.maxY>=e8.maxY-o7-uk;case"bottom":return i6.maxY>=e8.minY-uk&&i6.minY<=e8.minY+o7+uk}})(t55,e7,n3,o6));return{hasObstacle:i3,moveAmount:i3?o6:o6/2}},lF=({start:t54,end:e7,side:n3,boundary:o6,amount:i3,targetAxisValue:s6})=>{let r6=(({side:t55,boundary:e8,amount:n4,targetAxisValue:o7})=>{let i6=o7??(()=>{switch(t55){case"left":return e8.minX+n4;case"right":return e8.maxX-n4;case"top":return e8.maxY-n4;case"bottom":return e8.minY+n4}})();switch(t55){case"left":case"right":return Math.min(Math.max(i6,e8.minX),e8.maxX);case"top":case"bottom":return Math.min(Math.max(i6,e8.minY),e8.maxY)}})({side:n3,boundary:o6,amount:i3,targetAxisValue:s6});switch(n3){case"left":case"right":return Qk([t54,{x:r6,y:t54.y,z:t54.z},{x:r6,y:e7.y,z:e7.z},e7]);case"top":case"bottom":return Qk([t54,{x:t54.x,y:r6,z:t54.z},{x:e7.x,y:r6,z:e7.z},e7])}},hF=(t54,e7,n3,o6,i3,s6,r6,a3=!1)=>{let c6=t54.route??[];if(c6.length<2||e7.length===0)return ck(t54);let l7=a3?i3:Math.max(i3,s6),h3=((t55,e8)=>{switch(t55){case"left":return{x:e8,y:0};case"right":return{x:-e8,y:0};case"top":return{x:0,y:-e8};case"bottom":return{x:0,y:e8}}})(o6,l7);if(a3||(t54.vias?.length??0)>0||c6.length>2){let n4=ck(t54),o7=n4.route??[];for(let t55 of e7){let e8=o7[t55];e8&&(o7[t55]={...e8,x:e8.x+h3.x,y:e8.y+h3.y})}for(let o8 of n4.vias??[])e7.some(e8=>{let n5=t54.route?.[e8];return!!n5&&Pk(n5,o8)})&&(o8.x+=h3.x,o8.y+=h3.y);return n4}let d4=ck(t54);if(c6.length===2&&e7.length===2&&e7[0]===0&&e7[1]===1){let e8=c6[0],i6=c6[1];return ck({...t54,route:lF({start:e8,end:i6,side:o6,boundary:n3,amount:l7,targetAxisValue:r6})})}return d4},dF=(t54,e7,n3)=>{switch(n3){case"left":return t54.x-e7.minX;case"right":return e7.maxX-t54.x;case"top":return e7.maxY-t54.y;case"bottom":return t54.y-e7.minY}},uF=(t54,e7,n3)=>{let o6=(t55=>{let e8=t55.route??[];if(e8.length===0)return[];let n4=[];for(let t56=0;t56<e8.length;t56+=1){let o7=e8[t56];if(!o7)continue;t56===0||t56===e8.length-1||n4.push(o7);let i3=e8[t56+1];i3&&n4.push({x:(o7.x+i3.x)/2,y:(o7.y+i3.y)/2})}return n4})(t54);return o6.length===0?Number.POSITIVE_INFINITY:o6.reduce((t55,o7)=>Math.min(t55,dF(o7,e7,n3)),Number.POSITIVE_INFINITY)},pF=(t54,e7,n3=[])=>{let o6=t54.route??[],i3=[],s6=new Set,r6=e7.length===0||e7.includes("via");if(o6.length===2)return[0,1];let a3=t55=>{if(t55<=0||t55>=o6.length-1||s6.has(t55))return;let n4=o6[t55];n4&&(r6||e7.includes(_k(n4)))&&(s6.add(t55),i3.push(t55))};if(n3.length>0)for(let t55 of n3)a3(t55);else for(let t55=1;t55<o6.length-1;t55+=1)a3(t55);for(let t55=0;t55<i3.length;t55+=1){let e8=i3[t55],n4=o6[e8];if(n4)for(let t56=1;t56<o6.length-1;t56+=1){if(s6.has(t56))continue;let e10=o6[t56];e10&&e10.z!==n4.z&&Pk(e10,n4)&&(s6.add(t56),i3.push(t56))}}return i3.sort((t55,e8)=>t55-e8),i3},mF=(t54,e7)=>Math.max(0,...(t54.route??[]).map(t55=>Math.max(e7.minX-t55.x,t55.x-e7.maxX,e7.minY-t55.y,t55.y-e7.maxY,0))),gF=(t54,e7,n3,o6)=>dF(t54,e7,n3)<=o6+uk,fF=(t54,e7,n3,o6)=>{let i3=t54.route??[],s6=[],r6=new Set,a3=1,c6=i3.length-2;for(;a3<i3.length-1&&Pk(i3[a3],i3[0]);)a3+=1;for(;c6>0&&Pk(i3[c6],i3[i3.length-1]);)c6-=1;for(let t55=a3;t55<=c6;t55+=1)gF(i3[t55],e7,n3,o6)&&(r6.add(t55),s6.push(t55));for(let t55=0;t55<s6.length;t55+=1){let e8=i3[s6[t55]];if(e8)for(let t56=a3;t56<=c6;t56+=1){if(r6.has(t56))continue;let n4=i3[t56];n4&&n4.z!==e8.z&&Pk(n4,e8)&&(r6.add(t56),s6.push(t56))}}return s6.length===0&&i3.length===2&&i3.some(t55=>gF(t55,e7,n3,o6))?[0,1]:(s6.sort((t55,e8)=>t55-e8),s6)},yF=(t54,e7,n3)=>{let o6=t54.route??[],i3=n3===0?o6[0]:o6[o6.length-1];return i3?mk.filter(t55=>dF(i3,e7,t55)<=uk):[]},_F=(t54,e7,n3)=>{let o6=t54.route??[],i3=e7.route??[];if(o6.length===0||i3.length===0)return!0;for(let e8 of[0,-1]){let o7=yF(t54,n3,e8);if(o7.length===0)continue;let s6=e8===0?i3[0]:i3[i3.length-1];if(!s6)return!1;for(let t55 of o7)if(dF(s6,n3,t55)>uk)return!1}return!0},bF=(t54,e7)=>Math.hypot(e7.x-t54.x,e7.y-t54.y),xF=(t54,e7,n3,o6)=>{let i3=t54.route??[];if(i3.length===0)return"none";let s6=!1;for(let t55=0;t55<i3.length;t55+=1){let r6=i3[t55];if(r6&&gF(r6,e7,n3,o6)){if(t55!==0&&t55!==i3.length-1)return"interior";s6=!0}}for(let t55=0;t55<i3.length-1;t55+=1){let s7=i3[t55],r6=i3[t55+1];if(s7&&r6&&gF(s7,e7,n3,o6)&&gF(r6,e7,n3,o6)&&!(bF(s7,r6)<=uk))return"interior"}return s6?"endpoint":"none"},vF=({currentRoutes:t54,routeIndex:e7,side:n3,moveSide:o6=n3,boundary:i3,margin:s6,moveAmount:r6,geometryCache:a3})=>{let c6=t54[e7],l7=(c6.route?.length??0)===2,h3=fF(c6,i3,n3,s6);if(h3.length===0)return null;let d4=new Set,u6=new Map,p5=new Set,m4=t54.slice(),g4=!1,f4="overlap",y3=new Set([e7]),_3=new Map([[e7,new Set]]),b4=new Map([[e7,new Set]]),x4=[e7],v3=0,S7=null,I4=null,P6=null,M5=null,C6=t55=>new Set(t55.map(t56=>Ak(t56))),N3=()=>S7||(S7=Xk(t54,d4,s6,a3,u6),S7),T6=()=>P6||(P6=Xk(t54,d4,0,a3,u6),P6),w4=()=>M5||(M5=Xk(m4,d4,0,a3,u6),M5);for(;v3<x4.length&&!g4;){let c7=x4[v3];if(v3+=1,y3.delete(c7),d4.has(c7))continue;let l10=m4[c7],h4=Array.from(_3.get(c7)??[]),T7=Array.from(b4.get(c7)??[]);_3.delete(c7),b4.delete(c7);let w6=c7===e7?fF(l10,i3,n3,s6):pF(l10,h4,T7);if(w6.length===0){if(c7===e7)return null;g4=!0,f4="eventual-overlap";break}let R6=l10.route??[],E4=c7===e7?void 0:o6==="left"||o6==="right"?(R6[w6[0]]?.x??0)+(o6==="left"?r6:-r6):(R6[w6[0]]?.y??0)+(o6==="top"?-r6:r6);m4[c7]=hF(l10,w6,i3,o6,r6,s6,E4,c7!==e7),d4.add(c7),u6.set(c7,new Set(w6)),S7=null,I4=null,P6=null,M5=null,(l10.route?.length??0)===2&&p5.add(c7);let A7=mF(t54[c7],i3);if(mF(m4[c7],i3)>A7+1e-6){g4=!0,f4="boundary";break}if(!_F(t54[c7],m4[c7],i3)){g4=!0,f4="endpoint-boundary";break}let O3=Xk(m4,new Set([c7]),s6,a3,new Map([[c7,new Set(w6)]]));for(let t55 of O3){if(C6(N3()).has(Ak(t55)))continue;let[e8,n4]=t55.routeIndexes,o7=d4.has(e8),i6=d4.has(n4);if(o7&&i6)continue;let s7=o7?n4:e8,r7=o7?t55.layers[1]:t55.layers[0],a4=o7?t55.routePointIndexes[1]:t55.routePointIndexes[0];if(d4.has(s7)||y3.has(s7)){if(y3.has(s7)){let t56=_3.get(s7)??new Set;t56.add(r7),_3.set(s7,t56);let e10=b4.get(s7)??new Set;for(let t57 of a4)e10.add(t57);b4.set(s7,e10)}}else y3.add(s7),x4.push(s7),_3.set(s7,new Set([r7])),b4.set(s7,new Set(a4))}}if(!g4&&d4.size>1){let t55=C6(N3()),e8=C6(I4||(I4=Xk(m4,d4,s6,a3,u6),I4));for(let n4 of e8)if(!t55.has(n4)){g4=!0,f4="eventual-overlap";break}}if(!g4&&d4.size>1){let t55=C6(T6()),e8=C6(w4());for(let n4 of e8)if(!t55.has(n4)){g4=!0,f4="eventual-overlap";break}}if(!g4){let e8=new Set(Xk(t54,d4,0,a3).map(t55=>Ak(t55))),n4=Xk(m4,d4,0,a3);for(let t55 of n4){let n5=Ak(t55);if(!e8.has(n5)){g4=!0,f4="eventual-overlap";break}}}return g4||(({currentRoutes:t55,candidateRoutes:e10,candidateRouteIndexes:n4,boundary:o7,activeSide:i6})=>{let s7=mk.filter(t56=>t56!==i6),r7=[];for(let i8 of n4){let n5=t55[i8],a4=e10[i8];if(n5&&a4)for(let t56 of s7){let e11=uF(n5,o7,t56),s8=uF(a4,o7,t56);e11>uk&&s8<=uk&&r7.push({routeIndex:i8,side:t56,previousClearance:e11,nextClearance:s8})}}return r7})({currentRoutes:t54,candidateRoutes:m4,candidateRouteIndexes:d4,boundary:i3,activeSide:n3}).length>0&&(g4=!0,f4="boundary-touch"),g4||(({currentRoutes:t55,candidateRoutes:e10,candidateRouteIndexes:n4,geometryCache:o7,currentConflicts:i6,candidateConflicts:s7})=>{let r7=i6??Xk(t55,n4,0,o7),a4=s7??Xk(e10,n4,0,o7),c7=new Set(r7.map(t56=>Ak(t56)));return a4.filter(t56=>{let o8=Ak(t56);if(c7.has(o8))return!1;let[i8,s8]=t56.routeIndexes,[r8,a6]=t56.layers,l10=n4.has(i8),h4=n4.has(s8);if(l10&&h4)return!1;let d6=l10?a6:r8,u10=e10[l10?s8:i8];return!!u10&&pF(u10,[d6]).length===0})})({currentRoutes:t54,candidateRoutes:m4,candidateRouteIndexes:d4,geometryCache:a3,currentConflicts:T6(),candidateConflicts:w4()}).length>0&&(g4=!0,f4="fixed-trace-touch"),g4||nF({currentRoutes:t54,candidateRoutes:m4,candidateRouteIndexes:d4,maximumAllowedClearance:Math.min(s6/2,pk)}).length>0&&(g4=!0,f4="trace-clearance"),!g4&&((t55,e8,n4,o7,i6,s7)=>Array.from(n4).some(n5=>{let r7=t55[n5],a4=e8[n5];return mk.filter(t56=>t56!==i6).some(t56=>{let e10=xF(r7,o7,t56,s7),n6=xF(a4,o7,t56,s7);return e10==="none"&&n6!=="none"})}))(t54,m4,d4,i3,n3,s6)&&(g4=!0,f4="side-regression"),{isTwoPointRoute:l7,movableIndexes:h3,candidateRouteIndexes:d4,movedTwoPointRouteIndexes:p5,candidateRoutes:m4,rejected:g4,rejectionReason:f4}},SF=(t54,e7,n3,o6,i3)=>{let s6=t54.route??[];if(e7.length===0)return null;if(o6==="top"||o6==="bottom"){let t55=e7.reduce((t56,e8)=>t56+(s6[e8]?.x??n3.center.x),0)/e7.length;return t55<n3.center.x-i3/2?"right":t55>n3.center.x+i3/2?"left":null}let r6=e7.reduce((t55,e8)=>t55+(s6[e8]?.y??n3.center.y),0)/e7.length;return r6>n3.center.y+i3/2?"bottom":r6<n3.center.y-i3/2?"top":null},IF=({side:t54,sample:e7,boundary:n3,margin:o6,repairedRoutes:i3,frames:s6,captureProgressFrames:r6,lockedTwoPointRoutes:a3,geometryCache:c6,allowTwoPointWithoutObstacle:l7=!1})=>{let{hasObstacle:h3,moveAmount:d4}=cF(e7,n3,t54,o6);r6&&s6.push(((t55,e8,n4,o7,i6,s7)=>({title:`${n4} boundary analysis: move=${i6.toFixed(3)} (${s7?"obstacle-side":"clear-side"})`,routes:t55,activeSide:n4,overlayRects:[rF(e8,n4,o7,"rgba(245, 158, 11, 0.16)",`strip:${n4}`)]}))(lk(i3),n3,t54,o6,d4,h3));let u6=new Set,p5=0;for(let e8=0;e8<i3.length;e8+=1){if(u6.has(e8)||a3.has(e8))continue;let m4=i3[e8];if((m4.route?.length??0)===2&&!h3&&!l7)continue;let g4=vF({currentRoutes:i3,routeIndex:e8,side:t54,boundary:n3,margin:o6,moveAmount:d4,geometryCache:c6});if(g4){if(g4.rejected){let s7=SF(m4,g4.movableIndexes,n3,t54,o6);if(s7){let r7=vF({currentRoutes:i3,routeIndex:e8,side:t54,moveSide:s7,boundary:n3,margin:o6,moveAmount:d4,geometryCache:c6});r7&&!r7.rejected&&(g4=r7)}}if(r6&&s6.push(aF({routes:lk(i3),candidateRoutes:g4.candidateRoutes,candidateRouteIndexes:g4.candidateRouteIndexes,originalRoutes:g4.rejected?void 0:Array.from(g4.candidateRouteIndexes).map(t55=>ck(i3[t55])),boundary:n3,side:t54,margin:o6,rejected:g4.rejected,rejectionReason:g4.rejectionReason})),!g4.rejected){i3.splice(0,i3.length,...g4.candidateRoutes);for(let t55 of g4.movedTwoPointRouteIndexes)a3.add(t55);p5+=1}u6.add(e8)}}return{movesAccepted:p5}},PF=(t54,e7,n3,o6)=>gF(t54,e7,n3,o6),MF=(t54,e7,n3,o6)=>{switch(n3){case"left":return{...t54,x:Math.min(e7.minX+o6,e7.maxX)};case"right":return{...t54,x:Math.max(e7.maxX-o6,e7.minX)};case"top":return{...t54,y:Math.max(e7.maxY-o6,e7.minY)};case"bottom":return{...t54,y:Math.min(e7.minY+o6,e7.maxY)}}},CF=t54=>`${t54.routeIndexes[0]}:${t54.layers[0]}:${t54.routeIndexes[1]}:${t54.layers[1]}`,NF2=t54=>{if(!t54)return[];let e7=[t54.connectionName,t54.rootConnectionName].filter(t55=>!!t55);return Array.from(new Set(e7))},TF=(t54,e7)=>{let n3=NF2(t54),o6=NF2(e7);return n3.length!==0&&o6.length!==0&&n3.some(t55=>o6.includes(t55))},wF=(t54,e7,n3)=>t54?Gk([t54],e7,n3).length:0,RF2=(t54,e7,n3,o6)=>{let i3=new Set(Xk(t54,new Set([n3]),o6).map(Ak));return Xk(e7,new Set([n3]),o6).some(t55=>!i3.has(Ak(t55)))},EF=(t54,e7,n3)=>Gk(t54,e7,n3).length,AF=t54=>{if(!t54)return[];let e7=[t54.connectionName,t54.rootConnectionName].filter(t55=>!!t55);return Array.from(new Set(e7))},OF2=(t54,e7)=>Xk(t54,new Set(t54.map((t55,e8)=>e8)),pk,e7).filter(e8=>!(e8.layers[0]==="via"&&e8.layers[1]==="via"||((t55,e10)=>{let n3=AF(t55),o6=AF(e10);return n3.length!==0&&o6.length!==0&&n3.some(t56=>o6.includes(t56))})(t54[e8.routeIndexes[0]],t54[e8.routeIndexes[1]]))).length,LF=t54=>{let e7=mk;return[...e7.slice(t54%e7.length),...e7.slice(0,t54%e7.length)]},DF=(t54,e7,n3=!1)=>{let o6=Zk(t54?.nodeWithPortPoints),i3=o6?((t55,e8)=>t55.map(t56=>{let n4=t56.route??[],o7=!1,i6=n4.map(t57=>{let n5=t57.x,i8=t57.y;return n5<e8.minX?n5=e8.minX:n5>e8.maxX&&(n5=e8.maxX),i8<e8.minY?i8=e8.minY:i8>e8.maxY&&(i8=e8.maxY),n5===t57.x&&i8===t57.y?t57:(o7=!0,{...t57,x:n5,y:i8})});return o7?{...t56,route:i6}:t56}))(iF(lk(t54?.nodeHdRoutes??[]),o6),o6):lk(t54?.nodeHdRoutes??[]),s6=Math.max(e7??.4,.05),r6=lk(i3);if(!o6)return{boundary:null,baseRoutes:i3,repairedRoutes:r6,margin:s6,frames:[{title:"HighDensityRepair02 Missing Boundary",routes:r6}]};let a3=n3?[Kk(lk(r6),s6)]:[],c6=new WeakMap,l7=EF(r6,o6,s6);for(let e8=0;e8<1;e8+=1){let i6=new Set,h4=0;for(let l10 of LF(e8)){let{movesAccepted:d8}=IF({side:l10,sample:t54,boundary:o6,frames:a3,margin:s6,repairedRoutes:r6,captureProgressFrames:n3,lockedTwoPointRoutes:i6,geometryCache:c6,allowTwoPointWithoutObstacle:e8>=1});h4+=d8}let d6=EF(r6,o6,s6);if(h4===0||d6===0||d6>=l7)break;l7=d6}let h3=lk(r6),d4=OF2(r6,c6);return(({routes:t55,boundary:e8,margin:n4,geometryCache:o7})=>{let i6=Gk(t55,e8,n4);if(i6.length===0)return{movesAccepted:0};let s7=new Map;for(let t56 of i6){let e10=s7.get(t56.routeIndex)??new Set;for(let n5 of t56.touchedSides)e10.add(n5);s7.set(t56.routeIndex,e10)}let r7=[8e-6,.01,n4/4,n4/2,n4+8e-6],a4=0,c7=(i8,s8,r8)=>{let a6=s8.route??[];if(a6.length<2)return!1;let c8={...s8,route:Qk(a6)};if((c8.route?.length??0)<2)return!1;let l11=t55.slice();if(l11[i8]=c8,wF(l11[i8],e8,n4)>=r8)return!1;let h6=e10=>TF(t55[e10.routeIndexes[0]],t55[e10.routeIndexes[1]]),d8=new Set(Xk(t55,new Set([i8]),0,o7).filter(t56=>!h6(t56)).map(CF));return!Xk(l11,new Set([i8]),0,o7).filter(t56=>!h6(t56)).some(t56=>!d8.has(CF(t56)))&&!(nF({currentRoutes:t55,candidateRoutes:l11,candidateRouteIndexes:new Set([i8]),maximumAllowedClearance:Math.min(n4/2,pk)}).filter(e10=>!TF(t55[e10.routeIndexes[0]],t55[e10.routeIndexes[1]])).length>0||(t55[i8]=c8,0))},l10=(n5,o8,i8,s8)=>{if(o8.length===0)return!1;for(let a6 of r7){let r8=t55[n5],l11=ck(r8),h6=l11.route??[],d8=!1;for(let t56 of o8){let n6=h6[t56];n6&&(h6[t56]=MF(n6,e8,i8,a6),d8=!0)}if(!d8)return!1;if(c7(n5,l11,s8))return!0}return!1},h4=(t56,n5)=>{let o8=[];return n5==="top"||n5==="bottom"?(Math.abs(t56.x-e8.minX)<=uk&&o8.push("left"),Math.abs(t56.x-e8.maxX)<=uk&&o8.push("right")):(Math.abs(t56.y-e8.minY)<=uk&&o8.push("bottom"),Math.abs(t56.y-e8.maxY)<=uk&&o8.push("top")),o8},d6=(o8,i8,s8)=>{let a6=t55[o8],l11=a6.route??[];if(l11.length!==2)return!1;let[d8,u6]=l11;if(!PF(d8,e8,i8,n4)||!PF(u6,e8,i8,n4))return!1;let p5=h4(d8,i8),m4=h4(u6,i8);for(let t56 of r7){let n5=MF(d8,e8,i8,t56),r8=MF(u6,e8,i8,t56);for(let o10 of p5)n5=MF(n5,e8,o10,t56);for(let n6 of m4)r8=MF(r8,e8,n6,t56);let l12={...a6,route:[d8,n5,r8,u6]};if(c7(o8,l12,s8))return!0}return!1};for(let[o8,i8]of s7)if(t55[o8])for(let s8 of i8){let i10=!0;for(;i10;){i10=!1;let r8=t55[o8].route??[];if(r8.length===2){let i11=wF(t55[o8],e8,n4);i11>0&&d6(o8,s8,i11)&&(a4+=1);break}if(r8.length<3)break;let c8=wF(t55[o8],e8,n4);if(c8===0)break;let h6=[];for(let t56=1;t56<r8.length-1;t56+=1){let o10=r8[t56];o10&&PF(o10,e8,s8,n4)&&h6.push(t56)}if(h6.length===0)break;if(l10(o8,h6,s8,c8)){a4+=1,i10=!0;continue}let u6=!1,p5=c8,m4=0;for(;m4<h6.length;){let i11=m4;for(;i11+1<h6.length&&h6[i11+1]===h6[i11]+1;)i11+=1;l10(o8,h6.slice(m4,i11+1),s8,p5)&&(a4+=1,u6=!0,p5=wF(t55[o8],e8,n4)),m4=i11+1}if(!u6){let i11=t55[o8].route??[],r10=c8;for(let c10=1;c10<i11.length-1;c10+=1){let h7=i11[c10];h7&&PF(h7,e8,s8,n4)&&l10(o8,[c10],s8,r10)&&(a4+=1,u6=!0,r10=wF(t55[o8],e8,n4))}}u6&&(i10=!0)}}for(let[o8,i8]of s7){let s8=t55[o8];if(!s8)continue;let r8=s8.route??[];if(r8.length<=2)continue;let c8=wF(t55[o8],e8,n4);if(c8!==0)for(let l11 of i8){if(!r8.every(t56=>PF(t56,e8,l11,n4)))continue;let i10=r8[0]?.z;if(!r8.every(t56=>t56.z===i10))continue;let h6={...s8,route:[r8[0],r8[r8.length-1]]},u6=t55[o8];t55[o8]=h6,d6(o8,l11,c8)?a4+=1:t55[o8]=u6;break}}})({routes:h3,boundary:o6,margin:s6,geometryCache:c6}),OF2(h3,c6)<=d4&&r6.splice(0,r6.length,...h3),(({routes:t55,boundary:e8,clearanceMargin:n4})=>{for(let o7=0;o7<t55.length;o7+=1){let i6=t55[o7];if((i6.route??[]).length<=2)continue;let s7=n4,r7=Math.max(e8.width/2-uk,0),a4=Math.max(e8.height/2-uk,0),c7=Math.min(s7,r7),l10=Math.min(s7,a4),h4=ck(i6),d6=h4.route??[],u6=!1;for(let t56=1;t56<d6.length-1;t56+=1){let n5=d6[t56];if(!n5)continue;let o8=Math.min(Math.max(n5.x,e8.minX+c7),e8.maxX-c7),i8=Math.min(Math.max(n5.y,e8.minY+l10),e8.maxY-l10);(Math.abs(o8-n5.x)>uk||Math.abs(i8-n5.y)>uk)&&(n5.x=o8,n5.y=i8,u6=!0)}if(!u6||(h4.route=Qk(d6),(h4.route?.length??0)<2))continue;let p5=lk(t55);p5[o7]=h4;let m4=RF2(t55,p5,o7,0),g4=RF2(t55,p5,o7,n4),f4=nF({currentRoutes:t55,candidateRoutes:p5,candidateRouteIndexes:new Set([o7]),maximumAllowedClearance:n4}).length>0;m4||g4||f4||(t55[o7]=h4)}})({routes:r6,boundary:o6,clearanceMargin:s6}),a3.push(((t55,e8,n4)=>({title:`HighDensityRepair02 Final State (margin=${n4})`,routes:t55,originalRoutes:e8}))(lk(r6),lk(i3),s6)),{boundary:o6,baseRoutes:i3,repairedRoutes:r6,frames:a3,margin:s6}},zF=class extends Tt2{constructor(t54={}){super();__publicField(this,"params");__publicField(this,"frames",[]);__publicField(this,"currentFrameIndex",0);__publicField(this,"showBoundryViolationMarkers");__publicField(this,"repairedRoutes",[]);this.params=t54,this.showBoundryViolationMarkers=t54.showBoundryViolationMarkers??!1}_setup(){this.buildFrames();let t54=this.getCurrentBoundryViolationCount(),e7=this.getCurrentTraceViolationCount();this.stats={boundryViolationCount:t54,traceViolationCount:e7,margin:this.params.margin??.4,frames:this.frames.length,currentFrame:this.currentFrameIndex}}_step(){if(this.frames.length<=1){let t55=this.getCurrentBoundryViolationCount(),e8=this.getCurrentTraceViolationCount();return this.showBoundryViolationMarkers=!0,this.stats={...this.stats,boundryViolationCount:t55,traceViolationCount:e8},void(this.solved=!0)}this.currentFrameIndex<this.frames.length-1&&(this.currentFrameIndex+=1);let t54=this.getCurrentBoundryViolationCount(),e7=this.getCurrentTraceViolationCount();this.stats={boundryViolationCount:t54,traceViolationCount:e7,margin:this.params.margin??.4,frames:this.frames.length,currentFrame:this.currentFrameIndex,title:this.frames[this.currentFrameIndex]?.title},this.currentFrameIndex>=this.frames.length-1&&(this.showBoundryViolationMarkers=!0,this.solved=!0)}getConstructorParams(){return[this.params]}getOutput(){let t54=this.getCurrentTraceViolationCount();return{margin:this.params.margin??.4,repairedRoutes:this.repairedRoutes,frameCount:this.frames.length,traceViolationCount:t54}}setShowBoundryViolationMarkers(t54){this.showBoundryViolationMarkers=t54}buildFrames(){let t54=DF(this.params.sample,this.params.margin,this.params.captureProgressFrames??!1);this.frames=t54.frames,this.repairedRoutes=t54.repairedRoutes}getCurrentFrame(){let t54=this.params.sample;return this.frames[this.currentFrameIndex]??{title:"HighDensityRepair02",routes:lk(t54?.nodeHdRoutes??[])}}getBoundryViolationsForFrame(t54){let e7=Zk(this.params.sample?.nodeWithPortPoints);return e7?Gk(t54.routes,e7,this.params.margin??.4):[]}getCurrentBoundryViolationCount(){return this.getBoundryViolationsForFrame(this.getCurrentFrame()).length}getRouteNetNames(t54){if(!t54)return[];let e7=[t54.connectionName,t54.rootConnectionName].filter(t55=>!!t55);return Array.from(new Set(e7))}areRoutesSameNet(t54,e7){let n3=this.getRouteNetNames(t54),o6=this.getRouteNetNames(e7);return n3.length!==0&&o6.length!==0&&n3.some(t55=>o6.includes(t55))}getCurrentTraceViolationCount(){let t54=this.getCurrentFrame().routes,e7=new Set(t54.map((t55,e8)=>e8));return Xk(t54,e7,pk).filter(e8=>!(e8.layers[0]==="via"&&e8.layers[1]==="via"||this.areRoutesSameNet(t54[e8.routeIndexes[0]],t54[e8.routeIndexes[1]]))).length}visualize(){let t54=this.params.sample,e7=t54?.nodeWithPortPoints,n3=t54?.adjacentObstacles??[],o6=this.getCurrentFrame(),i3=Zk(e7),s6=i3&&e7?.capacityMeshNodeId?[{center:i3.center,width:i3.width,height:i3.height,stroke:"#1d4ed8",fill:"rgba(29, 78, 216, 0.08)",label:e7.capacityMeshNodeId}]:i3?[{center:i3.center,width:i3.width,height:i3.height,stroke:"#1d4ed8",fill:"rgba(29, 78, 216, 0.08)",label:"capacity-node"}]:[],r6=n3.filter(t55=>t55.center&&t55.width&&t55.height).map((t55,e8)=>({center:t55.center,width:t55.width,height:t55.height,stroke:t55.type==="oval"?"#a855f7":"#dc2626",fill:t55.type==="oval"?"rgba(168, 85, 247, 0.12)":"rgba(220, 38, 38, 0.08)",label:t55.type?`obstacle:${t55.type}:${e8}`:`obstacle:${e8}`})),a3=this.showBoundryViolationMarkers&&i3?this.getBoundryViolationsForFrame(o6).map(t55=>{let e8=t55.end.x-t55.start.x,n4=t55.end.y-t55.start.y,o7=Math.max(Math.hypot(e8,n4),.2),i6=Math.abs(e8)>=Math.abs(n4);return{center:{x:(t55.start.x+t55.end.x)/2,y:(t55.start.y+t55.end.y)/2},width:i6?o7:.18,height:i6?.18:o7,stroke:"#b45309",fill:"rgba(250, 204, 21, 0.45)",label:`boundry-violation:${t55.routeIndex}:${t55.segmentIndex}`}}):[],c6=this.showBoundryViolationMarkers?Ek(o6.routes,pk):[],l7=[...(e7?.portPoints??[]).map(t55=>({x:t55.x,y:t55.y,color:"#0f766e",label:t55.connectionName??t55.portPointId??"port-point"})),...o6.routes.flatMap(t55=>t55.route??[]).map(t55=>({x:t55.x,y:t55.y,color:_k(t55)==="bottom"?hk:"#0ea5e9",label:""})),...o6.overlayPoints??[]],h3=[...(o6.originalRoutes??[]).flatMap(t55=>Jk(t55).map(t56=>({...t56,strokeColor:"#111111",strokeWidth:Math.max(.6*t56.strokeWidth,.05),label:`original:${t56.label}`}))),...o6.routes.filter(t55=>(t55.route?.length??0)>=2).flatMap(t55=>Jk(t55)),...o6.overlayLines??[]],d4=o6.routes.flatMap(t55=>(t55.vias??[]).map(e8=>({center:{x:e8.x,y:e8.y},radius:(e8.diameter??t55.viaDiameter??.3)/2,stroke:"#7c3aed",fill:"rgba(124, 58, 237, 0.2)",label:t55.connectionName?`via:${t55.connectionName}`:"via"})));return d4.push(...c6),{coordinateSystem:"cartesian",title:o6.title,rects:[...s6,...r6,...o6.overlayRects??[],...a3],points:l7,lines:h3,circles:d4,arrows:o6.overlayArrows}}},kF=(t54,e7=0)=>({minX:t54.center.x-t54.width/2-e7,maxX:t54.center.x+t54.width/2+e7,minY:t54.center.y-t54.height/2-e7,maxY:t54.center.y+t54.height/2+e7}),FF=(t54,e7,n3=0)=>{let o6=kF(e7,n3);return t54.x>=o6.minX&&t54.x<=o6.maxX&&t54.y>=o6.minY&&t54.y<=o6.maxY},jF=(t54,e7)=>t54.route.length>0&&e7.some(e8=>(t55=>(t55.zLayers?.length??t55.layers?.length??0)>1)(e8)&&((t55,e10)=>t55.connectedTo.includes(e10.connectionName)||e10.rootConnectionName!==void 0&&t55.connectedTo.includes(e10.rootConnectionName))(e8,t54)&&t54.route.every(t55=>((t56,e10)=>{let n3=e10.width/2,o6=e10.height/2;return Math.abs(t56.x-e10.center.x)<=n3&&Math.abs(t56.y-e10.center.y)<=o6})(t55,e8))),YF2=(t54,e7,n3)=>{if(t54.regionId){let n4=e7.findIndex(e8=>e8.capacityMeshNodeId===t54.regionId);if(n4!==-1)return n4}let o6=[...t54.route.map(({x:t55,y:e8})=>({x:t55,y:e8})),...t54.vias.map(({x:t55,y:e8})=>({x:t55,y:e8}))];for(let t55=0;t55<e7.length;t55++){let i3=e7[t55];if(o6.every(t56=>FF(t56,i3,n3)))return t55}return-1},XF=(t54,e7)=>({connectionName:t54.connectionName??e7.connectionName,rootConnectionName:t54.rootConnectionName??e7.rootConnectionName,regionId:t54.capacityMeshNodeId??e7.regionId,traceThickness:t54.traceThickness??e7.traceThickness,viaDiameter:t54.viaDiameter??e7.viaDiameter,route:t54.route?.map(t55=>({x:t55.x,y:t55.y,z:t55.z??0}))??e7.route,vias:t54.vias?.map(t55=>({x:t55.x,y:t55.y}))??e7.vias,jumpers:e7.jumpers}),$F=(t54,e7,n3)=>{let o6=kF(t54,n3);return e7.search(o6).filter(t55=>{return e8=o6,n4=(t56=>({minX:t56.center.x-t56.width/2,maxX:t56.center.x+t56.width/2,minY:t56.center.y-t56.height/2,maxY:t56.center.y+t56.height/2}))(t55),e8.minX<=n4.maxX&&e8.maxX>=n4.minX&&e8.minY<=n4.maxY&&e8.maxY>=n4.minY;var e8,n4}).map(t55=>({type:t55.type,center:t55.center,width:t55.width,height:t55.height}))},BF=class extends Fo2{constructor(t54){super();__publicField(this,"repairMargin");__publicField(this,"sampleEntries");__publicField(this,"originalHdRoutes");__publicField(this,"originalNodeWithPortPoints");__publicField(this,"originalObstacles");__publicField(this,"obstacleSHI");__publicField(this,"colorMap");__publicField(this,"repairedRoutesByIndex",new Map);__publicField(this,"activeSampleIndex",0);__publicField(this,"activeSubSolver",null);__publicField(this,"latestVisualization",{});this.repairMargin=t54.repairMargin??.2,this.originalHdRoutes=t54.hdRoutes,this.originalNodeWithPortPoints=t54.nodeWithPortPoints,this.originalObstacles=t54.obstacles,this.obstacleSHI=new oa2("flatbush",this.originalObstacles),this.colorMap=t54.colorMap??{};let e7=new Map;for(let n4=0;n4<t54.hdRoutes.length;n4++){if(jF(t54.hdRoutes[n4],t54.obstacles))continue;let o6=YF2(t54.hdRoutes[n4],t54.nodeWithPortPoints,this.repairMargin);if(o6===-1)continue;let i3=e7.get(o6)??[];i3.push(n4),e7.set(o6,i3)}let n3=Array.from(e7.entries()).map(([e8,n4])=>{let o6=t54.nodeWithPortPoints[e8];return{node:o6,routeIndexes:n4,sample:{nodeWithPortPoints:{capacityMeshNodeId:o6.capacityMeshNodeId,center:o6.center,width:o6.width,height:o6.height,portPoints:o6.portPoints.map(t55=>({x:t55.x,y:t55.y,z:t55.z,connectionName:t55.connectionName,portPointId:t55.portPointId,prevPortPointId:t55.prevPortPointId,nextPortPointId:t55.nextPortPointId}))},nodeHdRoutes:n4.map(e10=>{return{capacityMeshNodeId:(n5=t54.hdRoutes[e10]).regionId,connectionName:n5.connectionName,rootConnectionName:n5.rootConnectionName,route:n5.route.map(t55=>({x:t55.x,y:t55.y,z:t55.z})),traceThickness:n5.traceThickness,vias:n5.vias.map(t55=>({x:t55.x,y:t55.y,diameter:n5.viaDiameter})),viaDiameter:n5.viaDiameter};var n5}),adjacentObstacles:$F(o6,this.obstacleSHI,this.repairMargin)}}});this.sampleEntries=t54.maxSampleEntries!==void 0&&n3.length>t54.maxSampleEntries?[]:n3,this.MAX_ITERATIONS=Math.max(1e3*this.sampleEntries.length,1e5),this.stats={sampleCount:this.sampleEntries.length,skippedSampleCount:n3.length>this.sampleEntries.length?n3.length:0,repairedNodeCount:0,repairedRouteCount:0}}getSolverName(){return"Pipeline4HighDensityRepairSolver"}getConstructorParams(){return[{nodeWithPortPoints:this.sampleEntries.map(t54=>t54.node),hdRoutes:this.originalHdRoutes,obstacles:this.originalObstacles,repairMargin:this.repairMargin,colorMap:this.colorMap}]}_step(){let t54=this.sampleEntries[this.activeSampleIndex];if(t54){if(this.activeSubSolver){if(this.activeSubSolver.step(),this.latestVisualization=this.activeSubSolver.visualize(),this.activeSubSolver.failed)return this.failed=!0,this.error=this.activeSubSolver.error??`High density repair failed for node ${t54.node.capacityMeshNodeId}`,void(this.activeSubSolver=null);if(!this.activeSubSolver.solved)return;let e7=this.activeSubSolver.getOutput().repairedRoutes;for(let n3=0;n3<t54.routeIndexes.length;n3++){let o6=t54.routeIndexes[n3],i3=this.originalHdRoutes[o6],s6=e7[n3];this.repairedRoutesByIndex.set(o6,s6?XF(s6,i3):i3)}return this.activeSubSolver=null,this.activeSampleIndex+=1,this.stats={sampleCount:this.sampleEntries.length,repairedNodeCount:this.activeSampleIndex,repairedRouteCount:this.repairedRoutesByIndex.size},void(this.activeSampleIndex>=this.sampleEntries.length&&(this.solved=!0))}this.activeSubSolver=new zF({sample:t54.sample,margin:this.repairMargin}),this.latestVisualization=this.activeSubSolver.visualize()}else this.solved=!0}getOutput(){return this.originalHdRoutes.map((t54,e7)=>this.repairedRoutesByIndex.get(e7)??t54)}visualize(){if(this.activeSubSolver)return this.activeSubSolver.visualize();if(!this.solved)return this.latestVisualization;let t54=[],e7=[];for(let n3 of this.getOutput()){let o6=this.colorMap[n3.connectionName]??"#0ea5e9";for(let e8=0;e8<n3.route.length-1;e8++){let i3=n3.route[e8],s6=n3.route[e8+1];i3.z===s6.z&&t54.push({points:[{x:i3.x,y:i3.y},{x:s6.x,y:s6.y}],strokeColor:i3.z===0?o6:vo2(o6,.5),strokeWidth:n3.traceThickness,layer:`z${i3.z}`,strokeDash:i3.z!==0?[.1,.3]:void 0})}for(let t55 of n3.vias)e7.push({center:{x:t55.x,y:t55.y},radius:n3.viaDiameter/2,stroke:o6,fill:"rgba(14,165,233,0.12)"})}return{title:"Pipeline4 High Density Repair",lines:t54,circles:e7}}},HF=1e-9,WF=1.25,VF=(t54,e7)=>t54<e7?-1:t54>e7?1:0,UF=(t54,e7)=>VF(t54.z,e7.z)||VF(t54.x,e7.x)||VF(t54.y,e7.y),GF=t54=>`${t54.z.toFixed(6)}:${t54.x.toFixed(6)}:${t54.y.toFixed(6)}`,ZF=t54=>{let e7=t54.route.map(GF).join("|"),n3=[...t54.route].reverse().map(GF).join("|");return e7<=n3?e7:n3},qF=(t54,e7)=>{let n3=t54.connectionName.localeCompare(e7.connectionName);if(n3!==0)return n3;let o6=(t54.rootConnectionName??"").localeCompare(e7.rootConnectionName??"");if(o6!==0)return o6;let i3=ZF(t54).localeCompare(ZF(e7));return i3!==0?i3:VF(t54.traceThickness,e7.traceThickness)||VF(t54.viaDiameter,e7.viaDiameter)||VF(t54.route.length,e7.route.length)||VF(t54.vias.length,e7.vias.length)||VF(t54.jumpers?.length??0,e7.jumpers?.length??0)},JF=1e5,KF=.001,QF=class extends Fo2{constructor(t54){super();__publicField(this,"mergedHdRoute");__publicField(this,"remainingHdRoutes");__publicField(this,"start");__publicField(this,"end");__publicField(this,"colorMap");__publicField(this,"allowedLayerTransitionPointKeys");let e7=[...t54.hdRoutes].sort(qF);if(this.remainingHdRoutes=e7,this.colorMap=t54.colorMap??{},this.allowedLayerTransitionPointKeys=t54.allowedLayerTransitionPointKeys,e7.length===0){this.start=t54.start,this.end=t54.end;let n4=[{x:t54.start.x,y:t54.start.y,z:t54.start.z}],o7=[];if(t54.start.z!==t54.end.z){if(t54.allowedLayerTransitionPointKeys&&!t54.allowedLayerTransitionPointKeys.has(hg(t54.start)))return this.failed=!0,void(this.error=`Layer transition at ${hg(t54.start)} is not allowed`);n4.push({x:t54.start.x,y:t54.start.y,z:t54.end.z}),o7.push({x:t54.start.x,y:t54.start.y})}return n4.push({x:t54.end.x,y:t54.end.y,z:t54.end.z}),this.mergedHdRoute={connectionName:t54.connectionName,rootConnectionName:e7[0]?.rootConnectionName,route:n4,vias:o7,jumpers:[],viaDiameter:t54.defaultViaDiameter??.3,traceThickness:t54.defaultTraceThickness??.15},void(this.solved=!0)}let n3=1/0,o6=e7[0],i3="start-to-end";for(let s7 of e7){let e8=s7.route[0],r7=s7.route[s7.route.length-1],a4=me2(t54.start,e8),c7=me2(t54.start,r7),l10=me2(t54.end,e8),h3=me2(t54.end,r7),d4=Math.min(a4,c7,l10,h3);(d4<n3-HF||Math.abs(d4-n3)<=HF&&qF(s7,o6)<0)&&(n3=d4,o6=s7,i3=Math.min(l10,h3)<Math.min(a4,c7)-HF||Math.abs(Math.min(l10,h3)-Math.min(a4,c7))<=HF&&UF(t54.end,t54.start)<0?"end-to-start":"start-to-end")}i3==="start-to-end"?(this.start=t54.start,this.end=t54.end):(this.start=t54.end,this.end=t54.start);let s6=o6.route[0],r6=o6.route[o6.route.length-1],a3=me2(this.start,s6),c6=me2(this.start,r6),l7=a3<c6-HF||Math.abs(a3-c6)<=HF&&UF(s6,r6)<=0?s6:r6;this.mergedHdRoute={connectionName:t54.connectionName,rootConnectionName:o6.rootConnectionName,route:[{x:this.start.x,y:this.start.y,z:l7.z}],vias:[],jumpers:[],viaDiameter:o6.viaDiameter,traceThickness:o6.traceThickness}}getSolverName(){return"SingleHighDensityRouteStitchSolver3"}getDisjointedRoute(){for(let t54 of this.remainingHdRoutes)if([t54.route[0],t54.route[t54.route.length-1]].some(e7=>!this.remainingHdRoutes.some(n3=>n3===t54?!1:[n3.route[0],n3.route[n3.route.length-1]].some(t55=>t55.z===e7.z&&me2(e7,t55)<.001))))return{firstRoute:t54};return{firstRoute:this.remainingHdRoutes[0]}}_step(){if(this.remainingHdRoutes.length===0){let t55=this.mergedHdRoute.route[this.mergedHdRoute.route.length-1];return me2(t55,this.end)>KF&&me2(t55,this.end)<=WF&&this.mergedHdRoute.route.push({x:this.end.x,y:this.end.y,z:t55.z}),void(this.solved=!0)}let t54=this.mergedHdRoute.route[this.mergedHdRoute.route.length-1],e7=-1,n3="first",o6=1/0;for(let i6=0;i6<this.remainingHdRoutes.length;i6++){let s7=this.remainingHdRoutes[i6],r6=s7.route[0],a3=s7.route[s7.route.length-1],c6=me2(t54,r6),l7=me2(t54,a3),h3=1/0;t54.z===r6.z?c6<KF?h3=c6:c6<=1&&(h3=JF+c6):c6<KF&&(!this.allowedLayerTransitionPointKeys||this.allowedLayerTransitionPointKeys.has(hg(r6)))&&(h3=1e3+c6),h3<o6&&(o6=h3,e7=i6,n3="first");let d4=1/0;t54.z===a3.z?l7<KF?d4=l7:l7<=1&&(d4=JF+l7):l7<KF&&(!this.allowedLayerTransitionPointKeys||this.allowedLayerTransitionPointKeys.has(hg(a3)))&&(d4=1e3+l7),d4<o6&&(o6=d4,e7=i6,n3="last")}if(e7===-1)return void(this.remainingHdRoutes=[]);let i3=this.remainingHdRoutes[e7],s6;this.remainingHdRoutes.splice(e7,1),s6=n3==="first"?i3.route:(t55=>{let e8=[...t55].reverse().map(t56=>{let{toNextSegmentType:e10,...n4}=t56;return n4});for(let n4=0;n4<t55.length-1;n4++){let o7=t55[n4]?.toNextSegmentType;if(!o7)continue;let i6=t55.length-n4-2;e8[i6]={...e8[i6],toNextSegmentType:o7}}return e8})(i3.route),s6.length>0&&me2(t54,s6[0])<KF&&t54.z===s6[0].z?(s6[0].toNextSegmentType&&(t54.toNextSegmentType=s6[0].toNextSegmentType),this.mergedHdRoute.route.push(...s6.slice(1))):this.mergedHdRoute.route.push(...s6),this.mergedHdRoute.vias.push(...i3.vias),i3.jumpers&&this.mergedHdRoute.jumpers.push(...i3.jumpers)}visualize(){let t54={points:[],lines:[],circles:[],rects:[],title:"Single High Density Route Stitch Solver 3"};if(t54.points?.push({x:this.start.x,y:this.start.y,color:"green",label:"Start"},{x:this.end.x,y:this.end.y,color:"red",label:"End"}),this.mergedHdRoute&&this.mergedHdRoute.route.length>1){t54.lines?.push({points:this.mergedHdRoute.route.map(t55=>({x:t55.x,y:t55.y})),strokeColor:"green"});for(let e7 of this.mergedHdRoute.route)t54.points?.push({x:e7.x,y:e7.y,color:"green"});for(let e7 of this.mergedHdRoute.vias)t54.circles?.push({center:{x:e7.x,y:e7.y},radius:this.mergedHdRoute.viaDiameter/2,fill:"green"});if(this.mergedHdRoute.jumpers&&this.mergedHdRoute.jumpers.length>0){let e7=Gr2(this.mergedHdRoute.jumpers,{color:"green",label:this.mergedHdRoute.connectionName});t54.rects.push(...e7.rects??[]),t54.lines.push(...e7.lines??[])}}for(let e7 of this.remainingHdRoutes){t54.lines?.push({points:e7.route.map(t55=>({x:t55.x,y:t55.y})),strokeColor:"orange"});for(let n3 of e7.route)t54.points?.push({x:n3.x,y:n3.y,color:"orange"});for(let n3 of e7.vias)t54.circles?.push({center:{x:n3.x,y:n3.y},radius:e7.viaDiameter/2,fill:"orange"});if(e7.jumpers&&e7.jumpers.length>0){let n3=Gr2(e7.jumpers,{color:"orange",label:e7.connectionName});t54.rects.push(...n3.rects??[]),t54.lines.push(...n3.lines??[])}}return t54}},tj=class{constructor(){__publicField(this,"endpointClusters",new Map)}getEndpointKey(t54,e7){let n3=this.endpointClusters.get(t54)??[],o6,i3=1/0;for(let t55 of n3){if(t55.point.z!==e7.z)continue;let n4=me2(t55.point,e7);n4<=.1&&(n4<i3-HF||Math.abs(n4-i3)<=HF&&(!o6||UF(t55.point,o6.point)<0))&&(o6=t55,i3=n4)}if(o6)return o6.key;let s6=`${t54}:endpoint_${n3.length}`;return n3.push({key:s6,point:{x:e7.x,y:e7.y,z:e7.z}}),this.endpointClusters.set(t54,n3),s6}getClusters(t54){return this.endpointClusters.get(t54)??[]}getClosestEndpointKey(t54,e7,n3){let o6=null,i3=null,s6=1/0;for(let r6 of e7){let e8=[r6.route[0],r6.route[r6.route.length-1]];for(let r7 of e8){let e10=me2(n3,r7),a3=this.getEndpointKey(t54,r7);(e10<s6-HF||Math.abs(e10-s6)<=HF&&(o6===null||a3.localeCompare(o6)<0||a3===o6&&i3!==null&&UF(r7,i3)<0))&&(s6=e10,o6=a3,i3=r7)}}return o6}},ej=(t54,e7,n3)=>{let o6=t54.get(e7)??[];o6.some(t55=>t55.nextHash===n3.nextHash&&t55.routeIndex===n3.routeIndex)||(o6.push(n3),t54.set(e7,o6))},nj=t54=>{let e7=[...t54.possibleEndpoints].sort(UF),n3=e7.reduce((e8,n4)=>{let o7=me2(n4,t54.globalStart),i6=me2(e8,t54.globalStart);return o7<i6-HF||Math.abs(o7-i6)<=HF&&UF(n4,e8)<0?n4:e8}),o6=e7.filter(t55=>t55!==n3),i3=(o6.length>0?o6:t54.possibleEndpoints).reduce((e8,n4)=>{let o7=me2(n4,t54.globalEnd),i6=me2(e8,t54.globalEnd);return o7<i6-HF||Math.abs(o7-i6)<=HF&&UF(n4,e8)<0?n4:e8});return{start:n3,end:i3}},oj=t54=>{let e7=[...t54.terminals].sort(UF)[0],n3=me2(t54.islandEndpoint,e7);for(let o6 of t54.terminals.slice(1)){let i3=me2(t54.islandEndpoint,o6);(i3<n3-HF||Math.abs(i3-n3)<=HF&&UF(o6,e7)<0)&&(e7=o6,n3=i3)}return n3<=WF?e7:t54.islandEndpoint},ij=t54=>{if(t54.hdRoutes.length<=2)return t54.hdRoutes;let e7=[...t54.hdRoutes].sort(qF),n3=t54.endpointIndex.getClosestEndpointKey(t54.connectionName,e7,t54.start),o6=t54.endpointIndex.getClosestEndpointKey(t54.connectionName,e7,t54.end);if(!n3||!o6||n3===o6)return e7;let i3=new Map;for(let n4=0;n4<e7.length;n4++){let o7=e7[n4],s7=t54.endpointIndex.getEndpointKey(t54.connectionName,o7.route[0]),r7=t54.endpointIndex.getEndpointKey(t54.connectionName,o7.route[o7.route.length-1]);ej(i3,s7,{nextHash:r7,routeIndex:n4}),ej(i3,r7,{nextHash:s7,routeIndex:n4})}let s6=[...t54.endpointIndex.getClusters(t54.connectionName)].sort((t55,e8)=>UF(t55.point,e8.point));for(let t55=0;t55<s6.length;t55++){let e8=s6[t55];for(let n4=t55+1;n4<s6.length;n4++){let t56=s6[n4];e8.point.z===t56.point.z&&(me2(e8.point,t56.point)>1||(ej(i3,e8.key,{nextHash:t56.key,routeIndex:null}),ej(i3,t56.key,{nextHash:e8.key,routeIndex:null})))}}for(let[t55,n4]of i3.entries())i3.set(t55,[...n4].sort((t56,n5)=>{if(t56.routeIndex===null&&n5.routeIndex!==null)return 1;if(t56.routeIndex!==null&&n5.routeIndex===null)return-1;if(t56.routeIndex!==null&&n5.routeIndex!==null){let o7=qF(e7[t56.routeIndex],e7[n5.routeIndex]);if(o7!==0)return o7}return t56.nextHash.localeCompare(n5.nextHash)}));let r6=[n3],a3=new Set([n3]),c6=new Map;for(;r6.length>0;){let t55=r6.shift();if(t55===o6)break;for(let e8 of i3.get(t55)??[])a3.has(e8.nextHash)||(a3.add(e8.nextHash),c6.set(e8.nextHash,{prevHash:t55,routeIndex:e8.routeIndex}),r6.push(e8.nextHash))}if(!a3.has(o6))return e7;let l7=[],h3=o6;for(;h3!==n3;){let t55=c6.get(h3);if(!t55)return e7;t55.routeIndex!==null&&l7.push(t55.routeIndex),h3=t55.prevHash}if(l7.length===0)return t54.hdRoutes;let d4=l7.reverse().map(t55=>e7[t55]);return d4.length>0&&!t54.canStitchBetweenTerminals({connectionName:t54.connectionName,hdRoutes:d4,start:t54.start,end:t54.end})?e7:d4},sj=class extends Fo2{constructor(t54){super();__publicField(this,"unsolvedRoutes");__publicField(this,"activeSolver",null);__publicField(this,"mergedHdRoutes",[]);__publicField(this,"colorMap",{});__publicField(this,"defaultTraceThickness");__publicField(this,"defaultViaDiameter");__publicField(this,"allowedLayerTransitionPointKeys");__publicField(this,"endpointIndex",new tj);this.colorMap=t54.colorMap??{},this.allowedLayerTransitionPointKeys=t54.allowedLayerTransitionPointKeys;let e7=[...t54.hdRoutes].sort(qF),n3=e7[0];this.defaultTraceThickness=n3?.traceThickness??.15,this.defaultViaDiameter=n3?.viaDiameter??t54.defaultViaDiameter??.3;let o6=new Vr2({}),i3=[],s6=new Map;for(let t55=0;t55<e7.length;t55++){let n4=e7[t55],o7=n4.route[0],s7=n4.route[n4.route.length-1];i3.push([`route_island_${t55}`,this.endpointIndex.getEndpointKey(n4.connectionName,o7),this.endpointIndex.getEndpointKey(n4.connectionName,s7)])}o6.addConnections(i3);for(let t55 of i3)for(let e8 of t55.slice(1))s6.set(e8,(s6.get(e8)??0)+1);this.unsolvedRoutes=[];let r6=Array.from(new Set(Object.values(o6.idToNetMap)));for(let n4 of r6){let i6=o6.getIdsConnectedToNet(n4),r7=e7.filter((t55,e8)=>i6.includes(`route_island_${e8}`));if(r7.length===0)continue;let a4=t54.connections.find(t55=>t55.name===r7[0].connectionName),c6=r7.flatMap(t55=>[t55.route[0],t55.route[t55.route.length-1]]),l7=new Map,h3=[];for(let t55 of c6){let e8=this.endpointIndex.getEndpointKey(r7[0].connectionName,t55);l7.has(e8)||l7.set(e8,t55),s6.get(e8)===1&&h3.push(t55)}let d4=h3.length>0?h3:[...l7.values()];if(d4.length===0)continue;let u6,p5;if(d4.length>=2){let e8={...a4.pointsToConnect[0],z:Co2(lo2(a4.pointsToConnect[0]),t54.layerCount)},n5={...a4.pointsToConnect[1],z:Co2(lo2(a4.pointsToConnect[1]),t54.layerCount)};({start:u6,end:p5}=nj({possibleEndpoints:d4,globalStart:e8,globalEnd:n5})),me2(u6,a4.pointsToConnect[1])<me2(p5,a4.pointsToConnect[0])&&([u6,p5]=[p5,u6]),u6=oj({islandEndpoint:u6,terminals:[e8,n5]}),p5=oj({islandEndpoint:p5,terminals:[e8,n5]})}else u6={...a4.pointsToConnect[0],z:Co2(lo2(a4.pointsToConnect[0]),t54.layerCount)},p5={...a4.pointsToConnect[1],z:Co2(lo2(a4.pointsToConnect[1]),t54.layerCount)};let m4=ij({connectionName:r7[0].connectionName,hdRoutes:r7,start:u6,end:p5,endpointIndex:this.endpointIndex,canStitchBetweenTerminals:t55=>this.canStitchBetweenTerminals(t55)});this.unsolvedRoutes.push({connectionName:r7[0].connectionName,hdRoutes:m4,start:u6,end:p5})}let a3=new Map;for(let t55 of this.unsolvedRoutes){let e8=a3.get(t55.connectionName);e8?e8.push(t55):a3.set(t55.connectionName,[t55])}this.unsolvedRoutes=Array.from(a3.entries()).flatMap(([n4,o7])=>{let i6=t54.connections.find(t55=>t55.name===n4),s7=o7.some(t55=>t55.hdRoutes.some(t56=>t56.route.length<2)),r7=o7.length>1&&(t55=>{for(let e8=0;e8<t55.length;e8++)for(let n5=e8+1;n5<t55.length;n5++){let o8=[t55[e8].start,t55[e8].end],i8=[t55[n5].start,t55[n5].end];for(let t56 of o8)for(let e10 of i8)if(t56.z===e10.z&&me2(t56,e10)<=1)return!0}return!1})(o7);if(!i6)return o7;let a4={...i6.pointsToConnect[0],z:Co2(lo2(i6.pointsToConnect[0]),t54.layerCount)},c6={...i6.pointsToConnect[1],z:Co2(lo2(i6.pointsToConnect[1]),t54.layerCount)},l7=o7.flatMap(t55=>t55.hdRoutes),h3=o7.length>1?this.getSharedRootPathRoutes({connectionName:n4,rootConnectionName:i6.rootConnectionName??l7[0]?.rootConnectionName,hdRoutes:l7,allHdRoutes:e7,start:a4,end:c6}):null;return s7||r7||h3?[{connectionName:n4,hdRoutes:h3??ij({connectionName:n4,hdRoutes:l7,start:a4,end:c6,endpointIndex:this.endpointIndex,canStitchBetweenTerminals:t55=>this.canStitchBetweenTerminals(t55)}),start:a4,end:c6}]:o7}),this.MAX_ITERATIONS=1e5}getSolverName(){return"MultipleHighDensityRouteStitchSolver3"}canStitchBetweenTerminals(t54){let e7=new QF({connectionName:t54.connectionName,hdRoutes:t54.hdRoutes,start:t54.start,end:t54.end,colorMap:this.colorMap,defaultTraceThickness:this.defaultTraceThickness,defaultViaDiameter:this.defaultViaDiameter,allowedLayerTransitionPointKeys:this.allowedLayerTransitionPointKeys});for(;!e7.solved&&!e7.failed&&e7.iterations<e7.MAX_ITERATIONS;)e7.step();if(e7.failed)return!1;let n3=e7.mergedHdRoute.route[0],o6=e7.mergedHdRoute.route[e7.mergedHdRoute.route.length-1],i3=me2(n3,t54.start)+me2(o6,t54.end),s6=me2(n3,t54.end)+me2(o6,t54.start);return Math.min(i3,s6)<=WF}getSharedRootPathRoutes(t54){let e7=t54.rootConnectionName;if(!e7)return null;let n3=new Set(t54.hdRoutes),o6=t54.allHdRoutes.filter(t55=>(t55.rootConnectionName??t55.connectionName)===e7);if(o6.every(t55=>n3.has(t55)))return null;let i3=ij({connectionName:t54.connectionName,hdRoutes:o6,start:t54.start,end:t54.end,endpointIndex:this.endpointIndex,canStitchBetweenTerminals:t55=>this.canStitchBetweenTerminals(t55)});return!i3.some(t55=>!n3.has(t55))||i3.length>=o6.length?null:i3}_step(){if(this.activeSolver)return this.activeSolver.step(),void(this.activeSolver.solved?(this.activeSolver instanceof QF&&this.mergedHdRoutes.push(this.activeSolver.mergedHdRoute),this.activeSolver=null):this.activeSolver.failed&&(this.failed=!0,this.error=this.activeSolver.error));let t54=this.unsolvedRoutes.pop();t54?this.activeSolver=new QF({connectionName:t54.connectionName,hdRoutes:t54.hdRoutes,start:t54.start,end:t54.end,colorMap:this.colorMap,defaultTraceThickness:this.defaultTraceThickness,defaultViaDiameter:this.defaultViaDiameter,allowedLayerTransitionPointKeys:this.allowedLayerTransitionPointKeys}):this.solved=!0}visualize(){let t54={points:[],lines:[],circles:[],rects:[],title:"Multiple High Density Route Stitch Solver 3"};if(this.activeSolver){let e7=this.activeSolver.visualize();e7.points?.length&&t54.points?.push(...e7.points),e7.lines?.length&&t54.lines?.push(...e7.lines),e7.circles?.length&&t54.circles?.push(...e7.circles),e7.rects?.length&&(t54.rects||(t54.rects=[]),t54.rects.push(...e7.rects))}for(let[e7,n3]of this.mergedHdRoutes.entries()){let o6=this.colorMap[n3.connectionName]??`hsl(120, 100%, ${40+10*e7%40}%)`;for(let e8=0;e8<n3.route.length-1;e8++){let i3=n3.route[e8],s6=n3.route[e8+1],r6=i3.z!==0?vo2(o6,.5):o6;t54.lines?.push({points:[{x:i3.x,y:i3.y},{x:s6.x,y:s6.y}],strokeColor:r6,strokeWidth:n3.traceThickness})}for(let e8 of n3.route){let n4=e8.z!==0?vo2(o6,.5):o6;t54.points?.push({x:e8.x,y:e8.y,color:n4})}for(let e8 of n3.vias)t54.circles?.push({center:{x:e8.x,y:e8.y},radius:n3.viaDiameter/2,fill:o6});if(n3.jumpers&&n3.jumpers.length>0){let e8=Gr2(n3.jumpers,{color:o6,label:n3.connectionName});t54.rects.push(...e8.rects??[]),t54.lines.push(...e8.lines??[])}}return t54}},rj=t54=>(t54%360+360)%360,aj=t54=>{let e7=rj(t54);return[0,90,180,270].some(t55=>Math.min(Math.abs(e7-t55),360-Math.abs(e7-t55))<=.01)},cj=(t54,e7)=>{let{ccwRotationDegrees:n3,...o6}=t54,i3=(t55=>{let e8=rj(t55),n4=[0,90,180,270];for(let t56 of n4)if(Math.min(Math.abs(e8-t56),360-Math.abs(e8-t56))<=.01)return t56;return null})(e7);return i3===90||i3===270?{...o6,width:t54.height,height:t54.width}:o6},lj=t54=>"layers"in t54?t54.layers:[t54.layer],hj=(t54,e7)=>!(lj(t54).length>0&&!lj(t54).some(t55=>e7.layers.includes(t55)))&&xe2(t54,ze2(e7)),dj=(t54,e7)=>{let{minX:n3,maxX:o6,minY:i3,maxY:s6}=ze2(e7);return{x:Math.max(n3,Math.min(o6,t54.x)),y:Math.max(i3,Math.min(s6,t54.y))}},uj=(t54,e7)=>t54.obstacleId??`${t54.componentId??"obstacle"}_${e7}`,pj=(t54,e7={})=>{let n3=t54.ccwRotationDegrees;if(typeof n3!="number"||!Number.isFinite(n3))return[t54];if(aj(n3))return[cj(t54,n3)];let{ccwRotationDegrees:o6,...i3}=t54,s6={center:t54.center,width:t54.width,height:t54.height,rotation:n3},r6=(t55=>{let e8=Math.max(t55.width,t55.height),n4=Math.min(t55.width,t55.height);return t55.obstacleId?.startsWith("trace_obstacle_")?Math.max(2,Math.ceil(e8/.75)):n4<=0?2:e8/n4<2||n4>=.9?null:Math.max(2,Math.ceil(e8/.75))})(t54),a3=e7.useSparseCenterlineApproximation?(t55=>{let{center:e8,width:n4,height:o7,rotation:i6}=t55,s7=Math.max(n4,o7),r7=Math.min(n4,o7),a4=Math.max(1,Math.ceil(s7/(2*r7))),c7=s7/a4,l7=i6*Math.PI/180,h3=Math.cos(l7),d4=Math.sin(l7),u6=[];for(let t56=0;t56<a4;t56++){let i8=(t56-a4/2+.5)*c7,s8=n4>=o7?i8*h3:-i8*d4,l10=n4>=o7?i8*d4:i8*h3;u6.push({center:{x:e8.x+s8,y:e8.y+l10},width:r7,height:r7})}return u6})(s6):r6===null?((t55,e8)=>{let{center:n4,width:o7,height:i6,rotation:s7}=t55,r7=Math.max(1,Math.ceil(o7/e8)),a4=Math.max(1,Math.ceil(i6/e8)),c7=o7/r7,l7=i6/a4,h3=s7*Math.PI/180,d4=Math.cos(h3),u6=Math.sin(h3),p5=[];for(let t56=0;t56<r7;t56++){let e10=(t56-r7/2+.5)*c7;for(let t57=0;t57<a4;t57++){let o8=(t57-a4/2+.5)*l7;p5.push({center:{x:n4.x+e10*d4-o8*u6,y:n4.y+e10*u6+o8*d4},width:Math.abs(c7*d4)+Math.abs(l7*u6),height:Math.abs(c7*u6)+Math.abs(l7*d4)})}}return p5})(s6,(t55=>t55.obstacleId?.startsWith("trace_obstacle_")?.75:.4)(t54)):t54.obstacleId?.startsWith("trace_obstacle_")?(function(t55,e8=2){let{center:n4,width:o7,height:i6,rotation:s7}=t55,r7=[],a4=Math.max(1,Math.ceil(e8)),c7=s7*Math.PI/180,l7=Math.cos(c7),h3=Math.sin(c7);if(o7>=i6){let t56=o7/a4;for(let e10=0;e10<a4;e10++){let o8=(e10-a4/2+.5)*t56,s8=o8*l7,c8=o8*h3,d4=Math.abs(t56*l7)+Math.abs(i6*h3),u6=Math.abs(t56*h3)+Math.abs(i6*l7);r7.push({center:{x:n4.x+s8,y:n4.y+c8},width:d4,height:u6})}}else{let t56=i6/a4;for(let e10=0;e10<a4;e10++){let i8=(e10-a4/2+.5)*t56,s8=-i8*h3,c8=i8*l7,d4=Math.abs(o7*l7)+Math.abs(t56*h3),u6=Math.abs(o7*h3)+Math.abs(t56*l7);r7.push({center:{x:n4.x+s8,y:n4.y+c8},width:d4,height:u6})}}return r7})(s6,r6):((t55,e8)=>{let{center:n4,width:o7,height:i6,rotation:s7}=t55,r7=Math.max(o7,i6),a4=Math.min(o7,i6),c7=Math.max(1,Math.ceil(e8)),l7=r7/c7,h3=s7*Math.PI/180,d4=Math.cos(h3),u6=Math.sin(h3),p5=Math.max(l7,.75*a4),m4=[];for(let t56=0;t56<c7;t56++){let e10=(t56-c7/2+.5)*l7,s8=o7>=i6?e10*d4:-e10*u6,r8=o7>=i6?e10*u6:e10*d4;m4.push({center:{x:n4.x+s8,y:n4.y+r8},width:p5,height:p5})}return m4})(s6,r6),c6=t54.connectedTo.length>0?a3.reduce((e8,n4,o7)=>{let i6=a3[e8],s7=(i6.center.x-t54.center.x)**2+(i6.center.y-t54.center.y)**2;return(n4.center.x-t54.center.x)**2+(n4.center.y-t54.center.y)**2<s7?o7:e8},0):-1;return a3.map((t55,e8)=>({...i3,obstacleId:e8===c6?i3.obstacleId:i3.obstacleId?`${i3.obstacleId}_approx_${e8}`:void 0,connectedTo:i3.connectedTo,center:t55.center,width:t55.width,height:t55.height}))},mj=t54=>{let e7=new Map,n3=new Map,o6=new Map,i3=t54.obstacles.filter(t55=>t55.connectedTo.length>0&&typeof t55.ccwRotationDegrees=="number"&&Number.isFinite(t55.ccwRotationDegrees)&&!aj(t55.ccwRotationDegrees)).length>20;for(let[s7,r6]of t54.obstacles.entries()){let t55=pj(r6,{useSparseCenterlineApproximation:i3&&r6.connectedTo.length>0&&!r6.obstacleId?.startsWith("trace_obstacle_")}),a3=uj(r6,s7);n3.set(a3,t55),o6.set(a3,r6);for(let n4 of t55){let t56=[n4.center.x.toFixed(6),n4.center.y.toFixed(6),n4.width.toFixed(6),n4.height.toFixed(6),n4.layers.join(",")].join(":"),o7=e7.get(t56);o7?o7.connectedTo=[...new Set([...o7.connectedTo,...n4.connectedTo])]:e7.set(t56,n4)}}let s6=t54.connections.map(t55=>({...t55,pointsToConnect:t55.pointsToConnect.map(t56=>{let e8=(t57=>[t57.pointId,t57.pcb_port_id].filter(t58=>!!t58))(t56);if(e8.length===0)return t56;for(let[i6,s7]of o6){if(!e8.some(t57=>s7.connectedTo.includes(t57))||!hj(t56,s7))continue;let o7=n3.get(i6)??[];if(o7.length===0)continue;if(o7.some(e10=>hj(t56,e10)))return t56;let r6=o7[0],a3=Number.POSITIVE_INFINITY;for(let e10 of o7){let n4=me2(dj(t56,e10),t56);n4<a3&&(a3=n4,r6=e10)}return{...t56,...dj(t56,r6)}}return t56})}));return{...t54,connections:s6,obstacles:[...e7.values()]}},gj=.001,fj=t54=>t54.route_type==="wire",yj=t54=>t54.route_type==="via",_j=t54=>t54.route_type==="through_obstacle",bj=(t54,e7,n3)=>{let o6=Co2(t54,n3),i3=Co2(e7,n3),s6=Math.min(o6,i3),r6=Math.max(o6,i3);return Array.from({length:r6-s6+1},(t55,e8)=>po2(s6+e8,n3))},xj=({obstacleId:t54,start:e7,end:n3,width:o6,layer:i3,connectedTo:s6})=>{let r6=n3.x-e7.x,a3=n3.y-e7.y,c6=Math.hypot(r6,a3);return c6<=gj?null:{obstacleId:t54,type:"rect",layers:[i3],center:{x:(e7.x+n3.x)/2,y:(e7.y+n3.y)/2},width:c6,height:Math.max(o6,gj),ccwRotationDegrees:180*Math.atan2(a3,r6)/Math.PI,connectedTo:s6}};function vj(t54){if(!t54)return t54;let e7=(t55=>{if(!t55)return[];let e8=[],n3=Eo2(t55);for(let[o6,i3]of(t55.traces??[]).entries()){let s6=i3.connectsTo??[];for(let r6=0;r6<i3.route.length;r6++){let a3=i3.route[r6];if(yj(a3)){let c6=a3.via_diameter??n3.padDiameter;e8.push({obstacleId:`trace_obstacle_${i3.pcb_trace_id}_${o6}_${r6}_via`,type:"rect",layers:bj(a3.from_layer,a3.to_layer,t55.layerCount),center:{x:a3.x,y:a3.y},width:Math.max(c6,gj),height:Math.max(c6,gj),connectedTo:s6});continue}if(_j(a3)){let n4=xj({obstacleId:`trace_obstacle_${i3.pcb_trace_id}_${o6}_${r6}_through`,start:a3.start,end:a3.end,width:a3.width,layer:a3.from_layer,connectedTo:s6});n4&&(n4.layers=bj(a3.from_layer,a3.to_layer,t55.layerCount),e8.push(n4))}}for(let t56=0;t56<i3.route.length-1;t56++){let n4=i3.route[t56],r6=i3.route[t56+1];if(!fj(n4)||!fj(r6)||n4.layer!==r6.layer)continue;let a3=xj({obstacleId:`trace_obstacle_${i3.pcb_trace_id}_${o6}_${t56}_wire`,start:n4,end:r6,width:n4.width,layer:n4.layer,connectedTo:s6});a3&&e8.push(a3)}}return e8})(t54);return e7.length===0?t54:{...t54,obstacles:[...t54.obstacles??[],...e7]}}var Sj=t54=>{let e7=t54.obstacles.filter(e8=>!((t55,e10)=>!(t56=>(t56.connectedTo?.length??0)>0||(t56.offBoardConnectsTo?.length??0)>0||t56.netIsAssignable===!0)(t55)&&(e10.outline&&e10.outline.length>=3?!Ie2(t55,e10.outline):!De2({minX:t55.center.x-t55.width/2,maxX:t55.center.x+t55.width/2,minY:t55.center.y-t55.height/2,maxY:t55.center.y+t55.height/2},e10.bounds)))(e8,t54)),n3=e7.length!==t54.obstacles.length,o6=n3&&t54.outline&&t54.outline.length>=3?(t55=>{if(t55.width&&t55.height&&t55.center){let e10=t55.width/2,n5=t55.height/2;return{minX:t55.center.x-e10,minY:t55.center.y-n5,maxX:t55.center.x+e10,maxY:t55.center.y+n5,width:t55.width,height:t55.height,center:{x:t55.center.x,y:t55.center.y}}}if(!t55.outline||t55.outline.length===0)throw new Error("Unable to compute board bounds. pcb_board must include width/height/center or a non-empty outline.");let e8=Number.POSITIVE_INFINITY,n4=Number.POSITIVE_INFINITY,o7=Number.NEGATIVE_INFINITY,i3=Number.NEGATIVE_INFINITY;for(let s7 of t55.outline)e8=Math.min(e8,s7.x),n4=Math.min(n4,s7.y),o7=Math.max(o7,s7.x),i3=Math.max(i3,s7.y);let s6=o7-e8,r6=i3-n4;return{minX:e8,minY:n4,maxX:o7,maxY:i3,width:s6,height:r6,center:{x:e8+s6/2,y:n4+r6/2}}})({type:"pcb_board",pcb_board_id:"__autorouting_board_outline__",center:{x:0,y:0},thickness:1,num_layers:t54.layerCount,material:"fr4",outline:t54.outline}):t54.bounds;return n3?{...t54,obstacles:e7,bounds:o6}:t54},Ij=class extends Fo2{constructor(t54){super();__publicField(this,"inputSrj");__publicField(this,"outputSrj");this.inputSrj=t54,this.MAX_ITERATIONS=1}_step(){let t54=vj(this.inputSrj)??this.inputSrj;this.outputSrj=mj(Sj(t54)),this.solved=!0}getOutputSimpleRouteJson(){if(!this.outputSrj)throw new Error("PreprocessSimpleRouteJsonSolver has not solved yet");return this.outputSrj}getConstructorParams(){return[this.inputSrj]}visualize(){return this.outputSrj?Wo2(Oo2({...this.outputSrj,traces:[]}),tk(this.outputSrj)):{lines:[],points:[],rects:[],circles:[]}}};function Pj(t54,e7,n3,o6={}){return{solverName:t54,solverClass:e7,getConstructorParams:n3,onSolved:o6.onSolved}}var Mj=class extends Fo2{constructor(t54,e7={}){super();__publicField(this,"srj");__publicField(this,"opts");__publicField(this,"preprocessSimpleRouteJsonSolver");__publicField(this,"escapeViaLocationSolver");__publicField(this,"netToPointPairsSolver");__publicField(this,"nodeSolver");__publicField(this,"nodeDimensionSubdivisionSolver");__publicField(this,"nodeTargetMerger");__publicField(this,"edgeSolver");__publicField(this,"colorMap");__publicField(this,"highDensityRouteSolver");__publicField(this,"highDensityForceImproveSolver");__publicField(this,"highDensityRepairSolver");__publicField(this,"highDensityStitchSolver");__publicField(this,"globalDrcForceImproveSolver");__publicField(this,"singleLayerNodeMerger");__publicField(this,"strawSolver");__publicField(this,"deadEndSolver");__publicField(this,"traceSimplificationSolver");__publicField(this,"availableSegmentPointSolver");__publicField(this,"portPointPathingSolver");__publicField(this,"multiSectionPortPointOptimizer");__publicField(this,"uniformPortDistributionSolver");__publicField(this,"traceWidthSolver");__publicField(this,"necessaryCrampedPortPointSolver");__publicField(this,"viaDiameter");__publicField(this,"viaHoleDiameter");__publicField(this,"minTraceWidth");__publicField(this,"effort");__publicField(this,"maxNodeDimension");__publicField(this,"maxNodeRatio");__publicField(this,"minNodeArea");__publicField(this,"startTimeOfPhase");__publicField(this,"endTimeOfPhase");__publicField(this,"timeSpentOnPhase");__publicField(this,"activeSubSolver",null);__publicField(this,"connMap");__publicField(this,"srjWithEscapeViaLocations");__publicField(this,"srjWithPointPairs");__publicField(this,"originalSrj");__publicField(this,"capacityNodes",null);__publicField(this,"capacityEdges",null);__publicField(this,"highDensityNodePortPoints");__publicField(this,"cacheProvider",null);__publicField(this,"pipelineDef",[Pj("preprocessSimpleRouteJsonSolver",Ij,t54=>[t54.originalSrj],{onSolved:t54=>{t54.setSimpleRouteJson(t54.preprocessSimpleRouteJsonSolver.getOutputSimpleRouteJson())}}),Pj("escapeViaLocationSolver",rk,t54=>[t54.srj,{viaDiameter:t54.viaDiameter,minTraceWidth:t54.minTraceWidth,obstacleMargin:t54.srj.defaultObstacleMargin??.15}],{onSolved:t54=>{t54.srjWithEscapeViaLocations=t54.escapeViaLocationSolver?.getOutputSimpleRouteJson()}}),Pj("netToPointPairsSolver",Wr2,t54=>[t54.srjWithEscapeViaLocations??t54.srj,t54.colorMap],{onSolved:t54=>{t54.srjWithPointPairs=t54.netToPointPairsSolver?.getNewSimpleRouteJson(),t54.colorMap=xo2(t54.srjWithPointPairs,t54.connMap),t54.connMap=ko2(t54.srjWithPointPairs)}}),Pj("nodeSolver",Hn2,t54=>[{simpleRouteJson:t54.srjWithPointPairs,maxGapFillPasses:4}],{onSolved:t54=>{t54.capacityNodes=t54.nodeSolver?.getOutput().meshNodes??[]}}),Pj("nodeDimensionSubdivisionSolver",mL,t54=>[t54.capacityNodes,t54.maxNodeDimension,t54.maxNodeRatio,t54.minNodeArea],{onSolved:t54=>{t54.capacityNodes=t54.nodeDimensionSubdivisionSolver?.outputNodes??[]}}),Pj("edgeSolver",Ho2,t54=>[t54.capacityNodes],{onSolved:t54=>{t54.capacityEdges=t54.edgeSolver?.edges}}),Pj("availableSegmentPointSolver",Yo2,t54=>[{nodes:t54.capacityNodes,edges:t54.capacityEdges||[],traceWidth:t54.minTraceWidth,colorMap:t54.colorMap,shouldReturnCrampedPortPoints:!0}]),Pj("necessaryCrampedPortPointSolver",lg,t54=>[{capacityMeshNodes:t54.capacityNodes,sharedEdgeSegments:t54.availableSegmentPointSolver.getOutput(),simpleRouteJson:t54.srjWithPointPairs,numberOfCrampedPortPointsToKeep:5}]),Pj("portPointPathingSolver",Kz,t54=>{let e7=t54.necessaryCrampedPortPointSolver?.getOutput()??t54.availableSegmentPointSolver.getOutput(),{graph:n3,connections:o6}=bg({capacityMeshNodes:t54.capacityNodes,layerCount:t54.srj.layerCount,segmentPortPoints:e7.flatMap(t55=>t55.portPoints),simpleRouteJsonConnections:t54.srjWithPointPairs.connections});return[{graph:n3,connections:o6,layerCount:t54.srj.layerCount,effort:t54.effort,minViaPadDiameter:t54.viaDiameter,flags:{FORCE_CENTER_FIRST:!0,RIPPING_ENABLED:!0},weights:{SHUFFLE_SEED:0,MEMORY_PF_FACTOR:4,CENTER_OFFSET_DIST_PENALTY_FACTOR:0,CENTER_OFFSET_FOCUS_SHIFT:0,NODE_PF_FACTOR:0,LAYER_CHANGE_COST:0,RIPPING_PF_COST:0,NODE_PF_MAX_PENALTY:100,BASE_CANDIDATE_COST:.6,MAX_ITERATIONS_PER_PATH:0,RANDOM_WALK_DISTANCE:0,START_RIPPING_PF_THRESHOLD:.3,END_RIPPING_PF_THRESHOLD:1,MAX_RIPS:1e3,RANDOM_RIP_FRACTION:.3,STRAIGHT_LINE_DEVIATION_PENALTY_FACTOR:4,GREEDY_MULTIPLIER:.7,MIN_ALLOWED_BOARD_SCORE:-1e4}}]}),Pj("uniformPortDistributionSolver",ro2,t54=>[{nodeWithPortPoints:t54.portPointPathingSolver?.getOutput().nodesWithPortPoints??[],inputNodesWithPortPoints:t54.portPointPathingSolver?.getOutput().inputNodeWithPortPoints??[],minTraceWidth:t54.minTraceWidth,obstacles:t54.srj.obstacles,layerCount:t54.srj.layerCount}]),Pj("highDensityRouteSolver",ur2,t54=>{let e7=t54.uniformPortDistributionSolver?.getOutput()??[],n3=t54.portPointPathingSolver?.getOutput().nodesWithPortPoints??[],o6=e7.length>0?e7:n3;return t54.highDensityNodePortPoints=structuredClone(o6),[{nodePortPoints:o6,nodePfById:new Map((t54.portPointPathingSolver?.getOutput().inputNodeWithPortPoints??[]).map(e8=>[e8.capacityMeshNodeId,t54.portPointPathingSolver?.computeNodePf(e8)??null])),colorMap:t54.colorMap,connMap:t54.connMap,viaDiameter:t54.viaDiameter,traceWidth:t54.minTraceWidth,obstacleMargin:t54.srj.defaultObstacleMargin??.15,obstacles:t54.srj.obstacles,layerCount:t54.srj.layerCount,useGrowShrinkHighDensityIntraNodeSolver:!0}]}),Pj("highDensityForceImproveSolver",Ef2,t54=>[{nodeWithPortPoints:t54.highDensityNodePortPoints??[],hdRoutes:t54.highDensityRouteSolver.routes,colorMap:t54.colorMap,totalStepsPerNode:Math.max(20,Math.round(60*t54.effort)),nodeAssignmentMargin:t54.srj.defaultObstacleMargin??.2}]),Pj("highDensityRepairSolver",BF,t54=>[{nodeWithPortPoints:t54.highDensityNodePortPoints??[],hdRoutes:t54.highDensityForceImproveSolver?.getOutput()??t54.highDensityRouteSolver.routes,obstacles:t54.srj.obstacles,colorMap:t54.colorMap,repairMargin:t54.srj.defaultObstacleMargin??.2}]),Pj("highDensityStitchSolver",sj,t54=>[{connections:t54.srjWithPointPairs.connections,hdRoutes:t54.highDensityRepairSolver?.getOutput()??t54.highDensityForceImproveSolver?.getOutput()??t54.highDensityRouteSolver.routes,colorMap:t54.colorMap,layerCount:t54.srj.layerCount,defaultViaDiameter:t54.viaDiameter}]),Pj("traceSimplificationSolver",Ma2,t54=>[{hdRoutes:t54.highDensityStitchSolver.mergedHdRoutes,obstacles:t54.srj.obstacles,connMap:t54.connMap,colorMap:t54.colorMap,outline:t54.srj.outline,defaultViaDiameter:t54.viaDiameter,layerCount:t54.srj.layerCount,minTraceToPadEdgeClearance:t54.srj.minTraceToPadEdgeClearance,iterations:2}]),Pj("traceWidthSolver",Na2,t54=>[{hdRoutes:t54.traceSimplificationSolver.simplifiedHdRoutes,obstacles:t54.srj.obstacles,connMap:t54.connMap,colorMap:t54.colorMap,minTraceWidth:t54.minTraceWidth,connection:t54.srj.connections,obstacleMargin:t54.srj.minTraceToPadEdgeClearance??.15,layerCount:t54.srj.layerCount}]),Pj("globalDrcForceImproveSolver",pL,t54=>[{srj:t54.srjWithPointPairs,hdRoutes:t54.traceWidthSolver.getHdRoutesWithWidths(),effort:t54.effort}])]);__publicField(this,"currentPipelineStepIndex",0);this.srj=t54,this.opts=e7,this.originalSrj=t54,this.opts={...e7};let n3=this.opts;if(this.effort=n3.effort??1,this.MAX_ITERATIONS=1e8*this.effort,this.maxNodeDimension=n3.maxNodeDimension??16,this.maxNodeRatio=n3.maxNodeRatio??6,this.minNodeArea=n3.minNodeArea??.1**2,this.setSimpleRouteJson(t54),n3.capacityDepth===void 0){let t55=this.srj.bounds.maxX-this.srj.bounds.minX,e8=this.srj.bounds.maxY-this.srj.bounds.minY,o6=Math.max(t55,e8),i3=n3.targetMinCapacity??.5;n3.capacityDepth=fr2(o6,i3)}this.cacheProvider=n3.cacheProvider===void 0?Zn2():n3.cacheProvider===null?null:n3.cacheProvider,this.startTimeOfPhase={},this.endTimeOfPhase={},this.timeSpentOnPhase={}}setSimpleRouteJson(t54){this.srj=t54;let e7=Eo2(this.srj);this.viaDiameter=e7.padDiameter,this.viaHoleDiameter=e7.holeDiameter,this.minTraceWidth=this.srj.minTraceWidth,this.connMap=ko2(this.srj),this.colorMap=xo2(this.srj,this.connMap)}getConstructorParams(){return[this.srj,this.opts]}_step(){let t54=this.pipelineDef[this.currentPipelineStepIndex];if(!t54)return void(this.solved=!0);if(this.activeSubSolver)return this.activeSubSolver.step(),void(this.activeSubSolver.solved?(this.endTimeOfPhase[t54.solverName]=performance.now(),this.timeSpentOnPhase[t54.solverName]=this.endTimeOfPhase[t54.solverName]-this.startTimeOfPhase[t54.solverName],t54.onSolved?.(this),this.activeSubSolver=null,this.currentPipelineStepIndex++):this.activeSubSolver.failed&&(this.error=this.activeSubSolver?.error,this.failed=!0,this.activeSubSolver=null));let e7=t54.getConstructorParams(this);this.activeSubSolver=new t54.solverClass(...e7),this[t54.solverName]=this.activeSubSolver,this.timeSpentOnPhase[t54.solverName]=0,this.startTimeOfPhase[t54.solverName]=performance.now()}solveUntilPhase(t54){for(;this.getCurrentPhase()!==t54;)this.step()}getCurrentPhase(){return this.pipelineDef[this.currentPipelineStepIndex]?.solverName??"none"}visualize(){if(!this.solved&&this.activeSubSolver)return this.activeSubSolver.visualize();let t54=this.escapeViaLocationSolver?.visualize(),e7=this.netToPointPairsSolver?.visualize(),n3=this.nodeSolver?.visualize(),o6=this.nodeDimensionSubdivisionSolver?.visualize(),i3=this.nodeTargetMerger?.visualize(),s6=this.singleLayerNodeMerger?.visualize(),r6=this.strawSolver?.visualize(),a3=this.edgeSolver?.visualize(),c6=this.deadEndSolver?.visualize(),l7=this.availableSegmentPointSolver?.visualize(),h3=this.portPointPathingSolver?.visualize(),d4=this.multiSectionPortPointOptimizer?.visualize(),u6=this.uniformPortDistributionSolver?.visualize(),p5=this.highDensityRouteSolver?.visualize(),m4=this.highDensityForceImproveSolver?.visualize(),g4=this.highDensityRepairSolver?.visualize(),f4=this.highDensityStitchSolver?.visualize(),y3=this.traceSimplificationSolver?.visualize(),_3=this.necessaryCrampedPortPointSolver?.visualize(),b4=(this.highDensityRouteSolver?.visualize(),this.originalSrj),x4=b4.outline,v3=[];if(v3.push({points:[{x:b4.bounds?.minX??-50,y:b4.bounds?.minY??-50},{x:b4.bounds?.maxX??50,y:b4.bounds?.minY??-50},{x:b4.bounds?.maxX??50,y:b4.bounds?.maxY??50},{x:b4.bounds?.minX??-50,y:b4.bounds?.maxY??50},{x:b4.bounds?.minX??-50,y:b4.bounds?.minY??-50}],strokeColor:"rgba(255,0,0,0.25)"}),x4&&x4.length>=2){let t55=x4.map(t56=>({x:t56.x,y:t56.y}));t55.push({...t55[0]}),v3.push({points:t55,strokeColor:"rgba(0, 136, 255, 0.95)"})}let S7=Mo2(b4),I4={points:[...b4.connections.flatMap(t55=>t55.pointsToConnect.map(e8=>({...e8,layer:To2(e8,b4.layerCount),label:`${t55.name} ${e8.pcb_port_id??""}`})))],rects:[...(b4.obstacles??[]).filter(t55=>!t55.isCopperPour).map(t55=>({...t55,fill:t55.layers?.includes("top")?"rgba(255,0,0,0.25)":t55.layers?.includes("bottom")?"rgba(0,0,255,0.25)":"rgba(255,0,0,0.25)",layer:wo2(t55,b4.layerCount),label:S7(t55)}))],lines:v3},P6=tk(b4),M5=[Wo2(I4,P6),t54,e7,n3,o6,i3,s6,r6,a3,c6,l7,_3,h3,d4,u6,p5?Wo2(I4,p5):null,m4,g4,f4,y3,this.solved?Wo2(I4,tk(this.originalSrj),Oo2(this.getOutputSimpleRouteJson())):null].filter(Boolean);return Wo2(...M5)}preview(){if(this.highDensityRouteSolver){let t54=[];for(let e7=this.highDensityRouteSolver.routes.length-1;e7>=0;e7--){let n3=this.highDensityRouteSolver.routes[e7];if(t54.push({points:n3.route.map(t55=>({x:t55.x,y:t55.y})),strokeColor:this.colorMap[n3.connectionName]}),t54.length>200)break}return{lines:t54}}return this.portPointPathingSolver?this.portPointPathingSolver.preview():this.netToPointPairsSolver?this.netToPointPairsSolver.visualize():this.escapeViaLocationSolver?this.escapeViaLocationSolver.visualize():this.preprocessSimpleRouteJsonSolver?this.preprocessSimpleRouteJsonSolver.visualize():{}}_getOutputHdRoutes(){return this.globalDrcForceImproveSolver?.getOutput()??this.traceWidthSolver?.getHdRoutesWithWidths()??this.traceSimplificationSolver?.simplifiedHdRoutes??this.highDensityStitchSolver.mergedHdRoutes}getOutputSimplifiedPcbTraces(){if(!this.solved||!this.highDensityRouteSolver)throw new Error("Cannot get output before solving is complete");let t54=[],e7=this._getOutputHdRoutes();for(let n3 of this.netToPointPairsSolver?.newConnections??[]){let o6=n3.netConnectionName??this.originalSrj.connections.find(t55=>t55.name===n3.name)?.netConnectionName,i3=e7.filter(t55=>t55.connectionName===n3.name);for(let e8=0;e8<i3.length;e8++){let s6=i3[e8],r6={type:"pcb_trace",pcb_trace_id:`${n3.name}_${e8}`,connection_name:o6??n3.rootConnectionName??n3.name,route:_o2(s6,this.srj.layerCount,{connectionPoints:n3.pointsToConnect,defaultViaHoleDiameter:this.viaHoleDiameter,obstacles:this.srj.obstacles,connMap:this.connMap})};t54.push(r6)}}return t54}getOutputSimpleRouteJson(){return{...this.originalSrj,traces:this.getOutputSimplifiedPcbTraces()}}},Cj=t54=>/\/solve\/?$/.test(t54)?t54.replace(/\/+$/,""):`${t54.replace(/\/+$/,"")}/solve`,Nj=(t54,e7,n3)=>{let o6=(t55=>{let e8=new Map;for(let n4 of t55.portPoints)n4.rootConnectionName&&!e8.has(n4.connectionName)&&e8.set(n4.connectionName,n4.rootConnectionName);return e8})(t54);return e7.map(t55=>({connectionName:t55.connectionName,rootConnectionName:t55.rootConnectionName??o6.get(t55.connectionName)??void 0,traceThickness:t55.traceThickness??n3.traceWidth,viaDiameter:t55.viaDiameter??n3.viaDiameter,route:(t55.route??[]).map(t56=>({x:t56.x,y:t56.y,z:t56.z,...t56.insideJumperPad?{insideJumperPad:!0}:{}})),vias:(t55.vias??[]).map(t56=>({x:t56.x,y:t56.y})),...t55.jumpers?{jumpers:t55.jumpers}:{}}))},Tj=(t54,e7)=>{if(t54.length===0)return null;let n3=Math.min(Math.max(e7,0),1),o6=(t54.length-1)*n3,i3=Math.floor(o6),s6=Math.ceil(o6),r6=t54[i3],a3=t54[s6];return i3===s6?r6:r6+(a3-r6)*(o6-i3)},wj=t54=>new Set(t54.portPoints.map(t55=>t55.connectionName)).size,Rj=t54=>!(wj(t54)<3)&&(t54.availableZ?.length??0)!==1,Ej=t54=>t54?.MULTI_HEAD_POLYLINE_SOLVER?"MultiHeadPolyLineIntraNodeSolver3":t54?.CLOSED_FORM_SINGLE_TRANSITION?"SingleTransitionIntraNodeSolver":t54?.CLOSED_FORM_TWO_TRACE_SAME_LAYER?"TwoCrossingRoutesHighDensitySolver":t54?.CLOSED_FORM_TWO_TRACE_TRANSITION_CROSSING?"SingleTransitionCrossingRouteSolver":t54?.HIGH_DENSITY_A01?"HighDensitySolverA01":t54?.HIGH_DENSITY_A03?"HighDensitySolverA03":"SingleHighDensityRouteSolver6_VertHorzLayer_FutureCost",Aj=t54=>{if(t54 instanceof ki2){let e8=Ej(t54.hyperParameters);return t54.cacheHit?`${e8} [cached]`:e8}if(t54 instanceof Oi2)return Ej(t54.hyperParameters);if(t54&&typeof t54=="object"&&"getSolverName"in t54&&typeof t54.getSolverName=="function")return t54.getSolverName();let e7=t54?.constructor;return typeof e7?.name=="string"?e7.name:"unknown"},Oj=t54=>t54.winningSolver?Aj(t54.winningSolver):Aj(t54),Lj=class extends Fo2{constructor({nodePortPoints:t54,colorMap:e7,connMap:n3,viaDiameter:o6,traceWidth:i3,obstacleMargin:s6,obstacles:r6,layerCount:a3,nodePfById:c6,hdCacheBaseUrl:l7,fetchImpl:h3}){super();__publicField(this,"unsolvedNodePortPoints");__publicField(this,"colorMap");__publicField(this,"connMap");__publicField(this,"viaDiameter");__publicField(this,"traceWidth");__publicField(this,"obstacleMargin");__publicField(this,"obstacles");__publicField(this,"layerCount");__publicField(this,"hdCacheBaseUrl");__publicField(this,"fetchImpl");__publicField(this,"nodePfById");__publicField(this,"routes",[]);__publicField(this,"nodeSolveMetadataById",new Map);__publicField(this,"launchedRemoteSolves",!1);__publicField(this,"solvedRoutesByNodeIndex",new Map);__publicField(this,"failedNodeResults",[]);__publicField(this,"remoteResponseMeasurements",[]);this.unsolvedNodePortPoints=t54,this.colorMap=e7??{},this.connMap=n3,this.viaDiameter=o6??.3,this.traceWidth=i3??.15,this.obstacleMargin=s6??.15,this.obstacles=r6??[],this.layerCount=a3??2,this.hdCacheBaseUrl=l7??"https://hd-cache.tscircuit.com",this.fetchImpl=(h3??globalThis.fetch).bind(globalThis),this.nodePfById=c6 instanceof Map?new Map(c6):new Map(Object.entries(c6??{})),this.pendingEffects=[],this.stats={localDirectNodeCount:0,localSolvedNodeCount:0,localFallbackNodeCount:0,remoteFallbackNodeCount:0,remoteRequestsStarted:0,remoteRequestsCompleted:0,remoteResponseSampleCount:0,remoteKOrderSampleCount:0,slowestRemoteResponseMs:null,slowestRemoteResponseNodeId:null,p50RemoteResponseMs:null,p50RemoteKOrder:null,p95RemoteKOrder:null,remoteSources:{}}}getSolverName(){return"Pipeline5HdCacheHighDensitySolver"}computeProgress(){return this.unsolvedNodePortPoints.length===0?1:this.nodeSolveMetadataById.size/this.unsolvedNodePortPoints.length}solveNodeLocally(t54,e7,n3={}){let o6=new Ks2({nodeWithPortPoints:t54,colorMap:this.colorMap,connMap:this.connMap,viaDiameter:this.viaDiameter,traceWidth:this.traceWidth,obstacleMargin:this.obstacleMargin,obstacles:this.obstacles,layerCount:this.layerCount});if(o6.solve(),o6.failed){let e8=o6.error??`Local intra-node solver failed for ${t54.capacityMeshNodeId}`,i6=wj(t54);return this.failedNodeResults.push({node:t54,error:n3.remoteFailure&&n3.resolution==="local-fallback"?`Remote solve failed (${n3.remoteFailure}); local fallback failed (${e8})`:e8}),void this.recordNodeSolveMetadata(t54,{status:"failed",resolution:"failed",solverType:Oj(o6),supervisorType:o6.getSolverName(),iterations:o6.iterations,pairCount:i6,routeCount:0,remoteAttempt:n3.resolution==="local-fallback"?{attempted:!0,endpoint:Cj(this.hdCacheBaseUrl),source:"error",durationMs:n3.remoteDurationMs,error:n3.remoteFailure??e8}:{attempted:!1},error:e8})}this.solvedRoutesByNodeIndex.set(e7,o6.solvedRoutes);let i3=wj(t54);this.recordNodeSolveMetadata(t54,{status:"solved",resolution:n3.resolution??"local",solverType:Oj(o6),supervisorType:o6.getSolverName(),iterations:o6.iterations,pairCount:i3,routeCount:o6.solvedRoutes.length,remoteAttempt:n3.resolution==="local-fallback"?{attempted:!0,endpoint:Cj(this.hdCacheBaseUrl),source:"error",durationMs:n3.remoteDurationMs,error:n3.remoteFailure}:{attempted:!1}}),n3.resolution==="local-fallback"?(this.stats.localFallbackNodeCount+=1,this.stats.remoteFallbackNodeCount+=1):this.stats.localDirectNodeCount+=1,this.stats.localSolvedNodeCount+=1}async solveNodeViaHdCache(t54,e7){let n3=Cj(this.hdCacheBaseUrl),o6={"content-type":"application/json"},i3={nodeWithPortPoints:t54},s6=JSON.stringify(i3),r6=Date.now(),a3,c6,l7,h3=null,d4=null;try{let i6=await this.fetchImpl(n3,{method:"POST",headers:o6,body:s6});if(a3=i6.status,c6=i6.ok,l7=await i6.text(),h3=Date.now()-r6,d4=l7?JSON.parse(l7):null,!i6.ok)throw new Error(d4?.message??l7??`hd-cache request failed with status ${i6.status}`);if(!d4?.ok||d4.routes===null)throw new Error(d4?.message??`hd-cache returned no routes for ${t54.capacityMeshNodeId}`);let u10=Nj(t54,d4.routes,{traceWidth:this.traceWidth,viaDiameter:this.viaDiameter});this.solvedRoutesByNodeIndex.set(e7,u10),this.recordNodeSolveMetadata(t54,{status:"solved",resolution:"remote",solverType:`hd-cache.tscircuit.com [${d4.source}]`,iterations:null,pairCount:wj(t54),routeCount:u10.length,remoteAttempt:{attempted:!0,endpoint:Cj(this.hdCacheBaseUrl),source:d4.source,durationMs:h3}}),this.recordRemoteSource(d4.source)}catch(u10){h3??(h3=Date.now()-r6);let p5=(t55=>t55 instanceof Error?t55.message:String(t55))(u10);this.recordFailedHdCacheRequest({nodeId:t54.capacityMeshNodeId,pairCount:wj(t54),failedAt:new Date().toISOString(),durationMs:h3,error:p5,url:n3,request:{method:"POST",headers:o6,body:s6,bodyJson:i3},response:a3!==void 0||c6!==void 0||l7!==void 0||d4!==null?{status:a3,ok:c6,text:l7,body:d4}:void 0}),this.recordRemoteSource("error"),this.solveNodeLocally(t54,e7,{resolution:"local-fallback",remoteFailure:p5,remoteDurationMs:h3})}finally{this.recordRemoteResponseMetrics(t54.capacityMeshNodeId,h3??Date.now()-r6,(u6=d4?.kOrder,typeof u6=="number"&&Number.isFinite(u6)?d4.kOrder:null)),this.stats.remoteRequestsCompleted+=1}var u6}launchRemoteSolves(){let t54=[];this.unsolvedNodePortPoints.forEach((e7,n3)=>{if(!Rj(e7))return void this.solveNodeLocally(e7,n3);let o6={name:`hd-cache:${e7.capacityMeshNodeId}`,promise:Promise.resolve()};o6.promise=this.solveNodeViaHdCache(e7,n3).finally(()=>{this.pendingEffects=this.pendingEffects?.filter(t55=>t55!==o6)}),t54.push(o6)}),this.pendingEffects=t54,this.stats.remoteRequestsStarted=t54.length}recordRemoteSource(t54){this.stats.remoteSources[t54]=(this.stats.remoteSources[t54]??0)+1}recordRemoteResponseMetrics(t54,e7,n3){this.remoteResponseMeasurements.push({nodeId:t54,durationMs:e7,kOrder:n3}),this.stats.remoteResponseSampleCount=this.remoteResponseMeasurements.length,this.stats.remoteKOrderSampleCount=this.remoteResponseMeasurements.filter(t55=>t55.kOrder!==null).length;let o6=null;for(let t55 of this.remoteResponseMeasurements)(!o6||t55.durationMs>o6.durationMs)&&(o6=t55);this.stats.slowestRemoteResponseMs=o6?.durationMs??null,this.stats.slowestRemoteResponseNodeId=o6?.nodeId??null;let i3=this.remoteResponseMeasurements.map(t55=>t55.durationMs).sort((t55,e8)=>t55-e8);this.stats.p50RemoteResponseMs=Tj(i3,.5);let s6=this.remoteResponseMeasurements.map(t55=>t55.kOrder).filter(t55=>t55!==null).sort((t55,e8)=>t55-e8);this.stats.p50RemoteKOrder=Tj(s6,.5),this.stats.p95RemoteKOrder=Tj(s6,.95)}recordFailedHdCacheRequest(t54){let e7=(()=>{if(typeof window>"u")return null;let t55=window;return Array.isArray(t55.__FAILED_HD_CACHE_REQUESTS)||(t55.__FAILED_HD_CACHE_REQUESTS=[]),t55.__FAILED_HD_CACHE_REQUESTS})();e7&&e7.push(t54)}recordNodeSolveMetadata(t54,e7){this.nodeSolveMetadataById.set(t54.capacityMeshNodeId,{...e7,node:t54,nodePf:this.nodePfById.get(t54.capacityMeshNodeId)??null})}ensureFailedNodeMetadata(){for(let t54 of this.failedNodeResults)this.nodeSolveMetadataById.has(t54.node.capacityMeshNodeId)||this.recordNodeSolveMetadata(t54.node,{status:"failed",resolution:"failed",solverType:"unknown",iterations:null,pairCount:wj(t54.node),routeCount:0,remoteAttempt:{attempted:Rj(t54.node),source:"error",error:t54.error},error:t54.error})}getVisibleRoutes(){if(this.solved)return this.routes;let t54=[];for(let e7=0;e7<this.unsolvedNodePortPoints.length;e7++)t54.push(...this.solvedRoutesByNodeIndex.get(e7)??[]);return t54}createNodeMarkerLabel(t54,e7){return["hd_node_marker",`node: ${t54}`,`status: ${e7.status}`,`resolution: ${e7.resolution}`,`solver: ${e7.solverType}`,...e7.supervisorType?[`supervisor: ${e7.supervisorType}`]:[],...e7.iterations!==null?[`iterations: ${e7.iterations}`]:[],`pairCount: ${e7.pairCount}`,`routes: ${e7.routeCount}`,`nodePf: ${e7.nodePf??"n/a"}`,"remoteAttempted: "+(e7.remoteAttempt.attempted?"yes":"no"),...e7.remoteAttempt.source?[`remoteSource: ${e7.remoteAttempt.source}`]:[],...e7.remoteAttempt.durationMs!==void 0?[`remoteDurationMs: ${e7.remoteAttempt.durationMs}`]:[],...e7.remoteAttempt.error?[`remoteError: ${e7.remoteAttempt.error}`]:[],`portPoints: ${e7.node.portPoints.length}`,...e7.error?[`error: ${e7.error}`]:[]].join(`
631
631
  `)}_step(){if(!this.launchedRemoteSolves)return this.launchedRemoteSolves=!0,void this.launchRemoteSolves();if(!((this.pendingEffects?.length??0)>0)){if(this.failedNodeResults.length>0){this.ensureFailedNodeMetadata();let t54=this.failedNodeResults[0];return this.failed=!0,void(this.error=`Failed to solve ${this.failedNodeResults.length} nodes via hd-cache. First failure: ${t54?.node.capacityMeshNodeId} (${t54?.error})`)}this.routes=[];for(let t54=0;t54<this.unsolvedNodePortPoints.length;t54++)this.routes.push(...this.solvedRoutesByNodeIndex.get(t54)??[]);this.solved=!0}}visualize(){let t54={lines:[],points:[],rects:[],circles:[]};for(let e7 of this.getVisibleRoutes()){let n3=Vo2(e7.route,e7.connectionName,this.colorMap[e7.connectionName]);for(let o6 of n3)t54.lines.push({points:o6.points,label:o6.connectionName,strokeColor:o6.z===0?o6.color:vo2(o6.color,.75),layer:`z${o6.z}`,strokeWidth:e7.traceThickness,strokeDash:o6.z!==0?"10, 5":void 0});for(let n4 of e7.vias)t54.circles.push({center:n4,layer:"z0,1",radius:e7.viaDiameter/2,fill:this.colorMap[e7.connectionName],label:`${e7.connectionName} via`})}for(let[e7,n3]of this.nodeSolveMetadataById){let o6=n3.node.center.x-n3.node.width/2,i3=n3.node.center.x+n3.node.width/2,s6=n3.node.center.y-n3.node.height/2,r6=n3.node.center.y+n3.node.height/2,a3=this.createNodeMarkerLabel(e7,n3),c6=n3.status==="solved"?"blue":"red",l7=n3.status==="solved"?.03:.08;if(t54.lines.push({points:[{x:o6,y:s6},{x:i3,y:s6}],layer:"hd_node_boundaries",strokeColor:c6,strokeDash:"6, 4",strokeWidth:l7,label:a3},{points:[{x:i3,y:s6},{x:i3,y:r6}],layer:"hd_node_boundaries",strokeColor:c6,strokeDash:"6, 4",strokeWidth:l7,label:a3},{points:[{x:i3,y:r6},{x:o6,y:r6}],layer:"hd_node_boundaries",strokeColor:c6,strokeDash:"6, 4",strokeWidth:l7,label:a3},{points:[{x:o6,y:r6},{x:o6,y:s6}],layer:"hd_node_boundaries",strokeColor:c6,strokeDash:"6, 4",strokeWidth:l7,label:a3}),n3.status==="solved")t54.points.push({x:n3.node.center.x,y:n3.node.center.y,color:c6,layer:"hd_node_markers",label:a3});else{t54.lines.push({points:[{x:0,y:0},{x:n3.node.center.x,y:n3.node.center.y}],layer:"hd_failed_node_guides",strokeColor:c6,strokeDash:"8, 6",strokeWidth:.05,label:a3});let e8=Math.max(n3.node.width,1.2),o7=Math.max(n3.node.height,1.2),i6=e8/2,s7=o7/2;t54.rects.push({center:n3.node.center,layer:"hd_node_markers",width:e8,height:o7,fill:"rgba(255, 0, 0, 0.3)",stroke:c6,label:a3}),t54.circles.push({center:n3.node.center,radius:Math.max(.6*Math.max(e8,o7),1.1),layer:"hd_node_markers",fill:"rgba(255, 0, 0, 0.08)",stroke:c6,label:a3}),t54.lines.push({points:[{x:n3.node.center.x-i6,y:n3.node.center.y-s7},{x:n3.node.center.x+i6,y:n3.node.center.y+s7}],layer:"hd_node_markers",strokeColor:c6,strokeWidth:.16,label:a3},{points:[{x:n3.node.center.x-i6,y:n3.node.center.y+s7},{x:n3.node.center.x+i6,y:n3.node.center.y-s7}],layer:"hd_node_markers",strokeColor:c6,strokeWidth:.16,label:a3})}}return t54}},Dj2=class extends Mj{constructor(t54,e7={}){super(t54,{...e7,maxNodeDimension:e7.maxNodeDimension??7,maxNodeRatio:e7.maxNodeRatio??4});__publicField(this,"hdCacheBaseUrl");__publicField(this,"hdCacheFetch");this.hdCacheBaseUrl=e7.hdCacheBaseUrl??"https://hd-cache.tscircuit.com",this.hdCacheFetch=e7.hdCacheFetch,this.replaceHighDensityPipelineStep()}replaceHighDensityPipelineStep(){let t54=this.pipelineDef.findIndex(t55=>t55.solverName==="highDensityRouteSolver");if(t54===-1)throw new Error("Pipeline4 highDensityRouteSolver step is missing");this.pipelineDef[t54]={...this.pipelineDef[t54],solverClass:Lj,getConstructorParams:t55=>{let e7=t55.uniformPortDistributionSolver?.getOutput()??[],n3=t55.portPointPathingSolver?.getOutput().nodesWithPortPoints??[],o6=e7.length>0?e7:n3;return t55.highDensityNodePortPoints=structuredClone(o6),[{nodePortPoints:o6,nodePfById:new Map((t55.portPointPathingSolver?.getOutput().inputNodeWithPortPoints??[]).map(e8=>[e8.capacityMeshNodeId,t55.portPointPathingSolver?.computeNodePf(e8)??null])),colorMap:t55.colorMap,connMap:t55.connMap,viaDiameter:t55.viaDiameter,traceWidth:t55.minTraceWidth,obstacleMargin:t55.srj.defaultObstacleMargin??.15,obstacles:t55.srj.obstacles,layerCount:t55.srj.layerCount,hdCacheBaseUrl:t55.hdCacheBaseUrl,fetchImpl:t55.hdCacheFetch}]}}}async stepAsync(){if(this.solved||this.failed)return;this.step();let t54=(t55=>{let e7=[],n3=t55;for(;n3;)e7.push(n3),n3=n3.activeSubSolver;for(let t56=e7.length-1;t56>=0;t56--){let n4=e7[t56]?.pendingEffects?.filter(Boolean)??[];if(n4.length>0)return n4}return[]})(this);t54.length!==0&&(await Promise.race(t54.map(t55=>t55.promise.then(()=>t55.name,()=>t55.name))),this.solved||this.failed||this.step())}async solveAsync(){let t54=Date.now();for(;!this.solved&&!this.failed;)await this.stepAsync();this.timeToSolve=Date.now()-t54}solve(){throw new Error("AutoroutingPipelineSolver5_HdCache requires async execution. Use solveAsync() or stepAsync().")}};var kj=Math.PI/2;var dY=.1,uY=.15,pY=dY+uY,mY=3*pY/4;var UY=c4(w3(),1);var v$=(Number.POSITIVE_INFINITY,1e-9);var V$=(new Int32Array(0),t54=>(t54.ccwRotationDegrees??0)*Math.PI/180);function hB(t54){if(t54.length===0)return{minX:0,maxX:0,minY:0,maxY:0};let e7=Number.POSITIVE_INFINITY,n3=Number.NEGATIVE_INFINITY,o6=Number.POSITIVE_INFINITY,i3=Number.NEGATIVE_INFINITY;for(let s6 of t54){let t55=Me2(s6);e7=Math.min(e7,t55.minX),n3=Math.max(n3,t55.maxX),o6=Math.min(o6,t55.minY),i3=Math.max(i3,t55.maxY)}return{minX:e7,maxX:n3,minY:o6,maxY:i3}}function dB(t54){let e7=[...t54].sort((t55,e8)=>t55-e8),n3=[];for(let t55 of e7){let e8=n3[n3.length-1];(e8===void 0||Math.abs(t55-e8)>.001)&&n3.push(t55)}return n3}function uB(t54){let e7=Math.min(...t54),n3=Math.max(...t54);return!(e7<=0)&&n3/e7<=1.01}function pB(t54){if(!(function(t55){return uB(t55.map(t56=>t56.width))&&uB(t55.map(t56=>t56.height))})(t54)||!(function(t55){return t55.every(t56=>{let e8=Math.min(t56.width,t56.height),n4=Math.max(t56.width,t56.height);return!(e8<=0)&&n4/e8<=1.5})})(t54))return!1;let e7=dB(t54.map(t55=>t55.center.y)),n3=dB(t54.map(t55=>t55.center.x)),o6=e7.length,i3=n3.length;if(o6<3||i3<3)return!1;let s6=o6*i3;return!((s6>0?t54.length/s6:0)<.5)&&!!(function(t55,e8,n4){if(e8.length<3||n4.length<3)return!1;let o7=new Set(e8.slice(1,-1)),i6=new Set(n4.slice(1,-1)),s7=0;for(let e10 of t55)o7.has(e10.center.y)&&i6.has(e10.center.x)&&(s7+=1);return s7>=1})(t54,e7,n3)}function mB(t54){let e7=Math.min(t54.width,t54.height),n3=Math.max(t54.width,t54.height);return e7>0&&n3/e7>=1.5}function gB({perimeterPadObstacles:t54,thermalPadObstacles:e7}){if(e7.length===0)return!0;if(e7.length>4)return!1;let n3=hB(t54),o6=n3.maxX-n3.minX,i3=n3.maxY-n3.minY,s6=n3.minX+.2*o6,r6=n3.maxX-.2*o6,a3=n3.minY+.2*i3,c6=n3.maxY-.2*i3,l7=Math.min(...t54.map(t55=>Math.min(t55.width,t55.height)));return e7.every(t55=>{let e8=Math.min(t55.width,t55.height);return t55.center.x>=s6&&t55.center.x<=r6&&t55.center.y>=a3&&t55.center.y<=c6&&e8>l7})}function fB(t54){if(t54.length<12||t54.length>32)return!1;let{counts:e7,maxNearestSideRatio:n3}=(function(t55){let e8=hB(t55),n4=e8.maxX-e8.minX,o6=e8.maxY-e8.minY,i3={top:0,right:0,bottom:0,left:0};if(n4<=0||o6<=0)return{counts:i3,maxNearestSideRatio:1};let s6=0;for(let r6 of t55){let t56=r6.width>r6.height,a3=[{side:"top",distance:Math.abs(r6.center.y-e8.minY),axisSpan:o6,orientationMatches:!t56},{side:"right",distance:Math.abs(e8.maxX-r6.center.x),axisSpan:n4,orientationMatches:t56},{side:"bottom",distance:Math.abs(e8.maxY-r6.center.y),axisSpan:o6,orientationMatches:!t56},{side:"left",distance:Math.abs(r6.center.x-e8.minX),axisSpan:n4,orientationMatches:t56}].filter(t57=>t57.orientationMatches).sort((t57,e10)=>t57.distance-e10.distance)[0];i3[a3.side]+=1,s6=Math.max(s6,a3.distance/a3.axisSpan)}return{counts:i3,maxNearestSideRatio:s6}})(t54);return e7.top>=3&&e7.right>=3&&e7.bottom>=3&&e7.left>=3&&n3<=.25}function yB(t54){return{perimeterPadObstacles:(function(t55){return t55.filter(mB)})(t54),thermalPadObstacles:t54.filter(t55=>!mB(t55))}}function _B(t54){let e7=Math.min(...t54),n3=Math.max(...t54);return!(e7<=0)&&n3/e7<=1.01}function bB(t54,e7){let n3=0,o6=Number.POSITIVE_INFINITY;for(let i3=0;i3<e7.length;i3++){let s6=Math.abs(t54-e7[i3]);s6<o6&&(n3=i3,o6=s6)}return n3}function xB({memberObstacles:t54,inputSrj:e7}){if(!(function(t55){return _B(t55.map(t56=>t56.width))&&_B(t55.map(t56=>t56.height))})(t54))return!1;let n3=dB(t54.map(t55=>t55.center.y)),o6=dB(t54.map(t55=>t55.center.x));if(!(n3.length===2&&o6.length>=4||o6.length===2&&n3.length>=4))return!1;let i3=(function({memberObstacles:t55,rowAxisValues:e8,columnAxisValues:n4}){if(e8.length===2&&n4.length>=4){let n5=[[],[]];for(let o7 of t55)n5[bB(o7.center.y,e8)].push(o7);return Math.min(...n5[1].map(t56=>t56.center.y-t56.height/2))-Math.max(...n5[0].map(t56=>t56.center.y+t56.height/2))}if(n4.length===2&&e8.length>=4){let e10=[[],[]];for(let o7 of t55)e10[bB(o7.center.x,n4)].push(o7);return Math.min(...e10[1].map(t56=>t56.center.x-t56.width/2))-Math.max(...e10[0].map(t56=>t56.center.x+t56.width/2))}return null})({memberObstacles:t54,rowAxisValues:n3,columnAxisValues:o6});return i3===null?!1:i3>2*(Eo2(e7).padDiameter+(e7.defaultObstacleMargin??.15))}var _a6,_b2,_c3,_d2,vB=[(_a6=class{constructor(t54){__publicField(this,"params");__publicField(this,"componentKind",_a6.componentKind);this.params=t54}static isMatch({memberObstacles:t54}){return(function(t55){let{perimeterPadObstacles:e7,thermalPadObstacles:n3}=yB(t55);return n3.length!==0&&!!fB(e7)&&gB({perimeterPadObstacles:e7,thermalPadObstacles:n3})})(t54)}},__publicField(_a6,"componentKind","qfp_thermalpad"),_a6),(_b2=class{constructor(t54){__publicField(this,"params");__publicField(this,"componentKind",_b2.componentKind);this.params=t54}static isMatch({memberObstacles:t54}){return(function(t55){let{perimeterPadObstacles:e7,thermalPadObstacles:n3}=yB(t55);return!(n3.length>0)&&!!gB({perimeterPadObstacles:e7,thermalPadObstacles:n3})&&fB(e7)})(t54)}},__publicField(_b2,"componentKind","qfp"),_b2),(_c3=class{constructor(t54){__publicField(this,"params");__publicField(this,"componentKind",_c3.componentKind);this.params=t54}static isMatch(t54){return xB(t54)}},__publicField(_c3,"componentKind","soic"),_c3),(_d2=class{constructor(t54){__publicField(this,"params");__publicField(this,"componentKind",_d2.componentKind);this.params=t54}static isMatch({memberObstacles:t54}){return pB(t54)}},__publicField(_d2,"componentKind","bga"),_d2)];function SB(t54){return(function(t55){for(let e7 of vB)if(e7.isMatch(t55))return new e7(t55);return null})(t54)?.componentKind??null}var IB=class extends Tt2{constructor({inputSrj:t54}){super();__publicField(this,"inputSrj");__publicField(this,"initialized",!1);__publicField(this,"groupedComponentObstacles",{});__publicField(this,"groupedComponentKinds",{});__publicField(this,"unprocessedComponentIds",[]);__publicField(this,"detectedComponents",[]);__publicField(this,"currentComponentId",null);__publicField(this,"currentMemberObstacles",[]);__publicField(this,"output",null);this.inputSrj=t54}getConstructorParams(){return[{inputSrj:this.inputSrj}]}_step(){this.initialized?this.output?this.solved=!0:this.currentComponentId!==null||this.unprocessedComponentIds.length>0?this.processNextComponent():(this.finalizeOutput(),this.solved=!0):this.initializeDetectionState()}getOutput(){if(!this.output)throw new Error("ComponentDetectionSolver has not solved yet");return this.output}visualize(){let t54=[];t54.push(...this.inputSrj.obstacles.filter(t55=>!t55.componentId).map(t55=>({center:t55.center,width:t55.width,height:t55.height,fill:"rgba(120, 120, 120, 0.10)",stroke:"rgba(120, 120, 120, 0.40)",label:t55.obstacleId,layer:t55.layers.join(","),step:0})));let e7=new Set(this.detectedComponents.map(t55=>t55.componentId));for(let n3 of this.inputSrj.obstacles){if(!n3.componentId||e7.has(n3.componentId))continue;let o6=n3.componentId===this.currentComponentId,i3=So2(n3.componentId),s6=this.groupedComponentKinds[n3.componentId];t54.push({center:n3.center,width:n3.width,height:n3.height,fill:vo2(i3,o6?.55:.82),stroke:vo2(i3,o6?.1:.45),label:s6?`${n3.componentId} ${s6.toUpperCase()}`:n3.componentId,layer:n3.layers.join(","),step:o6?1:0})}for(let e8 of this.detectedComponents){let n3=So2(e8.componentId);t54.push({center:{x:(e8.bounds.minX+e8.bounds.maxX)/2,y:(e8.bounds.minY+e8.bounds.maxY)/2},width:e8.bounds.maxX-e8.bounds.minX,height:e8.bounds.maxY-e8.bounds.minY,fill:vo2(n3,.88),stroke:vo2(n3,.1),label:`${e8.componentId} ${e8.componentKind.toUpperCase()} region`,step:2})}return{title:this.getVisualizationTitle(),rects:t54,lines:[],points:[],circles:[]}}preview(){return this.visualize()}initializeDetectionState(){this.initialized=!0,this.groupedComponentKinds={},this.groupedComponentObstacles=this.groupObstaclesByComponentId({obstacles:this.inputSrj.obstacles}),this.unprocessedComponentIds=Object.keys(this.groupedComponentObstacles).sort(),this.detectedComponents=[],this.currentComponentId=null,this.currentMemberObstacles=[],this.output=null}processNextComponent(){if(!this.currentComponentId){let t54=this.unprocessedComponentIds.shift();return t54?(this.currentComponentId=t54,void(this.currentMemberObstacles=this.groupedComponentObstacles[t54]??[])):(this.currentComponentId=null,void(this.currentMemberObstacles=[]))}if(this.currentMemberObstacles.length===0)return this.currentComponentId=null,void(this.currentMemberObstacles=[]);this.detectedComponents.push(this.createDetectedComponent({componentId:this.currentComponentId,componentKind:this.groupedComponentKinds[this.currentComponentId],memberObstacles:this.currentMemberObstacles})),this.currentComponentId=null,this.currentMemberObstacles=[]}finalizeOutput(){this.output=this.detectedComponents.map(t54=>({...t54,bounds:{...t54.bounds}})),this.stats={initialized:this.initialized,totalComponentCount:Object.keys(this.groupedComponentObstacles).length,detectedComponentCount:this.detectedComponents.length,detectedBgaComponentCount:this.detectedComponents.filter(t54=>t54.componentKind==="bga").length,detectedQfpComponentCount:this.detectedComponents.filter(t54=>t54.componentKind==="qfp").length,detectedQfpComponentIds:this.detectedComponents.filter(t54=>t54.componentKind==="qfp").map(t54=>t54.componentId),detectedQfpThermalPadComponentCount:this.detectedComponents.filter(t54=>t54.componentKind==="qfp_thermalpad").length,detectedQfpThermalPadComponentIds:this.detectedComponents.filter(t54=>t54.componentKind==="qfp_thermalpad").map(t54=>t54.componentId),detectedSoicComponentCount:this.detectedComponents.filter(t54=>t54.componentKind==="soic").length,detectedSoicComponentIds:this.detectedComponents.filter(t54=>t54.componentKind==="soic").map(t54=>t54.componentId),remainingComponentCount:this.unprocessedComponentIds.length,hasActiveComponent:this.currentComponentId!==null}}groupObstaclesByComponentId({obstacles:t54}){var _a516;let e7={},n3={};for(let n4 of t54)n4.componentId&&(e7[_a516=n4.componentId]??(e7[_a516]=[]),e7[n4.componentId].push(n4));let o6=Object.entries(e7).filter(([t55,e8])=>{let o7=SB({memberObstacles:e8,inputSrj:this.inputSrj});return!!o7&&(n3[t55]=o7,!0)});return this.groupedComponentKinds=n3,Object.fromEntries(o6)}createDetectedComponent({componentId:t54,componentKind:e7,memberObstacles:n3}){return{componentId:t54,componentKind:e7,bounds:{__type:"rect",...hB(n3)}}}getVisualizationTitle(){let t54=Object.keys(this.groupedComponentObstacles).length||new Set(this.inputSrj.obstacles.map(t55=>t55.componentId).filter(t55=>!!t55)).size,e7=this.detectedComponents.length;return this.initialized?this.output||this.solved?`Component Detection: done ${e7}/${t54}`:this.currentComponentId!==null||this.unprocessedComponentIds.length>0?`Component Detection: ${e7}/${t54} processed`:`Component Detection: finalizing ${e7}/${t54}`:"Component Detection: setup"}},PB=t54=>t54.componentId&&t54.obstacleId?`${t54.componentId}
632
632
  ${t54.obstacleId}`:t54.componentId??t54.obstacleId??"obstacle",MB=class extends Rt2{constructor(){super(...arguments);__publicField(this,"rectBoundsComponentDetection");__publicField(this,"pipelineDef",[wt2("rectBoundsComponentDetection",IB,t54=>[{inputSrj:t54.inputProblem.inputSrj}])])}getConstructorParams(){return[this.inputProblem]}getOutput(){let t54=this.getStageOutput("rectBoundsComponentDetection");if(!t54)throw new Error("ComponentDetectionSolver has not solved yet");return t54}initialVisualize(){let{bounds:t54}=this.inputProblem.inputSrj;return{title:"Component Detection: board and grouped component pads",rects:[{center:{x:(t54.minX+t54.maxX)/2,y:(t54.minY+t54.maxY)/2},width:t54.maxX-t54.minX,height:t54.maxY-t54.minY,fill:"rgba(0, 0, 0, 0)",stroke:"rgba(40, 40, 40, 0.7)",label:"Board bounds",step:0},...this.inputProblem.inputSrj.obstacles.map(t55=>{let e7=t55.componentId?So2(t55.componentId):null;return{center:t55.center,width:t55.width,height:t55.height,fill:e7?vo2(e7,.72):"rgba(120, 120, 120, 0.10)",stroke:e7?vo2(e7,.28):"rgba(120, 120, 120, 0.40)",label:PB(t55),layer:t55.layers.join(","),step:t55.componentId?1:0}})],lines:[],points:[],circles:[]}}},_a7,CB=(_a7=class{static register(e7){_a7.generators.set(e7.componentKind,e7)}static create(e7){let n3=e7.detectedComponent.componentKind,o6=_a7.generators.get(n3);if(!o6)throw new Error(`No topology generator registered for component kind "${n3}"`);return new o6(e7)}},__publicField(_a7,"generators",new Map),_a7),NB=t54=>[t54.obstacle.obstacleId??t54.obstacle.componentId??"obstacle",t54.start.x.toFixed(4),t54.start.y.toFixed(4),t54.end.x.toFixed(4),t54.end.y.toFixed(4),t54.expansionDirection.x,t54.expansionDirection.y].join(":"),TB=t54=>{let e7=0;for(let n3 of t54)e7=31*e7+n3.charCodeAt(0)>>>0;return e7},wB=(t54,e7)=>`hsla(${TB(NB(t54))%360},72%,36%,${e7})`,RB=t54=>{let e7=t54.expansionDirection;return e7.x<0?"left":e7.x>0?"right":e7.y<0?"bottom":"top"},EB=t54=>({x:(t54.start.x+t54.end.x)/2,y:(t54.start.y+t54.end.y)/2}),AB=t54=>{let e7=/^bga-gapfill-(\d+)-/.exec(t54.capacityMeshNodeId);return e7?Number.parseInt(e7[1],10):null},OB=(t54,e7)=>{let n3=EB(t54),o6=EB(e7),i3=n3.y-o6.y;if(Math.abs(i3)>1e-6)return i3;let s6=n3.x-o6.x;return Math.abs(s6)>1e-6?s6:NB(t54).localeCompare(NB(e7))},LB=t54=>{let e7=[...t54].sort(OB),n3=[],o6=e7.shift();for(;o6&&(n3.push(o6),e7.length!==0);){let t55=EB(o6),n4=0,i3=Number.POSITIVE_INFINITY;for(let o7=0;o7<e7.length;o7++){let s6=e7[o7],r6=EB(s6),a3=(r6.x-t55.x)**2+(r6.y-t55.y)**2;a3<i3-1e-9?(i3=a3,n4=o7):Math.abs(a3-i3)<=1e-9&&OB(s6,e7[n4])<0&&(n4=o7)}o6=e7.splice(n4,1)[0]}return n3},DB=(t54,e7)=>{let n3=NB(t54),o6=e7.findIndex(t55=>NB(t55)===n3);return o6>=0?`E${o6+1}`:`E${TB(n3).toString(36).slice(0,4)}`},zB=t54=>t54.flatMap(t55=>{let e7=ze2(t55);return[{obstacle:t55,start:{x:e7.minX,y:e7.minY},end:{x:e7.minX,y:e7.maxY},expansionDirection:{x:-1,y:0}},{obstacle:t55,start:{x:e7.maxX,y:e7.minY},end:{x:e7.maxX,y:e7.maxY},expansionDirection:{x:1,y:0}},{obstacle:t55,start:{x:e7.minX,y:e7.minY},end:{x:e7.maxX,y:e7.minY},expansionDirection:{x:0,y:-1}},{obstacle:t55,start:{x:e7.minX,y:e7.maxY},end:{x:e7.maxX,y:e7.maxY},expansionDirection:{x:0,y:1}}]}),kB=.001,FB=.001,jB=class extends Tt2{constructor(t54){super();__publicField(this,"inputProblem");__publicField(this,"meshIndex");__publicField(this,"allEdges",[]);__publicField(this,"queueEdges",[]);__publicField(this,"disconnectedEdges",[]);__publicField(this,"currentEdge",null);__publicField(this,"lastSearchBounds",null);__publicField(this,"lastCandidateMeshNodes",[]);__publicField(this,"lastMatchedMeshNode",null);this.inputProblem=t54}_setup(){let t54=Math.max(this.inputProblem.meshNodes.length,1);this.meshIndex=new Ot2(t54);for(let t55 of this.inputProblem.meshNodes){let e8=ze2(t55);this.meshIndex.add(e8.minX,e8.minY,e8.maxX,e8.maxY)}this.meshIndex.finish();let e7=zB(this.inputProblem.unmarkedComponentObstacles);this.queueEdges=e7,this.allEdges=LB(e7),this.currentEdge=null,this.lastSearchBounds=null,this.lastCandidateMeshNodes=[],this.lastMatchedMeshNode=null}_step(){let t54=this.queueEdges.shift();if(!t54)return this.currentEdge=null,this.lastSearchBounds=null,this.lastCandidateMeshNodes=[],this.lastMatchedMeshNode=null,void(this.solved=!0);this.currentEdge=t54,this.lastMatchedMeshNode=null;let e7=Math.abs(t54.start.x-t54.end.x)<=kB,n3=e7?{minX:t54.start.x-FB,maxX:t54.start.x+FB,minY:Math.min(t54.start.y,t54.end.y),maxY:Math.max(t54.start.y,t54.end.y)}:{minX:Math.min(t54.start.x,t54.end.x),maxX:Math.max(t54.start.x,t54.end.x),minY:t54.start.y-FB,maxY:t54.start.y+FB};this.lastSearchBounds=n3;let o6=this.meshIndex.search(n3.minX,n3.minY,n3.maxX,n3.maxY);this.lastCandidateMeshNodes=o6.map(t55=>this.inputProblem.meshNodes[t55]);let i3=!1;for(let n4 of o6){let o7=this.inputProblem.meshNodes[n4],s6=ze2(o7);if(e7){if(!(Math.min(s6.maxY,Math.max(t54.start.y,t54.end.y))-Math.max(s6.minY,Math.min(t54.start.y,t54.end.y))>kB))continue;if(t54.expansionDirection.x===-1&&Math.abs(s6.maxX-t54.start.x)<=kB){i3=!0,this.lastMatchedMeshNode=o7;break}if(t54.expansionDirection.x===1&&Math.abs(s6.minX-t54.start.x)<=kB){i3=!0,this.lastMatchedMeshNode=o7;break}continue}if(Math.min(s6.maxX,Math.max(t54.start.x,t54.end.x))-Math.max(s6.minX,Math.min(t54.start.x,t54.end.x))>kB){if(t54.expansionDirection.y===-1&&Math.abs(s6.maxY-t54.start.y)<=kB){i3=!0,this.lastMatchedMeshNode=o7;break}if(t54.expansionDirection.y===1&&Math.abs(s6.minY-t54.start.y)<=kB){i3=!0,this.lastMatchedMeshNode=o7;break}}}i3||this.disconnectedEdges.push(t54)}getOutput(){return this.disconnectedEdges}visualize(){let t54=this.disconnectedEdges,e7=this.allEdges.length>0?this.allEdges:[...t54,...this.currentEdge?[this.currentEdge]:[]],n3=this.currentEdge?wB(this.currentEdge,.88):"rgba(40,40,40,0.4)",o6=this.inputProblem.meshNodes.map(t55=>({...Ya2(t55,{rectMargin:.01}),fill:t55._containsObstacle?"rgba(120,120,120,0.18)":"rgba(120,120,120,0.08)",stroke:t55._containsObstacle?"rgba(120,120,120,0.42)":"rgba(120,120,120,0.24)"})),i3=this.lastSearchBounds&&this.currentEdge?[{center:(s6=this.lastSearchBounds,{x:(s6.minX+s6.maxX)/2,y:(s6.minY+s6.maxY)/2}),width:this.lastSearchBounds.maxX-this.lastSearchBounds.minX,height:this.lastSearchBounds.maxY-this.lastSearchBounds.minY,fill:wB(this.currentEdge,.1),stroke:wB(this.currentEdge,.36),label:[DB(this.currentEdge,e7),"search band"].join(" ")}]:[];var s6;let r6=this.lastCandidateMeshNodes.map(t55=>({...Ya2(t55,{rectMargin:.018}),fill:t55===this.lastMatchedMeshNode?"rgba(0,180,90,0.24)":this.currentEdge?wB(this.currentEdge,.16):"rgba(80,120,160,0.16)",stroke:t55===this.lastMatchedMeshNode?"rgba(0,150,80,0.88)":n3,label:[t55===this.lastMatchedMeshNode?"matched":"candidate",t55.capacityMeshNodeId,`z:${t55.availableZ.join(",")}`].join(`
633
633
  `)})),a3=this.inputProblem.unmarkedComponentObstacles.map(t55=>({center:t55.center,width:t55.width,height:t55.height,fill:"rgba(160,160,160,0.10)",stroke:"rgba(160,160,160,0.40)",label:t55.obstacleId??t55.componentId??"obstacle"})),c6=t54.map(t55=>({points:[t55.start,t55.end],strokeColor:wB(t55,.14),strokeWidth:.01,strokeDash:"5 4",label:[DB(t55,e7),RB(t55),"disconnected"].join(" ")})),l7=[],h3=[];if(this.currentEdge){let t55=EB(this.currentEdge);l7.push({points:[this.currentEdge.start,this.currentEdge.end],strokeColor:wB(this.currentEdge,1),strokeWidth:.06,label:[DB(this.currentEdge,e7),RB(this.currentEdge),"checking"].join(" ")},{points:[t55,{x:t55.x+.16*this.currentEdge.expansionDirection.x,y:t55.y+.16*this.currentEdge.expansionDirection.y}],strokeColor:wB(this.currentEdge,.82),strokeWidth:.02,strokeDash:"3 3"}),h3.push({...t55,color:wB(this.currentEdge,1),label:DB(this.currentEdge,e7)})}return{rects:[...o6,...i3,...r6,...a3],lines:[...c6,...l7],points:h3}}},YB=.001,XB=.001,$B=1e-6,BB=class extends Tt2{constructor(t54){super();__publicField(this,"inputProblem");__publicField(this,"meshIndex");__publicField(this,"meshBounds");__publicField(this,"expandedNodes",[]);this.inputProblem=t54}_setup(){let t54=Math.max(this.inputProblem.meshNodes.length,1);this.meshIndex=new Ot2(t54);let e7=Number.POSITIVE_INFINITY,n3=Number.NEGATIVE_INFINITY,o6=Number.POSITIVE_INFINITY,i3=Number.NEGATIVE_INFINITY;for(let t55 of this.inputProblem.meshNodes){let s6=ze2(t55);this.meshIndex.add(s6.minX,s6.minY,s6.maxX,s6.maxY),e7=Math.min(e7,s6.minX),n3=Math.max(n3,s6.maxX),o6=Math.min(o6,s6.minY),i3=Math.max(i3,s6.maxY)}this.meshIndex.finish(),this.meshBounds=this.inputProblem.meshNodes.length?{minX:e7,maxX:n3,minY:o6,maxY:i3}:{minX:0,maxX:0,minY:0,maxY:0}}getObstacleAvailableZ(t54){return t54.zLayers??t54.layers.map(t55=>Co2(t55,this.inputProblem.layerCount))}getSharedOverlapArea(t54,e7){if(!t54.availableZ.some(t55=>e7.availableZ.includes(t55)))return 0;let n3=ze2(t54),o6=ze2(e7),i3=Math.min(n3.maxX,o6.maxX)-Math.max(n3.minX,o6.minX),s6=Math.min(n3.maxY,o6.maxY)-Math.max(n3.minY,o6.minY);return i3<=$B||s6<=$B?0:i3*s6}getNodeObstacleOverlapArea(t54,e7){let n3=this.getObstacleAvailableZ(e7);if(!t54.availableZ.some(t55=>n3.includes(t55)))return 0;let o6=ze2(t54),i3=ze2(e7),s6=Math.min(o6.maxX,i3.maxX)-Math.max(o6.minX,i3.minX),r6=Math.min(o6.maxY,i3.maxY)-Math.max(o6.minY,i3.minY);return s6<=$B||r6<=$B?0:s6*r6}getClosestMeshNode(t54,e7){let n3=Math.abs(t54.start.x-t54.end.x)<=YB,o6=this.getObstacleAvailableZ(t54.obstacle),i3=n3?t54.expansionDirection.x<0?{minX:this.meshBounds.minX,maxX:t54.start.x,minY:Math.min(t54.start.y,t54.end.y)-XB,maxY:Math.max(t54.start.y,t54.end.y)+XB}:{minX:t54.start.x,maxX:this.meshBounds.maxX,minY:Math.min(t54.start.y,t54.end.y)-XB,maxY:Math.max(t54.start.y,t54.end.y)+XB}:t54.expansionDirection.y<0?{minX:Math.min(t54.start.x,t54.end.x)-XB,maxX:Math.max(t54.start.x,t54.end.x)+XB,minY:this.meshBounds.minY,maxY:t54.start.y}:{minX:Math.min(t54.start.x,t54.end.x)-XB,maxX:Math.max(t54.start.x,t54.end.x)+XB,minY:t54.start.y,maxY:this.meshBounds.maxY},s6=this.meshIndex.search(i3.minX,i3.minY,i3.maxX,i3.maxY),r6=null,a3=Number.POSITIVE_INFINITY,c6=[...s6.map(t55=>this.inputProblem.meshNodes[t55]),...e7];for(let e8 of c6){if(e8._containsObstacle||!e8.availableZ.some(t55=>o6.includes(t55)))continue;let i6=ze2(e8);if((n3?Math.min(Math.max(t54.start.y,t54.end.y),i6.maxY)-Math.max(Math.min(t54.start.y,t54.end.y),i6.minY):Math.min(Math.max(t54.start.x,t54.end.x),i6.maxX)-Math.max(Math.min(t54.start.x,t54.end.x),i6.minX))<=YB)continue;let s7=n3?t54.expansionDirection.x<0?t54.start.x-i6.maxX:i6.minX-t54.start.x:t54.expansionDirection.y<0?t54.start.y-i6.maxY:i6.minY-t54.start.y;s7<YB||s7>=a3||(a3=s7,r6=e8)}return r6}createExpandedNode(t54,e7,n3){let o6=ze2(e7),i3=this.getObstacleAvailableZ(t54.obstacle);if(Math.abs(t54.start.x-t54.end.x)<=YB){let s7=Math.max(Math.min(t54.start.y,t54.end.y),o6.minY),r7=Math.min(Math.max(t54.start.y,t54.end.y),o6.maxY),a4=t54.expansionDirection.x<0?o6.maxX:t54.start.x,c7=t54.expansionDirection.x<0?t54.start.x:o6.minX;return c7-a4<=YB||r7-s7<=YB?null:{capacityMeshNodeId:`bga-gapfill-${n3}-${t54.obstacle.obstacleId??"no-obstacle"}-${e7.capacityMeshNodeId}`,center:{x:(a4+c7)/2,y:(s7+r7)/2},width:c7-a4,height:r7-s7,layer:`z${i3.join(",")}`,availableZ:i3}}let s6=Math.max(Math.min(t54.start.x,t54.end.x),o6.minX),r6=Math.min(Math.max(t54.start.x,t54.end.x),o6.maxX),a3=t54.expansionDirection.y<0?o6.maxY:t54.start.y,c6=t54.expansionDirection.y<0?t54.start.y:o6.minY;return r6-s6<=YB||c6-a3<=YB?null:{capacityMeshNodeId:`bga-gapfill-${n3}-${t54.obstacle.obstacleId??"no-obstacle"}-${e7.capacityMeshNodeId}`,center:{x:(s6+r6)/2,y:(a3+c6)/2},width:r6-s6,height:c6-a3,layer:`z${i3.join(",")}`,availableZ:i3}}overlapsExistingGeometry(t54,e7){for(let e8 of this.inputProblem.meshNodes)if(this.getSharedOverlapArea(t54,e8)>0)return!0;for(let n3 of e7)if(this.getSharedOverlapArea(t54,n3)>0)return!0;for(let e8 of this.inputProblem.edgesWithObstacle)if(this.getNodeObstacleOverlapArea(t54,e8.obstacle)>0)return!0;return!1}_step(){let t54=[];for(let[e7,n3]of this.inputProblem.edgesWithObstacle.entries()){let o6=this.getClosestMeshNode(n3,t54);if(!o6)continue;let i3=this.createExpandedNode(n3,o6,e7);i3&&(this.overlapsExistingGeometry(i3,t54)||t54.push(i3))}this.expandedNodes=t54,this.solved=!0}getOutput(){return this.expandedNodes}visualize(){let t54=this.inputProblem.edgesWithObstacle,e7=LB(t54);return{rects:[...this.inputProblem.meshNodes.map(t55=>({...Ya2(t55,{rectMargin:.01}),fill:t55._containsObstacle?"rgba(255,0,0,0.16)":"rgba(0,120,255,0.08)",stroke:t55._containsObstacle?"rgba(255,0,0,0.35)":"rgba(0,120,255,0.28)"})),...this.expandedNodes.map(n3=>{let o6=AB(n3),i3=o6===null?null:t54[o6]??null;return{...Ya2(n3,{rectMargin:.012,zOffset:.01}),fill:i3?wB(i3,.24):"rgba(0,160,100,0.24)",stroke:i3?wB(i3,.72):"rgba(0,160,100,0.68)",label:[i3?DB(i3,e7):"E?","expanded",n3.capacityMeshNodeId,`z:${n3.availableZ.join(",")}`].join(`
@@ -740,7 +740,7 @@ ${err2.message}`):err2}}let nNodes=ckt.nodes.count()-1;for(let i3=0;i3<ckt.V.len
740
740
  ${error2.stack}`),asyncEffect.complete=!0;let root2=this._getRootCircuit();root2&&root2.emit("asyncEffect:end",{asyncEffectId,effectName,componentDisplayName:this.getString(),phase:asyncEffect.phase,error:error2.toString()})})}_emitRenderLifecycleEvent(phase,startOrEnd){debug6(`${phase}:${startOrEnd} ${this.getString()}`);let granular_event_type=`renderable:renderLifecycle:${phase}:${startOrEnd}`,eventPayload={renderId:this._renderId,componentDisplayName:this.getString(),type:granular_event_type},root=this._getRootCircuit();root&&(root.emit(granular_event_type,eventPayload),root.emit("renderable:renderLifecycle:anyEvent",{...eventPayload,type:granular_event_type}))}getString(){return this.constructor.name}_hasIncompleteAsyncEffects(){return this._asyncEffects.some(effect=>!effect.complete)?!0:this.children.some(child=>typeof child._hasIncompleteAsyncEffects=="function"?child._hasIncompleteAsyncEffects():!1)}_hasIncompleteAsyncEffectsInSubtreeForPhase(phase){for(let e7 of this._asyncEffects)if(!e7.complete&&e7.phase===phase)return!0;for(let child of this.children)if(child._hasIncompleteAsyncEffectsInSubtreeForPhase(phase))return!0;return!1}_hasIncompleteAsyncEffectsForPhase(phase){let root=this._getRootCircuit();return root?._hasIncompleteAsyncEffectsForPhase?root._hasIncompleteAsyncEffectsForPhase(phase):this._hasIncompleteAsyncEffectsInSubtreeForPhase(phase)}getCurrentRenderPhase(){return this._currentRenderPhase}getRenderGraph(){return{id:this._renderId,currentPhase:this._currentRenderPhase,renderPhaseStates:this.renderPhaseStates,shouldBeRemoved:this.shouldBeRemoved,children:this.children.map(child=>child.getRenderGraph())}}getTopLevelRenderable(){let current3=this;for(;current3.parent&&current3.parent instanceof _Renderable;)current3=current3.parent;return current3}runRenderCycle(){for(let renderPhase of orderedRenderPhases)this.runRenderPhaseForChildren(renderPhase),this.runRenderPhase(renderPhase)}runRenderPhase(phase){this._currentRenderPhase=phase;let phaseState=this.renderPhaseStates[phase],isInitialized=phaseState.initialized,isDirty3=phaseState.dirty;if(!isInitialized&&this.shouldBeRemoved)return;if(this.shouldBeRemoved&&isInitialized){this._emitRenderLifecycleEvent(phase,"start"),this?.[`remove${phase}`]?.(),phaseState.initialized=!1,phaseState.dirty=!1,this._emitRenderLifecycleEvent(phase,"end");return}let prevPhaseIndex=renderPhaseIndexMap.get(phase)-1;if(prevPhaseIndex>=0){let prevPhase=orderedRenderPhases[prevPhaseIndex];if(this._asyncEffects.filter(e7=>e7.phase===prevPhase).some(e7=>!e7.complete))return}let deps=asyncPhaseDependencies[phase]||[];if(deps.length>0){for(let depPhase of deps)if(this._hasIncompleteAsyncEffectsForPhase(depPhase))return}if(this._emitRenderLifecycleEvent(phase,"start"),isInitialized){isDirty3&&(this?.[`update${phase}`]?.(),phaseState.dirty=!1),this._emitRenderLifecycleEvent(phase,"end");return}phaseState.dirty=!1,this?.[`doInitial${phase}`]?.(),phaseState.initialized=!0,this._emitRenderLifecycleEvent(phase,"end")}runRenderPhaseForChildren(phase){for(let child of this.children)"_isIsolatedSubcircuit"in this&&this._isIsolatedSubcircuit&&"doInitialRenderIsolatedSubcircuits"in this&&phase==="RenderIsolatedSubcircuits"||(child.runRenderPhaseForChildren(phase),child.runRenderPhase(phase))}_getRootCircuit(){return"root"in this?this.root??null:null}renderError(message){throw typeof message=="string"?new Error(message):new Error(JSON.stringify(message,null,2))}},InvalidProps=class extends Error{constructor(componentName,originalProps,formattedError){let message,propsWithError=Object.keys(formattedError).filter(k5=>k5!=="_errors"),invalidPinLabelMessages=[],pinLabels=originalProps.pinLabels;if(pinLabels)for(let[pin,labelOrLabels]of Object.entries(pinLabels)){let labels=Array.isArray(labelOrLabels)?labelOrLabels:[labelOrLabels];for(let label of labels)typeof label=="string"&&(label.startsWith(" ")||label.endsWith(" "))&&invalidPinLabelMessages.push(`pinLabels.${pin} ("${label}" has leading or trailing spaces)`)}let propMessage=propsWithError.map(k5=>k5==="pinLabels"&&invalidPinLabelMessages.length>0?invalidPinLabelMessages.join(", "):formattedError[k5]._errors[0]?`${k5} (${formattedError[k5]._errors[0]})`:`${k5} (${JSON.stringify(formattedError[k5])})`).join(", ");"name"in originalProps?message=`Invalid props for ${componentName} "${originalProps.name}": ${propMessage}`:"footprint"in originalProps&&typeof originalProps.footprint=="string"?message=`Invalid props for ${componentName} (unnamed ${originalProps.footprint} component): ${propMessage}`:message=`Invalid props for ${componentName} (unnamed): ${propMessage}`;super(message);__publicField(this,"componentName");__publicField(this,"originalProps");__publicField(this,"formattedError");this.componentName=componentName,this.originalProps=originalProps,this.formattedError=formattedError}},defaultUnits={mm:1};function evaluateCalcString(input2,options){let{knownVariables,units:userUnits}=options,units={...defaultUnits,...userUnits??{}},expr=normalizeLegacyBoundsIdentifierCase(extractExpression(input2)),tokens=tokenize2(expr,units);return parseExpression(tokens,knownVariables)}function extractCalcIdentifiers(input2){let expr=normalizeLegacyBoundsIdentifierCase(extractExpression(input2));return tokenize2(expr,defaultUnits).filter(token=>token.type==="identifier").map(token=>token.value)}function normalizeLegacyBoundsIdentifierCase(expr){let legacyBoundNameToCamelCase={minx:"minX",maxx:"maxX",miny:"minY",maxy:"maxY"};return expr.replace(/\.(minx|maxx|miny|maxy)\b/gi,(match2,boundName)=>`.${legacyBoundNameToCamelCase[String(boundName).toLowerCase()]??match2.slice(1)}`)}function extractExpression(raw){let trimmed=raw.trim();if(!trimmed.toLowerCase().startsWith("calc"))return trimmed;let match2=trimmed.match(/^calc\s*\((.*)\)$/is);if(!match2)throw new Error(`Invalid calc() expression: "${raw}"`);return match2[1].trim()}function tokenize2(expr,units){let tokens=[],i3=0,isDigit2=ch2=>ch2>="0"&&ch2<="9",isIdentStart=ch2=>ch2>="A"&&ch2<="Z"||ch2>="a"&&ch2<="z"||ch2==="_",isIdentChar=ch2=>isIdentStart(ch2)||isDigit2(ch2)||ch2===".";for(;i3<expr.length;){let ch2=expr[i3];if(ch2===" "||ch2===" "||ch2===`
741
741
  `||ch2==="\r"){i3++;continue}if(isDigit2(ch2)||ch2==="."&&i3+1<expr.length&&isDigit2(expr[i3+1])){let start=i3;for(i3++;i3<expr.length;){let c6=expr[i3];if(isDigit2(c6)||c6===".")i3++;else break}let numberText=expr.slice(start,i3),num=Number(numberText);if(Number.isNaN(num))throw new Error(`Invalid number: "${numberText}"`);let unitStart=i3;for(;i3<expr.length&&/[A-Za-z]/.test(expr[i3]);)i3++;if(i3>unitStart){let unitText=expr.slice(unitStart,i3),factor=units[unitText];if(factor==null)throw new Error(`Unknown unit: "${unitText}"`);num*=factor}tokens.push({type:"number",value:num});continue}if(isIdentStart(ch2)){let start=i3;for(i3++;i3<expr.length&&isIdentChar(expr[i3]);)i3++;let ident=expr.slice(start,i3);tokens.push({type:"identifier",value:ident});continue}if(ch2==="("||ch2===")"){tokens.push({type:"paren",value:ch2}),i3++;continue}if(ch2==="+"||ch2==="-"||ch2==="*"||ch2==="/"){tokens.push({type:"operator",value:ch2}),i3++;continue}throw new Error(`Unexpected character "${ch2}" in expression "${expr}"`)}return tokens}function parseExpression(tokens,vars){let index=0,peek=()=>tokens[index],consume=()=>tokens[index++],parsePrimary=()=>{let token=peek();if(!token)throw new Error("Unexpected end of expression");if(token.type==="number")return consume(),token.value;if(token.type==="identifier"){consume();let value=vars[token.value];if(value==null)throw new Error(`Unknown variable: "${token.value}"`);return value}if(token.type==="paren"&&token.value==="("){consume();let value=parseExpr(),next2=peek();if(!next2||next2.type!=="paren"||next2.value!==")")throw new Error('Expected ")"');return consume(),value}throw new Error(`Unexpected token "${token.value}"`)},parseFactor=()=>{let token=peek();if(token&&token.type==="operator"&&(token.value==="+"||token.value==="-")){consume();let value=parseFactor();return token.value==="+"?value:-value}return parsePrimary()},parseTerm=()=>{let value=parseFactor();for(;;){let token=peek();if(!token||token.type!=="operator"||token.value!=="*"&&token.value!=="/")break;consume();let rhs=parseFactor();token.value==="*"?value*=rhs:value/=rhs}return value},parseExpr=()=>{let value=parseTerm();for(;;){let token=peek();if(!token||token.type!=="operator"||token.value!=="+"&&token.value!=="-")break;consume();let rhs=parseTerm();token.value==="+"?value+=rhs:value-=rhs}return value},result=parseExpr();if(index<tokens.length){let leftover=tokens.slice(index).map(t54=>"value"in t54?t54.value:"?").join(" ");throw new Error(`Unexpected tokens at end of expression: ${leftover}`)}return result}function setSubcircuitPcbComponentCalcVariables(params){let{vars,componentName,position:position4,size:size3}=params;vars[`${componentName}.x`]=position4.x,vars[`${componentName}.y`]=position4.y,vars[`${componentName}.width`]=size3.width,vars[`${componentName}.height`]=size3.height,vars[`${componentName}.minX`]=position4.x-size3.width/2,vars[`${componentName}.maxX`]=position4.x+size3.width/2,vars[`${componentName}.minY`]=position4.y-size3.height/2,vars[`${componentName}.maxY`]=position4.y+size3.height/2}function getSubcircuitPcbCalcVariables(db3){let vars={};for(let sourceComponent of db3.source_component.list()){if(!sourceComponent.name)continue;let pcbComponent=db3.pcb_component.getWhere({source_component_id:sourceComponent.source_component_id});pcbComponent&&setSubcircuitPcbComponentCalcVariables({vars,componentName:sourceComponent.name,position:{x:pcbComponent.center.x,y:pcbComponent.center.y},size:{width:pcbComponent.width??0,height:pcbComponent.height??0}})}return vars}var directionToVector={from_left:{x:-1,y:0},from_right:{x:1,y:0},from_front:{x:0,y:1},from_back:{x:0,y:-1}},isFootprintFlipped=params=>{let{componentLayer,originalLayer}=params;return componentLayer==="bottom"!=(originalLayer==="bottom")},transformFootprintInsertionDirection=params=>{let{insertionDirection,rotationDegrees=0,isFlipped=!1}=params;if(!insertionDirection)return;if(insertionDirection==="from_above")return insertionDirection;let baseVector=directionToVector[insertionDirection],angleRadians=normalizeDegrees(rotationDegrees)*Math.PI/180,rotatedVector={x:baseVector.x*Math.cos(angleRadians)-baseVector.y*Math.sin(angleRadians),y:baseVector.x*Math.sin(angleRadians)+baseVector.y*Math.cos(angleRadians)},finalVector=isFlipped?{x:rotatedVector.x,y:-rotatedVector.y}:rotatedVector;return Math.abs(finalVector.x)>=Math.abs(finalVector.y)?finalVector.x>=0?"from_right":"from_left":finalVector.y>=0?"from_front":"from_back"};function convertPcbStyleToPcbSx(pcbStyle2){if(!pcbStyle2)return;let sx3={},silkscreenTextSx={};if(pcbStyle2.silkscreenFontSize!==void 0&&(silkscreenTextSx.fontSize=pcbStyle2.silkscreenFontSize),pcbStyle2.silkscreenTextVisibility!==void 0&&(silkscreenTextSx.visibility=pcbStyle2.silkscreenTextVisibility),Object.keys(silkscreenTextSx).length>0&&(sx3["& silkscreentext"]=silkscreenTextSx),Object.keys(sx3).length!==0)return sx3}function getResolvedPcbSx({parentResolvedPcbSx,pcbStyle:pcbStyle2,ownPcbSx}){let styleSx=convertPcbStyleToPcbSx(pcbStyle2),result={},allKeys=new Set;if(parentResolvedPcbSx)for(let k5 of Object.keys(parentResolvedPcbSx))allKeys.add(k5);if(styleSx)for(let k5 of Object.keys(styleSx))allKeys.add(k5);if(ownPcbSx)for(let k5 of Object.keys(ownPcbSx))allKeys.add(k5);for(let key of allKeys)result[key]={...parentResolvedPcbSx?.[key],...styleSx?.[key],...ownPcbSx?.[key]};return result}function isMatchingSelector(component,selector){let idMatch=selector.match(/^#(\w+)/);if(idMatch)return component.props.id===idMatch[1];let classMatch=selector.match(/^\.(\w+)/);if(classMatch)return component.isMatchingNameOrAlias(classMatch[1]);let[type,...conditions]=selector.split(/(?=[#.[])/);return type==="pin"&&(type="port"),type&&type!=="*"&&component.lowercaseComponentName!==type.toLowerCase()?!1:conditions.every(condition=>{if(condition.startsWith("#"))return component.props.id===condition.slice(1);if(condition.startsWith("."))return component.isMatchingNameOrAlias(condition.slice(1));let match2=condition.match(/\[(\w+)=['"]?(.+?)['"]?\]/);if(!match2)return!0;let[,prop,value]=match2;return component.props[prop].toString()===value})}var cssSelectPrimitiveComponentAdapter={isTag:node=>!0,getParent:node=>node.parent,getChildren:node=>node.children,getName:node=>node.lowercaseComponentName,getAttributeValue:(node,name)=>{if(name==="class"&&"getNameAndAliases"in node)return node.getNameAndAliases().join(" ");if(name==="name"&&node._parsedProps?.name)return node._parsedProps.name;if(node._parsedProps&&name in node._parsedProps){let value=node._parsedProps[name];return typeof value=="string"?value:value!=null?String(value):null}let matchingParsedPropName=Object.keys(node._parsedProps??{}).find(propName=>propName.toLowerCase()===name);if(matchingParsedPropName){let value=node._parsedProps[matchingParsedPropName];return typeof value=="string"?value:value!=null?String(value):null}if(name in node){let value=node[name];return typeof value=="string"?value:value!=null?String(value):null}let reverseMap=node._attributeLowerToCamelNameMap;if(reverseMap){let camelCaseName=reverseMap[name];if(camelCaseName&&camelCaseName in node){let value=node[camelCaseName];return typeof value=="string"?value:value!=null?String(value):null}}return null},hasAttrib:(node,name)=>{if(name==="class")return!!node._parsedProps?.name;if(node._parsedProps&&name in node._parsedProps||Object.keys(node._parsedProps??{}).some(propName=>propName.toLowerCase()===name)||name in node)return!0;let reverseMap=node._attributeLowerToCamelNameMap;if(reverseMap){let camelCaseName=reverseMap[name];if(camelCaseName&&camelCaseName in node)return!0}return!1},getSiblings:node=>node.parent?node.parent.children:[],prevElementSibling:node=>{if(!node.parent)return null;let siblings=node.parent.children,idx=siblings.indexOf(node);return idx>0?siblings[idx-1]:null},getText:()=>"",removeSubsets:nodes=>nodes.filter((node,i3)=>!nodes.some((other,j5)=>i3!==j5&&other!==node&&other.getDescendants().includes(node))),existsOne:(test,nodes)=>nodes.some(test),findAll:(test,nodes)=>{let result=[],recurse=node=>{test(node)&&result.push(node);for(let child of node.children)recurse(child)};for(let node of nodes)recurse(node);return result},findOne:(test,nodes)=>{for(let node of nodes){if(test(node))return node;let children=node.children;if(children.length>0){let result=cssSelectPrimitiveComponentAdapter.findOne(test,children);if(result)return result}}return null},equals:(a3,b4)=>a3._renderId===b4._renderId,isHovered:elem=>!1,isVisited:elem=>!1,isActive:elem=>!1},cssSelectPrimitiveComponentAdapterWithoutSubcircuits={...cssSelectPrimitiveComponentAdapter,getChildren:node=>node.children.filter(c6=>!c6.isSubcircuit)},cssSelectPrimitiveComponentAdapterOnlySubcircuits={...cssSelectPrimitiveComponentAdapter,getChildren:node=>node.children.filter(c6=>c6.isSubcircuit)},buildPlusMinusNetErrorMessage=(selector,component)=>{let netName=selector.split("net.")[1]?.split(/[ >]/)[0]??selector;return`Net names cannot contain "+" or "-" (component "${component?.componentName??"Unknown component"}" received "${netName}" via "${selector}"). Try using underscores instead, e.g. VCC_P`},preprocessSelector=(selector,component)=>{if(/net\.[^\s>]*\./.test(selector))throw new Error('Net names cannot contain a period, try using "sel.net..." to autocomplete with conventional net names, e.g. V3_3');if(/net\.[^\s>]*[+-]/.test(selector))throw new Error(buildPlusMinusNetErrorMessage(selector,component));if(/net\.[0-9]/.test(selector)){let match2=selector.match(/net\.([^ >]+)/),netName=match2?match2[1]:"";throw new Error(`Net name "${netName}" cannot start with a number, try using a prefix like "VBUS1"`)}return selector.replace(/ pin(?=[\d.])/g," port").replace(/ subcircuit\./g," group[isSubcircuit=true]").replace(/([^ ])\>([^ ])/g,"$1 > $2").replace(/(^|[ >])(?!pin\.)(?!port\.)(?!net\.)([A-Z][A-Za-z0-9_-]*)\.([A-Za-z0-9_-]+)/g,(_3,sep,name,pin)=>{let pinPart=/^\d+$/.test(pin)?`pin${pin}`:pin;return`${sep}.${name} > .${pinPart}`}).trim()},cssSelectOptionsInsideSubcircuit={adapter:cssSelectPrimitiveComponentAdapterWithoutSubcircuits,cacheResults:!0},PrimitiveComponent2=class extends Renderable{constructor(props){super(props);__publicField(this,"parent",null);__publicField(this,"children");__publicField(this,"childrenPendingRemoval");__publicField(this,"props");__publicField(this,"_parsedProps");__publicField(this,"externallyAddedAliases");__publicField(this,"isPrimitiveContainer",!1);__publicField(this,"canHaveTextChildren",!1);__publicField(this,"source_group_id",null);__publicField(this,"source_component_id",null);__publicField(this,"schematic_component_id",null);__publicField(this,"schematic_sheet_id",null);__publicField(this,"pcb_component_id",null);__publicField(this,"cad_component_id",null);__publicField(this,"_reportedInvalidPcbCalcWarnings",new Set);__publicField(this,"fallbackUnassignedName");__publicField(this,"_cachedSelectAllQueries",new Map);__publicField(this,"_cachedSelectOneQueries",new Map);this.children=[],this.childrenPendingRemoval=[],this.props=props??{},this.externallyAddedAliases=[];let parsePropsResult=("partial"in this.config.zodProps?this.config.zodProps.partial({name:!0}):this.config.zodProps).safeParse(props??{});if(parsePropsResult.success)this._parsedProps=parsePropsResult.data;else throw new InvalidProps(this.lowercaseComponentName,this.props,parsePropsResult.error.format())}get config(){return{componentName:"",zodProps:external_exports.object({}).passthrough()}}get componentName(){return this.config.componentName}getInheritedProperty(propertyName){let current3=this;for(;current3;){if(current3._parsedProps&&propertyName in current3._parsedProps)return current3._parsedProps[propertyName];current3=current3.parent}if(this.root?.platform&&propertyName in this.root.platform)return this.root.platform[propertyName]}getInheritedMergedProperty(propertyName){let parentPropertyObject=this.parent?.getInheritedMergedProperty?.(propertyName),myPropertyObject=this._parsedProps?.[propertyName];return{...parentPropertyObject,...myPropertyObject}}getResolvedPcbSx(){return getResolvedPcbSx({parentResolvedPcbSx:this.parent?.getResolvedPcbSx?.(),pcbStyle:this._parsedProps?.pcbStyle,ownPcbSx:this._parsedProps?.pcbSx})}getSchematicSectionName(){return this._parsedProps?.schSectionName??null}get lowercaseComponentName(){return this.componentName.toLowerCase()}get isSubcircuit(){return!!this.props.subcircuit||this.lowercaseComponentName==="group"&&this?.parent?.isRootCircuit}get isGroup(){return this.lowercaseComponentName==="group"}get name(){return this._parsedProps.name??this.fallbackUnassignedName}_reportInvalidComponentPropertyError(propertyName,message){!this.root||this._reportedInvalidPcbCalcWarnings.has(propertyName)||(this.root.db.source_invalid_component_property_error.insert({source_component_id:this.source_component_id||"",property_name:propertyName,message,error_type:"source_invalid_component_property_error"}),this._reportedInvalidPcbCalcWarnings.add(propertyName))}setProps(props){let newProps=this.config.zodProps.parse({...this.props,...props}),oldProps=this.props;this.props=newProps,this._parsedProps=this.config.zodProps.parse(props),this.onPropsChange({oldProps,newProps,changedProps:Object.keys(props)}),this.parent?.onChildChanged?.(this)}_getPcbRotationBeforeLayout(){let{pcbRotation}=this.props;return typeof pcbRotation=="string"?parseFloat(pcbRotation):pcbRotation??null}getResolvedPcbPositionProp(){return{pcbX:this._resolvePcbCoordinate(this._parsedProps.pcbX,"pcbX"),pcbY:this._resolvePcbCoordinate(this._parsedProps.pcbY,"pcbY")}}doInitialValidatePcbCoordinates(){if(this.root?.pcbDisabled)return;let rawProps=this.props,rawPcbX=rawProps.pcbX,rawPcbY=rawProps.pcbY;this._validatePcbCoordinateReferences({rawValue:rawPcbX,axis:"pcbX",propertyName:"pcbX"}),this._validatePcbCoordinateReferences({rawValue:rawPcbY,axis:"pcbY",propertyName:"pcbY"})}_validatePcbCoordinateReferences(params){let{rawValue,axis,propertyName=axis}=params;if(typeof rawValue!="string")return;let allowComponentVariables=!(this._isNormalComponent===!0)&&!this._isInsideFootprint(),calcIdentifiers=[];try{calcIdentifiers=extractCalcIdentifiers(rawValue)}catch{this._reportInvalidComponentPropertyError(propertyName,`Invalid ${propertyName} value for ${this.componentName}: Invalid calc() expression. expression="${rawValue}"`);return}calcIdentifiers.some(identifier=>!identifier.startsWith("board."))&&!allowComponentVariables&&this._reportInvalidComponentPropertyError(propertyName,`Invalid ${propertyName} value for ${this.componentName}: component-relative calc references are not supported for footprint elements (${this.componentName}); ${propertyName} will be ignored. expression="${rawValue}"`)}_resolvePcbCoordinate(rawValue,axis,options={}){if(rawValue==null)return 0;let propertyName=options.propertyName??axis;if(typeof rawValue=="number")return Number.isFinite(rawValue)?rawValue:0;if(typeof rawValue!="string")throw new Error(`Invalid ${axis} value for ${this.componentName}: ${String(rawValue)}`);let allowBoardVariables=options.allowBoardVariables??this._shouldAllowBoardVariablesByDefault(),isNormalComponent=this._isNormalComponent===!0,allowComponentVariables=options.allowComponentVariables??(!isNormalComponent&&!this._isInsideFootprint()),includesBoardVariable=rawValue.includes("board."),knownVariables={};if(allowBoardVariables){let board=this._getBoard(),boardVariables=board?._getBoardCalcVariables()??{};if(includesBoardVariable&&!board)return this._reportInvalidComponentPropertyError(propertyName,`Invalid ${propertyName} value for ${this.componentName}: no board found for board.* variables. expression="${rawValue}"`),0;if(includesBoardVariable&&board&&Object.keys(boardVariables).length===0)return this._reportInvalidComponentPropertyError(propertyName,`Invalid ${propertyName} value for ${this.componentName}: Cannot do calculations based on board size when the board is auto-sized. expression="${rawValue}"`),0;Object.assign(knownVariables,boardVariables)}if(allowComponentVariables){let db3=this.root?.db;db3&&Object.assign(knownVariables,getSubcircuitPcbCalcVariables(db3)),Object.assign(knownVariables,options.componentVariables??{})}try{return extractCalcIdentifiers(rawValue).some(identifier=>!identifier.startsWith("board."))&&!allowComponentVariables?(this._isInsideFootprint()&&this.root&&!this._reportedInvalidPcbCalcWarnings.has(axis)&&(this.root.db.source_invalid_component_property_error.insert({source_component_id:this.source_component_id||"",property_name:axis,message:`component-relative calc references are not supported for footprint elements (${this.componentName}); ${axis} will be ignored. expression="${rawValue}"`,error_type:"source_invalid_component_property_error"}),this._reportedInvalidPcbCalcWarnings.add(axis)),0):evaluateCalcString(rawValue,{knownVariables})}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);return this._reportInvalidComponentPropertyError(propertyName,`Invalid ${propertyName} value for ${this.componentName}: ${message}. expression="${rawValue}"`),0}}_shouldAllowBoardVariablesByDefault(){return this._isNormalComponent===!0?!0:!this._isInsideFootprint()&&!this._isInsideNonBoardSubcircuit()}_isInsideFootprint(){let current3=this.parent;for(;current3;){if(current3.componentName==="Footprint")return!0;current3=current3.parent}return!1}_isInsideNonBoardSubcircuit(){let current3=this.parent;for(;current3;){let componentName=current3.componentName;if(componentName==="Board"||componentName==="MountedBoard")return!1;if(current3.isSubcircuit)return!0;current3=current3.parent}return!1}_hasUserDefinedPcbPosition(){let props=this._parsedProps;return props.pcbX!==void 0||props.pcbY!==void 0||props.pcbLeftEdgeX!==void 0||props.pcbRightEdgeX!==void 0||props.pcbTopEdgeY!==void 0||props.pcbBottomEdgeY!==void 0}resolvePcbCoordinate(params){let{rawValue,axis,allowBoardVariables,allowComponentVariables,componentVariables,propertyName}=params;return this._resolvePcbCoordinate(rawValue,axis,{allowBoardVariables,allowComponentVariables,componentVariables,propertyName})}computePcbPropsTransform(){let rotation42=this._getPcbRotationBeforeLayout()??0,{pcbX,pcbY}=this.getResolvedPcbPositionProp();return compose2(translate2(pcbX,pcbY),rotate2(rotation42*Math.PI/180))}_computePcbGlobalTransformBeforeLayout(){let manualPlacement=this.getSubcircuit()._getPcbManualPlacementForComponent(this);if(manualPlacement&&this.props.pcbX===void 0&&this.props.pcbY===void 0){let rotation42=this._getPcbRotationBeforeLayout()??0;return compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),compose2(translate2(manualPlacement.x,manualPlacement.y),rotate2(rotation42*Math.PI/180)))}if(this.isPcbPrimitive){let{isFlipped}=this._getPcbPrimitiveFlippedHelpers();if(isFlipped)return compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),flipY(),this.computePcbPropsTransform())}return compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),this.computePcbPropsTransform())}_getEnclosingFootprint(){let current3=this.parent;for(;current3;){if(current3.componentName==="Footprint")return current3;current3=current3.parent}return null}getPrimitiveContainer(){return this.isPrimitiveContainer?this:this.parent?.getPrimitiveContainer?.()??null}_getSymbolAncestor(){let container=this.getPrimitiveContainer();return container?.componentName==="Symbol"?container:null}getParentNormalComponent(){let current3=this.parent;for(;current3;){if(current3.isPrimitiveContainer&&current3.doInitialPcbComponentRender)return current3;current3=current3.parent}return null}getCollapsedSchematicBoxAncestor(){let current3=this.parent;for(;current3;){if(current3.componentName==="Group"&&current3._parsedProps?.showAsSchematicBox)return current3;current3=current3.parent}return null}_resolveText(){let text=this._parsedProps.text;if(!text)return"";if(!text.includes("{NAME}")&&!text.includes("{REF}")&&!text.includes("{REFERENCE}"))return text;let refdes=this.getParentNormalComponent()?.name;return refdes?text.replace(/\{NAME\}/g,refdes).replace(/\{REF\}/g,refdes).replace(/\{REFERENCE\}/g,refdes):text}emitSolderMaskMarginWarning(isCoveredWithSolderMask,solderMaskMargin){if(isCoveredWithSolderMask&&solderMaskMargin!==void 0){let parentNormalComponent=this.getParentNormalComponent();parentNormalComponent?.source_component_id&&this.root.db.source_property_ignored_warning.insert({source_component_id:parentNormalComponent.source_component_id,property_name:"solderMaskMargin",message:"solderMaskMargin is set but coveredWithSolderMask is true. When a component is fully covered with solder mask, a margin doesn't apply.",error_type:"source_property_ignored_warning"})}}_getPcbCircuitJsonBounds(){return{center:{x:0,y:0},bounds:{left:0,top:0,right:0,bottom:0},width:0,height:0}}_getPcbComponentLayer(){return this._parsedProps.layer}_getPcbPrimitiveFlippedHelpers(){let container=this.getPrimitiveContainer(),footprint=this.componentName==="Footprint"?this:this._getEnclosingFootprint(),componentLayer=container?._getPcbComponentLayer(),isFlipped=container?isFootprintFlipped({componentLayer,originalLayer:footprint?._parsedProps.originalLayer}):!1;return{isFlipped,maybeFlipLayer:layer=>isFlipped?layer==="top"?"bottom":"top":layer}}_setPositionFromLayout(newCenter){throw new Error(`_setPositionFromLayout not implemented for ${this.componentName}`)}computeSchematicPropsTransform(){let{_parsedProps:props}=this;return compose2(translate2(props.schX??0,props.schY??0))}computeSchematicGlobalTransform(){let manualPlacementTransform=this._getSchematicGlobalManualPlacementTransform(this);return manualPlacementTransform||compose2(this.parent?.computeSchematicGlobalTransform?.()??identity(),this.computeSchematicPropsTransform())}_getSchematicSymbolName(){let{_parsedProps:props}=this,base_symbol_name=this.config.schematicSymbolName,orientationRotationMap={horizontal:0,pos_left:0,neg_right:0,pos_right:180,neg_left:180,pos_top:270,neg_bottom:90,vertical:270,pos_bottom:90,neg_top:90},normalizedRotation=props.schOrientation!==void 0?orientationRotationMap[props.schOrientation]:props.schRotation;if(normalizedRotation===void 0&&(normalizedRotation=0),normalizedRotation=normalizedRotation%360,normalizedRotation<0&&(normalizedRotation+=360),props.schRotation!==void 0&&normalizedRotation%90!==0)throw new Error(`Schematic rotation ${props.schRotation} is not supported for ${this.componentName}`);let symbol_name_horz=`${base_symbol_name}_horz`,symbol_name_vert=`${base_symbol_name}_vert`,symbol_name_up=`${base_symbol_name}_up`,symbol_name_down=`${base_symbol_name}_down`,symbol_name_left=`${base_symbol_name}_left`,symbol_name_right=`${base_symbol_name}_right`;if(symbol_name_right in rc&&normalizedRotation===0)return symbol_name_right;if(symbol_name_up in rc&&normalizedRotation===90)return symbol_name_up;if(symbol_name_left in rc&&normalizedRotation===180)return symbol_name_left;if(symbol_name_down in rc&&normalizedRotation===270)return symbol_name_down;if(symbol_name_horz in rc&&(normalizedRotation===0||normalizedRotation===180))return symbol_name_horz;if(symbol_name_vert in rc&&(normalizedRotation===90||normalizedRotation===270))return symbol_name_vert;if(base_symbol_name in rc)return base_symbol_name}_getSchematicSymbolNameOrThrow(){let symbol_name=this._getSchematicSymbolName();if(!symbol_name)throw new Error(`No schematic symbol found (given: "${this.config.schematicSymbolName}")`);return symbol_name}getSchematicSymbol(){let symbol_name=this._getSchematicSymbolName();return symbol_name?rc[symbol_name]??null:null}_getPcbManualPlacementForComponent(component){if(!this.isSubcircuit)return null;let manualEdits=this.props.manualEdits;if(!manualEdits)return null;let placementConfigPositions=manualEdits?.pcb_placements;if(!placementConfigPositions)return null;for(let position4 of placementConfigPositions)if(isMatchingSelector(component,position4.selector)||component.props.name===position4.selector)return applyToPoint2(this._computePcbGlobalTransformBeforeLayout(),position4.center);return null}_getSchematicManualPlacementForComponent(component){if(!this.isSubcircuit)return null;let manualEdits=this.props.manualEdits;if(!manualEdits)return null;let placementConfigPositions=manualEdits.schematic_placements;if(!placementConfigPositions)return null;for(let position4 of placementConfigPositions)if(isMatchingSelector(component,position4.selector)||component.props.name===position4.selector)return applyToPoint2(this.computeSchematicGlobalTransform(),position4.center);return null}_getSchematicGlobalManualPlacementTransform(component){let manualEdits=this.getSubcircuit()?._parsedProps.manualEdits;if(!manualEdits)return null;for(let position4 of manualEdits.schematic_placements??[])if((isMatchingSelector(component,position4.selector)||component.props.name===position4.selector)&&position4.relative_to==="group_center")return compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),translate2(position4.center.x,position4.center.y));return null}_getGlobalPcbPositionBeforeLayout(){return applyToPoint2(this._computePcbGlobalTransformBeforeLayout(),{x:0,y:0})}_getGlobalSchematicPositionBeforeLayout(){return applyToPoint2(this.computeSchematicGlobalTransform(),{x:0,y:0})}_getBoard(){let current3=this;for(;current3;){let maybePrimitive=current3,componentName=maybePrimitive.componentName;if(componentName==="Board"||componentName==="MountedBoard")return maybePrimitive;current3=current3.parent??null}return this.root?._getBoard()}get root(){return this.parent?.root??null}onAddToParent(parent){this.parent=parent}onPropsChange(params){}onChildChanged(child){this.parent?.onChildChanged?.(child)}add(component){let textContent2=component.__text;if(typeof textContent2=="string"){if(this.canHaveTextChildren||textContent2.trim()==="")return;throw new Error(`Invalid JSX Element: Expected a React component but received text "${textContent2}"`)}if(Object.keys(component).length!==0){if(component.lowercaseComponentName==="panel")throw new Error("<panel> must be a root-level element");if(!component.onAddToParent)throw new Error(`Invalid JSX Element: Expected a React component but received "${JSON.stringify(component)}"`);component.onAddToParent(this),component.parent=this,this.children.push(component)}}addAll(components){for(let component of components)this.add(component)}remove(component){this.children=this.children.filter(c6=>c6!==component),this.childrenPendingRemoval.push(component),component.shouldBeRemoved=!0}getSubcircuitSelector(){let name=this.name,endPart=name?`${this.lowercaseComponentName}.${name}`:this.lowercaseComponentName;return!this.parent||this.parent.isSubcircuit?endPart:`${this.parent.getSubcircuitSelector()} > ${endPart}`}getFullPathSelector(){let name=this.name,endPart=name?`${this.lowercaseComponentName}.${name}`:this.lowercaseComponentName,parentSelector=this.parent?.getFullPathSelector?.();return parentSelector?`${parentSelector} > ${endPart}`:endPart}getNameAndAliases(){return[this.name,...this._parsedProps.portHints??[]].filter(Boolean)}isMatchingNameOrAlias(name){return this.getNameAndAliases().includes(name)}isMatchingAnyOf(aliases2){return this.getNameAndAliases().some(a3=>aliases2.map(a22=>a22.toString()).includes(a3))}getPcbSize(){throw new Error(`getPcbSize not implemented for ${this.componentName}`)}doesSelectorMatch(selector){let myTypeNames=[this.componentName,this.lowercaseComponentName],myClassNames=[this.name].filter(Boolean),parts=selector.trim().split(/\> /)[0],firstPart=parts[0];return parts.length>1?!1:!!(selector==="*"||selector[0]==="#"&&selector.slice(1)===this.props.id||selector[0]==="."&&myClassNames.includes(selector.slice(1))||/^[a-zA-Z0-9_]/.test(firstPart)&&myTypeNames.includes(firstPart))}getSubcircuit(){if(this.isSubcircuit)return this;let group=this.parent?.getSubcircuit?.();if(!group)throw new Error("Component is not inside an opaque group (no board?)");return group}getGroup(){return this.isGroup?this:this.parent?.getGroup?.()??null}_resolveSchematicSheetId(){let schSheetName=this._parsedProps?.schSheetName??this.props.schSheetName;if(schSheetName){let matchingSheet=this.root?.db.schematic_sheet.list().find(sheet=>sheet.name===schSheetName);if(matchingSheet)return matchingSheet.schematic_sheet_id}return this.schematic_sheet_id?this.schematic_sheet_id:this.parent?._resolveSchematicSheetId?.()}doInitialAssignNameToUnnamedComponents(){this._parsedProps.name||(this.fallbackUnassignedName=this.getSubcircuit().getNextAvailableName(this))}doInitialOptimizeSelectorCache(){if(!this.isSubcircuit)return;let ports=this.selectAll("port"),isValidShorthandName=name=>/^[A-Za-z_][A-Za-z0-9_-]*$/.test(name);for(let port of ports){let parentAliases=(port.getParentNormalComponent?.()??port.parent)?.getNameAndAliases(),portAliases=port.getNameAndAliases();if(parentAliases)for(let parentAlias of parentAliases)for(let portAlias of portAliases){let selectors=[`.${parentAlias} > .${portAlias}`,`.${parentAlias} .${portAlias}`];isValidShorthandName(parentAlias)&&isValidShorthandName(portAlias)&&selectors.push(`${parentAlias}.${portAlias}`);for(let selector of selectors){let ar3=this._cachedSelectAllQueries.get(selector);ar3?ar3.push(port):this._cachedSelectAllQueries.set(selector,[port])}}}for(let[selector,ports2]of this._cachedSelectAllQueries.entries())ports2.length===1&&this._cachedSelectOneQueries.set(selector,ports2[0])}updateOptimizeSelectorCache(){this._cachedSelectAllQueries.clear(),this._cachedSelectOneQueries.clear(),this.doInitialOptimizeSelectorCache()}selectAll(selectorRaw){if(this._cachedSelectAllQueries.has(selectorRaw))return this._cachedSelectAllQueries.get(selectorRaw);let selector=preprocessSelector(selectorRaw,this),result=selectAll(selector,this,cssSelectOptionsInsideSubcircuit);if(result.length>0)return this._cachedSelectAllQueries.set(selectorRaw,result),result;let[firstpart,...rest]=selector.split(" "),subcircuit=selectOne(firstpart,this,{adapter:cssSelectPrimitiveComponentAdapterOnlySubcircuits});if(!subcircuit)return[];let result2=subcircuit.selectAll(rest.join(" "));return this._cachedSelectAllQueries.set(selectorRaw,result2),result2}selectOne(selectorRaw,options){if(this._cachedSelectOneQueries.has(selectorRaw))return this._cachedSelectOneQueries.get(selectorRaw);let selector=preprocessSelector(selectorRaw,this);options?.port&&(options.type="port");let result=null;if(options?.type&&(result=selectAll(selector,this,cssSelectOptionsInsideSubcircuit).find(n3=>n3.lowercaseComponentName===options.type)),options?.type||(result??(result=selectOne(selector,this,cssSelectOptionsInsideSubcircuit))),result)return this._cachedSelectOneQueries.set(selectorRaw,result),result;let[firstpart,...rest]=selector.split(" "),subcircuit=selectOne(firstpart,this,{adapter:cssSelectPrimitiveComponentAdapterOnlySubcircuits});return subcircuit?(result=subcircuit.selectOne(rest.join(" "),options),this._cachedSelectOneQueries.set(selectorRaw,result),result):null}getAvailablePcbLayers(){if(this.isPcbPrimitive){let{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers();return"layer"in this._parsedProps||this.componentName==="SmtPad"?[maybeFlipLayer(this._parsedProps.layer??"top")]:"layers"in this._parsedProps?this._parsedProps.layers:this.componentName==="PlatedHole"?[...this.root?._getBoard()?.allLayers??["top","bottom"]]:[]}return[]}getDescendants(){let descendants=[];for(let child of this.children)descendants.push(child),descendants.push(...child.getDescendants());return descendants}getSelectableDescendants(){let descendants=[];for(let child of this.children)child.isSubcircuit?descendants.push(child):(descendants.push(child),descendants.push(...child.getSelectableDescendants()));return descendants}_getPrimaryPinCount(){return 0}_getSchematicBoxDimensions(){return null}_getSchematicBoxComponentDimensions(){if(this.getSchematicSymbol()||!this.config.shouldRenderAsSchematicBox)return null;let{_parsedProps:props}=this;return{schWidth:props.schWidth,schHeight:props.schHeight}}renderError(message){if(typeof message=="string")return super.renderError(message);switch(message.type){case"pcb_placement_error":this.root?.db.pcb_placement_error.insert(message);break;case"pcb_via_clearance_error":this.root?.db.pcb_via_clearance_error.insert(message);break;case"pcb_trace_error":this.root?.db.pcb_trace_error.insert(message);break;case"pcb_manual_edit_conflict_warning":this.root?.db.pcb_manual_edit_conflict_warning.insert(message);break;default:this.root?.db.pcb_placement_error.insert(message)}}getString(){let{lowercaseComponentName:cname,_parsedProps:props,parent}=this;return props?.pinNumber!==void 0&&parent?.props?.name&&props?.name?`<${cname}#${this._renderId}(pin:${props.pinNumber} .${parent?.props.name}>.${props.name}) />`:parent?.props?.name&&props?.name?`<${cname}#${this._renderId}(.${parent?.props.name}>.${props?.name}) />`:props?.from&&props?.to?`<${cname}#${this._renderId}(from:${props.from} to:${props?.to}) />`:props?.name?`<${cname}#${this._renderId} name=".${props?.name}" />`:props?.portHints?`<${cname}#${this._renderId}(${props.portHints.map(ph3=>`.${ph3}`).join(", ")}) />`:`<${cname}#${this._renderId} />`}getDisplayName(){return this.name?`${this.lowercaseComponentName} "${this.name}"`:`${this.lowercaseComponentName} (unnamed)`}get[Symbol.toStringTag](){return this.getString()}[Symbol.for("nodejs.util.inspect.custom")](){return this.getString()}};function pairs3(arr){let result=[];for(let i3=0;i3<arr.length-1;i3++)result.push([arr[i3],arr[i3+1]]);return result}var GROUND_NET_REGEX=/^(GND|AGND|DGND|PGND|VSS)/i,POWER_NET_REGEX=/^V(?!SS)|^\d+(?:[_.]\d+)?[Vv]/i,Net=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"source_net_id");__publicField(this,"subcircuit_connectivity_map_key",null)}get config(){return{componentName:"Net",zodProps:netProps}}getPortSelector(){return`net.${this.props.name}`}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,isGround=props.isGroundNet??GROUND_NET_REGEX.test(props.name),isPositiveVoltageSource=props.isPowerNet??POWER_NET_REGEX.test(props.name),net=db3.source_net.insert({name:props.name,member_source_group_ids:[],is_ground:isGround,is_power:isPositiveVoltageSource,is_positive_voltage_source:isPositiveVoltageSource});this.source_net_id=net.source_net_id}doInitialSourceParentAttachment(){let subcircuit=this.getSubcircuit();if(!subcircuit)return;let{db:db3}=this.root;db3.source_net.update(this.source_net_id,{subcircuit_id:subcircuit.subcircuit_id})}getAllConnectedPorts(){let allPorts=this.getSubcircuit().selectAll("port"),connectedPorts=[];for(let port of allPorts){let traces=port._getDirectlyConnectedTraces();for(let trace of traces)if(trace._isExplicitlyConnectedToNet(this)){connectedPorts.push(port);break}}return connectedPorts}_getAllDirectlyConnectedTraces(){let allTraces=this.getSubcircuit().selectAll("trace"),connectedTraces=[];for(let trace of allTraces)trace._isExplicitlyConnectedToNet(this)&&connectedTraces.push(trace);return connectedTraces}doInitialPcbRouteNetIslands(){if(this.root?.pcbDisabled||this.getSubcircuit()._parsedProps.routingDisabled||this.getSubcircuit()._isInflatedFromCircuitJson||this.getSubcircuit()._getAutorouterConfig().groupMode!=="sequential-trace")return;let{db:db3}=this.root,{_parsedProps:props}=this,traces=this._getAllDirectlyConnectedTraces().filter(trace=>(trace._portsRoutedOnPcb?.length??0)>0),islands=[];for(let trace of traces){let tracePorts=trace._portsRoutedOnPcb,traceIsland=islands.find(island=>tracePorts.some(port=>island.ports.includes(port)));if(!traceIsland){islands.push({ports:[...tracePorts],traces:[trace]});continue}traceIsland.traces.push(trace),traceIsland.ports.push(...tracePorts)}if(islands.length===0)return;let islandPairs=pairs3(islands);for(let[A7,B5]of islandPairs){let Apositions=A7.ports.map(port=>port._getGlobalPcbPositionBeforeLayout()),Bpositions=B5.ports.map(port=>port._getGlobalPcbPositionBeforeLayout()),closestDist=1/0,closestPair=[-1,-1];for(let i3=0;i3<Apositions.length;i3++){let Apos=Apositions[i3];for(let j5=0;j5<Bpositions.length;j5++){let Bpos=Bpositions[j5],dist=Math.sqrt((Apos.x-Bpos.x)**2+(Apos.y-Bpos.y)**2);dist<closestDist&&(closestDist=dist,closestPair=[i3,j5])}}let Aport=A7.ports[closestPair[0]],Bport=B5.ports[closestPair[1]],pcbElements=db3.toArray().filter(elm=>elm.type==="pcb_smtpad"||elm.type==="pcb_trace"||elm.type==="pcb_plated_hole"||elm.type==="pcb_hole"||elm.type==="source_port"||elm.type==="pcb_port"),{solution}=autoroute2(pcbElements.concat([{type:"source_trace",source_trace_id:"__net_trace_tmp",connected_source_port_ids:[Aport.source_port_id,Bport.source_port_id]}])),trace=solution[0];if(!trace){this.renderError({pcb_trace_error_id:"",pcb_trace_id:"__net_trace_tmp",pcb_component_ids:[Aport.pcb_component_id,Bport.pcb_component_id].filter(Boolean),pcb_port_ids:[Aport.pcb_port_id,Bport.pcb_port_id].filter(Boolean),type:"pcb_trace_error",error_type:"pcb_trace_error",message:`Failed to route net islands for "${this.getString()}"`,source_trace_id:"__net_trace_tmp"});return}db3.pcb_trace.insert(trace)}}renderError(message){if(typeof message=="string")return super.renderError(message);this.root?.db.pcb_trace_error.insert(message)}},createNetsFromProps=(component,props)=>{for(let prop of props)if(typeof prop=="string"&&prop.startsWith("net.")){if(/net\.[^\s>]*\./.test(prop))throw new Error('Net names cannot contain a period, try using "sel.net..." to autocomplete with conventional net names, e.g. V3_3');if(/net\.[^\s>]*[+-]/.test(prop)){let netName=prop.split("net.")[1],message=`Net names cannot contain "+" or "-" (component "${component.componentName}" received "${netName}" via "${prop}"). Try using underscores instead, e.g. VCC_P`;throw new Error(message)}if(/net\.[0-9]/.test(prop)){let netName=prop.split("net.")[1];throw new Error(`Net name "${netName}" cannot start with a number, try using a prefix like "VBUS1"`)}let subcircuit=component.getSubcircuit();if(!subcircuit.selectOne(prop)){let net=new Net({name:prop.split("net.")[1]});subcircuit.add(net)}}},getDistance3=(a3,b4)=>{let aPos="_getGlobalPcbPositionBeforeLayout"in a3?a3._getGlobalPcbPositionBeforeLayout():a3,bPos="_getGlobalPcbPositionBeforeLayout"in b4?b4._getGlobalPcbPositionBeforeLayout():b4;return Math.sqrt((aPos.x-bPos.x)**2+(aPos.y-bPos.y)**2)};function getClosest(point6,candidates){if(candidates.length===0)throw new Error("No candidates given to getClosest method");let closest=candidates[0],closestDist=1/0;for(let candidate of candidates){let dist=getDistance3(point6,candidate);dist<closestDist&&(closest=candidate,closestDist=dist)}return closest}var getPcbBoardOutlinePolygon=pcbBoard=>pcbBoard.outline&&pcbBoard.outline.length>0?new Polygon$1(pcbBoard.outline.map(p5=>point4(p5.x,p5.y))):new Polygon$1(new Box(pcbBoard.center.x-pcbBoard.width/2,pcbBoard.center.y-pcbBoard.height/2,pcbBoard.center.x+pcbBoard.width/2,pcbBoard.center.y+pcbBoard.height/2).toPoints()),isRouteOutsideBoard=({mergedRoute,db:db3,pcbBoardId})=>{let pcbBoard=db3.pcb_board.get(pcbBoardId);if(!pcbBoard)return!1;let boardOutlinePolygon=getPcbBoardOutlinePolygon(pcbBoard);return!mergedRoute.flatMap(getRoutePointPositions).every(routePointPosition=>boardOutlinePolygon.contains(point4(routePointPosition.x,routePointPosition.y)))},isCloseTo2=(a3,b4)=>Math.abs(a3-b4)<1e-4,getObstaclesFromRoute2=(route,source_trace_id,{viaDiameter=.5}={})=>{let obstacles=[];for(let i3=0;i3<route.length-1;i3++){let[start,end]=[route[i3],route[i3+1]],prev=i3-1>=0?route[i3-1]:null,isHorz=isCloseTo2(start.y,end.y),isVert=isCloseTo2(start.x,end.x);if(!isHorz&&!isVert)throw new Error(`getObstaclesFromTrace currently only supports horizontal and vertical traces (not diagonals) Conflicting trace: ${source_trace_id}, start: (${start.x}, ${start.y}), end: (${end.x}, ${end.y})`);let obstacle={type:"rect",layers:[start.layer],center:{x:(start.x+end.x)/2,y:(start.y+end.y)/2},width:isHorz?Math.abs(start.x-end.x):.1,height:isVert?Math.abs(start.y-end.y):.1,connectedTo:[source_trace_id]};if(obstacles.push(obstacle),prev&&prev.layer===start.layer&&start.layer!==end.layer){let via={type:"rect",layers:[start.layer,end.layer],center:{x:start.x,y:start.y},connectedTo:[source_trace_id],width:viaDiameter,height:viaDiameter};obstacles.push(via)}}return obstacles};function fillPolygonWithRects(polygon2,options={}){if(polygon2.length<3)return[];let{rectHeight=.1}=options,rects=[],yCoords=polygon2.map(p5=>p5.y),minY=Math.min(...yCoords),maxY=Math.max(...yCoords);for(let y3=minY;y3<maxY;y3+=rectHeight){let scanlineY=y3+rectHeight/2,intersections=[];for(let i3=0;i3<polygon2.length;i3++){let p12=polygon2[i3],p22=polygon2[(i3+1)%polygon2.length];if(p12.y<=scanlineY&&p22.y>scanlineY||p22.y<=scanlineY&&p12.y>scanlineY){let x4=(scanlineY-p12.y)*(p22.x-p12.x)/(p22.y-p12.y)+p12.x;intersections.push(x4)}}intersections.sort((a3,b4)=>a3-b4);for(let i3=0;i3<intersections.length;i3+=2)if(i3+1<intersections.length){let x12=intersections[i3],width=intersections[i3+1]-x12;width>1e-6&&rects.push({center:{x:x12+width/2,y:scanlineY},width,height:rectHeight})}}return rects}function fillCircleWithRects(circle2,options={}){let{center:center2,radius}=circle2,{rectHeight=.1}=options,rects=[],numSlices=Math.ceil(radius*2/rectHeight);for(let i3=0;i3<numSlices;i3++){let y3=center2.y-radius+(i3+.5)*rectHeight,dy3=y3-center2.y,halfWidth=Math.sqrt(radius*radius-dy3*dy3);halfWidth>0&&rects.push({center:{x:center2.x,y:y3},width:halfWidth*2,height:rectHeight})}return rects}var EVERY_LAYER2=["top","inner1","inner2","bottom"],QUARTER_TURN_TOLERANCE_DEGREES=.01,getAxisAlignedRectFromRotatedRect=rotatedRect=>{let normalizedRotation=(rotatedRect.rotation%360+360)%360,axisAlignedAngles=[0,90,180,270];for(let angle of axisAlignedAngles){if(Math.min(Math.abs(normalizedRotation-angle),360-Math.abs(normalizedRotation-angle))>QUARTER_TURN_TOLERANCE_DEGREES)continue;let isVertical4=angle===90||angle===270;return{center:rotatedRect.center,width:isVertical4?rotatedRect.height:rotatedRect.width,height:isVertical4?rotatedRect.width:rotatedRect.height}}return null},getObstaclesFromCircuitJson2=(circuitJson,connMap)=>{let withNetId=idList=>connMap?idList.concat(idList.map(id3=>connMap?.getNetConnectedToId(id3)).filter(Boolean)):idList,obstacles=[];for(let element of circuitJson){let pcbComponentId=element.pcb_component_id??void 0;if(element.type==="pcb_smtpad"){if(element.shape==="circle")obstacles.push({componentId:pcbComponentId,type:"oval",layers:[element.layer],center:{x:element.x,y:element.y},width:element.radius*2,height:element.radius*2,connectedTo:withNetId([element.pcb_smtpad_id])});else if(element.shape==="rect")obstacles.push({componentId:pcbComponentId,type:"rect",layers:[element.layer],center:{x:element.x,y:element.y},width:element.width,height:element.height,connectedTo:withNetId([element.pcb_smtpad_id])});else if(element.shape==="rotated_rect"){let rotatedRect={center:{x:element.x,y:element.y},width:element.width,height:element.height,rotation:element.ccw_rotation},rect=getAxisAlignedRectFromRotatedRect(rotatedRect)??rotatedRect;obstacles.push({componentId:pcbComponentId,type:"rect",layers:[element.layer],center:rect.center,width:rect.width,height:rect.height,ccwRotationDegrees:element.ccw_rotation,connectedTo:withNetId([element.pcb_smtpad_id])})}else if(element.shape==="pill"||element.shape==="rotated_pill")obstacles.push({componentId:pcbComponentId,type:"rect",layers:[element.layer],center:{x:element.x,y:element.y},width:element.width,height:element.height,...element.shape==="rotated_pill"?{ccwRotationDegrees:element.ccw_rotation}:{},connectedTo:withNetId([element.pcb_smtpad_id])});else if(element.shape==="polygon"){let xs3=element.points.map(point6=>point6.x),ys3=element.points.map(point6=>point6.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);obstacles.push({componentId:pcbComponentId,type:"rect",layers:[element.layer],center:{x:(minX+maxX)/2,y:(minY+maxY)/2},width:maxX-minX,height:maxY-minY,connectedTo:withNetId([element.pcb_smtpad_id])})}}else if(element.type==="pcb_keepout")element.shape==="circle"?obstacles.push({componentId:pcbComponentId,type:"oval",layers:element.layers,center:{x:element.center.x,y:element.center.y},width:element.radius*2,height:element.radius*2,connectedTo:[]}):element.shape==="rect"&&obstacles.push({componentId:pcbComponentId,type:"rect",layers:element.layers,center:{x:element.center.x,y:element.center.y},width:element.width,height:element.height,connectedTo:[]});else if(element.type==="pcb_cutout"){if(element.shape==="rect")obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:{x:element.center.x,y:element.center.y},width:element.width,height:element.height,connectedTo:[]});else if(element.shape==="circle"){let approximatingRects=fillCircleWithRects({center:element.center,radius:element.radius},{rectHeight:.6});for(let rect of approximatingRects)obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:rect.center,width:rect.width,height:rect.height,connectedTo:[]})}else if(element.shape==="polygon"){let approximatingRects=fillPolygonWithRects(element.points,{rectHeight:.6});for(let rect of approximatingRects)obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:rect.center,width:rect.width,height:rect.height,connectedTo:[]})}}else if(element.type==="pcb_hole")element.hole_shape==="oval"?obstacles.push({componentId:pcbComponentId,type:"oval",center:{x:element.x,y:element.y},width:element.hole_width,height:element.hole_height,connectedTo:[]}):element.hole_shape==="pill"||element.hole_shape==="rotated_pill"?obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.hole_width,height:element.hole_height,...element.hole_shape==="rotated_pill"?{ccwRotationDegrees:element.ccw_rotation}:{},connectedTo:[]}):element.hole_shape==="rect"?obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.hole_width,height:element.hole_height,connectedTo:[]}):element.hole_shape==="square"?obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.hole_diameter,height:element.hole_diameter,connectedTo:[]}):(element.hole_shape==="round"||element.hole_shape==="circle")&&obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.hole_diameter,height:element.hole_diameter,connectedTo:[]});else if(element.type==="pcb_plated_hole"){if(element.shape==="circle")obstacles.push({componentId:pcbComponentId,type:"oval",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.outer_diameter,height:element.outer_diameter,connectedTo:withNetId([element.pcb_plated_hole_id])});else if(element.shape==="circular_hole_with_rect_pad")obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.rect_pad_width,height:element.rect_pad_height,connectedTo:withNetId([element.pcb_plated_hole_id])});else if(element.shape==="oval")obstacles.push({componentId:pcbComponentId,type:"oval",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.outer_width,height:element.outer_height,connectedTo:withNetId([element.pcb_plated_hole_id])});else if(element.shape==="pill")obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.outer_width,height:element.outer_height,ccwRotationDegrees:element.ccw_rotation,connectedTo:withNetId([element.pcb_plated_hole_id])});else if(element.shape==="hole_with_polygon_pad"&&"pad_outline"in element&&element.pad_outline&&element.pad_outline.length>0){let xs3=element.pad_outline.map(p5=>element.x+p5.x),ys3=element.pad_outline.map(p5=>element.y+p5.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3),centerX=(minX+maxX)/2,centerY=(minY+maxY)/2;obstacles.push({componentId:pcbComponentId,type:"rect",layers:EVERY_LAYER2,center:{x:centerX,y:centerY},width:maxX-minX,height:maxY-minY,connectedTo:withNetId([element.pcb_plated_hole_id])})}}else if(element.type==="pcb_trace"){let traceObstacles=getObstaclesFromRoute2(element.route.flatMap(rp3=>rp3.route_type==="through_pad"?[{x:rp3.start.x,y:rp3.start.y,layer:rp3.start_layer},{x:rp3.end.x,y:rp3.end.y,layer:rp3.end_layer}]:[{x:rp3.x,y:rp3.y,layer:rp3.route_type==="wire"?rp3.layer:rp3.from_layer}]),element.source_trace_id);obstacles.push(...traceObstacles.map(obstacle=>({...obstacle,componentId:pcbComponentId})))}else if(element.type==="pcb_via"){let netIsAssignable=!!(element.net_is_assignable??element.netIsAssignable);obstacles.push({componentId:pcbComponentId,type:"rect",layers:element.layers,center:{x:element.x,y:element.y},connectedTo:withNetId([element.pcb_via_id]),width:element.outer_diameter,height:element.outer_diameter,netIsAssignable:netIsAssignable||void 0})}}return obstacles},getSchematicNetLabelTextWidth=({text,font_size=.18})=>{let fontScale=font_size/.18,charWidth=.12*fontScale,horizontalPadding=.12*fontScale;return text.length*charWidth+horizontalPadding},computeSchematicNetLabelCenter=({anchor_position,anchor_side,text,font_size=.18})=>{let width=getSchematicNetLabelTextWidth({text,font_size}),height=font_size,center2={...anchor_position};switch(anchor_side){case"right":center2.x-=width/2;break;case"left":center2.x+=width/2;break;case"top":center2.y-=height/2;break;case"bottom":center2.y+=height/2;break}return center2},countComplexElements=(junctions,edges)=>{let count=0;count+=junctions.length??0,count+=edges.filter(edge=>edge.is_crossing).length;for(let i3=1;i3<edges.length;i3++){let prev=edges[i3-1],curr=edges[i3],prevVertical=Math.abs(prev.from.x-prev.to.x)<.01,currVertical=Math.abs(curr.from.x-curr.to.x)<.01;prevVertical!==currVertical&&count++}return count},getEnteringEdgeFromDirection=direction2=>({up:"bottom",down:"top",left:"right",right:"left"})[direction2]??null,getStubEdges=({firstEdge,firstEdgePort,firstDominantDirection,lastEdge,lastEdgePort,lastDominantDirection})=>{if(firstEdge&&firstEdgePort)return getStubEdges({lastEdge:{from:firstEdge.to,to:firstEdge.from},lastEdgePort:firstEdgePort,lastDominantDirection:firstDominantDirection}).reverse().map(e7=>({from:e7.to,to:e7.from}));let edges=[];if(lastEdge&&lastEdgePort){let intermediatePoint={x:lastEdge.to.x,y:lastEdge.to.y};lastDominantDirection==="left"||lastDominantDirection==="right"?(intermediatePoint.x=lastEdgePort.position.x,edges.push({from:lastEdge.to,to:{...intermediatePoint}}),edges.push({from:intermediatePoint,to:{...lastEdgePort.position}})):(intermediatePoint.y=lastEdgePort.position.y,edges.push({from:lastEdge.to,to:{...intermediatePoint}}),edges.push({from:intermediatePoint,to:{...lastEdgePort.position}}))}return edges=edges.filter(e7=>distance2(e7.from,e7.to)>.01),edges};function tryNow(fn3){try{return[fn3(),null]}catch(e7){return[null,e7]}}var autorouterVersion=package_default.version??"unknown",AutorouterError=class extends Error{constructor(message){super(`${message} (capacity-autorouter@${autorouterVersion})`),this.name="AutorouterError"}},TraceConnectionError=class extends Error{constructor(errorData){super(errorData.message);__publicField(this,"errorData");this.errorData=errorData,this.name="TraceConnectionError"}};function Trace__doInitialSchematicTraceRenderWithDisplayLabel(trace){if(trace.root?.schematicDisabled)return;let{db:db3}=trace.root,{_parsedProps:props,parent}=trace;if(!parent)throw new Error("Trace has no parent");let{allPortsFound,portsWithSelectors:connectedPorts}=trace._findConnectedPorts();if(!allPortsFound)return;let portsWithPosition=connectedPorts.map(({port})=>({port,position:port._getGlobalSchematicPositionAfterLayout(),schematic_port_id:port.schematic_port_id,facingDirection:port.facingDirection}));if(portsWithPosition.length<2)throw new Error("Expected at least two ports in portsWithPosition.");let fromPortName,toPortName,fromAnchorPos=portsWithPosition[0].position,fromPort=portsWithPosition[0].port;if("path"in trace.props){if(trace.props.path.length!==2)throw new Error("Invalid 'path': Must contain exactly two elements.");[fromPortName,toPortName]=trace.props.path}else{if(!("from"in trace.props&&"to"in trace.props))throw new Error("Missing 'from' or 'to' properties in props.");fromPortName=trace.props.from,toPortName=trace.props.to}if(!fromPort.source_port_id)throw new Error(`Missing source_port_id for the 'from' port (${fromPortName}).`);let toAnchorPos=portsWithPosition[1].position,toPort=portsWithPosition[1].port;if(!toPort.source_port_id)throw new Error(`Missing source_port_id for the 'to' port (${toPortName}).`);let existingFromNetLabel=db3.schematic_net_label.list().find(label=>label.source_net_id===fromPort.source_port_id),existingToNetLabel=db3.schematic_net_label.list().find(label=>label.source_net_id===toPort.source_port_id),[firstPort,secondPort]=connectedPorts.map(({port})=>port),pinFullName=firstPort.parent?.config.shouldRenderAsSchematicBox?`${firstPort?.parent?.props.name}_${firstPort?.props.name}`:`${secondPort?.parent?.props.name}_${secondPort?.props.name}`,netLabelText=trace._getSchematicNetLabelText()??pinFullName;if(existingFromNetLabel&&existingFromNetLabel.text!==netLabelText&&(existingFromNetLabel.text=`${netLabelText} / ${existingFromNetLabel.text}`),existingToNetLabel&&existingToNetLabel?.text!==netLabelText&&(existingToNetLabel.text=`${netLabelText} / ${existingToNetLabel.text}`),!existingToNetLabel){let toSide=getEnteringEdgeFromDirection(toPort.facingDirection)??"bottom";db3.schematic_net_label.insert({text:netLabelText,source_net_id:toPort.source_port_id,anchor_position:toAnchorPos,center:computeSchematicNetLabelCenter({anchor_position:toAnchorPos,anchor_side:toSide,text:netLabelText}),anchor_side:toSide,schematic_sheet_id:trace._resolveSchematicSheetId()})}if(!existingFromNetLabel){let fromSide=getEnteringEdgeFromDirection(fromPort.facingDirection)??"bottom";db3.schematic_net_label.insert({text:netLabelText,source_net_id:fromPort.source_port_id,anchor_position:fromAnchorPos,center:computeSchematicNetLabelCenter({anchor_position:fromAnchorPos,anchor_side:fromSide,text:netLabelText}),anchor_side:fromSide,schematic_sheet_id:trace._resolveSchematicSheetId()})}}function Trace__findConnectedPorts(trace){let{_parsedProps:props,parent}=trace;if(!parent)throw new Error("Trace has no parent");let portSelectors=trace.getTracePortPathSelectors(),resolveImplicitSinglePort=selector=>{if(selector.lastIndexOf(".")>selector.lastIndexOf(" "))return null;let targetComponent=trace.getSubcircuit().selectOne(selector);if(!targetComponent&&!/[.#\[]/.test(selector)&&(targetComponent=trace.getSubcircuit().selectOne(`.${selector}`)),!targetComponent)return null;let ports=targetComponent.children.filter(c6=>c6.componentName==="Port");return ports.length===1?ports[0]:null},portsWithSelectors=portSelectors.map(selector=>({selector,port:trace.getSubcircuit().selectOne(selector,{type:"port"})??resolveImplicitSinglePort(selector)}));for(let{selector,port}of portsWithSelectors)if(!port){let parentSelector,portToken,dotIndex=selector.lastIndexOf(".");if(dotIndex!==-1&&dotIndex>selector.lastIndexOf(" "))parentSelector=selector.slice(0,dotIndex),portToken=selector.slice(dotIndex+1);else{let match2=selector.match(/^(.*[ >])?([^ >]+)$/);parentSelector=match2?.[1]?.trim()??"",portToken=match2?.[2]??selector}let targetComponent=parentSelector?trace.getSubcircuit().selectOne(parentSelector):null;if(!targetComponent&&parentSelector&&!/[.#\[]/.test(parentSelector)&&(targetComponent=trace.getSubcircuit().selectOne(`.${parentSelector}`)),!targetComponent){let errorMessage2=parentSelector?`Could not find port for selector "${selector}". Component "${parentSelector}" not found`:`Could not find port for selector "${selector}"`,subcircuit2=trace.getSubcircuit(),sourceGroup2=subcircuit2.getGroup();throw new TraceConnectionError({error_type:"source_trace_not_connected_error",message:errorMessage2,subcircuit_id:subcircuit2.subcircuit_id??void 0,source_group_id:sourceGroup2?.source_group_id??void 0,source_trace_id:trace.source_trace_id??void 0,selectors_not_found:[selector]})}let ports=targetComponent.children.filter(c6=>c6.componentName==="Port"),portLabel=portToken.includes(".")?portToken.split(".").pop()??"":portToken,portNames=ports.flatMap(c6=>c6.getNameAndAliases()),hasCustomLabels=portNames.some(n3=>!/^(pin\d+|\d+)$/.test(n3)),labelList=Array.from(new Set(portNames)).join(", "),detail;ports.length===0?detail="It has no ports":hasCustomLabels?detail=`It has [${labelList}]`:detail=`It has ${ports.length} pins and no pinLabels (consider adding pinLabels)`;let errorMessage=`Could not find port for selector "${selector}". Component "${targetComponent.props.name??parentSelector}" found, but does not have pin "${portLabel}". ${detail}`,subcircuit=trace.getSubcircuit(),sourceGroup=subcircuit.getGroup();throw new TraceConnectionError({error_type:"source_trace_not_connected_error",message:errorMessage,subcircuit_id:subcircuit.subcircuit_id??void 0,source_group_id:sourceGroup?.source_group_id??void 0,source_trace_id:trace.source_trace_id??void 0,selectors_not_found:[selector]})}return portsWithSelectors.some(p5=>!p5.port)?{allPortsFound:!1}:{allPortsFound:!0,portsWithSelectors,ports:portsWithSelectors.map(({port})=>port)}}function getTraceLength2(route){let totalLength=0;for(let i3=0;i3<route.length;i3++){let point6=route[i3];if(point6.route_type==="wire"){let nextPoint=route[i3+1];if(nextPoint){let nextPosition=getRoutePointPosition(nextPoint),position4=getRoutePointPosition(point6),dx3=nextPosition.x-position4.x,dy3=nextPosition.y-position4.y;totalLength+=Math.sqrt(dx3*dx3+dy3*dy3)}}else point6.route_type==="via"&&(totalLength+=1.6)}return totalLength}function computeLineRectIntersection(params){let{lineStart,lineEnd,rectCenter,rectWidth,rectHeight}=params,left=rectCenter.x-rectWidth/2,right=rectCenter.x+rectWidth/2,top=rectCenter.y+rectHeight/2,bottom=rectCenter.y-rectHeight/2,dx3=lineEnd.x-lineStart.x,dy3=lineEnd.y-lineStart.y,intersections=[];if(dx3!==0){let t54=(left-lineStart.x)/dx3;if(t54>=0&&t54<=1){let y3=lineStart.y+t54*dy3;y3>=bottom&&y3<=top&&intersections.push({x:left,y:y3,t:t54})}}if(dx3!==0){let t54=(right-lineStart.x)/dx3;if(t54>=0&&t54<=1){let y3=lineStart.y+t54*dy3;y3>=bottom&&y3<=top&&intersections.push({x:right,y:y3,t:t54})}}if(dy3!==0){let t54=(bottom-lineStart.y)/dy3;if(t54>=0&&t54<=1){let x4=lineStart.x+t54*dx3;x4>=left&&x4<=right&&intersections.push({x:x4,y:bottom,t:t54})}}if(dy3!==0){let t54=(top-lineStart.y)/dy3;if(t54>=0&&t54<=1){let x4=lineStart.x+t54*dx3;x4>=left&&x4<=right&&intersections.push({x:x4,y:top,t:t54})}}return intersections.length===0?null:(intersections.sort((a3,b4)=>a3.t-b4.t),{x:intersections[0].x,y:intersections[0].y})}function computeLineCircleIntersection(params){let{lineStart,lineEnd,circleCenter,circleRadius}=params,x12=lineStart.x-circleCenter.x,y12=lineStart.y-circleCenter.y,x22=lineEnd.x-circleCenter.x,y22=lineEnd.y-circleCenter.y,dx3=x22-x12,dy3=y22-y12,a3=dx3*dx3+dy3*dy3,b4=2*(x12*dx3+y12*dy3),c6=x12*x12+y12*y12-circleRadius*circleRadius,discriminant=b4*b4-4*a3*c6;if(discriminant<0)return null;let sqrtDisc=Math.sqrt(discriminant),t110=(-b4-sqrtDisc)/(2*a3),t210=(-b4+sqrtDisc)/(2*a3),t54=null;return t110>=0&&t110<=1?t54=t110:t210>=0&&t210<=1&&(t54=t210),t54===null?null:{x:lineStart.x+t54*dx3,y:lineStart.y+t54*dy3}}function clipTraceEndAtPad(params){let{traceStart,traceEnd,traceWidth,port}=params,pcbPrimitive=port.matchedComponents.find(c6=>c6.isPcbPrimitive);if(!pcbPrimitive)return traceEnd;let padBounds=pcbPrimitive._getPcbCircuitJsonBounds(),padWidth=padBounds.width,padHeight=padBounds.height,padCenter=padBounds.center,smallestPadDimension=Math.min(padWidth,padHeight);if(traceWidth<=smallestPadDimension/2)return traceEnd;let clippedPoint=null;if(pcbPrimitive.componentName==="SmtPad"){let smtPad=pcbPrimitive,padShape=smtPad._parsedProps.shape;if(padShape==="circle"){let radius=smtPad._parsedProps.radius;clippedPoint=computeLineCircleIntersection({lineStart:traceStart,lineEnd:traceEnd,circleCenter:padCenter,circleRadius:radius})}else(padShape==="rect"||padShape==="rotated_rect"||padShape==="pill"||padShape==="polygon")&&(clippedPoint=computeLineRectIntersection({lineStart:traceStart,lineEnd:traceEnd,rectCenter:padCenter,rectWidth:padWidth,rectHeight:padHeight}))}else if(pcbPrimitive.componentName==="PlatedHole"){let platedHole=pcbPrimitive;if(platedHole._parsedProps.shape==="circle"){let outerDiameter=platedHole._parsedProps.outerDiameter;clippedPoint=computeLineCircleIntersection({lineStart:traceStart,lineEnd:traceEnd,circleCenter:padCenter,circleRadius:outerDiameter/2})}else clippedPoint=computeLineRectIntersection({lineStart:traceStart,lineEnd:traceEnd,rectCenter:padCenter,rectWidth:padWidth,rectHeight:padHeight})}return clippedPoint??traceEnd}var DEFAULT_VIA_HOLE_DIAMETER=.2,DEFAULT_VIA_PAD_DIAMETER=.3,parseDistance=(value,fallback)=>{if(value===void 0)return fallback;if(typeof value=="number")return value;let parsed=parseFloat(value);return Number.isFinite(parsed)?parsed:fallback},getViaDiameterDefaults=pcbStyle2=>({holeDiameter:parseDistance(pcbStyle2?.viaHoleDiameter,DEFAULT_VIA_HOLE_DIAMETER),padDiameter:parseDistance(pcbStyle2?.viaPadDiameter,DEFAULT_VIA_PAD_DIAMETER)}),getViaDiameterDefaultsWithOverrides=(overrides,pcbStyle2)=>{let defaults=getViaDiameterDefaults(pcbStyle2);return{holeDiameter:overrides.holeDiameter??defaults.holeDiameter,padDiameter:overrides.padDiameter??defaults.padDiameter}},areAllPcbPrimitivesOverlapping=pcbPrimitives=>{if(pcbPrimitives.length<=1)return!0;let bounds=pcbPrimitives.map(p5=>{let circuitBounds=p5._getPcbCircuitJsonBounds();return{left:circuitBounds.bounds.left,right:circuitBounds.bounds.right,top:circuitBounds.bounds.top,bottom:circuitBounds.bounds.bottom}}),overlaps=Array(bounds.length).fill(!1).map(()=>Array(bounds.length).fill(!1));for(let i3=0;i3<bounds.length;i3++)for(let j5=i3+1;j5<bounds.length;j5++){let a3=bounds[i3],b4=bounds[j5];overlaps[i3][j5]=overlaps[j5][i3]=!(a3.right<b4.left||a3.left>b4.right||a3.bottom>b4.top||a3.top<b4.bottom)}let visited=new Set,dfs=node=>{visited.add(node);for(let i3=0;i3<bounds.length;i3++)overlaps[node][i3]&&!visited.has(i3)&&dfs(i3)};return dfs(0),visited.size===bounds.length};function formatPcbPrimitiveForError(component){let aliases2=(component._parsedProps?.portHints??[]).filter(Boolean);return aliases2.length>0?`<${component.lowercaseComponentName}(${aliases2.map(alias=>`.${alias}`).join(", ")}) />`:`<${component.lowercaseComponentName} />`}function getPcbSelectorErrorForTracePort(selector,port){let pcbMatches=port.matchedComponents.filter(c6=>c6.isPcbPrimitive),parentName=port.getParentNormalComponent()?.props.name??port.parent?.props.name??"unknown",parentNormalComponent=port.getParentNormalComponent(),selectorToken=selector.trim().split(/\s+|>/).filter(Boolean).at(-1)?.replace(/^port\./,"").replace(/^\./,"");if(selectorToken&&!/^(pin)?\d+$/.test(selectorToken)){let siblingPorts=(parentNormalComponent?.children??[]).filter(child=>child.componentName==="Port"&&child.isMatchingAnyOf([selectorToken])),matchingPortsAreInternallyConnected=(parentNormalComponent?._getInternallyConnectedPins?.()??[]).some(group=>siblingPorts.every(siblingPort=>group.includes(siblingPort)));if(siblingPorts.length>1&&!matchingPortsAreInternallyConnected){let rawPinSelectors2=Array.from(new Set(siblingPorts.flatMap(siblingPort=>siblingPort.getNameAndAliases().filter(alias=>/^pin\d+$/.test(alias)).map(alias=>`${parentName}.${alias}`)))),suggestion=rawPinSelectors2.length>0?` Use a raw pin selector like ${rawPinSelectors2.map(s6=>`"${s6}"`).join(" or ")}.`:"",siblingPcbMatches=siblingPorts.flatMap(siblingPort=>siblingPort.matchedComponents.filter(component=>component.isPcbPrimitive));return`Trace selector "${selector}" resolved to "${parentName}.${port.props.name}", but alias "${selectorToken}" matches multiple PCB pads: ${siblingPcbMatches.map(component=>formatPcbPrimitiveForError(component)).join(", ")}.${suggestion}`}}if(port.pcb_port_id)return null;let rawPinSelectors=Array.from(new Set(port.getNameAndAliases().filter(alias=>/^pin\d+$/.test(alias)).map(alias=>`${parentName}.${alias}`)));if(pcbMatches.length>1&&!areAllPcbPrimitivesOverlapping(pcbMatches)){let suggestion=rawPinSelectors.length>0?` Use a raw pin selector like ${rawPinSelectors.map(s6=>`"${s6}"`).join(" or ")}.`:"";return`Trace selector "${selector}" resolved to "${parentName}.${port.props.name}", but that target maps to multiple non-overlapping PCB pads: ${pcbMatches.map(c6=>formatPcbPrimitiveForError(c6)).join(", ")}.${suggestion}`}return null}var jlcMinTolerances2={min_trace_width:.1,min_via_hole_edge_to_via_hole_edge_clearance:.1,min_plated_hole_drill_edge_to_drill_edge_clearance:.15,min_trace_to_pad_edge_clearance:.1,min_pad_edge_to_pad_edge_clearance:.1,min_board_edge_clearance:.2,min_via_hole_diameter:.2,min_via_pad_diameter:.3},getViaSpanLayers=({fromLayer,toLayer,layerCount})=>{if(fromLayer===toLayer)return[fromLayer];let stack=["top"];for(let i3=1;i3<=layerCount-2;i3++)stack.push(`inner${i3}`);stack.push("bottom");let fromIndex=stack.indexOf(fromLayer),toIndex=stack.indexOf(toLayer);return fromIndex===-1||toIndex===-1?[fromLayer,toLayer]:fromIndex<=toIndex?stack.slice(fromIndex,toIndex+1):stack.slice(toIndex,fromIndex+1).reverse()},getViaBoardLayers=layerCount=>layerCount<=1?["top"]:getViaSpanLayers({fromLayer:"top",toLayer:"bottom",layerCount}),findInflatedPcbViaForPoint=(vias,point6)=>{if(point6.route_type==="via")return vias?.find(via=>Math.abs(via.x-point6.x)<1e-4&&Math.abs(via.y-point6.y)<1e-4&&(!via.from_layer||via.from_layer===point6.from_layer)&&(!via.to_layer||via.to_layer===point6.to_layer))},getViaDiameterFromRoutePoint=point6=>{let viaPoint=point6;return{holeDiameter:viaPoint.hole_diameter??viaPoint.via_hole_diameter,outerDiameter:viaPoint.outer_diameter??viaPoint.via_diameter}};function Trace_doInitialPcbManualTraceRender(trace){if(trace.root?.pcbDisabled)return;let{db:db3}=trace.root,{_parsedProps:props}=trace,subcircuit=trace.getSubcircuit(),hasPcbPath=props.pcbPath!==void 0,wantsStraightLine=!!props.pcbStraightLine,inflatedPcbTraces=trace._inflatedPcbTraces??[];if(!hasPcbPath&&!wantsStraightLine&&inflatedPcbTraces.length===0)return;let allPortsFound,ports,portsWithSelectors;try{let connectedPorts=trace._findConnectedPorts();allPortsFound=connectedPorts.allPortsFound,ports=connectedPorts.ports??[],portsWithSelectors=connectedPorts.portsWithSelectors??[]}catch(error2){if(error2 instanceof TraceConnectionError){db3.source_trace_not_connected_error.insert({...error2.errorData,error_type:"source_trace_not_connected_error"}),trace._couldNotFindPort=!0;return}throw error2}if(!allPortsFound)return;let pcbSelectorError=portsWithSelectors.map(({selector,port})=>getPcbSelectorErrorForTracePort(selector,port)).find(Boolean);if(pcbSelectorError){db3.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:trace.source_trace_id,message:pcbSelectorError,pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:ports.map(p5=>p5.pcb_port_id).filter(Boolean)});return}let portsWithoutMatchedPcbPrimitive=[];for(let port of ports)port._hasMatchedPcbPrimitive()||portsWithoutMatchedPcbPrimitive.push(port);if(portsWithoutMatchedPcbPrimitive.length>0){db3.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:trace.source_trace_id,message:`Some ports did not have a matching PCB primitive (e.g. a pad or plated hole), this can happen if a footprint is missing. As a result, ${trace} wasn't routed. Missing ports: ${portsWithoutMatchedPcbPrimitive.map(p5=>p5.getString()).join(", ")}`,pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:portsWithoutMatchedPcbPrimitive.map(p5=>p5.pcb_port_id).filter(Boolean)});return}let width=trace._getExplicitTraceThickness()??trace.getSubcircuit()._parsedProps.minTraceWidth??jlcMinTolerances2.min_trace_width;if(inflatedPcbTraces.length>0){let{maybeFlipLayer}=trace._getPcbPrimitiveFlippedHelpers(),transform22=trace._computePcbGlobalTransformBeforeLayout(),insertedRoutes=[],subcircuitConnectivityMapKey2=trace.subcircuit_connectivity_map_key??db3.source_trace.get(trace.source_trace_id)?.subcircuit_connectivity_map_key;for(let inflatedPcbTrace of inflatedPcbTraces){let transformedRoute=inflatedPcbTrace.route.map(point6=>{if(point6.route_type==="wire"){let{x:x4,y:y3,...restOfPoint}=point6,transformedPoint=applyToPoint2(transform22,{x:x4,y:y3});return{...restOfPoint,...transformedPoint,layer:maybeFlipLayer(point6.layer)}}if(point6.route_type==="via"){let{x:x4,y:y3,...restOfPoint}=point6,transformedPoint=applyToPoint2(transform22,{x:x4,y:y3});return{...restOfPoint,...transformedPoint,from_layer:maybeFlipLayer(point6.from_layer),to_layer:maybeFlipLayer(point6.to_layer)}}return{...point6,start:applyToPoint2(transform22,point6.start),end:applyToPoint2(transform22,point6.end),start_layer:maybeFlipLayer(point6.start_layer),end_layer:maybeFlipLayer(point6.end_layer)}}),pcb_trace22=db3.pcb_trace.insert({...inflatedPcbTrace,route:transformedRoute,source_trace_id:trace.source_trace_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:trace.getGroup()?.pcb_group_id??void 0}),pcbStyle22=trace.getInheritedMergedProperty("pcbStyle"),{holeDiameter:holeDiameter2,padDiameter:padDiameter2}=getViaDiameterDefaults(pcbStyle22);for(let index=0;index<transformedRoute.length;index++){let point6=transformedRoute[index];if(point6.route_type==="via"){let originalPoint=inflatedPcbTrace.route[index],inflatedPcbVia=findInflatedPcbViaForPoint(trace._inflatedPcbVias,originalPoint),routePointViaDiameter=getViaDiameterFromRoutePoint(point6),fromLayer=maybeFlipLayer(inflatedPcbVia?.from_layer??point6.from_layer),toLayer=maybeFlipLayer(inflatedPcbVia?.to_layer??point6.to_layer),layers=(inflatedPcbVia?.layers??getViaSpanLayers({fromLayer:point6.from_layer,toLayer:point6.to_layer,layerCount:subcircuit._getSubcircuitLayerCount()})).map(layer2=>maybeFlipLayer(layer2));db3.pcb_via.insert({pcb_trace_id:pcb_trace22.pcb_trace_id,x:point6.x,y:point6.y,hole_diameter:inflatedPcbVia?.hole_diameter??routePointViaDiameter.holeDiameter??holeDiameter2,outer_diameter:inflatedPcbVia?.outer_diameter??routePointViaDiameter.outerDiameter??padDiameter2,layers,from_layer:fromLayer,to_layer:toLayer,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:trace.getGroup()?.pcb_group_id??void 0,subcircuit_connectivity_map_key:inflatedPcbVia?.subcircuit_connectivity_map_key??subcircuitConnectivityMapKey2,net_is_assignable:inflatedPcbVia?.net_is_assignable,net_assigned:inflatedPcbVia?.net_assigned,is_tented:inflatedPcbVia?.is_tented})}}trace.pcb_trace_id||(trace.pcb_trace_id=pcb_trace22.pcb_trace_id),insertedRoutes.push(pcb_trace22.route)}for(let route2 of insertedRoutes)trace._insertErrorIfTraceIsOutsideBoard(route2,ports);trace._portsRoutedOnPcb=ports;return}if(wantsStraightLine&&!hasPcbPath){if(!ports||ports.length<2){trace.renderError("pcbStraightLine requires exactly two connected ports");return}let[startPort,endPort]=ports,startLayers=startPort.getAvailablePcbLayers(),endLayers=endPort.getAvailablePcbLayers(),layer2=startLayers.find(layer3=>endLayers.includes(layer3))??startLayers[0]??endLayers[0]??"top",startPos=startPort._getGlobalPcbPositionAfterLayout(),endPos=endPort._getGlobalPcbPositionAfterLayout(),clippedStartPos=clipTraceEndAtPad({traceStart:endPos,traceEnd:startPos,traceWidth:width,port:startPort}),clippedEndPos=clipTraceEndAtPad({traceStart:startPos,traceEnd:endPos,traceWidth:width,port:endPort}),route2=[{route_type:"wire",x:clippedStartPos.x,y:clippedStartPos.y,width,layer:layer2,start_pcb_port_id:startPort.pcb_port_id},{route_type:"wire",x:clippedEndPos.x,y:clippedEndPos.y,width,layer:layer2,end_pcb_port_id:endPort.pcb_port_id}],traceLength2=getTraceLength2(route2),pcb_trace22=db3.pcb_trace.insert({route:route2,source_trace_id:trace.source_trace_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:trace.getGroup()?.pcb_group_id??void 0,trace_length:traceLength2});trace._portsRoutedOnPcb=ports,trace.pcb_trace_id=pcb_trace22.pcb_trace_id,trace._insertErrorIfTraceIsOutsideBoard(route2,ports);return}if(!props.pcbPath)return;let anchorPort;props.pcbPathRelativeTo&&(anchorPort=portsWithSelectors.find(p5=>p5.selector===props.pcbPathRelativeTo)?.port,anchorPort||(anchorPort=trace.getSubcircuit().selectOne(props.pcbPathRelativeTo))),anchorPort||(anchorPort=ports[0]);let otherPort=ports.find(p5=>p5!==anchorPort)??ports[1],currentLayer=anchorPort.getAvailablePcbLayers()[0]||"top",anchorPos=anchorPort._getGlobalPcbPositionAfterLayout(),otherPos=otherPort?._getGlobalPcbPositionAfterLayout(),route=[];route.push({route_type:"wire",x:anchorPos.x,y:anchorPos.y,width,layer:currentLayer,start_pcb_port_id:anchorPort.pcb_port_id});let transform7=subcircuit._isInflatedFromCircuitJson?trace._computePcbGlobalTransformBeforeLayout():anchorPort?._computePcbGlobalTransformBeforeLayout?.()||identity(),pcbPath2=props.pcbPath;for(let pt3 of pcbPath2){let coordinates,isGlobalPosition=!1,isViaPoint2=typeof pt3!="string"&&pt3.via,viaFromLayer,viaToLayer;if(typeof pt3=="string"){let resolvedPort=trace.getSubcircuit().selectOne(pt3,{type:"port"});if(!resolvedPort){db3.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:trace.source_trace_id,message:`Could not resolve pcbPath selector "${pt3}" for ${trace}`,pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:[]});continue}let pcbTargetError=getPcbSelectorErrorForTracePort(pt3,resolvedPort);if(pcbTargetError){db3.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:trace.source_trace_id,message:pcbTargetError,pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:[]});return}let portPos=resolvedPort._getGlobalPcbPositionAfterLayout();coordinates={x:portPos.x,y:portPos.y},isGlobalPosition=!0}else coordinates={x:pt3.x,y:pt3.y},isGlobalPosition=!1,pt3.via&&(viaFromLayer=pt3.fromLayer??currentLayer,viaToLayer=pt3.toLayer);let finalCoordinates=isGlobalPosition?coordinates:applyToPoint2(transform7,coordinates);isViaPoint2?(route.push({route_type:"via",x:finalCoordinates.x,y:finalCoordinates.y,from_layer:viaFromLayer??currentLayer,to_layer:viaToLayer??currentLayer}),currentLayer=viaToLayer??currentLayer):route.push({route_type:"wire",x:finalCoordinates.x,y:finalCoordinates.y,width,layer:currentLayer})}otherPort&&otherPos&&route.push({route_type:"wire",x:otherPos.x,y:otherPos.y,width,layer:currentLayer,end_pcb_port_id:otherPort.pcb_port_id});let traceLength=getTraceLength2(route),pcb_trace3=db3.pcb_trace.insert({route,source_trace_id:trace.source_trace_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:trace.getGroup()?.pcb_group_id??void 0,trace_length:traceLength}),subcircuitConnectivityMapKey=trace.subcircuit_connectivity_map_key??db3.source_trace.get(trace.source_trace_id)?.subcircuit_connectivity_map_key,pcbStyle2=trace.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2);for(let point6 of route)if(point6.route_type==="via"){let fromLayer=point6.from_layer,toLayer=point6.to_layer;db3.pcb_via.insert({pcb_trace_id:pcb_trace3.pcb_trace_id,x:point6.x,y:point6.y,hole_diameter:holeDiameter,outer_diameter:padDiameter,layers:getViaSpanLayers({fromLayer,toLayer,layerCount:subcircuit._getSubcircuitLayerCount()}),from_layer:fromLayer,to_layer:toLayer,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:trace.getGroup()?.pcb_group_id??void 0,subcircuit_connectivity_map_key:subcircuitConnectivityMapKey})}trace._portsRoutedOnPcb=ports,trace.pcb_trace_id=pcb_trace3.pcb_trace_id,trace._insertErrorIfTraceIsOutsideBoard(route,ports)}var portToObjective=port=>({...port._getGlobalPcbPositionAfterLayout(),layers:port.getAvailablePcbLayers()}),SHOULD_USE_SINGLE_LAYER_ROUTING=!1,getDistanceToRouteObjective=(point6,objective)=>{let position4=getRoutePointPosition(point6);return Math.hypot(position4.x-objective.x,position4.y-objective.y)},reverseRouteDirection=route=>route.slice().reverse().map(point6=>point6.route_type==="via"?{...point6}:point6.route_type==="through_pad"?{...point6,start:point6.end,end:point6.start,start_layer:point6.end_layer,end_layer:point6.start_layer}:{...point6}),ensureRouteStartsAtObjective=(route,objective)=>{if(route.length<2)return route;let firstPoint=route[0],lastPoint=route[route.length-1];return getDistanceToRouteObjective(lastPoint,objective)<getDistanceToRouteObjective(firstPoint,objective)?reverseRouteDirection(route):route};function Trace_doInitialPcbTraceRender(trace){if(trace.root?.pcbDisabled)return;let{db:db3}=trace.root,{_parsedProps:props,parent}=trace,subcircuit=trace.getSubcircuit();if(!parent)throw new Error("Trace has no parent");if(subcircuit._parsedProps.routingDisabled||subcircuit._isInflatedFromCircuitJson)return;let cachedRoute=subcircuit._parsedProps.pcbRouteCache?.pcbTraces;if(cachedRoute){let pcb_trace22=db3.pcb_trace.insert({route:cachedRoute.flatMap(trace2=>trace2.route),source_trace_id:trace.source_trace_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:trace.getGroup()?.pcb_group_id??void 0});trace.pcb_trace_id=pcb_trace22.pcb_trace_id;return}if(props.pcbPath&&props.pcbPath.length>0||props.pcbStraightLine||!subcircuit._shouldUseTraceByTraceRouting())return;let allPortsFound,ports,portsWithSelectors;try{let connectedPorts=trace._findConnectedPorts();allPortsFound=connectedPorts.allPortsFound,ports=connectedPorts.ports??[],portsWithSelectors=connectedPorts.portsWithSelectors??[]}catch(error2){if(error2 instanceof TraceConnectionError){db3.source_trace_not_connected_error.insert({...error2.errorData,error_type:"source_trace_not_connected_error"}),trace._couldNotFindPort=!0;return}throw error2}let portsConnectedOnPcbViaNet=[];if(!allPortsFound)return;let pcbSelectorError=portsWithSelectors.map(({selector,port})=>getPcbSelectorErrorForTracePort(selector,port)).find(Boolean);if(pcbSelectorError){db3.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:trace.source_trace_id,message:pcbSelectorError,pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:ports.map(p5=>p5.pcb_port_id).filter(Boolean)});return}let portsWithoutMatchedPcbPrimitive=[];for(let port of ports)port._hasMatchedPcbPrimitive()||portsWithoutMatchedPcbPrimitive.push(port);if(portsWithoutMatchedPcbPrimitive.length>0){db3.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:trace.source_trace_id,message:`Some ports did not have a matching PCB primitive (e.g. a pad or plated hole), this can happen if a footprint is missing. As a result, ${trace} wasn't routed. Missing ports: ${portsWithoutMatchedPcbPrimitive.map(p5=>p5.getString()).join(", ")}`,pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:portsWithoutMatchedPcbPrimitive.map(p5=>p5.pcb_port_id).filter(Boolean)});return}let nets=trace._findConnectedNets().netsWithSelectors;if(ports.length===0&&nets.length===2){let[netA,netB]=nets.map(({net})=>net),netAPorts=netA.getAllConnectedPorts(),netBPorts=netB.getAllConnectedPorts();if(netAPorts.length===0||netBPorts.length===0){console.log("Nothing to connect this net to, one of the nets is empty. TODO should emit a warning!");return}let closestPortPair=[netAPorts[0],netBPorts[0]],closestDistance=1/0;for(let netAPort of netAPorts){let closestNetBPort=getClosest(netAPort,netBPorts),netAPortPosition=netAPort._getGlobalPcbPositionBeforeLayout(),netBPortPosition=closestNetBPort._getGlobalPcbPositionBeforeLayout(),distance18=Math.sqrt((netAPortPosition.x-netBPortPosition.x)**2+(netAPortPosition.y-netBPortPosition.y)**2);distance18<closestDistance&&(closestDistance=distance18,closestPortPair=[netAPort,closestNetBPort])}ports.push(...closestPortPair)}else if(ports.length===1&&nets.length===1){let port=ports[0],otherPortsInNet=nets[0].net.getAllConnectedPorts().filter(p5=>p5!==port);if(otherPortsInNet.length===0){console.log("Nothing to connect this port to, the net is empty. TODO should emit a warning!");return}let closestPortInNet=getClosest(port,otherPortsInNet);portsConnectedOnPcbViaNet.push(closestPortInNet),ports.push(closestPortInNet)}else if(ports.length>1&&nets.length>=1){trace.renderError("Trace has more than one port and one or more nets, we don't currently support this type of complex trace routing");return}let hints=ports.flatMap(port=>port.matchedComponents.filter(c6=>c6.componentName==="TraceHint")),pcbRouteHints=(trace._parsedProps.pcbRouteHints??[]).concat(hints.flatMap(h3=>h3.getPcbRouteHints()));if(ports.length>2){trace.renderError(`Trace has more than two ports (${ports.map(p5=>p5.getString()).join(", ")}), routing between more than two ports for a single trace is not implemented`);return}if(trace.getSubcircuit().selectAll("trace").filter(trace2=>trace2.renderPhaseStates.PcbTraceRender.initialized).some(trace2=>trace2._portsRoutedOnPcb.length===ports.length&&trace2._portsRoutedOnPcb.every(portRoutedByOtherTrace=>ports.includes(portRoutedByOtherTrace))))return;let orderedRouteObjectives=[];pcbRouteHints.length===0?orderedRouteObjectives=[portToObjective(ports[0]),portToObjective(ports[1])]:orderedRouteObjectives=[portToObjective(ports[0]),...pcbRouteHints,portToObjective(ports[1])];let candidateLayerCombinations=findPossibleTraceLayerCombinations(orderedRouteObjectives);if(SHOULD_USE_SINGLE_LAYER_ROUTING&&candidateLayerCombinations.length===0){trace.renderError(`Could not find a common layer (using hints) for trace ${trace.getString()}`);return}let connMap=getFullConnectivityMapFromCircuitJson(trace.root.db.toArray()),[obstacles,errGettingObstacles]=tryNow(()=>getObstaclesFromCircuitJson2(trace.root.db.toArray()));if(errGettingObstacles){trace.renderError({type:"pcb_trace_error",error_type:"pcb_trace_error",pcb_trace_error_id:trace.pcb_trace_id,message:`Error getting obstacles for autorouting: ${errGettingObstacles.message}`,source_trace_id:trace.source_trace_id,center:{x:0,y:0},pcb_port_ids:ports.map(p5=>p5.pcb_port_id),pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[]});return}for(let obstacle of obstacles)if(obstacle.connectedTo.length>0){let netId=connMap.getNetConnectedToId(obstacle.connectedTo[0]);netId&&obstacle.connectedTo.push(netId)}let orderedRoutePoints=[];if(candidateLayerCombinations.length===0)orderedRoutePoints=orderedRouteObjectives;else{let candidateLayerSelections=candidateLayerCombinations[0].layer_path;orderedRoutePoints=orderedRouteObjectives.map((t54,idx)=>t54.via?{...t54,via_to_layer:candidateLayerSelections[idx]}:{...t54,layers:[candidateLayerSelections[idx]]})}orderedRoutePoints[0].pcb_port_id=ports[0].pcb_port_id,orderedRoutePoints[orderedRoutePoints.length-1].pcb_port_id=ports[1].pcb_port_id;let routes=[];for(let[a3,b4]of pairs3(orderedRoutePoints)){let dominantLayer="via_to_layer"in a3?a3.via_to_layer:null,BOUNDS_MARGIN=2,aLayer="layers"in a3&&a3.layers.length===1?a3.layers[0]:dominantLayer??"top",bLayer="layers"in b4&&b4.layers.length===1?b4.layers[0]:dominantLayer??"top",pcbPortA="pcb_port_id"in a3?a3.pcb_port_id:null,pcbPortB="pcb_port_id"in b4?b4.pcb_port_id:null,minTraceWidth=trace._getExplicitTraceThickness()??trace.getSubcircuit()._parsedProps.minTraceWidth??jlcMinTolerances2.min_trace_width,ijump=new MultilayerIjump({OBSTACLE_MARGIN:minTraceWidth*2,isRemovePathLoopsEnabled:!0,optimizeWithGoalBoxes:!!(pcbPortA&&pcbPortB),connMap,input:{obstacles,minTraceWidth,connections:[{name:trace.source_trace_id,pointsToConnect:[{...a3,layer:aLayer,pcb_port_id:pcbPortA},{...b4,layer:bLayer,pcb_port_id:pcbPortB}]}],layerCount:trace.getSubcircuit()._getSubcircuitLayerCount(),bounds:{minX:Math.min(a3.x,b4.x)-BOUNDS_MARGIN,maxX:Math.max(a3.x,b4.x)+BOUNDS_MARGIN,minY:Math.min(a3.y,b4.y)-BOUNDS_MARGIN,maxY:Math.max(a3.y,b4.y)+BOUNDS_MARGIN}}}),traces=null;try{traces=ijump.solveAndMapToTraces()}catch(e7){trace.renderError({type:"pcb_trace_error",pcb_trace_error_id:trace.source_trace_id,error_type:"pcb_trace_error",message:`error solving route: ${e7.message}`,source_trace_id:trace.pcb_trace_id,center:{x:(a3.x+b4.x)/2,y:(a3.y+b4.y)/2},pcb_port_ids:ports.map(p5=>p5.pcb_port_id),pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:ports.map(p5=>p5.pcb_component_id)})}if(!traces)return;if(traces.length===0){trace.renderError({type:"pcb_trace_error",error_type:"pcb_trace_error",pcb_trace_error_id:trace.pcb_trace_id,message:`Could not find a route for ${trace}`,source_trace_id:trace.source_trace_id,center:{x:(a3.x+b4.x)/2,y:(a3.y+b4.y)/2},pcb_port_ids:ports.map(p5=>p5.pcb_port_id),pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:ports.map(p5=>p5.pcb_component_id)});return}let[autoroutedTrace]=traces;autoroutedTrace.route=ensureRouteStartsAtObjective(autoroutedTrace.route,a3),dominantLayer&&(autoroutedTrace.route=autoroutedTrace.route.map(p5=>(p5.route_type==="wire"&&!p5.layer&&(p5.layer=dominantLayer),p5))),pcbPortA&&autoroutedTrace.route[0].route_type==="wire"&&(autoroutedTrace.route[0].start_pcb_port_id=pcbPortA);let lastRoutePoint=autoroutedTrace.route[autoroutedTrace.route.length-1];pcbPortB&&lastRoutePoint.route_type==="wire"&&(lastRoutePoint.end_pcb_port_id=pcbPortB),routes.push(autoroutedTrace.route)}let mergedRoute=mergeRoutes(routes),traceLength=getTraceLength2(mergedRoute),pcbStyle2=trace.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2),pcb_trace3=db3.pcb_trace.insert({route:mergedRoute,source_trace_id:trace.source_trace_id,subcircuit_id:trace.getSubcircuit()?.subcircuit_id,trace_length:traceLength}),subcircuitConnectivityMapKey=trace.subcircuit_connectivity_map_key??db3.source_trace.get(trace.source_trace_id)?.subcircuit_connectivity_map_key;trace._portsRoutedOnPcb=ports,trace.pcb_trace_id=pcb_trace3.pcb_trace_id;for(let point6 of mergedRoute)if(point6.route_type==="via"){let fromLayer=point6.from_layer,toLayer=point6.to_layer;db3.pcb_via.insert({pcb_trace_id:pcb_trace3.pcb_trace_id,x:point6.x,y:point6.y,hole_diameter:holeDiameter,outer_diameter:padDiameter,layers:getViaSpanLayers({fromLayer,toLayer,layerCount:subcircuit._getSubcircuitLayerCount()}),from_layer:fromLayer,to_layer:toLayer,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:trace.getGroup()?.pcb_group_id??void 0,subcircuit_connectivity_map_key:subcircuitConnectivityMapKey})}trace._insertErrorIfTraceIsOutsideBoard(mergedRoute,ports)}var getOtherSchematicTraces=({db:db3,source_trace_id,schematic_sheet_id,sameNetOnly,differentNetOnly})=>{!sameNetOnly&&!differentNetOnly&&(differentNetOnly=!0);let mySourceTrace=db3.source_trace.get(source_trace_id),traces=[];for(let otherSchematicTrace of db3.schematic_trace.list()){if(otherSchematicTrace.source_trace_id===source_trace_id||schematic_sheet_id!==void 0&&otherSchematicTrace.schematic_sheet_id!==schematic_sheet_id)continue;let isSameNet2=db3.source_trace.get(otherSchematicTrace.source_trace_id)?.subcircuit_connectivity_map_key===mySourceTrace.subcircuit_connectivity_map_key;differentNetOnly&&isSameNet2||sameNetOnly&&!isSameNet2||traces.push(otherSchematicTrace)}return traces},createSchematicTraceCrossingSegments=({edges:inputEdges,otherEdges})=>{let edges=[...inputEdges];for(let i3=0;i3<edges.length;i3++){if(i3>2e3)throw new Error("Over 2000 iterations spent inside createSchematicTraceCrossingSegments, you have triggered an infinite loop, please report this!");let edge=edges[i3],edgeOrientation=Math.abs(edge.from.x-edge.to.x)<.01?"vertical":edge.from.y===edge.to.y?"horizontal":"not-orthogonal";if(edgeOrientation==="not-orthogonal")continue;let otherEdgesIntersections=[];for(let otherEdge of otherEdges){let otherOrientation=otherEdge.from.x===otherEdge.to.x?"vertical":otherEdge.from.y===otherEdge.to.y?"horizontal":"not-orthogonal";if(otherOrientation==="not-orthogonal"||edgeOrientation===otherOrientation)continue;if(doesLineIntersectLine([edge.from,edge.to],[otherEdge.from,otherEdge.to],{lineThickness:.01})){let intersectX=edgeOrientation==="vertical"?edge.from.x:otherEdge.from.x,intersectY=edgeOrientation==="vertical"?otherEdge.from.y:edge.from.y,crossingPoint2={x:intersectX,y:intersectY};otherEdgesIntersections.push({otherEdge,crossingPoint:crossingPoint2,distanceFromEdgeFrom:distance2(edge.from,crossingPoint2)})}}if(otherEdgesIntersections.length===0)continue;let closestIntersection=otherEdgesIntersections[0];for(let intersection of otherEdgesIntersections)intersection.distanceFromEdgeFrom<closestIntersection.distanceFromEdgeFrom&&(closestIntersection=intersection);let crossingPoint=closestIntersection.crossingPoint,crossingSegmentLength=.075;if(crossingPoint.x===edge.from.x&&crossingPoint.y===edge.from.y)continue;let crossingUnitVec=getUnitVectorFromPointAToB(edge.from,crossingPoint),beforeCrossing={x:crossingPoint.x-crossingUnitVec.x*crossingSegmentLength/2,y:crossingPoint.y-crossingUnitVec.y*crossingSegmentLength/2},afterCrossing={x:crossingPoint.x+crossingUnitVec.x*crossingSegmentLength/2,y:crossingPoint.y+crossingUnitVec.y*crossingSegmentLength/2},overshot=distance2(afterCrossing,edge.to)<crossingSegmentLength,newEdges=[{from:edge.from,to:beforeCrossing},{from:beforeCrossing,to:afterCrossing,is_crossing:!0},{from:afterCrossing,to:edge.to}];edges.splice(i3,1,...newEdges),i3+=newEdges.length-2,overshot&&i3++}return edges},TOLERANCE=.001,isPointWithinEdge=(point6,edge)=>{let minX=Math.min(edge.from.x,edge.to.x),maxX=Math.max(edge.from.x,edge.to.x),minY=Math.min(edge.from.y,edge.to.y),maxY=Math.max(edge.from.y,edge.to.y);return point6.x>=minX&&point6.x<=maxX&&point6.y>=minY&&point6.y<=maxY},getEdgeOrientation=edge=>{let isVertical4=Math.abs(edge.from.x-edge.to.x)<TOLERANCE,isHorizontal3=Math.abs(edge.from.y-edge.to.y)<TOLERANCE;return isVertical4?"vertical":isHorizontal3?"horizontal":"diagonal"},getIntersectionPoint=(edge1,edge2)=>{let orientation1=getEdgeOrientation(edge1),orientation22=getEdgeOrientation(edge2);if(orientation1===orientation22)return null;if(orientation1==="vertical"&&orientation22==="horizontal"||orientation1==="horizontal"&&orientation22==="vertical"){let verticalEdge=orientation1==="vertical"?edge1:edge2,horizontalEdge=orientation1==="horizontal"?edge1:edge2,x22=verticalEdge.from.x,y22=horizontalEdge.from.y,intersection2={x:x22,y:y22};return isPointWithinEdge(intersection2,edge1)&&isPointWithinEdge(intersection2,edge2)?intersection2:null}if(orientation1==="vertical"||orientation22==="vertical"){let verticalEdge=orientation1==="vertical"?edge1:edge2,diagonalEdge=orientation1==="vertical"?edge2:edge1,x22=verticalEdge.from.x,m4=(diagonalEdge.to.y-diagonalEdge.from.y)/(diagonalEdge.to.x-diagonalEdge.from.x),b4=diagonalEdge.from.y-m4*diagonalEdge.from.x,y22=m4*x22+b4,intersection2={x:x22,y:y22};return isPointWithinEdge(intersection2,edge1)&&isPointWithinEdge(intersection2,edge2)?intersection2:null}let m12=(edge1.to.y-edge1.from.y)/(edge1.to.x-edge1.from.x),b12=edge1.from.y-m12*edge1.from.x,m22=(edge2.to.y-edge2.from.y)/(edge2.to.x-edge2.from.x),b22=edge2.from.y-m22*edge2.from.x;if(Math.abs(m12-m22)<TOLERANCE)return null;let x4=(b22-b12)/(m12-m22),y3=m12*x4+b12,intersection={x:x4,y:y3};return isPointWithinEdge(intersection,edge1)&&isPointWithinEdge(intersection,edge2)?intersection:null},createSchematicTraceJunctions=({edges:myEdges,db:db3,source_trace_id,schematic_sheet_id})=>{let otherEdges=getOtherSchematicTraces({db:db3,source_trace_id,schematic_sheet_id,sameNetOnly:!0}).flatMap(t54=>t54.edges),junctions=new Map;for(let myEdge of myEdges)for(let otherEdge of otherEdges){let intersection=getIntersectionPoint(myEdge,otherEdge);if(intersection){let key=`${intersection.x.toFixed(6)},${intersection.y.toFixed(6)}`;junctions.has(key)||junctions.set(key,intersection)}}return Array.from(junctions.values())};function normalizeAngle(angle){let normalized=angle%360;return normalized<0?normalized+360:normalized}function isAngleBetween(angle,start,end,direction2){return direction2==="counterclockwise"?end>=start?angle>=start&&angle<=end:angle>=start||angle<=end:end<=start?angle<=start&&angle>=end:angle<=start||angle>=end}function getArcBounds(elm){let center2=elm.center,radius=elm.radius,startAngle=elm.start_angle_degrees,endAngle=elm.end_angle_degrees,direction2=elm.direction??"counterclockwise";if(!center2||typeof center2.x!="number"||typeof center2.y!="number"||typeof radius!="number"||typeof startAngle!="number"||typeof endAngle!="number")return null;let start=normalizeAngle(startAngle),end=normalizeAngle(endAngle),consideredAngles=new Set([start,end]),cardinalAngles=[0,90,180,270];for(let cardinal of cardinalAngles)isAngleBetween(cardinal,start,end,direction2)&&consideredAngles.add(cardinal);let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let angle of consideredAngles){let radians2=angle*Math.PI/180,x4=center2.x+radius*Math.cos(radians2),y3=center2.y+radius*Math.sin(radians2);minX=Math.min(minX,x4),maxX=Math.max(maxX,x4),minY=Math.min(minY,y3),maxY=Math.max(maxY,y3)}return!Number.isFinite(minX)||!Number.isFinite(minY)?null:{minX,maxX,minY,maxY}}function getBoundsForSchematic(db3){let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let elm of db3){let cx3,cy3,w4,h3;if(elm.type==="schematic_component")cx3=elm.center?.x,cy3=elm.center?.y,w4=elm.size?.width,h3=elm.size?.height;else if(elm.type==="schematic_box")cx3=elm.x,cy3=elm.y,w4=elm.width,h3=elm.height;else if(elm.type==="schematic_port")cx3=elm.center?.x,cy3=elm.center?.y,w4=.2,h3=.2;else if(elm.type==="schematic_text")cx3=elm.position?.x,cy3=elm.position?.y,w4=(elm.text?.length??0)*.1,h3=.2;else if(elm.type==="schematic_line"){let x12=elm.x1??0,y12=elm.y1??0,x22=elm.x2??0,y22=elm.y2??0;cx3=(x12+x22)/2,cy3=(y12+y22)/2,w4=Math.abs(x22-x12),h3=Math.abs(y22-y12)}else if(elm.type==="schematic_rect")cx3=elm.center?.x,cy3=elm.center?.y,w4=elm.width,h3=elm.height;else if(elm.type==="schematic_circle"){cx3=elm.center?.x,cy3=elm.center?.y;let radius=elm.radius;typeof radius=="number"&&(w4=radius*2,h3=radius*2)}else if(elm.type==="schematic_arc"){let bounds=getArcBounds(elm);bounds&&(minX=Math.min(minX,bounds.minX),maxX=Math.max(maxX,bounds.maxX),minY=Math.min(minY,bounds.minY),maxY=Math.max(maxY,bounds.maxY));continue}else if(elm.type==="schematic_path"){let points=elm.points;if(Array.isArray(points))for(let point6 of points)typeof point6.x=="number"&&typeof point6.y=="number"&&(minX=Math.min(minX,point6.x),maxX=Math.max(maxX,point6.x),minY=Math.min(minY,point6.y),maxY=Math.max(maxY,point6.y));continue}typeof cx3=="number"&&typeof cy3=="number"&&typeof w4=="number"&&typeof h3=="number"&&(minX=Math.min(minX,cx3-w4/2),maxX=Math.max(maxX,cx3+w4/2),minY=Math.min(minY,cy3-h3/2),maxY=Math.max(maxY,cy3+h3/2))}return{minX,maxX,minY,maxY}}function getObstaclesFromBounds(bounds,opts={}){let{minX,maxX,minY,maxY}=bounds,PADDING=opts.padding??1;if(!isFinite(minX)||!isFinite(maxX)||!isFinite(minY)||!isFinite(maxY))return[];let left=minX-PADDING,right=maxX+PADDING,top=maxY+PADDING,bottom=minY-PADDING,thickness=.01;return[{type:"rect",layers:["top"],center:{x:(left+right)/2,y:top},width:right-left,height:thickness,connectedTo:[]},{type:"rect",layers:["top"],center:{x:(left+right)/2,y:bottom},width:right-left,height:thickness,connectedTo:[]},{type:"rect",layers:["top"],center:{x:left,y:(top+bottom)/2},width:thickness,height:top-bottom,connectedTo:[]},{type:"rect",layers:["top"],center:{x:right,y:(top+bottom)/2},width:thickness,height:top-bottom,connectedTo:[]}]}var getSchematicObstaclesForTrace=trace=>{let db3=trace.root.db,connectedPorts=trace._findConnectedPorts().ports??[],connectedPortIds=new Set(connectedPorts.map(p5=>p5.schematic_port_id)),obstacles=[];for(let elm of db3.toArray()){if(elm.type==="schematic_component"){let isSymbol5=!!elm.symbol_name,dominateAxis=elm.size.width>elm.size.height?"horz":"vert";obstacles.push({type:"rect",layers:["top"],center:elm.center,width:elm.size.width+(isSymbol5&&dominateAxis==="horz"?-.5:0),height:elm.size.height+(isSymbol5&&dominateAxis==="vert"?-.5:0),connectedTo:[]})}if(elm.type==="schematic_port"){if(connectedPortIds.has(elm.schematic_port_id))continue;let dirVec=elm.facing_direction?getUnitVectorFromDirection(elm.facing_direction):{x:0,y:0};obstacles.push({type:"rect",layers:["top"],center:{x:elm.center.x-dirVec.x*.1,y:elm.center.y-dirVec.y*.1},width:.1+Math.abs(dirVec.x)*.3,height:.1+Math.abs(dirVec.y)*.3,connectedTo:[]})}elm.type==="schematic_text"&&obstacles.push({type:"rect",layers:["top"],center:elm.position,width:(elm.text?.length??0)*.1,height:.2,connectedTo:[]}),elm.type==="schematic_box"&&obstacles.push({type:"rect",layers:["top"],center:{x:elm.x,y:elm.y},width:elm.width,height:elm.height,connectedTo:[]})}let bounds=getBoundsForSchematic(db3.toArray());return obstacles.push(...getObstaclesFromBounds(bounds,{padding:1})),obstacles},pushEdgesOfSchematicTraceToPreventOverlap=({edges,db:db3,source_trace_id,schematic_sheet_id})=>{let otherEdges=getOtherSchematicTraces({db:db3,source_trace_id,schematic_sheet_id,differentNetOnly:!0}).flatMap(t54=>t54.edges),edgeOrientation=edge=>{let{from,to:to3}=edge;return from.x===to3.x?"vertical":"horizontal"};for(let mySegment of edges){let mySegmentOrientation=edgeOrientation(mySegment),findOverlappingParallelSegment=()=>otherEdges.find(otherEdge=>edgeOrientation(otherEdge)===mySegmentOrientation&&doesLineIntersectLine([mySegment.from,mySegment.to],[otherEdge.from,otherEdge.to],{lineThickness:.05})),overlappingParallelSegmentFromOtherTrace=findOverlappingParallelSegment();for(;overlappingParallelSegmentFromOtherTrace;)mySegmentOrientation==="horizontal"?(mySegment.from.y+=.1,mySegment.to.y+=.1):(mySegment.from.x+=.1,mySegment.to.x+=.1),overlappingParallelSegmentFromOtherTrace=findOverlappingParallelSegment()}},convertFacingDirectionToElbowDirection=facingDirection=>{switch(facingDirection){case"up":return"y+";case"down":return"y-";case"left":return"x-";case"right":return"x+";default:}},Trace_doInitialSchematicTraceRender=trace=>{if(trace.root?._featureMspSchematicTraceRouting||trace._couldNotFindPort||trace.root?.schematicDisabled||trace.getCollapsedSchematicBoxAncestor())return;let{db:db3}=trace.root,{_parsedProps:props,parent}=trace,schematicNetLabelText=trace._getSchematicNetLabelText(),schematicSheetId=trace._resolveSchematicSheetId();if(!parent)throw new Error("Trace has no parent");let allPortsFound,connectedPorts;try{let result=trace._findConnectedPorts();allPortsFound=result.allPortsFound,connectedPorts=result.portsWithSelectors??[]}catch(error2){if(error2 instanceof TraceConnectionError){db3.source_trace_not_connected_error.insert({...error2.errorData,error_type:"source_trace_not_connected_error"});return}throw error2}let{netsWithSelectors}=trace._findConnectedNets();if(!allPortsFound)return;let portPairKey=connectedPorts.map(p5=>p5.port.schematic_port_id).sort().join(","),board=trace.root?._getBoard();if(board?._connectedSchematicPortPairs&&board._connectedSchematicPortPairs.has(portPairKey))return;let connection={name:trace.source_trace_id,pointsToConnect:[]},obstacles=getSchematicObstaclesForTrace(trace),portsWithPosition=connectedPorts.filter(({port})=>port.schematic_port_id!==null).map(({port})=>({port,position:port._getGlobalSchematicPositionAfterLayout(),schematic_port_id:port.schematic_port_id??void 0,facingDirection:port.facingDirection}));if(portsWithPosition.length===1&&netsWithSelectors.length===1){let net=netsWithSelectors[0].net,{port,position:anchorPos}=portsWithPosition[0],connectedNetLabel=trace.getSubcircuit().selectAll("netlabel").find(nl3=>{let conn=nl3._parsedProps.connection??nl3._parsedProps.connectsTo;return conn?Array.isArray(conn)?conn.some(selector=>trace.getSubcircuit().selectOne(selector,{port:!0})===port):trace.getSubcircuit().selectOne(conn,{port:!0})===port:!1});if(!connectedNetLabel){let dbNetLabel=db3.schematic_net_label.getWhere({source_trace_id:trace.source_trace_id});dbNetLabel&&(connectedNetLabel=dbNetLabel)}if(connectedNetLabel){let labelPos="_getGlobalSchematicPositionBeforeLayout"in connectedNetLabel?connectedNetLabel._getGlobalSchematicPositionBeforeLayout():connectedNetLabel.anchor_position,edges2=[];anchorPos.x===labelPos.x||anchorPos.y===labelPos.y?edges2.push({from:anchorPos,to:labelPos}):(edges2.push({from:anchorPos,to:{x:labelPos.x,y:anchorPos.y}}),edges2.push({from:{x:labelPos.x,y:anchorPos.y},to:labelPos}));let junctions2=createSchematicTraceJunctions({edges:edges2,db:db3,source_trace_id:trace.source_trace_id,schematic_sheet_id:schematicSheetId}),dbTrace2=db3.schematic_trace.insert({source_trace_id:trace.source_trace_id,edges:edges2,junctions:junctions2,subcircuit_connectivity_map_key:trace.subcircuit_connectivity_map_key??void 0,schematic_sheet_id:schematicSheetId});trace.schematic_trace_id=dbTrace2.schematic_trace_id;return}if(schematicNetLabelText){let side2=getEnteringEdgeFromDirection(port.facingDirection)??"bottom";db3.schematic_net_label.insert({text:schematicNetLabelText,source_net_id:net.source_net_id,anchor_position:anchorPos,center:computeSchematicNetLabelCenter({anchor_position:anchorPos,anchor_side:side2,text:schematicNetLabelText}),anchor_side:side2,schematic_sheet_id:trace._resolveSchematicSheetId()});return}let side=getEnteringEdgeFromDirection(port.facingDirection)??"bottom",netLabel=db3.schematic_net_label.insert({text:net._parsedProps.name,source_net_id:net.source_net_id,anchor_position:anchorPos,center:computeSchematicNetLabelCenter({anchor_position:anchorPos,anchor_side:side,text:net._parsedProps.name}),anchor_side:side,schematic_sheet_id:trace._resolveSchematicSheetId()});return}if(schematicNetLabelText&&("from"in trace.props&&"to"in trace.props||"path"in trace.props)){trace._doInitialSchematicTraceRenderWithDisplayLabel();return}if(portsWithPosition.length<2)return;let edges=(()=>{let elbowEdges=[];for(let i3=0;i3<portsWithPosition.length-1;i3++){let start=portsWithPosition[i3],end=portsWithPosition[i3+1],path=calculateElbow({x:start.position.x,y:start.position.y,facingDirection:convertFacingDirectionToElbowDirection(start.facingDirection)},{x:end.position.x,y:end.position.y,facingDirection:convertFacingDirectionToElbowDirection(end.facingDirection)});for(let j5=0;j5<path.length-1;j5++)elbowEdges.push({from:path[j5],to:path[j5+1]})}let doesSegmentIntersectRect2=(edge,rect)=>{let halfW=rect.width/2,halfH=rect.height/2,left=rect.center.x-halfW,right=rect.center.x+halfW,top=rect.center.y-halfH,bottom=rect.center.y+halfH,inRect=p5=>p5.x>=left&&p5.x<=right&&p5.y>=top&&p5.y<=bottom;return inRect(edge.from)||inRect(edge.to)?!0:[[{x:left,y:top},{x:right,y:top}],[{x:right,y:top},{x:right,y:bottom}],[{x:right,y:bottom},{x:left,y:bottom}],[{x:left,y:bottom},{x:left,y:top}]].some(r6=>doesLineIntersectLine([edge.from,edge.to],r6,{lineThickness:0}))};for(let edge of elbowEdges)for(let obstacle of obstacles)if(doesSegmentIntersectRect2(edge,obstacle))return null;return elbowEdges})();edges&&edges.length===0&&(edges=null),connection.pointsToConnect=portsWithPosition.map(({position:position4})=>({...position4,layer:"top"}));let bounds=computeObstacleBounds(obstacles),BOUNDS_MARGIN=2,simpleRouteJsonInput={minTraceWidth:.1,obstacles,connections:[connection],bounds:{minX:bounds.minX-BOUNDS_MARGIN,maxX:bounds.maxX+BOUNDS_MARGIN,minY:bounds.minY-BOUNDS_MARGIN,maxY:bounds.maxY+BOUNDS_MARGIN},layerCount:1},Autorouter=MultilayerIjump,skipOtherTraceInteraction=!1;if(trace.getSubcircuit().props._schDirectLineRoutingEnabled&&(Autorouter=DirectLineRouter,skipOtherTraceInteraction=!0),!edges){let results=new Autorouter({input:simpleRouteJsonInput,MAX_ITERATIONS:100,OBSTACLE_MARGIN:.1,isRemovePathLoopsEnabled:!0,isShortenPathWithShortcutsEnabled:!0,marginsWithCosts:[{margin:1,enterCost:0,travelCostFactor:1},{margin:.3,enterCost:0,travelCostFactor:1},{margin:.2,enterCost:0,travelCostFactor:2},{margin:.1,enterCost:0,travelCostFactor:3}]}).solveAndMapToTraces();if(results.length===0){if(trace._isSymbolToChipConnection()||trace._isSymbolToSymbolConnection()||trace._isChipToChipConnection()){trace._doInitialSchematicTraceRenderWithDisplayLabel();return}results=new DirectLineRouter({input:simpleRouteJsonInput}).solveAndMapToTraces(),skipOtherTraceInteraction=!0}let[{route}]=results;edges=[];let wireAndViaRoutes=route.filter(r6=>r6.route_type==="wire"||r6.route_type==="via");for(let i3=0;i3<wireAndViaRoutes.length-1;i3++)edges.push({from:wireAndViaRoutes[i3],to:wireAndViaRoutes[i3+1]})}let source_trace_id=trace.source_trace_id,junctions=[];if(!skipOtherTraceInteraction){pushEdgesOfSchematicTraceToPreventOverlap({edges,db:db3,source_trace_id,schematic_sheet_id:schematicSheetId});let otherEdges=getOtherSchematicTraces({db:db3,source_trace_id,schematic_sheet_id:schematicSheetId,differentNetOnly:!0}).flatMap(t54=>t54.edges);edges=createSchematicTraceCrossingSegments({edges,otherEdges}),junctions=createSchematicTraceJunctions({edges,db:db3,source_trace_id:trace.source_trace_id,schematic_sheet_id:schematicSheetId})}if(!edges||edges.length===0)return;let lastEdge=edges[edges.length-1],lastEdgePort=portsWithPosition[portsWithPosition.length-1],lastDominantDirection=getDominantDirection(lastEdge);edges.push(...getStubEdges({lastEdge,lastEdgePort,lastDominantDirection}));let firstEdge=edges[0],firstEdgePort=portsWithPosition[0],firstDominantDirection=getDominantDirection(firstEdge);if(edges.unshift(...getStubEdges({firstEdge,firstEdgePort,firstDominantDirection})),!trace.source_trace_id)throw new Error("Missing source_trace_id for schematic trace insertion.");if(trace.getSubcircuit()._parsedProps.schTraceAutoLabelEnabled&&countComplexElements(junctions,edges)>=5&&(trace._isSymbolToChipConnection()||trace._isSymbolToSymbolConnection()||trace._isChipToChipConnection())){trace._doInitialSchematicTraceRenderWithDisplayLabel();return}let dbTrace=db3.schematic_trace.insert({source_trace_id:trace.source_trace_id,edges,junctions,subcircuit_connectivity_map_key:trace.subcircuit_connectivity_map_key??void 0,schematic_sheet_id:schematicSheetId});trace.schematic_trace_id=dbTrace.schematic_trace_id;for(let{port}of connectedPorts)port.schematic_port_id&&db3.schematic_port.update(port.schematic_port_id,{is_connected:!0});board?._connectedSchematicPortPairs&&board._connectedSchematicPortPairs.add(portPairKey)},getMaxLengthFromConnectedCapacitors=(ports,{db:db3})=>{let capacitorMaxLengths=ports.map(port=>{let sourcePort=db3.source_port.get(port.source_port_id);if(!sourcePort?.source_component_id)return null;let sourceComponent=db3.source_component.get(sourcePort.source_component_id);return sourceComponent?.ftype==="simple_capacitor"?sourceComponent.max_decoupling_trace_length:null}).filter(length7=>length7!==null);if(capacitorMaxLengths.length!==0)return Math.min(...capacitorMaxLengths)};function getTraceDisplayName({ports,nets}){if(ports.length>=2)return`${ports[0]?.selector} to ${ports[1]?.selector}`;if(ports.length===1&&nets.length===1)return`${ports[0]?.selector} to net.${nets[0]._parsedProps.name}`}var Trace3=class extends PrimitiveComponent2{constructor(props){super(props);__publicField(this,"source_trace_id",null);__publicField(this,"pcb_trace_id",null);__publicField(this,"schematic_trace_id",null);__publicField(this,"_inflatedPcbTraces");__publicField(this,"_inflatedPcbVias");__publicField(this,"_portsRoutedOnPcb");__publicField(this,"subcircuit_connectivity_map_key",null);__publicField(this,"_exposesSubcircuitConnection",!1);__publicField(this,"_traceConnectionHash",null);__publicField(this,"_couldNotFindPort");this._portsRoutedOnPcb=[]}_getExplicitTraceThickness(){return this._parsedProps.thickness??this._parsedProps.width}_getSchematicNetLabelText(){return this._parsedProps.schDisplayLabel??this._parsedProps.displayName??this._parsedProps.name}get config(){return{zodProps:traceProps,componentName:"Trace"}}_getTracePortOrNetSelectorListFromProps(){return"from"in this.props&&"to"in this.props?[typeof this.props.from=="string"?this.props.from:this.props.from.getPortSelector(),typeof this.props.to=="string"?this.props.to:this.props.to.getPortSelector()]:"path"in this.props?this.props.path.map(p5=>typeof p5=="string"?p5:p5.getPortSelector()):[]}getTracePortPathSelectors(){return this._getTracePortOrNetSelectorListFromProps().filter(selector=>!selector.includes("net."))}getTracePathNetSelectors(){return this._getTracePortOrNetSelectorListFromProps().filter(selector=>selector.includes("net."))}_findConnectedPorts(){return Trace__findConnectedPorts(this)}_resolveNet(selector){let direct=this.getSubcircuit().selectOne(selector,{type:"net"});if(direct)return direct;let match2=selector.match(/^net\.(.+)$/),netName=match2?match2[1]:null;if(!netName)return null;let board=this.root?._getBoard();return board?board.getDescendants().find(d4=>d4.componentName==="Net"&&d4._parsedProps.name===netName)||null:(this.renderError(`Could not find a <board> ancestor for ${this}, so net "${selector}" cannot be resolved`),null)}_findConnectedNets(){let netsWithSelectors=this.getTracePathNetSelectors().map(selector=>({selector,net:this._resolveNet(selector)})),undefinedNets=netsWithSelectors.filter(n3=>!n3.net);return undefinedNets.length>0&&this.renderError(`Could not find net for selector "${undefinedNets[0].selector}" inside ${this}`),{netsWithSelectors,nets:netsWithSelectors.map(n3=>n3.net)}}_getAllTracesConnectedToSameNet(){let traces=this.getSubcircuit().selectAll("trace"),myNets=this._findConnectedNets().nets,myPorts=this._findConnectedPorts().ports??[];return traces.filter(t54=>{if(t54===this)return!1;let tNets=t54._findConnectedNets().nets,tPorts=t54._findConnectedPorts().ports??[];return tNets.some(n3=>myNets.includes(n3))||tPorts.some(p5=>myPorts.includes(p5))})}_isExplicitlyConnectedToPort(port){let{allPortsFound,portsWithSelectors:portsWithMetadata}=this._findConnectedPorts();return allPortsFound?portsWithMetadata.map(p5=>p5.port).includes(port):!1}_isExplicitlyConnectedToNet(net){return this._findConnectedNets().nets.includes(net)}doInitialCreateNetsFromProps(){createNetsFromProps(this,this.getTracePathNetSelectors())}_computeTraceConnectionHash(){let{allPortsFound,ports}=this._findConnectedPorts();return!allPortsFound||!ports?null:[...ports].sort((a3,b4)=>(a3.pcb_port_id||"").localeCompare(b4.pcb_port_id||"")).map(p5=>p5.pcb_port_id).join(",")}doInitialSourceTraceRender(){let{db:db3}=this.root,{_parsedProps:props,parent}=this;if(!parent){this.renderError("Trace has no parent");return}let allPortsFound,ports;try{let result=this._findConnectedPorts();allPortsFound=result.allPortsFound,ports=result.portsWithSelectors??[]}catch(error2){if(error2 instanceof TraceConnectionError){db3.source_trace_not_connected_error.insert({...error2.errorData,error_type:"source_trace_not_connected_error"}),this._couldNotFindPort=!0;return}throw error2}if(!allPortsFound)return;this._traceConnectionHash=this._computeTraceConnectionHash();let existingTrace=db3.source_trace.list().find(t54=>t54.subcircuit_connectivity_map_key===this.subcircuit_connectivity_map_key&&[...t54.connected_source_port_ids].sort().join(",")===this._traceConnectionHash);if(existingTrace){this.source_trace_id=existingTrace.source_trace_id;return}let nets=this._findConnectedNets().nets,displayName=getTraceDisplayName({ports,nets}),trace=db3.source_trace.insert({connected_source_port_ids:ports.map(p5=>p5.port.source_port_id),connected_source_net_ids:nets.map(n3=>n3.source_net_id),subcircuit_id:this.getSubcircuit()?.subcircuit_id,name:props.name,max_length:getMaxLengthFromConnectedCapacitors(ports.map(p5=>p5.port),{db:db3})??props.maxLength,display_name:props.displayName??displayName,min_trace_thickness:this._getExplicitTraceThickness()});this.source_trace_id=trace.source_trace_id,props.name||db3.source_unnamed_trace_warning.insert({message:`${this.getString()} is missing a name. Add a name prop to make the trace easier to identify.`,source_trace_id:trace.source_trace_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id??void 0,warning_type:"source_unnamed_trace_warning"})}_insertErrorIfTraceIsOutsideBoard(mergedRoute,ports){let{db:db3}=this.root,board=this._getBoard();if(!board)return;let pcbBoardId=board.pcb_board_id;if(!pcbBoardId)return;isRouteOutsideBoard({mergedRoute,db:db3,pcbBoardId})&&db3.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:this.source_trace_id,message:`Trace ${this.getString()} routed outside the board boundaries.`,pcb_trace_id:this.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:ports.map(p5=>p5.pcb_port_id)})}doInitialPcbManualTraceRender(){Trace_doInitialPcbManualTraceRender(this)}doInitialPcbTraceRender(){Trace_doInitialPcbTraceRender(this)}_doInitialSchematicTraceRenderWithDisplayLabel(){Trace__doInitialSchematicTraceRenderWithDisplayLabel(this)}_isSymbolToChipConnection(){let{allPortsFound,ports}=this._findConnectedPorts();if(!allPortsFound||ports.length!==2)return!1;let[port1,port2]=ports;if(!port1?.parent||!port2?.parent)return!1;let isPort1Chip=port1.parent.config.shouldRenderAsSchematicBox,isPort2Chip=port2.parent.config.shouldRenderAsSchematicBox;return isPort1Chip&&!isPort2Chip||!isPort1Chip&&isPort2Chip}_isSymbolToSymbolConnection(){let{allPortsFound,ports}=this._findConnectedPorts();if(!allPortsFound||ports.length!==2)return!1;let[port1,port2]=ports;if(!port1?.parent||!port2?.parent)return!1;let isPort1Symbol=!port1.parent.config.shouldRenderAsSchematicBox,isPort2Symbol=!port2.parent.config.shouldRenderAsSchematicBox;return isPort1Symbol&&isPort2Symbol}_isChipToChipConnection(){let{allPortsFound,ports}=this._findConnectedPorts();if(!allPortsFound||ports.length!==2)return!1;let[port1,port2]=ports;if(!port1?.parent||!port2?.parent)return!1;let isPort1Chip=port1.parent.config.shouldRenderAsSchematicBox,isPort2Chip=port2.parent.config.shouldRenderAsSchematicBox;return isPort1Chip&&isPort2Chip}doInitialSchematicTraceRender(){Trace_doInitialSchematicTraceRender(this)}},catalogue={},extendCatalogue=objects=>{let altKeys=Object.fromEntries(Object.entries(objects).map(([key,v3])=>[key.toLowerCase(),v3]));Object.assign(catalogue,objects),Object.assign(catalogue,altKeys)},ErrorPlaceholderComponent=class extends PrimitiveComponent2{constructor(props,error2){super(props);let resolveCoordinate=(value,axis)=>{if(typeof value=="number")return value;if(typeof value=="string")try{return this._resolvePcbCoordinate(value,axis,{allowBoardVariables:!1})}catch{return 0}return 0};this._parsedProps={...props,error:error2,type:props.type||"unknown",component_name:props.name,error_type:"source_failed_to_create_component_error",message:error2 instanceof Error?error2.message:String(error2),pcbX:resolveCoordinate(props.pcbX,"pcbX"),pcbY:resolveCoordinate(props.pcbY,"pcbY"),schX:props.schX,schY:props.schY}}formatErrorDetails(){let selectorValue=this._parsedProps.selector??this._parsedProps.selectors??this._parsedProps.in??this._parsedProps.within,selectorText=selectorValue===void 0?void 0:typeof selectorValue=="string"?selectorValue:this.safeStringify(selectorValue),propsText=this.safeStringify(this._parsedProps);return{selectorText,propsText}}safeStringify(value){let seen=new WeakSet,json=JSON.stringify(value,(_key,item)=>{if(typeof item=="bigint")return item.toString();if(typeof item=="function")return`[Function ${item.name||"anonymous"}]`;if(typeof item=="symbol")return item.toString();if(typeof item=="object"&&item!==null){if(seen.has(item))return"[Circular]";seen.add(item)}return item},2);return json?json.length>2e3?`${json.slice(0,2e3)}\u2026`:json:"undefined"}get config(){return{componentName:"ErrorPlaceholder",zodProps:external_exports.object({}).passthrough()}}doInitialSourceRender(){if(this.root?.db){let pcbPosition2=this._getGlobalPcbPositionBeforeLayout(),schematicPosition=this._getGlobalSchematicPositionBeforeLayout(),{selectorText,propsText}=this.formatErrorDetails(),messageDetails=[selectorText?`Within selector: ${selectorText}`:null,`Props: ${propsText}`].filter(Boolean).join(" "),baseMessage=`Could not create ${this._parsedProps.componentType??"component"}${this._parsedProps.name?` "${this._parsedProps.name}"`:""}. ${this._parsedProps.error?.formattedError?._errors?.join("; ")||this._parsedProps.message}`;this.root.db.source_failed_to_create_component_error.insert({component_name:this._parsedProps.component_name,error_type:"source_failed_to_create_component_error",message:`${baseMessage}${messageDetails?` Details: ${messageDetails}`:""}`,pcb_center:pcbPosition2,schematic_center:schematicPosition})}}};function createErrorPlaceholderComponent(props,error2){return new ErrorPlaceholderComponent(props,error2)}function prepare(object,state2){let instance=object;return instance.__tsci={...state2},object}var hostConfig={supportsMutation:!0,createInstance(type,props){let target=catalogue[type];if(!target)throw Object.keys(catalogue).length===0?new Error("No components registered in catalogue, did you forget to import lib/register-catalogue in your test file?"):new Error(`Unsupported component type "${type}". No element with this name is registered in the @tscircuit/core catalogue. Check for typos or see https://docs.tscircuit.com/category/built-in-elements for a list of valid components. To add your own component, see docs/CREATING_NEW_COMPONENTS.md`);try{return prepare(new target(props),{})}catch(error2){return createErrorPlaceholderComponent({...props,componentType:type},error2)}},createTextInstance(text){return{__text:text}},appendInitialChild(parentInstance,child){parentInstance.add(child)},appendChild(parentInstance,child){parentInstance.add(child)},appendChildToContainer(container,child){container.add(child)},finalizeInitialChildren(){return!1},prepareUpdate(){return null},shouldSetTextContent(){return!1},getRootHostContext(){return{}},getChildHostContext(){return{}},prepareForCommit(){return null},resetAfterCommit(){},commitMount(){},commitUpdate(){},removeChild(){},clearContainer(){},supportsPersistence:!1,getPublicInstance(instance){return instance},preparePortalMount(containerInfo){throw new Error("Function not implemented.")},scheduleTimeout(fn3,delay){throw new Error("Function not implemented.")},cancelTimeout(id3){throw new Error("Function not implemented.")},noTimeout:void 0,isPrimaryRenderer:!1,getInstanceFromNode(node){throw new Error("Function not implemented.")},beforeActiveInstanceBlur(){throw new Error("Function not implemented.")},afterActiveInstanceBlur(){throw new Error("Function not implemented.")},prepareScopeUpdate:(scopeInstance,instance)=>{throw new Error("Function not implemented.")},getInstanceFromScope:scopeInstance=>{throw new Error("Function not implemented.")},detachDeletedInstance:node=>{throw new Error("Function not implemented.")},getCurrentEventPriority:()=>import_constants.DefaultEventPriority,getCurrentUpdatePriority:()=>import_constants.DefaultEventPriority,resolveUpdatePriority:()=>import_constants.DefaultEventPriority,setCurrentUpdatePriority:()=>{},maySuspendCommit:()=>!1,supportsHydration:!1},reconciler=(0,import_react_reconciler.default)(hostConfig),createInstanceFromReactElement=reactElm=>{let rootContainer={children:[],props:{name:"$root"},add(instance){instance.parent=this,this.children.push(instance)},computePcbGlobalTransform(){return identity()}},containerErrors=[],container=reconciler.createContainer(rootContainer,0,null,!1,null,"tsci",error2=>{console.log("Error in createContainer"),console.error(error2),containerErrors.push(error2)},null);if(reconciler.updateContainerSync(reactElm,container,null,()=>{}),reconciler.flushSyncWork(),containerErrors.length>0)throw containerErrors[0];let rootInstance=reconciler.getPublicRootInstance(container);return rootInstance||rootContainer.children[0]},PIN_LABELS_KEY_RE=/^(?:pin)?(\d+)$/,getPinNumberFromPinLabelsKey=pinKey=>{let match2=pinKey.match(PIN_LABELS_KEY_RE);return match2?Number.parseInt(match2[1],10):null},parsePinNumberFromLabelsOrThrow=(pinNumberOrLabel,pinLabels)=>{if(typeof pinNumberOrLabel=="number")return pinNumberOrLabel;let directPinNumber=getPinNumberFromPinLabelsKey(pinNumberOrLabel);if(directPinNumber!==null)return directPinNumber;if(pinNumberOrLabel.startsWith("pin"))throw new Error(`Invalid pinLabels key "${pinNumberOrLabel}". Expected "pin\${number}" (e.g. pin1, pin2).`);if(!pinLabels)throw new Error(`No pin labels provided and pin number or label is not a number: "${pinNumberOrLabel}"`);for(let pinNumberKey in pinLabels)if((Array.isArray(pinLabels[pinNumberKey])?pinLabels[pinNumberKey]:[pinLabels[pinNumberKey]]).includes(pinNumberOrLabel)){let pinNumber=getPinNumberFromPinLabelsKey(pinNumberKey);if(pinNumber===null)throw new Error(`Invalid pinLabels key "${pinNumberKey}". Expected "pin\${number}" (e.g. pin1, pin2).`);return pinNumber}throw new Error(`No pin labels provided and pin number or label is not a number: "${pinNumberOrLabel}"`)},underscorifyPinStyles=(pinStyles,pinLabels)=>{if(!pinStyles)return;let underscorePinStyles={},mergedStyles={};for(let[pinNameOrLabel,pinStyle]of Object.entries(pinStyles)){let pinNumber=parsePinNumberFromLabelsOrThrow(pinNameOrLabel,pinLabels);mergedStyles[pinNumber]={...mergedStyles[pinNumber],...pinStyle}}for(let[pinNumber,pinStyle]of Object.entries(mergedStyles)){let pinKey=`pin${pinNumber}`;underscorePinStyles[pinKey]={bottom_margin:pinStyle.bottomMargin,left_margin:pinStyle.leftMargin,right_margin:pinStyle.rightMargin,top_margin:pinStyle.topMargin}}return underscorePinStyles},underscorifyPortArrangement=portArrangement=>{if(portArrangement){if("leftSide"in portArrangement||"rightSide"in portArrangement||"topSide"in portArrangement||"bottomSide"in portArrangement)return{left_side:portArrangement.leftSide,right_side:portArrangement.rightSide,top_side:portArrangement.topSide,bottom_side:portArrangement.bottomSide};if("leftPinCount"in portArrangement||"rightPinCount"in portArrangement||"topPinCount"in portArrangement||"bottomPinCount"in portArrangement)return{left_size:portArrangement.leftPinCount,right_size:portArrangement.rightPinCount,top_size:portArrangement.topPinCount,bottom_size:portArrangement.bottomPinCount};if("leftSize"in portArrangement||"rightSize"in portArrangement||"topSize"in portArrangement||"bottomSize"in portArrangement)return{left_size:portArrangement.leftSize,right_size:portArrangement.rightSize,top_size:portArrangement.topSize,bottom_size:portArrangement.bottomSize}}},CourtyardCircle=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_courtyard_circle_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"CourtyardCircle",zodProps:courtyardCircleProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,position4=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for CourtyardCircle. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_courtyard_circle3=db3.pcb_courtyard_circle.insert({pcb_component_id,layer,center:{x:position4.x,y:position4.y},radius:props.radius,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_courtyard_circle_id=pcb_courtyard_circle3.pcb_courtyard_circle_id}getPcbSize(){let{_parsedProps:props}=this,diameter=props.radius*2;return{width:diameter,height:diameter}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.pcb_courtyard_circle_id)return;let circle2=db3.pcb_courtyard_circle.get(this.pcb_courtyard_circle_id);circle2&&db3.pcb_courtyard_circle.update(this.pcb_courtyard_circle_id,{center:{x:circle2.center.x+deltaX,y:circle2.center.y+deltaY}})}},CourtyardOutline=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_courtyard_outline_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"CourtyardOutline",zodProps:courtyardOutlineProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for CourtyardOutline. Must be "top" or "bottom".`);let transform7=this._computePcbGlobalTransformBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_courtyard_outline3=db3.pcb_courtyard_outline.insert({pcb_component_id,layer,outline:props.outline.map(p5=>{let transformedPosition=applyToPoint2(transform7,{x:p5.x,y:p5.y});return{x:transformedPosition.x,y:transformedPosition.y}}),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_courtyard_outline_id=pcb_courtyard_outline3.pcb_courtyard_outline_id}_setPositionFromLayout(newCenter){let{db:db3}=this.root,currentOutline=db3.pcb_courtyard_outline.get(this.pcb_courtyard_outline_id);if(!currentOutline)return;let currentCenterX=0,currentCenterY=0;for(let point6 of currentOutline.outline)currentCenterX+=point6.x,currentCenterY+=point6.y;currentCenterX/=currentOutline.outline.length,currentCenterY/=currentOutline.outline.length;let offsetX=newCenter.x-currentCenterX,offsetY=newCenter.y-currentCenterY,newOutline=currentOutline.outline.map(point6=>({x:point6.x+offsetX,y:point6.y+offsetY}));db3.pcb_courtyard_outline.update(this.pcb_courtyard_outline_id,{outline:newOutline})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.pcb_courtyard_outline_id)return;let outline=db3.pcb_courtyard_outline.get(this.pcb_courtyard_outline_id);outline&&db3.pcb_courtyard_outline.update(this.pcb_courtyard_outline_id,{outline:outline.outline.map(p5=>({x:p5.x+deltaX,y:p5.y+deltaY}))})}getPcbSize(){let{_parsedProps:props}=this;if(!props.outline||props.outline.length===0)return{width:0,height:0};let bounds=getBoundsFromPoints(props.outline);return bounds?{width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY}:{width:0,height:0}}},CourtyardRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_courtyard_rect_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"CourtyardRect",zodProps:courtyardRectProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,position4=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer,isFlipped}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for CourtyardRect. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,ccw_rotation=(decomposeTSR2(this._computePcbGlobalTransformBeforeLayout()).rotation.angle*180/Math.PI%360+360)%360;isFlipped&&(ccw_rotation=(180-ccw_rotation+360)%360);let pcb_courtyard_rect3=db3.pcb_courtyard_rect.insert({pcb_component_id,layer,center:{x:position4.x,y:position4.y},width:props.width,height:props.height,ccw_rotation:ccw_rotation||void 0,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_courtyard_rect_id=pcb_courtyard_rect3.pcb_courtyard_rect_id}getPcbSize(){let{_parsedProps:props}=this;return{width:props.width,height:props.height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.pcb_courtyard_rect_id)return;let rect=db3.pcb_courtyard_rect.get(this.pcb_courtyard_rect_id);rect&&db3.pcb_courtyard_rect.update(this.pcb_courtyard_rect_id,{center:{x:rect.center.x+deltaX,y:rect.center.y+deltaY}})}};function normalizeTextForCircuitJson(text){return text.replace(/\\n/g,`
742
742
  `)}var CopperText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPcbPrimitive",!0);__publicField(this,"pcb_copper_text_id",null)}get config(){return{componentName:"CopperText",zodProps:copperTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,container=this.getPrimitiveContainer(),position4=this._getGlobalPcbPositionBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_copper_text3=db3.pcb_copper_text.insert({anchor_alignment:props.anchorAlignment,anchor_position:{x:position4.x,y:position4.y},font:"tscircuit2024",font_size:props.fontSize,layer:props.layer??"top",text:normalizeTextForCircuitJson(props.text),ccw_rotation:props.pcbRotation,is_mirrored:props.mirrored,is_knockout:props.knockout,pcb_component_id:container.pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_copper_text_id=pcb_copper_text3.pcb_copper_text_id}getPcbSize(){let{_parsedProps:props}=this,fontSize=props.fontSize??1,textWidth=(props.text??"").length*fontSize,textHeight=fontSize;return{width:textWidth*fontSize,height:textHeight*fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.pcb_copper_text_id)return;let text=db3.pcb_copper_text.get(this.pcb_copper_text_id);text&&db3.pcb_copper_text.update(this.pcb_copper_text_id,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}},Cutout=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_cutout_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Cutout",zodProps:cutoutProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),pcb_group_id=this.getGroup()?.pcb_group_id??void 0,globalPosition=this._getGlobalPcbPositionBeforeLayout(),parentRotation=this.getPrimitiveContainer()?._parsedProps.pcbRotation??0,inserted_pcb_cutout;if(props.shape==="rect"){let rotationDeg=typeof parentRotation=="string"?parseInt(parentRotation.replace("deg",""),10):parentRotation,isRotated90=Math.abs(rotationDeg%180)===90,rectData={shape:"rect",center:globalPosition,width:isRotated90?props.height:props.width,height:isRotated90?props.width:props.height,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id};inserted_pcb_cutout=db3.pcb_cutout.insert(rectData)}else if(props.shape==="circle"){let circleData={shape:"circle",center:globalPosition,radius:props.radius,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id};inserted_pcb_cutout=db3.pcb_cutout.insert(circleData)}else if(props.shape==="polygon"){let transform7=this._computePcbGlobalTransformBeforeLayout(),polygonData={shape:"polygon",points:props.points.map(p5=>applyToPoint2(transform7,p5)),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id};inserted_pcb_cutout=db3.pcb_cutout.insert(polygonData)}inserted_pcb_cutout&&(this.pcb_cutout_id=inserted_pcb_cutout.pcb_cutout_id)}getPcbSize(){let{_parsedProps:props}=this;if(props.shape==="rect")return{width:props.width,height:props.height};if(props.shape==="circle")return{width:props.radius*2,height:props.radius*2};if(props.shape==="polygon"){if(props.points.length===0)return{width:0,height:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point6 of props.points)minX=Math.min(minX,point6.x),maxX=Math.max(maxX,point6.x),minY=Math.min(minY,point6.y),maxY=Math.max(maxY,point6.y);return{width:maxX-minX,height:maxY-minY}}return{width:0,height:0}}_getPcbCircuitJsonBounds(){if(!this.pcb_cutout_id)return super._getPcbCircuitJsonBounds();let{db:db3}=this.root,cutout=db3.pcb_cutout.get(this.pcb_cutout_id);if(!cutout)return super._getPcbCircuitJsonBounds();if(cutout.shape==="rect")return{center:cutout.center,bounds:{left:cutout.center.x-cutout.width/2,top:cutout.center.y+cutout.height/2,right:cutout.center.x+cutout.width/2,bottom:cutout.center.y-cutout.height/2},width:cutout.width,height:cutout.height};if(cutout.shape==="circle")return{center:cutout.center,bounds:{left:cutout.center.x-cutout.radius,top:cutout.center.y+cutout.radius,right:cutout.center.x+cutout.radius,bottom:cutout.center.y-cutout.radius},width:cutout.radius*2,height:cutout.radius*2};if(cutout.shape==="polygon"){if(cutout.points.length===0)return super._getPcbCircuitJsonBounds();let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point6 of cutout.points)minX=Math.min(minX,point6.x),maxX=Math.max(maxX,point6.x),minY=Math.min(minY,point6.y),maxY=Math.max(maxY,point6.y);return{center:{x:(minX+maxX)/2,y:(minY+maxY)/2},bounds:{left:minX,top:maxY,right:maxX,bottom:minY},width:maxX-minX,height:maxY-minY}}return super._getPcbCircuitJsonBounds()}_setPositionFromLayout(newCenter){if(!this.pcb_cutout_id)return;let{db:db3}=this.root,cutout=db3.pcb_cutout.get(this.pcb_cutout_id);if(cutout){if(cutout.shape==="rect"||cutout.shape==="circle")db3.pcb_cutout.update(this.pcb_cutout_id,{...cutout,center:newCenter});else if(cutout.shape==="polygon"){let oldCenter=this._getPcbCircuitJsonBounds().center,dx3=newCenter.x-oldCenter.x,dy3=newCenter.y-oldCenter.y,newPoints=cutout.points.map(p5=>({x:p5.x+dx3,y:p5.y+dy3}));db3.pcb_cutout.update(this.pcb_cutout_id,{...cutout,points:newPoints})}}}_moveCircuitJsonElements({deltaX,deltaY}){if(!this.pcb_cutout_id)return;let{db:db3}=this.root,cutout=db3.pcb_cutout.get(this.pcb_cutout_id);cutout&&(cutout.shape==="rect"||cutout.shape==="circle"?db3.pcb_cutout.update(this.pcb_cutout_id,{center:{x:cutout.center.x+deltaX,y:cutout.center.y+deltaY}}):cutout.shape==="polygon"&&db3.pcb_cutout.update(this.pcb_cutout_id,{points:cutout.points.map(p5=>({x:p5.x+deltaX,y:p5.y+deltaY}))}))}},FabricationNotePath=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"fabrication_note_path_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNotePath",zodProps:fabricationNotePathProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,subcircuit=this.getSubcircuit(),{_parsedProps:props}=this,layer=props.layer??"top";if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenPath. Must be "top" or "bottom".`);let transform7=this._computePcbGlobalTransformBeforeLayout(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,fabrication_note_path=db3.pcb_fabrication_note_path.insert({pcb_component_id,layer,color:props.color,route:props.route.map(p5=>{let transformedPosition=applyToPoint2(transform7,{x:p5.x,y:p5.y});return{...p5,x:transformedPosition.x,y:transformedPosition.y}}),stroke_width:props.strokeWidth??.1,subcircuit_id:subcircuit?.subcircuit_id??void 0});this.fabrication_note_path_id=fabrication_note_path.pcb_fabrication_note_path_id}getPcbSize(){let{_parsedProps:props}=this;if(props.route.length===0)return{width:0,height:0};let xs3=props.route.map(point6=>typeof point6.x=="string"?parseFloat(point6.x):point6.x),ys3=props.route.map(point6=>typeof point6.y=="string"?parseFloat(point6.y):point6.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.fabrication_note_path_id)return;let path=db3.pcb_fabrication_note_path.get(this.fabrication_note_path_id);path&&db3.pcb_fabrication_note_path.update(this.fabrication_note_path_id,{route:path.route.map(p5=>({...p5,x:p5.x+deltaX,y:p5.y+deltaY}))})}},FabricationNoteRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"fabrication_note_rect_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNoteRect",zodProps:fabricationNoteRectProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,position4=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for FabricationNoteRect. Must be "top" or "bottom".`);let pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,subcircuit=this.getSubcircuit(),hasStroke=props.hasStroke??(props.strokeWidth!==void 0&&props.strokeWidth!==null),fabrication_note_rect=db3.pcb_fabrication_note_rect.insert({pcb_component_id,layer,color:props.color,center:{x:position4.x,y:position4.y},width:props.width,height:props.height,stroke_width:props.strokeWidth??1,is_filled:props.isFilled??!1,has_stroke:hasStroke,is_stroke_dashed:props.isStrokeDashed??!1,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,corner_radius:props.cornerRadius??void 0});this.fabrication_note_rect_id=fabrication_note_rect.pcb_fabrication_note_rect_id}getPcbSize(){let{_parsedProps:props}=this;return{width:props.width,height:props.height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.fabrication_note_rect_id)return;let rect=db3.pcb_fabrication_note_rect.get(this.fabrication_note_rect_id);rect&&db3.pcb_fabrication_note_rect.update(this.fabrication_note_rect_id,{center:{x:rect.center.x+deltaX,y:rect.center.y+deltaY}})}};function parseSegment(seg){let bracketIdx=seg.indexOf("[");if(bracketIdx===-1)return{tag:seg};let tag=seg.slice(0,bracketIdx),m4=seg.slice(bracketIdx+1,seg.lastIndexOf("]")).match(/^(\w+)(\^=|\$=|=)['"]?(.*?)['"]?$/);return m4?{tag,attrName:m4[1],attrOp:m4[2],attrValue:m4[3]}:{tag}}function componentMatchesSegment(component,seg){if(component.lowercaseComponentName!==seg.tag)return!1;if(!seg.attrName)return!0;let attrVal=component.props?.[seg.attrName];if(attrVal===void 0)return!1;let valStr=String(attrVal);switch(seg.attrOp){case"^=":return valStr.startsWith(seg.attrValue);case"$=":return valStr.endsWith(seg.attrValue);case"=":return valStr===seg.attrValue;default:return!1}}function matchesCompoundSelector(component,segments){if(!componentMatchesSegment(component,segments[segments.length-1]))return!1;let segIdx=segments.length-2,current3=component.parent;for(;segIdx>=0&&current3;)componentMatchesSegment(current3,segments[segIdx])&&segIdx--,current3=current3.parent;return segIdx<0}function resolvePcbProperty({propertyName,resolvedPcbSx,pathFromAmpersand,component}){if(!resolvedPcbSx)return;let result,bestSpecificity=0;for(let[key,entry]of Object.entries(resolvedPcbSx)){if(!entry||!(propertyName in entry))continue;let selectorBody=key.startsWith("& ")?key.slice(2):key;if(selectorBody===pathFromAmpersand){1>bestSpecificity&&(bestSpecificity=1,result=entry[propertyName]);continue}if(!component)continue;let segments=selectorBody.split(/\s+/).map(parseSegment);if(!(segments.length<2)&&matchesCompoundSelector(component,segments)){let specificity=segments.length;specificity>bestSpecificity&&(bestSpecificity=specificity,result=entry[propertyName])}}return result}var FabricationNoteText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_fabrication_note_text_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNoteText",zodProps:fabricationNoteTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,position4=this._getGlobalPcbPositionBeforeLayout(),container=this.getPrimitiveContainer(),subcircuit=this.getSubcircuit();if(resolvePcbProperty({propertyName:"visibility",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"fabricationnotetext",component:this})==="hidden")return;let pcb_fabrication_note_text3=db3.pcb_fabrication_note_text.insert({anchor_alignment:props.anchorAlignment,anchor_position:{x:position4.x,y:position4.y},font:props.font??"tscircuit2024",font_size:props.fontSize??1,layer:"top",color:props.color,text:normalizeTextForCircuitJson(props.text??""),pcb_component_id:container.pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_fabrication_note_text_id=pcb_fabrication_note_text3.pcb_fabrication_note_text_id}getPcbSize(){let{_parsedProps:props}=this,fontSize=typeof props.fontSize=="string"?parseFloat(props.fontSize):props.fontSize??1,charWidth=fontSize*.6;return{width:(props.text??"").length*charWidth,height:fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(this.pcb_fabrication_note_text_id){let text=db3.pcb_fabrication_note_text.get(this.pcb_fabrication_note_text_id);text&&db3.pcb_fabrication_note_text.update(this.pcb_fabrication_note_text_id,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}}},Hole=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_hole_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Hole",zodProps:holeProps}}getPcbSize(){let{_parsedProps:props}=this,isPill=props.shape==="pill",isOval=props.shape==="oval",isRect=props.shape==="rect";return isPill||isOval?{width:props.width,height:props.height}:isRect?{width:props.width,height:props.height}:{width:props.diameter,height:props.diameter}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),position4=this._getGlobalPcbPositionBeforeLayout(),soldermaskMargin=props.solderMaskMargin,isCoveredWithSolderMask=props.coveredWithSolderMask??!1,pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id;if(this.emitSolderMaskMarginWarning(isCoveredWithSolderMask,soldermaskMargin),props.shape==="pill")if(props.pcbRotation&&props.pcbRotation!==0){let inserted_hole=db3.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"rotated_pill",hole_width:props.width,hole_height:props.height,x:position4.x,y:position4.y,ccw_rotation:props.pcbRotation,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}else{let inserted_hole=db3.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"pill",hole_width:props.width,hole_height:props.height,x:position4.x,y:position4.y,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}else if(props.shape==="oval"){let inserted_hole=db3.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"oval",hole_width:props.width,hole_height:props.height,x:position4.x,y:position4.y,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}else if(props.shape==="rect"){let inserted_hole=db3.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"rect",hole_width:props.width,hole_height:props.height,x:position4.x,y:position4.y,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}else{let inserted_hole=db3.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"circle",hole_diameter:props.diameter,x:position4.x,y:position4.y,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}}_getPcbCircuitJsonBounds(){let{db:db3}=this.root,hole=db3.pcb_hole.get(this.pcb_hole_id),size3=this.getPcbSize();return{center:{x:hole.x,y:hole.y},bounds:{left:hole.x-size3.width/2,top:hole.y-size3.height/2,right:hole.x+size3.width/2,bottom:hole.y+size3.height/2},width:size3.width,height:size3.height}}_setPositionFromLayout(newCenter){let{db:db3}=this.root;db3.pcb_hole.update(this.pcb_hole_id,{x:newCenter.x,y:newCenter.y})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.pcb_hole_id)return;let hole=db3.pcb_hole.get(this.pcb_hole_id);hole&&db3.pcb_hole.update(this.pcb_hole_id,{x:hole.x+deltaX,y:hole.y+deltaY})}},Keepout=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_keepout_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Keepout",zodProps:pcbKeepoutProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let subcircuit=this.getSubcircuit(),{db:db3}=this.root,{_parsedProps:props}=this,position4=this._getGlobalPcbPositionBeforeLayout(),decomposedMat=decomposeTSR2(this._computePcbGlobalTransformBeforeLayout()),isRotated90=Math.abs(decomposedMat.rotation.angle*(180/Math.PI)-90)%180<.01,layers=props.layers;!layers&&props.layer&&(layers=[props.layer]),layers||(layers=["top"]);let pcb_keepout3=null;props.shape==="circle"?pcb_keepout3=db3.pcb_keepout.insert({layers,shape:"circle",radius:props.radius,center:{x:position4.x,y:position4.y},subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0}):props.shape==="rect"&&(pcb_keepout3=db3.pcb_keepout.insert({layers,shape:"rect",...isRotated90?{width:props.height,height:props.width}:{width:props.width,height:props.height},center:{x:position4.x,y:position4.y},subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0})),pcb_keepout3&&(this.pcb_keepout_id=pcb_keepout3.pcb_keepout_id)}getPcbSize(){let{_parsedProps:props}=this;return props.shape==="circle"?{width:props.radius*2,height:props.radius*2}:props.shape==="rect"?{width:props.width,height:props.height}:{width:0,height:0}}},PcbNoteLine=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_line_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteLine",zodProps:pcbNoteLineProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),group=this.getGroup(),transform7=this._computePcbGlobalTransformBeforeLayout(),start=applyToPoint2(transform7,{x:props.x1,y:props.y1}),end=applyToPoint2(transform7,{x:props.x2,y:props.y2}),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,pcb_note_line3=db3.pcb_note_line.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,x1:start.x,y1:start.y,x2:end.x,y2:end.y,layer:props.layer==="bottom"?"bottom":"top",stroke_width:props.strokeWidth??.1,color:props.color,is_dashed:props.isDashed});this.pcb_note_line_id=pcb_note_line3.pcb_note_line_id}getPcbSize(){let{_parsedProps:props}=this;return{width:Math.abs(props.x2-props.x1),height:Math.abs(props.y2-props.y1)}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.pcb_note_line_id)return;let line2=db3.pcb_note_line.get(this.pcb_note_line_id);line2&&db3.pcb_note_line.update(this.pcb_note_line_id,{x1:line2.x1+deltaX,y1:line2.y1+deltaY,x2:line2.x2+deltaX,y2:line2.y2+deltaY})}},PcbNotePath=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_path_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNotePath",zodProps:pcbNotePathProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,transform7=this._computePcbGlobalTransformBeforeLayout(),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,transformedRoute=props.route.map(point6=>{let{x:x4,y:y3,...rest}=point6,numericX=typeof x4=="string"?parseFloat(x4):x4,numericY=typeof y3=="string"?parseFloat(y3):y3,transformed=applyToPoint2(transform7,{x:numericX,y:numericY});return{...rest,x:transformed.x,y:transformed.y}}),pcb_note_path3=db3.pcb_note_path.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,route:transformedRoute,layer:props.layer==="bottom"?"bottom":"top",stroke_width:props.strokeWidth??.1,color:props.color});this.pcb_note_path_id=pcb_note_path3.pcb_note_path_id}getPcbSize(){let{_parsedProps:props}=this;if(props.route.length===0)return{width:0,height:0};let xs3=props.route.map(point6=>typeof point6.x=="string"?parseFloat(point6.x):point6.x),ys3=props.route.map(point6=>typeof point6.y=="string"?parseFloat(point6.y):point6.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.pcb_note_path_id)return;let path=db3.pcb_note_path.get(this.pcb_note_path_id);path&&db3.pcb_note_path.update(this.pcb_note_path_id,{route:path.route.map(p5=>({...p5,x:p5.x+deltaX,y:p5.y+deltaY}))})}},PcbNoteRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_rect_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteRect",zodProps:pcbNoteRectProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,transform7=this._computePcbGlobalTransformBeforeLayout(),center2=applyToPoint2(transform7,{x:0,y:0}),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,pcb_note_rect3=db3.pcb_note_rect.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,center:center2,width:props.width,height:props.height,layer:props.layer==="bottom"?"bottom":"top",stroke_width:props.strokeWidth??.1,is_filled:props.isFilled??!1,has_stroke:props.hasStroke??!0,is_stroke_dashed:props.isStrokeDashed??!1,color:props.color,corner_radius:props.cornerRadius??void 0});this.pcb_note_rect_id=pcb_note_rect3.pcb_note_rect_id}getPcbSize(){let{_parsedProps:props}=this,width=typeof props.width=="string"?parseFloat(props.width):props.width,height=typeof props.height=="string"?parseFloat(props.height):props.height;return{width,height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.pcb_note_rect_id)return;let rect=db3.pcb_note_rect.get(this.pcb_note_rect_id);rect&&db3.pcb_note_rect.update(this.pcb_note_rect_id,{center:{x:rect.center.x+deltaX,y:rect.center.y+deltaY}})}},PcbNoteText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_text_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteText",zodProps:pcbNoteTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,transform7=this._computePcbGlobalTransformBeforeLayout(),anchorPosition=applyToPoint2(transform7,{x:0,y:0}),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,pcb_note_text3=db3.pcb_note_text.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,font:props.font??"tscircuit2024",font_size:props.fontSize??1,text:normalizeTextForCircuitJson(props.text),anchor_position:anchorPosition,anchor_alignment:props.anchorAlignment??"center",layer:props.layer==="bottom"?"bottom":"top",color:props.color});this.pcb_note_text_id=pcb_note_text3.pcb_note_text_id}getPcbSize(){let{_parsedProps:props}=this,fontSize=typeof props.fontSize=="string"?parseFloat(props.fontSize):props.fontSize??1,charWidth=fontSize*.6;return{width:props.text.length*charWidth,height:fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.pcb_note_text_id)return;let text=db3.pcb_note_text.get(this.pcb_note_text_id);text&&db3.pcb_note_text.update(this.pcb_note_text_id,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}},pcbTraceProps2=external_exports.object({route:external_exports.array(pcb_trace_route_point),source_trace_id:external_exports.string().optional()}),PcbTrace=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_trace_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbTrace",zodProps:pcbTraceProps2}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,container=this.getPrimitiveContainer(),subcircuit=this.getSubcircuit(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),parentTransform=this._computePcbGlobalTransformBeforeLayout(),transformedRoute=props.route.map(point6=>{if(point6.route_type==="wire"){let{x:x4,y:y3,...restOfPoint}=point6,transformedPoint=applyToPoint2(parentTransform,{x:x4,y:y3});return{...restOfPoint,...transformedPoint,layer:maybeFlipLayer(point6.layer)}}if(point6.route_type==="via"){let{x:x4,y:y3,...restOfPoint}=point6,transformedPoint=applyToPoint2(parentTransform,{x:x4,y:y3});return{...restOfPoint,...transformedPoint,from_layer:maybeFlipLayer(point6.from_layer),to_layer:maybeFlipLayer(point6.to_layer)}}return{...point6,start:applyToPoint2(parentTransform,point6.start),end:applyToPoint2(parentTransform,point6.end),start_layer:maybeFlipLayer(point6.start_layer),end_layer:maybeFlipLayer(point6.end_layer)}}),pcb_trace3=db3.pcb_trace.insert({pcb_component_id:container.pcb_component_id,source_trace_id:props.source_trace_id,route:transformedRoute,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_trace_id=pcb_trace3.pcb_trace_id}getPcbSize(){let{_parsedProps:props}=this;if(!props.route||props.route.length===0)return{width:0,height:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point6 of props.route)point6.route_type==="through_pad"?(minX=Math.min(minX,point6.start.x,point6.end.x),maxX=Math.max(maxX,point6.start.x,point6.end.x),minY=Math.min(minY,point6.start.y,point6.end.y),maxY=Math.max(maxY,point6.start.y,point6.end.y)):(minX=Math.min(minX,point6.x),maxX=Math.max(maxX,point6.x),minY=Math.min(minY,point6.y),maxY=Math.max(maxY,point6.y)),point6.route_type==="wire"?(minX=Math.min(minX,point6.x-point6.width/2),maxX=Math.max(maxX,point6.x+point6.width/2),minY=Math.min(minY,point6.y-point6.width/2),maxY=Math.max(maxY,point6.y+point6.width/2)):point6.route_type==="through_pad"&&(minX=Math.min(minX,point6.start.x-point6.width/2,point6.end.x-point6.width/2),maxX=Math.max(maxX,point6.start.x+point6.width/2,point6.end.x+point6.width/2),minY=Math.min(minY,point6.start.y-point6.width/2,point6.end.y-point6.width/2),maxY=Math.max(maxY,point6.start.y+point6.width/2,point6.end.y+point6.width/2));return minX===1/0||maxX===-1/0||minY===1/0||maxY===-1/0?{width:0,height:0}:{width:maxX-minX,height:maxY-minY}}},pcbViaProps=viaProps.extend({layers:external_exports.array(layer_ref).optional(),isTented:external_exports.boolean().optional()}).partial({fromLayer:!0,toLayer:!0}),PcbVia=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_via_id",null);__publicField(this,"_importedPcbTraceId");__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbVia",zodProps:pcbViaProps}}_getLayers(){let{layers,fromLayer="top",toLayer="bottom"}=this._parsedProps;if(layers&&layers.length>0)return layers;let layerCount=this.parent?this.getSubcircuit()._getSubcircuitLayerCount():2;return getViaSpanLayers({fromLayer,toLayer,layerCount})}getAvailablePcbLayers(){return this._getLayers()}getPcbSize(){let outerDiameter=this._parsedProps.outerDiameter??.6;return{width:outerDiameter,height:outerDiameter}}_getPcbCircuitJsonBounds(){let{db:db3}=this.root,via=db3.pcb_via.get(this.pcb_via_id),size3=this.getPcbSize();return{center:{x:via.x,y:via.y},bounds:{left:via.x-size3.width/2,top:via.y-size3.height/2,right:via.x+size3.width/2,bottom:via.y+size3.height/2},width:size3.width,height:size3.height}}_setPositionFromLayout(newCenter){let{db:db3}=this.root;db3.pcb_via.update(this.pcb_via_id,{x:newCenter.x,y:newCenter.y})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{holeDiameter,outerDiameter,netIsAssignable,isTented}=this._parsedProps,subcircuit=this.getSubcircuit(),position4=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layers=this._getLayers().map(layer=>maybeFlipLayer(layer)),fromLayer=this._parsedProps.fromLayer?maybeFlipLayer(this._parsedProps.fromLayer):layers[0],toLayer=this._parsedProps.toLayer?maybeFlipLayer(this._parsedProps.toLayer):layers[layers.length-1]??fromLayer,pcbVia=db3.pcb_via.insert({x:position4.x,y:position4.y,...holeDiameter!==void 0?{hole_diameter:holeDiameter}:{},...outerDiameter!==void 0?{outer_diameter:outerDiameter}:{},layers,from_layer:fromLayer,to_layer:toLayer,pcb_trace_id:this._importedPcbTraceId,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,net_is_assignable:netIsAssignable,is_tented:isTented});this.pcb_via_id=pcbVia.pcb_via_id}};function getPcbPrimitiveBoundsBeforeRender(primitive){try{let center2=primitive._getGlobalPcbPositionBeforeLayout(),size3=primitive.getPcbSize();return{left:center2.x-size3.width/2,right:center2.x+size3.width/2,top:center2.y+size3.height/2,bottom:center2.y-size3.height/2}}catch{return null}}function doPcbPrimitivesOverlapBeforeRender(a3,b4){let aBounds=getPcbPrimitiveBoundsBeforeRender(a3),bBounds=getPcbPrimitiveBoundsBeforeRender(b4);return!aBounds||!bBounds?!1:!(aBounds.right<bBounds.left||aBounds.left>bBounds.right||aBounds.bottom>bBounds.top||aBounds.top<bBounds.bottom)}function getConnectedPcbPrimitiveClustersBeforeRender(primitives){let clusters=[],visited=new Set;for(let primitive of primitives){if(visited.has(primitive))continue;let cluster=[],stack=[primitive];for(visited.add(primitive);stack.length>0;){let current3=stack.pop();cluster.push(current3);for(let candidate of primitives)visited.has(candidate)||doPcbPrimitivesOverlapBeforeRender(current3,candidate)&&(visited.add(candidate),stack.push(candidate))}clusters.push(cluster)}return clusters}var getPinNumberFromHints=hints=>{for(let hint of hints){let normalizedHint=hint.toString();if(/^(pin)?\d+$/.test(normalizedHint))return Number.parseInt(normalizedHint.replace(/^pin/,""))}return null};function selectPortForPcbPrimitive(ports,primitive,hints){let pinNumber=getPinNumberFromHints(hints),matchingPorts=ports.filter(port=>port.isMatchingAnyOf(hints));if(matchingPorts.length===0)return null;let pinMatchedPorts=pinNumber===null?matchingPorts:matchingPorts.filter(port=>port._parsedProps.pinNumber===pinNumber||port._primaryPinNumber===pinNumber),candidates=pinMatchedPorts.length>0?pinMatchedPorts:matchingPorts,overlappingPort=candidates.find(port=>port.matchedComponents.some(component=>component.isPcbPrimitive&&doPcbPrimitivesOverlapBeforeRender(component,primitive)));return overlappingPort||(candidates.find(port=>!port.matchedComponents.some(component=>component.isPcbPrimitive))??candidates[0])}var PlatedHole=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_plated_hole_id",null);__publicField(this,"matchedPort",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PlatedHole",zodProps:platedHoleProps}}getAvailablePcbLayers(){return["top","inner1","inner2","bottom"]}getPcbSize(){let{_parsedProps:props}=this;if(props.shape==="circle")return{width:props.outerDiameter,height:props.outerDiameter};if(props.shape==="oval"||props.shape==="pill")return{width:props.outerWidth,height:props.outerHeight};if(props.shape==="circular_hole_with_rect_pad")return{width:props.rectPadWidth,height:props.rectPadHeight};if(props.shape==="pill_hole_with_rect_pad")return{width:props.rectPadWidth,height:props.rectPadHeight};if(props.shape==="hole_with_polygon_pad"){if(!props.padOutline||props.padOutline.length===0)throw new Error("padOutline is required for hole_with_polygon_pad shape");let xs3=props.padOutline.map(p5=>typeof p5.x=="number"?p5.x:parseFloat(String(p5.x))),ys3=props.padOutline.map(p5=>typeof p5.y=="number"?p5.y:parseFloat(String(p5.y))),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}throw new Error(`getPcbSize for shape "${props.shape}" not implemented for ${this.componentName}`)}_getPcbCircuitJsonBounds(){let{db:db3}=this.root,platedHole=db3.pcb_plated_hole.get(this.pcb_plated_hole_id),size3=this.getPcbSize();return{center:{x:platedHole.x,y:platedHole.y},bounds:{left:platedHole.x-size3.width/2,top:platedHole.y+size3.height/2,right:platedHole.x+size3.width/2,bottom:platedHole.y-size3.height/2},width:size3.width,height:size3.height}}_setPositionFromLayout(newCenter){let{db:db3}=this.root;db3.pcb_plated_hole.update(this.pcb_plated_hole_id,{x:newCenter.x,y:newCenter.y}),this.matchedPort?._setPositionFromLayout(newCenter)}doInitialPortMatching(){let parentPorts=this.getPrimitiveContainer()?.selectAll("port");if(!this._parsedProps.portHints)return;let port=selectPortForPcbPrimitive(parentPorts,this,this._parsedProps.portHints);port&&(this.matchedPort=port,port.registerMatch(this))}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,position4=this._getGlobalPcbPositionBeforeLayout(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,subcircuit=this.getSubcircuit(),soldermaskMargin=props.solderMaskMargin,isCoveredWithSolderMask=props.coveredWithSolderMask??!1;this.emitSolderMaskMarginWarning(isCoveredWithSolderMask,soldermaskMargin);let finalRotationDegrees=(decomposeTSR2(this._computePcbGlobalTransformBeforeLayout()).rotation.angle*180/Math.PI%360+360)%360;if(props.shape==="circle"){let pcb_plated_hole3=db3.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,outer_diameter:props.outerDiameter,hole_diameter:props.holeDiameter,shape:"circle",port_hints:this.getNameAndAliases(),x:position4.x,y:position4.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=pcb_plated_hole3.pcb_plated_hole_id,db3.pcb_solder_paste.insert({layer:"top",shape:"circle",radius:props.outerDiameter/2,x:position4.x,y:position4.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),db3.pcb_solder_paste.insert({layer:"bottom",shape:"circle",radius:props.outerDiameter/2,x:position4.x,y:position4.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else if(props.shape==="pill"&&props.rectPad){let pcb_plated_hole3=db3.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,outer_width:props.outerWidth,outer_height:props.outerHeight,hole_width:props.holeWidth,hole_height:props.holeHeight,shape:"rotated_pill_hole_with_rect_pad",type:"pcb_plated_hole",port_hints:this.getNameAndAliases(),pcb_plated_hole_id:this.pcb_plated_hole_id,x:position4.x,y:position4.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,hole_shape:"rotated_pill",pad_shape:"rect",hole_ccw_rotation:finalRotationDegrees,rect_ccw_rotation:finalRotationDegrees,rect_pad_width:props.outerWidth,rect_pad_height:props.outerHeight,hole_offset_x:props.holeOffsetX,hole_offset_y:props.holeOffsetY});this.pcb_plated_hole_id=pcb_plated_hole3.pcb_plated_hole_id}else if(props.shape==="pill"||props.shape==="oval"){let pcb_plated_hole3=db3.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,outer_width:props.outerWidth,outer_height:props.outerHeight,hole_width:props.holeWidth,hole_height:props.holeHeight,shape:props.shape,port_hints:this.getNameAndAliases(),x:position4.x,y:position4.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,ccw_rotation:finalRotationDegrees});this.pcb_plated_hole_id=pcb_plated_hole3.pcb_plated_hole_id,db3.pcb_solder_paste.insert({layer:"top",shape:props.shape,width:props.outerWidth,height:props.outerHeight,x:position4.x,y:position4.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),db3.pcb_solder_paste.insert({layer:"bottom",shape:props.shape,width:props.outerWidth,height:props.outerHeight,x:position4.x,y:position4.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else if(props.shape==="circular_hole_with_rect_pad"){let pcb_plated_hole3=db3.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,hole_diameter:props.holeDiameter,rect_pad_width:props.rectPadWidth,rect_pad_height:props.rectPadHeight,shape:"circular_hole_with_rect_pad",port_hints:this.getNameAndAliases(),x:position4.x,y:position4.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,hole_offset_x:props.holeOffsetX,hole_offset_y:props.holeOffsetY,rect_border_radius:props.rectBorderRadius??0,rect_ccw_rotation:finalRotationDegrees});this.pcb_plated_hole_id=pcb_plated_hole3.pcb_plated_hole_id}else if(props.shape==="pill_hole_with_rect_pad")if(finalRotationDegrees!==0){let pcb_plated_hole3=db3.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,hole_width:props.holeWidth,hole_height:props.holeHeight,rect_pad_width:props.rectPadWidth,rect_pad_height:props.rectPadHeight,hole_offset_x:props.holeOffsetX,hole_offset_y:props.holeOffsetY,shape:"rotated_pill_hole_with_rect_pad",type:"pcb_plated_hole",hole_shape:"rotated_pill",pad_shape:"rect",hole_ccw_rotation:finalRotationDegrees,rect_ccw_rotation:finalRotationDegrees,rect_border_radius:props.rectBorderRadius,port_hints:this.getNameAndAliases(),x:position4.x,y:position4.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=pcb_plated_hole3.pcb_plated_hole_id}else{let pcb_plated_hole3=db3.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,hole_width:props.holeWidth,hole_height:props.holeHeight,rect_pad_width:props.rectPadWidth,rect_pad_height:props.rectPadHeight,hole_offset_x:props.holeOffsetX,hole_offset_y:props.holeOffsetY,shape:"pill_hole_with_rect_pad",rect_border_radius:props.rectBorderRadius,port_hints:this.getNameAndAliases(),x:position4.x,y:position4.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=pcb_plated_hole3.pcb_plated_hole_id}else if(props.shape==="hole_with_polygon_pad"){let padOutline=(props.padOutline||[]).map(point6=>{let x4=typeof point6.x=="number"?point6.x:parseFloat(String(point6.x)),y3=typeof point6.y=="number"?point6.y:parseFloat(String(point6.y));return{x:x4,y:y3}}),pcb_plated_hole3=db3.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,shape:"hole_with_polygon_pad",hole_shape:props.holeShape||"circle",hole_diameter:props.holeDiameter,hole_width:props.holeWidth,hole_height:props.holeHeight,pad_outline:padOutline,hole_offset_x:typeof props.holeOffsetX=="number"?props.holeOffsetX:parseFloat(String(props.holeOffsetX||0)),hole_offset_y:typeof props.holeOffsetY=="number"?props.holeOffsetY:parseFloat(String(props.holeOffsetY||0)),port_hints:this.getNameAndAliases(),x:position4.x,y:position4.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=pcb_plated_hole3.pcb_plated_hole_id}}doInitialPcbPortAttachment(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;db3.pcb_plated_hole.update(this.pcb_plated_hole_id,{pcb_port_id:this.matchedPort?.pcb_port_id})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.pcb_plated_hole_id)return;let hole=db3.pcb_plated_hole.get(this.pcb_plated_hole_id);if(hole){let newCenter={x:hole.x+deltaX,y:hole.y+deltaY};this._setPositionFromLayout(newCenter)}}},stringProxy=new Proxy({},{get:(target,prop)=>prop}),FTYPE=stringProxy,SCHEMATIC_COMPONENT_OUTLINE_COLOR="rgba(132, 0, 0)",SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH=.12,SchematicArc=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_arc_id")}get config(){return{componentName:"SchematicArc",zodProps:schematicArcProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db3}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,schematic_arc3=db3.schematic_arc.insert({schematic_component_id,schematic_symbol_id,center:{x:props.center.x+globalPos.x,y:props.center.y+globalPos.y},radius:props.radius,start_angle_degrees:props.startAngleDegrees,end_angle_degrees:props.endAngleDegrees,direction:props.direction,stroke_width:props.strokeWidth??SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH,color:props.color??SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_dashed:props.isDashed,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,schematic_sheet_id:this._resolveSchematicSheetId()});this.schematic_arc_id=schematic_arc3.schematic_arc_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_arc_id)return;let transform7=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform7)return;let{db:db3}=this.root,arc2=db3.schematic_arc.get(this.schematic_arc_id);if(!arc2)return;let newCenter=applyToPoint2(transform7,arc2.center),edgePoint=applyToPoint2(transform7,{x:arc2.center.x+arc2.radius,y:arc2.center.y}),newRadius=Math.abs(edgePoint.x-newCenter.x);db3.schematic_arc.update(this.schematic_arc_id,{center:{x:newCenter.x,y:newCenter.y},radius:newRadius})}},SchematicCircle=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_circle_id")}get config(){return{componentName:"SchematicCircle",zodProps:schematicCircleProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db3}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,schematic_circle3=db3.schematic_circle.insert({schematic_component_id,schematic_symbol_id,center:{x:props.center.x+globalPos.x,y:props.center.y+globalPos.y},radius:props.radius,stroke_width:props.strokeWidth??SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH,color:props.color??SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_filled:props.isFilled,fill_color:props.fillColor,is_dashed:props.isDashed,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,schematic_sheet_id:this._resolveSchematicSheetId()});this.schematic_circle_id=schematic_circle3.schematic_circle_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_circle_id)return;let transform7=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform7)return;let{db:db3}=this.root,circle2=db3.schematic_circle.get(this.schematic_circle_id);if(!circle2)return;let newCenter=applyToPoint2(transform7,circle2.center),edgePoint=applyToPoint2(transform7,{x:circle2.center.x+circle2.radius,y:circle2.center.y}),newRadius=Math.abs(edgePoint.x-newCenter.x);db3.schematic_circle.update(this.schematic_circle_id,{center:{x:newCenter.x,y:newCenter.y},radius:newRadius})}},SchematicLine=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_line_id")}get config(){return{componentName:"SchematicLine",zodProps:schematicLineProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db3}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,schematic_line3=db3.schematic_line.insert({schematic_component_id,schematic_symbol_id,x1:props.x1+globalPos.x,y1:props.y1+globalPos.y,x2:props.x2+globalPos.x,y2:props.y2+globalPos.y,stroke_width:props.strokeWidth??SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH,color:props.color??SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_dashed:props.isDashed||props.dashLength!==void 0||props.dashGap!==void 0,dash_length:props.dashLength,dash_gap:props.dashGap,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,schematic_sheet_id:this._resolveSchematicSheetId()});this.schematic_line_id=schematic_line3.schematic_line_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_line_id)return;let transform7=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform7)return;let{db:db3}=this.root,line2=db3.schematic_line.get(this.schematic_line_id);if(!line2)return;let p12=applyToPoint2(transform7,{x:line2.x1,y:line2.y1}),p22=applyToPoint2(transform7,{x:line2.x2,y:line2.y2});db3.schematic_line.update(this.schematic_line_id,{x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y})}};function sampleCurveSegment2(segmentPath,samplesPerUnit){let commander=new src_default(segmentPath),length7=commander.getTotalLength(),numSamples=Math.max(2,Math.ceil(length7*samplesPerUnit)),points=[];for(let i3=1;i3<=numSamples;i3++){let t54=i3/numSamples*length7,point6=commander.getPointAtLength(t54);points.push({x:point6.x,y:point6.y})}return points}function svgPathToPoints2(svgPath,samplesPerUnit=10){let pathCommander=new src_default(svgPath);pathCommander.toAbsolute();let segments=pathCommander.segments,result=[],currentPoints=[],currentX=0,currentY=0,subpathStartX=0,subpathStartY=0;for(let segment2 of segments)switch(segment2[0]){case"M":{currentPoints.length>0&&result.push(currentPoints),currentX=segment2[1],currentY=segment2[2],subpathStartX=currentX,subpathStartY=currentY,currentPoints=[{x:currentX,y:currentY}];break}case"L":{currentX=segment2[1],currentY=segment2[2],currentPoints.push({x:currentX,y:currentY});break}case"H":{currentX=segment2[1],currentPoints.push({x:currentX,y:currentY});break}case"V":{currentY=segment2[1],currentPoints.push({x:currentX,y:currentY});break}case"Z":{(currentX!==subpathStartX||currentY!==subpathStartY)&&currentPoints.push({x:subpathStartX,y:subpathStartY}),currentX=subpathStartX,currentY=subpathStartY;break}case"C":{let endX=segment2[5],endY=segment2[6],segmentPath=`M ${currentX} ${currentY} C ${segment2[1]} ${segment2[2]} ${segment2[3]} ${segment2[4]} ${endX} ${endY}`,sampledPoints=sampleCurveSegment2(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}case"S":{let endX=segment2[3],endY=segment2[4],segmentPath=`M ${currentX} ${currentY} S ${segment2[1]} ${segment2[2]} ${endX} ${endY}`,sampledPoints=sampleCurveSegment2(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}case"Q":{let endX=segment2[3],endY=segment2[4],segmentPath=`M ${currentX} ${currentY} Q ${segment2[1]} ${segment2[2]} ${endX} ${endY}`,sampledPoints=sampleCurveSegment2(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}case"T":{let endX=segment2[1],endY=segment2[2],segmentPath=`M ${currentX} ${currentY} T ${endX} ${endY}`,sampledPoints=sampleCurveSegment2(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}case"A":{let endX=segment2[6],endY=segment2[7],segmentPath=`M ${currentX} ${currentY} A ${segment2[1]} ${segment2[2]} ${segment2[3]} ${segment2[4]} ${segment2[5]} ${endX} ${endY}`,sampledPoints=sampleCurveSegment2(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}}return currentPoints.length>0&&result.push(currentPoints),result.map(points=>{let deduped=[];for(let point6 of points)(deduped.length===0||Math.abs(deduped[deduped.length-1].x-point6.x)>1e-9||Math.abs(deduped[deduped.length-1].y-point6.y)>1e-9)&&deduped.push(point6);return deduped})}var SchematicPath=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_path_ids",[])}get config(){return{componentName:"SchematicPath",zodProps:schematicPathProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db3}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,subcircuit_id=this.getSubcircuit().subcircuit_id??void 0;if(this.schematic_path_ids=[],props.svgPath){let subpaths=svgPathToPoints2(props.svgPath);for(let subpathPoints of subpaths){let schematic_path3=db3.schematic_path.insert({schematic_component_id,schematic_symbol_id,points:subpathPoints.map(point6=>({x:point6.x+globalPos.x,y:point6.y+globalPos.y})),is_filled:props.isFilled,is_dashed:props.dashLength!==void 0||props.dashGap!==void 0,fill_color:props.fillColor,stroke_color:props.strokeColor,stroke_width:props.strokeWidth,dash_length:props.dashLength,dash_gap:props.dashGap,subcircuit_id,schematic_sheet_id:this._resolveSchematicSheetId()});this.schematic_path_ids.push(schematic_path3.schematic_path_id)}}else if(props.points&&props.points.length>0){let schematic_path3=db3.schematic_path.insert({schematic_component_id,schematic_symbol_id,points:props.points.map(point6=>({x:point6.x+globalPos.x,y:point6.y+globalPos.y})),is_filled:props.isFilled,is_dashed:props.dashLength!==void 0||props.dashGap!==void 0,fill_color:props.fillColor,stroke_color:props.strokeColor,stroke_width:props.strokeWidth,dash_length:props.dashLength,dash_gap:props.dashGap,subcircuit_id,schematic_sheet_id:this._resolveSchematicSheetId()});this.schematic_path_ids.push(schematic_path3.schematic_path_id)}}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||this.schematic_path_ids.length===0)return;let transform7=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform7)return;let{db:db3}=this.root;for(let pathId of this.schematic_path_ids){let path=db3.schematic_path.get(pathId);if(!path)continue;let newPoints=path.points.map(point6=>{let transformed=applyToPoint2(transform7,point6);return{x:transformed.x,y:transformed.y}});db3.schematic_path.update(pathId,{points:newPoints})}}},SchematicRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_rect_id")}get config(){return{componentName:"SchematicRect",zodProps:schematicRectProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db3}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,schematic_rect3=db3.schematic_rect.insert({schematic_symbol_id,center:{x:globalPos.x,y:globalPos.y},width:props.width,height:props.height,stroke_width:props.strokeWidth??SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH,color:props.color??SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_filled:props.isFilled,schematic_component_id,is_dashed:props.isDashed,rotation:props.rotation??0,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,schematic_sheet_id:this._resolveSchematicSheetId()});this.schematic_rect_id=schematic_rect3.schematic_rect_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_rect_id)return;let transform7=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform7)return;let{db:db3}=this.root,rect=db3.schematic_rect.get(this.schematic_rect_id);if(!rect)return;let topLeft=applyToPoint2(transform7,{x:rect.center.x-rect.width/2,y:rect.center.y+rect.height/2}),bottomRight=applyToPoint2(transform7,{x:rect.center.x+rect.width/2,y:rect.center.y-rect.height/2}),newWidth=Math.abs(bottomRight.x-topLeft.x),newHeight=Math.abs(topLeft.y-bottomRight.y),newCenter={x:(topLeft.x+bottomRight.x)/2,y:(topLeft.y+bottomRight.y)/2};db3.schematic_rect.update(this.schematic_rect_id,{center:newCenter,width:newWidth,height:newHeight})}},SchematicText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_text_id")}get config(){return{componentName:"SchematicText",zodProps:schematicTextProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db3}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,text=this._resolveText(),schematic_text3=db3.schematic_text.insert({schematic_symbol_id,anchor:props.anchor??"center",text:normalizeTextForCircuitJson(text),font_size:props.fontSize,color:props.color||"#000000",position:{x:globalPos.x,y:globalPos.y},rotation:props.schRotation??0,schematic_sheet_id:this._resolveSchematicSheetId()});this.schematic_text_id=schematic_text3.schematic_text_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_text_id)return;let transform7=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform7)return;let{db:db3}=this.root,text=db3.schematic_text.get(this.schematic_text_id);if(!text)return;let newPosition=applyToPoint2(transform7,text.position);db3.schematic_text.update(this.schematic_text_id,{position:{x:newPosition.x,y:newPosition.y}})}},SilkscreenCircle=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_circle_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenCircle",zodProps:silkscreenCircleProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,position4=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenCircle. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_circle3=db3.pcb_silkscreen_circle.insert({pcb_component_id,layer,center:{x:position4.x,y:position4.y},radius:props.radius,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,stroke_width:props.strokeWidth??.1});this.pcb_silkscreen_circle_id=pcb_silkscreen_circle3.pcb_silkscreen_circle_id}getPcbSize(){let{_parsedProps:props}=this,diameter=props.radius*2;return{width:diameter,height:diameter}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.pcb_silkscreen_circle_id)return;let circle2=db3.pcb_silkscreen_circle.get(this.pcb_silkscreen_circle_id);circle2&&db3.pcb_silkscreen_circle.update(this.pcb_silkscreen_circle_id,{center:{x:circle2.center.x+deltaX,y:circle2.center.y+deltaY}})}},SilkscreenLine=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_line_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenLine",zodProps:silkscreenLineProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenLine. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),transform7=this._computePcbGlobalTransformBeforeLayout(),p12=applyToPoint2(transform7,{x:props.x1,y:props.y1}),p22=applyToPoint2(transform7,{x:props.x2,y:props.y2}),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_line3=db3.pcb_silkscreen_line.insert({pcb_component_id,layer,x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y,stroke_width:props.strokeWidth??.1,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_silkscreen_line_id=pcb_silkscreen_line3.pcb_silkscreen_line_id}getPcbSize(){let{_parsedProps:props}=this,width=Math.abs(props.x2-props.x1),height=Math.abs(props.y2-props.y1);return{width,height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.pcb_silkscreen_line_id)return;let line2=db3.pcb_silkscreen_line.get(this.pcb_silkscreen_line_id);line2&&db3.pcb_silkscreen_line.update(this.pcb_silkscreen_line_id,{x1:line2.x1+deltaX,y1:line2.y1+deltaY,x2:line2.x2+deltaX,y2:line2.y2+deltaY})}},SilkscreenPath=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_path_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenPath",zodProps:silkscreenPathProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenPath. Must be "top" or "bottom".`);let transform7=this._computePcbGlobalTransformBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_path3=db3.pcb_silkscreen_path.insert({pcb_component_id,layer,route:props.route.map(p5=>{let transformedPosition=applyToPoint2(transform7,{x:p5.x,y:p5.y});return{...p5,x:transformedPosition.x,y:transformedPosition.y}}),stroke_width:props.strokeWidth??.1,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_silkscreen_path_id=pcb_silkscreen_path3.pcb_silkscreen_path_id}_setPositionFromLayout(newCenter){let{db:db3}=this.root,{_parsedProps:props}=this,currentPath=db3.pcb_silkscreen_path.get(this.pcb_silkscreen_path_id);if(!currentPath)return;let currentCenterX=0,currentCenterY=0;for(let point6 of currentPath.route)currentCenterX+=point6.x,currentCenterY+=point6.y;currentCenterX/=currentPath.route.length,currentCenterY/=currentPath.route.length;let offsetX=newCenter.x-currentCenterX,offsetY=newCenter.y-currentCenterY,newRoute=currentPath.route.map(point6=>({...point6,x:point6.x+offsetX,y:point6.y+offsetY}));db3.pcb_silkscreen_path.update(this.pcb_silkscreen_path_id,{route:newRoute})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.pcb_silkscreen_path_id)return;let path=db3.pcb_silkscreen_path.get(this.pcb_silkscreen_path_id);path&&db3.pcb_silkscreen_path.update(this.pcb_silkscreen_path_id,{route:path.route.map(p5=>({...p5,x:p5.x+deltaX,y:p5.y+deltaY}))})}getPcbSize(){let{_parsedProps:props}=this;if(!props.route||props.route.length===0)return{width:0,height:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point6 of props.route)minX=Math.min(minX,point6.x),maxX=Math.max(maxX,point6.x),minY=Math.min(minY,point6.y),maxY=Math.max(maxY,point6.y);return{width:maxX-minX,height:maxY-minY}}},SilkscreenRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_rect_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenRect",zodProps:silkscreenRectProps}}_isRotated90Degrees(){let globalTransform=this._computePcbGlobalTransformBeforeLayout(),normalizedRotationDegrees=(decomposeTSR2(globalTransform).rotation.angle*180/Math.PI%360+360)%360,rotationTolerance=.01;return Math.abs(normalizedRotationDegrees-90)<rotationTolerance||Math.abs(normalizedRotationDegrees-270)<rotationTolerance}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenRect. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),position4=this._getGlobalPcbPositionBeforeLayout(),isRotated90Degrees=this._isRotated90Degrees(),finalWidth=isRotated90Degrees?props.height:props.width,finalHeight=isRotated90Degrees?props.width:props.height,pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_rect3=db3.pcb_silkscreen_rect.insert({pcb_component_id,layer,center:{x:position4.x,y:position4.y},width:finalWidth,height:finalHeight,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this?.getGroup()?.pcb_group_id??void 0,stroke_width:props.strokeWidth??.1,is_filled:props.filled??!1,corner_radius:props.cornerRadius??void 0});this.pcb_silkscreen_rect_id=pcb_silkscreen_rect3.pcb_silkscreen_rect_id}getPcbSize(){let{_parsedProps:props}=this;return this._isRotated90Degrees()?{width:props.height,height:props.width}:{width:props.width,height:props.height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.pcb_silkscreen_rect_id)return;let rect=db3.pcb_silkscreen_rect.get(this.pcb_silkscreen_rect_id);rect&&db3.pcb_silkscreen_rect.update(this.pcb_silkscreen_rect_id,{center:{x:rect.center.x+deltaX,y:rect.center.y+deltaY}})}},SilkscreenText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_text_ids",[]);__publicField(this,"isPcbPrimitive",!0);__publicField(this,"_footprinterFontSize")}get config(){return{componentName:"SilkscreenText",zodProps:silkscreenTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,container=this.getPrimitiveContainer(),{maybeFlipLayer,isFlipped}=this._getPcbPrimitiveFlippedHelpers(),subcircuit=this.getSubcircuit(),rotation42=0;if(props.pcbRotation!==void 0&&props.pcbRotation!==0)rotation42=props.pcbRotation;else{let globalTransform=this._computePcbGlobalTransformBeforeLayout();rotation42=decomposeTSR2(globalTransform).rotation.angle*180/Math.PI}isFlipped&&(rotation42=(rotation42+180)%360);let uniqueLayers=new Set(props.layers);props.layer&&uniqueLayers.add(props.layer);let targetLayers=uniqueLayers.size>0?Array.from(uniqueLayers):["top"],resolvedPcbSxFontSize=resolvePcbProperty({propertyName:"fontSize",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),resolvedPcbSxPcbX=resolvePcbProperty({propertyName:"pcbX",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),resolvedPcbSxPcbY=resolvePcbProperty({propertyName:"pcbY",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this});if(resolvePcbProperty({propertyName:"visibility",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this})==="hidden")return;let fontSize=props.fontSize??resolvedPcbSxFontSize??this.getInheritedProperty("pcbStyle")?.silkscreenFontSize??this._footprinterFontSize??1,position4=(resolvedPcbSxPcbX!==void 0||resolvedPcbSxPcbY!==void 0)&&this._footprinterFontSize!==void 0?applyToPoint2(compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),isFlipped?flipY():identity()),{x:this.resolvePcbCoordinate({rawValue:resolvedPcbSxPcbX??props.pcbX??0,axis:"pcbX"}),y:this.resolvePcbCoordinate({rawValue:resolvedPcbSxPcbY??props.pcbY??0,axis:"pcbY"})}):this._getGlobalPcbPositionBeforeLayout(),uniformPadding=props.knockoutPadding??0,knockoutPadding=props.knockoutPadding!==void 0||props.knockoutPaddingLeft!==void 0||props.knockoutPaddingRight!==void 0||props.knockoutPaddingTop!==void 0||props.knockoutPaddingBottom!==void 0?{left:props.knockoutPaddingLeft??uniformPadding,right:props.knockoutPaddingRight??uniformPadding,top:props.knockoutPaddingTop??uniformPadding,bottom:props.knockoutPaddingBottom??uniformPadding}:void 0,text=this._resolveText();for(let layer of targetLayers){let pcb_silkscreen_text3=db3.pcb_silkscreen_text.insert({anchor_alignment:props.anchorAlignment,anchor_position:{x:position4.x,y:position4.y},font:props.font??"tscircuit2024",font_size:fontSize,layer:maybeFlipLayer(layer),text:normalizeTextForCircuitJson(text),ccw_rotation:rotation42,pcb_component_id:container.pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,is_knockout:props.isKnockout,knockout_padding:knockoutPadding});this.pcb_silkscreen_text_ids.push(pcb_silkscreen_text3.pcb_silkscreen_text_id)}}getPcbSize(){let{_parsedProps:props}=this,resolvedPcbSxFontSize=resolvePcbProperty({propertyName:"fontSize",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),fontSize=props.fontSize??resolvedPcbSxFontSize??this.getInheritedProperty("pcbStyle")?.silkscreenFontSize??this._footprinterFontSize??1,textWidth=this._resolveText().length*fontSize,textHeight=fontSize;return{width:textWidth*fontSize,height:textHeight*fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;for(let id3 of this.pcb_silkscreen_text_ids){let text=db3.pcb_silkscreen_text.get(id3);text&&db3.pcb_silkscreen_text.update(id3,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}}};function getAxisAlignedSizeFromRotatedRect({width,height,ccwRotationDegrees}){let angleRad=ccwRotationDegrees*Math.PI/180,cosAngle=Math.cos(angleRad),sinAngle=Math.sin(angleRad),w22=width/2,h22=height/2,xExtent=Math.abs(w22*cosAngle)+Math.abs(h22*sinAngle),yExtent=Math.abs(w22*sinAngle)+Math.abs(h22*cosAngle);return{width:xExtent*2,height:yExtent*2,xExtent,yExtent}}var SmtPad=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_smtpad_id",null);__publicField(this,"matchedPort",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SmtPad",zodProps:smtPadProps}}getPcbSize(){let{_parsedProps:props}=this;if(props.shape==="circle")return{width:props.radius*2,height:props.radius*2};if(props.shape==="rect")return{width:props.width,height:props.height};if(props.shape==="rotated_rect"){let{width,height}=getAxisAlignedSizeFromRotatedRect({width:props.width,height:props.height,ccwRotationDegrees:props.ccwRotation??0});return{width,height}}if(props.shape==="polygon"){let points=props.points,xs3=points.map(p5=>p5.x),ys3=points.map(p5=>p5.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}if(props.shape==="pill")return{width:props.width,height:props.height};throw new Error(`getPcbSize for shape "${props.shape}" not implemented for ${this.componentName}`)}doInitialPortMatching(){let parentPorts=this.getPrimitiveContainer()?.selectAll("port");if(!this.props.portHints)return;let port=selectPortForPcbPrimitive(parentPorts,this,this.props.portHints);port&&(this.matchedPort=port,port.registerMatch(this))}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,isCoveredWithSolderMask=props.coveredWithSolderMask??!1,shouldCreateSolderPaste=!isCoveredWithSolderMask,soldermaskMargin=props.solderMaskMargin;this.emitSolderMaskMarginWarning(isCoveredWithSolderMask,soldermaskMargin);let subcircuit=this.getSubcircuit(),position4=this._getGlobalPcbPositionBeforeLayout(),globalTransform=this._computePcbGlobalTransformBeforeLayout(),normalizedRotationDegrees=(decomposeTSR2(this._computePcbGlobalTransformBeforeLayout()).rotation.angle*180/Math.PI%360+360)%360,rotationTolerance=.01,isAxisAligned4=Math.abs(normalizedRotationDegrees)<rotationTolerance||Math.abs(normalizedRotationDegrees-180)<rotationTolerance||Math.abs(normalizedRotationDegrees-360)<rotationTolerance,isRotated90Degrees=Math.abs(normalizedRotationDegrees-90)<rotationTolerance||Math.abs(normalizedRotationDegrees-270)<rotationTolerance,finalRotationDegrees=Math.abs(normalizedRotationDegrees-360)<rotationTolerance?0:normalizedRotationDegrees,transformRotationBeforeFlip=finalRotationDegrees,{maybeFlipLayer:maybeFlipDefaultLayer,isFlipped}=this._getPcbPrimitiveFlippedHelpers(),primitiveContainer=this.getPrimitiveContainer(),primitiveContainerLayer=primitiveContainer?.props?.layer!==void 0?primitiveContainer?._parsedProps.layer:void 0,maybeFlipLayer=layer=>primitiveContainerLayer??maybeFlipDefaultLayer(layer);isFlipped&&(finalRotationDegrees=(360-finalRotationDegrees+360)%360);let portHints2=props.portHints?.map(ph3=>ph3.toString())??[],pcb_smtpad3=null,pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id;if(props.shape==="circle")pcb_smtpad3=db3.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"circle",radius:props.radius,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,x:position4.x,y:position4.y,subcircuit_id:subcircuit?.subcircuit_id??void 0}),shouldCreateSolderPaste&&db3.pcb_solder_paste.insert({layer:pcb_smtpad3.layer,shape:"circle",radius:pcb_smtpad3.radius*.7,x:pcb_smtpad3.x,y:pcb_smtpad3.y,pcb_component_id:pcb_smtpad3.pcb_component_id,pcb_smtpad_id:pcb_smtpad3.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});else if(props.shape==="rect")!isAxisAligned4&&!isRotated90Degrees?pcb_smtpad3=db3.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:props.width,height:props.height,corner_radius:props.cornerRadius??void 0,x:position4.x,y:position4.y,ccw_rotation:finalRotationDegrees,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}):pcb_smtpad3=db3.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"rect",width:isRotated90Degrees?props.height:props.width,height:isRotated90Degrees?props.width:props.height,corner_radius:props.cornerRadius??void 0,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,x:position4.x,y:position4.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),shouldCreateSolderPaste&&(pcb_smtpad3.shape==="rect"?db3.pcb_solder_paste.insert({layer:maybeFlipLayer(props.layer??"top"),shape:"rect",width:pcb_smtpad3.width*.7,height:pcb_smtpad3.height*.7,x:pcb_smtpad3.x,y:pcb_smtpad3.y,pcb_component_id:pcb_smtpad3.pcb_component_id,pcb_smtpad_id:pcb_smtpad3.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}):pcb_smtpad3.shape==="rotated_rect"&&db3.pcb_solder_paste.insert({layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:pcb_smtpad3.width*.7,height:pcb_smtpad3.height*.7,x:pcb_smtpad3.x,y:pcb_smtpad3.y,ccw_rotation:pcb_smtpad3.ccw_rotation,pcb_component_id:pcb_smtpad3.pcb_component_id,pcb_smtpad_id:pcb_smtpad3.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}));else if(props.shape==="rotated_rect"){let baseRotation=props.ccwRotation??0,combinedRotationBeforeFlip=(transformRotationBeforeFlip+baseRotation+360)%360,padRotation=isFlipped?(360-combinedRotationBeforeFlip+360)%360:combinedRotationBeforeFlip;pcb_smtpad3=db3.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:props.width,height:props.height,corner_radius:props.cornerRadius??void 0,x:position4.x,y:position4.y,ccw_rotation:padRotation,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),shouldCreateSolderPaste&&db3.pcb_solder_paste.insert({layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:pcb_smtpad3.width*.7,height:pcb_smtpad3.height*.7,x:position4.x,y:position4.y,ccw_rotation:padRotation,pcb_component_id,pcb_smtpad_id:pcb_smtpad3.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else if(props.shape==="polygon"){let transformedPoints=props.points.map(point6=>{let transformed=applyToPoint2(globalTransform,{x:distance.parse(point6.x),y:distance.parse(point6.y)});return{x:transformed.x,y:transformed.y}});pcb_smtpad3=db3.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"polygon",points:transformedPoints,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else props.shape==="pill"&&(finalRotationDegrees!==0?pcb_smtpad3=db3.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_pill",x:position4.x,y:position4.y,radius:props.radius,height:props.height,width:props.width,ccw_rotation:finalRotationDegrees,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}):pcb_smtpad3=db3.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"pill",x:position4.x,y:position4.y,radius:props.radius,height:props.height,width:props.width,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}));pcb_smtpad3&&(this.pcb_smtpad_id=pcb_smtpad3.pcb_smtpad_id)}doInitialPcbPortAttachment(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;db3.pcb_smtpad.update(this.pcb_smtpad_id,{pcb_port_id:this.matchedPort?.pcb_port_id})}getAvailablePcbLayers(){let{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),primitiveContainer=this.getPrimitiveContainer();return[(primitiveContainer?.props?.layer!==void 0?primitiveContainer?._parsedProps.layer:void 0)??maybeFlipLayer(this._parsedProps.layer??"top")]}_getPcbCircuitJsonBounds(){let{db:db3}=this.root,smtpad2=db3.pcb_smtpad.get(this.pcb_smtpad_id);if(smtpad2.shape==="rect")return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-smtpad2.width/2,top:smtpad2.y+smtpad2.height/2,right:smtpad2.x+smtpad2.width/2,bottom:smtpad2.y-smtpad2.height/2},width:smtpad2.width,height:smtpad2.height};if(smtpad2.shape==="rotated_rect"){let{width,height,xExtent,yExtent}=getAxisAlignedSizeFromRotatedRect({width:smtpad2.width,height:smtpad2.height,ccwRotationDegrees:smtpad2.ccw_rotation});return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-xExtent,right:smtpad2.x+xExtent,top:smtpad2.y-yExtent,bottom:smtpad2.y+yExtent},width,height}}if(smtpad2.shape==="circle")return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-smtpad2.radius,top:smtpad2.y-smtpad2.radius,right:smtpad2.x+smtpad2.radius,bottom:smtpad2.y+smtpad2.radius},width:smtpad2.radius*2,height:smtpad2.radius*2};if(smtpad2.shape==="polygon"){let points=smtpad2.points,xs3=points.map(p5=>p5.x),ys3=points.map(p5=>p5.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{center:{x:(minX+maxX)/2,y:(minY+maxY)/2},bounds:{left:minX,top:maxY,right:maxX,bottom:minY},width:maxX-minX,height:maxY-minY}}if(smtpad2.shape==="pill"){let halfWidth=smtpad2.width/2,halfHeight=smtpad2.height/2;return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-halfWidth,top:smtpad2.y-halfHeight,right:smtpad2.x+halfWidth,bottom:smtpad2.y+halfHeight},width:smtpad2.width,height:smtpad2.height}}if(smtpad2.shape==="rotated_pill"){let{width,height,xExtent,yExtent}=getAxisAlignedSizeFromRotatedRect({width:smtpad2.width,height:smtpad2.height,ccwRotationDegrees:smtpad2.ccw_rotation});return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-xExtent,right:smtpad2.x+xExtent,top:smtpad2.y-yExtent,bottom:smtpad2.y+yExtent},width,height}}throw new Error(`circuitJson bounds calculation not implemented for shape "${smtpad2.shape}"`)}_setPositionFromLayout(newCenter){let{db:db3}=this.root;db3.pcb_smtpad.update(this.pcb_smtpad_id,{x:newCenter.x,y:newCenter.y});let solderPaste=db3.pcb_solder_paste.list().find(elm=>elm.pcb_smtpad_id===this.pcb_smtpad_id);solderPaste&&db3.pcb_solder_paste.update(solderPaste.pcb_solder_paste_id,{x:newCenter.x,y:newCenter.y}),this.matchedPort?._setPositionFromLayout(newCenter)}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.pcb_smtpad_id)return;let pad2=db3.pcb_smtpad.get(this.pcb_smtpad_id);if(pad2.shape==="rect"||pad2.shape==="circle"||pad2.shape==="rotated_rect"||pad2.shape==="pill"||pad2.shape==="rotated_pill")this._setPositionFromLayout({x:pad2.x+deltaX,y:pad2.y+deltaY});else if(pad2.shape==="polygon"){db3.pcb_smtpad.update(this.pcb_smtpad_id,{points:pad2.points.map(p5=>({x:p5.x+deltaX,y:p5.y+deltaY}))});let newCenter={x:this._getPcbCircuitJsonBounds().center.x+deltaX/2,y:this._getPcbCircuitJsonBounds().center.y+deltaY/2};this.matchedPort?._setPositionFromLayout(newCenter)}}};function getRelativeDirection(pointA,pointB){let dx3=pointB.x-pointA.x,dy3=pointB.y-pointA.y;return Math.abs(dx3)>Math.abs(dy3)?dx3>=0?"right":"left":dy3>=0?"up":"down"}var getCenterOfPcbPrimitives=pcbPrimitives=>{if(pcbPrimitives.length===0)throw new Error("Cannot get center of empty PCB primitives array");let positions=pcbPrimitives.map(p5=>p5._getPcbCircuitJsonBounds().center).filter(Boolean),sumX=positions.reduce((sum,pos)=>sum+pos.x,0),sumY=positions.reduce((sum,pos)=>sum+pos.y,0);return{x:sumX/positions.length,y:sumY/positions.length}},applyPinAttributesToSourcePort=(sourcePortProps,attributes2)=>{attributes2.mustBeConnected!==void 0&&(sourcePortProps.must_be_connected=attributes2.mustBeConnected),attributes2.providesPower!==void 0&&(sourcePortProps.provides_power=attributes2.providesPower),attributes2.requiresPower!==void 0&&(sourcePortProps.requires_power=attributes2.requiresPower),attributes2.providesGround!==void 0&&(sourcePortProps.provides_ground=attributes2.providesGround),attributes2.requiresGround!==void 0&&(sourcePortProps.requires_ground=attributes2.requiresGround),attributes2.providesVoltage!==void 0&&(sourcePortProps.provides_voltage=attributes2.providesVoltage),attributes2.requiresVoltage!==void 0&&(sourcePortProps.requires_voltage=attributes2.requiresVoltage),attributes2.doNotConnect!==void 0&&(sourcePortProps.do_not_connect=attributes2.doNotConnect),attributes2.includeInBoardPinout!==void 0&&(sourcePortProps.include_in_board_pinout=attributes2.includeInBoardPinout),attributes2.canUseInternalPullup!==void 0&&(sourcePortProps.can_use_internal_pullup=attributes2.canUseInternalPullup),attributes2.isUsingInternalPullup!==void 0&&(sourcePortProps.is_using_internal_pullup=attributes2.isUsingInternalPullup),attributes2.needsExternalPullup!==void 0&&(sourcePortProps.needs_external_pullup=attributes2.needsExternalPullup),attributes2.canUseInternalPulldown!==void 0&&(sourcePortProps.can_use_internal_pulldown=attributes2.canUseInternalPulldown),attributes2.isUsingInternalPulldown!==void 0&&(sourcePortProps.is_using_internal_pulldown=attributes2.isUsingInternalPulldown),attributes2.needsExternalPulldown!==void 0&&(sourcePortProps.needs_external_pulldown=attributes2.needsExternalPulldown),attributes2.canUseOpenDrain!==void 0&&(sourcePortProps.can_use_open_drain=attributes2.canUseOpenDrain),attributes2.isUsingOpenDrain!==void 0&&(sourcePortProps.is_using_open_drain=attributes2.isUsingOpenDrain),attributes2.canUsePushPull!==void 0&&(sourcePortProps.can_use_push_pull=attributes2.canUsePushPull),attributes2.isUsingPushPull!==void 0&&(sourcePortProps.is_using_push_pull=attributes2.isUsingPushPull),attributes2.shouldHaveDecouplingCapacitor!==void 0&&(sourcePortProps.should_have_decoupling_capacitor=attributes2.shouldHaveDecouplingCapacitor),attributes2.recommendedDecouplingCapacitorCapacitance!==void 0&&(sourcePortProps.recommended_decoupling_capacitor_capacitance=attributes2.recommendedDecouplingCapacitorCapacitance)},Port=class extends PrimitiveComponent2{constructor(props,opts={}){if(!props.name&&props.pinNumber!==void 0&&(props.name=`pin${props.pinNumber}`),!props.name)throw new Error("Port must have a name or a pinNumber");super(props);__publicField(this,"source_port_id",null);__publicField(this,"pcb_port_id",null);__publicField(this,"schematic_port_id",null);__publicField(this,"schematic_stem_line_id",null);__publicField(this,"schematicSymbolPortDef",null);__publicField(this,"matchedComponents");__publicField(this,"_isPrimaryPort",!0);__publicField(this,"_primaryPinNumber",null);__publicField(this,"facingDirection",null);__publicField(this,"originDescription",null);opts.originDescription&&(this.originDescription=opts.originDescription),this.matchedComponents=[]}get config(){return{componentName:"Port",zodProps:portProps}}isGroupPort(){return this.parent?.componentName==="Group"}isComponentPort(){return!this.isGroupPort()}_getConnectedPortsFromConnectsTo(){let{_parsedProps:props}=this,connectsTo=props.connectsTo;if(!connectsTo)return[];let connectedPorts=[],connectsToArray=Array.isArray(connectsTo)?connectsTo:[connectsTo];for(let connection of connectsToArray){let port=this.getSubcircuit().selectOne(connection,{type:"port"});port&&connectedPorts.push(port)}return connectedPorts}_isBoardPinoutFromAttributes(){let parent=this.parent;if(parent?._parsedProps?.pinAttributes){let pinAttributes=parent._parsedProps.pinAttributes;for(let alias of this.getNameAndAliases())if(pinAttributes[alias]?.includeInBoardPinout)return!0}}_getGlobalPcbPositionBeforeLayout(){let matchedPcbElm=this.matchedComponents.find(c6=>c6.isPcbPrimitive),parentComponent=this.parent;if(parentComponent&&!parentComponent.props.footprint)throw new Error(`${parentComponent.componentName} "${parentComponent.props.name}" does not have a footprint. Add a footprint prop, e.g. <${parentComponent.componentName.toLowerCase()} footprint="..." />`);if(!matchedPcbElm)throw new Error(`Port ${this} has no matching PCB primitives. This often means the footprint's pads lack matching port hints.`);return matchedPcbElm?._getGlobalPcbPositionBeforeLayout()??{x:0,y:0}}_getPcbCircuitJsonBounds(){if(!this.pcb_port_id)return super._getPcbCircuitJsonBounds();let{db:db3}=this.root,pcb_port3=db3.pcb_port.get(this.pcb_port_id);return{center:{x:pcb_port3.x,y:pcb_port3.y},bounds:{left:0,top:0,right:0,bottom:0},width:0,height:0}}_getGlobalPcbPositionAfterLayout(){return this._getPcbCircuitJsonBounds().center}_getPortsInternallyConnectedToThisPort(){let parent=this.parent;if(!parent||!parent._getInternallyConnectedPins)return[];let internallyConnectedPorts=parent._getInternallyConnectedPins();for(let ports of internallyConnectedPorts)if(ports.some(port=>port===this))return ports;return[]}_hasSchematicPort(){let{schX,schY}=this._parsedProps;if(schX!==void 0&&schY!==void 0)return!0;let parentNormalComponent=this.getParentNormalComponent();if(parentNormalComponent?.getSchematicSymbol())return!!(this.schematicSymbolPortDef||this._getPortsInternallyConnectedToThisPort().some(p5=>p5.schematicSymbolPortDef));let parentBoxDim=parentNormalComponent?._getSchematicBoxDimensions();return!!(parentBoxDim&&this._parsedProps.pinNumber!==void 0&&parentBoxDim.getPortPositionByPinNumber(this._parsedProps.pinNumber))}_getGlobalSchematicPositionBeforeLayout(){let{schX,schY}=this._parsedProps;if(schX!==void 0&&schY!==void 0)return{x:schX,y:schY};let parentNormalComponent=this.getParentNormalComponent(),symbol=parentNormalComponent?.getSchematicSymbol();if(symbol){let schematicSymbolPortDef=this.schematicSymbolPortDef;if(!schematicSymbolPortDef&&(schematicSymbolPortDef=this._getPortsInternallyConnectedToThisPort().find(p5=>p5.schematicSymbolPortDef)?.schematicSymbolPortDef??null,!schematicSymbolPortDef))throw new Error(`Couldn't find schematicSymbolPortDef for port ${this.getString()}, searched internally connected ports and none had a schematicSymbolPortDef. Why are we trying to get the schematic position of this port?`);let transform7=compose2(parentNormalComponent.computeSchematicGlobalTransform(),translate2(-symbol.center.x,-symbol.center.y));return applyToPoint2(transform7,schematicSymbolPortDef)}let parentBoxDim=parentNormalComponent?._getSchematicBoxDimensions();if(parentBoxDim&&this._parsedProps.pinNumber!==void 0){let localPortPosition=parentBoxDim.getPortPositionByPinNumber(this._parsedProps.pinNumber);if(!localPortPosition)throw new Error(`Couldn't find position for schematic_port for port ${this.getString()} inside of the schematic box`);return applyToPoint2(parentNormalComponent.computeSchematicGlobalTransform(),localPortPosition)}throw new Error(`Couldn't find position for schematic_port for port ${this.getString()}`)}_getGlobalSchematicPositionAfterLayout(){let{db:db3}=this.root;if(!this.schematic_port_id)throw new Error(`Can't get schematic port position after layout for "${this.getString()}", no schematic_port_id`);let schematic_port3=db3.schematic_port.get(this.schematic_port_id);if(!schematic_port3)throw new Error(`Schematic port not found when trying to get post-layout position: ${this.schematic_port_id}`);return schematic_port3.center}registerMatch(component){this.matchedComponents.push(component)}getNameAndAliases(){let{_parsedProps:props}=this;return Array.from(new Set([...props.name?[props.name]:[],...props.aliases??[],...typeof props.pinNumber=="number"?[`pin${props.pinNumber}`,props.pinNumber.toString()]:[],...this.externallyAddedAliases??[]]))}_getMatchingPinAttributes(){let parentProps=this.parent?._parsedProps,pinAttributes=parentProps?.pinAttributes,noConnect=parentProps?.noConnect,matches=[];for(let alias of this.getNameAndAliases()){if(pinAttributes){let attributes2=pinAttributes[alias];attributes2&&matches.push(attributes2)}noConnect?.includes(alias)&&matches.push({doNotConnect:!0})}return matches.length===0?[]:matches}_shouldIncludeInBoardPinout(){return this._getMatchingPinAttributes().some(attributes2=>attributes2.includeInBoardPinout===!0)}isMatchingPort(port){return this.isMatchingAnyOf(port.getNameAndAliases())}getPortSelector(){return`.${(this.getParentNormalComponent()??this.parent)?.props.name} > port.${this.props.name}`}getAvailablePcbLayers(){let{layer,layers}=this._parsedProps;return layers||(layer?[layer]:Array.from(new Set(this.matchedComponents.flatMap(c6=>c6.getAvailablePcbLayers()))))}_getDirectlyConnectedTraces(){return this.getSubcircuit().selectAll("trace").filter(trace=>!trace._couldNotFindPort).filter(trace=>trace._isExplicitlyConnectedToPort(this))}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,port_hints=this.getNameAndAliases(),parentNormalComponent=this.getParentNormalComponent(),source_component_id=(this.parent?.source_component_id?this.parent:parentNormalComponent)?.source_component_id??null,pinAttributes=this._getMatchingPinAttributes(),portAttributesFromParent={};for(let attributes2 of pinAttributes)applyPinAttributesToSourcePort(portAttributesFromParent,attributes2);let source_port3=db3.source_port.insert({name:props.name,pin_number:props.pinNumber,port_hints,source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id,...portAttributesFromParent});this.source_port_id=source_port3.source_port_id}doInitialSourceParentAttachment(){let{db:db3}=this.root,parentNormalComponent=this.getParentNormalComponent(),parentWithSourceId=this.parent?.source_component_id?this.parent:parentNormalComponent;if(this.isGroupPort()){db3.source_port.update(this.source_port_id,{source_component_id:null,subcircuit_id:this.getSubcircuit()?.subcircuit_id});return}if(!parentWithSourceId?.source_component_id)throw new Error(`${this.getString()} has no parent source component (parent: ${this.parent?.getString()})`);db3.source_port.update(this.source_port_id,{source_component_id:parentWithSourceId.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id}),this.source_component_id=parentWithSourceId.source_component_id}doInitialPcbPortRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{matchedComponents}=this;if(this.isGroupPort()){let connectedPorts=this._getConnectedPortsFromConnectsTo();if(connectedPorts.length===0)return;let connectedPort=connectedPorts[0];if(!connectedPort.pcb_port_id)return;let connectedPcbPort=db3.pcb_port.get(connectedPort.pcb_port_id),matchCenter2={x:connectedPcbPort.x,y:connectedPcbPort.y},subcircuit=this.getSubcircuit(),pcb_port3=db3.pcb_port.insert({pcb_component_id:void 0,layers:connectedPort.getAvailablePcbLayers(),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...matchCenter2,source_port_id:this.source_port_id,is_board_pinout:!1});this.pcb_port_id=pcb_port3.pcb_port_id;return}let parentNormalComponent=this.getParentNormalComponent(),parentWithPcbComponentId=this.parent?.pcb_component_id?this.parent:parentNormalComponent;if(!parentWithPcbComponentId?.pcb_component_id)throw new Error(`${this.getString()} has no parent pcb component, cannot render pcb_port (parent: ${this.parent?.getString()}, parentNormalComponent: ${parentNormalComponent?.getString()})`);let pcbMatches=matchedComponents.filter(c6=>c6.isPcbPrimitive);if(pcbMatches.length===0)return;let matchCenter=null;if(pcbMatches.length===1&&(matchCenter=pcbMatches[0]._getPcbCircuitJsonBounds().center),pcbMatches.length>1){if(!areAllPcbPrimitivesOverlapping(pcbMatches)){let portName=this.props.name,componentName=this.getParentNormalComponent()?.props.name??"unknown",altAliases=this.getNameAndAliases().filter(h3=>h3!==portName),altMsg=altAliases.length>0?` (consider using alternate aliases: ${altAliases.join(", ")})`:"";db3.source_ambiguous_port_reference.insert({error_type:"source_ambiguous_port_reference",message:`${componentName}.${portName} is ambiguous: ${componentName}.${portName} references multiple non-overlapping pads: ${pcbMatches.map(c6=>c6.getString()).join(", ")}${altMsg}`,source_port_id:this.source_port_id??void 0,source_component_id:this.getParentNormalComponent()?.source_component_id??void 0});return}matchCenter=getCenterOfPcbPrimitives(pcbMatches)}if(matchCenter){let subcircuit=this.getSubcircuit(),isBoardPinout=this._shouldIncludeInBoardPinout(),pcb_port3=db3.pcb_port.insert({pcb_component_id:parentWithPcbComponentId.pcb_component_id,layers:this.getAvailablePcbLayers(),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...isBoardPinout?{is_board_pinout:!0}:{},...matchCenter,source_port_id:this.source_port_id,is_board_pinout:this._isBoardPinoutFromAttributes()});this.pcb_port_id=pcb_port3.pcb_port_id}else{let pcbMatch=pcbMatches[0];throw new Error(`${pcbMatch.getString()} does not have a center or _getGlobalPcbPositionBeforeLayout method (needed for pcb_port placement)`)}}updatePcbPortRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(this.pcb_port_id)return;if(this.isGroupPort()){let connectedPorts=this._getConnectedPortsFromConnectsTo();if(connectedPorts.length===0)return;let connectedPort=connectedPorts[0];if(!connectedPort.pcb_port_id)return;let connectedPcbPort=db3.pcb_port.get(connectedPort.pcb_port_id),matchCenter2={x:connectedPcbPort.x,y:connectedPcbPort.y},subcircuit2=this.getSubcircuit(),pcb_port22=db3.pcb_port.insert({pcb_component_id:void 0,layers:connectedPort.getAvailablePcbLayers(),subcircuit_id:subcircuit2?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...matchCenter2,source_port_id:this.source_port_id,is_board_pinout:!1});this.pcb_port_id=pcb_port22.pcb_port_id;return}let pcbMatches=this.matchedComponents.filter(c6=>c6.isPcbPrimitive);if(pcbMatches.length===0)return;let matchCenter=null;if(pcbMatches.length===1&&(matchCenter=pcbMatches[0]._getPcbCircuitJsonBounds().center),pcbMatches.length>1)try{areAllPcbPrimitivesOverlapping(pcbMatches)&&(matchCenter=getCenterOfPcbPrimitives(pcbMatches))}catch{}if(!matchCenter)return;let parentNormalComponent=this.getParentNormalComponent(),parentWithPcbComponentId=this.parent?.pcb_component_id?this.parent:parentNormalComponent,subcircuit=this.getSubcircuit(),isBoardPinout=this._shouldIncludeInBoardPinout(),pcb_port3=db3.pcb_port.insert({pcb_component_id:parentWithPcbComponentId?.pcb_component_id,layers:this.getAvailablePcbLayers(),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...isBoardPinout?{is_board_pinout:!0}:{},...matchCenter,source_port_id:this.source_port_id,is_board_pinout:this._isBoardPinoutFromAttributes()});this.pcb_port_id=pcb_port3.pcb_port_id}_getBestDisplayPinLabel(){let{db:db3}=this.root,sourcePort=db3.source_port.get(this.source_port_id),labelHints=[];for(let portHint of sourcePort?.port_hints??[])portHint.match(/^(pin)?\d+$/)||portHint.match(/^(left|right)/)&&!sourcePort?.name.match(/^(left|right)/)||labelHints.push(portHint);if(this.getParentNormalComponent()?.props?.showPinAliases&&labelHints.length>0)return labelHints.join("/");if(labelHints.length>0)return labelHints[0]}doInitialSchematicPortRender(){let collapsedAncestor=this.getCollapsedSchematicBoxAncestor();if(collapsedAncestor&&this.parent!==collapsedAncestor)return;let{db:db3}=this.root,{_parsedProps:props}=this,{schX,schY}=props,container=schX!==void 0&&schY!==void 0?this.getParentNormalComponent():this.getPrimitiveContainer();if(!container||!this._hasSchematicPort())return;let containerCenter=container._getGlobalSchematicPositionBeforeLayout(),portCenter=this._getGlobalSchematicPositionBeforeLayout(),localPortInfo=null,containerDims=container._getSchematicBoxDimensions();containerDims&&props.pinNumber!==void 0&&(localPortInfo=containerDims.getPortPositionByPinNumber(props.pinNumber)),this.getSubcircuit().props._schDebugObjectsEnabled&&db3.schematic_debug_object.insert({shape:"rect",center:portCenter,size:{width:.1,height:.1},label:"obstacle"});let isExplicitCustomSymbolPort=schX!==void 0&&schY!==void 0&&!!this._getSymbolAncestor();localPortInfo?.side?this.facingDirection={left:"left",right:"right",top:"up",bottom:"down"}[localPortInfo.side]:(this.facingDirection=getRelativeDirection(containerCenter,portCenter),isExplicitCustomSymbolPort&&props.direction&&(this.facingDirection=props.direction));let bestDisplayPinLabel=this._getBestDisplayPinLabel(),parentNormalComponent=this.getParentNormalComponent(),sideOfComponent=localPortInfo?.side??(props.direction==="up"?"top":props.direction==="down"?"bottom":props.direction),schematicPortInsertProps={type:"schematic_port",schematic_component_id:parentNormalComponent?.schematic_component_id,center:portCenter,source_port_id:this.source_port_id,facing_direction:this.facingDirection,distance_from_component_edge:props.schStemLength??.4,side_of_component:sideOfComponent,pin_number:props.pinNumber,true_ccw_index:localPortInfo?.trueIndex,display_pin_label:bestDisplayPinLabel,is_connected:!1,schematic_sheet_id:this._resolveSchematicSheetId()};for(let attributes2 of this._getMatchingPinAttributes())attributes2.requiresPower&&(schematicPortInsertProps.has_input_arrow=!0),attributes2.providesPower&&(schematicPortInsertProps.has_output_arrow=!0);let schematic_port3=db3.schematic_port.insert(schematicPortInsertProps);if(this.schematic_port_id=schematic_port3.schematic_port_id,props.schStemLength!==void 0&&props.schStemLength!==0){let{schStemLength,direction:direction2}=props,x22=portCenter.x,y22=portCenter.y;direction2==="right"?x22-=schStemLength:direction2==="left"?x22+=schStemLength:direction2==="up"?y22-=schStemLength:direction2==="down"&&(y22+=schStemLength);let stemLine=db3.schematic_line.insert({schematic_component_id:parentNormalComponent?.schematic_component_id,x1:portCenter.x,y1:portCenter.y,x2:x22,y2:y22,stroke_width:.02,color:SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_dashed:!1,schematic_sheet_id:this._resolveSchematicSheetId()});this.schematic_stem_line_id=stemLine.schematic_line_id}}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_port_id)return;let transform7=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform7)return;let{db:db3}=this.root,schPort=db3.schematic_port.get(this.schematic_port_id);if(schPort){let newCenter=applyToPoint2(transform7,schPort.center);if(db3.schematic_port.update(this.schematic_port_id,{center:newCenter}),this.schematic_stem_line_id){let line2=db3.schematic_line.get(this.schematic_stem_line_id);if(line2){let p12=applyToPoint2(transform7,{x:line2.x1,y:line2.y1}),p22=applyToPoint2(transform7,{x:line2.x2,y:line2.y2});db3.schematic_line.update(this.schematic_stem_line_id,{x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y});let scaledStemLength=Math.sqrt((p12.x-p22.x)**2+(p12.y-p22.y)**2);db3.schematic_port.update(this.schematic_port_id,{distance_from_component_edge:scaledStemLength})}}}}_getSubcircuitConnectivityKey(){return this.root?.db.source_port.get(this.source_port_id)?.subcircuit_connectivity_map_key}_setPositionFromLayout(newCenter){let{db:db3}=this.root;this.pcb_port_id&&db3.pcb_port.update(this.pcb_port_id,{x:newCenter.x,y:newCenter.y})}_hasMatchedPcbPrimitive(){return this.matchedComponents.some(c6=>c6.isPcbPrimitive)}_getNetLabelText(){return`${this.parent?.props.name}_${this.props.name}`}},SymbolComponent=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPrimitiveContainer",!0);__publicField(this,"schematic_symbol_id");__publicField(this,"userCoordinateToResizedSymbolTransformMat");__publicField(this,"schematicSymbolBoundsInUserCoordinates")}get config(){return{componentName:"Symbol",zodProps:symbolProps}}hasExplicitSize(){let{_parsedProps:props}=this;return props.width!==void 0||props.height!==void 0}doInitialSymbolContainerRender(){if(this.root?.schematicDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,kicadSymbolMetadata4=this.getParentNormalComponent()?._parsedProps?.kicadSymbolMetadata,schematic_symbol3=db3.schematic_symbol.insert({name:props.name,metadata:kicadSymbolMetadata4?{kicad_symbol:kicadSymbolMetadata4}:void 0});this.schematic_symbol_id=schematic_symbol3.schematic_symbol_id}getSchematicSymbolBounds(){return this.schematicSymbolBoundsInUserCoordinates?this.schematicSymbolBoundsInUserCoordinates:(this._computeSchematicSymbolBounds(),this.schematicSymbolBoundsInUserCoordinates??null)}getUserCoordinateToResizedSymbolTransform(){return this.hasExplicitSize()?this.userCoordinateToResizedSymbolTransformMat?this.userCoordinateToResizedSymbolTransformMat:(this._computeUserCoordinateToResizedSymbolTransform(),this.userCoordinateToResizedSymbolTransformMat??null):null}_computeSchematicSymbolBounds(){if(this.root?.schematicDisabled)return;let{db:db3}=this.root,schematicElements=[];for(let child of this.children){if(child.componentName==="Port"){let portId=child.schematic_port_id;if(portId){let port=db3.schematic_port.get(portId);port&&schematicElements.push(port)}continue}if(child.isSchematicPrimitive){if(child.componentName==="SchematicLine"){let line2=db3.schematic_line.get(child.schematic_line_id);line2&&schematicElements.push(line2)}else if(child.componentName==="SchematicRect"){let rect=db3.schematic_rect.get(child.schematic_rect_id);rect&&schematicElements.push(rect)}else if(child.componentName==="SchematicCircle"){let circle2=db3.schematic_circle.get(child.schematic_circle_id);circle2&&schematicElements.push(circle2)}else if(child.componentName==="SchematicArc"){let arc2=db3.schematic_arc.get(child.schematic_arc_id);arc2&&schematicElements.push(arc2)}else if(child.componentName==="SchematicText"){let text=db3.schematic_text.get(child.schematic_text_id);text&&schematicElements.push(text)}else if(child.componentName==="SchematicPath"){let pathIds=child.schematic_path_ids;if(pathIds)for(let pathId of pathIds){let path=db3.schematic_path.get(pathId);path&&schematicElements.push(path)}}}}if(schematicElements.length===0)return;let bounds=getBoundsForSchematic(schematicElements);this.schematicSymbolBoundsInUserCoordinates=bounds}_computeUserCoordinateToResizedSymbolTransform(){let bounds=this.getSchematicSymbolBounds();if(!bounds)return;let{_parsedProps:props}=this,targetWidth=props.width,targetHeight=props.height;if(targetWidth===void 0&&targetHeight===void 0)return;let currentWidth=bounds.maxX-bounds.minX,currentHeight=bounds.maxY-bounds.minY;if(currentWidth===0&&currentHeight===0)return;let currentCenterX=(bounds.minX+bounds.maxX)/2,currentCenterY=(bounds.minY+bounds.maxY)/2,scaleX=targetWidth!==void 0&&currentWidth>0?targetWidth/currentWidth:1,scaleY=targetHeight!==void 0&&currentHeight>0?targetHeight/currentHeight:1,globalPos=this._getGlobalSchematicPositionBeforeLayout();this.userCoordinateToResizedSymbolTransformMat=compose2(translate2(globalPos.x,globalPos.y),scale2(scaleX,scaleY),translate2(-currentCenterX,-currentCenterY))}},createPinrowSilkscreenText=({elm,pinLabels,layer,readableRotation,anchorAlignment})=>{let pinNum=elm.text.replace(/[{}]/g,"").toLowerCase(),label=pinNum;if(Array.isArray(pinLabels)){let index=parseInt(pinNum.replace(/[^\d]/g,""),10)-1;label=String(pinLabels[index]??pinNum)}else typeof pinLabels=="object"&&(label=String(pinLabels[pinNum]??pinNum));let silkscreenText=new SilkscreenText({anchorAlignment:anchorAlignment||"center",text:label??pinNum,layer:layer||"top",pcbX:isNaN(elm.anchor_position.x)?0:elm.anchor_position.x,pcbY:elm.anchor_position.y,pcbRotation:readableRotation??0});return silkscreenText._footprinterFontSize=elm.font_size+.2,silkscreenText},calculateCcwRotation=(componentRotationStr,elementCcwRotation)=>{let componentAngle=parseInt(componentRotationStr||"0",10),totalRotation;return elementCcwRotation!=null?totalRotation=elementCcwRotation-componentAngle:totalRotation=componentAngle,(totalRotation%360+360)%360},optional=value=>value??void 0,getFacingDirectionFromSide=side=>{switch(side){case"left":case"right":return side;case"top":return"up";case"bottom":return"down"}return null},schematicPrimitiveTypesWithStrokeWidth=["schematic_line","schematic_rect","schematic_circle","schematic_arc","schematic_path"],isSchematicPrimitiveWithStrokeWidth=elm=>schematicPrimitiveTypesWithStrokeWidth.includes(elm.type),getSchematicSymbolId=elm=>{if("schematic_symbol_id"in elm)return typeof elm.schematic_symbol_id=="string"?elm.schematic_symbol_id:void 0},createComponentsFromCircuitJson=({componentName,componentRotation,footprinterString,pinLabels,pcbPinLabels},circuitJson)=>{let components=[],schematicSymbolsByImportedId=new Map,schematicComponentsByImportedId=new Map,sourcePortsByImportedId=new Map,schematicStrokeWidthBySymbolId=new Map;for(let elm of circuitJson)elm.type==="source_port"&&sourcePortsByImportedId.set(elm.source_port_id,elm);for(let elm of circuitJson){if(elm.type!=="schematic_symbol")continue;let schematicSymbol=new SymbolComponent({name:elm.name});schematicSymbolsByImportedId.set(elm.schematic_symbol_id,schematicSymbol),components.push(schematicSymbol)}for(let elm of circuitJson){if(!isSchematicPrimitiveWithStrokeWidth(elm))continue;let schematicSymbolId=getSchematicSymbolId(elm),strokeWidth=elm.stroke_width;!schematicSymbolId||typeof strokeWidth!="number"||!Number.isFinite(strokeWidth)||schematicStrokeWidthBySymbolId.has(schematicSymbolId)||schematicStrokeWidthBySymbolId.set(schematicSymbolId,strokeWidth)}for(let elm of circuitJson)elm.type==="schematic_component"&&schematicComponentsByImportedId.set(elm.schematic_component_id,elm);let addSchematicPrimitive=(elm,primitive)=>{let schematicSymbolId=getSchematicSymbolId(elm),parentSymbol=schematicSymbolId?schematicSymbolsByImportedId.get(schematicSymbolId):void 0;parentSymbol?parentSymbol.add(primitive):components.push(primitive)};for(let elm of circuitJson)if(elm.type==="pcb_smtpad"&&elm.shape==="rect")components.push(new SmtPad({pcbX:elm.x,pcbY:elm.y,layer:elm.layer,shape:"rect",height:elm.height,width:elm.width,portHints:elm.port_hints,rectBorderRadius:elm.rect_border_radius}));else if(elm.type==="pcb_smtpad"&&elm.shape==="circle")components.push(new SmtPad({pcbX:elm.x,pcbY:elm.y,layer:elm.layer,shape:"circle",radius:elm.radius,portHints:elm.port_hints}));else if(elm.type==="pcb_smtpad"&&elm.shape==="pill")components.push(new SmtPad({shape:"pill",height:elm.height,width:elm.width,radius:elm.radius,portHints:elm.port_hints,pcbX:elm.x,pcbY:elm.y,layer:elm.layer}));else if(elm.type==="pcb_smtpad"&&elm.shape==="rotated_rect")components.push(new SmtPad({pcbX:elm.x,pcbY:elm.y,layer:elm.layer,shape:"rotated_rect",height:elm.height,width:elm.width,ccwRotation:elm.ccw_rotation,cornerRadius:elm.corner_radius,portHints:elm.port_hints}));else if(elm.type==="pcb_smtpad"&&elm.shape==="polygon")components.push(new SmtPad({shape:"polygon",points:elm.points,portHints:elm.port_hints,layer:elm.layer}));else if(elm.type==="pcb_silkscreen_path")components.push(new SilkscreenPath({layer:elm.layer,route:elm.route,strokeWidth:elm.stroke_width}));else if(elm.type==="pcb_copper_text")components.push(new CopperText({text:elm.text,pcbX:elm.anchor_position.x,pcbY:elm.anchor_position.y,pcbRotation:elm.ccw_rotation,anchorAlignment:elm.anchor_alignment,fontSize:elm.font_size,layer:elm.layer,mirrored:elm.is_mirrored,knockout:elm.is_knockout}));else if(elm.type==="pcb_plated_hole")elm.shape==="circle"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"circle",holeDiameter:elm.hole_diameter,outerDiameter:elm.outer_diameter,portHints:elm.port_hints})):elm.shape==="circular_hole_with_rect_pad"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"circular_hole_with_rect_pad",holeDiameter:elm.hole_diameter,rectPadHeight:elm.rect_pad_height,rectPadWidth:elm.rect_pad_width,portHints:elm.port_hints,rectBorderRadius:elm.rect_border_radius,holeOffsetX:elm.hole_offset_x,holeOffsetY:elm.hole_offset_y})):elm.shape==="pill"||elm.shape==="oval"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:elm.shape,holeWidth:elm.hole_width,holeHeight:elm.hole_height,outerWidth:elm.outer_width,outerHeight:elm.outer_height,portHints:elm.port_hints})):elm.shape==="pill_hole_with_rect_pad"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"pill_hole_with_rect_pad",holeShape:"pill",padShape:"rect",holeWidth:elm.hole_width,holeHeight:elm.hole_height,rectPadWidth:elm.rect_pad_width,rectPadHeight:elm.rect_pad_height,rectBorderRadius:elm.rect_border_radius,portHints:elm.port_hints,holeOffsetX:elm.hole_offset_x,holeOffsetY:elm.hole_offset_y})):elm.shape==="rotated_pill_hole_with_rect_pad"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"pill_hole_with_rect_pad",holeShape:"pill",padShape:"rect",holeWidth:elm.hole_width,holeHeight:elm.hole_height,rectPadWidth:elm.rect_pad_width,rectPadHeight:elm.rect_pad_height,rectBorderRadius:elm.rect_border_radius,portHints:elm.port_hints,holeOffsetX:elm.hole_offset_x,holeOffsetY:elm.hole_offset_y,pcbRotation:elm.hole_ccw_rotation})):elm.shape==="hole_with_polygon_pad"&&components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"hole_with_polygon_pad",holeShape:elm.hole_shape||"circle",holeDiameter:elm.hole_diameter,holeWidth:elm.hole_width,holeHeight:elm.hole_height,padOutline:elm.pad_outline||[],holeOffsetX:elm.hole_offset_x,holeOffsetY:elm.hole_offset_y,portHints:elm.port_hints}));else if(elm.type==="pcb_keepout"&&elm.shape==="circle")components.push(new Keepout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"circle",radius:elm.radius}));else if(elm.type==="pcb_keepout"&&elm.shape==="rect")components.push(new Keepout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"rect",width:elm.width,height:elm.height}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="circle")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,diameter:elm.hole_diameter}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="rect")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,shape:"rect",width:elm.hole_width,height:elm.hole_height}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="pill")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,shape:"pill",width:elm.hole_width,height:elm.hole_height}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="oval")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,shape:"oval",width:elm.hole_width,height:elm.hole_height}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="rotated_pill")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,shape:"pill",width:elm.hole_width,height:elm.hole_height,pcbRotation:elm.ccw_rotation}));else if(elm.type==="pcb_cutout")elm.shape==="rect"?components.push(new Cutout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"rect",width:elm.width,height:elm.height})):elm.shape==="circle"?components.push(new Cutout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"circle",radius:elm.radius})):elm.shape==="polygon"&&components.push(new Cutout({shape:"polygon",points:elm.points}));else if(elm.type==="pcb_silkscreen_text"){let ccwRotation=calculateCcwRotation(componentRotation,elm.ccw_rotation);if(footprinterString?.includes("pinrow")&&elm.text.includes("PIN"))components.push(createPinrowSilkscreenText({elm,pinLabels:pcbPinLabels??pinLabels??{},layer:elm.layer,readableRotation:ccwRotation,anchorAlignment:elm.anchor_alignment}));else{let silkscreenText=new SilkscreenText({anchorAlignment:elm.anchor_alignment||"center",text:componentName||elm.text,pcbX:Number.isNaN(elm.anchor_position.x)?0:elm.anchor_position.x,pcbY:elm.anchor_position.y,pcbRotation:ccwRotation??0});silkscreenText._footprinterFontSize=elm.font_size+.2,components.push(silkscreenText)}}else if(elm.type==="pcb_trace")components.push(new PcbTrace({route:elm.route}));else if(elm.type==="pcb_via"){let layers=elm.layers??[],pcbVia=new PcbVia({pcbX:elm.x,pcbY:elm.y,holeDiameter:elm.hole_diameter,outerDiameter:elm.outer_diameter,fromLayer:elm.from_layer??layers[0],toLayer:elm.to_layer??layers[layers.length-1],layers,netIsAssignable:elm.net_is_assignable,isTented:elm.is_tented});pcbVia._importedPcbTraceId=elm.pcb_trace_id,components.push(pcbVia)}else if(elm.type==="pcb_silkscreen_rect")components.push(new SilkscreenRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,layer:elm.layer,strokeWidth:elm.stroke_width,filled:elm.is_filled,cornerRadius:elm.corner_radius}));else if(elm.type==="pcb_silkscreen_circle")components.push(new SilkscreenCircle({pcbX:elm.center.x,pcbY:elm.center.y,radius:elm.radius,layer:elm.layer,strokeWidth:elm.stroke_width}));else if(elm.type==="pcb_silkscreen_line")components.push(new SilkscreenLine({x1:elm.x1,y1:elm.y1,x2:elm.x2,y2:elm.y2,layer:elm.layer,strokeWidth:elm.stroke_width}));else if(elm.type==="pcb_fabrication_note_text")components.push(new FabricationNoteText({pcbX:elm.anchor_position.x,pcbY:elm.anchor_position.y,text:elm.text,fontSize:elm.font_size,anchorAlignment:elm.anchor_alignment,color:elm.color,font:elm.font}));else if(elm.type==="pcb_fabrication_note_path")components.push(new FabricationNotePath({route:elm.route,strokeWidth:elm.stroke_width,color:elm.color,layer:elm.layer}));else if(elm.type==="pcb_fabrication_note_rect")components.push(new FabricationNoteRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,strokeWidth:elm.stroke_width,isFilled:elm.is_filled,color:elm.color,layer:elm.layer,cornerRadius:elm.corner_radius,hasStroke:elm.has_stroke,isStrokeDashed:elm.is_stroke_dashed}));else if(elm.type==="pcb_note_text")components.push(new PcbNoteText({pcbX:elm.anchor_position.x,pcbY:elm.anchor_position.y,text:elm.text??"",fontSize:elm.font_size,anchorAlignment:elm.anchor_alignment,color:elm.color,font:elm.font}));else if(elm.type==="pcb_note_rect")components.push(new PcbNoteRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,strokeWidth:elm.stroke_width,isFilled:elm.is_filled,color:elm.color,cornerRadius:elm.corner_radius,hasStroke:elm.has_stroke,isStrokeDashed:elm.is_stroke_dashed}));else if(elm.type==="pcb_note_path")components.push(new PcbNotePath({route:elm.route,strokeWidth:elm.stroke_width,color:elm.color}));else if(elm.type==="pcb_note_line")components.push(new PcbNoteLine({x1:elm.x1,y1:elm.y1,x2:elm.x2,y2:elm.y2,strokeWidth:elm.stroke_width,color:elm.color,isDashed:elm.is_dashed}));else if(elm.type==="pcb_courtyard_rect")components.push(new CourtyardRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,pcbRotation:elm.ccw_rotation,layer:elm.layer}));else if(elm.type==="pcb_courtyard_circle")components.push(new CourtyardCircle({pcbX:elm.center.x,pcbY:elm.center.y,radius:elm.radius,layer:elm.layer}));else if(elm.type==="pcb_courtyard_outline")components.push(new CourtyardOutline({outline:elm.outline,layer:elm.layer}));else if(elm.type==="schematic_line")addSchematicPrimitive(elm,new SchematicLine({x1:elm.x1,y1:elm.y1,x2:elm.x2,y2:elm.y2,strokeWidth:optional(elm.stroke_width),color:elm.color,isDashed:elm.is_dashed}));else if(elm.type==="schematic_rect")addSchematicPrimitive(elm,new SchematicRect({schX:elm.center.x,schY:elm.center.y,width:elm.width,height:elm.height,rotation:elm.rotation,strokeWidth:optional(elm.stroke_width),color:elm.color,isFilled:elm.is_filled,fillColor:elm.fill_color,isDashed:elm.is_dashed}));else if(elm.type==="schematic_circle")addSchematicPrimitive(elm,new SchematicCircle({center:elm.center,radius:elm.radius,strokeWidth:optional(elm.stroke_width),color:elm.color,isFilled:elm.is_filled,fillColor:elm.fill_color,isDashed:elm.is_dashed}));else if(elm.type==="schematic_arc")addSchematicPrimitive(elm,new SchematicArc({center:elm.center,radius:elm.radius,startAngleDegrees:elm.start_angle_degrees,endAngleDegrees:elm.end_angle_degrees,direction:elm.direction,strokeWidth:optional(elm.stroke_width),color:elm.color,isDashed:elm.is_dashed}));else if(elm.type==="schematic_text")addSchematicPrimitive(elm,new SchematicText({schX:elm.position.x,schY:elm.position.y,text:elm.text,fontSize:elm.font_size,anchor:elm.anchor,color:elm.color,schRotation:elm.rotation}));else if(elm.type==="schematic_path")addSchematicPrimitive(elm,new SchematicPath({points:elm.points,strokeWidth:optional(elm.stroke_width),strokeColor:elm.stroke_color,dashLength:elm.dash_length,dashGap:elm.dash_gap,isFilled:elm.is_filled,fillColor:elm.fill_color}));else if(elm.type==="schematic_port"){let schematicComponentId=elm.schematic_component_id;if(typeof schematicComponentId!="string")continue;let schematicComponent=schematicComponentsByImportedId.get(schematicComponentId),schematicSymbolId=schematicComponent?.schematic_symbol_id,parentSymbol=typeof schematicSymbolId=="string"?schematicSymbolsByImportedId.get(schematicSymbolId):void 0;if(parentSymbol&&schematicComponent?.is_box_with_pins===!0&&elm.center&&elm.side_of_component){let distance18=elm.distance_from_component_edge,facingDirection=getFacingDirectionFromSide(elm.side_of_component);if(!facingDirection)continue;let directionVector=getUnitVectorFromDirection(facingDirection),stemDirection=elm.facing_direction===facingDirection?1:-1,portCenter={x:elm.center.x+directionVector.x*distance18*stemDirection,y:elm.center.y+directionVector.y*distance18*stemDirection},sourcePort=sourcePortsByImportedId.get(elm.source_port_id),aliases2=Array.from(new Set([elm.display_pin_label,sourcePort?.name,...sourcePort?.port_hints??[]].filter(alias=>typeof alias=="string"&&alias.length>0))),fallbackPortName=elm.pin_number?`pin${elm.pin_number}`:elm.schematic_port_id,portName=aliases2[0]??elm.source_port_id??fallbackPortName;parentSymbol.add(new Port({pinNumber:elm.pin_number,name:portName,aliases:aliases2,schX:elm.center.x,schY:elm.center.y,direction:facingDirection})),parentSymbol.add(new SchematicLine({x1:elm.center.x,y1:elm.center.y,x2:portCenter.x,y2:portCenter.y,strokeWidth:typeof schematicSymbolId=="string"?optional(schematicStrokeWidthBySymbolId.get(schematicSymbolId)):void 0,isDashed:!1}))}}return components};function filterPinLabels(pinLabels){if(!pinLabels)return{validPinLabels:pinLabels,invalidPinLabelsMessages:[]};let validPinLabels={},invalidPinLabelsMessages=[];for(let[pin,labelOrLabels]of Object.entries(pinLabels)){let labels=Array.isArray(labelOrLabels)?labelOrLabels.slice():[labelOrLabels],validLabels=[];for(let label of labels)isValidPinLabel(pin,label)?validLabels.push(label):invalidPinLabelsMessages.push(`Invalid pin label: ${pin} = '${label}' - excluding from component. Pin labels can only contain letters, numbers and underscores.`);validLabels.length>0&&(validPinLabels[pin]=Array.isArray(labelOrLabels)?validLabels:validLabels[0])}return{validPinLabels:Object.keys(validPinLabels).length>0?validPinLabels:void 0,invalidPinLabelsMessages}}function isValidPinLabel(pin,label){try{let testProps={name:"test",footprint:"test",pinLabels:{[pin]:label}};return chipProps.safeParse(testProps).success}catch{return!1}}var NON_PHYSICAL_PCB_PRIMITIVE_PREFIXES=["Silkscreen","PcbNote","Courtyard","FabricationNote"];function getBoundsOfPcbComponents(components){let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0,hasValidComponents=!1;for(let child of components)if(child.isPcbPrimitive&&!NON_PHYSICAL_PCB_PRIMITIVE_PREFIXES.some(prefix=>child.componentName.startsWith(prefix))){let{x:x4,y:y3}=child._getGlobalPcbPositionBeforeLayout(),{width:width2,height:height2}=child.getPcbSize();minX=Math.min(minX,x4-width2/2),minY=Math.min(minY,y3-height2/2),maxX=Math.max(maxX,x4+width2/2),maxY=Math.max(maxY,y3+height2/2),hasValidComponents=!0}else if(child.children.length>0){let childBounds=getBoundsOfPcbComponents(child.children);(childBounds.width>0||childBounds.height>0)&&(minX=Math.min(minX,childBounds.minX),minY=Math.min(minY,childBounds.minY),maxX=Math.max(maxX,childBounds.maxX),maxY=Math.max(maxY,childBounds.maxY),hasValidComponents=!0)}if(!hasValidComponents)return{minX:0,minY:0,maxX:0,maxY:0,width:0,height:0};let width=maxX-minX,height=maxY-minY;return width<0&&(width=0),height<0&&(height=0),{minX,minY,maxX,maxY,width,height}}var getPinNumberFromLabels=labels=>{let pinNumber=labels.find(p5=>/^(pin)?\d+$/.test(p5));return pinNumber?Number.parseInt(pinNumber.replace(/^pin/,"")):null};function getPortFromHints(hints,opts){let pinNumber=getPinNumberFromLabels(hints);if(!pinNumber)return null;let aliases2=[...hints.filter(p5=>p5.toString()!==pinNumber.toString()&&p5!==`pin${pinNumber}`&&p5.trim()!==""),...opts?.additionalAliases?.[`pin${pinNumber}`]??[]];return new Port({pinNumber,aliases:aliases2})}function getPinsFromSideDefinition(sideDefinition){return sideDefinition?Array.isArray(sideDefinition)?sideDefinition:sideDefinition.pins??[]:[]}var hasExplicitPinMapping=pa3=>{for(let side of["leftSide","rightSide","topSide","bottomSide"])if(side in pa3&&typeof pa3[side]=="number")throw new Error(`A number was specified for "${side}", you probably meant to use "size" not "side"`);return"leftSide"in pa3||"rightSide"in pa3||"topSide"in pa3||"bottomSide"in pa3},getPinsFromPortArrangement=pa3=>!pa3||!hasExplicitPinMapping(pa3)?[]:[...getPinsFromSideDefinition(pa3.leftSide),...getPinsFromSideDefinition(pa3.rightSide),...getPinsFromSideDefinition(pa3.topSide),...getPinsFromSideDefinition(pa3.bottomSide)],getSizeOfSidesFromPortArrangement=pa3=>{if(hasExplicitPinMapping(pa3))return{leftSize:getPinsFromSideDefinition(pa3.leftSide).length,rightSize:getPinsFromSideDefinition(pa3.rightSide).length,topSize:getPinsFromSideDefinition(pa3.topSide).length,bottomSize:getPinsFromSideDefinition(pa3.bottomSide).length};let{leftSize=0,rightSize=0,topSize=0,bottomSize=0}=pa3;return{leftSize,rightSize,topSize,bottomSize}},DEFAULT_SCHEMATIC_BOX_PADDING_MM=.4;function isExplicitPinMappingArrangement(arrangement){let a3=arrangement;return a3.leftSide!==void 0||a3.rightSide!==void 0||a3.topSide!==void 0||a3.bottomSide!==void 0}var getAllDimensionsForSchematicBox=params=>{let portDistanceFromEdge=params.portDistanceFromEdge??.4,sidePinCounts=params.schPortArrangement?getSizeOfSidesFromPortArrangement(params.schPortArrangement):null,sideLengths={left:0,right:0,top:0,bottom:0},pinCount=params.pinCount??null;if(pinCount===null)if(sidePinCounts)pinCount=sidePinCounts.leftSize+sidePinCounts.rightSize+sidePinCounts.topSize;else throw new Error("Could not determine pin count for the schematic box");if(pinCount&&!sidePinCounts){let rightSize=Math.floor(pinCount/2);sidePinCounts={leftSize:pinCount-rightSize,rightSize,topSize:0,bottomSize:0}}sidePinCounts||(sidePinCounts={leftSize:0,rightSize:0,topSize:0,bottomSize:0});let getPinNumberUsingSideIndex=({side,sideIndex,truePinIndex:truePinIndex2})=>{if(!params.schPortArrangement||!isExplicitPinMappingArrangement(params.schPortArrangement))return truePinIndex2+1;let normalCcwDirection={left:"top-to-bottom",bottom:"left-to-right",right:"bottom-to-top",top:"right-to-left"}[side],directionAlongSide=params.schPortArrangement?.[`${side}Side`]?.direction??normalCcwDirection,pinsDefinitionForSide=params.schPortArrangement?.[`${side}Side`]?.pins,sideIndexWithDirectionCorrection=sideIndex;return directionAlongSide!==normalCcwDirection&&(sideIndexWithDirectionCorrection=pinsDefinitionForSide.length-sideIndex-1),parsePinNumberFromLabelsOrThrow(pinsDefinitionForSide[sideIndexWithDirectionCorrection],params.pinLabels)},orderedTruePorts=[],currentDistanceFromEdge=0,truePinIndex=0;for(let sideIndex=0;sideIndex<sidePinCounts.leftSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"left",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.topMargin&&(currentDistanceFromEdge+=pinStyle.topMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"left",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.bottomMargin&&(currentDistanceFromEdge+=pinStyle.bottomMargin),sideIndex===sidePinCounts.leftSize-1?sideLengths.left=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}currentDistanceFromEdge=0;for(let sideIndex=0;sideIndex<sidePinCounts.bottomSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"bottom",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.leftMargin&&(currentDistanceFromEdge+=pinStyle.leftMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"bottom",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.rightMargin&&(currentDistanceFromEdge+=pinStyle.rightMargin),sideIndex===sidePinCounts.bottomSize-1?sideLengths.bottom=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}currentDistanceFromEdge=0;for(let sideIndex=0;sideIndex<sidePinCounts.rightSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"right",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.bottomMargin&&(currentDistanceFromEdge+=pinStyle.bottomMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"right",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.topMargin&&(currentDistanceFromEdge+=pinStyle.topMargin),sideIndex===sidePinCounts.rightSize-1?sideLengths.right=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}currentDistanceFromEdge=0;for(let sideIndex=0;sideIndex<sidePinCounts.topSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"top",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.rightMargin&&(currentDistanceFromEdge+=pinStyle.rightMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"top",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.leftMargin&&(currentDistanceFromEdge+=pinStyle.leftMargin),sideIndex===sidePinCounts.topSize-1?sideLengths.top=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}let resolvedSchWidth=params.schWidth;if(resolvedSchWidth===void 0){resolvedSchWidth=Math.max(sideLengths.top+DEFAULT_SCHEMATIC_BOX_PADDING_MM,sideLengths.bottom+DEFAULT_SCHEMATIC_BOX_PADDING_MM),params.pinLabels&&orderedTruePorts.filter(p5=>p5.side==="left"||p5.side==="right").some(p5=>params.pinLabels?.[`pin${p5.pinNumber}`]||params.pinLabels?.[p5.pinNumber])&&(resolvedSchWidth=Math.max(resolvedSchWidth,.5));let labelWidth=params.pinLabels?Math.max(...Object.values(params.pinLabels).map(label=>label.length*.1)):0,LABEL_PADDING=labelWidth>0?1.1:0;resolvedSchWidth=Math.max(resolvedSchWidth,labelWidth+LABEL_PADDING)}let schHeight=params.schHeight;if(schHeight||(schHeight=Math.max(sideLengths.left+DEFAULT_SCHEMATIC_BOX_PADDING_MM,sideLengths.right+DEFAULT_SCHEMATIC_BOX_PADDING_MM)),params.pinLabels){let getLabelLen=pinNumber=>{let label=params.pinLabels[`pin${pinNumber}`]??params.pinLabels[`${pinNumber}`];return label?label.length*.13:0},leftLabels=orderedTruePorts.filter(p5=>p5.side==="left").map(p5=>({y:sideLengths.left/2-p5.distanceFromOrthogonalEdge,len:getLabelLen(p5.pinNumber)})).filter(p5=>p5.len>0),rightLabels=orderedTruePorts.filter(p5=>p5.side==="right").map(p5=>({y:-sideLengths.right/2+p5.distanceFromOrthogonalEdge,len:getLabelLen(p5.pinNumber)})).filter(p5=>p5.len>0),topLabels=orderedTruePorts.filter(p5=>p5.side==="top").map(p5=>({x:sideLengths.top/2-p5.distanceFromOrthogonalEdge,len:getLabelLen(p5.pinNumber)})).filter(p5=>p5.len>0),bottomLabels=orderedTruePorts.filter(p5=>p5.side==="bottom").map(p5=>({x:-sideLengths.bottom/2+p5.distanceFromOrthogonalEdge,len:getLabelLen(p5.pinNumber)})).filter(p5=>p5.len>0),rectsOverlap22=(a3,b4)=>Math.min(a3.maxX,b4.maxX)>Math.max(a3.minX,b4.minX)&&Math.min(a3.maxY,b4.maxY)>Math.max(a3.minY,b4.minY),getLeftRect=(label,width)=>({minX:-width/2+.1,maxX:-width/2+.1+label.len,minY:label.y-.075,maxY:label.y+.075}),getRightRect=(label,width)=>({minX:width/2-.1-label.len,maxX:width/2-.1,minY:label.y-.075,maxY:label.y+.075}),getTopRect=(label,height)=>({minX:label.x-.075,maxX:label.x+.075,minY:height/2-.1-label.len,maxY:height/2-.1}),getBottomRect=(label,height)=>({minX:label.x-.075,maxX:label.x+.075,minY:-height/2+.1,maxY:-height/2+.1+label.len});if(!params.schHeight){let hasTopBottomLabelCollision=!1;for(let topLabel of topLabels)for(let bottomLabel of bottomLabels)rectsOverlap22(getTopRect(topLabel,schHeight),getBottomRect(bottomLabel,schHeight))&&(hasTopBottomLabelCollision=!0,schHeight=Math.max(schHeight,topLabel.len+bottomLabel.len+2*.1));if(hasTopBottomLabelCollision){for(let topLabel of topLabels){let topRect=getTopRect(topLabel,schHeight);for(let leftLabel of leftLabels){let leftRect=getLeftRect(leftLabel,resolvedSchWidth);rectsOverlap22(topRect,leftRect)&&(schHeight=Math.max(schHeight,2*(leftRect.maxY+.1+topLabel.len)))}for(let rightLabel of rightLabels){let rightRect=getRightRect(rightLabel,resolvedSchWidth);rectsOverlap22(topRect,rightRect)&&(schHeight=Math.max(schHeight,2*(rightRect.maxY+.1+topLabel.len)))}}for(let bottomLabel of bottomLabels){let bottomRect=getBottomRect(bottomLabel,schHeight);for(let leftLabel of leftLabels){let leftRect=getLeftRect(leftLabel,resolvedSchWidth);rectsOverlap22(bottomRect,leftRect)&&(schHeight=Math.max(schHeight,2*(.1+bottomLabel.len-leftRect.minY)))}for(let rightLabel of rightLabels){let rightRect=getRightRect(rightLabel,resolvedSchWidth);rectsOverlap22(bottomRect,rightRect)&&(schHeight=Math.max(schHeight,2*(.1+bottomLabel.len-rightRect.minY)))}}}}}let trueEdgePositions={left:{x:-resolvedSchWidth/2-portDistanceFromEdge,y:sideLengths.left/2},bottom:{x:-sideLengths.bottom/2,y:-schHeight/2-portDistanceFromEdge},right:{x:resolvedSchWidth/2+portDistanceFromEdge,y:-sideLengths.right/2},top:{x:sideLengths.top/2,y:schHeight/2+portDistanceFromEdge}},trueEdgeTraversalDirections={left:{x:0,y:-1},right:{x:0,y:1},top:{x:-1,y:0},bottom:{x:1,y:0}},truePortsWithPositions=orderedTruePorts.map(p5=>{let{distanceFromOrthogonalEdge,side}=p5,edgePos=trueEdgePositions[side],edgeDir=trueEdgeTraversalDirections[side];return{x:edgePos.x+distanceFromOrthogonalEdge*edgeDir.x,y:edgePos.y+distanceFromOrthogonalEdge*edgeDir.y,...p5}});return{getPortPositionByPinNumber(pinNumber){let port=truePortsWithPositions.find(p5=>p5.pinNumber.toString()===pinNumber.toString());return port||null},getSize(){return{width:resolvedSchWidth,height:schHeight}},getSizeIncludingPins(){return{width:resolvedSchWidth+(sidePinCounts.leftSize||sidePinCounts.rightSize?.4:0),height:schHeight+(sidePinCounts.topSize||sidePinCounts.bottomSize?.4:0)}},pinCount}},getNumericSchPinStyle=(pinStyles,pinLabels)=>{if(!pinStyles)return;let numericPinStyles={};for(let[pinNameOrLabel,pinStyle]of Object.entries(pinStyles)){let pinNumber=parsePinNumberFromLabelsOrThrow(pinNameOrLabel,pinLabels),leftMargin=pinStyle.marginLeft??pinStyle.leftMargin,rightMargin=pinStyle.marginRight??pinStyle.rightMargin,topMargin=pinStyle.marginTop??pinStyle.topMargin,bottomMargin=pinStyle.marginBottom??pinStyle.bottomMargin,nextStyle={...numericPinStyles[`pin${pinNumber}`]??{}};leftMargin!==void 0&&(nextStyle.leftMargin=distance.parse(leftMargin)),rightMargin!==void 0&&(nextStyle.rightMargin=distance.parse(rightMargin)),topMargin!==void 0&&(nextStyle.topMargin=distance.parse(topMargin)),bottomMargin!==void 0&&(nextStyle.bottomMargin=distance.parse(bottomMargin)),numericPinStyles[`pin${pinNumber}`]=nextStyle}return numericPinStyles},CadAssembly=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPrimitiveContainer",!0)}get config(){return{componentName:"CadAssembly",zodProps:cadassemblyProps}}},getFileExtension=filename=>{if(!filename)return null;let fragmentMatch=filename.match(/#ext=(\w+)$/);if(fragmentMatch)return fragmentMatch[1].toLowerCase();let sanitized=filename.split("?")[0].split("#")[0],lastSegment=sanitized.split("/").pop()??sanitized;return lastSegment.includes(".")?lastSegment.split(".").pop()?.toLowerCase()??null:null},joinUrlPath=(base,path)=>{let trimmedBase=base.replace(/\/+$/,""),trimmedPath=path.replace(/^\/+/,"");return`${trimmedBase}/${trimmedPath}`},constructAssetUrl=(targetUrl,baseUrl)=>{if(!baseUrl||!targetUrl.startsWith("/"))return targetUrl;try{let baseUrlObj=new URL(baseUrl);return baseUrlObj.pathname!=="/"&&targetUrl.startsWith(baseUrlObj.pathname)?new URL(targetUrl,baseUrlObj.origin).toString():joinUrlPath(baseUrl,targetUrl)}catch{return targetUrl}},rotation2=external_exports.union([external_exports.number(),external_exports.string()]),rotation3=external_exports.object({x:rotation2,y:rotation2,z:rotation2}),CadModel=class extends PrimitiveComponent2{get config(){return{componentName:"CadModel",zodProps:cadmodelProps}}doInitialCadModelRender(){let parent=this._findParentWithPcbComponent();if(!parent||!parent.pcb_component_id)return;let{db:db3}=this.root,{boardThickness=0}=parent._getBoard()??{},bounds=parent._getPcbCircuitJsonBounds(),pcb_component3=db3.pcb_component.get(parent.pcb_component_id),props=this._parsedProps;if(!props||typeof props.modelUrl!="string"&&typeof props.stepUrl!="string")return;let parentTransform=parent._computePcbGlobalTransformBeforeLayout(),accumulatedRotation=decomposeTSR2(parentTransform).rotation.angle*180/Math.PI,sourceRotationOffset=props.pcbRotationOffset??props.rotationOffset,rotationOffset=rotation3.parse({x:0,y:0,z:0});if(typeof sourceRotationOffset=="number")rotationOffset.z=Number(sourceRotationOffset);else if(typeof sourceRotationOffset=="object"){let parsed=rotation3.parse(sourceRotationOffset);rotationOffset.x=Number(parsed.x),rotationOffset.y=Number(parsed.y),rotationOffset.z=Number(parsed.z)}let{pcbX,pcbY}=this.getResolvedPcbPositionProp(),positionOffset=point32.parse({x:pcbX,y:pcbY,z:props.pcbZ??0,...typeof props.positionOffset=="object"?props.positionOffset:{}}),zOffsetFromSurface=props.zOffsetFromSurface!==void 0?distance.parse(props.zOffsetFromSurface):0,layer=parent.props.layer==="bottom"?"bottom":"top",ext=props.modelUrl?getFileExtension(props.modelUrl):void 0,modelUrlWithoutExtFragment=props.modelUrl?.replace(/#ext=\w+$/,""),urlProps={};if(ext==="stl"?urlProps.model_stl_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="obj"?urlProps.model_obj_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="gltf"?urlProps.model_gltf_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="glb"?urlProps.model_glb_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="step"||ext==="stp"?urlProps.model_step_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="wrl"||ext==="vrml"?urlProps.model_wrl_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):urlProps.model_stl_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment),props.stepUrl){let transformed=this._addCachebustToModelUrl(props.stepUrl);transformed&&(urlProps.model_step_url=transformed)}let cad=db3.cad_component.insert({position:{x:bounds.center.x+Number(positionOffset.x),y:bounds.center.y+Number(positionOffset.y),z:(layer==="bottom"?-boardThickness/2:boardThickness/2)+(layer==="bottom"?-zOffsetFromSurface:zOffsetFromSurface)+Number(positionOffset.z)},rotation:{x:Number(rotationOffset.x),y:(layer==="top"?0:180)+Number(rotationOffset.y),z:layer==="bottom"?-(accumulatedRotation+Number(rotationOffset.z))+180:accumulatedRotation+Number(rotationOffset.z)},pcb_component_id:parent.pcb_component_id,model_board_normal_direction:props.modelBoardNormalDirection,model_origin_alignment:"center_of_component_on_board_surface",anchor_alignment:"center_of_component_on_board_surface",model_origin_position:props.modelOriginPosition,source_component_id:parent.source_component_id,model_unit_to_mm_scale_factor:typeof props.modelUnitToMmScale=="number"?props.modelUnitToMmScale:void 0,show_as_translucent_model:props.showAsTranslucentModel??parent._parsedProps.showAsTranslucentModel,...urlProps});this.cad_component_id=cad.cad_component_id}_findParentWithPcbComponent(){let p5=this.parent;for(;p5&&!p5.pcb_component_id;)p5=p5.parent;return p5}_addCachebustToModelUrl(url2){if(!url2)return url2;let baseUrl=this.root?.platform?.projectBaseUrl,transformedUrl=constructAssetUrl(url2,baseUrl);if(!transformedUrl.includes("modelcdn.tscircuit.com"))return transformedUrl;let origin=this.root?.getClientOrigin()??"";return`${transformedUrl}${transformedUrl.includes("?")?"&":"?"}cachebust_origin=${encodeURIComponent(origin)}`}},debug22=(0,import_debug9.default)("tscircuit:core:footprint"),Footprint=class extends PrimitiveComponent2{get config(){return{componentName:"Footprint",zodProps:footprintProps}}doInitialPcbFootprintLayout(){if(this.root?.pcbDisabled)return;let constraints=this.children.filter(child=>child.componentName==="Constraint");if(constraints.length===0)return;let{isFlipped}=this._getPcbPrimitiveFlippedHelpers(),maybeFlipLeftRight=props=>isFlipped&&"left"in props&&"right"in props?{...props,left:props.right,right:props.left}:props,involvedComponents=constraints.flatMap(constraint=>constraint._getAllReferencedComponents().componentsWithSelectors).map(({component,selector,componentSelector,edge})=>({component,selector,componentSelector,edge,bounds:component._getPcbCircuitJsonBounds()}));if(involvedComponents.some(c6=>c6.edge))throw new Error("edge constraints not implemented yet for footprint layout, contributions welcome!");function getComponentDetails(selector){return involvedComponents.find(({selector:s6})=>s6===selector)}let solver=new Solver,kVars={};function getKVar(name){return name in kVars||(kVars[name]=new Variable(name),solver.addEditVariable(kVars[name],Strength.weak)),kVars[name]}for(let{selector,bounds:bounds2}of involvedComponents){let kvx=getKVar(`${selector}_x`),kvy=getKVar(`${selector}_y`);solver.suggestValue(kvx,bounds2.center.x),solver.suggestValue(kvy,bounds2.center.y)}for(let constraint of constraints){let props=constraint._parsedProps;if("xDist"in props){let{xDist,left,right,edgeToEdge,centerToCenter}=maybeFlipLeftRight(props),leftVar=getKVar(`${left}_x`),rightVar=getKVar(`${right}_x`),leftBounds=getComponentDetails(left)?.bounds,rightBounds=getComponentDetails(right)?.bounds;if(centerToCenter){let expr=new Expression(rightVar,[-1,leftVar]);solver.addConstraint(new Constraint(expr,Operator.Eq,props.xDist,Strength.required))}else if(edgeToEdge){let expr=new Expression(rightVar,-rightBounds.width/2,[-1,leftVar],-leftBounds.width/2);solver.addConstraint(new Constraint(expr,Operator.Eq,props.xDist,Strength.required))}}else if("yDist"in props){let{yDist,top,bottom,edgeToEdge,centerToCenter}=props,topVar=getKVar(`${top}_y`),bottomVar=getKVar(`${bottom}_y`),topBounds=getComponentDetails(top)?.bounds,bottomBounds=getComponentDetails(bottom)?.bounds;if(centerToCenter){let expr=new Expression(topVar,[-1,bottomVar]);solver.addConstraint(new Constraint(expr,Operator.Eq,props.yDist,Strength.required))}else if(edgeToEdge){let expr=new Expression(topVar,topBounds.height/2,[-1,bottomVar],-bottomBounds.height/2);solver.addConstraint(new Constraint(expr,Operator.Eq,props.yDist,Strength.required))}}else if("sameY"in props){let{for:selectors}=props;if(selectors.length<2)continue;let vars=selectors.map(selector=>getKVar(`${selector}_y`)),expr=new Expression(...vars.slice(1));solver.addConstraint(new Constraint(expr,Operator.Eq,vars[0],Strength.required))}else if("sameX"in props){let{for:selectors}=props;if(selectors.length<2)continue;let vars=selectors.map(selector=>getKVar(`${selector}_x`)),expr=new Expression(...vars.slice(1));solver.addConstraint(new Constraint(expr,Operator.Eq,vars[0],Strength.required))}}solver.updateVariables(),debug22.enabled&&(console.log("Solution to layout constraints:"),console.table(Object.entries(kVars).map(([key,kvar])=>({var:key,val:kvar.value()}))));let bounds={left:1/0,right:-1/0,top:-1/0,bottom:1/0};for(let{selector,bounds:{width,height}}of involvedComponents){let kvx=getKVar(`${selector}_x`),kvy=getKVar(`${selector}_y`),newLeft=kvx.value()-width/2,newRight=kvx.value()+width/2,newTop=kvy.value()+height/2,newBottom=kvy.value()-height/2;bounds.left=Math.min(bounds.left,newLeft),bounds.right=Math.max(bounds.right,newRight),bounds.top=Math.max(bounds.top,newTop),bounds.bottom=Math.min(bounds.bottom,newBottom)}let globalOffset={x:-(bounds.right+bounds.left)/2,y:-(bounds.top+bounds.bottom)/2},containerPos=this.getPrimitiveContainer()._getGlobalPcbPositionBeforeLayout();globalOffset.x+=containerPos.x,globalOffset.y+=containerPos.y;for(let{component,selector}of involvedComponents){let kvx=getKVar(`${selector}_x`),kvy=getKVar(`${selector}_y`);component._setPositionFromLayout({x:kvx.value()+globalOffset.x,y:kvy.value()+globalOffset.y})}}},NormalComponent__getMinimumFlexContainerSize=component=>{let{db:db3}=component.root;if(component.pcb_component_id){let pcbComponent=db3.pcb_component.get(component.pcb_component_id);return pcbComponent?{width:pcbComponent.width,height:pcbComponent.height}:null}if(component.pcb_group_id){let pcbGroup=db3.pcb_group.get(component.pcb_group_id);if(!pcbGroup)return null;if(pcbGroup.outline&&pcbGroup.outline.length>0){let bounds=getBoundsFromPoints(pcbGroup.outline);return bounds?{width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY}:null}return{width:pcbGroup.width??0,height:pcbGroup.height??0}}return null},NormalComponent__repositionOnPcb=(component,position4)=>{let{db:db3}=component.root,allCircuitJson=db3.toArray();if(component.pcb_component_id){repositionPcbComponentTo(allCircuitJson,component.pcb_component_id,position4);return}if(component.source_group_id){repositionPcbGroupTo(allCircuitJson,component.source_group_id,position4);return}throw new Error(`Cannot reposition component ${component.getString()}: no pcb_component_id or source_group_id`)};function NormalComponent_doInitialPcbComponentAnchorAlignment(component){if(component.root?.pcbDisabled||!component.pcb_component_id)return;let{pcbX,pcbY}=component._parsedProps,pcbPositionAnchor=component.props?.pcbPositionAnchor;if(!pcbPositionAnchor||pcbX===void 0&&pcbY===void 0)return;let bounds=getBoundsOfPcbComponents(component.children);if(bounds.width===0||bounds.height===0)return;let currentCenter={...{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2}},anchorPos=null;if(new Set(["center","top_left","top_center","top_right","center_left","center_right","bottom_left","bottom_center","bottom_right"]).has(pcbPositionAnchor)){let b4={left:bounds.minX,right:bounds.maxX,top:bounds.minY,bottom:bounds.maxY};switch(pcbPositionAnchor){case"center":anchorPos=currentCenter;break;case"top_left":anchorPos={x:b4.left,y:b4.top};break;case"top_center":anchorPos={x:currentCenter.x,y:b4.top};break;case"top_right":anchorPos={x:b4.right,y:b4.top};break;case"center_left":anchorPos={x:b4.left,y:currentCenter.y};break;case"center_right":anchorPos={x:b4.right,y:currentCenter.y};break;case"bottom_left":anchorPos={x:b4.left,y:b4.bottom};break;case"bottom_center":anchorPos={x:currentCenter.x,y:b4.bottom};break;case"bottom_right":anchorPos={x:b4.right,y:b4.bottom};break}}else try{let port=component.portMap[pcbPositionAnchor];port&&(anchorPos=port._getGlobalPcbPositionBeforeLayout())}catch{}if(!anchorPos)return;let newCenter={...currentCenter};pcbX!==void 0&&(newCenter.x+=pcbX-anchorPos.x),pcbY!==void 0&&(newCenter.y+=pcbY-anchorPos.y),(Math.abs(newCenter.x-currentCenter.x)>1e-6||Math.abs(newCenter.y-currentCenter.y)>1e-6)&&component._repositionOnPcb(newCenter)}var isHttpUrl=s6=>s6.startsWith("http://")||s6.startsWith("https://"),parseLibraryFootprintRef=s6=>{if(isHttpUrl(s6))return null;let idx=s6.indexOf(":");if(idx<=0)return null;let footprintLib=s6.slice(0,idx),footprintName=s6.slice(idx+1);return!footprintLib||!footprintName?null:{footprintLib,footprintName}},isStaticAssetPath=s6=>s6.startsWith("/")||s6.startsWith("./"),resolveStaticFileImportDebug=(0,import_debug10.default)("tscircuit:core:resolveStaticFileImport");async function resolveStaticFileImport(path,platform){if(!path)return path;let normalizedPath=path.startsWith("./")?path.slice(1):path,resolver=platform?.resolveProjectStaticFileImportUrl;if(resolver&&(path.startsWith("/")||path.startsWith("./")))try{let resolved=await resolver(normalizedPath);if(resolved)return resolved}catch(error2){resolveStaticFileImportDebug("failed to resolve static file via platform resolver",error2)}return constructAssetUrl(normalizedPath,platform?.projectBaseUrl)}var extractCadModelFromCircuitJson=circuitJson=>{let cadComponent=circuitJson.find(elm=>elm.type==="cad_component");if(!cadComponent)return;let cadModelCandidate={stlUrl:cadComponent.model_stl_url,objUrl:cadComponent.model_obj_url,gltfUrl:cadComponent.model_gltf_url,glbUrl:cadComponent.model_glb_url,stepUrl:cadComponent.model_step_url,wrlUrl:cadComponent.model_wrl_url,modelOriginPosition:cadComponent.model_origin_position??void 0,modelUnitToMmScale:cadComponent.model_unit_to_mm_scale_factor,modelBoardNormalDirection:cadComponent.model_board_normal_direction,size:cadComponent.size??void 0,rotationOffset:cadComponent.rotation??void 0,positionOffset:cadComponent.position??void 0,showAsTranslucentModel:cadComponent.show_as_translucent_model};if(!cadModelCandidate.stlUrl&&!cadModelCandidate.objUrl&&!cadModelCandidate.gltfUrl&&!cadModelCandidate.glbUrl&&!cadModelCandidate.stepUrl&&!cadModelCandidate.wrlUrl&&!cadComponent.model_jscad)return;cadComponent.model_jscad&&typeof cadComponent.model_jscad=="object"&&(cadModelCandidate.jscad=cadComponent.model_jscad);let parsedCadModel=cadModelProp.safeParse(cadModelCandidate);return parsedCadModel.success?parsedCadModel.data:void 0},shouldAddOutsideFootprintWrapper=component=>component.componentName==="Symbol"||component.isSchematicPrimitive;function NormalComponent_doInitialPcbFootprintStringRender(component,queueAsyncEffect){let footprint=component.resolveFootprint();if(!footprint)return;let{pcbRotation,pinLabels,pcbPinLabels}=component.props,fileExtension=getFileExtension(String(footprint)),footprintParser=fileExtension?component.root?.platform?.footprintFileParserMap?.[fileExtension]:null;if(typeof footprint=="string"&&(isHttpUrl(footprint)||isStaticAssetPath(footprint))&&footprintParser){if(component._hasStartedFootprintUrlLoad)return;component._hasStartedFootprintUrlLoad=!0,queueAsyncEffect("load-footprint-from-platform-file-parser",async()=>{let footprintUrl=isHttpUrl(footprint)?footprint:await resolveStaticFileImport(footprint,component.root?.platform);try{let result=await footprintParser.loadFromUrl(footprintUrl),fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:footprintUrl,pinLabels,pcbPinLabels},result.footprintCircuitJson);component.addAll(fpComponents),component._markDirty("InitializePortsFromChildren")}catch(err2){let db3=component.root?.db;if(db3&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load footprint "${footprintUrl}": `+(err2 instanceof Error?err2.message:String(err2)),errorObj=external_footprint_load_error.parse({type:"external_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0,footprinter_string:footprintUrl});db3.external_footprint_load_error.insert(errorObj)}throw err2}});return}if(typeof footprint=="string"&&isHttpUrl(footprint)){if(component._hasStartedFootprintUrlLoad)return;component._hasStartedFootprintUrlLoad=!0;let url2=footprint;queueAsyncEffect("load-footprint-url",async()=>{try{let res2=await fetch(url2);if(!res2.ok)throw new Error(`Failed to fetch footprint: ${res2.status}`);let soup=await res2.json(),fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:url2,pinLabels,pcbPinLabels},soup);component.addAll(fpComponents),component._markDirty("InitializePortsFromChildren")}catch(err2){let db3=component.root?.db;if(db3&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load external footprint "${url2}": `+(err2 instanceof Error?err2.message:String(err2)),errorObj=external_footprint_load_error.parse({type:"external_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0,footprinter_string:url2});db3.external_footprint_load_error.insert(errorObj)}throw err2}});return}if(typeof footprint=="string"){let libRef=parseLibraryFootprintRef(footprint);if(!libRef||component._hasStartedFootprintUrlLoad)return;component._hasStartedFootprintUrlLoad=!0;let libMap=component.root?.platform?.footprintLibraryMap?.[libRef.footprintLib],resolverFn;if(typeof libMap=="function"&&(resolverFn=libMap),!resolverFn)return;queueAsyncEffect("load-lib-footprint",async()=>{try{let result=await resolverFn(libRef.footprintName),circuitJson=null;if(Array.isArray(result)?circuitJson=result:Array.isArray(result.footprintCircuitJson)&&(circuitJson=result.footprintCircuitJson),!circuitJson)return;let fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:footprint,pinLabels,pcbPinLabels},circuitJson),fpWrapper=new Footprint({src:footprint}),componentsOutsideFootprint=[];for(let c6 of fpComponents)shouldAddOutsideFootprintWrapper(c6)?componentsOutsideFootprint.push(c6):fpWrapper.add(c6);component.add(fpWrapper),component.addAll(componentsOutsideFootprint),component._asyncFootprintCadModel=!Array.isArray(result)&&result.cadModel||extractCadModelFromCircuitJson(circuitJson);for(let child of component.children)child.componentName==="Port"&&child._markDirty?.("PcbPortRender");component._markDirty("InitializePortsFromChildren")}catch(err2){let db3=component.root?.db;if(db3&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load external footprint "${footprint}": `+(err2 instanceof Error?err2.message:String(err2)),errorObj=external_footprint_load_error.parse({type:"external_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0,footprinter_string:footprint});db3.external_footprint_load_error.insert(errorObj)}throw err2}});return}if(!(0,import_react3.isValidElement)(footprint)&&footprint.componentName==="Footprint"&&component.add(footprint),Array.isArray(footprint)&&!(0,import_react3.isValidElement)(footprint)&&footprint.length>0){try{let fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:"",pinLabels,pcbPinLabels},footprint);component.addAll(fpComponents)}catch(err2){let db3=component.root?.db;if(db3&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load json footprint: `+(err2 instanceof Error?err2.message:String(err2)),errorObj=circuit_json_footprint_load_error.parse({type:"circuit_json_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0});db3.circuit_json_footprint_load_error.insert(errorObj)}throw err2}return}}function getPcbTextBounds(text){let fontSize=text.font_size,textWidth=text.text.length*fontSize*.6,textHeight=fontSize,anchorAlignment=text.anchor_alignment||"center",centerX=text.anchor_position.x,centerY=text.anchor_position.y;switch(anchorAlignment){case"top_left":centerX=text.anchor_position.x+textWidth/2,centerY=text.anchor_position.y+textHeight/2;break;case"top_center":centerX=text.anchor_position.x,centerY=text.anchor_position.y+textHeight/2;break;case"top_right":centerX=text.anchor_position.x-textWidth/2,centerY=text.anchor_position.y+textHeight/2;break;case"center_left":centerX=text.anchor_position.x+textWidth/2,centerY=text.anchor_position.y;break;case"center":centerX=text.anchor_position.x,centerY=text.anchor_position.y;break;case"center_right":centerX=text.anchor_position.x-textWidth/2,centerY=text.anchor_position.y;break;case"bottom_left":centerX=text.anchor_position.x+textWidth/2,centerY=text.anchor_position.y-textHeight/2;break;case"bottom_center":centerX=text.anchor_position.x,centerY=text.anchor_position.y-textHeight/2;break;case"bottom_right":centerX=text.anchor_position.x-textWidth/2,centerY=text.anchor_position.y-textHeight/2;break;default:centerX=text.anchor_position.x,centerY=text.anchor_position.y;break}return{x:centerX-textWidth/2,y:centerY-textHeight/2,width:textWidth,height:textHeight}}function NormalComponent_doInitialSilkscreenOverlapAdjustment(component){if(!component._adjustSilkscreenTextAutomatically||component.root?.pcbDisabled||!component.pcb_component_id)return;let{db:db3}=component.root,componentCenter=component._getPcbCircuitJsonBounds().center,silkscreenTexts=db3.pcb_silkscreen_text.list({pcb_component_id:component.pcb_component_id}).filter(text=>text.text===component.name);if(silkscreenTexts.length===0)return;let obstacleBounds=component.getSubcircuit().selectAll("[_isNormalComponent=true]").filter(comp=>comp!==component&&comp.pcb_component_id).map(comp=>{let bounds=comp._getPcbCircuitJsonBounds(),box2={center:bounds.center,width:bounds.width,height:bounds.height};return getBoundingBox(box2)});for(let silkscreenText of silkscreenTexts){let currentPosition=silkscreenText.anchor_position,textBounds=getPcbTextBounds(silkscreenText),textBox={center:{x:textBounds.x+textBounds.width/2,y:textBounds.y+textBounds.height/2},width:textBounds.width,height:textBounds.height},textBoundsBox=getBoundingBox(textBox);if(!obstacleBounds.some(obstacle=>doBoundsOverlap(textBoundsBox,obstacle)))continue;let flippedX=2*componentCenter.x-currentPosition.x,flippedY=2*componentCenter.y-currentPosition.y,flippedTextBox={center:{x:flippedX,y:flippedY},width:textBounds.width,height:textBounds.height},flippedTextBounds=getBoundingBox(flippedTextBox);obstacleBounds.some(obstacle=>doBoundsOverlap(flippedTextBounds,obstacle))||db3.pcb_silkscreen_text.update(silkscreenText.pcb_silkscreen_text_id,{anchor_position:{x:flippedX,y:flippedY}})}}var NormalComponent_doInitialSourceDesignRuleChecks=component=>{let{db:db3}=component.root;if(!component.source_component_id)return;let ports=component.selectAll("port"),traces=db3.source_trace.list(),connected=new Set;for(let trace of traces)for(let id3 of trace.connected_source_port_ids)connected.add(id3);let internalGroups=component._getInternallyConnectedPins();for(let group of internalGroups)if(group.some(p5=>p5.source_port_id&&connected.has(p5.source_port_id)))for(let p5 of group)p5.source_port_id&&connected.add(p5.source_port_id);for(let port of ports)!port.source_port_id||!shouldCheckPortForMissingTrace(component,port)||db3.source_port.get(port.source_port_id)?.do_not_connect||connected.has(port.source_port_id)||db3.source_pin_missing_trace_warning.insert({message:`Port ${port.getNameAndAliases()[0]} on ${component.props.name} is missing a trace`,source_component_id:component.source_component_id,source_port_id:port.source_port_id,subcircuit_id:component.getSubcircuit().subcircuit_id??void 0,warning_type:"source_pin_missing_trace_warning"})},shouldCheckPortForMissingTrace=(component,port)=>{if(component.config.componentName==="Interconnect")return!1;if(component.config.componentName==="Chip"){let pinAttributes=component.props.pinAttributes;if(!pinAttributes)return!1;for(let alias of port.getNameAndAliases()){let attrs=pinAttributes[alias];if(attrs?.requiresPower||attrs?.requiresGround||attrs?.requiresVoltage!==void 0)return!0}return!1}return!0},SUPPLIER_FOOTPRINT_IOU_WARNING_THRESHOLD=.8,supplierNames=supplierProps.shape.supplierPartNumbers.unwrap().keySchema.options,isCopperElement=elm=>elm.type==="pcb_smtpad"||elm.type==="pcb_plated_hole",isValidBounds=bounds=>Number.isFinite(bounds.minX)&&Number.isFinite(bounds.minY)&&Number.isFinite(bounds.maxX)&&Number.isFinite(bounds.maxY)&&bounds.maxX>bounds.minX&&bounds.maxY>bounds.minY,getCopperBounds=elements=>{let copperElements=elements.filter(isCopperElement);if(copperElements.length===0)return null;let bounds=getBoundsOfPcbElements(copperElements);return isValidBounds(bounds)?bounds:null},getBoundsSize=bounds=>({width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY}),getCenteredBoundsIou=(boundsA,boundsB,opts)=>{let sizeA=getBoundsSize(boundsA),sizeB=getBoundsSize(boundsB),bWidth=opts?.rotateB?sizeB.height:sizeB.width,bHeight=opts?.rotateB?sizeB.width:sizeB.height,intersectionWidth=Math.min(sizeA.width,bWidth),intersectionHeight=Math.min(sizeA.height,bHeight),intersectionArea=intersectionWidth*intersectionHeight,unionArea=sizeA.width*sizeA.height+bWidth*bHeight-intersectionArea;return unionArea<=0?0:intersectionArea/unionArea},getBestBoundsIou=(localBounds,supplierBounds)=>Math.max(getCenteredBoundsIou(localBounds,supplierBounds),getCenteredBoundsIou(localBounds,supplierBounds,{rotateB:!0})),getSupplierPartCandidates=supplierPartNumbers=>{if(!supplierPartNumbers)return[];let candidates=[];for(let supplierName of supplierNames){let partNumbers=supplierPartNumbers[supplierName];if(Array.isArray(partNumbers))for(let supplierPartNumber of partNumbers)supplierPartNumber&&candidates.push({supplierName,supplierPartNumber})}return candidates};function NormalComponent_doInitialSupplierFootprintMismatchWarning(component){if(component.root?.pcbDisabled||component.props.doNotPlace||component.props.footprint===void 0||component.getInheritedProperty("bomDisabled")||component.getInheritedProperty("partsEngineDisabled"))return;let partsEngine2=component.getInheritedProperty("partsEngine");if(!partsEngine2?.fetchPartCircuitJson)return;let{db:db3}=component.root,sourceComponent=db3.source_component.get(component.source_component_id);if(!sourceComponent?.supplier_part_numbers||!component.pcb_component_id||component._hasStartedSupplierFootprintMismatchWarningCheck)return;let supplierPartCandidates=getSupplierPartCandidates(sourceComponent.supplier_part_numbers);if(supplierPartCandidates.length===0)return;let localCopperElements=[...db3.pcb_smtpad.list({pcb_component_id:component.pcb_component_id}),...db3.pcb_plated_hole.list({pcb_component_id:component.pcb_component_id})],localBounds=getCopperBounds(localCopperElements);localBounds&&(component._hasStartedSupplierFootprintMismatchWarningCheck=!0,component._queueAsyncEffect("check-supplier-footprint-mismatch",async()=>{let{db:db22}=component.root,fetchPartCircuitJson=partsEngine2.fetchPartCircuitJson;for(let supplierPartCandidate of supplierPartCandidates){let{supplierName,supplierPartNumber}=supplierPartCandidate;try{let supplierCircuitJson=await Promise.resolve(fetchPartCircuitJson({supplierPartNumber}))??null;if(!supplierCircuitJson?.length)continue;let supplierBounds=getCopperBounds(supplierCircuitJson);if(!supplierBounds)continue;let footprintCopperIou=getBestBoundsIou(localBounds,supplierBounds);if(footprintCopperIou>=SUPPLIER_FOOTPRINT_IOU_WARNING_THRESHOLD)return;let footprintLabel=typeof component.props.footprint=="string"?`"${component.props.footprint}"`:"the provided footprint",roundedIou=Number(footprintCopperIou.toFixed(4)),warning=supplier_footprint_mismatch_warning.parse({type:"supplier_footprint_mismatch_warning",message:`${component.getString()} footprint ${footprintLabel} does not match supplier footprint ${supplierName}:${supplierPartNumber} (copper IoU ${roundedIou}).`,source_component_id:component.source_component_id,pcb_component_id:component.pcb_component_id,pcb_group_id:component.getGroup()?.pcb_group_id??void 0,subcircuit_id:component.getSubcircuit()?.subcircuit_id??void 0,supplier_name:supplierName,supplier_part_number:supplierPartNumber,footprint_copper_intersection_over_union:roundedIou});db22.supplier_footprint_mismatch_warning.insert(warning);return}catch(error2){let errorMessage=error2 instanceof Error?error2.message:String(error2),errorObj=unknown_error_finding_part.parse({type:"unknown_error_finding_part",message:`Failed to fetch supplier footprint for ${component.getString()} (${supplierName}:${supplierPartNumber}): ${errorMessage}`,source_component_id:component.source_component_id,subcircuit_id:component.getSubcircuit()?.subcircuit_id});db22.unknown_error_finding_part.insert(errorObj);return}}}))}function NormalComponent_doInitialSchematicComponentRender(component){if(component.root?.schematicDisabled||component.getCollapsedSchematicBoxAncestor())return;let{db:db3}=component.root;if(component._invalidPinLabelMessages?.length&&component.root?.db)for(let message of component._invalidPinLabelMessages){let property_name="pinLabels",match2=message.match(/^Invalid pin label:\s*([^=]+)=\s*'([^']+)'/);match2&&(property_name=`pinLabels['${match2[2]}']`),component.root.db.source_property_ignored_warning.insert({source_component_id:component.source_component_id,property_name,message,error_type:"source_property_ignored_warning"})}component._parsedProps.schPinSpacing!==void 0&&component.root?.db&&component.root.db.source_property_ignored_warning.insert({source_component_id:component.source_component_id,property_name:"schPinSpacing",error_type:"source_property_ignored_warning",message:"schPinSpacing is deprecated and will be ignored. Pin spacing is always 0.2."});let{schematicSymbolName}=component.config,{_parsedProps:props}=component,hasSymbolChild=component.children.some(c6=>c6.componentName==="Symbol");props.symbol&&(0,import_react4.isValidElement)(props.symbol)||hasSymbolChild?component._doInitialSchematicComponentRenderWithReactSymbol(props.symbol):schematicSymbolName?component._doInitialSchematicComponentRenderWithSymbol():component._getSchematicBoxDimensions()&&component._doInitialSchematicComponentRenderWithSchematicBoxDimensions();let manualPlacement=component.getSubcircuit()?._getSchematicManualPlacementForComponent(component);if(component.schematic_component_id&&(component.props.schX!==void 0||component.props.schY!==void 0)&&manualPlacement){if(!component.schematic_component_id)return;let warning=schematic_manual_edit_conflict_warning.parse({type:"schematic_manual_edit_conflict_warning",schematic_manual_edit_conflict_warning_id:`schematic_manual_edit_conflict_${component.source_component_id}`,message:`${component.getString()} has both manual placement and prop coordinates. schX and schY will be used. Remove schX/schY or clear the manual placement.`,schematic_component_id:component.schematic_component_id,source_component_id:component.source_component_id,subcircuit_id:component.getSubcircuit()?.subcircuit_id});db3.schematic_manual_edit_conflict_warning.insert(warning)}let schSheetName=component._parsedProps?.schSheetName??component.props.schSheetName;schSheetName&&component.source_component_id&&!component._resolveSchematicSheetId()&&db3.source_property_ignored_warning.insert({source_component_id:component.source_component_id,property_name:"schSheetName",error_type:"source_property_ignored_warning",subcircuit_id:component.getSubcircuit()?.subcircuit_id??void 0,message:`${component.getString()} references schSheetName "${schSheetName}", which does not match any schematic sheet and will be ignored.`})}var canMergePortDefinitions=(a3,b4)=>{let aPinNumber=a3._parsedProps.pinNumber,bPinNumber=b4._parsedProps.pinNumber;return aPinNumber!==void 0&&bPinNumber!==void 0&&aPinNumber!==bPinNumber?!1:a3.isMatchingAnyOf(b4.getNameAndAliases())},hasExactSameMembers=(a3,b4)=>{let sortedA=a3.toSorted(),sortedB=b4.toSorted();return sortedA.length===sortedB.length&&sortedA.every((name,index)=>name===sortedB[index])},getPinNumberedName=port=>port.getNameAndAliases().find(alias=>/^pin\d+$/.test(alias))??null,getPortReferenceName=(port,portNameCounts)=>{if(!port._isPrimaryPort&&port.props.name||port.props.name&&(portNameCounts.get(port.props.name)??0)<=1)return port.props.name;let pinNumberedName=getPinNumberedName(port);return pinNumberedName||(port.props.name??null)};function inferInternallyConnectedPinNamesFromPorts(ports,inferredInternallyConnectedPinNames){let portsByAlias=new Map;for(let port of ports)for(let alias of new Set(port.getNameAndAliases()))/^(pin)?\d+$/.test(alias)||!port._isPrimaryPort&&alias===port.props.name||(portsByAlias.has(alias)||portsByAlias.set(alias,[]),portsByAlias.get(alias).push(port));for(let aliasPorts of portsByAlias.values()){let uniquePorts=Array.from(new Set(aliasPorts));if(uniquePorts.length<2)continue;let portNameCounts=new Map;for(let port of uniquePorts)port.props.name&&portNameCounts.set(port.props.name,(portNameCounts.get(port.props.name)??0)+1);let portNames=uniquePorts.map(port=>getPortReferenceName(port,portNameCounts)).filter(portName=>!!portName),uniquePortNames=Array.from(new Set(portNames));uniquePortNames.length<2||inferredInternallyConnectedPinNames.some(group=>hasExactSameMembers(group,uniquePortNames))||inferredInternallyConnectedPinNames.push(uniquePortNames)}}function getPrimaryPortsFromPortHintGroups(portHintGroups,opts){let implicitPinNumber=1,entriesByPinNumber=new Map;for(let portHintGroup of portHintGroups){let filteredPortHints=portHintGroup.hints.filter(hint=>hint&&hint.trim()!=="");if(filteredPortHints.length===0)continue;let portHintsList=filteredPortHints;portHintsList.some(hint=>hint.startsWith("pin")||/^(?:pin)?\d+$/.test(hint))||(portHintsList=[...portHintsList,`pin${implicitPinNumber}`]),implicitPinNumber++;let newPort=getPortFromHints(portHintsList,opts);if(!newPort)continue;newPort.originDescription=portHintGroup.originDescription;let pinNumber=newPort._parsedProps.pinNumber;pinNumber!==void 0&&(entriesByPinNumber.has(pinNumber)||entriesByPinNumber.set(pinNumber,[]),entriesByPinNumber.get(pinNumber).push({port:newPort,component:portHintGroup.component}))}let ports=[];for(let[pinNumber,entries]of entriesByPinNumber){let mergeAliases=(target,source)=>{let mergedAliases=source.getNameAndAliases().filter(alias=>!target.getNameAndAliases().includes(alias));target.externallyAddedAliases.push(...mergedAliases)},primaryPort=entries[0].port,componentEntries=entries.filter(entry=>!!entry.component);if(componentEntries.length!==entries.length){for(let entry of entries.slice(1))mergeAliases(primaryPort,entry.port);ports.push(primaryPort);continue}let clusters=getConnectedPcbPrimitiveClustersBeforeRender(componentEntries.map(entry=>entry.component));if(clusters.length<=1){for(let entry of entries.slice(1))mergeAliases(primaryPort,entry.port);ports.push(primaryPort);continue}let internallyConnectedPinNames=[primaryPort.props.name];for(let[clusterIndex,cluster]of clusters.entries()){let clusterEntries=componentEntries.filter(entry=>cluster.includes(entry.component));if(clusterIndex===0){for(let entry of clusterEntries.slice(1))mergeAliases(primaryPort,entry.port);ports.push(primaryPort);continue}let internalPort=new Port({name:`pin${pinNumber}_internal_${clusterIndex}`,aliases:primaryPort.getNameAndAliases()});internalPort._isPrimaryPort=!1,internalPort._primaryPinNumber=pinNumber,internalPort.originDescription=`implicitInternalPhysicalPort:pin${pinNumber}:${clusterIndex}`;for(let entry of clusterEntries)mergeAliases(internalPort,entry.port);internallyConnectedPinNames.push(internalPort.props.name),ports.push(internalPort)}opts?.inferredInternallyConnectedPinNames?.push(internallyConnectedPinNames)}return opts?.inferredInternallyConnectedPinNames&&inferInternallyConnectedPinNamesFromPorts(ports,opts.inferredInternallyConnectedPinNames),ports}var debug32=(0,import_debug6.default)("tscircuit:core"),rotation32=external_exports.object({x:rotation,y:rotation,z:rotation}),NormalComponent3=class extends PrimitiveComponent2{constructor(props){let filteredProps={...props},invalidPinLabelsMessages=[];if(filteredProps.pinLabels&&!Array.isArray(filteredProps.pinLabels)){let{validPinLabels,invalidPinLabelsMessages:messages}=filterPinLabels(filteredProps.pinLabels);filteredProps.pinLabels=validPinLabels,invalidPinLabelsMessages=messages}super(filteredProps);__publicField(this,"reactSubtrees",[]);__publicField(this,"_impliedFootprint");__publicField(this,"_resolvedPcbCalcOffsetX");__publicField(this,"_resolvedPcbCalcOffsetY");__publicField(this,"isPrimitiveContainer",!0);__publicField(this,"_isNormalComponent",!0);__publicField(this,"_attributeLowerToCamelNameMap",{_isnormalcomponent:"_isNormalComponent"});__publicField(this,"_asyncSupplierPartNumbers");__publicField(this,"_asyncFootprintCadModel");__publicField(this,"_isCadModelChild");__publicField(this,"_inferredInternallyConnectedPinNames",[]);__publicField(this,"pcb_missing_footprint_error_id");__publicField(this,"_hasStartedFootprintUrlLoad",!1);__publicField(this,"_hasStartedSupplierFootprintMismatchWarningCheck",!1);__publicField(this,"_invalidFootprintPropMessages",[]);__publicField(this,"_invalidPinLabelMessages",[]);__publicField(this,"_adjustSilkscreenTextAutomatically",!1);if(filteredProps.pinLabels&&!Array.isArray(filteredProps.pinLabels)){let invalidPinKey=Object.keys(filteredProps.pinLabels).find(pinKey=>getPinNumberFromPinLabelsKey(pinKey)===null);if(invalidPinKey)throw new InvalidProps(this.lowercaseComponentName,this.props,{_errors:[],pinLabels:{_errors:[`Invalid pinLabels key "${invalidPinKey}". Expected "pin\${number}" (e.g. pin1, pin2).`]}})}this._invalidPinLabelMessages=invalidPinLabelsMessages,this._addChildrenFromStringFootprint(),this.initPorts()}get defaultInternallyConnectedPinNames(){return[]}get internallyConnectedPinNames(){return[...this._parsedProps.internallyConnectedPins??this.defaultInternallyConnectedPinNames,...this._inferredInternallyConnectedPinNames].map(pinGroup=>pinGroup.map(pin=>typeof pin=="number"?`pin${pin}`:pin))}doInitialSourceNameDuplicateComponentRemoval(){if(!this.name)return;let root=this.root;if((this.getSubcircuit().getNormalComponentNameMap?.()?.get(this.props.name)??[]).filter(component=>component!==this&&component.renderPhaseStates.SourceNameDuplicateComponentRemoval.initialized).length>0){let pcbPosition2=this._getGlobalPcbPositionBeforeLayout(),schematicPosition=this._getGlobalSchematicPositionBeforeLayout();root.db.source_failed_to_create_component_error.insert({component_name:this.name,error_type:"source_failed_to_create_component_error",message:`Cannot create component "${this.name}": A component with the same name already exists`,pcb_center:pcbPosition2,schematic_center:schematicPosition}),this.shouldBeRemoved=!0;let childrenToRemove=[...this.children];for(let child of childrenToRemove)this.remove(child)}}initPorts(opts={}){this._inferredInternallyConnectedPinNames=[];let{config}=this,portsToCreate=[],schPortArrangement=this._getSchematicPortArrangement();if(schPortArrangement&&!this._parsedProps.pinLabels){for(let side in schPortArrangement){let pins=schPortArrangement[side].pins;if(Array.isArray(pins))for(let pinNumberOrLabel of pins){let pinNumber=parsePinNumberFromLabelsOrThrow(pinNumberOrLabel,this._parsedProps.pinLabels);portsToCreate.push(new Port({pinNumber,aliases:opts.additionalAliases?.[`pin${pinNumber}`]??[]},{originDescription:`schPortArrangement:${side}`}))}}let sides=["left","right","top","bottom"],pinNum=1;for(let side of sides){let size3=schPortArrangement[`${side}Size`];for(let i3=0;i3<size3;i3++)portsToCreate.push(new Port({pinNumber:pinNum++,aliases:opts.additionalAliases?.[`pin${pinNum}`]??[]},{originDescription:`schPortArrangement:${side}`}))}}let pinLabels=this._parsedProps.pinLabels;if(pinLabels)for(let[pinKey,label]of Object.entries(pinLabels)){let pinNumber=getPinNumberFromPinLabelsKey(pinKey);if(pinNumber===null)throw new Error(`Invalid pinLabels key "${pinKey}". Expected "pin\${number}" (e.g. pin1, pin2).`);let existingPort=portsToCreate.find(p5=>p5._parsedProps.pinNumber===pinNumber),primaryLabel=Array.isArray(label)?label[0]:label,otherLabels=Array.isArray(label)?label.slice(1):[];existingPort?(existingPort.externallyAddedAliases.push(primaryLabel,...otherLabels),existingPort.props.name=primaryLabel):(existingPort=new Port({pinNumber,name:primaryLabel,aliases:[...otherLabels,...opts.additionalAliases?.[`pin${pinNumber}`]??[]]},{originDescription:`pinLabels:pin${pinNumber}`}),portsToCreate.push(existingPort))}if(config.schematicSymbolName&&!opts.ignoreSymbolPorts){let sym=rc[this._getSchematicSymbolNameOrThrow()];if(!sym)return;for(let symPort of sym.ports){let pinNumber=getPinNumberFromLabels(symPort.labels);if(!pinNumber)continue;let existingPort=portsToCreate.find(p5=>p5._parsedProps.pinNumber===Number(pinNumber));if(existingPort)existingPort.schematicSymbolPortDef=symPort;else{let port=getPortFromHints(symPort.labels.concat(opts.additionalAliases?.[`pin${pinNumber}`]??[]));port&&(port.originDescription=`schematicSymbol:labels[0]:${symPort.labels[0]}`,port.schematicSymbolPortDef=symPort,portsToCreate.push(port))}}this.addAll(portsToCreate)}if(!this._getSchematicPortArrangement()){let hasReactSymbol=(0,import_react2.isValidElement)(this.props.symbol),symbolAlreadyAdded=this.children.some(c6=>c6.componentName==="Symbol");if(!(hasReactSymbol&&!symbolAlreadyAdded)){let portsFromFootprint=this.getPortsFromFootprint({...opts,collectInferredInternallyConnectedPins:!0}),existingPorts=this._getAllPortsFromChildren();for(let port of portsFromFootprint){if(!port._isPrimaryPort){portsToCreate.push(port);continue}let matchingPort=existingPorts.find(p5=>canMergePortDefinitions(p5,port))??portsToCreate.find(p5=>canMergePortDefinitions(p5,port));if(matchingPort){let mergedAliases=port.getNameAndAliases().filter(alias=>!matchingPort.getNameAndAliases().includes(alias));matchingPort.externallyAddedAliases.push(...mergedAliases)}else portsToCreate.push(port)}}}let requiredPinCount=opts.pinCount??this._getPrimaryPinCount()??0;for(let pn3=1;pn3<=requiredPinCount;pn3++){if(portsToCreate.find(p5=>p5._parsedProps.pinNumber===pn3))continue;if(!schPortArrangement){portsToCreate.push(new Port({pinNumber:pn3,aliases:opts.additionalAliases?.[`pin${pn3}`]??[]}));continue}let explicitlyListedPinNumbersInSchPortArrangement=getPinsFromPortArrangement(schPortArrangement).map(pn22=>parsePinNumberFromLabelsOrThrow(pn22,this._parsedProps.pinLabels));["leftSize","rightSize","topSize","bottomSize","leftPinCount","rightPinCount","topPinCount","bottomPinCount"].some(key=>key in schPortArrangement)&&(explicitlyListedPinNumbersInSchPortArrangement=Array.from({length:this._getPrimaryPinCount()},(_3,i3)=>i3+1)),explicitlyListedPinNumbersInSchPortArrangement.includes(pn3)&&portsToCreate.push(new Port({pinNumber:pn3,aliases:opts.additionalAliases?.[`pin${pn3}`]??[]},{originDescription:`notOtherwiseAddedButDeducedFromPinCount:${pn3}`}))}inferInternallyConnectedPinNamesFromPorts(Array.from(new Set([...this._getAllPortsFromChildren(),...portsToCreate])),this._inferredInternallyConnectedPinNames),portsToCreate.length>0&&this.addAll(portsToCreate)}_getImpliedFootprintString(){return null}resolveFootprint(){return this._parsedProps.footprint??this.props.footprint??this._getImpliedFootprintString?.()}_addChildrenFromStringFootprint(){let{pcbRotation,pinLabels,pcbPinLabels}=this.props,footprint=this.resolveFootprint();if(footprint&&typeof footprint=="string"){if(isHttpUrl(footprint)||isStaticAssetPath(footprint)||parseLibraryFootprintRef(footprint))return;let fpCircuitJson;try{fpCircuitJson=fp.string(footprint).soup()}catch(error2){this._queueInvalidFootprintPropMessage(footprint,error2);return}let fpComponents=createComponentsFromCircuitJson({componentName:this.name??this.componentName,componentRotation:pcbRotation,footprinterString:footprint,pinLabels,pcbPinLabels},fpCircuitJson);this.addAll(fpComponents)}}get portMap(){return new Proxy({},{get:(target,prop)=>{let port=this.children.find(c6=>c6.componentName==="Port"&&c6.isMatchingNameOrAlias(prop));if(!port)throw new Error(`There was an issue finding the port "${prop.toString()}" inside of a ${this.componentName} component with name: "${this.props.name}". This is a bug in @tscircuit/core`);return port}})}getInstanceForReactElement(element){for(let subtree of this.reactSubtrees)if(subtree.element===element)return subtree.component;return null}doInitialSourceRender(){let ftype=this.config.sourceFtype;if(!ftype)return;let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({ftype,name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSourceParentAttachment(){let{db:db3}=this.root,internallyConnectedSourcePortIds=this._getInternallyConnectedPins().map(ports=>ports.map(port=>port.source_port_id).filter(id3=>id3!==null)).filter(sourcePortIds=>sourcePortIds.length>=2);this.source_component_id&&internallyConnectedSourcePortIds.length>0&&db3.source_component.update(this.source_component_id,{internally_connected_source_port_ids:internallyConnectedSourcePortIds});for(let sourcePortIds of internallyConnectedSourcePortIds)db3.source_component_internal_connection.insert({source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id,source_port_ids:sourcePortIds})}doInitialSchematicComponentRender(){NormalComponent_doInitialSchematicComponentRender(this)}_getSchematicSymbolDisplayValue(){}_getInternallyConnectedPins(){if(this.internallyConnectedPinNames.length===0)return[];let internallyConnectedPorts=[];for(let netPortNames of this.internallyConnectedPinNames){let ports=[];for(let portName of netPortNames)ports.push(this.portMap[portName]);internallyConnectedPorts.push(ports)}return internallyConnectedPorts}_doInitialSchematicComponentRenderWithSymbol(){if(this.root?.schematicDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,symbol_name=this._getSchematicSymbolNameOrThrow(),symbol=rc[symbol_name],center2=this._getGlobalSchematicPositionBeforeLayout();if(symbol){let schematic_component22=db3.schematic_component.insert({center:center2,size:{...symbol.size},source_component_id:this.source_component_id,is_box_with_pins:!0,symbol_name,schematic_sheet_id:this._resolveSchematicSheetId(),symbol_display_value:this._getSchematicSymbolDisplayValue()});this.schematic_component_id=schematic_component22.schematic_component_id}}_doInitialSchematicComponentRenderWithReactSymbol(symbolElement){if(this.root?.schematicDisabled)return;let{db:db3}=this.root,center2=this._getGlobalSchematicPositionBeforeLayout(),schematic_component22=db3.schematic_component.insert({center:center2,size:{width:0,height:0},source_component_id:this.source_component_id,symbol_display_value:this._getSchematicSymbolDisplayValue(),is_box_with_pins:!1,schematic_sheet_id:this._resolveSchematicSheetId()});this.schematic_component_id=schematic_component22.schematic_component_id}_doInitialSchematicComponentRenderWithSchematicBoxDimensions(){if(this.root?.schematicDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,dimensions=this._getSchematicBoxDimensions(),primaryPortLabels={};if(Array.isArray(props.pinLabels))props.pinLabels.forEach((label,index)=>{primaryPortLabels[String(index+1)]=label});else for(let[port,label]of Object.entries(props.pinLabels??{}))primaryPortLabels[port]=Array.isArray(label)?label[0]:label;let center2=this._getGlobalSchematicPositionBeforeLayout(),schPortArrangement=this._getSchematicPortArrangement(),schematic_component22=db3.schematic_component.insert({center:center2,rotation:props.schRotation??0,size:dimensions.getSize(),port_arrangement:underscorifyPortArrangement(schPortArrangement),pin_spacing:.2,pin_styles:underscorifyPinStyles(props.schPinStyle,props.pinLabels),port_labels:primaryPortLabels,source_component_id:this.source_component_id,schematic_sheet_id:this._resolveSchematicSheetId()}),hasTopOrBottomPins=schPortArrangement?.topSide!==void 0||schPortArrangement?.bottomSide!==void 0,schematic_box_width=dimensions?.getSize().width,schematic_box_height=dimensions?.getSize().height,manufacturer_part_number_schematic_text=db3.schematic_text.insert({text:props.manufacturerPartNumber??"",schematic_component_id:schematic_component22.schematic_component_id,anchor:"left",rotation:0,position:{x:hasTopOrBottomPins?center2.x+(schematic_box_width??0)/2+.1:center2.x-(schematic_box_width??0)/2,y:hasTopOrBottomPins?center2.y+(schematic_box_height??0)/2+.35:center2.y-(schematic_box_height??0)/2-.13},color:"#006464",font_size:.18,schematic_sheet_id:this._resolveSchematicSheetId()}),component_name_text=db3.schematic_text.insert({text:props.displayName??props.name??"",schematic_component_id:schematic_component22.schematic_component_id,anchor:"left",rotation:0,position:{x:hasTopOrBottomPins?center2.x+(schematic_box_width??0)/2+.1:center2.x-(schematic_box_width??0)/2,y:hasTopOrBottomPins?center2.y+(schematic_box_height??0)/2+.55:center2.y+(schematic_box_height??0)/2+.13},color:"#006464",font_size:.18,schematic_sheet_id:this._resolveSchematicSheetId()});this.schematic_component_id=schematic_component22.schematic_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),componentLayer=this._getPcbComponentLayer();if(componentLayer!=="top"&&componentLayer!=="bottom"){let error2=pcb_component_invalid_layer_error.parse({type:"pcb_component_invalid_layer_error",message:`Component cannot be placed on layer '${componentLayer}'. Components can only be placed on 'top' or 'bottom' layers.`,source_component_id:this.source_component_id,layer:componentLayer,subcircuit_id:subcircuit.subcircuit_id??void 0});db3.pcb_component_invalid_layer_error.insert(error2)}let globalTransformRotation=this.getGlobalTransformRotation(),pcb_component3=db3.pcb_component.insert({center:this._getGlobalPcbPositionBeforeLayout(),width:0,height:0,layer:componentLayer==="top"||componentLayer==="bottom"?componentLayer:"top",rotation:props.pcbRotation??globalTransformRotation,insertion_direction:this._getPcbComponentInsertionDirection(componentLayer,globalTransformRotation),source_component_id:this.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0}),footprint=this.resolveFootprint(),hasFootprintChild=this.children.some(c6=>c6.componentName==="Footprint");if(!footprint&&!hasFootprintChild&&!this.isGroup){let footprint_error=db3.pcb_missing_footprint_error.insert({message:`No footprint specified for component: ${this.getString()}`,source_component_id:`${this.source_component_id}`,error_type:"pcb_missing_footprint_error"});this.pcb_missing_footprint_error_id=footprint_error.pcb_missing_footprint_error_id}this.pcb_component_id=pcb_component3.pcb_component_id;let manualPlacement=this.getSubcircuit()._getPcbManualPlacementForComponent(this);if((this.props.pcbX!==void 0||this.props.pcbY!==void 0)&&manualPlacement){let warning=pcb_manual_edit_conflict_warning.parse({type:"pcb_manual_edit_conflict_warning",pcb_manual_edit_conflict_warning_id:`pcb_manual_edit_conflict_${this.source_component_id}`,message:`${this.getString()} has both manual placement and prop coordinates. pcbX and pcbY will be used. Remove pcbX/pcbY or clear the manual placement.`,pcb_component_id:this.pcb_component_id,source_component_id:this.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0});db3.pcb_manual_edit_conflict_warning.insert(warning)}}doInitialPcbComponentSizeCalculation(){if(this.root?.pcbDisabled||!this.pcb_component_id)return;let{db:db3}=this.root,bounds=getBoundsOfPcbComponents(this.children);if(bounds.width===0||bounds.height===0)return;let center2={x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2};db3.pcb_component.update(this.pcb_component_id,{center:center2,width:bounds.width,height:bounds.height})}updatePcbComponentSizeCalculation(){this.doInitialPcbComponentSizeCalculation()}doInitialSchematicComponentSizeCalculation(){if(this.root?.schematicDisabled||!this.schematic_component_id)return;let{db:db3}=this.root;if(!db3.schematic_component.get(this.schematic_component_id))return;let schematicElements=[],collectSchematicPrimitives=children=>{for(let child of children){if(child.isSchematicPrimitive&&child.componentName==="SchematicLine"){let line2=db3.schematic_line.get(child.schematic_line_id);line2&&schematicElements.push(line2)}if(child.isSchematicPrimitive&&child.componentName==="SchematicRect"){let rect=db3.schematic_rect.get(child.schematic_rect_id);rect&&schematicElements.push(rect)}if(child.isSchematicPrimitive&&child.componentName==="SchematicCircle"){let circle2=db3.schematic_circle.get(child.schematic_circle_id);circle2&&schematicElements.push(circle2)}if(child.isSchematicPrimitive&&child.componentName==="SchematicArc"){let arc2=db3.schematic_arc.get(child.schematic_arc_id);arc2&&schematicElements.push(arc2)}if(child.isSchematicPrimitive&&child.componentName==="SchematicText"){let text=db3.schematic_text.get(child.schematic_text_id);text&&schematicElements.push(text)}if(child.isSchematicPrimitive&&child.componentName==="SchematicPath"){let pathIds=child.schematic_path_ids;if(pathIds)for(let pathId of pathIds){let path=db3.schematic_path.get(pathId);path&&schematicElements.push(path)}}child.children&&child.children.length>0&&collectSchematicPrimitives(child.children)}};if(collectSchematicPrimitives(this.children),schematicElements.length===0)return;let bounds=getBoundsForSchematic(schematicElements),width=Math.abs(bounds.maxX-bounds.minX),height=Math.abs(bounds.maxY-bounds.minY);if(width===0&&height===0)return;let centerX=(bounds.minX+bounds.maxX)/2,centerY=(bounds.minY+bounds.maxY)/2;db3.schematic_component.update(this.schematic_component_id,{center:{x:centerX,y:centerY},size:{width,height}})}updateSchematicComponentSizeCalculation(){this.doInitialSchematicComponentSizeCalculation()}doInitialPcbComponentAnchorAlignment(){NormalComponent_doInitialPcbComponentAnchorAlignment(this)}updatePcbComponentAnchorAlignment(){this.doInitialPcbComponentAnchorAlignment()}_renderReactSubtree(element){let component=createInstanceFromReactElement(element);return{element,component}}doInitialInitializePortsFromChildren(){this.initPorts()}updateInitializePortsFromChildren(){this.initPorts()}getGlobalTransformRotation(){let globalTransform=this._computePcbGlobalTransformBeforeLayout();return decomposeTSR2(globalTransform).rotation.angle*180/Math.PI}_getFootprintMetadataForPcbComponent(){let footprintChild=this.children.find(c6=>c6.componentName==="Footprint");if(footprintChild)return{insertionDirection:footprintChild._parsedProps.insertionDirection,originalLayer:footprintChild._parsedProps.originalLayer};let footprint=this.props.footprint;if((0,import_react2.isValidElement)(footprint)){let footprintProps2=footprint.props;return{insertionDirection:footprintProps2.insertionDirection,originalLayer:footprintProps2.originalLayer}}if(footprint?.componentName==="Footprint")return{insertionDirection:footprint._parsedProps?.insertionDirection??footprint.props?.insertionDirection,originalLayer:footprint._parsedProps?.originalLayer??footprint.props?.originalLayer}}_getPcbComponentLayer(){return this._parsedProps.layer??(this._getFootprintOriginalLayer()==="bottom"?"bottom":"top")}_getFootprintOriginalLayer(){return this._getFootprintMetadataForPcbComponent()?.originalLayer}_getPcbComponentInsertionDirection(componentLayer,rotationDegrees=this.getGlobalTransformRotation()){let footprintMetadata=this._getFootprintMetadataForPcbComponent();if(footprintMetadata?.insertionDirection)return transformFootprintInsertionDirection({insertionDirection:footprintMetadata.insertionDirection,rotationDegrees,isFlipped:isFootprintFlipped({componentLayer,originalLayer:footprintMetadata.originalLayer})})}doInitialReactSubtreesRender(){let fpElm=this.props.footprint;(0,import_react2.isValidElement)(fpElm)&&(this.children.some(c6=>c6.componentName==="Footprint")||this.add(fpElm));let symElm=this.props.symbol;(0,import_react2.isValidElement)(symElm)&&(this.children.some(c6=>c6.componentName==="Symbol")||this.add(symElm));let cmElm=this.props.cadModel;if((0,import_react2.isValidElement)(cmElm)){this._isCadModelChild=!0;let hasCadAssemblyChild=this.children.some(c6=>c6.componentName==="CadAssembly"),hasCadModelChild=this.children.some(c6=>c6.componentName==="CadModel");!hasCadAssemblyChild&&!hasCadModelChild&&this.add(cmElm)}let spiceModelElm=this.props.spiceModel;(0,import_react2.isValidElement)(spiceModelElm)&&(this.children.some(c6=>c6.componentName==="SpiceModel")||this.add(spiceModelElm))}doInitialPcbFootprintStringRender(){NormalComponent_doInitialPcbFootprintStringRender(this,(name,effect)=>this._queueAsyncEffect(name,effect))}_getAllPortsFromChildren(){let ports=[],collectPorts=component=>{component.componentName==="Port"&&ports.push(component);for(let child of component.children)collectPorts(child)};for(let child of this.children)collectPorts(child);return ports}_hasExistingPortExactly(port1){return this._getAllPortsFromChildren().some(port2=>{let aliases1=port1.getNameAndAliases(),aliases2=port2.getNameAndAliases();return aliases1.length===aliases2.length&&aliases1.every(alias=>aliases2.includes(alias))})}_hasMatchingPort(port1){let existingPorts=this._getAllPortsFromChildren(),pinNumber1=port1._parsedProps.pinNumber;return pinNumber1===void 0?!1:existingPorts.some(port2=>port2._parsedProps.pinNumber===pinNumber1)}add(componentOrElm){let component;if((0,import_react2.isValidElement)(componentOrElm)){let subtree=this._renderReactSubtree(componentOrElm);this.reactSubtrees.push(subtree),component=subtree.component}else component=componentOrElm;if(component.componentName==="Port"){if(this._hasExistingPortExactly(component))return;if(this._hasMatchingPort(component)){debug32(`Skipping port ${component} because a matching port already exists`);return}}super.add(component)}getPortsFromFootprint(opts){let inferredInternallyConnectedPinNames;opts?.collectInferredInternallyConnectedPins&&(inferredInternallyConnectedPinNames=this._inferredInternallyConnectedPinNames);let primaryPortOpts={...opts,inferredInternallyConnectedPinNames},{footprint}=this.props;if(typeof footprint=="string"&&parseLibraryFootprintRef(footprint)&&this.children.some(c6=>c6.componentName==="Footprint")?footprint=this.children.find(c6=>c6.componentName==="Footprint"):(!footprint||(0,import_react2.isValidElement)(footprint))&&(footprint=this.children.find(c6=>c6.componentName==="Footprint")),typeof footprint=="string"){if(isHttpUrl(footprint))return[];if(isStaticAssetPath(footprint))return[];if(parseLibraryFootprintRef(footprint))return[];let fpCircuitJson;try{fpCircuitJson=fp.string(footprint).soup()}catch(error2){return this._queueInvalidFootprintPropMessage(footprint,error2),[]}return getPrimaryPortsFromPortHintGroups(fpCircuitJson.flatMap(elm=>"port_hints"in elm&&elm.port_hints?[{hints:elm.port_hints,originDescription:`footprint:string:${footprint}:port_hints[0]:${elm.port_hints[0]}`}]:[]),primaryPortOpts)}if(!(0,import_react2.isValidElement)(footprint)&&footprint&&footprint.componentName==="Footprint")return getPrimaryPortsFromPortHintGroups(footprint.children.flatMap(fpChild=>fpChild.props.portHints?[{hints:fpChild.props.portHints,originDescription:`footprint:${footprint}`,component:fpChild}]:[]),primaryPortOpts);let newPorts=[];if(!footprint){for(let child of this.children)if(child.props.portHints&&child.isPcbPrimitive){let port=getPortFromHints(child.props.portHints);port&&newPorts.push(port)}}return newPorts}_queueInvalidFootprintPropMessage(footprint,error2){let rawErrorMessage=error2 instanceof Error?error2.message:String(error2),isLikelyMissingLibraryPrefix=footprint.includes("/")&&!footprint.includes(":"),resolvedJlcpcbPartNumber=/^c\d+$/i.test(footprint)?`C${footprint.replace(/^c/i,"")}`:null,helpfulHint=isLikelyMissingLibraryPrefix?` If this is a KiCad footprint, use "kicad:${footprint}".`:resolvedJlcpcbPartNumber?` If this is a JLCPCB part number, use "jlcpcb:${resolvedJlcpcbPartNumber}".`:"",message=`Invalid footprint prop on ${this.getDisplayName()}: "${footprint}".${helpfulHint} Parser details: ${rawErrorMessage}`;this._invalidFootprintPropMessages.includes(message)||this._invalidFootprintPropMessages.push(message)}_insertInvalidFootprintPropErrors(){for(let message of this._invalidFootprintPropMessages)this.root.db.source_invalid_component_property_error.insert({source_component_id:this.source_component_id||"",property_name:"footprint",message,error_type:"source_invalid_component_property_error"});this._invalidFootprintPropMessages=[]}getPortsFromSchematicSymbol(){if(this.root?.schematicDisabled)return[];let{config}=this;if(!config.schematicSymbolName)return[];let symbol=rc[config.schematicSymbolName];if(!symbol)return[];let newPorts=[];for(let symbolPort of symbol.ports){let port=getPortFromHints(symbolPort.labels);port&&(port.schematicSymbolPortDef=symbolPort,newPorts.push(port))}return newPorts}doInitialCreateNetsFromProps(){this._createNetsFromProps(this._getNetsFromConnectionsProp())}_getNetsFromConnectionsProp(){let{_parsedProps:props}=this,propsWithConnections=[];if(props.connections)for(let[pinName,target]of Object.entries(props.connections)){let targets=Array.isArray(target)?target:[target];for(let targetPath of targets)propsWithConnections.push(String(targetPath))}return propsWithConnections}_createNetsFromProps(propsWithConnections){createNetsFromProps(this,propsWithConnections)}_getPcbCircuitJsonBounds(){let{db:db3}=this.root;if(!this.pcb_component_id)return super._getPcbCircuitJsonBounds();let pcb_component3=db3.pcb_component.get(this.pcb_component_id);return{center:{x:pcb_component3.center.x,y:pcb_component3.center.y},bounds:{left:pcb_component3.center.x-pcb_component3.width/2,top:pcb_component3.center.y-pcb_component3.height/2,right:pcb_component3.center.x+pcb_component3.width/2,bottom:pcb_component3.center.y+pcb_component3.height/2},width:pcb_component3.width,height:pcb_component3.height}}_getPinCountFromSchematicPortArrangement(){let schPortArrangement=this._getSchematicPortArrangement();if(!schPortArrangement)return 0;if(!isExplicitPinMappingArrangement(schPortArrangement))return(schPortArrangement.leftSize??schPortArrangement.leftPinCount??0)+(schPortArrangement.rightSize??schPortArrangement.rightPinCount??0)+(schPortArrangement.topSize??schPortArrangement.topPinCount??0)+(schPortArrangement.bottomSize??schPortArrangement.bottomPinCount??0);let pins=getPinsFromPortArrangement(schPortArrangement),maxPinNumber=0;for(let pin of pins){if(typeof pin=="number"){maxPinNumber=Math.max(maxPinNumber,pin);continue}let directPinNumber=getPinNumberFromPinLabelsKey(pin);if(directPinNumber!==null){maxPinNumber=Math.max(maxPinNumber,directPinNumber);continue}let pinLabels=this._parsedProps.pinLabels;pinLabels&&(maxPinNumber=Math.max(maxPinNumber,parsePinNumberFromLabelsOrThrow(pin,pinLabels)))}return Math.max(maxPinNumber,pins.length)}_getPrimaryPinCount(){if(this._getSchematicPortArrangement())return this._getPinCountFromSchematicPortArrangement();let portsFromFootprint=this.getPortsFromFootprint();if(portsFromFootprint.length>0)return portsFromFootprint.filter(port=>port._isPrimaryPort).length;let{pinLabels}=this._parsedProps;if(pinLabels){if(Array.isArray(pinLabels))return pinLabels.length;let pinNumbers=Object.keys(pinLabels).map(k5=>getPinNumberFromPinLabelsKey(k5)).filter(n3=>n3!==null&&!Number.isNaN(n3));return pinNumbers.length>0?Math.max(...pinNumbers):Object.keys(pinLabels).length}return 0}_getSchematicPortArrangement(){return this._parsedProps.schPinArrangement??this._parsedProps.schPortArrangement}_getPinLabelsFromPorts(){let ports=this.selectAll("port"),pinLabels={};for(let port of ports){let pinNumber=port.props.pinNumber;if(pinNumber!==void 0){let bestLabel=port._getBestDisplayPinLabel();bestLabel&&(pinLabels[`pin${pinNumber}`]=bestLabel)}}return pinLabels}_getSchematicBoxDimensions(){if(this.getSchematicSymbol()||!this.config.shouldRenderAsSchematicBox&&!this._parsedProps?.showAsSchematicBox)return null;let{_parsedProps:props}=this,pinCount=this._getPrimaryPinCount(),pinSpacing=.2,allPinLabels={...this._getPinLabelsFromPorts(),...props.pinLabels};return getAllDimensionsForSchematicBox({schWidth:props.schWidth,schHeight:props.schHeight,schPinSpacing:pinSpacing,numericSchPinStyle:getNumericSchPinStyle(props.schPinStyle,allPinLabels),pinCount,schPortArrangement:this._getSchematicPortArrangement(),pinLabels:allPinLabels})}getFootprinterString(){let footprint=this.resolveFootprint();return typeof footprint=="string"?footprint:null}doInitialCadModelRender(){if(this._isCadModelChild||this.props.doNotPlace)return;let{db:db3}=this.root,{boardThickness=0}=this._getBoard()??{},cadModelProp2=this._parsedProps.cadModel,cadModel=cadModelProp2===void 0?this._asyncFootprintCadModel:cadModelProp2,footprintString=this.getFootprinterString()??void 0,footprintIsFootprinterString=!1;if(footprintString&&(footprintIsFootprinterString=!parseLibraryFootprintRef(footprintString)&&!isHttpUrl(footprintString)&&!isStaticAssetPath(footprintString)),!this.pcb_component_id||cadModel===null)return;let bounds=this._getPcbCircuitJsonBounds();if(typeof cadModel=="string")throw new Error("String cadModel not yet implemented");let sourceRotationOffset=cadModel?.pcbRotationOffset??cadModel?.rotationOffset,rotationOffset=rotation32.parse({x:0,y:0,z:typeof sourceRotationOffset=="number"?sourceRotationOffset:0,...typeof sourceRotationOffset=="object"?sourceRotationOffset:{}}),positionOffset=point3.parse({x:0,y:0,z:0,...typeof cadModel?.positionOffset=="object"?cadModel.positionOffset:{}}),zOffsetFromSurface=cadModel&&typeof cadModel=="object"&&"zOffsetFromSurface"in cadModel&&cadModel.zOffsetFromSurface!==void 0?distance.parse(cadModel.zOffsetFromSurface):0,computedLayer=this.props.layer==="bottom"?"bottom":"top",pcbComponent=db3.pcb_component.get(this.pcb_component_id),globalTransform=this._computePcbGlobalTransformBeforeLayout(),preLayoutRotation=decomposeTSR2(globalTransform).rotation.angle*180/Math.PI,totalRotation=pcbComponent?.position_mode==="packed"?pcbComponent.rotation??preLayoutRotation:preLayoutRotation,isBottomLayer=computedLayer==="bottom";if(!cadModel&&!footprintIsFootprinterString){let cad_component3=db3.cad_component.insert({position:{x:bounds.center.x,y:bounds.center.y,z:computedLayer==="bottom"?-boardThickness/2:boardThickness/2},rotation:{x:0,y:isBottomLayer?180:0,z:normalizeDegrees(isBottomLayer?-totalRotation:totalRotation)},pcb_component_id:this.pcb_component_id,source_component_id:this.source_component_id,model_origin_alignment:"center_of_component_on_board_surface",anchor_alignment:"center_of_component_on_board_surface",show_as_bounding_box:!0,show_as_translucent_model:this._parsedProps.showAsTranslucentModel});this.cad_component_id=cad_component3.cad_component_id;return}let rotationWithOffset=totalRotation+(rotationOffset.z??0),cadRotationZ=normalizeDegrees(rotationWithOffset),footprinterStringForCadComponent;!cadModel&&footprintIsFootprinterString&&(footprinterStringForCadComponent=footprintString);let cad_model=db3.cad_component.insert({position:{x:bounds.center.x+positionOffset.x,y:bounds.center.y+positionOffset.y,z:(computedLayer==="bottom"?-boardThickness/2:boardThickness/2)+(computedLayer==="bottom"?-zOffsetFromSurface:zOffsetFromSurface)+positionOffset.z},rotation:{x:rotationOffset.x,y:rotationOffset.y+(isBottomLayer?180:0),z:normalizeDegrees(isBottomLayer?-cadRotationZ:cadRotationZ)},pcb_component_id:this.pcb_component_id,source_component_id:this.source_component_id,model_stl_url:"stlUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.stlUrl):void 0,model_obj_url:"objUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.objUrl):void 0,model_mtl_url:"mtlUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.mtlUrl):void 0,model_gltf_url:"gltfUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.gltfUrl):void 0,model_glb_url:"glbUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.glbUrl):void 0,model_step_url:"stepUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.stepUrl):void 0,model_wrl_url:"wrlUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.wrlUrl):void 0,model_jscad:"jscad"in(cadModel??{})?cadModel.jscad:void 0,model_unit_to_mm_scale_factor:typeof cadModel?.modelUnitToMmScale=="number"?cadModel.modelUnitToMmScale:void 0,model_board_normal_direction:cadModel?.modelBoardNormalDirection,model_origin_alignment:"center_of_component_on_board_surface",anchor_alignment:"center_of_component_on_board_surface",model_origin_position:cadModel?.modelOriginPosition,footprinter_string:footprinterStringForCadComponent,show_as_translucent_model:this._parsedProps.showAsTranslucentModel});this.cad_component_id=cad_model.cad_component_id}_addCachebustToModelUrl(url2){if(!url2||!url2.includes("modelcdn.tscircuit.com"))return url2;let origin=this.root?.getClientOrigin()??"";return`${url2}${url2.includes("?")?"&":"?"}cachebust_origin=${encodeURIComponent(origin)}`}_getPartsEngineCacheKey(source_component,footprinterString){return JSON.stringify({ftype:source_component.ftype,name:source_component.name,manufacturer_part_number:source_component.manufacturer_part_number,footprinterString})}async _getSupplierPartNumbers(partsEngine2,source_component,footprinterString){if(this.props.doNotPlace)return{};let cacheEngine=this.root?.platform?.localCacheEngine,cacheKey=this._getPartsEngineCacheKey(source_component,footprinterString);if(cacheEngine){let cached=await cacheEngine.getItem(cacheKey);if(cached)try{return JSON.parse(cached)}catch{}}let result=await Promise.resolve(partsEngine2.findPart({sourceComponent:source_component,footprinterString}));if(typeof result=="string"){if(result.includes("<!DOCTYPE")||result.includes("<html"))throw new Error(`Failed to fetch supplier part numbers: Received HTML response instead of JSON. Response starts with: ${result.substring(0,100)}`);if(result==="Not found")return{};throw new Error(`Invalid supplier part numbers format: Expected object but got string: "${result}"`)}if(!result||Array.isArray(result)||typeof result!="object"){let actualType=result===null?"null":Array.isArray(result)?"array":typeof result;throw new Error(`Invalid supplier part numbers format: Expected object but got ${actualType}`)}let supplierPartNumbers=result;if(cacheEngine)try{await cacheEngine.setItem(cacheKey,JSON.stringify(supplierPartNumbers))}catch{}return supplierPartNumbers}doInitialPartsEngineRender(){if(this.props.doNotPlace||this.getInheritedProperty("bomDisabled")||this.getInheritedProperty("partsEngineDisabled"))return;let partsEngine2=this.getInheritedProperty("partsEngine");if(!partsEngine2)return;let{db:db3}=this.root,source_component=db3.source_component.get(this.source_component_id);if(!source_component||source_component.supplier_part_numbers)return;let footprint=this.props.footprint??this._getImpliedFootprintString(),footprinterString=typeof footprint=="string"?footprint:void 0,supplierPartNumbersMaybePromise=this._getSupplierPartNumbers(partsEngine2,source_component,footprinterString);if(!(supplierPartNumbersMaybePromise instanceof Promise)){db3.source_component.update(this.source_component_id,{supplier_part_numbers:supplierPartNumbersMaybePromise});return}this._queueAsyncEffect("get-supplier-part-numbers",async()=>{await supplierPartNumbersMaybePromise.then(supplierPartNumbers=>{this._asyncSupplierPartNumbers=supplierPartNumbers,this._markDirty("PartsEngineRender")}).catch(error2=>{this._asyncSupplierPartNumbers={};let errorObj=unknown_error_finding_part.parse({type:"unknown_error_finding_part",message:`Failed to fetch supplier part numbers for ${this.getString()}: ${error2.message}`,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id});db3.unknown_error_finding_part.insert(errorObj),this._markDirty("PartsEngineRender")})})}updatePartsEngineRender(){if(this.props.doNotPlace||this.getInheritedProperty("bomDisabled")||this.getInheritedProperty("partsEngineDisabled"))return;let{db:db3}=this.root,source_component=db3.source_component.get(this.source_component_id);if(source_component&&!source_component.supplier_part_numbers&&this._asyncSupplierPartNumbers){db3.source_component.update(this.source_component_id,{supplier_part_numbers:this._asyncSupplierPartNumbers});return}}doInitialSupplierFootprintMismatchWarning(){NormalComponent_doInitialSupplierFootprintMismatchWarning(this)}updateSupplierFootprintMismatchWarning(){this.doInitialSupplierFootprintMismatchWarning()}doInitialAssignFallbackProps(){let{_parsedProps:props}=this;props.connections&&!this.name&&(this.fallbackUnassignedName=this.getSubcircuit().getNextAvailableName(this))}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}_createTracesFromConnectionsProp(){let{_parsedProps:props}=this;if(props.connections)for(let[pinName,target]of Object.entries(props.connections)){let targets=Array.isArray(target)?target:[target];for(let targetPath of targets)this.add(new Trace3({from:`.${this.name} > .${pinName}`,to:String(targetPath)}))}}doInitialSourceDesignRuleChecks(){NormalComponent_doInitialSourceDesignRuleChecks(this)}doInitialSourceComponentPropertyValidation(){this._insertInvalidFootprintPropErrors()}doInitialValidatePcbCoordinates(){if(super.doInitialValidatePcbCoordinates(),this.root?.pcbDisabled)return;let props=this._parsedProps,rawProps=this.props,pcbLeftEdgeX=typeof rawProps.pcbLeftEdgeX=="string"?rawProps.pcbLeftEdgeX:props.pcbLeftEdgeX??rawProps.pcbLeftEdgeX,pcbRightEdgeX=typeof rawProps.pcbRightEdgeX=="string"?rawProps.pcbRightEdgeX:props.pcbRightEdgeX??rawProps.pcbRightEdgeX,pcbTopEdgeY=typeof rawProps.pcbTopEdgeY=="string"?rawProps.pcbTopEdgeY:props.pcbTopEdgeY??rawProps.pcbTopEdgeY,pcbBottomEdgeY=typeof rawProps.pcbBottomEdgeY=="string"?rawProps.pcbBottomEdgeY:props.pcbBottomEdgeY??rawProps.pcbBottomEdgeY;(props.pcbX!==void 0||props.pcbY!==void 0||pcbLeftEdgeX!==void 0||pcbRightEdgeX!==void 0||pcbTopEdgeY!==void 0||pcbBottomEdgeY!==void 0)&&(pcbLeftEdgeX!==void 0&&this._validatePcbCoordinateReferences({rawValue:pcbLeftEdgeX,axis:"pcbX",propertyName:"pcbLeftEdgeX"}),pcbRightEdgeX!==void 0&&this._validatePcbCoordinateReferences({rawValue:pcbRightEdgeX,axis:"pcbX",propertyName:"pcbRightEdgeX"}),pcbTopEdgeY!==void 0&&this._validatePcbCoordinateReferences({rawValue:pcbTopEdgeY,axis:"pcbY",propertyName:"pcbTopEdgeY"}),pcbBottomEdgeY!==void 0&&this._validatePcbCoordinateReferences({rawValue:pcbBottomEdgeY,axis:"pcbY",propertyName:"pcbBottomEdgeY"}))}doInitialPcbLayout(){if(this.root?.pcbDisabled||!this.pcb_component_id)return;let{db:db3}=this.root,props=this._parsedProps,rawProps=this.props,pcbLeftEdgeX=props.pcbLeftEdgeX??rawProps.pcbLeftEdgeX,pcbRightEdgeX=props.pcbRightEdgeX??rawProps.pcbRightEdgeX,pcbTopEdgeY=props.pcbTopEdgeY??rawProps.pcbTopEdgeY,pcbBottomEdgeY=props.pcbBottomEdgeY??rawProps.pcbBottomEdgeY;if(!(props.pcbX!==void 0||props.pcbY!==void 0||pcbLeftEdgeX!==void 0||pcbRightEdgeX!==void 0||pcbTopEdgeY!==void 0||pcbBottomEdgeY!==void 0))return;if(pcbLeftEdgeX!==void 0&&pcbRightEdgeX!==void 0)throw new Error(`${this.componentName} cannot set both pcbLeftEdgeX and pcbRightEdgeX`);if(pcbTopEdgeY!==void 0&&pcbBottomEdgeY!==void 0)throw new Error(`${this.componentName} cannot set both pcbTopEdgeY and pcbBottomEdgeY`);let pcbComponent=db3.pcb_component.get(this.pcb_component_id),componentWidth=pcbComponent?.width??0,componentHeight=pcbComponent?.height??0,positionedRelativeToGroupId=this.getGroup()?.pcb_group_id??void 0,positionedRelativeToBoardId=positionedRelativeToGroupId?void 0:this._getBoard()?.pcb_board_id??void 0,resolvedPcbX=this._resolvedPcbCalcOffsetX??(props.pcbX!==void 0?this._resolvePcbCoordinate(props.pcbX,"pcbX"):pcbLeftEdgeX!==void 0?this._resolvePcbCoordinate(pcbLeftEdgeX,"pcbX",{propertyName:"pcbLeftEdgeX"})+componentWidth/2:pcbRightEdgeX!==void 0?this._resolvePcbCoordinate(pcbRightEdgeX,"pcbX",{propertyName:"pcbRightEdgeX"})-componentWidth/2:void 0),resolvedPcbY=this._resolvedPcbCalcOffsetY??(props.pcbY!==void 0?this._resolvePcbCoordinate(props.pcbY,"pcbY"):pcbTopEdgeY!==void 0?this._resolvePcbCoordinate(pcbTopEdgeY,"pcbY",{propertyName:"pcbTopEdgeY"})-componentHeight/2:pcbBottomEdgeY!==void 0?this._resolvePcbCoordinate(pcbBottomEdgeY,"pcbY",{propertyName:"pcbBottomEdgeY"})+componentHeight/2:void 0);db3.pcb_component.update(this.pcb_component_id,{position_mode:"relative_to_group_anchor",positioned_relative_to_pcb_group_id:positionedRelativeToGroupId,positioned_relative_to_pcb_board_id:positionedRelativeToBoardId,display_offset_x:resolvedPcbX,display_offset_y:resolvedPcbY})}_getMinimumFlexContainerSize(){return NormalComponent__getMinimumFlexContainerSize(this)}_repositionOnPcb(position4){return NormalComponent__repositionOnPcb(this,position4)}doInitialSilkscreenOverlapAdjustment(){return NormalComponent_doInitialSilkscreenOverlapAdjustment(this)}isRelativelyPositioned(){let rawProps=this.props;return this._parsedProps.pcbX!==void 0||this._parsedProps.pcbY!==void 0||this._parsedProps.pcbLeftEdgeX!==void 0||this._parsedProps.pcbRightEdgeX!==void 0||this._parsedProps.pcbTopEdgeY!==void 0||this._parsedProps.pcbBottomEdgeY!==void 0||rawProps.pcbLeftEdgeX!==void 0||rawProps.pcbRightEdgeX!==void 0||rawProps.pcbTopEdgeY!==void 0||rawProps.pcbBottomEdgeY!==void 0}},getDescendantSubcircuitIds2=(db3,root_subcircuit_id)=>{let groups=db3.source_group.list(),result=[],findDescendants=parentId=>{let children=groups.filter(group=>group.parent_subcircuit_id===parentId);for(let child of children)child.subcircuit_id&&(result.push(child.subcircuit_id),findDescendants(child.subcircuit_id))};return findDescendants(root_subcircuit_id),result},getBoardCenterFromAnchor=({boardAnchorPosition,boardAnchorAlignment,width,height})=>{let{x:ax3,y:ay3}=boardAnchorPosition,cx3=ax3,cy3=ay3;switch(boardAnchorAlignment){case"top_left":cx3=ax3+width/2,cy3=ay3-height/2;break;case"top_right":cx3=ax3-width/2,cy3=ay3-height/2;break;case"bottom_left":cx3=ax3+width/2,cy3=ay3+height/2;break;case"bottom_right":cx3=ax3-width/2,cy3=ay3+height/2;break;case"top":cx3=ax3,cy3=ay3-height/2;break;case"bottom":cx3=ax3,cy3=ay3+height/2;break;case"left":cx3=ax3+width/2,cy3=ay3;break;case"right":cx3=ax3-width/2,cy3=ay3;break;default:break}return{x:cx3,y:cy3}};function inflatePcbBoard(pcbBoard,inflatorContext){let{subcircuit}=inflatorContext;if(subcircuit.lowercaseComponentName==="board"||subcircuit.lowercaseComponentName==="mountedboard"||subcircuit.parent?.lowercaseComponentName==="board")return;let boardProps2={name:"inflated_board"};pcbBoard.width&&(boardProps2.width=pcbBoard.width),pcbBoard.height&&(boardProps2.height=pcbBoard.height),pcbBoard.center&&(boardProps2.pcbX=pcbBoard.center.x,boardProps2.pcbY=pcbBoard.center.y),pcbBoard.outline&&(boardProps2.outline=pcbBoard.outline),pcbBoard.thickness&&(boardProps2.thickness=pcbBoard.thickness),pcbBoard.material&&(boardProps2.material=pcbBoard.material);let board=new Board(boardProps2);return board.pcb_board_id=pcbBoard.pcb_board_id,subcircuit.add(board),board}var Capacitor2=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Capacitor",schematicSymbolName:this.props.polarized?"capacitor_polarized":this.props.symbolName??"capacitor",zodProps:capacitorProps,sourceFtype:FTYPE.simple_capacitor}}initPorts(){typeof this.props.footprint=="string"?super.initPorts({additionalAliases:{pin1:["anode","pos"],pin2:["cathode","neg"]}}):super.initPorts()}_getSchematicSymbolDisplayValue(){let inputCapacitance=this.props.capacitance,capacitanceDisplay=typeof inputCapacitance=="string"?inputCapacitance:`${formatSiUnit(this._parsedProps.capacitance)}F`;return this._parsedProps.schShowRatings&&this._parsedProps.maxVoltageRating?`${capacitanceDisplay}/${formatSiUnit(this._parsedProps.maxVoltageRating)}V`:capacitanceDisplay}doInitialCreateNetsFromProps(){this._createNetsFromProps([this.props.decouplingFor,this.props.decouplingTo,...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this.props.decouplingFor&&this.props.decouplingTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.decouplingFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.decouplingTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({ftype:"simple_capacitor",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,capacitance:props.capacitance,max_voltage_rating:props.maxVoltageRating,max_decoupling_trace_length:props.maxDecouplingTraceLength,display_capacitance:this._getSchematicSymbolDisplayValue(),are_pins_interchangeable:!props.polarized,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},extractPcbPrimitivesFromCircuitJson=({pcbComponent,db:db3,componentName})=>{let componentCenter=pcbComponent.center||{x:0,y:0},componentRotation=pcbComponent.rotation||0,absoluteToComponentRelativeTransform=inverse2(compose2(translate2(componentCenter.x,componentCenter.y),rotate2(componentRotation*Math.PI/180))),relativeElements=db3.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===pcbComponent.pcb_component_id),clonedRelativeElements=structuredClone(relativeElements);return transformPCBElements(clonedRelativeElements,absoluteToComponentRelativeTransform),createComponentsFromCircuitJson({componentName,componentRotation:"0deg"},clonedRelativeElements)},inflateFootprintComponent=(pcbElm,inflatorContext)=>{let{injectionDb,normalComponent}=inflatorContext;if(!normalComponent)return null;let primitives=extractPcbPrimitivesFromCircuitJson({pcbComponent:pcbElm,db:injectionDb,componentName:normalComponent.name});if(primitives.length===0)return null;let footprint=new Footprint({originalLayer:pcbElm.layer});return footprint.addAll(primitives),footprint},getInflatedPcbPlacement=({pcbComponent,sourceGroupId,inflatorContext})=>{if(!pcbComponent?.center)return{pcbX:void 0,pcbY:void 0};if(sourceGroupId){let parentPcbGroup=inflatorContext.injectionDb.pcb_group.getWhere({source_group_id:sourceGroupId});if(parentPcbGroup?.anchor_position)return{pcbX:pcbComponent.center.x-parentPcbGroup.anchor_position.x,pcbY:pcbComponent.center.y-parentPcbGroup.anchor_position.y}}return{pcbX:pcbComponent.center.x,pcbY:pcbComponent.center.y}};function inflateSourceCapacitor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),capacitor=new Capacitor2({name:sourceElm.name,capacitance:sourceElm.capacitance,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:capacitor});footprint&&capacitor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(capacitor):subcircuit.add(capacitor)}var Chip=class extends NormalComponent3{constructor(props){super(props);__publicField(this,"schematicBoxDimensions",null)}get config(){return{componentName:"Chip",zodProps:chipProps,shouldRenderAsSchematicBox:!0}}initPorts(opts={}){super.initPorts(opts);let{_parsedProps:props}=this;if(props.externallyConnectedPins){let requiredPorts=new Set;for(let[pin1,pin2]of props.externallyConnectedPins)requiredPorts.add(pin1),requiredPorts.add(pin2);for(let pinIdentifier of requiredPorts)if(!this.children.find(child=>child instanceof Port&&child.isMatchingAnyOf([pinIdentifier]))){let pinMatch=pinIdentifier.match(/^pin(\d+)$/);if(pinMatch){let pinNumber=parseInt(pinMatch[1]);this.add(new Port({pinNumber,aliases:[pinIdentifier]}))}else this.add(new Port({name:pinIdentifier,aliases:[pinIdentifier]}))}}}doInitialSchematicComponentRender(){let{_parsedProps:props}=this;props?.noSchematicRepresentation!==!0&&super.doInitialSchematicComponentRender()}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:props.manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),footprint=props.footprint??this._getImpliedFootprintString(),hasFootprintChild=this.children.some(c6=>c6.componentName==="Footprint");if(!footprint&&!hasFootprintChild&&!this._hasStartedFootprintUrlLoad){let footprint_error=db3.pcb_missing_footprint_error.insert({message:`No footprint specified for component: ${this.getString()}`,source_component_id:`${this.source_component_id}`,error_type:"pcb_missing_footprint_error"});this.pcb_missing_footprint_error_id=footprint_error.pcb_missing_footprint_error_id}let componentLayer=this._getPcbComponentLayer();if(componentLayer!=="top"&&componentLayer!=="bottom"){let subcircuit=this.getSubcircuit(),error2=pcb_component_invalid_layer_error.parse({type:"pcb_component_invalid_layer_error",message:`Component cannot be placed on layer '${componentLayer}'. Components can only be placed on 'top' or 'bottom' layers.`,source_component_id:this.source_component_id,layer:componentLayer,subcircuit_id:subcircuit.subcircuit_id??void 0});db3.pcb_component_invalid_layer_error.insert(error2)}let globalTransformRotation=this.getGlobalTransformRotation(),pcb_component3=db3.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:componentLayer==="top"||componentLayer==="bottom"?componentLayer:"top",rotation:props.pcbRotation??globalTransformRotation,insertion_direction:this._getPcbComponentInsertionDirection(componentLayer,globalTransformRotation),source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,is_allowed_to_be_off_board:props.allowOffBoard??!1,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0});this.pcb_component_id=pcb_component3.pcb_component_id}doInitialCreateTracesFromProps(){let{_parsedProps:props}=this;if(props.externallyConnectedPins)for(let[pin1,pin2]of props.externallyConnectedPins)this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.${pin1}`,to:`${this.getSubcircuitSelector()} > port.${pin2}`}));this._createTracesFromConnectionsProp()}doInitialSimulationRender(){let{db:db3}=this.root,{pinAttributes}=this.props;if(!pinAttributes)return;let powerPort=null,groundPort=null,voltage3,ports=this.selectAll("port");for(let port of ports)for(let alias of port.getNameAndAliases())if(pinAttributes[alias]){let attributes2=pinAttributes[alias];attributes2.providesPower&&(powerPort=port,voltage3=attributes2.providesVoltage),attributes2.providesGround&&(groundPort=port)}if(!powerPort||!groundPort||voltage3===void 0)return;let powerSourcePort=db3.source_port.get(powerPort.source_port_id);if(!powerSourcePort?.subcircuit_connectivity_map_key)return;let groundSourcePort=db3.source_port.get(groundPort.source_port_id);if(!groundSourcePort?.subcircuit_connectivity_map_key)return;let powerNet=db3.source_net.getWhere({subcircuit_connectivity_map_key:powerSourcePort.subcircuit_connectivity_map_key}),groundNet=db3.source_net.getWhere({subcircuit_connectivity_map_key:groundSourcePort.subcircuit_connectivity_map_key});!powerNet||!groundNet||db3.simulation_voltage_source.insert({type:"simulation_voltage_source",positive_source_port_id:powerPort.source_port_id,positive_source_net_id:powerNet.source_net_id,negative_source_port_id:groundPort.source_port_id,negative_source_net_id:groundNet.source_net_id,voltage:voltage3})}},mapInternallyConnectedSourcePortIdsToPinLabels=(sourcePortIds,inflatorContext)=>{if(!sourcePortIds||sourcePortIds.length===0)return;let{injectionDb}=inflatorContext,mapped=sourcePortIds.map(group=>group.map(sourcePortId=>{let port=injectionDb.source_port.get(sourcePortId);return port?port.pin_number!==void 0&&port.pin_number!==null?`pin${port.pin_number}`:port.name:null}).filter(value=>value!==null)).filter(group=>group.length>0);return mapped.length>0?mapped:void 0},inflateSourceChip=(sourceElm,inflatorContext)=>{let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),schematicElm=injectionDb.schematic_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),internallyConnectedPins=mapInternallyConnectedSourcePortIdsToPinLabels(sourceElm.internally_connected_source_port_ids,inflatorContext),footprinterString=cadElm?.footprinter_string??null,{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),chip=new Chip({name:sourceElm.name,manufacturerPartNumber:sourceElm.manufacturer_part_number,supplierPartNumbers:sourceElm.supplier_part_numbers??void 0,pinLabels:schematicElm?.port_labels??void 0,schWidth:schematicElm?.size?.width,schHeight:schematicElm?.size?.height,schPinSpacing:schematicElm?.pin_spacing,schX:schematicElm?.center?.x,schY:schematicElm?.center?.y,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds,internallyConnectedPins});if(footprinterString&&(Object.assign(chip.props,{footprint:footprinterString}),Object.assign(chip._parsedProps,{footprint:footprinterString})),pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:chip});footprint&&chip.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(chip):subcircuit.add(chip)},Diode2=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pin1);__publicField(this,"anode",this.portMap.pin1);__publicField(this,"neg",this.portMap.pin2);__publicField(this,"cathode",this.portMap.pin2)}get config(){let symbolMap={schottky:"schottky_diode",avalanche:"avalanche_diode",zener:"zener_diode",photodiode:"photodiode"},variantSymbol=this.props.schottky?"schottky":this.props.avalanche?"avalanche":this.props.zener?"zener":this.props.photo?"photodiode":null;return{schematicSymbolName:variantSymbol?symbolMap[variantSymbol]:this.props.symbolName??"diode",componentName:"Diode",zodProps:diodeProps,sourceFtype:"simple_diode"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({ftype:"simple_diode",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceDiode(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),diode2=new Diode2({name:sourceElm.name,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:diode2});footprint&&diode2.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(diode2):subcircuit.add(diode2)}var InflatedFiducial=class extends NormalComponent3{get config(){return{componentName:"Fiducial",zodProps:fiducialProps,sourceFtype:"simple_fiducial"}}doInitialSchematicComponentRender(){}};function inflateSourceFiducial(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),pcbSmtPad=injectionDb.pcb_smtpad.list({pcb_component_id:pcbElm?.pcb_component_id}).find(elm=>elm.shape==="circle"),padDiameter=pcbSmtPad&&"radius"in pcbSmtPad?pcbSmtPad.radius*2:"1mm",fiducial=new InflatedFiducial({name:sourceElm.name,padDiameter,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:fiducial});footprint&&fiducial.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(fiducial):subcircuit.add(fiducial)}var SOLVERS={PackSolver2,AutoroutingPipelineSolver:$H,AssignableAutoroutingPipeline2:Zc2,AssignableAutoroutingPipeline3:sg,AutoroutingPipeline1_OriginalUnravel:vc2,AutoroutingPipelineSolver3_HgPortPointPathing:Ng,AutoroutingPipelineSolver4:Mj,AutoroutingPipelineSolver5:Dj2,AutoroutingPipelineSolver7_MultiGraph:$H,AutoroutingPipelineSolver8:VH,CopperPourPipelineSolver},TscircuitAutorouter=class{constructor(input2,options={}){__publicField(this,"input");__publicField(this,"isRouting",!1);__publicField(this,"solver");__publicField(this,"eventHandlers",{complete:[],error:[],progress:[]});__publicField(this,"cycleCount",0);__publicField(this,"stepDelay");__publicField(this,"timeoutId");this.input=input2;let{capacityDepth,targetMinCapacity,stepDelay=0,useAssignableSolver=!1,useAutoJumperSolver=!1,autorouterVersion:autorouterVersion2,useLaserPrefabSolver=!1,effort,onSolverStarted}=options,solverName;autorouterVersion2==="v1"?solverName="AutoroutingPipeline1_OriginalUnravel":autorouterVersion2==="v3"?solverName="AutoroutingPipelineSolver3_HgPortPointPathing":autorouterVersion2==="v4"||autorouterVersion2==="latest"?solverName="AutoroutingPipelineSolver4":autorouterVersion2==="v5"?solverName="AutoroutingPipelineSolver5":autorouterVersion2==="v6"?solverName="AutoroutingPipelineSolver7_MultiGraph":useLaserPrefabSolver?solverName="AutoroutingPipelineSolver8":useAutoJumperSolver?solverName="AssignableAutoroutingPipeline3":useAssignableSolver?solverName="AssignableAutoroutingPipeline2":solverName="AutoroutingPipelineSolver4";let SolverClass=SOLVERS[solverName];this.solver=new SolverClass(input2,{capacityDepth,targetMinCapacity,cacheProvider:null,effort}),onSolverStarted?.({solverName,solverParams:{input:input2,options:{capacityDepth,targetMinCapacity,cacheProvider:null,effort}}}),this.stepDelay=stepDelay}start(){this.isRouting||(this.isRouting=!0,this.cycleCount=0,this.runCycleAndQueueNextCycle())}async stepSolver(){if("stepAsync"in this.solver&&typeof this.solver.stepAsync=="function"){await this.solver.stepAsync();return}this.solver.step()}async runCycleAndQueueNextCycle(){if(this.isRouting)try{if(this.solver.solved||this.solver.failed){this.solver.failed?this.emitEvent({type:"error",error:new AutorouterError(this.solver.error||"Routing failed")}):this.emitEvent({type:"complete",traces:this.solver.getOutputSimpleRouteJson().traces||[]}),this.isRouting=!1;return}let startTime=Date.now(),startIterations=this.solver.iterations;for(;Date.now()-startTime<250&&!this.solver.failed&&!this.solver.solved;)await this.stepSolver();let iterationsPerSecond=(this.solver.iterations-startIterations)/(Date.now()-startTime)*1e3;this.cycleCount++;let debugGraphics=this.solver?.preview()||void 0,progress=this.solver.progress;this.emitEvent({type:"progress",steps:this.cycleCount,iterationsPerSecond,progress,phase:this.solver.getCurrentPhase(),debugGraphics}),this.stepDelay>0?this.timeoutId=setTimeout(()=>{this.runCycleAndQueueNextCycle()},this.stepDelay):this.timeoutId=setTimeout(()=>{this.runCycleAndQueueNextCycle()},0)}catch(error2){this.emitEvent({type:"error",error:error2 instanceof Error?new AutorouterError(error2.message):new AutorouterError(String(error2))}),this.isRouting=!1}}stop(){this.isRouting&&(this.isRouting=!1,this.timeoutId!==void 0&&(clearTimeout(this.timeoutId),this.timeoutId=void 0))}on(event,callback){event==="complete"?this.eventHandlers.complete.push(callback):event==="error"?this.eventHandlers.error.push(callback):event==="progress"&&this.eventHandlers.progress.push(callback)}emitEvent(event){if(event.type==="complete")for(let handler of this.eventHandlers.complete)handler(event);else if(event.type==="error")for(let handler of this.eventHandlers.error)handler(event);else if(event.type==="progress")for(let handler of this.eventHandlers.progress)handler(event)}solveSync(){if(this.solver.solve(),this.solver.failed)throw new AutorouterError(this.solver.error||"Routing failed");return this.solver.getOutputSimpleRouteJson().traces||[]}getConnectedOffboardObstacles(){return"getConnectedOffboardObstacles"in this.solver?this.solver.getConnectedOffboardObstacles():{}}},createSourceTracesFromOffboardConnections=({db:db3,connectedOffboardObstacles,simpleRouteJson,subcircuit_id})=>{if(Object.keys(connectedOffboardObstacles).length===0)return;let pcbElementIdToSourcePortId=new Map;for(let pcbPort of db3.pcb_port.list())if(pcbPort.source_port_id){let smtpad2=db3.pcb_smtpad.getWhere({pcb_port_id:pcbPort.pcb_port_id});smtpad2&&pcbElementIdToSourcePortId.set(smtpad2.pcb_smtpad_id,pcbPort.source_port_id);let platedHole=db3.pcb_plated_hole.getWhere({pcb_port_id:pcbPort.pcb_port_id});platedHole&&pcbElementIdToSourcePortId.set(platedHole.pcb_plated_hole_id,pcbPort.source_port_id)}let obstacleById=new Map;for(let obstacle of simpleRouteJson.obstacles)obstacle.obstacleId&&obstacleById.set(obstacle.obstacleId,obstacle);let connectionGroups=new Map;for(let[obstacleId,rootConnectionName]of Object.entries(connectedOffboardObstacles))connectionGroups.has(rootConnectionName)||connectionGroups.set(rootConnectionName,[]),connectionGroups.get(rootConnectionName).push(obstacleId);for(let[rootConnectionName,obstacleIds]of connectionGroups){let sourcePortIds=new Set;for(let obstacleId of obstacleIds){let obstacle=obstacleById.get(obstacleId);if(obstacle)for(let connectedId of obstacle.connectedTo){let sourcePortId=pcbElementIdToSourcePortId.get(connectedId);sourcePortId&&sourcePortIds.add(sourcePortId)}}if(sourcePortIds.size<2)continue;let sourcePortIdArray=Array.from(sourcePortIds);db3.source_trace.list().some(trace=>{let tracePortIds=new Set(trace.connected_source_port_ids);return sourcePortIdArray.every(id3=>tracePortIds.has(id3))})||db3.source_trace.insert({connected_source_port_ids:sourcePortIdArray,connected_source_net_ids:[],subcircuit_id:subcircuit_id??void 0,display_name:`offboard_${rootConnectionName}`})}};function getPresetAutoroutingConfig(autorouterConfig2,platformConfig2){let defaults={serverUrl:"https://registry-api.tscircuit.com",serverMode:"job",serverCacheEnabled:!0};if(typeof autorouterConfig2=="object"&&!autorouterConfig2.preset)return{local:!(autorouterConfig2.serverUrl||autorouterConfig2.serverMode||autorouterConfig2.serverCacheEnabled),...defaults,...autorouterConfig2};let preset=typeof autorouterConfig2=="object"?autorouterConfig2.preset:autorouterConfig2,providedConfig=typeof autorouterConfig2=="object"?autorouterConfig2:{},normalizedPreset=typeof preset=="string"?preset.replace(/_/g,"-"):preset,platformAutorouter=normalizedPreset&&typeof normalizedPreset=="string"?platformConfig2?.autorouterMap?.[normalizedPreset]:void 0;if(platformAutorouter)return{local:!0,groupMode:"subcircuit",algorithmFn:async simpleRouteJson=>platformAutorouter.createAutorouter(simpleRouteJson)};switch(normalizedPreset){case"auto-local":return{local:!0,groupMode:"subcircuit"};case"sequential-trace":return{local:!0,groupMode:"sequential-trace"};case"subcircuit":return{local:!0,groupMode:"subcircuit"};case"auto-cloud":{let{preset:_preset,local:_local,groupMode:_groupMode,...rest}=providedConfig;return{local:!1,groupMode:"subcircuit",...defaults,...rest}}case"laser-prefab":{let{preset:_preset,local:_local,groupMode:_groupMode,...rest}=providedConfig;return{local:!0,groupMode:"subcircuit",preset:"laser_prefab",...rest}}case"auto-jumper":{let{preset:_preset,local:_local,groupMode:_groupMode,...rest}=providedConfig;return{local:!0,groupMode:"subcircuit",preset:"auto_jumper",...rest}}default:return{local:!0,groupMode:"subcircuit"}}}var applyPcbEditEventsToManualEditsFile=({circuitJson,editEvents,manualEditsFile})=>{let updatedManualEditsFile={...manualEditsFile,pcb_placements:[...manualEditsFile.pcb_placements??[]]};for(let editEvent of editEvents)if(editEvent.edit_event_type==="edit_pcb_component_location"){let{pcb_component_id,new_center}=editEvent,pcb_component3=su2(circuitJson).pcb_component.get(pcb_component_id);if(!pcb_component3)continue;let source_component=su2(circuitJson).source_component.get(pcb_component3.source_component_id);if(!source_component)continue;let existingPlacementIndex=updatedManualEditsFile.pcb_placements?.findIndex(p5=>p5.selector===source_component.name),newPlacement={selector:source_component.name,center:new_center,relative_to:"group_center"};existingPlacementIndex>=0?updatedManualEditsFile.pcb_placements[existingPlacementIndex]=newPlacement:updatedManualEditsFile.pcb_placements.push(newPlacement)}return updatedManualEditsFile},applySchematicEditEventsToManualEditsFile=({circuitJson,editEvents,manualEditsFile})=>{let updatedManualEditsFile={...manualEditsFile,schematic_placements:[...manualEditsFile.schematic_placements??[]]};for(let editEvent of editEvents)if(editEvent.edit_event_type==="edit_schematic_component_location"){let{schematic_component_id,new_center}=editEvent,schematic_component22=su2(circuitJson).schematic_component.get(schematic_component_id);if(!schematic_component22||!schematic_component22.source_component_id)continue;let source_component=su2(circuitJson).source_component.get(schematic_component22.source_component_id);if(!source_component)continue;let existingPlacementIndex=updatedManualEditsFile.schematic_placements?.findIndex(p5=>p5.selector===source_component.name),newPlacement={selector:source_component.name,center:new_center,relative_to:"group_center"};existingPlacementIndex>=0?updatedManualEditsFile.schematic_placements[existingPlacementIndex]=newPlacement:updatedManualEditsFile.schematic_placements.push(newPlacement)}return updatedManualEditsFile},applyEditEventsToManualEditsFile=({circuitJson,editEvents,manualEditsFile})=>{let schematicEditEvents=editEvents.filter(event=>event.edit_event_type==="edit_schematic_component_location"),pcbEditEvents=editEvents.filter(event=>event.edit_event_type==="edit_pcb_component_location"),updatedManualEditsFile=manualEditsFile;return schematicEditEvents.length>0&&(updatedManualEditsFile=applySchematicEditEventsToManualEditsFile({circuitJson,editEvents:schematicEditEvents,manualEditsFile:updatedManualEditsFile})),pcbEditEvents.length>0&&(updatedManualEditsFile=applyPcbEditEventsToManualEditsFile({circuitJson,editEvents:pcbEditEvents,manualEditsFile:updatedManualEditsFile})),updatedManualEditsFile},applyTraceHintEditEvent=(circuitJson,edit_event)=>{if(su2(circuitJson).pcb_trace_hint.get(edit_event.pcb_trace_hint_id))circuitJson=circuitJson.map(e7=>e7.pcb_trace_hint_id===edit_event.pcb_trace_hint_id?{...e7,route:edit_event.route}:e7);else{let pcbPort=su2(circuitJson).pcb_port.get(edit_event.pcb_port_id);circuitJson=circuitJson.filter(e7=>!(e7.type==="pcb_trace_hint"&&e7.pcb_port_id===edit_event.pcb_port_id)).concat([{type:"pcb_trace_hint",pcb_trace_hint_id:edit_event.pcb_trace_hint_id,route:edit_event.route,pcb_port_id:edit_event.pcb_port_id,pcb_component_id:pcbPort?.pcb_component_id}])}return circuitJson},applyEditEvents=({circuitJson,editEvents})=>{circuitJson=JSON.parse(JSON.stringify(circuitJson));for(let editEvent of editEvents)if(editEvent.edit_event_type==="edit_pcb_component_location"){let component=circuitJson.find(e7=>e7.type==="pcb_component"&&e7.pcb_component_id===editEvent.pcb_component_id);if((!component||component.center.x!==editEvent.new_center.x||component.center.y!==editEvent.new_center.y)&&editEvent.original_center){let mat=translate2(editEvent.new_center.x-editEvent.original_center.x,editEvent.new_center.y-editEvent.original_center.y);circuitJson=circuitJson.map(e7=>e7.pcb_component_id!==editEvent.pcb_component_id?e7:transformPCBElement(e7,mat))}}else editEvent.edit_event_type==="edit_schematic_component_location"?circuitJson=circuitJson.map(e7=>e7.type==="schematic_component"&&e7.schematic_component_id===editEvent.schematic_component_id?{...e7,center:editEvent.new_center}:e7):editEvent.edit_event_type==="edit_pcb_trace_hint"&&(circuitJson=applyTraceHintEditEvent(circuitJson,editEvent));return circuitJson},getPreservedTraceConnectionName=trace=>trace.source_trace_id??trace.connection_name??trace.pcb_trace_id,getConnectedToIdsForPreservedTrace=({trace,connectionName,scopedDb,sharedConnMap})=>{let connectedToIds=new Set,addConnectedId=id3=>{if(!id3)return;connectedToIds.add(id3);let connectivityNetId=sharedConnMap.getNetConnectedToId(id3);if(connectivityNetId){connectedToIds.add(connectivityNetId);for(let connectedId of sharedConnMap.getIdsConnectedToNet(connectivityNetId))connectedToIds.add(connectedId)}};addConnectedId(connectionName),addConnectedId(trace.source_trace_id);let sourceTrace=trace.source_trace_id?scopedDb.source_trace.get(trace.source_trace_id):null;if(sourceTrace){for(let id3 of sourceTrace.connected_source_net_ids??[])addConnectedId(id3);for(let id3 of sourceTrace.connected_source_port_ids??[])addConnectedId(id3)}for(let routePoint of trace.route??[])if(routePoint.route_type==="wire")for(let pcbPortId of[routePoint.start_pcb_port_id,routePoint.end_pcb_port_id]){addConnectedId(pcbPortId);let pcbPort=pcbPortId?scopedDb.pcb_port.get(pcbPortId):null;addConnectedId(pcbPort?.source_port_id)}return Array.from(connectedToIds)},getPreservedRoutedSubcircuitTraces=({scopedDb,currentSubcircuitId,relevantSubcircuitIds,sharedConnMap})=>scopedDb.pcb_trace.list().filter(trace=>trace.subcircuit_id?currentSubcircuitId?trace.subcircuit_id!==currentSubcircuitId&&relevantSubcircuitIds.has(trace.subcircuit_id):!0:!1).map(trace=>{let preservedTrace=trace,connectionName=getPreservedTraceConnectionName(preservedTrace);return{type:"pcb_trace",pcb_trace_id:trace.pcb_trace_id,source_trace_id:trace.source_trace_id,connection_name:connectionName,connectedTo:getConnectedToIdsForPreservedTrace({trace:preservedTrace,connectionName,scopedDb,sharedConnMap}),route:trace.route}}).filter(trace=>trace.route.length>=2),COPPER_POUR_RECT_HEIGHT=.5,dedupeStrings2=values=>Array.from(new Set(values.filter(value=>!!value))),getLayerName=layer=>typeof layer=="string"?layer:layer.name,createCopperPourObstacle=({layer,connectedTo,center:center2,width,height})=>({type:"rect",layers:[layer],center:center2,width,height,connectedTo,isCopperPour:!0}),getCopperPourBoundary=({outline,group,board})=>outline&&outline.length>=3?outline:group?.outline&&group.outline.length>=3?group.outline:board?.outline&&board.outline.length>=3?board.outline:null,getCopperPourBoundsRect=({group,board})=>group?.width&&group.height?{center:group.center,width:group.width,height:group.height}:board?.width&&board.height?{center:board.center,width:board.width,height:board.height}:null,getCopperPourConnectedTo=(net,connMap)=>dedupeStrings2([net.source_net_id,net.subcircuit_connectivity_map_key,net.source_net_id?connMap.getNetConnectedToId(net.source_net_id):null]),getUnbrokenCopperPourObstacles=({connMap,subcircuitComponent,board,group})=>{if(!subcircuitComponent)return[];let obstacles=[],copperPours=subcircuitComponent.selectAll("copperpour");for(let copperPour of copperPours){let props=copperPour._parsedProps;if(!props.unbroken)continue;let net=copperPour.getSubcircuit().selectOne(props.connectsTo);if(!net?.source_net_id)continue;let layer=getLayerName(props.layer),connectedTo=getCopperPourConnectedTo(net,connMap);if(connectedTo.length===0)continue;let boundary=getCopperPourBoundary({outline:props.outline,group,board});if(boundary){let rects=fillPolygonWithRects(boundary,{rectHeight:COPPER_POUR_RECT_HEIGHT});if(rects.length>0){obstacles.push(...rects.map(rect=>createCopperPourObstacle({layer,connectedTo,center:rect.center,width:rect.width,height:rect.height})));continue}}let boundsRect=getCopperPourBoundsRect({group,board});boundsRect&&obstacles.push(createCopperPourObstacle({layer,connectedTo,center:boundsRect.center,width:boundsRect.width,height:boundsRect.height}))}return obstacles},getSimpleRouteJsonFromCircuitJson=({db:db3,circuitJson,subcircuit_id,minTraceWidth,minTraceToPadEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance,minViaHoleDiameter,minViaPadDiameter,nominalTraceWidth,subcircuitComponent})=>{if(!db3&&circuitJson&&(db3=su2(circuitJson)),!db3)throw new Error("db or circuitJson is required");let traceHints=db3.pcb_trace_hint.list(),relevantSubcircuitIds=subcircuit_id?new Set([subcircuit_id]):null;if(subcircuit_id){let descendantSubcircuitIds=getDescendantSubcircuitIds2(db3,subcircuit_id);for(let id3 of descendantSubcircuitIds)relevantSubcircuitIds.add(id3)}let subcircuitElements=(circuitJson??db3.toArray()).filter(e7=>!subcircuit_id||"subcircuit_id"in e7&&relevantSubcircuitIds.has(e7.subcircuit_id)),board=null,subcircuitIsBoard=!1;if(subcircuit_id){let source_group_id=subcircuit_id.replace(/^subcircuit_/,""),source_board3=db3.source_board.getWhere({source_group_id});source_board3&&(board=db3.pcb_board.getWhere({source_board_id:source_board3.source_board_id}),board&&(subcircuitIsBoard=!0))}board||(board=db3.pcb_board.list()[0]),db3=su2(subcircuitElements);let pcbGroup=subcircuit_id?db3.pcb_group.getWhere({subcircuit_id}):void 0,sharedConnMap=getFullConnectivityMapFromCircuitJson(subcircuitElements),breakoutPoints=db3.pcb_breakout_point.list().filter(bp3=>!subcircuit_id||relevantSubcircuitIds?.has(bp3.subcircuit_id)),obstacles=getObstaclesFromCircuitJson2([...db3.pcb_component.list(),...db3.pcb_smtpad.list(),...db3.pcb_plated_hole.list(),...db3.pcb_hole.list(),...db3.pcb_via.list(),...db3.pcb_keepout.list(),...db3.pcb_cutout.list()].filter(e7=>!subcircuit_id||relevantSubcircuitIds?.has(e7.subcircuit_id)),sharedConnMap);obstacles.push(...getUnbrokenCopperPourObstacles({connMap:sharedConnMap,subcircuitComponent,board,group:pcbGroup}));let preservedRoutedSubcircuitTraces=getPreservedRoutedSubcircuitTraces({scopedDb:db3,currentSubcircuitId:subcircuit_id,relevantSubcircuitIds,sharedConnMap});for(let obstacle of obstacles){let additionalIds=obstacle.connectedTo.flatMap(id3=>sharedConnMap.getIdsConnectedToNet(id3));obstacle.connectedTo.push(...additionalIds)}let internalConnections=db3.source_component_internal_connection.list(),sourcePortIdToInternalConnectionId=new Map;for(let ic2 of internalConnections)for(let sourcePortId of ic2.source_port_ids)sourcePortIdToInternalConnectionId.set(sourcePortId,ic2.source_component_internal_connection_id);let pcbElementIdToSourcePortId=new Map;for(let pcbPort of db3.pcb_port.list())if(pcbPort.source_port_id){let smtpad2=db3.pcb_smtpad.getWhere({pcb_port_id:pcbPort.pcb_port_id});smtpad2&&pcbElementIdToSourcePortId.set(smtpad2.pcb_smtpad_id,pcbPort.source_port_id);let platedHole=db3.pcb_plated_hole.getWhere({pcb_port_id:pcbPort.pcb_port_id});platedHole&&pcbElementIdToSourcePortId.set(platedHole.pcb_plated_hole_id,pcbPort.source_port_id)}for(let obstacle of obstacles)for(let connectedId of obstacle.connectedTo){let sourcePortId=pcbElementIdToSourcePortId.get(connectedId);if(sourcePortId){let internalConnectionId=sourcePortIdToInternalConnectionId.get(sourcePortId);if(internalConnectionId){obstacle.offBoardConnectsTo=[internalConnectionId],obstacle.netIsAssignable=!0;break}}}let allPoints=obstacles.flatMap(o6=>[{x:o6.center.x-o6.width/2,y:o6.center.y-o6.height/2},{x:o6.center.x+o6.width/2,y:o6.center.y+o6.height/2}]).concat(board?.outline??[]),bounds,useGroupBoundsAsSrjBounds=!!(pcbGroup?.width&&pcbGroup.height&&subcircuit_id&&!subcircuitIsBoard);if(useGroupBoundsAsSrjBounds?bounds={minX:pcbGroup.center.x-pcbGroup.width/2,maxX:pcbGroup.center.x+pcbGroup.width/2,minY:pcbGroup.center.y-pcbGroup.height/2,maxY:pcbGroup.center.y+pcbGroup.height/2}:board&&!board.outline?bounds={minX:board.center.x-board.width/2,maxX:board.center.x+board.width/2,minY:board.center.y-board.height/2,maxY:board.center.y+board.height/2}:bounds={minX:Math.min(...allPoints.map(p5=>p5.x))-1,maxX:Math.max(...allPoints.map(p5=>p5.x))+1,minY:Math.min(...allPoints.map(p5=>p5.y))-1,maxY:Math.max(...allPoints.map(p5=>p5.y))+1},pcbGroup?.width&&pcbGroup.height&&!useGroupBoundsAsSrjBounds){let groupBounds={minX:pcbGroup.center.x-pcbGroup.width/2,maxX:pcbGroup.center.x+pcbGroup.width/2,minY:pcbGroup.center.y-pcbGroup.height/2,maxY:pcbGroup.center.y+pcbGroup.height/2};bounds={minX:Math.min(bounds.minX,groupBounds.minX),maxX:Math.max(bounds.maxX,groupBounds.maxX),minY:Math.min(bounds.minY,groupBounds.minY),maxY:Math.max(bounds.maxY,groupBounds.maxY)}}let sourceTraceIdsAlreadyPreservedAsSrjTraces=new Set(db3.pcb_trace.list().filter(t54=>t54.source_trace_id?subcircuit_id?t54.subcircuit_id===subcircuit_id:t54.subcircuit_id?db3.source_trace.get(t54.source_trace_id)?.subcircuit_id===t54.subcircuit_id:!1:!1).map(t54=>t54.source_trace_id).filter(id3=>!!id3)),sourcePortIdToBreakoutPoint=new Map;for(let bp3 of breakoutPoints){let spId=bp3.source_port_id;spId&&sourcePortIdToBreakoutPoint.set(spId,bp3)}let directTraceConnections=db3.source_trace.list().filter(trace=>!sourceTraceIdsAlreadyPreservedAsSrjTraces.has(trace.source_trace_id)).filter(trace=>!subcircuit_id||trace.subcircuit_id===subcircuit_id).map(trace=>{let connectedPorts=trace.connected_source_port_ids.map(id3=>{let source_port3=db3.source_port.get(id3),pcb_port3=db3.pcb_port.getWhere({source_port_id:id3});return{...source_port3,...pcb_port3}});if(connectedPorts.length<2)return null;let[portA,portB]=connectedPorts;if(portA.x===void 0||portA.y===void 0)return console.error(`(source_port_id: ${portA.source_port_id}) for trace ${trace.source_trace_id} does not have x/y coordinates. Skipping this trace.`),null;if(portB.x===void 0||portB.y===void 0)return console.error(`(source_port_id: ${portB.source_port_id}) for trace ${trace.source_trace_id} does not have x/y coordinates. Skipping this trace.`),null;let layerA=portA.layers?.[0]??"top",layerB=portB.layers?.[0]??"top",matchingHints=traceHints.filter(hint=>hint.pcb_port_id===portA.pcb_port_id||hint.pcb_port_id===portB.pcb_port_id),hintPoints=[];for(let hint of matchingHints){let layer=db3.pcb_port.get(hint.pcb_port_id)?.layers?.[0]??"top";for(let pt3 of hint.route)hintPoints.push({x:pt3.x,y:pt3.y,layer})}let getPortOrBreakoutPoint=(port,layer,sourcePortId)=>{let bp3=sourcePortIdToBreakoutPoint.get(sourcePortId);return bp3&&bp3.subcircuit_id!==subcircuit_id?{x:bp3.x,y:bp3.y,layer}:{x:port.x,y:port.y,layer,pointId:port.pcb_port_id,pcb_port_id:port.pcb_port_id}};return{name:trace.source_trace_id??sharedConnMap.getNetConnectedToId(trace.source_trace_id)??"",source_trace_id:trace.source_trace_id,nominalTraceWidth:trace.min_trace_thickness,width:trace.min_trace_thickness,pointsToConnect:[getPortOrBreakoutPoint(portA,layerA,trace.connected_source_port_ids[0]),...hintPoints,getPortOrBreakoutPoint(portB,layerB,trace.connected_source_port_ids[1])]}}).filter(c6=>c6!==null),source_nets=db3.source_net.list().filter(e7=>!subcircuit_id||e7.subcircuit_id===subcircuit_id),connectionsFromNets=[],connectionFromNetId=new Map,handledNetConnectivityKeys=new Set,sourceTracesEligibleForNetConnections=db3.source_trace.list().filter(st3=>subcircuit_id||!sourceTraceIdsAlreadyPreservedAsSrjTraces.has(st3.source_trace_id)),getSourceConnectivityKey=id3=>id3?sharedConnMap.getNetConnectedToId(id3)??id3:null;for(let net of source_nets){let netConnectivityKey=getSourceConnectivityKey(net.source_net_id);if(!netConnectivityKey||handledNetConnectivityKeys.has(netConnectivityKey))continue;handledNetConnectivityKeys.add(netConnectivityKey);let connectedSourceNetIds=source_nets.filter(sourceNet=>getSourceConnectivityKey(sourceNet.source_net_id)===netConnectivityKey).map(sourceNet=>sourceNet.source_net_id),connectedSourceTraces=sourceTracesEligibleForNetConnections.filter(st3=>[st3.source_trace_id,...st3.connected_source_net_ids??[]].some(id3=>getSourceConnectivityKey(id3)===netConnectivityKey)),nominalTraceWidthFromConnectedTraces;for(let sourceTrace of connectedSourceTraces)sourceTrace.min_trace_thickness!==void 0&&(nominalTraceWidthFromConnectedTraces=Math.max(nominalTraceWidthFromConnectedTraces??0,sourceTrace.min_trace_thickness));let pointsToConnect=[],addedPointIds=new Set;for(let st3 of connectedSourceTraces){let pcb_ports=db3.pcb_port.list().filter(p5=>st3.connected_source_port_ids.includes(p5.source_port_id));for(let p5 of pcb_ports)addedPointIds.has(p5.pcb_port_id)||(addedPointIds.add(p5.pcb_port_id),pointsToConnect.push({x:p5.x,y:p5.y,layer:p5.layers?.[0]??"top",pointId:p5.pcb_port_id,pcb_port_id:p5.pcb_port_id}))}let connection={name:net.source_net_id??sharedConnMap.getNetConnectedToId(net.source_net_id),nominalTraceWidth:nominalTraceWidthFromConnectedTraces,width:nominalTraceWidthFromConnectedTraces,pointsToConnect};connectionsFromNets.push(connection);for(let sourceNetId of connectedSourceNetIds)connectionFromNetId.set(sourceNetId,connection)}let connectionsFromBreakoutPoints=[];for(let bp3 of breakoutPoints){let bpSourcePortId=bp3.source_port_id,pt3={x:bp3.x,y:bp3.y,layer:"top"};if(bpSourcePortId){let pcb_port3=db3.pcb_port.getWhere({source_port_id:bpSourcePortId});if(!pcb_port3)continue;let portPt={x:pcb_port3.x,y:pcb_port3.y,layer:pcb_port3.layers?.[0]??"top",pointId:pcb_port3.pcb_port_id,pcb_port_id:pcb_port3.pcb_port_id};if(bp3.subcircuit_id===subcircuit_id){connectionsFromBreakoutPoints.push({name:bpSourcePortId,source_trace_id:bp3.source_trace_id,pointsToConnect:[portPt,pt3]});continue}bp3.source_trace_id||connectionsFromBreakoutPoints.push({name:bpSourcePortId,pointsToConnect:[portPt,pt3]});continue}if(bp3.source_net_id){let conn=connectionFromNetId.get(bp3.source_net_id);conn?conn.pointsToConnect.push(pt3):connectionsFromBreakoutPoints.push({name:bp3.source_net_id,pointsToConnect:[pt3]})}}let allConns=[...directTraceConnections,...connectionsFromNets,...connectionsFromBreakoutPoints];if(subcircuit_id){let pointIdToConn=new Map;for(let conn of allConns)for(let pt3 of conn.pointsToConnect)pt3.pointId&&pointIdToConn.set(pt3.pointId,conn);let existingTraces=db3.pcb_trace.list().filter(t54=>relevantSubcircuitIds?.has(t54.subcircuit_id));for(let tr3 of existingTraces){let tracePortIds=new Set;for(let seg of tr3.route)seg.start_pcb_port_id&&tracePortIds.add(seg.start_pcb_port_id),seg.end_pcb_port_id&&tracePortIds.add(seg.end_pcb_port_id);if(tracePortIds.size<2)continue;let firstId=tracePortIds.values().next().value;if(!firstId)continue;let conn=pointIdToConn.get(firstId);conn&&[...tracePortIds].every(pid=>pointIdToConn.get(pid)===conn)&&(conn.externallyConnectedPointIds??(conn.externallyConnectedPointIds=[]),conn.externallyConnectedPointIds.push([...tracePortIds]))}}let resolvedMinViaHoleDiameter=minViaHoleDiameter??board?.min_via_hole_diameter,resolvedMinViaPadDiameter=minViaPadDiameter??board?.min_via_pad_diameter,resolvedMinTraceToPadEdgeClearance=minTraceToPadEdgeClearance??board?.min_trace_to_pad_edge_clearance,resolvedMinViaEdgeToPadEdgeClearance=minViaEdgeToPadEdgeClearance??board?.min_via_edge_to_pad_edge_clearance,resolvedMinViaHoleEdgeToViaHoleEdgeClearance=minViaHoleEdgeToViaHoleEdgeClearance??board?.min_via_hole_edge_to_via_hole_edge_clearance,resolvedMinPlatedHoleDrillEdgeToDrillEdgeClearance=minPlatedHoleDrillEdgeToDrillEdgeClearance??board?.min_plated_hole_drill_edge_to_drill_edge_clearance,resolvedMinPadEdgeToPadEdgeClearance=minPadEdgeToPadEdgeClearance??board?.min_pad_edge_to_pad_edge_clearance,resolvedMinBoardEdgeClearance=minBoardEdgeClearance??board?.min_board_edge_clearance;return{simpleRouteJson:{bounds,obstacles,connections:allConns,traces:preservedRoutedSubcircuitTraces.length>0?preservedRoutedSubcircuitTraces:void 0,layerCount:board?.num_layers??2,minTraceWidth:minTraceWidth??board?.min_trace_width??.1,minViaDiameter:resolvedMinViaPadDiameter,minViaHoleDiameter:resolvedMinViaHoleDiameter,minViaPadDiameter:resolvedMinViaPadDiameter,min_via_hole_diameter:resolvedMinViaHoleDiameter,min_via_pad_diameter:resolvedMinViaPadDiameter,minTraceToPadEdgeClearance:resolvedMinTraceToPadEdgeClearance,minViaEdgeToPadEdgeClearance:resolvedMinViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance:resolvedMinViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance:resolvedMinPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance:resolvedMinPadEdgeToPadEdgeClearance,minBoardEdgeClearance:resolvedMinBoardEdgeClearance,nominalTraceWidth,outline:board?.outline?.map(point6=>({...point6}))},connMap:sharedConnMap}},unroutedElementTypes=new Set(["pcb_trace","pcb_trace_error"]),unrouteCircuitJson=circuitJson=>circuitJson.filter(element=>!unroutedElementTypes.has(element.type)),getPhaseTimingsFromRenderEvents=renderEvents=>{let phaseTimings={};if(!renderEvents)return phaseTimings;for(let renderPhase of orderedRenderPhases)phaseTimings[renderPhase]=0;let startEvents=new Map;for(let event of renderEvents){let[,,phase,eventType]=event.type.split(":");if(eventType==="start"){startEvents.set(`${phase}:${event.renderId}`,event);continue}if(eventType==="end"){let startEvent=startEvents.get(`${phase}:${event.renderId}`);if(startEvent){let duration=event.createdAt-startEvent.createdAt;phaseTimings[phase]=(phaseTimings[phase]||0)+duration}}}return phaseTimings},normalizePinLabels=inputPinLabels=>{let unqInputPinLabels=inputPinLabels.map(labels=>[...new Set(labels)]),result=unqInputPinLabels.map(()=>[]),desiredNumbers=unqInputPinLabels.map(()=>null);for(let i3=0;i3<unqInputPinLabels.length;i3++)for(let label of unqInputPinLabels[i3])if(/^\d+$/.test(label)){desiredNumbers[i3]=Number.parseInt(label);break}let highestPinNumber=0,alreadyAcceptedDesiredNumbers=new Set;for(let i3=0;i3<desiredNumbers.length;i3++){let desiredNumber=desiredNumbers[i3];if(desiredNumber===null||desiredNumber<1)continue;if(!alreadyAcceptedDesiredNumbers.has(desiredNumber)){alreadyAcceptedDesiredNumbers.add(desiredNumber),result[i3].push(`pin${desiredNumber}`),highestPinNumber=Math.max(highestPinNumber,desiredNumber);continue}let existingAltsForPin=0;for(let label of result[i3])label.startsWith(`pin${desiredNumber}_alt`)&&existingAltsForPin++;result[i3].push(`pin${desiredNumber}_alt${existingAltsForPin+1}`)}for(let i3=0;i3<result.length;i3++)result[i3][0]?.includes("_alt")&&(highestPinNumber++,result[i3].unshift(`pin${highestPinNumber}`));for(let i3=0;i3<result.length;i3++)result[i3].length===0&&(highestPinNumber++,result[i3].push(`pin${highestPinNumber}`));let totalLabelCounts={};for(let inputLabels of unqInputPinLabels)for(let label of inputLabels)/^\d+$/.test(label)||(totalLabelCounts[label]=(totalLabelCounts[label]??0)+1);let incrementalLabelCounts={};for(let i3=0;i3<unqInputPinLabels.length;i3++){let inputLabels=unqInputPinLabels[i3];for(let label of inputLabels)/^\d+$/.test(label)||(totalLabelCounts[label]===1?result[i3].push(label):(incrementalLabelCounts[label]=(incrementalLabelCounts[label]??0)+1,result[i3].push(`${label}${incrementalLabelCounts[label]}`)))}return result},TraceHint=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"matchedPort",null)}get config(){return{componentName:"TraceHint",zodProps:traceHintProps}}doInitialPortMatching(){let{db:db3}=this.root,{_parsedProps:props,parent}=this;if(!parent)return;if(parent.componentName==="Trace"){this.renderError(`Port inference inside trace is not yet supported (${this})`);return}if(!parent)throw new Error("TraceHint has no parent");if(!props.for){this.renderError(`TraceHint has no for property (${this})`);return}let port=parent.selectOne(props.for,{type:"port"});port||this.renderError(`${this} could not find port for selector "${props.for}"`),this.matchedPort=port,port.registerMatch(this)}getPcbRouteHints(){let{_parsedProps:props}=this,offsets=props.offset?[props.offset]:props.offsets;if(!offsets)return[];let globalTransform=this._computePcbGlobalTransformBeforeLayout();return offsets.map(offset=>({...applyToPoint2(globalTransform,offset),via:offset.via,to_layer:offset.to_layer,trace_width:offset.trace_width}))}doInitialPcbTraceHintRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this;db3.pcb_trace_hint.insert({pcb_component_id:this.matchedPort?.pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,route:this.getPcbRouteHints()})}},SUPPORTED_COMPONENT_FIELDS=new Set(["x","y","minx","maxx","miny","maxy","width","height"]);function Group_doInitialPcbCalcPlacementResolution(group){if(group.root?.pcbDisabled||!group.isSubcircuit)return;let{db:db3}=group.root,normalComponentNameMap=group.getNormalComponentNameMap?.()??new Map,allNormalComponents=collectNormalComponentsInSubcircuit(group),namedComponentVars={};for(let component of allNormalComponents)updateVarsForNamedComponent(component,namedComponentVars);let candidatesByName=new Map,inDegree=new Map,dependents=new Map;for(let component of allNormalComponents){if(!shouldResolvePlacementInCalcPhase(component))continue;let refs=getComponentRefsForCalcPlacement(component);if(!component.name)throw new Error(`Invalid pcb position expression for ${component.getString()}: component-relative calc requires the component to have a name`);candidatesByName.set(component.name,{component,refs}),inDegree.set(component.name,0)}for(let[candidateName,candidate]of candidatesByName.entries()){let referencedCandidateNames=new Set;for(let token of candidate.refs){let{referencePath,field}=parseComponentReferenceToken(token);if(!SUPPORTED_COMPONENT_FIELDS.has(field))throw new Error(`Invalid pcb position expression for ${candidate.component.getString()}: unsupported component field "${field}" in "${token}"`);let referencedComponentName=resolveReferencedComponentName({token,referencePath,candidate,normalComponentNameMap});candidatesByName.has(referencedComponentName)&&referencedComponentName!==candidateName&&referencedCandidateNames.add(referencedComponentName)}for(let referencedComponentName of referencedCandidateNames)inDegree.set(candidateName,(inDegree.get(candidateName)??0)+1),dependents.has(referencedComponentName)||dependents.set(referencedComponentName,new Set),dependents.get(referencedComponentName).add(candidateName)}let queue=[...inDegree.entries()].filter(([,degree])=>degree===0).map(([name])=>name),resolvedCount=0;for(;queue.length>0;){let name=queue.shift(),candidate=candidatesByName.get(name);if(candidate){resolveCandidatePlacement(candidate.component,namedComponentVars),resolvedCount++;for(let dependentName of dependents.get(name)??[]){let nextDegree=(inDegree.get(dependentName)??0)-1;inDegree.set(dependentName,nextDegree),nextDegree===0&&queue.push(dependentName)}}}if(resolvedCount<candidatesByName.size){let unresolvedNames=[...candidatesByName.keys()].filter(name=>(inDegree.get(name)??0)>0);throw new Error(`Circular pcb position calc references detected among: ${unresolvedNames.join(", ")}`)}function resolveCandidatePlacement(component,componentVars){if(!component.pcb_component_id)return;let pcbComponent=db3.pcb_component.get(component.pcb_component_id);if(!pcbComponent)return;let rawPcbX=component._parsedProps.pcbX,rawPcbY=component._parsedProps.pcbY,rawComponentProps=component.props,rawPcbLeftEdgeX=component._parsedProps.pcbLeftEdgeX??rawComponentProps.pcbLeftEdgeX,rawPcbRightEdgeX=component._parsedProps.pcbRightEdgeX??rawComponentProps.pcbRightEdgeX,rawPcbTopEdgeY=component._parsedProps.pcbTopEdgeY??rawComponentProps.pcbTopEdgeY,rawPcbBottomEdgeY=component._parsedProps.pcbBottomEdgeY??rawComponentProps.pcbBottomEdgeY;if(rawPcbLeftEdgeX!==void 0&&rawPcbRightEdgeX!==void 0)throw new Error(`${component.componentName} cannot set both pcbLeftEdgeX and pcbRightEdgeX`);if(rawPcbTopEdgeY!==void 0&&rawPcbBottomEdgeY!==void 0)throw new Error(`${component.componentName} cannot set both pcbTopEdgeY and pcbBottomEdgeY`);let componentWidth=pcbComponent.width??0,componentHeight=pcbComponent.height??0,nextCenter={x:pcbComponent.center.x,y:pcbComponent.center.y};if(rawPcbX!==void 0){let resolvedPcbX=component.resolvePcbCoordinate({rawValue:rawPcbX,axis:"pcbX",allowComponentVariables:!0,componentVariables:componentVars});component._resolvedPcbCalcOffsetX=resolvedPcbX,nextCenter.x=resolvedPcbX}else if(rawPcbLeftEdgeX!==void 0){let resolvedPcbX=component.resolvePcbCoordinate({rawValue:rawPcbLeftEdgeX,axis:"pcbX",allowComponentVariables:!0,componentVariables:componentVars,propertyName:"pcbLeftEdgeX"})+componentWidth/2;component._resolvedPcbCalcOffsetX=resolvedPcbX,nextCenter.x=resolvedPcbX}else if(rawPcbRightEdgeX!==void 0){let resolvedPcbX=component.resolvePcbCoordinate({rawValue:rawPcbRightEdgeX,axis:"pcbX",allowComponentVariables:!0,componentVariables:componentVars,propertyName:"pcbRightEdgeX"})-componentWidth/2;component._resolvedPcbCalcOffsetX=resolvedPcbX,nextCenter.x=resolvedPcbX}if(rawPcbY!==void 0){let resolvedPcbY=component.resolvePcbCoordinate({rawValue:rawPcbY,axis:"pcbY",allowComponentVariables:!0,componentVariables:componentVars});component._resolvedPcbCalcOffsetY=resolvedPcbY,nextCenter.y=resolvedPcbY}else if(rawPcbTopEdgeY!==void 0){let resolvedPcbY=component.resolvePcbCoordinate({rawValue:rawPcbTopEdgeY,axis:"pcbY",allowComponentVariables:!0,componentVariables:componentVars,propertyName:"pcbTopEdgeY"})-componentHeight/2;component._resolvedPcbCalcOffsetY=resolvedPcbY,nextCenter.y=resolvedPcbY}else if(rawPcbBottomEdgeY!==void 0){let resolvedPcbY=component.resolvePcbCoordinate({rawValue:rawPcbBottomEdgeY,axis:"pcbY",allowComponentVariables:!0,componentVariables:componentVars,propertyName:"pcbBottomEdgeY"})+componentHeight/2;component._resolvedPcbCalcOffsetY=resolvedPcbY,nextCenter.y=resolvedPcbY}component._repositionOnPcb(nextCenter),updateVarsForNamedComponent(component,componentVars)}}function shouldResolvePlacementInCalcPhase(component){let parsedProps=component._parsedProps,rawProps=component.props,pcbX=parsedProps.pcbX,pcbY=parsedProps.pcbY,pcbLeftEdgeX=parsedProps.pcbLeftEdgeX??rawProps.pcbLeftEdgeX,pcbRightEdgeX=parsedProps.pcbRightEdgeX??rawProps.pcbRightEdgeX,pcbTopEdgeY=parsedProps.pcbTopEdgeY??rawProps.pcbTopEdgeY,pcbBottomEdgeY=parsedProps.pcbBottomEdgeY??rawProps.pcbBottomEdgeY;return pcbLeftEdgeX!==void 0||pcbRightEdgeX!==void 0||pcbTopEdgeY!==void 0||pcbBottomEdgeY!==void 0?!0:typeof pcbX=="string"||typeof pcbY=="string"}function collectNormalComponentsInSubcircuit(group){let components=[],walk=node=>{node._isNormalComponent&&components.push(node);for(let child of node.children)child.isSubcircuit||walk(child)};for(let child of group.children)child.isSubcircuit||walk(child);return components}function getComponentRefsForCalcPlacement(component){let refs=new Set,rawPcbX=component._parsedProps.pcbX,rawPcbY=component._parsedProps.pcbY,rawComponentProps=component.props,rawPcbLeftEdgeX=component._parsedProps.pcbLeftEdgeX??rawComponentProps.pcbLeftEdgeX,rawPcbRightEdgeX=component._parsedProps.pcbRightEdgeX??rawComponentProps.pcbRightEdgeX,rawPcbTopEdgeY=component._parsedProps.pcbTopEdgeY??rawComponentProps.pcbTopEdgeY,rawPcbBottomEdgeY=component._parsedProps.pcbBottomEdgeY??rawComponentProps.pcbBottomEdgeY,addRefs=rawValue=>{if(typeof rawValue!="string")return;let identifiers=extractCalcIdentifiers(rawValue);for(let identifier of identifiers)identifier.startsWith("board.")||refs.add(identifier)};return addRefs(rawPcbX),addRefs(rawPcbY),addRefs(rawPcbLeftEdgeX),addRefs(rawPcbRightEdgeX),addRefs(rawPcbTopEdgeY),addRefs(rawPcbBottomEdgeY),refs}function parseComponentReferenceToken(token){let dotIndex=token.lastIndexOf(".");if(dotIndex<=0||dotIndex===token.length-1)throw new Error(`Invalid component reference token: "${token}"`);return{referencePath:token.slice(0,dotIndex),field:token.slice(dotIndex+1).toLowerCase()}}function resolveReferencedComponentName(params){let{token,referencePath,candidate,normalComponentNameMap}=params,directComponents=normalComponentNameMap.get(referencePath);if(directComponents&&directComponents.length>0){if(directComponents.length>1)throw new Error(`Invalid pcb position expression for ${candidate.component.getString()}: ambiguous component reference "${referencePath}" in "${token}"`);return referencePath}let bestMatch=null;for(let componentName of normalComponentNameMap.keys())referencePath.startsWith(`${componentName}.`)&&(!bestMatch||componentName.length>bestMatch.length)&&(bestMatch=componentName);if(!bestMatch)throw new Error(`Invalid pcb position expression for ${candidate.component.getString()}: unknown component reference "${referencePath}" in "${token}"`);return bestMatch}function updateVarsForNamedComponent(component,vars){if(!component.name||!component.pcb_component_id||!component.root)return;let pcbComponent=component.root.db.pcb_component.get(component.pcb_component_id);if(!pcbComponent)return;let width=pcbComponent.width??0,height=pcbComponent.height??0,x4=pcbComponent.center.x,y3=pcbComponent.center.y;setSubcircuitPcbComponentCalcVariables({vars,componentName:component.name,position:{x:x4,y:y3},size:{width,height}});let padElementsByReference=collectPadElementsByReference(component);for(let[referencePath,elements]of padElementsByReference.entries()){let bounds=getBoundsOfPcbElements(elements),minX=bounds.minX,maxX=bounds.maxX,minY=bounds.minY,maxY=bounds.maxY;vars[`${referencePath}.x`]=(minX+maxX)/2,vars[`${referencePath}.y`]=(minY+maxY)/2,vars[`${referencePath}.width`]=maxX-minX,vars[`${referencePath}.height`]=maxY-minY,vars[`${referencePath}.minX`]=minX,vars[`${referencePath}.maxX`]=maxX,vars[`${referencePath}.minY`]=minY,vars[`${referencePath}.maxY`]=maxY}}function collectPadElementsByReference(component){let refsToElements=new Map;if(!component.name||!component.pcb_component_id||!component.root)return refsToElements;let{db:db3}=component.root,padElements=[...db3.pcb_smtpad.list({pcb_component_id:component.pcb_component_id}),...db3.pcb_plated_hole.list({pcb_component_id:component.pcb_component_id})];for(let pad2 of padElements){let aliases2=new Set;for(let hint of pad2.port_hints??[])typeof hint=="string"&&hint.length>0&&aliases2.add(hint);let pcbPortId=pad2.pcb_port_id;if(pcbPortId){let pcbPort=db3.pcb_port.get(pcbPortId),sourcePort=pcbPort?.source_port_id?db3.source_port.get(pcbPort.source_port_id):null;sourcePort?.name&&aliases2.add(sourcePort.name),sourcePort?.pin_number!=null&&aliases2.add(`pin${sourcePort.pin_number}`)}for(let alias of aliases2){let referencePath=`${component.name}.${alias}`;refsToElements.has(referencePath)||refsToElements.set(referencePath,[]),refsToElements.get(referencePath).push(pad2)}}return refsToElements}function Group_doInitialPcbComponentAnchorAlignment(group){if(group.root?.pcbDisabled||!group.pcb_group_id)return;let pcbPositionAnchor=group._parsedProps?.pcbPositionAnchor;if(!pcbPositionAnchor)return;let targetPosition=group._getGlobalPcbPositionBeforeLayout(),{pcbX,pcbY}=group._parsedProps;if(pcbX===void 0&&pcbY===void 0)return;let{db:db3}=group.root,pcbGroup=db3.pcb_group.get(group.pcb_group_id);if(!pcbGroup)return;let width=pcbGroup.width,height=pcbGroup.height,{center:center2}=pcbGroup;if(pcbGroup.outline&&pcbGroup.outline.length>0){let bounds2=getBoundsFromPoints(pcbGroup.outline);bounds2&&(width=bounds2.maxX-bounds2.minX,height=bounds2.maxY-bounds2.minY)}if(!width||!height)return;let bounds={left:center2.x-width/2,right:center2.x+width/2,top:center2.y+height/2,bottom:center2.y-height/2},currentCenter={...center2},anchorPos=null;if(new Set(["center","top_left","top_center","top_right","center_left","center_right","bottom_left","bottom_center","bottom_right"]).has(pcbPositionAnchor))switch(pcbPositionAnchor){case"center":anchorPos=currentCenter;break;case"top_left":anchorPos={x:bounds.left,y:bounds.top};break;case"top_center":anchorPos={x:currentCenter.x,y:bounds.top};break;case"top_right":anchorPos={x:bounds.right,y:bounds.top};break;case"center_left":anchorPos={x:bounds.left,y:currentCenter.y};break;case"center_right":anchorPos={x:bounds.right,y:currentCenter.y};break;case"bottom_left":anchorPos={x:bounds.left,y:bounds.bottom};break;case"bottom_center":anchorPos={x:currentCenter.x,y:bounds.bottom};break;case"bottom_right":anchorPos={x:bounds.right,y:bounds.bottom};break}if(!anchorPos)return;let newCenter={...currentCenter};targetPosition.x!==void 0&&(newCenter.x+=targetPosition.x-anchorPos.x),targetPosition.y!==void 0&&(newCenter.y+=targetPosition.y-anchorPos.y),(Math.abs(newCenter.x-currentCenter.x)>1e-6||Math.abs(newCenter.y-currentCenter.y)>1e-6)&&(group._repositionOnPcb(newCenter),db3.pcb_group.update(group.pcb_group_id,{center:newCenter})),db3.pcb_group.update(group.pcb_group_id,{anchor_position:targetPosition,anchor_alignment:pcbPositionAnchor,display_offset_x:pcbX,display_offset_y:pcbY})}var Group_doInitialPcbLayoutFlex=group=>{let{db:db3}=group.root,{_parsedProps:props}=group,pcbChildren=group.children.filter(c6=>c6.pcb_component_id||c6.pcb_group_id);if(pcbChildren.some(child=>{let childProps=child._parsedProps;return childProps?.pcbX!==void 0||childProps?.pcbY!==void 0}))return;let rawJustify=props.pcbJustifyContent??props.justifyContent,rawAlign=props.pcbAlignItems??props.alignItems,rawGap=props.pcbFlexGap??props.pcbGap??props.gap,direction2=props.pcbFlexDirection??"row",justifyContent={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"space-between","space-between":"space-between","space-around":"space-around","space-evenly":"space-evenly",center:"center"}[rawJustify??"space-between"],alignItems={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"stretch",center:"center"}[rawAlign??"center"];if(!justifyContent)throw new Error(`Invalid justifyContent value: "${rawJustify}"`);if(!alignItems)throw new Error(`Invalid alignItems value: "${rawAlign}"`);let rowGap=0,columnGap=0;typeof rawGap=="object"?(rowGap=rawGap.y??0,columnGap=rawGap.x??0):typeof rawGap=="number"?(rowGap=rawGap,columnGap=rawGap):typeof rawGap=="string"&&(rowGap=length.parse(rawGap),columnGap=length.parse(rawGap));let minFlexContainer,width=props.width??props.pcbWidth??void 0,height=props.height??props.pcbHeight??void 0;(width===void 0||height===void 0)&&(minFlexContainer=getMinimumFlexContainer(pcbChildren.map(child=>child._getMinimumFlexContainerSize()).filter(size3=>size3!==null),{alignItems,justifyContent,direction:direction2,rowGap,columnGap}),width=minFlexContainer.width,height=minFlexContainer.height);let flexBox=new RootFlexBox(width,height,{alignItems,justifyContent,direction:direction2,rowGap,columnGap});for(let child of pcbChildren){let size3=child._getMinimumFlexContainerSize();flexBox.addChild({metadata:child,width:size3?.width??0,height:size3?.height??0,flexBasis:size3?direction2==="row"?size3.width:size3.height:void 0})}flexBox.build();let bounds={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0,width:0,height:0};for(let child of flexBox.children)bounds.minX=Math.min(bounds.minX,child.position.x),bounds.minY=Math.min(bounds.minY,child.position.y),bounds.maxX=Math.max(bounds.maxX,child.position.x+child.size.width),bounds.maxY=Math.max(bounds.maxY,child.position.y+child.size.height);bounds.width=bounds.maxX-bounds.minX,bounds.height=bounds.maxY-bounds.minY;let groupCenter=group._getGlobalPcbPositionBeforeLayout(),offset={x:groupCenter.x-(bounds.maxX+bounds.minX)/2,y:groupCenter.y-(bounds.maxY+bounds.minY)/2};for(let child of flexBox.children)child.metadata._repositionOnPcb({x:child.position.x+child.size.width/2+offset.x,y:child.position.y+child.size.height/2+offset.y});db3.pcb_group.update(group.pcb_group_id,{width:bounds.width,height:bounds.height,center:groupCenter})},MIN_GAP=1;function Group_doInitialPcbLayoutGrid(group){let{db:db3}=group.root,props=group._parsedProps,pcbChildren=getPcbChildren(group);if(pcbChildren.length===0)return;let childDimensions=calculateChildDimensions({db:db3,pcbChildren}),gridConfig=parseGridConfiguration(props),gridLayout=createGridLayout({props,pcbChildren,childDimensions,gridConfig}),cssGrid=createCssGrid({pcbChildren,childDimensions,gridLayout,gridConfig}),{itemCoordinates}=cssGrid.layout();positionChildren({db:db3,group,pcbChildren,itemCoordinates,gridLayout}),updateGroupDimensions({db:db3,group,props,gridLayout})}function getPcbChildren(group){return group.children.filter(child=>child.pcb_component_id||child.pcb_group_id)}function calculateChildDimensions(params){let{db:db3,pcbChildren}=params,maxWidth=0,maxHeight=0;for(let child of pcbChildren){let width=0,height=0;if(child.pcb_group_id){let pcbGroup=db3.pcb_group.get(child.pcb_group_id);width=pcbGroup?.width??0,height=pcbGroup?.height??0}else if(child.pcb_component_id){let pcbComp=db3.pcb_component.get(child.pcb_component_id);width=pcbComp?.width??0,height=pcbComp?.height??0}maxWidth=Math.max(maxWidth,width),maxHeight=Math.max(maxHeight,height)}return{width:maxWidth,height:maxHeight}}function parseGridConfiguration(props){let cols=props.pcbGridCols??props.gridCols??props.pcbLayout?.grid?.cols,rows=props.pcbGridRows??props.pcbLayout?.grid?.rows,templateColumns=props.pcbGridTemplateColumns,templateRows=props.pcbGridTemplateRows,parseGap=gapValue=>gapValue===void 0?MIN_GAP:typeof gapValue=="number"?gapValue:length.parse(gapValue),gridGapOption=props.pcbGridGap??props.gridGap??props.pcbLayout?.gridGap,rowGapOption=props.pcbGridRowGap??props.gridRowGap??props.pcbLayout?.gridRowGap,colGapOption=props.pcbGridColumnGap??props.gridColumnGap??props.pcbLayout?.gridColumnGap,gapX=MIN_GAP,gapY=MIN_GAP;if(rowGapOption!==void 0||colGapOption!==void 0){let fallbackX=typeof gridGapOption=="object"?gridGapOption?.x:gridGapOption,fallbackY=typeof gridGapOption=="object"?gridGapOption?.y:gridGapOption;gapX=parseGap(colGapOption??fallbackX),gapY=parseGap(rowGapOption??fallbackY)}else if(typeof gridGapOption=="object"&&gridGapOption!==null)gapX=parseGap(gridGapOption.x),gapY=parseGap(gridGapOption.y);else{let gap=parseGap(gridGapOption);gapX=gap,gapY=gap}return{cols,rows,gapX,gapY,templateColumns,templateRows}}function createGridLayout(params){let{props,pcbChildren,childDimensions,gridConfig}=params;return props.pcbGridTemplateColumns||props.pcbGridTemplateRows?createTemplateBasedLayout({props,gridConfig,pcbChildren,childDimensions}):createDefaultLayout({gridConfig,pcbChildren,childDimensions})}function createTemplateBasedLayout(params){let{props,gridConfig,pcbChildren,childDimensions}=params,gridTemplateColumns=props.pcbGridTemplateColumns??"",gridTemplateRows=props.pcbGridTemplateRows??"",extractRepeatCount=template=>{let match2=template.match(/repeat\((\d+),/);return match2?parseInt(match2[1]):Math.ceil(Math.sqrt(pcbChildren.length))},numCols=props.pcbGridTemplateColumns?extractRepeatCount(gridTemplateColumns):Math.ceil(Math.sqrt(pcbChildren.length)),numRows=props.pcbGridTemplateRows?extractRepeatCount(gridTemplateRows):Math.ceil(pcbChildren.length/numCols),containerWidth=numCols*childDimensions.width+Math.max(0,numCols-1)*gridConfig.gapX,containerHeight=numRows*childDimensions.height+Math.max(0,numRows-1)*gridConfig.gapY;return{gridTemplateColumns,gridTemplateRows,containerWidth,containerHeight}}function createDefaultLayout(params){let{gridConfig,pcbChildren,childDimensions}=params,numCols,numRows;gridConfig.cols!==void 0&&gridConfig.rows!==void 0?(numCols=gridConfig.cols,numRows=gridConfig.rows):gridConfig.cols!==void 0?(numCols=gridConfig.cols,numRows=Math.ceil(pcbChildren.length/numCols)):gridConfig.rows!==void 0?(numRows=gridConfig.rows,numCols=Math.ceil(pcbChildren.length/numRows)):(numCols=Math.ceil(Math.sqrt(pcbChildren.length)),numRows=Math.ceil(pcbChildren.length/numCols)),numCols=Math.max(1,numCols),numRows=Math.max(1,numRows);let containerWidth=numCols*childDimensions.width+Math.max(0,numCols-1)*gridConfig.gapX,containerHeight=numRows*childDimensions.height+Math.max(0,numRows-1)*gridConfig.gapY,gridTemplateColumns=`repeat(${numCols}, ${childDimensions.width}px)`,gridTemplateRows=`repeat(${numRows}, ${childDimensions.height}px)`;return{gridTemplateColumns,gridTemplateRows,containerWidth,containerHeight}}function createCssGrid(params){let{pcbChildren,childDimensions,gridLayout,gridConfig}=params,gridChildren=pcbChildren.map((child,index)=>({key:child.getString()||`child-${index}`,contentWidth:childDimensions.width,contentHeight:childDimensions.height}));return new CssGrid({containerWidth:gridLayout.containerWidth,containerHeight:gridLayout.containerHeight,gridTemplateColumns:gridLayout.gridTemplateColumns,gridTemplateRows:gridLayout.gridTemplateRows,gap:[gridConfig.gapY,gridConfig.gapX],children:gridChildren})}function positionChildren(params){let{db:db3,group,pcbChildren,itemCoordinates,gridLayout}=params,groupCenter=group._getGlobalPcbPositionBeforeLayout(),allCircuitJson=db3.toArray();for(let i3=0;i3<pcbChildren.length;i3++){let child=pcbChildren[i3],childKey=child.getString()||`child-${i3}`,coordinates=itemCoordinates[childKey];if(!coordinates){console.warn(`PCB grid layout: No coordinates found for child ${childKey}`);continue}let targetX=groupCenter.x-gridLayout.containerWidth/2+coordinates.x+coordinates.width/2,targetY=groupCenter.y+gridLayout.containerHeight/2-coordinates.y-coordinates.height/2;if(child.pcb_component_id)repositionPcbComponentTo(allCircuitJson,child.pcb_component_id,{x:targetX,y:targetY});else{let groupChild=child;groupChild.pcb_group_id&&groupChild.source_group_id&&repositionPcbGroupTo(allCircuitJson,groupChild.source_group_id,{x:targetX,y:targetY})}}}function updateGroupDimensions(params){let{db:db3,group,props,gridLayout}=params;if(group.pcb_group_id){let groupCenter=group._getGlobalPcbPositionBeforeLayout();db3.pcb_group.update(group.pcb_group_id,{width:props.width??gridLayout.containerWidth,height:props.height??gridLayout.containerHeight,center:groupCenter})}}var applyComponentConstraintClusters=(group,packInput)=>{let constraints=group.children.filter(c6=>c6.componentName==="Constraint"&&c6._parsedProps.pcb),clusterByRoot=new Map,parent={},find2=x4=>(parent[x4]!==x4&&(parent[x4]=find2(parent[x4])),parent[x4]),union2=(a3,b4)=>{let ra3=find2(a3),rb2=find2(b4);ra3!==rb2&&(parent[rb2]=ra3)},makeSet=x4=>{x4 in parent||(parent[x4]=x4)},getIdFromSelector=sel2=>{let name=sel2.startsWith(".")?sel2.slice(1):sel2;return group.children.find(c6=>c6.name===name)?.pcb_component_id??void 0};for(let constraint of constraints){let props=constraint._parsedProps;if("left"in props&&"right"in props){let a3=getIdFromSelector(props.left),b4=getIdFromSelector(props.right);a3&&b4&&(makeSet(a3),makeSet(b4),union2(a3,b4))}else if("top"in props&&"bottom"in props){let a3=getIdFromSelector(props.top),b4=getIdFromSelector(props.bottom);a3&&b4&&(makeSet(a3),makeSet(b4),union2(a3,b4))}else if("for"in props&&Array.isArray(props.for)){let ids=props.for.map(s6=>getIdFromSelector(s6)).filter(s6=>!!s6);for(let id3 of ids)makeSet(id3);for(let i3=1;i3<ids.length;i3++)union2(ids[0],ids[i3])}}for(let id3 of Object.keys(parent)){let rootId=find2(id3);clusterByRoot.has(rootId)||clusterByRoot.set(rootId,{componentIds:[],constraints:[]}),clusterByRoot.get(rootId).componentIds.push(id3)}for(let constraint of constraints){let props=constraint._parsedProps,compId;if("left"in props?compId=getIdFromSelector(props.left):"top"in props?compId=getIdFromSelector(props.top):"for"in props&&(compId=getIdFromSelector(props.for[0])),!compId)continue;let root=find2(compId);clusterByRoot.get(root)?.constraints.push(constraint)}let clusterMap={},packCompById=Object.fromEntries(packInput.components.map(c6=>[c6.componentId,c6]));for(let[rootId,info]of clusterByRoot.entries()){if(info.componentIds.length<=1)continue;let solver=new Solver,kVars={},getVar=(id3,axis)=>{let key=`${id3}_${axis}`;return kVars[key]||(kVars[key]=new Variable(key)),kVars[key]},anchor=info.componentIds[0];solver.addConstraint(new Constraint(getVar(anchor,"x"),Operator.Eq,0,Strength.required)),solver.addConstraint(new Constraint(getVar(anchor,"y"),Operator.Eq,0,Strength.required));for(let constraint of info.constraints){let props=constraint._parsedProps;if("xDist"in props){let left=getIdFromSelector(props.left),right=getIdFromSelector(props.right);left&&right&&solver.addConstraint(new Constraint(new Expression(getVar(right,"x"),[-1,getVar(left,"x")]),Operator.Eq,props.xDist,Strength.required))}else if("yDist"in props){let top=getIdFromSelector(props.top),bottom=getIdFromSelector(props.bottom);top&&bottom&&solver.addConstraint(new Constraint(new Expression(getVar(top,"y"),[-1,getVar(bottom,"y")]),Operator.Eq,props.yDist,Strength.required))}else if("sameX"in props&&Array.isArray(props.for)){let ids=props.for.map(s6=>getIdFromSelector(s6)).filter(s6=>!!s6);if(ids.length>1){let base=getVar(ids[0],"x");for(let i3=1;i3<ids.length;i3++)solver.addConstraint(new Constraint(new Expression(getVar(ids[i3],"x"),[-1,base]),Operator.Eq,0,Strength.required))}}else if("sameY"in props&&Array.isArray(props.for)){let ids=props.for.map(s6=>getIdFromSelector(s6)).filter(s6=>!!s6);if(ids.length>1){let base=getVar(ids[0],"y");for(let i3=1;i3<ids.length;i3++)solver.addConstraint(new Constraint(new Expression(getVar(ids[i3],"y"),[-1,base]),Operator.Eq,0,Strength.required))}}}solver.updateVariables();let positions={};for(let id3 of info.componentIds)positions[id3]={x:getVar(id3,"x").value(),y:getVar(id3,"y").value()};let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let id3 of info.componentIds){let comp=packCompById[id3],pos=positions[id3];if(comp)for(let pad2 of comp.pads){let ax3=pos.x+pad2.offset.x,ay3=pos.y+pad2.offset.y;minX=Math.min(minX,ax3-pad2.size.x/2),maxX=Math.max(maxX,ax3+pad2.size.x/2),minY=Math.min(minY,ay3-pad2.size.y/2),maxY=Math.max(maxY,ay3+pad2.size.y/2)}}let clusterCenter={x:(minX+maxX)/2,y:(minY+maxY)/2},mergedPads=[],relCenters={};for(let id3 of info.componentIds){let comp=packCompById[id3],pos=positions[id3];if(comp){relCenters[id3]={x:pos.x-clusterCenter.x,y:pos.y-clusterCenter.y};for(let pad2 of comp.pads)mergedPads.push({padId:pad2.padId,networkId:pad2.networkId,type:pad2.type,size:pad2.size,offset:{x:pos.x+pad2.offset.x-clusterCenter.x,y:pos.y+pad2.offset.y-clusterCenter.y}})}}packInput.components=packInput.components.filter(c6=>!info.componentIds.includes(c6.componentId)),packInput.components.push({componentId:info.componentIds[0],pads:mergedPads,availableRotationDegrees:[0]}),info.relativeCenters=relCenters,clusterMap[info.componentIds[0]]=info}return clusterMap},updateCadRotation=({db:db3,pcbComponentId,rotationDegrees,layer})=>{if(rotationDegrees==null||!db3?.cad_component?.list)return;let cadComponent=db3.cad_component.getWhere({pcb_component_id:pcbComponentId});if(!cadComponent)return;let delta=layer?.toLowerCase?.()==="bottom"?-rotationDegrees:rotationDegrees,currentRotationZ=cadComponent.rotation?.z??0,nextRotation={...cadComponent.rotation??{x:0,y:0,z:0},z:normalizeDegrees(currentRotationZ+delta)};db3.cad_component.update(cadComponent.cad_component_id,{rotation:nextRotation}),cadComponent.rotation=nextRotation},isDescendantGroup=(db3,groupId,ancestorId)=>{if(groupId===ancestorId)return!0;let group=db3.source_group.get(groupId);return!group||!group.parent_source_group_id?!1:isDescendantGroup(db3,group.parent_source_group_id,ancestorId)},applyPackOutput=(group,packOutput,clusterMap)=>{let{db:db3}=group.root;for(let packedComponent of packOutput.components){let{center:center2,componentId,ccwRotationOffset,ccwRotationDegrees}=packedComponent,cluster=clusterMap[componentId];if(cluster){let rotationDegrees2=ccwRotationDegrees??ccwRotationOffset??0,angleRad=rotationDegrees2*Math.PI/180;for(let memberId of cluster.componentIds){let rel=cluster.relativeCenters[memberId];if(!rel)continue;db3.pcb_component.update(memberId,{position_mode:"packed"});let rotatedRel={x:rel.x*Math.cos(angleRad)-rel.y*Math.sin(angleRad),y:rel.x*Math.sin(angleRad)+rel.y*Math.cos(angleRad)},member=db3.pcb_component.get(memberId);if(!member)continue;let originalCenter2=member.center,transformMatrix2=compose2(group._computePcbGlobalTransformBeforeLayout(),translate2(center2.x+rotatedRel.x,center2.y+rotatedRel.y),rotate2(angleRad),translate2(-originalCenter2.x,-originalCenter2.y)),related=db3.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===memberId);transformPCBElements(related,transformMatrix2),updateCadRotation({db:db3,pcbComponentId:memberId,rotationDegrees:rotationDegrees2,layer:member.layer})}continue}let pcbComponent=db3.pcb_component.get(componentId);if(pcbComponent){db3.pcb_component.update(componentId,{position_mode:"packed"});let currentGroupId=group.source_group_id,componentGroupId=db3.source_component.get(pcbComponent.source_component_id)?.source_group_id;if(componentGroupId!==void 0&&!isDescendantGroup(db3,componentGroupId,currentGroupId))continue;let originalCenter2=pcbComponent.center,rotationDegrees2=ccwRotationDegrees??ccwRotationOffset??0,transformMatrix2=compose2(group._computePcbGlobalTransformBeforeLayout(),translate2(center2.x,center2.y),rotate2(rotationDegrees2*Math.PI/180),translate2(-originalCenter2.x,-originalCenter2.y)),related=db3.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===componentId);transformPCBElements(related,transformMatrix2),updateCadRotation({db:db3,pcbComponentId:componentId,rotationDegrees:rotationDegrees2,layer:pcbComponent.layer});continue}let pcbGroup=db3.pcb_group.list().find(g4=>g4.source_group_id===componentId);if(!pcbGroup)continue;let originalCenter=pcbGroup.center,rotationDegrees=ccwRotationDegrees??ccwRotationOffset??0,transformMatrix=compose2(group._computePcbGlobalTransformBeforeLayout(),translate2(center2.x,center2.y),rotate2(rotationDegrees*Math.PI/180),translate2(-originalCenter.x,-originalCenter.y)),relatedElements=db3.toArray().filter(elm=>{if("source_group_id"in elm&&elm.source_group_id&&(elm.source_group_id===componentId||isDescendantGroup(db3,elm.source_group_id,componentId)))return!0;if("source_component_id"in elm&&elm.source_component_id){let sourceComponent=db3.source_component.get(elm.source_component_id);if(sourceComponent?.source_group_id&&(sourceComponent.source_group_id===componentId||isDescendantGroup(db3,sourceComponent.source_group_id,componentId)))return!0}if("pcb_component_id"in elm&&elm.pcb_component_id){let pcbComp=db3.pcb_component.get(elm.pcb_component_id);if(pcbComp?.source_component_id){let sourceComp=db3.source_component.get(pcbComp.source_component_id);if(sourceComp?.source_group_id&&(sourceComp.source_group_id===componentId||isDescendantGroup(db3,sourceComp.source_group_id,componentId)))return!0}}return!1});for(let elm of relatedElements)elm.type==="pcb_component"&&db3.pcb_component.update(elm.pcb_component_id,{position_mode:"packed"});transformPCBElements(relatedElements,transformMatrix),db3.pcb_group.update(pcbGroup.pcb_group_id,{center:center2})}},DEFAULT_MIN_GAP="1mm",debug42=(0,import_debug12.default)("Group_doInitialPcbLayoutPack"),Group_doInitialPcbLayoutPack=group=>{let{db:db3}=group.root,{_parsedProps:props}=group;group.root?.emit("packing:start",{subcircuit_id:group.subcircuit_id,componentDisplayName:group.getString()});let{packOrderStrategy,packPlacementStrategy,gap:gapProp,pcbGap,pcbPackGap}=props,gap=pcbPackGap??pcbGap??gapProp,gapMm=length.parse(gap??DEFAULT_MIN_GAP),chipMarginsMap={},staticPcbComponentIds=new Set,collectMargins=comp=>{if(comp?.pcb_component_id&&comp?._parsedProps){let props2=comp._parsedProps,left=length.parse(props2.pcbMarginLeft??props2.pcbMarginX??0),right=length.parse(props2.pcbMarginRight??props2.pcbMarginX??0),top=length.parse(props2.pcbMarginTop??props2.pcbMarginY??0),bottom=length.parse(props2.pcbMarginBottom??props2.pcbMarginY??0);(left||right||top||bottom)&&(chipMarginsMap[comp.pcb_component_id]={left,right,top,bottom})}comp?.children&&comp.children.forEach(collectMargins)};collectMargins(group);let excludedPcbGroupIds=new Set;for(let child of group.children){let childIsGroupOrNormalComponent=child;childIsGroupOrNormalComponent._isNormalComponent&&childIsGroupOrNormalComponent.isRelativelyPositioned?.()&&(childIsGroupOrNormalComponent.pcb_component_id&&staticPcbComponentIds.add(childIsGroupOrNormalComponent.pcb_component_id),childIsGroupOrNormalComponent.pcb_group_id&&excludedPcbGroupIds.add(childIsGroupOrNormalComponent.pcb_group_id))}let isDescendantGroup2=(db22,groupId,ancestorId)=>{if(groupId===ancestorId)return!0;let group2=db22.source_group.get(groupId);return!group2||!group2.parent_source_group_id?!1:isDescendantGroup2(db22,group2.parent_source_group_id,ancestorId)};if(excludedPcbGroupIds.size>0)for(let element of db3.toArray()){if(element.type!=="pcb_component")continue;let sourceComponent=db3.source_component.get(element.source_component_id);if(sourceComponent?.source_group_id)for(let groupId of excludedPcbGroupIds)isDescendantGroup2(db3,sourceComponent.source_group_id,groupId)&&staticPcbComponentIds.add(element.pcb_component_id)}let filteredCircuitJson=db3.toArray(),bounds;if(props.width!==void 0&&props.height!==void 0){let widthMm=length.parse(props.width),heightMm=length.parse(props.height);bounds={minX:-widthMm/2,maxX:widthMm/2,minY:-heightMm/2,maxY:heightMm/2}}let packInput={...convertPackOutputToPackInput(convertCircuitJsonToPackOutput(filteredCircuitJson,{source_group_id:group.source_group_id,chipMarginsMap,staticPcbComponentIds:Array.from(staticPcbComponentIds)})),orderStrategy:packOrderStrategy??"largest_to_smallest",placementStrategy:packPlacementStrategy??"minimum_sum_squared_distance_to_network",minGap:gapMm,bounds},clusterMap=applyComponentConstraintClusters(group,packInput);debug42.enabled&&(group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`packInput-circuitjson-${group.name}`,content:JSON.stringify(db3.toArray())}),group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`packInput-${group.name}`,content:packInput}));let packOutput;try{let solver=new PackSolver2(packInput);group.root?.emit("solver:started",{type:"solver:started",solverName:"PackSolver2",solverParams:solver.getConstructorParams(),componentName:group.getString()}),solver.solve(),packOutput={...packInput,components:solver.packedComponents}}catch(error2){throw group.root?.emit("packing:error",{subcircuit_id:group.subcircuit_id,componentDisplayName:group.getString(),error:{message:error2 instanceof Error?error2.message:String(error2)}}),error2}if(debug42.enabled&&global?.debugGraphics){let graphics=getGraphicsFromPackOutput(packOutput);graphics.title=`packOutput-${group.name}`,global.debugGraphics?.push(graphics)}applyPackOutput(group,packOutput,clusterMap),group.root?.emit("packing:end",{subcircuit_id:group.subcircuit_id,componentDisplayName:group.getString()})},parsePinNumberFromPortName=name=>{if(!name)return null;let match2=name.match(/^pin(\d+)$/i)??name.match(/^(\d+)$/);if(!match2)return null;let pinNumber=Number(match2[1]);return Number.isFinite(pinNumber)&&pinNumber>0?pinNumber:null},getDirectGroupPorts=group=>group.children.filter(child=>child.componentName==="Port"),normalizeGroupSchematicBoxPorts=group=>{let{db:db3}=group.root,ports=getDirectGroupPorts(group);for(let port of ports){if(port._parsedProps.pinNumber!==void 0)continue;let pinNumber=parsePinNumberFromPortName(port._parsedProps.name);pinNumber!==null&&(port._parsedProps.pinNumber=pinNumber)}let usedPinNumbers=new Set(ports.map(port=>port._parsedProps.pinNumber).filter(pinNumber=>pinNumber!==void 0)),nextPinNumber=1;for(let port of ports){if(port._parsedProps.pinNumber===void 0){for(;usedPinNumbers.has(nextPinNumber);)nextPinNumber++;port._parsedProps.pinNumber=nextPinNumber,usedPinNumbers.add(nextPinNumber)}port.source_port_id&&db3.source_port.update(port.source_port_id,{pin_number:port._parsedProps.pinNumber,port_hints:port.getNameAndAliases()})}},getGroupSchematicBoxPinLabels=group=>{let pinLabels={};for(let port of getDirectGroupPorts(group)){let pinNumber=port._parsedProps.pinNumber,name=port._parsedProps.name;pinNumber===void 0||!name||name===`pin${pinNumber}`||name===String(pinNumber)||(pinLabels[`pin${pinNumber}`]=name)}return pinLabels},Group_doInitialSchematicBoxComponentRender=group=>{if(group.root?.schematicDisabled)return;let{db:db3}=group.root,props=group._parsedProps;props.schPinSpacing!==void 0&&db3.source_property_ignored_warning.insert({source_component_id:group.source_group_id??"",property_name:"schPinSpacing",error_type:"source_property_ignored_warning",message:"schPinSpacing is deprecated and will be ignored. Pin spacing is always 0.2."}),normalizeGroupSchematicBoxPorts(group);let dimensions=group._getSchematicBoxDimensions();if(!dimensions)return;let center2=group._getGlobalSchematicPositionBeforeLayout(),size3=dimensions.getSize(),portLabels=group._getPinLabelsFromPorts(),schPortArrangement=group._getSchematicPortArrangement(),schematicComponent=db3.schematic_component.insert({center:center2,size:size3,source_group_id:group.source_group_id,schematic_group_id:group.schematic_group_id??void 0,subcircuit_id:group.subcircuit_id??group.getSubcircuit()?.subcircuit_id??void 0,is_schematic_group:!0,is_box_with_pins:!0,port_arrangement:underscorifyPortArrangement(schPortArrangement),pin_spacing:.2,pin_styles:underscorifyPinStyles(props.schPinStyle,portLabels),port_labels:portLabels,schematic_sheet_id:group._resolveSchematicSheetId()});group.schematic_component_id=schematicComponent.schematic_component_id,group.schematic_group_id&&db3.schematic_group.update(group.schematic_group_id,{center:center2,width:size3.width,height:size3.height,schematic_component_ids:[schematicComponent.schematic_component_id]});let title=props.schTitle??props.name;title&&db3.schematic_text.insert({text:title,schematic_component_id:schematicComponent.schematic_component_id,anchor:"left",rotation:0,position:{x:center2.x-size3.width/2,y:center2.y+size3.height/2+.13},color:"#006464",font_size:.18,schematic_sheet_id:group._resolveSchematicSheetId()})},getSizeOfTreeNodeChild=(db3,child)=>{let{sourceComponent,sourceGroup}=child;if(child.nodeType==="component"){let schComponent=db3.schematic_component.getWhere({source_component_id:sourceComponent?.source_component_id});return schComponent?.size?{width:schComponent.size.width,height:schComponent.size.height}:null}if(child.nodeType==="group"){let schGroup=db3.schematic_group.getWhere({source_group_id:sourceGroup?.source_group_id});if(schGroup?.width&&schGroup?.height)return{width:schGroup.width,height:schGroup.height};let groupComponents=db3.schematic_component.list({schematic_group_id:schGroup?.schematic_group_id}),minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let comp of groupComponents)if(comp.center&&comp.size){let halfWidth=comp.size.width/2,halfHeight=comp.size.height/2;minX=Math.min(minX,comp.center.x-halfWidth),maxX=Math.max(maxX,comp.center.x+halfWidth),minY=Math.min(minY,comp.center.y-halfHeight),maxY=Math.max(maxY,comp.center.y+halfHeight)}let groupWidth=maxX-minX,groupHeight=maxY-minY;return{width:groupWidth,height:groupHeight}}return null},Group_doInitialSchematicLayoutFlex=group=>{let{db:db3}=group.root,props=group._parsedProps,tree=getCircuitJsonTree(db3.toArray(),{source_group_id:group.source_group_id}),rawJustify=props.schJustifyContent??props.justifyContent,rawAlign=props.schAlignItems??props.alignItems,rawGap=props.schFlexGap??props.schGap??props.gap,direction2=props.schFlexDirection??"row",justifyContent={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"space-between","space-between":"space-between","space-around":"space-around","space-evenly":"space-evenly",center:"center"}[rawJustify??"space-between"],alignItems={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"stretch",center:"center"}[rawAlign??"center"];if(!justifyContent)throw new Error(`Invalid justifyContent value: "${rawJustify}"`);if(!alignItems)throw new Error(`Invalid alignItems value: "${rawAlign}"`);let rowGap=0,columnGap=0;typeof rawGap=="object"?(rowGap=rawGap.y??0,columnGap=rawGap.x??0):typeof rawGap=="number"?(rowGap=rawGap,columnGap=rawGap):typeof rawGap=="string"&&(rowGap=length.parse(rawGap),columnGap=length.parse(rawGap));let minFlexContainer,width=props.width??props.schWidth??void 0,height=props.height??props.schHeight??void 0;(width===void 0||height===void 0)&&(minFlexContainer=getMinimumFlexContainer(tree.childNodes.map(child=>getSizeOfTreeNodeChild(db3,child)).filter(size3=>size3!==null),{alignItems,justifyContent,direction:direction2,rowGap,columnGap}),width=minFlexContainer.width,height=minFlexContainer.height);let flexBox=new RootFlexBox(width,height,{alignItems,justifyContent,direction:direction2,rowGap,columnGap});for(let child of tree.childNodes){let size3=getSizeOfTreeNodeChild(db3,child);flexBox.addChild({metadata:child,width:size3?.width??0,height:size3?.height??0,flexBasis:size3?direction2==="row"?size3.width:size3.height:void 0})}flexBox.build();let bounds={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0,width:0,height:0};for(let child of flexBox.children)bounds.minX=Math.min(bounds.minX,child.position.x),bounds.minY=Math.min(bounds.minY,child.position.y),bounds.maxX=Math.max(bounds.maxX,child.position.x+child.size.width),bounds.maxY=Math.max(bounds.maxY,child.position.y+child.size.height);bounds.width=bounds.maxX-bounds.minX,bounds.height=bounds.maxY-bounds.minY;let offset={x:-(bounds.maxX+bounds.minX)/2,y:-(bounds.maxY+bounds.minY)/2},allCircuitJson=db3.toArray();for(let child of flexBox.children){let{sourceComponent,sourceGroup}=child.metadata;if(sourceComponent){let schComponent=db3.schematic_component.getWhere({source_component_id:sourceComponent.source_component_id});if(!schComponent)continue;repositionSchematicComponentTo(allCircuitJson,schComponent.schematic_component_id,{x:child.position.x+child.size.width/2+offset.x,y:child.position.y+child.size.height/2+offset.y})}if(sourceGroup){if(!db3.schematic_group.getWhere({source_group_id:sourceGroup.source_group_id}))continue;repositionSchematicGroupTo(allCircuitJson,sourceGroup.source_group_id,{x:child.position.x+child.size.width/2+offset.x,y:child.position.y+child.size.height/2+offset.y})}}group.schematic_group_id&&db3.schematic_group.update(group.schematic_group_id,{width:bounds.width,height:bounds.height})};function updateSchematicPrimitivesForLayoutShift({db:db3,schematicComponentId,deltaX,deltaY}){let rects=db3.schematic_rect.list({schematic_component_id:schematicComponentId});for(let rect of rects)rect.center.x+=deltaX,rect.center.y+=deltaY;let lines=db3.schematic_line.list({schematic_component_id:schematicComponentId});for(let line2 of lines)line2.x1+=deltaX,line2.y1+=deltaY,line2.x2+=deltaX,line2.y2+=deltaY;let circles=db3.schematic_circle.list({schematic_component_id:schematicComponentId});for(let circle2 of circles)circle2.center.x+=deltaX,circle2.center.y+=deltaY;let arcs=db3.schematic_arc.list({schematic_component_id:schematicComponentId});for(let arc2 of arcs)arc2.center.x+=deltaX,arc2.center.y+=deltaY;let paths=db3.schematic_path.list({schematic_component_id:schematicComponentId});for(let path of paths)for(let point6 of path.points)point6.x+=deltaX,point6.y+=deltaY}function Group_doInitialSchematicLayoutGrid(group){let{db:db3}=group.root,props=group._parsedProps,schematicChildren=group.children.filter(child=>{let isExplicitlyPositioned=child._parsedProps?.schX!==void 0||child._parsedProps?.schY!==void 0;return child.schematic_component_id&&!isExplicitlyPositioned});if(schematicChildren.length===0)return;let maxCellWidth=0,maxCellHeight=0;for(let child of schematicChildren){let schComp=db3.schematic_component.get(child.schematic_component_id);schComp?.size&&(maxCellWidth=Math.max(maxCellWidth,schComp.size.width),maxCellHeight=Math.max(maxCellHeight,schComp.size.height))}maxCellWidth===0&&schematicChildren.length>0&&(maxCellWidth=1),maxCellHeight===0&&schematicChildren.length>0&&(maxCellHeight=1);let gridColsOption=props.gridCols,gridRowsOption,gridGapOption=props.gridGap,gridRowGapOption=props.gridRowGap,gridColumnGapOption=props.gridColumnGap;props.schLayout?.grid&&(gridColsOption=props.schLayout.grid.cols??gridColsOption,gridRowsOption=props.schLayout.grid.rows,gridGapOption=props.schLayout.gridGap??gridGapOption,gridRowGapOption=props.schLayout.gridRowGap??gridRowGapOption,gridColumnGapOption=props.schLayout.gridColumnGap??gridColumnGapOption);let numCols,numRows;gridColsOption!==void 0&&gridRowsOption!==void 0?(numCols=gridColsOption,numRows=gridRowsOption):gridColsOption!==void 0?(numCols=gridColsOption,numRows=Math.ceil(schematicChildren.length/numCols)):gridRowsOption!==void 0?(numRows=gridRowsOption,numCols=Math.ceil(schematicChildren.length/numRows)):(numCols=Math.ceil(Math.sqrt(schematicChildren.length)),numRows=Math.ceil(schematicChildren.length/numCols)),numCols===0&&schematicChildren.length>0&&(numCols=1),numRows===0&&schematicChildren.length>0&&(numRows=schematicChildren.length);let gridGapX,gridGapY,parseGap=val=>{if(val!==void 0)return typeof val=="number"?val:length.parse(val)};if(gridRowGapOption!==void 0||gridColumnGapOption!==void 0){let fallbackX=typeof gridGapOption=="object"&&gridGapOption!==null?gridGapOption.x:gridGapOption,fallbackY=typeof gridGapOption=="object"&&gridGapOption!==null?gridGapOption.y:gridGapOption;gridGapX=parseGap(gridColumnGapOption??fallbackX)??1,gridGapY=parseGap(gridRowGapOption??fallbackY)??1}else if(typeof gridGapOption=="number")gridGapX=gridGapOption,gridGapY=gridGapOption;else if(typeof gridGapOption=="string"){let parsed=length.parse(gridGapOption);gridGapX=parsed,gridGapY=parsed}else if(typeof gridGapOption=="object"&&gridGapOption!==null){let xRaw=gridGapOption.x,yRaw=gridGapOption.y;gridGapX=typeof xRaw=="number"?xRaw:length.parse(xRaw??"0mm"),gridGapY=typeof yRaw=="number"?yRaw:length.parse(yRaw??"0mm")}else gridGapX=1,gridGapY=1;let totalGridWidth=numCols*maxCellWidth+Math.max(0,numCols-1)*gridGapX,totalGridHeight=numRows*maxCellHeight+Math.max(0,numRows-1)*gridGapY,groupCenter=group._getGlobalSchematicPositionBeforeLayout(),firstCellCenterX=groupCenter.x-totalGridWidth/2+maxCellWidth/2,firstCellCenterY=groupCenter.y+totalGridHeight/2-maxCellHeight/2;for(let i3=0;i3<schematicChildren.length;i3++){let child=schematicChildren[i3];if(!child.schematic_component_id)continue;let row=Math.floor(i3/numCols),col=i3%numCols;if(row>=numRows||col>=numCols){console.warn(`Schematic grid layout: Child ${child.getString()} at index ${i3} (row ${row}, col ${col}) exceeds specified grid dimensions (${numRows}x${numCols}). Skipping placement.`);continue}let targetCellCenterX=firstCellCenterX+col*(maxCellWidth+gridGapX),targetCellCenterY=firstCellCenterY-row*(maxCellHeight+gridGapY),schComp=db3.schematic_component.get(child.schematic_component_id);if(schComp){let oldChildCenter=schComp.center,newChildCenter={x:targetCellCenterX,y:targetCellCenterY};db3.schematic_component.update(child.schematic_component_id,{center:newChildCenter});let deltaX=newChildCenter.x-oldChildCenter.x,deltaY=newChildCenter.y-oldChildCenter.y,schPorts=db3.schematic_port.list({schematic_component_id:child.schematic_component_id});for(let port of schPorts)db3.schematic_port.update(port.schematic_port_id,{center:{x:port.center.x+deltaX,y:port.center.y+deltaY}});let schTexts=db3.schematic_text.list({schematic_component_id:child.schematic_component_id});for(let text of schTexts)db3.schematic_text.update(text.schematic_text_id,{position:{x:text.position.x+deltaX,y:text.position.y+deltaY}});updateSchematicPrimitivesForLayoutShift({db:db3,schematicComponentId:child.schematic_component_id,deltaX,deltaY})}}group.schematic_group_id&&db3.schematic_group.update(group.schematic_group_id,{width:totalGridWidth,height:totalGridHeight,center:groupCenter})}var debug52=(0,import_debug13.default)("Group_doInitialSchematicLayoutMatchAdapt");function Group_doInitialSchematicLayoutMatchAdapt(group){let{db:db3}=group.root,subtreeCircuitJson=buildSubtree(db3.toArray(),{source_group_id:group.source_group_id});if(subtreeCircuitJson.filter(item=>item.type==="source_component").length<=1)return;let floatingGraph=convertCircuitJsonToBpc(subtreeCircuitJson);debug52.enabled&&global?.debugGraphics&&global.debugGraphics?.push(getGraphicsForBpcGraph(floatingGraph,{title:`floatingBpcGraph-${group.name}`}));let floatingGraphNoNotConnected={boxes:floatingGraph.boxes,pins:floatingGraph.pins.map(p5=>({...p5,color:p5.color.replace("not_connected","normal")}))},{result:laidOutBpcGraph}=layoutSchematicGraphVariants([{variantName:"default",floatingGraph},{variantName:"noNotConnected",floatingGraph:floatingGraphNoNotConnected}],{singletonKeys:["vcc/2","gnd/2"],centerPinColors:["netlabel_center","component_center"],floatingBoxIdsWithMutablePinOffsets:new Set(floatingGraph.boxes.filter(box2=>floatingGraph.pins.filter(p5=>p5.boxId===box2.boxId).filter(bp3=>!bp3.color.includes("center")).length<=2).map(b4=>b4.boxId)),corpus:{}});debug52.enabled&&global?.debugGraphics&&global.debugGraphics?.push(getGraphicsForBpcGraph(laidOutBpcGraph,{title:`laidOutBpcGraph-${group.name}`}));let groupOffset=group._getGlobalSchematicPositionBeforeLayout();for(let box2 of laidOutBpcGraph.boxes){if(!box2.center)continue;let schematic_component22=db3.schematic_component.get(box2.boxId);if(schematic_component22){let newCenter={x:box2.center.x+groupOffset.x,y:box2.center.y+groupOffset.y},ports=db3.schematic_port.list({schematic_component_id:schematic_component22.schematic_component_id}),texts=db3.schematic_text.list({schematic_component_id:schematic_component22.schematic_component_id}),positionDelta={x:newCenter.x-schematic_component22.center.x,y:newCenter.y-schematic_component22.center.y};for(let port of ports)port.center.x+=positionDelta.x,port.center.y+=positionDelta.y;for(let text of texts)text.position.x+=positionDelta.x,text.position.y+=positionDelta.y;updateSchematicPrimitivesForLayoutShift({db:db3,schematicComponentId:schematic_component22.schematic_component_id,deltaX:positionDelta.x,deltaY:positionDelta.y}),schematic_component22.center=newCenter;continue}let schematic_net_label3=db3.schematic_net_label.get(box2.boxId);if(schematic_net_label3){let pin=laidOutBpcGraph.pins.find(p5=>p5.boxId===box2.boxId&&p5.color==="netlabel_center");if(!pin)throw new Error(`No pin found for net label: ${box2.boxId}`);let finalCenter={x:box2.center.x+groupOffset.x,y:box2.center.y+groupOffset.y};schematic_net_label3.center=finalCenter,schematic_net_label3.anchor_position={x:finalCenter.x+pin.offset.x,y:finalCenter.y+pin.offset.y};continue}console.error(`No schematic element found for box: ${box2.boxId}. This is a bug in the matchAdapt binding with @tscircuit/core`)}}var SYMBOL_TEXT_FONT_SIZE=.18,TEXT_BOX_ENABLED_FTYPES=new Set(["simple_resistor","simple_capacitor","simple_inductor","simple_crystal","simple_resonator","simple_potentiometer","simple_fuse","simple_diode","simple_led","simple_transistor","simple_mosfet","simple_op_amp"]);function getTextBounds({text,position:position4,anchor,fontSize}){let width=getSchematicNetLabelTextWidth({text,font_size:fontSize}),height=fontSize,relMinX,relMaxX;anchor.includes("left")?(relMinX=0,relMaxX=width):anchor.includes("right")?(relMinX=-width,relMaxX=0):(relMinX=-width/2,relMaxX=width/2);let relMinY,relMaxY;return anchor.includes("top")?(relMinY=-height,relMaxY=0):anchor.includes("bottom")?(relMinY=0,relMaxY=height):(relMinY=-height/2,relMaxY=height/2),{minX:position4.x+relMinX,maxX:position4.x+relMaxX,minY:position4.y+relMinY,maxY:position4.y+relMaxY}}function getSymbolTextBounds({schematicComponent,sourceComponent}){if(!schematicComponent.symbol_name)return[];let symbol=rc[schematicComponent.symbol_name];if(!symbol?.primitives||!symbol.center)return[];let textBounds=[];for(let primitive of symbol.primitives){if(primitive.type!=="text")continue;let value;primitive.text==="{REF}"?value=sourceComponent?.display_name??sourceComponent?.name??"":primitive.text==="{VAL}"?value=schematicComponent.symbol_display_value??"":value=primitive.text??"",value&&textBounds.push(getTextBounds({text:value,position:{x:primitive.x-symbol.center.x+schematicComponent.center.x,y:primitive.y-symbol.center.y+schematicComponent.center.y},anchor:primitive.anchor??"center",fontSize:SYMBOL_TEXT_FONT_SIZE}))}return textBounds}function getSymbolBoxBounds(schematicComponent){return getBoundFromCenteredRect({center:schematicComponent.center,width:schematicComponent.size.width,height:schematicComponent.size.height})}function getSchematicComponentTextInclusiveBounds(db3,schematicComponent){if(!schematicComponent.center||!schematicComponent.size)return null;let sourceComponent=schematicComponent.source_component_id?db3.source_component.get(schematicComponent.source_component_id):void 0;if(!sourceComponent||!TEXT_BOX_ENABLED_FTYPES.has(sourceComponent.ftype))return null;let textBounds=getSymbolTextBounds({schematicComponent,sourceComponent});if(textBounds.length===0)return null;let boxBounds=getSymbolBoxBounds(schematicComponent),bounds={...boxBounds};for(let textBound of textBounds)bounds.minX=Math.min(bounds.minX,textBound.minX),bounds.maxX=Math.max(bounds.maxX,textBound.maxX),bounds.minY=Math.min(bounds.minY,textBound.minY),bounds.maxY=Math.max(bounds.maxY,textBound.maxY);return bounds.minX===boxBounds.minX&&bounds.maxX===boxBounds.maxX&&bounds.minY===boxBounds.minY&&bounds.maxY===boxBounds.maxY?null:bounds}function getSchematicComponentWithTextBounds(db3,schematicComponent){let textBounds=getSchematicComponentTextInclusiveBounds(db3,schematicComponent);if(!textBounds)return null;let boxBounds=getSymbolBoxBounds(schematicComponent);if(schematicComponent.size.height>schematicComponent.size.width)return textBounds;let padLeft=Math.max(0,boxBounds.minX-textBounds.minX),padRight=Math.max(0,textBounds.maxX-boxBounds.maxX),padTop=Math.max(0,textBounds.maxY-boxBounds.maxY),padBottom=Math.max(0,boxBounds.minY-textBounds.minY),left=padLeft,right=padRight;padLeft>0&&padRight>0&&(left=Math.max(padLeft,padRight),right=left);let top=padTop,bottom=padBottom;return padTop>0&&padBottom>0&&(top=Math.max(padTop,padBottom),bottom=top),{minX:boxBounds.minX-left,maxX:boxBounds.maxX+right,minY:boxBounds.minY-bottom,maxY:boxBounds.maxY+top}}var debug62=(0,import_debug14.default)("Group_doInitialSchematicLayoutMatchpack"),DEFAULT_AVAILABLE_ROTATIONS=[0,90,180,270],ROTATION_TO_PLACE_SIDE_ON_TOP={"y+":0,"x+":90,"y-":180,"x-":270};function facingDirectionToSide(facingDirection){switch(facingDirection){case"up":return"y+";case"down":return"y-";case"left":return"x-";case"right":return"x+";default:return"y+"}}function applyPowerGroundRotationConstraints(problem){for(let chip of Object.values(problem.chipMap)){if(chip.pins.length!==2||chip.availableRotations?.length!==DEFAULT_AVAILABLE_ROTATIONS.length)continue;let powerGroundRotations=new Set;for(let pinId of chip.pins){let pin=problem.chipPinMap[pinId];if(pin)for(let[netId,net]of Object.entries(problem.netMap)){if(!problem.netConnMap[`${pinId}-${netId}`]||net.isPositiveVoltageSource===net.isGround)continue;let rotationToPlacePinOnTop=ROTATION_TO_PLACE_SIDE_ON_TOP[pin.side],rotation42=net.isPositiveVoltageSource?rotationToPlacePinOnTop:(rotationToPlacePinOnTop+180)%360;powerGroundRotations.add(rotation42)}}powerGroundRotations.size===1&&(chip.availableRotations=[powerGroundRotations.values().next().value])}}function rotateDirection2(direction2,degrees2){let directions=["right","up","left","down"],currentIndex=directions.indexOf(direction2);if(currentIndex===-1)return direction2;let steps=Math.round(degrees2/90),newIndex=(currentIndex+steps)%4;return directions[newIndex<0?newIndex+4:newIndex]}function isTreeChildExplicitlyPositioned(treeChild,group){if(treeChild.nodeType==="component"&&treeChild.sourceComponent){let component=group.children.find(groupChild=>groupChild.source_component_id===treeChild.sourceComponent?.source_component_id);return component?._parsedProps?.schX!==void 0||component?._parsedProps?.schY!==void 0}if(treeChild.nodeType==="group"&&treeChild.sourceGroup){let nestedGroup=group.children.find(groupChild=>groupChild.source_group_id===treeChild.sourceGroup?.source_group_id);return nestedGroup?._parsedProps?.schX!==void 0||nestedGroup?._parsedProps?.schY!==void 0}return!1}function getTreeChildChipId(child,index){return child.nodeType==="component"&&child.sourceComponent?child.sourceComponent.name||`chip_${index}`:child.nodeType==="group"&&child.sourceGroup?child.sourceGroup.name||`group_${index}`:null}function convertTreeToMatchPackInputProblem(tree,db3,group){let problem={chipMap:{},chipPinMap:{},netMap:{},pinStrongConnMap:{},netConnMap:{},chipGap:.6,decouplingCapsGap:.4,partitionGap:1.2},groupOffset=group._getGlobalSchematicPositionBeforeLayout();debug62(`[${group.name}] Processing ${tree.childNodes.length} child nodes for input problem`),tree.childNodes.forEach((child,index)=>{let explicitlyPositioned=isTreeChildExplicitlyPositioned(child,group);if(debug62(explicitlyPositioned?`[${group.name}] Child ${index} explicitly positioned, including as fixed chip`:`[${group.name}] Processing child ${index}: nodeType=${child.nodeType}`),child.nodeType==="component"?debug62(`[${group.name}] - Component: ${child.sourceComponent?.name}`):child.nodeType==="group"&&debug62(`[${group.name}] - Group: ${child.sourceGroup?.name}`),child.nodeType==="component"&&child.sourceComponent){let chipId=getTreeChildChipId(child,index),schematicComponent=db3.schematic_component.getWhere({source_component_id:child.sourceComponent.source_component_id});if(!schematicComponent)return;let component=group.children.find(groupChild=>groupChild.source_component_id===child.sourceComponent?.source_component_id),availableRotations=[...DEFAULT_AVAILABLE_ROTATIONS];component?._parsedProps?.schOrientation&&(availableRotations=[0]),component?._parsedProps?.schRotation!==void 0&&(availableRotations=[0]),component?._parsedProps?.facingDirection&&(availableRotations=[0]),component?._parsedProps?.schFacingDirection&&(availableRotations=[0]),component?.componentName==="Chip"&&(availableRotations=[0]);let componentWithTextBounds=getSchematicComponentWithTextBounds(db3,schematicComponent),textPadLeft=0,textPadRight=0,textPadTop=0,textPadBottom=0;if(componentWithTextBounds&&schematicComponent.center){let halfWidth=(schematicComponent.size?.width??0)/2,halfHeight=(schematicComponent.size?.height??0)/2;textPadLeft=schematicComponent.center.x-halfWidth-componentWithTextBounds.minX,textPadRight=componentWithTextBounds.maxX-(schematicComponent.center.x+halfWidth),textPadTop=componentWithTextBounds.maxY-(schematicComponent.center.y+halfHeight),textPadBottom=schematicComponent.center.y-halfHeight-componentWithTextBounds.minY}let marginLeft=(component?._parsedProps?.schMarginLeft??component?._parsedProps?.schMarginX??0)+textPadLeft,marginRight=(component?._parsedProps?.schMarginRight??component?._parsedProps?.schMarginX??0)+textPadRight,marginTop=(component?._parsedProps?.schMarginTop??component?._parsedProps?.schMarginY??0)+textPadTop,marginBottom=(component?._parsedProps?.schMarginBottom??component?._parsedProps?.schMarginY??0)+textPadBottom;component?.config.shouldRenderAsSchematicBox&&(marginTop+=.4,marginBottom+=.4);let marginXShift=(marginRight-marginLeft)/2,marginYShift=(marginTop-marginBottom)/2;problem.chipMap[chipId]={chipId,pins:[],size:{x:(schematicComponent.size?.width||1)+marginLeft+marginRight,y:(schematicComponent.size?.height||1)+marginTop+marginBottom},availableRotations,...explicitlyPositioned&&{fixedPosition:{x:schematicComponent.center.x-groupOffset.x,y:schematicComponent.center.y-groupOffset.y}}};let ports=db3.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id});for(let port of ports){let sourcePort=db3.source_port.get(port.source_port_id);if(!sourcePort)continue;let pinId=`${chipId}.${sourcePort.pin_number||sourcePort.name||port.schematic_port_id}`;problem.chipMap[chipId].pins.push(pinId);let side=facingDirectionToSide(port.facing_direction);problem.chipPinMap[pinId]={pinId,offset:{x:(port.center?.x||0)-(schematicComponent.center.x||0),y:(port.center?.y||0)-(schematicComponent.center.y||0)},side}}}else if(child.nodeType==="group"&&child.sourceGroup){let groupId=getTreeChildChipId(child,index);debug62(`[${group.name}] Processing nested group: ${groupId}`);let schematicGroup=db3.schematic_group?.getWhere?.({source_group_id:child.sourceGroup.source_group_id}),groupInstance=group.children.find(groupChild=>groupChild.source_group_id===child.sourceGroup?.source_group_id);if(debug62(`[${group.name}] Found schematic_group for ${groupId}:`,schematicGroup),schematicGroup){debug62(`[${group.name}] Treating group ${groupId} as composite chip`);let groupComponents=db3.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});debug62(`[${group.name}] Group ${groupId} has ${groupComponents.length} components:`,groupComponents.map(c6=>c6.source_component_id));let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0,hasValidBounds=!1;for(let comp of groupComponents)if(comp.center&&comp.size){hasValidBounds=!0;let compBounds=getSchematicComponentWithTextBounds(db3,comp)??getBoundFromCenteredRect({center:comp.center,width:comp.size.width,height:comp.size.height});minX=Math.min(minX,compBounds.minX),maxX=Math.max(maxX,compBounds.maxX),minY=Math.min(minY,compBounds.minY),maxY=Math.max(maxY,compBounds.maxY)}let marginLeft=groupInstance?._parsedProps?.schMarginLeft??groupInstance?._parsedProps?.schMarginX??0,marginRight=groupInstance?._parsedProps?.schMarginRight??groupInstance?._parsedProps?.schMarginX??0,marginTop=groupInstance?._parsedProps?.schMarginTop??groupInstance?._parsedProps?.schMarginY??0,marginBottom=groupInstance?._parsedProps?.schMarginBottom??groupInstance?._parsedProps?.schMarginY??0,marginXShift=(marginRight-marginLeft)/2,marginYShift=(marginTop-marginBottom)/2,groupWidth=(hasValidBounds?maxX-minX:2)+marginLeft+marginRight,groupHeight=(hasValidBounds?maxY-minY:2)+marginTop+marginBottom;debug62(`[${group.name}] Group ${groupId} computed size: ${groupWidth} x ${groupHeight}`);let groupPins=[];for(let comp of groupComponents){let ports=db3.schematic_port.list({schematic_component_id:comp.schematic_component_id});for(let port of ports){let sourcePort=db3.source_port.get(port.source_port_id);if(!sourcePort)continue;let pinId=`${groupId}.${sourcePort.pin_number||sourcePort.name||port.schematic_port_id}`;groupPins.push(pinId);let groupCenter=schematicGroup.center||{x:0,y:0},side=facingDirectionToSide(port.facing_direction);problem.chipPinMap[pinId]={pinId,offset:{x:(port.center?.x||0)-groupCenter.x+marginXShift,y:(port.center?.y||0)-groupCenter.y+marginYShift},side}}}debug62(`[${group.name}] Group ${groupId} has ${groupPins.length} pins:`,groupPins),problem.chipMap[groupId]={chipId:groupId,pins:groupPins,size:{x:groupWidth,y:groupHeight}},debug62(`[${group.name}] Added group ${groupId} to chipMap`)}else debug62(`[${group.name}] Warning: No schematic_group found for group ${groupId}`)}}),debug62(`[${group.name}] Creating connections using connectivity keys`);let connectivityGroups=new Map;for(let[chipId,chip]of Object.entries(problem.chipMap))for(let pinId of chip.pins){let pinNumber=pinId.split(".").pop(),treeNode=tree.childNodes.find(child=>getTreeChildChipId(child,tree.childNodes.indexOf(child))===chipId);if(treeNode?.nodeType==="group"&&treeNode.sourceGroup){let schematicGroup=db3.schematic_group?.getWhere?.({source_group_id:treeNode.sourceGroup.source_group_id});if(schematicGroup){let groupComponents=db3.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});for(let comp of groupComponents){let sourcePorts=db3.source_port.list({source_component_id:comp.source_component_id});for(let sourcePort of sourcePorts){let portNumber=sourcePort.pin_number||sourcePort.name;if(String(portNumber)===String(pinNumber))if(sourcePort.subcircuit_connectivity_map_key){let connectivityKey=sourcePort.subcircuit_connectivity_map_key;connectivityGroups.has(connectivityKey)||connectivityGroups.set(connectivityKey,[]),connectivityGroups.get(connectivityKey).push(pinId),debug62(`[${group.name}] \u2713 Pin ${pinId} has connectivity key: ${connectivityKey}`)}else debug62(`[${group.name}] Pin ${pinId} has no connectivity key`)}}}}else if(treeNode?.nodeType==="component"&&treeNode.sourceComponent){let sourcePorts=db3.source_port.list({source_component_id:treeNode.sourceComponent.source_component_id});for(let sourcePort of sourcePorts){let portNumber=sourcePort.pin_number||sourcePort.name;if(String(portNumber)===String(pinNumber)&&sourcePort.subcircuit_connectivity_map_key){let connectivityKey=sourcePort.subcircuit_connectivity_map_key;connectivityGroups.has(connectivityKey)||connectivityGroups.set(connectivityKey,[]),connectivityGroups.get(connectivityKey).push(pinId),debug62(`[${group.name}] Pin ${pinId} has connectivity key: ${connectivityKey}`)}}}}debug62(`[${group.name}] Found ${connectivityGroups.size} connectivity groups:`,Array.from(connectivityGroups.entries()).map(([key,pins])=>({key,pins})));for(let[connectivityKey,pins]of connectivityGroups){let tracesWithThisKey=db3.source_trace.list().filter(trace=>trace.subcircuit_connectivity_map_key===connectivityKey),hasNetConnections=tracesWithThisKey.some(trace=>trace.connected_source_net_ids&&trace.connected_source_net_ids.length>0),hasDirectConnections=tracesWithThisKey.some(trace=>trace.connected_source_port_ids&&trace.connected_source_port_ids.length>=2);if(debug62(`[${group.name}] Connectivity ${connectivityKey}: hasNetConnections=${hasNetConnections}, hasDirectConnections=${hasDirectConnections}`),pins.length>=2&&hasDirectConnections){for(let trace of tracesWithThisKey)if(trace.connected_source_port_ids&&trace.connected_source_port_ids.length>=2){let directlyConnectedPins=[];for(let portId of trace.connected_source_port_ids)for(let pinId of pins){let pinNumber=pinId.split(".").pop(),sourcePort=db3.source_port.get(portId);if(sourcePort&&String(sourcePort.pin_number||sourcePort.name)===String(pinNumber)){let chipId=pinId.split(".")[0],treeNode=tree.childNodes.find(child=>getTreeChildChipId(child,tree.childNodes.indexOf(child))===chipId);treeNode?.nodeType==="component"&&treeNode.sourceComponent&&db3.source_port.list({source_component_id:treeNode.sourceComponent.source_component_id}).some(p5=>p5.source_port_id===portId)&&directlyConnectedPins.push(pinId)}}for(let i3=0;i3<directlyConnectedPins.length;i3++)for(let j5=i3+1;j5<directlyConnectedPins.length;j5++){let pin1=directlyConnectedPins[i3],pin2=directlyConnectedPins[j5];problem.pinStrongConnMap[`${pin1}-${pin2}`]=!0,problem.pinStrongConnMap[`${pin2}-${pin1}`]=!0,debug62(`[${group.name}] Created strong connection: ${pin1} <-> ${pin2}`)}}}if(hasNetConnections){let source_net3=db3.source_net.getWhere({subcircuit_connectivity_map_key:connectivityKey}),isGround=source_net3?.is_ground??!1,isPositiveVoltageSource=source_net3?.is_power===!0||source_net3?.is_positive_voltage_source===!0;problem.netMap[connectivityKey]={netId:connectivityKey,isGround,isPositiveVoltageSource};for(let pinId of pins)problem.netConnMap[`${pinId}-${connectivityKey}`]=!0;debug62(`[${group.name}] Created net ${connectivityKey} with ${pins.length} pins:`,pins)}}return applyPowerGroundRotationConstraints(problem),problem}function applySchematicMatchPackLayoutToTree(group,tree){let{db:db3}=group.root;if(debug62(`[${group.name}] Starting matchpack layout with ${tree.childNodes.length} children`),debug62(`[${group.name}] Tree structure:`,JSON.stringify(tree,null,2)),tree.childNodes.length<=1){debug62(`[${group.name}] Only ${tree.childNodes.length} children, skipping layout`);return}debug62("Converting circuit tree to InputProblem...");let inputProblem=convertTreeToMatchPackInputProblem(tree,db3,group);debug62.enabled&&group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`matchpack-input-problem-${group.name}`,content:JSON.stringify(inputProblem,null,2)});let solver=new LayoutPipelineSolver(inputProblem);if(debug62("Starting LayoutPipelineSolver..."),debug62.enabled&&global?.debugGraphics){let initialViz=solver.visualize();global.debugGraphics.push({...initialViz,title:`matchpack-initial-${group.name}`})}if(solver.solve(),debug62(`Solver completed in ${solver.iterations} iterations`),debug62(`Solved: ${solver.solved}, Failed: ${solver.failed}`),solver.failed)throw debug62(`Solver failed with error: ${solver.error}`),new Error(`Matchpack layout solver failed: ${solver.error}`);let outputLayout=solver.getOutputLayout();if(debug62("OutputLayout:",JSON.stringify(outputLayout,null,2)),debug62("Solver completed successfully:",!solver.failed),debug62.enabled&&global?.debugGraphics){let finalViz=solver.visualize();global.debugGraphics.push({...finalViz,title:`matchpack-final-${group.name}`})}let overlaps=solver.checkForOverlaps(outputLayout);if(overlaps.length>0){debug62(`Warning: Found ${overlaps.length} overlapping components:`);for(let overlap of overlaps)debug62(` ${overlap.chip1} overlaps ${overlap.chip2} (area: ${overlap.overlapArea})`)}let groupOffset=group._getGlobalSchematicPositionBeforeLayout();debug62(`Group offset: x=${groupOffset.x}, y=${groupOffset.y}`),debug62(`Applying layout results for ${Object.keys(outputLayout.chipPlacements).length} chip placements`);for(let[chipId,placement]of Object.entries(outputLayout.chipPlacements)){debug62(`Processing placement for chip: ${chipId} at (${placement.x}, ${placement.y})`);let treeNode=tree.childNodes.find(child=>{let expectedChipId=getTreeChildChipId(child,tree.childNodes.indexOf(child)),matches=expectedChipId===chipId;return debug62(` Checking child ${expectedChipId}: matches=${matches}`),matches});if(!treeNode){debug62(`Warning: No tree node found for chip: ${chipId}`),debug62("Available tree nodes:",tree.childNodes.map((child,idx)=>({type:child.nodeType,name:child.nodeType==="component"?child.sourceComponent?.name:child.sourceGroup?.name,expectedChipId:getTreeChildChipId(child,idx)})));continue}let newCenter={x:placement.x+groupOffset.x,y:placement.y+groupOffset.y};if(treeNode.nodeType==="component"&&treeNode.sourceComponent){let groupChild=group.children.find(c6=>c6.source_component_id===treeNode.sourceComponent?.source_component_id);if(groupChild?._parsedProps?.schX!==void 0||groupChild?._parsedProps?.schY!==void 0){debug62(`Skipping position update for fixed chip ${chipId}`);continue}let schematicComponent=db3.schematic_component.getWhere({source_component_id:treeNode.sourceComponent.source_component_id});if(schematicComponent){debug62(`Moving component ${chipId} to (${newCenter.x}, ${newCenter.y})`);let ports=db3.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id}),texts=db3.schematic_text.list({schematic_component_id:schematicComponent.schematic_component_id}),positionDelta={x:newCenter.x-schematicComponent.center.x,y:newCenter.y-schematicComponent.center.y};for(let port of ports)port.center.x+=positionDelta.x,port.center.y+=positionDelta.y;for(let text of texts)text.position.x+=positionDelta.x,text.position.y+=positionDelta.y;if(updateSchematicPrimitivesForLayoutShift({db:db3,schematicComponentId:schematicComponent.schematic_component_id,deltaX:positionDelta.x,deltaY:positionDelta.y}),schematicComponent.center=newCenter,placement.ccwRotationDegrees!==0){debug62(`Component ${chipId} has rotation: ${placement.ccwRotationDegrees}\xB0`);let normalizedRotation=(Math.round(placement.ccwRotationDegrees)%360+360)%360;if((normalizedRotation===90||normalizedRotation===270)&&schematicComponent.size){let prevWidth=schematicComponent.size.width;schematicComponent.size.width=schematicComponent.size.height,schematicComponent.size.height=prevWidth}let angleRad=placement.ccwRotationDegrees*Math.PI/180,cos6=Math.cos(angleRad),sin6=Math.sin(angleRad);for(let port of ports){let dx3=port.center.x-newCenter.x,dy3=port.center.y-newCenter.y,rotatedDx=dx3*cos6-dy3*sin6,rotatedDy=dx3*sin6+dy3*cos6;port.center.x=newCenter.x+rotatedDx,port.center.y=newCenter.y+rotatedDy;let originalDirection=port.facing_direction||"right";port.facing_direction=rotateDirection2(originalDirection,placement.ccwRotationDegrees),port.side_of_component=(port.facing_direction==="up"?"top":port.facing_direction==="down"?"bottom":port.facing_direction)||port.side_of_component}for(let text of texts){let dx3=text.position.x-newCenter.x,dy3=text.position.y-newCenter.y,rotatedDx=dx3*cos6-dy3*sin6,rotatedDy=dx3*sin6+dy3*cos6;text.position.x=newCenter.x+rotatedDx,text.position.y=newCenter.y+rotatedDy}if(schematicComponent.symbol_name){let schematicSymbolDirection=schematicComponent.symbol_name.match(/_(right|left|up|down)$/);schematicSymbolDirection&&(schematicComponent.symbol_name=schematicComponent.symbol_name.replace(schematicSymbolDirection[0],`_${rotateDirection2(schematicSymbolDirection[1],placement.ccwRotationDegrees)}`));let schematicSymbolOrientation=schematicComponent.symbol_name.match(/_(horz|vert)$/);if(schematicSymbolOrientation){let normalizedRot=(placement.ccwRotationDegrees%360+360)%360;(normalizedRot===90||normalizedRot===270)&&(schematicComponent.symbol_name=schematicComponent.symbol_name.replace(schematicSymbolOrientation[0],schematicSymbolOrientation[1]==="horz"?"_vert":"_horz"))}}}}}else if(treeNode.nodeType==="group"&&treeNode.sourceGroup){let schematicGroup=db3.schematic_group?.getWhere?.({source_group_id:treeNode.sourceGroup.source_group_id});if(schematicGroup){debug62(`Moving group ${chipId} to (${newCenter.x}, ${newCenter.y}) from (${schematicGroup.center?.x}, ${schematicGroup.center?.y})`);let groupComponents=db3.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});debug62(`Group ${chipId} has ${groupComponents.length} components to move`);let oldCenter=schematicGroup.center||{x:0,y:0},positionDelta={x:newCenter.x-oldCenter.x,y:newCenter.y-oldCenter.y};debug62(`Position delta for group ${chipId}: (${positionDelta.x}, ${positionDelta.y})`);for(let component of groupComponents)if(component.center){let oldComponentCenter={...component.center};component.center.x+=positionDelta.x,component.center.y+=positionDelta.y,debug62(`Moved component ${component.source_component_id} from (${oldComponentCenter.x}, ${oldComponentCenter.y}) to (${component.center.x}, ${component.center.y})`);let ports=db3.schematic_port.list({schematic_component_id:component.schematic_component_id}),texts=db3.schematic_text.list({schematic_component_id:component.schematic_component_id});for(let port of ports)port.center&&(port.center.x+=positionDelta.x,port.center.y+=positionDelta.y);for(let text of texts)text.position&&(text.position.x+=positionDelta.x,text.position.y+=positionDelta.y)}schematicGroup.center=newCenter,debug62(`Updated group ${chipId} center to (${newCenter.x}, ${newCenter.y})`)}}}debug62("Matchpack layout completed successfully")}function getSchematicSheetIdByGroupId({circuitJson,sheetIdBySourceComponentId}){let parentBySourceGroupId=new Map;for(let element of circuitJson)element.type==="source_group"&&parentBySourceGroupId.set(element.source_group_id,element.parent_source_group_id);let sheetIdByGroupId=new Map;for(let element of circuitJson){if(element.type!=="source_component"||!element.source_group_id)continue;let sheetId=sheetIdBySourceComponentId.get(element.source_component_id);if(sheetId===void 0)continue;let groupId=element.source_group_id;for(;groupId&&!sheetIdByGroupId.has(groupId);)sheetIdByGroupId.set(groupId,sheetId),groupId=parentBySourceGroupId.get(groupId)}return sheetIdByGroupId}function getCircuitJsonScopedToSchematicSheet({circuitJson,sheetId,rootSourceGroupId,sheetIdBySourceComponentId,sheetIdByGroupId}){let isGroupOnSheet=sourceGroupId=>sourceGroupId===rootSourceGroupId||sheetIdByGroupId.get(sourceGroupId)===sheetId;return circuitJson.filter(element=>element.type==="source_group"?isGroupOnSheet(element.source_group_id):element.type==="source_component"?sheetIdBySourceComponentId.get(element.source_component_id)!==sheetId?!1:element.source_group_id?isGroupOnSheet(element.source_group_id):!0:!0)}function getSchematicCircuitJsonTrees(circuitJson,opts){let{source_group_id}=opts,sheetIdBySourceComponentId=new Map;for(let element of circuitJson)element.type==="schematic_component"&&element.source_component_id&&element.schematic_sheet_id&&sheetIdBySourceComponentId.set(element.source_component_id,element.schematic_sheet_id);let sheetIds=new Set(sheetIdBySourceComponentId.values());if(sheetIds.size<=1)return[getCircuitJsonTree(circuitJson,{source_group_id})];let sheetIdByGroupId=getSchematicSheetIdByGroupId({circuitJson,sheetIdBySourceComponentId});return Array.from(sheetIds).map(sheetId=>getCircuitJsonTree(getCircuitJsonScopedToSchematicSheet({circuitJson,sheetId,rootSourceGroupId:source_group_id,sheetIdBySourceComponentId,sheetIdByGroupId}),{source_group_id}))}function Group_doInitialSchematicLayoutMatchPack(group){let{db:db3}=group.root,trees=getSchematicCircuitJsonTrees(db3.toArray(),{source_group_id:group.source_group_id});for(let tree of trees)applySchematicMatchPackLayoutToTree(group,tree)}var SECTION_GAP=1,MARGIN2=1.5;function computeSchematicSectionLayoutUsingRows({sectionBlocks,groupSchPositionBeforeLayout:groupOffset}){let totalArea=sectionBlocks.reduce((sum,block)=>{let paddedWidth=Math.max(block.size.x,.5)+MARGIN2*2,paddedHeight=Math.max(block.size.y,.5)+MARGIN2*2;return sum+paddedWidth*paddedHeight},0),targetRowWidth=Math.sqrt(totalArea)*2,computedSectionsMatrix=[],currentSectionRow=[],currentRowSectionWidth=0;for(let section of sectionBlocks){let paddedWidth=Math.max(section.size.x,.5)+MARGIN2*2,paddedHeight=Math.max(section.size.y,.5)+MARGIN2*2,neededWidth=currentRowSectionWidth>0?currentRowSectionWidth+SECTION_GAP+paddedWidth:paddedWidth;currentSectionRow.length>0&&neededWidth>targetRowWidth&&(computedSectionsMatrix.push(currentSectionRow),currentSectionRow=[],currentRowSectionWidth=0);let xOffsetInRow=currentRowSectionWidth>0?currentRowSectionWidth+SECTION_GAP:0;currentSectionRow.push({sectionName:section.sectionName,rowOffset:xOffsetInRow,width:paddedWidth,height:paddedHeight}),currentRowSectionWidth=xOffsetInRow+paddedWidth}currentSectionRow.length>0&&computedSectionsMatrix.push(currentSectionRow);let sectionPlacements=new Map,rowY=0;for(let sectionRow of computedSectionsMatrix){let rowHeight=Math.max(...sectionRow.map(rowEntry=>rowEntry.height)),rowCenteringOffsetX=-(sectionRow[sectionRow.length-1].rowOffset+sectionRow[sectionRow.length-1].width)/2;for(let section of sectionRow)sectionPlacements.set(section.sectionName,{x:rowCenteringOffsetX+section.rowOffset+section.width/2+groupOffset.x,y:rowY-rowHeight/2+groupOffset.y});rowY-=rowHeight+SECTION_GAP}return sectionPlacements}var debug7=(0,import_debug15.default)("Group_doInitialSchematicLayoutSections");function Group_doInitialSchematicLayoutSections(group){let{db:db3}=group.root,sectionNamesUsedByChildren=new Set,hasChildrenWithoutSection=!1;for(let child of group.children){if(!child.source_component_id)continue;let sectionName=child.getSchematicSectionName();sectionName!==null?sectionNamesUsedByChildren.add(sectionName):hasChildrenWithoutSection=!0}let sectionNamesToLayout=Array.from(sectionNamesUsedByChildren);if(hasChildrenWithoutSection&&sectionNamesToLayout.push(null),sectionNamesToLayout.length===0)return;for(let sectionName of sectionNamesToLayout){let sectionTree=getCircuitJsonTree(db3.toArray(),{source_group_id:group.source_group_id});sectionTree.childNodes=sectionTree.childNodes.filter(child=>child.nodeType!=="component"||!child.sourceComponent?!1:(group.children.find(c6=>c6.source_component_id===child.sourceComponent?.source_component_id)?.getSchematicSectionName()??null)===sectionName),applySchematicMatchPackLayoutToTree(group,sectionTree)}if(sectionNamesToLayout.length<=1)return;let sectionNameToBoundsWithChildren=new Map;for(let sectionName of sectionNamesToLayout){let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0,sourceCompIds=new Set;for(let child of group.children){let sourceComponentId=child.source_component_id;if(!sourceComponentId||child.getSchematicSectionName()!==sectionName)continue;let schComp=db3.schematic_component.getWhere({source_component_id:sourceComponentId});if(!schComp)continue;sourceCompIds.add(sourceComponentId);let hw2=schComp.size.width/2,hh3=schComp.size.height/2;minX=Math.min(minX,schComp.center.x-hw2),maxX=Math.max(maxX,schComp.center.x+hw2),minY=Math.min(minY,schComp.center.y-hh3),maxY=Math.max(maxY,schComp.center.y+hh3)}!Number.isFinite(minX)||sourceCompIds.size===0||sectionNameToBoundsWithChildren.set(sectionName,{sectionName,center:{x:(minX+maxX)/2,y:(minY+maxY)/2},size:{x:maxX-minX,y:maxY-minY},sourceCompIds})}if(sectionNameToBoundsWithChildren.size<=1)return;let anchoredSections=new Set;for(let child of group.children){if(!child.source_component_id)continue;let props=child._parsedProps;(props?.schX!==void 0||props?.schY!==void 0)&&anchoredSections.add(child.getSchematicSectionName())}let groupSchPositionBeforeLayout=group._getGlobalSchematicPositionBeforeLayout(),sectionPlacements=computeSchematicSectionLayoutUsingRows({sectionBlocks:Array.from(sectionNameToBoundsWithChildren.values()).map(bounds=>({sectionName:bounds.sectionName,size:bounds.size})),groupSchPositionBeforeLayout});for(let[sectionName,placement]of sectionPlacements){let boundsWithChildren=sectionNameToBoundsWithChildren.get(sectionName);if(!boundsWithChildren)continue;if(anchoredSections.has(sectionName)){debug7(`[${group.name}] Section "${sectionName}" anchored by manual position, skipping shift`);continue}let delta={x:placement.x-boundsWithChildren.center.x,y:placement.y-boundsWithChildren.center.y};for(let sourceComponentId of boundsWithChildren.sourceCompIds){let schComp=db3.schematic_component.getWhere({source_component_id:sourceComponentId});if(!schComp)continue;let ports=db3.schematic_port.list({schematic_component_id:schComp.schematic_component_id}),texts=db3.schematic_text.list({schematic_component_id:schComp.schematic_component_id});for(let port of ports)port.center.x+=delta.x,port.center.y+=delta.y;for(let text of texts)text.position.x+=delta.x,text.position.y+=delta.y;updateSchematicPrimitivesForLayoutShift({db:db3,schematicComponentId:schComp.schematic_component_id,deltaX:delta.x,deltaY:delta.y}),schComp.center={x:schComp.center.x+delta.x,y:schComp.center.y+delta.y}}}}var DEFAULT_MAX_MSP_PAIR_DISTANCE=2.4;function createSchematicTraceSolverInputProblem(group){let{db:db3}=group.root,connKeyToSourceNet=new Map,traces=group.selectAll("trace"),childGroups=group.selectAll("group"),allSchematicGroupIds=[group.schematic_group_id,...childGroups.map(a3=>a3.schematic_group_id)],schematicComponents=db3.schematic_component.list().filter(a3=>allSchematicGroupIds.includes(a3.schematic_group_id)),componentNameToSectionId=new Map;for(let component of group.getDescendants())component.name&&component._parsedProps?.schSectionName&&componentNameToSectionId.set(component.name,component._parsedProps.schSectionName);let chips=[],pinIdToSchematicPortId=new Map,schematicPortIdToPinId=new Map;for(let schematicComponent of schematicComponents){let chipId=schematicComponent.schematic_component_id,pins=[],sourceComponent=db3.source_component.getWhere({source_component_id:schematicComponent.source_component_id}),schematicPorts=db3.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id});for(let schematicPort of schematicPorts){let pinId=`${sourceComponent?.name??schematicComponent.schematic_component_id}.${schematicPort.pin_number}`;pinIdToSchematicPortId.set(pinId,schematicPort.schematic_port_id),schematicPortIdToPinId.set(schematicPort.schematic_port_id,pinId)}for(let schematicPort of schematicPorts){let pinId=schematicPortIdToPinId.get(schematicPort.schematic_port_id);pins.push({pinId,x:schematicPort.center.x,y:schematicPort.center.y})}let sectionId;sourceComponent?.name&&(sectionId=componentNameToSectionId.get(sourceComponent.name));let layoutBounds=getSchematicComponentWithTextBounds(db3,schematicComponent)??getBoundFromCenteredRect({center:schematicComponent.center,width:schematicComponent.size.width,height:schematicComponent.size.height});chips.push({chipId,center:getBoundsCenter(layoutBounds),width:layoutBounds.maxX-layoutBounds.minX,height:layoutBounds.maxY-layoutBounds.minY,pins,sectionId})}let allSourceAndSchematicPortIdsInScope=new Set,schPortIdToSourcePortId=new Map,sourcePortIdToSchPortId=new Map,userNetIdToConnKey=new Map;for(let sc2 of schematicComponents){let ports=db3.schematic_port.list({schematic_component_id:sc2.schematic_component_id});for(let sp3 of ports)allSourceAndSchematicPortIdsInScope.add(sp3.schematic_port_id),sp3.source_port_id&&(schPortIdToSourcePortId.set(sp3.schematic_port_id,sp3.source_port_id),sourcePortIdToSchPortId.set(sp3.source_port_id,sp3.schematic_port_id))}let allowedSubcircuitIds=new Set;group.subcircuit_id&&allowedSubcircuitIds.add(group.subcircuit_id);for(let cg2 of childGroups)cg2.subcircuit_id&&allowedSubcircuitIds.add(cg2.subcircuit_id);let tracesInScope=db3.source_trace.list().filter(st3=>{if(st3.subcircuit_id===group.subcircuit_id)return!0;for(let source_port_id of st3.connected_source_port_ids)if(sourcePortIdToSchPortId.has(source_port_id))return!0;return!1}),externalNetIds=tracesInScope.flatMap(st3=>st3.connected_source_net_ids);for(let netId of externalNetIds){let net=db3.source_net.get(netId);net?.subcircuit_id&&allowedSubcircuitIds.add(net.subcircuit_id)}let directConnections=[],connectedPairKeys=new Set,connKeysWithExplicitPortNetTraces=new Set;for(let sourceTrace of tracesInScope)sourceTrace?.subcircuit_connectivity_map_key&&(sourceTrace.connected_source_port_ids?.length??0)>0&&(sourceTrace.connected_source_net_ids?.length??0)>0&&connKeysWithExplicitPortNetTraces.add(sourceTrace.subcircuit_connectivity_map_key);for(let st3 of db3.source_trace.list()){if(st3.subcircuit_id&&!allowedSubcircuitIds.has(st3.subcircuit_id))continue;let connected=(st3.connected_source_port_ids??[]).map(srcId=>sourcePortIdToSchPortId.get(srcId)).filter(sourcePortId=>!!sourcePortId&&allSourceAndSchematicPortIdsInScope.has(sourcePortId));if(connected.length>=2){let[a3,b4]=connected.slice(0,2),pairKey=[a3,b4].sort().join("::");if(!connectedPairKeys.has(pairKey)){connectedPairKeys.add(pairKey);let traceLabel=st3.name??st3.display_name,userNetId=traceLabel??st3.source_trace_id;st3.subcircuit_connectivity_map_key&&userNetIdToConnKey.set(userNetId,st3.subcircuit_connectivity_map_key);let portA=db3.schematic_port.get(a3),portB=db3.schematic_port.get(b4),portDistance=0;portA&&portB&&(portDistance=Math.sqrt((portA.center.x-portB.center.x)**2+(portA.center.y-portB.center.y)**2));let maxMspDist=group._parsedProps.schMaxTraceDistance??DEFAULT_MAX_MSP_PAIR_DISTANCE,netLabelWidth;traceLabel&&!traceLabel.startsWith(".")&&portDistance>maxMspDist&&(netLabelWidth=Number(getSchematicNetLabelTextWidth({text:String(traceLabel),font_size:.14}).toFixed(2))),directConnections.push({pinIds:[a3,b4].map(id3=>schematicPortIdToPinId.get(id3)),netId:userNetId,netLabelWidth})}}}let netConnections=[];for(let net of db3.source_net.list().filter(n3=>!n3.subcircuit_id||allowedSubcircuitIds.has(n3.subcircuit_id)))net.subcircuit_connectivity_map_key&&connKeyToSourceNet.set(net.subcircuit_connectivity_map_key,net);let connKeyToPinIds=new Map;for(let[schId,srcPortId]of schPortIdToSourcePortId){let sp3=db3.source_port.get(srcPortId);if(!sp3?.subcircuit_connectivity_map_key)continue;let connKey=sp3.subcircuit_connectivity_map_key;connKeyToPinIds.has(connKey)||connKeyToPinIds.set(connKey,[]),connKeyToPinIds.get(connKey).push(schId)}for(let[connKey,schematicPortIds]of connKeyToPinIds){let sourceNet=connKeyToSourceNet.get(connKey);if(sourceNet&&schematicPortIds.length>=1){let userNetId=String(sourceNet.name||sourceNet.source_net_id||connKey);userNetIdToConnKey.set(userNetId,connKey);let netLabelWidth=Number(getSchematicNetLabelTextWidth({text:String(userNetId)}).toFixed(2));netConnections.push({netId:userNetId,pinIds:schematicPortIds.map(portId=>schematicPortIdToPinId.get(portId)),netLabelWidth})}}let availableNetLabelOrientations=(()=>{let netToAllowedOrientations={},presentNetIds=new Set(netConnections.map(nc3=>nc3.netId));for(let net of db3.source_net.list().filter(n3=>!n3.subcircuit_id||allowedSubcircuitIds.has(n3.subcircuit_id)))net.name&&presentNetIds.has(net.name)&&(net.is_ground?netToAllowedOrientations[net.name]=["y-"]:net.is_power?netToAllowedOrientations[net.name]=["y+"]:netToAllowedOrientations[net.name]=["x-","x+"]);return netToAllowedOrientations})();return{inputProblem:{chips,directConnections,netConnections,availableNetLabelOrientations,maxMspPairDistance:group._parsedProps.schMaxTraceDistance??DEFAULT_MAX_MSP_PAIR_DISTANCE},pinIdToSchematicPortId,connKeyToSourceNet,userNetIdToConnKey,connKeysWithExplicitPortNetTraces,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId}}var cross3=(ax3,ay3,bx3,by3)=>ax3*by3-ay3*bx3;function segmentIntersection(p12,p22,q12,q22,tol){let r6={x:p22.x-p12.x,y:p22.y-p12.y},s6={x:q22.x-q12.x,y:q22.y-q12.y},rxs=cross3(r6.x,r6.y,s6.x,s6.y),q_p={x:q12.x-p12.x,y:q12.y-p12.y},q_pxr=cross3(q_p.x,q_p.y,r6.x,r6.y);if(Math.abs(rxs)<tol&&Math.abs(q_pxr)<tol||Math.abs(rxs)<tol&&Math.abs(q_pxr)>=tol)return null;let t54=cross3(q_p.x,q_p.y,s6.x,s6.y)/rxs,u6=cross3(q_p.x,q_p.y,r6.x,r6.y)/rxs;return t54<-tol||t54>1+tol||u6<-tol||u6>1+tol?null:{x:p12.x+t54*r6.x,y:p12.y+t54*r6.y}}var TOL4=1e-6;function isHorizontalEdge(edge){let dx3=Math.abs(edge.to.x-edge.from.x),dy3=Math.abs(edge.to.y-edge.from.y);return dx3>=dy3}function length6(a3,b4){return Math.hypot(b4.x-a3.x,b4.y-a3.y)}function pointAt(a3,b4,t54){return{x:a3.x+(b4.x-a3.x)*t54,y:a3.y+(b4.y-a3.y)*t54}}function paramAlong(a3,b4,p5){let L5=length6(a3,b4);if(L5<TOL4)return 0;let t54=((p5.x-a3.x)*(b4.x-a3.x)+(p5.y-a3.y)*(b4.y-a3.y))/((b4.x-a3.x)*(b4.x-a3.x)+(b4.y-a3.y)*(b4.y-a3.y));return Math.max(0,Math.min(1,t54))*L5}function mergeIntervals(intervals,tol=TOL4){if(intervals.length===0)return intervals;intervals.sort((a3,b4)=>a3.start-b4.start);let merged=[],cur={...intervals[0]};for(let i3=1;i3<intervals.length;i3++){let nxt=intervals[i3];nxt.start<=cur.end+tol?cur.end=Math.max(cur.end,nxt.end):(merged.push(cur),cur={...nxt})}return merged.push(cur),merged}function splitEdgeByCrossings(edge,crossingDistances,crossLen){let L5=length6(edge.from,edge.to);if(L5<TOL4||crossingDistances.length===0)return[edge];let half=crossLen/2,rawIntervals=crossingDistances.map(d4=>({start:Math.max(0,d4-half),end:Math.min(L5,d4+half)})).filter(iv2=>iv2.end-iv2.start>TOL4),intervals=mergeIntervals(rawIntervals),result=[],cursor=0,dir2={x:edge.to.x-edge.from.x,y:edge.to.y-edge.from.y},addSeg=(d02,d12,isCrossing)=>{if(d12-d02<=TOL4)return;let t02=d02/L5,t110=d12/L5;result.push({from:pointAt(edge.from,edge.to,t02),to:pointAt(edge.from,edge.to,t110),...isCrossing?{is_crossing:!0}:{}})};for(let iv2 of intervals)iv2.start-cursor>TOL4&&addSeg(cursor,iv2.start,!1),addSeg(iv2.start,iv2.end,!0),cursor=iv2.end;return L5-cursor>TOL4&&addSeg(cursor,L5,!1),result.length>0?result:[edge]}function computeCrossings(traces,opts={}){let crossLen=opts.crossSegmentLength??.075,tol=opts.tolerance??TOL4,crossingsByEdge=new Map,keyOf=ref=>`${ref.traceIdx}:${ref.edgeIdx}`,getEdge=ref=>traces[ref.traceIdx].edges[ref.edgeIdx];for(let ti3=0;ti3<traces.length;ti3++){let A7=traces[ti3];for(let ei3=0;ei3<A7.edges.length;ei3++){let eA2=A7.edges[ei3];for(let tj2=ti3;tj2<traces.length;tj2++){let B5=traces[tj2];for(let ej2=tj2===ti3?ei3+1:0;ej2<B5.edges.length;ej2++){let eB=B5.edges[ej2];if(A7.connectivity_key!==void 0&&A7.connectivity_key===B5.connectivity_key)continue;let P6=segmentIntersection(eA2.from,eA2.to,eB.from,eB.to,tol);if(!P6)continue;let LA2=length6(eA2.from,eA2.to),LB2=length6(eB.from,eB.to);if(LA2<tol||LB2<tol)continue;let dA2=paramAlong(eA2.from,eA2.to,P6),dB2=paramAlong(eB.from,eB.to,P6),nearEndpointA=dA2<=tol||Math.abs(LA2-dA2)<=tol||Number.isNaN(dA2),nearEndpointB=dB2<=tol||Math.abs(LB2-dB2)<=tol||Number.isNaN(dB2);if(!nearEndpointA&&!nearEndpointB){let aIsHorizontal=isHorizontalEdge(eA2),bIsHorizontal=isHorizontalEdge(eB),assignToA;if(aIsHorizontal!==bIsHorizontal)assignToA=aIsHorizontal;else{let ax3=Math.abs(eA2.to.x-eA2.from.x),ay3=Math.abs(eA2.to.y-eA2.from.y),bx3=Math.abs(eB.to.x-eB.from.x),by3=Math.abs(eB.to.y-eB.from.y),aScore=ax3-ay3,bScore=bx3-by3;assignToA=aScore===bScore?!0:aScore>bScore}let chosenKey=keyOf({traceIdx:assignToA?ti3:tj2,edgeIdx:assignToA?ei3:ej2}),chosenList=crossingsByEdge.get(chosenKey)??[];chosenList.push(assignToA?dA2:dB2),crossingsByEdge.set(chosenKey,chosenList)}}}}}let out=traces.map(t54=>({source_trace_id:t54.source_trace_id,connectivity_key:t54.connectivity_key,edges:[]}));for(let ti3=0;ti3<traces.length;ti3++){let trace=traces[ti3];for(let ei3=0;ei3<trace.edges.length;ei3++){let eRefKey=keyOf({traceIdx:ti3,edgeIdx:ei3}),splittingDistances=crossingsByEdge.get(eRefKey)??[];if(splittingDistances.length===0){out[ti3].edges.push(trace.edges[ei3]);continue}let uniqueSorted=Array.from(new Set(splittingDistances.map(d4=>Number(d4.toFixed(6))))).sort((a3,b4)=>a3-b4),split=splitEdgeByCrossings(trace.edges[ei3],uniqueSorted,crossLen);out[ti3].edges.push(...split)}}return out}var TOL22=1e-6;function nearlyEqual(a3,b4,tol=TOL22){return Math.abs(a3-b4)<=tol}function pointEq(a3,b4,tol=TOL22){return nearlyEqual(a3.x,b4.x,tol)&&nearlyEqual(a3.y,b4.y,tol)}function onSegment4(p5,a3,b4,tol=TOL22){let minX=Math.min(a3.x,b4.x)-tol,maxX=Math.max(a3.x,b4.x)+tol,minY=Math.min(a3.y,b4.y)-tol,maxY=Math.max(a3.y,b4.y)+tol;return p5.x<minX||p5.x>maxX||p5.y<minY||p5.y>maxY?!1:Math.abs((b4.x-a3.x)*(p5.y-a3.y)-(b4.y-a3.y)*(p5.x-a3.x))<=tol}function dedupePoints(points,tol=TOL22){let map=new Map;for(let p5 of points){let key=`${p5.x.toFixed(6)},${p5.y.toFixed(6)}`;map.has(key)||map.set(key,p5)}return Array.from(map.values())}function edgeVec(e7){return{x:e7.to.x-e7.from.x,y:e7.to.y-e7.from.y}}function isEndpointOfEdge(p5,e7,tol=TOL22){return pointEq(p5,e7.from,tol)||pointEq(p5,e7.to,tol)}function isParallel(e12,e22,tol=TOL22){let v12=edgeVec(e12),v22=edgeVec(e22),L12=Math.hypot(v12.x,v12.y),L22=Math.hypot(v22.x,v22.y);if(L12<tol||L22<tol)return!0;let cross22=v12.x*v22.y-v12.y*v22.x;return Math.abs(cross22)<=tol*L12*L22}function incidentEdgesAtPoint(trace,p5,tol=TOL22){return trace.edges.filter(e7=>pointEq(e7.from,p5,tol)||pointEq(e7.to,p5,tol))}function nearestEndpointOnTrace(trace,p5,tol=TOL22){for(let e7 of trace.edges){if(pointEq(e7.from,p5,tol))return e7.from;if(pointEq(e7.to,p5,tol))return e7.to}return null}function edgeDirectionFromPoint(e7,p5,tol=TOL22){let other=pointEq(e7.from,p5,tol)||nearlyEqual(e7.from.x,p5.x,tol)&&nearlyEqual(e7.from.y,p5.y,tol)?e7.to:e7.from,dx3=other.x-p5.x,dy3=other.y-p5.y;return Math.abs(dx3)<tol&&Math.abs(dy3)<tol?null:Math.abs(dx3)>=Math.abs(dy3)?dx3>=0?"right":"left":dy3>=0?"up":"down"}function getCornerOrientationAtPoint(trace,p5,tol=TOL22){let incident=incidentEdgesAtPoint(trace,p5,tol);if(incident.length<2)return null;let dirs=incident.map(e7=>edgeDirectionFromPoint(e7,p5,tol)),hasUp=dirs.includes("up"),hasDown=dirs.includes("down"),hasLeft=dirs.includes("left"),hasRight=dirs.includes("right"),vertical=hasUp?"up":hasDown?"down":null,horizontal=hasRight?"right":hasLeft?"left":null;return vertical&&horizontal?`${vertical}-${horizontal}`:null}function computeJunctions(traces,opts={}){let tol=opts.tolerance??TOL22,result={};for(let t54 of traces)result[t54.source_trace_id]=[];let endpointsByTrace=traces.map(t54=>{let pts=[];for(let e7 of t54.edges)pts.push(e7.from,e7.to);return dedupePoints(pts,tol)});for(let i3=0;i3<traces.length;i3++){let A7=traces[i3],AEnds=endpointsByTrace[i3];for(let j5=i3+1;j5<traces.length;j5++){let B5=traces[j5],BEnds=endpointsByTrace[j5];if(A7.connectivity_key!==void 0&&A7.connectivity_key===B5.connectivity_key)for(let eA2 of A7.edges)for(let eB of B5.edges){let p5=segmentIntersection(eA2.from,eA2.to,eB.from,eB.to,tol);p5&&(isEndpointOfEdge(p5,eA2,tol)||isEndpointOfEdge(p5,eB,tol)||(result[A7.source_trace_id].push(p5),A7.source_trace_id!==B5.source_trace_id&&result[B5.source_trace_id].push(p5)))}for(let pa3 of AEnds)for(let pb2 of BEnds)if(pointEq(pa3,pb2,tol)){let aEdgesAtP=incidentEdgesAtPoint(A7,pa3,tol),bEdgesAtP=incidentEdgesAtPoint(B5,pb2,tol),hasCorner=aEdgesAtP.some(eA2=>bEdgesAtP.some(eB=>!isParallel(eA2,eB,tol))),aCorner=getCornerOrientationAtPoint(A7,pa3,tol),bCorner=getCornerOrientationAtPoint(B5,pb2,tol);hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[A7.source_trace_id].push(pa3),A7.source_trace_id!==B5.source_trace_id&&result[B5.source_trace_id].push(pb2))}for(let pa3 of AEnds)for(let eB of B5.edges)if(onSegment4(pa3,eB.from,eB.to,tol)){let hasCorner=incidentEdgesAtPoint(A7,pa3,tol).some(eA2=>!isParallel(eA2,eB,tol)),aCorner=getCornerOrientationAtPoint(A7,pa3,tol),bEndpointNearPa=nearestEndpointOnTrace(B5,pa3,tol*1e3),bCorner=bEndpointNearPa?getCornerOrientationAtPoint(B5,bEndpointNearPa,tol):null;hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[A7.source_trace_id].push(pa3),A7.source_trace_id!==B5.source_trace_id&&result[B5.source_trace_id].push(pa3))}for(let pb2 of BEnds)for(let eA2 of A7.edges)if(onSegment4(pb2,eA2.from,eA2.to,tol)){let hasCorner=incidentEdgesAtPoint(B5,pb2,tol).some(eB=>!isParallel(eA2,eB,tol)),bCorner=getCornerOrientationAtPoint(B5,pb2,tol),aEndpointNearPb=nearestEndpointOnTrace(A7,pb2,tol*1e3),aCorner=aEndpointNearPb?getCornerOrientationAtPoint(A7,aEndpointNearPb,tol):null;hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[B5.source_trace_id].push(pb2),A7.source_trace_id!==B5.source_trace_id&&result[A7.source_trace_id].push(pb2))}}}for(let id3 of Object.keys(result))result[id3]=dedupePoints(result[id3],tol);return result}var TOL32=1e-6;function isCollinear(a3,b4,tol=TOL32){let adx=a3.to.x-a3.from.x,ady=a3.to.y-a3.from.y,bdx=b4.to.x-b4.from.x,bdy=b4.to.y-b4.from.y,aLen=Math.hypot(adx,ady),bLen=Math.hypot(bdx,bdy);if(aLen<=tol||bLen<=tol)return!1;let directionCross=adx*bdy-ady*bdx;if(Math.abs(directionCross)>tol*aLen*bLen)return!1;let offsetCross=adx*(b4.from.y-a3.from.y)-ady*(b4.from.x-a3.from.x);return Math.abs(offsetCross)<=tol*aLen}function splitEdgeAroundIntervals(edge,intervals){let merged=mergeIntervals(intervals);if(merged.length===0)return[edge];let edgeLength=length6(edge.from,edge.to);if(edgeLength<=TOL32)return[edge];let result=[],cursor=0;for(let interval of merged)interval.start-cursor>TOL32&&result.push({from:pointAt(edge.from,edge.to,cursor/edgeLength),to:pointAt(edge.from,edge.to,interval.start/edgeLength)}),interval.end-interval.start>TOL32&&result.push({from:pointAt(edge.from,edge.to,interval.start/edgeLength),to:pointAt(edge.from,edge.to,interval.end/edgeLength),is_crossing:!0}),cursor=Math.max(cursor,interval.end);return edgeLength-cursor>TOL32&&result.push({from:pointAt(edge.from,edge.to,cursor/edgeLength),to:edge.to}),result}function removeOverlappingSameNetCrossingSegments(traces){let intervalsToRemove=new Map;for(let crossingTraceIndex=0;crossingTraceIndex<traces.length;crossingTraceIndex++){let crossingTrace=traces[crossingTraceIndex];if(crossingTrace.connectivity_key){for(let crossingEdge of crossingTrace.edges)if(!(!crossingEdge.is_crossing||length6(crossingEdge.from,crossingEdge.to)<=TOL32))for(let traceIndex=0;traceIndex<traces.length;traceIndex++){let candidateTrace=traces[traceIndex];if(!(traceIndex===crossingTraceIndex||candidateTrace.connectivity_key!==crossingTrace.connectivity_key))for(let edgeIndex=0;edgeIndex<candidateTrace.edges.length;edgeIndex++){let candidateEdge=candidateTrace.edges[edgeIndex],candidateLength=length6(candidateEdge.from,candidateEdge.to);if(candidateEdge.is_crossing||candidateLength<=TOL32||!isCollinear(candidateEdge,crossingEdge))continue;let start=Math.max(0,Math.min(paramAlong(candidateEdge.from,candidateEdge.to,crossingEdge.from),paramAlong(candidateEdge.from,candidateEdge.to,crossingEdge.to))),end=Math.min(candidateLength,Math.max(paramAlong(candidateEdge.from,candidateEdge.to,crossingEdge.from),paramAlong(candidateEdge.from,candidateEdge.to,crossingEdge.to)));if(end-start<=TOL32)continue;let key=`${traceIndex}:${edgeIndex}`,intervals=intervalsToRemove.get(key)??[];intervals.push({start,end}),intervalsToRemove.set(key,intervals)}}}}return intervalsToRemove.size===0?traces:traces.map((trace,traceIndex)=>({...trace,edges:trace.edges.flatMap((edge,edgeIndex)=>{let intervals=intervalsToRemove.get(`${traceIndex}:${edgeIndex}`);return intervals?splitEdgeAroundIntervals(edge,intervals):[edge]})}))}var debug8=(0,import_debug17.default)("Group_doInitialSchematicTraceRender"),MAX_PIN_SNAP_GAP=1.5;function extendTraceEndpointsToReachPinsInsideExpandedBoundingBox(params,db3){let{points,schematicPortIds,eligiblePortIds}=params,centers=schematicPortIds.filter(id3=>eligiblePortIds.has(id3)).map(id3=>db3.schematic_port.get(id3)?.center).filter(c6=>!!c6);if(centers.length===0)return points;let result=points.map(p5=>({x:p5.x,y:p5.y})),d22=(a3,b4)=>(a3.x-b4.x)**2+(a3.y-b4.y)**2,usedCenters=new Set;for(let i3=0;i3<centers.length;i3++)result.some(p5=>d22(centers[i3],p5)<=1e-12)&&usedCenters.add(i3);let ALIGN_EPS=.001,endpoints=["start","end"],candidates=[];for(let endpoint of endpoints){let endpointPoint=endpoint==="start"?result[0]:result[result.length-1];for(let i3=0;i3<centers.length;i3++){if(usedCenters.has(i3))continue;let center2=centers[i3],dist=d22(center2,endpointPoint);dist>MAX_PIN_SNAP_GAP**2||Math.abs(center2.x-endpointPoint.x)>ALIGN_EPS&&Math.abs(center2.y-endpointPoint.y)>ALIGN_EPS||candidates.push({endpoint,centerIndex:i3,dist})}}candidates.sort((a3,b4)=>a3.dist-b4.dist);let usedEndpoints=new Set;for(let{endpoint,centerIndex,dist}of candidates){if(usedEndpoints.has(endpoint)||usedCenters.has(centerIndex)||(usedCenters.add(centerIndex),usedEndpoints.add(endpoint),dist<=1e-12))continue;let center2=centers[centerIndex];endpoint==="start"?result.unshift({x:center2.x,y:center2.y}):result.push({x:center2.x,y:center2.y})}return result}function applyTracesFromSolverOutput(args){let{group,solver,pinIdToSchematicPortId,userNetIdToConnKey,schematicPortIdsWithPreExistingNetLabels}=args,{db:db3}=group.root,eligiblePortIds=new Set;for(let schematicComponent of db3.schematic_component.list())if(getSchematicComponentWithTextBounds(db3,schematicComponent))for(let port of db3.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id}))eligiblePortIds.add(port.schematic_port_id);let traces=solver.netLabelTraceCollisionSolver?.getOutput().traces??solver.traceCleanupSolver?.getOutput().traces??solver.traceLabelOverlapAvoidanceSolver?.getOutput().traces??solver.schematicTraceLinesSolver?.solvedTracePaths,pendingTraces=[];debug8(`Traces inside SchematicTraceSolver output: ${(traces??[]).length}`);for(let solvedTracePath of traces??[]){let uniquePinIds=Array.from(new Set(solvedTracePath.pinIds??[])),solvedTraceSchematicPortIds=uniquePinIds.map(pinId=>pinIdToSchematicPortId.get(pinId)).filter(id3=>!!id3);if(uniquePinIds.length<=1&&solvedTraceSchematicPortIds.length>0&&solvedTraceSchematicPortIds.every(id3=>schematicPortIdsWithPreExistingNetLabels.has(id3))){debug8(`Skipping solver netlabel stub trace ${solvedTracePath?.mspPairId} because schematic port already has a netlabel`);continue}let points=solvedTracePath?.tracePath;if(!Array.isArray(points)||points.length<2){debug8(`Skipping trace ${solvedTracePath?.pinIds.join(",")} because it has less than 2 points`);continue}let snappedPoints=extendTraceEndpointsToReachPinsInsideExpandedBoundingBox({points,schematicPortIds:solvedTraceSchematicPortIds,eligiblePortIds},db3),edges=[];for(let i3=0;i3<snappedPoints.length-1;i3++)edges.push({from:{x:snappedPoints[i3].x,y:snappedPoints[i3].y},to:{x:snappedPoints[i3+1].x,y:snappedPoints[i3+1].y}});let source_trace_id=String(solvedTracePath?.mspPairId),subcircuit_connectivity_map_key;if(Array.isArray(solvedTracePath?.pins)&&solvedTracePath.pins.length===2){let pA2=pinIdToSchematicPortId.get(solvedTracePath.pins[0]?.pinId),pB2=pinIdToSchematicPortId.get(solvedTracePath.pins[1]?.pinId);if(pA2&&pB2){for(let schPid of[pA2,pB2])db3.schematic_port.get(schPid)&&db3.schematic_port.update(schPid,{is_connected:!0});subcircuit_connectivity_map_key=userNetIdToConnKey.get(String(solvedTracePath.userNetId))}}if(subcircuit_connectivity_map_key||(subcircuit_connectivity_map_key=userNetIdToConnKey.get(String(solvedTracePath.userNetId))),!subcircuit_connectivity_map_key){let sourcePortConnKeys=solvedTraceSchematicPortIds.map(schematicPortId=>{let sourcePortId=db3.schematic_port.get(schematicPortId)?.source_port_id;if(sourcePortId)return db3.source_port.get(sourcePortId)?.subcircuit_connectivity_map_key}).filter(key=>!!key);new Set(sourcePortConnKeys).size===1&&(subcircuit_connectivity_map_key=sourcePortConnKeys[0])}pendingTraces.push({source_trace_id,edges,subcircuit_connectivity_map_key})}debug8(`Applying ${pendingTraces.length} traces from SchematicTraceSolver output`);let withCrossings=computeCrossings(pendingTraces.map(t54=>({source_trace_id:t54.source_trace_id,edges:t54.edges,connectivity_key:t54.subcircuit_connectivity_map_key}))),existingTracesForJunctions=[],schematicSheetId=group._resolveSchematicSheetId();for(let t54 of db3.schematic_trace.list()){if(t54.edges.length===0||t54.schematic_sheet_id!==schematicSheetId)continue;let sourceTrace=t54.source_trace_id?db3.source_trace.get(t54.source_trace_id):void 0;existingTracesForJunctions.push({schematic_trace_id:t54.schematic_trace_id,source_trace_id:t54.source_trace_id??t54.schematic_trace_id,edges:t54.edges,connectivity_key:t54.subcircuit_connectivity_map_key??sourceTrace?.subcircuit_connectivity_map_key})}let tracesWithTrimmedCrossingOverlaps=removeOverlappingSameNetCrossingSegments([...withCrossings,...existingTracesForJunctions]),visibleTraces=tracesWithTrimmedCrossingOverlaps.slice(0,withCrossings.length),visibleExistingTraces=tracesWithTrimmedCrossingOverlaps.slice(withCrossings.length);for(let trace of visibleExistingTraces)trace.schematic_trace_id&&db3.schematic_trace.update(trace.schematic_trace_id,{edges:trace.edges});let junctionsById=computeJunctions([...visibleTraces,...visibleExistingTraces]);for(let t54 of visibleTraces)db3.schematic_trace.insert({source_trace_id:t54.source_trace_id,edges:t54.edges,junctions:junctionsById[t54.source_trace_id]??[],subcircuit_connectivity_map_key:pendingTraces.find(p5=>p5.source_trace_id===t54.source_trace_id)?.subcircuit_connectivity_map_key,schematic_sheet_id:schematicSheetId})}var oppositeSide2=input2=>{switch(input2){case"x+":return"left";case"x-":return"right";case"y+":return"bottom";case"y-":return"top";case"left":return"right";case"top":return"bottom";case"right":return"left";case"bottom":return"top"}},getNetNameFromPorts=ports=>{for(let port of ports){let traces=port._getDirectlyConnectedTraces();for(let trace of traces){let displayLabel=trace._getSchematicNetLabelText();if(displayLabel)return{name:displayLabel,wasAssignedDisplayLabel:!0}}}return{name:ports.map(p5=>p5._getNetLabelText()).join("/"),wasAssignedDisplayLabel:!1}},NET_LABEL_TEXT_HEIGHT=.18,getNetLabelTextBounds=({center:center2,text})=>{let halfWidth=getSchematicNetLabelTextWidth({text})/2,halfHeight=NET_LABEL_TEXT_HEIGHT/2;return{minX:center2.x-halfWidth,maxX:center2.x+halfWidth,minY:center2.y-halfHeight,maxY:center2.y+halfHeight}},debug9=(0,import_debug18.default)("Group_doInitialSchematicTraceRender"),isSameNet=(label,sourceNet)=>label.source_net_id!=null&&label.source_net_id===sourceNet.source_net_id,isUserDefinedNetLabelRedundantWithPlacement=(label,solverPlacement)=>isSameNet(label,solverPlacement.sourceNet)?label.schematicPortIds.some(id3=>solverPlacement.schematicPortIds.has(id3))?!0:label.center?doBoundsOverlap(getNetLabelTextBounds({center:label.center,text:label.text}),solverPlacement.bounds):!1:!1;function applyNetLabelPlacements(args){let{group,solver,connKeyToSourceNet,userNetIdToConnKey,pinIdToSchematicPortId,connKeysWithExplicitPortNetTraces,schematicPortIdsWithPreExistingNetLabels,schematicPortIdsWithRoutedTraces}=args,{db:db3}=group.root,netLabelPlacements=solver.netLabelNetLabelCollisionSolver?.getOutput().netLabelPlacements??solver.netLabelTraceCollisionSolver?.getOutput().netLabelPlacements??solver.netLabelPlacementSolver?.netLabelPlacements??solver.traceLabelOverlapAvoidanceSolver?.getOutput().netLabelPlacements??[],dedupedNetLabelPlacements=[],netLabelPlacementKeys=new Set;for(let placement of netLabelPlacements){let pinIds=[...placement.pinIds??[]].sort(),key=`${placement.globalConnNetId}|${pinIds.join("::")}|${placement.netId??""}`;if(netLabelPlacementKeys.has(key)){debug9(`skipping duplicate placement for "${placement.netId}" REASON:identical net label placement`);continue}netLabelPlacementKeys.add(key),dedupedNetLabelPlacements.push(placement)}let netLabelPlacementCountByGlobalNetId=new Map,routedPairKeysByGlobalNetId=new Map,globalNetIdsWithPortOnlyPlacements=new Set;for(let placement of dedupedNetLabelPlacements)netLabelPlacementCountByGlobalNetId.set(placement.globalConnNetId,(netLabelPlacementCountByGlobalNetId.get(placement.globalConnNetId)??0)+1),(placement.pinIds?.length??0)>1&&(routedPairKeysByGlobalNetId.has(placement.globalConnNetId)||routedPairKeysByGlobalNetId.set(placement.globalConnNetId,new Set),routedPairKeysByGlobalNetId.get(placement.globalConnNetId).add(placement.pinIds.slice().sort().join("::"))),(placement.pinIds?.length??0)<=1&&globalNetIdsWithPortOnlyPlacements.add(placement.globalConnNetId);let globalConnMap=solver.mspConnectionPairSolver.globalConnMap,userDefinedNetLabels=group.selectAll("netlabel").map(label=>{if(!label.schematic_net_label_id)return null;let dbLabel=db3.schematic_net_label.get(label.schematic_net_label_id);return dbLabel?{...dbLabel,schematicPortIds:label._getConnectedPorts().map(port=>port.schematic_port_id).filter(id3=>!!id3)}:null}).filter(label=>label!==null);for(let placement of dedupedNetLabelPlacements){debug9(`processing placement: ${placement.netId}`);let placementUserNetId=globalConnMap.getIdsConnectedToNet(placement.globalConnNetId).find(id3=>userNetIdToConnKey.get(id3)),placementConnKey=userNetIdToConnKey.get(placementUserNetId),anchor_position=placement.anchorPoint,orientation4=placement.orientation,anchor_side=oppositeSide2(orientation4),sourceNet;placementConnKey&&(sourceNet=connKeyToSourceNet.get(placementConnKey));let schPortIds=placement.pinIds.map(pinId=>pinIdToSchematicPortId.get(pinId));if(schPortIds.some(schPortId=>schematicPortIdsWithPreExistingNetLabels.has(schPortId))){debug9(`skipping net label placement for "${placement.netId}" REASON:schematic port has pre-existing net label`);continue}if(sourceNet){let isPowerOrGroundNet=sourceNet.is_ground||sourceNet.is_power,hasExplicitPortNetTrace=connKeysWithExplicitPortNetTraces.has(placementConnKey),hasRoutedTraceForPlacementPort=schPortIds.some(id3=>schematicPortIdsWithRoutedTraces.has(id3)),hasSingleLabelPlacement=(netLabelPlacementCountByGlobalNetId.get(placement.globalConnNetId)??0)<=1;if(!hasExplicitPortNetTrace&&!isPowerOrGroundNet&&hasRoutedTraceForPlacementPort&&hasSingleLabelPlacement){debug9(`skipping net label placement for "${placement.netId}" REASON:schematic port has routed trace`);continue}let text2=sourceNet.name,center22=computeSchematicNetLabelCenter({anchor_position,anchor_side,text:text2});if(!isPowerOrGroundNet){let solverPlacement={sourceNet,text:text2,schematicPortIds:new Set(schPortIds),bounds:getNetLabelTextBounds({center:center22,text:text2})};if(userDefinedNetLabels.some(label=>isUserDefinedNetLabelRedundantWithPlacement(label,solverPlacement)))continue}let netLabel2={text:text2,source_net_id:sourceNet.source_net_id,anchor_position,center:center22,anchor_side,schematic_sheet_id:group._resolveSchematicSheetId()};db3.schematic_net_label.insert(netLabel2);continue}let ports=group.selectAll("port").filter(p5=>p5._getSubcircuitConnectivityKey()===placementConnKey),{name:text,wasAssignedDisplayLabel}=getNetNameFromPorts(ports),shouldKeepRoutedPairLabel=(placement.pinIds?.length??0)>1&&(globalNetIdsWithPortOnlyPlacements.has(placement.globalConnNetId)||(routedPairKeysByGlobalNetId.get(placement.globalConnNetId)?.size??0)>1);if(!wasAssignedDisplayLabel&&!shouldKeepRoutedPairLabel&&schPortIds.some(schPortId=>schematicPortIdsWithRoutedTraces.has(schPortId))){debug9(`skipping net label placement for "${placement.netId}" REASON:schematic port has routed traces and no display label`);continue}let center2=computeSchematicNetLabelCenter({anchor_position,anchor_side,text}),netLabel={text,source_net_id:placementConnKey??placement.netId??placement.globalConnNetId,anchor_position,center:center2,anchor_side,schematic_sheet_id:group._resolveSchematicSheetId()};db3.schematic_net_label.insert(netLabel)}}var NEAR_EXISTING_NET_LABEL_DISTANCE=.5,SAME_ANCHOR_POSITION_DISTANCE=.1,doesSchematicNetLabelRepresentCurrentSourceConnection=args=>{let{nl:nl3,connKey,sourceNet,text}=args;return sourceNet?.source_net_id&&nl3.source_net_id?nl3.source_net_id===sourceNet.source_net_id:nl3.source_net_id?nl3.source_net_id===connKey:nl3.text===text},getSourcePortNetLabelText=(db3,sourcePortId)=>{let sourcePort=db3.source_port.get(sourcePortId);if(!sourcePort)return;let sourceComponent;if(sourcePort.source_component_id&&(sourceComponent=db3.source_component.get(sourcePort.source_component_id)),!(!sourceComponent?.name||!sourcePort.name))return`${sourceComponent.name}_${sourcePort.name}`},getDirectCrossSubcircuitConnectionLabelText=(db3,sourcePortId)=>{let sourcePort=db3.source_port.get(sourcePortId);if(sourcePort)for(let sourceTrace of db3.source_trace.list()){let connectedSourcePortIds=sourceTrace.connected_source_port_ids??[];if(connectedSourcePortIds.length!==2||(sourceTrace.connected_source_net_ids??[]).length>0||!connectedSourcePortIds.includes(sourcePortId))continue;let otherSourcePortId=connectedSourcePortIds.find(portId=>portId!==sourcePortId);if(!otherSourcePortId)continue;let otherSourcePort=db3.source_port.get(otherSourcePortId);if(otherSourcePort&&otherSourcePort.subcircuit_id!==sourcePort.subcircuit_id)return getSourcePortNetLabelText(db3,otherSourcePortId)}},insertNetLabelsForPortsMissingTrace=({allSourceAndSchematicPortIdsInScope,group,schPortIdToSourcePortId,connKeyToSourceNet})=>{let{db:db3}=group.root;for(let schOrSrcPortId of Array.from(allSourceAndSchematicPortIdsInScope)){let schPort=db3.schematic_port.get(schOrSrcPortId);if(!schPort||schPort.is_connected)continue;let srcPortId=schPortIdToSourcePortId.get(schOrSrcPortId);if(!srcPortId)continue;let connKey=db3.source_port.get(srcPortId)?.subcircuit_connectivity_map_key;if(!connKey)continue;let sourceNet=connKeyToSourceNet.get(connKey),portSchematicSheetId=(schPort.schematic_component_id?db3.schematic_component.get(schPort.schematic_component_id):void 0)?.schematic_sheet_id??group._resolveSchematicSheetId(),connectedSourcePortIdsForKey=Array.from(allSourceAndSchematicPortIdsInScope).map(portId=>schPortIdToSourcePortId.get(portId)).filter(sourcePortId=>sourcePortId?db3.source_port.get(sourcePortId)?.subcircuit_connectivity_map_key===connKey:!1),connectedPortsForKey=group.selectAll("port").filter(port=>port._getSubcircuitConnectivityKey()===connKey),{name:resolvedPortNetLabelText,wasAssignedDisplayLabel}=getNetNameFromPorts(connectedPortsForKey),assignedPortNetLabelText;wasAssignedDisplayLabel&&(assignedPortNetLabelText=resolvedPortNetLabelText);let implicitPortLabelText=connectedSourcePortIdsForKey.map(sourcePortId=>getSourcePortNetLabelText(db3,sourcePortId)).filter(label=>!!label).join("/"),directCrossSubcircuitConnectionLabelText=getDirectCrossSubcircuitConnectionLabelText(db3,srcPortId),text=sourceNet?.name||sourceNet?.source_net_id||assignedPortNetLabelText||directCrossSubcircuitConnectionLabelText||implicitPortLabelText||connKey,connectedPortCountForKey=Array.from(allSourceAndSchematicPortIdsInScope).filter(portId=>{let sourcePortId=schPortIdToSourcePortId.get(portId);return sourcePortId?db3.source_port.get(sourcePortId)?.subcircuit_connectivity_map_key===connKey:!1}).length,isGndNet=sourceNet?.is_ground??!1,isPowerNet=!isGndNet&&(sourceNet?.is_power??!1),side;isGndNet?side="top":isPowerNet?side="bottom":side=getEnteringEdgeFromDirection(schPort.facing_direction||"right")||"right";let center2=computeSchematicNetLabelCenter({anchor_position:schPort.center,anchor_side:side,text}),existingNetLabelForCurrentSourceConnection=db3.schematic_net_label.list().find(nl3=>nl3.schematic_sheet_id!==portSchematicSheetId?!1:doesSchematicNetLabelRepresentCurrentSourceConnection({nl:nl3,connKey,sourceNet,text}));if(existingNetLabelForCurrentSourceConnection&&connectedPortCountForKey<=1){db3.schematic_net_label.update(existingNetLabelForCurrentSourceConnection.schematic_net_label_id,{text,anchor_position:schPort.center,center:center2,anchor_side:side});continue}if(existingNetLabelForCurrentSourceConnection){let dx3=existingNetLabelForCurrentSourceConnection.anchor_position.x-schPort.center.x,dy3=existingNetLabelForCurrentSourceConnection.anchor_position.y-schPort.center.y;if(dx3*dx3+dy3*dy3<NEAR_EXISTING_NET_LABEL_DISTANCE*NEAR_EXISTING_NET_LABEL_DISTANCE){if(isGndNet)db3.schematic_net_label.update(existingNetLabelForCurrentSourceConnection.schematic_net_label_id,{text,anchor_position:schPort.center,center:center2,anchor_side:side});else if(!isPowerNet&&existingNetLabelForCurrentSourceConnection.text===text){let anchor_side=existingNetLabelForCurrentSourceConnection.anchor_side??side;db3.schematic_net_label.update(existingNetLabelForCurrentSourceConnection.schematic_net_label_id,{text,anchor_position:schPort.center,center:computeSchematicNetLabelCenter({anchor_position:schPort.center,anchor_side,text}),anchor_side})}continue}if(db3.schematic_net_label.list().some(nl3=>{if(nl3.schematic_sheet_id!==portSchematicSheetId)return!1;let dx22=nl3.anchor_position.x-schPort.center.x,dy22=nl3.anchor_position.y-schPort.center.y;return dx22*dx22+dy22*dy22>=SAME_ANCHOR_POSITION_DISTANCE*SAME_ANCHOR_POSITION_DISTANCE?!1:doesSchematicNetLabelRepresentCurrentSourceConnection({nl:nl3,connKey,sourceNet,text})}))continue}if(!sourceNet)for(let nl3 of db3.schematic_net_label.list()){if(nl3.source_net_id!==connKey||nl3.schematic_sheet_id!==portSchematicSheetId)continue;connectedSourcePortIdsForKey.some(sourcePortId=>{let schPortId=Array.from(schPortIdToSourcePortId.entries()).find(([,id3])=>id3===sourcePortId)?.[0],connectedSchPort;if(schPortId&&(connectedSchPort=db3.schematic_port.get(schPortId)),!connectedSchPort?.center||!nl3.anchor_position)return!1;let dx3=nl3.anchor_position.x-connectedSchPort.center.x,dy3=nl3.anchor_position.y-connectedSchPort.center.y;return dx3*dx3+dy3*dy3<SAME_ANCHOR_POSITION_DISTANCE*SAME_ANCHOR_POSITION_DISTANCE})||db3.schematic_net_label.delete(nl3.schematic_net_label_id)}let netLabel={text,source_net_id:sourceNet?.source_net_id??connKey,anchor_position:schPort.center,center:center2,anchor_side:side,schematic_sheet_id:portSchematicSheetId};db3.schematic_net_label.insert(netLabel)}},getSchematicPortIdsWithAssignedNetLabels=group=>{let schematicPortIdsWithNetLabels=new Set,netLabels=group.selectAll("netlabel");for(let netLabel of netLabels){let netLabelPorts=netLabel._getConnectedPorts();for(let port of netLabelPorts)port.schematic_port_id&&schematicPortIdsWithNetLabels.add(port.schematic_port_id)}return schematicPortIdsWithNetLabels},getSchematicPortIdsWithRoutedTraces=({solver,pinIdToSchematicPortId})=>{let solvedTraces=solver.traceCleanupSolver?.getOutput().traces??solver.traceLabelOverlapAvoidanceSolver?.getOutput().traces??solver.schematicTraceLinesSolver?.solvedTracePaths??[],schematicPortIdsWithRoutedTraces=new Set;for(let solvedTrace of solvedTraces){let points=solvedTrace?.tracePath;if(!Array.isArray(points)||points.length<2)continue;let pinIds=Array.isArray(solvedTrace.pins)?solvedTrace.pins.map(pin=>pin.pinId):solvedTrace.pinIds;for(let pinId of pinIds){let schPortId=pinIdToSchematicPortId.get(pinId);schPortId&&schematicPortIdsWithRoutedTraces.add(schPortId)}}return schematicPortIdsWithRoutedTraces},debug10=(0,import_debug16.default)("Group_doInitialSchematicTraceRender"),Group_doInitialSchematicTraceRender=group=>{if(!group.root?._featureMspSchematicTraceRouting||!group.isSubcircuit||group.root?.schematicDisabled)return;let{inputProblem,pinIdToSchematicPortId,connKeyToSourceNet,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,userNetIdToConnKey,connKeysWithExplicitPortNetTraces}=createSchematicTraceSolverInputProblem(group);if(inputProblem.chips.length===0)return;let schematicPortIdsWithPreExistingNetLabels=getSchematicPortIdsWithAssignedNetLabels(group);if(!(inputProblem.directConnections.length>0||inputProblem.netConnections.length>0)){insertNetLabelsForPortsMissingTrace({group,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,connKeyToSourceNet});return}debug10.enabled&&group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:"group-trace-render-input-problem",content:JSON.stringify(inputProblem,null,2)});let solver=new SchematicTracePipelineSolver(inputProblem);solver.solve();let schematicPortIdsWithRoutedTraces=getSchematicPortIdsWithRoutedTraces({solver,pinIdToSchematicPortId});applyTracesFromSolverOutput({group,solver,pinIdToSchematicPortId,userNetIdToConnKey,schematicPortIdsWithPreExistingNetLabels}),applyNetLabelPlacements({group,solver,connKeyToSourceNet,pinIdToSchematicPortId,userNetIdToConnKey,connKeysWithExplicitPortNetTraces,schematicPortIdsWithPreExistingNetLabels,schematicPortIdsWithRoutedTraces}),insertNetLabelsForPortsMissingTrace({group,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,connKeyToSourceNet})};function getTransientVoltageGraphNamesFromSpiceNetlist(spiceNetlist){let graphNames=[];for(let printStatement of spiceNetlist.printStatements){let match2=printStatement.match(/^\.PRINT\s+TRAN\s+(.+)$/i);if(match2)for(let voltageExpression of match2[1].match(/V\(([^)]+)\)/g)??[]){let nodeList=voltageExpression.slice(2,-1);graphNames.push(nodeList.replace(",","-"))}}return graphNames}var SIMULATION_COLOR_PALETTE=["rgb(0, 150, 0)","rgb(0, 0, 220)","rgb(220, 0, 0)","rgb(0, 160, 160)","rgb(180, 0, 180)","rgb(170, 140, 0)","rgb(220, 120, 0)","rgb(128, 128, 128)","rgb(100, 0, 180)","rgb(140, 70, 0)","rgb(220, 80, 120)","rgb(0, 120, 220)","rgb(0, 120, 120)","rgb(120, 0, 0)","rgb(0, 0, 132)","rgb(80, 80, 80)"],idToColorMap=new Map,colorIndex=0;function getSimulationColorForId(id3){if(idToColorMap.has(id3))return idToColorMap.get(id3);let color=SIMULATION_COLOR_PALETTE[colorIndex];return colorIndex=(colorIndex+1)%SIMULATION_COLOR_PALETTE.length,idToColorMap.set(id3,color),color}function resetSimulationColorState(){idToColorMap.clear(),colorIndex=0}var getSpiceyEngine=()=>({async simulate(spiceString){let simulation_experiment_id="spice-experiment-1",{circuit:parsedCircuit,tran}=simulate(spiceString);return{simulationResultCircuitJson:spiceyTranToVGraphs(tran,parsedCircuit,simulation_experiment_id)}}}),SI_PREFIX_MULTIPLIERS={p:1e-12,n:1e-9,u:1e-6,\u00B5:1e-6,m:.001,"":1,k:1e3,K:1e3,M:1e6,G:1e9},parseSimulationGraphValue=value=>{if(value===void 0)return;if(typeof value=="number")return value;let match2=value.trim().match(/^([+-]?(?:\d+(?:\.\d*)?|\.\d+))\s*([pnumµkKMG]?)/);if(!match2)return;let numericValue=Number(match2[1]);if(Number.isFinite(numericValue))return numericValue*(SI_PREFIX_MULTIPLIERS[match2[2]??""]??1)},getVoltageProbeGraphDisplayOverrides=probe=>{let{graphDisplayName,graphCenter,graphVerticalOffset,graphVoltagePerDiv}=probe._parsedProps;return{displayName:graphDisplayName,color:probe.color??void 0,center:graphCenter,verticalOffset:parseSimulationGraphValue(graphVerticalOffset),valuePerDiv:parseSimulationGraphValue(graphVoltagePerDiv)}},getAmmeterGraphDisplayOverrides=ammeter=>{let{color,graphDisplayName,graphCenter,graphVerticalOffset,graphCurrentPerDiv}=ammeter._parsedProps;return{displayName:graphDisplayName,color,center:graphCenter,verticalOffset:parseSimulationGraphValue(graphVerticalOffset),valuePerDiv:parseSimulationGraphValue(graphCurrentPerDiv)}},getFiniteBounds=values=>{let min=Number.POSITIVE_INFINITY,max2=Number.NEGATIVE_INFINITY;for(let value of values)Number.isFinite(value)&&(min=Math.min(min,value),max2=Math.max(max2,value));return min===Number.POSITIVE_INFINITY||max2===Number.NEGATIVE_INFINITY?null:{min,max:max2}},getGraphLevels2=graph=>graph.type==="simulation_transient_current_graph"?graph.current_levels:graph.voltage_levels,DISPLAY_SECTION_HEIGHT_DIVS=2,DISPLAY_SECTION_DATA_FILL=.8,getAutoDisplayScale=({graph,index,graphCount})=>{let bounds=getFiniteBounds(getGraphLevels2(graph));if(!bounds)return null;let center2=(bounds.min+bounds.max)/2,span=bounds.max-bounds.min,valuePerDiv=span>0?span/(DISPLAY_SECTION_HEIGHT_DIVS*DISPLAY_SECTION_DATA_FILL):Math.max(Math.abs(center2)/10,Number.EPSILON);return{display_center_value:center2,display_center_offset_divs:((graphCount-1)/2-index)*DISPLAY_SECTION_HEIGHT_DIVS,value_per_div:valuePerDiv}},isDefinedString=value=>value!==void 0,getTraceByVoltageProbeId=traces=>{let traceByVoltageProbeId=new Map;for(let trace of traces)trace.simulation_voltage_probe_id&&traceByVoltageProbeId.set(trace.simulation_voltage_probe_id,trace);return traceByVoltageProbeId},getTraceByCurrentProbeId=traces=>{let traceByCurrentProbeId=new Map;for(let trace of traces)trace.simulation_current_probe_id&&traceByCurrentProbeId.set(trace.simulation_current_probe_id,trace);return traceByCurrentProbeId},insertIndependentAxisScopeTraces=({db:db3,graphs,graphDisplayOverridesByProbeId})=>{if(graphs.length===0)return;let existingScopeTraces=db3.simulation_oscilloscope_trace.list(),traceByVoltageProbeId=getTraceByVoltageProbeId(existingScopeTraces),traceByCurrentProbeId=getTraceByCurrentProbeId(existingScopeTraces),graphIdsWithTrace=new Set(existingScopeTraces.flatMap(trace=>[trace.simulation_transient_voltage_graph_id,trace.simulation_transient_current_graph_id]).filter(isDefinedString));for(let[index,{type,graph}]of graphs.entries()){let scale22=getAutoDisplayScale({graph,index,graphCount:graphs.length});if(!scale22)continue;let graphId=type==="voltage"?graph.simulation_transient_voltage_graph_id:graph.simulation_transient_current_graph_id;if(graphIdsWithTrace.has(graphId))continue;let sourceProbeId=graph.source_probe_id??void 0,probeTrace=sourceProbeId===void 0?void 0:type==="voltage"?traceByVoltageProbeId.get(sourceProbeId):traceByCurrentProbeId.get(sourceProbeId),overrides=sourceProbeId===void 0?void 0:graphDisplayOverridesByProbeId?.get(sourceProbeId),valuePerDiv=overrides?.valuePerDiv??scale22.value_per_div,displayCenter=overrides?.center??scale22.display_center_value,displayCenterOffsetDivs=overrides?.verticalOffset!==void 0&&valuePerDiv!==0?overrides.verticalOffset/valuePerDiv:probeTrace?.display_center_offset_divs??scale22.display_center_offset_divs;db3.simulation_oscilloscope_trace.insert({...type==="voltage"?{simulation_transient_voltage_graph_id:graph.simulation_transient_voltage_graph_id,volts_per_div:valuePerDiv}:{simulation_transient_current_graph_id:graph.simulation_transient_current_graph_id,amps_per_div:valuePerDiv},display_name:overrides?.displayName??probeTrace?.display_name,color:overrides?.color??probeTrace?.color??graph.color,display_center_value:displayCenter,display_center_offset_divs:displayCenterOffsetDivs})}},isCircuitElementInput=element=>!!(element&&typeof element=="object"&&"type"in element),isCurrentGraph2=element=>element.type==="simulation_transient_current_graph",isVoltageGraph=element=>element.type==="simulation_transient_voltage_graph",debug11=(0,import_debug19.default)("tscircuit:core:Group_doInitialSimulationSpiceEngineRender");function Group_doInitialSimulationSpiceEngineRender(group){if(!group.isSubcircuit)return;let{root}=group;if(!root)return;let analogSims=group.selectAll("analogsimulation");if(analogSims.length===0)return;let voltageProbes=group.selectAll("voltageprobe"),ammeters=group.selectAll("ammeter");resetSimulationColorState();let spiceEngineMap={...root.platform?.spiceEngineMap};spiceEngineMap.spicey||(spiceEngineMap.spicey=getSpiceyEngine());let circuitJson=root.db.toArray(),spiceString,spiceNetlist;try{spiceNetlist=circuitJsonToSpice(circuitJson),spiceString=spiceNetlist.toSpiceString(),debug11(`Generated SPICE string:
743
- ${spiceString}`)}catch(error2){debug11(`Failed to convert circuit JSON to SPICE: ${error2}`);return}let graphNameToProbe=new Map;for(let probe of voltageProbes)probe.finalProbeName&&graphNameToProbe.set(probe.finalProbeName,probe);let voltageProbesById=new Map,graphDisplayOverridesByProbeId=new Map;for(let probe of voltageProbes)probe.simulation_voltage_probe_id&&(voltageProbesById.set(probe.simulation_voltage_probe_id,probe),graphDisplayOverridesByProbeId.set(probe.simulation_voltage_probe_id,getVoltageProbeGraphDisplayOverrides(probe)));for(let ammeter of ammeters)ammeter.simulation_current_probe_id&&graphDisplayOverridesByProbeId.set(ammeter.simulation_current_probe_id,getAmmeterGraphDisplayOverrides(ammeter));let currentProbesById=new Map,currentProbesByName=new Map;for(let probe of root.db.simulation_current_probe.list())currentProbesById.set(probe.simulation_current_probe_id,probe),probe.name!==void 0&&currentProbesByName.set(probe.name,probe);let orderedSimulationProbes=root.db.simulation_voltage_probe.list().filter(probe=>voltageProbesById.has(probe.simulation_voltage_probe_id)),graphNamesFromNetlist=getTransientVoltageGraphNamesFromSpiceNetlist(spiceNetlist);if(graphNamesFromNetlist.length===orderedSimulationProbes.length)for(let[index,simulationProbe]of orderedSimulationProbes.entries()){let probe=voltageProbesById.get(simulationProbe.simulation_voltage_probe_id),graphName=graphNamesFromNetlist[index];probe&&graphName&&graphNameToProbe.set(graphName,probe)}else debug11(`Skipping probe-to-graph order mapping because counts differ: probes=${orderedSimulationProbes.length} graphNames=${graphNamesFromNetlist.length}`);for(let analogSim of analogSims){let engineName=analogSim._parsedProps.spiceEngine??"spicey",spiceEngine2=spiceEngineMap[engineName];if(!spiceEngine2)throw new Error(`SPICE engine "${engineName}" not found in platform config. Available engines: ${JSON.stringify(Object.keys(spiceEngineMap).filter(k5=>k5!=="spicey"))}`);let effectId=`spice-simulation-${engineName}-${analogSim.source_component_id}`;debug11(`Queueing simulation for spice engine: ${engineName} (id: ${effectId})`),group._queueAsyncEffect(effectId,async()=>{try{debug11(`Running simulation with engine: ${engineName}`);let result=await spiceEngine2.simulate(spiceString);debug11(`Simulation completed, received ${result.simulationResultCircuitJson.length} elements`);let simulationExperiment=root.db.simulation_experiment.list()[0];if(!simulationExperiment){debug11("No simulation experiment found, skipping result insertion");return}let insertedVoltageGraphs=[],insertedCurrentGraphs=[];for(let rawElement of result.simulationResultCircuitJson){if(!isCircuitElementInput(rawElement)){debug11("Skipping invalid simulation result element");continue}let element=rawElement;if(isVoltageGraph(element)){element.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=element.name?graphNameToProbe.get(element.name):void 0;probeMatch&&(element.color=probeMatch.color??void 0,element.source_probe_id=probeMatch.simulation_voltage_probe_id??void 0)}if(isCurrentGraph2(element)){element.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=(element.source_probe_id?currentProbesById.get(element.source_probe_id):void 0)??(element.name?currentProbesByName.get(element.name):void 0);probeMatch&&(element.color=probeMatch.color,element.source_probe_id=probeMatch.simulation_current_probe_id)}let insertedElement=root.db.insert(element);isVoltageGraph(insertedElement)&&insertedVoltageGraphs.push({type:"voltage",graph:insertedElement}),isCurrentGraph2(insertedElement)&&insertedCurrentGraphs.push({type:"current",graph:insertedElement}),debug11(`Inserted ${element.type} into database`)}analogSim._parsedProps.graphIndependentAxes&&insertIndependentAxisScopeTraces({db:root.db,graphs:[...insertedVoltageGraphs,...insertedCurrentGraphs],graphDisplayOverridesByProbeId}),group._markDirty("SimulationSpiceEngineRender")}catch(error2){debug11(`Simulation failed for engine ${engineName}: ${error2}`);let simulationExperiment=root.db.simulation_experiment.list()[0];root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperiment?.simulation_experiment_id,error_type:"simulation_unknown_experiment_error",message:error2 instanceof Error?error2.message:String(error2)})}})}}function Group_doInitialSourceAddConnectivityMapKey(group){if(!group.isSubcircuit)return;let{db:db3}=group.root,traces=group.selectAll("trace"),vias=group.selectAll("via"),nets=group.selectAll("net"),connMap=new ConnectivityMap({});connMap.addConnections(traces.map(t54=>{let source_trace3=db3.source_trace.get(t54.source_trace_id);return source_trace3?[source_trace3.source_trace_id,...source_trace3.connected_source_port_ids,...source_trace3.connected_source_net_ids]:null}).filter(c6=>c6!==null));let sourceNets=db3.source_net.list().filter(net=>net.subcircuit_id===group.subcircuit_id);for(let sourceNet of sourceNets)connMap.addConnections([[sourceNet.source_net_id]]);let{name:subcircuitName}=group._parsedProps;for(let trace of traces){if(!trace.source_trace_id)continue;let connNetId=connMap.getNetConnectedToId(trace.source_trace_id);connNetId&&(trace.subcircuit_connectivity_map_key=`${subcircuitName??`unnamedsubcircuit${group.subcircuit_id??group.source_group_id??group._renderId}`}_${connNetId}`,db3.source_trace.update(trace.source_trace_id,{subcircuit_connectivity_map_key:trace.subcircuit_connectivity_map_key}))}let allSourcePortIds=new Set;for(let trace of traces){if(!trace.source_trace_id)continue;let source_trace3=db3.source_trace.get(trace.source_trace_id);if(source_trace3)for(let id3 of source_trace3.connected_source_port_ids)allSourcePortIds.add(id3)}for(let portId of allSourcePortIds){let connNetId=connMap.getNetConnectedToId(portId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group.subcircuit_id??group.source_group_id??group._renderId}`}_${connNetId}`;db3.source_port.update(portId,{subcircuit_connectivity_map_key:connectivityMapKey})}let allSourceNetIds=new Set;for(let trace of traces){if(!trace.source_trace_id)continue;let source_trace3=db3.source_trace.get(trace.source_trace_id);if(source_trace3)for(let source_net_id of source_trace3.connected_source_net_ids)allSourceNetIds.add(source_net_id)}for(let sourceNet of sourceNets)allSourceNetIds.add(sourceNet.source_net_id);for(let netId of allSourceNetIds){let connNetId=connMap.getNetConnectedToId(netId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group.subcircuit_id??group.source_group_id??group._renderId}`}_${connNetId}`;db3.source_net.update(netId,{subcircuit_connectivity_map_key:connectivityMapKey});let netInstance=nets.find(n3=>n3.source_net_id===netId);netInstance&&(netInstance.subcircuit_connectivity_map_key=connectivityMapKey)}for(let via of vias){let connectedNetOrTrace=via._getConnectedNetOrTrace();connectedNetOrTrace&&connectedNetOrTrace.subcircuit_connectivity_map_key&&(via.subcircuit_connectivity_map_key=connectedNetOrTrace.subcircuit_connectivity_map_key)}}function getPhaseSortValue(routingPhaseIndex){return routingPhaseIndex===null?Number.POSITIVE_INFINITY:routingPhaseIndex}function compareRoutingPhasePlans(a3,b4){return getPhaseSortValue(a3.routingPhaseIndex)-getPhaseSortValue(b4.routingPhaseIndex)}function getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex){let plan=plansByPhaseIndex.get(routingPhaseIndex);return plan||(plan={routingPhaseIndex,nets:[],traces:[]},plansByPhaseIndex.set(routingPhaseIndex,plan)),plan}function getNetRoutingPhaseIndex(net){return net.props.routingPhaseIndex??null}function getTraceRoutingPhaseIndex(trace){let traceRoutingPhaseIndex=trace.props.routingPhaseIndex;if(traceRoutingPhaseIndex!==void 0)return traceRoutingPhaseIndex;let routingPhaseIndex=null,connectedNets=trace._findConnectedNets().nets;for(let net of connectedNets){let netRoutingPhaseIndex=getNetRoutingPhaseIndex(net);typeof netRoutingPhaseIndex=="number"&&(routingPhaseIndex===null||netRoutingPhaseIndex<routingPhaseIndex)&&(routingPhaseIndex=netRoutingPhaseIndex)}return routingPhaseIndex}function convertPortSelectorToEndpointKey(selector){return selector.trim().replace(/\s*>\s*/g,".").replace(/\s+/g,".").replace(/^\./,"").replace(/\.\./g,".")}function getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps){return[...phaseProps.connection?[phaseProps.connection]:[],...phaseProps.connections??[]]}function traceHasEndpointMatchingConnectionSelector(trace,connectionSelectorEndpointKey){return trace.getTracePortPathSelectors().some(selector=>convertPortSelectorToEndpointKey(selector)===connectionSelectorEndpointKey)}function getAutoroutersByPhaseIndex(group){let autoroutingPhases=group.selectAll("autoroutingphase"),autoroutersByPhaseIndex=new Map;for(let autoroutingPhase of autoroutingPhases){let{phaseIndex,autorouter}=autoroutingPhase._parsedProps;autorouter!==void 0&&autoroutersByPhaseIndex.set(phaseIndex??null,autorouter)}return autoroutersByPhaseIndex}function getAutoroutingPhasePropsByPhaseIndex(group){let autoroutingPhases=group.selectAll("autoroutingphase"),propsByPhaseIndex=new Map;for(let autoroutingPhase of autoroutingPhases){let props=autoroutingPhase._parsedProps;propsByPhaseIndex.set(props.phaseIndex??null,props)}return propsByPhaseIndex}function toParsedDistance(value){if(value!==void 0)return Number(value)}function getDrcTolerancesFromAutoroutingPhaseProps(phaseProps){let{minTraceWidth,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minTraceToPadEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleDiameter,minViaPadDiameter}=phaseProps;if(!(minTraceWidth===void 0&&minViaHoleEdgeToViaHoleEdgeClearance===void 0&&minPlatedHoleDrillEdgeToDrillEdgeClearance===void 0&&minTraceToPadEdgeClearance===void 0&&minPadEdgeToPadEdgeClearance===void 0&&minBoardEdgeClearance===void 0&&minViaEdgeToPadEdgeClearance===void 0&&minViaHoleDiameter===void 0&&minViaPadDiameter===void 0))return{minTraceWidth:toParsedDistance(minTraceWidth),minViaHoleEdgeToViaHoleEdgeClearance:toParsedDistance(minViaHoleEdgeToViaHoleEdgeClearance),minPlatedHoleDrillEdgeToDrillEdgeClearance:toParsedDistance(minPlatedHoleDrillEdgeToDrillEdgeClearance),minTraceToPadEdgeClearance:toParsedDistance(minTraceToPadEdgeClearance),minPadEdgeToPadEdgeClearance:toParsedDistance(minPadEdgeToPadEdgeClearance),minBoardEdgeClearance:toParsedDistance(minBoardEdgeClearance),minViaEdgeToPadEdgeClearance:toParsedDistance(minViaEdgeToPadEdgeClearance),minViaHoleDiameter:toParsedDistance(minViaHoleDiameter),minViaPadDiameter:toParsedDistance(minViaPadDiameter)}}function Group_getRoutingPhasePlans(group){let traces=group.selectAll("trace"),nets=group.selectAll("net"),plansByPhaseIndex=new Map,autoroutersByPhaseIndex=getAutoroutersByPhaseIndex(group),phasePropsByPhaseIndex=getAutoroutingPhasePropsByPhaseIndex(group),hasDirectRoutingTargets=traces.length>0||nets.length>0,hasReroutePhase=Array.from(phasePropsByPhaseIndex.values()).some(phaseProps=>phaseProps.reroute),hasConnectionTargetedPhase=Array.from(phasePropsByPhaseIndex.values()).some(phaseProps=>getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps).length>0);if(!hasDirectRoutingTargets&&!hasReroutePhase&&!hasConnectionTargetedPhase)return[];for(let net of nets){let routingPhaseIndex=getNetRoutingPhaseIndex(net);getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex).nets.push(net)}for(let trace of traces){let routingPhaseIndex=getTraceRoutingPhaseIndex(trace);getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex).traces.push(trace)}for(let[phaseIndex,phaseProps]of phasePropsByPhaseIndex){let connectionSelectors=getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps);if(connectionSelectors.length>0){let plan=getOrCreateRoutingPhasePlan(plansByPhaseIndex,phaseIndex),connectionSelectorEndpointKeys=connectionSelectors.map(convertPortSelectorToEndpointKey);plan.connectionSelectors=connectionSelectors;for(let trace of traces)if(connectionSelectorEndpointKeys.some(endpointKey=>traceHasEndpointMatchingConnectionSelector(trace,endpointKey))){if(!phaseProps.reroute)for(let existingPlan of plansByPhaseIndex.values())existingPlan!==plan&&(existingPlan.traces=existingPlan.traces.filter(existingTrace=>existingTrace!==trace));if(plan.traces.includes(trace))continue;plan.traces.push(trace)}}phaseProps.reroute&&getOrCreateRoutingPhasePlan(plansByPhaseIndex,phaseIndex)}let plans=Array.from(plansByPhaseIndex.values()).sort(compareRoutingPhasePlans);for(let plan of plans){plan.autorouter=autoroutersByPhaseIndex.get(plan.routingPhaseIndex);let phaseProps=phasePropsByPhaseIndex.get(plan.routingPhaseIndex);plan.reroute=phaseProps?.reroute,plan.region=phaseProps?.region,plan.connectionSelectors=phaseProps?getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps):void 0,plan.drcTolerances=phaseProps?getDrcTolerancesFromAutoroutingPhaseProps(phaseProps):void 0}let defaultPhaseProps=phasePropsByPhaseIndex.get(null);if(hasDirectRoutingTargets&&phasePropsByPhaseIndex.size===1&&defaultPhaseProps?.reroute&&plans.length===1&&plans[0]?.routingPhaseIndex===null){let reroutePlan=plans[0];return[{routingPhaseIndex:null,nets:[...reroutePlan.nets],traces:[...reroutePlan.traces]},reroutePlan]}return plans}function isWirePoint(point6){return point6.route_type==="wire"}function isViaPoint(point6){return point6.route_type==="via"}function isJumperPoint(point6){return point6.route_type==="jumper"}function getTraceConnectionName(trace){return trace.connection_name??trace.pcb_trace_id}function getWireWidth(start,end){return isWirePoint(start)?start.width:isWirePoint(end)?end.width:.1}function getSegmentLayer(start,end){return isWirePoint(start)?start.layer:isWirePoint(end)?end.layer:isJumperPoint(start)?start.layer:isJumperPoint(end)?end.layer:null}function getRoutePointX(point6){return isJumperPoint(point6)||point6.route_type==="through_obstacle"?null:point6.x}function getRoutePointY(point6){return isJumperPoint(point6)||point6.route_type==="through_obstacle"?null:point6.y}function createWireObstacle(start,end,connectedTo,obstacleIndex){let startX=getRoutePointX(start),startY=getRoutePointY(start),endX=getRoutePointX(end),endY=getRoutePointY(end),layer=getSegmentLayer(start,end);if(startX===null||startY===null||endX===null||endY===null||!layer)return null;let width=getWireWidth(start,end),dx3=Math.abs(startX-endX),dy3=Math.abs(startY-endY);return{obstacleId:`${connectedTo}_phase_obstacle_${obstacleIndex}`,type:"rect",layers:[layer],center:{x:(startX+endX)/2,y:(startY+endY)/2},width:dx3+width,height:dy3+width,connectedTo:[connectedTo]}}function createJumperObstacle(point6,connectedTo,obstacleIndex){let dx3=Math.abs(point6.start.x-point6.end.x),dy3=Math.abs(point6.start.y-point6.end.y),width=.6;return{obstacleId:`${connectedTo}_phase_jumper_obstacle_${obstacleIndex}`,type:"rect",layers:[point6.layer],center:{x:(point6.start.x+point6.end.x)/2,y:(point6.start.y+point6.end.y)/2},width:dx3+width,height:dy3+width,connectedTo:[connectedTo]}}function createViaObstacle(point6,connectedTo,obstacleIndex){return{obstacleId:`${connectedTo}_phase_via_obstacle_${obstacleIndex}`,type:"rect",layers:[point6.from_layer,point6.to_layer],center:{x:point6.x,y:point6.y},width:.6,height:.6,connectedTo:[connectedTo]}}function addTraceObstacles(obstacles,trace){let connectedTo=getTraceConnectionName(trace);for(let routeIndex=0;routeIndex<trace.route.length;routeIndex++){let routePoint=trace.route[routeIndex];if(isViaPoint(routePoint)?obstacles.push(createViaObstacle(routePoint,connectedTo,routeIndex)):isJumperPoint(routePoint)&&obstacles.push(createJumperObstacle(routePoint,connectedTo,routeIndex)),routeIndex===trace.route.length-1)continue;let nextPoint=trace.route[routeIndex+1],obstacle=createWireObstacle(routePoint,nextPoint,connectedTo,routeIndex);obstacle&&obstacles.push(obstacle)}}function connectionIsInRoutingPhase(connection,phasePlan){for(let trace of phasePlan.traces)if(trace.source_trace_id&&(connection.source_trace_id===trace.source_trace_id||connection.name===trace.source_trace_id||connection.rootConnectionName===trace.source_trace_id||connection.mergedConnectionNames?.includes(trace.source_trace_id)))return!0;for(let net of phasePlan.nets)if(net.source_net_id&&connection.name===net.source_net_id)return!0;return!1}function Group_hasPhasedAutorouting(routingPhasePlans){for(let plan of routingPhasePlans)if(plan.routingPhaseIndex!==null)return!0;return!1}function Group_filterSimpleRouteJsonForPhase(simpleRouteJson,phasePlan){let connections=[];for(let connection of simpleRouteJson.connections)connectionIsInRoutingPhase(connection,phasePlan)&&connections.push(connection);return{...simpleRouteJson,connections}}function hasDrcTolerances(drcTolerances){return drcTolerances?Object.values(drcTolerances).some(value=>value!==void 0):!1}function applyMinTraceWidthToConnections(connections,minTraceWidth){return minTraceWidth===void 0?connections:connections.map(connection=>({...connection,nominalTraceWidth:Math.max(connection.nominalTraceWidth??minTraceWidth,minTraceWidth),width:Math.max(connection.width??minTraceWidth,minTraceWidth)}))}function Group_applyDrcTolerancesToSimpleRouteJson(simpleRouteJson,drcTolerances){if(!hasDrcTolerances(drcTolerances))return simpleRouteJson;let minTraceWidth=drcTolerances.minTraceWidth??simpleRouteJson.minTraceWidth,minViaHoleDiameter=drcTolerances.minViaHoleDiameter??simpleRouteJson.minViaHoleDiameter,minViaPadDiameter=drcTolerances.minViaPadDiameter??simpleRouteJson.minViaPadDiameter,minTraceToPadEdgeClearance=drcTolerances.minTraceToPadEdgeClearance??simpleRouteJson.minTraceToPadEdgeClearance,minViaEdgeToPadEdgeClearance=drcTolerances.minViaEdgeToPadEdgeClearance??simpleRouteJson.minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance=drcTolerances.minViaHoleEdgeToViaHoleEdgeClearance??simpleRouteJson.minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance=drcTolerances.minPlatedHoleDrillEdgeToDrillEdgeClearance??simpleRouteJson.minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance=drcTolerances.minPadEdgeToPadEdgeClearance??simpleRouteJson.minPadEdgeToPadEdgeClearance,minBoardEdgeClearance=drcTolerances.minBoardEdgeClearance??simpleRouteJson.minBoardEdgeClearance;return{...simpleRouteJson,connections:applyMinTraceWidthToConnections(simpleRouteJson.connections,drcTolerances.minTraceWidth),minTraceWidth,minViaDiameter:minViaPadDiameter,minViaHoleDiameter,minViaPadDiameter,min_via_hole_diameter:minViaHoleDiameter,min_via_pad_diameter:minViaPadDiameter,minTraceToPadEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance}}function Group_getObstaclesFromRoutedTraces(traces){let obstacles=[];for(let trace of traces)addTraceObstacles(obstacles,trace);return obstacles}function getJumperPadInfos(db3){let padInfos=[],jumperSmtpads=db3.pcb_smtpad.list().filter(pad2=>{let component=db3.pcb_component.get(pad2.pcb_component_id);return component?db3.source_component.get(component.source_component_id)?.name?.startsWith("__autoplaced_jumper"):!1});for(let smtpad2 of jumperSmtpads)if(smtpad2.shape!=="polygon"&&smtpad2.pcb_port_id){if(smtpad2.shape==="rect"||smtpad2.shape==="rotated_rect"){let halfWidth=smtpad2.width/2,halfHeight=smtpad2.height/2;padInfos.push({pcb_port_id:smtpad2.pcb_port_id,x:smtpad2.x,y:smtpad2.y,minX:smtpad2.x-halfWidth,maxX:smtpad2.x+halfWidth,minY:smtpad2.y-halfHeight,maxY:smtpad2.y+halfHeight})}else if(smtpad2.shape==="circle"){let radius=smtpad2.radius;padInfos.push({pcb_port_id:smtpad2.pcb_port_id,x:smtpad2.x,y:smtpad2.y,minX:smtpad2.x-radius,maxX:smtpad2.x+radius,minY:smtpad2.y-radius,maxY:smtpad2.y+radius})}}return padInfos}function findJumperPortAtPosition(padInfos,x4,y3,tolerance=.01){for(let pad2 of padInfos)if(Math.abs(pad2.x-x4)<tolerance&&Math.abs(pad2.y-y3)<tolerance)return pad2.pcb_port_id}function findJumperPortContainingPoint(padInfos,x4,y3){for(let pad2 of padInfos)if(x4>=pad2.minX&&x4<=pad2.maxX&&y3>=pad2.minY&&y3<=pad2.maxY)return pad2}function splitRouteAtJumperPads(route,padInfos){if(route.length===0||padInfos.length===0)return[route];let segments=[],currentSegment=[];for(let i3=0;i3<route.length;i3++){let point6=route[i3];if(currentSegment.push(point6),point6.route_type==="wire"&&i3>0&&i3<route.length-1){let padInfo=findJumperPortContainingPoint(padInfos,point6.x,point6.y);if(padInfo){point6.end_pcb_port_id||(point6.end_pcb_port_id=padInfo.pcb_port_id),segments.push(currentSegment);let newStartPoint={...point6};delete newStartPoint.end_pcb_port_id,newStartPoint.start_pcb_port_id||(newStartPoint.start_pcb_port_id=padInfo.pcb_port_id),currentSegment=[newStartPoint]}}}return currentSegment.length>0&&segments.push(currentSegment),segments}function addPortIdsToTracesAtJumperPads(segments,db3){let padInfos=getJumperPadInfos(db3);if(padInfos.length===0)return segments;let result=[];for(let segment2 of segments){let subSegments=splitRouteAtJumperPads(segment2,padInfos);for(let subSegment of subSegments)if(subSegment.length>0){let firstPoint=subSegment[0],lastPoint=subSegment[subSegment.length-1];if(firstPoint.route_type==="wire"&&!firstPoint.start_pcb_port_id){let portId=findJumperPortAtPosition(padInfos,firstPoint.x,firstPoint.y);portId&&(firstPoint.start_pcb_port_id=portId)}if(lastPoint.route_type==="wire"&&!lastPoint.end_pcb_port_id){let portId=findJumperPortAtPosition(padInfos,lastPoint.x,lastPoint.y);portId&&(lastPoint.end_pcb_port_id=portId)}result.push(subSegment)}}return result}var POINT_EPSILON=1e-6;function isPointOnWireSegment({point:point6,segmentStart,segmentEnd}){return point6.layer&&(segmentStart.layer!==point6.layer||segmentEnd.layer!==point6.layer)?!1:pointToSegmentDistance(point6,segmentStart,segmentEnd)<=POINT_EPSILON}function isPointInSmtPad({point:point6,pad:pad2,traceWidth=0}){return pad2.shape==="rect"||pad2.shape==="rotated_rect"?Math.abs(point6.x-pad2.x)<=pad2.width/2+traceWidth/2&&Math.abs(point6.y-pad2.y)<=pad2.height/2+traceWidth/2:pad2.shape==="circle"?distance2(point6,pad2)<=pad2.radius+traceWidth/2:!1}function isPointInPlatedHole({point:point6,hole,traceWidth=0}){return distance2(point6,hole)<=(hole.outer_diameter??hole.hole_diameter??0)/2+traceWidth/2}function getEndpointSourcePortIdsFromGeometry(db3,trace){let sourcePortIds=new Set,route=trace.route,endpoints=[route[0],route[route.length-1]].filter(point6=>!!point6&&point6.route_type==="wire"&&point6.x!==void 0&&point6.y!==void 0);for(let endpoint of endpoints){for(let pcbPort of db3.pcb_port.list())pcbPort.source_port_id&&distance2(endpoint,pcbPort)<=.01&&sourcePortIds.add(pcbPort.source_port_id);for(let smtpad2 of db3.pcb_smtpad.list()){if(!smtpad2.pcb_port_id||!isPointInSmtPad({point:endpoint,pad:smtpad2,traceWidth:endpoint.width}))continue;let sourcePortId=db3.pcb_port.get(smtpad2.pcb_port_id)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}for(let hole of db3.pcb_plated_hole.list()){if(!hole.pcb_port_id||!isPointInPlatedHole({point:endpoint,hole,traceWidth:endpoint.width}))continue;let sourcePortId=db3.pcb_port.get(hole.pcb_port_id)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}}return[...sourcePortIds]}function getWireRouteEndpoints(trace){let route=trace.route.filter(point6=>point6.route_type==="wire"&&point6.x!==void 0&&point6.y!==void 0);return[route[0],route[route.length-1]].filter(point6=>!!point6)}function getSourceIdsFromConnectedPcbTraces(db3,trace){let sourceIds=new Set,endpoints=getWireRouteEndpoints(trace);if(endpoints.length===0)return[];for(let existingTrace of db3.pcb_trace.list()){if(!existingTrace.source_trace_id||existingTrace.pcb_trace_id===trace.pcb_trace_id||!db3.source_trace.get(existingTrace.source_trace_id)&&!db3.source_net.get(existingTrace.source_trace_id))continue;let existingRoute=existingTrace.route.filter(point6=>point6.route_type==="wire");for(let i3=0;i3<existingRoute.length-1;i3++){let segmentStart=existingRoute[i3],segmentEnd=existingRoute[i3+1];if(!(!segmentStart||!segmentEnd))for(let endpoint of endpoints)isPointOnWireSegment({point:endpoint,segmentStart,segmentEnd})&&sourceIds.add(existingTrace.source_trace_id)}}return[...sourceIds]}function getSourcePortIdsFromRoutedTrace(db3,trace){let sourcePortIds=new Set;for(let point6 of trace.route)for(let pcbPortId of[point6.start_pcb_port_id,point6.end_pcb_port_id]){if(!pcbPortId)continue;let sourcePortId=db3.pcb_port.get(pcbPortId)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}return sourcePortIds.size>0?[...sourcePortIds]:getEndpointSourcePortIdsFromGeometry(db3,trace)}function buildSourceConnectivityMap(sourceTraces){let connMap=new ConnectivityMap({});return connMap.addConnections(sourceTraces.map(trace=>[trace.source_trace_id,...trace.connected_source_port_ids,...trace.connected_source_net_ids])),connMap}function getSourceTraceIdForRoutedTrace({db:db3,trace,subcircuit_id}){if(trace.source_trace_id&&(db3.source_trace.get(trace.source_trace_id)??db3.source_net.get(trace.source_trace_id)))return trace.source_trace_id;let sourcePortIds=getSourcePortIdsFromRoutedTrace(db3,trace);if(sourcePortIds.length===0)return getSourceIdsFromConnectedPcbTraces(db3,trace)[0];let sourceTraces=db3.source_trace.list(),connMap=buildSourceConnectivityMap(sourceTraces),endpointNetIds=sourcePortIds.map(sourcePortId=>connMap.getNetConnectedToId(sourcePortId)).filter(netId=>!!netId),exactSourceTrace=sourcePortIds.length>=2?sourceTraces.find(sourceTrace=>sourcePortIds.every(sourcePortId=>sourceTrace.connected_source_port_ids.includes(sourcePortId))):void 0;if(exactSourceTrace)return exactSourceTrace.source_trace_id;let sourceTracesInEndpointNets=sourceTraces.filter(sourceTrace=>{let sourceTraceNetId=connMap.getNetConnectedToId(sourceTrace.source_trace_id);return endpointNetIds.some(netId=>netId===sourceTraceNetId)}),connectedToEndpoint=sourceTracesInEndpointNets.filter(sourceTrace=>sourceTrace.connected_source_port_ids.some(sourcePortId=>sourcePortIds.includes(sourcePortId))),candidates=connectedToEndpoint.length>0?connectedToEndpoint:sourceTracesInEndpointNets;if(candidates.length!==0)return(candidates.find(sourceTrace=>sourceTrace.subcircuit_id===subcircuit_id)??candidates[0])?.source_trace_id}function groupPadsByInternalConnection(pads,orientation4){let groups=[];for(let pad2 of pads){let key=orientation4==="vertical"?pad2.center.y:pad2.center.x,foundGroup=!1;for(let group of groups){let groupKey=orientation4==="vertical"?group[0].center.y:group[0].center.x;if(Math.abs(key-groupKey)<.01){group.push(pad2),foundGroup=!0;break}}foundGroup||groups.push([pad2])}return groups.filter(g4=>g4.length>=2)}function insertAutoplacedJumpers(params){let{db:db3,output_jumpers,subcircuit_id}=params;for(let jumperIndex=0;jumperIndex<output_jumpers.length;jumperIndex++){let jumper=output_jumpers[jumperIndex],sourceComponent=db3.source_component.insert({ftype:"simple_chip",name:`__autoplaced_jumper_${jumperIndex}`,supplier_part_numbers:{}}),rotation42=jumper.orientation==="horizontal"?0:90,firstPadLayer=jumper.pads[0]?.layer||jumper.pads[0]?.layers?.[0]||"top",pcbComponent=db3.pcb_component.insert({source_component_id:sourceComponent.source_component_id,center:jumper.center,rotation:rotation42,layer:firstPadLayer,width:jumper.width||0,height:jumper.height||0,obstructs_within_bounds:!1}),padData=[];for(let padIndex=0;padIndex<jumper.pads.length;padIndex++){let pad2=jumper.pads[padIndex],pinNumber=padIndex+1,sourcePort=db3.source_port.insert({source_component_id:sourceComponent.source_component_id,name:`pin${pinNumber}`,pin_number:pinNumber}),padLayer=pad2.layer||pad2.layers?.[0]||"top",pcbPort=db3.pcb_port.insert({pcb_component_id:pcbComponent.pcb_component_id,source_port_id:sourcePort.source_port_id,x:pad2.center.x,y:pad2.center.y,layers:[padLayer]}),pcbSmtpad=db3.pcb_smtpad.insert({pcb_component_id:pcbComponent.pcb_component_id,pcb_port_id:pcbPort.pcb_port_id,shape:"rect",x:pad2.center.x,y:pad2.center.y,width:pad2.width,height:pad2.height,layer:padLayer});padData.push({pad:pad2,sourcePortId:sourcePort.source_port_id,pcbSmtpadId:pcbSmtpad.pcb_smtpad_id})}let internalGroups=groupPadsByInternalConnection(jumper.pads,jumper.orientation);for(let group of internalGroups){let sourcePortIds=[];for(let groupPad of group){let padInfo=padData.find(p5=>Math.abs(p5.pad.center.x-groupPad.center.x)<.01&&Math.abs(p5.pad.center.y-groupPad.center.y)<.01);padInfo&&sourcePortIds.push(padInfo.sourcePortId)}sourcePortIds.length>=2&&db3.source_component_internal_connection.insert({source_component_id:sourceComponent.source_component_id,subcircuit_id:subcircuit_id??void 0,source_port_ids:sourcePortIds})}}}function convertPcbTraceToSimplifiedPcbTrace(trace){return{...trace,type:"pcb_trace",pcb_trace_id:trace.pcb_trace_id,connection_name:trace.connection_name??trace.source_trace_id??trace.pcb_trace_id,route:trace.route.map(point6=>({...point6}))}}function getRelevantSubcircuitIdsForReroute(group){let relevantSubcircuitIds=new Set;if(!group.subcircuit_id)return relevantSubcircuitIds;relevantSubcircuitIds.add(group.subcircuit_id);let db3=group.root?.db;if(!db3)return relevantSubcircuitIds;for(let subcircuitId of getDescendantSubcircuitIds2(db3,group.subcircuit_id))relevantSubcircuitIds.add(subcircuitId);return relevantSubcircuitIds}function getExistingPcbTracesForReroute(group){let db3=group.root?.db;if(!db3)return[];let relevantSubcircuitIds=getRelevantSubcircuitIdsForReroute(group);return db3.pcb_trace.list().filter(trace=>!trace.route||trace.route.length<2?!1:group.subcircuit_id?!!(trace.subcircuit_id&&relevantSubcircuitIds.has(trace.subcircuit_id)):!0)}function getSourceTraceIdsFromRerouteName(value){return typeof value!="string"||value.length===0?[]:value.split("__").flatMap(connectionNamePart=>{if(connectionNamePart.length===0)return[];let sourceTraceIds=[connectionNamePart],rerouteSuffixIndex=connectionNamePart.indexOf("_reroute_");return rerouteSuffixIndex>0&&sourceTraceIds.push(connectionNamePart.slice(0,rerouteSuffixIndex)),sourceTraceIds})}function addPossibleReplacementSourceTraceId(sourceTraceIds,value){if(!(typeof value!="string"||value.length===0)){sourceTraceIds.add(value);for(let sourceTraceId of getSourceTraceIdsFromRerouteName(value))sourceTraceIds.add(sourceTraceId)}}function deleteExistingPcbTracesReplacedBy({group,outputPcbTraces,pcbTraceIdsToReplace=[]}){let db3=group.root?.db;if(!db3)return;let replacementPcbTraceIds=new Set(pcbTraceIdsToReplace),replacementSourceTraceIds=new Set;for(let trace of outputPcbTraces){if(trace.type!=="pcb_trace")continue;let replacementTrace=trace;replacementPcbTraceIds.add(replacementTrace.pcb_trace_id),addPossibleReplacementSourceTraceId(replacementSourceTraceIds,replacementTrace.source_trace_id),addPossibleReplacementSourceTraceId(replacementSourceTraceIds,replacementTrace.connection_name),addPossibleReplacementSourceTraceId(replacementSourceTraceIds,replacementTrace.rootConnectionName)}if(replacementPcbTraceIds.size===0&&replacementSourceTraceIds.size===0)return;let tracesToDelete=getExistingPcbTracesForReroute(group).filter(trace=>replacementPcbTraceIds.has(trace.pcb_trace_id)||!!(trace.source_trace_id&&trace.subcircuit_id===group.subcircuit_id&&replacementSourceTraceIds.has(trace.source_trace_id)));if(tracesToDelete.length===0)return;let deletedPcbTraceIds=new Set(tracesToDelete.map(trace=>trace.pcb_trace_id));for(let via of db3.pcb_via.list())via.pcb_trace_id&&deletedPcbTraceIds.has(via.pcb_trace_id)&&db3.pcb_via.delete(via.pcb_via_id);for(let trace of tracesToDelete)db3.pcb_trace.delete(trace.pcb_trace_id)}function getExistingSimplifiedPcbTracesForReroute(group){return getExistingPcbTracesForReroute(group).map(convertPcbTraceToSimplifiedPcbTrace)}function splitPcbTracesOnJumperSegments(route){let jumperRoutes=route.filter(p5=>p5.route_type==="jumper"),wireAndViaRoutes=route.filter(p5=>p5.route_type!=="jumper");if(jumperRoutes.length===0)return null;let splitRanges=[];for(let jumperRoute of jumperRoutes){let jumperStart=jumperRoute.start,jumperEnd=jumperRoute.end,startIdx=-1,endIdx=-1,minStartDist=1/0,minEndDist=1/0;for(let i3=0;i3<wireAndViaRoutes.length;i3++){let p5=wireAndViaRoutes[i3];if(p5.route_type!=="wire")continue;let distToStart=Math.hypot(p5.x-jumperStart.x,p5.y-jumperStart.y),distToEnd=Math.hypot(p5.x-jumperEnd.x,p5.y-jumperEnd.y);distToStart<minStartDist&&(minStartDist=distToStart,startIdx=i3),distToEnd<minEndDist&&(minEndDist=distToEnd,endIdx=i3)}startIdx>endIdx&&([startIdx,endIdx]=[endIdx,startIdx]),startIdx>=0&&endIdx>=0&&startIdx!==endIdx&&splitRanges.push({startIdx,endIdx})}splitRanges.sort((a3,b4)=>a3.startIdx-b4.startIdx);let segments=[],currentStart=0;for(let range2 of splitRanges)currentStart<range2.startIdx&&segments.push(wireAndViaRoutes.slice(currentStart,range2.startIdx+1)),currentStart=range2.endIdx;return currentStart<wireAndViaRoutes.length&&segments.push(wireAndViaRoutes.slice(currentStart)),segments}function computeCenterFromAnchorPosition(anchorPosition,ctx){let{width,height,pcbAnchorAlignment}=ctx;if(!pcbAnchorAlignment)return anchorPosition;let alignment=pcbAnchorAlignment;if(typeof width!="number"||typeof height!="number")return anchorPosition;let ax3=anchorPosition.x,ay3=anchorPosition.y;switch(alignment){case"top_left":return{x:ax3+width/2,y:ay3-height/2};case"top_center":return{x:ax3,y:ay3-height/2};case"top_right":return{x:ax3-width/2,y:ay3-height/2};case"center_left":return{x:ax3+width/2,y:ay3};case"center_right":return{x:ax3-width/2,y:ay3};case"bottom_left":return{x:ax3+width/2,y:ay3+height/2};case"bottom_center":return{x:ax3,y:ay3+height/2};case"bottom_right":return{x:ax3-width/2,y:ay3+height/2};default:return anchorPosition}}var getDistanceToPoint=(routePoint,targetPoint)=>{let position4=getRoutePointPosition(routePoint);return Math.hypot(position4.x-targetPoint.x,position4.y-targetPoint.y)},reversePcbTraceRoute=route=>route.slice().reverse().map(point6=>point6.route_type==="via"?{...point6}:point6.route_type==="through_pad"?{...point6,start:point6.end,end:point6.start,start_layer:point6.end_layer,end_layer:point6.start_layer}:{...point6}),ensureRouteStartsAtSourceTraceStart=({db:db3,route,sourceTraceId})=>{if(!sourceTraceId||route.length<2)return route;let firstSourcePortId=db3.source_trace.get(sourceTraceId)?.connected_source_port_ids[0];if(!firstSourcePortId)return route;let firstPcbPort=db3.pcb_port.list().find(port=>port.source_port_id===firstSourcePortId);if(!firstPcbPort)return route;let firstPoint=route[0],lastPoint=route[route.length-1];return getDistanceToPoint(lastPoint,firstPcbPort)<getDistanceToPoint(firstPoint,firstPcbPort)?reversePcbTraceRoute(route):route},Group5=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pcb_group_id",null);__publicField(this,"schematic_group_id",null);__publicField(this,"subcircuit_id",null);__publicField(this,"_hasStartedAsyncAutorouting",!1);__publicField(this,"_isInflatedFromCircuitJson",!1);__publicField(this,"_isolatedCircuitJson",null);__publicField(this,"_normalComponentNameMap",null);__publicField(this,"_asyncAutoroutingResult",null);__publicField(this,"unnamedElementCounter",{})}get _isIsolatedSubcircuit(){return!!this.getInheritedProperty("_subcircuitCachingEnabled")}getNormalComponentNameMap(){if(this._normalComponentNameMap)return this._normalComponentNameMap;let nameMap=new Map,collectNamedComponents=component=>{if(component._isNormalComponent&&component.name){let componentsWithSameName=nameMap.get(component.name);componentsWithSameName?componentsWithSameName.push(component):nameMap.set(component.name,[component])}for(let child of component.children)child.isSubcircuit||collectNamedComponents(child)};for(let child of this.children)child.isSubcircuit||collectNamedComponents(child);return this._normalComponentNameMap=nameMap,nameMap}get config(){return{zodProps:groupProps,componentName:"Group"}}initPorts(opts={}){let schPinArrangement=this._getSchematicPortArrangement();this._parsedProps?.showAsSchematicBox&&!this._parsedProps.pinLabels&&schPinArrangement&&getPinsFromPortArrangement(schPinArrangement).some(pin=>typeof pin=="string")||super.initPorts(opts)}_getSchematicPortArrangementFromPortDirections(){if(!this._parsedProps?.showAsSchematicBox)return null;let sidePins={leftSide:[],rightSide:[],topSide:[],bottomSide:[]};for(let port of this.children){if(port.componentName!=="Port")continue;let direction2=port._parsedProps.direction;if(!direction2)continue;let pin=port._parsedProps.pinNumber??port._parsedProps.name??void 0;if(pin===void 0)continue;sidePins[direction2==="left"?"leftSide":direction2==="right"?"rightSide":direction2==="up"?"topSide":"bottomSide"].push(pin)}if(sidePins.leftSide.length===0&&sidePins.rightSide.length===0&&sidePins.topSide.length===0&&sidePins.bottomSide.length===0)return null;let arrangement={};return sidePins.leftSide.length>0&&(arrangement.leftSide={pins:sidePins.leftSide,direction:"top-to-bottom"}),sidePins.rightSide.length>0&&(arrangement.rightSide={pins:sidePins.rightSide,direction:"top-to-bottom"}),sidePins.topSide.length>0&&(arrangement.topSide={pins:sidePins.topSide,direction:"left-to-right"}),sidePins.bottomSide.length>0&&(arrangement.bottomSide={pins:sidePins.bottomSide,direction:"left-to-right"}),arrangement}_getSchematicPortArrangement(){return super._getSchematicPortArrangement()??this._getSchematicPortArrangementFromPortDirections()}_ensureSchematicBoxPortsFromConnections(){if(this._parsedProps?.showAsSchematicBox&&this._parsedProps?.connections)for(let[pinName,target]of Object.entries(this._parsedProps.connections)){if(this.children.find(child=>child.componentName==="Port"&&child.isMatchingAnyOf([pinName])))continue;let pinNumberMatch=pinName.match(/^pin(\d+)$/i)??pinName.match(/^(\d+)$/),pinNumber=pinNumberMatch?Number(pinNumberMatch[1]):void 0;this.add(new Port({name:pinName,pinNumber,connectsTo:target}))}}doInitialInitializePortsFromChildren(){super.doInitialInitializePortsFromChildren(),this._ensureSchematicBoxPortsFromConnections()}updateInitializePortsFromChildren(){super.updateInitializePortsFromChildren(),this._ensureSchematicBoxPortsFromConnections()}_getPrimaryPinCount(){let superPinCount=super._getPrimaryPinCount();if(!this._parsedProps?.showAsSchematicBox)return superPinCount;let directPortPinNumbers=this.children.filter(child=>child.componentName==="Port").map(port=>port._parsedProps.pinNumber).filter(pinNumber=>pinNumber!==void 0);return directPortPinNumbers.length===0?superPinCount:Math.max(superPinCount,...directPortPinNumbers)}_getPinLabelsFromPorts(){return this._parsedProps?.showAsSchematicBox?getGroupSchematicBoxPinLabels(this):super._getPinLabelsFromPorts()}doInitialSourceGroupRender(){let{db:db3}=this.root,hasExplicitName=typeof this._parsedProps.name=="string"&&this._parsedProps.name.length>0,source_group3=db3.source_group.insert({name:this.name,is_subcircuit:this.isSubcircuit,was_automatically_named:!hasExplicitName});this.source_group_id=source_group3.source_group_id,this.isSubcircuit&&(this.subcircuit_id=`subcircuit_${source_group3.source_group_id}`,db3.source_group.update(source_group3.source_group_id,{subcircuit_id:this.subcircuit_id}))}doInitialSourceRender(){let{db:db3}=this.root;for(let child of this.children)db3.source_component.update(child.source_component_id,{source_group_id:this.source_group_id})}doInitialSourceParentAttachment(){let{db:db3}=this.root,parentGroup=this.parent?.getGroup?.();if(parentGroup?.source_group_id&&db3.source_group.update(this.source_group_id,{parent_source_group_id:parentGroup.source_group_id}),!this.isSubcircuit)return;let parent_subcircuit_id=this.parent?.getSubcircuit?.()?.subcircuit_id;parent_subcircuit_id&&db3.source_group.update(this.source_group_id,{parent_subcircuit_id})}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,groupProps2=props,hasOutline=groupProps2.outline&&groupProps2.outline.length>0,numericOutline=hasOutline?groupProps2.outline.map(point6=>({x:distance.parse(point6.x),y:distance.parse(point6.y)})):void 0,ctx=this.props,anchorPosition=this._getGlobalPcbPositionBeforeLayout(),center2=computeCenterFromAnchorPosition(anchorPosition,ctx),pcb_group3=db3.pcb_group.insert({is_subcircuit:this.isSubcircuit,subcircuit_id:this.subcircuit_id??this.getSubcircuit()?.subcircuit_id,name:this.name,anchor_position:anchorPosition,center:center2,...hasOutline?{outline:numericOutline}:{width:0,height:0},pcb_component_ids:[],source_group_id:this.source_group_id,autorouter_configuration:props.autorouter?{trace_clearance:props.autorouter.traceClearance}:void 0,anchor_alignment:props.pcbAnchorAlignment??null});this.pcb_group_id=pcb_group3.pcb_group_id;for(let child of this.children)db3.pcb_component.update(child.pcb_component_id,{pcb_group_id:pcb_group3.pcb_group_id})}doInitialPcbPrimitiveRender(){this.calculatePcbGroupBounds()}calculatePcbGroupBounds(){if(!this.pcb_group_id||this.root?.pcbDisabled)return;let{db:db3}=this.root,props=this._parsedProps,hasOutline=props.outline&&props.outline.length>0,hasExplicitPositioning=this._parsedProps.pcbX!==void 0||this._parsedProps.pcbY!==void 0;if(hasOutline){let numericOutline=props.outline.map(point6=>({x:distance.parse(point6.x),y:distance.parse(point6.y)})),outlineBounds=getBoundsFromPoints(numericOutline);if(!outlineBounds)return;let centerX2=(outlineBounds.minX+outlineBounds.maxX)/2,centerY2=(outlineBounds.minY+outlineBounds.maxY)/2,center22=hasExplicitPositioning?db3.pcb_group.get(this.pcb_group_id)?.center??{x:centerX2,y:centerY2}:{x:centerX2,y:centerY2};db3.pcb_group.update(this.pcb_group_id,{center:center22});return}let bounds=getBoundsOfPcbComponents(this.children),width=bounds.width,height=bounds.height,centerX=(bounds.minX+bounds.maxX)/2,centerY=(bounds.minY+bounds.maxY)/2;if(this.isSubcircuit){let{padLeft,padRight,padTop,padBottom}=this._resolvePcbPadding();width+=padLeft+padRight,height+=padTop+padBottom,centerX+=(padRight-padLeft)/2,centerY+=(padTop-padBottom)/2}let resolvedWidth=Number(props.width??width),resolvedHeight=Number(props.height??height),existingPcbGroup=db3.pcb_group.get(this.pcb_group_id),center2=hasExplicitPositioning?existingPcbGroup?.center??{x:centerX,y:centerY}:{x:centerX,y:centerY};if(hasExplicitPositioning&&props.pcbAnchorAlignment){let anchorPosition=this._getGlobalPcbPositionBeforeLayout(),anchorAlignedCenter=computeCenterFromAnchorPosition(anchorPosition,{...this.props,width:resolvedWidth,height:resolvedHeight});(Math.abs(anchorAlignedCenter.x-center2.x)>1e-6||Math.abs(anchorAlignedCenter.y-center2.y)>1e-6)&&this._repositionOnPcb(anchorAlignedCenter),center2=anchorAlignedCenter}db3.pcb_group.update(this.pcb_group_id,{width:resolvedWidth,height:resolvedHeight,center:center2})}updatePcbPrimitiveRender(){this.calculatePcbGroupBounds()}getNextAvailableName(elm){var _a516,_b4;return(_a516=this.unnamedElementCounter)[_b4=elm.lowercaseComponentName]??(_a516[_b4]=1),`unnamed_${elm.lowercaseComponentName}${this.unnamedElementCounter[elm.lowercaseComponentName]++}`}_resolvePcbPadding(){let props=this._parsedProps,layout=props.pcbLayout,getPaddingValue=key=>{let layoutValue=layout?.[key],propsValue=props[key];if(typeof layoutValue=="number")return layoutValue;if(typeof propsValue=="number")return propsValue},generalPadding=getPaddingValue("padding")??0,paddingX=getPaddingValue("paddingX"),paddingY=getPaddingValue("paddingY"),padLeft=getPaddingValue("paddingLeft")??paddingX??generalPadding,padRight=getPaddingValue("paddingRight")??paddingX??generalPadding,padTop=getPaddingValue("paddingTop")??paddingY??generalPadding,padBottom=getPaddingValue("paddingBottom")??paddingY??generalPadding;return{padLeft,padRight,padTop,padBottom}}doInitialCreateTraceHintsFromProps(){let{_parsedProps:props}=this,{db:db3}=this.root,groupProps2=props;if(!this.isSubcircuit)return;let manualTraceHints=groupProps2.manualEdits?.manual_trace_hints;if(manualTraceHints)for(let manualTraceHint of manualTraceHints)this.add(new TraceHint({for:manualTraceHint.pcb_port_selector,offsets:manualTraceHint.offsets}))}doInitialSourceAddConnectivityMapKey(){Group_doInitialSourceAddConnectivityMapKey(this)}_areChildSubcircuitsRouted(){let subcircuitChildren=this._findDirectChildSubcircuits();for(let subcircuitChild of subcircuitChildren)if(!subcircuitChild._isInflatedFromCircuitJson&&subcircuitChild._hasTracesToRoute()&&subcircuitChild._shouldRouteAsync()&&!subcircuitChild._asyncAutoroutingResult)return!1;return!0}_findDirectChildSubcircuits(){let result=[],visit=children=>{for(let child of children)child.isSubcircuit&&child!==this?result.push(child):visit(child.children)};return visit(this.children),result}_shouldRouteAsync(){let autorouter=this._getAutorouterConfig();return autorouter.groupMode==="sequential-trace"?!1:!!(autorouter.local&&autorouter.groupMode==="subcircuit"||!autorouter.local)}_getRoutingPhasePlans(){return Group_getRoutingPhasePlans(this)}_hasTracesToRoute(){let debug122=(0,import_debug11.default)("tscircuit:core:_hasTracesToRoute"),routingPhasePlans=this._getRoutingPhasePlans(),traceCount=0,hasReroutePhaseWithRegion=!1;for(let routingPhasePlan of routingPhasePlans)traceCount+=routingPhasePlan.traces.length,hasReroutePhaseWithRegion||(hasReroutePhaseWithRegion=!!(routingPhasePlan.reroute&&routingPhasePlan.region));if(debug122(`[${this.getString()}] has ${traceCount} traces to route`),traceCount>0)return!0;if(hasReroutePhaseWithRegion){let existingTraceCount=getExistingPcbTracesForReroute(this).length;return debug122(`[${this.getString()}] has ${existingTraceCount} existing pcb traces available for reroute`),existingTraceCount>0}return!1}async _runEffectMakeHttpAutoroutingRequest(){let{db:db3}=this.root,debug122=(0,import_debug11.default)("tscircuit:core:_runEffectMakeHttpAutoroutingRequest"),props=this._parsedProps,autorouterConfig2=this._getAutorouterConfig(),serverUrl=autorouterConfig2.serverUrl,serverMode=autorouterConfig2.serverMode,fetchWithDebug=(url2,options)=>(debug122("fetching",url2),options.headers&&(options.headers["Tscircuit-Core-Version"]=this.root?.getCoreVersion()),fetch(url2,options)),pcbAndSourceCircuitJson=this.root.db.toArray().filter(element=>element.type.startsWith("source_")||element.type.startsWith("pcb_"));if(serverMode==="solve-endpoint"){if(this.props.autorouter?.inputFormat==="simplified"){let{autorouting_result:autorouting_result2}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_simple_route_json:getSimpleRouteJsonFromCircuitJson({db:db3,minTraceWidth:Number(props.minTraceWidth??.15),nominalTraceWidth:this.props.nominalTraceWidth,subcircuit_id:this.subcircuit_id,subcircuitComponent:this}).simpleRouteJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r6=>r6.json());this._asyncAutoroutingResult=autorouting_result2,this._markDirty("PcbTraceRender");return}let{autorouting_result}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_circuit_json:pcbAndSourceCircuitJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r6=>r6.json());this._asyncAutoroutingResult=autorouting_result,this._markDirty("PcbTraceRender");return}let{autorouting_job}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/create`,{method:"POST",body:JSON.stringify({input_circuit_json:pcbAndSourceCircuitJson,provider:"freerouting",autostart:!0,display_name:this.root?.name,subcircuit_id:this.subcircuit_id,server_cache_enabled:autorouterConfig2.serverCacheEnabled}),headers:{"Content-Type":"application/json"}}).then(r6=>r6.json());for(;;){let{autorouting_job:job}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/get`,{method:"POST",body:JSON.stringify({autorouting_job_id:autorouting_job.autorouting_job_id}),headers:{"Content-Type":"application/json"}}).then(r6=>r6.json());if(job.is_finished){let{autorouting_job_output}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/get_output`,{method:"POST",body:JSON.stringify({autorouting_job_id:autorouting_job.autorouting_job_id}),headers:{"Content-Type":"application/json"}}).then(r6=>r6.json());this._asyncAutoroutingResult={output_pcb_traces:autorouting_job_output.output_pcb_traces},this._markDirty("PcbTraceRender");break}if(job.has_error){let err2=new AutorouterError(`Autorouting job failed: ${JSON.stringify(job.error)}`);throw db3.pcb_autorouting_error.insert({pcb_error_id:autorouting_job.autorouting_job_id,error_type:"pcb_autorouting_error",message:err2.message}),err2}await new Promise(resolve=>setTimeout(resolve,100))}}async _runLocalAutorouting(){let{db:db3}=this.root,props=this._parsedProps,debug122=(0,import_debug11.default)("tscircuit:core:_runLocalAutorouting");debug122(`[${this.getString()}] starting local autorouting`);let autorouterConfig2=this._getAutorouterConfig(),isLaserPrefabPreset=this._isLaserPrefabAutorouter(autorouterConfig2),isAutoJumperPreset=this._isAutoJumperAutorouter(autorouterConfig2),isSingleLayerBoard=this._getSubcircuitLayerCount()===1,minTraceWidth=Number(props.minTraceWidth??.15),nominalTraceWidth=Number(props.nominalTraceWidth??.15),{simpleRouteJson:baseSimpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db:db3,minTraceWidth,nominalTraceWidth,subcircuit_id:this.subcircuit_id,subcircuitComponent:this}),routingPhasePlans=this._getRoutingPhasePlans(),hasPhasedAutorouting=Group_hasPhasedAutorouting(routingPhasePlans),outputTraces=[],outputJumpers=[],pcbTraceIdsToDelete=new Set,existingRerouteSeedTraces=getExistingSimplifiedPcbTracesForReroute(this),traceMatchesRoutingPhase=(trace,routingPhasePlan)=>{let connectionName=trace.connection_name??trace.pcb_trace_id,sourceTraceIds=new Set([connectionName,trace.pcb_trace_id,...getSourceTraceIdsFromRerouteName(connectionName),...getSourceTraceIdsFromRerouteName(trace.pcb_trace_id)]);return baseSimpleRouteJson.connections.some(connection=>connectionIsInRoutingPhase(connection,routingPhasePlan)?sourceTraceIds.has(connection.name)||(connection.source_trace_id?sourceTraceIds.has(connection.source_trace_id):!1)||(connection.rootConnectionName?sourceTraceIds.has(connection.rootConnectionName):!1)||connection.mergedConnectionNames?.some(name=>sourceTraceIds.has(name)):!1)};for(let routingPhasePlan of routingPhasePlans){let phaseAutorouterConfig=routingPhasePlan.autorouter?getPresetAutoroutingConfig(routingPhasePlan.autorouter,this.root?.platform):autorouterConfig2,simpleRouteJson=baseSimpleRouteJson,isRegionReroutePhase=!!(routingPhasePlan.reroute&&routingPhasePlan.region),isConnectionReroutePhase=!!(routingPhasePlan.reroute&&!routingPhasePlan.region&&routingPhasePlan.traces.length>0),isReroutePhase=isRegionReroutePhase||isConnectionReroutePhase,rerouteOriginalSrj=isRegionReroutePhase?{...baseSimpleRouteJson,traces:[...existingRerouteSeedTraces,...outputTraces]}:null;if(isRegionReroutePhase&&rerouteOriginalSrj?simpleRouteJson=xW(rerouteOriginalSrj,{shape:"rect",...routingPhasePlan.region}):isConnectionReroutePhase?(simpleRouteJson=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan),simpleRouteJson.obstacles=[...simpleRouteJson.obstacles,...Group_getObstaclesFromRoutedTraces(outputTraces.filter(trace=>!traceMatchesRoutingPhase(trace,routingPhasePlan)))]):hasPhasedAutorouting&&(simpleRouteJson=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan),simpleRouteJson.obstacles=[...simpleRouteJson.obstacles,...Group_getObstaclesFromRoutedTraces(outputTraces)]),simpleRouteJson=Group_applyDrcTolerancesToSimpleRouteJson(simpleRouteJson,routingPhasePlan.drcTolerances),(hasPhasedAutorouting||isReroutePhase)&&simpleRouteJson.connections.length===0)continue;let phaseIsAutoJumperPreset=routingPhasePlan.autorouter!==void 0?this._isAutoJumperAutorouter(phaseAutorouterConfig):isAutoJumperPreset,phaseIsLaserPrefabPreset=routingPhasePlan.autorouter!==void 0?this._isLaserPrefabAutorouter(phaseAutorouterConfig):isLaserPrefabPreset;if(phaseIsAutoJumperPreset&&(simpleRouteJson.allowJumpers=!0,phaseAutorouterConfig.availableJumperTypes&&(simpleRouteJson.availableJumperTypes=phaseAutorouterConfig.availableJumperTypes)),debug122.enabled&&global.debugOutputArray?.push({name:`simpleroutejson-${this.props.name}.json`,obj:simpleRouteJson}),debug122.enabled){let graphicsObject=Oo2(simpleRouteJson);graphicsObject.title=`autorouting-${this.props.name}`,global.debugGraphics?.push(graphicsObject)}this.root?.emit("autorouting:start",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),simpleRouteJson});let autorouter;if(phaseAutorouterConfig.algorithmFn)autorouter=await phaseAutorouterConfig.algorithmFn(simpleRouteJson);else{let autorouterVersion2=this.props.autorouterVersion,effortLevel=this.props.autorouterEffortLevel,effort=effortLevel?Number.parseInt(effortLevel.replace("x",""),10):void 0;autorouter=new TscircuitAutorouter(simpleRouteJson,{capacityDepth:phaseAutorouterConfig.capacityDepth,targetMinCapacity:phaseAutorouterConfig.targetMinCapacity,useAssignableSolver:phaseIsLaserPrefabPreset||isSingleLayerBoard,useAutoJumperSolver:phaseIsAutoJumperPreset,useLaserPrefabSolver:phaseIsLaserPrefabPreset,autorouterVersion:autorouterVersion2,effort,onSolverStarted:({solverName,solverParams})=>this.root?.emit("solver:started",{type:"solver:started",solverName,solverParams,componentName:this.getString()})})}let routingPromise=new Promise((resolve,reject)=>{autorouter.on("complete",event=>{debug122(`[${this.getString()}] local autorouting complete`),resolve(event.traces)}),autorouter.on("error",event=>{debug122(`[${this.getString()}] local autorouting error: ${event.error.message}`),reject(event.error)})});autorouter.on("progress",event=>{this.root?.emit("autorouting:progress",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...event})}),autorouter.start();try{let traces=await routingPromise,outputSimpleRouteJson={...simpleRouteJson,traces};if(this.root?.emit("autorouting:end",{type:"autorouting:end",subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),simpleRouteJson:outputSimpleRouteJson}),autorouter.getConnectedOffboardObstacles){let connectedOffboardObstacles=autorouter.getConnectedOffboardObstacles();createSourceTracesFromOffboardConnections({db:db3,connectedOffboardObstacles,simpleRouteJson,subcircuit_id:this.subcircuit_id})}let solver=autorouter.solver;if(solver?.getOutputJumpers&&outputJumpers.push(...solver.getOutputJumpers()||[]),isRegionReroutePhase&&rerouteOriginalSrj){for(let trace of rerouteOriginalSrj.traces??[])trace.type==="pcb_trace"&&pcbTraceIdsToDelete.add(trace.pcb_trace_id);let reconnectedSrj=vW(rerouteOriginalSrj,{...simpleRouteJson,traces:[...simpleRouteJson.traces??[],...traces]});outputTraces.splice(0,outputTraces.length,...reconnectedSrj.traces??[])}else isConnectionReroutePhase?outputTraces.splice(0,outputTraces.length,...outputTraces.filter(trace=>!traceMatchesRoutingPhase(trace,routingPhasePlan)),...traces):outputTraces.push(...traces)}catch(error2){let{db:db22}=this.root;throw db22.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouter_error_subcircuit_${this.subcircuit_id}`,error_type:"pcb_autorouting_error",message:error2 instanceof Error?error2.message:String(error2)}),this.root?.emit("autorouting:error",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),error:{message:error2 instanceof Error?error2.message:String(error2)},simpleRouteJson}),error2}finally{autorouter.stop()}}this._asyncAutoroutingResult={output_pcb_traces:outputTraces,output_jumpers:outputJumpers,pcb_trace_ids_to_be_replaced:[...pcbTraceIdsToDelete],input_simple_route_json:baseSimpleRouteJson},this._markDirty("PcbTraceRender")}_startAsyncAutorouting(){this._hasStartedAsyncAutorouting||(this._hasStartedAsyncAutorouting=!0,this._getAutorouterConfig().local?this._queueAsyncEffect("capacity-mesh-autorouting",async()=>this._runLocalAutorouting()):this._queueAsyncEffect("make-http-autorouting-request",async()=>this._runEffectMakeHttpAutoroutingRequest()))}doInitialPcbTraceRender(){let debug122=(0,import_debug11.default)("tscircuit:core:doInitialPcbTraceRender");if(this.isSubcircuit&&!this.root?.pcbDisabled&&!(this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"))&&!this._isInflatedFromCircuitJson&&!this._shouldUseTraceByTraceRouting()){if(!this._areChildSubcircuitsRouted()){debug122(`[${this.getString()}] child subcircuits are not routed, skipping async autorouting until subcircuits routed`);return}debug122(`[${this.getString()}] no child subcircuits to wait for, initiating async routing`),this._hasTracesToRoute()&&this._startAsyncAutorouting()}}doInitialSchematicTraceRender(){this._parsedProps.showAsSchematicBox||Group_doInitialSchematicTraceRender(this)}updatePcbTraceRender(){let debug122=(0,import_debug11.default)("tscircuit:core:updatePcbTraceRender");if(debug122(`[${this.getString()}] updating...`),!this.isSubcircuit||this._isInflatedFromCircuitJson)return;if(this._shouldRouteAsync()&&this._hasTracesToRoute()&&!this._hasStartedAsyncAutorouting){this._areChildSubcircuitsRouted()&&(debug122(`[${this.getString()}] child subcircuits are now routed, starting async autorouting`),this._startAsyncAutorouting());return}if(!this._asyncAutoroutingResult||this._shouldUseTraceByTraceRouting())return;let{db:db3}=this.root;if(this._asyncAutoroutingResult.output_simple_route_json){debug122(`[${this.getString()}] updating PCB traces from simple route json (${this._asyncAutoroutingResult.output_simple_route_json.traces?.length} traces)`),this._updatePcbTraceRenderFromSimpleRouteJson();return}if(this._asyncAutoroutingResult.output_pcb_traces){debug122(`[${this.getString()}] updating PCB traces from ${this._asyncAutoroutingResult.output_pcb_traces.length} traces`),this._updatePcbTraceRenderFromPcbTraces();return}}_updatePcbTraceRenderFromSimpleRouteJson(){let{db:db3}=this.root,{traces:routedTraces}=this._asyncAutoroutingResult.output_simple_route_json;if(routedTraces)for(let routedTrace of routedTraces){let cjRoute=routedTrace.route.map(point6=>point6.route_type!=="through_obstacle"?point6:{route_type:"through_pad",start:point6.start,end:point6.end,start_layer:point6.from_layer,end_layer:point6.to_layer,width:point6.width}),pcb_trace3=db3.pcb_trace.insert({subcircuit_id:this.subcircuit_id,route:cjRoute})}}_updatePcbTraceRenderFromPcbTraces(){let{output_pcb_traces,output_jumpers,pcb_trace_ids_to_be_replaced,input_simple_route_json}=this._asyncAutoroutingResult;if(!output_pcb_traces)return;let{db:db3}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2),board=db3.pcb_board.list()[0],routedViaHoleDiameter=board?.min_via_hole_diameter??holeDiameter,routedViaPadDiameter=board?.min_via_pad_diameter??padDiameter;output_jumpers&&output_jumpers.length>0&&insertAutoplacedJumpers({db:db3,output_jumpers,subcircuit_id:this.subcircuit_id}),deleteExistingPcbTracesReplacedBy({group:this,outputPcbTraces:output_pcb_traces,pcbTraceIdsToReplace:pcb_trace_ids_to_be_replaced});for(let pcb_trace3 of output_pcb_traces){if(pcb_trace3.type!=="pcb_trace")continue;pcb_trace3.subcircuit_id??(pcb_trace3.subcircuit_id=this.subcircuit_id);let cjRoute=pcb_trace3.route.map(point6=>point6.route_type!=="through_obstacle"?point6:{route_type:"through_pad",start:point6.start,end:point6.end,start_layer:point6.from_layer,end_layer:point6.to_layer,width:point6.width}),routeSourceTraceId=getSourceTraceIdForRoutedTrace({db:db3,trace:{...pcb_trace3,route:cjRoute},subcircuit_id:this.subcircuit_id});cjRoute=ensureRouteStartsAtSourceTraceStart({db:db3,route:cjRoute,sourceTraceId:routeSourceTraceId}),pcb_trace3.route=cjRoute;let segments=splitPcbTracesOnJumperSegments(cjRoute);segments===null&&(segments=[cjRoute]);let processedSegments=addPortIdsToTracesAtJumperPads(segments,db3);for(let segment2 of processedSegments)if(segment2.length>0){let sourceTraceId=getSourceTraceIdForRoutedTrace({db:db3,trace:{...pcb_trace3,route:segment2},subcircuit_id:this.subcircuit_id});db3.pcb_trace.insert({...pcb_trace3,source_trace_id:sourceTraceId,route:segment2})}}for(let pcb_trace3 of output_pcb_traces)if(pcb_trace3.type!=="pcb_via"&&pcb_trace3.type==="pcb_trace"){let sourceTraceId=getSourceTraceIdForRoutedTrace({db:db3,trace:pcb_trace3,subcircuit_id:this.subcircuit_id}),{connection_name:inputConnectionName}=pcb_trace3,subcircuitConnectivityMapKey;if(sourceTraceId&&(subcircuitConnectivityMapKey=db3.source_trace.get(sourceTraceId)?.subcircuit_connectivity_map_key),!subcircuitConnectivityMapKey&&inputConnectionName){let sourceNet=db3.source_net.get(inputConnectionName);sourceNet&&(subcircuitConnectivityMapKey=sourceNet.subcircuit_connectivity_map_key)}for(let point6 of pcb_trace3.route)if(point6.route_type==="via"){let routedViaPoint=point6,fromLayer=point6.from_layer,toLayer=point6.to_layer;db3.pcb_via.insert({pcb_trace_id:pcb_trace3.pcb_trace_id,x:point6.x,y:point6.y,hole_diameter:routedViaPoint.via_hole_diameter??routedViaPoint.hole_diameter??routedViaHoleDiameter,outer_diameter:routedViaPoint.via_diameter??routedViaPoint.outer_diameter??routedViaPadDiameter,layers:getViaBoardLayers(this._getSubcircuitLayerCount()),from_layer:fromLayer,to_layer:toLayer,subcircuit_id:this.subcircuit_id,pcb_group_id:this.pcb_group_id??void 0,subcircuit_connectivity_map_key:subcircuitConnectivityMapKey})}}}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,schematic_group3=db3.schematic_group.insert({is_subcircuit:this.isSubcircuit,subcircuit_id:this.subcircuit_id,name:this.name,center:this._getGlobalSchematicPositionBeforeLayout(),width:0,height:0,schematic_component_ids:[],source_group_id:this.source_group_id,show_as_schematic_box:props.showAsSchematicBox??!1});this.schematic_group_id=schematic_group3.schematic_group_id,props.showAsSchematicBox&&Group_doInitialSchematicBoxComponentRender(this);for(let child of this.children)child._parsedProps?.showAsSchematicBox||child.schematic_component_id&&db3.schematic_component.update(child.schematic_component_id,{schematic_group_id:schematic_group3.schematic_group_id})}_getSchematicLayoutMode(){let props=this._parsedProps,schAutoLayoutEnabled=props.schAutoLayoutEnabled??!1;if(props.schLayout?.layoutMode==="none"||props.schLayout?.layoutMode==="relative")return"relative";if(props.schLayout?.matchAdapt)return"match-adapt";if(props.schLayout?.flex)return"flex";if(props.schLayout?.grid)return"grid";if(props.schMatchAdapt)return"match-adapt";if(props.schFlex)return"flex";if(props.schGrid)return"grid";if(props.matchAdapt)return"match-adapt";if(props.flex)return"flex";if(props.grid)return"grid";if(props.relative||props.schRelative)return"relative";let anyLayoutChildHasSchCoords=this.children.some(child=>{let cProps=child._parsedProps;return(child.source_component_id!==null||child.source_group_id!==null)&&(cProps?.schX!==void 0||cProps?.schY!==void 0)}),hasManualEdits=(props.manualEdits?.schematic_placements?.length??0)>0;return schAutoLayoutEnabled&&!hasManualEdits||!anyLayoutChildHasSchCoords&&!hasManualEdits?"match-adapt":"relative"}doInitialSchematicLayout(){if(this._parsedProps.showAsSchematicBox){this._insertSchematicBorder();return}if(this.children.some(c6=>c6.source_component_id!==null&&c6._parsedProps?.schSectionName!==void 0)){this._doInitialSchematicLayoutSections(),this._insertSchematicBorder();return}let schematicLayoutMode=this._getSchematicLayoutMode();schematicLayoutMode==="match-adapt"&&this._doInitialSchematicLayoutMatchpack(),schematicLayoutMode==="grid"&&this._doInitialSchematicLayoutGrid(),schematicLayoutMode==="flex"&&this._doInitialSchematicLayoutFlex(),this._insertSchematicBorder()}_doInitialSchematicLayoutSections(){Group_doInitialSchematicLayoutSections(this)}_doInitialSchematicLayoutMatchAdapt(){Group_doInitialSchematicLayoutMatchAdapt(this)}_doInitialSchematicLayoutMatchpack(){Group_doInitialSchematicLayoutMatchPack(this)}_doInitialSchematicLayoutGrid(){Group_doInitialSchematicLayoutGrid(this)}_doInitialSchematicLayoutFlex(){Group_doInitialSchematicLayoutFlex(this)}_getPcbLayoutMode(){let props=this._parsedProps,rawProps=this.props;if(this._isInflatedFromCircuitJson||props.pcbRelative)return"none";if(props.pcbLayout?.matchAdapt)return"match-adapt";if(props.pcbLayout?.flex)return"flex";if(props.pcbLayout?.grid)return"grid";if(props.pcbLayout?.pack)return"pack";if(props.pcbFlex)return"flex";if(props.pcbGrid)return"grid";if(props.pcbPack||props.pack)return"pack";if(props.matchAdapt)return"match-adapt";if(props.flex)return"flex";if(props.grid)return"grid";let groupHasCoords=props.pcbX!==void 0||props.pcbY!==void 0||props.pcbLeftEdgeX!==void 0||props.pcbRightEdgeX!==void 0||props.pcbTopEdgeY!==void 0||props.pcbBottomEdgeY!==void 0||rawProps.pcbLeftEdgeX!==void 0||rawProps.pcbRightEdgeX!==void 0||rawProps.pcbTopEdgeY!==void 0||rawProps.pcbBottomEdgeY!==void 0,hasManualEdits=(props.manualEdits?.pcb_placements?.length??0)>0,unpositionedDirectChildrenCount=this.children.reduce((count,child)=>{if(!child.pcb_component_id&&!child.pcb_group_id)return count;let childProps=child._parsedProps,rawChildProps=child.props,hasCoords=childProps?.pcbX!==void 0||childProps?.pcbY!==void 0||childProps?.pcbLeftEdgeX!==void 0||childProps?.pcbRightEdgeX!==void 0||childProps?.pcbTopEdgeY!==void 0||childProps?.pcbBottomEdgeY!==void 0||rawChildProps?.pcbLeftEdgeX!==void 0||rawChildProps?.pcbRightEdgeX!==void 0||rawChildProps?.pcbTopEdgeY!==void 0||rawChildProps?.pcbBottomEdgeY!==void 0;return count+(hasCoords?0:1)},0);return!hasManualEdits&&unpositionedDirectChildrenCount>1?"pack":"none"}doInitialPcbLayout(){if(this.root?.pcbDisabled)return;if(this.pcb_group_id){let{db:db3}=this.root,props=this._parsedProps;if(props.pcbX!==void 0||props.pcbY!==void 0){let parentGroup=this.parent?.getGroup?.(),pcbParentGroupId=parentGroup?.pcb_group_id?db3.pcb_group.get(parentGroup.pcb_group_id)?.pcb_group_id:void 0,positionedRelativeToBoardId=pcbParentGroupId?void 0:this._getBoard()?.pcb_board_id??void 0;db3.pcb_group.update(this.pcb_group_id,{position_mode:"relative_to_group_anchor",positioned_relative_to_pcb_group_id:pcbParentGroupId,positioned_relative_to_pcb_board_id:positionedRelativeToBoardId,display_offset_x:props.pcbX,display_offset_y:props.pcbY})}}let pcbLayoutMode=this._getPcbLayoutMode();pcbLayoutMode==="grid"?this._doInitialPcbLayoutGrid():pcbLayoutMode==="pack"?this._doInitialPcbLayoutPack():pcbLayoutMode==="flex"&&this._doInitialPcbLayoutFlex()}_doInitialPcbLayoutGrid(){Group_doInitialPcbLayoutGrid(this)}_doInitialPcbLayoutPack(){Group_doInitialPcbLayoutPack(this)}_doInitialPcbLayoutFlex(){Group_doInitialPcbLayoutFlex(this)}_insertSchematicBorder(){if(this.root?.schematicDisabled)return;let{db:db3}=this.root,props=this._parsedProps;if(!props.border)return;let width=typeof props.schWidth=="number"?props.schWidth:void 0,height=typeof props.schHeight=="number"?props.schHeight:void 0,paddingGeneral=typeof props.schPadding=="number"?props.schPadding:0,paddingLeft=typeof props.schPaddingLeft=="number"?props.schPaddingLeft:paddingGeneral,paddingRight=typeof props.schPaddingRight=="number"?props.schPaddingRight:paddingGeneral,paddingTop=typeof props.schPaddingTop=="number"?props.schPaddingTop:paddingGeneral,paddingBottom=typeof props.schPaddingBottom=="number"?props.schPaddingBottom:paddingGeneral,schematicGroup=this.schematic_group_id?db3.schematic_group.get(this.schematic_group_id):null;if(schematicGroup&&(width===void 0&&typeof schematicGroup.width=="number"&&(width=schematicGroup.width),height===void 0&&typeof schematicGroup.height=="number"&&(height=schematicGroup.height)),width===void 0||height===void 0)return;let center2=schematicGroup?.center??this._getGlobalSchematicPositionBeforeLayout(),left=center2.x-width/2-paddingLeft,bottom=center2.y-height/2-paddingBottom,finalWidth=width+paddingLeft+paddingRight,finalHeight=height+paddingTop+paddingBottom;db3.schematic_box.insert({width:finalWidth,height:finalHeight,x:left,y:bottom,is_dashed:props.border?.dashed??!1})}_determineSideFromPosition(port,component){if(!port.center||!component.center)return"left";let dx3=port.center.x-component.center.x,dy3=port.center.y-component.center.y;return Math.abs(dx3)>Math.abs(dy3)?dx3>0?"right":"left":dy3>0?"bottom":"top"}_calculateSchematicBounds(boxes){if(boxes.length===0)return{minX:0,maxX:0,minY:0,maxY:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let box2 of boxes)minX=Math.min(minX,box2.centerX),maxX=Math.max(maxX,box2.centerX),minY=Math.min(minY,box2.centerY),maxY=Math.max(maxY,box2.centerY);let padding=2;return{minX:minX-padding,maxX:maxX+padding,minY:minY-padding,maxY:maxY+padding}}_getAutorouterConfig(){let autorouter=this._parsedProps.autorouter||this.getInheritedProperty("autorouter");return getPresetAutoroutingConfig(autorouter,this.root?.platform)}_isLaserPrefabAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize3=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="laser_prefab"?!0:typeof autorouterProp2=="string"?normalize3(autorouterProp2)==="laser_prefab":typeof autorouterProp2=="object"&&autorouterProp2?normalize3(autorouterProp2.preset)==="laser_prefab":!1}_isAutoJumperAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize3=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="auto_jumper"?!0:typeof autorouterProp2=="string"?normalize3(autorouterProp2)==="auto_jumper":typeof autorouterProp2=="object"&&autorouterProp2?normalize3(autorouterProp2.preset)==="auto_jumper":!1}_getSubcircuitLayerCount(){let layers=this.getInheritedProperty("layers");return typeof layers=="number"?layers:2}_shouldUseTraceByTraceRouting(){return this._getAutorouterConfig().groupMode==="sequential-trace"}doInitialPcbDesignRuleChecks(){if(this.root?.pcbDisabled||this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"))return;let{db:db3}=this.root;if(this.isSubcircuit){let immediateChildrenByName=new Map;for(let child of this.children)if(!child.isSubcircuit&&child._parsedProps.name){let components=immediateChildrenByName.get(child._parsedProps.name)||[];components.push(child),immediateChildrenByName.set(child._parsedProps.name,components)}for(let[name,components]of immediateChildrenByName.entries()){if(components.length<=1)continue;let sameNamedTraces=components.filter(child=>child instanceof Trace3),duplicateNameIsOnlyTraces=sameNamedTraces.length===components.length,mutuallyConnectedTraceKeys=sameNamedTraces.map(trace=>trace.subcircuit_connectivity_map_key),sameNamedTracesAreMutuallyConnected=duplicateNameIsOnlyTraces&&mutuallyConnectedTraceKeys.every(Boolean)&&new Set(mutuallyConnectedTraceKeys).size===1;if(!duplicateNameIsOnlyTraces||!sameNamedTracesAreMutuallyConnected){let displaySubcircuitName=this.name||"unnamed",message=duplicateNameIsOnlyTraces?`Trace "${name}" in subcircuit "${displaySubcircuitName}" shares a name with another trace, but the traces are not mutually connected. Same-named traces must have the same subcircuit connectivity map key.`:`Multiple immediate children found with name "${name}" in subcircuit "${displaySubcircuitName}". Names must be unique.`;db3.pcb_trace_error.insert({error_type:"pcb_trace_error",message,source_trace_id:"",pcb_trace_id:"",pcb_component_ids:components.map(c6=>c6.pcb_component_id).filter(Boolean),pcb_port_ids:[]})}}}}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled||!this.isSubcircuit)return;let{db:db3}=this.root,subtree=db3;for(let nl3 of subtree.schematic_net_label.list()){let net=subtree.source_net.get(nl3.source_net_id),text=nl3.text||net?.name||"";if(nl3.anchor_side==="top"&&GROUND_NET_REGEX.test(text)){subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_down"});continue}nl3.anchor_side==="bottom"&&POWER_NET_REGEX.test(text)&&subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_up"})}}doInitialSimulationSpiceEngineRender(){Group_doInitialSimulationSpiceEngineRender(this)}doInitialPcbComponentAnchorAlignment(){Group_doInitialPcbComponentAnchorAlignment(this)}updatePcbComponentAnchorAlignment(){this.doInitialPcbComponentAnchorAlignment()}doInitialPcbCalcPlacementResolution(){Group_doInitialPcbCalcPlacementResolution(this)}updatePcbCalcPlacementResolution(){this.doInitialPcbCalcPlacementResolution()}_getMinimumFlexContainerSize(){return super._getMinimumFlexContainerSize()}_repositionOnPcb(position4){return super._repositionOnPcb(position4)}};function inflateSourceGroup(sourceGroup,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbGroup=injectionDb.pcb_group.getWhere({source_group_id:sourceGroup.source_group_id}),groupProps2={name:sourceGroup.name??`inflated_group_${sourceGroup.source_group_id}`};if(pcbGroup?.position_mode==="relative_to_group_anchor"&&pcbGroup.anchor_position){let baseAnchor={x:0,y:0};if(sourceGroup.parent_source_group_id){let parentPcbGroup=injectionDb.pcb_group.getWhere({source_group_id:sourceGroup.parent_source_group_id});parentPcbGroup?.anchor_position&&(baseAnchor=parentPcbGroup.anchor_position)}groupProps2.pcbX=pcbGroup.anchor_position.x-baseAnchor.x,groupProps2.pcbY=pcbGroup.anchor_position.y-baseAnchor.y}pcbGroup?.anchor_alignment&&(groupProps2.pcbAnchorAlignment=pcbGroup.anchor_alignment);let group=new Group5(groupProps2);return group._isInflatedFromCircuitJson=!0,group.source_group_id=sourceGroup.source_group_id,groupsMap&&groupsMap.set(sourceGroup.source_group_id,group),sourceGroup.parent_source_group_id&&groupsMap?.has(sourceGroup.parent_source_group_id)?groupsMap.get(sourceGroup.parent_source_group_id).add(group):subcircuit.add(group),group}var Inductor2=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Inductor",schematicSymbolName:this.props.symbolName??"inductor",zodProps:inductorProps,sourceFtype:FTYPE.simple_inductor}}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.inductance)}H`}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({name:this.name,ftype:FTYPE.simple_inductor,inductance:this.props.inductance,display_inductance:this._getSchematicSymbolDisplayValue(),supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceInductor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),inductor=new Inductor2({name:sourceElm.name,inductance:sourceElm.inductance,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:inductor});footprint&&inductor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(inductor):subcircuit.add(inductor)}var Led=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pin1);__publicField(this,"anode",this.portMap.pin1);__publicField(this,"neg",this.portMap.pin2);__publicField(this,"cathode",this.portMap.pin2)}get config(){let symbolMap={laser:"laser_diode"},variantSymbol=this.props.laser?"laser":null;return{schematicSymbolName:variantSymbol?symbolMap[variantSymbol]:this.props.symbolName??"led",componentName:"Led",zodProps:ledProps,sourceFtype:"simple_led"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}_getSchematicSymbolDisplayValue(){return this._parsedProps.schDisplayValue||this._parsedProps.color||void 0}getFootprinterString(){let baseFootprint=super.getFootprinterString();return baseFootprint&&this.props.color?`${baseFootprint}_color(${this.props.color})`:baseFootprint}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({ftype:"simple_led",name:this.name,wave_length:props.wavelength,color:props.color,symbol_display_value:this._getSchematicSymbolDisplayValue(),manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceLed(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),led2=new Led({name:sourceElm.name,color:sourceElm.color,wavelength:sourceElm.wavelength??sourceElm.wave_length,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:led2});footprint&&led2.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(led2):subcircuit.add(led2)}function inflateSourcePort(sourcePort,inflatorContext){let{injectionDb,subcircuit}=inflatorContext;if(sourcePort.source_component_id!==null)return;let pcbPortFromInjection=injectionDb.pcb_port.getWhere({source_port_id:sourcePort.source_port_id}),port=new Port({name:sourcePort.name,pinNumber:sourcePort.pin_number});subcircuit.add(port),port.source_port_id=sourcePort.source_port_id;let root=subcircuit.root;if(root&&pcbPortFromInjection){let{db:db3}=root,pcb_port3=db3.pcb_port.insert({pcb_component_id:void 0,layers:pcbPortFromInjection.layers,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:subcircuit.getGroup()?.pcb_group_id??void 0,x:pcbPortFromInjection.x,y:pcbPortFromInjection.y,source_port_id:sourcePort.source_port_id,is_board_pinout:!1});port.pcb_port_id=pcb_port3.pcb_port_id}}var PushButton=class extends NormalComponent3{get config(){return{componentName:"PushButton",schematicSymbolName:this.props.symbolName??"push_button_normally_open_momentary",zodProps:pushButtonProps,sourceFtype:FTYPE.simple_push_button}}get defaultInternallyConnectedPinNames(){return[]}initPorts(){super.initPorts({pinCount:2,ignoreSymbolPorts:!0});let symbol=rc[this._getSchematicSymbolNameOrThrow()],symPort1=symbol.ports.find(p5=>p5.labels.includes("1")),symPort2=symbol.ports.find(p5=>p5.labels.includes("2")),ports=this.selectAll("port"),pin1Port=ports.find(p5=>p5.props.pinNumber===1),pin2Port=ports.find(p5=>p5.props.pinNumber===2),pin3Port=ports.find(p5=>p5.props.pinNumber===3),pin4Port=ports.find(p5=>p5.props.pinNumber===4),{internallyConnectedPins}=this._parsedProps;pin1Port.schematicSymbolPortDef=symPort1,(!internallyConnectedPins||internallyConnectedPins.length===0)&&(pin2Port.schematicSymbolPortDef=symPort2);for(let[pn3,port]of[[2,pin2Port],[3,pin3Port],[4,pin4Port]]){let internallyConnectedRow=internallyConnectedPins?.find(([pin1,pin2])=>pin1===`pin${pn3}`||pin2===`pin${pn3}`);if(!internallyConnectedRow){port.schematicSymbolPortDef=symPort2;break}(internallyConnectedRow?.[0]===`pin${pn3}`?internallyConnectedRow[1]:internallyConnectedRow?.[0])!=="pin1"&&(port.schematicSymbolPortDef=symPort2)}}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({name:this.name,ftype:FTYPE.simple_push_button,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourcePushButton(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),pushButton=new PushButton({name:sourceElm.name,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:pushButton});footprint&&pushButton.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(pushButton):subcircuit.add(pushButton)}var Resistor2=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Resistor",schematicSymbolName:this.props.symbolName??"boxresistor",zodProps:resistorProps,sourceFtype:"simple_resistor"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.resistance)}\u03A9`}doInitialCreateNetsFromProps(){this._createNetsFromProps([this.props.pullupFor,this.props.pullupTo,this.props.pulldownFor,this.props.pulldownTo,...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this.props.pullupFor&&this.props.pullupTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pullupFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pullupTo}))),this.props.pulldownFor&&this.props.pulldownTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pulldownFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pulldownTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({ftype:"simple_resistor",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,resistance:props.resistance,display_resistance:this._getSchematicSymbolDisplayValue(),are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceResistor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),resistor=new Resistor2({name:sourceElm.name,resistance:sourceElm.resistance,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:resistor});footprint&&resistor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(resistor):subcircuit.add(resistor)}function pcbTraceRouteToPcbPath(route){if(route.length<=2)return[];let firstPoint=route[0],lastPoint=route[route.length-1];return route.slice(1,-1).filter(point6=>{let position4=getRoutePointPosition(point6),firstPosition=getRoutePointPosition(firstPoint),lastPosition=getRoutePointPosition(lastPoint),isSameAsFirst=position4.x===firstPosition.x&&position4.y===firstPosition.y,isSameAsLast=position4.x===lastPosition.x&&position4.y===lastPosition.y;return!isSameAsFirst&&!isSameAsLast}).map(point6=>{if(point6.route_type==="via")return{x:point6.x,y:point6.y,via:!0,fromLayer:point6.from_layer,toLayer:point6.to_layer};let position4=getRoutePointPosition(point6);return{x:position4.x,y:position4.y}})}var getSelectorPath=(component,inflatorContext)=>{let{injectionDb,subcircuit,groupsMap}=inflatorContext,path_parts=[],currentGroupId=component.source_group_id;for(;currentGroupId&&currentGroupId!==subcircuit.source_group_id;){let sourceGroup=injectionDb.source_group.get(currentGroupId),groupInstance=groupsMap?.get(currentGroupId);if(!sourceGroup||!groupInstance)break;let groupName=groupInstance.props.name??groupInstance.fallbackUnassignedName;path_parts.unshift(`.${groupName}`),currentGroupId=sourceGroup.parent_source_group_id}return path_parts.push(`.${component.name}`),path_parts.join(" > ")};function inflateSourceTrace(sourceTrace,inflatorContext){let{injectionDb,subcircuit}=inflatorContext,connectedSelectors=[];for(let sourcePortId of sourceTrace.connected_source_port_ids){let sourcePort=injectionDb.source_port.get(sourcePortId);if(!sourcePort)continue;let selector;if(sourcePort.source_component_id){let sourceComponent=injectionDb.source_component.get(sourcePort.source_component_id);sourceComponent&&(selector=`${getSelectorPath({name:sourceComponent.name,source_group_id:sourceComponent.source_group_id},inflatorContext)} > .${sourcePort.name}`)}else selector=`.${sourcePort.name}`;selector&&connectedSelectors.push(selector)}for(let sourceNetId of sourceTrace.connected_source_net_ids){let sourceNet=injectionDb.source_net.get(sourceNetId);sourceNet&&connectedSelectors.push(`net.${sourceNet.name}`)}if(connectedSelectors.length<2)return;let pcbTraces=injectionDb.pcb_trace.list().filter(trace2=>trace2.source_trace_id===sourceTrace.source_trace_id),pcbTrace=pcbTraces[0],pcbPath2;pcbTrace&&(pcbPath2=pcbTraceRouteToPcbPath(pcbTrace.route));let traceWidth=sourceTrace.min_trace_thickness;if(!traceWidth&&pcbTrace?.route){let wirePoint=pcbTrace.route.find(pt3=>pt3.route_type==="wire");wirePoint&&wirePoint.route_type==="wire"&&(traceWidth=wirePoint.width)}let traceProps2={path:connectedSelectors};traceWidth!==void 0&&(traceProps2.thickness=traceWidth),pcbPath2&&pcbPath2.length>0?traceProps2.pcbPath=pcbPath2:!pcbTrace&&sourceTrace.connected_source_port_ids.length===2&&sourceTrace.connected_source_net_ids.length===0&&(traceProps2.pcbStraightLine=!0);let trace=new Trace3(traceProps2);trace._inflatedPcbTraces=pcbTraces.length>0?pcbTraces:void 0,trace._inflatedPcbVias=pcbTrace?injectionDb.pcb_via.list().filter(via=>pcbTraces.some(trace2=>via.pcb_trace_id===trace2.pcb_trace_id)):void 0,subcircuit.add(trace)}var Transistor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"emitter",this.portMap.pin1);__publicField(this,"collector",this.portMap.pin2);__publicField(this,"base",this.portMap.pin3)}get config(){let baseSymbolName=this.props.type==="npn"?"npn_bipolar_transistor":"pnp_bipolar_transistor";return{componentName:"Transistor",schematicSymbolName:this.props.symbolName??baseSymbolName,zodProps:transistorProps,sourceFtype:"simple_transistor",shouldRenderAsSchematicBox:!1}}initPorts(){let pinAliases={pin1:["collector","c"],pin2:["emitter","e"],pin3:["base","b"]};super.initPorts({pinCount:3,additionalAliases:pinAliases})}doInitialCreateNetsFromProps(){this._createNetsFromProps([...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({ftype:"simple_transistor",name:this.name,transistor_type:props.type,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceTransistor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),transistor=new Transistor({name:sourceElm.name,type:sourceElm.transistor_type,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:transistor});footprint&&transistor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(transistor):subcircuit.add(transistor)}function inflateStandalonePcbPrimitives(inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,standalonePrimitiveTypes=["pcb_silkscreen_rect","pcb_silkscreen_circle","pcb_silkscreen_line","pcb_silkscreen_path","pcb_silkscreen_text","pcb_fabrication_note_text","pcb_fabrication_note_path","pcb_fabrication_note_rect","pcb_note_text","pcb_note_rect","pcb_note_path","pcb_note_line","pcb_via"],standalonePrimitives=injectionDb.toArray().filter(elm=>{if(!standalonePrimitiveTypes.includes(elm.type))return!1;if(elm.type==="pcb_via"){if(!elm.pcb_trace_id)return!0;let pcbTrace=injectionDb.pcb_trace.get(elm.pcb_trace_id),sourceTraceId=pcbTrace?.source_trace_id;return!(sourceTraceId&&injectionDb.source_trace.get(sourceTraceId)&&pcbTrace?.route.some(point6=>point6.route_type==="via"&&Math.abs(point6.x-elm.x)<1e-4&&Math.abs(point6.y-elm.y)<1e-4))}return"pcb_component_id"in elm&&(elm.pcb_component_id===null||elm.pcb_component_id===void 0)});if(standalonePrimitives.length===0)return;let components=createComponentsFromCircuitJson({componentName:"",componentRotation:"0deg"},standalonePrimitives);for(let component of components)subcircuit.add(component)}var inflateCircuitJson=(target,circuitJson,children)=>{if(!circuitJson)return;let injectionDb=cju_default(circuitJson);if(circuitJson&&children?.length>0)throw new Error("Component cannot have both circuitJson and children");let inflationCtx={injectionDb,subcircuit:target,groupsMap:new Map},sourceGroups=injectionDb.source_group.list(),renderedGroupIds=new Set,groupsToRender=[...sourceGroups];for(;groupsToRender.length>0;){let groupIndex=groupsToRender.findIndex(g4=>!g4.parent_source_group_id||renderedGroupIds.has(g4.parent_source_group_id));if(groupIndex===-1){let remainingIds=groupsToRender.map(g4=>g4.source_group_id).join(", ");throw new Error(`Cannot inflate source_groups: cyclic dependency or missing parent detected. Remaining groups: ${remainingIds}`)}let groupToRender=groupsToRender[groupIndex];inflateSourceGroup(groupToRender,inflationCtx),renderedGroupIds.add(groupToRender.source_group_id),groupsToRender.splice(groupIndex,1)}let pcbBoards=injectionDb.pcb_board.list();for(let pcbBoard of pcbBoards)inflatePcbBoard(pcbBoard,inflationCtx);let sourceComponents=injectionDb.source_component.list();for(let sourceComponent of sourceComponents)switch(sourceComponent.ftype){case"simple_resistor":inflateSourceResistor(sourceComponent,inflationCtx);break;case"simple_capacitor":inflateSourceCapacitor(sourceComponent,inflationCtx);break;case"simple_inductor":inflateSourceInductor(sourceComponent,inflationCtx);break;case"simple_diode":inflateSourceDiode(sourceComponent,inflationCtx);break;case"simple_fiducial":inflateSourceFiducial(sourceComponent,inflationCtx);break;case"simple_led":inflateSourceLed(sourceComponent,inflationCtx);break;case"simple_chip":inflateSourceChip(sourceComponent,inflationCtx);break;case"simple_transistor":inflateSourceTransistor(sourceComponent,inflationCtx);break;case"simple_push_button":inflateSourcePushButton(sourceComponent,inflationCtx);break;default:throw new Error(`No inflator implemented for source component ftype: "${sourceComponent.ftype}"`)}let sourcePorts=injectionDb.source_port.list();for(let sourcePort of sourcePorts)inflateSourcePort(sourcePort,inflationCtx);let sourceTraces=injectionDb.source_trace.list();for(let sourceTrace of sourceTraces)inflateSourceTrace(sourceTrace,inflationCtx);inflateStandalonePcbPrimitives(inflationCtx)},isSelectionResultPort=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.getSourcePort=="function",isSelectionResultNet=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.getSourceNet=="function",isSelectionResultComponent=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.getPorts=="function",isCircuitJsonElement=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.type=="string",isNonEmptyString=value=>typeof value=="string"&&value.length>0,SelectionResultPortImpl=class{constructor(port){__publicField(this,"port");this.port=port}getPcbPort(){let pcbPortId=this.port.pcb_port_id;return pcbPortId?this.port.root?.db.pcb_port.get(pcbPortId)??null:null}getSourcePort(){let sourcePortId=this.port.source_port_id;return sourcePortId?this.port.root?.db.source_port.get(sourcePortId)??null:null}},SelectionResultNetImpl=class{constructor(net){__publicField(this,"net");this.net=net}getSourceNet(){let sourceNetId=this.net.source_net_id;return sourceNetId?this.net.root?.db.source_net.get(sourceNetId)??null:null}},SelectionResultComponentImpl=class{constructor(component){__publicField(this,"component");this.component=component}getPort(name){let port=this.component.selectOne(`port.${name}`,{type:"port"})??this.component.selectOne(`.${name}`,{type:"port"});return port?new SelectionResultPortImpl(port):null}getPorts(){return this.component.selectAll("port").map(port=>new SelectionResultPortImpl(port))}getPcbComponent(){let pcbComponentId=this.component.pcb_component_id;return pcbComponentId?this.component.root?.db.pcb_component.get(pcbComponentId)??null:null}getSourceComponent(){let sourceComponentId=this.component.source_component_id;return sourceComponentId?this.component.root?.db.source_component.get(sourceComponentId)??null:null}},DrcCheck=class extends PrimitiveComponent2{get config(){return{componentName:"DrcCheck",zodProps:drcCheckProps}}constructor(props){super(props)}async runCustomDrcCheck(circuitJson){let result=await this._parsedProps.checkFn(this.createCustomDrcCheckContext(circuitJson)),diagnostics=[];return Array.isArray(result)?diagnostics=result:result&&(diagnostics=[result]),diagnostics.map((diagnostic,index)=>this.createCircuitJsonDiagnostic(diagnostic,index)).filter(diagnostic=>!!diagnostic)}createCustomDrcCheckContext(circuitJson){return{select:this.selectCustomDrcElement.bind(this),selectAll:this.selectAllCustomDrcElements.bind(this),isConnected:(a3,b4)=>this.isConnected(a3,b4,circuitJson),isPulledUp:a3=>this.isConnected(a3,"net.VCC",circuitJson)||this.isConnected(a3,"net.VDD",circuitJson)||this.getResistanceBetween(a3,"net.VCC",circuitJson)!==null||this.getResistanceBetween(a3,"net.VDD",circuitJson)!==null,isPulledDown:a3=>this.isConnected(a3,"net.GND",circuitJson)||this.getResistanceBetween(a3,"net.GND",circuitJson)!==null,getResistanceBetween:(a3,b4)=>this.getResistanceBetween(a3,b4,circuitJson)}}selectCustomDrcElement(selector){return this.wrapSelectionResult(this.getSubcircuit().selectOne(selector))}selectAllCustomDrcElements(selector){let selectionResults=[];for(let component of this.getSubcircuit().selectAll(selector)){let selectionResult=this.wrapSelectionResult(component);selectionResult&&selectionResults.push(selectionResult)}return selectionResults}wrapSelectionResult(component){return component?component instanceof Port?new SelectionResultPortImpl(component):component instanceof Net?new SelectionResultNetImpl(component):new SelectionResultComponentImpl(component):null}createCircuitJsonDiagnostic(diagnostic,index){let diagnosticRecord=diagnostic,diagnosticType="source_component_misconfigured_error";typeof diagnosticRecord.error_type=="string"?diagnosticType=diagnosticRecord.error_type:typeof diagnosticRecord.warning_type=="string"&&(diagnosticType=diagnosticRecord.warning_type);let diagnosticWithCircuitJsonDefaults={...diagnostic};typeof diagnosticRecord.type=="string"?diagnosticWithCircuitJsonDefaults.type=diagnosticRecord.type:diagnosticWithCircuitJsonDefaults.type=diagnosticType,typeof diagnosticRecord.warning_type!="string"&&(typeof diagnosticRecord.error_type=="string"?diagnosticWithCircuitJsonDefaults.error_type=diagnosticRecord.error_type:diagnosticWithCircuitJsonDefaults.error_type=diagnosticType);let diagnosticIdField=`${diagnosticType}_id`;return diagnosticRecord[diagnosticIdField]?diagnosticWithCircuitJsonDefaults[diagnosticIdField]=diagnosticRecord[diagnosticIdField]:diagnosticWithCircuitJsonDefaults[diagnosticIdField]=`${diagnosticType}_${this._renderId}_${index}`,any_circuit_element.parse(diagnosticWithCircuitJsonDefaults)}isConnected(a3,b4,circuitJson){let aKeys=this.getConnectivityKeys(a3,circuitJson),bKeys=this.getConnectivityKeys(b4,circuitJson);return aKeys.some(key=>bKeys.includes(key))}getResistanceBetween(a3,b4,circuitJson){if(this.isConnected(a3,b4,circuitJson))return 0;let aKeys=this.getConnectivityKeys(a3,circuitJson),bKeys=this.getConnectivityKeys(b4,circuitJson);if(aKeys.length===0||bKeys.length===0)return null;let sourceResistors=circuitJson.filter(elm=>elm.type==="source_component"&&elm.ftype==="simple_resistor"),root=this.root;if(!root)return null;for(let resistor of sourceResistors){let resistorPorts=root.db.source_port.list({source_component_id:resistor.source_component_id});if(resistorPorts.length!==2)continue;let resistorKeys=resistorPorts.map(port=>port.subcircuit_connectivity_map_key),connectsA=resistorKeys.some(key=>key&&aKeys.includes(key)),connectsB=resistorKeys.some(key=>key&&bKeys.includes(key));if(connectsA&&connectsB)return resistor.resistance}return null}getConnectivityKeys(connectable,circuitJson){if(!connectable)return[];if(typeof connectable=="string"){let selected=this.selectCustomDrcElement(connectable);return selected?this.getConnectivityKeys(selected,circuitJson):[]}return isSelectionResultPort(connectable)?[connectable.getSourcePort()?.subcircuit_connectivity_map_key].filter(isNonEmptyString):isSelectionResultNet(connectable)?[connectable.getSourceNet()?.subcircuit_connectivity_map_key].filter(isNonEmptyString):isSelectionResultComponent(connectable)?connectable.getPorts().flatMap(port=>this.getConnectivityKeys(port,circuitJson)):isCircuitJsonElement(connectable)?this.getCircuitJsonElementConnectivityKeys(connectable,circuitJson):[]}getCircuitJsonElementConnectivityKeys(element,circuitJson){if(!element)return[];if(element.type==="source_port")return[element.subcircuit_connectivity_map_key].filter(isNonEmptyString);if(element.type==="source_net")return[element.subcircuit_connectivity_map_key].filter(isNonEmptyString);if(element.type==="pcb_port")return this.getConnectivityKeys(element.source_port_id,circuitJson);if(element.type==="source_component"){let root=this.root;return root?root.db.source_port.list({source_component_id:element.source_component_id}).map(port=>port.subcircuit_connectivity_map_key).filter(isNonEmptyString):[]}return[]}},package_default3={name:"@tscircuit/core",type:"module",version:"0.0.1381",types:"dist/index.d.ts",main:"dist/index.js",module:"dist/index.js",exports:{".":{import:"./dist/index.js",types:"./dist/index.d.ts"}},files:["dist"],repository:{type:"git",url:"https://github.com/tscircuit/core"},scripts:{build:"tsup-node",format:"biome format . --write","measure-bundle":"howfat -r table .","pkg-pr-new-release":"bunx pkg-pr-new publish --comment=off --peerDeps","smoke-test:dist":"bun run scripts/smoke-tests/test-dist-simple-circuit.tsx","build:benchmarking":"bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist","build:benchmarking:watch":`chokidar "./{benchmarking,lib}/**/*.{ts,tsx}" -c 'bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist'`,"start:benchmarking":'concurrently "bun run build:benchmarking:watch" "live-server ./benchmarking-dist"',"generate-test-plan":"bun run scripts/generate-test-plan.ts"},devDependencies:{"@biomejs/biome":"^1.8.3","@resvg/resvg-js":"^2.6.2","@tscircuit/alphabet":"0.0.25","@tscircuit/breakout-point-solver":"github:tscircuit/breakout-point-solver#bac9629","@tscircuit/capacity-autorouter":"^0.0.624","@tscircuit/checks":"0.0.140","@tscircuit/circuit-json-util":"^0.0.97","@tscircuit/common":"^0.0.20","@tscircuit/copper-pour-solver":"0.0.35","@tscircuit/footprinter":"^0.0.357","@tscircuit/image-utils":"^0.0.8","@tscircuit/infer-cable-insertion-point":"^0.0.2","@tscircuit/infgrid-ijump-astar":"^0.0.35","@tscircuit/jlcpcb-manufacturing-specs":"git+https://github.com/tscircuit/jlcpcb-manufacturing-specs#e08af159db01a37db007e33f0a7268d0e4a279a5","@tscircuit/krt-wasm":"^0.1.1","@tscircuit/log-soup":"^1.0.2","@tscircuit/matchpack":"^0.0.29","@tscircuit/math-utils":"^0.0.36","@tscircuit/miniflex":"^0.0.4","@tscircuit/ngspice-spice-engine":"^0.0.18","@tscircuit/props":"^0.0.565","@tscircuit/schematic-match-adapt":"^0.0.18","@tscircuit/schematic-trace-solver":"^0.0.75","@tscircuit/solver-utils":"^0.0.16","@tscircuit/soup-util":"^0.0.41","@types/bun":"^1.2.16","@types/debug":"^4.1.12","@types/react":"^19.1.8","@types/react-dom":"^19.1.6","@types/react-reconciler":"^0.28.9","bpc-graph":"^0.0.57","bun-match-svg":"0.0.12","calculate-elbow":"^0.0.12","chokidar-cli":"^3.0.0","circuit-json":"^0.0.443","circuit-json-to-bpc":"^0.0.13","circuit-json-to-connectivity-map":"^0.0.23","circuit-json-to-gltf":"^0.0.105","circuit-json-to-spice":"^0.0.40","circuit-to-svg":"^0.0.369",concurrently:"^9.1.2","connectivity-map":"^1.0.0",debug:"^4.3.6",flatbush:"^4.5.0","graphics-debug":"^0.0.95",howfat:"^0.3.8","kicad-to-circuit-json":"^0.0.97",kicadts:"^0.0.47","live-server":"^1.2.2","looks-same":"^9.0.1",minicssgrid:"^0.0.9","pkg-pr-new":"^0.0.37",poppygl:"^0.0.24",react:"^19.1.0","react-dom":"^19.1.0","schematic-symbols":"^0.0.226",spicets:"^0.0.2",spicey:"^0.0.14","stack-svgs":"^0.0.1","ts-expect":"^1.3.0",tsup:"^8.2.4"},peerDependencies:{"@tscircuit/capacity-autorouter":"*","@tscircuit/checks":"*","@tscircuit/circuit-json-util":"*","@tscircuit/footprinter":"*","@tscircuit/infgrid-ijump-astar":"*","@tscircuit/math-utils":"*","@tscircuit/props":"*","@tscircuit/schematic-match-adapt":"*","circuit-json-to-bpc":"*","bpc-graph":"*","@tscircuit/matchpack":"*","circuit-json":"*","circuit-json-to-connectivity-map":"*","schematic-symbols":"*",typescript:"^5.0.0"},dependencies:{"@flatten-js/core":"^1.6.2","@lume/kiwi":"^0.4.3","calculate-cell-boundaries":"^0.0.13","calculate-packing":"0.0.75","css-select":"5.1.0","format-si-unit":"^0.0.7",nanoid:"^5.0.7","performance-now":"^2.1.0","react-reconciler":"^0.32.0","svg-path-commander":"^2.1.11","transformation-matrix":"^2.16.1",zod:"^3.25.67"}},IsolatedCircuit=class{constructor({platform,projectUrl,cachedSubcircuits,pendingSubcircuitRenders}={}){__publicField(this,"firstChild",null);__publicField(this,"children");__publicField(this,"db");__publicField(this,"root",null);__publicField(this,"isRootCircuit",!1);__publicField(this,"cachedSubcircuits");__publicField(this,"pendingSubcircuitRenders");__publicField(this,"_schematicDisabledOverride");__publicField(this,"pcbDisabled",!1);__publicField(this,"pcbRoutingDisabled",!1);__publicField(this,"_featureMspSchematicTraceRouting",!0);__publicField(this,"name");__publicField(this,"platform");__publicField(this,"projectUrl");__publicField(this,"_hasRenderedAtleastOnce",!1);__publicField(this,"_asyncEffectIdsByPhase",new Map);__publicField(this,"_asyncEffectPhaseById",new Map);__publicField(this,"_hasUnrenderedUpdatesFromAsyncEffects",!1);__publicField(this,"_runningAsyncEffectsById",new Map);__publicField(this,"_eventListeners",{});this.children=[],this.db=su2([]),this.platform=platform,this.projectUrl=projectUrl,this.pcbDisabled=platform?.pcbDisabled??!1,this.pcbRoutingDisabled=platform?.routingDisabled??!1,this.cachedSubcircuits=cachedSubcircuits,this.pendingSubcircuitRenders=pendingSubcircuitRenders,this.root=this}get schematicDisabled(){return this._schematicDisabledOverride!==void 0?this._schematicDisabledOverride:this.platform?.schematicDisabled!==void 0?this.platform.schematicDisabled:this._getBoard()?._parsedProps?.schematicDisabled??!1}set schematicDisabled(value){this._schematicDisabledOverride=value}add(componentOrElm){let component;(0,import_react5.isValidElement)(componentOrElm)?component=createInstanceFromReactElement(componentOrElm):component=componentOrElm,this.children.push(component)}setPlatform(platform){this.platform={...this.platform,...platform},platform.pcbDisabled!==void 0&&(this.pcbDisabled=platform.pcbDisabled),platform.routingDisabled!==void 0&&(this.pcbRoutingDisabled=platform.routingDisabled)}_getBoard(){let directBoard=this.children.find(c6=>c6.componentName==="Board");if(directBoard)return directBoard}_guessRootComponent(){if(this.firstChild)return;if(this.children.length===0)throw new Error("Not able to guess root component: IsolatedCircuit has no children (use circuit.add(...))");let panels=this.children.filter(child=>child.lowercaseComponentName==="panel");if(panels.length>1)throw new Error("Only one <panel> is allowed per circuit");if(panels.length===1){if(this.children.length!==1)throw new Error("<panel> must be the root element of the circuit");this.firstChild=panels[0];return}if(this.children.length===1&&this.children[0].isGroup){this.firstChild=this.children[0];return}let group=new Group5({subcircuit:!0});group.parent=this,group.addAll(this.children),this.children=[group],this.firstChild=group}render(){this.firstChild||this._guessRootComponent();let{firstChild,db:db3}=this;if(!firstChild)throw new Error("IsolatedCircuit has no root component");firstChild.parent=this,firstChild.runRenderCycle(),this._hasUnrenderedUpdatesFromAsyncEffects=!1,this._hasRenderedAtleastOnce=!0}async renderUntilSettled(){for(this.db.source_project_metadata.list()?.[0]||this.db.source_project_metadata.insert({software_used_string:`@tscircuit/core@${this.getCoreVersion()}`,...this.projectUrl?{project_url:this.projectUrl}:{}}),this.render();!this.isDoneRendering();)await new Promise(resolve=>setTimeout(resolve,100)),this.render();this.emit("renderComplete")}isDoneRendering(){return this._hasRenderedAtleastOnce&&!this._hasIncompleteAsyncEffects()}_hasIncompleteAsyncEffects(){return this._asyncEffectPhaseById.size>0||this._hasUnrenderedUpdatesFromAsyncEffects?!0:this.children.some(child=>child._hasIncompleteAsyncEffects())}_hasIncompleteAsyncEffectsForPhase(phase){return(this._asyncEffectIdsByPhase.get(phase)?.size??0)>0}getRunningAsyncEffects(){return Array.from(this._runningAsyncEffectsById.values())}getCircuitJson(){return this._hasRenderedAtleastOnce||this.render(),this.db.toArray()}toJson(){return this.getCircuitJson()}async getSvg(options){let circuitToSvg=await Promise.resolve().then(()=>(init_dist9(),dist_exports3)).catch(e7=>{throw new Error(`To use circuit.getSvg, you must install the "circuit-to-svg" package.
743
+ ${spiceString}`)}catch(error2){debug11(`Failed to convert circuit JSON to SPICE: ${error2}`);return}let graphNameToProbe=new Map;for(let probe of voltageProbes)probe.finalProbeName&&graphNameToProbe.set(probe.finalProbeName,probe);let voltageProbesById=new Map,graphDisplayOverridesByProbeId=new Map;for(let probe of voltageProbes)probe.simulation_voltage_probe_id&&(voltageProbesById.set(probe.simulation_voltage_probe_id,probe),graphDisplayOverridesByProbeId.set(probe.simulation_voltage_probe_id,getVoltageProbeGraphDisplayOverrides(probe)));for(let ammeter of ammeters)ammeter.simulation_current_probe_id&&graphDisplayOverridesByProbeId.set(ammeter.simulation_current_probe_id,getAmmeterGraphDisplayOverrides(ammeter));let currentProbesById=new Map,currentProbesByName=new Map;for(let probe of root.db.simulation_current_probe.list())currentProbesById.set(probe.simulation_current_probe_id,probe),probe.name!==void 0&&currentProbesByName.set(probe.name,probe);let orderedSimulationProbes=root.db.simulation_voltage_probe.list().filter(probe=>voltageProbesById.has(probe.simulation_voltage_probe_id)),graphNamesFromNetlist=getTransientVoltageGraphNamesFromSpiceNetlist(spiceNetlist);if(graphNamesFromNetlist.length===orderedSimulationProbes.length)for(let[index,simulationProbe]of orderedSimulationProbes.entries()){let probe=voltageProbesById.get(simulationProbe.simulation_voltage_probe_id),graphName=graphNamesFromNetlist[index];probe&&graphName&&graphNameToProbe.set(graphName,probe)}else debug11(`Skipping probe-to-graph order mapping because counts differ: probes=${orderedSimulationProbes.length} graphNames=${graphNamesFromNetlist.length}`);for(let analogSim of analogSims){let engineName=analogSim._parsedProps.spiceEngine??"spicey",spiceEngine2=spiceEngineMap[engineName];if(!spiceEngine2)throw new Error(`SPICE engine "${engineName}" not found in platform config. Available engines: ${JSON.stringify(Object.keys(spiceEngineMap).filter(k5=>k5!=="spicey"))}`);let effectId=`spice-simulation-${engineName}-${analogSim.source_component_id}`;debug11(`Queueing simulation for spice engine: ${engineName} (id: ${effectId})`),group._queueAsyncEffect(effectId,async()=>{try{debug11(`Running simulation with engine: ${engineName}`);let result=await spiceEngine2.simulate(spiceString);debug11(`Simulation completed, received ${result.simulationResultCircuitJson.length} elements`);let simulationExperiment=root.db.simulation_experiment.list()[0];if(!simulationExperiment){debug11("No simulation experiment found, skipping result insertion");return}let insertedVoltageGraphs=[],insertedCurrentGraphs=[];for(let rawElement of result.simulationResultCircuitJson){if(!isCircuitElementInput(rawElement)){debug11("Skipping invalid simulation result element");continue}let element=rawElement;if(isVoltageGraph(element)){element.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=element.name?graphNameToProbe.get(element.name):void 0;probeMatch&&(element.color=probeMatch.color??void 0,element.source_probe_id=probeMatch.simulation_voltage_probe_id??void 0)}if(isCurrentGraph2(element)){element.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=(element.source_probe_id?currentProbesById.get(element.source_probe_id):void 0)??(element.name?currentProbesByName.get(element.name):void 0);probeMatch&&(element.color=probeMatch.color,element.source_probe_id=probeMatch.simulation_current_probe_id)}let insertedElement=root.db.insert(element);isVoltageGraph(insertedElement)&&insertedVoltageGraphs.push({type:"voltage",graph:insertedElement}),isCurrentGraph2(insertedElement)&&insertedCurrentGraphs.push({type:"current",graph:insertedElement}),debug11(`Inserted ${element.type} into database`)}analogSim._parsedProps.graphIndependentAxes&&insertIndependentAxisScopeTraces({db:root.db,graphs:[...insertedVoltageGraphs,...insertedCurrentGraphs],graphDisplayOverridesByProbeId}),group._markDirty("SimulationSpiceEngineRender")}catch(error2){debug11(`Simulation failed for engine ${engineName}: ${error2}`);let simulationExperiment=root.db.simulation_experiment.list()[0];root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperiment?.simulation_experiment_id,error_type:"simulation_unknown_experiment_error",message:error2 instanceof Error?error2.message:String(error2)})}})}}function Group_doInitialSourceAddConnectivityMapKey(group){if(!group.isSubcircuit)return;let{db:db3}=group.root,traces=group.selectAll("trace"),vias=group.selectAll("via"),nets=group.selectAll("net"),connMap=new ConnectivityMap({});connMap.addConnections(traces.map(t54=>{let source_trace3=db3.source_trace.get(t54.source_trace_id);return source_trace3?[source_trace3.source_trace_id,...source_trace3.connected_source_port_ids,...source_trace3.connected_source_net_ids]:null}).filter(c6=>c6!==null));let sourceNets=db3.source_net.list().filter(net=>net.subcircuit_id===group.subcircuit_id);for(let sourceNet of sourceNets)connMap.addConnections([[sourceNet.source_net_id]]);let{name:subcircuitName}=group._parsedProps;for(let trace of traces){if(!trace.source_trace_id)continue;let connNetId=connMap.getNetConnectedToId(trace.source_trace_id);connNetId&&(trace.subcircuit_connectivity_map_key=`${subcircuitName??`unnamedsubcircuit${group.subcircuit_id??group.source_group_id??group._renderId}`}_${connNetId}`,db3.source_trace.update(trace.source_trace_id,{subcircuit_connectivity_map_key:trace.subcircuit_connectivity_map_key}))}let allSourcePortIds=new Set;for(let trace of traces){if(!trace.source_trace_id)continue;let source_trace3=db3.source_trace.get(trace.source_trace_id);if(source_trace3)for(let id3 of source_trace3.connected_source_port_ids)allSourcePortIds.add(id3)}for(let portId of allSourcePortIds){let connNetId=connMap.getNetConnectedToId(portId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group.subcircuit_id??group.source_group_id??group._renderId}`}_${connNetId}`;db3.source_port.update(portId,{subcircuit_connectivity_map_key:connectivityMapKey})}let allSourceNetIds=new Set;for(let trace of traces){if(!trace.source_trace_id)continue;let source_trace3=db3.source_trace.get(trace.source_trace_id);if(source_trace3)for(let source_net_id of source_trace3.connected_source_net_ids)allSourceNetIds.add(source_net_id)}for(let sourceNet of sourceNets)allSourceNetIds.add(sourceNet.source_net_id);for(let netId of allSourceNetIds){let connNetId=connMap.getNetConnectedToId(netId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group.subcircuit_id??group.source_group_id??group._renderId}`}_${connNetId}`;db3.source_net.update(netId,{subcircuit_connectivity_map_key:connectivityMapKey});let netInstance=nets.find(n3=>n3.source_net_id===netId);netInstance&&(netInstance.subcircuit_connectivity_map_key=connectivityMapKey)}for(let via of vias){let connectedNetOrTrace=via._getConnectedNetOrTrace();connectedNetOrTrace&&connectedNetOrTrace.subcircuit_connectivity_map_key&&(via.subcircuit_connectivity_map_key=connectedNetOrTrace.subcircuit_connectivity_map_key)}}function getPhaseSortValue(routingPhaseIndex){return routingPhaseIndex===null?Number.POSITIVE_INFINITY:routingPhaseIndex}function compareRoutingPhasePlans(a3,b4){return getPhaseSortValue(a3.routingPhaseIndex)-getPhaseSortValue(b4.routingPhaseIndex)}function getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex){let plan=plansByPhaseIndex.get(routingPhaseIndex);return plan||(plan={routingPhaseIndex,nets:[],traces:[]},plansByPhaseIndex.set(routingPhaseIndex,plan)),plan}function getNetRoutingPhaseIndex(net){return net.props.routingPhaseIndex??null}function getTraceRoutingPhaseIndex(trace){let traceRoutingPhaseIndex=trace.props.routingPhaseIndex;if(traceRoutingPhaseIndex!==void 0)return traceRoutingPhaseIndex;let routingPhaseIndex=null,connectedNets=trace._findConnectedNets().nets;for(let net of connectedNets){let netRoutingPhaseIndex=getNetRoutingPhaseIndex(net);typeof netRoutingPhaseIndex=="number"&&(routingPhaseIndex===null||netRoutingPhaseIndex<routingPhaseIndex)&&(routingPhaseIndex=netRoutingPhaseIndex)}return routingPhaseIndex}function convertPortSelectorToEndpointKey(selector){return selector.trim().replace(/\s*>\s*/g,".").replace(/\s+/g,".").replace(/^\./,"").replace(/\.\./g,".")}function getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps){return[...phaseProps.connection?[phaseProps.connection]:[],...phaseProps.connections??[]]}function traceHasEndpointMatchingConnectionSelector(trace,connectionSelectorEndpointKey){return trace.getTracePortPathSelectors().some(selector=>convertPortSelectorToEndpointKey(selector)===connectionSelectorEndpointKey)}function getAutoroutersByPhaseIndex(group){let autoroutingPhases=group.selectAll("autoroutingphase"),autoroutersByPhaseIndex=new Map;for(let autoroutingPhase of autoroutingPhases){let{phaseIndex,autorouter}=autoroutingPhase._parsedProps;autorouter!==void 0&&autoroutersByPhaseIndex.set(phaseIndex??null,autorouter)}return autoroutersByPhaseIndex}function getAutoroutingPhasePropsByPhaseIndex(group){let autoroutingPhases=group.selectAll("autoroutingphase"),propsByPhaseIndex=new Map;for(let autoroutingPhase of autoroutingPhases){let props=autoroutingPhase._parsedProps;propsByPhaseIndex.set(props.phaseIndex??null,props)}return propsByPhaseIndex}function toParsedDistance(value){if(value!==void 0)return Number(value)}function getDrcTolerancesFromAutoroutingPhaseProps(phaseProps){let{minTraceWidth,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minTraceToPadEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleDiameter,minViaPadDiameter}=phaseProps;if(!(minTraceWidth===void 0&&minViaHoleEdgeToViaHoleEdgeClearance===void 0&&minPlatedHoleDrillEdgeToDrillEdgeClearance===void 0&&minTraceToPadEdgeClearance===void 0&&minPadEdgeToPadEdgeClearance===void 0&&minBoardEdgeClearance===void 0&&minViaEdgeToPadEdgeClearance===void 0&&minViaHoleDiameter===void 0&&minViaPadDiameter===void 0))return{minTraceWidth:toParsedDistance(minTraceWidth),minViaHoleEdgeToViaHoleEdgeClearance:toParsedDistance(minViaHoleEdgeToViaHoleEdgeClearance),minPlatedHoleDrillEdgeToDrillEdgeClearance:toParsedDistance(minPlatedHoleDrillEdgeToDrillEdgeClearance),minTraceToPadEdgeClearance:toParsedDistance(minTraceToPadEdgeClearance),minPadEdgeToPadEdgeClearance:toParsedDistance(minPadEdgeToPadEdgeClearance),minBoardEdgeClearance:toParsedDistance(minBoardEdgeClearance),minViaEdgeToPadEdgeClearance:toParsedDistance(minViaEdgeToPadEdgeClearance),minViaHoleDiameter:toParsedDistance(minViaHoleDiameter),minViaPadDiameter:toParsedDistance(minViaPadDiameter)}}function Group_getRoutingPhasePlans(group){let traces=group.selectAll("trace"),nets=group.selectAll("net"),plansByPhaseIndex=new Map,autoroutersByPhaseIndex=getAutoroutersByPhaseIndex(group),phasePropsByPhaseIndex=getAutoroutingPhasePropsByPhaseIndex(group),hasDirectRoutingTargets=traces.length>0||nets.length>0,hasReroutePhase=Array.from(phasePropsByPhaseIndex.values()).some(phaseProps=>phaseProps.reroute),hasConnectionTargetedPhase=Array.from(phasePropsByPhaseIndex.values()).some(phaseProps=>getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps).length>0);if(!hasDirectRoutingTargets&&!hasReroutePhase&&!hasConnectionTargetedPhase)return[];for(let net of nets){let routingPhaseIndex=getNetRoutingPhaseIndex(net);getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex).nets.push(net)}for(let trace of traces){let routingPhaseIndex=getTraceRoutingPhaseIndex(trace);getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex).traces.push(trace)}for(let[phaseIndex,phaseProps]of phasePropsByPhaseIndex){let connectionSelectors=getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps);if(connectionSelectors.length>0){let plan=getOrCreateRoutingPhasePlan(plansByPhaseIndex,phaseIndex),connectionSelectorEndpointKeys=connectionSelectors.map(convertPortSelectorToEndpointKey);plan.connectionSelectors=connectionSelectors;for(let trace of traces)if(connectionSelectorEndpointKeys.some(endpointKey=>traceHasEndpointMatchingConnectionSelector(trace,endpointKey))){if(!phaseProps.reroute)for(let existingPlan of plansByPhaseIndex.values())existingPlan!==plan&&(existingPlan.traces=existingPlan.traces.filter(existingTrace=>existingTrace!==trace));if(plan.traces.includes(trace))continue;plan.traces.push(trace)}}phaseProps.reroute&&getOrCreateRoutingPhasePlan(plansByPhaseIndex,phaseIndex)}let plans=Array.from(plansByPhaseIndex.values()).sort(compareRoutingPhasePlans);for(let plan of plans){plan.autorouter=autoroutersByPhaseIndex.get(plan.routingPhaseIndex);let phaseProps=phasePropsByPhaseIndex.get(plan.routingPhaseIndex);plan.reroute=phaseProps?.reroute,plan.region=phaseProps?.region,plan.connectionSelectors=phaseProps?getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps):void 0,plan.drcTolerances=phaseProps?getDrcTolerancesFromAutoroutingPhaseProps(phaseProps):void 0}let defaultPhaseProps=phasePropsByPhaseIndex.get(null);if(hasDirectRoutingTargets&&phasePropsByPhaseIndex.size===1&&defaultPhaseProps?.reroute&&plans.length===1&&plans[0]?.routingPhaseIndex===null){let reroutePlan=plans[0];return[{routingPhaseIndex:null,nets:[...reroutePlan.nets],traces:[...reroutePlan.traces]},reroutePlan]}return plans}function isWirePoint(point6){return point6.route_type==="wire"}function isViaPoint(point6){return point6.route_type==="via"}function isJumperPoint(point6){return point6.route_type==="jumper"}function getTraceConnectionName(trace){return trace.connection_name??trace.pcb_trace_id}function getWireWidth(start,end){return isWirePoint(start)?start.width:isWirePoint(end)?end.width:.1}function getSegmentLayer(start,end){return isWirePoint(start)?start.layer:isWirePoint(end)?end.layer:isJumperPoint(start)?start.layer:isJumperPoint(end)?end.layer:null}function getRoutePointX(point6){return isJumperPoint(point6)||point6.route_type==="through_obstacle"?null:point6.x}function getRoutePointY(point6){return isJumperPoint(point6)||point6.route_type==="through_obstacle"?null:point6.y}function createWireObstacle(start,end,connectedTo,obstacleIndex){let startX=getRoutePointX(start),startY=getRoutePointY(start),endX=getRoutePointX(end),endY=getRoutePointY(end),layer=getSegmentLayer(start,end);if(startX===null||startY===null||endX===null||endY===null||!layer)return null;let width=getWireWidth(start,end),dx3=Math.abs(startX-endX),dy3=Math.abs(startY-endY);return{obstacleId:`${connectedTo}_phase_obstacle_${obstacleIndex}`,type:"rect",layers:[layer],center:{x:(startX+endX)/2,y:(startY+endY)/2},width:dx3+width,height:dy3+width,connectedTo:[connectedTo]}}function createJumperObstacle(point6,connectedTo,obstacleIndex){let dx3=Math.abs(point6.start.x-point6.end.x),dy3=Math.abs(point6.start.y-point6.end.y),width=.6;return{obstacleId:`${connectedTo}_phase_jumper_obstacle_${obstacleIndex}`,type:"rect",layers:[point6.layer],center:{x:(point6.start.x+point6.end.x)/2,y:(point6.start.y+point6.end.y)/2},width:dx3+width,height:dy3+width,connectedTo:[connectedTo]}}function createViaObstacle(point6,connectedTo,obstacleIndex){return{obstacleId:`${connectedTo}_phase_via_obstacle_${obstacleIndex}`,type:"rect",layers:[point6.from_layer,point6.to_layer],center:{x:point6.x,y:point6.y},width:.6,height:.6,connectedTo:[connectedTo]}}function addTraceObstacles(obstacles,trace){let connectedTo=getTraceConnectionName(trace);for(let routeIndex=0;routeIndex<trace.route.length;routeIndex++){let routePoint=trace.route[routeIndex];if(isViaPoint(routePoint)?obstacles.push(createViaObstacle(routePoint,connectedTo,routeIndex)):isJumperPoint(routePoint)&&obstacles.push(createJumperObstacle(routePoint,connectedTo,routeIndex)),routeIndex===trace.route.length-1)continue;let nextPoint=trace.route[routeIndex+1],obstacle=createWireObstacle(routePoint,nextPoint,connectedTo,routeIndex);obstacle&&obstacles.push(obstacle)}}function connectionIsInRoutingPhase(connection,phasePlan){for(let trace of phasePlan.traces)if(trace.source_trace_id&&(connection.source_trace_id===trace.source_trace_id||connection.name===trace.source_trace_id||connection.rootConnectionName===trace.source_trace_id||connection.mergedConnectionNames?.includes(trace.source_trace_id)))return!0;for(let net of phasePlan.nets)if(net.source_net_id&&connection.name===net.source_net_id)return!0;return!1}function Group_hasPhasedAutorouting(routingPhasePlans){for(let plan of routingPhasePlans)if(plan.routingPhaseIndex!==null)return!0;return!1}function Group_filterSimpleRouteJsonForPhase(simpleRouteJson,phasePlan){let connections=[];for(let connection of simpleRouteJson.connections)connectionIsInRoutingPhase(connection,phasePlan)&&connections.push(connection);return{...simpleRouteJson,connections}}function hasDrcTolerances(drcTolerances){return drcTolerances?Object.values(drcTolerances).some(value=>value!==void 0):!1}function applyMinTraceWidthToConnections(connections,minTraceWidth){return minTraceWidth===void 0?connections:connections.map(connection=>({...connection,nominalTraceWidth:Math.max(connection.nominalTraceWidth??minTraceWidth,minTraceWidth),width:Math.max(connection.width??minTraceWidth,minTraceWidth)}))}function Group_applyDrcTolerancesToSimpleRouteJson(simpleRouteJson,drcTolerances){if(!hasDrcTolerances(drcTolerances))return simpleRouteJson;let minTraceWidth=drcTolerances.minTraceWidth??simpleRouteJson.minTraceWidth,minViaHoleDiameter=drcTolerances.minViaHoleDiameter??simpleRouteJson.minViaHoleDiameter,minViaPadDiameter=drcTolerances.minViaPadDiameter??simpleRouteJson.minViaPadDiameter,minTraceToPadEdgeClearance=drcTolerances.minTraceToPadEdgeClearance??simpleRouteJson.minTraceToPadEdgeClearance,minViaEdgeToPadEdgeClearance=drcTolerances.minViaEdgeToPadEdgeClearance??simpleRouteJson.minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance=drcTolerances.minViaHoleEdgeToViaHoleEdgeClearance??simpleRouteJson.minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance=drcTolerances.minPlatedHoleDrillEdgeToDrillEdgeClearance??simpleRouteJson.minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance=drcTolerances.minPadEdgeToPadEdgeClearance??simpleRouteJson.minPadEdgeToPadEdgeClearance,minBoardEdgeClearance=drcTolerances.minBoardEdgeClearance??simpleRouteJson.minBoardEdgeClearance;return{...simpleRouteJson,connections:applyMinTraceWidthToConnections(simpleRouteJson.connections,drcTolerances.minTraceWidth),minTraceWidth,minViaDiameter:minViaPadDiameter,minViaHoleDiameter,minViaPadDiameter,min_via_hole_diameter:minViaHoleDiameter,min_via_pad_diameter:minViaPadDiameter,minTraceToPadEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance}}function Group_getObstaclesFromRoutedTraces(traces){let obstacles=[];for(let trace of traces)addTraceObstacles(obstacles,trace);return obstacles}function getJumperPadInfos(db3){let padInfos=[],jumperSmtpads=db3.pcb_smtpad.list().filter(pad2=>{let component=db3.pcb_component.get(pad2.pcb_component_id);return component?db3.source_component.get(component.source_component_id)?.name?.startsWith("__autoplaced_jumper"):!1});for(let smtpad2 of jumperSmtpads)if(smtpad2.shape!=="polygon"&&smtpad2.pcb_port_id){if(smtpad2.shape==="rect"||smtpad2.shape==="rotated_rect"){let halfWidth=smtpad2.width/2,halfHeight=smtpad2.height/2;padInfos.push({pcb_port_id:smtpad2.pcb_port_id,x:smtpad2.x,y:smtpad2.y,minX:smtpad2.x-halfWidth,maxX:smtpad2.x+halfWidth,minY:smtpad2.y-halfHeight,maxY:smtpad2.y+halfHeight})}else if(smtpad2.shape==="circle"){let radius=smtpad2.radius;padInfos.push({pcb_port_id:smtpad2.pcb_port_id,x:smtpad2.x,y:smtpad2.y,minX:smtpad2.x-radius,maxX:smtpad2.x+radius,minY:smtpad2.y-radius,maxY:smtpad2.y+radius})}}return padInfos}function findJumperPortAtPosition(padInfos,x4,y3,tolerance=.01){for(let pad2 of padInfos)if(Math.abs(pad2.x-x4)<tolerance&&Math.abs(pad2.y-y3)<tolerance)return pad2.pcb_port_id}function findJumperPortContainingPoint(padInfos,x4,y3){for(let pad2 of padInfos)if(x4>=pad2.minX&&x4<=pad2.maxX&&y3>=pad2.minY&&y3<=pad2.maxY)return pad2}function splitRouteAtJumperPads(route,padInfos){if(route.length===0||padInfos.length===0)return[route];let segments=[],currentSegment=[];for(let i3=0;i3<route.length;i3++){let point6=route[i3];if(currentSegment.push(point6),point6.route_type==="wire"&&i3>0&&i3<route.length-1){let padInfo=findJumperPortContainingPoint(padInfos,point6.x,point6.y);if(padInfo){point6.end_pcb_port_id||(point6.end_pcb_port_id=padInfo.pcb_port_id),segments.push(currentSegment);let newStartPoint={...point6};delete newStartPoint.end_pcb_port_id,newStartPoint.start_pcb_port_id||(newStartPoint.start_pcb_port_id=padInfo.pcb_port_id),currentSegment=[newStartPoint]}}}return currentSegment.length>0&&segments.push(currentSegment),segments}function addPortIdsToTracesAtJumperPads(segments,db3){let padInfos=getJumperPadInfos(db3);if(padInfos.length===0)return segments;let result=[];for(let segment2 of segments){let subSegments=splitRouteAtJumperPads(segment2,padInfos);for(let subSegment of subSegments)if(subSegment.length>0){let firstPoint=subSegment[0],lastPoint=subSegment[subSegment.length-1];if(firstPoint.route_type==="wire"&&!firstPoint.start_pcb_port_id){let portId=findJumperPortAtPosition(padInfos,firstPoint.x,firstPoint.y);portId&&(firstPoint.start_pcb_port_id=portId)}if(lastPoint.route_type==="wire"&&!lastPoint.end_pcb_port_id){let portId=findJumperPortAtPosition(padInfos,lastPoint.x,lastPoint.y);portId&&(lastPoint.end_pcb_port_id=portId)}result.push(subSegment)}}return result}var POINT_EPSILON=1e-6;function isPointOnWireSegment({point:point6,segmentStart,segmentEnd}){return point6.layer&&(segmentStart.layer!==point6.layer||segmentEnd.layer!==point6.layer)?!1:pointToSegmentDistance(point6,segmentStart,segmentEnd)<=POINT_EPSILON}function isPointInSmtPad({point:point6,pad:pad2,traceWidth=0}){return pad2.shape==="rect"||pad2.shape==="rotated_rect"?Math.abs(point6.x-pad2.x)<=pad2.width/2+traceWidth/2&&Math.abs(point6.y-pad2.y)<=pad2.height/2+traceWidth/2:pad2.shape==="circle"?distance2(point6,pad2)<=pad2.radius+traceWidth/2:!1}function isPointInPlatedHole({point:point6,hole,traceWidth=0}){return distance2(point6,hole)<=(hole.outer_diameter??hole.hole_diameter??0)/2+traceWidth/2}function getEndpointSourcePortIdsFromGeometry(db3,trace){let sourcePortIds=new Set,route=trace.route,endpoints=[route[0],route[route.length-1]].filter(point6=>!!point6&&point6.route_type==="wire"&&point6.x!==void 0&&point6.y!==void 0);for(let endpoint of endpoints){for(let pcbPort of db3.pcb_port.list())pcbPort.source_port_id&&distance2(endpoint,pcbPort)<=.01&&sourcePortIds.add(pcbPort.source_port_id);for(let smtpad2 of db3.pcb_smtpad.list()){if(!smtpad2.pcb_port_id||!isPointInSmtPad({point:endpoint,pad:smtpad2,traceWidth:endpoint.width}))continue;let sourcePortId=db3.pcb_port.get(smtpad2.pcb_port_id)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}for(let hole of db3.pcb_plated_hole.list()){if(!hole.pcb_port_id||!isPointInPlatedHole({point:endpoint,hole,traceWidth:endpoint.width}))continue;let sourcePortId=db3.pcb_port.get(hole.pcb_port_id)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}}return[...sourcePortIds]}function getWireRouteEndpoints(trace){let route=trace.route.filter(point6=>point6.route_type==="wire"&&point6.x!==void 0&&point6.y!==void 0);return[route[0],route[route.length-1]].filter(point6=>!!point6)}function getSourceIdsFromConnectedPcbTraces(db3,trace){let sourceIds=new Set,endpoints=getWireRouteEndpoints(trace);if(endpoints.length===0)return[];for(let existingTrace of db3.pcb_trace.list()){if(!existingTrace.source_trace_id||existingTrace.pcb_trace_id===trace.pcb_trace_id||!db3.source_trace.get(existingTrace.source_trace_id)&&!db3.source_net.get(existingTrace.source_trace_id))continue;let existingRoute=existingTrace.route.filter(point6=>point6.route_type==="wire");for(let i3=0;i3<existingRoute.length-1;i3++){let segmentStart=existingRoute[i3],segmentEnd=existingRoute[i3+1];if(!(!segmentStart||!segmentEnd))for(let endpoint of endpoints)isPointOnWireSegment({point:endpoint,segmentStart,segmentEnd})&&sourceIds.add(existingTrace.source_trace_id)}}return[...sourceIds]}function getSourcePortIdsFromRoutedTrace(db3,trace){let sourcePortIds=new Set;for(let point6 of trace.route)for(let pcbPortId of[point6.start_pcb_port_id,point6.end_pcb_port_id]){if(!pcbPortId)continue;let sourcePortId=db3.pcb_port.get(pcbPortId)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}return sourcePortIds.size>0?[...sourcePortIds]:getEndpointSourcePortIdsFromGeometry(db3,trace)}function buildSourceConnectivityMap(sourceTraces){let connMap=new ConnectivityMap({});return connMap.addConnections(sourceTraces.map(trace=>[trace.source_trace_id,...trace.connected_source_port_ids,...trace.connected_source_net_ids])),connMap}function getSourceTraceIdForRoutedTrace({db:db3,trace,subcircuit_id}){if(trace.source_trace_id&&(db3.source_trace.get(trace.source_trace_id)??db3.source_net.get(trace.source_trace_id)))return trace.source_trace_id;let sourcePortIds=getSourcePortIdsFromRoutedTrace(db3,trace);if(sourcePortIds.length===0)return getSourceIdsFromConnectedPcbTraces(db3,trace)[0];let sourceTraces=db3.source_trace.list(),connMap=buildSourceConnectivityMap(sourceTraces),endpointNetIds=sourcePortIds.map(sourcePortId=>connMap.getNetConnectedToId(sourcePortId)).filter(netId=>!!netId),exactSourceTrace=sourcePortIds.length>=2?sourceTraces.find(sourceTrace=>sourcePortIds.every(sourcePortId=>sourceTrace.connected_source_port_ids.includes(sourcePortId))):void 0;if(exactSourceTrace)return exactSourceTrace.source_trace_id;let sourceTracesInEndpointNets=sourceTraces.filter(sourceTrace=>{let sourceTraceNetId=connMap.getNetConnectedToId(sourceTrace.source_trace_id);return endpointNetIds.some(netId=>netId===sourceTraceNetId)}),connectedToEndpoint=sourceTracesInEndpointNets.filter(sourceTrace=>sourceTrace.connected_source_port_ids.some(sourcePortId=>sourcePortIds.includes(sourcePortId))),candidates=connectedToEndpoint.length>0?connectedToEndpoint:sourceTracesInEndpointNets;if(candidates.length!==0)return(candidates.find(sourceTrace=>sourceTrace.subcircuit_id===subcircuit_id)??candidates[0])?.source_trace_id}function groupPadsByInternalConnection(pads,orientation4){let groups=[];for(let pad2 of pads){let key=orientation4==="vertical"?pad2.center.y:pad2.center.x,foundGroup=!1;for(let group of groups){let groupKey=orientation4==="vertical"?group[0].center.y:group[0].center.x;if(Math.abs(key-groupKey)<.01){group.push(pad2),foundGroup=!0;break}}foundGroup||groups.push([pad2])}return groups.filter(g4=>g4.length>=2)}function insertAutoplacedJumpers(params){let{db:db3,output_jumpers,subcircuit_id}=params;for(let jumperIndex=0;jumperIndex<output_jumpers.length;jumperIndex++){let jumper=output_jumpers[jumperIndex],sourceComponent=db3.source_component.insert({ftype:"simple_chip",name:`__autoplaced_jumper_${jumperIndex}`,supplier_part_numbers:{}}),rotation42=jumper.orientation==="horizontal"?0:90,firstPadLayer=jumper.pads[0]?.layer||jumper.pads[0]?.layers?.[0]||"top",pcbComponent=db3.pcb_component.insert({source_component_id:sourceComponent.source_component_id,center:jumper.center,rotation:rotation42,layer:firstPadLayer,width:jumper.width||0,height:jumper.height||0,obstructs_within_bounds:!1}),padData=[];for(let padIndex=0;padIndex<jumper.pads.length;padIndex++){let pad2=jumper.pads[padIndex],pinNumber=padIndex+1,sourcePort=db3.source_port.insert({source_component_id:sourceComponent.source_component_id,name:`pin${pinNumber}`,pin_number:pinNumber}),padLayer=pad2.layer||pad2.layers?.[0]||"top",pcbPort=db3.pcb_port.insert({pcb_component_id:pcbComponent.pcb_component_id,source_port_id:sourcePort.source_port_id,x:pad2.center.x,y:pad2.center.y,layers:[padLayer]}),pcbSmtpad=db3.pcb_smtpad.insert({pcb_component_id:pcbComponent.pcb_component_id,pcb_port_id:pcbPort.pcb_port_id,shape:"rect",x:pad2.center.x,y:pad2.center.y,width:pad2.width,height:pad2.height,layer:padLayer});padData.push({pad:pad2,sourcePortId:sourcePort.source_port_id,pcbSmtpadId:pcbSmtpad.pcb_smtpad_id})}let internalGroups=groupPadsByInternalConnection(jumper.pads,jumper.orientation);for(let group of internalGroups){let sourcePortIds=[];for(let groupPad of group){let padInfo=padData.find(p5=>Math.abs(p5.pad.center.x-groupPad.center.x)<.01&&Math.abs(p5.pad.center.y-groupPad.center.y)<.01);padInfo&&sourcePortIds.push(padInfo.sourcePortId)}sourcePortIds.length>=2&&db3.source_component_internal_connection.insert({source_component_id:sourceComponent.source_component_id,subcircuit_id:subcircuit_id??void 0,source_port_ids:sourcePortIds})}}}function convertPcbTraceToSimplifiedPcbTrace(trace){return{...trace,type:"pcb_trace",pcb_trace_id:trace.pcb_trace_id,connection_name:trace.connection_name??trace.source_trace_id??trace.pcb_trace_id,route:trace.route.map(point6=>({...point6}))}}function getRelevantSubcircuitIdsForReroute(group){let relevantSubcircuitIds=new Set;if(!group.subcircuit_id)return relevantSubcircuitIds;relevantSubcircuitIds.add(group.subcircuit_id);let db3=group.root?.db;if(!db3)return relevantSubcircuitIds;for(let subcircuitId of getDescendantSubcircuitIds2(db3,group.subcircuit_id))relevantSubcircuitIds.add(subcircuitId);return relevantSubcircuitIds}function getExistingPcbTracesForReroute(group){let db3=group.root?.db;if(!db3)return[];let relevantSubcircuitIds=getRelevantSubcircuitIdsForReroute(group);return db3.pcb_trace.list().filter(trace=>!trace.route||trace.route.length<2?!1:group.subcircuit_id?!!(trace.subcircuit_id&&relevantSubcircuitIds.has(trace.subcircuit_id)):!0)}function getSourceTraceIdsFromRerouteName(value){return typeof value!="string"||value.length===0?[]:value.split("__").flatMap(connectionNamePart=>{if(connectionNamePart.length===0)return[];let sourceTraceIds=[connectionNamePart],rerouteSuffixIndex=connectionNamePart.indexOf("_reroute_");return rerouteSuffixIndex>0&&sourceTraceIds.push(connectionNamePart.slice(0,rerouteSuffixIndex)),sourceTraceIds})}function addPossibleReplacementSourceTraceId(sourceTraceIds,value){if(!(typeof value!="string"||value.length===0)){sourceTraceIds.add(value);for(let sourceTraceId of getSourceTraceIdsFromRerouteName(value))sourceTraceIds.add(sourceTraceId)}}function deleteExistingPcbTracesReplacedBy({group,outputPcbTraces,pcbTraceIdsToReplace=[]}){let db3=group.root?.db;if(!db3)return;let replacementPcbTraceIds=new Set(pcbTraceIdsToReplace),replacementSourceTraceIds=new Set;for(let trace of outputPcbTraces){if(trace.type!=="pcb_trace")continue;let replacementTrace=trace;replacementPcbTraceIds.add(replacementTrace.pcb_trace_id),addPossibleReplacementSourceTraceId(replacementSourceTraceIds,replacementTrace.source_trace_id),addPossibleReplacementSourceTraceId(replacementSourceTraceIds,replacementTrace.connection_name),addPossibleReplacementSourceTraceId(replacementSourceTraceIds,replacementTrace.rootConnectionName)}if(replacementPcbTraceIds.size===0&&replacementSourceTraceIds.size===0)return;let tracesToDelete=getExistingPcbTracesForReroute(group).filter(trace=>replacementPcbTraceIds.has(trace.pcb_trace_id)||!!(trace.source_trace_id&&trace.subcircuit_id===group.subcircuit_id&&replacementSourceTraceIds.has(trace.source_trace_id)));if(tracesToDelete.length===0)return;let deletedPcbTraceIds=new Set(tracesToDelete.map(trace=>trace.pcb_trace_id));for(let via of db3.pcb_via.list())via.pcb_trace_id&&deletedPcbTraceIds.has(via.pcb_trace_id)&&db3.pcb_via.delete(via.pcb_via_id);for(let trace of tracesToDelete)db3.pcb_trace.delete(trace.pcb_trace_id)}function getExistingSimplifiedPcbTracesForReroute(group){return getExistingPcbTracesForReroute(group).map(convertPcbTraceToSimplifiedPcbTrace)}function splitPcbTracesOnJumperSegments(route){let jumperRoutes=route.filter(p5=>p5.route_type==="jumper"),wireAndViaRoutes=route.filter(p5=>p5.route_type!=="jumper");if(jumperRoutes.length===0)return null;let splitRanges=[];for(let jumperRoute of jumperRoutes){let jumperStart=jumperRoute.start,jumperEnd=jumperRoute.end,startIdx=-1,endIdx=-1,minStartDist=1/0,minEndDist=1/0;for(let i3=0;i3<wireAndViaRoutes.length;i3++){let p5=wireAndViaRoutes[i3];if(p5.route_type!=="wire")continue;let distToStart=Math.hypot(p5.x-jumperStart.x,p5.y-jumperStart.y),distToEnd=Math.hypot(p5.x-jumperEnd.x,p5.y-jumperEnd.y);distToStart<minStartDist&&(minStartDist=distToStart,startIdx=i3),distToEnd<minEndDist&&(minEndDist=distToEnd,endIdx=i3)}startIdx>endIdx&&([startIdx,endIdx]=[endIdx,startIdx]),startIdx>=0&&endIdx>=0&&startIdx!==endIdx&&splitRanges.push({startIdx,endIdx})}splitRanges.sort((a3,b4)=>a3.startIdx-b4.startIdx);let segments=[],currentStart=0;for(let range2 of splitRanges)currentStart<range2.startIdx&&segments.push(wireAndViaRoutes.slice(currentStart,range2.startIdx+1)),currentStart=range2.endIdx;return currentStart<wireAndViaRoutes.length&&segments.push(wireAndViaRoutes.slice(currentStart)),segments}function computeCenterFromAnchorPosition(anchorPosition,ctx){let{width,height,pcbAnchorAlignment}=ctx;if(!pcbAnchorAlignment)return anchorPosition;let alignment=pcbAnchorAlignment;if(typeof width!="number"||typeof height!="number")return anchorPosition;let ax3=anchorPosition.x,ay3=anchorPosition.y;switch(alignment){case"top_left":return{x:ax3+width/2,y:ay3-height/2};case"top_center":return{x:ax3,y:ay3-height/2};case"top_right":return{x:ax3-width/2,y:ay3-height/2};case"center_left":return{x:ax3+width/2,y:ay3};case"center_right":return{x:ax3-width/2,y:ay3};case"bottom_left":return{x:ax3+width/2,y:ay3+height/2};case"bottom_center":return{x:ax3,y:ay3+height/2};case"bottom_right":return{x:ax3-width/2,y:ay3+height/2};default:return anchorPosition}}var getDistanceToPoint=(routePoint,targetPoint)=>{let position4=getRoutePointPosition(routePoint);return Math.hypot(position4.x-targetPoint.x,position4.y-targetPoint.y)},reversePcbTraceRoute=route=>route.slice().reverse().map(point6=>point6.route_type==="via"?{...point6}:point6.route_type==="through_pad"?{...point6,start:point6.end,end:point6.start,start_layer:point6.end_layer,end_layer:point6.start_layer}:{...point6}),ensureRouteStartsAtSourceTraceStart=({db:db3,route,sourceTraceId})=>{if(!sourceTraceId||route.length<2)return route;let firstSourcePortId=db3.source_trace.get(sourceTraceId)?.connected_source_port_ids[0];if(!firstSourcePortId)return route;let firstPcbPort=db3.pcb_port.list().find(port=>port.source_port_id===firstSourcePortId);if(!firstPcbPort)return route;let firstPoint=route[0],lastPoint=route[route.length-1];return getDistanceToPoint(lastPoint,firstPcbPort)<getDistanceToPoint(firstPoint,firstPcbPort)?reversePcbTraceRoute(route):route},Group5=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pcb_group_id",null);__publicField(this,"schematic_group_id",null);__publicField(this,"subcircuit_id",null);__publicField(this,"_hasStartedAsyncAutorouting",!1);__publicField(this,"_isInflatedFromCircuitJson",!1);__publicField(this,"_isolatedCircuitJson",null);__publicField(this,"_normalComponentNameMap",null);__publicField(this,"_asyncAutoroutingResult",null);__publicField(this,"unnamedElementCounter",{})}get _isIsolatedSubcircuit(){return!!this.getInheritedProperty("_subcircuitCachingEnabled")}getNormalComponentNameMap(){if(this._normalComponentNameMap)return this._normalComponentNameMap;let nameMap=new Map,collectNamedComponents=component=>{if(component._isNormalComponent&&component.name){let componentsWithSameName=nameMap.get(component.name);componentsWithSameName?componentsWithSameName.push(component):nameMap.set(component.name,[component])}for(let child of component.children)child.isSubcircuit||collectNamedComponents(child)};for(let child of this.children)child.isSubcircuit||collectNamedComponents(child);return this._normalComponentNameMap=nameMap,nameMap}get config(){return{zodProps:groupProps,componentName:"Group"}}initPorts(opts={}){let schPinArrangement=this._getSchematicPortArrangement();this._parsedProps?.showAsSchematicBox&&!this._parsedProps.pinLabels&&schPinArrangement&&getPinsFromPortArrangement(schPinArrangement).some(pin=>typeof pin=="string")||super.initPorts(opts)}_getSchematicPortArrangementFromPortDirections(){if(!this._parsedProps?.showAsSchematicBox)return null;let sidePins={leftSide:[],rightSide:[],topSide:[],bottomSide:[]};for(let port of this.children){if(port.componentName!=="Port")continue;let direction2=port._parsedProps.direction;if(!direction2)continue;let pin=port._parsedProps.pinNumber??port._parsedProps.name??void 0;if(pin===void 0)continue;sidePins[direction2==="left"?"leftSide":direction2==="right"?"rightSide":direction2==="up"?"topSide":"bottomSide"].push(pin)}if(sidePins.leftSide.length===0&&sidePins.rightSide.length===0&&sidePins.topSide.length===0&&sidePins.bottomSide.length===0)return null;let arrangement={};return sidePins.leftSide.length>0&&(arrangement.leftSide={pins:sidePins.leftSide,direction:"top-to-bottom"}),sidePins.rightSide.length>0&&(arrangement.rightSide={pins:sidePins.rightSide,direction:"top-to-bottom"}),sidePins.topSide.length>0&&(arrangement.topSide={pins:sidePins.topSide,direction:"left-to-right"}),sidePins.bottomSide.length>0&&(arrangement.bottomSide={pins:sidePins.bottomSide,direction:"left-to-right"}),arrangement}_getSchematicPortArrangement(){return super._getSchematicPortArrangement()??this._getSchematicPortArrangementFromPortDirections()}_ensureSchematicBoxPortsFromConnections(){if(this._parsedProps?.showAsSchematicBox&&this._parsedProps?.connections)for(let[pinName,target]of Object.entries(this._parsedProps.connections)){if(this.children.find(child=>child.componentName==="Port"&&child.isMatchingAnyOf([pinName])))continue;let pinNumberMatch=pinName.match(/^pin(\d+)$/i)??pinName.match(/^(\d+)$/),pinNumber=pinNumberMatch?Number(pinNumberMatch[1]):void 0;this.add(new Port({name:pinName,pinNumber,connectsTo:target}))}}doInitialInitializePortsFromChildren(){super.doInitialInitializePortsFromChildren(),this._ensureSchematicBoxPortsFromConnections()}updateInitializePortsFromChildren(){super.updateInitializePortsFromChildren(),this._ensureSchematicBoxPortsFromConnections()}_getPrimaryPinCount(){let superPinCount=super._getPrimaryPinCount();if(!this._parsedProps?.showAsSchematicBox)return superPinCount;let directPortPinNumbers=this.children.filter(child=>child.componentName==="Port").map(port=>port._parsedProps.pinNumber).filter(pinNumber=>pinNumber!==void 0);return directPortPinNumbers.length===0?superPinCount:Math.max(superPinCount,...directPortPinNumbers)}_getPinLabelsFromPorts(){return this._parsedProps?.showAsSchematicBox?getGroupSchematicBoxPinLabels(this):super._getPinLabelsFromPorts()}doInitialSourceGroupRender(){let{db:db3}=this.root,hasExplicitName=typeof this._parsedProps.name=="string"&&this._parsedProps.name.length>0,source_group3=db3.source_group.insert({name:this.name,is_subcircuit:this.isSubcircuit,was_automatically_named:!hasExplicitName});this.source_group_id=source_group3.source_group_id,this.isSubcircuit&&(this.subcircuit_id=`subcircuit_${source_group3.source_group_id}`,db3.source_group.update(source_group3.source_group_id,{subcircuit_id:this.subcircuit_id}))}doInitialSourceRender(){let{db:db3}=this.root;for(let child of this.children)db3.source_component.update(child.source_component_id,{source_group_id:this.source_group_id})}doInitialSourceParentAttachment(){let{db:db3}=this.root,parentGroup=this.parent?.getGroup?.();if(parentGroup?.source_group_id&&db3.source_group.update(this.source_group_id,{parent_source_group_id:parentGroup.source_group_id}),!this.isSubcircuit)return;let parent_subcircuit_id=this.parent?.getSubcircuit?.()?.subcircuit_id;parent_subcircuit_id&&db3.source_group.update(this.source_group_id,{parent_subcircuit_id})}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,groupProps2=props,hasOutline=groupProps2.outline&&groupProps2.outline.length>0,numericOutline=hasOutline?groupProps2.outline.map(point6=>({x:distance.parse(point6.x),y:distance.parse(point6.y)})):void 0,ctx=this.props,anchorPosition=this._getGlobalPcbPositionBeforeLayout(),center2=computeCenterFromAnchorPosition(anchorPosition,ctx),pcb_group3=db3.pcb_group.insert({is_subcircuit:this.isSubcircuit,subcircuit_id:this.subcircuit_id??this.getSubcircuit()?.subcircuit_id,name:this.name,anchor_position:anchorPosition,center:center2,...hasOutline?{outline:numericOutline}:{width:0,height:0},pcb_component_ids:[],source_group_id:this.source_group_id,autorouter_configuration:props.autorouter?{trace_clearance:props.autorouter.traceClearance}:void 0,anchor_alignment:props.pcbAnchorAlignment??null});this.pcb_group_id=pcb_group3.pcb_group_id;for(let child of this.children)db3.pcb_component.update(child.pcb_component_id,{pcb_group_id:pcb_group3.pcb_group_id})}doInitialPcbPrimitiveRender(){this.calculatePcbGroupBounds()}calculatePcbGroupBounds(){if(!this.pcb_group_id||this.root?.pcbDisabled)return;let{db:db3}=this.root,props=this._parsedProps,hasOutline=props.outline&&props.outline.length>0,hasExplicitPositioning=this._parsedProps.pcbX!==void 0||this._parsedProps.pcbY!==void 0;if(hasOutline){let numericOutline=props.outline.map(point6=>({x:distance.parse(point6.x),y:distance.parse(point6.y)})),outlineBounds=getBoundsFromPoints(numericOutline);if(!outlineBounds)return;let centerX2=(outlineBounds.minX+outlineBounds.maxX)/2,centerY2=(outlineBounds.minY+outlineBounds.maxY)/2,center22=hasExplicitPositioning?db3.pcb_group.get(this.pcb_group_id)?.center??{x:centerX2,y:centerY2}:{x:centerX2,y:centerY2};db3.pcb_group.update(this.pcb_group_id,{center:center22});return}let bounds=getBoundsOfPcbComponents(this.children),width=bounds.width,height=bounds.height,centerX=(bounds.minX+bounds.maxX)/2,centerY=(bounds.minY+bounds.maxY)/2;if(this.isSubcircuit){let{padLeft,padRight,padTop,padBottom}=this._resolvePcbPadding();width+=padLeft+padRight,height+=padTop+padBottom,centerX+=(padRight-padLeft)/2,centerY+=(padTop-padBottom)/2}let resolvedWidth=Number(props.width??width),resolvedHeight=Number(props.height??height),existingPcbGroup=db3.pcb_group.get(this.pcb_group_id),center2=hasExplicitPositioning?existingPcbGroup?.center??{x:centerX,y:centerY}:{x:centerX,y:centerY};if(hasExplicitPositioning&&props.pcbAnchorAlignment){let anchorPosition=this._getGlobalPcbPositionBeforeLayout(),anchorAlignedCenter=computeCenterFromAnchorPosition(anchorPosition,{...this.props,width:resolvedWidth,height:resolvedHeight});(Math.abs(anchorAlignedCenter.x-center2.x)>1e-6||Math.abs(anchorAlignedCenter.y-center2.y)>1e-6)&&this._repositionOnPcb(anchorAlignedCenter),center2=anchorAlignedCenter}db3.pcb_group.update(this.pcb_group_id,{width:resolvedWidth,height:resolvedHeight,center:center2})}updatePcbPrimitiveRender(){this.calculatePcbGroupBounds()}getNextAvailableName(elm){var _a516,_b4;return(_a516=this.unnamedElementCounter)[_b4=elm.lowercaseComponentName]??(_a516[_b4]=1),`unnamed_${elm.lowercaseComponentName}${this.unnamedElementCounter[elm.lowercaseComponentName]++}`}_resolvePcbPadding(){let props=this._parsedProps,layout=props.pcbLayout,getPaddingValue=key=>{let layoutValue=layout?.[key],propsValue=props[key];if(typeof layoutValue=="number")return layoutValue;if(typeof propsValue=="number")return propsValue},generalPadding=getPaddingValue("padding")??0,paddingX=getPaddingValue("paddingX"),paddingY=getPaddingValue("paddingY"),padLeft=getPaddingValue("paddingLeft")??paddingX??generalPadding,padRight=getPaddingValue("paddingRight")??paddingX??generalPadding,padTop=getPaddingValue("paddingTop")??paddingY??generalPadding,padBottom=getPaddingValue("paddingBottom")??paddingY??generalPadding;return{padLeft,padRight,padTop,padBottom}}doInitialCreateTraceHintsFromProps(){let{_parsedProps:props}=this,{db:db3}=this.root,groupProps2=props;if(!this.isSubcircuit)return;let manualTraceHints=groupProps2.manualEdits?.manual_trace_hints;if(manualTraceHints)for(let manualTraceHint of manualTraceHints)this.add(new TraceHint({for:manualTraceHint.pcb_port_selector,offsets:manualTraceHint.offsets}))}doInitialSourceAddConnectivityMapKey(){Group_doInitialSourceAddConnectivityMapKey(this)}_areChildSubcircuitsRouted(){let subcircuitChildren=this._findDirectChildSubcircuits();for(let subcircuitChild of subcircuitChildren)if(!subcircuitChild._isInflatedFromCircuitJson&&subcircuitChild._hasTracesToRoute()&&subcircuitChild._shouldRouteAsync()&&!subcircuitChild._asyncAutoroutingResult)return!1;return!0}_findDirectChildSubcircuits(){let result=[],visit=children=>{for(let child of children)child.isSubcircuit&&child!==this?result.push(child):visit(child.children)};return visit(this.children),result}_shouldRouteAsync(){let autorouter=this._getAutorouterConfig();return autorouter.groupMode==="sequential-trace"?!1:!!(autorouter.local&&autorouter.groupMode==="subcircuit"||!autorouter.local)}_getRoutingPhasePlans(){return Group_getRoutingPhasePlans(this)}_hasTracesToRoute(){let debug122=(0,import_debug11.default)("tscircuit:core:_hasTracesToRoute"),routingPhasePlans=this._getRoutingPhasePlans(),traceCount=0,hasReroutePhaseWithRegion=!1;for(let routingPhasePlan of routingPhasePlans)traceCount+=routingPhasePlan.traces.length,hasReroutePhaseWithRegion||(hasReroutePhaseWithRegion=!!(routingPhasePlan.reroute&&routingPhasePlan.region));if(debug122(`[${this.getString()}] has ${traceCount} traces to route`),traceCount>0)return!0;if(hasReroutePhaseWithRegion){let existingTraceCount=getExistingPcbTracesForReroute(this).length;return debug122(`[${this.getString()}] has ${existingTraceCount} existing pcb traces available for reroute`),existingTraceCount>0}return!1}async _runEffectMakeHttpAutoroutingRequest(){let{db:db3}=this.root,debug122=(0,import_debug11.default)("tscircuit:core:_runEffectMakeHttpAutoroutingRequest"),props=this._parsedProps,autorouterConfig2=this._getAutorouterConfig(),serverUrl=autorouterConfig2.serverUrl,serverMode=autorouterConfig2.serverMode,fetchWithDebug=(url2,options)=>(debug122("fetching",url2),options.headers&&(options.headers["Tscircuit-Core-Version"]=this.root?.getCoreVersion()),fetch(url2,options)),pcbAndSourceCircuitJson=this.root.db.toArray().filter(element=>element.type.startsWith("source_")||element.type.startsWith("pcb_"));if(serverMode==="solve-endpoint"){if(this.props.autorouter?.inputFormat==="simplified"){let{autorouting_result:autorouting_result2}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_simple_route_json:getSimpleRouteJsonFromCircuitJson({db:db3,minTraceWidth:Number(props.minTraceWidth??.15),nominalTraceWidth:this.props.nominalTraceWidth,subcircuit_id:this.subcircuit_id,subcircuitComponent:this}).simpleRouteJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r6=>r6.json());this._asyncAutoroutingResult=autorouting_result2,this._markDirty("PcbTraceRender");return}let{autorouting_result}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_circuit_json:pcbAndSourceCircuitJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r6=>r6.json());this._asyncAutoroutingResult=autorouting_result,this._markDirty("PcbTraceRender");return}let{autorouting_job}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/create`,{method:"POST",body:JSON.stringify({input_circuit_json:pcbAndSourceCircuitJson,provider:"freerouting",autostart:!0,display_name:this.root?.name,subcircuit_id:this.subcircuit_id,server_cache_enabled:autorouterConfig2.serverCacheEnabled}),headers:{"Content-Type":"application/json"}}).then(r6=>r6.json());for(;;){let{autorouting_job:job}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/get`,{method:"POST",body:JSON.stringify({autorouting_job_id:autorouting_job.autorouting_job_id}),headers:{"Content-Type":"application/json"}}).then(r6=>r6.json());if(job.is_finished){let{autorouting_job_output}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/get_output`,{method:"POST",body:JSON.stringify({autorouting_job_id:autorouting_job.autorouting_job_id}),headers:{"Content-Type":"application/json"}}).then(r6=>r6.json());this._asyncAutoroutingResult={output_pcb_traces:autorouting_job_output.output_pcb_traces},this._markDirty("PcbTraceRender");break}if(job.has_error){let err2=new AutorouterError(`Autorouting job failed: ${JSON.stringify(job.error)}`);throw db3.pcb_autorouting_error.insert({pcb_error_id:autorouting_job.autorouting_job_id,error_type:"pcb_autorouting_error",message:err2.message}),err2}await new Promise(resolve=>setTimeout(resolve,100))}}async _runLocalAutorouting(){let{db:db3}=this.root,props=this._parsedProps,debug122=(0,import_debug11.default)("tscircuit:core:_runLocalAutorouting");debug122(`[${this.getString()}] starting local autorouting`);let autorouterConfig2=this._getAutorouterConfig(),isLaserPrefabPreset=this._isLaserPrefabAutorouter(autorouterConfig2),isAutoJumperPreset=this._isAutoJumperAutorouter(autorouterConfig2),isSingleLayerBoard=this._getSubcircuitLayerCount()===1,minTraceWidth=Number(props.minTraceWidth??.15),nominalTraceWidth=Number(props.nominalTraceWidth??.15),{simpleRouteJson:baseSimpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db:db3,minTraceWidth,nominalTraceWidth,subcircuit_id:this.subcircuit_id,subcircuitComponent:this}),routingPhasePlans=this._getRoutingPhasePlans(),hasPhasedAutorouting=Group_hasPhasedAutorouting(routingPhasePlans),outputTraces=[],outputJumpers=[],pcbTraceIdsToDelete=new Set,existingRerouteSeedTraces=getExistingSimplifiedPcbTracesForReroute(this),traceMatchesRoutingPhase=(trace,routingPhasePlan)=>{let connectionName=trace.connection_name??trace.pcb_trace_id,sourceTraceIds=new Set([connectionName,trace.pcb_trace_id,...getSourceTraceIdsFromRerouteName(connectionName),...getSourceTraceIdsFromRerouteName(trace.pcb_trace_id)]);return baseSimpleRouteJson.connections.some(connection=>connectionIsInRoutingPhase(connection,routingPhasePlan)?sourceTraceIds.has(connection.name)||(connection.source_trace_id?sourceTraceIds.has(connection.source_trace_id):!1)||(connection.rootConnectionName?sourceTraceIds.has(connection.rootConnectionName):!1)||connection.mergedConnectionNames?.some(name=>sourceTraceIds.has(name)):!1)};for(let routingPhasePlan of routingPhasePlans){let phaseAutorouterConfig=routingPhasePlan.autorouter?getPresetAutoroutingConfig(routingPhasePlan.autorouter,this.root?.platform):autorouterConfig2,simpleRouteJson=baseSimpleRouteJson,isRegionReroutePhase=!!(routingPhasePlan.reroute&&routingPhasePlan.region),isConnectionReroutePhase=!!(routingPhasePlan.reroute&&!routingPhasePlan.region&&routingPhasePlan.traces.length>0),isReroutePhase=isRegionReroutePhase||isConnectionReroutePhase,rerouteOriginalSrj=isRegionReroutePhase?{...baseSimpleRouteJson,traces:[...existingRerouteSeedTraces,...outputTraces]}:null;if(isRegionReroutePhase&&rerouteOriginalSrj?simpleRouteJson=xW(rerouteOriginalSrj,{shape:"rect",...routingPhasePlan.region}):isConnectionReroutePhase?(simpleRouteJson=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan),simpleRouteJson.obstacles=[...simpleRouteJson.obstacles,...Group_getObstaclesFromRoutedTraces(outputTraces.filter(trace=>!traceMatchesRoutingPhase(trace,routingPhasePlan)))]):hasPhasedAutorouting&&(simpleRouteJson=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan),simpleRouteJson.obstacles=[...simpleRouteJson.obstacles,...Group_getObstaclesFromRoutedTraces(outputTraces)]),simpleRouteJson=Group_applyDrcTolerancesToSimpleRouteJson(simpleRouteJson,routingPhasePlan.drcTolerances),(hasPhasedAutorouting||isReroutePhase)&&simpleRouteJson.connections.length===0)continue;let phaseIsAutoJumperPreset=routingPhasePlan.autorouter!==void 0?this._isAutoJumperAutorouter(phaseAutorouterConfig):isAutoJumperPreset,phaseIsLaserPrefabPreset=routingPhasePlan.autorouter!==void 0?this._isLaserPrefabAutorouter(phaseAutorouterConfig):isLaserPrefabPreset;if(phaseIsAutoJumperPreset&&(simpleRouteJson.allowJumpers=!0,phaseAutorouterConfig.availableJumperTypes&&(simpleRouteJson.availableJumperTypes=phaseAutorouterConfig.availableJumperTypes)),debug122.enabled&&global.debugOutputArray?.push({name:`simpleroutejson-${this.props.name}.json`,obj:simpleRouteJson}),debug122.enabled){let graphicsObject=Oo2(simpleRouteJson);graphicsObject.title=`autorouting-${this.props.name}`,global.debugGraphics?.push(graphicsObject)}this.root?.emit("autorouting:start",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),simpleRouteJson});let autorouter;if(phaseAutorouterConfig.algorithmFn)autorouter=await phaseAutorouterConfig.algorithmFn(simpleRouteJson);else{let autorouterVersion2=this.props.autorouterVersion,effortLevel=this.props.autorouterEffortLevel,effort=effortLevel?Number.parseInt(effortLevel.replace("x",""),10):void 0;autorouter=new TscircuitAutorouter(simpleRouteJson,{capacityDepth:phaseAutorouterConfig.capacityDepth,targetMinCapacity:phaseAutorouterConfig.targetMinCapacity,useAssignableSolver:phaseIsLaserPrefabPreset||isSingleLayerBoard,useAutoJumperSolver:phaseIsAutoJumperPreset,useLaserPrefabSolver:phaseIsLaserPrefabPreset,autorouterVersion:autorouterVersion2,effort,onSolverStarted:({solverName,solverParams})=>this.root?.emit("solver:started",{type:"solver:started",solverName,solverParams,componentName:this.getString()})})}let routingPromise=new Promise((resolve,reject)=>{autorouter.on("complete",event=>{debug122(`[${this.getString()}] local autorouting complete`),resolve(event.traces)}),autorouter.on("error",event=>{debug122(`[${this.getString()}] local autorouting error: ${event.error.message}`),reject(event.error)})});autorouter.on("progress",event=>{this.root?.emit("autorouting:progress",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...event})}),autorouter.start();try{let traces=await routingPromise,outputSimpleRouteJson={...simpleRouteJson,traces};if(this.root?.emit("autorouting:end",{type:"autorouting:end",subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),simpleRouteJson:outputSimpleRouteJson}),autorouter.getConnectedOffboardObstacles){let connectedOffboardObstacles=autorouter.getConnectedOffboardObstacles();createSourceTracesFromOffboardConnections({db:db3,connectedOffboardObstacles,simpleRouteJson,subcircuit_id:this.subcircuit_id})}let solver=autorouter.solver;if(solver?.getOutputJumpers&&outputJumpers.push(...solver.getOutputJumpers()||[]),isRegionReroutePhase&&rerouteOriginalSrj){for(let trace of rerouteOriginalSrj.traces??[])trace.type==="pcb_trace"&&pcbTraceIdsToDelete.add(trace.pcb_trace_id);let reconnectedSrj=vW(rerouteOriginalSrj,{...simpleRouteJson,traces:[...simpleRouteJson.traces??[],...traces]});outputTraces.splice(0,outputTraces.length,...reconnectedSrj.traces??[])}else isConnectionReroutePhase?outputTraces.splice(0,outputTraces.length,...outputTraces.filter(trace=>!traceMatchesRoutingPhase(trace,routingPhasePlan)),...traces):outputTraces.push(...traces)}catch(error2){let{db:db22}=this.root;throw db22.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouter_error_subcircuit_${this.subcircuit_id}`,error_type:"pcb_autorouting_error",message:error2 instanceof Error?error2.message:String(error2)}),this.root?.emit("autorouting:error",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),error:{message:error2 instanceof Error?error2.message:String(error2)},simpleRouteJson}),error2}finally{autorouter.stop()}}this._asyncAutoroutingResult={output_pcb_traces:outputTraces,output_jumpers:outputJumpers,pcb_trace_ids_to_be_replaced:[...pcbTraceIdsToDelete],input_simple_route_json:baseSimpleRouteJson},this._markDirty("PcbTraceRender")}_startAsyncAutorouting(){this._hasStartedAsyncAutorouting||(this._hasStartedAsyncAutorouting=!0,this._getAutorouterConfig().local?this._queueAsyncEffect("capacity-mesh-autorouting",async()=>this._runLocalAutorouting()):this._queueAsyncEffect("make-http-autorouting-request",async()=>this._runEffectMakeHttpAutoroutingRequest()))}doInitialPcbTraceRender(){let debug122=(0,import_debug11.default)("tscircuit:core:doInitialPcbTraceRender");if(this.isSubcircuit&&!this.root?.pcbDisabled&&!(this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"))&&!this._isInflatedFromCircuitJson&&!this._shouldUseTraceByTraceRouting()){if(!this._areChildSubcircuitsRouted()){debug122(`[${this.getString()}] child subcircuits are not routed, skipping async autorouting until subcircuits routed`);return}debug122(`[${this.getString()}] no child subcircuits to wait for, initiating async routing`),this._hasTracesToRoute()&&this._startAsyncAutorouting()}}doInitialSchematicTraceRender(){this._parsedProps.showAsSchematicBox||Group_doInitialSchematicTraceRender(this)}updatePcbTraceRender(){let debug122=(0,import_debug11.default)("tscircuit:core:updatePcbTraceRender");if(debug122(`[${this.getString()}] updating...`),!this.isSubcircuit||this._isInflatedFromCircuitJson)return;if(this._shouldRouteAsync()&&this._hasTracesToRoute()&&!this._hasStartedAsyncAutorouting){this._areChildSubcircuitsRouted()&&(debug122(`[${this.getString()}] child subcircuits are now routed, starting async autorouting`),this._startAsyncAutorouting());return}if(!this._asyncAutoroutingResult||this._shouldUseTraceByTraceRouting())return;let{db:db3}=this.root;if(this._asyncAutoroutingResult.output_simple_route_json){debug122(`[${this.getString()}] updating PCB traces from simple route json (${this._asyncAutoroutingResult.output_simple_route_json.traces?.length} traces)`),this._updatePcbTraceRenderFromSimpleRouteJson();return}if(this._asyncAutoroutingResult.output_pcb_traces){debug122(`[${this.getString()}] updating PCB traces from ${this._asyncAutoroutingResult.output_pcb_traces.length} traces`),this._updatePcbTraceRenderFromPcbTraces();return}}_updatePcbTraceRenderFromSimpleRouteJson(){let{db:db3}=this.root,{traces:routedTraces}=this._asyncAutoroutingResult.output_simple_route_json;if(routedTraces)for(let routedTrace of routedTraces){let cjRoute=routedTrace.route.map(point6=>point6.route_type!=="through_obstacle"?point6:{route_type:"through_pad",start:point6.start,end:point6.end,start_layer:point6.from_layer,end_layer:point6.to_layer,width:point6.width}),pcb_trace3=db3.pcb_trace.insert({subcircuit_id:this.subcircuit_id,route:cjRoute})}}_updatePcbTraceRenderFromPcbTraces(){let{output_pcb_traces,output_jumpers,pcb_trace_ids_to_be_replaced,input_simple_route_json}=this._asyncAutoroutingResult;if(!output_pcb_traces)return;let{db:db3}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2),board=db3.pcb_board.list()[0],routedViaHoleDiameter=board?.min_via_hole_diameter??holeDiameter,routedViaPadDiameter=board?.min_via_pad_diameter??padDiameter;output_jumpers&&output_jumpers.length>0&&insertAutoplacedJumpers({db:db3,output_jumpers,subcircuit_id:this.subcircuit_id}),deleteExistingPcbTracesReplacedBy({group:this,outputPcbTraces:output_pcb_traces,pcbTraceIdsToReplace:pcb_trace_ids_to_be_replaced});for(let pcb_trace3 of output_pcb_traces){if(pcb_trace3.type!=="pcb_trace")continue;pcb_trace3.subcircuit_id??(pcb_trace3.subcircuit_id=this.subcircuit_id);let cjRoute=pcb_trace3.route.map(point6=>point6.route_type!=="through_obstacle"?point6:{route_type:"through_pad",start:point6.start,end:point6.end,start_layer:point6.from_layer,end_layer:point6.to_layer,width:point6.width}),routeSourceTraceId=getSourceTraceIdForRoutedTrace({db:db3,trace:{...pcb_trace3,route:cjRoute},subcircuit_id:this.subcircuit_id});cjRoute=ensureRouteStartsAtSourceTraceStart({db:db3,route:cjRoute,sourceTraceId:routeSourceTraceId}),pcb_trace3.route=cjRoute;let segments=splitPcbTracesOnJumperSegments(cjRoute);segments===null&&(segments=[cjRoute]);let processedSegments=addPortIdsToTracesAtJumperPads(segments,db3);for(let segment2 of processedSegments)if(segment2.length>0){let sourceTraceId=getSourceTraceIdForRoutedTrace({db:db3,trace:{...pcb_trace3,route:segment2},subcircuit_id:this.subcircuit_id});db3.pcb_trace.insert({...pcb_trace3,source_trace_id:sourceTraceId,route:segment2})}}for(let pcb_trace3 of output_pcb_traces)if(pcb_trace3.type!=="pcb_via"&&pcb_trace3.type==="pcb_trace"){let sourceTraceId=getSourceTraceIdForRoutedTrace({db:db3,trace:pcb_trace3,subcircuit_id:this.subcircuit_id}),{connection_name:inputConnectionName}=pcb_trace3,subcircuitConnectivityMapKey;if(sourceTraceId&&(subcircuitConnectivityMapKey=db3.source_trace.get(sourceTraceId)?.subcircuit_connectivity_map_key),!subcircuitConnectivityMapKey&&inputConnectionName){let sourceNet=db3.source_net.get(inputConnectionName);sourceNet&&(subcircuitConnectivityMapKey=sourceNet.subcircuit_connectivity_map_key)}for(let point6 of pcb_trace3.route)if(point6.route_type==="via"){let routedViaPoint=point6,fromLayer=point6.from_layer,toLayer=point6.to_layer;db3.pcb_via.insert({pcb_trace_id:pcb_trace3.pcb_trace_id,x:point6.x,y:point6.y,hole_diameter:routedViaPoint.via_hole_diameter??routedViaPoint.hole_diameter??routedViaHoleDiameter,outer_diameter:routedViaPoint.via_diameter??routedViaPoint.outer_diameter??routedViaPadDiameter,layers:getViaBoardLayers(this._getSubcircuitLayerCount()),from_layer:fromLayer,to_layer:toLayer,subcircuit_id:this.subcircuit_id,pcb_group_id:this.pcb_group_id??void 0,subcircuit_connectivity_map_key:subcircuitConnectivityMapKey})}}}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,schematic_group3=db3.schematic_group.insert({is_subcircuit:this.isSubcircuit,subcircuit_id:this.subcircuit_id,name:this.name,center:this._getGlobalSchematicPositionBeforeLayout(),width:0,height:0,schematic_component_ids:[],source_group_id:this.source_group_id,show_as_schematic_box:props.showAsSchematicBox??!1});this.schematic_group_id=schematic_group3.schematic_group_id,props.showAsSchematicBox&&Group_doInitialSchematicBoxComponentRender(this);for(let child of this.children)child._parsedProps?.showAsSchematicBox||child.schematic_component_id&&db3.schematic_component.update(child.schematic_component_id,{schematic_group_id:schematic_group3.schematic_group_id})}_getSchematicLayoutMode(){let props=this._parsedProps,schAutoLayoutEnabled=props.schAutoLayoutEnabled??!1;if(props.schLayout?.layoutMode==="none"||props.schLayout?.layoutMode==="relative")return"relative";if(props.schLayout?.matchAdapt)return"match-adapt";if(props.schLayout?.flex)return"flex";if(props.schLayout?.grid)return"grid";if(props.schMatchAdapt)return"match-adapt";if(props.schFlex)return"flex";if(props.schGrid)return"grid";if(props.matchAdapt)return"match-adapt";if(props.flex)return"flex";if(props.grid)return"grid";if(props.relative||props.schRelative)return"relative";let anyLayoutChildHasSchCoords=this.children.some(child=>{let cProps=child._parsedProps;return(child.source_component_id!==null||child.source_group_id!==null)&&(cProps?.schX!==void 0||cProps?.schY!==void 0)}),hasManualEdits=(props.manualEdits?.schematic_placements?.length??0)>0;return schAutoLayoutEnabled&&!hasManualEdits||!anyLayoutChildHasSchCoords&&!hasManualEdits?"match-adapt":"relative"}doInitialSchematicLayout(){if(this._parsedProps.showAsSchematicBox){this._insertSchematicBorder();return}if(this.children.some(c6=>c6.source_component_id!==null&&c6._parsedProps?.schSectionName!==void 0)){this._doInitialSchematicLayoutSections(),this._insertSchematicBorder();return}let schematicLayoutMode=this._getSchematicLayoutMode();schematicLayoutMode==="match-adapt"&&this._doInitialSchematicLayoutMatchpack(),schematicLayoutMode==="grid"&&this._doInitialSchematicLayoutGrid(),schematicLayoutMode==="flex"&&this._doInitialSchematicLayoutFlex(),this._insertSchematicBorder()}_doInitialSchematicLayoutSections(){Group_doInitialSchematicLayoutSections(this)}_doInitialSchematicLayoutMatchAdapt(){Group_doInitialSchematicLayoutMatchAdapt(this)}_doInitialSchematicLayoutMatchpack(){Group_doInitialSchematicLayoutMatchPack(this)}_doInitialSchematicLayoutGrid(){Group_doInitialSchematicLayoutGrid(this)}_doInitialSchematicLayoutFlex(){Group_doInitialSchematicLayoutFlex(this)}_getPcbLayoutMode(){let props=this._parsedProps,rawProps=this.props;if(this._isInflatedFromCircuitJson||props.pcbRelative)return"none";if(props.pcbLayout?.matchAdapt)return"match-adapt";if(props.pcbLayout?.flex)return"flex";if(props.pcbLayout?.grid)return"grid";if(props.pcbLayout?.pack)return"pack";if(props.pcbFlex)return"flex";if(props.pcbGrid)return"grid";if(props.pcbPack||props.pack)return"pack";if(props.matchAdapt)return"match-adapt";if(props.flex)return"flex";if(props.grid)return"grid";let groupHasCoords=props.pcbX!==void 0||props.pcbY!==void 0||props.pcbLeftEdgeX!==void 0||props.pcbRightEdgeX!==void 0||props.pcbTopEdgeY!==void 0||props.pcbBottomEdgeY!==void 0||rawProps.pcbLeftEdgeX!==void 0||rawProps.pcbRightEdgeX!==void 0||rawProps.pcbTopEdgeY!==void 0||rawProps.pcbBottomEdgeY!==void 0,hasManualEdits=(props.manualEdits?.pcb_placements?.length??0)>0,unpositionedDirectChildrenCount=this.children.reduce((count,child)=>{if(!child.pcb_component_id&&!child.pcb_group_id)return count;let childProps=child._parsedProps,rawChildProps=child.props,hasCoords=childProps?.pcbX!==void 0||childProps?.pcbY!==void 0||childProps?.pcbLeftEdgeX!==void 0||childProps?.pcbRightEdgeX!==void 0||childProps?.pcbTopEdgeY!==void 0||childProps?.pcbBottomEdgeY!==void 0||rawChildProps?.pcbLeftEdgeX!==void 0||rawChildProps?.pcbRightEdgeX!==void 0||rawChildProps?.pcbTopEdgeY!==void 0||rawChildProps?.pcbBottomEdgeY!==void 0;return count+(hasCoords?0:1)},0);return!hasManualEdits&&unpositionedDirectChildrenCount>1?"pack":"none"}doInitialPcbLayout(){if(this.root?.pcbDisabled)return;if(this.pcb_group_id){let{db:db3}=this.root,props=this._parsedProps;if(props.pcbX!==void 0||props.pcbY!==void 0){let parentGroup=this.parent?.getGroup?.(),pcbParentGroupId=parentGroup?.pcb_group_id?db3.pcb_group.get(parentGroup.pcb_group_id)?.pcb_group_id:void 0,positionedRelativeToBoardId=pcbParentGroupId?void 0:this._getBoard()?.pcb_board_id??void 0;db3.pcb_group.update(this.pcb_group_id,{position_mode:"relative_to_group_anchor",positioned_relative_to_pcb_group_id:pcbParentGroupId,positioned_relative_to_pcb_board_id:positionedRelativeToBoardId,display_offset_x:props.pcbX,display_offset_y:props.pcbY})}}let pcbLayoutMode=this._getPcbLayoutMode();pcbLayoutMode==="grid"?this._doInitialPcbLayoutGrid():pcbLayoutMode==="pack"?this._doInitialPcbLayoutPack():pcbLayoutMode==="flex"&&this._doInitialPcbLayoutFlex()}_doInitialPcbLayoutGrid(){Group_doInitialPcbLayoutGrid(this)}_doInitialPcbLayoutPack(){Group_doInitialPcbLayoutPack(this)}_doInitialPcbLayoutFlex(){Group_doInitialPcbLayoutFlex(this)}_insertSchematicBorder(){if(this.root?.schematicDisabled)return;let{db:db3}=this.root,props=this._parsedProps;if(!props.border)return;let width=typeof props.schWidth=="number"?props.schWidth:void 0,height=typeof props.schHeight=="number"?props.schHeight:void 0,paddingGeneral=typeof props.schPadding=="number"?props.schPadding:0,paddingLeft=typeof props.schPaddingLeft=="number"?props.schPaddingLeft:paddingGeneral,paddingRight=typeof props.schPaddingRight=="number"?props.schPaddingRight:paddingGeneral,paddingTop=typeof props.schPaddingTop=="number"?props.schPaddingTop:paddingGeneral,paddingBottom=typeof props.schPaddingBottom=="number"?props.schPaddingBottom:paddingGeneral,schematicGroup=this.schematic_group_id?db3.schematic_group.get(this.schematic_group_id):null;if(schematicGroup&&(width===void 0&&typeof schematicGroup.width=="number"&&(width=schematicGroup.width),height===void 0&&typeof schematicGroup.height=="number"&&(height=schematicGroup.height)),width===void 0||height===void 0)return;let center2=schematicGroup?.center??this._getGlobalSchematicPositionBeforeLayout(),left=center2.x-width/2-paddingLeft,bottom=center2.y-height/2-paddingBottom,finalWidth=width+paddingLeft+paddingRight,finalHeight=height+paddingTop+paddingBottom;db3.schematic_box.insert({width:finalWidth,height:finalHeight,x:left,y:bottom,is_dashed:props.border?.dashed??!1})}_determineSideFromPosition(port,component){if(!port.center||!component.center)return"left";let dx3=port.center.x-component.center.x,dy3=port.center.y-component.center.y;return Math.abs(dx3)>Math.abs(dy3)?dx3>0?"right":"left":dy3>0?"bottom":"top"}_calculateSchematicBounds(boxes){if(boxes.length===0)return{minX:0,maxX:0,minY:0,maxY:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let box2 of boxes)minX=Math.min(minX,box2.centerX),maxX=Math.max(maxX,box2.centerX),minY=Math.min(minY,box2.centerY),maxY=Math.max(maxY,box2.centerY);let padding=2;return{minX:minX-padding,maxX:maxX+padding,minY:minY-padding,maxY:maxY+padding}}_getAutorouterConfig(){let autorouter=this._parsedProps.autorouter||this.getInheritedProperty("autorouter");return getPresetAutoroutingConfig(autorouter,this.root?.platform)}_isLaserPrefabAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize3=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="laser_prefab"?!0:typeof autorouterProp2=="string"?normalize3(autorouterProp2)==="laser_prefab":typeof autorouterProp2=="object"&&autorouterProp2?normalize3(autorouterProp2.preset)==="laser_prefab":!1}_isAutoJumperAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize3=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="auto_jumper"?!0:typeof autorouterProp2=="string"?normalize3(autorouterProp2)==="auto_jumper":typeof autorouterProp2=="object"&&autorouterProp2?normalize3(autorouterProp2.preset)==="auto_jumper":!1}_getSubcircuitLayerCount(){let layers=this.getInheritedProperty("layers");return typeof layers=="number"?layers:2}_shouldUseTraceByTraceRouting(){return this._getAutorouterConfig().groupMode==="sequential-trace"}doInitialPcbDesignRuleChecks(){if(this.root?.pcbDisabled||this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"))return;let{db:db3}=this.root;if(this.isSubcircuit){let immediateChildrenByName=new Map;for(let child of this.children)if(!child.isSubcircuit&&child._parsedProps.name){let components=immediateChildrenByName.get(child._parsedProps.name)||[];components.push(child),immediateChildrenByName.set(child._parsedProps.name,components)}for(let[name,components]of immediateChildrenByName.entries()){if(components.length<=1)continue;let sameNamedTraces=components.filter(child=>child instanceof Trace3),duplicateNameIsOnlyTraces=sameNamedTraces.length===components.length,mutuallyConnectedTraceKeys=sameNamedTraces.map(trace=>trace.subcircuit_connectivity_map_key),sameNamedTracesAreMutuallyConnected=duplicateNameIsOnlyTraces&&mutuallyConnectedTraceKeys.every(Boolean)&&new Set(mutuallyConnectedTraceKeys).size===1;if(!duplicateNameIsOnlyTraces||!sameNamedTracesAreMutuallyConnected){let displaySubcircuitName=this.name||"unnamed",message=duplicateNameIsOnlyTraces?`Trace "${name}" in subcircuit "${displaySubcircuitName}" shares a name with another trace, but the traces are not mutually connected. Same-named traces must have the same subcircuit connectivity map key.`:`Multiple immediate children found with name "${name}" in subcircuit "${displaySubcircuitName}". Names must be unique.`;db3.pcb_trace_error.insert({error_type:"pcb_trace_error",message,source_trace_id:"",pcb_trace_id:"",pcb_component_ids:components.map(c6=>c6.pcb_component_id).filter(Boolean),pcb_port_ids:[]})}}}}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled||!this.isSubcircuit)return;let{db:db3}=this.root,subtree=db3;for(let nl3 of subtree.schematic_net_label.list()){let net=subtree.source_net.get(nl3.source_net_id),text=nl3.text||net?.name||"";if(nl3.anchor_side==="top"&&GROUND_NET_REGEX.test(text)){subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_down"});continue}nl3.anchor_side==="bottom"&&POWER_NET_REGEX.test(text)&&subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_up"})}}doInitialSimulationSpiceEngineRender(){Group_doInitialSimulationSpiceEngineRender(this)}doInitialPcbComponentAnchorAlignment(){Group_doInitialPcbComponentAnchorAlignment(this)}updatePcbComponentAnchorAlignment(){this.doInitialPcbComponentAnchorAlignment()}doInitialPcbCalcPlacementResolution(){Group_doInitialPcbCalcPlacementResolution(this)}updatePcbCalcPlacementResolution(){this.doInitialPcbCalcPlacementResolution()}_getMinimumFlexContainerSize(){return super._getMinimumFlexContainerSize()}_repositionOnPcb(position4){return super._repositionOnPcb(position4)}};function inflateSourceGroup(sourceGroup,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbGroup=injectionDb.pcb_group.getWhere({source_group_id:sourceGroup.source_group_id}),groupProps2={name:sourceGroup.name??`inflated_group_${sourceGroup.source_group_id}`};if(pcbGroup?.position_mode==="relative_to_group_anchor"&&pcbGroup.anchor_position){let baseAnchor={x:0,y:0};if(sourceGroup.parent_source_group_id){let parentPcbGroup=injectionDb.pcb_group.getWhere({source_group_id:sourceGroup.parent_source_group_id});parentPcbGroup?.anchor_position&&(baseAnchor=parentPcbGroup.anchor_position)}groupProps2.pcbX=pcbGroup.anchor_position.x-baseAnchor.x,groupProps2.pcbY=pcbGroup.anchor_position.y-baseAnchor.y}pcbGroup?.anchor_alignment&&(groupProps2.pcbAnchorAlignment=pcbGroup.anchor_alignment);let group=new Group5(groupProps2);return group._isInflatedFromCircuitJson=!0,group.source_group_id=sourceGroup.source_group_id,groupsMap&&groupsMap.set(sourceGroup.source_group_id,group),sourceGroup.parent_source_group_id&&groupsMap?.has(sourceGroup.parent_source_group_id)?groupsMap.get(sourceGroup.parent_source_group_id).add(group):subcircuit.add(group),group}var Inductor2=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Inductor",schematicSymbolName:this.props.symbolName??"inductor",zodProps:inductorProps,sourceFtype:FTYPE.simple_inductor}}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.inductance)}H`}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({name:this.name,ftype:FTYPE.simple_inductor,inductance:this.props.inductance,display_inductance:this._getSchematicSymbolDisplayValue(),supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceInductor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),inductor=new Inductor2({name:sourceElm.name,inductance:sourceElm.inductance,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:inductor});footprint&&inductor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(inductor):subcircuit.add(inductor)}var Led=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pin1);__publicField(this,"anode",this.portMap.pin1);__publicField(this,"neg",this.portMap.pin2);__publicField(this,"cathode",this.portMap.pin2)}get config(){let symbolMap={laser:"laser_diode"},variantSymbol=this.props.laser?"laser":null;return{schematicSymbolName:variantSymbol?symbolMap[variantSymbol]:this.props.symbolName??"led",componentName:"Led",zodProps:ledProps,sourceFtype:"simple_led"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}_getSchematicSymbolDisplayValue(){return this._parsedProps.schDisplayValue||this._parsedProps.color||void 0}getFootprinterString(){let baseFootprint=super.getFootprinterString();return baseFootprint&&this.props.color?`${baseFootprint}_color(${this.props.color})`:baseFootprint}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({ftype:"simple_led",name:this.name,wave_length:props.wavelength,color:props.color,symbol_display_value:this._getSchematicSymbolDisplayValue(),manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceLed(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),led2=new Led({name:sourceElm.name,color:sourceElm.color,wavelength:sourceElm.wavelength??sourceElm.wave_length,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:led2});footprint&&led2.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(led2):subcircuit.add(led2)}function inflateSourcePort(sourcePort,inflatorContext){let{injectionDb,subcircuit}=inflatorContext;if(sourcePort.source_component_id!==null)return;let pcbPortFromInjection=injectionDb.pcb_port.getWhere({source_port_id:sourcePort.source_port_id}),port=new Port({name:sourcePort.name,pinNumber:sourcePort.pin_number});subcircuit.add(port),port.source_port_id=sourcePort.source_port_id;let root=subcircuit.root;if(root&&pcbPortFromInjection){let{db:db3}=root,pcb_port3=db3.pcb_port.insert({pcb_component_id:void 0,layers:pcbPortFromInjection.layers,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:subcircuit.getGroup()?.pcb_group_id??void 0,x:pcbPortFromInjection.x,y:pcbPortFromInjection.y,source_port_id:sourcePort.source_port_id,is_board_pinout:!1});port.pcb_port_id=pcb_port3.pcb_port_id}}var PushButton=class extends NormalComponent3{get config(){return{componentName:"PushButton",schematicSymbolName:this.props.symbolName??"push_button_normally_open_momentary",zodProps:pushButtonProps,sourceFtype:FTYPE.simple_push_button}}get defaultInternallyConnectedPinNames(){return[]}initPorts(){super.initPorts({pinCount:2,ignoreSymbolPorts:!0});let symbol=rc[this._getSchematicSymbolNameOrThrow()],symPort1=symbol.ports.find(p5=>p5.labels.includes("1")),symPort2=symbol.ports.find(p5=>p5.labels.includes("2")),ports=this.selectAll("port"),pin1Port=ports.find(p5=>p5.props.pinNumber===1),pin2Port=ports.find(p5=>p5.props.pinNumber===2),pin3Port=ports.find(p5=>p5.props.pinNumber===3),pin4Port=ports.find(p5=>p5.props.pinNumber===4),{internallyConnectedPins}=this._parsedProps;pin1Port.schematicSymbolPortDef=symPort1,(!internallyConnectedPins||internallyConnectedPins.length===0)&&(pin2Port.schematicSymbolPortDef=symPort2);for(let[pn3,port]of[[2,pin2Port],[3,pin3Port],[4,pin4Port]]){let internallyConnectedRow=internallyConnectedPins?.find(([pin1,pin2])=>pin1===`pin${pn3}`||pin2===`pin${pn3}`);if(!internallyConnectedRow){port.schematicSymbolPortDef=symPort2;break}(internallyConnectedRow?.[0]===`pin${pn3}`?internallyConnectedRow[1]:internallyConnectedRow?.[0])!=="pin1"&&(port.schematicSymbolPortDef=symPort2)}}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({name:this.name,ftype:FTYPE.simple_push_button,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourcePushButton(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),pushButton=new PushButton({name:sourceElm.name,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:pushButton});footprint&&pushButton.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(pushButton):subcircuit.add(pushButton)}var Resistor2=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Resistor",schematicSymbolName:this.props.symbolName??"boxresistor",zodProps:resistorProps,sourceFtype:"simple_resistor"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.resistance)}\u03A9`}doInitialCreateNetsFromProps(){this._createNetsFromProps([this.props.pullupFor,this.props.pullupTo,this.props.pulldownFor,this.props.pulldownTo,...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this.props.pullupFor&&this.props.pullupTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pullupFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pullupTo}))),this.props.pulldownFor&&this.props.pulldownTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pulldownFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pulldownTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({ftype:"simple_resistor",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,resistance:props.resistance,display_resistance:this._getSchematicSymbolDisplayValue(),are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceResistor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),resistor=new Resistor2({name:sourceElm.name,resistance:sourceElm.resistance,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:resistor});footprint&&resistor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(resistor):subcircuit.add(resistor)}function pcbTraceRouteToPcbPath(route){if(route.length<=2)return[];let firstPoint=route[0],lastPoint=route[route.length-1];return route.slice(1,-1).filter(point6=>{let position4=getRoutePointPosition(point6),firstPosition=getRoutePointPosition(firstPoint),lastPosition=getRoutePointPosition(lastPoint),isSameAsFirst=position4.x===firstPosition.x&&position4.y===firstPosition.y,isSameAsLast=position4.x===lastPosition.x&&position4.y===lastPosition.y;return!isSameAsFirst&&!isSameAsLast}).map(point6=>{if(point6.route_type==="via")return{x:point6.x,y:point6.y,via:!0,fromLayer:point6.from_layer,toLayer:point6.to_layer};let position4=getRoutePointPosition(point6);return{x:position4.x,y:position4.y}})}var getSelectorPath=(component,inflatorContext)=>{let{injectionDb,subcircuit,groupsMap}=inflatorContext,path_parts=[],currentGroupId=component.source_group_id;for(;currentGroupId&&currentGroupId!==subcircuit.source_group_id;){let sourceGroup=injectionDb.source_group.get(currentGroupId),groupInstance=groupsMap?.get(currentGroupId);if(!sourceGroup||!groupInstance)break;let groupName=groupInstance.props.name??groupInstance.fallbackUnassignedName;path_parts.unshift(`.${groupName}`),currentGroupId=sourceGroup.parent_source_group_id}return path_parts.push(`.${component.name}`),path_parts.join(" > ")};function inflateSourceTrace(sourceTrace,inflatorContext){let{injectionDb,subcircuit}=inflatorContext,connectedSelectors=[];for(let sourcePortId of sourceTrace.connected_source_port_ids){let sourcePort=injectionDb.source_port.get(sourcePortId);if(!sourcePort)continue;let selector;if(sourcePort.source_component_id){let sourceComponent=injectionDb.source_component.get(sourcePort.source_component_id);sourceComponent&&(selector=`${getSelectorPath({name:sourceComponent.name,source_group_id:sourceComponent.source_group_id},inflatorContext)} > .${sourcePort.name}`)}else selector=`.${sourcePort.name}`;selector&&connectedSelectors.push(selector)}for(let sourceNetId of sourceTrace.connected_source_net_ids){let sourceNet=injectionDb.source_net.get(sourceNetId);sourceNet&&connectedSelectors.push(`net.${sourceNet.name}`)}if(connectedSelectors.length<2)return;let pcbTraces=injectionDb.pcb_trace.list().filter(trace2=>trace2.source_trace_id===sourceTrace.source_trace_id),pcbTrace=pcbTraces[0],pcbPath2;pcbTrace&&(pcbPath2=pcbTraceRouteToPcbPath(pcbTrace.route));let traceWidth=sourceTrace.min_trace_thickness;if(!traceWidth&&pcbTrace?.route){let wirePoint=pcbTrace.route.find(pt3=>pt3.route_type==="wire");wirePoint&&wirePoint.route_type==="wire"&&(traceWidth=wirePoint.width)}let traceProps2={path:connectedSelectors};traceWidth!==void 0&&(traceProps2.thickness=traceWidth),pcbPath2&&pcbPath2.length>0?traceProps2.pcbPath=pcbPath2:!pcbTrace&&sourceTrace.connected_source_port_ids.length===2&&sourceTrace.connected_source_net_ids.length===0&&(traceProps2.pcbStraightLine=!0);let trace=new Trace3(traceProps2);trace._inflatedPcbTraces=pcbTraces.length>0?pcbTraces:void 0,trace._inflatedPcbVias=pcbTrace?injectionDb.pcb_via.list().filter(via=>pcbTraces.some(trace2=>via.pcb_trace_id===trace2.pcb_trace_id)):void 0,subcircuit.add(trace)}var Transistor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"emitter",this.portMap.pin1);__publicField(this,"collector",this.portMap.pin2);__publicField(this,"base",this.portMap.pin3)}get config(){let baseSymbolName=this.props.type==="npn"?"npn_bipolar_transistor":"pnp_bipolar_transistor";return{componentName:"Transistor",schematicSymbolName:this.props.symbolName??baseSymbolName,zodProps:transistorProps,sourceFtype:"simple_transistor",shouldRenderAsSchematicBox:!1}}initPorts(){let pinAliases={pin1:["collector","c"],pin2:["emitter","e"],pin3:["base","b"]};super.initPorts({pinCount:3,additionalAliases:pinAliases})}doInitialCreateNetsFromProps(){this._createNetsFromProps([...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({ftype:"simple_transistor",name:this.name,transistor_type:props.type,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceTransistor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),transistor=new Transistor({name:sourceElm.name,type:sourceElm.transistor_type,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:transistor});footprint&&transistor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(transistor):subcircuit.add(transistor)}function inflateStandalonePcbPrimitives(inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,standalonePrimitiveTypes=["pcb_silkscreen_rect","pcb_silkscreen_circle","pcb_silkscreen_line","pcb_silkscreen_path","pcb_silkscreen_text","pcb_fabrication_note_text","pcb_fabrication_note_path","pcb_fabrication_note_rect","pcb_note_text","pcb_note_rect","pcb_note_path","pcb_note_line","pcb_via"],standalonePrimitives=injectionDb.toArray().filter(elm=>{if(!standalonePrimitiveTypes.includes(elm.type))return!1;if(elm.type==="pcb_via"){if(!elm.pcb_trace_id)return!0;let pcbTrace=injectionDb.pcb_trace.get(elm.pcb_trace_id),sourceTraceId=pcbTrace?.source_trace_id;return!(sourceTraceId&&injectionDb.source_trace.get(sourceTraceId)&&pcbTrace?.route.some(point6=>point6.route_type==="via"&&Math.abs(point6.x-elm.x)<1e-4&&Math.abs(point6.y-elm.y)<1e-4))}return"pcb_component_id"in elm&&(elm.pcb_component_id===null||elm.pcb_component_id===void 0)});if(standalonePrimitives.length===0)return;let components=createComponentsFromCircuitJson({componentName:"",componentRotation:"0deg"},standalonePrimitives);for(let component of components)subcircuit.add(component)}var inflateCircuitJson=(target,circuitJson,children)=>{if(!circuitJson)return;let injectionDb=cju_default(circuitJson);if(circuitJson&&children?.length>0)throw new Error("Component cannot have both circuitJson and children");let inflationCtx={injectionDb,subcircuit:target,groupsMap:new Map},sourceGroups=injectionDb.source_group.list(),renderedGroupIds=new Set,groupsToRender=[...sourceGroups];for(;groupsToRender.length>0;){let groupIndex=groupsToRender.findIndex(g4=>!g4.parent_source_group_id||renderedGroupIds.has(g4.parent_source_group_id));if(groupIndex===-1){let remainingIds=groupsToRender.map(g4=>g4.source_group_id).join(", ");throw new Error(`Cannot inflate source_groups: cyclic dependency or missing parent detected. Remaining groups: ${remainingIds}`)}let groupToRender=groupsToRender[groupIndex];inflateSourceGroup(groupToRender,inflationCtx),renderedGroupIds.add(groupToRender.source_group_id),groupsToRender.splice(groupIndex,1)}let pcbBoards=injectionDb.pcb_board.list();for(let pcbBoard of pcbBoards)inflatePcbBoard(pcbBoard,inflationCtx);let sourceComponents=injectionDb.source_component.list();for(let sourceComponent of sourceComponents)switch(sourceComponent.ftype){case"simple_resistor":inflateSourceResistor(sourceComponent,inflationCtx);break;case"simple_capacitor":inflateSourceCapacitor(sourceComponent,inflationCtx);break;case"simple_inductor":inflateSourceInductor(sourceComponent,inflationCtx);break;case"simple_diode":inflateSourceDiode(sourceComponent,inflationCtx);break;case"simple_fiducial":inflateSourceFiducial(sourceComponent,inflationCtx);break;case"simple_led":inflateSourceLed(sourceComponent,inflationCtx);break;case"simple_chip":inflateSourceChip(sourceComponent,inflationCtx);break;case"simple_transistor":inflateSourceTransistor(sourceComponent,inflationCtx);break;case"simple_push_button":inflateSourcePushButton(sourceComponent,inflationCtx);break;default:throw new Error(`No inflator implemented for source component ftype: "${sourceComponent.ftype}"`)}let sourcePorts=injectionDb.source_port.list();for(let sourcePort of sourcePorts)inflateSourcePort(sourcePort,inflationCtx);let sourceTraces=injectionDb.source_trace.list();for(let sourceTrace of sourceTraces)inflateSourceTrace(sourceTrace,inflationCtx);inflateStandalonePcbPrimitives(inflationCtx)},isSelectionResultPort=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.getSourcePort=="function",isSelectionResultNet=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.getSourceNet=="function",isSelectionResultComponent=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.getPorts=="function",isCircuitJsonElement=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.type=="string",isNonEmptyString=value=>typeof value=="string"&&value.length>0,SelectionResultPortImpl=class{constructor(port){__publicField(this,"port");this.port=port}getPcbPort(){let pcbPortId=this.port.pcb_port_id;return pcbPortId?this.port.root?.db.pcb_port.get(pcbPortId)??null:null}getSourcePort(){let sourcePortId=this.port.source_port_id;return sourcePortId?this.port.root?.db.source_port.get(sourcePortId)??null:null}},SelectionResultNetImpl=class{constructor(net){__publicField(this,"net");this.net=net}getSourceNet(){let sourceNetId=this.net.source_net_id;return sourceNetId?this.net.root?.db.source_net.get(sourceNetId)??null:null}},SelectionResultComponentImpl=class{constructor(component){__publicField(this,"component");this.component=component}getPort(name){let port=this.component.selectOne(`port.${name}`,{type:"port"})??this.component.selectOne(`.${name}`,{type:"port"});return port?new SelectionResultPortImpl(port):null}getPorts(){return this.component.selectAll("port").map(port=>new SelectionResultPortImpl(port))}getPcbComponent(){let pcbComponentId=this.component.pcb_component_id;return pcbComponentId?this.component.root?.db.pcb_component.get(pcbComponentId)??null:null}getSourceComponent(){let sourceComponentId=this.component.source_component_id;return sourceComponentId?this.component.root?.db.source_component.get(sourceComponentId)??null:null}},DrcCheck=class extends PrimitiveComponent2{get config(){return{componentName:"DrcCheck",zodProps:drcCheckProps}}constructor(props){super(props)}async runCustomDrcCheck(circuitJson){let result=await this._parsedProps.checkFn(this.createCustomDrcCheckContext(circuitJson)),diagnostics=[];return Array.isArray(result)?diagnostics=result:result&&(diagnostics=[result]),diagnostics.map((diagnostic,index)=>this.createCircuitJsonDiagnostic(diagnostic,index)).filter(diagnostic=>!!diagnostic)}createCustomDrcCheckContext(circuitJson){return{select:this.selectCustomDrcElement.bind(this),selectAll:this.selectAllCustomDrcElements.bind(this),isConnected:(a3,b4)=>this.isConnected(a3,b4,circuitJson),isPulledUp:a3=>this.isConnected(a3,"net.VCC",circuitJson)||this.isConnected(a3,"net.VDD",circuitJson)||this.getResistanceBetween(a3,"net.VCC",circuitJson)!==null||this.getResistanceBetween(a3,"net.VDD",circuitJson)!==null,isPulledDown:a3=>this.isConnected(a3,"net.GND",circuitJson)||this.getResistanceBetween(a3,"net.GND",circuitJson)!==null,getResistanceBetween:(a3,b4)=>this.getResistanceBetween(a3,b4,circuitJson)}}selectCustomDrcElement(selector){return this.wrapSelectionResult(this.getSubcircuit().selectOne(selector))}selectAllCustomDrcElements(selector){let selectionResults=[];for(let component of this.getSubcircuit().selectAll(selector)){let selectionResult=this.wrapSelectionResult(component);selectionResult&&selectionResults.push(selectionResult)}return selectionResults}wrapSelectionResult(component){return component?component instanceof Port?new SelectionResultPortImpl(component):component instanceof Net?new SelectionResultNetImpl(component):new SelectionResultComponentImpl(component):null}createCircuitJsonDiagnostic(diagnostic,index){let diagnosticRecord=diagnostic,diagnosticType="source_component_misconfigured_error";typeof diagnosticRecord.error_type=="string"?diagnosticType=diagnosticRecord.error_type:typeof diagnosticRecord.warning_type=="string"&&(diagnosticType=diagnosticRecord.warning_type);let diagnosticWithCircuitJsonDefaults={...diagnostic};typeof diagnosticRecord.type=="string"?diagnosticWithCircuitJsonDefaults.type=diagnosticRecord.type:diagnosticWithCircuitJsonDefaults.type=diagnosticType,typeof diagnosticRecord.warning_type!="string"&&(typeof diagnosticRecord.error_type=="string"?diagnosticWithCircuitJsonDefaults.error_type=diagnosticRecord.error_type:diagnosticWithCircuitJsonDefaults.error_type=diagnosticType);let diagnosticIdField=`${diagnosticType}_id`;return diagnosticRecord[diagnosticIdField]?diagnosticWithCircuitJsonDefaults[diagnosticIdField]=diagnosticRecord[diagnosticIdField]:diagnosticWithCircuitJsonDefaults[diagnosticIdField]=`${diagnosticType}_${this._renderId}_${index}`,any_circuit_element.parse(diagnosticWithCircuitJsonDefaults)}isConnected(a3,b4,circuitJson){let aKeys=this.getConnectivityKeys(a3,circuitJson),bKeys=this.getConnectivityKeys(b4,circuitJson);return aKeys.some(key=>bKeys.includes(key))}getResistanceBetween(a3,b4,circuitJson){if(this.isConnected(a3,b4,circuitJson))return 0;let aKeys=this.getConnectivityKeys(a3,circuitJson),bKeys=this.getConnectivityKeys(b4,circuitJson);if(aKeys.length===0||bKeys.length===0)return null;let sourceResistors=circuitJson.filter(elm=>elm.type==="source_component"&&elm.ftype==="simple_resistor"),root=this.root;if(!root)return null;for(let resistor of sourceResistors){let resistorPorts=root.db.source_port.list({source_component_id:resistor.source_component_id});if(resistorPorts.length!==2)continue;let resistorKeys=resistorPorts.map(port=>port.subcircuit_connectivity_map_key),connectsA=resistorKeys.some(key=>key&&aKeys.includes(key)),connectsB=resistorKeys.some(key=>key&&bKeys.includes(key));if(connectsA&&connectsB)return resistor.resistance}return null}getConnectivityKeys(connectable,circuitJson){if(!connectable)return[];if(typeof connectable=="string"){let selected=this.selectCustomDrcElement(connectable);return selected?this.getConnectivityKeys(selected,circuitJson):[]}return isSelectionResultPort(connectable)?[connectable.getSourcePort()?.subcircuit_connectivity_map_key].filter(isNonEmptyString):isSelectionResultNet(connectable)?[connectable.getSourceNet()?.subcircuit_connectivity_map_key].filter(isNonEmptyString):isSelectionResultComponent(connectable)?connectable.getPorts().flatMap(port=>this.getConnectivityKeys(port,circuitJson)):isCircuitJsonElement(connectable)?this.getCircuitJsonElementConnectivityKeys(connectable,circuitJson):[]}getCircuitJsonElementConnectivityKeys(element,circuitJson){if(!element)return[];if(element.type==="source_port")return[element.subcircuit_connectivity_map_key].filter(isNonEmptyString);if(element.type==="source_net")return[element.subcircuit_connectivity_map_key].filter(isNonEmptyString);if(element.type==="pcb_port")return this.getConnectivityKeys(element.source_port_id,circuitJson);if(element.type==="source_component"){let root=this.root;return root?root.db.source_port.list({source_component_id:element.source_component_id}).map(port=>port.subcircuit_connectivity_map_key).filter(isNonEmptyString):[]}return[]}},package_default3={name:"@tscircuit/core",type:"module",version:"0.0.1382",types:"dist/index.d.ts",main:"dist/index.js",module:"dist/index.js",exports:{".":{import:"./dist/index.js",types:"./dist/index.d.ts"}},files:["dist"],repository:{type:"git",url:"https://github.com/tscircuit/core"},scripts:{build:"tsup-node",format:"biome format . --write","measure-bundle":"howfat -r table .","pkg-pr-new-release":"bunx pkg-pr-new publish --comment=off --peerDeps","smoke-test:dist":"bun run scripts/smoke-tests/test-dist-simple-circuit.tsx","build:benchmarking":"bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist","build:benchmarking:watch":`chokidar "./{benchmarking,lib}/**/*.{ts,tsx}" -c 'bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist'`,"start:benchmarking":'concurrently "bun run build:benchmarking:watch" "live-server ./benchmarking-dist"',"generate-test-plan":"bun run scripts/generate-test-plan.ts"},devDependencies:{"@biomejs/biome":"^1.8.3","@resvg/resvg-js":"^2.6.2","@tscircuit/alphabet":"0.0.25","@tscircuit/breakout-point-solver":"github:tscircuit/breakout-point-solver#bac9629","@tscircuit/capacity-autorouter":"^0.0.625","@tscircuit/checks":"0.0.140","@tscircuit/circuit-json-util":"^0.0.97","@tscircuit/common":"^0.0.20","@tscircuit/copper-pour-solver":"0.0.35","@tscircuit/footprinter":"^0.0.357","@tscircuit/image-utils":"^0.0.8","@tscircuit/infer-cable-insertion-point":"^0.0.2","@tscircuit/infgrid-ijump-astar":"^0.0.35","@tscircuit/jlcpcb-manufacturing-specs":"git+https://github.com/tscircuit/jlcpcb-manufacturing-specs#e08af159db01a37db007e33f0a7268d0e4a279a5","@tscircuit/krt-wasm":"^0.1.1","@tscircuit/log-soup":"^1.0.2","@tscircuit/matchpack":"^0.0.29","@tscircuit/math-utils":"^0.0.36","@tscircuit/miniflex":"^0.0.4","@tscircuit/ngspice-spice-engine":"^0.0.18","@tscircuit/props":"^0.0.565","@tscircuit/schematic-match-adapt":"^0.0.18","@tscircuit/schematic-trace-solver":"^0.0.75","@tscircuit/solver-utils":"^0.0.16","@tscircuit/soup-util":"^0.0.41","@types/bun":"^1.2.16","@types/debug":"^4.1.12","@types/react":"^19.1.8","@types/react-dom":"^19.1.6","@types/react-reconciler":"^0.28.9","bpc-graph":"^0.0.57","bun-match-svg":"0.0.12","calculate-elbow":"^0.0.12","chokidar-cli":"^3.0.0","circuit-json":"^0.0.443","circuit-json-to-bpc":"^0.0.13","circuit-json-to-connectivity-map":"^0.0.23","circuit-json-to-gltf":"^0.0.105","circuit-json-to-spice":"^0.0.40","circuit-to-svg":"^0.0.369",concurrently:"^9.1.2","connectivity-map":"^1.0.0",debug:"^4.3.6",flatbush:"^4.5.0","graphics-debug":"^0.0.95",howfat:"^0.3.8","kicad-to-circuit-json":"^0.0.97",kicadts:"^0.0.47","live-server":"^1.2.2","looks-same":"^9.0.1",minicssgrid:"^0.0.9","pkg-pr-new":"^0.0.37",poppygl:"^0.0.24",react:"^19.1.0","react-dom":"^19.1.0","schematic-symbols":"^0.0.226",spicets:"^0.0.2",spicey:"^0.0.14","stack-svgs":"^0.0.1","ts-expect":"^1.3.0",tsup:"^8.2.4"},peerDependencies:{"@tscircuit/capacity-autorouter":"*","@tscircuit/checks":"*","@tscircuit/circuit-json-util":"*","@tscircuit/footprinter":"*","@tscircuit/infgrid-ijump-astar":"*","@tscircuit/math-utils":"*","@tscircuit/props":"*","@tscircuit/schematic-match-adapt":"*","circuit-json-to-bpc":"*","bpc-graph":"*","@tscircuit/matchpack":"*","circuit-json":"*","circuit-json-to-connectivity-map":"*","schematic-symbols":"*",typescript:"^5.0.0"},dependencies:{"@flatten-js/core":"^1.6.2","@lume/kiwi":"^0.4.3","calculate-cell-boundaries":"^0.0.13","calculate-packing":"0.0.75","css-select":"5.1.0","format-si-unit":"^0.0.7",nanoid:"^5.0.7","performance-now":"^2.1.0","react-reconciler":"^0.32.0","svg-path-commander":"^2.1.11","transformation-matrix":"^2.16.1",zod:"^3.25.67"}},IsolatedCircuit=class{constructor({platform,projectUrl,cachedSubcircuits,pendingSubcircuitRenders}={}){__publicField(this,"firstChild",null);__publicField(this,"children");__publicField(this,"db");__publicField(this,"root",null);__publicField(this,"isRootCircuit",!1);__publicField(this,"cachedSubcircuits");__publicField(this,"pendingSubcircuitRenders");__publicField(this,"_schematicDisabledOverride");__publicField(this,"pcbDisabled",!1);__publicField(this,"pcbRoutingDisabled",!1);__publicField(this,"_featureMspSchematicTraceRouting",!0);__publicField(this,"name");__publicField(this,"platform");__publicField(this,"projectUrl");__publicField(this,"_hasRenderedAtleastOnce",!1);__publicField(this,"_asyncEffectIdsByPhase",new Map);__publicField(this,"_asyncEffectPhaseById",new Map);__publicField(this,"_hasUnrenderedUpdatesFromAsyncEffects",!1);__publicField(this,"_runningAsyncEffectsById",new Map);__publicField(this,"_eventListeners",{});this.children=[],this.db=su2([]),this.platform=platform,this.projectUrl=projectUrl,this.pcbDisabled=platform?.pcbDisabled??!1,this.pcbRoutingDisabled=platform?.routingDisabled??!1,this.cachedSubcircuits=cachedSubcircuits,this.pendingSubcircuitRenders=pendingSubcircuitRenders,this.root=this}get schematicDisabled(){return this._schematicDisabledOverride!==void 0?this._schematicDisabledOverride:this.platform?.schematicDisabled!==void 0?this.platform.schematicDisabled:this._getBoard()?._parsedProps?.schematicDisabled??!1}set schematicDisabled(value){this._schematicDisabledOverride=value}add(componentOrElm){let component;(0,import_react5.isValidElement)(componentOrElm)?component=createInstanceFromReactElement(componentOrElm):component=componentOrElm,this.children.push(component)}setPlatform(platform){this.platform={...this.platform,...platform},platform.pcbDisabled!==void 0&&(this.pcbDisabled=platform.pcbDisabled),platform.routingDisabled!==void 0&&(this.pcbRoutingDisabled=platform.routingDisabled)}_getBoard(){let directBoard=this.children.find(c6=>c6.componentName==="Board");if(directBoard)return directBoard}_guessRootComponent(){if(this.firstChild)return;if(this.children.length===0)throw new Error("Not able to guess root component: IsolatedCircuit has no children (use circuit.add(...))");let panels=this.children.filter(child=>child.lowercaseComponentName==="panel");if(panels.length>1)throw new Error("Only one <panel> is allowed per circuit");if(panels.length===1){if(this.children.length!==1)throw new Error("<panel> must be the root element of the circuit");this.firstChild=panels[0];return}if(this.children.length===1&&this.children[0].isGroup){this.firstChild=this.children[0];return}let group=new Group5({subcircuit:!0});group.parent=this,group.addAll(this.children),this.children=[group],this.firstChild=group}render(){this.firstChild||this._guessRootComponent();let{firstChild,db:db3}=this;if(!firstChild)throw new Error("IsolatedCircuit has no root component");firstChild.parent=this,firstChild.runRenderCycle(),this._hasUnrenderedUpdatesFromAsyncEffects=!1,this._hasRenderedAtleastOnce=!0}async renderUntilSettled(){for(this.db.source_project_metadata.list()?.[0]||this.db.source_project_metadata.insert({software_used_string:`@tscircuit/core@${this.getCoreVersion()}`,...this.projectUrl?{project_url:this.projectUrl}:{}}),this.render();!this.isDoneRendering();)await new Promise(resolve=>setTimeout(resolve,100)),this.render();this.emit("renderComplete")}isDoneRendering(){return this._hasRenderedAtleastOnce&&!this._hasIncompleteAsyncEffects()}_hasIncompleteAsyncEffects(){return this._asyncEffectPhaseById.size>0||this._hasUnrenderedUpdatesFromAsyncEffects?!0:this.children.some(child=>child._hasIncompleteAsyncEffects())}_hasIncompleteAsyncEffectsForPhase(phase){return(this._asyncEffectIdsByPhase.get(phase)?.size??0)>0}getRunningAsyncEffects(){return Array.from(this._runningAsyncEffectsById.values())}getCircuitJson(){return this._hasRenderedAtleastOnce||this.render(),this.db.toArray()}toJson(){return this.getCircuitJson()}async getSvg(options){let circuitToSvg=await Promise.resolve().then(()=>(init_dist9(),dist_exports3)).catch(e7=>{throw new Error(`To use circuit.getSvg, you must install the "circuit-to-svg" package.
744
744
 
745
745
  "${e7.message}"`)});if(options.view==="pcb")return circuitToSvg.convertCircuitJsonToPcbSvg(this.getCircuitJson());if(options.view==="schematic")return circuitToSvg.convertCircuitJsonToSchematicSvg(this.getCircuitJson());throw new Error(`Invalid view: ${options.view}`)}getCoreVersion(){let[major,minor,patch]=package_default3.version.split(".").map(Number);return`${major}.${minor}.${patch+1}`}async preview(previewNameOrOpts){let previewOpts=typeof previewNameOrOpts=="object"?previewNameOrOpts:{previewName:previewNameOrOpts};throw new Error("project.preview is not yet implemented")}computeSchematicGlobalTransform(){return identity()}_computePcbGlobalTransformBeforeLayout(){return identity()}selectAll(selector){return this._guessRootComponent(),this.firstChild?.selectAll(selector)??[]}selectOne(selector,opts){return this._guessRootComponent(),this.firstChild?.selectOne(selector,opts)??null}emit(event,...args){if(event==="asyncEffect:start"?this._registerAsyncEffectStart(args[0]):event==="asyncEffect:end"&&this._registerAsyncEffectEnd(args[0]),!!this._eventListeners[event])for(let listener of this._eventListeners[event])listener(...args)}on(event,listener){this._eventListeners[event]||(this._eventListeners[event]=[]),this._eventListeners[event].push(listener)}removeListener(event,listener){this._eventListeners[event]&&(this._eventListeners[event]=this._eventListeners[event].filter(l7=>l7!==listener))}enableDebug(debug122){typeof debug122=="string"?import_debug20.default.enable(debug122):(debug122===null||debug122===!1)&&import_debug20.default.disable()}getClientOrigin(){return typeof window<"u"&&window.location?window.location.origin:typeof self<"u"&&self.location?self.location.origin:""}_registerAsyncEffectStart(payload){if(!payload?.asyncEffectId||!payload.phase)return;let{asyncEffectId,phase}=payload,existingPhase=this._asyncEffectPhaseById.get(asyncEffectId);existingPhase&&existingPhase!==phase&&this._asyncEffectIdsByPhase.get(existingPhase)?.delete(asyncEffectId),this._asyncEffectIdsByPhase.has(phase)||this._asyncEffectIdsByPhase.set(phase,new Set),this._asyncEffectIdsByPhase.get(phase).add(asyncEffectId),this._asyncEffectPhaseById.set(asyncEffectId,phase),this._runningAsyncEffectsById.set(asyncEffectId,{asyncEffectId,effectName:payload.effectName,componentDisplayName:payload.componentDisplayName,phase,error:payload.error})}_registerAsyncEffectEnd(payload){if(!payload?.asyncEffectId)return;let{asyncEffectId}=payload,phase=this._asyncEffectPhaseById.get(asyncEffectId)??payload.phase;if(phase){let phaseSet=this._asyncEffectIdsByPhase.get(phase);phaseSet?.delete(asyncEffectId),phaseSet&&phaseSet.size===0&&this._asyncEffectIdsByPhase.delete(phase)}this._asyncEffectPhaseById.delete(asyncEffectId),this._runningAsyncEffectsById.delete(asyncEffectId),this._hasUnrenderedUpdatesFromAsyncEffects=!0}};function Subcircuit_doInitialRenderIsolatedSubcircuits(subcircuit){if(!subcircuit._isIsolatedSubcircuit||subcircuit._isolatedCircuitJson||!subcircuit.getSubcircuitPropHash)return;let propHash=subcircuit.getSubcircuitPropHash(),cachedSubcircuits=subcircuit.root?.cachedSubcircuits,pendingSubcircuitRenders=subcircuit.root?.pendingSubcircuitRenders,cached=cachedSubcircuits?.get(propHash);if(cached){subcircuit._isolatedCircuitJson=cached,subcircuit.children=[],subcircuit._normalComponentNameMap=null;return}let childrenToRender=[...subcircuit.children];subcircuit.children=[],subcircuit._normalComponentNameMap=null;let parentRoot=subcircuit.root;subcircuit._queueAsyncEffect("render-isolated-subcircuit",async()=>{let cachedResult=cachedSubcircuits?.get(propHash);if(cachedResult){subcircuit._isolatedCircuitJson=cachedResult;return}let pendingRenderPromise=pendingSubcircuitRenders?.get(propHash);if(pendingRenderPromise){subcircuit._isolatedCircuitJson=await pendingRenderPromise;return}let resolveRender,rejectRender,renderPromise=new Promise((resolve,reject)=>{resolveRender=resolve,rejectRender=reject});pendingSubcircuitRenders?.set(propHash,renderPromise);try{let isolatedCircuit=new IsolatedCircuit({platform:{...parentRoot.platform,pcbDisabled:parentRoot.pcbDisabled,schematicDisabled:parentRoot.schematicDisabled},cachedSubcircuits,pendingSubcircuitRenders});for(let child of childrenToRender)isolatedCircuit.add(child);await isolatedCircuit.renderUntilSettled();let circuitJson=isolatedCircuit.getCircuitJson();cachedSubcircuits?.set(propHash,circuitJson),subcircuit._isolatedCircuitJson=circuitJson,resolveRender(circuitJson)}catch(error2){throw rejectRender(error2 instanceof Error?error2:new Error(String(error2))),error2}finally{pendingSubcircuitRenders?.delete(propHash)}})}var EXCLUDED_PROPS=new Set(["name","key","pcbX","pcbY","schX","schY","pcbLeftEdgeX","pcbRightEdgeX","pcbTopEdgeY","pcbBottomEdgeY","pcbRotation","schRotation"]);function safeSerialize(value,seen=new WeakSet){if(value===null)return"null";if(value===void 0)return"undefined";let type=typeof value;if(type==="string")return`"${value}"`;if(type==="number"||type==="boolean")return String(value);if(type==="function")return"[function]";if(type==="symbol")return"[symbol]";if(type==="object"){if(seen.has(value))return"[circular]";if(seen.add(value),value.$$typeof!==void 0){let elementType=typeof value.type=="string"?value.type:value.type?.name||"[component]",propsStr=value.props?safeSerialize(value.props,seen):"{}";return`ReactElement(${elementType},${propsStr})`}return Array.isArray(value)?`[${value.map(v3=>safeSerialize(v3,seen)).join(",")}]`:`{${Object.keys(value).sort().map(k5=>`${k5}:${safeSerialize(value[k5],seen)}`).join(",")}}`}return String(value)}function getHashableProps(props){let result={},keys=Object.keys(props).sort();for(let key of keys)!EXCLUDED_PROPS.has(key)&&props[key]!==void 0&&(result[key]=props[key]);return result}function getChildrenHashData(children){return children.map(child=>({componentName:child.componentName,props:getHashableProps(child.props??{}),children:getChildrenHashData(child.children)}))}function fnv1aHash(str){let hash=2166136261;for(let i3=0;i3<str.length;i3++)hash^=str.charCodeAt(i3),hash=Math.imul(hash,16777619);return hash>>>0}function computeHash(data){let serialized=safeSerialize(data),hash1=fnv1aHash(serialized),hash2=fnv1aHash(serialized+hash1.toString());return hash1.toString(16).padStart(8,"0")+hash2.toString(16).padStart(8,"0")}function Subcircuit_getSubcircuitPropHash(subcircuit){let hashableData={props:getHashableProps(subcircuit.props??{}),children:getChildrenHashData(subcircuit.children)};return computeHash(hashableData)}var MIN_EFFECTIVE_BORDER_RADIUS_MM=.01,getRoundedRectOutline=(width,height,radius)=>{let w22=width/2,h22=height/2,r6=Math.min(radius,w22,h22);if(r6<MIN_EFFECTIVE_BORDER_RADIUS_MM)return[{x:-w22,y:-h22},{x:w22,y:-h22},{x:w22,y:h22},{x:-w22,y:h22}];let segments=Math.max(1,Math.ceil(Math.PI/2*r6/.1)),step=Math.PI/2/segments,outline=[];outline.push({x:-w22+r6,y:-h22}),outline.push({x:w22-r6,y:-h22});for(let i3=1;i3<=segments;i3++){let theta=-Math.PI/2+i3*step;outline.push({x:w22-r6+r6*Math.cos(theta),y:-h22+r6+r6*Math.sin(theta)})}outline.push({x:w22,y:h22-r6});for(let i3=1;i3<=segments;i3++){let theta=0+i3*step;outline.push({x:w22-r6+r6*Math.cos(theta),y:h22-r6+r6*Math.sin(theta)})}outline.push({x:-w22+r6,y:h22});for(let i3=1;i3<=segments;i3++){let theta=Math.PI/2+i3*step;outline.push({x:-w22+r6+r6*Math.cos(theta),y:h22-r6+r6*Math.sin(theta)})}outline.push({x:-w22,y:-h22+r6});for(let i3=1;i3<=segments;i3++){let theta=Math.PI+i3*step;outline.push({x:-w22+r6+r6*Math.cos(theta),y:-h22+r6+r6*Math.sin(theta)})}return outline},Board=class extends Group5{constructor(){super(...arguments);__publicField(this,"pcb_board_id",null);__publicField(this,"source_board_id",null);__publicField(this,"_drcChecksComplete",!1);__publicField(this,"_drcChecksInProgress",!1);__publicField(this,"_connectedSchematicPortPairs",new Set);__publicField(this,"_panelPositionOffset",null)}get isSubcircuit(){return!0}get isGroup(){return!0}get config(){return{componentName:"Board",zodProps:boardProps}}get boardThickness(){return this._parsedProps.thickness??1.4}get allLayers(){let layerCount=this._parsedProps.layers??2;return layerCount===1?["top"]:layerCount===4?["top","bottom","inner1","inner2"]:["top","bottom"]}_getSubcircuitLayerCount(){return this._parsedProps.layers??2}_computePcbGlobalTransformBeforeLayout(){if(this._panelPositionOffset){let parentTransform=this.parent?._computePcbGlobalTransformBeforeLayout?.()??{a:1,b:0,c:0,d:1,e:0,f:0};return compose2(parentTransform,translate2(this._panelPositionOffset.x,this._panelPositionOffset.y))}return super._computePcbGlobalTransformBeforeLayout()}_getBoardCalcVariables(){let{_parsedProps:props}=this;if((props.width==null||props.height==null)&&!props.outline)return{};let dbBoard=this.pcb_board_id?this.root?.db.pcb_board.get(this.pcb_board_id):null,width=dbBoard?.width??props.width,height=dbBoard?.height??props.height;if((width==null||height==null)&&props.outline?.length){let outlineBounds=getBoundsFromPoints(props.outline);outlineBounds&&(width??(width=outlineBounds.maxX-outlineBounds.minX),height??(height=outlineBounds.maxY-outlineBounds.minY))}let{pcbX,pcbY}=this.getResolvedPcbPositionProp(),center2=dbBoard?.center??{x:pcbX+(props.outlineOffsetX??0),y:pcbY+(props.outlineOffsetY??0)},resolvedWidth=width??0,resolvedHeight=height??0;return{"board.minX":center2.x-resolvedWidth/2,"board.maxX":center2.x+resolvedWidth/2,"board.minY":center2.y-resolvedHeight/2,"board.maxY":center2.y+resolvedHeight/2}}doInitialPcbBoardAutoSize(){if(this.root?.pcbDisabled||!this.pcb_board_id)return;let{db:db3}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalPcbPositionBeforeLayout(),pcbBoard=db3.pcb_board.get(this.pcb_board_id);if(pcbBoard?.width&&pcbBoard?.height||pcbBoard?.outline&&pcbBoard.outline.length>0)return;let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0,descendantIds=getDescendantSubcircuitIds2(db3,this.subcircuit_id),allowedSubcircuitIds=new Set([this.subcircuit_id,...descendantIds]),allPcbComponents=db3.pcb_component.list().filter(c6=>c6.subcircuit_id&&allowedSubcircuitIds.has(c6.subcircuit_id)),allPcbGroups=db3.pcb_group.list().filter(g4=>g4.subcircuit_id&&allowedSubcircuitIds.has(g4.subcircuit_id)),hasComponents=!1,updateBounds=(center22,width,height)=>{width===0||height===0||(hasComponents=!0,minX=Math.min(minX,center22.x-width/2),minY=Math.min(minY,center22.y-height/2),maxX=Math.max(maxX,center22.x+width/2),maxY=Math.max(maxY,center22.y+height/2))};for(let pcbComponent of allPcbComponents)updateBounds(pcbComponent.center,pcbComponent.width,pcbComponent.height);for(let pcbGroup of allPcbGroups){let width=pcbGroup.width??0,height=pcbGroup.height??0;if(pcbGroup.outline&&pcbGroup.outline.length>0){let bounds=getBoundsFromPoints(pcbGroup.outline);bounds&&(width=bounds.maxX-bounds.minX,height=bounds.maxY-bounds.minY)}updateBounds(pcbGroup.center,width,height)}if(props.boardAnchorPosition){let{x:x4,y:y3}=props.boardAnchorPosition;minX=Math.min(minX,x4),minY=Math.min(minY,y3),maxX=Math.max(maxX,x4),maxY=Math.max(maxY,y3)}let padding=2,computedWidth=hasComponents?maxX-minX+padding*2:0,computedHeight=hasComponents?maxY-minY+padding*2:0,center2={x:hasComponents?(minX+maxX)/2+(props.outlineOffsetX??0):(props.outlineOffsetX??0)+globalPos.x,y:hasComponents?(minY+maxY)/2+(props.outlineOffsetY??0):(props.outlineOffsetY??0)+globalPos.y},finalWidth=props.width??computedWidth,finalHeight=props.height??computedHeight,outline=props.outline;!outline&&props.borderRadius!=null&&finalWidth>0&&finalHeight>0&&(outline=getRoundedRectOutline(finalWidth,finalHeight,props.borderRadius));let update={width:finalWidth,height:finalHeight,center:center2};outline&&(update.outline=outline.map(point6=>({x:point6.x+(props.outlineOffsetX??0),y:point6.y+(props.outlineOffsetY??0)}))),db3.pcb_board.update(this.pcb_board_id,update)}updatePcbBoardAutoSize(){this.doInitialPcbBoardAutoSize()}_addBoardInformationToSilkscreen(){let platform=this.root?.platform;if(!platform?.printBoardInformationToSilkscreen)return;let pcbBoard=this.root.db.pcb_board.get(this.pcb_board_id);if(!pcbBoard)return;let boardInformation=[];if(platform.projectName&&boardInformation.push(platform.projectName),platform.version&&boardInformation.push(`v${platform.version}`),platform.url&&boardInformation.push(platform.url),boardInformation.length===0)return;let text=boardInformation.join(`
746
746
  `),position4={x:pcbBoard.center.x+pcbBoard.width/2-.25,y:pcbBoard.center.y-pcbBoard.height/2+1};this.root.db.pcb_silkscreen_text.insert({pcb_component_id:this.pcb_board_id,layer:"top",font:"tscircuit2024",font_size:.45,text,ccw_rotation:0,anchor_alignment:"bottom_right",anchor_position:position4})}doInitialSourceRender(){let nestedBoard=this.getDescendants().find(d4=>d4.lowercaseComponentName==="board");if(nestedBoard)throw new Error(`Nested boards are not supported: found board "${nestedBoard.name}" inside board "${this.name}"`);super.doInitialSourceRender();let{db:db3}=this.root,source_board3=db3.source_board.insert({source_group_id:this.source_group_id,title:this.props.title||this.props.name});this.source_board_id=source_board3.source_board_id}getSubcircuitPropHash(){return Subcircuit_getSubcircuitPropHash(this)}doInitialRenderIsolatedSubcircuits(){Subcircuit_doInitialRenderIsolatedSubcircuits(this)}doInitialInflateSubcircuitCircuitJson(){let isolatedJson=this._isolatedCircuitJson;if(isolatedJson){this._isInflatedFromCircuitJson=!0,this._isolatedCircuitJson=null,inflateCircuitJson(this,isolatedJson,[]);return}let{circuitJson,children}=this._parsedProps;circuitJson&&(this._isInflatedFromCircuitJson=!0),inflateCircuitJson(this,circuitJson,children)}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,pcbBoardFromCircuitJson=props.circuitJson?.find(elm=>elm.type==="pcb_board"),computedWidth=props.width??pcbBoardFromCircuitJson?.width??0,computedHeight=props.height??pcbBoardFromCircuitJson?.height??0,globalPos=this._getGlobalPcbPositionBeforeLayout(),center2={x:globalPos.x+(props.outlineOffsetX??0),y:globalPos.y+(props.outlineOffsetY??0)},{boardAnchorPosition,boardAnchorAlignment}=props;if(boardAnchorPosition&&(center2=getBoardCenterFromAnchor({boardAnchorPosition,boardAnchorAlignment:boardAnchorAlignment??"center",width:computedWidth,height:computedHeight})),props.outline){let xValues=props.outline.map(point6=>point6.x),yValues=props.outline.map(point6=>point6.y),minX=Math.min(...xValues),maxX=Math.max(...xValues),minY=Math.min(...yValues),maxY=Math.max(...yValues);computedWidth=maxX-minX,computedHeight=maxY-minY}let outline=props.outline;!outline&&props.borderRadius!=null&&computedWidth>0&&computedHeight>0&&(outline=getRoundedRectOutline(computedWidth,computedHeight,props.borderRadius));let outlineTranslation={x:0,y:0};if(outline&&outline.length>0&&(this.parent?.lowercaseComponentName==="panel"||this.parent?.lowercaseComponentName==="subpanel")){let outlineBounds=getBoundsFromPoints(outline);if(outlineBounds){let outlineCenterX=(outlineBounds.minX+outlineBounds.maxX)/2,outlineCenterY=(outlineBounds.minY+outlineBounds.maxY)/2;outlineTranslation={x:center2.x-outlineCenterX,y:center2.y-outlineCenterY}}}let subcircuitProps2=this.getSubcircuit()._parsedProps,pcb_board3=db3.pcb_board.insert({source_board_id:this.source_board_id,center:center2,thickness:this.boardThickness,num_layers:this.allLayers.length,width:computedWidth,height:computedHeight,outline:outline?.map(point6=>({x:point6.x+(props.outlineOffsetX??0)+outlineTranslation.x,y:point6.y+(props.outlineOffsetY??0)+outlineTranslation.y})),material:props.material,min_trace_width:subcircuitProps2.minTraceWidth??jlcMinTolerances2.min_trace_width,min_via_hole_diameter:subcircuitProps2.minViaHoleDiameter??jlcMinTolerances2.min_via_hole_diameter,min_via_pad_diameter:subcircuitProps2.minViaPadDiameter??jlcMinTolerances2.min_via_pad_diameter,min_via_hole_edge_to_via_hole_edge_clearance:subcircuitProps2.minViaHoleEdgeToViaHoleEdgeClearance??jlcMinTolerances2.min_via_hole_edge_to_via_hole_edge_clearance,min_via_edge_to_pad_edge_clearance:subcircuitProps2.minViaEdgeToPadEdgeClearance??jlcMinTolerances2.min_via_edge_to_pad_edge_clearance,min_trace_to_pad_edge_clearance:subcircuitProps2.minTraceToPadEdgeClearance??jlcMinTolerances2.min_trace_to_pad_edge_clearance,min_pad_edge_to_pad_edge_clearance:subcircuitProps2.minPadEdgeToPadEdgeClearance??jlcMinTolerances2.min_pad_edge_to_pad_edge_clearance,min_plated_hole_drill_edge_to_drill_edge_clearance:subcircuitProps2.minPlatedHoleDrillEdgeToDrillEdgeClearance??jlcMinTolerances2.min_plated_hole_drill_edge_to_drill_edge_clearance,min_board_edge_clearance:subcircuitProps2.minBoardEdgeClearance??jlcMinTolerances2.min_board_edge_clearance});this.pcb_board_id=pcb_board3.pcb_board_id,this._addBoardInformationToSilkscreen()}removePcbComponentRender(){let{db:db3}=this.root;this.pcb_board_id&&(db3.pcb_board.delete(this.pcb_board_id),this.pcb_board_id=null)}doInitialPcbDesignRuleChecks(){this.root?.pcbDisabled||(super.doInitialPcbDesignRuleChecks(),this.updatePcbDesignRuleChecks())}updatePcbDesignRuleChecks(){let{db:db3}=this.root,routingDisabled=this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"),pcbDisabled=this.root?.pcbDisabled,drcChecksDisabled=this.root?.platform?.drcChecksDisabled??this.getInheritedProperty("drcChecksDisabled"),netlistDrcChecksDisabled=this.root?.platform?.netlistDrcChecksDisabled??this.getInheritedProperty("netlistDrcChecksDisabled"),pinSpecificationDrcChecksDisabled=this.getInheritedProperty("pinSpecificationDrcChecksDisabled"),placementDrcChecksDisabled=this.root?.platform?.placementDrcChecksDisabled??this.getInheritedProperty("placementDrcChecksDisabled"),routingDrcChecksDisabled=this.root?.platform?.routingDrcChecksDisabled??this.getInheritedProperty("routingDrcChecksDisabled"),shouldRunNetlistChecks=!drcChecksDisabled&&!netlistDrcChecksDisabled,shouldRunPinSpecificationChecks=!drcChecksDisabled&&!pinSpecificationDrcChecksDisabled,shouldRunPlacementChecks=!drcChecksDisabled&&!pcbDisabled&&!placementDrcChecksDisabled,shouldRunRoutingChecks=!drcChecksDisabled&&!pcbDisabled&&!routingDisabled&&!routingDrcChecksDisabled;if(shouldRunRoutingChecks&&this._hasIncompleteAsyncEffectsInSubtreeForPhase("PcbTraceRender"))return;let hasTracesToRoute=this._hasTracesToRoute();if(shouldRunRoutingChecks&&hasTracesToRoute&&!this._areChildSubcircuitsRouted()||this._drcChecksComplete||this._drcChecksInProgress)return;let runDrcChecks=async circuitJson=>{let checksToRun=[];if(shouldRunRoutingChecks&&checksToRun.push(runAllRoutingChecks(circuitJson)),shouldRunPlacementChecks&&checksToRun.push(runAllPlacementChecks(circuitJson)),shouldRunNetlistChecks&&checksToRun.push(runAllNetlistChecks(circuitJson)),shouldRunPinSpecificationChecks&&checksToRun.push(runAllPinSpecificationChecks(circuitJson)),!drcChecksDisabled)for(let drcCheck of this.selectAll("drccheck"))checksToRun.push(drcCheck.runCustomDrcCheck(circuitJson));let checkResults=await Promise.all(checksToRun);db3.insertAll(checkResults.flat())},subcircuitCircuitJson=db3.subtree({subcircuit_id:this.subcircuit_id}).toArray();this._drcChecksInProgress=!0,this._queueAsyncEffect("board:drc-checks",async()=>{try{await runDrcChecks(subcircuitCircuitJson),this._drcChecksComplete=!0}finally{this._drcChecksInProgress=!1}})}_emitRenderLifecycleEvent(phase,startOrEnd){super._emitRenderLifecycleEvent(phase,startOrEnd),startOrEnd==="start"&&this.root?.emit("board:renderPhaseStarted",{renderId:this._renderId,phase})}_repositionOnPcb(position4){let{db:db3}=this.root,pcbBoard=this.pcb_board_id?db3.pcb_board.get(this.pcb_board_id):null,oldPos=pcbBoard?.center;if(!oldPos){this.pcb_board_id&&db3.pcb_board.update(this.pcb_board_id,{center:position4});return}let deltaX=position4.x-oldPos.x,deltaY=position4.y-oldPos.y;if(!(Math.abs(deltaX)<1e-6&&Math.abs(deltaY)<1e-6)&&this.pcb_board_id&&(db3.pcb_board.update(this.pcb_board_id,{center:position4}),pcbBoard?.outline)){let outlineBounds=getBoundsFromPoints(pcbBoard.outline);if(outlineBounds){let oldOutlineCenter={x:(outlineBounds.minX+outlineBounds.maxX)/2,y:(outlineBounds.minY+outlineBounds.maxY)/2},outlineDeltaX=position4.x-oldOutlineCenter.x,outlineDeltaY=position4.y-oldOutlineCenter.y,newOutline=pcbBoard.outline.map(p5=>({x:p5.x+outlineDeltaX,y:p5.y+outlineDeltaY}));db3.pcb_board.update(this.pcb_board_id,{outline:newOutline})}}}},Subcircuit=class extends Group5{constructor(props){super({...props,subcircuit:!0})}getSubcircuitPropHash(){return Subcircuit_getSubcircuitPropHash(this)}doInitialRenderIsolatedSubcircuits(){Subcircuit_doInitialRenderIsolatedSubcircuits(this)}doInitialCreateNetsFromProps(){super.doInitialCreateNetsFromProps(),this._createTracesForExposedConnections()}_createTracesForExposedConnections(){let exposedNets=this._getNetNamesToExpose();if(!exposedNets?.length)return;let parentSubcircuit=this.parent?.getSubcircuit?.();if(parentSubcircuit&&this.name)for(let exposedNetName of exposedNets){let netName=normalizeExposedNetName(exposedNetName),parentNetSelector=`> net.${netName}`,childNetSelector=`.${this.name} > net.${netName}`;if(parentSubcircuit.children.find(child=>child instanceof Net&&child._parsedProps.name===netName)||parentSubcircuit.add(new Net({name:netName})),parentSubcircuit.children.find(child=>{if(!(child instanceof Trace3)||!child._exposesSubcircuitConnection)return!1;let childProps=child._parsedProps;return childProps.from===childNetSelector&&childProps.to===parentNetSelector}))continue;let trace=new Trace3({from:childNetSelector,to:parentNetSelector,displayName:netName});trace._exposesSubcircuitConnection=!0,parentSubcircuit.add(trace)}}_getNetNamesToExpose(){let explicitExposedNets=this._parsedProps.exposedNets??[];if(!this._parsedProps.exposeNets)return explicitExposedNets;let childNetNames=this.selectAll("net").filter(net=>net instanceof Net&&net.getSubcircuit()===this).map(net=>net._parsedProps.name);return Array.from(new Set([...explicitExposedNets,...childNetNames]))}doInitialInflateSubcircuitCircuitJson(){let isolatedJson=this._isolatedCircuitJson;if(isolatedJson){this._isInflatedFromCircuitJson=!0,this._isolatedCircuitJson=null,inflateCircuitJson(this,isolatedJson,[]);return}let{circuitJson,children}=this._parsedProps;circuitJson&&(this._isInflatedFromCircuitJson=!0),inflateCircuitJson(this,circuitJson,children)}},normalizeExposedNetName=netName=>netName.startsWith("net.")?netName.slice(4):netName,MountedBoard=class extends Subcircuit{constructor(){super(...arguments);__publicField(this,"pcb_board_id",null);__publicField(this,"_connectedSchematicPortPairs",new Set)}get config(){return{componentName:"MountedBoard",zodProps:mountedboardProps}}get boardThickness(){return 1.4}get allLayers(){return["top","bottom"]}_getBoardCalcVariables(){return this._findCarrierBoard()?._getBoardCalcVariables()??{}}_findCarrierBoard(){let current3=this.parent;for(;current3;){if(current3 instanceof Board)return current3;current3=current3.parent}return null}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalPcbPositionBeforeLayout(),pcb_board3=db3.pcb_board.insert({center:{x:globalPos.x,y:globalPos.y},width:props.width??0,height:props.height??0,is_mounted_to_carrier_board:!0});this.pcb_board_id=pcb_board3.pcb_board_id}doInitialPcbBoardAutoSize(){if(!this.pcb_board_id||!this.root)return;let carrierBoard=this._findCarrierBoard();carrierBoard?.pcb_board_id&&this.root.db.pcb_board.update(this.pcb_board_id,{carrier_pcb_board_id:carrierBoard.pcb_board_id})}},DEFAULT_TAB_LENGTH=5,DEFAULT_TAB_WIDTH=2,generateCutoutsAndMousebitesForOutline=(outline,options)=>{let{gapLength,cutoutWidth,mouseBites,mouseBiteHoleDiameter,mouseBiteHoleSpacing}=options,tabCutouts=[],mouseBiteHoles=[];if(outline.length<2)return{tabCutouts,mouseBiteHoles};let outlinePolygon=new Polygon$1(outline.map(p5=>point4(p5.x,p5.y))),is_ccw;if(outline.length>2){let p02=point4(outline[0].x,outline[0].y),p12=point4(outline[1].x,outline[1].y),segmentDir=vector$1(p02,p12).normalize(),normalToLeft=segmentDir.rotate(Math.PI/2),testPoint=p02.translate(segmentDir.multiply(segment(p02,p12).length/2)).translate(normalToLeft.multiply(.01));is_ccw=outlinePolygon.contains(testPoint)}else is_ccw=outlinePolygon.area()>0;for(let i3=0;i3<outline.length;i3++){let p1_=outline[i3],p2_=outline[(i3+1)%outline.length];if(!p1_||!p2_)continue;let p12=point4(p1_.x,p1_.y),p22=point4(p2_.x,p2_.y),segment2=segment(p12,p22),segmentLength=segment2.length;if(segmentLength<1e-6)continue;let segmentVec=vector$1(p12,p22),segmentDir=segmentVec.normalize(),normalVec=segmentDir.rotate(Math.PI/2),testPoint=segment2.middle().translate(normalVec.multiply(.01));outlinePolygon.contains(testPoint)&&(normalVec=normalVec.multiply(-1));let numBitesInGap=2,totalBitesLength=numBitesInGap*mouseBiteHoleDiameter+(numBitesInGap-1)*mouseBiteHoleSpacing,effectiveGapLength;mouseBites?effectiveGapLength=totalBitesLength:effectiveGapLength=gapLength,effectiveGapLength=Math.min(effectiveGapLength,segmentLength*.9);let gapStartDist=(segmentLength-effectiveGapLength)/2,gapEndDist=gapStartDist+effectiveGapLength;if(mouseBites){let holeAndSpacing=mouseBiteHoleDiameter+mouseBiteHoleSpacing;if(effectiveGapLength>=totalBitesLength&&holeAndSpacing>0){let firstBiteCenterOffsetInGap=(effectiveGapLength-totalBitesLength)/2+mouseBiteHoleDiameter/2,firstBiteDistFromP1=gapStartDist+firstBiteCenterOffsetInGap;for(let k5=0;k5<numBitesInGap;k5++){let biteDist=firstBiteDistFromP1+k5*holeAndSpacing,pos=p12.translate(segmentDir.multiply(biteDist));mouseBiteHoles.push({x:pos.x,y:pos.y})}}}let p_prev_=outline[(i3-1+outline.length)%outline.length],p_next_=outline[(i3+2)%outline.length],start_ext=0,end_ext=0;if(p_prev_&&p_next_){let vec_in_p1=vector$1(point4(p_prev_.x,p_prev_.y),p12),p1_cross=vec_in_p1.cross(segmentVec),is_p1_convex=is_ccw?p1_cross>1e-9:p1_cross<-1e-9,vec_out_p2=vector$1(p22,point4(p_next_.x,p_next_.y)),p2_cross=segmentVec.cross(vec_out_p2),is_p2_convex=is_ccw?p2_cross>1e-9:p2_cross<-1e-9;if(is_p1_convex){let angle=vec_in_p1.angleTo(segmentVec);angle>Math.PI&&(angle=2*Math.PI-angle),start_ext=cutoutWidth*Math.tan(angle/2)}else start_ext=0;if(is_p2_convex){let angle=segmentVec.angleTo(vec_out_p2);angle>Math.PI&&(angle=2*Math.PI-angle),end_ext=cutoutWidth*Math.tan(angle/2)}else end_ext=0}let cutoutParts=[{start:0-start_ext,end:gapStartDist},{start:gapEndDist,end:segmentLength+end_ext}],extrusion=normalVec.multiply(cutoutWidth);for(let part of cutoutParts){let partLength=part.end-part.start;if(partLength<1e-6)continue;let center2=p12.translate(segmentDir.multiply(part.start+partLength/2)).translate(extrusion.multiply(.5)),width=partLength,height=cutoutWidth,rotationDeg=segmentDir.slope*180/Math.PI;tabCutouts.push({type:"pcb_cutout",shape:"rect",center:{x:center2.x,y:center2.y},width,height,rotation:rotationDeg,corner_radius:cutoutWidth/2})}}return{tabCutouts,mouseBiteHoles}};function generatePanelTabsAndMouseBites(boards,options){let finalTabCutouts=[],allMouseBites=[],{tabWidth,tabLength,mouseBites:useMouseBites}=options,boardDimensions=[];for(let board of boards)if(board.width&&board.height)boardDimensions.push(Math.min(board.width,board.height));else if(board.outline&&board.outline.length>0){let outlinePolygon=new Polygon$1(board.outline.map(p5=>point4(p5.x,p5.y))),area=Math.abs(outlinePolygon.area());area>0&&boardDimensions.push(Math.sqrt(area))}if(boardDimensions.length>0){let scaleFactor=Math.min(...boardDimensions)/20;tabWidth=Math.min(tabWidth,DEFAULT_TAB_WIDTH*Math.max(scaleFactor,.3)),tabLength=Math.min(tabLength,DEFAULT_TAB_LENGTH*Math.max(scaleFactor,.3))}let processedBoards=boards.map(board=>{if((!board.outline||board.outline.length===0)&&board.width&&board.height){let w22=board.width/2,h22=board.height/2;return{...board,outline:[{x:board.center.x-w22,y:board.center.y-h22},{x:board.center.x+w22,y:board.center.y-h22},{x:board.center.x+w22,y:board.center.y+h22},{x:board.center.x-w22,y:board.center.y+h22}]}}return board});for(let board of processedBoards)if(board.outline&&board.outline.length>0){let mouseBiteDiameter2=tabWidth*.45,mouseBiteSpacing=mouseBiteDiameter2*.1,generated=generateCutoutsAndMousebitesForOutline(board.outline,{gapLength:tabLength,cutoutWidth:tabWidth,mouseBites:useMouseBites,mouseBiteHoleDiameter:mouseBiteDiameter2,mouseBiteHoleSpacing:mouseBiteSpacing});finalTabCutouts.push(...generated.tabCutouts),allMouseBites.push(...generated.mouseBiteHoles)}let tabCutouts=finalTabCutouts.map((tab,index)=>({...tab,pcb_cutout_id:`panel_tab_${index}`})),mouseBiteDiameter=tabWidth*.45,mouseBiteHoles=allMouseBites.map((bite,index)=>({type:"pcb_hole",pcb_hole_id:`panel_mouse_bite_${index}`,hole_shape:"circle",hole_diameter:mouseBiteDiameter,x:bite.x,y:bite.y}));return{tabCutouts,mouseBiteHoles}}var getBoardDimensionsFromProps=board=>{let props=board._parsedProps,width=props.width!=null?distance.parse(props.width):void 0,height=props.height!=null?distance.parse(props.height):void 0;if((width===void 0||height===void 0)&&props.outline?.length){let outlineBounds=getBoundsFromPoints(props.outline);outlineBounds&&(width??(width=outlineBounds.maxX-outlineBounds.minX),height??(height=outlineBounds.maxY-outlineBounds.minY))}if((width===void 0||height===void 0)&&props.circuitJson?.length){let pcbBoardFromJson=props.circuitJson.find(elm=>elm.type==="pcb_board");pcbBoardFromJson&&(width??(width=pcbBoardFromJson.width),height??(height=pcbBoardFromJson.height))}return{width:width??0,height:height??0}};function packIntoGrid({items,db:db3,row,col,cellWidth,cellHeight,boardGap,availablePanelWidth,availablePanelHeight}){let itemsWithDims=items.map(item=>{let dims=getItemDimensions(item,db3);return{item,width:dims.width,height:dims.height}}).filter(item=>!(item.width===0&&item.height===0));if(itemsWithDims.length===0)return{positions:[],gridWidth:0,gridHeight:0};let cols,rows,minCellWidth=cellWidth?distance.parse(cellWidth):0,minCellHeight=cellHeight?distance.parse(cellHeight):0;if(col!==void 0)cols=col,rows=row??Math.ceil(itemsWithDims.length/cols);else if(row!==void 0)rows=row,cols=Math.ceil(itemsWithDims.length/rows);else if(availablePanelWidth!==void 0&&availablePanelHeight!==void 0){let maxItemWidth=Math.max(...itemsWithDims.map(b4=>b4.width),minCellWidth),maxItemHeight=Math.max(...itemsWithDims.map(b4=>b4.height),minCellHeight),maxCols=Math.max(1,Math.floor((availablePanelWidth+boardGap)/(maxItemWidth+boardGap))),maxRows=Math.max(1,Math.floor((availablePanelHeight+boardGap)/(maxItemHeight+boardGap)));cols=maxCols,rows=Math.ceil(itemsWithDims.length/cols),rows>maxRows&&(rows=maxRows,cols=Math.ceil(itemsWithDims.length/rows),cols>maxCols&&(cols=maxCols,rows=Math.ceil(itemsWithDims.length/cols))),cols=Math.max(1,cols),rows=Math.max(1,rows)}else cols=Math.ceil(Math.sqrt(itemsWithDims.length)),rows=Math.ceil(itemsWithDims.length/cols);let colWidths=Array(cols).fill(0),rowHeights=Array(rows).fill(0);itemsWithDims.forEach((item,i3)=>{let colIdx=i3%cols,rowIdx=Math.floor(i3/cols);rowIdx<rowHeights.length&&item.height>rowHeights[rowIdx]&&(rowHeights[rowIdx]=item.height),colIdx<colWidths.length&&item.width>colWidths[colIdx]&&(colWidths[colIdx]=item.width)});for(let i3=0;i3<colWidths.length;i3++)colWidths[i3]=Math.max(colWidths[i3],minCellWidth);for(let i3=0;i3<rowHeights.length;i3++)rowHeights[i3]=Math.max(rowHeights[i3],minCellHeight);let gridWidth=colWidths.reduce((a3,b4)=>a3+b4,0)+(cols>1?(cols-1)*boardGap:0),gridHeight=rowHeights.reduce((a3,b4)=>a3+b4,0)+(rows>1?(rows-1)*boardGap:0),startX=-gridWidth/2,startY=-gridHeight/2,colXOffsets=[startX];for(let i3=1;i3<cols;i3++)colXOffsets.push(colXOffsets[i3-1]+colWidths[i3-1]+boardGap);let rowYOffsets=[startY];for(let i3=1;i3<rows;i3++)rowYOffsets.push(rowYOffsets[i3-1]+rowHeights[i3-1]+boardGap);let positions=[];return itemsWithDims.forEach((itemWithDims,i3)=>{let colIdx=i3%cols,rowIdx=Math.floor(i3/cols);if(rowIdx>=rowYOffsets.length||colIdx>=colXOffsets.length)return;let x4=colXOffsets[colIdx]+colWidths[colIdx]/2,y3=rowYOffsets[rowIdx]+rowHeights[rowIdx]/2;positions.push({item:itemWithDims.item,pos:{x:x4,y:y3}})}),{positions,gridWidth,gridHeight}}function getItemDimensions(item,db3){if(item.componentName==="Board"){let board=item;if(db3&&board.pcb_board_id){let pcbBoard=db3.pcb_board.get(board.pcb_board_id);if(pcbBoard?.width!==void 0&&pcbBoard?.height!==void 0)return{width:pcbBoard.width,height:pcbBoard.height}}return getBoardDimensionsFromProps(board)}if(item.componentName==="Subpanel"){let subpanel=item,props=subpanel._parsedProps;if(props.width!==void 0&&props.height!==void 0)return{width:distance.parse(props.width),height:distance.parse(props.height)};let directBoards=subpanel._getDirectBoardChildren();if(directBoards.length===0){let allBoards=subpanel._getAllBoardInstances();if(allBoards.length===0)return{width:0,height:0};let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let board of allBoards){let dims=getBoardDimensionsFromProps(board);if(dims.width===0||dims.height===0)continue;let offset=board._panelPositionOffset??{x:0,y:0};minX=Math.min(minX,offset.x-dims.width/2),maxX=Math.max(maxX,offset.x+dims.width/2),minY=Math.min(minY,offset.y-dims.height/2),maxY=Math.max(maxY,offset.y+dims.height/2)}return minX===1/0?{width:0,height:0}:{width:maxX-minX,height:maxY-minY}}if(directBoards.length===1)return getBoardDimensionsFromProps(directBoards[0]);if(subpanel._cachedGridWidth>0&&subpanel._cachedGridHeight>0){let edgePadding=distance.parse(props.edgePadding??5);return{width:subpanel._cachedGridWidth+edgePadding*2,height:subpanel._cachedGridHeight+edgePadding*2}}let totalWidth=0,totalHeight=0;for(let board of directBoards){let dims=getBoardDimensionsFromProps(board);totalWidth=Math.max(totalWidth,dims.width),totalHeight=Math.max(totalHeight,dims.height)}return{width:totalWidth,height:totalHeight}}return{width:0,height:0}}var Subpanel=class _Subpanel extends Group5{constructor(){super(...arguments);__publicField(this,"pcb_panel_id",null);__publicField(this,"_tabsAndMouseBitesGenerated",!1);__publicField(this,"_cachedGridWidth",0);__publicField(this,"_cachedGridHeight",0);__publicField(this,"_panelPositionOffset",null)}get config(){return{componentName:"Subpanel",zodProps:subpanelProps}}get _errorComponentName(){return this.componentName.toLowerCase()}get isGroup(){return!0}get isSubcircuit(){return!0}_getPcbLayoutMode(){return"none"}doInitialSchematicComponentRender(){}doInitialSchematicLayout(){}doInitialSchematicTraceRender(){}add(component){if(component.lowercaseComponentName!=="board"&&component.lowercaseComponentName!=="subpanel")throw new Error(`<${this._errorComponentName}> can only contain <board> or <subpanel> elements`);super.add(component)}_computePcbGlobalTransformBeforeLayout(){if(this._panelPositionOffset){let parentTransform=this.parent?._computePcbGlobalTransformBeforeLayout?.()??identity();return compose2(parentTransform,translate2(this._panelPositionOffset.x,this._panelPositionOffset.y))}return super._computePcbGlobalTransformBeforeLayout()}_getAllBoardInstances(){let boards=[];for(let child of this.children)child instanceof Board?boards.push(child):child instanceof _Subpanel&&boards.push(...child._getAllBoardInstances());return boards}_containsBoards(){for(let child of this.children)if(child.componentName==="Board"||child.componentName==="Subpanel"&&"_containsBoards"in child&&child._containsBoards())return!0;return!1}_getDirectBoardChildren(){return this.children.filter(c6=>c6 instanceof Board)}doInitialPanelBoardLayout(){if(this.root?.pcbDisabled)return;let layoutMode=this._parsedProps.layoutMode??"none",gridItems=this.children.filter(c6=>c6 instanceof Board||c6 instanceof _Subpanel);if(layoutMode!=="none")for(let child of gridItems)child instanceof Board&&child._hasUserDefinedPcbPosition()&&this.root.db.source_property_ignored_warning.insert({source_component_id:child.source_component_id,property_name:"pcbX/pcbY",message:`Board has manual positioning but ${this._errorComponentName} layout mode is "${layoutMode}". Manual positioning will be ignored.`,error_type:"source_property_ignored_warning"});if(layoutMode==="none"&&gridItems.length>1&&gridItems.filter(c6=>!c6._hasUserDefinedPcbPosition()).length>1&&this.root.db.pcb_placement_error.insert({error_type:"pcb_placement_error",message:`Multiple boards/subpanels in ${this._errorComponentName} without positions. When layoutMode="none", each item must have explicit positioning. Use layoutMode="grid" for automatic positioning.`}),layoutMode!=="grid")return;let tabWidth=this._parsedProps.tabWidth??DEFAULT_TAB_WIDTH,boardGap=this._parsedProps.boardGap??tabWidth,availablePanelWidth,availablePanelHeight,hasExplicitRowOrCol=this._parsedProps.row!==void 0||this._parsedProps.col!==void 0,hasExplicitWidth=this._parsedProps.width!==void 0,hasExplicitHeight=this._parsedProps.height!==void 0;if(!hasExplicitRowOrCol&&hasExplicitWidth&&hasExplicitHeight){let{edgePadding:edgePaddingProp,edgePaddingLeft:edgePaddingLeftProp,edgePaddingRight:edgePaddingRightProp,edgePaddingTop:edgePaddingTopProp,edgePaddingBottom:edgePaddingBottomProp}=this._parsedProps,edgePadding=distance.parse(edgePaddingProp??5),edgePaddingLeft=distance.parse(edgePaddingLeftProp??edgePadding),edgePaddingRight=distance.parse(edgePaddingRightProp??edgePadding),edgePaddingTop=distance.parse(edgePaddingTopProp??edgePadding),edgePaddingBottom=distance.parse(edgePaddingBottomProp??edgePadding),panelWidth=distance.parse(this._parsedProps.width),panelHeight=distance.parse(this._parsedProps.height);availablePanelWidth=panelWidth-edgePaddingLeft-edgePaddingRight,availablePanelHeight=panelHeight-edgePaddingTop-edgePaddingBottom}let{positions,gridWidth,gridHeight}=packIntoGrid({items:gridItems,row:this._parsedProps.row,col:this._parsedProps.col,cellWidth:this._parsedProps.cellWidth,cellHeight:this._parsedProps.cellHeight,boardGap,availablePanelHeight,availablePanelWidth});this._cachedGridWidth=gridWidth,this._cachedGridHeight=gridHeight;for(let{item,pos}of positions)item._panelPositionOffset=pos}doInitialPanelLayout(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if((this._parsedProps.layoutMode??"none")==="grid"){for(let child of this.children)if(child instanceof Board){if(!child.pcb_board_id||!child._panelPositionOffset)continue;db3.pcb_board.update(child.pcb_board_id,{position_mode:"relative_to_panel_anchor",display_offset_x:`${child._panelPositionOffset.x}mm`,display_offset_y:`${child._panelPositionOffset.y}mm`})}else if(child instanceof _Subpanel&&child._panelPositionOffset)for(let board of child._getAllBoardInstances()){if(!board.pcb_board_id)continue;let boardOffset=board._panelPositionOffset??{x:0,y:0};db3.pcb_board.update(board.pcb_board_id,{position_mode:"relative_to_panel_anchor",display_offset_x:`${child._panelPositionOffset.x+boardOffset.x}mm`,display_offset_y:`${child._panelPositionOffset.y+boardOffset.y}mm`})}this._updatePanelDimensions()}else{let panelGlobalPos=this._getGlobalPcbPositionBeforeLayout();for(let board of this._getDirectBoardChildren()){if(!board.pcb_board_id)continue;let boardDb=db3.pcb_board.get(board.pcb_board_id);if(!boardDb)continue;let relativeX=boardDb.center.x-panelGlobalPos.x,relativeY=boardDb.center.y-panelGlobalPos.y;db3.pcb_board.update(board.pcb_board_id,{position_mode:"relative_to_panel_anchor",display_offset_x:`${relativeX}mm`,display_offset_y:`${relativeY}mm`})}}this._generateTabsAndMouseBites()}_updatePanelDimensions(){let{db:db3}=this.root,hasExplicitWidth=this._parsedProps.width!==void 0,hasExplicitHeight=this._parsedProps.height!==void 0,gridWidth=this._cachedGridWidth,gridHeight=this._cachedGridHeight;if(this.pcb_group_id){if(hasExplicitWidth&&hasExplicitHeight)db3.pcb_group.update(this.pcb_group_id,{width:distance.parse(this._parsedProps.width),height:distance.parse(this._parsedProps.height)});else if(gridWidth>0||gridHeight>0){let{edgePadding:edgePaddingProp,edgePaddingLeft:edgePaddingLeftProp,edgePaddingRight:edgePaddingRightProp,edgePaddingTop:edgePaddingTopProp,edgePaddingBottom:edgePaddingBottomProp}=this._parsedProps,edgePadding=distance.parse(edgePaddingProp??5),edgePaddingLeft=distance.parse(edgePaddingLeftProp??edgePadding),edgePaddingRight=distance.parse(edgePaddingRightProp??edgePadding),edgePaddingTop=distance.parse(edgePaddingTopProp??edgePadding),edgePaddingBottom=distance.parse(edgePaddingBottomProp??edgePadding);db3.pcb_group.update(this.pcb_group_id,{width:hasExplicitWidth?distance.parse(this._parsedProps.width):gridWidth+edgePaddingLeft+edgePaddingRight,height:hasExplicitHeight?distance.parse(this._parsedProps.height):gridHeight+edgePaddingTop+edgePaddingBottom})}}}_generateTabsAndMouseBites(){if(this._tabsAndMouseBitesGenerated)return;let{db:db3}=this.root,props=this._parsedProps,panelizationMethod=props.panelizationMethod??"none",childBoardInstances=this._getAllBoardInstances();if(panelizationMethod!=="none"){let childBoardIds=childBoardInstances.map(c6=>c6.pcb_board_id).filter(id3=>!!id3),boardsInPanel=db3.pcb_board.list().filter(b4=>childBoardIds.includes(b4.pcb_board_id));if(boardsInPanel.length===0)return;let tabWidth=props.tabWidth??DEFAULT_TAB_WIDTH,boardGap=props.boardGap??tabWidth,{tabCutouts,mouseBiteHoles}=generatePanelTabsAndMouseBites(boardsInPanel,{boardGap,tabWidth,tabLength:props.tabLength??DEFAULT_TAB_LENGTH,mouseBites:props.mouseBites??!0});for(let tabCutout of tabCutouts)db3.pcb_cutout.insert(tabCutout);for(let mouseBiteHole of mouseBiteHoles)db3.pcb_hole.insert(mouseBiteHole)}this._tabsAndMouseBitesGenerated=!0}doInitialPcbComponentRender(){if(!this.root?.pcbDisabled){if(!this._containsBoards())throw new Error(`<${this._errorComponentName}> must contain at least one <board>`);super.doInitialPcbComponentRender()}}},Panel=class extends Subpanel{get config(){return{componentName:"Panel",zodProps:panelProps}}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;if(!this._containsBoards())throw new Error(`<${this._errorComponentName}> must contain at least one <board>`);let{db:db3}=this.root,props=this._parsedProps,inserted=db3.pcb_panel.insert({width:props.width!==void 0?distance.parse(props.width):0,height:props.height!==void 0?distance.parse(props.height):0,thickness:1.6,center:this._getGlobalPcbPositionBeforeLayout(),covered_with_solder_mask:!(props.noSolderMask??!1)});this.pcb_panel_id=inserted.pcb_panel_id}_updatePanelDimensions(){let{db:db3}=this.root,hasExplicitWidth=this._parsedProps.width!==void 0,hasExplicitHeight=this._parsedProps.height!==void 0,gridWidth=this._cachedGridWidth,gridHeight=this._cachedGridHeight;if(this.pcb_panel_id){if(hasExplicitWidth&&hasExplicitHeight)db3.pcb_panel.update(this.pcb_panel_id,{width:distance.parse(this._parsedProps.width),height:distance.parse(this._parsedProps.height)});else if(gridWidth>0||gridHeight>0){let{edgePadding:edgePaddingProp,edgePaddingLeft:edgePaddingLeftProp,edgePaddingRight:edgePaddingRightProp,edgePaddingTop:edgePaddingTopProp,edgePaddingBottom:edgePaddingBottomProp}=this._parsedProps,edgePadding=distance.parse(edgePaddingProp??5),edgePaddingLeft=distance.parse(edgePaddingLeftProp??edgePadding),edgePaddingRight=distance.parse(edgePaddingRightProp??edgePadding),edgePaddingTop=distance.parse(edgePaddingTopProp??edgePadding),edgePaddingBottom=distance.parse(edgePaddingBottomProp??edgePadding);db3.pcb_panel.update(this.pcb_panel_id,{width:hasExplicitWidth?distance.parse(this._parsedProps.width):gridWidth+edgePaddingLeft+edgePaddingRight,height:hasExplicitHeight?distance.parse(this._parsedProps.height):gridHeight+edgePaddingTop+edgePaddingBottom})}}}updatePcbComponentRender(){if(this.root?.pcbDisabled||!this.pcb_panel_id)return;let{db:db3}=this.root,props=this._parsedProps,currentPanel=db3.pcb_panel.get(this.pcb_panel_id);db3.pcb_panel.update(this.pcb_panel_id,{width:props.width!==void 0?distance.parse(props.width):currentPanel?.width,height:props.height!==void 0?distance.parse(props.height):currentPanel?.height,center:this._getGlobalPcbPositionBeforeLayout(),covered_with_solder_mask:!(props.noSolderMask??!1)})}removePcbComponentRender(){this.pcb_panel_id&&(this.root?.db.pcb_panel.delete(this.pcb_panel_id),this.pcb_panel_id=null)}},Pinout=class extends Chip{constructor(props){super(props)}get config(){return{...super.config,componentName:"Pinout",zodProps:pinoutProps}}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({ftype:"simple_pinout",name:this.name,manufacturer_part_number:props.manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},Fuse=class extends NormalComponent3{get config(){return{componentName:"fuse",schematicSymbolName:this.props.symbolName??"fuse",zodProps:fuseProps,sourceFtype:FTYPE.simple_fuse}}_getSchematicSymbolDisplayValue(){let rawCurrent=this._parsedProps.currentRating,rawVoltage=this._parsedProps.voltageRating,current3=typeof rawCurrent=="string"?parseFloat(rawCurrent):rawCurrent,voltage3=typeof rawVoltage=="string"?parseFloat(rawVoltage):rawVoltage;return`${formatSiUnit(current3)}A / ${formatSiUnit(voltage3)}V`}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,currentRating=typeof props.currentRating=="string"?parseFloat(props.currentRating):props.currentRating,voltageRating=typeof props.voltageRating=="string"?parseFloat(props.voltageRating):props.voltageRating,source_component=db3.source_component.insert({name:this.name,ftype:FTYPE.simple_fuse,current_rating_amps:currentRating,voltage_rating_volts:voltageRating,display_current_rating:`${formatSiUnit(currentRating)}A`,display_voltage_rating:`${formatSiUnit(voltageRating)}V`,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},Jumper=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"schematicDimensions",null)}get config(){return{schematicSymbolName:void 0,componentName:"Jumper",zodProps:jumperProps,shouldRenderAsSchematicBox:!0}}_getSchematicPortArrangement(){let arrangement=super._getSchematicPortArrangement();if(arrangement&&Object.keys(arrangement).length>0)return arrangement;let pinCount=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:this.getPortsFromFootprint().length),direction2=this._parsedProps.schDirection??"right";return{leftSize:direction2==="left"?pinCount:0,rightSize:direction2==="right"?pinCount:0}}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),source_component=db3.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:props.manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),globalTransformRotation=this.getGlobalTransformRotation(),pcb_component3=db3.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:props.layer??"top",rotation:props.pcbRotation??globalTransformRotation,insertion_direction:this._getPcbComponentInsertionDirection(props.layer??"top",globalTransformRotation),source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0});this.pcb_component_id=pcb_component3.pcb_component_id}doInitialPcbTraceRender(){let{db:db3}=this.root,pcb_ports=db3.pcb_port.list({pcb_component_id:this.pcb_component_id}),pinLabelToPortId={};for(let i3=0;i3<pcb_ports.length;i3++){let port=pcb_ports[i3],sourcePort=db3.source_port.get(port.source_port_id),pinLabel="";if(typeof sourcePort?.pin_number=="number")pinLabel=sourcePort.pin_number.toString();else if(Array.isArray(sourcePort?.port_hints)){let matchedHint=sourcePort.port_hints.find(h3=>/^(pin)?\d+$/.test(h3));matchedHint&&(/^pin\d+$/.test(matchedHint)?pinLabel=matchedHint.replace(/^pin/,""):pinLabel=matchedHint)}pinLabelToPortId[pinLabel]=port.pcb_port_id}let traces=db3.pcb_trace.list({pcb_component_id:this.pcb_component_id}),updatePortId=portId=>{if(portId&&typeof portId=="string"&&portId.startsWith("{PIN")){let pin=portId.replace("{PIN","").replace("}","");return pinLabelToPortId[pin]||portId}return portId};for(let trace of traces)if(trace.route)for(let segment2 of trace.route)segment2.route_type==="wire"&&(segment2.start_pcb_port_id=updatePortId(segment2.start_pcb_port_id),segment2.end_pcb_port_id=updatePortId(segment2.end_pcb_port_id))}},INTERCONNECT_STANDARD_FOOTPRINTS={"0402":"0402","0603":"0603","0805":"0805",1206:"1206"},Interconnect=class extends NormalComponent3{get config(){return{componentName:"Interconnect",zodProps:interconnectProps,shouldRenderAsSchematicBox:!0,sourceFtype:"interconnect"}}get defaultInternallyConnectedPinNames(){let{standard}=this._parsedProps;return standard&&INTERCONNECT_STANDARD_FOOTPRINTS[standard]?[["pin1","pin2"]]:[]}_getImpliedFootprintString(){let{standard}=this._parsedProps;return standard?INTERCONNECT_STANDARD_FOOTPRINTS[standard]??null:null}doInitialSourceRender(){let{db:db3}=this.root,source_component=db3.source_component.insert({ftype:"interconnect",name:this.name,are_pins_interchangeable:!0,display_name:this._parsedProps.displayName});this.source_component_id=source_component.source_component_id}doInitialSourceParentAttachment(){let{db:db3}=this.root,internallyConnectedPorts=this._getInternallyConnectedPins();for(let ports of internallyConnectedPorts){let sourcePortIds=ports.map(port=>port.source_port_id).filter(id3=>id3!==null);sourcePortIds.length>=2&&db3.source_component_internal_connection.insert({source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id,source_port_ids:sourcePortIds})}}},SolderJumper=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"schematicDimensions",null)}_getPinCountFromFootprintString(footprint){let match2=footprint.match(/^solderjumper([23])(?:_|$)/);return match2?Number(match2[1]):null}_getPinNumberFromBridgedPinsProp(pinName){let numericPinMatch=pinName.match(/^(?:pin)?(\d+)$/i);if(numericPinMatch)return Number(numericPinMatch[1]);let pinLabels=this._parsedProps.pinLabels??this.props.pinLabels;if(Array.isArray(pinLabels)){let labelIndex=pinLabels.findIndex(label=>label===pinName);return labelIndex>=0?labelIndex+1:null}if(pinLabels&&typeof pinLabels=="object")for(let[pinKey,labelOrLabels]of Object.entries(pinLabels)){if(!(Array.isArray(labelOrLabels)?labelOrLabels:[labelOrLabels]).includes(pinName))continue;let pinNumberMatch=pinKey.match(/^(?:pin)?(\d+)$/i);return pinNumberMatch?Number(pinNumberMatch[1]):null}return null}_getBridgedPinNumbersForFootprint(pinCount){let props=this._parsedProps??this.props;return Array.isArray(props.bridgedPins)&&props.bridgedPins.length>0?Array.from(new Set(props.bridgedPins.flat().map(pinName=>this._getPinNumberFromBridgedPinsProp(pinName)).filter(pinNumber=>pinNumber!==null&&pinNumber>=1&&pinNumber<=pinCount))).sort((a3,b4)=>a3-b4):props.bridged?Array.from({length:pinCount},(_3,index)=>index+1):[]}resolveFootprint(){let footprint=super.resolveFootprint();if(typeof footprint!="string")return footprint;let pinCount=this._getPinCountFromFootprintString(footprint);if(!pinCount||/_bridged\d+/.test(footprint))return footprint;let bridgedPinNumbers=this._getBridgedPinNumbersForFootprint(pinCount);return bridgedPinNumbers.length===0?footprint:footprint.replace(/^solderjumper[23]/,`solderjumper${pinCount}_bridged${bridgedPinNumbers.join("")}`)}_getPinNumberFromBridgedPinName(pinName){return this.selectOne(`port.${pinName}`,{type:"port"})?._parsedProps.pinNumber??null}get defaultInternallyConnectedPinNames(){if(this._parsedProps.bridged){let pins=this.children.filter(c6=>c6.componentName==="Port").map(p5=>p5.name);return pins.length>0?[pins]:[]}return this._parsedProps.bridgedPins??[]}get config(){let props=this._parsedProps??this.props,resolvedPinCount=props.pinCount;if(props.pinCount==null&&!props.footprint&&(resolvedPinCount=2),props.pinCount==null){let nums=(props.bridgedPins??[]).flat().map(p_str=>this._getPinNumberFromBridgedPinName(p_str)).filter(n3=>n3!==null),maxPinFromBridged=nums.length>0?Math.max(...nums):0,pinCountFromLabels=props.pinLabels?Object.keys(props.pinLabels).length:0,finalPinCount=Math.max(maxPinFromBridged,pinCountFromLabels);(finalPinCount===2||finalPinCount===3)&&(resolvedPinCount=finalPinCount),resolvedPinCount==null&&props.footprint&&[2,3].includes(this.getPortsFromFootprint().length)&&(resolvedPinCount=this.getPortsFromFootprint().length)}let symbolName="";resolvedPinCount?symbolName+=`solderjumper${resolvedPinCount}`:symbolName="solderjumper";let bridgedPinNumbers=[];return Array.isArray(props.bridgedPins)&&props.bridgedPins.length>0?bridgedPinNumbers=Array.from(new Set(props.bridgedPins.flat().map(pinName=>this._getPinNumberFromBridgedPinName(pinName)).filter(n3=>n3!==null))).sort((a3,b4)=>a3-b4):props.bridged&&resolvedPinCount&&(bridgedPinNumbers=Array.from({length:resolvedPinCount},(_3,i3)=>i3+1)),bridgedPinNumbers.length>0&&(symbolName+=`_bridged${bridgedPinNumbers.join("")}`),{schematicSymbolName:props.symbolName??symbolName,componentName:"SolderJumper",zodProps:solderjumperProps,shouldRenderAsSchematicBox:!0}}_getSchematicPortArrangement(){let arrangement=super._getSchematicPortArrangement();if(arrangement&&Object.keys(arrangement).length>0)return arrangement;let pinCount=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:this.getPortsFromFootprint().length);pinCount==null&&!this._parsedProps.footprint&&(pinCount=2);let direction2=this._parsedProps.schDirection??"right";return{leftSize:direction2==="left"?pinCount:0,rightSize:direction2==="right"?pinCount:0}}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),source_component=db3.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:props.manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),globalTransformRotation=this.getGlobalTransformRotation(),pcb_component3=db3.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:props.layer??"top",rotation:props.pcbRotation??globalTransformRotation,insertion_direction:this._getPcbComponentInsertionDirection(props.layer??"top",globalTransformRotation),source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0});this.pcb_component_id=pcb_component3.pcb_component_id}doInitialPcbTraceRender(){let{db:db3}=this.root,pcb_ports=db3.pcb_port.list({pcb_component_id:this.pcb_component_id}),pinLabelToPortId={};for(let i3=0;i3<pcb_ports.length;i3++){let port=pcb_ports[i3],sourcePort=db3.source_port.get(port.source_port_id),pinLabel="";if(typeof sourcePort?.pin_number=="number")pinLabel=sourcePort.pin_number.toString();else if(Array.isArray(sourcePort?.port_hints)){let matchedHint=sourcePort.port_hints.find(h3=>/^(pin)?\d+$/.test(h3));matchedHint&&(/^pin\d+$/.test(matchedHint)?pinLabel=matchedHint.replace(/^pin/,""):pinLabel=matchedHint)}pinLabelToPortId[pinLabel]=port.pcb_port_id}let traces=db3.pcb_trace.list({pcb_component_id:this.pcb_component_id}),updatePortId=portId=>{if(portId&&typeof portId=="string"&&portId.startsWith("{PIN")){let pin=portId.replace("{PIN","").replace("}","");return pinLabelToPortId[pin]||portId}return portId};for(let trace of traces)if(trace.route)for(let segment2 of trace.route)segment2.route_type==="wire"&&(segment2.start_pcb_port_id=updatePortId(segment2.start_pcb_port_id),segment2.end_pcb_port_id=updatePortId(segment2.end_pcb_port_id))}},PowerSource=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pin1);__publicField(this,"positive",this.portMap.pin1);__publicField(this,"neg",this.portMap.pin2);__publicField(this,"negative",this.portMap.pin2)}get config(){return{schematicSymbolName:this.props.symbolName??"power_factor_meter_horz",componentName:"PowerSource",zodProps:powerSourceProps,sourceFtype:"simple_power_source"}}initPorts(){this.add(new Port({name:"pin1",pinNumber:1,aliases:["positive","pos"]})),this.add(new Port({name:"pin2",pinNumber:2,aliases:["negative","neg"]}))}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({ftype:"simple_power_source",name:this.name,voltage:props.voltage,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},VoltageSource2=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"terminal1",this.portMap.terminal1);__publicField(this,"terminal2",this.portMap.terminal2)}get config(){return{componentName:"VoltageSource",schematicSymbolName:this.props.waveShape==="square"?"square_wave":"ac_voltmeter",zodProps:voltageSourceProps,sourceFtype:"simple_voltage_source"}}runRenderPhaseForChildren(phase){if(!phase.startsWith("Pcb"))for(let child of this.children)child.runRenderPhaseForChildren(phase),child.runRenderPhase(phase)}doInitialPcbComponentRender(){let hasExplicitPcbPosition=this._hasUserDefinedPcbPosition();if(!this._parsedProps.footprint){if(!hasExplicitPcbPosition)return;throw new Error("VoltageSource requires a footprint when pcbX/pcbY or pcb edge position props are used")}super.doInitialPcbComponentRender()}initPorts(){super.initPorts({additionalAliases:{pin1:["terminal1"],pin2:["terminal2"]}})}_getSchematicSymbolDisplayValue(){let{voltage:voltage3,frequency:frequency22}=this._parsedProps,parts=[];return voltage3!==void 0&&parts.push(`${formatSiUnit(voltage3)}V`),frequency22!==void 0&&parts.push(`${formatSiUnit(frequency22)}Hz`),parts.length>0?parts.join(" "):void 0}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({ftype:"simple_voltage_source",name:this.name,voltage:props.voltage,frequency:props.frequency,peak_to_peak_voltage:props.peakToPeakVoltage,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle,pulse_delay:props.pulseDelay,rise_time:props.riseTime,fall_time:props.fallTime,pulse_width:props.pulseWidth,period:props.period,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db3}=this.root,{_parsedProps:props}=this,terminal1Port=this.portMap.terminal1,terminal2Port=this.portMap.terminal2;db3.simulation_voltage_source.insert({type:"simulation_voltage_source",is_dc_source:!1,terminal1_source_port_id:terminal1Port.source_port_id,terminal2_source_port_id:terminal2Port.source_port_id,voltage:props.voltage,frequency:props.frequency,peak_to_peak_voltage:props.peakToPeakVoltage,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle,pulse_delay:props.pulseDelay,rise_time:props.riseTime,fall_time:props.fallTime,pulse_width:props.pulseWidth,period:props.period})}},CurrentSource2=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pos);__publicField(this,"neg",this.portMap.neg)}get config(){return{componentName:"CurrentSource",schematicSymbolName:"current_source",zodProps:currentSourceProps,sourceFtype:"simple_current_source"}}runRenderPhaseForChildren(phase){if(!phase.startsWith("Pcb"))for(let child of this.children)child.runRenderPhaseForChildren(phase),child.runRenderPhase(phase)}doInitialPcbComponentRender(){let hasExplicitPcbPosition=this._hasUserDefinedPcbPosition();if(!this._parsedProps.footprint){if(!hasExplicitPcbPosition)return;throw new Error("CurrentSource requires a footprint when pcbX/pcbY or pcb edge position props are used")}super.doInitialPcbComponentRender()}initPorts(){super.initPorts({additionalAliases:{pin1:["pos"],pin2:["neg"]}})}_getSchematicSymbolDisplayValue(){let{current:current3,frequency:frequency22,peakToPeakCurrent}=this._parsedProps,parts=[];return current3!==void 0&&parts.push(`${formatSiUnit(current3)}A`),peakToPeakCurrent!==void 0&&parts.push(`${formatSiUnit(peakToPeakCurrent)}A p-p`),frequency22!==void 0&&parts.push(`${formatSiUnit(frequency22)}Hz`),parts.length>0?parts.join(" "):void 0}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({ftype:"simple_current_source",name:this.name,current:props.current,frequency:props.frequency,peak_to_peak_current:props.peakToPeakCurrent,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db3}=this.root,{_parsedProps:props}=this,isAc=props.frequency!==void 0||props.peakToPeakCurrent!==void 0||props.waveShape!==void 0,posPort=this.portMap.pos,negPort=this.portMap.neg;if(isAc)db3.simulation_current_source.insert({type:"simulation_current_source",is_dc_source:!1,terminal1_source_port_id:posPort.source_port_id,terminal2_source_port_id:negPort.source_port_id,current:props.current,frequency:props.frequency,peak_to_peak_current:props.peakToPeakCurrent,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle});else{if(props.current===void 0)return;db3.simulation_current_source.insert({type:"simulation_current_source",is_dc_source:!0,positive_source_port_id:posPort.source_port_id,negative_source_port_id:negPort.source_port_id,current:props.current})}}},PLACEMENT_MARGIN=.25,rectForComponent=(component,margin)=>({left:component.center.x-component.size.width/2-margin,right:component.center.x+component.size.width/2+margin,bottom:component.center.y-component.size.height/2-margin,top:component.center.y+component.size.height/2+margin}),rectsOverlap5=(a3,b4)=>a3.left<b4.right&&a3.right>b4.left&&a3.bottom<b4.top&&a3.top>b4.bottom,getCandidateCenters=({baseCenter,size:size3})=>{let xStep=size3.width+PLACEMENT_MARGIN*2,yStep=size3.height+PLACEMENT_MARGIN*2;return[baseCenter,{x:baseCenter.x,y:baseCenter.y+yStep},{x:baseCenter.x,y:baseCenter.y-yStep},{x:baseCenter.x+xStep,y:baseCenter.y},{x:baseCenter.x-xStep,y:baseCenter.y},{x:baseCenter.x+xStep,y:baseCenter.y+yStep},{x:baseCenter.x-xStep,y:baseCenter.y+yStep},{x:baseCenter.x+xStep,y:baseCenter.y-yStep},{x:baseCenter.x-xStep,y:baseCenter.y-yStep},{x:baseCenter.x,y:baseCenter.y+yStep*2},{x:baseCenter.x,y:baseCenter.y-yStep*2}]},getConnectedSchematicPort=({ammeterSourcePortId,schematicPorts,sourceTraces})=>{for(let sourceTrace of sourceTraces){if(!sourceTrace.connected_source_port_ids.includes(ammeterSourcePortId))continue;let connectedSourcePortId=sourceTrace.connected_source_port_ids.find(sourcePortId=>sourcePortId!==ammeterSourcePortId);if(connectedSourcePortId===void 0)continue;let schematicPort=schematicPorts.find(port=>port.source_port_id===connectedSourcePortId);if(schematicPort)return schematicPort}return null},midpoint2=ports=>({x:ports.reduce((sum,port)=>sum+port.center.x,0)/ports.length,y:ports.reduce((sum,port)=>sum+port.center.y,0)/ports.length}),shiftAmmeterSchematicElements=({ammeter,db:db3,oldCenter,newCenter})=>{let schematicComponentId=ammeter.schematic_component_id;if(!schematicComponentId)return;let deltaX=newCenter.x-oldCenter.x,deltaY=newCenter.y-oldCenter.y;if(!(deltaX===0&&deltaY===0)){db3.schematic_component.update(schematicComponentId,{center:newCenter});for(let port of db3.schematic_port.list({schematic_component_id:schematicComponentId}))db3.schematic_port.update(port.schematic_port_id,{center:{x:port.center.x+deltaX,y:port.center.y+deltaY}});for(let text of db3.schematic_text.list({schematic_component_id:schematicComponentId}))db3.schematic_text.update(text.schematic_text_id,{position:{x:text.position.x+deltaX,y:text.position.y+deltaY}});updateSchematicPrimitivesForLayoutShift({db:db3,schematicComponentId,deltaX,deltaY})}},Ammeter_doInitialSchematicLayout=ammeter=>{let{root}=ammeter;if(!root||root.schematicDisabled||!ammeter.schematic_component_id||ammeter._parsedProps.schX!==void 0||ammeter._parsedProps.schY!==void 0||ammeter.getGroup()?._getSchematicLayoutMode()!=="relative")return;let{db:db3}=root,schematicComponent=db3.schematic_component.get(ammeter.schematic_component_id);if(!schematicComponent)return;let ammeterSourcePortIds=[ammeter.portMap.pos.source_port_id,ammeter.portMap.neg.source_port_id].filter(sourcePortId=>typeof sourcePortId=="string");if(ammeterSourcePortIds.length===0)return;let schematicPorts=db3.schematic_port.list(),sourceTraces=db3.source_trace.list(),connectedSchematicPorts=ammeterSourcePortIds.map(ammeterSourcePortId=>getConnectedSchematicPort({ammeterSourcePortId,schematicPorts,sourceTraces})).filter(port=>port!==null);if(connectedSchematicPorts.length===0)return;let baseCenter=midpoint2(connectedSchematicPorts),obstacles=db3.schematic_component.list().filter(component=>component.schematic_component_id!==schematicComponent.schematic_component_id&&!component.is_schematic_group&&component.schematic_sheet_id===schematicComponent.schematic_sheet_id).map(component=>rectForComponent(component,PLACEMENT_MARGIN)),bestCenter=getCandidateCenters({baseCenter,size:schematicComponent.size}).find(candidateCenter=>{let candidateRect=rectForComponent({...schematicComponent,center:candidateCenter},PLACEMENT_MARGIN);return!obstacles.some(obstacle=>rectsOverlap5(candidateRect,obstacle))})??baseCenter;shiftAmmeterSchematicElements({ammeter,db:db3,oldCenter:schematicComponent.center,newCenter:bestCenter})},Ammeter=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"simulation_current_probe_id",null);__publicField(this,"pos",this.portMap.pos);__publicField(this,"neg",this.portMap.neg)}get config(){return{componentName:"Ammeter",schematicSymbolName:"dc_ammeter",zodProps:ammeterProps,sourceFtype:"simple_ammeter"}}runRenderPhaseForChildren(phase){if(!phase.startsWith("Pcb"))for(let child of this.children)child.runRenderPhaseForChildren(phase),child.runRenderPhase(phase)}doInitialPcbComponentRender(){let hasExplicitPcbPosition=this._hasUserDefinedPcbPosition();if(!this._parsedProps.footprint){if(!hasExplicitPcbPosition)return;throw new Error("Ammeter requires a footprint when pcbX/pcbY or pcb edge position props are used")}super.doInitialPcbComponentRender()}initPorts(){super.initPorts({ignoreSymbolPorts:!0,pinCount:2,additionalAliases:{pin1:["pos"],pin2:["neg"]}});let symbol=rc[this._getSchematicSymbolNameOrThrow()];this.portMap.pos.schematicSymbolPortDef=symbol.ports.find(port=>port.labels.includes("1"))??null,this.portMap.neg.schematicSymbolPortDef=symbol.ports.find(port=>port.labels.includes("2"))??null}doInitialSourceRender(){let{db:db3}=this.root,{supplierPartNumbers,displayName}=this._parsedProps,source_component=db3.source_component.insert({ftype:"simple_ammeter",name:this.name,supplier_part_numbers:supplierPartNumbers,display_name:displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db3}=this.root,{color,graphDisplayName,graphCenter,graphVerticalOffset,graphCurrentPerDiv}=this._parsedProps,posPort=this.portMap.pos,negPort=this.portMap.neg,{simulation_current_probe_id}=db3.simulation_current_probe.insert({type:"simulation_current_probe",name:this.name,source_component_id:this.source_component_id,positive_source_port_id:posPort.source_port_id,negative_source_port_id:negPort.source_port_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id??void 0,color});if(this.simulation_current_probe_id=simulation_current_probe_id,graphDisplayName!==void 0||graphCenter!==void 0||graphVerticalOffset!==void 0||graphCurrentPerDiv!==void 0){let graphCurrentPerDivValue=parseSimulationGraphValue(graphCurrentPerDiv),graphVerticalOffsetValue=parseSimulationGraphValue(graphVerticalOffset);db3.simulation_oscilloscope_trace.insert({simulation_current_probe_id,display_name:graphDisplayName,color,display_center_value:graphCenter,amps_per_div:graphCurrentPerDivValue,display_center_offset_divs:graphVerticalOffsetValue!==void 0&&graphCurrentPerDivValue!==void 0&&graphCurrentPerDivValue!==0?graphVerticalOffsetValue/graphCurrentPerDivValue:void 0})}}doInitialSchematicLayout(){Ammeter_doInitialSchematicLayout(this)}},edgeSpecifiers=["leftedge","rightedge","topedge","bottomedge","center"],Constraint3=class extends PrimitiveComponent2{get config(){return{componentName:"Constraint",zodProps:constraintProps}}constructor(props){if(super(props),("xdist"in props||"ydist"in props)&&!("edgeToEdge"in props)&&!("centerToCenter"in props))throw new Error(`edgeToEdge, centerToCenter must be set for xDist or yDist for ${this}`);if("for"in props&&props.for.length<2)throw new Error(`"for" must have at least two selectors for ${this}`)}_getAllReferencedComponents(){let componentsWithSelectors=[],container=this.getPrimitiveContainer();function addComponentFromSelector(selector){let maybeEdge=selector.split(" ").pop(),edge=edgeSpecifiers.includes(maybeEdge)?maybeEdge:void 0,componentSelector=edge?selector.replace(` ${edge}`,""):selector,component=container.selectOne(componentSelector,{pcbPrimitive:!0});component&&componentsWithSelectors.push({selector,component,componentSelector,edge})}for(let key of["left","right","top","bottom"])key in this._parsedProps&&addComponentFromSelector(this._parsedProps[key]);if("for"in this._parsedProps)for(let selector of this._parsedProps.for)addComponentFromSelector(selector);return{componentsWithSelectors}}},AutoroutingPhase=class extends PrimitiveComponent2{get config(){return{componentName:"AutoroutingPhase",zodProps:autoroutingPhaseProps}}add(_component){throw new Error("<autoroutingphase> cannot contain children")}},FabricationNoteDimension=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"fabrication_note_dimension_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNoteDimension",zodProps:fabricationNoteDimensionProps}}_resolvePoint(input2,transform7){if(typeof input2=="string"){let target=this.getSubcircuit().selectOne(input2);return target?target._getGlobalPcbPositionBeforeLayout():(this.renderError(`FabricationNoteDimension could not find selector "${input2}"`),applyToPoint2(transform7,{x:0,y:0}))}let numericX=typeof input2.x=="string"?parseFloat(input2.x):input2.x,numericY=typeof input2.y=="string"?parseFloat(input2.y):input2.y;return applyToPoint2(transform7,{x:numericX,y:numericY})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,transform7=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(props.from,transform7),to3=this._resolvePoint(props.to,transform7),subcircuit=this.getSubcircuit(),group=this.getGroup(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for FabricationNoteDimension. Must be "top" or "bottom".`);let pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,text=props.text??this._formatDistanceText({from,to:to3,units:props.units??"mm"}),fabrication_note_dimension=db3.pcb_fabrication_note_dimension.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,layer,from,to:to3,text,offset:props.offset,font:props.font??"tscircuit2024",font_size:props.fontSize??1,color:props.color,arrow_size:props.arrowSize??1});this.fabrication_note_dimension_id=fabrication_note_dimension.pcb_fabrication_note_dimension_id}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.fabrication_note_dimension_id)return;let dimension=db3.pcb_fabrication_note_dimension.get(this.fabrication_note_dimension_id);dimension&&db3.pcb_fabrication_note_dimension.update(this.fabrication_note_dimension_id,{from:{x:dimension.from.x+deltaX,y:dimension.from.y+deltaY},to:{x:dimension.to.x+deltaX,y:dimension.to.y+deltaY}})}getPcbSize(){let transform7=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform7),to3=this._resolvePoint(this._parsedProps.to,transform7);return{width:Math.abs(to3.x-from.x),height:Math.abs(to3.y-from.y)}}_formatDistanceText({from,to:to3,units}){let dx3=to3.x-from.x,dy3=to3.y-from.y,distanceInMillimeters=Math.sqrt(dx3*dx3+dy3*dy3),distanceInUnits=units==="in"?distanceInMillimeters/25.4:distanceInMillimeters,roundedDistance=Math.round(distanceInUnits);if(Math.abs(distanceInUnits-roundedDistance)<1e-9)return`${roundedDistance}${units}`;let decimalPlaces=units==="in"?3:2;return`${units==="in"?Number(distanceInUnits.toFixed(decimalPlaces)).toString():distanceInUnits.toFixed(decimalPlaces)}${units}`}},PcbNoteDimension=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_dimension_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteDimension",zodProps:pcbNoteDimensionProps}}_resolvePoint(input2,transform7){if(typeof input2=="string"){let target=this.getSubcircuit().selectOne(`.${input2}`);if(!target)return this.renderError(`PcbNoteDimension could not find selector "${input2}"`),applyToPoint2(transform7,{x:0,y:0});let targetPcbComponentId=target.pcb_component_id,root=this.root;if(targetPcbComponentId&&root){let pcbComponent=root.db.pcb_component.get(targetPcbComponentId);if(pcbComponent?.center)return{x:pcbComponent.center.x,y:pcbComponent.center.y}}return target._getGlobalPcbPositionBeforeLayout()}let numericX=typeof input2.x=="string"?parseFloat(input2.x):input2.x,numericY=typeof input2.y=="string"?parseFloat(input2.y):input2.y;return applyToPoint2(transform7,{x:numericX,y:numericY})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,transform7=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(props.from,transform7),to3=this._resolvePoint(props.to,transform7),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,text=props.text??this._formatDistanceText({from,to:to3,units:props.units??"mm"}),pcb_note_dimension3=db3.pcb_note_dimension.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,from,to:to3,text,font:props.font??"tscircuit2024",font_size:props.fontSize??1,layer:props.layer==="bottom"?"bottom":"top",color:props.color,arrow_size:props.arrowSize??1});this.pcb_note_dimension_id=pcb_note_dimension3.pcb_note_dimension_id}doInitialPcbLayout(){let root=this.root;if(!root||root.pcbDisabled||!this.pcb_note_dimension_id)return;let{db:db3}=root,transform7=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform7),to3=this._resolvePoint(this._parsedProps.to,transform7);db3.pcb_note_dimension.update(this.pcb_note_dimension_id,{from,to:to3})}getPcbSize(){let transform7=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform7),to3=this._resolvePoint(this._parsedProps.to,transform7);return{width:Math.abs(to3.x-from.x),height:Math.abs(to3.y-from.y)}}_formatDistanceText({from,to:to3,units}){let dx3=to3.x-from.x,dy3=to3.y-from.y,distanceInMillimeters=Math.sqrt(dx3*dx3+dy3*dy3),distanceInUnits=units==="in"?distanceInMillimeters/25.4:distanceInMillimeters,roundedDistance=Math.round(distanceInUnits);if(Math.abs(distanceInUnits-roundedDistance)<1e-9)return`${roundedDistance}${units}`;let decimalPlaces=units==="in"?3:2;return`${units==="in"?Number(distanceInUnits.toFixed(decimalPlaces)).toString():distanceInUnits.toFixed(decimalPlaces)}${units}`}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.pcb_note_dimension_id)return;let dimension=db3.pcb_note_dimension.get(this.pcb_note_dimension_id);dimension&&db3.pcb_note_dimension.update(this.pcb_note_dimension_id,{from:{x:dimension.from.x+deltaX,y:dimension.from.y+deltaY},to:{x:dimension.to.x+deltaX,y:dimension.to.y+deltaY}})}},getBreakoutBoundaryIntersection=({from,to:to3,bounds})=>{if(from.x===to3.x&&from.y===to3.y)return null;let candidates=[[{x:bounds.minX,y:bounds.minY},{x:bounds.maxX,y:bounds.minY}],[{x:bounds.maxX,y:bounds.minY},{x:bounds.maxX,y:bounds.maxY}],[{x:bounds.maxX,y:bounds.maxY},{x:bounds.minX,y:bounds.maxY}],[{x:bounds.minX,y:bounds.maxY},{x:bounds.minX,y:bounds.minY}]].map(([start,end])=>getSegmentIntersection(from,to3,start,end)).filter(point6=>point6!==null);return candidates.sort((a3,b4)=>distance2(from,a3)-distance2(from,b4)),candidates[0]??null},degreesToRadians=degrees2=>degrees2*Math.PI/180,rotatePoint5=(point6,radians2)=>{let cos6=Math.cos(radians2),sin6=Math.sin(radians2);return{x:point6.x*cos6-point6.y*sin6,y:point6.x*sin6+point6.y*cos6}},getLocalPadPoint=(point6,pad2)=>{let translatedPoint={x:point6.x-pad2.center.x,y:point6.y-pad2.center.y};return rotatePoint5(translatedPoint,-degreesToRadians(pad2.ccwRotationDegrees??0))},getInflatedPadRect=pad2=>{let clearance=pad2.clearance??0;return getBoundFromCenteredRect({center:{x:0,y:0},width:pad2.width+clearance*2,height:pad2.height+clearance*2})},isBreakoutPadIgnoredForSourcePort=({pad:pad2,sourcePortId})=>pad2.sourcePortIds?pad2.sourcePortIds.includes(sourcePortId):!1,isBreakoutPadIgnoredForLayer=({pad:pad2,layer})=>!pad2.layer||!layer?!1:pad2.layer!==layer,doesBreakoutSegmentIntersectPad=({from,to:to3,pad:pad2})=>doesSegmentIntersectRect(getLocalPadPoint(from,pad2),getLocalPadPoint(to3,pad2),getInflatedPadRect(pad2)),doesBreakoutSegmentIntersectNonIgnoredPads=({from,to:to3,pads,ignoredSourcePortIds,layer})=>{for(let pad2 of pads)if(!(ignoredSourcePortIds.some(sourcePortId=>isBreakoutPadIgnoredForSourcePort({pad:pad2,sourcePortId}))||isBreakoutPadIgnoredForLayer({pad:pad2,layer}))&&doesBreakoutSegmentIntersectPad({from,to:to3,pad:pad2}))return!0;return!1},doesBreakoutSegmentIntersectPads=({from,to:to3,pads,sourcePortId,layer})=>doesBreakoutSegmentIntersectNonIgnoredPads({from,to:to3,pads,ignoredSourcePortIds:[sourcePortId],layer}),BOUNDARY_POINT_DISTANCE_TOLERANCE=1e-6,isInsideRequiredSpacing=({candidate,usedPoint,boundaryPointSpacing})=>distance2(usedPoint,candidate)<boundaryPointSpacing-BOUNDARY_POINT_DISTANCE_TOLERANCE,getBoundsEdge=(point6,bounds)=>Math.abs(point6.x-bounds.minX)<BOUNDARY_POINT_DISTANCE_TOLERANCE?"left":Math.abs(point6.x-bounds.maxX)<BOUNDARY_POINT_DISTANCE_TOLERANCE?"right":Math.abs(point6.y-bounds.minY)<BOUNDARY_POINT_DISTANCE_TOLERANCE?"bottom":Math.abs(point6.y-bounds.maxY)<BOUNDARY_POINT_DISTANCE_TOLERANCE?"top":null,getBoundsEdgeCandidates=({edge,bounds,step})=>{let candidates=[];if(edge==="left"||edge==="right"){let x4=edge==="left"?bounds.minX:bounds.maxX;for(let y3=bounds.minY;y3<=bounds.maxY+step/2;y3+=step)candidates.push({x:x4,y:Math.min(y3,bounds.maxY)})}else{let y3=edge==="bottom"?bounds.minY:bounds.maxY;for(let x4=bounds.minX;x4<=bounds.maxX+step/2;x4+=step)candidates.push({x:Math.min(x4,bounds.maxX),y:y3})}return candidates},getAllBoundsCandidates=({bounds,step})=>{let candidatesByCoordinate=new Map;for(let edge of["left","right","bottom","top"])for(let candidate of getBoundsEdgeCandidates({edge,bounds,step}))candidatesByCoordinate.set(`${candidate.x}:${candidate.y}`,candidate);return[...candidatesByCoordinate.values()]},getBoundaryCandidateSearchStep=({bounds,boundaryPointSpacing})=>boundaryPointSpacing>0?boundaryPointSpacing:Math.min(bounds.maxX-bounds.minX,bounds.maxY-bounds.minY)/40,hasBoundarySpacingConflict=({candidate,usedBoundaryPoints,boundaryPointSpacing})=>{for(let usedPoint of usedBoundaryPoints)if(isInsideRequiredSpacing({candidate,usedPoint,boundaryPointSpacing}))return!0;return!1},isBoundaryCandidateBlocked=({candidate,routeFrom,pads,sourcePortId,layer})=>!routeFrom||!pads||!sourcePortId?!1:doesBreakoutSegmentIntersectPads({from:routeFrom,to:candidate,pads,sourcePortId,layer}),isCandidateAvailable=({candidate,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,layer})=>hasBoundarySpacingConflict({candidate,usedBoundaryPoints,boundaryPointSpacing})?!1:!isBoundaryCandidateBlocked({candidate,routeFrom,pads,sourcePortId,layer}),hasOutsideAccessConflict=({candidate,outsidePorts,pads,sourcePortId,layer})=>{if(!outsidePorts||!pads||!sourcePortId)return!1;for(let outsidePort of outsidePorts)if(doesBreakoutSegmentIntersectNonIgnoredPads({from:candidate,to:outsidePort.position,pads,ignoredSourcePortIds:[sourcePortId,outsidePort.sourcePortId],layer}))return!0;return!1},isCandidateAvailableForOutsidePorts=({candidate,bounds,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,outsidePorts,layer})=>isCandidateAvailable({candidate,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,layer})?!hasOutsideAccessConflict({candidate,outsidePorts,pads,sourcePortId,layer}):!1,getAvailableBreakoutBoundaryPoint=({idealPoint,bounds,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,layer})=>{if(isCandidateAvailable({candidate:idealPoint,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,layer}))return idealPoint;let edge=getBoundsEdge(idealPoint,bounds);if(!edge)return null;let step=getBoundaryCandidateSearchStep({bounds,boundaryPointSpacing});if(step<=0)return null;let edgeCandidates=getBoundsEdgeCandidates({edge,bounds,step});edgeCandidates.sort((a3,b4)=>distance2(a3,idealPoint)-distance2(b4,idealPoint));for(let candidate of edgeCandidates)if(isCandidateAvailable({candidate,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,layer}))return candidate;let candidates=getAllBoundsCandidates({bounds,step});candidates.sort((a3,b4)=>distance2(a3,idealPoint)-distance2(b4,idealPoint));for(let candidate of candidates)if(isCandidateAvailable({candidate,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,layer}))return candidate;return null},getAvailableBreakoutBoundaryPointForOutsidePorts=({idealPoints,bounds,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,outsidePorts,layer})=>{let step=getBoundaryCandidateSearchStep({bounds,boundaryPointSpacing});if(step<=0)return null;for(let idealPoint of idealPoints){if(isCandidateAvailableForOutsidePorts({candidate:idealPoint,bounds,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,outsidePorts,layer}))return idealPoint;let edge=getBoundsEdge(idealPoint,bounds);if(!edge)continue;let edgeCandidates=getBoundsEdgeCandidates({edge,bounds,step});edgeCandidates.sort((a3,b4)=>distance2(a3,idealPoint)-distance2(b4,idealPoint));for(let candidate of edgeCandidates)if(isCandidateAvailableForOutsidePorts({candidate,bounds,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,outsidePorts,layer}))return candidate}for(let idealPoint of idealPoints){let candidates=getAllBoundsCandidates({bounds,step});candidates.sort((a3,b4)=>distance2(a3,idealPoint)-distance2(b4,idealPoint));for(let candidate of candidates)if(isCandidateAvailableForOutsidePorts({candidate,bounds,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,outsidePorts,layer}))return candidate}return null},getLayerVisualStyle=layer=>layer==="bottom"?{insidePadFill:"rgba(2, 132, 199, 0.28)",insidePadStroke:"#0369a1",insidePointColor:"#0369a1",outsidePadFill:"rgba(30, 64, 175, 0.2)",outsidePadStroke:"#1e40af",outsidePointColor:"#1e40af",padFill:"rgba(37, 99, 235, 0.18)",padStroke:"#1d4ed8",componentFill:"rgba(245, 158, 11, 0.1)",componentStroke:"#b45309",traceStroke:"#2563eb",breakoutPointColor:"#0f766e"}:{insidePadFill:"rgba(46, 125, 50, 0.28)",insidePadStroke:"#1b5e20",insidePointColor:"#1b5e20",outsidePadFill:"rgba(106, 27, 154, 0.2)",outsidePadStroke:"#6a1b9a",outsidePointColor:"#6a1b9a",padFill:"rgba(220, 38, 38, 0.22)",padStroke:"#b91c1c",componentFill:"rgba(245, 158, 11, 0.1)",componentStroke:"#b45309",traceStroke:"#7e8794",breakoutPointColor:"#0d47a1"},getPortPadRect=({port,fill,stroke,fallbackLabel})=>port.width===void 0||port.height===void 0?null:{center:port.position,width:port.width,height:port.height,ccwRotationDegrees:port.ccwRotationDegrees,fill,stroke,label:port.label??fallbackLabel},getAveragePortPosition=ports=>{if(ports.length===0)return null;let total=ports.reduce((sum,port)=>({x:sum.x+port.position.x,y:sum.y+port.position.y}),{x:0,y:0});return{x:total.x/ports.length,y:total.y/ports.length}},getOutsideTarget=trace=>getAveragePortPosition(trace.outsidePorts),getInsidePortKey=port=>`${port.sourcePortId}:${port.layer??"top"}`,getOutsidePortsForInsidePort=({traces,insidePort})=>{let outsidePorts=[],insidePortKey=getInsidePortKey(insidePort);for(let trace of traces)trace.insidePorts.some(port=>getInsidePortKey(port)===insidePortKey)&&outsidePorts.push(...trace.outsidePorts);return outsidePorts},getIdealBoundaryPoints=({insidePort,outsidePorts,bounds})=>{let idealBoundaryPoints=[];for(let outsidePort of outsidePorts){let idealBoundaryPoint=getBreakoutBoundaryIntersection({from:insidePort.position,to:outsidePort.position,bounds});idealBoundaryPoint&&idealBoundaryPoints.push(idealBoundaryPoint)}return idealBoundaryPoints},BreakoutPointSolver=class extends BaseSolver{constructor(input2){super();__publicField(this,"input");__publicField(this,"output",{breakoutPoints:[]});this.input=input2}_step(){let breakoutPoints=[],boundaryPointsByInsidePort=new Map;for(let trace of this.input.traces)for(let insidePort of trace.insidePorts){let insidePortKey=getInsidePortKey(insidePort),boundaryPoint=boundaryPointsByInsidePort.get(insidePortKey)??null;if(!boundaryPoint){let outsidePorts=getOutsidePortsForInsidePort({traces:this.input.traces,insidePort}),idealBoundaryPoints=getIdealBoundaryPoints({insidePort,outsidePorts,bounds:this.input.bounds});if(idealBoundaryPoints.length===0)continue;let usedBoundaryPoints=[...this.input.usedBoundaryPoints??[],...boundaryPointsByInsidePort.values()];if(outsidePorts.length>1&&(boundaryPoint=getAvailableBreakoutBoundaryPointForOutsidePorts({idealPoints:idealBoundaryPoints,bounds:this.input.bounds,usedBoundaryPoints,boundaryPointSpacing:this.input.boundaryPointSpacing??0,routeFrom:insidePort.position,pads:this.input.pads,sourcePortId:insidePort.sourcePortId,outsidePorts,layer:insidePort.layer})),boundaryPoint??(boundaryPoint=getAvailableBreakoutBoundaryPoint({idealPoint:idealBoundaryPoints[0],bounds:this.input.bounds,usedBoundaryPoints,boundaryPointSpacing:this.input.boundaryPointSpacing??0,routeFrom:insidePort.position,pads:this.input.pads,sourcePortId:insidePort.sourcePortId,layer:insidePort.layer})),!boundaryPoint)continue;boundaryPointsByInsidePort.set(insidePortKey,boundaryPoint)}breakoutPoints.push({sourcePortId:insidePort.sourcePortId,sourceTraceId:trace.sourceTraceId,x:boundaryPoint.x,y:boundaryPoint.y,...insidePort.layer?{layer:insidePort.layer}:{}})}this.output={breakoutPoints},this.solved=!0}getConstructorParams(){return[this.input]}getOutput(){return this.output}visualize(){let{bounds}=this.input,width=bounds.maxX-bounds.minX,height=bounds.maxY-bounds.minY;return{title:"BreakoutPointSolver - generated breakout points",rects:[{center:{x:bounds.minX+width/2,y:bounds.minY+height/2},width,height,fill:"rgba(210, 225, 255, 0.25)",stroke:"#315fba",label:"breakout bounds"},...(this.input.components??[]).map(component=>({center:component.center,width:component.width,height:component.height,ccwRotationDegrees:component.ccwRotationDegrees,fill:getLayerVisualStyle(component.layer).componentFill,stroke:getLayerVisualStyle(component.layer).componentStroke,label:component.label??"component"})),...(this.input.pads??[]).map(pad2=>({center:pad2.center,width:pad2.width+(pad2.clearance??0)*2,height:pad2.height+(pad2.clearance??0)*2,ccwRotationDegrees:pad2.ccwRotationDegrees,fill:getLayerVisualStyle(pad2.layer).padFill,stroke:getLayerVisualStyle(pad2.layer).padStroke,label:pad2.label??"pad"})),...this.input.traces.flatMap(trace=>trace.insidePorts.flatMap(port=>{let rect=getPortPadRect({port,fill:getLayerVisualStyle(port.layer).insidePadFill,stroke:getLayerVisualStyle(port.layer).insidePadStroke,fallbackLabel:`inside pad ${port.sourcePortId}`});return rect?[rect]:[]})),...this.input.traces.flatMap(trace=>trace.outsidePorts.flatMap(port=>{let rect=getPortPadRect({port,fill:getLayerVisualStyle(port.layer).outsidePadFill,stroke:getLayerVisualStyle(port.layer).outsidePadStroke,fallbackLabel:`outside pad ${port.sourcePortId}`});return rect?[rect]:[]}))],lines:this.input.traces.flatMap(trace=>trace.insidePorts.flatMap(insidePort=>{let outsideTarget=getOutsideTarget(trace);if(!outsideTarget)return[];let breakoutPoint=this.output.breakoutPoints.find(point6=>point6.sourceTraceId===trace.sourceTraceId&&point6.sourcePortId===insidePort.sourcePortId);return breakoutPoint?[{points:[insidePort.position,{x:breakoutPoint.x,y:breakoutPoint.y}],strokeColor:getLayerVisualStyle(insidePort.layer).traceStroke,label:`breakout segment ${trace.sourceTraceId}`},{points:[{x:breakoutPoint.x,y:breakoutPoint.y},outsideTarget],strokeColor:getLayerVisualStyle(insidePort.layer).traceStroke,strokeDash:"0.15 0.15",label:`target guide ${trace.sourceTraceId}`}]:[]})),points:[...this.input.traces.flatMap(trace=>trace.insidePorts.map(port=>({...port.position,color:getLayerVisualStyle(port.layer).insidePointColor,label:`inside pad ${port.sourcePortId}`}))),...this.input.traces.flatMap(trace=>trace.outsidePorts.map(port=>({...port.position,color:getLayerVisualStyle(port.layer).outsidePointColor,label:`outside target ${port.sourcePortId}`}))),...this.output.breakoutPoints.map(point6=>({x:point6.x,y:point6.y,color:getLayerVisualStyle(point6.layer).breakoutPointColor,label:`selected breakout ${point6.sourcePortId}`})),...(this.input.usedBoundaryPoints??[]).map(point6=>({...point6,color:"#ef6c00",label:"pre-existing breakout point"}))]}}},baseBreakoutPointProps=pcbLayoutProps.omit({pcbRotation:!0,layer:!0}),BaseBreakoutPoint=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_breakout_point_id",null);__publicField(this,"matchedPort",null);__publicField(this,"matchedNet",null);__publicField(this,"matchedSourceTraceId",null);__publicField(this,"isPcbPrimitive",!0)}_getSourceTraceIdForPort(port){let{db:db3}=this.root;return db3.source_trace.list().find(st3=>st3.connected_source_port_ids.includes(port.source_port_id))?.source_trace_id}_getSourceNetIdForPort(port){let{db:db3}=this.root;return db3.source_trace.list().find(st3=>st3.connected_source_port_ids.includes(port.source_port_id))?.connected_source_net_ids[0]}_renderPcbBreakoutPoint(){if(this.pcb_breakout_point_id||this.root?.pcbDisabled)return;let{db:db3}=this.root,position4=this._getGlobalPcbPositionBeforeLayout(),group=this.parent?.getGroup(),subcircuit=this.getSubcircuit();if(!group||!group.pcb_group_id)return;let pcb_breakout_point3=db3.pcb_breakout_point.insert({pcb_group_id:group.pcb_group_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,source_port_id:this.matchedPort?.source_port_id??void 0,source_trace_id:this.matchedPort?this.matchedSourceTraceId??this._getSourceTraceIdForPort(this.matchedPort):void 0,source_net_id:this.matchedNet?this.matchedNet.source_net_id:this.matchedPort?this._getSourceNetIdForPort(this.matchedPort):void 0,x:position4.x,y:position4.y});this.pcb_breakout_point_id=pcb_breakout_point3.pcb_breakout_point_id}_getPcbCircuitJsonBounds(){let position4=this._getGlobalPcbPositionBeforeLayout();return{center:{x:position4.x,y:position4.y},bounds:{left:position4.x,top:position4.y,right:position4.x,bottom:position4.y},width:0,height:0}}_setPositionFromLayout(newCenter){let{db:db3}=this.root;if(!this.pcb_breakout_point_id)return;let updatedProperties={x:newCenter.x,y:newCenter.y};this.matchedSourceTraceId&&(updatedProperties.source_trace_id=this.matchedSourceTraceId),db3.pcb_breakout_point.update(this.pcb_breakout_point_id,updatedProperties)}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.pcb_breakout_point_id)return;let point6=db3.pcb_breakout_point.get(this.pcb_breakout_point_id);point6&&db3.pcb_breakout_point.update(this.pcb_breakout_point_id,{x:point6.x+deltaX,y:point6.y+deltaY})}getPcbSize(){return{width:0,height:0}}},AutoplacedBreakoutPoint=class extends BaseBreakoutPoint{get config(){return{componentName:"AutoplacedBreakoutPoint",zodProps:baseBreakoutPointProps}}doInitialPcbPrimitiveRender(){this._renderPcbBreakoutPoint()}},BreakoutPoint=class extends BaseBreakoutPoint{get config(){return{componentName:"BreakoutPoint",zodProps:breakoutPointProps}}_matchConnection(){if(this.matchedPort)return;let{connection}=this._parsedProps,subcircuit=this.getSubcircuit();subcircuit&&(this.matchedPort=subcircuit.selectOne(connection,{type:"port"}),this.matchedPort||(this.matchedNet=subcircuit.selectOne(connection,{type:"net"})),!this.matchedPort&&!this.matchedNet&&this.renderError(`Could not find connection target "${connection}"`))}doInitialPcbPrimitiveRender(){this._matchConnection(),this._renderPcbBreakoutPoint()}},getPortLabel=(db3,sourcePortId)=>{if(!sourcePortId)return;let sourcePort=db3.source_port.get(sourcePortId),sourceComponent=sourcePort?.source_component_id?db3.source_component.get(sourcePort.source_component_id):void 0;if(sourcePort)return sourceComponent?.name?`${sourceComponent.name}.${sourcePort.name}`:sourcePort.name},getPadElement=(db3,pcbPortId)=>db3.pcb_smtpad.getWhere({pcb_port_id:pcbPortId})??db3.pcb_plated_hole.getWhere({pcb_port_id:pcbPortId}),toBreakoutPort=(db3,pcbPort)=>{let pad2=getPadElement(db3,pcbPort.pcb_port_id),padBounds=pad2?findBoundsAndCenter([pad2]):null;return{sourcePortId:pcbPort.source_port_id,position:{x:pcbPort.x,y:pcbPort.y},...padBounds?{width:padBounds.width,height:padBounds.height}:{},layer:pcbPort.layers?.[0]??"top",label:getPortLabel(db3,pcbPort.source_port_id)}},createBreakoutPointSolverInput=breakout=>{if(!breakout.root||!breakout.pcb_group_id)return null;let{db:db3}=breakout.root,pcbGroup=db3.pcb_group.get(breakout.pcb_group_id);if(!pcbGroup||!pcbGroup.width||!pcbGroup.height)return null;let sourcePortIdToPcbPort=new Map;for(let pcbPort of db3.pcb_port.list())pcbPort.source_port_id&&sourcePortIdToPcbPort.set(pcbPort.source_port_id,pcbPort);let boundsMinX=pcbGroup.center.x-pcbGroup.width/2,boundsMaxX=pcbGroup.center.x+pcbGroup.width/2,boundsMinY=pcbGroup.center.y-pcbGroup.height/2,boundsMaxY=pcbGroup.center.y+pcbGroup.height/2,traces=[];for(let sourceTrace of db3.source_trace.list()){let pcbPorts=sourceTrace.connected_source_port_ids.map(sourcePortId=>sourcePortIdToPcbPort.get(sourcePortId)).filter(port=>!!port),insidePorts=pcbPorts.filter(port=>port.pcb_group_id===breakout.pcb_group_id),outsidePorts=pcbPorts.filter(port=>port.pcb_group_id!==breakout.pcb_group_id&&!(port.x>=boundsMinX&&port.x<=boundsMaxX&&port.y>=boundsMinY&&port.y<=boundsMaxY));insidePorts.length===0||outsidePorts.length===0||traces.push({sourceTraceId:sourceTrace.source_trace_id,insidePorts:insidePorts.map(port=>toBreakoutPort(db3,port)),outsidePorts:outsidePorts.map(port=>toBreakoutPort(db3,port))})}if(traces.length===0)return null;let allPadElements=[...db3.pcb_smtpad.list(),...db3.pcb_plated_hole.list()],pads=[];for(let pad2 of allPadElements){let padBounds=findBoundsAndCenter([pad2]);if(!padBounds.width||!padBounds.height)continue;let pcbPort=pad2.pcb_port_id?db3.pcb_port.get(pad2.pcb_port_id):null;pads.push({center:padBounds.center,width:padBounds.width,height:padBounds.height,layer:pad2.layer??"top",sourcePortIds:pcbPort?.source_port_id?[pcbPort.source_port_id]:[],label:getPortLabel(db3,pcbPort?.source_port_id)})}let components=db3.pcb_component.list().filter(component=>component.width&&component.height).map(component=>({center:component.center,width:component.width,height:component.height,ccwRotationDegrees:component.rotation,layer:component.layer,label:component.pcb_component_id})),usedBoundaryPoints=db3.pcb_breakout_point.list().filter(point6=>point6.pcb_group_id===breakout.pcb_group_id).map(point6=>({x:point6.x,y:point6.y})),board=db3.pcb_board.list()[0],traceWidth=board?.min_trace_width??.15,clearance=board?.min_trace_to_pad_edge_clearance??.2,boundaryPointSpacing=(board?.min_via_pad_diameter??.3)+2*(traceWidth+clearance);return{bounds:{minX:boundsMinX,maxX:boundsMaxX,minY:boundsMinY,maxY:boundsMaxY},boundaryPointSpacing,traces,pads,components,usedBoundaryPoints}},Breakout=class extends Group5{constructor(props){super({...props,subcircuit:!0})}doInitialCreateAutoplacedBreakoutPoints(){let portsInBreakout=this.selectAll("port"),breakoutPortSet=new Set(portsInBreakout),manualBreakoutPoints=this.children.filter(c6=>c6 instanceof BreakoutPoint),manuallyMappedPorts=new Set(manualBreakoutPoints.map(bp3=>(bp3._matchConnection(),bp3.matchedPort)).filter(Boolean)),board=this.parent;if(!board)return;let allTraces=board.children.filter(c6=>c6 instanceof Trace3),autoPlacedPorts=new Set;for(let trace of allTraces){let result=trace._findConnectedPorts();if(!(!result.allPortsFound||!result.ports))for(let port of result.ports){let isInside=breakoutPortSet.has(port),hasOutsidePort=result.ports.some(p5=>!breakoutPortSet.has(p5));if(!isInside||!hasOutsidePort||manuallyMappedPorts.has(port)||autoPlacedPorts.has(port))continue;autoPlacedPorts.add(port);let breakoutPoint=new AutoplacedBreakoutPoint({});breakoutPoint.matchedPort=port,breakoutPoint.matchedSourceTraceId=trace.source_trace_id,this.add(breakoutPoint)}}}doInitialPcbAutoplaceBreakoutPoints(){if(this.root?.pcbDisabled)return;let solverInput=createBreakoutPointSolverInput(this);if(!solverInput)return;let solver=new BreakoutPointSolver(solverInput);solver.solve();let output=solver.getOutput(),autoBreakoutPoints=this.children.filter(c6=>c6 instanceof AutoplacedBreakoutPoint),BOUNDARY_INSET_MM=1e-4,{bounds}=solverInput,insetWithinBounds=(x4,y3)=>({x:Math.max(bounds.minX+BOUNDARY_INSET_MM,Math.min(bounds.maxX-BOUNDARY_INSET_MM,x4)),y:Math.max(bounds.minY+BOUNDARY_INSET_MM,Math.min(bounds.maxY-BOUNDARY_INSET_MM,y3))});for(let solvedPoint of output.breakoutPoints){let matchingBreakoutPoint=autoBreakoutPoints.find(child=>child.matchedPort?.source_port_id===solvedPoint.sourcePortId);if(matchingBreakoutPoint){matchingBreakoutPoint.matchedSourceTraceId=solvedPoint.sourceTraceId;let insetPoint=insetWithinBounds(solvedPoint.x,solvedPoint.y);matchingBreakoutPoint._setPositionFromLayout({x:insetPoint.x,y:insetPoint.y})}}}doInitialPcbPrimitiveRender(){super.doInitialPcbPrimitiveRender()}},NetLabel=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"source_net_label_id");__publicField(this,"schematic_net_label_id")}get config(){return{componentName:"NetLabel",zodProps:netLabelProps}}_getAnchorSide(){let{_parsedProps:props}=this;if(props.anchorSide)return props.anchorSide;if(!this._resolveConnectsTo())return"right";let net=this.getSubcircuit().selectOne(`net.${this._getNetName()}`),sourceNet;if(net?.source_net_id&&(sourceNet=this.root?.db.source_net.get(net.source_net_id)),sourceNet?.is_ground)return"top";if(sourceNet?.is_power)return"bottom";let anchorPos=this._getGlobalSchematicPositionBeforeLayout(),connectedPorts=this._getConnectedPorts();if(connectedPorts.length===0)return"right";let port=connectedPorts[0];if(port.facingDirection)return getEnteringEdgeFromDirection(port.facingDirection);let connectedPortPosition=port._getGlobalSchematicPositionBeforeLayout(),dx3=connectedPortPosition.x-anchorPos.x,dy3=connectedPortPosition.y-anchorPos.y;if(Math.abs(dx3)>Math.abs(dy3)){if(dx3>0)return"right";if(dx3<0)return"left"}else{if(dy3>0)return"top";if(dy3<0)return"bottom"}return"right"}_getConnectedPorts(){let connectsTo=this._resolveConnectsTo();if(!connectsTo)return[];let connectedPorts=[];for(let connection of connectsTo){let port=this.getSubcircuit().selectOne(connection);port&&connectedPorts.push(port)}return connectedPorts}computeSchematicPropsTransform(){let{_parsedProps:props}=this;if(props.schX===void 0&&props.schY===void 0){let connectedPorts=this._getConnectedPorts();if(connectedPorts.length>0){let portPos=connectedPorts[0]._getGlobalSchematicPositionBeforeLayout(),parentCenter=applyToPoint2(this.parent?.computeSchematicGlobalTransform?.()??identity(),{x:0,y:0});return translate2(portPos.x-parentCenter.x,portPos.y-parentCenter.y)}}return super.computeSchematicPropsTransform()}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db3}=this.root,{_parsedProps:props}=this,anchorPos=this._getGlobalSchematicPositionBeforeLayout(),net=this.getSubcircuit().selectOne(`net.${this._getNetName()}`),anchorSide=this._getAnchorSide(),center2=computeSchematicNetLabelCenter({anchor_position:anchorPos,anchor_side:anchorSide,text:props.net}),netLabel=db3.schematic_net_label.insert({text:props.net,source_net_id:net.source_net_id,anchor_position:anchorPos,center:center2,anchor_side:anchorSide,schematic_sheet_id:this._resolveSchematicSheetId()});this.source_net_label_id=netLabel.source_net_id,this.schematic_net_label_id=netLabel.schematic_net_label_id}_resolveConnectsTo(){let{_parsedProps:props}=this,connectsTo=props.connectsTo??props.connection;if(Array.isArray(connectsTo))return connectsTo;if(typeof connectsTo=="string")return[connectsTo]}_getNetName(){let{_parsedProps:props}=this;return props.net}doInitialCreateNetsFromProps(){let{_parsedProps:props}=this;props.net&&createNetsFromProps(this,[`net.${props.net}`])}doInitialCreateTracesFromNetLabels(){if(this.root?.schematicDisabled)return;let connectsTo=this._resolveConnectsTo();if(connectsTo)for(let connection of connectsTo)this.add(new Trace3({from:connection,to:`net.${this._getNetName()}`}))}doInitialSchematicTraceRender(){if(!this.root?._featureMspSchematicTraceRouting||this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db3}=this.root,connectsTo=this._resolveConnectsTo();if(!connectsTo||connectsTo.length===0)return;let anchorPos=this._getGlobalSchematicPositionBeforeLayout(),anchorSide=this._getAnchorSide(),anchorFacing={left:"x-",right:"x+",top:"y+",bottom:"y-"}[anchorSide],net=this.getSubcircuit().selectOne(`net.${this._getNetName()}`);for(let connection of connectsTo){let port=this.getSubcircuit().selectOne(connection,{type:"port"});if(!port||!port.schematic_port_id)continue;let existingTraceForThisConnection=!1;if(net?.source_net_id){let candidateSourceTrace=db3.source_trace.list().find(st3=>st3.connected_source_net_ids?.includes(net.source_net_id)&&st3.connected_source_port_ids?.includes(port.source_port_id??""));if(candidateSourceTrace&&(existingTraceForThisConnection=db3.schematic_trace.list().some(t54=>t54.source_trace_id===candidateSourceTrace.source_trace_id)),existingTraceForThisConnection)continue}let portPos=port._getGlobalSchematicPositionAfterLayout(),portFacing=convertFacingDirectionToElbowDirection(port.facingDirection??"right")??"x+",path=calculateElbow({x:portPos.x,y:portPos.y,facingDirection:portFacing},{x:anchorPos.x,y:anchorPos.y,facingDirection:anchorFacing});if(!Array.isArray(path)||path.length<2)continue;let edges=[];for(let i3=0;i3<path.length-1;i3++)edges.push({from:{x:path[i3].x,y:path[i3].y},to:{x:path[i3+1].x,y:path[i3+1].y}});let source_trace_id,subcircuit_connectivity_map_key;if(net?.source_net_id&&port.source_port_id){let st3=db3.source_trace.list().find(s6=>s6.connected_source_net_ids?.includes(net.source_net_id)&&s6.connected_source_port_ids?.includes(port.source_port_id));source_trace_id=st3?.source_trace_id,subcircuit_connectivity_map_key=st3?.subcircuit_connectivity_map_key||db3.source_net.get(net.source_net_id)?.subcircuit_connectivity_map_key}db3.schematic_trace.insert({source_trace_id,edges,junctions:[],subcircuit_connectivity_map_key,schematic_sheet_id:this._resolveSchematicSheetId()}),db3.schematic_port.update(port.schematic_port_id,{is_connected:!0})}}},SilkscreenGraphic=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_graphic_id",null);__publicField(this,"pcb_silkscreen_graphic_ids",[]);__publicField(this,"pcb_silkscreen_path_ids",[]);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenGraphic",zodProps:silkscreenGraphicProps}}doInitialPcbPrimitiveRender(){this.root?.pcbDisabled||this._queueAsyncEffect("SilkscreenGraphicRender",async()=>{if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenGraphic. Must be "top" or "bottom".`);let sourceImage=await loadImageSource(props.imageUrl);if(sourceImage.mimetype!==SVG_MIMETYPE&&sourceImage.mimetype!==PNG_MIMETYPE)throw new Error(`Unsupported imageUrl for SilkscreenGraphic: "${props.imageUrl}". Expected an SVG or PNG image.`);let imageAsset={project_relative_path:sourceImage.projectRelativePath,url:sourceImage.dataUrl,mimetype:sourceImage.mimetype},brepShapes=sourceImage.mimetype===SVG_MIMETYPE?getSvgBRepShapes({svg:sourceImage.text,width:props.width,height:props.height,transform:this._computePcbGlobalTransformBeforeLayout()}):[this.getPlacementBoxBRepShape()],pcbComponentId=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??"";for(let brepShape of brepShapes){let graphic=db3.insert({type:"pcb_silkscreen_graphic",pcb_component_id:pcbComponentId,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,subcircuit_id:this.getSubcircuit()?.subcircuit_id??void 0,layer,shape:"brep",brep_shape:brepShape,image_asset:imageAsset});this.pcb_silkscreen_graphic_ids.push(graphic.pcb_silkscreen_graphic_id)}this.pcb_silkscreen_graphic_id=this.pcb_silkscreen_graphic_ids[0]??null,sourceImage.mimetype===SVG_MIMETYPE&&this.insertRenderableSilkscreenPaths(sourceImage.text,layer)})}insertRenderableSilkscreenPaths(svg,layer){let{db:db3}=this.root,{_parsedProps:props}=this,transform7=this._computePcbGlobalTransformBeforeLayout(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??"";for(let route of getTransformedSvgPathRoutes({svg,width:props.width,height:props.height,transform:transform7})){if(route.length<2)continue;let path=db3.pcb_silkscreen_path.insert({pcb_component_id,layer,route,stroke_width:Math.max(Math.min(props.width,props.height)/60,.05),subcircuit_id:this.getSubcircuit()?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_silkscreen_path_ids.push(path.pcb_silkscreen_path_id)}}getPcbSize(){let{_parsedProps:props}=this;return{width:props.width,height:props.height}}getPlacementBoxBRepShape(){let{_parsedProps:props}=this,halfWidth=props.width/2,halfHeight=props.height/2,transform7=this._computePcbGlobalTransformBeforeLayout();return{outer_ring:{vertices:ensureClockwise([{x:-halfWidth,y:halfHeight},{x:halfWidth,y:halfHeight},{x:halfWidth,y:-halfHeight},{x:-halfWidth,y:-halfHeight}]).map(point6=>applyToPoint2(transform7,point6))},inner_rings:[]}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,moveVertex=vertex=>({...vertex,x:vertex.x+deltaX,y:vertex.y+deltaY});for(let graphicId of this.pcb_silkscreen_graphic_ids){let graphic=db3.pcb_silkscreen_graphic.get(graphicId);graphic&&db3.pcb_silkscreen_graphic.update(graphicId,{brep_shape:{outer_ring:{vertices:graphic.brep_shape.outer_ring.vertices.map(moveVertex)},inner_rings:graphic.brep_shape.inner_rings.map(ring3=>({vertices:ring3.vertices.map(moveVertex)}))}})}for(let pathId of this.pcb_silkscreen_path_ids){let path=db3.pcb_silkscreen_path.get(pathId);path&&db3.pcb_silkscreen_path.update(pathId,{route:path.route.map(point6=>({...point6,x:point6.x+deltaX,y:point6.y+deltaY}))})}}},Fiducial=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_smtpad_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Fiducial",zodProps:fiducialProps,sourceFtype:"simple_fiducial"}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,position4=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_smtpad3=db3.pcb_smtpad.insert({pcb_component_id,layer:maybeFlipLayer(props.layer||"top"),shape:"circle",x:position4.x,y:position4.y,radius:distance.parse(props.padDiameter)/2,soldermask_margin:props.soldermaskPullback?distance.parse(props.soldermaskPullback):distance.parse(props.padDiameter)/2,is_covered_with_solder_mask:!0});this.pcb_smtpad_id=pcb_smtpad3.pcb_smtpad_id}getPcbSize(){let{_parsedProps:props}=this,d4=distance.parse(props.padDiameter);return{width:d4,height:d4}}_setPositionFromLayout(newCenter){if(!this.pcb_smtpad_id)return;let{db:db3}=this.root;db3.pcb_smtpad.update(this.pcb_smtpad_id,{x:newCenter.x,y:newCenter.y})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db3}=this.root;if(!this.pcb_smtpad_id)return;let pad2=db3.pcb_smtpad.get(this.pcb_smtpad_id);pad2&&(pad2.shape==="rect"||pad2.shape==="circle"||pad2.shape==="rotated_rect"||pad2.shape==="pill"?this._setPositionFromLayout({x:pad2.x+deltaX,y:pad2.y+deltaY}):pad2.shape==="polygon"&&db3.pcb_smtpad.update(this.pcb_smtpad_id,{points:pad2.points.map(p5=>({x:p5.x+deltaX,y:p5.y+deltaY}))}))}},Via=class extends PrimitiveComponent2{constructor(props){super(props);__publicField(this,"pcb_via_id",null);__publicField(this,"matchedPort",null);__publicField(this,"isPcbPrimitive",!0);__publicField(this,"source_manually_placed_via_id",null);__publicField(this,"subcircuit_connectivity_map_key",null);let layers=this._getLayers();this._parsedProps.layers=layers,this.initPorts()}get config(){return{componentName:"Via",zodProps:viaProps}}getAvailablePcbLayers(){return["top","inner1","inner2","bottom"]}_getResolvedViaDiameters(pcbStyle2){return getViaDiameterDefaultsWithOverrides({holeDiameter:this._parsedProps.holeDiameter,padDiameter:this._parsedProps.outerDiameter},pcbStyle2)}getPcbSize(){let pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{padDiameter}=this._getResolvedViaDiameters(pcbStyle2);return{width:padDiameter,height:padDiameter}}_getPcbCircuitJsonBounds(){let{db:db3}=this.root,via=db3.pcb_via.get(this.pcb_via_id),size3=this.getPcbSize();return{center:{x:via.x,y:via.y},bounds:{left:via.x-size3.width/2,top:via.y-size3.height/2,right:via.x+size3.width/2,bottom:via.y+size3.height/2},width:size3.width,height:size3.height}}_setPositionFromLayout(newCenter){let{db:db3}=this.root;db3.pcb_via.update(this.pcb_via_id,{x:newCenter.x,y:newCenter.y})}_getLayers(){let{fromLayer="top",toLayer="bottom"}=this._parsedProps,layerCount=this.parent?this.getSubcircuit()._getSubcircuitLayerCount():2;return getViaSpanLayers({fromLayer,toLayer,layerCount})}initPorts(){let layers=this._parsedProps.layers;for(let layer of layers){let port2=new Port({name:layer,layer});port2.registerMatch(this),this.add(port2)}let port=new Port({name:"pin1"});port.registerMatch(this),this.add(port)}_getConnectedNetOrTrace(){let connectsTo=this._parsedProps.connectsTo;if(!connectsTo)return null;let subcircuit=this.getSubcircuit(),selectors=Array.isArray(connectsTo)?connectsTo:[connectsTo];for(let selector of selectors)if(selector.startsWith("net.")){let net=subcircuit.selectOne(selector,{type:"net"});if(net)return net}return null}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{padDiameter}=this._getResolvedViaDiameters(pcbStyle2),position4=this._getGlobalPcbPositionBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_component3=db3.pcb_component.insert({center:position4,width:padDiameter,height:padDiameter,layer:this._parsedProps.fromLayer??"top",rotation:0,source_component_id:this.source_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,obstructs_within_bounds:!0});this.pcb_component_id=pcb_component3.pcb_component_id}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,group=this.getGroup(),subcircuit=this.getSubcircuit(),source_via=db3.source_manually_placed_via.insert({source_group_id:group?.source_group_id,source_net_id:props.net??"",subcircuit_id:subcircuit?.subcircuit_id??void 0});this.source_component_id=source_via.source_manually_placed_via_id}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db3}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=this._getResolvedViaDiameters(pcbStyle2),position4=this._getGlobalPcbPositionBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_via3=db3.pcb_via.insert({x:position4.x,y:position4.y,hole_diameter:holeDiameter,outer_diameter:padDiameter,layers:this._getLayers(),from_layer:this._parsedProps.fromLayer||"bottom",to_layer:this._parsedProps.toLayer||"top",subcircuit_id:subcircuit?.subcircuit_id??void 0,subcircuit_connectivity_map_key:this.subcircuit_connectivity_map_key??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,net_is_assignable:this._parsedProps.netIsAssignable??void 0});this.pcb_via_id=pcb_via3.pcb_via_id;let connected=this._getConnectedNetOrTrace();connected&&"source_net_id"in connected&&connected.source_net_id&&db3.pcb_via.update(this.pcb_via_id,{pcb_trace_id:connected.source_net_id})}},EPSILON3=1e-9,isWireRoutePoint=routePoint=>routePoint.route_type==="wire",isPointOnSegment5=(p5,a3,b4)=>{let cross22=(p5.y-a3.y)*(b4.x-a3.x)-(p5.x-a3.x)*(b4.y-a3.y);if(Math.abs(cross22)>EPSILON3)return!1;let dot=(p5.x-a3.x)*(b4.x-a3.x)+(p5.y-a3.y)*(b4.y-a3.y);if(dot<-EPSILON3)return!1;let squaredLength=(b4.x-a3.x)**2+(b4.y-a3.y)**2;return!(dot-squaredLength>EPSILON3)},isPointInRing=(point6,ring3)=>{if(ring3.length<3)return!1;let inside2=!1,previous=ring3[ring3.length-1];for(let current3 of ring3){if(isPointOnSegment5(point6,previous,current3))return!0;current3.y>point6.y!=previous.y>point6.y&&point6.x<(previous.x-current3.x)*(point6.y-current3.y)/(previous.y-current3.y)+current3.x&&(inside2=!inside2),previous=current3}return inside2},isPointInRectPour=(p5,pour)=>{let{center:center2,width,height}=pour,rotationRad=(pour.rotation??0)*Math.PI/180,cosR=Math.cos(-rotationRad),sinR=Math.sin(-rotationRad),dx3=p5.x-center2.x,dy3=p5.y-center2.y,localX=dx3*cosR-dy3*sinR,localY=dx3*sinR+dy3*cosR;return Math.abs(localX)<=width/2+EPSILON3&&Math.abs(localY)<=height/2+EPSILON3},isPointInBrepPour=(p5,pour)=>{let outerRing=pour.brep_shape.outer_ring.vertices.map(v3=>({x:v3.x,y:v3.y}));if(!isPointInRing(p5,outerRing))return!1;for(let innerRing of pour.brep_shape.inner_rings){let points=innerRing.vertices.map(v3=>({x:v3.x,y:v3.y}));if(isPointInRing(p5,points))return!1}return!0},isPointInCopperPour=(point6,pour)=>pour.shape==="rect"?isPointInRectPour(point6,pour):pour.shape==="brep"?isPointInBrepPour(point6,pour):!1,isTraceConnectedToSourceNet=(trace,sourceNetId,sourceTraceById)=>{if(trace.source_trace_id===sourceNetId)return!0;if(!trace.source_trace_id)return!1;let sourceTrace=sourceTraceById.get(trace.source_trace_id);return sourceTrace?sourceTrace.connected_source_net_ids.includes(sourceNetId):!1},isSegmentFullyInsideCopperPour=(start,end,pour)=>{let dx3=end.x-start.x,dy3=end.y-start.y;return Math.hypot(dx3,dy3)<=EPSILON3?!1:[0,.25,.5,.75,1].every(t54=>isPointInCopperPour({x:start.x+dx3*t54,y:start.y+dy3*t54},pour))},markTraceSegmentsInsideCopperPour=({db:db3,copperPour})=>{if(!copperPour.source_net_id)return;let sourceTraceById=new Map(db3.source_trace.list().map(sourceTrace=>[sourceTrace.source_trace_id,sourceTrace]));for(let trace of db3.pcb_trace.list()){if(!isTraceConnectedToSourceNet(trace,copperPour.source_net_id,sourceTraceById))continue;let routeChanged=!1,nextRoute=trace.route.map(routePoint=>({...routePoint}));for(let i3=0;i3<nextRoute.length-1;i3++){let fromRoutePoint=nextRoute[i3],toRoutePoint=nextRoute[i3+1];!fromRoutePoint||!toRoutePoint||!isWireRoutePoint(fromRoutePoint)||!isWireRoutePoint(toRoutePoint)||fromRoutePoint.layer!==copperPour.layer||toRoutePoint.layer!==copperPour.layer||isSegmentFullyInsideCopperPour({x:fromRoutePoint.x,y:fromRoutePoint.y},{x:toRoutePoint.x,y:toRoutePoint.y},copperPour)&&(fromRoutePoint.is_inside_copper_pour=!0,fromRoutePoint.copper_pour_id=copperPour.pcb_copper_pour_id,toRoutePoint.is_inside_copper_pour=!0,toRoutePoint.copper_pour_id=copperPour.pcb_copper_pour_id,routeChanged=!0)}routeChanged&&db3.pcb_trace.update(trace.pcb_trace_id,{route:nextRoute})}},CopperPour=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"CopperPour",zodProps:copperPourProps}}getPcbSize(){return{width:0,height:0}}doInitialCreateNetsFromProps(){let{_parsedProps:props}=this;createNetsFromProps(this,[props.connectsTo])}doInitialPcbCopperPourRender(){this.root?.pcbDisabled||this._queueAsyncEffect("PcbCopperPourRender",async()=>{let{db:db3}=this.root,{_parsedProps:props}=this,net=this.getSubcircuit().selectOne(props.connectsTo);if(!net||!net.source_net_id){this.renderError(`Net "${props.connectsTo}" not found for copper pour`);return}let subcircuit=this.getSubcircuit(),circuitJson=db3.toArray(),clearance=props.clearance??.2,inputProblem=convertCircuitJsonToInputProblem(circuitJson,{layer:props.layer,subcircuit_id:subcircuit?.subcircuit_id??void 0,source_net_id:net.source_net_id,pad_margin:props.padMargin??clearance,trace_margin:props.traceMargin??clearance,board_edge_margin:props.boardEdgeMargin??clearance,cutout_margin:props.cutoutMargin??clearance,outline:props.outline});await initializeManifoldGeometry();let solver=new CopperPourPipelineSolver(inputProblem);this.root.emit("solver:started",{solverName:"CopperPourPipelineSolver",solverParams:inputProblem,componentName:this.props.name});let{brep_shapes}=solver.getOutput(),coveredWithSolderMask=props.coveredWithSolderMask??!1;for(let brep_shape3 of brep_shapes){let insertedPour=db3.pcb_copper_pour.insert({shape:"brep",layer:props.layer,brep_shape:brep_shape3,source_net_id:net.source_net_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,covered_with_solder_mask:coveredWithSolderMask});markTraceSegmentsInsideCopperPour({db:db3,copperPour:insertedPour})}})}},Battery=class extends NormalComponent3{get config(){return{componentName:"Battery",schematicSymbolName:this.props.symbolName??"battery",zodProps:batteryProps,sourceFtype:"simple_power_source"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({name:this.name,ftype:"simple_power_source",capacity:props.capacity,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},STANDARD_USB_C_PIN_LABELS=[{label:"GND1",aliases:[]},{label:"VBUS1",aliases:[]},{label:"CC1",aliases:[]},{label:"DP1",aliases:[]},{label:"DM1",aliases:["DN1"]},{label:"SBU1",aliases:[]},{label:"SBU2",aliases:[]},{label:"DM2",aliases:["DN2"]},{label:"DP2",aliases:[]},{label:"CC2",aliases:[]},{label:"VBUS2",aliases:[]},{label:"GND2",aliases:[]},{label:"SHELL1",aliases:["MH1","EH1","MOUNT1"]},{label:"SHELL2",aliases:["MH2","EH2","MOUNT2"]},{label:"SHELL3",aliases:["MH3","EH3","MOUNT3"]},{label:"SHELL4",aliases:["MH4","EH4","MOUNT4"]}],PIN_NUMBER_HINT_PATTERN=/^(?:pin)?(\d+)$/i,dedupeHintsPreservingOrder=hints=>Array.from(new Set(hints)),convertCircuitJsonToUsbCStandardCircuitJson=partCircuitJson=>{let unassignedPorts=[];for(let elm of partCircuitJson){if(elm.type!=="source_port")continue;let pinNumber=elm.pin_number;if(typeof pinNumber!="number")continue;let upperCaseHints=new Set;for(let hint of elm.port_hints??[])upperCaseHints.add(hint.trim().toUpperCase());unassignedPorts.push({pinKey:`pin${pinNumber}`,upperCaseHints})}let canonicalHintsByPin={};for(let{label,aliases:aliases2}of STANDARD_USB_C_PIN_LABELS){let canonicalAndAliasHintsUpper=[label,...aliases2].map(s6=>s6.toUpperCase()),matchIndex=unassignedPorts.findIndex(port=>canonicalAndAliasHintsUpper.some(hint=>port.upperCaseHints.has(hint)));if(matchIndex===-1)continue;let{pinKey}=unassignedPorts[matchIndex];canonicalHintsByPin[pinKey]=[label],unassignedPorts.splice(matchIndex,1)}return Object.keys(canonicalHintsByPin).length===0?partCircuitJson:partCircuitJson.map(elm=>{if(!("port_hints"in elm)||!Array.isArray(elm.port_hints))return elm;let originalHints=elm.port_hints.filter(h3=>typeof h3=="string").map(h3=>h3.trim()).filter(h3=>h3.length>0);if(originalHints.length===0)return elm;let pinKeys=new Set;elm.type==="source_port"&&typeof elm.pin_number=="number"&&pinKeys.add(`pin${elm.pin_number}`);for(let hint of originalHints){let matchedPin=hint.match(PIN_NUMBER_HINT_PATTERN);matchedPin&&pinKeys.add(`pin${Number.parseInt(matchedPin[1],10)}`)}let canonicalHintsToAdd=[];for(let pinKey of pinKeys)canonicalHintsToAdd.push(...canonicalHintsByPin[pinKey]??[]);return canonicalHintsToAdd.length===0?elm:{...elm,port_hints:dedupeHintsPreservingOrder([...originalHints,...canonicalHintsToAdd])}})},INNER_SYMBOL_SCALE_FACTOR=.5,INNER_SYMBOL_LEFT_SHIFT_FACTOR=.15;function insertInnerSymbolInSchematicBox(connector,symbol){if(!connector.schematic_component_id||!connector.root)return;let{db:db3}=connector.root,schematicComponent=db3.schematic_component.get(connector.schematic_component_id);if(!schematicComponent||schematicComponent.symbol_name)return;let targetWidth=schematicComponent.size.width*INNER_SYMBOL_SCALE_FACTOR,targetHeight=schematicComponent.size.height*INNER_SYMBOL_SCALE_FACTOR,scaleFactor=Math.min(targetWidth/symbol.size.width,targetHeight/symbol.size.height);if(!Number.isFinite(scaleFactor)||scaleFactor<=0)return;let subcircuit_id=connector.getSubcircuit()?.subcircuit_id??void 0,center2=schematicComponent.center,symbolCenter=symbol.center,centerOffsetX=-schematicComponent.size.width*INNER_SYMBOL_LEFT_SHIFT_FACTOR,transformPoint=point6=>({x:center2.x+centerOffsetX+(point6.x-symbolCenter.x)*scaleFactor,y:center2.y+(point6.y-symbolCenter.y)*scaleFactor});for(let primitive of symbol.primitives)if(primitive.type==="path"){let points=primitive.points.map(transformPoint);if(primitive.closed&&points.length>1){let first=points[0],last=points[points.length-1];(first.x!==last.x||first.y!==last.y)&&points.push(first)}db3.schematic_path.insert({schematic_component_id:connector.schematic_component_id,points,is_filled:primitive.fill??!1,is_dashed:!1,fill_color:primitive.fill?SCHEMATIC_COMPONENT_OUTLINE_COLOR:void 0,stroke_width:.02,subcircuit_id,schematic_sheet_id:connector._resolveSchematicSheetId()})}else if(primitive.type==="circle")db3.schematic_circle.insert({schematic_component_id:connector.schematic_component_id,center:transformPoint({x:primitive.x,y:primitive.y}),radius:primitive.radius*scaleFactor,stroke_width:.02,color:SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_filled:primitive.fill,fill_color:primitive.fill?SCHEMATIC_COMPONENT_OUTLINE_COLOR:void 0,is_dashed:!1,subcircuit_id,schematic_sheet_id:connector._resolveSchematicSheetId()});else if(primitive.type==="box"){let topLeft=transformPoint({x:primitive.x,y:primitive.y}),bottomRight=transformPoint({x:primitive.x+primitive.width,y:primitive.y+primitive.height});db3.schematic_rect.insert({schematic_component_id:connector.schematic_component_id,center:{x:(topLeft.x+bottomRight.x)/2,y:(topLeft.y+bottomRight.y)/2},width:Math.abs(bottomRight.x-topLeft.x),height:Math.abs(bottomRight.y-topLeft.y),stroke_width:.02,color:SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_filled:!1,is_dashed:!1,rotation:0,subcircuit_id,schematic_sheet_id:connector._resolveSchematicSheetId()})}}var USB_C_SIGNAL_LABELS_IN_ORDER=["VBUS1","VBUS2","CC1","CC2","DP1","DP2","DM1","DM2","SBU1","SBU2","GND1","GND2"],USB_C_SHELL_LABELS_IN_ORDER=["SHELL1","SHELL2","SHELL3","SHELL4"],USB_C_CANONICAL_LABELS_IN_ORDER=[...USB_C_SIGNAL_LABELS_IN_ORDER,...USB_C_SHELL_LABELS_IN_ORDER],USB_C_CANONICAL_LABELS=new Set([...USB_C_CANONICAL_LABELS_IN_ORDER]),USB_C_DEFAULT_SCH_PIN_STYLE_BY_LABEL=[["CC1",{marginTop:.15}],["DP1",{marginTop:.15}],["SBU1",{marginTop:.15}],["GND1",{marginTop:.15}],["SHELL4",{marginRight:.15}]],Connector=class extends Chip{_getConnectorProps(){return this._parsedProps}_hasExplicitFootprint(){return this._getConnectorProps().footprint!==void 0||this.children.some(child=>child.componentName==="Footprint")}_shouldUseStandardPartsEngineCircuitJsonFlow(){return!(!this._getConnectorProps().standard||this._hasExplicitFootprint()||this.getInheritedProperty("partsEngineDisabled"))}_insertStandardConnectorCircuitJsonError(standard,message){let{db:db3}=this.root,errorObj=unknown_error_finding_part.parse({type:"unknown_error_finding_part",message:`Failed to fetch circuit JSON for ${this.getString()} (standard="${standard}"): ${message}`,source_component_id:this.source_component_id??void 0,subcircuit_id:this.getSubcircuit()?.subcircuit_id??void 0});db3.unknown_error_finding_part.insert(errorObj)}_getSupplierPartNumbersToTry(supplierPartNumbers){let partNumbers=[];for(let supplier of Object.keys(supplierPartNumbers??{})){let nums=supplierPartNumbers?.[supplier];Array.isArray(nums)&&nums.length>0&&partNumbers.push(nums[0])}return partNumbers}async _tryFetchPartCircuitJson(fetchPartCircuitJson,params){let maybeCircuitJson=await Promise.resolve(fetchPartCircuitJson(params))??null;return Array.isArray(maybeCircuitJson)&&maybeCircuitJson.length>0?maybeCircuitJson:null}async _fetchStandardConnectorCircuitJson(fetchPartCircuitJson,supplierPartNumbers,manufacturerPartNumber){for(let supplierPartNumber of this._getSupplierPartNumbersToTry(supplierPartNumbers)){let circuitJson=await this._tryFetchPartCircuitJson(fetchPartCircuitJson,{supplierPartNumber});if(circuitJson)return circuitJson}return manufacturerPartNumber?this._tryFetchPartCircuitJson(fetchPartCircuitJson,{manufacturerPartNumber}):null}_addConnectorFootprintFromCircuitJson(standard,circuitJson){let props=this._getConnectorProps(),standardizedCircuitJson=standard==="usb_c"?convertCircuitJsonToUsbCStandardCircuitJson(circuitJson):circuitJson,fpComponents=createComponentsFromCircuitJson({componentName:this.name,componentRotation:String(props.pcbRotation??0),footprinterString:`standard:${standard}`,pinLabels:props.pinLabels,pcbPinLabels:props.pcbPinLabels},standardizedCircuitJson),fetchedCadModel=extractCadModelFromCircuitJson(standardizedCircuitJson);fetchedCadModel&&(this._asyncFootprintCadModel=fetchedCadModel),this.addAll(fpComponents),this._markDirty("InitializePortsFromChildren")}_getUsbCCanonicalLabelToPinNumberMap(){let labelToPinNumber=new Map,ports=this.selectAll("port");for(let port of ports){let pinNumber=port.props.pinNumber;if(typeof pinNumber=="number")for(let alias of port.getNameAndAliases()){let normalizedAlias=alias.trim().toUpperCase();if(!USB_C_CANONICAL_LABELS.has(normalizedAlias))continue;let label=normalizedAlias;labelToPinNumber.has(label)||labelToPinNumber.set(label,pinNumber)}}return labelToPinNumber}_getSchematicPortArrangement(){let arrangement=super._getSchematicPortArrangement();if(arrangement&&Object.keys(arrangement).length>0||this._getConnectorProps().standard!=="usb_c")return arrangement;let labelToPinNumber=this._getUsbCCanonicalLabelToPinNumberMap(),rightPins=USB_C_SIGNAL_LABELS_IN_ORDER.map(label=>labelToPinNumber.get(label)).filter(pin=>typeof pin=="number"),bottomPins=USB_C_SHELL_LABELS_IN_ORDER.map(label=>labelToPinNumber.get(label)).filter(pin=>typeof pin=="number");if(rightPins.length===0&&bottomPins.length===0)return arrangement;let canonicalArrangement={};return rightPins.length>0&&(canonicalArrangement.rightSide={pins:rightPins,direction:"top-to-bottom"}),bottomPins.length>0&&(canonicalArrangement.bottomSide={pins:bottomPins,direction:"left-to-right"}),canonicalArrangement}_getSchematicBoxDimensions(){if(this._getConnectorProps().standard!=="usb_c")return super._getSchematicBoxDimensions();if(this.getSchematicSymbol()||!this.config.shouldRenderAsSchematicBox)return null;let{_parsedProps:props}=this,pinCount=this._getPrimaryPinCount(),pinSpacing=.2,allPinLabels={...this._getPinLabelsFromPorts()};if(props.pinLabels)for(let[k5,v3]of Object.entries(props.pinLabels))typeof v3=="string"&&(allPinLabels[k5]=v3);let labelToPinNumber=this._getUsbCCanonicalLabelToPinNumberMap(),resolvedDefaultSchPinStyle={};for(let[label,style]of USB_C_DEFAULT_SCH_PIN_STYLE_BY_LABEL){let pinNumber=labelToPinNumber.get(label);typeof pinNumber=="number"&&(resolvedDefaultSchPinStyle[`pin${pinNumber}`]=style)}let mergedSchPinStyle={...resolvedDefaultSchPinStyle,...props.schPinStyle??{}},schPortArrangement=this._getSchematicPortArrangement();return getAllDimensionsForSchematicBox({schWidth:props.schWidth,schHeight:props.schHeight,schPinSpacing:pinSpacing,numericSchPinStyle:getNumericSchPinStyle(mergedSchPinStyle,allPinLabels),pinCount,schPortArrangement:schPortArrangement??void 0,pinLabels:allPinLabels})}get config(){return{componentName:"Connector",zodProps:connectorProps,shouldRenderAsSchematicBox:!0}}doInitialSourceRender(){let{db:db3}=this.root,props=this._getConnectorProps(),manufacturerPartNumber=props.manufacturerPartNumber??props.mfn,source_component=db3.source_component.insert({ftype:"simple_connector",name:this.name,manufacturer_part_number:manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName,standard:props.standard});this.source_component_id=source_component.source_component_id,props.standard&&!manufacturerPartNumber&&db3.source_missing_manufacturer_part_number_warning.insert({source_component_id:this.source_component_id,standard:props.standard,subcircuit_id:this.getSubcircuit()?.subcircuit_id??void 0,warning_type:"source_missing_manufacturer_part_number_warning",message:`${this.getString()} has standard="${props.standard}" but no manufacturerPartNumber (mfn). Add mfn if you do not want the USB-C part to change in future.`})}_isUsingStandardPartsEngineCircuitJsonFlow(){return this._shouldUseStandardPartsEngineCircuitJsonFlow()?!!this.getInheritedProperty("partsEngine")?.fetchPartCircuitJson:!1}doInitialFetchPartFootprint(){let props=this._getConnectorProps(),standard=props.standard;if(!standard||!this._shouldUseStandardPartsEngineCircuitJsonFlow()||this._hasStartedFootprintUrlLoad)return;let partsEngine2=this.getInheritedProperty("partsEngine");if(partsEngine2&&!partsEngine2.fetchPartCircuitJson){this._insertStandardConnectorCircuitJsonError(standard,"partsEngine.fetchPartCircuitJson is not configured");return}let fetchPartCircuitJson=partsEngine2?.fetchPartCircuitJson;if(!fetchPartCircuitJson)return;this._hasStartedFootprintUrlLoad=!0;let sourceComponentForQuery={type:"source_component",ftype:"simple_connector",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,standard};this._queueAsyncEffect("load-standard-connector-circuit-json",async()=>{let{db:db3}=this.root;try{let supplierPartNumbers=await this._getSupplierPartNumbers(partsEngine2,sourceComponentForQuery,`standard:${standard}`);this.source_component_id&&db3.source_component.update(this.source_component_id,{supplier_part_numbers:supplierPartNumbers});let circuitJson=await this._fetchStandardConnectorCircuitJson(fetchPartCircuitJson,supplierPartNumbers,sourceComponentForQuery.manufacturer_part_number);if(!circuitJson)return;this._addConnectorFootprintFromCircuitJson(standard,circuitJson)}catch(error2){this._insertStandardConnectorCircuitJsonError(standard,error2.message)}})}doInitialPartsEngineRender(){this._isUsingStandardPartsEngineCircuitJsonFlow()||super.doInitialPartsEngineRender()}updatePartsEngineRender(){this._isUsingStandardPartsEngineCircuitJsonFlow()||super.updatePartsEngineRender()}doInitialSchematicComponentRender(){if(super.doInitialSchematicComponentRender(),!this.root?.schematicDisabled&&this.schematic_component_id&&this._getConnectorProps().standard==="usb_c"){let usbcSymbol=rc.usbc;usbcSymbol&&insertInnerSymbolInSchematicBox(this,usbcSymbol)}}doInitialPcbComponentSizeCalculation(){if(super.doInitialPcbComponentSizeCalculation(),this.root?.pcbDisabled||!this.pcb_component_id||!this.source_component_id)return;let{db:db3}=this.root,connectorCircuitJson=db3.toArray().filter(elm=>elm.type==="pcb_component"?elm.pcb_component_id===this.pcb_component_id:elm.type==="source_component"?elm.source_component_id===this.source_component_id:"pcb_component_id"in elm&&elm.pcb_component_id===this.pcb_component_id||"source_component_id"in elm&&elm.source_component_id===this.source_component_id);if(connectorCircuitJson.length===0)return;let inferredInsertionCenter=guessCableInsertCenter(connectorCircuitJson);db3.pcb_component.update(this.pcb_component_id,{cable_insertion_center:{x:inferredInsertionCenter.x,y:inferredInsertionCenter.y}})}},PinHeader=class extends NormalComponent3{_getPcbRotationBeforeLayout(){let orientationRotation=this.props.pcbOrientation==="vertical"?-90:0;return(super._getPcbRotationBeforeLayout()??0)+orientationRotation}get config(){return{componentName:"PinHeader",zodProps:pinHeaderProps,shouldRenderAsSchematicBox:!0}}_getImpliedFootprintString(){let pinCount=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:0),holeDiameter=this._parsedProps.holeDiameter,platedDiameter=this._parsedProps.platedDiameter,pitch=this._parsedProps.pitch,showSilkscreenPinLabels=this._parsedProps.showSilkscreenPinLabels,rows=this._parsedProps.doubleRow?2:1,gender=this._parsedProps.gender;if(pinCount>0){let footprintString;if(pitch)!holeDiameter&&!platedDiameter?footprintString=`pinrow${pinCount}_p${pitch}`:footprintString=`pinrow${pinCount}_p${pitch}_id${holeDiameter}_od${platedDiameter}`;else if(!holeDiameter&&!platedDiameter)footprintString=`pinrow${pinCount}`;else return null;return showSilkscreenPinLabels!==!0&&(footprintString+="_nopinlabels"),gender==="female"&&(footprintString+="_female"),rows>1&&(footprintString+=`_rows${rows}`),footprintString}return null}initPorts(){let pinCount=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:1);for(let i3=1;i3<=pinCount;i3++){let rawLabel=Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels[i3-1]:this._parsedProps.pinLabels?.[`pin${i3}`];if(rawLabel){let primaryLabel=Array.isArray(rawLabel)?rawLabel[0]:rawLabel,otherLabels=Array.isArray(rawLabel)?rawLabel.slice(1):[];this.add(new Port({pinNumber:i3,name:primaryLabel,aliases:[`pin${i3}`,...otherLabels]}))}else this.add(new Port({pinNumber:i3,name:`pin${i3}`}))}}_getSchematicPortArrangement(){let pinCount=this._parsedProps.pinCount??1,facingDirection=this._parsedProps.schFacingDirection??this._parsedProps.facingDirection??"right",schPinArrangement=this._parsedProps.schPinArrangement;return facingDirection==="left"?{leftSide:{direction:schPinArrangement?.leftSide?.direction??"top-to-bottom",pins:schPinArrangement?.leftSide?.pins??Array.from({length:pinCount},(_3,i3)=>`pin${i3+1}`)}}:{rightSide:{direction:schPinArrangement?.rightSide?.direction??"top-to-bottom",pins:schPinArrangement?.rightSide?.pins??Array.from({length:pinCount},(_3,i3)=>`pin${i3+1}`)}}}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({ftype:"simple_pin_header",name:this.name,supplier_part_numbers:props.supplierPartNumbers,pin_count:props.pinCount,gender:props.gender,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function getResonatorSymbolName(variant){switch(variant){case"two_ground_pins":return"crystal_4pin";case"ground_pin":return"resonator";case"no_ground":return"crystal";default:return"crystal"}}var Resonator=class extends NormalComponent3{get config(){return{componentName:"Resonator",schematicSymbolName:this.props.symbolName??getResonatorSymbolName(this.props.pinVariant),zodProps:resonatorProps,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,pinVariant=props.pinVariant||"no_ground",source_component=db3.source_component.insert({ftype:"simple_resonator",name:this.name,frequency:props.frequency,load_capacitance:props.loadCapacitance,supplier_part_numbers:props.supplierPartNumbers,pin_variant:pinVariant,are_pins_interchangeable:pinVariant==="no_ground"||pinVariant==="ground_pin",display_name:props.displayName});this.source_component_id=source_component.source_component_id}_getSchematicSymbolDisplayValue(){let freqDisplay=`${formatSiUnit(this._parsedProps.frequency)}Hz`;return this._parsedProps.loadCapacitance?`${freqDisplay} / ${formatSiUnit(this._parsedProps.loadCapacitance)}F`:freqDisplay}};function getPotentiometerSymbolName(variant){switch(variant){case"three_pin":return"potentiometer3";case"two_pin":return"potentiometer2";default:return"potentiometer2"}}var Potentiometer=class extends NormalComponent3{get config(){return{componentName:"Potentiometer",schematicSymbolName:this.props.symbolName??getPotentiometerSymbolName(this.props.pinVariant),zodProps:potentiometerProps,shouldRenderAsSchematicBox:!1}}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.maxResistance)}\u03A9`}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,pinVariant=props.pinVariant||"two_pin",source_component=db3.source_component.insert({ftype:"simple_potentiometer",name:this.name,max_resistance:props.maxResistance,pin_variant:pinVariant,are_pins_interchangeable:pinVariant==="two_pin",display_name:props.displayName,display_max_resistance:this._getSchematicSymbolDisplayValue()});this.source_component_id=source_component.source_component_id}},Crystal=class extends NormalComponent3{get config(){return{schematicSymbolName:this.props.symbolName??(this.props.pinVariant==="four_pin"?"crystal_4pin":"crystal"),componentName:"Crystal",zodProps:crystalProps,sourceFtype:"simple_crystal"}}initPorts(){let additionalAliases=this.props.pinVariant==="four_pin"?{pin1:["left1","1"],pin2:["top1","2","gnd1"],pin3:["right1","3"],pin4:["bottom1","4","gnd2"]}:{pin1:["pos","left"],pin2:["neg","right"]};super.initPorts({additionalAliases})}_getSchematicSymbolDisplayValue(){let freqDisplay=`${formatSiUnit(this._parsedProps.frequency)}Hz`;return this._parsedProps.loadCapacitance?`${freqDisplay} / ${formatSiUnit(this._parsedProps.loadCapacitance)}F`:freqDisplay}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({name:this.name,ftype:"simple_crystal",frequency:props.frequency,load_capacitance:props.loadCapacitance,pin_variant:props.pinVariant||"two_pin",are_pins_interchangeable:(props.pinVariant||"two_pin")==="two_pin",display_name:props.displayName});this.source_component_id=source_component.source_component_id}},Mosfet2=class extends NormalComponent3{get config(){let mosfetMode=this.props.mosfetMode==="depletion"?"d":"e",baseSymbolName=`${this.props.channelType}_channel_${mosfetMode}_mosfet_transistor`;return{componentName:"Mosfet",schematicSymbolName:this.props.symbolName??baseSymbolName,zodProps:mosfetProps,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({ftype:"simple_mosfet",name:this.name,mosfet_mode:props.mosfetMode,channel_type:props.channelType,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},OpAmp=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"inverting_input",this.portMap.inverting_input);__publicField(this,"non_inverting_input",this.portMap.non_inverting_input);__publicField(this,"output",this.portMap.output);__publicField(this,"positive_supply",this.portMap.positive_supply);__publicField(this,"negative_supply",this.portMap.negative_supply)}getSchematicSymbolName(){return this.props.symbolName?this.props.symbolName:this.props.connections?.positive_supply||this.props.connections?.negative_supply?"opamp_with_power":"opamp_no_power"}get config(){return{componentName:"OpAmp",schematicSymbolName:this.getSchematicSymbolName(),zodProps:opampProps,sourceFtype:"simple_op_amp"}}initPorts(){let additionalAliases={pin1:["non_inverting_input"],pin2:["inverting_input"]};this.getSchematicSymbolName()==="opamp_with_power"?Object.assign(additionalAliases,{pin4:["output"],pin5:["positive_supply","vcc","vdd"],pin3:["negative_supply","vee","vss","gnd"]}):Object.assign(additionalAliases,{pin3:["output"],pin4:["positive_supply","vcc","vdd"],pin5:["negative_supply","vee","vss","gnd"]}),super.initPorts({pinCount:5,additionalAliases})}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,source_component=db3.source_component.insert({ftype:"simple_op_amp",name:this.name,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db3}=this.root,invertingInputPort=this.portMap.inverting_input,nonInvertingInputPort=this.portMap.non_inverting_input,outputPort=this.portMap.output,positiveSupplyPort=this.portMap.positive_supply,negativeSupplyPort=this.portMap.negative_supply;!invertingInputPort?.source_port_id||!nonInvertingInputPort?.source_port_id||!outputPort?.source_port_id||!positiveSupplyPort?.source_port_id||!negativeSupplyPort?.source_port_id||db3.simulation_op_amp.insert({type:"simulation_op_amp",source_component_id:this.source_component_id,inverting_input_source_port_id:invertingInputPort.source_port_id,non_inverting_input_source_port_id:nonInvertingInputPort.source_port_id,output_source_port_id:outputPort.source_port_id,positive_supply_source_port_id:positiveSupplyPort.source_port_id,negative_supply_source_port_id:negativeSupplyPort.source_port_id})}};function hasSimProps(props){return props.simSwitchFrequency!==void 0||props.simCloseAt!==void 0||props.simOpenAt!==void 0||props.simStartClosed!==void 0||props.simStartOpen!==void 0}var Switch=class extends NormalComponent3{_getSwitchType(){let props=this._parsedProps;return props?props.dpdt?"dpdt":props.spst?"spst":props.spdt?"spdt":props.dpst?"dpst":props.type??"spst":"spst"}get config(){let switchType=this._getSwitchType(),isNormallyClosed=this._parsedProps?.isNormallyClosed??!1,symbolMap={spst:isNormallyClosed?"spst_normally_closed_switch":"spst_switch",spdt:isNormallyClosed?"spdt_normally_closed_switch":"spdt_switch",dpst:isNormallyClosed?"dpst_normally_closed_switch":"dpst_switch",dpdt:isNormallyClosed?"dpdt_normally_closed_switch":"dpdt_switch"};return{componentName:"Switch",schematicSymbolName:this.props.symbolName??symbolMap[switchType],zodProps:switchProps,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:db3}=this.root,props=this._parsedProps??{},source_component=db3.source_component.insert({ftype:"simple_switch",name:this.name,are_pins_interchangeable:this._getSwitchType()==="spst",display_name:props?.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{_parsedProps:props}=this;if(!hasSimProps(props))return;let{db:db3}=this.root,simulationSwitch={type:"simulation_switch",source_component_id:this.source_component_id||""};props.simSwitchFrequency!==void 0&&(simulationSwitch.switching_frequency=frequency.parse(props.simSwitchFrequency)),props.simCloseAt!==void 0&&(simulationSwitch.closes_at=ms.parse(props.simCloseAt)),props.simOpenAt!==void 0&&(simulationSwitch.opens_at=ms.parse(props.simOpenAt)),props.simStartOpen!==void 0&&(simulationSwitch.starts_closed=!props.simStartOpen),props.simStartClosed!==void 0&&(simulationSwitch.starts_closed=props.simStartClosed),db3.simulation_switch.insert(simulationSwitch)}},TESTPOINT_DEFAULTS={HOLE_DIAMETER:.5,SMT_CIRCLE_DIAMETER:1.2,SMT_RECT_SIZE:2},TestPoint=class extends NormalComponent3{get config(){return{componentName:"TestPoint",schematicSymbolName:this.props.symbolName??"testpoint",zodProps:testpointProps,sourceFtype:FTYPE.simple_test_point}}_getPropsWithDefaults(){let{padShape,holeDiameter,footprintVariant,padDiameter,width,height}=this._parsedProps;return!footprintVariant&&holeDiameter&&(footprintVariant="through_hole"),footprintVariant??(footprintVariant="through_hole"),padShape??(padShape="circle"),footprintVariant==="pad"?padShape==="circle"?padDiameter??(padDiameter=TESTPOINT_DEFAULTS.SMT_CIRCLE_DIAMETER):padShape==="rect"&&(width??(width=TESTPOINT_DEFAULTS.SMT_RECT_SIZE),height??(height=width)):footprintVariant==="through_hole"&&(holeDiameter??(holeDiameter=TESTPOINT_DEFAULTS.HOLE_DIAMETER)),{padShape,holeDiameter,footprintVariant,padDiameter,width,height}}_getImpliedFootprintString(){let{padShape,holeDiameter,footprintVariant,padDiameter,width,height}=this._getPropsWithDefaults();if(footprintVariant==="through_hole")return`platedhole_d${holeDiameter}`;if(footprintVariant==="pad"){if(padShape==="circle")return`smtpad_circle_d${padDiameter}`;if(padShape==="rect")return`smtpad_rect_w${width}_h${height}`}throw new Error(`Footprint variant "${footprintVariant}" with pad shape "${padShape}" not implemented`)}doInitialSourceRender(){let{db:db3}=this.root,{_parsedProps:props}=this,{padShape,holeDiameter,footprintVariant,padDiameter,width,height}=this._getPropsWithDefaults(),source_component=db3.source_component.insert({ftype:FTYPE.simple_test_point,name:this.name,supplier_part_numbers:props.supplierPartNumbers,footprint_variant:footprintVariant,pad_shape:padShape,pad_diameter:padDiameter,hole_diameter:holeDiameter,width,height,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function getTitleAnchorAndPosition({anchor,x:x4,y:y3,width,height,isInside}){switch(anchor){case"top_left":return{x:x4,y:y3+height,textAnchor:isInside?"top_left":"bottom_left"};case"top_center":return{x:x4+width/2,y:y3+height,textAnchor:isInside?"top_center":"bottom_center"};case"top_right":return{x:x4+width,y:y3+height,textAnchor:isInside?"top_right":"bottom_right"};case"center_left":return{x:x4,y:y3+height/2,textAnchor:isInside?"center_left":"center_right"};case"center":return{x:x4+width/2,y:y3+height/2,textAnchor:"center"};case"center_right":return{x:x4+width,y:y3+height/2,textAnchor:isInside?"center_right":"center_left"};case"bottom_left":return{x:x4,y:y3,textAnchor:isInside?"bottom_left":"top_left"};case"bottom_center":return{x:x4+width/2,y:y3,textAnchor:isInside?"bottom_center":"top_center"};case"bottom_right":return{x:x4+width,y:y3,textAnchor:isInside?"bottom_right":"top_right"};default:return{x:x4+width/2,y:y3+height,textAnchor:"center"}}}var SchematicBox=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicBox",zodProps:schematicBoxProps,shouldRenderAsSchematicBox:!0}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db3}=this.root,{_parsedProps:props}=this,basePadding=.6,generalPadding=typeof props.padding=="number"?props.padding:0,paddingTop=typeof props.paddingTop=="number"?props.paddingTop:generalPadding,paddingBottom=typeof props.paddingBottom=="number"?props.paddingBottom:generalPadding,paddingLeft=typeof props.paddingLeft=="number"?props.paddingLeft:generalPadding,paddingRight=typeof props.paddingRight=="number"?props.paddingRight:generalPadding,hasOverlay=props.overlay&&props.overlay.length>0,hasFixedSize=typeof props.width=="number"&&typeof props.height=="number",width,height,x4,y3,centerX,centerY;if(hasOverlay){let portsWithPosition=props.overlay.map(selector=>({selector,port:this.getSubcircuit().selectOne(selector,{type:"port"})})).filter(({port})=>port!=null).map(({port})=>({position:port._getGlobalSchematicPositionAfterLayout()}));if(portsWithPosition.length===0)return;let xs3=portsWithPosition.map(p5=>p5.position.x),ys3=portsWithPosition.map(p5=>p5.position.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3),rawWidth=maxX-minX,rawHeight=maxY-minY,defaultHorizontalPadding=rawWidth===0?basePadding:0,defaultVerticalPadding=rawHeight===0?basePadding:0,finalPaddingLeft=paddingLeft+defaultHorizontalPadding/2,finalPaddingRight=paddingRight+defaultHorizontalPadding/2,finalPaddingTop=paddingTop+defaultVerticalPadding/2,finalPaddingBottom=paddingBottom+defaultVerticalPadding/2,left=minX-finalPaddingLeft,right=maxX+finalPaddingRight,top=minY-finalPaddingBottom,bottom=maxY+finalPaddingTop;width=right-left,height=bottom-top,x4=left+(props.schX??0),y3=top+(props.schY??0),centerX=x4+width/2,centerY=y3+height/2}else if(hasFixedSize){width=props.width,height=props.height;let center2=this._getGlobalSchematicPositionBeforeLayout();centerX=center2.x,centerY=center2.y,x4=centerX-width/2,y3=centerY-height/2}else return;if(db3.schematic_box.insert({height,width,x:x4,y:y3,is_dashed:props.strokeStyle==="dashed"}),props.title){let isInside=props.titleInside,TITLE_PADDING=.1,anchor=props.titleAlignment,anchorPos=getTitleAnchorAndPosition({anchor,x:x4,y:y3,width,height,isInside}),titleOffsetY,titleOffsetX,textAnchor=anchorPos.textAnchor;isInside?(titleOffsetY=anchor.includes("top")?-TITLE_PADDING:anchor.includes("bottom")?TITLE_PADDING:0,titleOffsetX=anchor.includes("left")?TITLE_PADDING:anchor.includes("right")?-TITLE_PADDING:0):(titleOffsetY=anchor.includes("top")?TITLE_PADDING:anchor.includes("bottom")?-TITLE_PADDING:0,titleOffsetX=anchor.includes("center_left")?-TITLE_PADDING:anchor.includes("center_right")?TITLE_PADDING:0);let titleX=anchorPos.x+titleOffsetX,titleY=anchorPos.y+titleOffsetY;db3.schematic_text.insert({anchor:textAnchor,text:props.title,font_size:props.titleFontSize??.18,color:props.titleColor??"#000000",position:{x:titleX,y:titleY},rotation:0,schematic_sheet_id:this._resolveSchematicSheetId()})}}},SchematicSection=class _SchematicSection extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicSection",zodProps:schematicSectionProps}}_computeSectionBounds(board,sectionName){let{db:db3}=this.root,members=board.getDescendants().filter(c6=>c6.getSchematicSectionName()===sectionName);if(members.length===0)return null;let positions=[];for(let member of members){let schematicComponentId=member.schematic_component_id;if(!schematicComponentId)continue;let schComp=db3.schematic_component.get(schematicComponentId);if(!schComp)continue;let hw2=schComp.size.width/2,hh3=schComp.size.height/2;positions.push({minX:schComp.center.x-hw2,maxX:schComp.center.x+hw2,minY:schComp.center.y-hh3,maxY:schComp.center.y+hh3})}return positions.length===0?null:computeBoundsFromCellContents(positions)}doInitialSchematicSectionRender(){if(this.root?.schematicDisabled)return;let board=this.root?._getBoard();if(!board)return;let allSections=board.getDescendants().filter(c6=>c6 instanceof _SchematicSection);if(allSections[0]!==this)return;let{db:db3}=this.root,PADDING=.5,LABEL_PADDING=.2,STROKE_WIDTH=.02,TOL42=.001,namedSectionsWithBounds=allSections.map(section=>{let bounds=section._computeSectionBounds(board,section._parsedProps.name);return bounds?{displayName:section._parsedProps.displayName,sectionTitleFontSize:section._parsedProps.sectionTitleFontSize,rawBounds:bounds,cell:{minX:bounds.minX-PADDING,maxX:bounds.maxX+PADDING,minY:bounds.minY-PADDING,maxY:bounds.maxY+PADDING}}:null}).filter(s6=>s6!==null),unsectionedBounds=this._computeSectionBounds(board,null),allSectionsWithBounds=[...namedSectionsWithBounds];if(unsectionedBounds&&allSectionsWithBounds.push({displayName:void 0,sectionTitleFontSize:void 0,rawBounds:unsectionedBounds,cell:{minX:unsectionedBounds.minX-PADDING,maxX:unsectionedBounds.maxX+PADDING,minY:unsectionedBounds.minY-PADDING,maxY:unsectionedBounds.maxY+PADDING}}),allSectionsWithBounds.length===0)return;let allCells=allSectionsWithBounds.map(s6=>s6.cell),outer=computeBoundsFromCellContents(allCells),CELL_MARGIN=1,dividers=calculateCellBoundaries2(allSectionsWithBounds.map(s6=>({minX:s6.rawBounds.minX-CELL_MARGIN,maxX:s6.rawBounds.maxX+CELL_MARGIN,minY:s6.rawBounds.minY-CELL_MARGIN,maxY:s6.rawBounds.maxY+CELL_MARGIN})));for(let line2 of dividers)db3.schematic_line.insert({x1:line2.start.x,y1:line2.start.y,x2:line2.end.x,y2:line2.end.y,stroke_width:STROKE_WIDTH,color:"#000000",is_dashed:!1,schematic_sheet_id:this._resolveSchematicSheetId()});let hDividers=dividers.filter(l7=>Math.abs(l7.start.y-l7.end.y)<TOL42),vDividers=dividers.filter(l7=>Math.abs(l7.start.x-l7.end.x)<TOL42);for(let{displayName,sectionTitleFontSize,rawBounds}of allSectionsWithBounds){if(!displayName)continue;let dividersAbove=hDividers.map(l7=>l7.start.y).filter(y3=>y3>rawBounds.maxY),topBoundary=dividersAbove.length>0?Math.min(...dividersAbove):outer.maxY,dividersToLeft=vDividers.map(l7=>l7.start.x).filter(x4=>x4<rawBounds.minX),leftBoundary=dividersToLeft.length>0?Math.max(...dividersToLeft):outer.minX;db3.schematic_text.insert({anchor:"top_left",text:displayName,font_size:sectionTitleFontSize??.18,color:"#000000",position:{x:leftBoundary+LABEL_PADDING,y:topBoundary-LABEL_PADDING},rotation:0,schematic_sheet_id:this._resolveSchematicSheetId()})}}},SchematicSheet=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicSheet",zodProps:schematicSheetProps}}doInitialSourceGroupRender(){if(this.root?.schematicDisabled)return;let{db:db3}=this.root,{_parsedProps:props}=this,schematicSheet=db3.schematic_sheet.insert({name:props.name,display_name:props.displayName,sheet_index:props.sheetIndex,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_sheet_id=schematicSheet.schematic_sheet_id}doInitialSchematicSheetRender(){if(this.root?.schematicDisabled||!this.schematic_sheet_id)return;let{db:db3}=this.root,schematicElements=[...db3.schematic_component.list(),...db3.schematic_port.list(),...db3.schematic_text.list(),...db3.schematic_line.list(),...db3.schematic_rect.list(),...db3.schematic_circle.list(),...db3.schematic_arc.list(),...db3.schematic_path.list()].filter(element=>element.schematic_sheet_id===this.schematic_sheet_id);if(schematicElements.length===0)return;let bounds=getBoundsForSchematic(schematicElements);!Number.isFinite(bounds.minX)||!Number.isFinite(bounds.maxX)||!Number.isFinite(bounds.minY)||!Number.isFinite(bounds.maxY)||db3.schematic_sheet.update(this.schematic_sheet_id,{center:{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2}})}},SchematicTable=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_table_id",null)}get config(){return{componentName:"SchematicTable",zodProps:schematicTableProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db3}=this.root,{_parsedProps:props}=this,rows=this.children.filter(c6=>c6.componentName==="SchematicRow");if(rows.length===0)return;let grid4=[],maxCols=0;for(let row of rows){let cells=row.children.filter(c6=>c6.componentName==="SchematicCell");maxCols=Math.max(maxCols,cells.length)}for(let i3=0;i3<rows.length;i3++)grid4[i3]=[];for(let i3=0;i3<rows.length;i3++){let cells=rows[i3].children.filter(c6=>c6.componentName==="SchematicCell"),k5=0;for(let j5=0;j5<cells.length;j5++){for(;grid4[i3][k5];)k5++;let cell=cells[j5],colSpan=cell._parsedProps.colSpan??1,rowSpan=cell._parsedProps.rowSpan??1;for(let r6=0;r6<rowSpan;r6++)for(let c6=0;c6<colSpan;c6++)grid4[i3+r6]||(grid4[i3+r6]=[]),grid4[i3+r6][k5+c6]=cell;k5+=colSpan}}maxCols=Math.max(0,...grid4.map(r6=>r6.length));let rowHeights=rows.map((row,i3)=>row._parsedProps.height??1),colWidths=Array.from({length:maxCols},(_3,j5)=>{let maxWidth=0;for(let i3=0;i3<rows.length;i3++){let cell=grid4[i3]?.[j5];if(cell){let text=cell._parsedProps.text??cell._parsedProps.children,cellWidth=cell._parsedProps.width??(text?.length??2)*.5;cellWidth>maxWidth&&(maxWidth=cellWidth)}}return maxWidth||10}),anchorPos=this._getGlobalSchematicPositionBeforeLayout(),table=db3.schematic_table.insert({anchor_position:anchorPos,column_widths:colWidths,row_heights:rowHeights,cell_padding:props.cellPadding,border_width:props.borderWidth,anchor:props.anchor,subcircuit_id:this.getSubcircuit()?.subcircuit_id||"",schematic_component_id:this.parent?.schematic_component_id||"",schematic_sheet_id:this._resolveSchematicSheetId()});this.schematic_table_id=table.schematic_table_id;let processedCells=new Set,yOffset=0;for(let i3=0;i3<rows.length;i3++){let xOffset=0;for(let j5=0;j5<maxCols;j5++){let cell=grid4[i3]?.[j5];if(cell&&!processedCells.has(cell)){processedCells.add(cell);let cellProps=cell._parsedProps,rowSpan=cellProps.rowSpan??1,colSpan=cellProps.colSpan??1,cellWidth=0;for(let c6=0;c6<colSpan;c6++)cellWidth+=colWidths[j5+c6];let cellHeight=0;for(let r6=0;r6<rowSpan;r6++)cellHeight+=rowHeights[i3+r6];db3.schematic_table_cell.insert({schematic_table_id:this.schematic_table_id,start_row_index:i3,end_row_index:i3+rowSpan-1,start_column_index:j5,end_column_index:j5+colSpan-1,text:cellProps.text??cellProps.children,center:{x:anchorPos.x+xOffset+cellWidth/2,y:anchorPos.y-yOffset-cellHeight/2},width:cellWidth,height:cellHeight,horizontal_align:cellProps.horizontalAlign,vertical_align:cellProps.verticalAlign,font_size:cellProps.fontSize??props.fontSize,subcircuit_id:this.getSubcircuit()?.subcircuit_id||""})}colWidths[j5]&&(xOffset+=colWidths[j5])}yOffset+=rowHeights[i3]}}},SchematicRow=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicRow",zodProps:schematicRowProps}}},SchematicCell=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"canHaveTextChildren",!0)}get config(){return{componentName:"SchematicCell",zodProps:schematicCellProps}}},AnalogSimulation=class extends PrimitiveComponent2{get config(){return{componentName:"AnalogSimulation",zodProps:analogSimulationProps}}doInitialSimulationRender(){let{db:db3}=this.root,{duration,name,startTime,timePerStep,spiceOptions:spiceOptions2}=this._parsedProps,durationMs=duration||10,timePerStepMs=timePerStep||.01;db3.simulation_experiment.insert({name:name??"spice_transient_analysis",experiment_type:"spice_transient_analysis",end_time_ms:durationMs,start_time_ms:startTime,time_per_step:timePerStepMs,spice_options:spiceOptions2})}};function getLabelBounds2(probePosition,labelText,alignment,labelOffset=.3){let labelWidth=Math.max(labelText.length*.1,.3),labelHeightWithPadding=.25+.2,anchorX=probePosition.x,anchorY=probePosition.y,offsetMultiplier=labelOffset+labelWidth/2;alignment.includes("top")?anchorY+=offsetMultiplier:alignment.includes("bottom")&&(anchorY-=offsetMultiplier),alignment.includes("right")?anchorX+=offsetMultiplier:alignment.includes("left")&&(anchorX-=offsetMultiplier);let minX,maxX,minY,maxY;return alignment.includes("left")?(minX=anchorX,maxX=anchorX+labelWidth):alignment.includes("right")?(minX=anchorX-labelWidth,maxX=anchorX):(minX=anchorX-labelWidth/2,maxX=anchorX+labelWidth/2),alignment.includes("top")?(minY=anchorY-labelHeightWithPadding,maxY=anchorY):alignment.includes("bottom")?(minY=anchorY,maxY=anchorY+labelHeightWithPadding):(minY=anchorY-labelHeightWithPadding/2,maxY=anchorY+labelHeightWithPadding/2),{minX,maxX,minY,maxY}}function getElementBounds(elm){let cx3,cy3,w4,h3;if(elm.type==="schematic_component")cx3=elm.center?.x,cy3=elm.center?.y,w4=elm.size?.width,h3=elm.size?.height;else if(elm.type==="schematic_text")cx3=elm.position?.x,cy3=elm.position?.y,w4=(elm.text?.length??0)*.1,h3=.2;else return null;return typeof cx3=="number"&&typeof cy3=="number"&&typeof w4=="number"&&typeof h3=="number"?{minX:cx3-w4/2,maxX:cx3+w4/2,minY:cy3-h3/2,maxY:cy3+h3/2}:null}function getOverlapArea(a3,b4){if(!doBoundsOverlap(a3,b4))return 0;let overlapWidth=Math.min(a3.maxX,b4.maxX)-Math.max(a3.minX,b4.minX),overlapHeight=Math.min(a3.maxY,b4.maxY)-Math.max(a3.minY,b4.minY);return overlapWidth*overlapHeight}function selectBestLabelAlignment({probePosition,labelText,schematicElements,defaultAlignment="top_right"}){let orderedAlignments=[defaultAlignment,...["top_right","top_left","bottom_right","bottom_left","top_center","bottom_center","center_right","center_left"].filter(a3=>a3!==defaultAlignment)],bestAlignment=defaultAlignment,minOverlapArea=1/0;for(let alignment of orderedAlignments){let labelBounds=getLabelBounds2(probePosition,labelText,alignment),totalOverlapArea=0;for(let element of schematicElements){let elementBounds=getElementBounds(element);elementBounds&&(totalOverlapArea+=getOverlapArea(labelBounds,elementBounds))}if(totalOverlapArea===0)return alignment;totalOverlapArea<minOverlapArea&&(minOverlapArea=totalOverlapArea,bestAlignment=alignment)}return bestAlignment}var VoltageProbe=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"simulation_voltage_probe_id",null);__publicField(this,"schematic_voltage_probe_id",null);__publicField(this,"finalProbeName",null);__publicField(this,"color",null)}get config(){return{componentName:"VoltageProbe",zodProps:voltageProbeProps}}doInitialSimulationRender(){let{db:db3}=this.root,{connectsTo,name,referenceTo,color,graphDisplayName,graphCenter,graphVerticalOffset,graphVoltagePerDiv}=this._parsedProps,subcircuit=this.getSubcircuit();if(!subcircuit){this.renderError("VoltageProbe must be inside a subcircuit");return}let targets=Array.isArray(connectsTo)?connectsTo:[connectsTo];if(targets.length!==1){this.renderError("VoltageProbe must connect to exactly one port or net");return}let targetSelector=targets[0],port=subcircuit.selectOne(targetSelector,{type:"port"}),net=port?null:subcircuit.selectOne(targetSelector,{type:"net"});if(net&&net.componentName!=="Net"){this.renderError(`VoltageProbe connection target "${targetSelector}" resolved to a non-net component "${net.componentName}".`);return}if(!port&&!net){this.renderError(`VoltageProbe could not find connection target "${targetSelector}"`);return}let connectedId=port?.source_port_id??net?.source_net_id;if(!connectedId){this.renderError("Could not identify connected source for VoltageProbe");return}let referencePort=null,referenceNet=null;if(referenceTo){let referenceTargets=Array.isArray(referenceTo)?referenceTo:[referenceTo];if(referenceTargets.length!==1){this.renderError("VoltageProbe must reference exactly one port or net");return}let referenceSelector=referenceTargets[0];if(referencePort=subcircuit.selectOne(referenceSelector,{type:"port"}),referenceNet=referencePort?null:subcircuit.selectOne(referenceSelector,{type:"net"}),referenceNet&&referenceNet.componentName!=="Net"){this.renderError(`VoltageProbe reference target "${referenceSelector}" resolved to a non-net component "${referenceNet.componentName}".`);return}if(!referencePort&&!referenceNet){this.renderError(`VoltageProbe could not find reference target "${referenceSelector}"`);return}}this.color=color??getSimulationColorForId(connectedId);let finalName=name;finalName||(finalName=targets[0].split(" > ").map(s6=>s6.replace(/^\./,"")).join(".")),this.finalProbeName=finalName??null;let{simulation_voltage_probe_id}=db3.simulation_voltage_probe.insert({name:finalName,signal_input_source_port_id:port?.source_port_id??void 0,signal_input_source_net_id:net?.source_net_id??void 0,reference_input_source_port_id:referencePort?.source_port_id??void 0,reference_input_source_net_id:referenceNet?.source_net_id??void 0,subcircuit_id:subcircuit.subcircuit_id||void 0,color:this.color});if(this.simulation_voltage_probe_id=simulation_voltage_probe_id,graphDisplayName!==void 0||graphCenter!==void 0||graphVerticalOffset!==void 0||graphVoltagePerDiv!==void 0){let graphVoltagePerDivValue=parseSimulationGraphValue(graphVoltagePerDiv),graphVerticalOffsetValue=parseSimulationGraphValue(graphVerticalOffset);db3.simulation_oscilloscope_trace.insert({simulation_voltage_probe_id,display_name:graphDisplayName,color:color??void 0,display_center_value:graphCenter,volts_per_div:graphVoltagePerDivValue,display_center_offset_divs:graphVerticalOffsetValue!==void 0&&graphVoltagePerDivValue!==void 0&&graphVoltagePerDivValue!==0?graphVerticalOffsetValue/graphVoltagePerDivValue:void 0})}}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled)return;let{db:db3}=this.root,{connectsTo,name}=this._parsedProps,subcircuit=this.getSubcircuit();if(!subcircuit)return;let targets=Array.isArray(connectsTo)?connectsTo:[connectsTo];if(targets.length!==1)return;let targetSelector=targets[0],port=subcircuit.selectOne(targetSelector,{type:"port"});if(!port||!port.schematic_port_id)return;let position4=port._getGlobalSchematicPositionAfterLayout(),targetTraceId=null;for(let trace of db3.schematic_trace.list()){for(let edge of trace.edges)if(Math.abs(edge.from.x-position4.x)<1e-6&&Math.abs(edge.from.y-position4.y)<1e-6||Math.abs(edge.to.x-position4.x)<1e-6&&Math.abs(edge.to.y-position4.y)<1e-6){targetTraceId=trace.schematic_trace_id;break}if(targetTraceId)break}if(!targetTraceId)return;let probeName=this.finalProbeName,labelAlignment=selectBestLabelAlignment({probePosition:position4,labelText:probeName,schematicElements:[...db3.schematic_component.list(),...db3.schematic_text.list()],defaultAlignment:"top_right"}),schematic_voltage_probe3=db3.schematic_voltage_probe.insert({name:probeName,position:position4,schematic_trace_id:targetTraceId,subcircuit_id:subcircuit.subcircuit_id||void 0,color:this.color??void 0,label_alignment:labelAlignment});this.schematic_voltage_probe_id=schematic_voltage_probe3.schematic_voltage_probe_id}},SpiceModel=class extends PrimitiveComponent2{get config(){return{componentName:"SpiceModel",zodProps:spicemodelProps}}doInitialSimulationRender(){let parent=this.parent;if(!parent)return;let parentSourceComponentId=parent.source_component_id;if(!parentSourceComponentId){this._insertSpiceModelError("spicemodel must be attached to a source component.",this._parsedProps);return}let{source,spicePinMapping}=this._parsedProps,subckt=parseSpiceNetlist(source).subckts[0]??null,spicePinNames=subckt?.pins.map(pin=>pin.name);if(!subckt||!spicePinNames||spicePinNames.length===0){this._insertSpiceModelError("spicemodel source must contain a .subckt declaration with a model name and pins.",source);return}let mapping=spicePinMapping??{};for(let spicePinName of Object.keys(mapping))if(!spicePinNames.includes(spicePinName)){this._insertSpiceModelError(`spicePinMapping references SPICE pin "${spicePinName}", but it is not present in .subckt ${subckt.name}.`,mapping);return}let spicePinToSourcePortMap={},seenSourcePortIds=new Set;for(let spicePinName of spicePinNames){let componentPinName=mapping[spicePinName]??spicePinName,matchingPorts=parent.selectAll("port").filter(port=>port instanceof Port&&port.isMatchingAnyOf([componentPinName]));if(matchingPorts.length!==1||!matchingPorts[0].source_port_id){this._insertSpiceModelError(`Could not resolve SPICE pin "${spicePinName}" to exactly one component port using "${componentPinName}".`,mapping);return}let sourcePortId=matchingPorts[0].source_port_id;if(seenSourcePortIds.has(sourcePortId)){this._insertSpiceModelError(`spicePinMapping maps more than one SPICE pin to component port "${componentPinName}".`,mapping);return}seenSourcePortIds.add(sourcePortId),spicePinToSourcePortMap[spicePinName]=sourcePortId}this.root.db.simulation_spice_subcircuit.insert({source_component_id:parentSourceComponentId,spice_pin_to_source_port_map:spicePinToSourcePortMap,subcircuit_source:source})}_insertSpiceModelError(message,propertyValue){this.root.db.source_invalid_component_property_error.insert({source_component_id:this.parent?.source_component_id||"",property_name:"spiceModel",property_value:propertyValue,message,error_type:"source_invalid_component_property_error"})}},RootCircuit=class extends IsolatedCircuit{constructor({platform,projectUrl}={}){super({platform,projectUrl,cachedSubcircuits:new Map,pendingSubcircuitRenders:new Map});__publicField(this,"isRootCircuit",!0);this.root=this}},Project=RootCircuit,Circuit=RootCircuit,useRenderedCircuit=reactElements=>{let[isLoading,setIsLoading]=import_react6.default.useState(!0),[error2,setError]=import_react6.default.useState(null),[circuit,setCircuit]=import_react6.default.useState(),[circuitJson,setCircuitJson]=import_react6.default.useState();return import_react6.default.useEffect(()=>{setIsLoading(!0),setError(null),reactElements&&setTimeout(()=>{try{let circuit2=new RootCircuit;circuit2.add(reactElements),setCircuit(circuit2),setCircuitJson(circuit2.toJson())}catch(error22){setError(error22)}setIsLoading(!1)},1)},[reactElements]),{isLoading,error:error2,circuit,circuitJson}},createUseComponent=(Component2,pins)=>(name,props)=>{let pinLabelsFlatArray=[];Array.isArray(pins)?pinLabelsFlatArray.push(...pins.flat()):typeof pins=="object"&&pinLabelsFlatArray.push(...Object.values(pins).flat(),...Object.keys(pins));let R6=props2=>{if(props2?.name&&props2.name!==name)throw new Error(`Component name mismatch. Hook name: ${name}, Component prop name: ${props2.name}`);let combinedProps={...props,...props2,name},tracesToCreate=[];for(let portLabel of pinLabelsFlatArray)if(combinedProps[portLabel]){let from=`.${name} > .${portLabel}`,to3=combinedProps[portLabel];tracesToCreate.push({from,to:to3}),delete combinedProps[portLabel]}return(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Component2,{...combinedProps}),tracesToCreate.map((trace,i3)=>(0,import_jsx_runtime.jsx)("trace",{...trace},i3))]})};for(let port of pinLabelsFlatArray)R6[port]=`.${name} > .${port}`;return R6},useCapacitor=createUseComponent(props=>(0,import_jsx_runtime2.jsx)("capacitor",{...props}),capacitorPins),useChip=pinLabels=>createUseComponent(props=>(0,import_jsx_runtime3.jsx)("chip",{pinLabels,...props}),pinLabels),useDiode=createUseComponent(props=>(0,import_jsx_runtime4.jsx)("diode",{...props}),diodePins),useLed=createUseComponent(props=>(0,import_jsx_runtime5.jsx)("led",{...props}),ledPins),useResistor=createUseComponent(props=>(0,import_jsx_runtime6.jsx)("resistor",{...props}),resistorPins),sel=new Proxy(refdes=>new Proxy({},{get:(_3,pin)=>`.${refdes} > .${pin}`}),{get:(_3,prop1)=>{let fn3=(...args)=>{let chipFnOrPinType=args[0];return new Proxy({},{get:(_22,pinName)=>`.${prop1} > .${pinName}`})};return new Proxy(fn3,{get:(_22,prop2)=>prop1==="net"?`net.${prop2}`:prop1==="subcircuit"?new Proxy({},{get:(_32,prop3)=>new Proxy({},{get:(_4,prop4)=>`subcircuit.${prop2} > .${prop3} > .${prop4}`})}):`.${prop1} > .${prop2}`,apply:(target,_22,args)=>prop1==="net"?new Proxy({},{get:(_32,netName)=>`net.${netName}`}):new Proxy({},{get:(_32,pinOrSubComponentName)=>{let pinResult=`.${prop1} > .${pinOrSubComponentName}`;return["U","J","CN"].some(p5=>prop1.startsWith(p5))?pinResult:new Proxy(new String(pinResult),{get:(_4,nestedProp)=>typeof nestedProp=="symbol"||nestedProp==="toString"?()=>pinResult:`.${prop1} > .${pinOrSubComponentName} > .${nestedProp}`})}})})}});extendCatalogue(components_exports);extendCatalogue({Bug:Chip,Fanout:Breakout,FanoutPoint:BreakoutPoint});var React3=__toESM(require_react(),1),ReactJsxRuntime=__toESM(require_jsx_runtime(),1);var dist_exports5={};__export(dist_exports5,{default:()=>mm_default2,mil2mm:()=>mil2mm,mm:()=>mm4,mmStr:()=>mmStr});var unitToMm2={in:25.4,inch:25.4,mil:.0254,mm:1,m:1e3,cm:10,ft:304.8,feet:304.8},mmNumberFormatter=new Intl.NumberFormat("en-US",{useGrouping:!1,notation:"standard",maximumFractionDigits:12}),mm4=n3=>{let unit=typeof n3=="number"?"mm":n3.replace(/^[^a-zA-Z]+/g,"").toLowerCase();unit||(unit="mm");let val=typeof n3=="number"?n3:Number.parseFloat(n3.split(unit)[0]);if(unit in unitToMm2)return val*unitToMm2[unit];throw new Error(`Unsupported unit: ${unit}`)},mmStr=n3=>`${mmNumberFormatter.format(mm4(n3))}mm`,mil2mm=mil=>typeof mil=="number"?mm4(`${mil}mil`):mil.match(/^\d+$/)?mm4(`${mil}mil`):mm4(mil),mm_default2=mm4;var __defProp5=Object.defineProperty,__export4=(target,all)=>{for(var name in all)__defProp5(target,name,{get:all[name],enumerable:!0})},dist_exports6={};__export4(dist_exports6,{all_layers:()=>all_layers2,any_circuit_element:()=>any_circuit_element2,any_soup_element:()=>any_soup_element2,any_source_component:()=>any_source_component2,asset:()=>asset2,base_circuit_json_error:()=>base_circuit_json_error2,battery_capacity:()=>battery_capacity2,brep_shape:()=>brep_shape2,cadModelDefaultDirectionMap:()=>cadModelDefaultDirectionMap2,cad_component:()=>cad_component2,cad_model_axis_directions:()=>cad_model_axis_directions2,cad_model_formats:()=>cad_model_formats2,capacitance:()=>capacitance2,circuit_json_footprint_load_error:()=>circuit_json_footprint_load_error2,current:()=>current2,distance:()=>distance7,duration_ms:()=>duration_ms2,experiment_type:()=>experiment_type2,external_footprint_load_error:()=>external_footprint_load_error2,frequency:()=>frequency2,getZodPrefixedIdWithDefault:()=>getZodPrefixedIdWithDefault2,inductance:()=>inductance2,kicadAt:()=>kicadAt3,kicadEffects:()=>kicadEffects3,kicadFont:()=>kicadFont3,kicadFootprintAttributes:()=>kicadFootprintAttributes3,kicadFootprintMetadata:()=>kicadFootprintMetadata3,kicadFootprintModel:()=>kicadFootprintModel3,kicadFootprintPad:()=>kicadFootprintPad3,kicadFootprintProperties:()=>kicadFootprintProperties3,kicadProperty:()=>kicadProperty3,kicadSymbolEffects:()=>kicadSymbolEffects3,kicadSymbolMetadata:()=>kicadSymbolMetadata3,kicadSymbolPinNames:()=>kicadSymbolPinNames3,kicadSymbolPinNumbers:()=>kicadSymbolPinNumbers3,kicadSymbolProperties:()=>kicadSymbolProperties3,kicadSymbolProperty:()=>kicadSymbolProperty3,layer_ref:()=>layer_ref2,layer_string:()=>layer_string2,length:()=>length3,ms:()=>ms4,ninePointAnchor:()=>ninePointAnchor3,pcbRenderLayer:()=>pcbRenderLayer2,pcb_autorouting_error:()=>pcb_autorouting_error2,pcb_board:()=>pcb_board2,pcb_breakout_point:()=>pcb_breakout_point2,pcb_component:()=>pcb_component2,pcb_component_invalid_layer_error:()=>pcb_component_invalid_layer_error2,pcb_component_not_on_board_edge_error:()=>pcb_component_not_on_board_edge_error2,pcb_component_outside_board_error:()=>pcb_component_outside_board_error2,pcb_connector_not_in_accessible_orientation_warning:()=>pcb_connector_not_in_accessible_orientation_warning2,pcb_copper_pour:()=>pcb_copper_pour2,pcb_copper_pour_brep:()=>pcb_copper_pour_brep2,pcb_copper_pour_polygon:()=>pcb_copper_pour_polygon2,pcb_copper_pour_rect:()=>pcb_copper_pour_rect2,pcb_copper_text:()=>pcb_copper_text2,pcb_courtyard_circle:()=>pcb_courtyard_circle2,pcb_courtyard_outline:()=>pcb_courtyard_outline2,pcb_courtyard_overlap_error:()=>pcb_courtyard_overlap_error2,pcb_courtyard_polygon:()=>pcb_courtyard_polygon2,pcb_courtyard_rect:()=>pcb_courtyard_rect2,pcb_cutout:()=>pcb_cutout2,pcb_cutout_circle:()=>pcb_cutout_circle2,pcb_cutout_path:()=>pcb_cutout_path2,pcb_cutout_polygon:()=>pcb_cutout_polygon2,pcb_cutout_rect:()=>pcb_cutout_rect2,pcb_fabrication_note_dimension:()=>pcb_fabrication_note_dimension2,pcb_fabrication_note_path:()=>pcb_fabrication_note_path2,pcb_fabrication_note_rect:()=>pcb_fabrication_note_rect2,pcb_fabrication_note_text:()=>pcb_fabrication_note_text2,pcb_footprint_overlap_error:()=>pcb_footprint_overlap_error2,pcb_ground_plane:()=>pcb_ground_plane2,pcb_ground_plane_region:()=>pcb_ground_plane_region2,pcb_group:()=>pcb_group2,pcb_hole:()=>pcb_hole2,pcb_hole_circle_or_square_shape:()=>pcb_hole_circle_or_square_shape2,pcb_hole_circle_shape:()=>pcb_hole_circle_shape2,pcb_hole_oval_shape:()=>pcb_hole_oval_shape2,pcb_hole_pill_shape:()=>pcb_hole_pill_shape2,pcb_hole_rect_shape:()=>pcb_hole_rect_shape2,pcb_hole_rotated_pill_shape:()=>pcb_hole_rotated_pill_shape2,pcb_keepout:()=>pcb_keepout2,pcb_manual_edit_conflict_warning:()=>pcb_manual_edit_conflict_warning2,pcb_missing_footprint_error:()=>pcb_missing_footprint_error2,pcb_net:()=>pcb_net2,pcb_note_dimension:()=>pcb_note_dimension2,pcb_note_line:()=>pcb_note_line2,pcb_note_path:()=>pcb_note_path2,pcb_note_rect:()=>pcb_note_rect2,pcb_note_text:()=>pcb_note_text2,pcb_panel:()=>pcb_panel2,pcb_panelization_placement_error:()=>pcb_panelization_placement_error2,pcb_placement_error:()=>pcb_placement_error2,pcb_plated_hole:()=>pcb_plated_hole2,pcb_port:()=>pcb_port2,pcb_port_not_connected_error:()=>pcb_port_not_connected_error2,pcb_port_not_matched_error:()=>pcb_port_not_matched_error2,pcb_route_hint:()=>pcb_route_hint2,pcb_route_hints:()=>pcb_route_hints2,pcb_silkscreen_circle:()=>pcb_silkscreen_circle2,pcb_silkscreen_line:()=>pcb_silkscreen_line2,pcb_silkscreen_oval:()=>pcb_silkscreen_oval2,pcb_silkscreen_path:()=>pcb_silkscreen_path2,pcb_silkscreen_pill:()=>pcb_silkscreen_pill2,pcb_silkscreen_rect:()=>pcb_silkscreen_rect2,pcb_silkscreen_text:()=>pcb_silkscreen_text2,pcb_smtpad:()=>pcb_smtpad2,pcb_smtpad_pill:()=>pcb_smtpad_pill2,pcb_solder_paste:()=>pcb_solder_paste2,pcb_text:()=>pcb_text2,pcb_thermal_spoke:()=>pcb_thermal_spoke2,pcb_trace:()=>pcb_trace2,pcb_trace_error:()=>pcb_trace_error2,pcb_trace_hint:()=>pcb_trace_hint2,pcb_trace_missing_error:()=>pcb_trace_missing_error2,pcb_trace_route_point:()=>pcb_trace_route_point2,pcb_trace_route_point_via:()=>pcb_trace_route_point_via2,pcb_trace_route_point_wire:()=>pcb_trace_route_point_wire2,pcb_via:()=>pcb_via2,pcb_via_clearance_error:()=>pcb_via_clearance_error2,point:()=>point5,point3:()=>point33,point_with_bulge:()=>point_with_bulge2,port_arrangement:()=>port_arrangement2,position:()=>position2,position3:()=>position32,resistance:()=>resistance2,ring:()=>ring2,rotation:()=>rotation4,route_hint_point:()=>route_hint_point2,schematic_arc:()=>schematic_arc2,schematic_box:()=>schematic_box2,schematic_circle:()=>schematic_circle2,schematic_component:()=>schematic_component2,schematic_component_port_arrangement_by_sides:()=>schematic_component_port_arrangement_by_sides2,schematic_component_port_arrangement_by_size:()=>schematic_component_port_arrangement_by_size2,schematic_debug_line:()=>schematic_debug_line2,schematic_debug_object:()=>schematic_debug_object2,schematic_debug_object_base:()=>schematic_debug_object_base2,schematic_debug_point:()=>schematic_debug_point2,schematic_debug_rect:()=>schematic_debug_rect2,schematic_error:()=>schematic_error2,schematic_group:()=>schematic_group2,schematic_layout_error:()=>schematic_layout_error2,schematic_line:()=>schematic_line2,schematic_manual_edit_conflict_warning:()=>schematic_manual_edit_conflict_warning2,schematic_net_label:()=>schematic_net_label2,schematic_path:()=>schematic_path2,schematic_pin_styles:()=>schematic_pin_styles2,schematic_port:()=>schematic_port2,schematic_rect:()=>schematic_rect2,schematic_sheet:()=>schematic_sheet2,schematic_symbol:()=>schematic_symbol2,schematic_table:()=>schematic_table2,schematic_table_cell:()=>schematic_table_cell2,schematic_text:()=>schematic_text2,schematic_trace:()=>schematic_trace2,schematic_voltage_probe:()=>schematic_voltage_probe2,simulation_ac_current_source:()=>simulation_ac_current_source2,simulation_ac_voltage_source:()=>simulation_ac_voltage_source2,simulation_current_source:()=>simulation_current_source2,simulation_dc_current_source:()=>simulation_dc_current_source2,simulation_dc_voltage_source:()=>simulation_dc_voltage_source2,simulation_experiment:()=>simulation_experiment2,simulation_op_amp:()=>simulation_op_amp2,simulation_switch:()=>simulation_switch2,simulation_transient_voltage_graph:()=>simulation_transient_voltage_graph2,simulation_unknown_experiment_error:()=>simulation_unknown_experiment_error2,simulation_voltage_probe:()=>simulation_voltage_probe2,simulation_voltage_source:()=>simulation_voltage_source2,size:()=>size2,source_ambiguous_port_reference:()=>source_ambiguous_port_reference2,source_board:()=>source_board2,source_component_base:()=>source_component_base2,source_component_internal_connection:()=>source_component_internal_connection2,source_component_pins_underspecified_warning:()=>source_component_pins_underspecified_warning2,source_failed_to_create_component_error:()=>source_failed_to_create_component_error2,source_group:()=>source_group2,source_i2c_misconfigured_error:()=>source_i2c_misconfigured_error2,source_interconnect:()=>source_interconnect2,source_invalid_component_property_error:()=>source_invalid_component_property_error2,source_manually_placed_via:()=>source_manually_placed_via2,source_missing_property_error:()=>source_missing_property_error2,source_net:()=>source_net2,source_no_ground_pin_defined_warning:()=>source_no_ground_pin_defined_warning2,source_no_power_pin_defined_warning:()=>source_no_power_pin_defined_warning2,source_pcb_ground_plane:()=>source_pcb_ground_plane2,source_pin_attributes:()=>source_pin_attributes2,source_pin_missing_trace_warning:()=>source_pin_missing_trace_warning2,source_pin_must_be_connected_error:()=>source_pin_must_be_connected_error2,source_port:()=>source_port2,source_project_metadata:()=>source_project_metadata2,source_property_ignored_warning:()=>source_property_ignored_warning2,source_simple_battery:()=>source_simple_battery2,source_simple_capacitor:()=>source_simple_capacitor2,source_simple_chip:()=>source_simple_chip2,source_simple_connector:()=>source_simple_connector2,source_simple_crystal:()=>source_simple_crystal2,source_simple_current_source:()=>source_simple_current_source2,source_simple_diode:()=>source_simple_diode2,source_simple_fiducial:()=>source_simple_fiducial2,source_simple_ground:()=>source_simple_ground2,source_simple_inductor:()=>source_simple_inductor2,source_simple_led:()=>source_simple_led2,source_simple_mosfet:()=>source_simple_mosfet2,source_simple_op_amp:()=>source_simple_op_amp2,source_simple_pin_header:()=>source_simple_pin_header2,source_simple_pinout:()=>source_simple_pinout2,source_simple_potentiometer:()=>source_simple_potentiometer2,source_simple_power_source:()=>source_simple_power_source2,source_simple_push_button:()=>source_simple_push_button2,source_simple_resistor:()=>source_simple_resistor2,source_simple_resonator:()=>source_simple_resonator2,source_simple_switch:()=>source_simple_switch2,source_simple_test_point:()=>source_simple_test_point2,source_simple_transistor:()=>source_simple_transistor2,source_simple_voltage_probe:()=>source_simple_voltage_probe2,source_simple_voltage_source:()=>source_simple_voltage_source2,source_trace:()=>source_trace2,source_trace_not_connected_error:()=>source_trace_not_connected_error2,supplier_name:()=>supplier_name2,time:()=>time2,timestamp:()=>timestamp2,unknown_error_finding_part:()=>unknown_error_finding_part2,visible_layer:()=>visible_layer2,voltage:()=>voltage2,wave_shape:()=>wave_shape2});var external_exports2={};__export4(external_exports2,{BRAND:()=>BRAND2,DIRTY:()=>DIRTY2,EMPTY_PATH:()=>EMPTY_PATH2,INVALID:()=>INVALID2,NEVER:()=>NEVER2,OK:()=>OK2,ParseStatus:()=>ParseStatus2,Schema:()=>ZodType2,ZodAny:()=>ZodAny2,ZodArray:()=>ZodArray2,ZodBigInt:()=>ZodBigInt2,ZodBoolean:()=>ZodBoolean2,ZodBranded:()=>ZodBranded2,ZodCatch:()=>ZodCatch2,ZodDate:()=>ZodDate2,ZodDefault:()=>ZodDefault2,ZodDiscriminatedUnion:()=>ZodDiscriminatedUnion2,ZodEffects:()=>ZodEffects2,ZodEnum:()=>ZodEnum2,ZodError:()=>ZodError2,ZodFirstPartyTypeKind:()=>ZodFirstPartyTypeKind2,ZodFunction:()=>ZodFunction2,ZodIntersection:()=>ZodIntersection2,ZodIssueCode:()=>ZodIssueCode2,ZodLazy:()=>ZodLazy2,ZodLiteral:()=>ZodLiteral2,ZodMap:()=>ZodMap2,ZodNaN:()=>ZodNaN2,ZodNativeEnum:()=>ZodNativeEnum2,ZodNever:()=>ZodNever2,ZodNull:()=>ZodNull2,ZodNullable:()=>ZodNullable2,ZodNumber:()=>ZodNumber2,ZodObject:()=>ZodObject2,ZodOptional:()=>ZodOptional2,ZodParsedType:()=>ZodParsedType2,ZodPipeline:()=>ZodPipeline2,ZodPromise:()=>ZodPromise2,ZodReadonly:()=>ZodReadonly2,ZodRecord:()=>ZodRecord2,ZodSchema:()=>ZodType2,ZodSet:()=>ZodSet2,ZodString:()=>ZodString2,ZodSymbol:()=>ZodSymbol2,ZodTransformer:()=>ZodEffects2,ZodTuple:()=>ZodTuple2,ZodType:()=>ZodType2,ZodUndefined:()=>ZodUndefined2,ZodUnion:()=>ZodUnion2,ZodUnknown:()=>ZodUnknown2,ZodVoid:()=>ZodVoid2,addIssueToContext:()=>addIssueToContext2,any:()=>anyType2,array:()=>arrayType2,bigint:()=>bigIntType2,boolean:()=>booleanType2,coerce:()=>coerce2,custom:()=>custom2,date:()=>dateType2,datetimeRegex:()=>datetimeRegex2,defaultErrorMap:()=>en_default2,discriminatedUnion:()=>discriminatedUnionType2,effect:()=>effectsType2,enum:()=>enumType2,function:()=>functionType2,getErrorMap:()=>getErrorMap2,getParsedType:()=>getParsedType2,instanceof:()=>instanceOfType2,intersection:()=>intersectionType2,isAborted:()=>isAborted2,isAsync:()=>isAsync2,isDirty:()=>isDirty2,isValid:()=>isValid2,late:()=>late2,lazy:()=>lazyType2,literal:()=>literalType2,makeIssue:()=>makeIssue2,map:()=>mapType2,nan:()=>nanType2,nativeEnum:()=>nativeEnumType2,never:()=>neverType2,null:()=>nullType2,nullable:()=>nullableType2,number:()=>numberType2,object:()=>objectType2,objectUtil:()=>objectUtil2,oboolean:()=>oboolean2,onumber:()=>onumber2,optional:()=>optionalType2,ostring:()=>ostring2,pipeline:()=>pipelineType2,preprocess:()=>preprocessType2,promise:()=>promiseType2,quotelessJson:()=>quotelessJson2,record:()=>recordType2,set:()=>setType2,setErrorMap:()=>setErrorMap2,strictObject:()=>strictObjectType2,string:()=>stringType2,symbol:()=>symbolType2,transformer:()=>effectsType2,tuple:()=>tupleType2,undefined:()=>undefinedType2,union:()=>unionType2,unknown:()=>unknownType2,util:()=>util2,void:()=>voidType2});var util2;(function(util22){util22.assertEqual=_3=>{};function assertIs(_arg){}util22.assertIs=assertIs;function assertNever(_x3){throw new Error}util22.assertNever=assertNever,util22.arrayToEnum=items=>{let obj={};for(let item of items)obj[item]=item;return obj},util22.getValidEnumValues=obj=>{let validKeys=util22.objectKeys(obj).filter(k5=>typeof obj[obj[k5]]!="number"),filtered={};for(let k5 of validKeys)filtered[k5]=obj[k5];return util22.objectValues(filtered)},util22.objectValues=obj=>util22.objectKeys(obj).map(function(e7){return obj[e7]}),util22.objectKeys=typeof Object.keys=="function"?obj=>Object.keys(obj):object=>{let keys=[];for(let key in object)Object.prototype.hasOwnProperty.call(object,key)&&keys.push(key);return keys},util22.find=(arr,checker)=>{for(let item of arr)if(checker(item))return item},util22.isInteger=typeof Number.isInteger=="function"?val=>Number.isInteger(val):val=>typeof val=="number"&&Number.isFinite(val)&&Math.floor(val)===val;function joinValues(array2,separator=" | "){return array2.map(val=>typeof val=="string"?`'${val}'`:val).join(separator)}util22.joinValues=joinValues,util22.jsonStringifyReplacer=(_3,value)=>typeof value=="bigint"?value.toString():value})(util2||(util2={}));var objectUtil2;(function(objectUtil22){objectUtil22.mergeShapes=(first,second)=>({...first,...second})})(objectUtil2||(objectUtil2={}));var ZodParsedType2=util2.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),getParsedType2=data=>{switch(typeof data){case"undefined":return ZodParsedType2.undefined;case"string":return ZodParsedType2.string;case"number":return Number.isNaN(data)?ZodParsedType2.nan:ZodParsedType2.number;case"boolean":return ZodParsedType2.boolean;case"function":return ZodParsedType2.function;case"bigint":return ZodParsedType2.bigint;case"symbol":return ZodParsedType2.symbol;case"object":return Array.isArray(data)?ZodParsedType2.array:data===null?ZodParsedType2.null:data.then&&typeof data.then=="function"&&data.catch&&typeof data.catch=="function"?ZodParsedType2.promise:typeof Map<"u"&&data instanceof Map?ZodParsedType2.map:typeof Set<"u"&&data instanceof Set?ZodParsedType2.set:typeof Date<"u"&&data instanceof Date?ZodParsedType2.date:ZodParsedType2.object;default:return ZodParsedType2.unknown}},ZodIssueCode2=util2.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]),quotelessJson2=obj=>JSON.stringify(obj,null,2).replace(/"([^"]+)":/g,"$1:"),ZodError2=class _ZodError extends Error{get errors(){return this.issues}constructor(issues){super(),this.issues=[],this.addIssue=sub=>{this.issues=[...this.issues,sub]},this.addIssues=(subs=[])=>{this.issues=[...this.issues,...subs]};let actualProto=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,actualProto):this.__proto__=actualProto,this.name="ZodError",this.issues=issues}format(_mapper){let mapper=_mapper||function(issue){return issue.message},fieldErrors={_errors:[]},processError=error2=>{for(let issue of error2.issues)if(issue.code==="invalid_union")issue.unionErrors.map(processError);else if(issue.code==="invalid_return_type")processError(issue.returnTypeError);else if(issue.code==="invalid_arguments")processError(issue.argumentsError);else if(issue.path.length===0)fieldErrors._errors.push(mapper(issue));else{let curr=fieldErrors,i3=0;for(;i3<issue.path.length;){let el3=issue.path[i3];i3===issue.path.length-1?(curr[el3]=curr[el3]||{_errors:[]},curr[el3]._errors.push(mapper(issue))):curr[el3]=curr[el3]||{_errors:[]},curr=curr[el3],i3++}}};return processError(this),fieldErrors}static assert(value){if(!(value instanceof _ZodError))throw new Error(`Not a ZodError: ${value}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,util2.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(mapper=issue=>issue.message){let fieldErrors={},formErrors=[];for(let sub of this.issues)if(sub.path.length>0){let firstEl=sub.path[0];fieldErrors[firstEl]=fieldErrors[firstEl]||[],fieldErrors[firstEl].push(mapper(sub))}else formErrors.push(mapper(sub));return{formErrors,fieldErrors}}get formErrors(){return this.flatten()}};ZodError2.create=issues=>new ZodError2(issues);var errorMap2=(issue,_ctx)=>{let message;switch(issue.code){case ZodIssueCode2.invalid_type:issue.received===ZodParsedType2.undefined?message="Required":message=`Expected ${issue.expected}, received ${issue.received}`;break;case ZodIssueCode2.invalid_literal:message=`Invalid literal value, expected ${JSON.stringify(issue.expected,util2.jsonStringifyReplacer)}`;break;case ZodIssueCode2.unrecognized_keys:message=`Unrecognized key(s) in object: ${util2.joinValues(issue.keys,", ")}`;break;case ZodIssueCode2.invalid_union:message="Invalid input";break;case ZodIssueCode2.invalid_union_discriminator:message=`Invalid discriminator value. Expected ${util2.joinValues(issue.options)}`;break;case ZodIssueCode2.invalid_enum_value:message=`Invalid enum value. Expected ${util2.joinValues(issue.options)}, received '${issue.received}'`;break;case ZodIssueCode2.invalid_arguments:message="Invalid function arguments";break;case ZodIssueCode2.invalid_return_type:message="Invalid function return type";break;case ZodIssueCode2.invalid_date:message="Invalid date";break;case ZodIssueCode2.invalid_string:typeof issue.validation=="object"?"includes"in issue.validation?(message=`Invalid input: must include "${issue.validation.includes}"`,typeof issue.validation.position=="number"&&(message=`${message} at one or more positions greater than or equal to ${issue.validation.position}`)):"startsWith"in issue.validation?message=`Invalid input: must start with "${issue.validation.startsWith}"`:"endsWith"in issue.validation?message=`Invalid input: must end with "${issue.validation.endsWith}"`:util2.assertNever(issue.validation):issue.validation!=="regex"?message=`Invalid ${issue.validation}`:message="Invalid";break;case ZodIssueCode2.too_small:issue.type==="array"?message=`Array must contain ${issue.exact?"exactly":issue.inclusive?"at least":"more than"} ${issue.minimum} element(s)`:issue.type==="string"?message=`String must contain ${issue.exact?"exactly":issue.inclusive?"at least":"over"} ${issue.minimum} character(s)`:issue.type==="number"?message=`Number must be ${issue.exact?"exactly equal to ":issue.inclusive?"greater than or equal to ":"greater than "}${issue.minimum}`:issue.type==="bigint"?message=`Number must be ${issue.exact?"exactly equal to ":issue.inclusive?"greater than or equal to ":"greater than "}${issue.minimum}`:issue.type==="date"?message=`Date must be ${issue.exact?"exactly equal to ":issue.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(issue.minimum))}`:message="Invalid input";break;case ZodIssueCode2.too_big:issue.type==="array"?message=`Array must contain ${issue.exact?"exactly":issue.inclusive?"at most":"less than"} ${issue.maximum} element(s)`:issue.type==="string"?message=`String must contain ${issue.exact?"exactly":issue.inclusive?"at most":"under"} ${issue.maximum} character(s)`:issue.type==="number"?message=`Number must be ${issue.exact?"exactly":issue.inclusive?"less than or equal to":"less than"} ${issue.maximum}`:issue.type==="bigint"?message=`BigInt must be ${issue.exact?"exactly":issue.inclusive?"less than or equal to":"less than"} ${issue.maximum}`:issue.type==="date"?message=`Date must be ${issue.exact?"exactly":issue.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(issue.maximum))}`:message="Invalid input";break;case ZodIssueCode2.custom:message="Invalid input";break;case ZodIssueCode2.invalid_intersection_types:message="Intersection results could not be merged";break;case ZodIssueCode2.not_multiple_of:message=`Number must be a multiple of ${issue.multipleOf}`;break;case ZodIssueCode2.not_finite:message="Number must be finite";break;default:message=_ctx.defaultError,util2.assertNever(issue)}return{message}},en_default2=errorMap2,overrideErrorMap2=en_default2;function setErrorMap2(map){overrideErrorMap2=map}function getErrorMap2(){return overrideErrorMap2}var makeIssue2=params=>{let{data,path,errorMaps,issueData}=params,fullPath=[...path,...issueData.path||[]],fullIssue={...issueData,path:fullPath};if(issueData.message!==void 0)return{...issueData,path:fullPath,message:issueData.message};let errorMessage="",maps=errorMaps.filter(m4=>!!m4).slice().reverse();for(let map of maps)errorMessage=map(fullIssue,{data,defaultError:errorMessage}).message;return{...issueData,path:fullPath,message:errorMessage}},EMPTY_PATH2=[];function addIssueToContext2(ctx,issueData){let overrideMap=getErrorMap2(),issue=makeIssue2({issueData,data:ctx.data,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,overrideMap,overrideMap===en_default2?void 0:en_default2].filter(x4=>!!x4)});ctx.common.issues.push(issue)}var ParseStatus2=class _ParseStatus{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(status,results){let arrayValue=[];for(let s6 of results){if(s6.status==="aborted")return INVALID2;s6.status==="dirty"&&status.dirty(),arrayValue.push(s6.value)}return{status:status.value,value:arrayValue}}static async mergeObjectAsync(status,pairs22){let syncPairs=[];for(let pair of pairs22){let key=await pair.key,value=await pair.value;syncPairs.push({key,value})}return _ParseStatus.mergeObjectSync(status,syncPairs)}static mergeObjectSync(status,pairs22){let finalObject={};for(let pair of pairs22){let{key,value}=pair;if(key.status==="aborted"||value.status==="aborted")return INVALID2;key.status==="dirty"&&status.dirty(),value.status==="dirty"&&status.dirty(),key.value!=="__proto__"&&(typeof value.value<"u"||pair.alwaysSet)&&(finalObject[key.value]=value.value)}return{status:status.value,value:finalObject}}},INVALID2=Object.freeze({status:"aborted"}),DIRTY2=value=>({status:"dirty",value}),OK2=value=>({status:"valid",value}),isAborted2=x4=>x4.status==="aborted",isDirty2=x4=>x4.status==="dirty",isValid2=x4=>x4.status==="valid",isAsync2=x4=>typeof Promise<"u"&&x4 instanceof Promise,errorUtil2;(function(errorUtil22){errorUtil22.errToObj=message=>typeof message=="string"?{message}:message||{},errorUtil22.toString=message=>typeof message=="string"?message:message?.message})(errorUtil2||(errorUtil2={}));var ParseInputLazyPath2=class{constructor(parent,value,path,key){this._cachedPath=[],this.parent=parent,this.data=value,this._path=path,this._key=key}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}},handleResult2=(ctx,result)=>{if(isValid2(result))return{success:!0,data:result.value};if(!ctx.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;let error2=new ZodError2(ctx.common.issues);return this._error=error2,this._error}}};function processCreateParams2(params){if(!params)return{};let{errorMap:errorMap22,invalid_type_error,required_error,description}=params;if(errorMap22&&(invalid_type_error||required_error))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return errorMap22?{errorMap:errorMap22,description}:{errorMap:(iss,ctx)=>{let{message}=params;return iss.code==="invalid_enum_value"?{message:message??ctx.defaultError}:typeof ctx.data>"u"?{message:message??required_error??ctx.defaultError}:iss.code!=="invalid_type"?{message:ctx.defaultError}:{message:message??invalid_type_error??ctx.defaultError}},description}}var ZodType2=class{get description(){return this._def.description}_getType(input2){return getParsedType2(input2.data)}_getOrReturnCtx(input2,ctx){return ctx||{common:input2.parent.common,data:input2.data,parsedType:getParsedType2(input2.data),schemaErrorMap:this._def.errorMap,path:input2.path,parent:input2.parent}}_processInputParams(input2){return{status:new ParseStatus2,ctx:{common:input2.parent.common,data:input2.data,parsedType:getParsedType2(input2.data),schemaErrorMap:this._def.errorMap,path:input2.path,parent:input2.parent}}}_parseSync(input2){let result=this._parse(input2);if(isAsync2(result))throw new Error("Synchronous parse encountered promise.");return result}_parseAsync(input2){let result=this._parse(input2);return Promise.resolve(result)}parse(data,params){let result=this.safeParse(data,params);if(result.success)return result.data;throw result.error}safeParse(data,params){let ctx={common:{issues:[],async:params?.async??!1,contextualErrorMap:params?.errorMap},path:params?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data,parsedType:getParsedType2(data)},result=this._parseSync({data,path:ctx.path,parent:ctx});return handleResult2(ctx,result)}"~validate"(data){let ctx={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data,parsedType:getParsedType2(data)};if(!this["~standard"].async)try{let result=this._parseSync({data,path:[],parent:ctx});return isValid2(result)?{value:result.value}:{issues:ctx.common.issues}}catch(err2){err2?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),ctx.common={issues:[],async:!0}}return this._parseAsync({data,path:[],parent:ctx}).then(result=>isValid2(result)?{value:result.value}:{issues:ctx.common.issues})}async parseAsync(data,params){let result=await this.safeParseAsync(data,params);if(result.success)return result.data;throw result.error}async safeParseAsync(data,params){let ctx={common:{issues:[],contextualErrorMap:params?.errorMap,async:!0},path:params?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data,parsedType:getParsedType2(data)},maybeAsyncResult=this._parse({data,path:ctx.path,parent:ctx}),result=await(isAsync2(maybeAsyncResult)?maybeAsyncResult:Promise.resolve(maybeAsyncResult));return handleResult2(ctx,result)}refine(check,message){let getIssueProperties=val=>typeof message=="string"||typeof message>"u"?{message}:typeof message=="function"?message(val):message;return this._refinement((val,ctx)=>{let result=check(val),setError=()=>ctx.addIssue({code:ZodIssueCode2.custom,...getIssueProperties(val)});return typeof Promise<"u"&&result instanceof Promise?result.then(data=>data?!0:(setError(),!1)):result?!0:(setError(),!1)})}refinement(check,refinementData){return this._refinement((val,ctx)=>check(val)?!0:(ctx.addIssue(typeof refinementData=="function"?refinementData(val,ctx):refinementData),!1))}_refinement(refinement){return new ZodEffects2({schema:this,typeName:ZodFirstPartyTypeKind2.ZodEffects,effect:{type:"refinement",refinement}})}superRefine(refinement){return this._refinement(refinement)}constructor(def){this.spa=this.safeParseAsync,this._def=def,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:data=>this["~validate"](data)}}optional(){return ZodOptional2.create(this,this._def)}nullable(){return ZodNullable2.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return ZodArray2.create(this)}promise(){return ZodPromise2.create(this,this._def)}or(option){return ZodUnion2.create([this,option],this._def)}and(incoming){return ZodIntersection2.create(this,incoming,this._def)}transform(transform22){return new ZodEffects2({...processCreateParams2(this._def),schema:this,typeName:ZodFirstPartyTypeKind2.ZodEffects,effect:{type:"transform",transform:transform22}})}default(def){let defaultValueFunc=typeof def=="function"?def:()=>def;return new ZodDefault2({...processCreateParams2(this._def),innerType:this,defaultValue:defaultValueFunc,typeName:ZodFirstPartyTypeKind2.ZodDefault})}brand(){return new ZodBranded2({typeName:ZodFirstPartyTypeKind2.ZodBranded,type:this,...processCreateParams2(this._def)})}catch(def){let catchValueFunc=typeof def=="function"?def:()=>def;return new ZodCatch2({...processCreateParams2(this._def),innerType:this,catchValue:catchValueFunc,typeName:ZodFirstPartyTypeKind2.ZodCatch})}describe(description){let This=this.constructor;return new This({...this._def,description})}pipe(target){return ZodPipeline2.create(this,target)}readonly(){return ZodReadonly2.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}},cuidRegex2=/^c[^\s-]{8,}$/i,cuid2Regex2=/^[0-9a-z]+$/,ulidRegex2=/^[0-9A-HJKMNP-TV-Z]{26}$/i,uuidRegex2=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,nanoidRegex2=/^[a-z0-9_-]{21}$/i,jwtRegex2=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,durationRegex2=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,emailRegex2=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,_emojiRegex2="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",emojiRegex2,ipv4Regex2=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ipv4CidrRegex2=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,ipv6Regex2=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,ipv6CidrRegex2=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,base64Regex2=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64urlRegex2=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,dateRegexSource2="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",dateRegex2=new RegExp(`^${dateRegexSource2}$`);function timeRegexSource2(args){let secondsRegexSource="[0-5]\\d";args.precision?secondsRegexSource=`${secondsRegexSource}\\.\\d{${args.precision}}`:args.precision==null&&(secondsRegexSource=`${secondsRegexSource}(\\.\\d+)?`);let secondsQuantifier=args.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${secondsRegexSource})${secondsQuantifier}`}function timeRegex2(args){return new RegExp(`^${timeRegexSource2(args)}$`)}function datetimeRegex2(args){let regex=`${dateRegexSource2}T${timeRegexSource2(args)}`,opts=[];return opts.push(args.local?"Z?":"Z"),args.offset&&opts.push("([+-]\\d{2}:?\\d{2})"),regex=`${regex}(${opts.join("|")})`,new RegExp(`^${regex}$`)}function isValidIP2(ip3,version2){return!!((version2==="v4"||!version2)&&ipv4Regex2.test(ip3)||(version2==="v6"||!version2)&&ipv6Regex2.test(ip3))}function isValidJWT2(jwt,alg){if(!jwtRegex2.test(jwt))return!1;try{let[header]=jwt.split(".");if(!header)return!1;let base64=header.replace(/-/g,"+").replace(/_/g,"/").padEnd(header.length+(4-header.length%4)%4,"="),decoded=JSON.parse(atob(base64));return!(typeof decoded!="object"||decoded===null||"typ"in decoded&&decoded?.typ!=="JWT"||!decoded.alg||alg&&decoded.alg!==alg)}catch{return!1}}function isValidCidr2(ip3,version2){return!!((version2==="v4"||!version2)&&ipv4CidrRegex2.test(ip3)||(version2==="v6"||!version2)&&ipv6CidrRegex2.test(ip3))}var ZodString2=class _ZodString extends ZodType2{_parse(input2){if(this._def.coerce&&(input2.data=String(input2.data)),this._getType(input2)!==ZodParsedType2.string){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext2(ctx2,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.string,received:ctx2.parsedType}),INVALID2}let status=new ParseStatus2,ctx;for(let check of this._def.checks)if(check.kind==="min")input2.data.length<check.value&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,minimum:check.value,type:"string",inclusive:!0,exact:!1,message:check.message}),status.dirty());else if(check.kind==="max")input2.data.length>check.value&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,maximum:check.value,type:"string",inclusive:!0,exact:!1,message:check.message}),status.dirty());else if(check.kind==="length"){let tooBig=input2.data.length>check.value,tooSmall=input2.data.length<check.value;(tooBig||tooSmall)&&(ctx=this._getOrReturnCtx(input2,ctx),tooBig?addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,maximum:check.value,type:"string",inclusive:!0,exact:!0,message:check.message}):tooSmall&&addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,minimum:check.value,type:"string",inclusive:!0,exact:!0,message:check.message}),status.dirty())}else if(check.kind==="email")emailRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"email",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="emoji")emojiRegex2||(emojiRegex2=new RegExp(_emojiRegex2,"u")),emojiRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"emoji",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="uuid")uuidRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"uuid",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="nanoid")nanoidRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"nanoid",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="cuid")cuidRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"cuid",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="cuid2")cuid2Regex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"cuid2",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="ulid")ulidRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"ulid",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="url")try{new URL(input2.data)}catch{ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"url",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()}else check.kind==="regex"?(check.regex.lastIndex=0,check.regex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"regex",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty())):check.kind==="trim"?input2.data=input2.data.trim():check.kind==="includes"?input2.data.includes(check.value,check.position)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_string,validation:{includes:check.value,position:check.position},message:check.message}),status.dirty()):check.kind==="toLowerCase"?input2.data=input2.data.toLowerCase():check.kind==="toUpperCase"?input2.data=input2.data.toUpperCase():check.kind==="startsWith"?input2.data.startsWith(check.value)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_string,validation:{startsWith:check.value},message:check.message}),status.dirty()):check.kind==="endsWith"?input2.data.endsWith(check.value)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_string,validation:{endsWith:check.value},message:check.message}),status.dirty()):check.kind==="datetime"?datetimeRegex2(check).test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_string,validation:"datetime",message:check.message}),status.dirty()):check.kind==="date"?dateRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_string,validation:"date",message:check.message}),status.dirty()):check.kind==="time"?timeRegex2(check).test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_string,validation:"time",message:check.message}),status.dirty()):check.kind==="duration"?durationRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"duration",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()):check.kind==="ip"?isValidIP2(input2.data,check.version)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"ip",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()):check.kind==="jwt"?isValidJWT2(input2.data,check.alg)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"jwt",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()):check.kind==="cidr"?isValidCidr2(input2.data,check.version)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"cidr",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()):check.kind==="base64"?base64Regex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"base64",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()):check.kind==="base64url"?base64urlRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"base64url",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()):util2.assertNever(check);return{status:status.value,value:input2.data}}_regex(regex,validation,message){return this.refinement(data=>regex.test(data),{validation,code:ZodIssueCode2.invalid_string,...errorUtil2.errToObj(message)})}_addCheck(check){return new _ZodString({...this._def,checks:[...this._def.checks,check]})}email(message){return this._addCheck({kind:"email",...errorUtil2.errToObj(message)})}url(message){return this._addCheck({kind:"url",...errorUtil2.errToObj(message)})}emoji(message){return this._addCheck({kind:"emoji",...errorUtil2.errToObj(message)})}uuid(message){return this._addCheck({kind:"uuid",...errorUtil2.errToObj(message)})}nanoid(message){return this._addCheck({kind:"nanoid",...errorUtil2.errToObj(message)})}cuid(message){return this._addCheck({kind:"cuid",...errorUtil2.errToObj(message)})}cuid2(message){return this._addCheck({kind:"cuid2",...errorUtil2.errToObj(message)})}ulid(message){return this._addCheck({kind:"ulid",...errorUtil2.errToObj(message)})}base64(message){return this._addCheck({kind:"base64",...errorUtil2.errToObj(message)})}base64url(message){return this._addCheck({kind:"base64url",...errorUtil2.errToObj(message)})}jwt(options){return this._addCheck({kind:"jwt",...errorUtil2.errToObj(options)})}ip(options){return this._addCheck({kind:"ip",...errorUtil2.errToObj(options)})}cidr(options){return this._addCheck({kind:"cidr",...errorUtil2.errToObj(options)})}datetime(options){return typeof options=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:options}):this._addCheck({kind:"datetime",precision:typeof options?.precision>"u"?null:options?.precision,offset:options?.offset??!1,local:options?.local??!1,...errorUtil2.errToObj(options?.message)})}date(message){return this._addCheck({kind:"date",message})}time(options){return typeof options=="string"?this._addCheck({kind:"time",precision:null,message:options}):this._addCheck({kind:"time",precision:typeof options?.precision>"u"?null:options?.precision,...errorUtil2.errToObj(options?.message)})}duration(message){return this._addCheck({kind:"duration",...errorUtil2.errToObj(message)})}regex(regex,message){return this._addCheck({kind:"regex",regex,...errorUtil2.errToObj(message)})}includes(value,options){return this._addCheck({kind:"includes",value,position:options?.position,...errorUtil2.errToObj(options?.message)})}startsWith(value,message){return this._addCheck({kind:"startsWith",value,...errorUtil2.errToObj(message)})}endsWith(value,message){return this._addCheck({kind:"endsWith",value,...errorUtil2.errToObj(message)})}min(minLength,message){return this._addCheck({kind:"min",value:minLength,...errorUtil2.errToObj(message)})}max(maxLength,message){return this._addCheck({kind:"max",value:maxLength,...errorUtil2.errToObj(message)})}length(len,message){return this._addCheck({kind:"length",value:len,...errorUtil2.errToObj(message)})}nonempty(message){return this.min(1,errorUtil2.errToObj(message))}trim(){return new _ZodString({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new _ZodString({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new _ZodString({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(ch2=>ch2.kind==="datetime")}get isDate(){return!!this._def.checks.find(ch2=>ch2.kind==="date")}get isTime(){return!!this._def.checks.find(ch2=>ch2.kind==="time")}get isDuration(){return!!this._def.checks.find(ch2=>ch2.kind==="duration")}get isEmail(){return!!this._def.checks.find(ch2=>ch2.kind==="email")}get isURL(){return!!this._def.checks.find(ch2=>ch2.kind==="url")}get isEmoji(){return!!this._def.checks.find(ch2=>ch2.kind==="emoji")}get isUUID(){return!!this._def.checks.find(ch2=>ch2.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(ch2=>ch2.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(ch2=>ch2.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(ch2=>ch2.kind==="cuid2")}get isULID(){return!!this._def.checks.find(ch2=>ch2.kind==="ulid")}get isIP(){return!!this._def.checks.find(ch2=>ch2.kind==="ip")}get isCIDR(){return!!this._def.checks.find(ch2=>ch2.kind==="cidr")}get isBase64(){return!!this._def.checks.find(ch2=>ch2.kind==="base64")}get isBase64url(){return!!this._def.checks.find(ch2=>ch2.kind==="base64url")}get minLength(){let min=null;for(let ch2 of this._def.checks)ch2.kind==="min"&&(min===null||ch2.value>min)&&(min=ch2.value);return min}get maxLength(){let max2=null;for(let ch2 of this._def.checks)ch2.kind==="max"&&(max2===null||ch2.value<max2)&&(max2=ch2.value);return max2}};ZodString2.create=params=>new ZodString2({checks:[],typeName:ZodFirstPartyTypeKind2.ZodString,coerce:params?.coerce??!1,...processCreateParams2(params)});function floatSafeRemainder2(val,step){let valDecCount=(val.toString().split(".")[1]||"").length,stepDecCount=(step.toString().split(".")[1]||"").length,decCount=valDecCount>stepDecCount?valDecCount:stepDecCount,valInt=Number.parseInt(val.toFixed(decCount).replace(".","")),stepInt=Number.parseInt(step.toFixed(decCount).replace(".",""));return valInt%stepInt/10**decCount}var ZodNumber2=class _ZodNumber extends ZodType2{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(input2){if(this._def.coerce&&(input2.data=Number(input2.data)),this._getType(input2)!==ZodParsedType2.number){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext2(ctx2,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.number,received:ctx2.parsedType}),INVALID2}let ctx,status=new ParseStatus2;for(let check of this._def.checks)check.kind==="int"?util2.isInteger(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:"integer",received:"float",message:check.message}),status.dirty()):check.kind==="min"?(check.inclusive?input2.data<check.value:input2.data<=check.value)&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,minimum:check.value,type:"number",inclusive:check.inclusive,exact:!1,message:check.message}),status.dirty()):check.kind==="max"?(check.inclusive?input2.data>check.value:input2.data>=check.value)&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,maximum:check.value,type:"number",inclusive:check.inclusive,exact:!1,message:check.message}),status.dirty()):check.kind==="multipleOf"?floatSafeRemainder2(input2.data,check.value)!==0&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.not_multiple_of,multipleOf:check.value,message:check.message}),status.dirty()):check.kind==="finite"?Number.isFinite(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.not_finite,message:check.message}),status.dirty()):util2.assertNever(check);return{status:status.value,value:input2.data}}gte(value,message){return this.setLimit("min",value,!0,errorUtil2.toString(message))}gt(value,message){return this.setLimit("min",value,!1,errorUtil2.toString(message))}lte(value,message){return this.setLimit("max",value,!0,errorUtil2.toString(message))}lt(value,message){return this.setLimit("max",value,!1,errorUtil2.toString(message))}setLimit(kind,value,inclusive,message){return new _ZodNumber({...this._def,checks:[...this._def.checks,{kind,value,inclusive,message:errorUtil2.toString(message)}]})}_addCheck(check){return new _ZodNumber({...this._def,checks:[...this._def.checks,check]})}int(message){return this._addCheck({kind:"int",message:errorUtil2.toString(message)})}positive(message){return this._addCheck({kind:"min",value:0,inclusive:!1,message:errorUtil2.toString(message)})}negative(message){return this._addCheck({kind:"max",value:0,inclusive:!1,message:errorUtil2.toString(message)})}nonpositive(message){return this._addCheck({kind:"max",value:0,inclusive:!0,message:errorUtil2.toString(message)})}nonnegative(message){return this._addCheck({kind:"min",value:0,inclusive:!0,message:errorUtil2.toString(message)})}multipleOf(value,message){return this._addCheck({kind:"multipleOf",value,message:errorUtil2.toString(message)})}finite(message){return this._addCheck({kind:"finite",message:errorUtil2.toString(message)})}safe(message){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:errorUtil2.toString(message)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:errorUtil2.toString(message)})}get minValue(){let min=null;for(let ch2 of this._def.checks)ch2.kind==="min"&&(min===null||ch2.value>min)&&(min=ch2.value);return min}get maxValue(){let max2=null;for(let ch2 of this._def.checks)ch2.kind==="max"&&(max2===null||ch2.value<max2)&&(max2=ch2.value);return max2}get isInt(){return!!this._def.checks.find(ch2=>ch2.kind==="int"||ch2.kind==="multipleOf"&&util2.isInteger(ch2.value))}get isFinite(){let max2=null,min=null;for(let ch2 of this._def.checks){if(ch2.kind==="finite"||ch2.kind==="int"||ch2.kind==="multipleOf")return!0;ch2.kind==="min"?(min===null||ch2.value>min)&&(min=ch2.value):ch2.kind==="max"&&(max2===null||ch2.value<max2)&&(max2=ch2.value)}return Number.isFinite(min)&&Number.isFinite(max2)}};ZodNumber2.create=params=>new ZodNumber2({checks:[],typeName:ZodFirstPartyTypeKind2.ZodNumber,coerce:params?.coerce||!1,...processCreateParams2(params)});var ZodBigInt2=class _ZodBigInt extends ZodType2{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(input2){if(this._def.coerce)try{input2.data=BigInt(input2.data)}catch{return this._getInvalidInput(input2)}if(this._getType(input2)!==ZodParsedType2.bigint)return this._getInvalidInput(input2);let ctx,status=new ParseStatus2;for(let check of this._def.checks)check.kind==="min"?(check.inclusive?input2.data<check.value:input2.data<=check.value)&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,type:"bigint",minimum:check.value,inclusive:check.inclusive,message:check.message}),status.dirty()):check.kind==="max"?(check.inclusive?input2.data>check.value:input2.data>=check.value)&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,type:"bigint",maximum:check.value,inclusive:check.inclusive,message:check.message}),status.dirty()):check.kind==="multipleOf"?input2.data%check.value!==BigInt(0)&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.not_multiple_of,multipleOf:check.value,message:check.message}),status.dirty()):util2.assertNever(check);return{status:status.value,value:input2.data}}_getInvalidInput(input2){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.bigint,received:ctx.parsedType}),INVALID2}gte(value,message){return this.setLimit("min",value,!0,errorUtil2.toString(message))}gt(value,message){return this.setLimit("min",value,!1,errorUtil2.toString(message))}lte(value,message){return this.setLimit("max",value,!0,errorUtil2.toString(message))}lt(value,message){return this.setLimit("max",value,!1,errorUtil2.toString(message))}setLimit(kind,value,inclusive,message){return new _ZodBigInt({...this._def,checks:[...this._def.checks,{kind,value,inclusive,message:errorUtil2.toString(message)}]})}_addCheck(check){return new _ZodBigInt({...this._def,checks:[...this._def.checks,check]})}positive(message){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:errorUtil2.toString(message)})}negative(message){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:errorUtil2.toString(message)})}nonpositive(message){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:errorUtil2.toString(message)})}nonnegative(message){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:errorUtil2.toString(message)})}multipleOf(value,message){return this._addCheck({kind:"multipleOf",value,message:errorUtil2.toString(message)})}get minValue(){let min=null;for(let ch2 of this._def.checks)ch2.kind==="min"&&(min===null||ch2.value>min)&&(min=ch2.value);return min}get maxValue(){let max2=null;for(let ch2 of this._def.checks)ch2.kind==="max"&&(max2===null||ch2.value<max2)&&(max2=ch2.value);return max2}};ZodBigInt2.create=params=>new ZodBigInt2({checks:[],typeName:ZodFirstPartyTypeKind2.ZodBigInt,coerce:params?.coerce??!1,...processCreateParams2(params)});var ZodBoolean2=class extends ZodType2{_parse(input2){if(this._def.coerce&&(input2.data=!!input2.data),this._getType(input2)!==ZodParsedType2.boolean){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.boolean,received:ctx.parsedType}),INVALID2}return OK2(input2.data)}};ZodBoolean2.create=params=>new ZodBoolean2({typeName:ZodFirstPartyTypeKind2.ZodBoolean,coerce:params?.coerce||!1,...processCreateParams2(params)});var ZodDate2=class _ZodDate extends ZodType2{_parse(input2){if(this._def.coerce&&(input2.data=new Date(input2.data)),this._getType(input2)!==ZodParsedType2.date){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext2(ctx2,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.date,received:ctx2.parsedType}),INVALID2}if(Number.isNaN(input2.data.getTime())){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext2(ctx2,{code:ZodIssueCode2.invalid_date}),INVALID2}let status=new ParseStatus2,ctx;for(let check of this._def.checks)check.kind==="min"?input2.data.getTime()<check.value&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,message:check.message,inclusive:!0,exact:!1,minimum:check.value,type:"date"}),status.dirty()):check.kind==="max"?input2.data.getTime()>check.value&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,message:check.message,inclusive:!0,exact:!1,maximum:check.value,type:"date"}),status.dirty()):util2.assertNever(check);return{status:status.value,value:new Date(input2.data.getTime())}}_addCheck(check){return new _ZodDate({...this._def,checks:[...this._def.checks,check]})}min(minDate,message){return this._addCheck({kind:"min",value:minDate.getTime(),message:errorUtil2.toString(message)})}max(maxDate,message){return this._addCheck({kind:"max",value:maxDate.getTime(),message:errorUtil2.toString(message)})}get minDate(){let min=null;for(let ch2 of this._def.checks)ch2.kind==="min"&&(min===null||ch2.value>min)&&(min=ch2.value);return min!=null?new Date(min):null}get maxDate(){let max2=null;for(let ch2 of this._def.checks)ch2.kind==="max"&&(max2===null||ch2.value<max2)&&(max2=ch2.value);return max2!=null?new Date(max2):null}};ZodDate2.create=params=>new ZodDate2({checks:[],coerce:params?.coerce||!1,typeName:ZodFirstPartyTypeKind2.ZodDate,...processCreateParams2(params)});var ZodSymbol2=class extends ZodType2{_parse(input2){if(this._getType(input2)!==ZodParsedType2.symbol){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.symbol,received:ctx.parsedType}),INVALID2}return OK2(input2.data)}};ZodSymbol2.create=params=>new ZodSymbol2({typeName:ZodFirstPartyTypeKind2.ZodSymbol,...processCreateParams2(params)});var ZodUndefined2=class extends ZodType2{_parse(input2){if(this._getType(input2)!==ZodParsedType2.undefined){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.undefined,received:ctx.parsedType}),INVALID2}return OK2(input2.data)}};ZodUndefined2.create=params=>new ZodUndefined2({typeName:ZodFirstPartyTypeKind2.ZodUndefined,...processCreateParams2(params)});var ZodNull2=class extends ZodType2{_parse(input2){if(this._getType(input2)!==ZodParsedType2.null){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.null,received:ctx.parsedType}),INVALID2}return OK2(input2.data)}};ZodNull2.create=params=>new ZodNull2({typeName:ZodFirstPartyTypeKind2.ZodNull,...processCreateParams2(params)});var ZodAny2=class extends ZodType2{constructor(){super(...arguments),this._any=!0}_parse(input2){return OK2(input2.data)}};ZodAny2.create=params=>new ZodAny2({typeName:ZodFirstPartyTypeKind2.ZodAny,...processCreateParams2(params)});var ZodUnknown2=class extends ZodType2{constructor(){super(...arguments),this._unknown=!0}_parse(input2){return OK2(input2.data)}};ZodUnknown2.create=params=>new ZodUnknown2({typeName:ZodFirstPartyTypeKind2.ZodUnknown,...processCreateParams2(params)});var ZodNever2=class extends ZodType2{_parse(input2){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.never,received:ctx.parsedType}),INVALID2}};ZodNever2.create=params=>new ZodNever2({typeName:ZodFirstPartyTypeKind2.ZodNever,...processCreateParams2(params)});var ZodVoid2=class extends ZodType2{_parse(input2){if(this._getType(input2)!==ZodParsedType2.undefined){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.void,received:ctx.parsedType}),INVALID2}return OK2(input2.data)}};ZodVoid2.create=params=>new ZodVoid2({typeName:ZodFirstPartyTypeKind2.ZodVoid,...processCreateParams2(params)});var ZodArray2=class _ZodArray extends ZodType2{_parse(input2){let{ctx,status}=this._processInputParams(input2),def=this._def;if(ctx.parsedType!==ZodParsedType2.array)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.array,received:ctx.parsedType}),INVALID2;if(def.exactLength!==null){let tooBig=ctx.data.length>def.exactLength.value,tooSmall=ctx.data.length<def.exactLength.value;(tooBig||tooSmall)&&(addIssueToContext2(ctx,{code:tooBig?ZodIssueCode2.too_big:ZodIssueCode2.too_small,minimum:tooSmall?def.exactLength.value:void 0,maximum:tooBig?def.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:def.exactLength.message}),status.dirty())}if(def.minLength!==null&&ctx.data.length<def.minLength.value&&(addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,minimum:def.minLength.value,type:"array",inclusive:!0,exact:!1,message:def.minLength.message}),status.dirty()),def.maxLength!==null&&ctx.data.length>def.maxLength.value&&(addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,maximum:def.maxLength.value,type:"array",inclusive:!0,exact:!1,message:def.maxLength.message}),status.dirty()),ctx.common.async)return Promise.all([...ctx.data].map((item,i3)=>def.type._parseAsync(new ParseInputLazyPath2(ctx,item,ctx.path,i3)))).then(result2=>ParseStatus2.mergeArray(status,result2));let result=[...ctx.data].map((item,i3)=>def.type._parseSync(new ParseInputLazyPath2(ctx,item,ctx.path,i3)));return ParseStatus2.mergeArray(status,result)}get element(){return this._def.type}min(minLength,message){return new _ZodArray({...this._def,minLength:{value:minLength,message:errorUtil2.toString(message)}})}max(maxLength,message){return new _ZodArray({...this._def,maxLength:{value:maxLength,message:errorUtil2.toString(message)}})}length(len,message){return new _ZodArray({...this._def,exactLength:{value:len,message:errorUtil2.toString(message)}})}nonempty(message){return this.min(1,message)}};ZodArray2.create=(schema,params)=>new ZodArray2({type:schema,minLength:null,maxLength:null,exactLength:null,typeName:ZodFirstPartyTypeKind2.ZodArray,...processCreateParams2(params)});function deepPartialify2(schema){if(schema instanceof ZodObject2){let newShape={};for(let key in schema.shape){let fieldSchema=schema.shape[key];newShape[key]=ZodOptional2.create(deepPartialify2(fieldSchema))}return new ZodObject2({...schema._def,shape:()=>newShape})}else return schema instanceof ZodArray2?new ZodArray2({...schema._def,type:deepPartialify2(schema.element)}):schema instanceof ZodOptional2?ZodOptional2.create(deepPartialify2(schema.unwrap())):schema instanceof ZodNullable2?ZodNullable2.create(deepPartialify2(schema.unwrap())):schema instanceof ZodTuple2?ZodTuple2.create(schema.items.map(item=>deepPartialify2(item))):schema}var ZodObject2=class _ZodObject extends ZodType2{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;let shape=this._def.shape(),keys=util2.objectKeys(shape);return this._cached={shape,keys},this._cached}_parse(input2){if(this._getType(input2)!==ZodParsedType2.object){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext2(ctx2,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.object,received:ctx2.parsedType}),INVALID2}let{status,ctx}=this._processInputParams(input2),{shape,keys:shapeKeys}=this._getCached(),extraKeys=[];if(!(this._def.catchall instanceof ZodNever2&&this._def.unknownKeys==="strip"))for(let key in ctx.data)shapeKeys.includes(key)||extraKeys.push(key);let pairs22=[];for(let key of shapeKeys){let keyValidator=shape[key],value=ctx.data[key];pairs22.push({key:{status:"valid",value:key},value:keyValidator._parse(new ParseInputLazyPath2(ctx,value,ctx.path,key)),alwaysSet:key in ctx.data})}if(this._def.catchall instanceof ZodNever2){let unknownKeys=this._def.unknownKeys;if(unknownKeys==="passthrough")for(let key of extraKeys)pairs22.push({key:{status:"valid",value:key},value:{status:"valid",value:ctx.data[key]}});else if(unknownKeys==="strict")extraKeys.length>0&&(addIssueToContext2(ctx,{code:ZodIssueCode2.unrecognized_keys,keys:extraKeys}),status.dirty());else if(unknownKeys!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{let catchall=this._def.catchall;for(let key of extraKeys){let value=ctx.data[key];pairs22.push({key:{status:"valid",value:key},value:catchall._parse(new ParseInputLazyPath2(ctx,value,ctx.path,key)),alwaysSet:key in ctx.data})}}return ctx.common.async?Promise.resolve().then(async()=>{let syncPairs=[];for(let pair of pairs22){let key=await pair.key,value=await pair.value;syncPairs.push({key,value,alwaysSet:pair.alwaysSet})}return syncPairs}).then(syncPairs=>ParseStatus2.mergeObjectSync(status,syncPairs)):ParseStatus2.mergeObjectSync(status,pairs22)}get shape(){return this._def.shape()}strict(message){return errorUtil2.errToObj,new _ZodObject({...this._def,unknownKeys:"strict",...message!==void 0?{errorMap:(issue,ctx)=>{let defaultError=this._def.errorMap?.(issue,ctx).message??ctx.defaultError;return issue.code==="unrecognized_keys"?{message:errorUtil2.errToObj(message).message??defaultError}:{message:defaultError}}}:{}})}strip(){return new _ZodObject({...this._def,unknownKeys:"strip"})}passthrough(){return new _ZodObject({...this._def,unknownKeys:"passthrough"})}extend(augmentation){return new _ZodObject({...this._def,shape:()=>({...this._def.shape(),...augmentation})})}merge(merging){return new _ZodObject({unknownKeys:merging._def.unknownKeys,catchall:merging._def.catchall,shape:()=>({...this._def.shape(),...merging._def.shape()}),typeName:ZodFirstPartyTypeKind2.ZodObject})}setKey(key,schema){return this.augment({[key]:schema})}catchall(index){return new _ZodObject({...this._def,catchall:index})}pick(mask){let shape={};for(let key of util2.objectKeys(mask))mask[key]&&this.shape[key]&&(shape[key]=this.shape[key]);return new _ZodObject({...this._def,shape:()=>shape})}omit(mask){let shape={};for(let key of util2.objectKeys(this.shape))mask[key]||(shape[key]=this.shape[key]);return new _ZodObject({...this._def,shape:()=>shape})}deepPartial(){return deepPartialify2(this)}partial(mask){let newShape={};for(let key of util2.objectKeys(this.shape)){let fieldSchema=this.shape[key];mask&&!mask[key]?newShape[key]=fieldSchema:newShape[key]=fieldSchema.optional()}return new _ZodObject({...this._def,shape:()=>newShape})}required(mask){let newShape={};for(let key of util2.objectKeys(this.shape))if(mask&&!mask[key])newShape[key]=this.shape[key];else{let newField=this.shape[key];for(;newField instanceof ZodOptional2;)newField=newField._def.innerType;newShape[key]=newField}return new _ZodObject({...this._def,shape:()=>newShape})}keyof(){return createZodEnum2(util2.objectKeys(this.shape))}};ZodObject2.create=(shape,params)=>new ZodObject2({shape:()=>shape,unknownKeys:"strip",catchall:ZodNever2.create(),typeName:ZodFirstPartyTypeKind2.ZodObject,...processCreateParams2(params)});ZodObject2.strictCreate=(shape,params)=>new ZodObject2({shape:()=>shape,unknownKeys:"strict",catchall:ZodNever2.create(),typeName:ZodFirstPartyTypeKind2.ZodObject,...processCreateParams2(params)});ZodObject2.lazycreate=(shape,params)=>new ZodObject2({shape,unknownKeys:"strip",catchall:ZodNever2.create(),typeName:ZodFirstPartyTypeKind2.ZodObject,...processCreateParams2(params)});var ZodUnion2=class extends ZodType2{_parse(input2){let{ctx}=this._processInputParams(input2),options=this._def.options;function handleResults(results){for(let result of results)if(result.result.status==="valid")return result.result;for(let result of results)if(result.result.status==="dirty")return ctx.common.issues.push(...result.ctx.common.issues),result.result;let unionErrors=results.map(result=>new ZodError2(result.ctx.common.issues));return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_union,unionErrors}),INVALID2}if(ctx.common.async)return Promise.all(options.map(async option=>{let childCtx={...ctx,common:{...ctx.common,issues:[]},parent:null};return{result:await option._parseAsync({data:ctx.data,path:ctx.path,parent:childCtx}),ctx:childCtx}})).then(handleResults);{let dirty,issues=[];for(let option of options){let childCtx={...ctx,common:{...ctx.common,issues:[]},parent:null},result=option._parseSync({data:ctx.data,path:ctx.path,parent:childCtx});if(result.status==="valid")return result;result.status==="dirty"&&!dirty&&(dirty={result,ctx:childCtx}),childCtx.common.issues.length&&issues.push(childCtx.common.issues)}if(dirty)return ctx.common.issues.push(...dirty.ctx.common.issues),dirty.result;let unionErrors=issues.map(issues2=>new ZodError2(issues2));return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_union,unionErrors}),INVALID2}}get options(){return this._def.options}};ZodUnion2.create=(types,params)=>new ZodUnion2({options:types,typeName:ZodFirstPartyTypeKind2.ZodUnion,...processCreateParams2(params)});var getDiscriminator2=type=>type instanceof ZodLazy2?getDiscriminator2(type.schema):type instanceof ZodEffects2?getDiscriminator2(type.innerType()):type instanceof ZodLiteral2?[type.value]:type instanceof ZodEnum2?type.options:type instanceof ZodNativeEnum2?util2.objectValues(type.enum):type instanceof ZodDefault2?getDiscriminator2(type._def.innerType):type instanceof ZodUndefined2?[void 0]:type instanceof ZodNull2?[null]:type instanceof ZodOptional2?[void 0,...getDiscriminator2(type.unwrap())]:type instanceof ZodNullable2?[null,...getDiscriminator2(type.unwrap())]:type instanceof ZodBranded2||type instanceof ZodReadonly2?getDiscriminator2(type.unwrap()):type instanceof ZodCatch2?getDiscriminator2(type._def.innerType):[],ZodDiscriminatedUnion2=class _ZodDiscriminatedUnion extends ZodType2{_parse(input2){let{ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.object)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.object,received:ctx.parsedType}),INVALID2;let discriminator=this.discriminator,discriminatorValue=ctx.data[discriminator],option=this.optionsMap.get(discriminatorValue);return option?ctx.common.async?option._parseAsync({data:ctx.data,path:ctx.path,parent:ctx}):option._parseSync({data:ctx.data,path:ctx.path,parent:ctx}):(addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[discriminator]}),INVALID2)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(discriminator,options,params){let optionsMap=new Map;for(let type of options){let discriminatorValues=getDiscriminator2(type.shape[discriminator]);if(!discriminatorValues.length)throw new Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`);for(let value of discriminatorValues){if(optionsMap.has(value))throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);optionsMap.set(value,type)}}return new _ZodDiscriminatedUnion({typeName:ZodFirstPartyTypeKind2.ZodDiscriminatedUnion,discriminator,options,optionsMap,...processCreateParams2(params)})}};function mergeValues2(a3,b4){let aType=getParsedType2(a3),bType=getParsedType2(b4);if(a3===b4)return{valid:!0,data:a3};if(aType===ZodParsedType2.object&&bType===ZodParsedType2.object){let bKeys=util2.objectKeys(b4),sharedKeys=util2.objectKeys(a3).filter(key=>bKeys.indexOf(key)!==-1),newObj={...a3,...b4};for(let key of sharedKeys){let sharedValue=mergeValues2(a3[key],b4[key]);if(!sharedValue.valid)return{valid:!1};newObj[key]=sharedValue.data}return{valid:!0,data:newObj}}else if(aType===ZodParsedType2.array&&bType===ZodParsedType2.array){if(a3.length!==b4.length)return{valid:!1};let newArray=[];for(let index=0;index<a3.length;index++){let itemA=a3[index],itemB=b4[index],sharedValue=mergeValues2(itemA,itemB);if(!sharedValue.valid)return{valid:!1};newArray.push(sharedValue.data)}return{valid:!0,data:newArray}}else return aType===ZodParsedType2.date&&bType===ZodParsedType2.date&&+a3==+b4?{valid:!0,data:a3}:{valid:!1}}var ZodIntersection2=class extends ZodType2{_parse(input2){let{status,ctx}=this._processInputParams(input2),handleParsed=(parsedLeft,parsedRight)=>{if(isAborted2(parsedLeft)||isAborted2(parsedRight))return INVALID2;let merged=mergeValues2(parsedLeft.value,parsedRight.value);return merged.valid?((isDirty2(parsedLeft)||isDirty2(parsedRight))&&status.dirty(),{status:status.value,value:merged.data}):(addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_intersection_types}),INVALID2)};return ctx.common.async?Promise.all([this._def.left._parseAsync({data:ctx.data,path:ctx.path,parent:ctx}),this._def.right._parseAsync({data:ctx.data,path:ctx.path,parent:ctx})]).then(([left,right])=>handleParsed(left,right)):handleParsed(this._def.left._parseSync({data:ctx.data,path:ctx.path,parent:ctx}),this._def.right._parseSync({data:ctx.data,path:ctx.path,parent:ctx}))}};ZodIntersection2.create=(left,right,params)=>new ZodIntersection2({left,right,typeName:ZodFirstPartyTypeKind2.ZodIntersection,...processCreateParams2(params)});var ZodTuple2=class _ZodTuple extends ZodType2{_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.array)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.array,received:ctx.parsedType}),INVALID2;if(ctx.data.length<this._def.items.length)return addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),INVALID2;!this._def.rest&&ctx.data.length>this._def.items.length&&(addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),status.dirty());let items=[...ctx.data].map((item,itemIndex)=>{let schema=this._def.items[itemIndex]||this._def.rest;return schema?schema._parse(new ParseInputLazyPath2(ctx,item,ctx.path,itemIndex)):null}).filter(x4=>!!x4);return ctx.common.async?Promise.all(items).then(results=>ParseStatus2.mergeArray(status,results)):ParseStatus2.mergeArray(status,items)}get items(){return this._def.items}rest(rest){return new _ZodTuple({...this._def,rest})}};ZodTuple2.create=(schemas,params)=>{if(!Array.isArray(schemas))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new ZodTuple2({items:schemas,typeName:ZodFirstPartyTypeKind2.ZodTuple,rest:null,...processCreateParams2(params)})};var ZodRecord2=class _ZodRecord extends ZodType2{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.object)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.object,received:ctx.parsedType}),INVALID2;let pairs22=[],keyType=this._def.keyType,valueType=this._def.valueType;for(let key in ctx.data)pairs22.push({key:keyType._parse(new ParseInputLazyPath2(ctx,key,ctx.path,key)),value:valueType._parse(new ParseInputLazyPath2(ctx,ctx.data[key],ctx.path,key)),alwaysSet:key in ctx.data});return ctx.common.async?ParseStatus2.mergeObjectAsync(status,pairs22):ParseStatus2.mergeObjectSync(status,pairs22)}get element(){return this._def.valueType}static create(first,second,third){return second instanceof ZodType2?new _ZodRecord({keyType:first,valueType:second,typeName:ZodFirstPartyTypeKind2.ZodRecord,...processCreateParams2(third)}):new _ZodRecord({keyType:ZodString2.create(),valueType:first,typeName:ZodFirstPartyTypeKind2.ZodRecord,...processCreateParams2(second)})}},ZodMap2=class extends ZodType2{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.map)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.map,received:ctx.parsedType}),INVALID2;let keyType=this._def.keyType,valueType=this._def.valueType,pairs22=[...ctx.data.entries()].map(([key,value],index)=>({key:keyType._parse(new ParseInputLazyPath2(ctx,key,ctx.path,[index,"key"])),value:valueType._parse(new ParseInputLazyPath2(ctx,value,ctx.path,[index,"value"]))}));if(ctx.common.async){let finalMap=new Map;return Promise.resolve().then(async()=>{for(let pair of pairs22){let key=await pair.key,value=await pair.value;if(key.status==="aborted"||value.status==="aborted")return INVALID2;(key.status==="dirty"||value.status==="dirty")&&status.dirty(),finalMap.set(key.value,value.value)}return{status:status.value,value:finalMap}})}else{let finalMap=new Map;for(let pair of pairs22){let key=pair.key,value=pair.value;if(key.status==="aborted"||value.status==="aborted")return INVALID2;(key.status==="dirty"||value.status==="dirty")&&status.dirty(),finalMap.set(key.value,value.value)}return{status:status.value,value:finalMap}}}};ZodMap2.create=(keyType,valueType,params)=>new ZodMap2({valueType,keyType,typeName:ZodFirstPartyTypeKind2.ZodMap,...processCreateParams2(params)});var ZodSet2=class _ZodSet extends ZodType2{_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.set)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.set,received:ctx.parsedType}),INVALID2;let def=this._def;def.minSize!==null&&ctx.data.size<def.minSize.value&&(addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,minimum:def.minSize.value,type:"set",inclusive:!0,exact:!1,message:def.minSize.message}),status.dirty()),def.maxSize!==null&&ctx.data.size>def.maxSize.value&&(addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,maximum:def.maxSize.value,type:"set",inclusive:!0,exact:!1,message:def.maxSize.message}),status.dirty());let valueType=this._def.valueType;function finalizeSet(elements2){let parsedSet=new Set;for(let element of elements2){if(element.status==="aborted")return INVALID2;element.status==="dirty"&&status.dirty(),parsedSet.add(element.value)}return{status:status.value,value:parsedSet}}let elements=[...ctx.data.values()].map((item,i3)=>valueType._parse(new ParseInputLazyPath2(ctx,item,ctx.path,i3)));return ctx.common.async?Promise.all(elements).then(elements2=>finalizeSet(elements2)):finalizeSet(elements)}min(minSize,message){return new _ZodSet({...this._def,minSize:{value:minSize,message:errorUtil2.toString(message)}})}max(maxSize,message){return new _ZodSet({...this._def,maxSize:{value:maxSize,message:errorUtil2.toString(message)}})}size(size22,message){return this.min(size22,message).max(size22,message)}nonempty(message){return this.min(1,message)}};ZodSet2.create=(valueType,params)=>new ZodSet2({valueType,minSize:null,maxSize:null,typeName:ZodFirstPartyTypeKind2.ZodSet,...processCreateParams2(params)});var ZodFunction2=class _ZodFunction extends ZodType2{constructor(){super(...arguments),this.validate=this.implement}_parse(input2){let{ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.function)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.function,received:ctx.parsedType}),INVALID2;function makeArgsIssue(args,error2){return makeIssue2({data:args,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,getErrorMap2(),en_default2].filter(x4=>!!x4),issueData:{code:ZodIssueCode2.invalid_arguments,argumentsError:error2}})}function makeReturnsIssue(returns,error2){return makeIssue2({data:returns,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,getErrorMap2(),en_default2].filter(x4=>!!x4),issueData:{code:ZodIssueCode2.invalid_return_type,returnTypeError:error2}})}let params={errorMap:ctx.common.contextualErrorMap},fn3=ctx.data;if(this._def.returns instanceof ZodPromise2){let me3=this;return OK2(async function(...args){let error2=new ZodError2([]),parsedArgs=await me3._def.args.parseAsync(args,params).catch(e7=>{throw error2.addIssue(makeArgsIssue(args,e7)),error2}),result=await Reflect.apply(fn3,this,parsedArgs);return await me3._def.returns._def.type.parseAsync(result,params).catch(e7=>{throw error2.addIssue(makeReturnsIssue(result,e7)),error2})})}else{let me3=this;return OK2(function(...args){let parsedArgs=me3._def.args.safeParse(args,params);if(!parsedArgs.success)throw new ZodError2([makeArgsIssue(args,parsedArgs.error)]);let result=Reflect.apply(fn3,this,parsedArgs.data),parsedReturns=me3._def.returns.safeParse(result,params);if(!parsedReturns.success)throw new ZodError2([makeReturnsIssue(result,parsedReturns.error)]);return parsedReturns.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...items){return new _ZodFunction({...this._def,args:ZodTuple2.create(items).rest(ZodUnknown2.create())})}returns(returnType){return new _ZodFunction({...this._def,returns:returnType})}implement(func){return this.parse(func)}strictImplement(func){return this.parse(func)}static create(args,returns,params){return new _ZodFunction({args:args||ZodTuple2.create([]).rest(ZodUnknown2.create()),returns:returns||ZodUnknown2.create(),typeName:ZodFirstPartyTypeKind2.ZodFunction,...processCreateParams2(params)})}},ZodLazy2=class extends ZodType2{get schema(){return this._def.getter()}_parse(input2){let{ctx}=this._processInputParams(input2);return this._def.getter()._parse({data:ctx.data,path:ctx.path,parent:ctx})}};ZodLazy2.create=(getter,params)=>new ZodLazy2({getter,typeName:ZodFirstPartyTypeKind2.ZodLazy,...processCreateParams2(params)});var ZodLiteral2=class extends ZodType2{_parse(input2){if(input2.data!==this._def.value){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{received:ctx.data,code:ZodIssueCode2.invalid_literal,expected:this._def.value}),INVALID2}return{status:"valid",value:input2.data}}get value(){return this._def.value}};ZodLiteral2.create=(value,params)=>new ZodLiteral2({value,typeName:ZodFirstPartyTypeKind2.ZodLiteral,...processCreateParams2(params)});function createZodEnum2(values,params){return new ZodEnum2({values,typeName:ZodFirstPartyTypeKind2.ZodEnum,...processCreateParams2(params)})}var ZodEnum2=class _ZodEnum extends ZodType2{_parse(input2){if(typeof input2.data!="string"){let ctx=this._getOrReturnCtx(input2),expectedValues=this._def.values;return addIssueToContext2(ctx,{expected:util2.joinValues(expectedValues),received:ctx.parsedType,code:ZodIssueCode2.invalid_type}),INVALID2}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(input2.data)){let ctx=this._getOrReturnCtx(input2),expectedValues=this._def.values;return addIssueToContext2(ctx,{received:ctx.data,code:ZodIssueCode2.invalid_enum_value,options:expectedValues}),INVALID2}return OK2(input2.data)}get options(){return this._def.values}get enum(){let enumValues={};for(let val of this._def.values)enumValues[val]=val;return enumValues}get Values(){let enumValues={};for(let val of this._def.values)enumValues[val]=val;return enumValues}get Enum(){let enumValues={};for(let val of this._def.values)enumValues[val]=val;return enumValues}extract(values,newDef=this._def){return _ZodEnum.create(values,{...this._def,...newDef})}exclude(values,newDef=this._def){return _ZodEnum.create(this.options.filter(opt2=>!values.includes(opt2)),{...this._def,...newDef})}};ZodEnum2.create=createZodEnum2;var ZodNativeEnum2=class extends ZodType2{_parse(input2){let nativeEnumValues=util2.getValidEnumValues(this._def.values),ctx=this._getOrReturnCtx(input2);if(ctx.parsedType!==ZodParsedType2.string&&ctx.parsedType!==ZodParsedType2.number){let expectedValues=util2.objectValues(nativeEnumValues);return addIssueToContext2(ctx,{expected:util2.joinValues(expectedValues),received:ctx.parsedType,code:ZodIssueCode2.invalid_type}),INVALID2}if(this._cache||(this._cache=new Set(util2.getValidEnumValues(this._def.values))),!this._cache.has(input2.data)){let expectedValues=util2.objectValues(nativeEnumValues);return addIssueToContext2(ctx,{received:ctx.data,code:ZodIssueCode2.invalid_enum_value,options:expectedValues}),INVALID2}return OK2(input2.data)}get enum(){return this._def.values}};ZodNativeEnum2.create=(values,params)=>new ZodNativeEnum2({values,typeName:ZodFirstPartyTypeKind2.ZodNativeEnum,...processCreateParams2(params)});var ZodPromise2=class extends ZodType2{unwrap(){return this._def.type}_parse(input2){let{ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.promise&&ctx.common.async===!1)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.promise,received:ctx.parsedType}),INVALID2;let promisified=ctx.parsedType===ZodParsedType2.promise?ctx.data:Promise.resolve(ctx.data);return OK2(promisified.then(data=>this._def.type.parseAsync(data,{path:ctx.path,errorMap:ctx.common.contextualErrorMap})))}};ZodPromise2.create=(schema,params)=>new ZodPromise2({type:schema,typeName:ZodFirstPartyTypeKind2.ZodPromise,...processCreateParams2(params)});var ZodEffects2=class extends ZodType2{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===ZodFirstPartyTypeKind2.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(input2){let{status,ctx}=this._processInputParams(input2),effect=this._def.effect||null,checkCtx={addIssue:arg=>{addIssueToContext2(ctx,arg),arg.fatal?status.abort():status.dirty()},get path(){return ctx.path}};if(checkCtx.addIssue=checkCtx.addIssue.bind(checkCtx),effect.type==="preprocess"){let processed=effect.transform(ctx.data,checkCtx);if(ctx.common.async)return Promise.resolve(processed).then(async processed2=>{if(status.value==="aborted")return INVALID2;let result=await this._def.schema._parseAsync({data:processed2,path:ctx.path,parent:ctx});return result.status==="aborted"?INVALID2:result.status==="dirty"||status.value==="dirty"?DIRTY2(result.value):result});{if(status.value==="aborted")return INVALID2;let result=this._def.schema._parseSync({data:processed,path:ctx.path,parent:ctx});return result.status==="aborted"?INVALID2:result.status==="dirty"||status.value==="dirty"?DIRTY2(result.value):result}}if(effect.type==="refinement"){let executeRefinement=acc=>{let result=effect.refinement(acc,checkCtx);if(ctx.common.async)return Promise.resolve(result);if(result instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return acc};if(ctx.common.async===!1){let inner=this._def.schema._parseSync({data:ctx.data,path:ctx.path,parent:ctx});return inner.status==="aborted"?INVALID2:(inner.status==="dirty"&&status.dirty(),executeRefinement(inner.value),{status:status.value,value:inner.value})}else return this._def.schema._parseAsync({data:ctx.data,path:ctx.path,parent:ctx}).then(inner=>inner.status==="aborted"?INVALID2:(inner.status==="dirty"&&status.dirty(),executeRefinement(inner.value).then(()=>({status:status.value,value:inner.value}))))}if(effect.type==="transform")if(ctx.common.async===!1){let base=this._def.schema._parseSync({data:ctx.data,path:ctx.path,parent:ctx});if(!isValid2(base))return INVALID2;let result=effect.transform(base.value,checkCtx);if(result instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:status.value,value:result}}else return this._def.schema._parseAsync({data:ctx.data,path:ctx.path,parent:ctx}).then(base=>isValid2(base)?Promise.resolve(effect.transform(base.value,checkCtx)).then(result=>({status:status.value,value:result})):INVALID2);util2.assertNever(effect)}};ZodEffects2.create=(schema,effect,params)=>new ZodEffects2({schema,typeName:ZodFirstPartyTypeKind2.ZodEffects,effect,...processCreateParams2(params)});ZodEffects2.createWithPreprocess=(preprocess,schema,params)=>new ZodEffects2({schema,effect:{type:"preprocess",transform:preprocess},typeName:ZodFirstPartyTypeKind2.ZodEffects,...processCreateParams2(params)});var ZodOptional2=class extends ZodType2{_parse(input2){return this._getType(input2)===ZodParsedType2.undefined?OK2(void 0):this._def.innerType._parse(input2)}unwrap(){return this._def.innerType}};ZodOptional2.create=(type,params)=>new ZodOptional2({innerType:type,typeName:ZodFirstPartyTypeKind2.ZodOptional,...processCreateParams2(params)});var ZodNullable2=class extends ZodType2{_parse(input2){return this._getType(input2)===ZodParsedType2.null?OK2(null):this._def.innerType._parse(input2)}unwrap(){return this._def.innerType}};ZodNullable2.create=(type,params)=>new ZodNullable2({innerType:type,typeName:ZodFirstPartyTypeKind2.ZodNullable,...processCreateParams2(params)});var ZodDefault2=class extends ZodType2{_parse(input2){let{ctx}=this._processInputParams(input2),data=ctx.data;return ctx.parsedType===ZodParsedType2.undefined&&(data=this._def.defaultValue()),this._def.innerType._parse({data,path:ctx.path,parent:ctx})}removeDefault(){return this._def.innerType}};ZodDefault2.create=(type,params)=>new ZodDefault2({innerType:type,typeName:ZodFirstPartyTypeKind2.ZodDefault,defaultValue:typeof params.default=="function"?params.default:()=>params.default,...processCreateParams2(params)});var ZodCatch2=class extends ZodType2{_parse(input2){let{ctx}=this._processInputParams(input2),newCtx={...ctx,common:{...ctx.common,issues:[]}},result=this._def.innerType._parse({data:newCtx.data,path:newCtx.path,parent:{...newCtx}});return isAsync2(result)?result.then(result2=>({status:"valid",value:result2.status==="valid"?result2.value:this._def.catchValue({get error(){return new ZodError2(newCtx.common.issues)},input:newCtx.data})})):{status:"valid",value:result.status==="valid"?result.value:this._def.catchValue({get error(){return new ZodError2(newCtx.common.issues)},input:newCtx.data})}}removeCatch(){return this._def.innerType}};ZodCatch2.create=(type,params)=>new ZodCatch2({innerType:type,typeName:ZodFirstPartyTypeKind2.ZodCatch,catchValue:typeof params.catch=="function"?params.catch:()=>params.catch,...processCreateParams2(params)});var ZodNaN2=class extends ZodType2{_parse(input2){if(this._getType(input2)!==ZodParsedType2.nan){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.nan,received:ctx.parsedType}),INVALID2}return{status:"valid",value:input2.data}}};ZodNaN2.create=params=>new ZodNaN2({typeName:ZodFirstPartyTypeKind2.ZodNaN,...processCreateParams2(params)});var BRAND2=Symbol("zod_brand"),ZodBranded2=class extends ZodType2{_parse(input2){let{ctx}=this._processInputParams(input2),data=ctx.data;return this._def.type._parse({data,path:ctx.path,parent:ctx})}unwrap(){return this._def.type}},ZodPipeline2=class _ZodPipeline extends ZodType2{_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.common.async)return(async()=>{let inResult=await this._def.in._parseAsync({data:ctx.data,path:ctx.path,parent:ctx});return inResult.status==="aborted"?INVALID2:inResult.status==="dirty"?(status.dirty(),DIRTY2(inResult.value)):this._def.out._parseAsync({data:inResult.value,path:ctx.path,parent:ctx})})();{let inResult=this._def.in._parseSync({data:ctx.data,path:ctx.path,parent:ctx});return inResult.status==="aborted"?INVALID2:inResult.status==="dirty"?(status.dirty(),{status:"dirty",value:inResult.value}):this._def.out._parseSync({data:inResult.value,path:ctx.path,parent:ctx})}}static create(a3,b4){return new _ZodPipeline({in:a3,out:b4,typeName:ZodFirstPartyTypeKind2.ZodPipeline})}},ZodReadonly2=class extends ZodType2{_parse(input2){let result=this._def.innerType._parse(input2),freeze=data=>(isValid2(data)&&(data.value=Object.freeze(data.value)),data);return isAsync2(result)?result.then(data=>freeze(data)):freeze(result)}unwrap(){return this._def.innerType}};ZodReadonly2.create=(type,params)=>new ZodReadonly2({innerType:type,typeName:ZodFirstPartyTypeKind2.ZodReadonly,...processCreateParams2(params)});function cleanParams2(params,data){let p5=typeof params=="function"?params(data):typeof params=="string"?{message:params}:params;return typeof p5=="string"?{message:p5}:p5}function custom2(check,_params={},fatal){return check?ZodAny2.create().superRefine((data,ctx)=>{let r6=check(data);if(r6 instanceof Promise)return r6.then(r22=>{if(!r22){let params=cleanParams2(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}});if(!r6){let params=cleanParams2(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}}):ZodAny2.create()}var late2={object:ZodObject2.lazycreate},ZodFirstPartyTypeKind2;(function(ZodFirstPartyTypeKind22){ZodFirstPartyTypeKind22.ZodString="ZodString",ZodFirstPartyTypeKind22.ZodNumber="ZodNumber",ZodFirstPartyTypeKind22.ZodNaN="ZodNaN",ZodFirstPartyTypeKind22.ZodBigInt="ZodBigInt",ZodFirstPartyTypeKind22.ZodBoolean="ZodBoolean",ZodFirstPartyTypeKind22.ZodDate="ZodDate",ZodFirstPartyTypeKind22.ZodSymbol="ZodSymbol",ZodFirstPartyTypeKind22.ZodUndefined="ZodUndefined",ZodFirstPartyTypeKind22.ZodNull="ZodNull",ZodFirstPartyTypeKind22.ZodAny="ZodAny",ZodFirstPartyTypeKind22.ZodUnknown="ZodUnknown",ZodFirstPartyTypeKind22.ZodNever="ZodNever",ZodFirstPartyTypeKind22.ZodVoid="ZodVoid",ZodFirstPartyTypeKind22.ZodArray="ZodArray",ZodFirstPartyTypeKind22.ZodObject="ZodObject",ZodFirstPartyTypeKind22.ZodUnion="ZodUnion",ZodFirstPartyTypeKind22.ZodDiscriminatedUnion="ZodDiscriminatedUnion",ZodFirstPartyTypeKind22.ZodIntersection="ZodIntersection",ZodFirstPartyTypeKind22.ZodTuple="ZodTuple",ZodFirstPartyTypeKind22.ZodRecord="ZodRecord",ZodFirstPartyTypeKind22.ZodMap="ZodMap",ZodFirstPartyTypeKind22.ZodSet="ZodSet",ZodFirstPartyTypeKind22.ZodFunction="ZodFunction",ZodFirstPartyTypeKind22.ZodLazy="ZodLazy",ZodFirstPartyTypeKind22.ZodLiteral="ZodLiteral",ZodFirstPartyTypeKind22.ZodEnum="ZodEnum",ZodFirstPartyTypeKind22.ZodEffects="ZodEffects",ZodFirstPartyTypeKind22.ZodNativeEnum="ZodNativeEnum",ZodFirstPartyTypeKind22.ZodOptional="ZodOptional",ZodFirstPartyTypeKind22.ZodNullable="ZodNullable",ZodFirstPartyTypeKind22.ZodDefault="ZodDefault",ZodFirstPartyTypeKind22.ZodCatch="ZodCatch",ZodFirstPartyTypeKind22.ZodPromise="ZodPromise",ZodFirstPartyTypeKind22.ZodBranded="ZodBranded",ZodFirstPartyTypeKind22.ZodPipeline="ZodPipeline",ZodFirstPartyTypeKind22.ZodReadonly="ZodReadonly"})(ZodFirstPartyTypeKind2||(ZodFirstPartyTypeKind2={}));var instanceOfType2=(cls,params={message:`Input not instance of ${cls.name}`})=>custom2(data=>data instanceof cls,params),stringType2=ZodString2.create,numberType2=ZodNumber2.create,nanType2=ZodNaN2.create,bigIntType2=ZodBigInt2.create,booleanType2=ZodBoolean2.create,dateType2=ZodDate2.create,symbolType2=ZodSymbol2.create,undefinedType2=ZodUndefined2.create,nullType2=ZodNull2.create,anyType2=ZodAny2.create,unknownType2=ZodUnknown2.create,neverType2=ZodNever2.create,voidType2=ZodVoid2.create,arrayType2=ZodArray2.create,objectType2=ZodObject2.create,strictObjectType2=ZodObject2.strictCreate,unionType2=ZodUnion2.create,discriminatedUnionType2=ZodDiscriminatedUnion2.create,intersectionType2=ZodIntersection2.create,tupleType2=ZodTuple2.create,recordType2=ZodRecord2.create,mapType2=ZodMap2.create,setType2=ZodSet2.create,functionType2=ZodFunction2.create,lazyType2=ZodLazy2.create,literalType2=ZodLiteral2.create,enumType2=ZodEnum2.create,nativeEnumType2=ZodNativeEnum2.create,promiseType2=ZodPromise2.create,effectsType2=ZodEffects2.create,optionalType2=ZodOptional2.create,nullableType2=ZodNullable2.create,preprocessType2=ZodEffects2.createWithPreprocess,pipelineType2=ZodPipeline2.create,ostring2=()=>stringType2().optional(),onumber2=()=>numberType2().optional(),oboolean2=()=>booleanType2().optional(),coerce2={string:arg=>ZodString2.create({...arg,coerce:!0}),number:arg=>ZodNumber2.create({...arg,coerce:!0}),boolean:arg=>ZodBoolean2.create({...arg,coerce:!0}),bigint:arg=>ZodBigInt2.create({...arg,coerce:!0}),date:arg=>ZodDate2.create({...arg,coerce:!0})},NEVER2=INVALID2,unitMappings2={Hz:{baseUnit:"Hz",variants:{MHz:1e6,kHz:1e3,Hz:1}},g:{baseUnit:"g",variants:{kg:1e3,g:1}},\u03A9:{baseUnit:"\u03A9",variants:{m\u03A9:.001,\u03A9:1,k\u03A9:1e3,K\u03A9:1e3,kohm:1e3,M\u03A9:1e6,G\u03A9:1e9,T\u03A9:1e12}},V:{baseUnit:"V",variants:{mV:.001,V:1,kV:1e3,KV:1e3,MV:1e6,GV:1e9,TV:1e12}},A:{baseUnit:"A",variants:{\u00B5A:1e-6,mA:.001,ma:.001,A:1,kA:1e3,MA:1e6}},F:{baseUnit:"F",variants:{pF:1e-12,nF:1e-9,\u00B5F:1e-6,uF:1e-6,mF:.001,F:1}},ml:{baseUnit:"ml",variants:{ml:1,mL:1,l:1e3,L:1e3}},deg:{baseUnit:"deg",variants:{rad:180/Math.PI}},ms:{baseUnit:"ms",variants:{fs:1e-12,ps:1e-9,ns:1e-6,us:.001,\u00B5s:.001,ms:1,s:1e3}},mm:{baseUnit:"mm",variants:{nm:1e-6,\u00B5m:.001,um:.001,mm:1,cm:10,dm:100,m:1e3,km:1e6,in:25.4,ft:304.8,IN:25.4,FT:304.8,yd:914.4,mi:1609344,mil:.0254}}},unitMappingAndVariantSuffixes2=new Set;for(let[baseUnit,info]of Object.entries(unitMappings2)){unitMappingAndVariantSuffixes2.add(baseUnit);for(let variant of Object.keys(info.variants))unitMappingAndVariantSuffixes2.add(variant)}function getBaseTscircuitUnit2(unit){for(let[baseUnit,info]of Object.entries(unitMappings2))if(unit in info.variants)return{baseUnit:info.baseUnit,conversionFactor:info.variants[unit]};return{baseUnit:unit,conversionFactor:1}}var si_prefix_multiplier={tera:1e12,T:1e12,giga:1e9,G:1e9,mega:1e6,M:1e6,kilo:1e3,k:1e3,deci:.1,d:.1,centi:.01,c:.01,milli:.001,m:.001,micro:1e-6,u:1e-6,\u00B5:1e-6,nano:1e-9,n:1e-9,pico:1e-12,p:1e-12};function parseAndConvertSiUnit2(v3){if(v3==null)return{parsedUnit:null,unitOfValue:null,value:null};if(typeof v3=="string"&&v3.match(/^-?[\d\.]+$/))return{value:Number.parseFloat(v3),parsedUnit:null,unitOfValue:null};if(typeof v3=="number")return{value:v3,parsedUnit:null,unitOfValue:null};if(typeof v3=="object"&&"x"in v3&&"y"in v3){let{parsedUnit,unitOfValue}=parseAndConvertSiUnit2(v3.x),xResult=parseAndConvertSiUnit2(v3.x),yResult=parseAndConvertSiUnit2(v3.y);return xResult.value===null||yResult.value===null?{parsedUnit:null,unitOfValue:null,value:null}:{parsedUnit,unitOfValue,value:{x:xResult.value,y:yResult.value}}}let unit_reversed=v3.toString().split("").reverse().join("").match(/[^\d\s]+/)?.[0];if(!unit_reversed)throw new Error(`Could not determine unit: "${v3}"`);let unit=unit_reversed.split("").reverse().join(""),numberPart=v3.slice(0,-unit.length);if(unit in si_prefix_multiplier&&!unitMappingAndVariantSuffixes2.has(unit)){let siMultiplier=si_prefix_multiplier[unit];return{parsedUnit:null,unitOfValue:null,value:Number.parseFloat(numberPart)*siMultiplier}}let{baseUnit,conversionFactor}=getBaseTscircuitUnit2(unit);return{parsedUnit:unit,unitOfValue:baseUnit,value:conversionFactor*Number.parseFloat(numberPart)}}var resistance2=external_exports2.string().or(external_exports2.number()).transform(v3=>parseAndConvertSiUnit2(v3).value),capacitance2=external_exports2.string().or(external_exports2.number()).transform(v3=>parseAndConvertSiUnit2(v3).value).transform(value=>Number.parseFloat(value.toPrecision(12))),inductance2=external_exports2.string().or(external_exports2.number()).transform(v3=>parseAndConvertSiUnit2(v3).value),voltage2=external_exports2.string().or(external_exports2.number()).transform(v3=>parseAndConvertSiUnit2(v3).value),length3=external_exports2.string().or(external_exports2.number()).transform(v3=>parseAndConvertSiUnit2(v3).value),frequency2=external_exports2.string().or(external_exports2.number()).transform(v3=>parseAndConvertSiUnit2(v3).value),distance7=length3,current2=external_exports2.string().or(external_exports2.number()).transform(v3=>parseAndConvertSiUnit2(v3).value),duration_ms2=external_exports2.string().or(external_exports2.number()).transform(v3=>parseAndConvertSiUnit2(v3).value),time2=duration_ms2,ms4=duration_ms2,timestamp2=external_exports2.string().datetime(),rotation4=external_exports2.string().or(external_exports2.number()).transform(arg=>typeof arg=="number"?arg:arg.endsWith("deg")?Number.parseFloat(arg.split("deg")[0]):arg.endsWith("rad")?Number.parseFloat(arg.split("rad")[0])*180/Math.PI:Number.parseFloat(arg)),battery_capacity2=external_exports2.number().or(external_exports2.string().endsWith("mAh")).transform(v3=>{if(typeof v3=="string"){let valString=v3.replace("mAh",""),num=Number.parseFloat(valString);if(Number.isNaN(num))throw new Error("Invalid capacity");return num}return v3}).describe("Battery capacity in mAh"),expectTypesMatch3=shouldBe=>{};expectTypesMatch3("extra props b");expectTypesMatch3("missing props b");expectTypesMatch3(!0);expectTypesMatch3("mismatched prop types: a");var expectStringUnionsMatch2=shouldBe=>{};expectStringUnionsMatch2(!0);expectStringUnionsMatch2('T1 has extra: "c", T2 has extra: "d"');expectStringUnionsMatch2('T1 has extra: "c"');expectStringUnionsMatch2('T2 has extra: "c"');expectStringUnionsMatch2('T1 has extra: "d", T2 has extra: "c"');expectStringUnionsMatch2(!0);var point5=external_exports2.object({x:distance7,y:distance7}),position2=point5;expectTypesMatch3(!0);expectTypesMatch3(!0);var point33=external_exports2.object({x:distance7,y:distance7,z:distance7}),position32=point33;expectTypesMatch3(!0);var size2=external_exports2.object({width:external_exports2.number(),height:external_exports2.number()});expectTypesMatch3(!0);var randomId2=length4=>{let chars2="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";return Array.from({length:length4},()=>chars2[Math.floor(Math.random()*chars2.length)]).join("")},getZodPrefixedIdWithDefault2=prefix=>external_exports2.string().optional().default(()=>`${prefix}_${randomId2(10)}`),ninePointAnchor3=external_exports2.enum(["top_left","top_center","top_right","center_left","center","center_right","bottom_left","bottom_center","bottom_right"]);expectTypesMatch3(!0);var pcbRenderLayer2=external_exports2.enum(["top_silkscreen","bottom_silkscreen","top_copper","bottom_copper","top_soldermask","bottom_soldermask","top_fabrication_note","bottom_fabrication_note","top_user_note","bottom_user_note","top_courtyard","bottom_courtyard","inner1_copper","inner2_copper","inner3_copper","inner4_copper","inner5_copper","inner6_copper","edge_cuts","drill"]);expectTypesMatch3(!0);var asset2=external_exports2.object({project_relative_path:external_exports2.string(),url:external_exports2.string(),mimetype:external_exports2.string()});expectTypesMatch3(!0);var kicadAt3=point5.extend({rotation:rotation4.optional()});expectTypesMatch3(!0);var kicadFont3=external_exports2.object({size:point5.optional(),thickness:distance7.optional()});expectTypesMatch3(!0);var kicadEffects3=external_exports2.object({font:kicadFont3.optional()});expectTypesMatch3(!0);var kicadProperty3=external_exports2.object({value:external_exports2.string(),at:kicadAt3.optional(),layer:external_exports2.string().optional(),uuid:external_exports2.string().optional(),hide:external_exports2.boolean().optional(),effects:kicadEffects3.optional()});expectTypesMatch3(!0);var kicadFootprintProperties3=external_exports2.object({Reference:kicadProperty3.optional(),Value:kicadProperty3.optional(),Datasheet:kicadProperty3.optional(),Description:kicadProperty3.optional()});expectTypesMatch3(!0);var kicadFootprintAttributes3=external_exports2.object({through_hole:external_exports2.boolean().optional(),smd:external_exports2.boolean().optional(),exclude_from_pos_files:external_exports2.boolean().optional(),exclude_from_bom:external_exports2.boolean().optional()});expectTypesMatch3(!0);var kicadFootprintPad3=external_exports2.object({name:external_exports2.string(),type:external_exports2.string(),shape:external_exports2.string().optional(),at:kicadAt3.optional(),size:point5.optional(),drill:distance7.optional(),layers:external_exports2.array(external_exports2.string()).optional(),removeUnusedLayers:external_exports2.boolean().optional(),uuid:external_exports2.string().optional()});expectTypesMatch3(!0);var kicadFootprintModel3=external_exports2.object({path:external_exports2.string(),offset:point33.optional(),scale:point33.optional(),rotate:point33.optional()});expectTypesMatch3(!0);var kicadFootprintMetadata3=external_exports2.object({footprintName:external_exports2.string().optional(),version:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),generator:external_exports2.string().optional(),generatorVersion:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),layer:external_exports2.string().optional(),properties:kicadFootprintProperties3.optional(),attributes:kicadFootprintAttributes3.optional(),pads:external_exports2.array(kicadFootprintPad3).optional(),embeddedFonts:external_exports2.boolean().optional(),model:kicadFootprintModel3.optional()});expectTypesMatch3(!0);var kicadSymbolPinNumbers3=external_exports2.object({hide:external_exports2.boolean().optional()});expectTypesMatch3(!0);var kicadSymbolPinNames3=external_exports2.object({offset:distance7.optional(),hide:external_exports2.boolean().optional()});expectTypesMatch3(!0);var kicadSymbolEffects3=external_exports2.object({font:kicadFont3.optional(),justify:external_exports2.union([external_exports2.string(),external_exports2.array(external_exports2.string())]).optional(),hide:external_exports2.boolean().optional()});expectTypesMatch3(!0);var kicadSymbolProperty3=external_exports2.object({value:external_exports2.string(),id:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),at:kicadAt3.optional(),effects:kicadSymbolEffects3.optional()});expectTypesMatch3(!0);var kicadSymbolProperties3=external_exports2.object({Reference:kicadSymbolProperty3.optional(),Value:kicadSymbolProperty3.optional(),Footprint:kicadSymbolProperty3.optional(),Datasheet:kicadSymbolProperty3.optional(),Description:kicadSymbolProperty3.optional(),ki_keywords:kicadSymbolProperty3.optional(),ki_fp_filters:kicadSymbolProperty3.optional()});expectTypesMatch3(!0);var kicadSymbolMetadata3=external_exports2.object({symbolName:external_exports2.string().optional(),extends:external_exports2.string().optional(),pinNumbers:kicadSymbolPinNumbers3.optional(),pinNames:kicadSymbolPinNames3.optional(),excludeFromSim:external_exports2.boolean().optional(),inBom:external_exports2.boolean().optional(),onBoard:external_exports2.boolean().optional(),properties:kicadSymbolProperties3.optional(),embeddedFonts:external_exports2.boolean().optional()});expectTypesMatch3(!0);var base_circuit_json_error2=external_exports2.object({error_type:external_exports2.string(),message:external_exports2.string(),is_fatal:external_exports2.boolean().optional()});expectTypesMatch3(!0);var supplier_name2=external_exports2.enum(["jlcpcb","macrofab","pcbway","digikey","mouser","lcsc"]);expectTypesMatch3(!0);var source_component_base2=external_exports2.object({type:external_exports2.literal("source_component"),ftype:external_exports2.string().optional(),source_component_id:external_exports2.string(),name:external_exports2.string(),manufacturer_part_number:external_exports2.string().optional(),supplier_part_numbers:external_exports2.record(supplier_name2,external_exports2.array(external_exports2.string())).optional(),display_value:external_exports2.string().optional(),display_name:external_exports2.string().optional(),are_pins_interchangeable:external_exports2.boolean().optional(),internally_connected_source_port_ids:external_exports2.array(external_exports2.array(external_exports2.string())).optional(),source_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()});expectTypesMatch3(!0);var source_simple_capacitor2=source_component_base2.extend({ftype:external_exports2.literal("simple_capacitor"),capacitance:capacitance2,max_voltage_rating:voltage2.optional(),display_capacitance:external_exports2.string().optional(),max_decoupling_trace_length:distance7.optional()});expectTypesMatch3(!0);var source_simple_resistor2=source_component_base2.extend({ftype:external_exports2.literal("simple_resistor"),resistance:resistance2,display_resistance:external_exports2.string().optional()});expectTypesMatch3(!0);var source_simple_diode2=source_component_base2.extend({ftype:external_exports2.literal("simple_diode")});expectTypesMatch3(!0);var source_simple_fiducial2=source_component_base2.extend({ftype:external_exports2.literal("simple_fiducial")});expectTypesMatch3(!0);var source_simple_led2=source_simple_diode2.extend({ftype:external_exports2.literal("simple_led"),color:external_exports2.string().optional(),wavelength:external_exports2.string().optional()});expectTypesMatch3(!0);var source_simple_ground2=source_component_base2.extend({ftype:external_exports2.literal("simple_ground")});expectTypesMatch3(!0);var source_simple_chip2=source_component_base2.extend({ftype:external_exports2.literal("simple_chip")});expectTypesMatch3(!0);var source_simple_power_source2=source_component_base2.extend({ftype:external_exports2.literal("simple_power_source"),voltage:voltage2});expectTypesMatch3(!0);var source_simple_current_source2=source_component_base2.extend({ftype:external_exports2.literal("simple_current_source"),current:current2,frequency:frequency2.optional(),peak_to_peak_current:current2.optional(),wave_shape:external_exports2.enum(["sine","square","triangle","sawtooth","dc"]).optional().default("dc"),phase:external_exports2.number().optional(),duty_cycle:external_exports2.number().min(0).max(1).optional()});expectTypesMatch3(!0);var source_pin_attributes2=external_exports2.object({must_be_connected:external_exports2.boolean().optional(),provides_power:external_exports2.boolean().optional(),requires_power:external_exports2.boolean().optional(),provides_ground:external_exports2.boolean().optional(),requires_ground:external_exports2.boolean().optional(),provides_voltage:external_exports2.union([external_exports2.string(),external_exports2.number()]).optional(),requires_voltage:external_exports2.union([external_exports2.string(),external_exports2.number()]).optional(),do_not_connect:external_exports2.boolean().optional(),include_in_board_pinout:external_exports2.boolean().optional(),can_use_internal_pullup:external_exports2.boolean().optional(),is_using_internal_pullup:external_exports2.boolean().optional(),needs_external_pullup:external_exports2.boolean().optional(),can_use_internal_pulldown:external_exports2.boolean().optional(),is_using_internal_pulldown:external_exports2.boolean().optional(),needs_external_pulldown:external_exports2.boolean().optional(),can_use_open_drain:external_exports2.boolean().optional(),is_using_open_drain:external_exports2.boolean().optional(),can_use_push_pull:external_exports2.boolean().optional(),is_using_push_pull:external_exports2.boolean().optional(),should_have_decoupling_capacitor:external_exports2.boolean().optional(),recommended_decoupling_capacitor_capacitance:external_exports2.union([external_exports2.string(),external_exports2.number()]).optional(),is_configured_for_i2c_sda:external_exports2.boolean().optional(),is_configured_for_i2c_scl:external_exports2.boolean().optional(),is_configured_for_spi_mosi:external_exports2.boolean().optional(),is_configured_for_spi_miso:external_exports2.boolean().optional(),is_configured_for_spi_sck:external_exports2.boolean().optional(),is_configured_for_spi_cs:external_exports2.boolean().optional(),is_configured_for_uart_tx:external_exports2.boolean().optional(),is_configured_for_uart_rx:external_exports2.boolean().optional(),supports_i2c_sda:external_exports2.boolean().optional(),supports_i2c_scl:external_exports2.boolean().optional(),supports_spi_mosi:external_exports2.boolean().optional(),supports_spi_miso:external_exports2.boolean().optional(),supports_spi_sck:external_exports2.boolean().optional(),supports_spi_cs:external_exports2.boolean().optional(),supports_uart_tx:external_exports2.boolean().optional(),supports_uart_rx:external_exports2.boolean().optional()});expectTypesMatch3(!0);var source_simple_fuse2=source_component_base2.extend({ftype:external_exports2.literal("simple_fuse"),current_rating_amps:external_exports2.number().describe("Nominal current in amps the fuse is rated for"),voltage_rating_volts:external_exports2.number().describe("Voltage rating in volts, e.g. \xB15V would be 5")});expectTypesMatch3(!0);var source_simple_battery2=source_component_base2.extend({ftype:external_exports2.literal("simple_battery"),capacity:battery_capacity2});expectTypesMatch3(!0);var source_simple_inductor2=source_component_base2.extend({ftype:external_exports2.literal("simple_inductor"),inductance:inductance2,max_current_rating:external_exports2.number().optional()});expectTypesMatch3(!0);var source_simple_push_button2=source_component_base2.extend({ftype:external_exports2.literal("simple_push_button")});expectTypesMatch3(!0);var source_simple_potentiometer2=source_component_base2.extend({ftype:external_exports2.literal("simple_potentiometer"),max_resistance:resistance2,display_max_resistance:external_exports2.string().optional()});expectTypesMatch3(!0);var source_simple_crystal2=source_component_base2.extend({ftype:external_exports2.literal("simple_crystal"),frequency:external_exports2.number().describe("Frequency in Hz"),load_capacitance:external_exports2.number().optional().describe("Load capacitance in pF"),pin_variant:external_exports2.enum(["two_pin","four_pin"]).optional()});expectTypesMatch3(!0);var source_simple_pin_header2=source_component_base2.extend({ftype:external_exports2.literal("simple_pin_header"),pin_count:external_exports2.number(),gender:external_exports2.enum(["male","female"]).optional().default("male")});expectTypesMatch3(!0);var source_simple_connector2=source_component_base2.extend({ftype:external_exports2.literal("simple_connector"),standard:external_exports2.enum(["usb_c","m2"]).optional()});expectTypesMatch3(!0);var source_simple_pinout2=source_component_base2.extend({ftype:external_exports2.literal("simple_pinout")});expectTypesMatch3(!0);var source_simple_resonator2=source_component_base2.extend({ftype:external_exports2.literal("simple_resonator"),load_capacitance:capacitance2,equivalent_series_resistance:resistance2.optional(),frequency:frequency2});expectTypesMatch3(!0);var source_simple_transistor2=source_component_base2.extend({ftype:external_exports2.literal("simple_transistor"),transistor_type:external_exports2.enum(["npn","pnp"])});expectTypesMatch3(!0);var source_simple_test_point2=source_component_base2.extend({ftype:external_exports2.literal("simple_test_point"),footprint_variant:external_exports2.enum(["pad","through_hole"]).optional(),pad_shape:external_exports2.enum(["rect","circle"]).optional(),pad_diameter:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),hole_diameter:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),width:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),height:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional()});expectTypesMatch3(!0);var source_simple_mosfet2=source_component_base2.extend({ftype:external_exports2.literal("simple_mosfet"),channel_type:external_exports2.enum(["n","p"]),mosfet_mode:external_exports2.enum(["enhancement","depletion"])});expectTypesMatch3(!0);var source_simple_op_amp2=source_component_base2.extend({ftype:external_exports2.literal("simple_op_amp")});expectTypesMatch3(!0);var source_simple_switch2=source_component_base2.extend({ftype:external_exports2.literal("simple_switch")});expectTypesMatch3(!0);var source_project_metadata2=external_exports2.object({type:external_exports2.literal("source_project_metadata"),name:external_exports2.string().optional(),software_used_string:external_exports2.string().optional(),project_url:external_exports2.string().optional(),created_at:timestamp2.optional()});expectTypesMatch3(!0);var source_missing_property_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_missing_property_error"),source_missing_property_error_id:getZodPrefixedIdWithDefault2("source_missing_property_error"),source_component_id:external_exports2.string(),property_name:external_exports2.string(),subcircuit_id:external_exports2.string().optional(),error_type:external_exports2.literal("source_missing_property_error").default("source_missing_property_error")}).describe("The source code is missing a property");expectTypesMatch3(!0);var source_failed_to_create_component_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_failed_to_create_component_error"),source_failed_to_create_component_error_id:getZodPrefixedIdWithDefault2("source_failed_to_create_component_error"),error_type:external_exports2.literal("source_failed_to_create_component_error").default("source_failed_to_create_component_error"),component_name:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),parent_source_component_id:external_exports2.string().optional(),pcb_center:external_exports2.object({x:external_exports2.number().optional(),y:external_exports2.number().optional()}).optional(),schematic_center:external_exports2.object({x:external_exports2.number().optional(),y:external_exports2.number().optional()}).optional()}).describe("Error emitted when a component fails to be constructed");expectTypesMatch3(!0);var source_invalid_component_property_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_invalid_component_property_error"),source_invalid_component_property_error_id:getZodPrefixedIdWithDefault2("source_invalid_component_property_error"),source_component_id:external_exports2.string(),property_name:external_exports2.string(),property_value:external_exports2.unknown().optional(),expected_format:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),error_type:external_exports2.literal("source_invalid_component_property_error").default("source_invalid_component_property_error")}).describe("The source component property is invalid");expectTypesMatch3(!0);var source_trace_not_connected_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_trace_not_connected_error"),source_trace_not_connected_error_id:getZodPrefixedIdWithDefault2("source_trace_not_connected_error"),error_type:external_exports2.literal("source_trace_not_connected_error").default("source_trace_not_connected_error"),subcircuit_id:external_exports2.string().optional(),source_group_id:external_exports2.string().optional(),source_trace_id:external_exports2.string().optional(),connected_source_port_ids:external_exports2.array(external_exports2.string()).optional(),selectors_not_found:external_exports2.array(external_exports2.string()).optional()}).describe("Occurs when a source trace selector does not match any ports");expectTypesMatch3(!0);var source_property_ignored_warning2=external_exports2.object({type:external_exports2.literal("source_property_ignored_warning"),source_property_ignored_warning_id:getZodPrefixedIdWithDefault2("source_property_ignored_warning"),source_component_id:external_exports2.string(),property_name:external_exports2.string(),subcircuit_id:external_exports2.string().optional(),error_type:external_exports2.literal("source_property_ignored_warning").default("source_property_ignored_warning"),message:external_exports2.string()}).describe("The source property was ignored");expectTypesMatch3(!0);var source_pin_missing_trace_warning2=external_exports2.object({type:external_exports2.literal("source_pin_missing_trace_warning"),source_pin_missing_trace_warning_id:getZodPrefixedIdWithDefault2("source_pin_missing_trace_warning"),warning_type:external_exports2.literal("source_pin_missing_trace_warning").default("source_pin_missing_trace_warning"),message:external_exports2.string(),source_component_id:external_exports2.string(),source_port_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a source component pin is missing a trace connection");expectTypesMatch3(!0);var source_simple_voltage_probe2=source_component_base2.extend({ftype:external_exports2.literal("simple_voltage_probe")});expectTypesMatch3(!0);var source_interconnect2=source_component_base2.extend({ftype:external_exports2.literal("interconnect")});expectTypesMatch3(!0);var source_i2c_misconfigured_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_i2c_misconfigured_error"),source_i2c_misconfigured_error_id:getZodPrefixedIdWithDefault2("source_i2c_misconfigured_error"),error_type:external_exports2.literal("source_i2c_misconfigured_error").default("source_i2c_misconfigured_error"),source_port_ids:external_exports2.array(external_exports2.string())}).describe("Error emitted when incompatible I2C pins (e.g. SDA and SCL) are connected to the same net");expectTypesMatch3(!0);var source_simple_voltage_source2=source_component_base2.extend({ftype:external_exports2.literal("simple_voltage_source"),voltage:voltage2,frequency:frequency2.optional(),peak_to_peak_voltage:voltage2.optional(),wave_shape:external_exports2.enum(["sinewave","square","triangle","sawtooth"]).optional(),phase:rotation4.optional(),duty_cycle:external_exports2.number().optional().describe("Duty cycle as a fraction (0 to 1)")});expectTypesMatch3(!0);var any_source_component2=external_exports2.union([source_simple_resistor2,source_simple_capacitor2,source_simple_diode2,source_simple_fiducial2,source_simple_led2,source_simple_ground2,source_simple_chip2,source_simple_power_source2,source_simple_current_source2,source_simple_battery2,source_simple_inductor2,source_simple_push_button2,source_simple_potentiometer2,source_simple_crystal2,source_simple_pin_header2,source_simple_connector2,source_simple_pinout2,source_simple_resonator2,source_simple_switch2,source_simple_transistor2,source_simple_test_point2,source_simple_mosfet2,source_simple_op_amp2,source_simple_fuse2,source_simple_voltage_probe2,source_interconnect2,source_simple_voltage_source2,source_project_metadata2,source_missing_property_error2,source_invalid_component_property_error2,source_failed_to_create_component_error2,source_trace_not_connected_error2,source_property_ignored_warning2,source_pin_missing_trace_warning2,source_i2c_misconfigured_error2]);expectTypesMatch3(!0);var source_port2=external_exports2.object({type:external_exports2.literal("source_port"),pin_number:external_exports2.number().optional(),port_hints:external_exports2.array(external_exports2.string()).optional(),name:external_exports2.string(),source_port_id:external_exports2.string(),source_component_id:external_exports2.string().optional(),source_group_id:external_exports2.string().optional(),most_frequently_referenced_by_name:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional()}).merge(source_pin_attributes2);expectTypesMatch3(!0);var source_component_internal_connection2=external_exports2.object({type:external_exports2.literal("source_component_internal_connection"),source_component_internal_connection_id:external_exports2.string(),source_component_id:external_exports2.string(),source_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()});expectTypesMatch3(!0);var source_trace2=external_exports2.object({type:external_exports2.literal("source_trace"),source_trace_id:external_exports2.string(),connected_source_port_ids:external_exports2.array(external_exports2.string()),connected_source_net_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional(),max_length:external_exports2.number().optional(),min_trace_thickness:external_exports2.number().optional(),display_name:external_exports2.string().optional()});expectTypesMatch3(!0);var source_group2=external_exports2.object({type:external_exports2.literal("source_group"),source_group_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional(),parent_subcircuit_id:external_exports2.string().optional(),parent_source_group_id:external_exports2.string().optional(),is_subcircuit:external_exports2.boolean().optional(),show_as_schematic_box:external_exports2.boolean().optional(),name:external_exports2.string().optional(),was_automatically_named:external_exports2.boolean().optional()});expectTypesMatch3(!0);var source_net2=external_exports2.object({type:external_exports2.literal("source_net"),source_net_id:external_exports2.string(),name:external_exports2.string(),member_source_group_ids:external_exports2.array(external_exports2.string()),is_power:external_exports2.boolean().optional(),is_ground:external_exports2.boolean().optional(),is_digital_signal:external_exports2.boolean().optional(),is_analog_signal:external_exports2.boolean().optional(),is_positive_voltage_source:external_exports2.boolean().optional(),trace_width:external_exports2.number().optional(),subcircuit_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional()});expectTypesMatch3(!0);var source_board2=external_exports2.object({type:external_exports2.literal("source_board"),source_board_id:external_exports2.string(),source_group_id:external_exports2.string(),title:external_exports2.string().optional()}).describe("Defines a board in the source domain");expectTypesMatch3(!0);var source_ambiguous_port_reference2=base_circuit_json_error2.extend({type:external_exports2.literal("source_ambiguous_port_reference"),source_ambiguous_port_reference_id:getZodPrefixedIdWithDefault2("source_ambiguous_port_reference"),error_type:external_exports2.literal("source_ambiguous_port_reference").default("source_ambiguous_port_reference"),source_port_id:external_exports2.string().optional(),source_component_id:external_exports2.string().optional()}).describe("Error emitted when a port hint matches multiple non-overlapping pads, making the port reference ambiguous");expectTypesMatch3(!0);var source_pcb_ground_plane2=external_exports2.object({type:external_exports2.literal("source_pcb_ground_plane"),source_pcb_ground_plane_id:external_exports2.string(),source_group_id:external_exports2.string(),source_net_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional()}).describe("Defines a ground plane in the source domain");expectTypesMatch3(!0);var all_layers2=["top","bottom","inner1","inner2","inner3","inner4","inner5","inner6"],layer_string2=external_exports2.enum(all_layers2),layer_ref2=layer_string2.or(external_exports2.object({name:layer_string2})).transform(layer=>typeof layer=="string"?layer:layer.name);expectTypesMatch3(!0);var visible_layer2=external_exports2.enum(["top","bottom"]),source_manually_placed_via2=external_exports2.object({type:external_exports2.literal("source_manually_placed_via"),source_manually_placed_via_id:external_exports2.string(),source_group_id:external_exports2.string(),source_net_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional(),source_trace_id:external_exports2.string().optional()}).describe("Defines a via that is manually placed in the source domain");expectTypesMatch3(!0);var source_no_power_pin_defined_warning2=external_exports2.object({type:external_exports2.literal("source_no_power_pin_defined_warning"),source_no_power_pin_defined_warning_id:getZodPrefixedIdWithDefault2("source_no_power_pin_defined_warning"),warning_type:external_exports2.literal("source_no_power_pin_defined_warning").default("source_no_power_pin_defined_warning"),message:external_exports2.string(),source_component_id:external_exports2.string(),source_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a chip has no source ports with requires_power=true");expectTypesMatch3(!0);var source_no_ground_pin_defined_warning2=external_exports2.object({type:external_exports2.literal("source_no_ground_pin_defined_warning"),source_no_ground_pin_defined_warning_id:getZodPrefixedIdWithDefault2("source_no_ground_pin_defined_warning"),warning_type:external_exports2.literal("source_no_ground_pin_defined_warning").default("source_no_ground_pin_defined_warning"),message:external_exports2.string(),source_component_id:external_exports2.string(),source_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a chip has no source ports marked as ground pins");expectTypesMatch3(!0);var source_component_pins_underspecified_warning2=external_exports2.object({type:external_exports2.literal("source_component_pins_underspecified_warning"),source_component_pins_underspecified_warning_id:getZodPrefixedIdWithDefault2("source_component_pins_underspecified_warning"),warning_type:external_exports2.literal("source_component_pins_underspecified_warning").default("source_component_pins_underspecified_warning"),message:external_exports2.string(),source_component_id:external_exports2.string(),source_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when all ports on a source component are underspecified");expectTypesMatch3(!0);var source_pin_must_be_connected_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_pin_must_be_connected_error"),source_pin_must_be_connected_error_id:getZodPrefixedIdWithDefault2("source_pin_must_be_connected_error"),error_type:external_exports2.literal("source_pin_must_be_connected_error").default("source_pin_must_be_connected_error"),source_component_id:external_exports2.string(),source_port_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when a pin with mustBeConnected attribute is not connected to any trace");expectTypesMatch3(!0);var unknown_error_finding_part2=base_circuit_json_error2.extend({type:external_exports2.literal("unknown_error_finding_part"),unknown_error_finding_part_id:getZodPrefixedIdWithDefault2("unknown_error_finding_part"),error_type:external_exports2.literal("unknown_error_finding_part").default("unknown_error_finding_part"),source_component_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when an unexpected error occurs while finding a part");expectTypesMatch3(!0);var schematic_box2=external_exports2.object({type:external_exports2.literal("schematic_box"),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),width:distance7,height:distance7,is_dashed:external_exports2.boolean().default(!1),x:distance7,y:distance7,subcircuit_id:external_exports2.string().optional()}).describe("Draws a box on the schematic");expectTypesMatch3(!0);var schematic_path2=external_exports2.object({type:external_exports2.literal("schematic_path"),schematic_path_id:getZodPrefixedIdWithDefault2("schematic_path"),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),fill_color:external_exports2.string().optional(),is_filled:external_exports2.boolean().optional(),stroke_width:distance7.nullable().optional(),stroke_color:external_exports2.string().optional(),points:external_exports2.array(point5),subcircuit_id:external_exports2.string().optional()});expectTypesMatch3(!0);var schematic_pin_styles2=external_exports2.record(external_exports2.object({left_margin:length3.optional(),right_margin:length3.optional(),top_margin:length3.optional(),bottom_margin:length3.optional()})),schematic_component_port_arrangement_by_size2=external_exports2.object({left_size:external_exports2.number(),right_size:external_exports2.number(),top_size:external_exports2.number().optional(),bottom_size:external_exports2.number().optional()});expectTypesMatch3(!0);var schematic_component_port_arrangement_by_sides2=external_exports2.object({left_side:external_exports2.object({pins:external_exports2.array(external_exports2.number()),direction:external_exports2.enum(["top-to-bottom","bottom-to-top"]).optional()}).optional(),right_side:external_exports2.object({pins:external_exports2.array(external_exports2.number()),direction:external_exports2.enum(["top-to-bottom","bottom-to-top"]).optional()}).optional(),top_side:external_exports2.object({pins:external_exports2.array(external_exports2.number()),direction:external_exports2.enum(["left-to-right","right-to-left"]).optional()}).optional(),bottom_side:external_exports2.object({pins:external_exports2.array(external_exports2.number()),direction:external_exports2.enum(["left-to-right","right-to-left"]).optional()}).optional()});expectTypesMatch3(!0);var port_arrangement2=external_exports2.union([schematic_component_port_arrangement_by_size2,schematic_component_port_arrangement_by_sides2]),schematic_component2=external_exports2.object({type:external_exports2.literal("schematic_component"),size:size2,center:point5,source_component_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string(),schematic_symbol_id:external_exports2.string().optional(),pin_spacing:length3.optional(),pin_styles:schematic_pin_styles2.optional(),box_width:length3.optional(),symbol_name:external_exports2.string().optional(),port_arrangement:port_arrangement2.optional(),port_labels:external_exports2.record(external_exports2.string()).optional(),symbol_display_value:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),schematic_group_id:external_exports2.string().optional(),is_schematic_group:external_exports2.boolean().optional(),source_group_id:external_exports2.string().optional(),is_box_with_pins:external_exports2.boolean().optional().default(!0)});expectTypesMatch3(!0);var schematicSymbolMetadata2=external_exports2.object({kicad_symbol:kicadSymbolMetadata3.optional()}).catchall(external_exports2.unknown()),schematic_symbol2=external_exports2.object({type:external_exports2.literal("schematic_symbol"),schematic_symbol_id:external_exports2.string(),name:external_exports2.string().optional(),metadata:schematicSymbolMetadata2.optional()}).describe("Defines a named schematic symbol that can be referenced by components.");expectTypesMatch3(!0);var schematic_line2=external_exports2.object({type:external_exports2.literal("schematic_line"),schematic_line_id:getZodPrefixedIdWithDefault2("schematic_line"),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),x1:distance7,y1:distance7,x2:distance7,y2:distance7,stroke_width:distance7.nullable().optional(),color:external_exports2.string().default("#000000"),is_dashed:external_exports2.boolean().default(!1),subcircuit_id:external_exports2.string().optional()}).describe("Draws a styled line on the schematic");expectTypesMatch3(!0);var schematic_rect2=external_exports2.object({type:external_exports2.literal("schematic_rect"),schematic_rect_id:getZodPrefixedIdWithDefault2("schematic_rect"),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),center:point5,width:distance7,height:distance7,rotation:rotation4.default(0),stroke_width:distance7.nullable().optional(),color:external_exports2.string().default("#000000"),is_filled:external_exports2.boolean().default(!1),fill_color:external_exports2.string().optional(),is_dashed:external_exports2.boolean().default(!1),subcircuit_id:external_exports2.string().optional()}).describe("Draws a styled rectangle on the schematic");expectTypesMatch3(!0);var schematic_circle2=external_exports2.object({type:external_exports2.literal("schematic_circle"),schematic_circle_id:getZodPrefixedIdWithDefault2("schematic_circle"),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),center:point5,radius:distance7,stroke_width:distance7.nullable().optional(),color:external_exports2.string().default("#000000"),is_filled:external_exports2.boolean().default(!1),fill_color:external_exports2.string().optional(),is_dashed:external_exports2.boolean().default(!1),subcircuit_id:external_exports2.string().optional()}).describe("Draws a styled circle on the schematic");expectTypesMatch3(!0);var schematic_arc2=external_exports2.object({type:external_exports2.literal("schematic_arc"),schematic_arc_id:getZodPrefixedIdWithDefault2("schematic_arc"),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),center:point5,radius:distance7,start_angle_degrees:rotation4,end_angle_degrees:rotation4,direction:external_exports2.enum(["clockwise","counterclockwise"]).default("counterclockwise"),stroke_width:distance7.nullable().optional(),color:external_exports2.string().default("#000000"),is_dashed:external_exports2.boolean().default(!1),subcircuit_id:external_exports2.string().optional()}).describe("Draws a styled arc on the schematic");expectTypesMatch3(!0);var schematic_trace2=external_exports2.object({type:external_exports2.literal("schematic_trace"),schematic_trace_id:external_exports2.string(),source_trace_id:external_exports2.string().optional(),junctions:external_exports2.array(external_exports2.object({x:external_exports2.number(),y:external_exports2.number()})),edges:external_exports2.array(external_exports2.object({from:external_exports2.object({x:external_exports2.number(),y:external_exports2.number()}),to:external_exports2.object({x:external_exports2.number(),y:external_exports2.number()}),is_crossing:external_exports2.boolean().optional(),from_schematic_port_id:external_exports2.string().optional(),to_schematic_port_id:external_exports2.string().optional()})),subcircuit_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional()});expectTypesMatch3(!0);var fivePointAnchor3=external_exports2.enum(["center","left","right","top","bottom"]);expectTypesMatch3(!0);var schematic_text2=external_exports2.object({type:external_exports2.literal("schematic_text"),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),schematic_text_id:external_exports2.string(),text:external_exports2.string(),font_size:external_exports2.number().default(.18),position:external_exports2.object({x:distance7,y:distance7}),rotation:external_exports2.number().default(0),anchor:external_exports2.union([fivePointAnchor3.describe("legacy"),ninePointAnchor3]).default("center"),color:external_exports2.string().default("#000000"),subcircuit_id:external_exports2.string().optional()});expectTypesMatch3(!0);var schematic_port2=external_exports2.object({type:external_exports2.literal("schematic_port"),schematic_port_id:external_exports2.string(),source_port_id:external_exports2.string(),schematic_component_id:external_exports2.string().optional(),center:point5,facing_direction:external_exports2.enum(["up","down","left","right"]).optional(),distance_from_component_edge:external_exports2.number().optional(),side_of_component:external_exports2.enum(["top","bottom","left","right"]).optional(),true_ccw_index:external_exports2.number().optional(),pin_number:external_exports2.number().optional(),display_pin_label:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),is_connected:external_exports2.boolean().optional(),has_input_arrow:external_exports2.boolean().optional(),has_output_arrow:external_exports2.boolean().optional(),is_drawn_with_inversion_circle:external_exports2.boolean().optional()}).describe("Defines a port on a schematic component");expectTypesMatch3(!0);var schematic_net_label2=external_exports2.object({type:external_exports2.literal("schematic_net_label"),schematic_net_label_id:getZodPrefixedIdWithDefault2("schematic_net_label"),schematic_trace_id:external_exports2.string().optional(),source_trace_id:external_exports2.string().optional(),source_net_id:external_exports2.string(),center:point5,anchor_position:point5.optional(),anchor_side:external_exports2.enum(["top","bottom","left","right"]),text:external_exports2.string(),symbol_name:external_exports2.string().optional(),is_movable:external_exports2.boolean().optional(),subcircuit_id:external_exports2.string().optional()});expectTypesMatch3(!0);var schematic_error2=base_circuit_json_error2.extend({type:external_exports2.literal("schematic_error"),schematic_error_id:external_exports2.string(),error_type:external_exports2.literal("schematic_port_not_found").default("schematic_port_not_found"),subcircuit_id:external_exports2.string().optional()}).describe("Defines a schematic error on the schematic");expectTypesMatch3(!0);var schematic_layout_error2=base_circuit_json_error2.extend({type:external_exports2.literal("schematic_layout_error"),schematic_layout_error_id:getZodPrefixedIdWithDefault2("schematic_layout_error"),error_type:external_exports2.literal("schematic_layout_error").default("schematic_layout_error"),source_group_id:external_exports2.string(),schematic_group_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when schematic layout fails for a group");expectTypesMatch3(!0);var schematic_debug_object_base2=external_exports2.object({type:external_exports2.literal("schematic_debug_object"),label:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}),schematic_debug_rect2=schematic_debug_object_base2.extend({shape:external_exports2.literal("rect"),center:point5,size:size2}),schematic_debug_line2=schematic_debug_object_base2.extend({shape:external_exports2.literal("line"),start:point5,end:point5}),schematic_debug_point2=schematic_debug_object_base2.extend({shape:external_exports2.literal("point"),center:point5}),schematic_debug_object2=external_exports2.discriminatedUnion("shape",[schematic_debug_rect2,schematic_debug_line2,schematic_debug_point2]);expectTypesMatch3(!0);var schematic_voltage_probe2=external_exports2.object({type:external_exports2.literal("schematic_voltage_probe"),schematic_voltage_probe_id:external_exports2.string(),source_component_id:external_exports2.string().optional(),name:external_exports2.string().optional(),position:point5,schematic_trace_id:external_exports2.string(),voltage:voltage2.optional(),subcircuit_id:external_exports2.string().optional(),color:external_exports2.string().optional(),label_alignment:ninePointAnchor3.optional()}).describe("Defines a voltage probe measurement point on a schematic trace");expectTypesMatch3(!0);var schematic_manual_edit_conflict_warning2=external_exports2.object({type:external_exports2.literal("schematic_manual_edit_conflict_warning"),schematic_manual_edit_conflict_warning_id:getZodPrefixedIdWithDefault2("schematic_manual_edit_conflict_warning"),warning_type:external_exports2.literal("schematic_manual_edit_conflict_warning").default("schematic_manual_edit_conflict_warning"),message:external_exports2.string(),schematic_component_id:external_exports2.string(),schematic_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),source_component_id:external_exports2.string()}).describe("Warning emitted when a component has both manual placement and explicit schX/schY coordinates");expectTypesMatch3(!0);var schematic_group2=external_exports2.object({type:external_exports2.literal("schematic_group"),schematic_group_id:getZodPrefixedIdWithDefault2("schematic_group"),source_group_id:external_exports2.string(),is_subcircuit:external_exports2.boolean().optional(),subcircuit_id:external_exports2.string().optional(),width:length3,height:length3,center:point5,schematic_component_ids:external_exports2.array(external_exports2.string()),show_as_schematic_box:external_exports2.boolean().optional(),name:external_exports2.string().optional(),description:external_exports2.string().optional()}).describe("Defines a group of components on the schematic");expectTypesMatch3(!0);var schematic_table2=external_exports2.object({type:external_exports2.literal("schematic_table"),schematic_table_id:getZodPrefixedIdWithDefault2("schematic_table"),anchor_position:point5,column_widths:external_exports2.array(distance7),row_heights:external_exports2.array(distance7),cell_padding:distance7.optional(),border_width:distance7.optional(),subcircuit_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string().optional(),anchor:ninePointAnchor3.optional()}).describe("Defines a table on the schematic");expectTypesMatch3(!0);var schematic_table_cell2=external_exports2.object({type:external_exports2.literal("schematic_table_cell"),schematic_table_cell_id:getZodPrefixedIdWithDefault2("schematic_table_cell"),schematic_table_id:external_exports2.string(),start_row_index:external_exports2.number(),end_row_index:external_exports2.number(),start_column_index:external_exports2.number(),end_column_index:external_exports2.number(),text:external_exports2.string().optional(),center:point5,width:distance7,height:distance7,horizontal_align:external_exports2.enum(["left","center","right"]).optional(),vertical_align:external_exports2.enum(["top","middle","bottom"]).optional(),font_size:distance7.optional(),subcircuit_id:external_exports2.string().optional()}).describe("Defines a cell within a schematic_table");expectTypesMatch3(!0);var schematic_sheet2=external_exports2.object({type:external_exports2.literal("schematic_sheet"),schematic_sheet_id:getZodPrefixedIdWithDefault2("schematic_sheet"),name:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Defines a schematic sheet or page that components can be placed on");expectTypesMatch3(!0);var point_with_bulge2=external_exports2.object({x:distance7,y:distance7,bulge:external_exports2.number().optional()});expectTypesMatch3(!0);var ring2=external_exports2.object({vertices:external_exports2.array(point_with_bulge2)});expectTypesMatch3(!0);var brep_shape2=external_exports2.object({outer_ring:ring2,inner_rings:external_exports2.array(ring2).default([])});expectTypesMatch3(!0);var pcb_route_hint2=external_exports2.object({x:distance7,y:distance7,via:external_exports2.boolean().optional(),via_to_layer:layer_ref2.optional()}),pcb_route_hints2=external_exports2.array(pcb_route_hint2);expectTypesMatch3(!0);expectTypesMatch3(!0);var route_hint_point2=external_exports2.object({x:distance7,y:distance7,via:external_exports2.boolean().optional(),to_layer:layer_ref2.optional(),trace_width:distance7.optional()});expectTypesMatch3(!0);var pcb_component2=external_exports2.object({type:external_exports2.literal("pcb_component"),pcb_component_id:getZodPrefixedIdWithDefault2("pcb_component"),source_component_id:external_exports2.string(),center:point5,layer:layer_ref2,rotation:rotation4,display_offset_x:external_exports2.string().optional().describe("How to display the x offset for this part, usually corresponding with how the user specified it"),display_offset_y:external_exports2.string().optional().describe("How to display the y offset for this part, usually corresponding with how the user specified it"),width:length3,height:length3,do_not_place:external_exports2.boolean().optional(),is_allowed_to_be_off_board:external_exports2.boolean().optional(),subcircuit_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),position_mode:external_exports2.enum(["packed","relative_to_group_anchor","relative_to_another_component","none"]).optional(),anchor_position:point5.optional(),anchor_alignment:ninePointAnchor3.optional(),positioned_relative_to_pcb_group_id:external_exports2.string().optional(),positioned_relative_to_pcb_board_id:external_exports2.string().optional(),cable_insertion_center:point5.optional(),metadata:external_exports2.object({kicad_footprint:kicadFootprintMetadata3.optional()}).optional(),obstructs_within_bounds:external_exports2.boolean().default(!0).describe("Does this component take up all the space within its bounds on a layer. This is generally true except for when separated pin headers are being represented by a single component (in which case, chips can be placed between the pin headers) or for tall modules where chips fit underneath")}).describe("Defines a component on the PCB");expectTypesMatch3(!0);var pcb_hole_circle2=external_exports2.object({type:external_exports2.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault2("pcb_hole"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("circle"),hole_diameter:external_exports2.number(),x:distance7,y:distance7,is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_hole_circle_shape2=pcb_hole_circle2.describe("Defines a circular hole on the PCB");expectTypesMatch3(!0);var pcb_hole_rect2=external_exports2.object({type:external_exports2.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault2("pcb_hole"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("rect"),hole_width:external_exports2.number(),hole_height:external_exports2.number(),x:distance7,y:distance7,is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_hole_rect_shape2=pcb_hole_rect2.describe("Defines a rectangular (square-capable) hole on the PCB. Use equal width/height for square.");expectTypesMatch3(!0);var pcb_hole_circle_or_square2=external_exports2.object({type:external_exports2.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault2("pcb_hole"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),hole_shape:external_exports2.enum(["circle","square"]),hole_diameter:external_exports2.number(),x:distance7,y:distance7,is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_hole_circle_or_square_shape2=pcb_hole_circle_or_square2.describe("Defines a circular or square hole on the PCB");expectTypesMatch3(!0);var pcb_hole_oval2=external_exports2.object({type:external_exports2.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault2("pcb_hole"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("oval"),hole_width:external_exports2.number(),hole_height:external_exports2.number(),x:distance7,y:distance7,is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_hole_oval_shape2=pcb_hole_oval2.describe("Defines an oval hole on the PCB");expectTypesMatch3(!0);var pcb_hole_pill2=external_exports2.object({type:external_exports2.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault2("pcb_hole"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("pill"),hole_width:external_exports2.number(),hole_height:external_exports2.number(),x:distance7,y:distance7,is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_hole_pill_shape2=pcb_hole_pill2.describe("Defines a pill-shaped hole on the PCB");expectTypesMatch3(!0);var pcb_hole_rotated_pill2=external_exports2.object({type:external_exports2.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault2("pcb_hole"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("rotated_pill"),hole_width:external_exports2.number(),hole_height:external_exports2.number(),x:distance7,y:distance7,ccw_rotation:rotation4,is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_hole_rotated_pill_shape2=pcb_hole_rotated_pill2.describe("Defines a rotated pill-shaped hole on the PCB");expectTypesMatch3(!0);var pcb_hole2=pcb_hole_circle_or_square2.or(pcb_hole_oval2).or(pcb_hole_pill2).or(pcb_hole_rotated_pill2).or(pcb_hole_circle2).or(pcb_hole_rect2),pcb_plated_hole_circle2=external_exports2.object({type:external_exports2.literal("pcb_plated_hole"),shape:external_exports2.literal("circle"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),outer_diameter:external_exports2.number(),hole_diameter:external_exports2.number(),is_covered_with_solder_mask:external_exports2.boolean().optional(),x:distance7,y:distance7,layers:external_exports2.array(layer_ref2),port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault2("pcb_plated_hole"),soldermask_margin:external_exports2.number().optional()}),pcb_plated_hole_oval2=external_exports2.object({type:external_exports2.literal("pcb_plated_hole"),shape:external_exports2.enum(["oval","pill"]),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),outer_width:external_exports2.number(),outer_height:external_exports2.number(),hole_width:external_exports2.number(),hole_height:external_exports2.number(),is_covered_with_solder_mask:external_exports2.boolean().optional(),x:distance7,y:distance7,ccw_rotation:rotation4,layers:external_exports2.array(layer_ref2),port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault2("pcb_plated_hole"),soldermask_margin:external_exports2.number().optional()}),pcb_circular_hole_with_rect_pad2=external_exports2.object({type:external_exports2.literal("pcb_plated_hole"),shape:external_exports2.literal("circular_hole_with_rect_pad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("circle"),pad_shape:external_exports2.literal("rect"),hole_diameter:external_exports2.number(),rect_pad_width:external_exports2.number(),rect_pad_height:external_exports2.number(),rect_border_radius:external_exports2.number().optional(),hole_offset_x:distance7.default(0),hole_offset_y:distance7.default(0),is_covered_with_solder_mask:external_exports2.boolean().optional(),x:distance7,y:distance7,layers:external_exports2.array(layer_ref2),port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault2("pcb_plated_hole"),soldermask_margin:external_exports2.number().optional(),rect_ccw_rotation:rotation4.optional()}),pcb_pill_hole_with_rect_pad2=external_exports2.object({type:external_exports2.literal("pcb_plated_hole"),shape:external_exports2.literal("pill_hole_with_rect_pad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("pill"),pad_shape:external_exports2.literal("rect"),hole_width:external_exports2.number(),hole_height:external_exports2.number(),rect_pad_width:external_exports2.number(),rect_pad_height:external_exports2.number(),rect_border_radius:external_exports2.number().optional(),hole_offset_x:distance7.default(0),hole_offset_y:distance7.default(0),is_covered_with_solder_mask:external_exports2.boolean().optional(),x:distance7,y:distance7,layers:external_exports2.array(layer_ref2),port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault2("pcb_plated_hole"),soldermask_margin:external_exports2.number().optional()}),pcb_rotated_pill_hole_with_rect_pad2=external_exports2.object({type:external_exports2.literal("pcb_plated_hole"),shape:external_exports2.literal("rotated_pill_hole_with_rect_pad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("rotated_pill"),pad_shape:external_exports2.literal("rect"),hole_width:external_exports2.number(),hole_height:external_exports2.number(),hole_ccw_rotation:rotation4,rect_pad_width:external_exports2.number(),rect_pad_height:external_exports2.number(),rect_border_radius:external_exports2.number().optional(),rect_ccw_rotation:rotation4,hole_offset_x:distance7.default(0),hole_offset_y:distance7.default(0),is_covered_with_solder_mask:external_exports2.boolean().optional(),x:distance7,y:distance7,layers:external_exports2.array(layer_ref2),port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault2("pcb_plated_hole"),soldermask_margin:external_exports2.number().optional()}),pcb_hole_with_polygon_pad2=external_exports2.object({type:external_exports2.literal("pcb_plated_hole"),shape:external_exports2.literal("hole_with_polygon_pad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),hole_shape:external_exports2.enum(["circle","oval","pill","rotated_pill"]),hole_diameter:external_exports2.number().optional(),hole_width:external_exports2.number().optional(),hole_height:external_exports2.number().optional(),pad_outline:external_exports2.array(external_exports2.object({x:distance7,y:distance7})).min(3),hole_offset_x:distance7.default(0),hole_offset_y:distance7.default(0),is_covered_with_solder_mask:external_exports2.boolean().optional(),x:distance7,y:distance7,layers:external_exports2.array(layer_ref2),port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault2("pcb_plated_hole"),soldermask_margin:external_exports2.number().optional(),ccw_rotation:rotation4.optional()}),pcb_plated_hole2=external_exports2.union([pcb_plated_hole_circle2,pcb_plated_hole_oval2,pcb_circular_hole_with_rect_pad2,pcb_pill_hole_with_rect_pad2,pcb_rotated_pill_hole_with_rect_pad2,pcb_hole_with_polygon_pad2]);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);var pcb_port2=external_exports2.object({type:external_exports2.literal("pcb_port"),pcb_port_id:getZodPrefixedIdWithDefault2("pcb_port"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),source_port_id:external_exports2.string(),pcb_component_id:external_exports2.string().optional(),x:distance7,y:distance7,layers:external_exports2.array(layer_ref2),is_board_pinout:external_exports2.boolean().optional()}).describe("Defines a port on the PCB");expectTypesMatch3(!0);var pcb_smtpad_circle2=external_exports2.object({type:external_exports2.literal("pcb_smtpad"),shape:external_exports2.literal("circle"),pcb_smtpad_id:getZodPrefixedIdWithDefault2("pcb_smtpad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,radius:external_exports2.number(),layer:layer_ref2,port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_smtpad_rect2=external_exports2.object({type:external_exports2.literal("pcb_smtpad"),shape:external_exports2.literal("rect"),pcb_smtpad_id:getZodPrefixedIdWithDefault2("pcb_smtpad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),rect_border_radius:external_exports2.number().optional(),corner_radius:external_exports2.number().optional(),layer:layer_ref2,port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional(),soldermask_margin_left:external_exports2.number().optional(),soldermask_margin_top:external_exports2.number().optional(),soldermask_margin_right:external_exports2.number().optional(),soldermask_margin_bottom:external_exports2.number().optional()}),pcb_smtpad_rotated_rect2=external_exports2.object({type:external_exports2.literal("pcb_smtpad"),shape:external_exports2.literal("rotated_rect"),pcb_smtpad_id:getZodPrefixedIdWithDefault2("pcb_smtpad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),rect_border_radius:external_exports2.number().optional(),corner_radius:external_exports2.number().optional(),ccw_rotation:rotation4,layer:layer_ref2,port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional(),soldermask_margin_left:external_exports2.number().optional(),soldermask_margin_top:external_exports2.number().optional(),soldermask_margin_right:external_exports2.number().optional(),soldermask_margin_bottom:external_exports2.number().optional()}),pcb_smtpad_pill2=external_exports2.object({type:external_exports2.literal("pcb_smtpad"),shape:external_exports2.literal("pill"),pcb_smtpad_id:getZodPrefixedIdWithDefault2("pcb_smtpad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),radius:external_exports2.number(),layer:layer_ref2,port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_smtpad_rotated_pill2=external_exports2.object({type:external_exports2.literal("pcb_smtpad"),shape:external_exports2.literal("rotated_pill"),pcb_smtpad_id:getZodPrefixedIdWithDefault2("pcb_smtpad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),radius:external_exports2.number(),ccw_rotation:rotation4,layer:layer_ref2,port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_smtpad_polygon2=external_exports2.object({type:external_exports2.literal("pcb_smtpad"),shape:external_exports2.literal("polygon"),pcb_smtpad_id:getZodPrefixedIdWithDefault2("pcb_smtpad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),points:external_exports2.array(point5),layer:layer_ref2,port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_smtpad2=external_exports2.discriminatedUnion("shape",[pcb_smtpad_circle2,pcb_smtpad_rect2,pcb_smtpad_rotated_rect2,pcb_smtpad_rotated_pill2,pcb_smtpad_pill2,pcb_smtpad_polygon2]).describe("Defines an SMT pad on the PCB");expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);var pcb_solder_paste_circle2=external_exports2.object({type:external_exports2.literal("pcb_solder_paste"),shape:external_exports2.literal("circle"),pcb_solder_paste_id:getZodPrefixedIdWithDefault2("pcb_solder_paste"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,radius:external_exports2.number(),layer:layer_ref2,pcb_component_id:external_exports2.string().optional(),pcb_smtpad_id:external_exports2.string().optional()}),pcb_solder_paste_rect2=external_exports2.object({type:external_exports2.literal("pcb_solder_paste"),shape:external_exports2.literal("rect"),pcb_solder_paste_id:getZodPrefixedIdWithDefault2("pcb_solder_paste"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),layer:layer_ref2,pcb_component_id:external_exports2.string().optional(),pcb_smtpad_id:external_exports2.string().optional()}),pcb_solder_paste_pill2=external_exports2.object({type:external_exports2.literal("pcb_solder_paste"),shape:external_exports2.literal("pill"),pcb_solder_paste_id:getZodPrefixedIdWithDefault2("pcb_solder_paste"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),radius:external_exports2.number(),layer:layer_ref2,pcb_component_id:external_exports2.string().optional(),pcb_smtpad_id:external_exports2.string().optional()}),pcb_solder_paste_rotated_rect2=external_exports2.object({type:external_exports2.literal("pcb_solder_paste"),shape:external_exports2.literal("rotated_rect"),pcb_solder_paste_id:getZodPrefixedIdWithDefault2("pcb_solder_paste"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),ccw_rotation:distance7,layer:layer_ref2,pcb_component_id:external_exports2.string().optional(),pcb_smtpad_id:external_exports2.string().optional()}),pcb_solder_paste_oval2=external_exports2.object({type:external_exports2.literal("pcb_solder_paste"),shape:external_exports2.literal("oval"),pcb_solder_paste_id:getZodPrefixedIdWithDefault2("pcb_solder_paste"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),layer:layer_ref2,pcb_component_id:external_exports2.string().optional(),pcb_smtpad_id:external_exports2.string().optional()}),pcb_solder_paste2=external_exports2.union([pcb_solder_paste_circle2,pcb_solder_paste_rect2,pcb_solder_paste_pill2,pcb_solder_paste_rotated_rect2,pcb_solder_paste_oval2]).describe("Defines solderpaste on the PCB");expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);var pcb_text2=external_exports2.object({type:external_exports2.literal("pcb_text"),pcb_text_id:getZodPrefixedIdWithDefault2("pcb_text"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),text:external_exports2.string(),center:point5,layer:layer_ref2,width:length3,height:length3,lines:external_exports2.number(),align:external_exports2.enum(["bottom-left"])}).describe("Defines text on the PCB");expectTypesMatch3(!0);var pcb_trace_route_point_wire2=external_exports2.object({route_type:external_exports2.literal("wire"),x:distance7,y:distance7,width:distance7,copper_pour_id:external_exports2.string().optional(),is_inside_copper_pour:external_exports2.boolean().optional(),start_pcb_port_id:external_exports2.string().optional(),end_pcb_port_id:external_exports2.string().optional(),layer:layer_ref2}),pcb_trace_route_point_via2=external_exports2.object({route_type:external_exports2.literal("via"),x:distance7,y:distance7,copper_pour_id:external_exports2.string().optional(),is_inside_copper_pour:external_exports2.boolean().optional(),hole_diameter:distance7.optional(),outer_diameter:distance7.optional(),from_layer:external_exports2.string(),to_layer:external_exports2.string()}),pcb_trace_route_point2=external_exports2.union([pcb_trace_route_point_wire2,pcb_trace_route_point_via2]),pcb_trace2=external_exports2.object({type:external_exports2.literal("pcb_trace"),source_trace_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),pcb_trace_id:getZodPrefixedIdWithDefault2("pcb_trace"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),route_thickness_mode:external_exports2.enum(["constant","interpolated"]).default("constant").optional(),route_order_index:external_exports2.number().optional(),should_round_corners:external_exports2.boolean().optional(),trace_length:external_exports2.number().optional(),highlight_color:external_exports2.string().optional(),route:external_exports2.array(pcb_trace_route_point2)}).describe("Defines a trace on the PCB");expectTypesMatch3(!0);expectTypesMatch3(!0);var pcb_trace_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_trace_error"),pcb_trace_error_id:getZodPrefixedIdWithDefault2("pcb_trace_error"),error_type:external_exports2.literal("pcb_trace_error").default("pcb_trace_error"),center:point5.optional(),pcb_trace_id:external_exports2.string(),source_trace_id:external_exports2.string(),pcb_component_ids:external_exports2.array(external_exports2.string()),pcb_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Defines a trace error on the PCB");expectTypesMatch3(!0);var pcb_trace_missing_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_trace_missing_error"),pcb_trace_missing_error_id:getZodPrefixedIdWithDefault2("pcb_trace_missing_error"),error_type:external_exports2.literal("pcb_trace_missing_error").default("pcb_trace_missing_error"),center:point5.optional(),source_trace_id:external_exports2.string(),pcb_component_ids:external_exports2.array(external_exports2.string()),pcb_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Defines an error when a source trace has no corresponding PCB trace");expectTypesMatch3(!0);var pcb_port_not_matched_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_port_not_matched_error"),pcb_error_id:getZodPrefixedIdWithDefault2("pcb_error"),error_type:external_exports2.literal("pcb_port_not_matched_error").default("pcb_port_not_matched_error"),pcb_component_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Defines a trace error on the PCB where a port is not matched");expectTypesMatch3(!0);var pcb_port_not_connected_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_port_not_connected_error"),pcb_port_not_connected_error_id:getZodPrefixedIdWithDefault2("pcb_port_not_connected_error"),error_type:external_exports2.literal("pcb_port_not_connected_error").default("pcb_port_not_connected_error"),pcb_port_ids:external_exports2.array(external_exports2.string()),pcb_component_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Defines an error when a pcb port is not connected to any trace");expectTypesMatch3(!0);var pcb_net2=external_exports2.object({type:external_exports2.literal("pcb_net"),pcb_net_id:getZodPrefixedIdWithDefault2("pcb_net"),source_net_id:external_exports2.string().optional(),highlight_color:external_exports2.string().optional()}).describe("Defines a net on the PCB");expectTypesMatch3(!0);var pcb_via2=external_exports2.object({type:external_exports2.literal("pcb_via"),pcb_via_id:getZodPrefixedIdWithDefault2("pcb_via"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional(),x:distance7,y:distance7,outer_diameter:distance7.default("0.6mm"),hole_diameter:distance7.default("0.25mm"),from_layer:layer_ref2.optional(),to_layer:layer_ref2.optional(),layers:external_exports2.array(layer_ref2),pcb_trace_id:external_exports2.string().optional(),net_is_assignable:external_exports2.boolean().optional(),net_assigned:external_exports2.boolean().optional(),is_tented:external_exports2.boolean().optional()}).describe("Defines a via on the PCB");expectTypesMatch3(!0);var pcb_board2=external_exports2.object({type:external_exports2.literal("pcb_board"),pcb_board_id:getZodPrefixedIdWithDefault2("pcb_board"),pcb_panel_id:external_exports2.string().optional(),carrier_pcb_board_id:external_exports2.string().optional(),is_subcircuit:external_exports2.boolean().optional(),subcircuit_id:external_exports2.string().optional(),is_mounted_to_carrier_board:external_exports2.boolean().optional(),width:length3.optional(),height:length3.optional(),center:point5,display_offset_x:external_exports2.string().optional().describe("How to display the x offset for this board, usually corresponding with how the user specified it"),display_offset_y:external_exports2.string().optional().describe("How to display the y offset for this board, usually corresponding with how the user specified it"),thickness:length3.optional().default(1.4),num_layers:external_exports2.number().optional().default(4),outline:external_exports2.array(point5).optional(),shape:external_exports2.enum(["rect","polygon"]).optional(),material:external_exports2.enum(["fr4","fr1"]).default("fr4"),anchor_position:point5.optional(),anchor_alignment:ninePointAnchor3.optional(),position_mode:external_exports2.enum(["relative_to_panel_anchor","none"]).optional()}).describe("Defines the board outline of the PCB");expectTypesMatch3(!0);var pcb_panel2=external_exports2.object({type:external_exports2.literal("pcb_panel"),pcb_panel_id:getZodPrefixedIdWithDefault2("pcb_panel"),width:length3,height:length3,center:point5,covered_with_solder_mask:external_exports2.boolean().optional().default(!0)}).describe("Defines a PCB panel that can contain multiple boards");expectTypesMatch3(!0);var pcb_placement_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_placement_error"),pcb_placement_error_id:getZodPrefixedIdWithDefault2("pcb_placement_error"),error_type:external_exports2.literal("pcb_placement_error").default("pcb_placement_error"),subcircuit_id:external_exports2.string().optional()}).describe("Defines a placement error on the PCB");expectTypesMatch3(!0);var pcb_panelization_placement_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_panelization_placement_error"),pcb_panelization_placement_error_id:getZodPrefixedIdWithDefault2("pcb_panelization_placement_error"),error_type:external_exports2.literal("pcb_panelization_placement_error").default("pcb_panelization_placement_error"),pcb_panel_id:external_exports2.string().optional(),pcb_board_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Defines a panelization placement error on the PCB");expectTypesMatch3(!0);var pcb_trace_hint2=external_exports2.object({type:external_exports2.literal("pcb_trace_hint"),pcb_trace_hint_id:getZodPrefixedIdWithDefault2("pcb_trace_hint"),pcb_port_id:external_exports2.string(),pcb_component_id:external_exports2.string(),route:external_exports2.array(route_hint_point2),subcircuit_id:external_exports2.string().optional()}).describe("A hint that can be used during generation of a PCB trace");expectTypesMatch3(!0);var pcb_silkscreen_line2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_line"),pcb_silkscreen_line_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_line"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),stroke_width:distance7.default("0.1mm"),x1:distance7,y1:distance7,x2:distance7,y2:distance7,layer:visible_layer2}).describe("Defines a silkscreen line on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_path2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_path"),pcb_silkscreen_path_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_path"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:visible_layer2,route:external_exports2.array(point5),stroke_width:length3}).describe("Defines a silkscreen path on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_text2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_text"),pcb_silkscreen_text_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_text"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:distance7.default("0.2mm"),pcb_component_id:external_exports2.string(),text:external_exports2.string(),is_knockout:external_exports2.boolean().default(!1).optional(),knockout_padding:external_exports2.object({left:length3,top:length3,bottom:length3,right:length3}).default({left:"0.2mm",top:"0.2mm",bottom:"0.2mm",right:"0.2mm"}).optional(),ccw_rotation:external_exports2.number().optional(),layer:layer_ref2,is_mirrored:external_exports2.boolean().default(!1).optional(),anchor_position:point5.default({x:0,y:0}),anchor_alignment:ninePointAnchor3.default("center")}).describe("Defines silkscreen text on the PCB");expectTypesMatch3(!0);var pcb_copper_text2=external_exports2.object({type:external_exports2.literal("pcb_copper_text"),pcb_copper_text_id:getZodPrefixedIdWithDefault2("pcb_copper_text"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:distance7.default("0.2mm"),pcb_component_id:external_exports2.string(),text:external_exports2.string(),is_knockout:external_exports2.boolean().default(!1).optional(),knockout_padding:external_exports2.object({left:length3,top:length3,bottom:length3,right:length3}).default({left:"0.2mm",top:"0.2mm",bottom:"0.2mm",right:"0.2mm"}).optional(),ccw_rotation:external_exports2.number().optional(),layer:layer_ref2,is_mirrored:external_exports2.boolean().default(!1).optional(),anchor_position:point5.default({x:0,y:0}),anchor_alignment:ninePointAnchor3.default("center")}).describe("Defines copper text on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_rect2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_rect"),pcb_silkscreen_rect_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_rect"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,width:length3,height:length3,layer:layer_ref2,stroke_width:length3.default("1mm"),corner_radius:length3.optional(),is_filled:external_exports2.boolean().default(!0).optional(),has_stroke:external_exports2.boolean().optional(),is_stroke_dashed:external_exports2.boolean().optional(),ccw_rotation:external_exports2.number().optional()}).describe("Defines a silkscreen rect on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_circle2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_circle"),pcb_silkscreen_circle_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_circle"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,radius:length3,layer:visible_layer2,stroke_width:length3.default("1mm")}).describe("Defines a silkscreen circle on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_oval2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_oval"),pcb_silkscreen_oval_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_oval"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,radius_x:distance7,radius_y:distance7,layer:visible_layer2,ccw_rotation:rotation4.optional()}).describe("Defines a silkscreen oval on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_pill2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_pill"),pcb_silkscreen_pill_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_pill"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,width:length3,height:length3,layer:layer_ref2,ccw_rotation:external_exports2.number().optional()}).describe("Defines a silkscreen pill on the PCB");expectTypesMatch3(!0);var pcb_fabrication_note_text2=external_exports2.object({type:external_exports2.literal("pcb_fabrication_note_text"),pcb_fabrication_note_text_id:getZodPrefixedIdWithDefault2("pcb_fabrication_note_text"),subcircuit_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:distance7.default("1mm"),pcb_component_id:external_exports2.string(),text:external_exports2.string(),layer:visible_layer2,anchor_position:point5.default({x:0,y:0}),anchor_alignment:external_exports2.enum(["center","top_left","top_right","bottom_left","bottom_right"]).default("center"),color:external_exports2.string().optional()}).describe("Defines a fabrication note in text on the PCB, useful for leaving notes for assemblers or fabricators");expectTypesMatch3(!0);var pcb_fabrication_note_path2=external_exports2.object({type:external_exports2.literal("pcb_fabrication_note_path"),pcb_fabrication_note_path_id:getZodPrefixedIdWithDefault2("pcb_fabrication_note_path"),pcb_component_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional(),layer:layer_ref2,route:external_exports2.array(point5),stroke_width:length3,color:external_exports2.string().optional()}).describe("Defines a fabrication path on the PCB for fabricators or assemblers");expectTypesMatch3(!0);var pcb_fabrication_note_rect2=external_exports2.object({type:external_exports2.literal("pcb_fabrication_note_rect"),pcb_fabrication_note_rect_id:getZodPrefixedIdWithDefault2("pcb_fabrication_note_rect"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,width:length3,height:length3,layer:visible_layer2,stroke_width:length3.default("0.1mm"),corner_radius:length3.optional(),is_filled:external_exports2.boolean().optional(),has_stroke:external_exports2.boolean().optional(),is_stroke_dashed:external_exports2.boolean().optional(),color:external_exports2.string().optional()}).describe("Defines a fabrication note rectangle on the PCB");expectTypesMatch3(!0);var pcb_fabrication_note_dimension2=external_exports2.object({type:external_exports2.literal("pcb_fabrication_note_dimension"),pcb_fabrication_note_dimension_id:getZodPrefixedIdWithDefault2("pcb_fabrication_note_dimension"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:visible_layer2,from:point5,to:point5,text:external_exports2.string().optional(),text_ccw_rotation:external_exports2.number().optional(),offset:length3.optional(),offset_distance:length3.optional(),offset_direction:external_exports2.object({x:external_exports2.number(),y:external_exports2.number()}).optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:length3.default("1mm"),color:external_exports2.string().optional(),arrow_size:length3.default("1mm")}).describe("Defines a measurement annotation within PCB fabrication notes");expectTypesMatch3(!0);var pcb_note_text2=external_exports2.object({type:external_exports2.literal("pcb_note_text"),pcb_note_text_id:getZodPrefixedIdWithDefault2("pcb_note_text"),pcb_component_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),name:external_exports2.string().optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:distance7.default("1mm"),text:external_exports2.string().optional(),anchor_position:point5.default({x:0,y:0}),anchor_alignment:external_exports2.enum(["center","top_left","top_right","bottom_left","bottom_right"]).default("center"),color:external_exports2.string().optional()}).describe("Defines a documentation note in text on the PCB");expectTypesMatch3(!0);var pcb_note_rect2=external_exports2.object({type:external_exports2.literal("pcb_note_rect"),pcb_note_rect_id:getZodPrefixedIdWithDefault2("pcb_note_rect"),pcb_component_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),name:external_exports2.string().optional(),text:external_exports2.string().optional(),center:point5,width:length3,height:length3,stroke_width:length3.default("0.1mm"),corner_radius:length3.optional(),is_filled:external_exports2.boolean().optional(),has_stroke:external_exports2.boolean().optional(),is_stroke_dashed:external_exports2.boolean().optional(),color:external_exports2.string().optional()}).describe("Defines a rectangular documentation note on the PCB");expectTypesMatch3(!0);var pcb_note_path2=external_exports2.object({type:external_exports2.literal("pcb_note_path"),pcb_note_path_id:getZodPrefixedIdWithDefault2("pcb_note_path"),pcb_component_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),name:external_exports2.string().optional(),text:external_exports2.string().optional(),route:external_exports2.array(point5),stroke_width:length3.default("0.1mm"),color:external_exports2.string().optional()}).describe("Defines a polyline documentation note on the PCB");expectTypesMatch3(!0);var pcb_note_line2=external_exports2.object({type:external_exports2.literal("pcb_note_line"),pcb_note_line_id:getZodPrefixedIdWithDefault2("pcb_note_line"),pcb_component_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),name:external_exports2.string().optional(),text:external_exports2.string().optional(),x1:distance7,y1:distance7,x2:distance7,y2:distance7,stroke_width:distance7.default("0.1mm"),color:external_exports2.string().optional(),is_dashed:external_exports2.boolean().optional()}).describe("Defines a straight documentation note line on the PCB");expectTypesMatch3(!0);var pcb_note_dimension2=external_exports2.object({type:external_exports2.literal("pcb_note_dimension"),pcb_note_dimension_id:getZodPrefixedIdWithDefault2("pcb_note_dimension"),pcb_component_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),name:external_exports2.string().optional(),from:point5,to:point5,text:external_exports2.string().optional(),text_ccw_rotation:external_exports2.number().optional(),offset_distance:length3.optional(),offset_direction:external_exports2.object({x:external_exports2.number(),y:external_exports2.number()}).optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:length3.default("1mm"),color:external_exports2.string().optional(),arrow_size:length3.default("1mm")}).describe("Defines a measurement annotation within PCB documentation notes");expectTypesMatch3(!0);var pcb_footprint_overlap_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_footprint_overlap_error"),pcb_error_id:getZodPrefixedIdWithDefault2("pcb_error"),error_type:external_exports2.literal("pcb_footprint_overlap_error").default("pcb_footprint_overlap_error"),pcb_smtpad_ids:external_exports2.array(external_exports2.string()).optional(),pcb_plated_hole_ids:external_exports2.array(external_exports2.string()).optional(),pcb_hole_ids:external_exports2.array(external_exports2.string()).optional(),pcb_keepout_ids:external_exports2.array(external_exports2.string()).optional()}).describe("Error emitted when a pcb footprint overlaps with another element");expectTypesMatch3(!0);var pcb_courtyard_overlap_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_courtyard_overlap_error"),pcb_error_id:getZodPrefixedIdWithDefault2("pcb_error"),error_type:external_exports2.literal("pcb_courtyard_overlap_error").default("pcb_courtyard_overlap_error"),pcb_component_ids:external_exports2.tuple([external_exports2.string(),external_exports2.string()])}).describe("Error emitted when the courtyard (CrtYd) of one PCB component overlaps with the courtyard of another");expectTypesMatch3(!0);var pcb_keepout2=external_exports2.object({type:external_exports2.literal("pcb_keepout"),shape:external_exports2.literal("rect"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,width:distance7,height:distance7,pcb_keepout_id:external_exports2.string(),layers:external_exports2.array(external_exports2.string()),description:external_exports2.string().optional()}).or(external_exports2.object({type:external_exports2.literal("pcb_keepout"),shape:external_exports2.literal("circle"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,radius:distance7,pcb_keepout_id:external_exports2.string(),layers:external_exports2.array(external_exports2.string()),description:external_exports2.string().optional()}));expectTypesMatch3(!0);var pcb_cutout_base2=external_exports2.object({type:external_exports2.literal("pcb_cutout"),pcb_cutout_id:getZodPrefixedIdWithDefault2("pcb_cutout"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_board_id:external_exports2.string().optional(),pcb_panel_id:external_exports2.string().optional()}),pcb_cutout_rect2=pcb_cutout_base2.extend({shape:external_exports2.literal("rect"),center:point5,width:length3,height:length3,rotation:rotation4.optional(),corner_radius:length3.optional()});expectTypesMatch3(!0);var pcb_cutout_circle2=pcb_cutout_base2.extend({shape:external_exports2.literal("circle"),center:point5,radius:length3});expectTypesMatch3(!0);var pcb_cutout_polygon2=pcb_cutout_base2.extend({shape:external_exports2.literal("polygon"),points:external_exports2.array(point5)});expectTypesMatch3(!0);var pcb_cutout_path2=pcb_cutout_base2.extend({shape:external_exports2.literal("path"),route:external_exports2.array(point5),slot_width:length3,slot_length:length3.optional(),space_between_slots:length3.optional(),slot_corner_radius:length3.optional()});expectTypesMatch3(!0);var pcb_cutout2=external_exports2.discriminatedUnion("shape",[pcb_cutout_rect2,pcb_cutout_circle2,pcb_cutout_polygon2,pcb_cutout_path2]).describe("Defines a cutout on the PCB, removing board material.");expectTypesMatch3(!0);var pcb_missing_footprint_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_missing_footprint_error"),pcb_missing_footprint_error_id:getZodPrefixedIdWithDefault2("pcb_missing_footprint_error"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),error_type:external_exports2.literal("pcb_missing_footprint_error").default("pcb_missing_footprint_error"),source_component_id:external_exports2.string()}).describe("Defines a missing footprint error on the PCB");expectTypesMatch3(!0);var external_footprint_load_error2=base_circuit_json_error2.extend({type:external_exports2.literal("external_footprint_load_error"),external_footprint_load_error_id:getZodPrefixedIdWithDefault2("external_footprint_load_error"),pcb_component_id:external_exports2.string(),source_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),footprinter_string:external_exports2.string().optional(),error_type:external_exports2.literal("external_footprint_load_error").default("external_footprint_load_error")}).describe("Defines an error when an external footprint fails to load");expectTypesMatch3(!0);var circuit_json_footprint_load_error2=base_circuit_json_error2.extend({type:external_exports2.literal("circuit_json_footprint_load_error"),circuit_json_footprint_load_error_id:getZodPrefixedIdWithDefault2("circuit_json_footprint_load_error"),pcb_component_id:external_exports2.string(),source_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),error_type:external_exports2.literal("circuit_json_footprint_load_error").default("circuit_json_footprint_load_error"),circuit_json:external_exports2.array(external_exports2.any()).optional()}).describe("Defines an error when a circuit JSON footprint fails to load");expectTypesMatch3(!0);var pcb_group2=external_exports2.object({type:external_exports2.literal("pcb_group"),pcb_group_id:getZodPrefixedIdWithDefault2("pcb_group"),source_group_id:external_exports2.string(),is_subcircuit:external_exports2.boolean().optional(),subcircuit_id:external_exports2.string().optional(),width:length3.optional(),height:length3.optional(),center:point5,display_offset_x:external_exports2.string().optional().describe("How to display the x offset for this group, usually corresponding with how the user specified it"),display_offset_y:external_exports2.string().optional().describe("How to display the y offset for this group, usually corresponding with how the user specified it"),outline:external_exports2.array(point5).optional(),anchor_position:point5.optional(),anchor_alignment:ninePointAnchor3.default("center"),position_mode:external_exports2.enum(["packed","relative_to_group_anchor","none"]).optional(),positioned_relative_to_pcb_group_id:external_exports2.string().optional(),positioned_relative_to_pcb_board_id:external_exports2.string().optional(),pcb_component_ids:external_exports2.array(external_exports2.string()),child_layout_mode:external_exports2.enum(["packed","none"]).optional(),name:external_exports2.string().optional(),description:external_exports2.string().optional(),layout_mode:external_exports2.string().optional(),autorouter_configuration:external_exports2.object({trace_clearance:length3}).optional(),autorouter_used_string:external_exports2.string().optional()}).describe("Defines a group of components on the PCB");expectTypesMatch3(!0);var pcb_autorouting_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_autorouting_error"),pcb_error_id:getZodPrefixedIdWithDefault2("pcb_autorouting_error"),error_type:external_exports2.literal("pcb_autorouting_error").default("pcb_autorouting_error"),subcircuit_id:external_exports2.string().optional()}).describe("The autorouting has failed to route a portion of the board");expectTypesMatch3(!0);var pcb_manual_edit_conflict_warning2=external_exports2.object({type:external_exports2.literal("pcb_manual_edit_conflict_warning"),pcb_manual_edit_conflict_warning_id:getZodPrefixedIdWithDefault2("pcb_manual_edit_conflict_warning"),warning_type:external_exports2.literal("pcb_manual_edit_conflict_warning").default("pcb_manual_edit_conflict_warning"),message:external_exports2.string(),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),source_component_id:external_exports2.string()}).describe("Warning emitted when a component has both manual placement and explicit pcbX/pcbY coordinates");expectTypesMatch3(!0);var connectorOrientationDirection2=external_exports2.enum(["x-","x+","y+","y-"]),pcb_connector_not_in_accessible_orientation_warning2=external_exports2.object({type:external_exports2.literal("pcb_connector_not_in_accessible_orientation_warning"),pcb_connector_not_in_accessible_orientation_warning_id:getZodPrefixedIdWithDefault2("pcb_connector_not_in_accessible_orientation_warning"),warning_type:external_exports2.literal("pcb_connector_not_in_accessible_orientation_warning").default("pcb_connector_not_in_accessible_orientation_warning"),message:external_exports2.string(),pcb_component_id:external_exports2.string(),source_component_id:external_exports2.string().optional(),pcb_board_id:external_exports2.string().optional(),facing_direction:connectorOrientationDirection2,recommended_facing_direction:connectorOrientationDirection2,subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a connector PCB component is facing inward toward the board and should be reoriented to an outward-facing direction");expectTypesMatch3(!0);var pcb_breakout_point2=external_exports2.object({type:external_exports2.literal("pcb_breakout_point"),pcb_breakout_point_id:getZodPrefixedIdWithDefault2("pcb_breakout_point"),pcb_group_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional(),source_trace_id:external_exports2.string().optional(),source_port_id:external_exports2.string().optional(),source_net_id:external_exports2.string().optional(),x:distance7,y:distance7}).describe("Defines a routing target within a pcb_group for a source_trace or source_net");expectTypesMatch3(!0);var pcb_ground_plane2=external_exports2.object({type:external_exports2.literal("pcb_ground_plane"),pcb_ground_plane_id:getZodPrefixedIdWithDefault2("pcb_ground_plane"),source_pcb_ground_plane_id:external_exports2.string(),source_net_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Defines a ground plane on the PCB");expectTypesMatch3(!0);var pcb_ground_plane_region2=external_exports2.object({type:external_exports2.literal("pcb_ground_plane_region"),pcb_ground_plane_region_id:getZodPrefixedIdWithDefault2("pcb_ground_plane_region"),pcb_ground_plane_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:layer_ref2,points:external_exports2.array(point5)}).describe("Defines a polygon region of a ground plane");expectTypesMatch3(!0);var pcb_thermal_spoke2=external_exports2.object({type:external_exports2.literal("pcb_thermal_spoke"),pcb_thermal_spoke_id:getZodPrefixedIdWithDefault2("pcb_thermal_spoke"),pcb_ground_plane_id:external_exports2.string(),shape:external_exports2.string(),spoke_count:external_exports2.number(),spoke_thickness:distance7,spoke_inner_diameter:distance7,spoke_outer_diameter:distance7,pcb_plated_hole_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Pattern for connecting a ground plane to a plated hole");expectTypesMatch3(!0);var pcb_copper_pour_base2=external_exports2.object({type:external_exports2.literal("pcb_copper_pour"),pcb_copper_pour_id:getZodPrefixedIdWithDefault2("pcb_copper_pour"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:layer_ref2,source_net_id:external_exports2.string().optional(),covered_with_solder_mask:external_exports2.boolean().optional().default(!0)}),pcb_copper_pour_rect2=pcb_copper_pour_base2.extend({shape:external_exports2.literal("rect"),center:point5,width:length3,height:length3,rotation:rotation4.optional()});expectTypesMatch3(!0);var pcb_copper_pour_brep2=pcb_copper_pour_base2.extend({shape:external_exports2.literal("brep"),brep_shape:brep_shape2});expectTypesMatch3(!0);var pcb_copper_pour_polygon2=pcb_copper_pour_base2.extend({shape:external_exports2.literal("polygon"),points:external_exports2.array(point5)});expectTypesMatch3(!0);var pcb_copper_pour2=external_exports2.discriminatedUnion("shape",[pcb_copper_pour_rect2,pcb_copper_pour_brep2,pcb_copper_pour_polygon2]).describe("Defines a copper pour on the PCB.");expectTypesMatch3(!0);var pcb_component_outside_board_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_component_outside_board_error"),pcb_component_outside_board_error_id:getZodPrefixedIdWithDefault2("pcb_component_outside_board_error"),error_type:external_exports2.literal("pcb_component_outside_board_error").default("pcb_component_outside_board_error"),pcb_component_id:external_exports2.string(),pcb_board_id:external_exports2.string(),component_center:point5,component_bounds:external_exports2.object({min_x:external_exports2.number(),max_x:external_exports2.number(),min_y:external_exports2.number(),max_y:external_exports2.number()}),subcircuit_id:external_exports2.string().optional(),source_component_id:external_exports2.string().optional()}).describe("Error emitted when a PCB component is placed outside the board boundaries");expectTypesMatch3(!0);var pcb_component_not_on_board_edge_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_component_not_on_board_edge_error"),pcb_component_not_on_board_edge_error_id:getZodPrefixedIdWithDefault2("pcb_component_not_on_board_edge_error"),error_type:external_exports2.literal("pcb_component_not_on_board_edge_error").default("pcb_component_not_on_board_edge_error"),pcb_component_id:external_exports2.string(),pcb_board_id:external_exports2.string(),component_center:point5,pad_to_nearest_board_edge_distance:external_exports2.number(),source_component_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when a component that must be placed on the board edge is centered away from the edge");expectTypesMatch3(!0);var pcb_component_invalid_layer_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_component_invalid_layer_error"),pcb_component_invalid_layer_error_id:getZodPrefixedIdWithDefault2("pcb_component_invalid_layer_error"),error_type:external_exports2.literal("pcb_component_invalid_layer_error").default("pcb_component_invalid_layer_error"),pcb_component_id:external_exports2.string().optional(),source_component_id:external_exports2.string(),layer:layer_ref2,subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when a component is placed on an invalid layer (components can only be on 'top' or 'bottom' layers)");expectTypesMatch3(!0);var pcb_via_clearance_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_via_clearance_error"),pcb_error_id:getZodPrefixedIdWithDefault2("pcb_error"),error_type:external_exports2.literal("pcb_via_clearance_error").default("pcb_via_clearance_error"),pcb_via_ids:external_exports2.array(external_exports2.string()).min(2),minimum_clearance:distance7.optional(),actual_clearance:distance7.optional(),pcb_center:external_exports2.object({x:external_exports2.number().optional(),y:external_exports2.number().optional()}).optional(),subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when vias are closer than the allowed clearance");expectTypesMatch3(!0);var pcb_courtyard_rect2=external_exports2.object({type:external_exports2.literal("pcb_courtyard_rect"),pcb_courtyard_rect_id:getZodPrefixedIdWithDefault2("pcb_courtyard_rect"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,width:length3,height:length3,layer:visible_layer2,ccw_rotation:rotation4.optional(),color:external_exports2.string().optional()}).describe("Defines a courtyard rectangle on the PCB");expectTypesMatch3(!0);var pcb_courtyard_outline2=external_exports2.object({type:external_exports2.literal("pcb_courtyard_outline"),pcb_courtyard_outline_id:getZodPrefixedIdWithDefault2("pcb_courtyard_outline"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:visible_layer2,outline:external_exports2.array(point5).min(2)}).describe("Defines a courtyard outline on the PCB");expectTypesMatch3(!0);var pcb_courtyard_polygon2=external_exports2.object({type:external_exports2.literal("pcb_courtyard_polygon"),pcb_courtyard_polygon_id:getZodPrefixedIdWithDefault2("pcb_courtyard_polygon"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:visible_layer2,points:external_exports2.array(point5).min(3),color:external_exports2.string().optional()}).describe("Defines a courtyard polygon on the PCB");expectTypesMatch3(!0);var pcb_courtyard_circle2=external_exports2.object({type:external_exports2.literal("pcb_courtyard_circle"),pcb_courtyard_circle_id:getZodPrefixedIdWithDefault2("pcb_courtyard_circle"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,radius:length3,layer:visible_layer2,color:external_exports2.string().optional()}).describe("Defines a courtyard circle on the PCB");expectTypesMatch3(!0);var cad_model_formats2=["obj","stl","3mf","gltf","glb","step","wrl"],cad_model_axis_directions2=["x+","x-","y+","y-","z+","z-"],cadModelDefaultDirectionMap2={obj:"z+",stl:"z+","3mf":"z+",gltf:"y+",glb:"y+",step:"z+",wrl:"y+"},cad_component2=external_exports2.object({type:external_exports2.literal("cad_component"),cad_component_id:external_exports2.string(),pcb_component_id:external_exports2.string(),source_component_id:external_exports2.string(),position:point33,rotation:point33.optional(),size:point33.optional(),layer:layer_ref2.optional(),subcircuit_id:external_exports2.string().optional(),footprinter_string:external_exports2.string().optional(),model_obj_url:external_exports2.string().optional(),model_stl_url:external_exports2.string().optional(),model_3mf_url:external_exports2.string().optional(),model_gltf_url:external_exports2.string().optional(),model_glb_url:external_exports2.string().optional(),model_step_url:external_exports2.string().optional(),model_wrl_url:external_exports2.string().optional(),model_asset:asset2.optional(),model_unit_to_mm_scale_factor:external_exports2.number().optional(),model_board_normal_direction:external_exports2.enum(cad_model_axis_directions2).optional().describe(`The direction in the model's coordinate space that is considered "up" or "coming out of the board surface"`),model_origin_position:point33.optional(),model_origin_alignment:external_exports2.enum(["unknown","center","center_of_component_on_board_surface","bottom_center_of_component"]).optional(),model_object_fit:external_exports2.enum(["contain_within_bounds","fill_bounds"]).optional().default("contain_within_bounds"),model_jscad:external_exports2.any().optional(),show_as_translucent_model:external_exports2.boolean().optional(),anchor_alignment:external_exports2.enum(["center","center_of_component_on_board_surface"]).optional().default("center")}).describe("Defines a component on the PCB");expectTypesMatch3(!0);var wave_shape2=external_exports2.enum(["sinewave","square","triangle","sawtooth"]),percentage4=external_exports2.union([external_exports2.string(),external_exports2.number()]).transform(val=>typeof val=="string"?val.endsWith("%")?parseFloat(val.slice(0,-1))/100:parseFloat(val):val).pipe(external_exports2.number().min(0,"Duty cycle must be non-negative").max(1,"Duty cycle cannot be greater than 100%")),simulation_dc_voltage_source2=external_exports2.object({type:external_exports2.literal("simulation_voltage_source"),simulation_voltage_source_id:getZodPrefixedIdWithDefault2("simulation_voltage_source"),is_dc_source:external_exports2.literal(!0).optional().default(!0),positive_source_port_id:external_exports2.string().optional(),negative_source_port_id:external_exports2.string().optional(),positive_source_net_id:external_exports2.string().optional(),negative_source_net_id:external_exports2.string().optional(),voltage:voltage2}).describe("Defines a DC voltage source for simulation"),simulation_ac_voltage_source2=external_exports2.object({type:external_exports2.literal("simulation_voltage_source"),simulation_voltage_source_id:getZodPrefixedIdWithDefault2("simulation_voltage_source"),is_dc_source:external_exports2.literal(!1),terminal1_source_port_id:external_exports2.string().optional(),terminal2_source_port_id:external_exports2.string().optional(),terminal1_source_net_id:external_exports2.string().optional(),terminal2_source_net_id:external_exports2.string().optional(),voltage:voltage2.optional(),frequency:frequency2.optional(),peak_to_peak_voltage:voltage2.optional(),wave_shape:wave_shape2.optional(),phase:rotation4.optional(),duty_cycle:percentage4.optional()}).describe("Defines an AC voltage source for simulation"),simulation_voltage_source2=external_exports2.union([simulation_dc_voltage_source2,simulation_ac_voltage_source2]).describe("Defines a voltage source for simulation");expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);var percentage23=external_exports2.union([external_exports2.string(),external_exports2.number()]).transform(val=>typeof val=="string"?val.endsWith("%")?parseFloat(val.slice(0,-1))/100:parseFloat(val):val).pipe(external_exports2.number().min(0,"Duty cycle must be non-negative").max(1,"Duty cycle cannot be greater than 100%")),simulation_dc_current_source2=external_exports2.object({type:external_exports2.literal("simulation_current_source"),simulation_current_source_id:getZodPrefixedIdWithDefault2("simulation_current_source"),is_dc_source:external_exports2.literal(!0).optional().default(!0),positive_source_port_id:external_exports2.string().optional(),negative_source_port_id:external_exports2.string().optional(),positive_source_net_id:external_exports2.string().optional(),negative_source_net_id:external_exports2.string().optional(),current:current2}).describe("Defines a DC current source for simulation"),simulation_ac_current_source2=external_exports2.object({type:external_exports2.literal("simulation_current_source"),simulation_current_source_id:getZodPrefixedIdWithDefault2("simulation_current_source"),is_dc_source:external_exports2.literal(!1),terminal1_source_port_id:external_exports2.string().optional(),terminal2_source_port_id:external_exports2.string().optional(),terminal1_source_net_id:external_exports2.string().optional(),terminal2_source_net_id:external_exports2.string().optional(),current:current2.optional(),frequency:frequency2.optional(),peak_to_peak_current:current2.optional(),wave_shape:wave_shape2.optional(),phase:rotation4.optional(),duty_cycle:percentage23.optional()}).describe("Defines an AC current source for simulation"),simulation_current_source2=external_exports2.union([simulation_dc_current_source2,simulation_ac_current_source2]).describe("Defines a current source for simulation");expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);var experiment_type2=external_exports2.union([external_exports2.literal("spice_dc_sweep"),external_exports2.literal("spice_dc_operating_point"),external_exports2.literal("spice_transient_analysis"),external_exports2.literal("spice_ac_analysis")]),simulation_experiment2=external_exports2.object({type:external_exports2.literal("simulation_experiment"),simulation_experiment_id:getZodPrefixedIdWithDefault2("simulation_experiment"),name:external_exports2.string(),experiment_type:experiment_type2,time_per_step:duration_ms2.optional(),start_time_ms:ms4.optional(),end_time_ms:ms4.optional()}).describe("Defines a simulation experiment configuration");expectTypesMatch3(!0);var simulation_transient_voltage_graph2=external_exports2.object({type:external_exports2.literal("simulation_transient_voltage_graph"),simulation_transient_voltage_graph_id:getZodPrefixedIdWithDefault2("simulation_transient_voltage_graph"),simulation_experiment_id:external_exports2.string(),timestamps_ms:external_exports2.array(external_exports2.number()).optional(),voltage_levels:external_exports2.array(external_exports2.number()),source_component_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional(),time_per_step:duration_ms2,start_time_ms:ms4,end_time_ms:ms4,name:external_exports2.string().optional(),color:external_exports2.string().optional()}).describe("Stores voltage measurements over time for a simulation");expectTypesMatch3(!0);var simulation_switch2=external_exports2.object({type:external_exports2.literal("simulation_switch"),simulation_switch_id:getZodPrefixedIdWithDefault2("simulation_switch"),source_component_id:external_exports2.string().optional(),closes_at:ms4.optional(),opens_at:ms4.optional(),starts_closed:external_exports2.boolean().optional(),switching_frequency:frequency2.optional()}).describe("Defines a switch for simulation timing control");expectTypesMatch3(!0);var simulation_voltage_probe2=external_exports2.object({type:external_exports2.literal("simulation_voltage_probe"),simulation_voltage_probe_id:getZodPrefixedIdWithDefault2("simulation_voltage_probe"),source_component_id:external_exports2.string().optional(),name:external_exports2.string().optional(),signal_input_source_port_id:external_exports2.string().optional(),signal_input_source_net_id:external_exports2.string().optional(),reference_input_source_port_id:external_exports2.string().optional(),reference_input_source_net_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),color:external_exports2.string().optional()}).describe("Defines a voltage probe for simulation. If a reference input is not provided, it measures against ground. If a reference input is provided, it measures the differential voltage between two points.").superRefine((data,ctx)=>{if(data.reference_input_source_port_id||data.reference_input_source_net_id){let has_ports=!!data.signal_input_source_port_id||!!data.reference_input_source_port_id,has_nets=!!data.signal_input_source_net_id||!!data.reference_input_source_net_id;has_ports&&has_nets?ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Cannot mix port and net connections in a differential probe."}):has_ports?(!data.signal_input_source_port_id||!data.reference_input_source_port_id)&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Differential port probe requires both signal_input_source_port_id and reference_input_source_port_id."}):has_nets&&(!data.signal_input_source_net_id||!data.reference_input_source_net_id)&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Differential net probe requires both signal_input_source_net_id and reference_input_source_net_id."})}else!!data.signal_input_source_port_id==!!data.signal_input_source_net_id&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"A voltage probe must have exactly one of signal_input_source_port_id or signal_input_source_net_id."})});expectTypesMatch3(!0);var simulation_unknown_experiment_error2=base_circuit_json_error2.extend({type:external_exports2.literal("simulation_unknown_experiment_error"),simulation_unknown_experiment_error_id:getZodPrefixedIdWithDefault2("simulation_unknown_experiment_error"),error_type:external_exports2.literal("simulation_unknown_experiment_error").default("simulation_unknown_experiment_error"),simulation_experiment_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("An unknown error occurred during the simulation experiment.");expectTypesMatch3(!0);var simulation_op_amp2=external_exports2.object({type:external_exports2.literal("simulation_op_amp"),simulation_op_amp_id:getZodPrefixedIdWithDefault2("simulation_op_amp"),source_component_id:external_exports2.string().optional(),inverting_input_source_port_id:external_exports2.string(),non_inverting_input_source_port_id:external_exports2.string(),output_source_port_id:external_exports2.string(),positive_supply_source_port_id:external_exports2.string(),negative_supply_source_port_id:external_exports2.string()}).describe("Defines a simple ideal operational amplifier for simulation");expectTypesMatch3(!0);var any_circuit_element2=external_exports2.union([source_trace2,source_port2,source_component_internal_connection2,any_source_component2,source_net2,source_group2,source_simple_chip2,source_simple_capacitor2,source_simple_diode2,source_simple_led2,source_simple_resistor2,source_simple_power_source2,source_simple_battery2,source_simple_inductor2,source_simple_pin_header2,source_simple_pinout2,source_simple_resonator2,source_simple_switch2,source_simple_transistor2,source_simple_test_point2,source_simple_mosfet2,source_simple_op_amp2,source_simple_potentiometer2,source_simple_push_button2,source_pcb_ground_plane2,source_manually_placed_via2,source_board2,source_project_metadata2,source_invalid_component_property_error2,source_trace_not_connected_error2,source_pin_missing_trace_warning2,source_no_power_pin_defined_warning2,source_no_ground_pin_defined_warning2,source_component_pins_underspecified_warning2,source_pin_must_be_connected_error2,unknown_error_finding_part2,source_i2c_misconfigured_error2,source_ambiguous_port_reference2,pcb_component2,pcb_hole2,pcb_missing_footprint_error2,external_footprint_load_error2,circuit_json_footprint_load_error2,pcb_manual_edit_conflict_warning2,pcb_connector_not_in_accessible_orientation_warning2,pcb_plated_hole2,pcb_keepout2,pcb_port2,pcb_net2,pcb_text2,pcb_trace2,pcb_via2,pcb_smtpad2,pcb_solder_paste2,pcb_board2,pcb_panel2,pcb_group2,pcb_trace_hint2,pcb_silkscreen_line2,pcb_silkscreen_path2,pcb_silkscreen_text2,pcb_silkscreen_pill2,pcb_copper_text2,pcb_silkscreen_rect2,pcb_silkscreen_circle2,pcb_silkscreen_oval2,pcb_trace_error2,pcb_trace_missing_error2,pcb_placement_error2,pcb_panelization_placement_error2,pcb_port_not_matched_error2,pcb_port_not_connected_error2,pcb_via_clearance_error2,pcb_fabrication_note_path2,pcb_fabrication_note_text2,pcb_fabrication_note_rect2,pcb_fabrication_note_dimension2,pcb_note_text2,pcb_note_rect2,pcb_note_path2,pcb_note_line2,pcb_note_dimension2,pcb_autorouting_error2,pcb_footprint_overlap_error2,pcb_courtyard_overlap_error2,pcb_breakout_point2,pcb_cutout2,pcb_ground_plane2,pcb_ground_plane_region2,pcb_thermal_spoke2,pcb_copper_pour2,pcb_component_outside_board_error2,pcb_component_not_on_board_edge_error2,pcb_component_invalid_layer_error2,pcb_courtyard_rect2,pcb_courtyard_outline2,pcb_courtyard_polygon2,pcb_courtyard_circle2,schematic_box2,schematic_text2,schematic_line2,schematic_rect2,schematic_circle2,schematic_arc2,schematic_component2,schematic_symbol2,schematic_port2,schematic_trace2,schematic_path2,schematic_error2,schematic_layout_error2,schematic_net_label2,schematic_debug_object2,schematic_voltage_probe2,schematic_manual_edit_conflict_warning2,schematic_group2,schematic_sheet2,schematic_table2,schematic_table_cell2,cad_component2,simulation_voltage_source2,simulation_current_source2,simulation_experiment2,simulation_transient_voltage_graph2,simulation_switch2,simulation_voltage_probe2,simulation_unknown_experiment_error2,simulation_op_amp2]),any_soup_element2=any_circuit_element2;expectTypesMatch3(!0);expectStringUnionsMatch2(!0);function applyToPoint5(matrix2,point22){return Array.isArray(point22)?[matrix2.a*point22[0]+matrix2.c*point22[1]+matrix2.e,matrix2.b*point22[0]+matrix2.d*point22[1]+matrix2.f]:{x:matrix2.a*point22.x+matrix2.c*point22.y+matrix2.e,y:matrix2.b*point22.x+matrix2.d*point22.y+matrix2.f}}function isUndefined5(val){return typeof val>"u"}function translate5(tx3,ty3=0){return{a:1,c:0,e:tx3,b:0,d:1,f:ty3}}function transform5(...matrices){matrices=Array.isArray(matrices[0])?matrices[0]:matrices;let multiply=(m12,m22)=>({a:m12.a*m22.a+m12.c*m22.b,c:m12.a*m22.c+m12.c*m22.d,e:m12.a*m22.e+m12.c*m22.f+m12.e,b:m12.b*m22.a+m12.d*m22.b,d:m12.b*m22.c+m12.d*m22.d,f:m12.b*m22.e+m12.d*m22.f+m12.f});switch(matrices.length){case 0:throw new Error("no matrices provided");case 1:return matrices[0];case 2:return multiply(matrices[0],matrices[1]);default:{let[m12,m22,...rest]=matrices,m4=multiply(m12,m22);return transform5(m4,...rest)}}}function compose5(...matrices){return transform5(...matrices)}var{cos:cos5,sin:sin5,PI:PI6}=Math;function scale5(sx3,sy3=void 0,cx3=void 0,cy3=void 0){isUndefined5(sy3)&&(sy3=sx3);let scaleMatrix={a:sx3,c:0,e:0,b:0,d:sy3,f:0};return isUndefined5(cx3)||isUndefined5(cy3)?scaleMatrix:transform5([translate5(cx3,cy3),scaleMatrix,translate5(-cx3,-cy3)])}var{tan:tan5}=Math;function peg$subclass4(child,parent){function C6(){this.constructor=child}C6.prototype=parent.prototype,child.prototype=new C6}function peg$SyntaxError4(message,expected,found,location){var self2=Error.call(this,message);return Object.setPrototypeOf&&Object.setPrototypeOf(self2,peg$SyntaxError4.prototype),self2.expected=expected,self2.found=found,self2.location=location,self2.name="SyntaxError",self2}peg$subclass4(peg$SyntaxError4,Error);function peg$padEnd4(str,targetLength,padString){return padString=padString||" ",str.length>targetLength?str:(targetLength-=str.length,padString+=padString.repeat(targetLength),str+padString.slice(0,targetLength))}peg$SyntaxError4.prototype.format=function(sources){var str="Error: "+this.message;if(this.location){var src=null,k5;for(k5=0;k5<sources.length;k5++)if(sources[k5].source===this.location.source){src=sources[k5].text.split(/\r\n|\n|\r/g);break}var s6=this.location.start,offset_s=this.location.source&&typeof this.location.source.offset=="function"?this.location.source.offset(s6):s6,loc=this.location.source+":"+offset_s.line+":"+offset_s.column;if(src){var e7=this.location.end,filler=peg$padEnd4("",offset_s.line.toString().length," "),line2=src[s6.line-1],last=s6.line===e7.line?e7.column:line2.length+1,hatLen=last-s6.column||1;str+=`