tscircuit 0.0.2721 → 0.0.2722-libonly
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.min.js +2 -2
- package/dist/webworker.min.js +2 -2
- package/package.json +4 -10
- package/cli.mjs +0 -33
package/dist/webworker.min.js
CHANGED
|
@@ -942,7 +942,7 @@ globalConnNetId: ${label.globalConnNetId}`,pointColor=getColorFromString2(label.
|
|
|
942
942
|
orientation: ${label.orientation}`})}let movingNetId=this.currentLabelToMove?this.currentLabelToMove.netId:"?";for(let c22 of this.candidateResults){let statusColor=CANDIDATE_STATUS_COLOR[c22.status],statusFill=CANDIDATE_STATUS_FILL[c22.status],strokeDash;c22.status!=="ok"&&(strokeDash="4 2"),graphics.rects.push({center:c22.center,width:c22.width,height:c22.height,fill:statusFill,strokeColor:statusColor,strokeDash,label:`candidate: ${c22.status}
|
|
943
943
|
orientation: ${c22.orientation}
|
|
944
944
|
moving: ${movingNetId}`}),graphics.points.push({x:c22.anchor.x,y:c22.anchor.y,color:statusColor,label:`candidate anchor
|
|
945
|
-
${c22.status}`})}return graphics}},ROUTE_CLEARANCE=.2,COORDINATE_TOLERANCE=1e-9,GROUND_NET_ID="GND",pointsAreEqual=(firstPoint,secondPoint)=>Math.abs(firstPoint.x-secondPoint.x)<=COORDINATE_TOLERANCE&&Math.abs(firstPoint.y-secondPoint.y)<=COORDINATE_TOLERANCE,removeConsecutiveDuplicatePoints=path=>{let filteredPath=[];for(let point62 of path){let previousPoint=filteredPath.at(-1);(!previousPoint||!pointsAreEqual(previousPoint,point62))&&filteredPath.push(point62)}return filteredPath},getPathLength5=path=>{let pathLength4=0;for(let pointIndex=0;pointIndex<path.length-1;pointIndex++){let startPoint=path[pointIndex],endPoint=path[pointIndex+1];pathLength4+=Math.abs(endPoint.x-startPoint.x)+Math.abs(endPoint.y-startPoint.y)}return pathLength4},getEscapePoint=({pin,facingDirection})=>{let escapePoint={x:pin.x,y:pin.y};return facingDirection==="x+"&&(escapePoint.x+=ROUTE_CLEARANCE),facingDirection==="x-"&&(escapePoint.x-=ROUTE_CLEARANCE),facingDirection==="y+"&&(escapePoint.y+=ROUTE_CLEARANCE),facingDirection==="y-"&&(escapePoint.y-=ROUTE_CLEARANCE),escapePoint},getOuterBounds=obstacles=>({minX:Math.min(...obstacles.map(obstacle=>obstacle.minX)),minY:Math.min(...obstacles.map(obstacle=>obstacle.minY)),maxX:Math.max(...obstacles.map(obstacle=>obstacle.maxX)),maxY:Math.max(...obstacles.map(obstacle=>obstacle.maxY))}),getPinConnectionCandidates=({connectionPair,obstacles,channelObstacles=obstacles})=>{let[firstPin,secondPin]=connectionPair.pins,firstEscapePoint=getEscapePoint({pin:firstPin,facingDirection:firstPin._facingDirection}),secondEscapePoint=getEscapePoint({pin:secondPin,facingDirection:secondPin._facingDirection}),outerBounds=getOuterBounds(obstacles),horizontalChannels=[outerBounds.minY-ROUTE_CLEARANCE,outerBounds.maxY+ROUTE_CLEARANCE,...channelObstacles.flatMap(obstacle=>[obstacle.minY-ROUTE_CLEARANCE,obstacle.maxY+ROUTE_CLEARANCE])],verticalChannels=[outerBounds.minX-ROUTE_CLEARANCE,outerBounds.maxX+ROUTE_CLEARANCE,...channelObstacles.flatMap(obstacle=>[obstacle.minX-ROUTE_CLEARANCE,obstacle.maxX+ROUTE_CLEARANCE])],candidates=[calculateElbow22({...firstPin,facingDirection:firstPin._facingDirection},{...secondPin,facingDirection:secondPin._facingDirection},{overshoot:ROUTE_CLEARANCE})];for(let channelY of new Set(horizontalChannels))candidates.push(removeConsecutiveDuplicatePoints([firstPin,firstEscapePoint,{x:firstEscapePoint.x,y:channelY},{x:secondEscapePoint.x,y:channelY},secondEscapePoint,secondPin]));for(let channelX of new Set(verticalChannels))candidates.push(removeConsecutiveDuplicatePoints([firstPin,firstEscapePoint,{x:channelX,y:firstEscapePoint.y},{x:channelX,y:secondEscapePoint.y},secondEscapePoint,secondPin]));return candidates.sort((firstPath,secondPath)=>getPathLength5(firstPath)-getPathLength5(secondPath))},getSegmentMidpoint=(startPoint,endPoint)=>({x:(startPoint.x+endPoint.x)/2,y:(startPoint.y+endPoint.y)/2}),getJunctionPoints=sameNetTraces=>{let junctionPoints=[];for(let trace of sameNetTraces){for(let pointIndex=0;pointIndex<trace.tracePath.length-1;pointIndex++){let startPoint=trace.tracePath[pointIndex],endPoint=trace.tracePath[pointIndex+1];junctionPoints.push(startPoint),junctionPoints.push(getSegmentMidpoint(startPoint,endPoint))}let lastPoint=trace.tracePath.at(-1);lastPoint&&junctionPoints.push(lastPoint)}return junctionPoints},getUnconnectedPins=({connectionPair,sameNetTraces})=>{let connectedPinIds=new Set(sameNetTraces.flatMap(trace=>trace.pinIds));return connectionPair.pins.filter(pin=>!connectedPinIds.has(pin.pinId))},pathsIntersect=(firstPath,secondPath)=>{for(let firstIndex=0;firstIndex<firstPath.length-1;firstIndex++)for(let secondIndex=0;secondIndex<secondPath.length-1;secondIndex++)if(doSegmentsIntersect22(firstPath[firstIndex],firstPath[firstIndex+1],secondPath[secondIndex],secondPath[secondIndex+1]))return!0;return!1},connectionPairPinsAreAlreadyConnected=({connectionPair,sameNetTraces})=>{let[firstPin,secondPin]=connectionPair.pins,connectedTraceIndexes=new Set(sameNetTraces.flatMap((trace,index)=>trace.pinIds.includes(firstPin.pinId)?[index]:[])),previousSize=-1;for(;connectedTraceIndexes.size!==previousSize;){previousSize=connectedTraceIndexes.size;for(let traceIndex=0;traceIndex<sameNetTraces.length;traceIndex++){if(connectedTraceIndexes.has(traceIndex))continue;let trace=sameNetTraces[traceIndex];[...connectedTraceIndexes].some(connectedTraceIndex=>{let connectedTrace=sameNetTraces[connectedTraceIndex];return trace.pinIds.some(pinId=>connectedTrace.pinIds.includes(pinId))||pathsIntersect(trace.tracePath,connectedTrace.tracePath)})&&connectedTraceIndexes.add(traceIndex)}}return[...connectedTraceIndexes].some(traceIndex=>sameNetTraces[traceIndex].pinIds.includes(secondPin.pinId))},getJunctionCandidates=({connectionPair,sameNetTraces,obstacles,maxConnectionDistance})=>{let outerBounds=getOuterBounds(obstacles),horizontalChannels=[outerBounds.minY-ROUTE_CLEARANCE,outerBounds.maxY+ROUTE_CLEARANCE],verticalChannels=[outerBounds.minX-ROUTE_CLEARANCE,outerBounds.maxX+ROUTE_CLEARANCE],candidates=[],junctionPoints=getJunctionPoints(sameNetTraces),unconnectedPins=getUnconnectedPins({connectionPair,sameNetTraces});for(let pin of unconnectedPins){let escapePoint=getEscapePoint({pin,facingDirection:pin._facingDirection});for(let junctionPoint of junctionPoints)if(!(distance17(pin,junctionPoint)>maxConnectionDistance)){candidates.push(removeConsecutiveDuplicatePoints([pin,escapePoint,{x:escapePoint.x,y:junctionPoint.y},junctionPoint])),candidates.push(removeConsecutiveDuplicatePoints([pin,escapePoint,{x:junctionPoint.x,y:escapePoint.y},junctionPoint]));for(let channelY of horizontalChannels)candidates.push(removeConsecutiveDuplicatePoints([pin,escapePoint,{x:escapePoint.x,y:channelY},{x:junctionPoint.x,y:channelY},junctionPoint]));for(let channelX of verticalChannels)candidates.push(removeConsecutiveDuplicatePoints([pin,escapePoint,{x:channelX,y:escapePoint.y},{x:channelX,y:junctionPoint.y},junctionPoint]))}}return candidates.sort((firstPath,secondPath)=>getPathLength5(firstPath)-getPathLength5(secondPath))},pathCollidesWithObstacles=({path,obstacles,connectionPair,rejectComponentBoundaryTravel})=>{let firstPathPoint=path[0],lastPathPoint=path.at(-1),firstPathPin=connectionPair.pins.find(pin=>pointsAreEqual(pin,firstPathPoint)),lastPathPin=connectionPair.pins.find(pin=>pointsAreEqual(pin,lastPathPoint));for(let[pin,neighbor]of[[firstPathPin,path[1]],[lastPathPin,path[path.length-2]]]){if(!pin?._facingDirection)continue;let outward=dir(pin._facingDirection);if((neighbor.x-pin.x)*outward.x+(neighbor.y-pin.y)*outward.y<-COORDINATE_TOLERANCE)return!0}let pathConnectsPairPins=firstPathPin!==void 0&&lastPathPin!==void 0,firstChipObstacle=obstacles.find(obstacle=>obstacle.kind==="chip"&&obstacle.chipId===firstPathPin?.chipId),secondChipObstacle=obstacles.find(obstacle=>obstacle.kind==="chip"&&obstacle.chipId===lastPathPin?.chipId);return rejectComponentBoundaryTravel&&firstChipObstacle&&segmentOverlapsRectBoundary(path[0],path[1],firstChipObstacle)||rejectComponentBoundaryTravel&&secondChipObstacle&&segmentOverlapsRectBoundary(path[path.length-2],path[path.length-1],secondChipObstacle)?!0:findFirstCollision(path,obstacles,{excludeRectsForSegment:segmentIndex=>{let excludedObstacles=new Set;return segmentIndex===0&&firstChipObstacle&&excludedObstacles.add(firstChipObstacle),pathConnectsPairPins&&segmentIndex===path.length-2&&secondChipObstacle&&excludedObstacles.add(secondChipObstacle),excludedObstacles}})!==null},hasParallelFailedConnection=({connectionPair,failedConnectionPairs})=>{let connectionChipIds=new Set(connectionPair.pins.map(pin=>pin.chipId));return failedConnectionPairs.some(otherConnectionPair=>otherConnectionPair.mspPairId===connectionPair.mspPairId?!1:otherConnectionPair.pins.every(pin=>connectionChipIds.has(pin.chipId)))},segmentsOverlapBeyondEndpoint=({firstStart,firstEnd,secondStart,secondEnd})=>isHorizontal3(firstStart,firstEnd)&&isHorizontal3(secondStart,secondEnd)?Math.min(Math.max(firstStart.x,firstEnd.x),Math.max(secondStart.x,secondEnd.x))-Math.max(Math.min(firstStart.x,firstEnd.x),Math.min(secondStart.x,secondEnd.x))>COORDINATE_TOLERANCE:isVertical2(firstStart,firstEnd)&&isVertical2(secondStart,secondEnd)?Math.min(Math.max(firstStart.y,firstEnd.y),Math.max(secondStart.y,secondEnd.y))-Math.max(Math.min(firstStart.y,firstEnd.y),Math.min(secondStart.y,secondEnd.y))>COORDINATE_TOLERANCE:!1,getAllowedJunctionPoints=({connectionPair,existingTrace})=>{let existingPinIds=new Set(existingTrace.pinIds);return connectionPair.pins.filter(pin=>existingPinIds.has(pin.pinId))},pathCrossesExistingTraces=({path,connectionPair,existingTraces})=>{for(let existingTrace of existingTraces){if(existingTrace.globalConnNetId===connectionPair.globalConnNetId)continue;let allowedJunctionPoints=getAllowedJunctionPoints({connectionPair,existingTrace});for(let pathIndex=0;pathIndex<path.length-1;pathIndex++){let pathStart=path[pathIndex],pathEnd=path[pathIndex+1];for(let traceIndex=0;traceIndex<existingTrace.tracePath.length-1;traceIndex++){let traceStart=existingTrace.tracePath[traceIndex],traceEnd=existingTrace.tracePath[traceIndex+1];if(!(!doSegmentsIntersect22(pathStart,pathEnd,traceStart,traceEnd)||allowedJunctionPoints.some(junctionPoint=>(pointsAreEqual(pathStart,junctionPoint)||pointsAreEqual(pathEnd,junctionPoint))&&(pointsAreEqual(traceStart,junctionPoint)||pointsAreEqual(traceEnd,junctionPoint)))&&!segmentsOverlapBeyondEndpoint({firstStart:pathStart,firstEnd:pathEnd,secondStart:traceStart,secondEnd:traceEnd})))return!0}}}return!1},UnroutedTraceRecoverySolver=class extends BaseSolver10{constructor(params){super();__publicField(this,"params");__publicField(this,"inputProblem");__publicField(this,"alreadySolvedTraces");__publicField(this,"failedConnectionPairs");__publicField(this,"queuedConnectionPairs");__publicField(this,"maxConnectionDistance");__publicField(this,"groundGlobalConnNetId");__publicField(this,"solvedUnroutedTraces",[]);this.params=params,this.inputProblem=params.inputProblem,this.alreadySolvedTraces=params.alreadySolvedTraces,this.failedConnectionPairs=params.failedConnectionPairs,this.queuedConnectionPairs=[...params.failedConnectionPairs],this.maxConnectionDistance=this.inputProblem.maxMspPairDistance??DEFAULT_MAX_MSP_PAIR_DISTANCE;let{netConnMap}=getConnectivityMapsFromInputProblem(this.inputProblem);this.groundGlobalConnNetId=netConnMap.getNetConnectedToId(GROUND_NET_ID)??void 0}getConstructorParams(){return this.params}_step(){let connectionPair=this.queuedConnectionPairs.shift();if(!connectionPair){this.solved=!0;return}if(connectionPair.globalConnNetId===this.groundGlobalConnNetId||distance17(connectionPair.pins[0],connectionPair.pins[1])>this.maxConnectionDistance)return;let obstacles=getObstacleRects(this.inputProblem),existingTraces=[...this.alreadySolvedTraces,...this.solvedUnroutedTraces],sameNetTraces=existingTraces.filter(trace=>trace.globalConnNetId===connectionPair.globalConnNetId);if(connectionPairPinsAreAlreadyConnected({connectionPair,sameNetTraces}))return;let junctionCandidates=getJunctionCandidates({connectionPair,sameNetTraces,obstacles,maxConnectionDistance:this.maxConnectionDistance}),pinConnectionCandidates=getPinConnectionCandidates({connectionPair,obstacles,channelObstacles:[]}),candidates=[...junctionCandidates,...pinConnectionCandidates].sort((firstPath,secondPath)=>getPathLength5(firstPath)-getPathLength5(secondPath)),rejectComponentBoundaryTravel=hasParallelFailedConnection({connectionPair,failedConnectionPairs:this.failedConnectionPairs}),recoveredPath;for(let tracePath of candidates)recoveredPath&&getPathLength5(tracePath)>=getPathLength5(recoveredPath)||pathCollidesWithObstacles({path:tracePath,obstacles,connectionPair,rejectComponentBoundaryTravel})||pathCrossesExistingTraces({path:tracePath,connectionPair,existingTraces})||(recoveredPath||candidates.push(...getPinConnectionCandidates({connectionPair,obstacles})),recoveredPath=tracePath);recoveredPath&&this.solvedUnroutedTraces.push({...connectionPair,tracePath:recoveredPath,mspConnectionPairIds:[connectionPair.mspPairId],pinIds:connectionPair.pins.map(pin=>pin.pinId)})}getOutput(){return{newTraces:this.solvedUnroutedTraces,allTracesMerged:[...this.alreadySolvedTraces,...this.solvedUnroutedTraces]}}visualize(){let graphics=visualizeInputProblem2(this.inputProblem);for(let trace of this.solvedUnroutedTraces)graphics.lines.push({points:trace.tracePath,strokeColor:"blue"});return graphics}},NET_LABEL_INTERIOR_INSET=1e-6,pathIntersectsAnyNetLabel=({path,netLabelPlacements})=>{for(let label of netLabelPlacements){let labelBounds=getRectBounds(label.center,label.width,label.height);for(let index=0;index<path.length-1;index++)if(segmentIntersectsRect2(path[index],path[index+1],labelBounds))return!0}return!1},pathEntersAnyNetLabel=({path,netLabelPlacements})=>{for(let label of netLabelPlacements){let labelBounds=getRectBounds(label.center,label.width,label.height),labelInteriorBounds={minX:labelBounds.minX+NET_LABEL_INTERIOR_INSET,minY:labelBounds.minY+NET_LABEL_INTERIOR_INSET,maxX:labelBounds.maxX-NET_LABEL_INTERIOR_INSET,maxY:labelBounds.maxY-NET_LABEL_INTERIOR_INSET};for(let index=0;index<path.length-1;index++)if(segmentIntersectsRect2(path[index],path[index+1],labelInteriorBounds))return!0}return!1},getPinFacingAxis=pin=>pin._facingDirection?dir(pin._facingDirection).x===0?"y":"x":null,isCoordinateOnPinFacingSide=({coordinate:coordinate2,axis,pin})=>{if(!pin._facingDirection)return!1;let facingVector=dir(pin._facingDirection);return(coordinate2-pin[axis])*facingVector[axis]>0},getSegmentAxis2=(start,end)=>isHorizontal222(start,end)?"x":isVertical22(start,end)?"y":null,getAxisAlignedSegments=path=>{let segments=[];for(let index=0;index<path.length-1;index++){let start=path[index],end=path[index+1],axis=getSegmentAxis2(start,end);if(!axis)continue;let coordinateAxis=axis==="x"?"y":"x";segments.push({start,end,axis,coordinate:start[coordinateAxis]})}return segments},getPinExitPoint=({pin,departureAxis,railCoordinate})=>departureAxis==="x"?{x:railCoordinate,y:pin.y}:{x:pin.x,y:railCoordinate},findNearestSharedPinExitRail=({donorPath,branchDepartureSegment,sharedPin,adjacentPin})=>{let departureAxis=getPinFacingAxis(sharedPin);if(!departureAxis)return null;let railAxis=departureAxis==="x"?"y":"x",branchDeparture=getAxisAlignedSegments(branchDepartureSegment)[0];if(!branchDeparture||branchDeparture.axis!==departureAxis)return null;let nearestRail=null,nearestDistance=Number.POSITIVE_INFINITY;for(let segment2 of getAxisAlignedSegments(donorPath)){if(segment2.axis!==railAxis||!isCoordinateOnPinFacingSide({coordinate:segment2.coordinate,axis:departureAxis,pin:sharedPin}))continue;let sharedPinExit=getPinExitPoint({pin:sharedPin,departureAxis,railCoordinate:segment2.coordinate}),adjacentPinExit=getPinExitPoint({pin:adjacentPin,departureAxis,railCoordinate:segment2.coordinate});if(!tracePathContainsPoint([segment2.start,segment2.end],sharedPinExit)||!tracePathContainsPoint([segment2.start,segment2.end],adjacentPinExit)||!tracePathContainsPoint([branchDeparture.start,branchDeparture.end],sharedPinExit))continue;let distance33=Math.abs(segment2.coordinate-sharedPin[departureAxis]);distance33>=nearestDistance||(nearestRail={segment:segment2,sharedPinExit},nearestDistance=distance33)}return nearestRail},getSharedPin=({donorTrace,branchTrace})=>{let branchPinIds=new Set(branchTrace.pins.map(pin=>pin.pinId));return donorTrace.pins.find(pin=>branchPinIds.has(pin.pinId))??null},getSegmentAxis3=(start,end)=>nearlyEqual(start.x,end.x)?"y":nearlyEqual(start.y,end.y)?"x":null,getPathFromSharedPin=({trace,sharedPinId})=>{let tracePath=simplifyPath(trace.tracePath),sharedPin=trace.pins.find(pin=>pin.pinId===sharedPinId);if(!sharedPin)return null;let pathFromSharedPin=trace.pins[0]?.pinId===sharedPinId?tracePath:tracePath.reverse();return pointsEqual222(pathFromSharedPin[0],sharedPin)?pathFromSharedPin:null},traceCanLoseSharedPrefix=({trace,sharedPrefix,netLabelPlacements})=>!netLabelPlacements.some(label=>label.mspConnectionPairIds.includes(trace.mspPairId)&&tracePathContainsPoint(sharedPrefix,label.anchorPoint)),getTraceWithoutSharedPrefix=({trace,pathFromSharedPin,sharedPinId,branchPoint})=>{let branchSegmentIndex=pathFromSharedPin.findIndex((point62,index)=>{let nextPoint=pathFromSharedPin[index+1];return nextPoint?tracePathContainsPoint([point62,nextPoint],branchPoint):!1});if(branchSegmentIndex<0)return null;let pathFromJunction=simplifyPath([branchPoint,...pathFromSharedPin.slice(branchSegmentIndex+1)]),tracePath=pathFromJunction;return trace.pins[0]?.pinId!==sharedPinId&&(tracePath=pathFromJunction.reverse()),{...trace,tracePath}},collapseRedundantSharedEndpointStubs=({traces,netLabelPlacements,netLabelConnectorTraceIds,multiPinNetPinIds})=>{let outputTraces=[...traces];for(let firstIndex=0;firstIndex<outputTraces.length;firstIndex++)if(!netLabelConnectorTraceIds.has(outputTraces[firstIndex].mspPairId))for(let secondIndex=firstIndex+1;secondIndex<outputTraces.length;secondIndex++){let firstTrace=outputTraces[firstIndex],secondTrace=outputTraces[secondIndex];if(netLabelConnectorTraceIds.has(secondTrace.mspPairId)||firstTrace.globalConnNetId!==secondTrace.globalConnNetId)continue;let sharedPin=getSharedPin({donorTrace:firstTrace,branchTrace:secondTrace});if(!sharedPin||!multiPinNetPinIds.has(sharedPin.pinId))continue;let firstPath=getPathFromSharedPin({trace:firstTrace,sharedPinId:sharedPin.pinId}),secondPath=getPathFromSharedPin({trace:secondTrace,sharedPinId:sharedPin.pinId});if(!firstPath||!secondPath||firstPath.length<2||secondPath.length<2)continue;let departureAxis=getSegmentAxis3(firstPath[0],firstPath[1]),secondDepartureAxis=getSegmentAxis3(secondPath[0],secondPath[1]);if(!departureAxis||departureAxis!==secondDepartureAxis)continue;let firstDepartureDirection=firstPath[1][departureAxis]-firstPath[0][departureAxis],secondDepartureDirection=secondPath[1][departureAxis]-secondPath[0][departureAxis];if(!pointsEqual222(firstPath[1],secondPath[1])&&Math.sign(firstDepartureDirection)===Math.sign(secondDepartureDirection)){let traceIndexToCollapse2=secondIndex,traceToCollapse2=secondTrace,pathToCollapse2=secondPath;Math.abs(firstDepartureDirection)<Math.abs(secondDepartureDirection)&&(traceIndexToCollapse2=firstIndex,traceToCollapse2=firstTrace,pathToCollapse2=firstPath);let branchPoint2=pathToCollapse2[1];if(traceCanLoseSharedPrefix({trace:traceToCollapse2,sharedPrefix:[pathToCollapse2[0],branchPoint2],netLabelPlacements})||(traceIndexToCollapse2===firstIndex?(traceIndexToCollapse2=secondIndex,traceToCollapse2=secondTrace,pathToCollapse2=secondPath):(traceIndexToCollapse2=firstIndex,traceToCollapse2=firstTrace,pathToCollapse2=firstPath)),!traceCanLoseSharedPrefix({trace:traceToCollapse2,sharedPrefix:[pathToCollapse2[0],branchPoint2],netLabelPlacements}))continue;let collapsedTrace2=getTraceWithoutSharedPrefix({trace:traceToCollapse2,pathFromSharedPin:pathToCollapse2,sharedPinId:sharedPin.pinId,branchPoint:branchPoint2});if(!collapsedTrace2)continue;outputTraces[traceIndexToCollapse2]=collapsedTrace2;continue}if(firstPath.length<3||secondPath.length<3||!pointsEqual222(firstPath[1],secondPath[1]))continue;let railAxis=getSegmentAxis3(firstPath[1],firstPath[2]),secondRailAxis=getSegmentAxis3(secondPath[1],secondPath[2]);if(!railAxis||railAxis!==secondRailAxis||railAxis===departureAxis)continue;let firstRailDirection=firstPath[2][railAxis]-firstPath[1][railAxis],secondRailDirection=secondPath[2][railAxis]-secondPath[1][railAxis],railsHaveSameDirection=Math.sign(firstRailDirection)===Math.sign(secondRailDirection),sharedStub=firstPath.slice(0,2);if(!railsHaveSameDirection&&!nearlyEqual(Math.abs(firstRailDirection),Math.abs(secondRailDirection))&&netLabelPlacements.some(label=>label.globalConnNetId===firstTrace.globalConnNetId&&tracePathContainsPoint(sharedStub,label.anchorPoint)))continue;let traceIndexToCollapse=secondIndex,traceToCollapse=secondTrace,pathToCollapse=secondPath,branchPoint=firstPath[1];railsHaveSameDirection&&Math.abs(firstRailDirection)<Math.abs(secondRailDirection)?(traceIndexToCollapse=firstIndex,traceToCollapse=firstTrace,pathToCollapse=firstPath,branchPoint=firstPath[2]):railsHaveSameDirection&&(branchPoint=secondPath[2]);let sharedPrefix=[pathToCollapse[0],pathToCollapse[1],branchPoint];if(traceCanLoseSharedPrefix({trace:traceToCollapse,sharedPrefix,netLabelPlacements})||(traceIndexToCollapse===firstIndex?(traceIndexToCollapse=secondIndex,traceToCollapse=secondTrace,pathToCollapse=secondPath):(traceIndexToCollapse=firstIndex,traceToCollapse=firstTrace,pathToCollapse=firstPath)),!traceCanLoseSharedPrefix({trace:traceToCollapse,sharedPrefix:[pathToCollapse[0],pathToCollapse[1],branchPoint],netLabelPlacements}))continue;let collapsedTrace=getTraceWithoutSharedPrefix({trace:traceToCollapse,pathFromSharedPin:pathToCollapse,sharedPinId:sharedPin.pinId,branchPoint});collapsedTrace&&(outputTraces[traceIndexToCollapse]=collapsedTrace)}return outputTraces},TRACE_LENGTH_EPSILON=1e-6,getTracePathStartingAtPin=(trace,pin)=>{let pathStart=trace.tracePath[0],pathEnd=trace.tracePath.at(-1);return!pathStart||!pathEnd?null:pointsEqual222(pathStart,pin)?trace.tracePath:pointsEqual222(pathEnd,pin)?[...trace.tracePath].reverse():null},getPerpendicularPathCrossings=(targetPath,donorPath)=>{let crossings=[],sharedEndpoint=targetPath[0];for(let targetSegmentIndex=0;targetSegmentIndex<targetPath.length-1;targetSegmentIndex++){let targetStart=targetPath[targetSegmentIndex],targetEnd=targetPath[targetSegmentIndex+1],targetOrientation=getRailOrientation(targetStart,targetEnd);if(targetOrientation)for(let donorSegmentIndex=0;donorSegmentIndex<donorPath.length-1;donorSegmentIndex++){let donorStart=donorPath[donorSegmentIndex],donorEnd=donorPath[donorSegmentIndex+1],donorOrientation=getRailOrientation(donorStart,donorEnd);if(!donorOrientation||donorOrientation===targetOrientation)continue;let intersectionPoint=getSegmentIntersection2(targetStart,targetEnd,donorStart,donorEnd);!intersectionPoint||pointsEqual222(intersectionPoint,sharedEndpoint)||crossings.push({intersectionPoint,targetSegmentIndex,donorSegmentIndex})}}return crossings},buildCollapsedSelfCyclePath=(path,firstSegmentIndex,secondSegmentIndex)=>{let intersectionPoint=getSegmentIntersection2(path[firstSegmentIndex],path[firstSegmentIndex+1],path[secondSegmentIndex],path[secondSegmentIndex+1]);return intersectionPoint?simplifyPath([...path.slice(0,firstSegmentIndex+1),intersectionPoint,...path.slice(secondSegmentIndex+1)]):path},buildCollapsedCyclePath=({targetTrace,targetPath,donorPath,crossing})=>{let pathFromSharedPin=simplifyPath([...donorPath.slice(0,crossing.donorSegmentIndex+1),crossing.intersectionPoint,...targetPath.slice(crossing.targetSegmentIndex+1)]);return pointsEqual222(targetTrace.tracePath[0],targetPath[0])?pathFromSharedPin:pathFromSharedPin.reverse()},getNetLabelPlacementsForCycleCollapse=({targetTrace,tracePath,netLabelPlacements})=>{let candidateNetLabelPlacements=moveAttachedLabelsToReroutedTrace({trace:targetTrace,originalTracePath:targetTrace.tracePath,reroutedTracePath:tracePath,netLabelPlacements});for(let labelIndex=0;labelIndex<netLabelPlacements.length;labelIndex++){let label=netLabelPlacements[labelIndex];if(label.globalConnNetId!==targetTrace.globalConnNetId||!tracePathContainsPoint(targetTrace.tracePath,label.anchorPoint))continue;let candidateLabel=candidateNetLabelPlacements[labelIndex];if(!tracePathContainsPoint(tracePath,candidateLabel.anchorPoint))return null}let otherNetLabelPlacements=candidateNetLabelPlacements.filter(label=>label.globalConnNetId!==targetTrace.globalConnNetId);if(pathIntersectsAnyNetLabel({path:tracePath,netLabelPlacements:otherNetLabelPlacements}))return null;let sameNetLabelPlacements=candidateNetLabelPlacements.filter(label=>label.globalConnNetId===targetTrace.globalConnNetId);return pathEntersAnyNetLabel({path:tracePath,netLabelPlacements:sameNetLabelPlacements})?null:candidateNetLabelPlacements},candidateIsBetter=(candidate,bestCandidate)=>{if(!bestCandidate)return!0;let visibleLengthDelta=candidate.netVisibleLength-bestCandidate.netVisibleLength;return Math.abs(visibleLengthDelta)>TRACE_LENGTH_EPSILON?visibleLengthDelta<0:candidate.netVisibleSegmentCount<bestCandidate.netVisibleSegmentCount},getBestCycleCollapseCandidate=({targetTrace,traces,netLabelPlacements})=>{let sameNetTraces=traces.filter(trace=>trace.globalConnNetId===targetTrace.globalConnNetId),baselineNetVisibleLength=getVisibleTraceLength(sameNetTraces),baselineTargetVisibleLength=getVisibleTraceLength([targetTrace]),bestCandidate=null,considerTracePath=tracePath=>{let candidateTrace={...targetTrace,tracePath};if(getVisibleTraceLength([candidateTrace])>baselineTargetVisibleLength+TRACE_LENGTH_EPSILON)return;let candidateNetLabelPlacements=getNetLabelPlacementsForCycleCollapse({targetTrace,tracePath,netLabelPlacements});if(!candidateNetLabelPlacements)return;let candidateNetTraces=sameNetTraces.map(trace=>trace.mspPairId===targetTrace.mspPairId?candidateTrace:trace),netVisibleLength=getVisibleTraceLength(candidateNetTraces);if(netVisibleLength>=baselineNetVisibleLength-TRACE_LENGTH_EPSILON)return;let candidate={tracePath,netLabelPlacements:candidateNetLabelPlacements,netVisibleLength,netVisibleSegmentCount:getVisibleTraceSegmentCount(candidateNetTraces)};candidateIsBetter(candidate,bestCandidate)&&(bestCandidate=candidate)},selfCrossings=findPerpendicularPathCrossings(targetTrace.tracePath,targetTrace.tracePath,{includeTerminalSegments:!0}).filter(({pathSegmentIndex,otherPathSegmentIndex})=>pathSegmentIndex<otherPathSegmentIndex);for(let crossing of selfCrossings)considerTracePath(buildCollapsedSelfCyclePath(targetTrace.tracePath,crossing.pathSegmentIndex,crossing.otherPathSegmentIndex));for(let donorTrace of sameNetTraces){if(donorTrace.mspPairId===targetTrace.mspPairId)continue;let sharedPin=getSharedPin({donorTrace,branchTrace:targetTrace});if(!sharedPin)continue;let targetPath=getTracePathStartingAtPin(targetTrace,sharedPin),donorPath=getTracePathStartingAtPin(donorTrace,sharedPin);if(!targetPath||!donorPath)continue;let crossings=getPerpendicularPathCrossings(targetPath,donorPath);for(let crossing of crossings){let tracePath=buildCollapsedCyclePath({targetTrace,targetPath,donorPath,crossing});considerTracePath(tracePath)}}return bestCandidate},collapseSameNetCycles=({traces,netLabelPlacements})=>{let outputTraces=[...traces],outputNetLabelPlacements=[...netLabelPlacements],collapsedCycleCount=0,traceIndex=0;for(;traceIndex<outputTraces.length;){let targetTrace=outputTraces[traceIndex],candidate=getBestCycleCollapseCandidate({targetTrace,traces:outputTraces,netLabelPlacements:outputNetLabelPlacements});if(!candidate){traceIndex++;continue}outputTraces[traceIndex]={...targetTrace,tracePath:candidate.tracePath},outputNetLabelPlacements=candidate.netLabelPlacements,collapsedCycleCount++,traceIndex=0}return{traces:outputTraces,netLabelPlacements:outputNetLabelPlacements,collapsedCycleCount}},MAX_ALIGNED_LOAD_PIN_OFFSET=.2,MAX_SAME_NET_LABEL_BOUNDARY_RAIL_OFFSET=.2,MAX_SHARED_PIN_RAIL_OFFSET=.05,MAX_SHARED_ENDPOINT_RAIL_OFFSET=.8,MIN_RETURN_STEM_LENGTH=.05,getMultiPinNetPinIds=inputProblem=>{let{netConnMap}=getConnectivityMapsFromInputProblem(inputProblem),inputPinIds=new Set(inputProblem.chips.flatMap(chip=>chip.pins.map(pin=>pin.pinId)));return new Set([...inputPinIds].filter(pinId=>{let globalNetId=netConnMap.getNetConnectedToId(pinId);return globalNetId?netConnMap.getIdsConnectedToNet(globalNetId).filter(connectedId=>inputPinIds.has(connectedId)).length>2:!1}))},getSegmentAxis4=(start,end)=>isHorizontal222(start,end)?"x":isVertical22(start,end)?"y":null,getOtherPin=({trace,sharedPin})=>trace.pins.find(pin=>pin.pinId!==sharedPin.pinId)??null,getLongestHorizontalSegment=trace=>{let longest=null;for(let index=0;index<trace.tracePath.length-1;index++){let start=trace.tracePath[index],end=trace.tracePath[index+1];isHorizontal222(start,end)&&(!longest||Math.abs(end.x-start.x)>Math.abs(longest.end.x-longest.start.x))&&(longest={start,end})}return longest},getJunctionPoint=({segment:segment2,sharedPin})=>{let startDistance=Math.abs(segment2.start.x-sharedPin.x),endDistance=Math.abs(segment2.end.x-sharedPin.x);return startDistance<=endDistance?segment2.start:segment2.end},railIsOnFacingSide=({railY,pin})=>pin._facingDirection==="y+"?railY>pin.y:pin._facingDirection==="y-"?railY<pin.y:!1,railIsOnSharedPinFacingSide=({railY,pin})=>pin._facingDirection==="y+"?railY>pin.y:pin._facingDirection==="y-"?railY<pin.y:!1,getHorizontalPinApproachPoint=({branchTrace,sharedPin,otherPin})=>{if(otherPin._facingDirection!=="x-"&&otherPin._facingDirection!=="x+")return null;let approachPoint=(branchTrace.pins[0].pinId===sharedPin.pinId?branchTrace.tracePath:[...branchTrace.tracePath].reverse()).at(-2);return!approachPoint||!nearlyEqual(approachPoint.y,otherPin.y)?null:(otherPin._facingDirection==="x-"?approachPoint.x<otherPin.x:approachPoint.x>otherPin.x)?approachPoint:null},getAttachedLabelIndexes=(trace,netLabelPlacements)=>netLabelPlacements.flatMap((label,index)=>isLabelAttachedToTrace(label,trace)&&tracePathContainsPoint(trace.tracePath,label.anchorPoint)?[index]:[]),moveAttachedLabels=({trace,reroutedTracePath,netLabelPlacements,attachedLabelIndexes})=>{let attachedLabels=attachedLabelIndexes.map(index=>netLabelPlacements[index]),movedAttachedLabels=moveAttachedLabelsToReroutedTrace({trace,originalTracePath:trace.tracePath,reroutedTracePath,netLabelPlacements:attachedLabels}),movedLabelByIndex=new Map(attachedLabelIndexes.map((labelIndex,index)=>[labelIndex,movedAttachedLabels[index]]));return netLabelPlacements.map((label,index)=>movedLabelByIndex.get(index)??label)},getAlignedBranchPath=({donorTrace,branchTrace})=>{let sharedPin=getSharedPin({donorTrace,branchTrace});if(!sharedPin)return null;let donorOtherPin=getOtherPin({trace:donorTrace,sharedPin});if(!donorOtherPin)return null;let otherPin=getOtherPin({trace:branchTrace,sharedPin});if(!otherPin||Math.abs(sharedPin.y-otherPin.y)>MAX_ALIGNED_LOAD_PIN_OFFSET)return null;let donorRail=getLongestHorizontalSegment(donorTrace);if(!donorRail)return null;let branchRail=getLongestHorizontalSegment(branchTrace);if(branchRail&&nearlyEqual(branchRail.start.y,donorRail.start.y))return null;let railFacesOtherPin=railIsOnFacingSide({railY:donorRail.start.y,pin:otherPin}),railFacesSharedPin=railIsOnSharedPinFacingSide({railY:donorRail.start.y,pin:sharedPin})&&Math.abs(donorRail.start.y-sharedPin.y)<=MAX_SHARED_PIN_RAIL_OFFSET;if(!railFacesOtherPin&&!railFacesSharedPin)return null;let junction=getJunctionPoint({segment:donorRail,sharedPin});if(!(donorOtherPin.x<junction.x&&otherPin.x>junction.x||donorOtherPin.x>junction.x&&otherPin.x<junction.x))return null;let sharedToOther;if(!railFacesOtherPin&&railFacesSharedPin){let approachPoint=getHorizontalPinApproachPoint({branchTrace,sharedPin,otherPin});if(!approachPoint)return null;sharedToOther=simplifyPath([{x:sharedPin.x,y:sharedPin.y},{x:junction.x,y:sharedPin.y},{x:junction.x,y:junction.y},{x:approachPoint.x,y:junction.y},{x:approachPoint.x,y:otherPin.y},{x:otherPin.x,y:otherPin.y}])}else sharedToOther=simplifyPath([{x:sharedPin.x,y:sharedPin.y},{x:junction.x,y:sharedPin.y},{x:junction.x,y:junction.y},{x:otherPin.x,y:junction.y},{x:otherPin.x,y:otherPin.y}]);return branchTrace.pins[0].pinId===sharedPin.pinId?sharedToOther:[...sharedToOther].reverse()},getAlignedParallelPinExitPath=({donorTrace,branchTrace})=>{let sharedPin=getSharedPin({donorTrace,branchTrace});if(!sharedPin)return null;let adjacentPin=getOtherPin({trace:donorTrace,sharedPin}),targetPin=getOtherPin({trace:branchTrace,sharedPin});if(!adjacentPin||!targetPin)return null;let facing=sharedPin._facingDirection,departureAxis=getPinFacingAxis(sharedPin);if(!facing||!departureAxis)return null;let stemAxis=departureAxis==="x"?"y":"x";if(adjacentPin.chipId!==sharedPin.chipId||adjacentPin._facingDirection!==facing||!nearlyEqual(adjacentPin[departureAxis],sharedPin[departureAxis])||getPinFacingAxis(targetPin)!==stemAxis)return null;let adjacentPinOffset=Math.abs(adjacentPin[stemAxis]-sharedPin[stemAxis]);if(adjacentPinOffset>MAX_ALIGNED_LOAD_PIN_OFFSET&&!nearlyEqual(adjacentPinOffset,MAX_ALIGNED_LOAD_PIN_OFFSET))return null;let branchStartsAtSharedPin=branchTrace.pins[0].pinId===sharedPin.pinId,sharedToTargetPath=simplifyPath(branchTrace.tracePath);if(branchStartsAtSharedPin||sharedToTargetPath.reverse(),sharedToTargetPath.length<2)return null;let branchDepartureSegment=[sharedToTargetPath[0],sharedToTargetPath[1]],sharedExitRail=findNearestSharedPinExitRail({donorPath:donorTrace.tracePath,branchDepartureSegment,sharedPin,adjacentPin});if(!sharedExitRail)return null;let alignedRailCoordinate=adjacentPin[stemAxis];if(!isCoordinateOnPinFacingSide({coordinate:alignedRailCoordinate,axis:stemAxis,pin:targetPin}))return null;let alignedStemExit={...sharedExitRail.sharedPinExit,[stemAxis]:alignedRailCoordinate},targetApproach={x:targetPin.x,y:targetPin.y,[stemAxis]:alignedRailCoordinate},candidate=simplifyPath([{x:sharedPin.x,y:sharedPin.y},sharedExitRail.sharedPinExit,alignedStemExit,targetApproach,{x:targetPin.x,y:targetPin.y}]);return branchStartsAtSharedPin?candidate:candidate.reverse()},getAlignedSharedEndpointRailPath=({donorTrace,branchTrace,netLabelConnectorTraceIds})=>{if(netLabelConnectorTraceIds.has(donorTrace.mspPairId)||netLabelConnectorTraceIds.has(branchTrace.mspPairId))return null;let sharedPin=getSharedPin({donorTrace,branchTrace});if(!sharedPin)return null;let pathFromShared=trace=>{let path=simplifyPath(trace.tracePath);return trace.pins[0].pinId===sharedPin.pinId?path:[...path].reverse()},donorPath=pathFromShared(donorTrace),branchPath=pathFromShared(branchTrace);if(donorPath.length<3||branchPath.length<4)return null;let donorDepartureAxis=getSegmentAxis4(donorPath[0],donorPath[1]),branchDepartureAxis=getSegmentAxis4(branchPath[0],branchPath[1]);if(!donorDepartureAxis||donorDepartureAxis!==branchDepartureAxis)return null;let donorDeparture=donorPath[1][donorDepartureAxis]-donorPath[0][donorDepartureAxis],branchDeparture=branchPath[1][branchDepartureAxis]-branchPath[0][branchDepartureAxis];if(Math.sign(donorDeparture)!==Math.sign(branchDeparture))return null;let railIndex=1,donorRailAxis=getSegmentAxis4(donorPath[1],donorPath[2]),branchRailAxis=getSegmentAxis4(branchPath[1],branchPath[2]);if(!donorRailAxis||donorRailAxis!==branchRailAxis||donorRailAxis===donorDepartureAxis||(donorRailAxis==="x"&&nearlyEqual(donorPath[1].y,branchPath[1].y)||donorRailAxis==="y"&&nearlyEqual(donorPath[1].x,branchPath[1].x))&&(railIndex++,!donorPath[railIndex+2]||!branchPath[railIndex+2]||(donorRailAxis=getSegmentAxis4(donorPath[railIndex],donorPath[railIndex+1]),branchRailAxis=getSegmentAxis4(branchPath[railIndex],branchPath[railIndex+1]),!donorRailAxis||donorRailAxis!==branchRailAxis)))return null;let branchParallelRailCount=0;for(let index=1;index<branchPath.length-2;index++)getSegmentAxis4(branchPath[index],branchPath[index+1])===branchRailAxis&&branchParallelRailCount++;if(branchParallelRailCount!==1)return null;let railCoordinateAxis=donorRailAxis==="x"?"y":"x",donorCoordinate=donorPath[railIndex][railCoordinateAxis],branchCoordinate=branchPath[railIndex][railCoordinateAxis],railOffset=Math.abs(donorCoordinate-branchCoordinate);if(nearlyEqual(donorCoordinate,branchCoordinate)||railOffset>MAX_SHARED_ENDPOINT_RAIL_OFFSET)return null;let donorRange=[donorPath[railIndex][donorRailAxis],donorPath[railIndex+1][donorRailAxis]].sort((a22,b22)=>a22-b22),branchRange=[branchPath[railIndex][branchRailAxis],branchPath[railIndex+1][branchRailAxis]].sort((a22,b22)=>a22-b22);if(!(Math.min(donorRange[1],branchRange[1])>=Math.max(donorRange[0],branchRange[0])-1e-6))return null;let candidateFromShared=simplifyPath(branchPath.map((point62,index)=>index===railIndex||index===railIndex+1?{...point62,[railCoordinateAxis]:donorCoordinate}:point62));return branchTrace.pins[0].pinId===sharedPin.pinId?candidateFromShared:candidateFromShared.reverse()},getAlignedAttachedLabelConnectorPath=({donorTrace,connectorTrace,netLabelConnectorTraceIds})=>{if(netLabelConnectorTraceIds.has(donorTrace.mspPairId)||!netLabelConnectorTraceIds.has(connectorTrace.mspPairId))return null;let findCandidate=connectorPath=>{if(connectorPath.length<3)return null;let junction=connectorPath[0],turn=connectorPath[1],railEnd=connectorPath[2],departureAxis=getSegmentAxis4(junction,turn),railAxis=getSegmentAxis4(turn,railEnd);if(!departureAxis||!railAxis||departureAxis===railAxis)return null;let donorSegmentIndex=donorTrace.tracePath.findIndex((point62,index,path)=>{let next2=path[index+1];return next2&&getSegmentAxis4(point62,next2)===departureAxis&&tracePathContainsPoint([point62,next2],junction)&&tracePathContainsPoint([point62,next2],turn)});if(donorSegmentIndex<0)return null;let donorSegmentStart=donorTrace.tracePath[donorSegmentIndex],donorSegmentEnd=donorTrace.tracePath[donorSegmentIndex+1];if(nearlyEqual(junction.x,donorSegmentStart.x)&&nearlyEqual(junction.y,donorSegmentStart.y)||nearlyEqual(junction.x,donorSegmentEnd.x)&&nearlyEqual(junction.y,donorSegmentEnd.y))return null;let adjacentDonorRails=[donorSegmentIndex>0?[donorTrace.tracePath[donorSegmentIndex-1],donorSegmentStart]:null,donorSegmentIndex+2<donorTrace.tracePath.length?[donorSegmentEnd,donorTrace.tracePath[donorSegmentIndex+2]]:null].flatMap(segment2=>segment2&&getSegmentAxis4(segment2[0],segment2[1])===railAxis?[segment2]:[]);if(adjacentDonorRails.length===0)return null;let railCoordinateAxis=railAxis==="x"?"y":"x",connectorRailCoordinate=turn[railCoordinateAxis],connectorRange=[turn[railAxis],railEnd[railAxis]].sort((a22,b22)=>a22-b22),donorRail=adjacentDonorRails.map(segment2=>({segment:segment2,coordinate:segment2[0][railCoordinateAxis],offset:Math.abs(segment2[0][railCoordinateAxis]-connectorRailCoordinate)})).filter(({segment:segment2,offset})=>{if(offset>MAX_SHARED_ENDPOINT_RAIL_OFFSET)return!1;let donorRange=[segment2[0][railAxis],segment2[1][railAxis]].sort((a22,b22)=>a22-b22),overlapStart=Math.max(donorRange[0],connectorRange[0]),overlapEnd=Math.min(donorRange[1],connectorRange[1]);return overlapEnd>=overlapStart-1e-6&&Math.abs(overlapEnd-overlapStart)<=1e-6}).sort((a22,b22)=>a22.offset-b22.offset)[0];return!donorRail||nearlyEqual(donorRail.offset,0)?null:simplifyPath(connectorPath.map((point62,index)=>index===1||index===2?{...point62,[railCoordinateAxis]:donorRail.coordinate}:point62))},forwardPath=simplifyPath(connectorTrace.tracePath),forwardCandidate=findCandidate(forwardPath);if(forwardCandidate)return forwardCandidate;let reverseCandidate=findCandidate([...forwardPath].reverse());return reverseCandidate?reverseCandidate.reverse():null},pathsIntersect2=(firstPath,secondPath)=>{if(firstPath.some(point62=>tracePathContainsPoint(secondPath,point62))||secondPath.some(point62=>tracePathContainsPoint(firstPath,point62)))return!0;for(let firstIndex=1;firstIndex<firstPath.length;firstIndex++)for(let secondIndex=1;secondIndex<secondPath.length;secondIndex++)if(getSegmentIntersection2(firstPath[firstIndex-1],firstPath[firstIndex],secondPath[secondIndex-1],secondPath[secondIndex]))return!0;return!1},preserveAttachedTraceJunctions=({originalTrace,candidateTrace,traces})=>{let outputTraces=traces.map(trace=>trace.mspPairId===originalTrace.mspPairId?candidateTrace:trace);for(let connector of traces){if(connector.mspPairId===originalTrace.mspPairId||connector.globalConnNetId!==originalTrace.globalConnNetId||!pathsIntersect2(originalTrace.tracePath,connector.tracePath)||pathsIntersect2(candidateTrace.tracePath,connector.tracePath))continue;let endpointIndex=[0,connector.tracePath.length-1].find(index=>tracePathContainsPoint(originalTrace.tracePath,connector.tracePath[index]));if(endpointIndex===void 0)return null;let originalJunction=connector.tracePath[endpointIndex];if(connector.pins.some(pin=>nearlyEqual(pin.x,originalJunction.x)&&nearlyEqual(pin.y,originalJunction.y)))return null;let movedJunction=getMovedAnchorPointForReroute(originalJunction,originalTrace.tracePath,candidateTrace.tracePath);if(!movedJunction)return null;let neighborIndex=endpointIndex===0?1:endpointIndex-1,neighbor=connector.tracePath[neighborIndex];if(!neighbor||getSegmentAxis4(originalJunction,neighbor)!==getSegmentAxis4(movedJunction,neighbor))return null;let movedConnector={...connector,tracePath:connector.tracePath.map((point62,index)=>index===endpointIndex?movedJunction:point62)};if(!pathsIntersect2(candidateTrace.tracePath,movedConnector.tracePath))return null;outputTraces=outputTraces.map(trace=>trace.mspPairId===connector.mspPairId?movedConnector:trace)}return outputTraces},getPerpendicularPinRail=({trace,endpointPin})=>{let otherPin=getOtherPin({trace,sharedPin:endpointPin});if(!otherPin)return null;let startsAtEndpoint=trace.pins[0].pinId===endpointPin.pinId,endpointToOtherPath=simplifyPath(trace.tracePath);if(startsAtEndpoint||endpointToOtherPath.reverse(),endpointToOtherPath.length!==3)return null;let[endpoint,railPoint,other]=endpointToOtherPath,endpointFacing=endpointPin._facingDirection;if(endpointFacing==="y+"||endpointFacing==="y-")return otherPin._facingDirection!=="x+"&&otherPin._facingDirection!=="x-"||!isVertical22(endpoint,railPoint)||!isHorizontal222(railPoint,other)||!railIsOnFacingSide({railY:railPoint.y,pin:endpointPin})?null:(otherPin._facingDirection==="x-"?railPoint.x<otherPin.x:railPoint.x>otherPin.x)?{railCoordinate:railPoint.y}:null;if(endpointFacing!=="x+"&&endpointFacing!=="x-"||otherPin._facingDirection!=="y+"&&otherPin._facingDirection!=="y-"||!isHorizontal222(endpoint,railPoint)||!isVertical22(railPoint,other))return null;let railIsOnEndpointFacingSide=endpointFacing==="x+"?railPoint.x>endpointPin.x:railPoint.x<endpointPin.x,approachesOtherFromFacingSide=otherPin._facingDirection==="y+"?railPoint.y>otherPin.y:railPoint.y<otherPin.y;return railIsOnEndpointFacingSide&&approachesOtherFromFacingSide?{railCoordinate:railPoint.x}:null},getAlignedPerpendicularEndpointBusPath=({donorTrace,branchTrace,traces})=>{let sharedPin=getSharedPin({donorTrace,branchTrace});if(!sharedPin)return null;let returnPin=getOtherPin({trace:branchTrace,sharedPin});if(!returnPin)return null;let getOtherSameNetTracesAtPin=pin=>traces.filter(trace=>trace.mspPairId!==branchTrace.mspPairId&&trace.globalConnNetId===branchTrace.globalConnNetId&&trace.pinIds.includes(pin.pinId)),sharedDonorTraces=getOtherSameNetTracesAtPin(sharedPin),returnDonorTraces=getOtherSameNetTracesAtPin(returnPin);if(sharedDonorTraces.length!==1||sharedDonorTraces[0].mspPairId!==donorTrace.mspPairId||returnDonorTraces.length!==1)return null;let sharedRail=getPerpendicularPinRail({trace:donorTrace,endpointPin:sharedPin});if(!sharedRail)return null;let facing=sharedPin._facingDirection,verticalEndpoints=facing==="y+"||facing==="y-";if(!verticalEndpoints&&!(facing==="x+"||facing==="x-")||verticalEndpoints!==(returnPin._facingDirection==="y+"||returnPin._facingDirection==="y-"))return null;let branchStartsAtSharedPin=branchTrace.pins[0].pinId===sharedPin.pinId,sharedToReturnPath=simplifyPath(branchTrace.tracePath);if(branchStartsAtSharedPin||sharedToReturnPath.reverse(),sharedToReturnPath.length!==6)return null;let expectedSegmentOrientations=verticalEndpoints?["V","H","V","H","V"]:["H","V","H","V","H"];if(sharedToReturnPath.slice(1).map((point62,index)=>isHorizontal222(sharedToReturnPath[index],point62)?"H":isVertical22(sharedToReturnPath[index],point62)?"V":"D").some((orientation22,index)=>orientation22!==expectedSegmentOrientations[index]))return null;let returnRail=getPerpendicularPinRail({trace:returnDonorTraces[0],endpointPin:returnPin});if(!returnRail)return null;let candidate=simplifyPath(verticalEndpoints?[{x:sharedPin.x,y:sharedPin.y},{x:sharedPin.x,y:sharedRail.railCoordinate},{x:sharedToReturnPath[2].x,y:sharedRail.railCoordinate},{x:sharedToReturnPath[3].x,y:returnRail.railCoordinate},{x:returnPin.x,y:returnRail.railCoordinate},{x:returnPin.x,y:returnPin.y}]:[{x:sharedPin.x,y:sharedPin.y},{x:sharedRail.railCoordinate,y:sharedPin.y},{x:sharedRail.railCoordinate,y:sharedToReturnPath[2].y},{x:returnRail.railCoordinate,y:sharedToReturnPath[3].y},{x:returnRail.railCoordinate,y:returnPin.y},{x:returnPin.x,y:returnPin.y}]);return branchStartsAtSharedPin?candidate:candidate.reverse()},candidateIsClear=({candidateTrace,originalTrace,traces,inputProblem,originalNetLabelPlacements,candidateNetLabelPlacements,attachedLabelIndexes})=>{let obstacles=getObstacleRects(inputProblem);if(isPathCollidingWithObstacles(candidateTrace.tracePath,obstacles))return!1;let otherNetTraces=traces.filter(trace=>trace.globalConnNetId!==candidateTrace.globalConnNetId);if(doesPathCoincideWithTraces(candidateTrace.tracePath,otherNetTraces))return!1;for(let otherTrace of otherNetTraces){let countIntersections=path=>{let intersections2=new Set;for(let i22=1;i22<path.length;i22++)for(let j22=1;j22<otherTrace.tracePath.length;j22++){let point62=getSegmentIntersection2(path[i22-1],path[i22],otherTrace.tracePath[j22-1],otherTrace.tracePath[j22]);point62&&intersections2.add(`${point62.x.toFixed(6)},${point62.y.toFixed(6)}`)}return intersections2.size};if(countIntersections(candidateTrace.tracePath)>countIntersections(originalTrace.tracePath))return!1}if(!attachedLabelIndexes.every(index=>tracePathContainsPoint(candidateTrace.tracePath,candidateNetLabelPlacements[index].anchorPoint)))return!1;let labelHitsTrace=(label,trace)=>pathIntersectsAnyNetLabel({path:trace.tracePath,netLabelPlacements:[label]});for(let labelIndex of attachedLabelIndexes){let originalLabel=originalNetLabelPlacements[labelIndex],candidateLabel=candidateNetLabelPlacements[labelIndex],originalBounds=getRectBounds(originalLabel.center,originalLabel.width,originalLabel.height),candidateBounds=getRectBounds(candidateLabel.center,candidateLabel.width,candidateLabel.height);for(let trace of traces)if(trace.globalConnNetId!==candidateLabel.globalConnNetId&&labelHitsTrace(candidateLabel,trace)&&!labelHitsTrace(originalLabel,trace))return!1;for(let obstacle of obstacles)if(rectsOverlap2(candidateBounds,obstacle)&&!rectsOverlap2(originalBounds,obstacle))return!1;for(let otherIndex=0;otherIndex<candidateNetLabelPlacements.length;otherIndex++){if(otherIndex===labelIndex)continue;let originalOther=originalNetLabelPlacements[otherIndex],candidateOther=candidateNetLabelPlacements[otherIndex],originalOtherBounds=getRectBounds(originalOther.center,originalOther.width,originalOther.height),candidateOtherBounds=getRectBounds(candidateOther.center,candidateOther.width,candidateOther.height);if(rectsOverlap2(candidateBounds,candidateOtherBounds)&&!rectsOverlap2(originalBounds,originalOtherBounds))return!1}}let otherNetLabelPlacements=candidateNetLabelPlacements.filter(label=>label.globalConnNetId!==candidateTrace.globalConnNetId);if(pathIntersectsAnyNetLabel({path:candidateTrace.tracePath,netLabelPlacements:otherNetLabelPlacements}))return!1;let sameNetLabelPlacements=candidateNetLabelPlacements.filter(label=>label.globalConnNetId===candidateTrace.globalConnNetId);if(!pathIntersectsAnyNetLabel({path:candidateTrace.tracePath,netLabelPlacements:sameNetLabelPlacements}))return!0;if(pathEntersAnyNetLabel({path:candidateTrace.tracePath,netLabelPlacements:sameNetLabelPlacements}))return!1;let originalRail=getLongestHorizontalSegment(originalTrace),candidateRail=getLongestHorizontalSegment(candidateTrace);return!originalRail||!candidateRail?!1:Math.abs(originalRail.start.y-candidateRail.start.y)<=MAX_SAME_NET_LABEL_BOUNDARY_RAIL_OFFSET},getAlignedReturnBranchPath=({donorTrace,branchTrace,returnStemScale=1})=>{let sharedPin=getSharedPin({donorTrace,branchTrace});if(!sharedPin)return null;let railPin=getOtherPin({trace:donorTrace,sharedPin}),returnPin=getOtherPin({trace:branchTrace,sharedPin});if(!railPin||!returnPin)return null;let facing=sharedPin._facingDirection;if(facing!=="y+"&&facing!=="y-"||railPin._facingDirection!==facing||returnPin._facingDirection!==facing||!nearlyEqual(sharedPin.y,railPin.y))return null;let donorPath=simplifyPath(donorTrace.tracePath);if(donorPath.length!==4)return null;let rail=getLongestHorizontalSegment(donorTrace);if(!rail||!railIsOnFacingSide({railY:rail.start.y,pin:sharedPin})||!isVertical22(donorPath[0],donorPath[1])||!isVertical22(donorPath[2],donorPath[3]))return null;let sharedFirst=branchTrace.pins[0].pinId===sharedPin.pinId,path=simplifyPath(sharedFirst?branchTrace.tracePath:[...branchTrace.tracePath].reverse());if(path.length!==6||!isVertical22(path[0],path[1])||!isHorizontal222(path[1],path[2])||!isVertical22(path[2],path[3])||!isHorizontal222(path[3],path[4])||!isVertical22(path[4],path[5])||!railIsOnFacingSide({railY:path[1].y,pin:sharedPin})||!railIsOnFacingSide({railY:path[4].y,pin:returnPin})||(facing==="y+"?1:-1)*(returnPin.y-rail.start.y)<=0)return null;let minX=Math.min(sharedPin.x,railPin.x),maxX=Math.max(sharedPin.x,railPin.x);if(path[2].x<minX||path[2].x>maxX||nearlyEqual(path[2].x,railPin.x)&&nearlyEqual(path[1].y,rail.start.y))return null;let returnRailY=returnPin.y+(path[4].y-returnPin.y)*returnStemScale;if(Math.abs(returnRailY-returnPin.y)<MIN_RETURN_STEM_LENGTH-1e-6)return null;let candidate=simplifyPath([{x:sharedPin.x,y:sharedPin.y},{x:sharedPin.x,y:rail.start.y},{x:railPin.x,y:rail.start.y},{x:railPin.x,y:returnRailY},{x:returnPin.x,y:returnRailY},{x:returnPin.x,y:returnPin.y}]);return sharedFirst?candidate:candidate.reverse()},alignSameNetJunctions=({inputProblem,traces,netLabelPlacements,netLabelConnectorTraceIds})=>{let outputTraces=[...traces],outputNetLabelPlacements=[...netLabelPlacements],alignedJunctionCount=0,alignedBranchTraceIds=new Set;for(let alignReturnBranches of[!1,!0]){let donorTraceIds=traces.map(trace=>trace.mspPairId),pendingDonorTraceIds=new Set(donorTraceIds);for(let donorIndex=0;donorIndex<donorTraceIds.length;donorIndex++){let donorTraceId=donorTraceIds[donorIndex];pendingDonorTraceIds.delete(donorTraceId);let donorTrace=outputTraces.find(trace=>trace.mspPairId===donorTraceId);for(let branchTrace of outputTraces){if(alignedBranchTraceIds.has(branchTrace.mspPairId)||donorTrace.mspPairId===branchTrace.mspPairId||donorTrace.globalConnNetId!==branchTrace.globalConnNetId)continue;let donorIsLabelConnector=netLabelConnectorTraceIds.has(donorTrace.mspPairId),candidatePaths=netLabelConnectorTraceIds.has(branchTrace.mspPairId)?alignReturnBranches&&!donorIsLabelConnector?[getAlignedAttachedLabelConnectorPath({donorTrace,connectorTrace:branchTrace,netLabelConnectorTraceIds})]:[]:donorIsLabelConnector?[]:alignReturnBranches?[...[1,.5,.25].map(returnStemScale=>getAlignedReturnBranchPath({donorTrace,branchTrace,returnStemScale})),getAlignedPerpendicularEndpointBusPath({donorTrace,branchTrace,traces:outputTraces}),getAlignedSharedEndpointRailPath({donorTrace,branchTrace,netLabelConnectorTraceIds})]:[getAlignedBranchPath({donorTrace,branchTrace}),getAlignedParallelPinExitPath({donorTrace,branchTrace})];for(let candidatePath of candidatePaths){if(!candidatePath)continue;let candidateTrace={...branchTrace,tracePath:candidatePath},originalPair=[donorTrace,branchTrace],candidatePair=[donorTrace,candidateTrace],removesVisibleSegment=getVisibleTraceSegmentCount(candidatePair)<getVisibleTraceSegmentCount(originalPair),shortensVisibleTrace=getVisibleTraceLength(candidatePair)<getVisibleTraceLength(originalPair)&&!nearlyEqual(getVisibleTraceLength(candidatePair),getVisibleTraceLength(originalPair));if(!removesVisibleSegment&&!shortensVisibleTrace)continue;let attachedLabelIndexes=getAttachedLabelIndexes(branchTrace,outputNetLabelPlacements),candidateNetLabelPlacements=moveAttachedLabels({trace:branchTrace,reroutedTracePath:candidatePath,netLabelPlacements:outputNetLabelPlacements,attachedLabelIndexes}),candidateTraces=preserveAttachedTraceJunctions({originalTrace:branchTrace,candidateTrace,traces:outputTraces});if(!(!candidateTraces||!candidateIsClear({candidateTrace,originalTrace:branchTrace,traces:candidateTraces,inputProblem,originalNetLabelPlacements:outputNetLabelPlacements,candidateNetLabelPlacements,attachedLabelIndexes})||!candidateTraces.every(trace=>{if(trace.mspPairId===branchTrace.mspPairId)return!0;let originalConnector=outputTraces.find(originalTrace=>originalTrace.mspPairId===trace.mspPairId);return originalConnector.tracePath===trace.tracePath?!0:candidateIsClear({candidateTrace:trace,originalTrace:originalConnector,traces:candidateTraces,inputProblem,originalNetLabelPlacements:outputNetLabelPlacements,candidateNetLabelPlacements,attachedLabelIndexes:getAttachedLabelIndexes(originalConnector,outputNetLabelPlacements)})}))){outputTraces=candidateTraces,outputNetLabelPlacements=candidateNetLabelPlacements,alignedBranchTraceIds.add(branchTrace.mspPairId),alignedJunctionCount++,pendingDonorTraceIds.has(branchTrace.mspPairId)||(donorTraceIds.push(branchTrace.mspPairId),pendingDonorTraceIds.add(branchTrace.mspPairId));break}}}}}let cycleCollapse=collapseSameNetCycles({traces:outputTraces,netLabelPlacements:outputNetLabelPlacements});return outputTraces=collapseRedundantSharedEndpointStubs({traces:cycleCollapse.traces,netLabelPlacements:cycleCollapse.netLabelPlacements,netLabelConnectorTraceIds,multiPinNetPinIds:getMultiPinNetPinIds(inputProblem)}),outputNetLabelPlacements=cycleCollapse.netLabelPlacements,{traces:outputTraces,netLabelPlacements:outputNetLabelPlacements,alignedJunctionCount,collapsedCycleCount:cycleCollapse.collapsedCycleCount}},placeGroundRailLabelsAtOuterEnd=({inputProblem,traces,netLabelPlacements})=>{let{netConnMap}=getConnectivityMapsFromInputProblem(inputProblem),groundNetId=netConnMap.getNetConnectedToId("GND");if(!groundNetId)return netLabelPlacements;let chipMap=new Map(inputProblem.chips.map(chip=>[chip.chipId,chip])),traceMap=Object.fromEntries(traces.map(trace=>[trace.mspPairId,trace])),obstacles=getObstacleRects(inputProblem),output=[...netLabelPlacements];for(let rail of traces){if(rail.globalConnNetId!==groundNetId)continue;let[a22,b22]=rail.pins;if(a22.chipId===b22.chipId||!nearlyEqual(a22.y,b22.y)||![a22,b22].every(pin=>pin._facingDirection==="y-"&&chipMap.get(pin.chipId)?.pins.length===2))continue;let path=simplifyPath(rail.tracePath);if(!(path.length!==4||!isVertical22(path[0],path[1])||!isHorizontal222(path[1],path[2])||!isVertical22(path[2],path[3])||path[1].y>=a22.y))for(let feed of traces){if(feed.globalConnNetId!==groundNetId)continue;let shared=feed.pins.find(pin=>rail.pinIds.includes(pin.pinId)),icPin=feed.pins.find(pin=>!rail.pinIds.includes(pin.pinId)&&(chipMap.get(pin.chipId)?.pins.length??0)>2);if(!shared||!icPin||!nearlyEqual(icPin.y,path[1].y))continue;let outer=shared.pinId===a22.pinId?b22:a22;if(Math.abs(outer.x-icPin.x)<=Math.abs(shared.x-icPin.x))continue;let anchorPoint={x:outer.x,y:path[1].y};if(tracePathContainsPoint(rail.tracePath,anchorPoint))for(let index=0;index<output.length;index++){let label=output[index];if(label.globalConnNetId!==groundNetId||label.orientation!=="y-"||!label.mspConnectionPairIds.some(id3=>id3===feed.mspPairId||id3===rail.mspPairId)||!tracePathContainsPoint(feed.tracePath,label.anchorPoint)&&!tracePathContainsPoint(rail.tracePath,label.anchorPoint))continue;let center2=getCenterFromAnchor(anchorPoint,label.orientation,label.width,label.height),bounds=getRectBounds(center2,label.width,label.height);obstacles.some(obstacle=>rectsOverlap2(bounds,obstacle))||traceCrossesBoundsInterior(bounds,traceMap)||output.some((other,otherIndex)=>otherIndex!==index&&rectsOverlap2(bounds,getRectBounds(other.center,other.width,other.height)))||(output[index]={...label,anchorPoint,center:center2,mspConnectionPairIds:[rail.mspPairId],pinIds:[...rail.pinIds]})}}}for(let index=0;index<output.length;index++){let label=output[index];if(label.orientation!=="y-"||!inputProblem.netConnections.find(candidate=>candidate.isGround&&candidate.netId===label.netId&&candidate.pinIds.length>2))continue;let anchorPoint=traces.filter(trace=>trace.globalConnNetId===label.globalConnNetId).flatMap(trace=>trace.tracePath).filter(point62=>nearlyEqual(point62.x,label.anchorPoint.x)&&point62.y<label.anchorPoint.y).sort((a22,b22)=>a22.y-b22.y)[0];if(!anchorPoint)continue;let center2=getCenterFromAnchor(anchorPoint,label.orientation,label.width,label.height),bounds=getRectBounds(center2,label.width,label.height);obstacles.some(obstacle=>rectsOverlap2(bounds,obstacle))||traceCrossesBoundsInterior(bounds,traceMap)||output.some((other,otherIndex)=>otherIndex!==index&&rectsOverlap2(bounds,getRectBounds(other.center,other.width,other.height)))||(output[index]={...label,anchorPoint,center:center2})}return output},MAX_LOCAL_RAIL_SHIFT=.5,MIN_ESCAPE_LENGTH=1,shortenSameSideRailToLabelAnchor=({traces,netLabelPlacements})=>traces.map(trace=>{let path=trace.tracePath,firstPin=path[0],secondPin=path.at(-1);if(!firstPin||!secondPin||!nearlyEqual(firstPin.x,secondPin.x))return trace;let railIndex=path.findIndex((point62,index)=>index>0&&index<path.length-2&&isHorizontal222(path[index-1],point62)&&isVertical22(point62,path[index+1])&&isHorizontal222(path[index+1],path[index+2]));if(railIndex<0)return trace;let firstRail=path[railIndex],secondRail=path[railIndex+1],escapeLength=Math.abs(firstRail.x-firstPin.x),label=netLabelPlacements.find(({anchorPoint,orientation:orientation22,mspConnectionPairIds})=>mspConnectionPairIds.includes(trace.mspPairId)&&(orientation22==="y-"&&anchorPoint.y<Math.min(firstPin.y,secondPin.y)||orientation22==="y+"&&anchorPoint.y>Math.max(firstPin.y,secondPin.y))&&anchorPoint.x>=Math.min(firstPin.x,firstRail.x)&&anchorPoint.x<=Math.max(firstPin.x,firstRail.x)&&Math.abs(anchorPoint.x-firstPin.x)<escapeLength&&Math.abs(anchorPoint.x-firstRail.x)<=MAX_LOCAL_RAIL_SHIFT&&escapeLength>=MIN_ESCAPE_LENGTH);return label?{...trace,tracePath:path.map((point62,index)=>index===railIndex||index===railIndex+1?{...point62,x:label.anchorPoint.x}:point62)}:trace}),SameNetJunctionAlignmentSolver=class extends BaseSolver10{constructor(input2){super();__publicField(this,"input");__publicField(this,"outputTraces");__publicField(this,"outputNetLabelPlacements");this.input=input2,this.outputTraces=input2.traces,this.outputNetLabelPlacements=input2.netLabelPlacements}_step(){let alignment=alignSameNetJunctions(this.input);this.outputTraces=shortenSameSideRailToLabelAnchor({traces:alignment.traces,netLabelPlacements:alignment.netLabelPlacements}),this.outputNetLabelPlacements=placeGroundRailLabelsAtOuterEnd({inputProblem:this.input.inputProblem,traces:this.outputTraces,netLabelPlacements:alignment.netLabelPlacements}),this.stats.alignedJunctionCount=alignment.alignedJunctionCount,this.stats.collapsedCycleCount=alignment.collapsedCycleCount,this.solved=!0}getOutput(){return{traces:this.outputTraces,netLabelPlacements:this.outputNetLabelPlacements}}visualize(){let graphics=visualizeInputProblem2(this.input.inputProblem);graphics.lines??(graphics.lines=[]),graphics.rects??(graphics.rects=[]),graphics.points??(graphics.points=[]);for(let trace of this.outputTraces)graphics.lines.push({points:trace.tracePath,strokeColor:"purple"});for(let label of this.outputNetLabelPlacements){let labelRect={center:label.center,width:label.width,height:label.height,fill:getColorFromString2(label.globalConnNetId,.35),strokeColor:getColorFromString2(label.globalConnNetId,.9),label:`netId: ${label.netId}
|
|
945
|
+
${c22.status}`})}return graphics}},ROUTE_CLEARANCE=.2,COORDINATE_TOLERANCE=1e-9,GROUND_NET_ID="GND",pointsAreEqual=(firstPoint,secondPoint)=>Math.abs(firstPoint.x-secondPoint.x)<=COORDINATE_TOLERANCE&&Math.abs(firstPoint.y-secondPoint.y)<=COORDINATE_TOLERANCE,removeConsecutiveDuplicatePoints=path=>{let filteredPath=[];for(let point62 of path){let previousPoint=filteredPath.at(-1);(!previousPoint||!pointsAreEqual(previousPoint,point62))&&filteredPath.push(point62)}return filteredPath},getPathLength5=path=>{let pathLength4=0;for(let pointIndex=0;pointIndex<path.length-1;pointIndex++){let startPoint=path[pointIndex],endPoint=path[pointIndex+1];pathLength4+=Math.abs(endPoint.x-startPoint.x)+Math.abs(endPoint.y-startPoint.y)}return pathLength4},getEscapePoint=({pin,facingDirection})=>{let escapePoint={x:pin.x,y:pin.y};return facingDirection==="x+"&&(escapePoint.x+=ROUTE_CLEARANCE),facingDirection==="x-"&&(escapePoint.x-=ROUTE_CLEARANCE),facingDirection==="y+"&&(escapePoint.y+=ROUTE_CLEARANCE),facingDirection==="y-"&&(escapePoint.y-=ROUTE_CLEARANCE),escapePoint},getOuterBounds=obstacles=>({minX:Math.min(...obstacles.map(obstacle=>obstacle.minX)),minY:Math.min(...obstacles.map(obstacle=>obstacle.minY)),maxX:Math.max(...obstacles.map(obstacle=>obstacle.maxX)),maxY:Math.max(...obstacles.map(obstacle=>obstacle.maxY))}),getPinConnectionCandidates=({connectionPair,obstacles,channelObstacles=obstacles})=>{let[firstPin,secondPin]=connectionPair.pins,firstEscapePoint=getEscapePoint({pin:firstPin,facingDirection:firstPin._facingDirection}),secondEscapePoint=getEscapePoint({pin:secondPin,facingDirection:secondPin._facingDirection}),outerBounds=getOuterBounds(obstacles),horizontalChannels=[outerBounds.minY-ROUTE_CLEARANCE,outerBounds.maxY+ROUTE_CLEARANCE,...channelObstacles.flatMap(obstacle=>[obstacle.minY-ROUTE_CLEARANCE,obstacle.maxY+ROUTE_CLEARANCE])],verticalChannels=[outerBounds.minX-ROUTE_CLEARANCE,outerBounds.maxX+ROUTE_CLEARANCE,...channelObstacles.flatMap(obstacle=>[obstacle.minX-ROUTE_CLEARANCE,obstacle.maxX+ROUTE_CLEARANCE])],candidates=[calculateElbow22({...firstPin,facingDirection:firstPin._facingDirection},{...secondPin,facingDirection:secondPin._facingDirection},{overshoot:ROUTE_CLEARANCE})];for(let channelY of new Set(horizontalChannels))candidates.push(removeConsecutiveDuplicatePoints([firstPin,firstEscapePoint,{x:firstEscapePoint.x,y:channelY},{x:secondEscapePoint.x,y:channelY},secondEscapePoint,secondPin]));for(let channelX of new Set(verticalChannels))candidates.push(removeConsecutiveDuplicatePoints([firstPin,firstEscapePoint,{x:channelX,y:firstEscapePoint.y},{x:channelX,y:secondEscapePoint.y},secondEscapePoint,secondPin]));return candidates.sort((firstPath,secondPath)=>getPathLength5(firstPath)-getPathLength5(secondPath))},getSegmentMidpoint=(startPoint,endPoint)=>({x:(startPoint.x+endPoint.x)/2,y:(startPoint.y+endPoint.y)/2}),getJunctionPoints=sameNetTraces=>{let junctionPoints=[];for(let trace of sameNetTraces){for(let pointIndex=0;pointIndex<trace.tracePath.length-1;pointIndex++){let startPoint=trace.tracePath[pointIndex],endPoint=trace.tracePath[pointIndex+1];junctionPoints.push(startPoint),junctionPoints.push(getSegmentMidpoint(startPoint,endPoint))}let lastPoint=trace.tracePath.at(-1);lastPoint&&junctionPoints.push(lastPoint)}return junctionPoints},getUnconnectedPins=({connectionPair,sameNetTraces})=>{let connectedPinIds=new Set(sameNetTraces.flatMap(trace=>trace.pinIds));return connectionPair.pins.filter(pin=>!connectedPinIds.has(pin.pinId))},pathsIntersect=(firstPath,secondPath)=>{for(let firstIndex=0;firstIndex<firstPath.length-1;firstIndex++)for(let secondIndex=0;secondIndex<secondPath.length-1;secondIndex++)if(doSegmentsIntersect22(firstPath[firstIndex],firstPath[firstIndex+1],secondPath[secondIndex],secondPath[secondIndex+1]))return!0;return!1},connectionPairPinsAreAlreadyConnected=({connectionPair,sameNetTraces})=>{let[firstPin,secondPin]=connectionPair.pins,connectedTraceIndexes=new Set(sameNetTraces.flatMap((trace,index)=>trace.pinIds.includes(firstPin.pinId)?[index]:[])),previousSize=-1;for(;connectedTraceIndexes.size!==previousSize;){previousSize=connectedTraceIndexes.size;for(let traceIndex=0;traceIndex<sameNetTraces.length;traceIndex++){if(connectedTraceIndexes.has(traceIndex))continue;let trace=sameNetTraces[traceIndex];[...connectedTraceIndexes].some(connectedTraceIndex=>{let connectedTrace=sameNetTraces[connectedTraceIndex];return trace.pinIds.some(pinId=>connectedTrace.pinIds.includes(pinId))||pathsIntersect(trace.tracePath,connectedTrace.tracePath)})&&connectedTraceIndexes.add(traceIndex)}}return[...connectedTraceIndexes].some(traceIndex=>sameNetTraces[traceIndex].pinIds.includes(secondPin.pinId))},getJunctionCandidates=({connectionPair,sameNetTraces,obstacles,maxConnectionDistance})=>{let outerBounds=getOuterBounds(obstacles),horizontalChannels=[outerBounds.minY-ROUTE_CLEARANCE,outerBounds.maxY+ROUTE_CLEARANCE],verticalChannels=[outerBounds.minX-ROUTE_CLEARANCE,outerBounds.maxX+ROUTE_CLEARANCE],candidates=[],junctionPoints=getJunctionPoints(sameNetTraces),unconnectedPins=getUnconnectedPins({connectionPair,sameNetTraces});for(let pin of unconnectedPins){let escapePoint=getEscapePoint({pin,facingDirection:pin._facingDirection});for(let junctionPoint of junctionPoints)if(!(distance17(pin,junctionPoint)>maxConnectionDistance)){candidates.push(removeConsecutiveDuplicatePoints([pin,escapePoint,{x:escapePoint.x,y:junctionPoint.y},junctionPoint])),candidates.push(removeConsecutiveDuplicatePoints([pin,escapePoint,{x:junctionPoint.x,y:escapePoint.y},junctionPoint]));for(let channelY of horizontalChannels)candidates.push(removeConsecutiveDuplicatePoints([pin,escapePoint,{x:escapePoint.x,y:channelY},{x:junctionPoint.x,y:channelY},junctionPoint]));for(let channelX of verticalChannels)candidates.push(removeConsecutiveDuplicatePoints([pin,escapePoint,{x:channelX,y:escapePoint.y},{x:channelX,y:junctionPoint.y},junctionPoint]))}}return candidates.sort((firstPath,secondPath)=>getPathLength5(firstPath)-getPathLength5(secondPath))},pathCollidesWithObstacles=({path,obstacles,connectionPair,rejectComponentBoundaryTravel})=>{let firstPathPoint=path[0],lastPathPoint=path.at(-1),firstPathPin=connectionPair.pins.find(pin=>pointsAreEqual(pin,firstPathPoint)),lastPathPin=connectionPair.pins.find(pin=>pointsAreEqual(pin,lastPathPoint));for(let[pin,neighbor]of[[firstPathPin,path[1]],[lastPathPin,path[path.length-2]]]){if(!pin?._facingDirection)continue;let outward=dir(pin._facingDirection);if((neighbor.x-pin.x)*outward.x+(neighbor.y-pin.y)*outward.y<-COORDINATE_TOLERANCE)return!0}let pathConnectsPairPins=firstPathPin!==void 0&&lastPathPin!==void 0,firstChipObstacle=obstacles.find(obstacle=>obstacle.kind==="chip"&&obstacle.chipId===firstPathPin?.chipId),secondChipObstacle=obstacles.find(obstacle=>obstacle.kind==="chip"&&obstacle.chipId===lastPathPin?.chipId);return rejectComponentBoundaryTravel&&firstChipObstacle&&segmentOverlapsRectBoundary(path[0],path[1],firstChipObstacle)||rejectComponentBoundaryTravel&&secondChipObstacle&&segmentOverlapsRectBoundary(path[path.length-2],path[path.length-1],secondChipObstacle)?!0:findFirstCollision(path,obstacles,{excludeRectsForSegment:segmentIndex=>{let excludedObstacles=new Set;return segmentIndex===0&&firstChipObstacle&&excludedObstacles.add(firstChipObstacle),pathConnectsPairPins&&segmentIndex===path.length-2&&secondChipObstacle&&excludedObstacles.add(secondChipObstacle),excludedObstacles}})!==null},hasParallelFailedConnection=({connectionPair,failedConnectionPairs})=>{let connectionChipIds=new Set(connectionPair.pins.map(pin=>pin.chipId));return failedConnectionPairs.some(otherConnectionPair=>otherConnectionPair.mspPairId===connectionPair.mspPairId?!1:otherConnectionPair.pins.every(pin=>connectionChipIds.has(pin.chipId)))},segmentsOverlapBeyondEndpoint=({firstStart,firstEnd,secondStart,secondEnd})=>isHorizontal3(firstStart,firstEnd)&&isHorizontal3(secondStart,secondEnd)?Math.min(Math.max(firstStart.x,firstEnd.x),Math.max(secondStart.x,secondEnd.x))-Math.max(Math.min(firstStart.x,firstEnd.x),Math.min(secondStart.x,secondEnd.x))>COORDINATE_TOLERANCE:isVertical2(firstStart,firstEnd)&&isVertical2(secondStart,secondEnd)?Math.min(Math.max(firstStart.y,firstEnd.y),Math.max(secondStart.y,secondEnd.y))-Math.max(Math.min(firstStart.y,firstEnd.y),Math.min(secondStart.y,secondEnd.y))>COORDINATE_TOLERANCE:!1,getAllowedJunctionPoints=({connectionPair,existingTrace})=>{let existingPinIds=new Set(existingTrace.pinIds);return connectionPair.pins.filter(pin=>existingPinIds.has(pin.pinId))},pathCrossesExistingTraces=({path,connectionPair,existingTraces})=>{for(let existingTrace of existingTraces){if(existingTrace.globalConnNetId===connectionPair.globalConnNetId)continue;let allowedJunctionPoints=getAllowedJunctionPoints({connectionPair,existingTrace});for(let pathIndex=0;pathIndex<path.length-1;pathIndex++){let pathStart=path[pathIndex],pathEnd=path[pathIndex+1];for(let traceIndex=0;traceIndex<existingTrace.tracePath.length-1;traceIndex++){let traceStart=existingTrace.tracePath[traceIndex],traceEnd=existingTrace.tracePath[traceIndex+1];if(!(!doSegmentsIntersect22(pathStart,pathEnd,traceStart,traceEnd)||allowedJunctionPoints.some(junctionPoint=>(pointsAreEqual(pathStart,junctionPoint)||pointsAreEqual(pathEnd,junctionPoint))&&(pointsAreEqual(traceStart,junctionPoint)||pointsAreEqual(traceEnd,junctionPoint)))&&!segmentsOverlapBeyondEndpoint({firstStart:pathStart,firstEnd:pathEnd,secondStart:traceStart,secondEnd:traceEnd})))return!0}}}return!1},UnroutedTraceRecoverySolver=class extends BaseSolver10{constructor(params){super();__publicField(this,"params");__publicField(this,"inputProblem");__publicField(this,"alreadySolvedTraces");__publicField(this,"failedConnectionPairs");__publicField(this,"queuedConnectionPairs");__publicField(this,"maxConnectionDistance");__publicField(this,"groundGlobalConnNetId");__publicField(this,"solvedUnroutedTraces",[]);this.params=params,this.inputProblem=params.inputProblem,this.alreadySolvedTraces=params.alreadySolvedTraces,this.failedConnectionPairs=params.failedConnectionPairs,this.queuedConnectionPairs=[...params.failedConnectionPairs],this.maxConnectionDistance=this.inputProblem.maxMspPairDistance??DEFAULT_MAX_MSP_PAIR_DISTANCE;let{netConnMap}=getConnectivityMapsFromInputProblem(this.inputProblem);this.groundGlobalConnNetId=netConnMap.getNetConnectedToId(GROUND_NET_ID)??void 0}getConstructorParams(){return this.params}_step(){let connectionPair=this.queuedConnectionPairs.shift();if(!connectionPair){this.solved=!0;return}if(connectionPair.globalConnNetId===this.groundGlobalConnNetId||distance17(connectionPair.pins[0],connectionPair.pins[1])>this.maxConnectionDistance)return;let obstacles=getObstacleRects(this.inputProblem),existingTraces=[...this.alreadySolvedTraces,...this.solvedUnroutedTraces],sameNetTraces=existingTraces.filter(trace=>trace.globalConnNetId===connectionPair.globalConnNetId);if(connectionPairPinsAreAlreadyConnected({connectionPair,sameNetTraces}))return;let junctionCandidates=getJunctionCandidates({connectionPair,sameNetTraces,obstacles,maxConnectionDistance:this.maxConnectionDistance}),pinConnectionCandidates=getPinConnectionCandidates({connectionPair,obstacles,channelObstacles:[]}),candidates=[...junctionCandidates,...pinConnectionCandidates].sort((firstPath,secondPath)=>getPathLength5(firstPath)-getPathLength5(secondPath)),rejectComponentBoundaryTravel=hasParallelFailedConnection({connectionPair,failedConnectionPairs:this.failedConnectionPairs}),recoveredPath;for(let tracePath of candidates)recoveredPath&&getPathLength5(tracePath)>=getPathLength5(recoveredPath)||pathCollidesWithObstacles({path:tracePath,obstacles,connectionPair,rejectComponentBoundaryTravel})||pathCrossesExistingTraces({path:tracePath,connectionPair,existingTraces})||(recoveredPath||candidates.push(...getPinConnectionCandidates({connectionPair,obstacles})),recoveredPath=tracePath);recoveredPath&&this.solvedUnroutedTraces.push({...connectionPair,tracePath:recoveredPath,mspConnectionPairIds:[connectionPair.mspPairId],pinIds:connectionPair.pins.map(pin=>pin.pinId)})}getOutput(){return{newTraces:this.solvedUnroutedTraces,allTracesMerged:[...this.alreadySolvedTraces,...this.solvedUnroutedTraces]}}visualize(){let graphics=visualizeInputProblem2(this.inputProblem);for(let trace of this.solvedUnroutedTraces)graphics.lines.push({points:trace.tracePath,strokeColor:"blue"});return graphics}},NET_LABEL_INTERIOR_INSET=1e-6,pathIntersectsAnyNetLabel=({path,netLabelPlacements})=>{for(let label of netLabelPlacements){let labelBounds=getRectBounds(label.center,label.width,label.height);for(let index=0;index<path.length-1;index++)if(segmentIntersectsRect2(path[index],path[index+1],labelBounds))return!0}return!1},pathEntersAnyNetLabel=({path,netLabelPlacements})=>{for(let label of netLabelPlacements){let labelBounds=getRectBounds(label.center,label.width,label.height),labelInteriorBounds={minX:labelBounds.minX+NET_LABEL_INTERIOR_INSET,minY:labelBounds.minY+NET_LABEL_INTERIOR_INSET,maxX:labelBounds.maxX-NET_LABEL_INTERIOR_INSET,maxY:labelBounds.maxY-NET_LABEL_INTERIOR_INSET};for(let index=0;index<path.length-1;index++)if(segmentIntersectsRect2(path[index],path[index+1],labelInteriorBounds))return!0}return!1},getPinFacingAxis=pin=>pin._facingDirection?dir(pin._facingDirection).x===0?"y":"x":null,isCoordinateOnPinFacingSide=({coordinate:coordinate2,axis,pin})=>{if(!pin._facingDirection)return!1;let facingVector=dir(pin._facingDirection);return(coordinate2-pin[axis])*facingVector[axis]>0},getSegmentAxis2=(start,end)=>isHorizontal222(start,end)?"x":isVertical22(start,end)?"y":null,getAxisAlignedSegments=path=>{let segments=[];for(let index=0;index<path.length-1;index++){let start=path[index],end=path[index+1],axis=getSegmentAxis2(start,end);if(!axis)continue;let coordinateAxis=axis==="x"?"y":"x";segments.push({start,end,axis,coordinate:start[coordinateAxis]})}return segments},getPinExitPoint=({pin,departureAxis,railCoordinate})=>departureAxis==="x"?{x:railCoordinate,y:pin.y}:{x:pin.x,y:railCoordinate},findNearestSharedPinExitRail=({donorPath,branchDepartureSegment,sharedPin,adjacentPin})=>{let departureAxis=getPinFacingAxis(sharedPin);if(!departureAxis)return null;let railAxis=departureAxis==="x"?"y":"x",branchDeparture=getAxisAlignedSegments(branchDepartureSegment)[0];if(!branchDeparture||branchDeparture.axis!==departureAxis)return null;let nearestRail=null,nearestDistance=Number.POSITIVE_INFINITY;for(let segment2 of getAxisAlignedSegments(donorPath)){if(segment2.axis!==railAxis||!isCoordinateOnPinFacingSide({coordinate:segment2.coordinate,axis:departureAxis,pin:sharedPin}))continue;let sharedPinExit=getPinExitPoint({pin:sharedPin,departureAxis,railCoordinate:segment2.coordinate}),adjacentPinExit=getPinExitPoint({pin:adjacentPin,departureAxis,railCoordinate:segment2.coordinate});if(!tracePathContainsPoint([segment2.start,segment2.end],sharedPinExit)||!tracePathContainsPoint([segment2.start,segment2.end],adjacentPinExit)||!tracePathContainsPoint([branchDeparture.start,branchDeparture.end],sharedPinExit))continue;let distance33=Math.abs(segment2.coordinate-sharedPin[departureAxis]);distance33>=nearestDistance||(nearestRail={segment:segment2,sharedPinExit},nearestDistance=distance33)}return nearestRail},getSharedPin=({donorTrace,branchTrace})=>{let branchPinIds=new Set(branchTrace.pins.map(pin=>pin.pinId));return donorTrace.pins.find(pin=>branchPinIds.has(pin.pinId))??null},getSegmentAxis3=(start,end)=>nearlyEqual(start.x,end.x)?"y":nearlyEqual(start.y,end.y)?"x":null,getPathFromSharedPin=({trace,sharedPinId})=>{let tracePath=simplifyPath(trace.tracePath),sharedPin=trace.pins.find(pin=>pin.pinId===sharedPinId);if(!sharedPin)return null;let pathFromSharedPin=trace.pins[0]?.pinId===sharedPinId?tracePath:tracePath.reverse();return pointsEqual222(pathFromSharedPin[0],sharedPin)?pathFromSharedPin:null},traceCanLoseSharedPrefix=({trace,sharedPrefix,netLabelPlacements})=>!netLabelPlacements.some(label=>label.mspConnectionPairIds.includes(trace.mspPairId)&&tracePathContainsPoint(sharedPrefix,label.anchorPoint)),getTraceWithoutSharedPrefix=({trace,pathFromSharedPin,sharedPinId,branchPoint})=>{let branchSegmentIndex=pathFromSharedPin.findIndex((point62,index)=>{let nextPoint=pathFromSharedPin[index+1];return nextPoint?tracePathContainsPoint([point62,nextPoint],branchPoint):!1});if(branchSegmentIndex<0)return null;let pathFromJunction=simplifyPath([branchPoint,...pathFromSharedPin.slice(branchSegmentIndex+1)]),tracePath=pathFromJunction;return trace.pins[0]?.pinId!==sharedPinId&&(tracePath=pathFromJunction.reverse()),{...trace,tracePath}},collapseRedundantSharedEndpointStubs=({traces,netLabelPlacements,netLabelConnectorTraceIds,multiPinNetPinIds})=>{let outputTraces=[...traces];for(let firstIndex=0;firstIndex<outputTraces.length;firstIndex++)if(!netLabelConnectorTraceIds.has(outputTraces[firstIndex].mspPairId))for(let secondIndex=firstIndex+1;secondIndex<outputTraces.length;secondIndex++){let firstTrace=outputTraces[firstIndex],secondTrace=outputTraces[secondIndex];if(netLabelConnectorTraceIds.has(secondTrace.mspPairId)||firstTrace.globalConnNetId!==secondTrace.globalConnNetId)continue;let sharedPin=getSharedPin({donorTrace:firstTrace,branchTrace:secondTrace});if(!sharedPin||!multiPinNetPinIds.has(sharedPin.pinId))continue;let firstPath=getPathFromSharedPin({trace:firstTrace,sharedPinId:sharedPin.pinId}),secondPath=getPathFromSharedPin({trace:secondTrace,sharedPinId:sharedPin.pinId});if(!firstPath||!secondPath||firstPath.length<2||secondPath.length<2)continue;let departureAxis=getSegmentAxis3(firstPath[0],firstPath[1]),secondDepartureAxis=getSegmentAxis3(secondPath[0],secondPath[1]);if(!departureAxis||departureAxis!==secondDepartureAxis)continue;let firstDepartureDirection=firstPath[1][departureAxis]-firstPath[0][departureAxis],secondDepartureDirection=secondPath[1][departureAxis]-secondPath[0][departureAxis];if(!pointsEqual222(firstPath[1],secondPath[1])&&Math.sign(firstDepartureDirection)===Math.sign(secondDepartureDirection)){let traceIndexToCollapse2=secondIndex,traceToCollapse2=secondTrace,pathToCollapse2=secondPath;Math.abs(firstDepartureDirection)<Math.abs(secondDepartureDirection)&&(traceIndexToCollapse2=firstIndex,traceToCollapse2=firstTrace,pathToCollapse2=firstPath);let branchPoint2=pathToCollapse2[1];if(traceCanLoseSharedPrefix({trace:traceToCollapse2,sharedPrefix:[pathToCollapse2[0],branchPoint2],netLabelPlacements})||(traceIndexToCollapse2===firstIndex?(traceIndexToCollapse2=secondIndex,traceToCollapse2=secondTrace,pathToCollapse2=secondPath):(traceIndexToCollapse2=firstIndex,traceToCollapse2=firstTrace,pathToCollapse2=firstPath)),!traceCanLoseSharedPrefix({trace:traceToCollapse2,sharedPrefix:[pathToCollapse2[0],branchPoint2],netLabelPlacements}))continue;let collapsedTrace2=getTraceWithoutSharedPrefix({trace:traceToCollapse2,pathFromSharedPin:pathToCollapse2,sharedPinId:sharedPin.pinId,branchPoint:branchPoint2});if(!collapsedTrace2)continue;outputTraces[traceIndexToCollapse2]=collapsedTrace2;continue}if(firstPath.length<3||secondPath.length<3||!pointsEqual222(firstPath[1],secondPath[1]))continue;let railAxis=getSegmentAxis3(firstPath[1],firstPath[2]),secondRailAxis=getSegmentAxis3(secondPath[1],secondPath[2]);if(!railAxis||railAxis!==secondRailAxis||railAxis===departureAxis)continue;let firstRailDirection=firstPath[2][railAxis]-firstPath[1][railAxis],secondRailDirection=secondPath[2][railAxis]-secondPath[1][railAxis],railsHaveSameDirection=Math.sign(firstRailDirection)===Math.sign(secondRailDirection),sharedStub=firstPath.slice(0,2);if(!railsHaveSameDirection&&!nearlyEqual(Math.abs(firstRailDirection),Math.abs(secondRailDirection))&&netLabelPlacements.some(label=>label.globalConnNetId===firstTrace.globalConnNetId&&tracePathContainsPoint(sharedStub,label.anchorPoint)))continue;let traceIndexToCollapse=secondIndex,traceToCollapse=secondTrace,pathToCollapse=secondPath,branchPoint=firstPath[1];railsHaveSameDirection&&Math.abs(firstRailDirection)<Math.abs(secondRailDirection)?(traceIndexToCollapse=firstIndex,traceToCollapse=firstTrace,pathToCollapse=firstPath,branchPoint=firstPath[2]):railsHaveSameDirection&&(branchPoint=secondPath[2]);let sharedPrefix=[pathToCollapse[0],pathToCollapse[1],branchPoint];if(traceCanLoseSharedPrefix({trace:traceToCollapse,sharedPrefix,netLabelPlacements})||(traceIndexToCollapse===firstIndex?(traceIndexToCollapse=secondIndex,traceToCollapse=secondTrace,pathToCollapse=secondPath):(traceIndexToCollapse=firstIndex,traceToCollapse=firstTrace,pathToCollapse=firstPath)),!traceCanLoseSharedPrefix({trace:traceToCollapse,sharedPrefix:[pathToCollapse[0],pathToCollapse[1],branchPoint],netLabelPlacements}))continue;let collapsedTrace=getTraceWithoutSharedPrefix({trace:traceToCollapse,pathFromSharedPin:pathToCollapse,sharedPinId:sharedPin.pinId,branchPoint});collapsedTrace&&(outputTraces[traceIndexToCollapse]=collapsedTrace)}return outputTraces},TRACE_LENGTH_EPSILON=1e-6,getTracePathStartingAtPin=(trace,pin)=>{let pathStart=trace.tracePath[0],pathEnd=trace.tracePath.at(-1);return!pathStart||!pathEnd?null:pointsEqual222(pathStart,pin)?trace.tracePath:pointsEqual222(pathEnd,pin)?[...trace.tracePath].reverse():null},getPerpendicularPathCrossings=(targetPath,donorPath)=>{let crossings=[],sharedEndpoint=targetPath[0];for(let targetSegmentIndex=0;targetSegmentIndex<targetPath.length-1;targetSegmentIndex++){let targetStart=targetPath[targetSegmentIndex],targetEnd=targetPath[targetSegmentIndex+1],targetOrientation=getRailOrientation(targetStart,targetEnd);if(targetOrientation)for(let donorSegmentIndex=0;donorSegmentIndex<donorPath.length-1;donorSegmentIndex++){let donorStart=donorPath[donorSegmentIndex],donorEnd=donorPath[donorSegmentIndex+1],donorOrientation=getRailOrientation(donorStart,donorEnd);if(!donorOrientation||donorOrientation===targetOrientation)continue;let intersectionPoint=getSegmentIntersection2(targetStart,targetEnd,donorStart,donorEnd);!intersectionPoint||pointsEqual222(intersectionPoint,sharedEndpoint)||crossings.push({intersectionPoint,targetSegmentIndex,donorSegmentIndex})}}return crossings},buildCollapsedSelfCyclePath=(path,firstSegmentIndex,secondSegmentIndex)=>{let intersectionPoint=getSegmentIntersection2(path[firstSegmentIndex],path[firstSegmentIndex+1],path[secondSegmentIndex],path[secondSegmentIndex+1]);return intersectionPoint?simplifyPath([...path.slice(0,firstSegmentIndex+1),intersectionPoint,...path.slice(secondSegmentIndex+1)]):path},buildCollapsedCyclePath=({targetTrace,targetPath,donorPath,crossing})=>{let pathFromSharedPin=simplifyPath([...donorPath.slice(0,crossing.donorSegmentIndex+1),crossing.intersectionPoint,...targetPath.slice(crossing.targetSegmentIndex+1)]);return pointsEqual222(targetTrace.tracePath[0],targetPath[0])?pathFromSharedPin:pathFromSharedPin.reverse()},getNetLabelPlacementsForCycleCollapse=({targetTrace,tracePath,netLabelPlacements})=>{let candidateNetLabelPlacements=moveAttachedLabelsToReroutedTrace({trace:targetTrace,originalTracePath:targetTrace.tracePath,reroutedTracePath:tracePath,netLabelPlacements});for(let labelIndex=0;labelIndex<netLabelPlacements.length;labelIndex++){let label=netLabelPlacements[labelIndex];if(label.globalConnNetId!==targetTrace.globalConnNetId||!tracePathContainsPoint(targetTrace.tracePath,label.anchorPoint))continue;let candidateLabel=candidateNetLabelPlacements[labelIndex];if(!tracePathContainsPoint(tracePath,candidateLabel.anchorPoint))return null}let otherNetLabelPlacements=candidateNetLabelPlacements.filter(label=>label.globalConnNetId!==targetTrace.globalConnNetId);if(pathIntersectsAnyNetLabel({path:tracePath,netLabelPlacements:otherNetLabelPlacements}))return null;let sameNetLabelPlacements=candidateNetLabelPlacements.filter(label=>label.globalConnNetId===targetTrace.globalConnNetId);return pathEntersAnyNetLabel({path:tracePath,netLabelPlacements:sameNetLabelPlacements})?null:candidateNetLabelPlacements},candidateIsBetter=(candidate,bestCandidate)=>{if(!bestCandidate)return!0;let visibleLengthDelta=candidate.netVisibleLength-bestCandidate.netVisibleLength;return Math.abs(visibleLengthDelta)>TRACE_LENGTH_EPSILON?visibleLengthDelta<0:candidate.netVisibleSegmentCount<bestCandidate.netVisibleSegmentCount},getBestCycleCollapseCandidate=({targetTrace,traces,netLabelPlacements})=>{let sameNetTraces=traces.filter(trace=>trace.globalConnNetId===targetTrace.globalConnNetId),baselineNetVisibleLength=getVisibleTraceLength(sameNetTraces),baselineTargetVisibleLength=getVisibleTraceLength([targetTrace]),bestCandidate=null,considerTracePath=tracePath=>{let candidateTrace={...targetTrace,tracePath};if(getVisibleTraceLength([candidateTrace])>baselineTargetVisibleLength+TRACE_LENGTH_EPSILON)return;let candidateNetLabelPlacements=getNetLabelPlacementsForCycleCollapse({targetTrace,tracePath,netLabelPlacements});if(!candidateNetLabelPlacements)return;let candidateNetTraces=sameNetTraces.map(trace=>trace.mspPairId===targetTrace.mspPairId?candidateTrace:trace),netVisibleLength=getVisibleTraceLength(candidateNetTraces);if(netVisibleLength>=baselineNetVisibleLength-TRACE_LENGTH_EPSILON)return;let candidate={tracePath,netLabelPlacements:candidateNetLabelPlacements,netVisibleLength,netVisibleSegmentCount:getVisibleTraceSegmentCount(candidateNetTraces)};candidateIsBetter(candidate,bestCandidate)&&(bestCandidate=candidate)},selfCrossings=findPerpendicularPathCrossings(targetTrace.tracePath,targetTrace.tracePath,{includeTerminalSegments:!0}).filter(({pathSegmentIndex,otherPathSegmentIndex})=>pathSegmentIndex<otherPathSegmentIndex);for(let crossing of selfCrossings)considerTracePath(buildCollapsedSelfCyclePath(targetTrace.tracePath,crossing.pathSegmentIndex,crossing.otherPathSegmentIndex));for(let donorTrace of sameNetTraces){if(donorTrace.mspPairId===targetTrace.mspPairId)continue;let sharedPin=getSharedPin({donorTrace,branchTrace:targetTrace});if(!sharedPin)continue;let targetPath=getTracePathStartingAtPin(targetTrace,sharedPin),donorPath=getTracePathStartingAtPin(donorTrace,sharedPin);if(!targetPath||!donorPath)continue;let crossings=getPerpendicularPathCrossings(targetPath,donorPath);for(let crossing of crossings){let tracePath=buildCollapsedCyclePath({targetTrace,targetPath,donorPath,crossing});considerTracePath(tracePath)}}return bestCandidate},collapseSameNetCycles=({traces,netLabelPlacements})=>{let outputTraces=[...traces],outputNetLabelPlacements=[...netLabelPlacements],collapsedCycleCount=0,traceIndex=0;for(;traceIndex<outputTraces.length;){let targetTrace=outputTraces[traceIndex],candidate=getBestCycleCollapseCandidate({targetTrace,traces:outputTraces,netLabelPlacements:outputNetLabelPlacements});if(!candidate){traceIndex++;continue}outputTraces[traceIndex]={...targetTrace,tracePath:candidate.tracePath},outputNetLabelPlacements=candidate.netLabelPlacements,collapsedCycleCount++,traceIndex=0}return{traces:outputTraces,netLabelPlacements:outputNetLabelPlacements,collapsedCycleCount}},MAX_ALIGNED_LOAD_PIN_OFFSET=.2,MAX_SAME_NET_LABEL_BOUNDARY_RAIL_OFFSET=.2,MAX_SHARED_PIN_RAIL_OFFSET=.05,MAX_SHARED_ENDPOINT_RAIL_OFFSET=.8,MIN_RETURN_STEM_LENGTH=.05,getMultiPinNetPinIds=inputProblem=>{let{netConnMap}=getConnectivityMapsFromInputProblem(inputProblem),inputPinIds=new Set(inputProblem.chips.flatMap(chip=>chip.pins.map(pin=>pin.pinId)));return new Set([...inputPinIds].filter(pinId=>{let globalNetId=netConnMap.getNetConnectedToId(pinId);return globalNetId?netConnMap.getIdsConnectedToNet(globalNetId).filter(connectedId=>inputPinIds.has(connectedId)).length>2:!1}))},getSegmentAxis4=(start,end)=>isHorizontal222(start,end)?"x":isVertical22(start,end)?"y":null,getOtherPin=({trace,sharedPin})=>trace.pins.find(pin=>pin.pinId!==sharedPin.pinId)??null,getLongestHorizontalSegment=trace=>{let longest=null;for(let index=0;index<trace.tracePath.length-1;index++){let start=trace.tracePath[index],end=trace.tracePath[index+1];isHorizontal222(start,end)&&(!longest||Math.abs(end.x-start.x)>Math.abs(longest.end.x-longest.start.x))&&(longest={start,end})}return longest},getJunctionPoint=({segment:segment2,sharedPin})=>{let startDistance=Math.abs(segment2.start.x-sharedPin.x),endDistance=Math.abs(segment2.end.x-sharedPin.x);return startDistance<=endDistance?segment2.start:segment2.end},railIsOnFacingSide=({railY,pin})=>pin._facingDirection==="y+"?railY>pin.y:pin._facingDirection==="y-"?railY<pin.y:!1,railIsOnSharedPinFacingSide=({railY,pin})=>pin._facingDirection==="y+"?railY>pin.y:pin._facingDirection==="y-"?railY<pin.y:!1,getHorizontalPinApproachPoint=({branchTrace,sharedPin,otherPin})=>{if(otherPin._facingDirection!=="x-"&&otherPin._facingDirection!=="x+")return null;let approachPoint=(branchTrace.pins[0].pinId===sharedPin.pinId?branchTrace.tracePath:[...branchTrace.tracePath].reverse()).at(-2);return!approachPoint||!nearlyEqual(approachPoint.y,otherPin.y)?null:(otherPin._facingDirection==="x-"?approachPoint.x<otherPin.x:approachPoint.x>otherPin.x)?approachPoint:null},getAttachedLabelIndexes=(trace,netLabelPlacements)=>netLabelPlacements.flatMap((label,index)=>isLabelAttachedToTrace(label,trace)&&tracePathContainsPoint(trace.tracePath,label.anchorPoint)?[index]:[]),moveAttachedLabels=({trace,reroutedTracePath,netLabelPlacements,attachedLabelIndexes})=>{let attachedLabels=attachedLabelIndexes.map(index=>netLabelPlacements[index]),movedAttachedLabels=moveAttachedLabelsToReroutedTrace({trace,originalTracePath:trace.tracePath,reroutedTracePath,netLabelPlacements:attachedLabels}),movedLabelByIndex=new Map(attachedLabelIndexes.map((labelIndex,index)=>[labelIndex,movedAttachedLabels[index]]));return netLabelPlacements.map((label,index)=>movedLabelByIndex.get(index)??label)},getAlignedBranchPath=({donorTrace,branchTrace})=>{let sharedPin=getSharedPin({donorTrace,branchTrace});if(!sharedPin)return null;let donorOtherPin=getOtherPin({trace:donorTrace,sharedPin});if(!donorOtherPin)return null;let otherPin=getOtherPin({trace:branchTrace,sharedPin});if(!otherPin||Math.abs(sharedPin.y-otherPin.y)>MAX_ALIGNED_LOAD_PIN_OFFSET)return null;let donorRail=getLongestHorizontalSegment(donorTrace);if(!donorRail)return null;let branchRail=getLongestHorizontalSegment(branchTrace);if(branchRail&&nearlyEqual(branchRail.start.y,donorRail.start.y))return null;let railFacesOtherPin=railIsOnFacingSide({railY:donorRail.start.y,pin:otherPin}),railFacesSharedPin=railIsOnSharedPinFacingSide({railY:donorRail.start.y,pin:sharedPin})&&Math.abs(donorRail.start.y-sharedPin.y)<=MAX_SHARED_PIN_RAIL_OFFSET;if(!railFacesOtherPin&&!railFacesSharedPin)return null;let junction=getJunctionPoint({segment:donorRail,sharedPin});if(!(donorOtherPin.x<junction.x&&otherPin.x>junction.x||donorOtherPin.x>junction.x&&otherPin.x<junction.x))return null;let sharedToOther;if(!railFacesOtherPin&&railFacesSharedPin){let approachPoint=getHorizontalPinApproachPoint({branchTrace,sharedPin,otherPin});if(!approachPoint)return null;sharedToOther=simplifyPath([{x:sharedPin.x,y:sharedPin.y},{x:junction.x,y:sharedPin.y},{x:junction.x,y:junction.y},{x:approachPoint.x,y:junction.y},{x:approachPoint.x,y:otherPin.y},{x:otherPin.x,y:otherPin.y}])}else sharedToOther=simplifyPath([{x:sharedPin.x,y:sharedPin.y},{x:junction.x,y:sharedPin.y},{x:junction.x,y:junction.y},{x:otherPin.x,y:junction.y},{x:otherPin.x,y:otherPin.y}]);return branchTrace.pins[0].pinId===sharedPin.pinId?sharedToOther:[...sharedToOther].reverse()},getAlignedParallelPinExitPath=({donorTrace,branchTrace})=>{let sharedPin=getSharedPin({donorTrace,branchTrace});if(!sharedPin)return null;let adjacentPin=getOtherPin({trace:donorTrace,sharedPin}),targetPin=getOtherPin({trace:branchTrace,sharedPin});if(!adjacentPin||!targetPin)return null;let facing=sharedPin._facingDirection,departureAxis=getPinFacingAxis(sharedPin);if(!facing||!departureAxis)return null;let stemAxis=departureAxis==="x"?"y":"x";if(adjacentPin.chipId!==sharedPin.chipId||adjacentPin._facingDirection!==facing||!nearlyEqual(adjacentPin[departureAxis],sharedPin[departureAxis])||getPinFacingAxis(targetPin)!==stemAxis)return null;let adjacentPinOffset=Math.abs(adjacentPin[stemAxis]-sharedPin[stemAxis]);if(adjacentPinOffset>MAX_ALIGNED_LOAD_PIN_OFFSET&&!nearlyEqual(adjacentPinOffset,MAX_ALIGNED_LOAD_PIN_OFFSET))return null;let branchStartsAtSharedPin=branchTrace.pins[0].pinId===sharedPin.pinId,sharedToTargetPath=simplifyPath(branchTrace.tracePath);if(branchStartsAtSharedPin||sharedToTargetPath.reverse(),sharedToTargetPath.length<2)return null;let branchDepartureSegment=[sharedToTargetPath[0],sharedToTargetPath[1]],sharedExitRail=findNearestSharedPinExitRail({donorPath:donorTrace.tracePath,branchDepartureSegment,sharedPin,adjacentPin});if(!sharedExitRail)return null;let alignedRailCoordinate=adjacentPin[stemAxis];if(!isCoordinateOnPinFacingSide({coordinate:alignedRailCoordinate,axis:stemAxis,pin:targetPin}))return null;let alignedStemExit={...sharedExitRail.sharedPinExit,[stemAxis]:alignedRailCoordinate},targetApproach={x:targetPin.x,y:targetPin.y,[stemAxis]:alignedRailCoordinate},candidate=simplifyPath([{x:sharedPin.x,y:sharedPin.y},sharedExitRail.sharedPinExit,alignedStemExit,targetApproach,{x:targetPin.x,y:targetPin.y}]);return branchStartsAtSharedPin?candidate:candidate.reverse()},getAlignedSharedEndpointRailPath=({donorTrace,branchTrace,netLabelConnectorTraceIds,traces})=>{if(netLabelConnectorTraceIds.has(donorTrace.mspPairId)||netLabelConnectorTraceIds.has(branchTrace.mspPairId))return null;let sharedPin=getSharedPin({donorTrace,branchTrace});if(!sharedPin)return null;let pathFromShared=trace=>{let path=simplifyPath(trace.tracePath);return trace.pins[0].pinId===sharedPin.pinId?path:[...path].reverse()},donorPath=pathFromShared(donorTrace),branchPath=pathFromShared(branchTrace);if(donorPath.length<3||branchPath.length<4)return null;let donorDepartureAxis=getSegmentAxis4(donorPath[0],donorPath[1]),branchDepartureAxis=getSegmentAxis4(branchPath[0],branchPath[1]);if(!donorDepartureAxis||donorDepartureAxis!==branchDepartureAxis)return null;let donorDeparture=donorPath[1][donorDepartureAxis]-donorPath[0][donorDepartureAxis],branchDeparture=branchPath[1][branchDepartureAxis]-branchPath[0][branchDepartureAxis];if(Math.sign(donorDeparture)!==Math.sign(branchDeparture))return null;let railIndex=1,donorRailAxis=getSegmentAxis4(donorPath[1],donorPath[2]),branchRailAxis=getSegmentAxis4(branchPath[1],branchPath[2]);if(!donorRailAxis||donorRailAxis!==branchRailAxis||donorRailAxis===donorDepartureAxis)return null;let firstRailsAreAligned=donorRailAxis==="x"&&nearlyEqual(donorPath[1].y,branchPath[1].y)||donorRailAxis==="y"&&nearlyEqual(donorPath[1].x,branchPath[1].x),donorOtherPin=getOtherPin({trace:donorTrace,sharedPin}),branchOtherPin=getOtherPin({trace:branchTrace,sharedPin}),branchEndsAtTerminalPin=branchOtherPin!==null&&!traces.some(trace=>trace.mspPairId!==branchTrace.mspPairId&&!netLabelConnectorTraceIds.has(trace.mspPairId)&&trace.pinIds.includes(branchOtherPin.pinId)),extendsBranchExit=Math.abs(donorDeparture)>Math.abs(branchDeparture),donorPinProjectsOntoRail=donorOtherPin!==null&&tracePathContainsPoint([branchPath[1],branchPath[2]],{x:donorOtherPin.x,y:donorOtherPin.y,[donorDepartureAxis]:branchPath[1][donorDepartureAxis]});if(branchEndsAtTerminalPin&&extendsBranchExit&&donorPinProjectsOntoRail||firstRailsAreAligned&&(railIndex++,!donorPath[railIndex+2]||!branchPath[railIndex+2]||(donorRailAxis=getSegmentAxis4(donorPath[railIndex],donorPath[railIndex+1]),branchRailAxis=getSegmentAxis4(branchPath[railIndex],branchPath[railIndex+1]),!donorRailAxis||donorRailAxis!==branchRailAxis)))return null;let branchParallelRailCount=0;for(let index=1;index<branchPath.length-2;index++)getSegmentAxis4(branchPath[index],branchPath[index+1])===branchRailAxis&&branchParallelRailCount++;if(branchParallelRailCount!==1)return null;let railCoordinateAxis=donorRailAxis==="x"?"y":"x",donorCoordinate=donorPath[railIndex][railCoordinateAxis],branchCoordinate=branchPath[railIndex][railCoordinateAxis],railOffset=Math.abs(donorCoordinate-branchCoordinate);if(nearlyEqual(donorCoordinate,branchCoordinate)||railOffset>MAX_SHARED_ENDPOINT_RAIL_OFFSET)return null;let donorRange=[donorPath[railIndex][donorRailAxis],donorPath[railIndex+1][donorRailAxis]].sort((a22,b22)=>a22-b22),branchRange=[branchPath[railIndex][branchRailAxis],branchPath[railIndex+1][branchRailAxis]].sort((a22,b22)=>a22-b22);if(!(Math.min(donorRange[1],branchRange[1])>=Math.max(donorRange[0],branchRange[0])-1e-6))return null;let candidateFromShared=simplifyPath(branchPath.map((point62,index)=>index===railIndex||index===railIndex+1?{...point62,[railCoordinateAxis]:donorCoordinate}:point62));return branchTrace.pins[0].pinId===sharedPin.pinId?candidateFromShared:candidateFromShared.reverse()},getAlignedAttachedLabelConnectorPath=({donorTrace,connectorTrace,netLabelConnectorTraceIds})=>{if(netLabelConnectorTraceIds.has(donorTrace.mspPairId)||!netLabelConnectorTraceIds.has(connectorTrace.mspPairId))return null;let findCandidate=connectorPath=>{if(connectorPath.length<3)return null;let junction=connectorPath[0],turn=connectorPath[1],railEnd=connectorPath[2],departureAxis=getSegmentAxis4(junction,turn),railAxis=getSegmentAxis4(turn,railEnd);if(!departureAxis||!railAxis||departureAxis===railAxis)return null;let donorSegmentIndex=donorTrace.tracePath.findIndex((point62,index,path)=>{let next2=path[index+1];return next2&&getSegmentAxis4(point62,next2)===departureAxis&&tracePathContainsPoint([point62,next2],junction)&&tracePathContainsPoint([point62,next2],turn)});if(donorSegmentIndex<0)return null;let donorSegmentStart=donorTrace.tracePath[donorSegmentIndex],donorSegmentEnd=donorTrace.tracePath[donorSegmentIndex+1];if(nearlyEqual(junction.x,donorSegmentStart.x)&&nearlyEqual(junction.y,donorSegmentStart.y)||nearlyEqual(junction.x,donorSegmentEnd.x)&&nearlyEqual(junction.y,donorSegmentEnd.y))return null;let adjacentDonorRails=[donorSegmentIndex>0?[donorTrace.tracePath[donorSegmentIndex-1],donorSegmentStart]:null,donorSegmentIndex+2<donorTrace.tracePath.length?[donorSegmentEnd,donorTrace.tracePath[donorSegmentIndex+2]]:null].flatMap(segment2=>segment2&&getSegmentAxis4(segment2[0],segment2[1])===railAxis?[segment2]:[]);if(adjacentDonorRails.length===0)return null;let railCoordinateAxis=railAxis==="x"?"y":"x",connectorRailCoordinate=turn[railCoordinateAxis],connectorRange=[turn[railAxis],railEnd[railAxis]].sort((a22,b22)=>a22-b22),donorRail=adjacentDonorRails.map(segment2=>({segment:segment2,coordinate:segment2[0][railCoordinateAxis],offset:Math.abs(segment2[0][railCoordinateAxis]-connectorRailCoordinate)})).filter(({segment:segment2,offset})=>{if(offset>MAX_SHARED_ENDPOINT_RAIL_OFFSET)return!1;let donorRange=[segment2[0][railAxis],segment2[1][railAxis]].sort((a22,b22)=>a22-b22),overlapStart=Math.max(donorRange[0],connectorRange[0]),overlapEnd=Math.min(donorRange[1],connectorRange[1]);return overlapEnd>=overlapStart-1e-6&&Math.abs(overlapEnd-overlapStart)<=1e-6}).sort((a22,b22)=>a22.offset-b22.offset)[0];return!donorRail||nearlyEqual(donorRail.offset,0)?null:simplifyPath(connectorPath.map((point62,index)=>index===1||index===2?{...point62,[railCoordinateAxis]:donorRail.coordinate}:point62))},forwardPath=simplifyPath(connectorTrace.tracePath),forwardCandidate=findCandidate(forwardPath);if(forwardCandidate)return forwardCandidate;let reverseCandidate=findCandidate([...forwardPath].reverse());return reverseCandidate?reverseCandidate.reverse():null},pathsIntersect2=(firstPath,secondPath)=>{if(firstPath.some(point62=>tracePathContainsPoint(secondPath,point62))||secondPath.some(point62=>tracePathContainsPoint(firstPath,point62)))return!0;for(let firstIndex=1;firstIndex<firstPath.length;firstIndex++)for(let secondIndex=1;secondIndex<secondPath.length;secondIndex++)if(getSegmentIntersection2(firstPath[firstIndex-1],firstPath[firstIndex],secondPath[secondIndex-1],secondPath[secondIndex]))return!0;return!1},preserveAttachedTraceJunctions=({originalTrace,candidateTrace,traces})=>{let outputTraces=traces.map(trace=>trace.mspPairId===originalTrace.mspPairId?candidateTrace:trace);for(let connector of traces){if(connector.mspPairId===originalTrace.mspPairId||connector.globalConnNetId!==originalTrace.globalConnNetId||!pathsIntersect2(originalTrace.tracePath,connector.tracePath)||pathsIntersect2(candidateTrace.tracePath,connector.tracePath))continue;let endpointIndex=[0,connector.tracePath.length-1].find(index=>tracePathContainsPoint(originalTrace.tracePath,connector.tracePath[index]));if(endpointIndex===void 0)return null;let originalJunction=connector.tracePath[endpointIndex];if(connector.pins.some(pin=>nearlyEqual(pin.x,originalJunction.x)&&nearlyEqual(pin.y,originalJunction.y)))return null;let movedJunction=getMovedAnchorPointForReroute(originalJunction,originalTrace.tracePath,candidateTrace.tracePath);if(!movedJunction)return null;let neighborIndex=endpointIndex===0?1:endpointIndex-1,neighbor=connector.tracePath[neighborIndex];if(!neighbor||getSegmentAxis4(originalJunction,neighbor)!==getSegmentAxis4(movedJunction,neighbor))return null;let movedConnector={...connector,tracePath:connector.tracePath.map((point62,index)=>index===endpointIndex?movedJunction:point62)};if(!pathsIntersect2(candidateTrace.tracePath,movedConnector.tracePath))return null;outputTraces=outputTraces.map(trace=>trace.mspPairId===connector.mspPairId?movedConnector:trace)}return outputTraces},getPerpendicularPinRail=({trace,endpointPin})=>{let otherPin=getOtherPin({trace,sharedPin:endpointPin});if(!otherPin)return null;let startsAtEndpoint=trace.pins[0].pinId===endpointPin.pinId,endpointToOtherPath=simplifyPath(trace.tracePath);if(startsAtEndpoint||endpointToOtherPath.reverse(),endpointToOtherPath.length!==3)return null;let[endpoint,railPoint,other]=endpointToOtherPath,endpointFacing=endpointPin._facingDirection;if(endpointFacing==="y+"||endpointFacing==="y-")return otherPin._facingDirection!=="x+"&&otherPin._facingDirection!=="x-"||!isVertical22(endpoint,railPoint)||!isHorizontal222(railPoint,other)||!railIsOnFacingSide({railY:railPoint.y,pin:endpointPin})?null:(otherPin._facingDirection==="x-"?railPoint.x<otherPin.x:railPoint.x>otherPin.x)?{railCoordinate:railPoint.y}:null;if(endpointFacing!=="x+"&&endpointFacing!=="x-"||otherPin._facingDirection!=="y+"&&otherPin._facingDirection!=="y-"||!isHorizontal222(endpoint,railPoint)||!isVertical22(railPoint,other))return null;let railIsOnEndpointFacingSide=endpointFacing==="x+"?railPoint.x>endpointPin.x:railPoint.x<endpointPin.x,approachesOtherFromFacingSide=otherPin._facingDirection==="y+"?railPoint.y>otherPin.y:railPoint.y<otherPin.y;return railIsOnEndpointFacingSide&&approachesOtherFromFacingSide?{railCoordinate:railPoint.x}:null},getAlignedPerpendicularEndpointBusPath=({donorTrace,branchTrace,traces})=>{let sharedPin=getSharedPin({donorTrace,branchTrace});if(!sharedPin)return null;let returnPin=getOtherPin({trace:branchTrace,sharedPin});if(!returnPin)return null;let getOtherSameNetTracesAtPin=pin=>traces.filter(trace=>trace.mspPairId!==branchTrace.mspPairId&&trace.globalConnNetId===branchTrace.globalConnNetId&&trace.pinIds.includes(pin.pinId)),sharedDonorTraces=getOtherSameNetTracesAtPin(sharedPin),returnDonorTraces=getOtherSameNetTracesAtPin(returnPin);if(sharedDonorTraces.length!==1||sharedDonorTraces[0].mspPairId!==donorTrace.mspPairId||returnDonorTraces.length!==1)return null;let sharedRail=getPerpendicularPinRail({trace:donorTrace,endpointPin:sharedPin});if(!sharedRail)return null;let facing=sharedPin._facingDirection,verticalEndpoints=facing==="y+"||facing==="y-";if(!verticalEndpoints&&!(facing==="x+"||facing==="x-")||verticalEndpoints!==(returnPin._facingDirection==="y+"||returnPin._facingDirection==="y-"))return null;let branchStartsAtSharedPin=branchTrace.pins[0].pinId===sharedPin.pinId,sharedToReturnPath=simplifyPath(branchTrace.tracePath);if(branchStartsAtSharedPin||sharedToReturnPath.reverse(),sharedToReturnPath.length!==6)return null;let expectedSegmentOrientations=verticalEndpoints?["V","H","V","H","V"]:["H","V","H","V","H"];if(sharedToReturnPath.slice(1).map((point62,index)=>isHorizontal222(sharedToReturnPath[index],point62)?"H":isVertical22(sharedToReturnPath[index],point62)?"V":"D").some((orientation22,index)=>orientation22!==expectedSegmentOrientations[index]))return null;let returnRail=getPerpendicularPinRail({trace:returnDonorTraces[0],endpointPin:returnPin});if(!returnRail)return null;let candidate=simplifyPath(verticalEndpoints?[{x:sharedPin.x,y:sharedPin.y},{x:sharedPin.x,y:sharedRail.railCoordinate},{x:sharedToReturnPath[2].x,y:sharedRail.railCoordinate},{x:sharedToReturnPath[3].x,y:returnRail.railCoordinate},{x:returnPin.x,y:returnRail.railCoordinate},{x:returnPin.x,y:returnPin.y}]:[{x:sharedPin.x,y:sharedPin.y},{x:sharedRail.railCoordinate,y:sharedPin.y},{x:sharedRail.railCoordinate,y:sharedToReturnPath[2].y},{x:returnRail.railCoordinate,y:sharedToReturnPath[3].y},{x:returnRail.railCoordinate,y:returnPin.y},{x:returnPin.x,y:returnPin.y}]);return branchStartsAtSharedPin?candidate:candidate.reverse()},candidateIsClear=({candidateTrace,originalTrace,traces,inputProblem,originalNetLabelPlacements,candidateNetLabelPlacements,attachedLabelIndexes})=>{let obstacles=getObstacleRects(inputProblem);if(isPathCollidingWithObstacles(candidateTrace.tracePath,obstacles))return!1;let otherNetTraces=traces.filter(trace=>trace.globalConnNetId!==candidateTrace.globalConnNetId);if(doesPathCoincideWithTraces(candidateTrace.tracePath,otherNetTraces))return!1;for(let otherTrace of otherNetTraces){let countIntersections=path=>{let intersections2=new Set;for(let i22=1;i22<path.length;i22++)for(let j22=1;j22<otherTrace.tracePath.length;j22++){let point62=getSegmentIntersection2(path[i22-1],path[i22],otherTrace.tracePath[j22-1],otherTrace.tracePath[j22]);point62&&intersections2.add(`${point62.x.toFixed(6)},${point62.y.toFixed(6)}`)}return intersections2.size};if(countIntersections(candidateTrace.tracePath)>countIntersections(originalTrace.tracePath))return!1}if(!attachedLabelIndexes.every(index=>tracePathContainsPoint(candidateTrace.tracePath,candidateNetLabelPlacements[index].anchorPoint)))return!1;let labelHitsTrace=(label,trace)=>pathIntersectsAnyNetLabel({path:trace.tracePath,netLabelPlacements:[label]});for(let labelIndex of attachedLabelIndexes){let originalLabel=originalNetLabelPlacements[labelIndex],candidateLabel=candidateNetLabelPlacements[labelIndex],originalBounds=getRectBounds(originalLabel.center,originalLabel.width,originalLabel.height),candidateBounds=getRectBounds(candidateLabel.center,candidateLabel.width,candidateLabel.height);for(let trace of traces)if(trace.globalConnNetId!==candidateLabel.globalConnNetId&&labelHitsTrace(candidateLabel,trace)&&!labelHitsTrace(originalLabel,trace))return!1;for(let obstacle of obstacles)if(rectsOverlap2(candidateBounds,obstacle)&&!rectsOverlap2(originalBounds,obstacle))return!1;for(let otherIndex=0;otherIndex<candidateNetLabelPlacements.length;otherIndex++){if(otherIndex===labelIndex)continue;let originalOther=originalNetLabelPlacements[otherIndex],candidateOther=candidateNetLabelPlacements[otherIndex],originalOtherBounds=getRectBounds(originalOther.center,originalOther.width,originalOther.height),candidateOtherBounds=getRectBounds(candidateOther.center,candidateOther.width,candidateOther.height);if(rectsOverlap2(candidateBounds,candidateOtherBounds)&&!rectsOverlap2(originalBounds,originalOtherBounds))return!1}}let otherNetLabelPlacements=candidateNetLabelPlacements.filter(label=>label.globalConnNetId!==candidateTrace.globalConnNetId);if(pathIntersectsAnyNetLabel({path:candidateTrace.tracePath,netLabelPlacements:otherNetLabelPlacements}))return!1;let sameNetLabelPlacements=candidateNetLabelPlacements.filter(label=>label.globalConnNetId===candidateTrace.globalConnNetId);if(!pathIntersectsAnyNetLabel({path:candidateTrace.tracePath,netLabelPlacements:sameNetLabelPlacements}))return!0;if(pathEntersAnyNetLabel({path:candidateTrace.tracePath,netLabelPlacements:sameNetLabelPlacements}))return!1;let originalRail=getLongestHorizontalSegment(originalTrace),candidateRail=getLongestHorizontalSegment(candidateTrace);return!originalRail||!candidateRail?!1:Math.abs(originalRail.start.y-candidateRail.start.y)<=MAX_SAME_NET_LABEL_BOUNDARY_RAIL_OFFSET},getAlignedReturnBranchPath=({donorTrace,branchTrace,returnStemScale=1})=>{let sharedPin=getSharedPin({donorTrace,branchTrace});if(!sharedPin)return null;let railPin=getOtherPin({trace:donorTrace,sharedPin}),returnPin=getOtherPin({trace:branchTrace,sharedPin});if(!railPin||!returnPin)return null;let facing=sharedPin._facingDirection;if(facing!=="y+"&&facing!=="y-"||railPin._facingDirection!==facing||returnPin._facingDirection!==facing||!nearlyEqual(sharedPin.y,railPin.y))return null;let donorPath=simplifyPath(donorTrace.tracePath);if(donorPath.length!==4)return null;let rail=getLongestHorizontalSegment(donorTrace);if(!rail||!railIsOnFacingSide({railY:rail.start.y,pin:sharedPin})||!isVertical22(donorPath[0],donorPath[1])||!isVertical22(donorPath[2],donorPath[3]))return null;let sharedFirst=branchTrace.pins[0].pinId===sharedPin.pinId,path=simplifyPath(sharedFirst?branchTrace.tracePath:[...branchTrace.tracePath].reverse());if(path.length!==6||!isVertical22(path[0],path[1])||!isHorizontal222(path[1],path[2])||!isVertical22(path[2],path[3])||!isHorizontal222(path[3],path[4])||!isVertical22(path[4],path[5])||!railIsOnFacingSide({railY:path[1].y,pin:sharedPin})||!railIsOnFacingSide({railY:path[4].y,pin:returnPin})||(facing==="y+"?1:-1)*(returnPin.y-rail.start.y)<=0)return null;let minX=Math.min(sharedPin.x,railPin.x),maxX=Math.max(sharedPin.x,railPin.x);if(path[2].x<minX||path[2].x>maxX||nearlyEqual(path[2].x,railPin.x)&&nearlyEqual(path[1].y,rail.start.y))return null;let returnRailY=returnPin.y+(path[4].y-returnPin.y)*returnStemScale;if(Math.abs(returnRailY-returnPin.y)<MIN_RETURN_STEM_LENGTH-1e-6)return null;let candidate=simplifyPath([{x:sharedPin.x,y:sharedPin.y},{x:sharedPin.x,y:rail.start.y},{x:railPin.x,y:rail.start.y},{x:railPin.x,y:returnRailY},{x:returnPin.x,y:returnRailY},{x:returnPin.x,y:returnPin.y}]);return sharedFirst?candidate:candidate.reverse()},alignSameNetJunctions=({inputProblem,traces,netLabelPlacements,netLabelConnectorTraceIds})=>{let outputTraces=[...traces],outputNetLabelPlacements=[...netLabelPlacements],alignedJunctionCount=0,alignedBranchTraceIds=new Set;for(let alignReturnBranches of[!1,!0]){let donorTraceIds=traces.map(trace=>trace.mspPairId),pendingDonorTraceIds=new Set(donorTraceIds);for(let donorIndex=0;donorIndex<donorTraceIds.length;donorIndex++){let donorTraceId=donorTraceIds[donorIndex];pendingDonorTraceIds.delete(donorTraceId);let donorTrace=outputTraces.find(trace=>trace.mspPairId===donorTraceId);for(let branchTrace of outputTraces){if(alignedBranchTraceIds.has(branchTrace.mspPairId)||donorTrace.mspPairId===branchTrace.mspPairId||donorTrace.globalConnNetId!==branchTrace.globalConnNetId)continue;let donorIsLabelConnector=netLabelConnectorTraceIds.has(donorTrace.mspPairId),candidatePaths=netLabelConnectorTraceIds.has(branchTrace.mspPairId)?alignReturnBranches&&!donorIsLabelConnector?[getAlignedAttachedLabelConnectorPath({donorTrace,connectorTrace:branchTrace,netLabelConnectorTraceIds})]:[]:donorIsLabelConnector?[]:alignReturnBranches?[...[1,.5,.25].map(returnStemScale=>getAlignedReturnBranchPath({donorTrace,branchTrace,returnStemScale})),getAlignedPerpendicularEndpointBusPath({donorTrace,branchTrace,traces:outputTraces}),getAlignedSharedEndpointRailPath({donorTrace,branchTrace,netLabelConnectorTraceIds,traces:outputTraces})]:[getAlignedBranchPath({donorTrace,branchTrace}),getAlignedParallelPinExitPath({donorTrace,branchTrace})];for(let candidatePath of candidatePaths){if(!candidatePath)continue;let candidateTrace={...branchTrace,tracePath:candidatePath},originalPair=[donorTrace,branchTrace],candidatePair=[donorTrace,candidateTrace],removesVisibleSegment=getVisibleTraceSegmentCount(candidatePair)<getVisibleTraceSegmentCount(originalPair),shortensVisibleTrace=getVisibleTraceLength(candidatePair)<getVisibleTraceLength(originalPair)&&!nearlyEqual(getVisibleTraceLength(candidatePair),getVisibleTraceLength(originalPair));if(!removesVisibleSegment&&!shortensVisibleTrace)continue;let attachedLabelIndexes=getAttachedLabelIndexes(branchTrace,outputNetLabelPlacements),candidateNetLabelPlacements=moveAttachedLabels({trace:branchTrace,reroutedTracePath:candidatePath,netLabelPlacements:outputNetLabelPlacements,attachedLabelIndexes}),candidateTraces=preserveAttachedTraceJunctions({originalTrace:branchTrace,candidateTrace,traces:outputTraces});if(!(!candidateTraces||!candidateIsClear({candidateTrace,originalTrace:branchTrace,traces:candidateTraces,inputProblem,originalNetLabelPlacements:outputNetLabelPlacements,candidateNetLabelPlacements,attachedLabelIndexes})||!candidateTraces.every(trace=>{if(trace.mspPairId===branchTrace.mspPairId)return!0;let originalConnector=outputTraces.find(originalTrace=>originalTrace.mspPairId===trace.mspPairId);return originalConnector.tracePath===trace.tracePath?!0:candidateIsClear({candidateTrace:trace,originalTrace:originalConnector,traces:candidateTraces,inputProblem,originalNetLabelPlacements:outputNetLabelPlacements,candidateNetLabelPlacements,attachedLabelIndexes:getAttachedLabelIndexes(originalConnector,outputNetLabelPlacements)})}))){outputTraces=candidateTraces,outputNetLabelPlacements=candidateNetLabelPlacements,alignedBranchTraceIds.add(branchTrace.mspPairId),alignedJunctionCount++,pendingDonorTraceIds.has(branchTrace.mspPairId)||(donorTraceIds.push(branchTrace.mspPairId),pendingDonorTraceIds.add(branchTrace.mspPairId));break}}}}}let cycleCollapse=collapseSameNetCycles({traces:outputTraces,netLabelPlacements:outputNetLabelPlacements});return outputTraces=collapseRedundantSharedEndpointStubs({traces:cycleCollapse.traces,netLabelPlacements:cycleCollapse.netLabelPlacements,netLabelConnectorTraceIds,multiPinNetPinIds:getMultiPinNetPinIds(inputProblem)}),outputNetLabelPlacements=cycleCollapse.netLabelPlacements,{traces:outputTraces,netLabelPlacements:outputNetLabelPlacements,alignedJunctionCount,collapsedCycleCount:cycleCollapse.collapsedCycleCount}},placeGroundRailLabelsAtOuterEnd=({inputProblem,traces,netLabelPlacements})=>{let{netConnMap}=getConnectivityMapsFromInputProblem(inputProblem),groundNetId=netConnMap.getNetConnectedToId("GND");if(!groundNetId)return netLabelPlacements;let chipMap=new Map(inputProblem.chips.map(chip=>[chip.chipId,chip])),traceMap=Object.fromEntries(traces.map(trace=>[trace.mspPairId,trace])),obstacles=getObstacleRects(inputProblem),output=[...netLabelPlacements];for(let rail of traces){if(rail.globalConnNetId!==groundNetId)continue;let[a22,b22]=rail.pins;if(a22.chipId===b22.chipId||!nearlyEqual(a22.y,b22.y)||![a22,b22].every(pin=>pin._facingDirection==="y-"&&chipMap.get(pin.chipId)?.pins.length===2))continue;let path=simplifyPath(rail.tracePath);if(!(path.length!==4||!isVertical22(path[0],path[1])||!isHorizontal222(path[1],path[2])||!isVertical22(path[2],path[3])||path[1].y>=a22.y))for(let feed of traces){if(feed.globalConnNetId!==groundNetId)continue;let shared=feed.pins.find(pin=>rail.pinIds.includes(pin.pinId)),icPin=feed.pins.find(pin=>!rail.pinIds.includes(pin.pinId)&&(chipMap.get(pin.chipId)?.pins.length??0)>2);if(!shared||!icPin||!nearlyEqual(icPin.y,path[1].y))continue;let outer=shared.pinId===a22.pinId?b22:a22;if(Math.abs(outer.x-icPin.x)<=Math.abs(shared.x-icPin.x))continue;let anchorPoint={x:outer.x,y:path[1].y};if(tracePathContainsPoint(rail.tracePath,anchorPoint))for(let index=0;index<output.length;index++){let label=output[index];if(label.globalConnNetId!==groundNetId||label.orientation!=="y-"||!label.mspConnectionPairIds.some(id3=>id3===feed.mspPairId||id3===rail.mspPairId)||!tracePathContainsPoint(feed.tracePath,label.anchorPoint)&&!tracePathContainsPoint(rail.tracePath,label.anchorPoint))continue;let center2=getCenterFromAnchor(anchorPoint,label.orientation,label.width,label.height),bounds=getRectBounds(center2,label.width,label.height);obstacles.some(obstacle=>rectsOverlap2(bounds,obstacle))||traceCrossesBoundsInterior(bounds,traceMap)||output.some((other,otherIndex)=>otherIndex!==index&&rectsOverlap2(bounds,getRectBounds(other.center,other.width,other.height)))||(output[index]={...label,anchorPoint,center:center2,mspConnectionPairIds:[rail.mspPairId],pinIds:[...rail.pinIds]})}}}for(let index=0;index<output.length;index++){let label=output[index];if(label.orientation!=="y-"||!inputProblem.netConnections.find(candidate=>candidate.isGround&&candidate.netId===label.netId&&candidate.pinIds.length>2))continue;let anchorPoint=traces.filter(trace=>trace.globalConnNetId===label.globalConnNetId).flatMap(trace=>trace.tracePath).filter(point62=>nearlyEqual(point62.x,label.anchorPoint.x)&&point62.y<label.anchorPoint.y).sort((a22,b22)=>a22.y-b22.y)[0];if(!anchorPoint)continue;let center2=getCenterFromAnchor(anchorPoint,label.orientation,label.width,label.height),bounds=getRectBounds(center2,label.width,label.height);obstacles.some(obstacle=>rectsOverlap2(bounds,obstacle))||traceCrossesBoundsInterior(bounds,traceMap)||output.some((other,otherIndex)=>otherIndex!==index&&rectsOverlap2(bounds,getRectBounds(other.center,other.width,other.height)))||(output[index]={...label,anchorPoint,center:center2})}return output},MAX_LOCAL_RAIL_SHIFT=.5,MIN_ESCAPE_LENGTH=1,shortenSameSideRailToLabelAnchor=({traces,netLabelPlacements})=>traces.map(trace=>{let path=trace.tracePath,firstPin=path[0],secondPin=path.at(-1);if(!firstPin||!secondPin||!nearlyEqual(firstPin.x,secondPin.x))return trace;let railIndex=path.findIndex((point62,index)=>index>0&&index<path.length-2&&isHorizontal222(path[index-1],point62)&&isVertical22(point62,path[index+1])&&isHorizontal222(path[index+1],path[index+2]));if(railIndex<0)return trace;let firstRail=path[railIndex],secondRail=path[railIndex+1],escapeLength=Math.abs(firstRail.x-firstPin.x),label=netLabelPlacements.find(({anchorPoint,orientation:orientation22,mspConnectionPairIds})=>mspConnectionPairIds.includes(trace.mspPairId)&&(orientation22==="y-"&&anchorPoint.y<Math.min(firstPin.y,secondPin.y)||orientation22==="y+"&&anchorPoint.y>Math.max(firstPin.y,secondPin.y))&&anchorPoint.x>=Math.min(firstPin.x,firstRail.x)&&anchorPoint.x<=Math.max(firstPin.x,firstRail.x)&&Math.abs(anchorPoint.x-firstPin.x)<escapeLength&&Math.abs(anchorPoint.x-firstRail.x)<=MAX_LOCAL_RAIL_SHIFT&&escapeLength>=MIN_ESCAPE_LENGTH);return label?{...trace,tracePath:path.map((point62,index)=>index===railIndex||index===railIndex+1?{...point62,x:label.anchorPoint.x}:point62)}:trace}),SameNetJunctionAlignmentSolver=class extends BaseSolver10{constructor(input2){super();__publicField(this,"input");__publicField(this,"outputTraces");__publicField(this,"outputNetLabelPlacements");this.input=input2,this.outputTraces=input2.traces,this.outputNetLabelPlacements=input2.netLabelPlacements}_step(){let alignment=alignSameNetJunctions(this.input);this.outputTraces=shortenSameSideRailToLabelAnchor({traces:alignment.traces,netLabelPlacements:alignment.netLabelPlacements}),this.outputNetLabelPlacements=placeGroundRailLabelsAtOuterEnd({inputProblem:this.input.inputProblem,traces:this.outputTraces,netLabelPlacements:alignment.netLabelPlacements}),this.stats.alignedJunctionCount=alignment.alignedJunctionCount,this.stats.collapsedCycleCount=alignment.collapsedCycleCount,this.solved=!0}getOutput(){return{traces:this.outputTraces,netLabelPlacements:this.outputNetLabelPlacements}}visualize(){let graphics=visualizeInputProblem2(this.input.inputProblem);graphics.lines??(graphics.lines=[]),graphics.rects??(graphics.rects=[]),graphics.points??(graphics.points=[]);for(let trace of this.outputTraces)graphics.lines.push({points:trace.tracePath,strokeColor:"purple"});for(let label of this.outputNetLabelPlacements){let labelRect={center:label.center,width:label.width,height:label.height,fill:getColorFromString2(label.globalConnNetId,.35),strokeColor:getColorFromString2(label.globalConnNetId,.9),label:`netId: ${label.netId}
|
|
946
946
|
globalConnNetId: ${label.globalConnNetId}`};graphics.rects.push(labelRect),graphics.points.push({x:label.anchorPoint.x,y:label.anchorPoint.y,color:getColorFromString2(label.globalConnNetId,.9),label:`anchorPoint
|
|
947
947
|
orientation: ${label.orientation}`})}return graphics}},isSimpleFiveSegmentElbow=path=>{let simplifiedPath=simplifyPath(path);if(simplifiedPath.length!==6)return!1;let segmentIsHorizontal=simplifiedPath.slice(0,-1).map((point62,index)=>isHorizontal3(point62,simplifiedPath[index+1]));return segmentIsHorizontal.every((isHorizontalSegment,index)=>index===0||isHorizontalSegment!==segmentIsHorizontal[index-1])},generateSegmentShiftCandidates=({trace,label,paddingBuffer,detourCount})=>{if(trace.globalConnNetId===label.globalConnNetId)return[];let path=simplifyPath(trace.tracePath);if(!isSimpleFiveSegmentElbow(path))return[];let labelBounds=getRectBounds(label.center,label.width,label.height),effectivePadding=paddingBuffer+detourCount*paddingBuffer,paddedLabelBounds={minX:labelBounds.minX-effectivePadding,maxX:labelBounds.maxX+effectivePadding,minY:labelBounds.minY-effectivePadding,maxY:labelBounds.maxY+effectivePadding},candidates=[];for(let segmentIndex=1;segmentIndex<path.length-2;segmentIndex++){let segmentStart=path[segmentIndex],segmentEnd=path[segmentIndex+1];if(!segmentIntersectsRect(segmentStart,segmentEnd,labelBounds))continue;let isHorizontalSegment=isHorizontal3(segmentStart,segmentEnd),isVerticalSegment=isVertical2(segmentStart,segmentEnd);if(!isHorizontalSegment&&!isVerticalSegment)continue;let axis=isHorizontalSegment?"y":"x",coordinates=isHorizontalSegment?[paddedLabelBounds.minY,paddedLabelBounds.maxY]:[paddedLabelBounds.minX,paddedLabelBounds.maxX];for(let coordinate2 of coordinates){let shiftedPath=shiftSegmentOrth(path,segmentIndex,axis,coordinate2);shiftedPath&&candidates.push(shiftedPath)}}return candidates},generateTransitionShiftCandidates=({trace,label,paddingBuffer,detourCount})=>{let path=simplifyPath(trace.tracePath);if(!isSimpleFiveSegmentElbow(path))return[];let labelBounds=getRectBounds(label.center,label.width,label.height),effectivePadding=paddingBuffer+detourCount*paddingBuffer,paddedLabelBounds={minX:labelBounds.minX-effectivePadding,maxX:labelBounds.maxX+effectivePadding,minY:labelBounds.minY-effectivePadding,maxY:labelBounds.maxY+effectivePadding},start=path[0],end=path[path.length-1],middleSegmentIndex=2,candidates=[];for(let segmentIndex=0;segmentIndex<path.length-1;segmentIndex++){let segmentStart=path[segmentIndex],segmentEnd=path[segmentIndex+1];if(!segmentIntersectsRect(segmentStart,segmentEnd,labelBounds)||Math.abs(segmentIndex-middleSegmentIndex)!==1)continue;let isHorizontalSegment=isHorizontal3(segmentStart,segmentEnd),isVerticalSegment=isVertical2(segmentStart,segmentEnd);if(!isHorizontalSegment&&!isVerticalSegment)continue;let axis=isHorizontalSegment?"x":"y",min=isHorizontalSegment?paddedLabelBounds.minX:paddedLabelBounds.minY,max2=isHorizontalSegment?paddedLabelBounds.maxX:paddedLabelBounds.maxY,startCoordinate=isHorizontalSegment?start.x:start.y,endCoordinate=isHorizontalSegment?end.x:end.y,corridorCoordinates=[];startCoordinate<min?corridorCoordinates.push((startCoordinate+min)/2):startCoordinate>max2&&corridorCoordinates.push((startCoordinate+max2)/2),endCoordinate<min?corridorCoordinates.push((endCoordinate+min)/2):endCoordinate>max2&&corridorCoordinates.push((endCoordinate+max2)/2);for(let coordinate2 of new Set(corridorCoordinates)){let shiftedPath=shiftSegmentOrth(path,middleSegmentIndex,axis,coordinate2);shiftedPath&&candidates.push(shiftedPath)}}return candidates},generateElbowTransitionSimplificationCandidates=({trace,label,netLabelPlacements,paddingBuffer,detourCount})=>generateTransitionShiftCandidates({trace,label,paddingBuffer,detourCount}).flatMap(tracePath=>{let shiftedTrace={...trace,tracePath};return detectTraceLabelOverlap({traces:[shiftedTrace],netLabels:netLabelPlacements}).flatMap(({label:shiftedLabel})=>generateSegmentShiftCandidates({trace:shiftedTrace,label:shiftedLabel,paddingBuffer,detourCount}))}),PATH_LENGTH_EPSILON3=1e-9,getPathLength6=points=>points.slice(1).reduce((length8,point62,pointIndex)=>{let previousPoint=points[pointIndex];return length8+Math.abs(point62.x-previousPoint.x)+Math.abs(point62.y-previousPoint.y)},0),TraceElbowTransitionSimplificationSolver=class extends BaseSolver10{constructor(input2){super();__publicField(this,"input");__publicField(this,"outputTraces");__publicField(this,"traceIdQueue");__publicField(this,"obstacles");this.input=input2,this.outputTraces=[...input2.traces];let reroutedTraceIds=new Set(input2.completedReroutes.map(completedReroute=>completedReroute.initialTrace.mspPairId));this.traceIdQueue=input2.traces.map(trace=>trace.mspPairId).filter(traceId=>reroutedTraceIds.has(traceId)),this.obstacles=getObstacleRects(input2.inputProblem)}_step(){let traceId=this.traceIdQueue.shift();if(!traceId){this.solved=!0;return}let traceIndex=this.outputTraces.findIndex(trace2=>trace2.mspPairId===traceId),trace=this.outputTraces[traceIndex],tracePath=simplifyPath(trace.tracePath),initialOverlaps=detectTraceLabelOverlap({traces:[{...trace,tracePath}],netLabels:this.input.netLabelPlacements}),otherNetTraces=this.outputTraces.filter(otherTrace=>otherTrace.mspPairId!==trace.mspPairId&&otherTrace.globalConnNetId!==trace.globalConnNetId),initialPathLength=getPathLength6(tracePath),junctions=getSameNetJunctions(trace,this.outputTraces),candidateByPath=new Map;for(let candidate of getInteriorShortcutPaths(tracePath))(this.input.allowShorterPaths?getPathLength6(candidate)>initialPathLength+PATH_LENGTH_EPSILON3:Math.abs(getPathLength6(candidate)-initialPathLength)>PATH_LENGTH_EPSILON3)||candidateByPath.set(candidate.map(point62=>`${point62.x},${point62.y}`).join(";"),candidate);let completedReroutes=this.input.completedReroutes.filter(completedReroute=>completedReroute.initialTrace.mspPairId===trace.mspPairId);for(let completedReroute of completedReroutes){let initialReroutePath=simplifyPath(completedReroute.initialTrace.tracePath),reroutedPath=simplifyPath(completedReroute.reroutedTracePath),initialRerouteOverlapCount=detectTraceLabelOverlap({traces:[{...completedReroute.initialTrace,tracePath:initialReroutePath}],netLabels:this.input.netLabelPlacements}).length,candidates=generateElbowTransitionSimplificationCandidates({trace:completedReroute.initialTrace,label:completedReroute.label,netLabelPlacements:this.input.netLabelPlacements,paddingBuffer:this.input.paddingBuffer,detourCount:completedReroute.detourCount});for(let candidate of candidates){let simplifiedCandidate=simplifyPath(candidate),candidateTrace={...completedReroute.initialTrace,tracePath:simplifiedCandidate};detectTraceLabelOverlap({traces:[candidateTrace],netLabels:this.input.netLabelPlacements}).length<initialRerouteOverlapCount&&Math.abs(getPathLength6(simplifiedCandidate)-getPathLength6(reroutedPath))<PATH_LENGTH_EPSILON3&&simplifiedCandidate.length<reroutedPath.length&&preservesLabelAnchors(this.input.netLabelPlacements,[completedReroute.initialTrace],[candidateTrace])&&candidateByPath.set(simplifiedCandidate.map(point62=>`${point62.x},${point62.y}`).join(";"),simplifiedCandidate)}}let initialOverlapIds=new Set(initialOverlaps.map(({label})=>`${label.globalConnNetId}:${label.netId}`)),validCandidates=[...candidateByPath.values()].filter(candidatePath=>{let candidateTrace={...trace,tracePath:candidatePath},candidateOverlaps=detectTraceLabelOverlap({traces:[candidateTrace],netLabels:this.input.netLabelPlacements}),candidateOnlyKeepsExistingOverlaps=candidateOverlaps.every(({label})=>initialOverlapIds.has(`${label.globalConnNetId}:${label.netId}`)),reducesCollisions=candidateOverlaps.length<initialOverlaps.length,simplifiesGeometry=candidateOverlaps.length===initialOverlaps.length&&getPathLength6(candidatePath)<=initialPathLength+PATH_LENGTH_EPSILON3&&candidatePath.length<tracePath.length;return candidateOnlyKeepsExistingOverlaps&&(reducesCollisions||simplifiesGeometry)&&preservesLabelAnchors(this.input.netLabelPlacements,[trace],[candidateTrace])&&junctions.every(point62=>tracePathContainsPoint(candidatePath,point62))&&!isPathCollidingWithObstacles(candidatePath,this.obstacles)&&!doesPathCoincideWithTraces(candidatePath,otherNetTraces)&&otherNetTraces.every(otherTrace=>countPathIntersections(candidatePath,otherTrace.tracePath)<=countPathIntersections(tracePath,otherTrace.tracePath))}),getOverlapCount=candidatePath=>detectTraceLabelOverlap({traces:[{...trace,tracePath:candidatePath}],netLabels:this.input.netLabelPlacements}).length;validCandidates.sort((a22,b22)=>{let overlapDifference=getOverlapCount(a22)-getOverlapCount(b22);return overlapDifference!==0?overlapDifference:getPathLength6(a22)-getPathLength6(b22)||a22.length-b22.length});let bestCandidate=validCandidates[0];bestCandidate&&(this.outputTraces[traceIndex]={...trace,tracePath:bestCandidate},this.stats.simplifiedTraceCount=(this.stats.simplifiedTraceCount??0)+1,this.input.allowShorterPaths&&this.traceIdQueue.push(traceId))}getOutput(){return{traces:this.outputTraces,netLabelPlacements:this.input.netLabelPlacements}}visualize(){let graphics=visualizeInputProblem2(this.input.inputProblem);graphics.lines??(graphics.lines=[]);for(let trace of this.outputTraces)graphics.lines.push({points:trace.tracePath,strokeColor:"purple"});return graphics}},getInlineTerminalBounds=label=>{if(!label.stubTracePath)return null;let epsilon=1e-6;return{minX:Math.min(...label.stubTracePath.map(p22=>p22.x))-epsilon,maxX:Math.max(...label.stubTracePath.map(p22=>p22.x))+epsilon,minY:Math.min(...label.stubTracePath.map(p22=>p22.y))-epsilon,maxY:Math.max(...label.stubTracePath.map(p22=>p22.y))+epsilon}},getInlineLabelObstacles=(inputProblem,placements)=>{let fixedLabels=placements.map(label=>({globalConnNetId:label.globalConnNetId,netId:label.netId,pinIds:label.pinIds,mspConnectionPairIds:[],anchorPoint:label.anchorPoint,orientation:"y+",center:label.center,width:label.axis==="x"?label.width:label.height,height:label.axis==="x"?label.height:label.width})),terminalTraces=placements.flatMap(label=>{if(!label.stubTracePath)return[];let chip=inputProblem.chips.find(chip2=>chip2.pins.some(pin2=>label.pinIds.includes(pin2.pinId))),pin=chip?.pins.find(pin2=>label.pinIds.includes(pin2.pinId));if(!chip||!pin)return[];let id3=JSON.stringify(["inline-terminal",label.globalConnNetId,[...label.pinIds].sort()]);return[{mspPairId:id3,mspConnectionPairIds:[id3],globalConnNetId:label.globalConnNetId,dcConnNetId:label.globalConnNetId,pinIds:label.pinIds,pins:[{...pin,chipId:chip.chipId},{...pin,...label.stubTracePath[1],chipId:chip.chipId}],tracePath:label.stubTracePath}]});return{fixedLabels,terminalTraces}},EPS16=1e-6,CLEARANCE=.05,hits=(path,bounds)=>path.slice(1).some((p22,i22)=>segmentIntersectsRect(path[i22],p22,bounds)),same=(a22,b22)=>Math.hypot(a22.x-b22.x,a22.y-b22.y)<EPS16,translate22=(p22,axis,distance33)=>({...p22,[axis]:p22[axis]+distance33}),intersections=(a22,b22)=>a22.slice(1).flatMap((p22,i22)=>b22.slice(1).flatMap((q22,j22)=>{let point62=getSegmentIntersection2(a22[i22],p22,b22[j22],q22);return point62?[point62]:[]}));function*getLocalTraceLabelShifts(inputProblem,output,pendingInlinePlacements=[]){let placements=[...output.inlineNetLabelPlacements,...pendingInlinePlacements],{fixedLabels,terminalTraces}=getInlineLabelObstacles(inputProblem,placements),terminalBounds=placements.flatMap(label=>{let bounds=getInlineTerminalBounds(label);return bounds?[{label,bounds}]:[]}),obstacles=[...inputProblem.chips.map(chip=>({minX:chip.center.x-chip.width/2,maxX:chip.center.x+chip.width/2,minY:chip.center.y-chip.height/2,maxY:chip.center.y+chip.height/2})),...(inputProblem.textBoxes??[]).map(box2=>getTextBoxBounds(box2))],inlineBounds=fixedLabels.map(label=>({minX:label.center.x-label.width/2,maxX:label.center.x+label.width/2,minY:label.center.y-label.height/2,maxY:label.center.y+label.height/2})),pendingReplacementBounds=output.netLabelPlacements.filter(label=>pendingInlinePlacements.some(placement=>placement.globalConnNetId===label.globalConnNetId&&placement.pinIds.length===label.pinIds.length&&placement.pinIds.every(pinId=>label.pinIds.includes(pinId)))).map(getAnchoredNetLabelRenderedBounds),pinPositions=[...inputProblem.chips.flatMap(chip=>chip.pins),...output.traces.flatMap(trace=>trace.pins)];for(let trace of output.traces){let path=simplifyPath(trace.tracePath);for(let i22=0;i22<path.length-1;i22++){let a22=path[i22],b22=path[i22+1],axis=Math.abs(a22.x-b22.x)<EPS16?"x":"y",along2=axis==="x"?"y":"x";if(Math.abs(a22[axis]-b22[axis])>EPS16||same(a22,b22))continue;let candidateObstacles=[...output.netLabelPlacements.filter(label=>label.globalConnNetId!==trace.globalConnNetId).map(getAnchoredNetLabelRenderedBounds),...inlineBounds,...terminalBounds.filter(({label})=>!trace.pinIds.some(pinId=>label.pinIds.includes(pinId))).map(({bounds})=>bounds)],attachedLabelBounds=output.netLabelPlacements.filter(label=>label.globalConnNetId===trace.globalConnNetId&&label.netId!=null&&inputProblem.availableNetLabelOrientations[label.netId]?.length===1&&inputProblem.availableNetLabelOrientations[label.netId]?.[0]===label.orientation&&(axis==="x"?label.orientation==="y+"||label.orientation==="y-":label.orientation==="x+"||label.orientation==="x-")&&tracePathContainsPoint([a22,b22],label.anchorPoint)).map(getAnchoredNetLabelRenderedBounds),blocking=[...candidateObstacles.filter(bounds=>segmentIntersectsRect(a22,b22,bounds)),...pendingReplacementBounds.filter(bounds=>attachedLabelBounds.some(labelBounds=>boundsOverlap2(labelBounds,bounds)))];if(!blocking.length)continue;let low=Math.min(a22[along2],b22[along2]),high=Math.max(a22[along2],b22[along2]),expanded=!0;for(;expanded;){expanded=!1;for(let other of output.traces)if(other.globalConnNetId===trace.globalConnNetId)for(let j22=1;j22<other.tracePath.length;j22++){let p22=other.tracePath[j22-1],q22=other.tracePath[j22];if(Math.abs(p22[axis]-a22[axis])>EPS16||Math.abs(q22[axis]-a22[axis])>EPS16)continue;let min=Math.min(p22[along2],q22[along2]),max2=Math.max(p22[along2],q22[along2]);max2<low-EPS16||min>high+EPS16||((min<low||max2>high)&&(expanded=!0),low=Math.min(low,min),high=Math.max(high,max2))}}let onRail=p22=>Math.abs(p22[axis]-a22[axis])<EPS16&&p22[along2]>=low-EPS16&&p22[along2]<=high+EPS16;if(pinPositions.some(onRail))continue;let minKey=axis==="x"?"minX":"minY",maxKey=axis==="x"?"maxX":"maxY",localWidth=Math.max(...blocking.map(bounds=>bounds[maxKey]-bounds[minKey])),railLabelBounds=output.netLabelPlacements.filter(label=>label.globalConnNetId===trace.globalConnNetId&&onRail(label.anchorPoint)).map(getAnchoredNetLabelRenderedBounds),coordinates=[...new Set(blocking.flatMap(bounds=>[bounds[minKey]-CLEARANCE,bounds[maxKey]+CLEARANCE,...railLabelBounds.filter(own=>boundsOverlap2(own,bounds)).flatMap(own=>[a22[axis]+bounds[minKey]-CLEARANCE-own[maxKey],a22[axis]+bounds[maxKey]+CLEARANCE-own[minKey]])]))].sort((x22,y22)=>Math.abs(x22-a22[axis])-Math.abs(y22-a22[axis]));for(let coordinate2 of coordinates){let distance33=coordinate2-a22[axis];if(Math.abs(distance33)>localWidth+2*CLEARANCE)continue;let traces=output.traces.map(other=>other.globalConnNetId!==trace.globalConnNetId||!other.tracePath.some(onRail)?other:{...other,tracePath:other.tracePath.map(p22=>onRail(p22)?translate22(p22,axis,distance33):p22)}),shiftedPaths=traces.filter((other,index)=>other!==output.traces[index]).map(other=>other.tracePath),labels=output.netLabelPlacements.map(label=>label.globalConnNetId!==trace.globalConnNetId||!onRail(label.anchorPoint)?label:{...label,anchorPoint:translate22(label.anchorPoint,axis,distance33),center:translate22(label.center,axis,distance33)}),blocked=!1,movedOwnLabelBounds=labels.flatMap((label,index)=>label!==output.netLabelPlacements[index]?[getAnchoredNetLabelRenderedBounds(label)]:[]);for(let[labelIndex,label]of labels.entries()){if(label.globalConnNetId===trace.globalConnNetId)continue;let bounds=getAnchoredNetLabelRenderedBounds(label),clearanceEdges=movedOwnLabelBounds.filter(own=>boundsOverlap2(own,bounds)).map(own=>own[distance33>0?maxKey:minKey]);if(shiftedPaths.some(p22=>hits(p22,bounds))&&!output.traces.some(other=>other.globalConnNetId===trace.globalConnNetId&&hits(other.tracePath,bounds))&&clearanceEdges.push(coordinate2),!clearanceEdges.length)continue;let connectorIndex=traces.findIndex(candidate=>candidate.globalConnNetId===label.globalConnNetId&&candidate.pinIds.length===1&&candidate.tracePath.length===3&&same(candidate.tracePath.at(-1),label.anchorPoint)),connector=traces[connectorIndex];if(!connector){let nearby=new NetLabelNetLabelCollisionSolver({inputProblem,traces:[...traces,...terminalTraces],netLabelPlacements:labels,fixedNetLabelPlacements:fixedLabels,useRenderedLabelBounds:!0}).getNearbyValidPlacements(label,localWidth+Math.max(label.width,label.height))[0];if(!nearby){blocked=!0;break}labels[labelIndex]=nearby;continue}let[start,bend,end]=connector.tracePath;if(Math.abs(bend[axis]-end[axis])>EPS16||Math.abs(start[along2]-bend[along2])>EPS16){blocked=!0;break}let delta=distance33>0?Math.max(...clearanceEdges)+CLEARANCE-bounds[minKey]:Math.min(...clearanceEdges)-CLEARANCE-bounds[maxKey];if(Math.abs(delta)>localWidth+bounds[maxKey]-bounds[minKey]+2*CLEARANCE){blocked=!0;break}let moved={...label,anchorPoint:translate22(label.anchorPoint,axis,delta),center:translate22(label.center,axis,delta)};labels[labelIndex]=moved,traces[connectorIndex]={...connector,tracePath:[start,translate22(bend,axis,delta),moved.anchorPoint]}}if(!blocked){for(let[index,other]of traces.entries()){if(other.globalConnNetId===trace.globalConnNetId||simplifyPath(other.tracePath).length<=4||!shiftedPaths.some(path2=>doesPathCoincideWithTraces(path2,[other])))continue;let simplified=minimizeTurnsWithFilteredLabels({inputProblem,traces:[...traces,...terminalTraces],targetMspConnectionPairId:other.mspPairId,allLabelPlacements:[...labels,...fixedLabels],mergedLabelNetIdMap:{},paddingBuffer:CLEARANCE});simplifyPath(simplified.tracePath).length<simplifyPath(other.tracePath).length&&preservesLabelAnchors(labels,[other],[simplified])&&(traces[index]=simplified)}for(let[index,proposed]of traces.entries()){let original=output.traces[index];if(proposed===original)continue;let candidate=proposed.tracePath,previous=original.tracePath;if(candidate.slice(1).some((p22,index2)=>Math.abs(p22.x-candidate[index2].x)>EPS16&&Math.abs(p22.y-candidate[index2].y)>EPS16)){blocked=!0;break}let dot4=(a222,b222,c22,d22)=>(b222.x-a222.x)*(d22.x-c22.x)+(b222.y-a222.y)*(d22.y-c22.y);if(dot4(previous[0],previous[1],candidate[0],candidate[1])<=EPS16||dot4(previous.at(-1),previous.at(-2),candidate.at(-1),candidate.at(-2))<=EPS16){blocked=!0;break}let junctions=output.traces.filter(other=>other!==original&&other.globalConnNetId===original.globalConnNetId).flatMap(other=>[...other.tracePath,...intersections(previous,other.tracePath)]).filter(p22=>tracePathContainsPoint(previous,p22)).map(p22=>original.globalConnNetId===trace.globalConnNetId&&onRail(p22)?translate22(p22,axis,distance33):p22);if([...pinPositions.filter(p22=>tracePathContainsPoint(previous,p22)),...junctions].some(p22=>!tracePathContainsPoint(candidate,p22))||pinPositions.some(p22=>{let clearance={minX:p22.x-CLEARANCE,maxX:p22.x+CLEARANCE,minY:p22.y-CLEARANCE,maxY:p22.y+CLEARANCE};return hits(candidate,clearance)&&!hits(previous,clearance)})||obstacles.some(bounds=>hits(candidate,bounds)&&!hits(previous,bounds))){blocked=!0;break}for(let other of[...traces,...terminalTraces]){if(other.mspPairId===proposed.mspPairId||other.globalConnNetId===proposed.globalConnNetId)continue;let originalOther=output.traces.find(t48=>t48.mspPairId===other.mspPairId)??other;if(doesPathCoincideWithTraces(candidate,[other])||intersections(candidate,other.tracePath).length>intersections(previous,originalOther.tracePath).length){blocked=!0;break}}if(blocked)break}if(!blocked){for(let[index,label]of labels.entries()){if(label===output.netLabelPlacements[index])continue;let bounds=getAnchoredNetLabelRenderedBounds(label);if(obstacles.some(obstacle=>boundsOverlap2(bounds,obstacle))||inlineBounds.some(other=>boundsOverlap2(bounds,other))){blocked=!0;break}if(labels.some((other,j22)=>index!==j22&&boundsOverlap2(bounds,getAnchoredNetLabelRenderedBounds(other)))){blocked=!0;break}if([...traces,...terminalTraces].some(other=>other.globalConnNetId!==label.globalConnNetId&&hits(other.tracePath,bounds))){blocked=!0;break}}blocked||(yield{...output,traces,netLabelPlacements:labels})}}}}}}var sameLabel=(a22,b22)=>{let first=[...a22.pinIds].sort(),second=[...b22.pinIds].sort();return a22.globalConnNetId===b22.globalConnNetId&&first.length===second.length&&first.every((pinId,index)=>pinId===second[index])},sameOutputLabelCollision=(a22,b22)=>a22.kind==="label-label"&&b22.kind==="label-label"?sameLabel(a22.labels[0],b22.labels[0])&&sameLabel(a22.labels[1],b22.labels[1])||sameLabel(a22.labels[0],b22.labels[1])&&sameLabel(a22.labels[1],b22.labels[0]):a22.kind!=="trace-label"||b22.kind!=="trace-label"?!1:(a22.trace.kind==="routed"&&b22.trace.kind==="routed"?a22.trace.id===b22.trace.id:a22.trace.kind==="terminal"&&b22.trace.kind==="terminal"&&sameLabel(a22.trace.label,b22.trace.label))&&a22.target===b22.target&&sameLabel(a22.label,b22.label),getOutputLabelCollisions=output=>{let labels=[...output.netLabelPlacements,...output.inlineNetLabelPlacements].map(label=>({label,bounds:"axis"in label?{minX:label.center.x-(label.axis==="x"?label.width:label.height)/2,maxX:label.center.x+(label.axis==="x"?label.width:label.height)/2,minY:label.center.y-(label.axis==="x"?label.height:label.width)/2,maxY:label.center.y+(label.axis==="x"?label.height:label.width)/2}:getAnchoredNetLabelRenderedBounds(label)})),collisions=[],add=collision=>{collisions.some(other=>sameOutputLabelCollision(collision,other))||collisions.push(collision)};for(let i22=0;i22<labels.length;i22++)for(let other of labels.slice(i22+1))boundsOverlap2(labels[i22].bounds,other.bounds)&&add({kind:"label-label",labels:[labels[i22].label,other.label]});let traces=[...output.traces.map(trace=>({...trace,identity:{kind:"routed",id:trace.mspPairId}})),...output.inlineNetLabelPlacements.flatMap(label=>label.stubTracePath?[{identity:{kind:"terminal",label},globalConnNetId:label.globalConnNetId,tracePath:label.stubTracePath}]:[])];for(let trace of traces)for(let{label,bounds}of labels)("axis"in label||label.globalConnNetId!==trace.globalConnNetId)&&trace.tracePath.slice(1).some((end,index)=>segmentIntersectsRect(trace.tracePath[index],end,bounds))&&add({kind:"trace-label",trace:trace.identity,label,target:"text"});for(let label of output.inlineNetLabelPlacements){let bounds=getInlineTerminalBounds(label);if(bounds)for(let trace of output.traces)trace.pinIds.some(pinId=>label.pinIds.includes(pinId))||trace.tracePath.slice(1).some((end,index)=>segmentIntersectsRect(trace.tracePath[index],end,bounds))&&add({kind:"trace-label",trace:{kind:"routed",id:trace.mspPairId},label,target:"terminal"})}return collisions},isLabelRepresentedInline=(label,inlinePlacements)=>label.pinIds.length>0&&label.pinIds.every(pinId=>inlinePlacements.some(inline=>inline.globalConnNetId===label.globalConnNetId&&inline.pinIds.includes(pinId))),getStubDirection=path=>{let[start,end]=path;return Math.abs(end.x-start.x)>=Math.abs(end.y-start.y)?end.x>=start.x?"x+":"x-":end.y>=start.y?"y+":"y-"},getStubLength=path=>{let[start,end]=path;return Math.abs(end.x-start.x)+Math.abs(end.y-start.y)},getLabelBounds2=placement=>{let isVertical6=placement.axis==="y",width=isVertical6?placement.height:placement.width,height=isVertical6?placement.width:placement.height;return{minX:placement.center.x-width/2,maxX:placement.center.x+width/2,minY:placement.center.y-height/2,maxY:placement.center.y+height/2}},getPathBounds=path=>({minX:Math.min(...path.map(point62=>point62.x)),maxX:Math.max(...path.map(point62=>point62.x)),minY:Math.min(...path.map(point62=>point62.y)),maxY:Math.max(...path.map(point62=>point62.y))}),doesPathIntersectBounds=(path,bounds)=>{for(let index=0;index<path.length-1;index++){let segmentBounds=getPathBounds([path[index],path[index+1]]);if(boundsOverlap2(segmentBounds,bounds))return!0}return!1},resizeStub=(placement,direction2,targetLength)=>{let[start]=placement.stubTracePath,end=direction2==="x+"?{x:start.x+targetLength,y:start.y}:direction2==="x-"?{x:start.x-targetLength,y:start.y}:direction2==="y+"?{x:start.x,y:start.y+targetLength}:{x:start.x,y:start.y-targetLength},anchorPoint={x:(start.x+end.x)/2,y:(start.y+end.y)/2};return{...placement,stubTracePath:[start,end],anchorPoint,center:placement.center}},alignPortOnlyInlineNetLabelStubs=({placements,inputProblem,traces,netLabelPlacements})=>{let chipIdByPinId=new Map;for(let chip of inputProblem.chips)for(let pin of chip.pins)chipIdByPinId.set(pin.pinId,chip.chipId);let groups=new Map;for(let[placementIndex,placement]of placements.entries()){if(!placement.stubTracePath||placement.pinIds.length!==1)continue;let direction2=getStubDirection(placement.stubTracePath);if(!direction2)continue;let ownerChipId=chipIdByPinId.get(placement.pinIds[0]),groupKey=`${ownerChipId??placement.pinIds[0]}::${direction2}`,group2=groups.get(groupKey)??[];group2.push({placementIndex,placement,direction:direction2,ownerChipId}),groups.set(groupKey,group2)}let alignedPlacements=[...placements],retainedAnchoredLabelBounds=netLabelPlacements.filter(placement=>!isLabelRepresentedInline(placement,placements)).map(getLabelBounds2);for(let group2 of groups.values()){if(group2.length<2)continue;let targetLength=Math.max(...group2.map(({placement})=>getStubLength(placement.stubTracePath))),proposals=group2.map(({placement,direction:direction2})=>resizeStub(placement,direction2,targetLength)),groupPlacementIndices=new Set(group2.map(({placementIndex})=>placementIndex)),fixedInlinePlacements=placements.filter((_22,placementIndex)=>!groupPlacementIndices.has(placementIndex));if(!proposals.some((proposal,proposalIndex)=>{let labelBounds=getLabelBounds2(proposal),stubPath=proposal.stubTracePath,stubBounds=getPathBounds(stubPath),ownerChipId=group2[proposalIndex].ownerChipId;for(let chip of inputProblem.chips){let chipBounds={minX:chip.center.x-chip.width/2,maxX:chip.center.x+chip.width/2,minY:chip.center.y-chip.height/2,maxY:chip.center.y+chip.height/2};if(boundsOverlap2(labelBounds,chipBounds)||chip.chipId!==ownerChipId&&boundsOverlap2(stubBounds,chipBounds))return!0}for(let textBox of inputProblem.textBoxes??[]){let textBounds=getTextBoxBounds(textBox);if(boundsOverlap2(labelBounds,textBounds)||boundsOverlap2(stubBounds,textBounds))return!0}for(let trace of traces)if(trace.globalConnNetId!==proposal.globalConnNetId&&(doesPathIntersectBounds(trace.tracePath,labelBounds)||doesPathIntersectBounds(trace.tracePath,stubBounds)))return!0;if(retainedAnchoredLabelBounds.some(bounds=>boundsOverlap2(labelBounds,bounds)||boundsOverlap2(stubBounds,bounds)))return!0;for(let fixedPlacement of fixedInlinePlacements){let fixedLabelBounds=getLabelBounds2(fixedPlacement);if(boundsOverlap2(labelBounds,fixedLabelBounds)||boundsOverlap2(stubBounds,fixedLabelBounds)||fixedPlacement.stubTracePath&&(doesPathIntersectBounds(fixedPlacement.stubTracePath,labelBounds)||doesPathIntersectBounds(stubPath,fixedLabelBounds)))return!0}for(let[otherIndex,otherProposal]of proposals.entries()){if(otherIndex===proposalIndex)continue;let otherLabelBounds=getLabelBounds2(otherProposal);if(boundsOverlap2(labelBounds,otherLabelBounds)||doesPathIntersectBounds(stubPath,otherLabelBounds))return!0}return!1}))for(let[groupIndex,{placementIndex}]of group2.entries())alignedPlacements[placementIndex]=proposals[groupIndex]}return alignedPlacements},getAxisAlignedSegments2=(path,epsilon=1e-6)=>{let segments=[],runStart=null,runAxis=null,runSign=0,closeRun=runEnd=>{if(runStart&&runAxis){let length8=Math.abs(runAxis==="x"?runEnd.x-runStart.x:runEnd.y-runStart.y);length8>epsilon&&segments.push({start:runStart,end:runEnd,axis:runAxis,length:length8})}runStart=null,runAxis=null,runSign=0};for(let i22=0;i22<path.length-1;i22++){let a22=path[i22],b22=path[i22+1],dx22=b22.x-a22.x,dy22=b22.y-a22.y;if(Math.abs(dx22)<=epsilon&&Math.abs(dy22)<=epsilon)continue;let axis=Math.abs(dy22)<=epsilon?"x":Math.abs(dx22)<=epsilon?"y":null;if(!axis){closeRun(a22);continue}let sign=Math.sign(axis==="x"?dx22:dy22);runStart&&runAxis===axis&&runSign===sign||(closeRun(a22),runStart=a22,runAxis=axis,runSign=sign)}return path.length>=2&&closeRun(path[path.length-1]),segments.sort((a22,b22)=>b22.length-a22.length)},LABEL_CLEARANCE2=.05,POINT_EPSILON=1e-6,CONTIGUOUS_LABEL_GAP=.01,MAX_OUTWARD_DISTANCE=5,getInlineBounds=placement=>{let renderedWidth=placement.axis==="y"?placement.height:placement.width,renderedHeight=placement.axis==="y"?placement.width:placement.height;return{minX:placement.center.x-renderedWidth/2,maxX:placement.center.x+renderedWidth/2,minY:placement.center.y-renderedHeight/2,maxY:placement.center.y+renderedHeight/2}},pointsEqual42=(a22,b22)=>Math.abs(a22.x-b22.x)<=POINT_EPSILON&&Math.abs(a22.y-b22.y)<=POINT_EPSILON,pathIntersectsBounds=(path,bounds)=>{for(let index=0;index<path.length-1;index++){let start=path[index],end=path[index+1],segmentBounds={minX:Math.min(start.x,end.x),maxX:Math.max(start.x,end.x),minY:Math.min(start.y,end.y),maxY:Math.max(start.y,end.y)};if(boundsOverlap2(segmentBounds,bounds))return!0}return!1},isPointOnPath2=(point62,path)=>{for(let index=0;index<path.length-1;index++){let start=path[index],end=path[index+1],minX=Math.min(start.x,end.x)-POINT_EPSILON,maxX=Math.max(start.x,end.x)+POINT_EPSILON,minY=Math.min(start.y,end.y)-POINT_EPSILON,maxY=Math.max(start.y,end.y)+POINT_EPSILON,isHorizontal5=Math.abs(start.y-end.y)<=POINT_EPSILON,isVertical6=Math.abs(start.x-end.x)<=POINT_EPSILON;if((isHorizontal5&&Math.abs(point62.y-start.y)<=POINT_EPSILON||isVertical6&&Math.abs(point62.x-start.x)<=POINT_EPSILON)&&point62.x>=minX&&point62.x<=maxX&&point62.y>=minY&&point62.y<=maxY)return!0}return!1},getRequiredOutwardDistance=(label,inlineBounds)=>{let distance33=0;for(let iteration=0;iteration<inlineBounds.length;iteration++){let labelBounds=getAnchoredNetLabelRenderedBounds(moveLabel(label,label.orientation,distance33)),horizontal=label.orientation==="x-"||label.orientation==="x+",overlapping=inlineBounds.filter(bounds=>boundsOverlap2(labelBounds,{minX:bounds.minX-(horizontal?LABEL_CLEARANCE2:0),maxX:bounds.maxX+(horizontal?LABEL_CLEARANCE2:0),minY:bounds.minY-(horizontal?0:LABEL_CLEARANCE2),maxY:bounds.maxY+(horizontal?0:LABEL_CLEARANCE2)}));if(overlapping.length===0)break;switch(label.orientation){case"x-":distance33+=labelBounds.maxX-Math.min(...overlapping.map(b22=>b22.minX))+LABEL_CLEARANCE2;break;case"x+":distance33+=Math.max(...overlapping.map(b22=>b22.maxX))-labelBounds.minX+LABEL_CLEARANCE2;break;case"y-":distance33+=labelBounds.maxY-Math.min(...overlapping.map(b22=>b22.minY))+LABEL_CLEARANCE2;break;case"y+":distance33+=Math.max(...overlapping.map(b22=>b22.maxY))-labelBounds.minY+LABEL_CLEARANCE2;break}}return distance33},moveLabel=(label,orientation22,distance33)=>{let direction2=dir(orientation22);return{...label,anchorPoint:{x:label.anchorPoint.x+direction2.x*distance33,y:label.anchorPoint.y+direction2.y*distance33},center:{x:label.center.x+direction2.x*distance33,y:label.center.y+direction2.y*distance33}}},getDistanceToShoveBoundsPast=(obstacleBounds,movingBounds,orientation22)=>{switch(orientation22){case"x-":return obstacleBounds.maxX-movingBounds.minX+LABEL_CLEARANCE2;case"x+":return movingBounds.maxX-obstacleBounds.minX+LABEL_CLEARANCE2;case"y-":return obstacleBounds.maxY-movingBounds.minY+LABEL_CLEARANCE2;case"y+":return movingBounds.maxY-obstacleBounds.minY+LABEL_CLEARANCE2}},boundsGapOnPerpendicularAxis=(a22,b22,orientation22)=>orientation22==="x-"||orientation22==="x+"?Math.max(0,a22.minY-b22.maxY,b22.minY-a22.maxY):Math.max(0,a22.minX-b22.maxX,b22.minX-a22.maxX),sharesOwnerChip=(label,ownerChipIds,chipIdByPinId)=>label.pinIds.some(pinId=>ownerChipIds.has(chipIdByPinId.get(pinId)??"")),findConnectorTraceIndex=(label,traces,connectorTraceIds)=>traces.findIndex(trace=>{if(trace.globalConnNetId!==label.globalConnNetId||!connectorTraceIds.has(trace.mspPairId))return!1;let first=trace.tracePath[0],last=trace.tracePath.at(-1);return!!(first&&pointsEqual42(first,label.anchorPoint)||last&&pointsEqual42(last,label.anchorPoint))}),canAddConnectorAtAnchor=(label,traces,pinMap)=>label.pinIds.some(pinId=>{let pin=pinMap[pinId];return pin&&pointsEqual42(pin,label.anchorPoint)})?!0:traces.some(trace=>trace.globalConnNetId===label.globalConnNetId&&isPointOnPath2(label.anchorPoint,trace.tracePath)),moveConnectorEndpoint=(trace,oldAnchor,newAnchor)=>{let tracePath=trace.tracePath.map(point62=>({...point62}));return pointsEqual42(tracePath[0],oldAnchor)&&(tracePath[0]=newAnchor),pointsEqual42(tracePath.at(-1),oldAnchor)&&(tracePath[tracePath.length-1]=newAnchor),{...trace,tracePath}},createConnectorTrace=({label,labelIndex,newAnchor,pinMap})=>{let mspPairId=`inline-net-label-clearance-${labelIndex}-${label.netId??label.globalConnNetId}`;return{mspPairId,dcConnNetId:label.dcConnNetId??label.globalConnNetId,globalConnNetId:label.globalConnNetId,userNetId:label.netId,pins:getTracePins(label,pinMap),tracePath:[label.anchorPoint,newAnchor],mspConnectionPairIds:[mspPairId],pinIds:label.pinIds}},getContiguousLabelGroup=({triggerIndex,labels,chipIdByPinId})=>{let trigger=labels[triggerIndex],ownerChipIds=new Set(trigger.pinIds.flatMap(pinId=>{let chipId=chipIdByPinId.get(pinId);return chipId?[chipId]:[]})),candidates=labels.map((label,labelIndex)=>({label,labelIndex})).filter(({label})=>label.orientation===trigger.orientation&&label.mspConnectionPairIds.length===0&&sharesOwnerChip(label,ownerChipIds,chipIdByPinId)),group2=new Set([triggerIndex]),changed=!0;for(;changed;){changed=!1;for(let{label,labelIndex}of candidates)group2.has(labelIndex)||[...group2].some(memberIndex=>boundsGapOnPerpendicularAxis(getAnchoredNetLabelRenderedBounds(labels[memberIndex]),getAnchoredNetLabelRenderedBounds(label),trigger.orientation)<=CONTIGUOUS_LABEL_GAP)&&(group2.add(labelIndex),changed=!0)}return{group:group2,ownerChipIds}},pushAnchoredNetLabelsAwayFromInlineLabels=({inputProblem,traces,netLabelPlacements,inlineNetLabelPlacements,netLabelConnectorTraceIds=new Set})=>{let connectorTraceIds=new Set(netLabelConnectorTraceIds),outputTraces=traces.map(trace=>({...trace,tracePath:trace.tracePath.map(point62=>({...point62}))})),outputLabels=netLabelPlacements.map(label=>({...label})),inlineBounds=inlineNetLabelPlacements.map(getInlineBounds),pinMap=getPinMap(inputProblem),chipIdByPinId=new Map;for(let chip of inputProblem.chips)for(let pin of chip.pins)chipIdByPinId.set(pin.pinId,chip.chipId);let movedLabelIndices=new Set;for(let triggerIndex=0;triggerIndex<outputLabels.length;triggerIndex++){let trigger=outputLabels[triggerIndex],distance33=getRequiredOutwardDistance(trigger,inlineBounds);if(distance33<=POINT_EPSILON||distance33>MAX_OUTWARD_DISTANCE)continue;let{group:group2,ownerChipIds}=getContiguousLabelGroup({triggerIndex,labels:outputLabels,chipIdByPinId}),distances=new Map([...group2].map(labelIndex=>[labelIndex,distance33])),failed=!1;for(let iteration=0;iteration<outputLabels.length;iteration++){let adjustedObstacle=!1;for(let[movingIndex,movingDistance]of distances){let movingBounds=getAnchoredNetLabelRenderedBounds(moveLabel(outputLabels[movingIndex],trigger.orientation,movingDistance));for(let obstacleIndex=0;obstacleIndex<outputLabels.length;obstacleIndex++){if(obstacleIndex===movingIndex||group2.has(obstacleIndex))continue;let obstacle=outputLabels[obstacleIndex],existingObstacleDistance=distances.get(obstacleIndex)??0,obstacleBounds=getAnchoredNetLabelRenderedBounds(moveLabel(obstacle,trigger.orientation,existingObstacleDistance));if(!boundsOverlap2(movingBounds,obstacleBounds))continue;if(!sharesOwnerChip(obstacle,ownerChipIds,chipIdByPinId)||findConnectorTraceIndex(obstacle,outputTraces,connectorTraceIds)===-1&&!canAddConnectorAtAnchor(obstacle,outputTraces,pinMap)){failed=!0;break}let shoveDistance=getDistanceToShoveBoundsPast(getAnchoredNetLabelRenderedBounds(obstacle),movingBounds,trigger.orientation);if(shoveDistance>MAX_OUTWARD_DISTANCE||shoveDistance<=existingObstacleDistance+POINT_EPSILON){failed=!0;break}distances.set(obstacleIndex,shoveDistance),adjustedObstacle=!0}if(failed)break}if(failed||!adjustedObstacle)break}if(failed)continue;let proposals=new Map;for(let[labelIndex,labelDistance]of distances)proposals.set(labelIndex,moveLabel(outputLabels[labelIndex],trigger.orientation,labelDistance));let finalLabelAt=labelIndex=>proposals.get(labelIndex)??outputLabels[labelIndex];for(let[labelIndex,movedLabel]of proposals){let movedBounds=getAnchoredNetLabelRenderedBounds(movedLabel);if(inlineBounds.some(bounds=>boundsOverlap2(movedBounds,bounds))){failed=!0;break}if(inputProblem.chips.some(chip=>boundsOverlap2(movedBounds,{minX:chip.center.x-chip.width/2,maxX:chip.center.x+chip.width/2,minY:chip.center.y-chip.height/2,maxY:chip.center.y+chip.height/2}))||(inputProblem.textBoxes??[]).some(textBox=>boundsOverlap2(movedBounds,getTextBoxBounds(textBox)))){failed=!0;break}if(outputLabels.some((_22,otherIndex)=>otherIndex!==labelIndex&&boundsOverlap2(movedBounds,getAnchoredNetLabelRenderedBounds(finalLabelAt(otherIndex))))){failed=!0;break}if(outputTraces.some(trace=>trace.globalConnNetId!==movedLabel.globalConnNetId&&pathIntersectsBounds(trace.tracePath,movedBounds))){failed=!0;break}}if(failed)continue;let connectorUpdates=[];for(let[labelIndex,movedLabel]of proposals){let label=outputLabels[labelIndex],connectorIndex=findConnectorTraceIndex(label,outputTraces,connectorTraceIds);if(connectorIndex===-1&&!canAddConnectorAtAnchor(label,outputTraces,pinMap)){failed=!0;break}let connector=connectorIndex===-1?createConnectorTrace({label,labelIndex,newAnchor:movedLabel.anchorPoint,pinMap}):moveConnectorEndpoint(outputTraces[connectorIndex],label.anchorPoint,movedLabel.anchorPoint);if(connector.tracePath.slice(1).some((end,index)=>{let start=connector.tracePath[index];return Math.abs(end.x-start.x)>POINT_EPSILON&&Math.abs(end.y-start.y)>POINT_EPSILON})||outputTraces.some(trace=>trace.globalConnNetId!==connector.globalConnNetId&&findPerpendicularPathCrossings(connector.tracePath,trace.tracePath,{includeTerminalSegments:!0}).length>0)||inlineBounds.some(bounds=>pathIntersectsBounds(connector.tracePath,bounds))||inputProblem.chips.some(chip=>!ownerChipIds.has(chip.chipId)&&pathIntersectsBounds(connector.tracePath,{minX:chip.center.x-chip.width/2,maxX:chip.center.x+chip.width/2,minY:chip.center.y-chip.height/2,maxY:chip.center.y+chip.height/2}))||(inputProblem.textBoxes??[]).some(textBox=>pathIntersectsBounds(connector.tracePath,getTextBoxBounds(textBox)))||outputLabels.some((_22,otherIndex)=>otherIndex!==labelIndex&&pathIntersectsBounds(connector.tracePath,getAnchoredNetLabelRenderedBounds(finalLabelAt(otherIndex))))){failed=!0;break}connectorUpdates.push({labelIndex,connectorIndex,trace:connector})}if(!failed){for(let[labelIndex,movedLabel]of proposals)outputLabels[labelIndex]=movedLabel,movedLabelIndices.add(labelIndex);for(let update of connectorUpdates)connectorTraceIds.add(update.trace.mspPairId),update.connectorIndex===-1?outputTraces.push(update.trace):outputTraces[update.connectorIndex]=update.trace}}return{traces:outputTraces,netLabelPlacements:outputLabels,movedLabelCount:movedLabelIndices.size,netLabelConnectorTraceIds:connectorTraceIds}},LABEL_CLEARANCE3=.05,MAX_OUTWARD_DISTANCE2=5,getStubDirection2=path=>{let[start,end]=path;return Math.abs(end.x-start.x)>=Math.abs(end.y-start.y)?end.x>=start.x?"x+":"x-":end.y>=start.y?"y+":"y-"},getInlineLabelBounds=placement=>{let renderedWidth=placement.axis==="y"?placement.height:placement.width,renderedHeight=placement.axis==="y"?placement.width:placement.height;return{minX:placement.center.x-renderedWidth/2,maxX:placement.center.x+renderedWidth/2,minY:placement.center.y-renderedHeight/2,maxY:placement.center.y+renderedHeight/2}},getPathBounds2=path=>({minX:Math.min(...path.map(point62=>point62.x)),maxX:Math.max(...path.map(point62=>point62.x)),minY:Math.min(...path.map(point62=>point62.y)),maxY:Math.max(...path.map(point62=>point62.y))}),doesPathIntersectBounds2=(path,bounds)=>{for(let index=0;index<path.length-1;index++)if(boundsOverlap2(getPathBounds2([path[index],path[index+1]]),bounds))return!0;return!1},shiftPoint=(point62,direction2,distance33)=>{switch(direction2){case"x+":return{x:point62.x+distance33,y:point62.y};case"x-":return{x:point62.x-distance33,y:point62.y};case"y+":return{x:point62.x,y:point62.y+distance33};case"y-":return{x:point62.x,y:point62.y-distance33}}},shiftTerminalPlacement=(placement,direction2,distance33)=>{let[start,end]=placement.stubTracePath,shiftedEnd=shiftPoint(end,direction2,distance33);return{...placement,stubTracePath:[start,shiftedEnd],anchorPoint:shiftPoint(placement.anchorPoint,direction2,distance33),center:shiftPoint(placement.center,direction2,distance33)}},getRequiredOutwardDistance2=(movingBounds,obstacleBounds,direction2)=>{switch(direction2){case"x+":return obstacleBounds.maxX-movingBounds.minX+LABEL_CLEARANCE3;case"x-":return movingBounds.maxX-obstacleBounds.minX+LABEL_CLEARANCE3;case"y+":return obstacleBounds.maxY-movingBounds.minY+LABEL_CLEARANCE3;case"y-":return movingBounds.maxY-obstacleBounds.minY+LABEL_CLEARANCE3}},pushInlineTerminalLabelsAwayFromAnchoredLabels=({inputProblem,traces,anchoredNetLabelPlacements,inlineNetLabelPlacements})=>{let chipIdByPinId=new Map;for(let chip of inputProblem.chips)for(let pin of chip.pins)chipIdByPinId.set(pin.pinId,chip.chipId);let groups=new Map;for(let[placementIndex,placement]of inlineNetLabelPlacements.entries()){if(!placement.stubTracePath||placement.pinIds.length!==1)continue;let direction2=getStubDirection2(placement.stubTracePath),ownerChipId=chipIdByPinId.get(placement.pinIds[0]),groupKey=`${ownerChipId??placement.pinIds[0]}::${direction2}`,group2=groups.get(groupKey)??[];group2.push({placementIndex,placement,direction:direction2,ownerChipId}),groups.set(groupKey,group2)}let outputPlacements=[...inlineNetLabelPlacements],movedGroupCount=0;for(let group2 of groups.values()){let groupPlacementIndices=new Set(group2.map(({placementIndex})=>placementIndex)),fixedInlinePlacements=outputPlacements.filter((_22,placementIndex)=>!groupPlacementIndices.has(placementIndex)),direction2=group2[0].direction,distance33=0;for(let iteration=0;iteration<=anchoredNetLabelPlacements.length;iteration++){let requiredAdditionalDistance=0;for(let{placement}of group2){let shiftedPlacement=shiftTerminalPlacement(placement,direction2,distance33),shiftedBounds=getInlineLabelBounds(shiftedPlacement);for(let anchoredPlacement of anchoredNetLabelPlacements){if(anchoredPlacement.globalConnNetId===placement.globalConnNetId)continue;let anchoredBounds=getAnchoredNetLabelRenderedBounds(anchoredPlacement);boundsOverlap2(shiftedBounds,anchoredBounds)&&(requiredAdditionalDistance=Math.max(requiredAdditionalDistance,getRequiredOutwardDistance2(shiftedBounds,anchoredBounds,direction2)))}}if(requiredAdditionalDistance<=0)break;distance33+=requiredAdditionalDistance}if(distance33<=0||distance33>MAX_OUTWARD_DISTANCE2)continue;let proposals=group2.map(({placement})=>shiftTerminalPlacement(placement,direction2,distance33));if(!proposals.some((proposal,proposalIndex)=>{let originalEnd=group2[proposalIndex].placement.stubTracePath[1],shiftedEnd=proposal.stubTracePath[1],addedStubSegment=[originalEnd,shiftedEnd],labelBounds=getInlineLabelBounds(proposal),ownerChipId=group2[proposalIndex].ownerChipId;if(anchoredNetLabelPlacements.some(anchoredPlacement=>{if(anchoredPlacement.globalConnNetId===proposal.globalConnNetId)return!1;let anchoredBounds=getAnchoredNetLabelRenderedBounds(anchoredPlacement);return boundsOverlap2(labelBounds,anchoredBounds)||doesPathIntersectBounds2(addedStubSegment,anchoredBounds)}))return!0;for(let chip of inputProblem.chips){if(chip.chipId===ownerChipId)continue;let chipBounds={minX:chip.center.x-chip.width/2,maxX:chip.center.x+chip.width/2,minY:chip.center.y-chip.height/2,maxY:chip.center.y+chip.height/2};if(boundsOverlap2(labelBounds,chipBounds)||doesPathIntersectBounds2(addedStubSegment,chipBounds))return!0}for(let textBox of inputProblem.textBoxes??[]){let textBounds=getTextBoxBounds(textBox);if(boundsOverlap2(labelBounds,textBounds)||doesPathIntersectBounds2(addedStubSegment,textBounds))return!0}for(let trace of traces)if(trace.globalConnNetId!==proposal.globalConnNetId&&(doesPathIntersectBounds2(trace.tracePath,labelBounds)||doesPathIntersectBounds2(trace.tracePath,getPathBounds2(addedStubSegment))))return!0;for(let fixedPlacement of fixedInlinePlacements){let fixedBounds=getInlineLabelBounds(fixedPlacement);if(boundsOverlap2(labelBounds,fixedBounds)||doesPathIntersectBounds2(addedStubSegment,fixedBounds)||fixedPlacement.stubTracePath&&doesPathIntersectBounds2(fixedPlacement.stubTracePath,labelBounds))return!0}return!1})){for(let[groupIndex,{placementIndex}]of group2.entries())outputPlacements[placementIndex]=proposals[groupIndex];movedGroupCount++}}return{inlineNetLabelPlacements:outputPlacements,movedGroupCount}},pathIntersectsRenderedLabel=(path,label)=>{let width=label.width,height=label.height;"axis"in label&&label.axis==="y"&&(width=label.height,height=label.width);let bounds=getBoundFromCenteredRect2({center:label.center,width,height});for(let pathIndex=0;pathIndex<path.length-1;pathIndex++)if(doesSegmentIntersectRect2(path[pathIndex],path[pathIndex+1],bounds))return!0;return!1},EPS17=1e-6,getPathLength7=path=>path.slice(1).reduce((length8,point62,pointIndex)=>{let previousPoint=path[pointIndex];return length8+Math.abs(point62.x-previousPoint.x)+Math.abs(point62.y-previousPoint.y)},0),pathsEqual=(first,second)=>first.length===second.length&&first.every((point62,index)=>Math.abs(point62.x-second[index].x)<=EPS17&&Math.abs(point62.y-second[index].y)<=EPS17),isStrictlySimpler=(candidate,current3)=>candidate.length<current3.length&&getPathLength7(candidate)<=getPathLength7(current3)+EPS17,getIntersectionKeys=(path,otherPath)=>{let intersections2=new Set;for(let pathIndex=0;pathIndex<path.length-1;pathIndex++)for(let otherPathIndex=0;otherPathIndex<otherPath.length-1;otherPathIndex++){let point62=getSegmentIntersection2(path[pathIndex],path[pathIndex+1],otherPath[otherPathIndex],otherPath[otherPathIndex+1]);point62&&intersections2.add(`${point62.x.toFixed(6)},${point62.y.toFixed(6)}`)}return intersections2},introducesNewCrossings=(candidatePath,currentPath,otherPaths)=>otherPaths.some(otherPath=>{let currentIntersections=getIntersectionKeys(currentPath,otherPath);return[...getIntersectionKeys(candidatePath,otherPath)].some(intersection=>!currentIntersections.has(intersection))}),restoreReroutesAroundSupersededLabels=({inputProblem,traces,netLabelPlacements,inlineNetLabelPlacements,completedReroutes})=>{let outputTraces=[...traces],supersededLabelGlobalConnNetIds=new Set(inlineNetLabelPlacements.map(placement=>placement.globalConnNetId)),obstacles=getObstacleRects(inputProblem),restoredTraceCount=0;for(let reroute of[...completedReroutes].reverse()){if(!supersededLabelGlobalConnNetIds.has(reroute.label.globalConnNetId))continue;let traceIndex=outputTraces.findIndex(trace=>trace.mspPairId===reroute.initialTrace.mspPairId);if(traceIndex<0)continue;let currentTrace=outputTraces[traceIndex],currentPath=simplifyPath(currentTrace.tracePath),recordedReroutePath=simplifyPath(reroute.reroutedTracePath);if(!pathsEqual(currentPath,recordedReroutePath))continue;let candidatePath=simplifyPath(reroute.initialTrace.tracePath);if(!isStrictlySimpler(candidatePath,currentPath))continue;let candidateTrace={...currentTrace,tracePath:candidatePath},otherNetTraces=outputTraces.filter(trace=>trace.mspPairId!==currentTrace.mspPairId&&trace.globalConnNetId!==currentTrace.globalConnNetId),otherNetInlineLabels=inlineNetLabelPlacements.filter(label=>label.globalConnNetId!==currentTrace.globalConnNetId),otherNetInlineStubPaths=otherNetInlineLabels.flatMap(label=>label.stubTracePath?[[...label.stubTracePath]]:[]);isPathCollidingWithObstacles(candidatePath,obstacles)||detectTraceLabelOverlap({traces:[candidateTrace],netLabels:netLabelPlacements}).length>0||otherNetInlineLabels.some(label=>pathIntersectsRenderedLabel(candidatePath,label))||doesPathCoincideWithTraces(candidatePath,otherNetTraces)||doesPathCoincideWithPaths(candidatePath,otherNetInlineStubPaths)||introducesNewCrossings(candidatePath,currentPath,otherNetTraces.map(trace=>trace.tracePath))||introducesNewCrossings(candidatePath,currentPath,otherNetInlineStubPaths)||!preservesLabelAnchors(netLabelPlacements,[currentTrace],[candidateTrace])||(outputTraces[traceIndex]=candidateTrace,restoredTraceCount++)}return{traces:outputTraces,restoredTraceCount}},DEFAULT_INLINE_NET_LABEL_HEIGHT=.18,INLINE_NET_LABEL_TRACE_MARGIN=.05,INLINE_NET_LABEL_STUB_TRACE_CLEARANCE=.05,INLINE_NET_LABEL_MAX_SPAN_JOG=.4,getPinPairKey2=pinIds=>JSON.stringify([...pinIds].sort()),getTraceLength22=trace=>{let length8=0;for(let index=0;index<trace.tracePath.length-1;index++){let start=trace.tracePath[index],end=trace.tracePath[index+1];length8+=Math.abs(end.x-start.x)+Math.abs(end.y-start.y)}return length8},setsEqual=(first,second)=>first.size===second.size&&[...first].every(value=>second.has(value)),getInlinePlacementBounds=placement=>{let renderedWidth=placement.axis==="y"?placement.height:placement.width,renderedHeight=placement.axis==="y"?placement.width:placement.height;return{minX:placement.center.x-renderedWidth/2,maxX:placement.center.x+renderedWidth/2,minY:placement.center.y-renderedHeight/2,maxY:placement.center.y+renderedHeight/2}},getInlinePlacementKey=placement=>JSON.stringify([placement.globalConnNetId,[...placement.pinIds].sort(),placement.mspPairId??null]),terminalStubIntersectsTrace=(path,trace)=>{let clearance=INLINE_NET_LABEL_STUB_TRACE_CLEARANCE-GEOMETRY_EPSILON2,bounds={minX:Math.min(path[0].x,path[1].x)-clearance,maxX:Math.max(path[0].x,path[1].x)+clearance,minY:Math.min(path[0].y,path[1].y)-clearance,maxY:Math.max(path[0].y,path[1].y)+clearance};return doesPathIntersectBounds3(trace.tracePath,bounds)},InlineNetLabelSolver=class _InlineNetLabelSolver extends BaseSolver10{constructor(input2){super();__publicField(this,"input");__publicField(this,"inputProblem");__publicField(this,"traces");__publicField(this,"inputNetLabelPlacements");__publicField(this,"completedReroutes");__publicField(this,"inlineNetLabelPlacements",[]);__publicField(this,"queuedConnections");__publicField(this,"netLabelConnectorTraceIds");__publicField(this,"tracesByPinPairKey");__publicField(this,"globalConnMap");__publicField(this,"inlineConversions",[]);__publicField(this,"hasAlignedPortOnlyStubs",!1);__publicField(this,"postProcessedOutput");__publicField(this,"refinementComplete",!1);__publicField(this,"refinement");__publicField(this,"currentProposal");this.input=input2,this.netLabelConnectorTraceIds=input2.netLabelConnectorTraceIds??new Set,this.inputProblem=input2.inputProblem,this.traces=input2.traces,this.inputNetLabelPlacements=input2.netLabelPlacements,this.completedReroutes=input2.completedReroutes??[],this.globalConnMap=getConnectivityMapsFromInputProblem(this.inputProblem).netConnMap,this.queuedConnections=[...this.inputProblem.directConnections.filter(connection=>connection.allowInlineNetLabel&&connection.netId&&!this.inputProblem.netConnections.some(net=>net.allowInlineNetLabel&&net.netId&&connection.pinIds.every(pin=>net.pinIds.includes(pin)))).map(connection=>({kind:"direct_connection",connection})),...this.inputProblem.netConnections.filter(connection=>connection.allowInlineNetLabel&&connection.pinIds.length>=1&&connection.netId).map(connection=>({kind:"net_connection",connection}))],this.tracesByPinPairKey=new Map;for(let trace of this.traces){if(this.netLabelConnectorTraceIds.has(trace.mspPairId))continue;let key=getPinPairKey2(trace.pins.map(p22=>p22.pinId)),existing=this.tracesByPinPairKey.get(key);existing?existing.push(trace):this.tracesByPinPairKey.set(key,[trace])}}getConstructorParams(){return[{inputProblem:this.inputProblem,traces:this.traces,netLabelPlacements:this.inputNetLabelPlacements,completedReroutes:this.completedReroutes,resolveTraceCollisions:this.input.resolveTraceCollisions,netLabelConnectorTraceIds:this.netLabelConnectorTraceIds}]}_step(){let queuedConnection=this.queuedConnections.shift();if(queuedConnection){if(queuedConnection.kind==="net_connection"&&queuedConnection.connection.pinIds.length>2){let netConnections=[queuedConnection.connection,...this.queuedConnections.filter(queued=>queued.kind==="net_connection"&&queued.connection.pinIds.length>2).map(queued=>queued.connection)];this.queuedConnections=this.queuedConnections.filter(queued=>queued.kind!=="net_connection"||queued.connection.pinIds.length<=2);for(let conversion of this.computeNetConnectionInlineConversions(netConnections))this.inlineNetLabelPlacements.push(...conversion.placements),this.inlineConversions.push(conversion);return}let{connection}=queuedConnection,routedTraces=connection.pinIds.length===2?this.tracesByPinPairKey.get(getPinPairKey2(connection.pinIds))??[]:[];if(routedTraces.length>0){let placement=this.computeInlinePlacement({connection,trace:routedTraces[0],pinIds:connection.pinIds});placement&&this.inlineNetLabelPlacements.push(placement)}else for(let pinId of connection.pinIds){let placement=this.computeTerminalInlinePlacement(connection,pinId);placement&&this.inlineNetLabelPlacements.push(placement)}return}if(!this.hasAlignedPortOnlyStubs){this.inlineNetLabelPlacements=alignPortOnlyInlineNetLabelStubs({placements:this.inlineNetLabelPlacements,inputProblem:this.inputProblem,traces:this.traces,netLabelPlacements:this.inputNetLabelPlacements}),this.hasAlignedPortOnlyStubs=!0;return}if(!this.postProcessedOutput){this.postProcessedOutput=this.buildPostProcessedOutput();return}if(this.input.resolveTraceCollisions&&!this.refinementComplete){this.stepTraceRefinement();return}this.solved=!0,this.stats.inlineNetLabelCount=this.inlineNetLabelPlacements.length}computeNetConnectionInlineConversions(connections){let prospectiveTraceIdsByConnection=new Map;for(let connection of connections){let prospectiveTraceIds=new Set;for(let component of this.getNetConnectionComponents(connection)){if(component.traces.length===0)continue;if(!component.traces.some(trace=>!!this.computeInlinePlacement({connection,trace,pinIds:component.pinIds})))for(let trace of component.traces)prospectiveTraceIds.add(trace.mspPairId)}prospectiveTraceIdsByConnection.set(connection,prospectiveTraceIds)}let ignoredTraceIds=new Set([...prospectiveTraceIdsByConnection.values()].flatMap(ids=>[...ids]));for(;;){let conversions=connections.map(connection=>({connection,conversion:this.computeNetConnectionInlinePlacements(connection,ignoredTraceIds,prospectiveTraceIdsByConnection.get(connection)??new Set)})),nextIgnoredTraceIds=new Set(conversions.flatMap(({conversion})=>conversion.flatMap(component=>[...component.supersededTraceIds])));if(setsEqual(ignoredTraceIds,nextIgnoredTraceIds))return conversions.flatMap(({conversion})=>conversion);ignoredTraceIds=nextIgnoredTraceIds}}getNetConnectionComponents(connection){let firstPinId=connection.pinIds[0];if(!firstPinId)return[];let canonicalGlobalConnNetId=this.globalConnMap.getNetConnectedToId(firstPinId);if(!canonicalGlobalConnNetId)return[];let inputPinIds=new Set(this.inputProblem.chips.flatMap(chip=>chip.pins.map(pin=>pin.pinId))),pinIdsInGlobalNet=this.globalConnMap.getIdsConnectedToNet(canonicalGlobalConnNetId).filter(id3=>inputPinIds.has(id3)),labeledPinIds=new Set(connection.pinIds);return getTraceConnectedPinComponents({pinIds:pinIdsInGlobalNet,traces:this.traces.filter(trace=>!this.netLabelConnectorTraceIds.has(trace.mspPairId))}).map(component=>({pinIds:component.pinIds,labeledPinIds:component.pinIds.filter(pinId=>labeledPinIds.has(pinId)),traces:component.traces.sort((a22,b22)=>getTraceLength22(b22)-getTraceLength22(a22))})).filter(component=>component.labeledPinIds.length>0)}getGlobalConnNetId(connection){let firstPinId=connection.pinIds[0];if(!firstPinId)return;let connectionPinIds=new Set(connection.pinIds);return this.traces.find(trace=>trace.pins.some(pin=>connectionPinIds.has(pin.pinId)))?.globalConnNetId??this.inputNetLabelPlacements.find(placement=>placement.netId===connection.netId)?.globalConnNetId??this.globalConnMap.getNetConnectedToId(firstPinId)??void 0}computeNetConnectionInlinePlacements(connection,ignoredTraceIds,forcedTerminalTraceIds){let components=this.getNetConnectionComponents(connection),globalConnNetId=this.getGlobalConnNetId(connection);if(!globalConnNetId)return[];let conversions=[];for(let component of components){let shouldUseTerminalStubs=component.traces.some(trace=>forcedTerminalTraceIds.has(trace.mspPairId)),inlinePlacement=null;if(!shouldUseTerminalStubs){for(let trace of component.traces)if(inlinePlacement=this.computeInlinePlacement({connection,trace,pinIds:component.pinIds,ignoredTraceIds}),inlinePlacement)break}if(inlinePlacement){conversions.push({globalConnNetId,placements:[inlinePlacement],supersededTraceIds:new Set});continue}if(component.traces.length>0&&!shouldUseTerminalStubs||component.labeledPinIds.length!==component.pinIds.length)continue;let terminalPlacements=component.pinIds.map(pinId=>this.computeTerminalInlinePlacement(connection,pinId,globalConnNetId,ignoredTraceIds));terminalPlacements.some(placement=>placement===null)||conversions.push({globalConnNetId,placements:terminalPlacements,supersededTraceIds:new Set(component.traces.map(trace=>trace.mspPairId))})}return conversions}getInlineOffsets(anchor,axis,side,width,height,traces,ignoredTraceIds){let normal=height/2+INLINE_NET_LABEL_TRACE_MARGIN,across=axis==="x"?"y":"x",sign=side==="x+"||side==="y+"?1:-1,gap=1/0;for(let trace of traces)if(!ignoredTraceIds.has(trace.mspPairId))for(let segment2 of getAxisAlignedSegments2(trace.tracePath)){if(segment2.axis!==axis||Math.max(segment2.start[axis],segment2.end[axis])<=anchor[axis]-width/2||Math.min(segment2.start[axis],segment2.end[axis])>=anchor[axis]+width/2)continue;let distance33=sign*(segment2.start[across]-anchor[across]);distance33>GEOMETRY_EPSILON2&&(gap=Math.min(gap,distance33))}return gap>height+GEOMETRY_EPSILON2&&gap/2<normal-GEOMETRY_EPSILON2?[normal,gap/2]:[normal]}computeTerminalInlinePlacement(connection,pinId,knownGlobalConnNetId,ignoredTraceIds=new Set,obstacles){if(!connection.netId)return null;let anchoredPlacement=this.inputNetLabelPlacements.find(placement=>placement.netId===connection.netId&&placement.pinIds.length===1&&placement.pinIds[0]===pinId),globalConnNetId=knownGlobalConnNetId??anchoredPlacement?.globalConnNetId;if(!globalConnNetId)return null;let inputChip=this.inputProblem.chips.find(chip=>chip.pins.some(pin=>pin.pinId===pinId)),inputPin=inputChip?.pins.find(pin=>pin.pinId===pinId),height=connection.inlineNetLabelHeight??DEFAULT_INLINE_NET_LABEL_HEIGHT,netLabelText=connection.netLabelText?.trim()||void 0,width=connection.inlineNetLabelWidth??connection.netLabelWidth??estimateInlineNetLabelWidth(netLabelText??connection.netId,height),stubLength=Math.max(width+.2,.6);if(!inputPin&&!anchoredPlacement)return null;let start=inputPin?{x:inputPin.x,y:inputPin.y}:anchoredPlacement.anchorPoint,direction2=inputPin&&inputChip?inputPin._facingDirection??getPinDirection2(inputPin,inputChip):anchoredPlacement.orientation,intendedEnd=direction2==="x+"?{x:start.x+stubLength,y:start.y}:direction2==="x-"?{x:start.x-stubLength,y:start.y}:direction2==="y+"?{x:start.x,y:start.y+stubLength}:{x:start.x,y:start.y-stubLength},end=getCollisionLimitedTerminalStubEnd({start,intendedEnd,minimumLength:width+2*INLINE_NET_LABEL_TRACE_MARGIN,traces:obstacles?.traces??this.traces,ownGlobalConnNetId:globalConnNetId,ignoredTraceIds});if(!end)return null;let axis=direction2==="x+"||direction2==="x-"?"x":"y",anchorPoint={x:(start.x+end.x)/2,y:(start.y+end.y)/2},sides=axis==="x"?["y+","y-"]:["x-","x+"];for(let side of sides)for(let offset of this.getInlineOffsets(anchorPoint,axis,side,width,height,obstacles?.traces??this.traces,ignoredTraceIds)){let center2=side==="y+"?{x:anchorPoint.x,y:anchorPoint.y+offset}:side==="y-"?{x:anchorPoint.x,y:anchorPoint.y-offset}:side==="x-"?{x:anchorPoint.x-offset,y:anchorPoint.y}:{x:anchorPoint.x+offset,y:anchorPoint.y},halfAlong=width/2,halfAcross=height/2,bounds=axis==="x"?{minX:center2.x-halfAlong,maxX:center2.x+halfAlong,minY:center2.y-halfAcross,maxY:center2.y+halfAcross}:{minX:center2.x-halfAcross,maxX:center2.x+halfAcross,minY:center2.y-halfAlong,maxY:center2.y+halfAlong};if(!this.isObstructed(bounds,{ownGlobalConnNetId:globalConnNetId,ignoredTraceIds,obstacles}))return{globalConnNetId,netId:connection.netId,netLabelText,pinIds:[pinId],stubTracePath:[start,end],axis,anchorPoint,center:center2,width,height,side}}return null}computeInlinePlacement({connection,trace,pinIds,ignoredTraceIds=new Set}){let segments=getAxisAlignedSegments2(trace.tracePath);if(segments.length===0)return null;let height=connection.inlineNetLabelHeight??DEFAULT_INLINE_NET_LABEL_HEIGHT,netLabelText=connection.netLabelText?.trim()||void 0,width=connection.inlineNetLabelWidth??connection.netLabelWidth??estimateInlineNetLabelWidth(netLabelText??connection.netId,height),offset=height/2+INLINE_NET_LABEL_TRACE_MARGIN,usableSegments=segments.filter(segment2=>segment2.length>=width).sort((a22,b22)=>b22.length-a22.length);for(let segment2 of usableSegments){let sides=segment2.axis==="x"?["y+","y-"]:["x-","x+"];for(let side of sides)for(let anchorPoint of getAnchorCandidates(segment2,width))for(let offset2 of this.getInlineOffsets(anchorPoint,segment2.axis,side,width,height,this.traces,ignoredTraceIds)){let center2=side==="y+"?{x:anchorPoint.x,y:anchorPoint.y+offset2}:side==="y-"?{x:anchorPoint.x,y:anchorPoint.y-offset2}:side==="x-"?{x:anchorPoint.x-offset2,y:anchorPoint.y}:{x:anchorPoint.x+offset2,y:anchorPoint.y},halfAlong=width/2,halfAcross=height/2,bounds=segment2.axis==="x"?{minX:center2.x-halfAlong,maxX:center2.x+halfAlong,minY:center2.y-halfAcross,maxY:center2.y+halfAcross}:{minX:center2.x-halfAcross,maxX:center2.x+halfAcross,minY:center2.y-halfAlong,maxY:center2.y+halfAlong};if(!this.isObstructed(bounds,{ownTrace:trace,ownGlobalConnNetId:trace.globalConnNetId,ignoredTraceIds}))return{globalConnNetId:trace.globalConnNetId,netId:connection.netId,netLabelText,mspPairId:trace.mspPairId,pinIds:[...pinIds],axis:segment2.axis,anchorPoint,center:center2,width,height,side}}}let spanPlacement=this.computeSpanPlacement({trace,connection,netLabelText,width,height,offset,pinIds,ignoredTraceIds});return spanPlacement||null}computeSpanPlacement({trace,connection,netLabelText,width,height,offset,pinIds,ignoredTraceIds}){let path=trace.tracePath;if(path.length<2)return null;let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point62 of path)minX=Math.min(minX,point62.x),maxX=Math.max(maxX,point62.x),minY=Math.min(minY,point62.y),maxY=Math.max(maxY,point62.y);let extentX=maxX-minX,extentY=maxY-minY,axis=extentX>=extentY?"x":"y",spanLength=axis==="x"?extentX:extentY;if((axis==="x"?extentY:extentX)>INLINE_NET_LABEL_MAX_SPAN_JOG||spanLength<width)return null;let mid=((axis==="x"?minX:minY)+(axis==="x"?maxX:maxY))/2,halfRange=(spanLength-width)/2,offsets=[0];for(let value=.1;value<=halfRange+1e-9;value+=.1)offsets.push(value,-value);offsets.push(halfRange,-halfRange);let sides=axis==="x"?["y+","y-"]:["x-","x+"];for(let side of sides)for(let alongOffset of offsets){let along2=mid+alongOffset,center2=side==="y+"?{x:along2,y:maxY+offset}:side==="y-"?{x:along2,y:minY-offset}:side==="x-"?{x:minX-offset,y:along2}:{x:maxX+offset,y:along2},halfAlong=width/2,halfAcross=height/2,bounds=axis==="x"?{minX:center2.x-halfAlong,maxX:center2.x+halfAlong,minY:center2.y-halfAcross,maxY:center2.y+halfAcross}:{minX:center2.x-halfAcross,maxX:center2.x+halfAcross,minY:center2.y-halfAlong,maxY:center2.y+halfAlong};if(this.isObstructed(bounds,{ownTrace:trace,ownGlobalConnNetId:trace.globalConnNetId,ignoredTraceIds}))continue;let anchorPoint=axis==="x"?{x:along2,y:side==="y+"?maxY:minY}:{x:side==="x-"?minX:maxX,y:along2};return{globalConnNetId:trace.globalConnNetId,netId:connection.netId,netLabelText,mspPairId:trace.mspPairId,pinIds:[...pinIds],axis,anchorPoint,center:center2,width,height,side}}return null}isObstructed(bounds,{ownTrace,ownGlobalConnNetId,ignoredTraceIds=new Set,obstacles}){for(let chip of this.inputProblem.chips){let chipBounds={minX:chip.center.x-chip.width/2,maxX:chip.center.x+chip.width/2,minY:chip.center.y-chip.height/2,maxY:chip.center.y+chip.height/2};if(boundsOverlap2(bounds,chipBounds))return!0}for(let textBox of this.inputProblem.textBoxes??[])if(boundsOverlap2(bounds,getTextBoxBounds(textBox)))return!0;for(let trace of obstacles?.traces??this.traces)if(!ignoredTraceIds.has(trace.mspPairId)&&!(ownTrace&&trace.mspPairId===ownTrace.mspPairId)&&trace.globalConnNetId!==ownGlobalConnNetId&&doesPathIntersectBounds3(trace.tracePath,bounds))return!0;return!!(obstacles?.anchored.some(label=>boundsOverlap2(bounds,getAnchoredNetLabelRenderedBounds(label)))||obstacles?.inline.some(label=>boundsOverlap2(bounds,getInlinePlacementBounds(label))||label.stubTracePath&&label.globalConnNetId!==ownGlobalConnNetId&&doesPathIntersectBounds3(label.stubTracePath,bounds)))}getOutputTraces(placements){let activeKeys=new Set(placements.map(getInlinePlacementKey)),supersededTraceIds=new Set(this.inlineConversions.filter(conversion=>conversion.placements.every(placement=>activeKeys.has(getInlinePlacementKey(placement)))).flatMap(conversion=>[...conversion.supersededTraceIds]));return this.traces.filter(trace=>!supersededTraceIds.has(trace.mspPairId)&&!(this.netLabelConnectorTraceIds.has(trace.mspPairId)&&isLabelRepresentedInline(trace,placements)))}getBlockedInlinePlacements({inlineNetLabelPlacements,anchoredNetLabelPlacements,traces}){let blockedKeys=new Set;for(let inline of inlineNetLabelPlacements){let bounds=getInlinePlacementBounds(inline),blockedByLabel=anchoredNetLabelPlacements.some(anchored=>{let anchoredBounds=getAnchoredNetLabelRenderedBounds(anchored);return boundsOverlap2(bounds,anchoredBounds)||inline.stubTracePath&&doesPathIntersectBounds3(inline.stubTracePath,anchoredBounds)}),blockedByTrace=traces.some(trace=>trace.globalConnNetId!==inline.globalConnNetId&&(doesPathIntersectBounds3(trace.tracePath,bounds)||inline.stubTracePath&&terminalStubIntersectsTrace(inline.stubTracePath,trace))),blockedByInlineWire=inlineNetLabelPlacements.some(other=>other!==inline&&other.globalConnNetId!==inline.globalConnNetId&&other.stubTracePath&&doesPathIntersectBounds3(other.stubTracePath,bounds)),blockedByInlineText=inlineNetLabelPlacements.some(other=>other!==inline&&boundsOverlap2(bounds,getInlinePlacementBounds(other)));(blockedByLabel||blockedByTrace||blockedByInlineWire||blockedByInlineText)&&blockedKeys.add(getInlinePlacementKey(inline))}for(let conversion of this.inlineConversions)if(conversion.placements.some(placement=>blockedKeys.has(getInlinePlacementKey(placement))))for(let placement of conversion.placements)blockedKeys.add(getInlinePlacementKey(placement));return blockedKeys}buildPostProcessedOutput(){let activeInlinePlacements=this.inlineNetLabelPlacements;for(;;){let retainedNetLabelPlacements=this.inputNetLabelPlacements.filter(placement=>!isLabelRepresentedInline(placement,activeInlinePlacements)),outputTraces=this.getOutputTraces(activeInlinePlacements),{fixedLabels,terminalTraces}=getInlineLabelObstacles(this.inputProblem,activeInlinePlacements),labelCollisionSolver=new NetLabelNetLabelCollisionSolver({inputProblem:this.inputProblem,traces:[...outputTraces,...terminalTraces],netLabelPlacements:retainedNetLabelPlacements,fixedNetLabelPlacements:fixedLabels,netLabelConnectorTraceIds:this.netLabelConnectorTraceIds,useRenderedLabelBounds:activeInlinePlacements.length>0,preserveNonInlineLabelsAgainstInlineEligibleCollisions:!0});activeInlinePlacements.length>0&&labelCollisionSolver.solve();let pushed=pushAnchoredNetLabelsAwayFromInlineLabels({inputProblem:this.inputProblem,traces:outputTraces,netLabelPlacements:labelCollisionSolver.solved&&!labelCollisionSolver.failed?labelCollisionSolver.getOutput().netLabelPlacements:retainedNetLabelPlacements,inlineNetLabelPlacements:activeInlinePlacements,netLabelConnectorTraceIds:this.netLabelConnectorTraceIds}),blockedPlacementKeys=this.getBlockedInlinePlacements({inlineNetLabelPlacements:activeInlinePlacements,anchoredNetLabelPlacements:pushed.netLabelPlacements,traces:pushed.traces});if(blockedPlacementKeys.size>0){let shiftedInlineTerminalLabels=pushInlineTerminalLabelsAwayFromAnchoredLabels({inputProblem:this.inputProblem,traces:pushed.traces,anchoredNetLabelPlacements:pushed.netLabelPlacements,inlineNetLabelPlacements:activeInlinePlacements});if(shiftedInlineTerminalLabels.movedGroupCount>0){activeInlinePlacements=shiftedInlineTerminalLabels.inlineNetLabelPlacements;continue}let{terminalTraces:terminalTraces2}=getInlineLabelObstacles(this.inputProblem,activeInlinePlacements),replanned=activeInlinePlacements.filter(label=>!label.stubTracePath),terminals=activeInlinePlacements.filter(label=>label.stubTracePath).sort((a22,b22)=>Number(blockedPlacementKeys.has(getInlinePlacementKey(b22)))-Number(blockedPlacementKeys.has(getInlinePlacementKey(a22))));for(let placement of terminals){let connection=[...this.inputProblem.netConnections,...this.inputProblem.directConnections].find(connection2=>connection2.netId===placement.netId&&connection2.allowInlineNetLabel),candidate=connection?this.computeTerminalInlinePlacement(connection,placement.pinIds[0],placement.globalConnNetId,new Set,{traces:[...pushed.traces,...terminalTraces2],anchored:pushed.netLabelPlacements,inline:replanned}):null;replanned.push(candidate??placement)}let byKey=new Map(replanned.map(label=>[getInlinePlacementKey(label),label]));activeInlinePlacements=activeInlinePlacements.map(label=>byKey.get(getInlinePlacementKey(label))??label),blockedPlacementKeys=this.getBlockedInlinePlacements({inlineNetLabelPlacements:activeInlinePlacements,anchoredNetLabelPlacements:pushed.netLabelPlacements,traces:pushed.traces})}if(blockedPlacementKeys.size===0){this.inlineNetLabelPlacements=activeInlinePlacements,this.stats.pushedAnchoredNetLabelCount=pushed.movedLabelCount;let restored=restoreReroutesAroundSupersededLabels({inputProblem:this.inputProblem,traces:pushed.traces,netLabelPlacements:pushed.netLabelPlacements,inlineNetLabelPlacements:activeInlinePlacements,completedReroutes:this.completedReroutes});this.stats.restoredSupersededLabelRerouteCount=restored.restoredTraceCount;let output={traces:restored.traces,netLabelConnectorTraceIds:pushed.netLabelConnectorTraceIds,netLabelPlacements:pushed.netLabelPlacements,inlineNetLabelPlacements:activeInlinePlacements};return this.inlineNetLabelPlacements=output.inlineNetLabelPlacements,output}activeInlinePlacements=activeInlinePlacements.filter(placement=>!blockedPlacementKeys.has(getInlinePlacementKey(placement)))}}*getTraceRefinementProposals(current3){yield*getLocalTraceLabelShifts(this.inputProblem,current3);for(let label of current3.netLabelPlacements){if(label.pinIds.length!==1)continue;let connection=[...this.inputProblem.netConnections,...this.inputProblem.directConnections].find(connection2=>connection2.allowInlineNetLabel&&connection2.netId===label.netId&&connection2.pinIds.includes(label.pinIds[0]));if(!connection)continue;let placement=this.computeTerminalInlinePlacement(connection,label.pinIds[0],label.globalConnNetId,new Set,{traces:[],anchored:[],inline:[]});placement&&(yield*getLocalTraceLabelShifts(this.inputProblem,current3,[placement]))}}createRefinementCandidate(proposal){let traceMap=new Map(proposal.traces.map(trace=>[trace.mspPairId,trace])),labelKey=label=>JSON.stringify([label.globalConnNetId,[...label.pinIds].sort()]),labelMap=new Map(proposal.netLabelPlacements.map(label=>[labelKey(label),label])),originalTraceIds=new Set(this.traces.map(trace=>trace.mspPairId));return new _InlineNetLabelSolver({inputProblem:this.inputProblem,traces:[...this.traces.map(trace=>traceMap.get(trace.mspPairId)??trace),...proposal.traces.filter(trace=>!originalTraceIds.has(trace.mspPairId))],netLabelPlacements:this.inputNetLabelPlacements.map(label=>labelMap.get(labelKey(label))??label),completedReroutes:this.completedReroutes,netLabelConnectorTraceIds:proposal.netLabelConnectorTraceIds})}acceptRefinementCandidate(proposal,result){let current3=this.postProcessedOutput,before=this.refinement.before,after=getOutputLabelCollisions(result);if(after.some(collision=>!before.some(previous=>sameOutputLabelCollision(collision,previous))))return!1;let movedTraceIds=new Set(proposal.traces.filter((trace,index)=>trace!==current3.traces[index]).map(trace=>trace.mspPairId));return after.some(collision=>collision.kind==="trace-label"&&collision.trace.kind==="routed"&&movedTraceIds.has(collision.trace.id))||after.length>=before.length&&result.inlineNetLabelPlacements.length<=current3.inlineNetLabelPlacements.length?!1:(this.postProcessedOutput=result,this.inlineNetLabelPlacements=result.inlineNetLabelPlacements,!0)}stepTraceRefinement(){if(this.activeSubSolver){if(this.activeSubSolver.step(),!this.activeSubSolver.solved&&!this.activeSubSolver.failed)return;this.activeSubSolver.solved&&!this.activeSubSolver.failed&&this.acceptRefinementCandidate(this.currentProposal,this.activeSubSolver.getOutput())&&(this.refinement=void 0),this.activeSubSolver=null,this.currentProposal=void 0;return}let current3=this.postProcessedOutput;this.refinement||(this.refinement={proposals:this.getTraceRefinementProposals(current3),queue:[],collecting:!0,before:getOutputLabelCollisions(current3)});let refinement=this.refinement;if(refinement.collecting){let next22=refinement.proposals.next();if(next22.done)refinement.queue.sort((a22,b22)=>a22.distance-b22.distance),refinement.collecting=!1;else{let distance33=next22.value.traces.reduce((sum,trace,index)=>sum+trace.tracePath.reduce((distance422,point62,pointIndex)=>{let previous=current3.traces[index].tracePath[pointIndex];return distance422+Math.abs(point62.x-previous.x)+Math.abs(point62.y-previous.y)},0),0);refinement.queue.push({output:next22.value,distance:distance33})}return}let next2=refinement.queue.shift();if(!next2){this.refinementComplete=!0;return}this.currentProposal=next2.output,this.activeSubSolver=this.createRefinementCandidate(next2.output)}getOutput(){return this.postProcessedOutput?this.postProcessedOutput:this.buildPostProcessedOutput()}visualize(){return visualizeInlineNetLabelOutput({inputProblem:this.inputProblem,...this.getOutput()})}},visualizeInlineNetLabelOutput=({inputProblem,traces,netLabelPlacements,inlineNetLabelPlacements})=>{let graphics=visualizeInputProblem2(inputProblem);graphics.lines??(graphics.lines=[]),graphics.rects??(graphics.rects=[]),graphics.points??(graphics.points=[]),graphics.texts??(graphics.texts=[]);for(let trace of traces)graphics.lines.push({points:trace.tracePath,strokeColor:"purple"});for(let label of netLabelPlacements)graphics.rects.push({center:label.center,width:label.width,height:label.height,fill:getColorFromString2(label.globalConnNetId,.35),strokeColor:getColorFromString2(label.globalConnNetId,.9),label:`netId: ${label.netId}
|
|
948
948
|
globalConnNetId: ${label.globalConnNetId}`}),graphics.points.push({x:label.anchorPoint.x,y:label.anchorPoint.y,color:getColorFromString2(label.globalConnNetId,.9),label:`anchorPoint
|
|
@@ -950,7 +950,7 @@ orientation: ${label.orientation}`});for(let inlineLabel of inlineNetLabelPlacem
|
|
|
950
950
|
`)});let textX=inlineLabel.center.x,textY=inlineLabel.center.y,anchorSide="center",rotation5;if(inlineLabel.stubTracePath){let stubStart=inlineLabel.stubTracePath[0],stubEnd=inlineLabel.stubTracePath[1],labelOffset=inlineLabel.width/2;stubEnd[inlineLabel.axis]>stubStart[inlineLabel.axis]?(labelOffset=-inlineLabel.width/2,anchorSide="center_left"):anchorSide="center_right",inlineLabel.axis==="x"?textX+=labelOffset:textY+=labelOffset}inlineLabel.axis==="y"&&(rotation5=90),graphics.texts.push({x:textX,y:textY,text:inlineLabel.netLabelText??inlineLabel.netId??"",color:"green",fontSize:inlineLabel.height,anchorSide,rotation:rotation5}),graphics.points.push({x:inlineLabel.anchorPoint.x,y:inlineLabel.anchorPoint.y,color:"green",label:`inline anchor
|
|
951
951
|
${inlineLabel.netLabelText??inlineLabel.netId}`})}return graphics},estimateInlineNetLabelWidth=(text,fontSize=DEFAULT_INLINE_NET_LABEL_HEIGHT)=>{let fontScale=fontSize/.18;return text.length*.12*fontScale+.12*fontScale},getAnchorCandidates=(segment2,labelWidth,step=.1)=>{let along2=segment2.axis==="x"?"x":"y",start=segment2.start[along2],end=segment2.end[along2],mid=(start+end)/2,direction2=Math.sign(end-start)||1,pointAt2=value=>segment2.axis==="x"?{x:value,y:segment2.start.y}:{x:segment2.start.x,y:segment2.start.y+(value-start)},slack=segment2.length-labelWidth;if(slack<=0)return[pointAt2(mid)];let offsets=[0];for(let offset=step;offset<=slack/2+1e-9;offset+=step)offsets.push(offset,-offset);return offsets.push(slack/2,-slack/2),offsets.map(offset=>pointAt2(mid+offset*direction2))},doesPathIntersectBounds3=(path,bounds)=>{for(let i22=0;i22<path.length-1;i22++){let a22=path[i22],b22=path[i22+1],segmentBounds={minX:Math.min(a22.x,b22.x),maxX:Math.max(a22.x,b22.x),minY:Math.min(a22.y,b22.y),maxY:Math.max(a22.y,b22.y)};if(boundsOverlap2(segmentBounds,bounds))return!0}return!1},GEOMETRY_EPSILON2=1e-6,getCollisionLimitedTerminalStubEnd=({start,intendedEnd,minimumLength,traces,ownGlobalConnNetId,ignoredTraceIds})=>{let isHorizontal5=Math.abs(intendedEnd.x-start.x)>=Math.abs(intendedEnd.y-start.y),alongAxis=isHorizontal5?"x":"y",acrossAxis=isHorizontal5?"y":"x",direction2=Math.sign(intendedEnd[alongAxis]-start[alongAxis])||1,intendedLength=Math.abs(intendedEnd[alongAxis]-start[alongAxis]),availableLength=intendedLength;for(let trace of traces)if(!ignoredTraceIds.has(trace.mspPairId)&&trace.globalConnNetId!==ownGlobalConnNetId)for(let segmentIndex=0;segmentIndex<trace.tracePath.length-1;segmentIndex++){let segmentStart=trace.tracePath[segmentIndex],segmentEnd=trace.tracePath[segmentIndex+1],startAlong=(segmentStart[alongAxis]-start[alongAxis])*direction2,endAlong=(segmentEnd[alongAxis]-start[alongAxis])*direction2,startAcross=segmentStart[acrossAxis]-start[acrossAxis],endAcross=segmentEnd[acrossAxis]-start[acrossAxis],minAlong=Math.min(startAlong,endAlong),maxAlong=Math.max(startAlong,endAlong),minAcross=Math.min(startAcross,endAcross),maxAcross=Math.max(startAcross,endAcross),collisionDistance;if(Math.abs(startAcross)<=GEOMETRY_EPSILON2&&Math.abs(endAcross)<=GEOMETRY_EPSILON2&&maxAlong>=-GEOMETRY_EPSILON2&&minAlong<=intendedLength+INLINE_NET_LABEL_STUB_TRACE_CLEARANCE+GEOMETRY_EPSILON2)collisionDistance=Math.max(0,minAlong);else{let crossesStubAxis=minAcross<=GEOMETRY_EPSILON2&&maxAcross>=-GEOMETRY_EPSILON2,perpendicularAlong=(startAlong+endAlong)/2;crossesStubAxis&&Math.abs(startAlong-endAlong)<=GEOMETRY_EPSILON2&&perpendicularAlong>=-GEOMETRY_EPSILON2&&perpendicularAlong<=intendedLength+INLINE_NET_LABEL_STUB_TRACE_CLEARANCE+GEOMETRY_EPSILON2&&(collisionDistance=Math.max(0,perpendicularAlong))}collisionDistance!==void 0&&(availableLength=Math.min(availableLength,collisionDistance-INLINE_NET_LABEL_STUB_TRACE_CLEARANCE))}return availableLength+GEOMETRY_EPSILON2<minimumLength?null:isHorizontal5?{x:start.x+direction2*availableLength,y:start.y}:{x:start.x,y:start.y+direction2*availableLength}},EPSILON29=1e-6,isStrictlyBetween2=({coordinate:coordinate2,segmentStartCoordinate,segmentEndCoordinate})=>coordinate2>Math.min(segmentStartCoordinate,segmentEndCoordinate)+EPSILON29&&coordinate2<Math.max(segmentStartCoordinate,segmentEndCoordinate)-EPSILON29,isStrictInteriorPerpendicularCrossing=({firstSegmentStart,firstSegmentEnd,secondSegmentStart,secondSegmentEnd})=>{let firstIsHorizontal=Math.abs(firstSegmentStart.y-firstSegmentEnd.y)<=EPSILON29,firstIsVertical=Math.abs(firstSegmentStart.x-firstSegmentEnd.x)<=EPSILON29,secondIsHorizontal=Math.abs(secondSegmentStart.y-secondSegmentEnd.y)<=EPSILON29,secondIsVertical=Math.abs(secondSegmentStart.x-secondSegmentEnd.x)<=EPSILON29,horizontalStart,horizontalEnd;if(firstIsHorizontal)horizontalStart=firstSegmentStart,horizontalEnd=firstSegmentEnd;else if(secondIsHorizontal)horizontalStart=secondSegmentStart,horizontalEnd=secondSegmentEnd;else return!1;let verticalStart,verticalEnd;if(firstIsVertical)verticalStart=firstSegmentStart,verticalEnd=firstSegmentEnd;else if(secondIsVertical)verticalStart=secondSegmentStart,verticalEnd=secondSegmentEnd;else return!1;return isStrictlyBetween2({coordinate:verticalStart.x,segmentStartCoordinate:horizontalStart.x,segmentEndCoordinate:horizontalEnd.x})&&isStrictlyBetween2({coordinate:horizontalStart.y,segmentStartCoordinate:verticalStart.y,segmentEndCoordinate:verticalEnd.y})},doesTraceRecoveryPathConflict=(tracePath,collisionTraces)=>{for(let pathIndex=0;pathIndex<tracePath.length-1;pathIndex++){let pathStart=tracePath[pathIndex],pathEnd=tracePath[pathIndex+1];for(let trace of collisionTraces)for(let traceIndex=0;traceIndex<trace.tracePath.length-1;traceIndex++){let traceStart=trace.tracePath[traceIndex],traceEnd=trace.tracePath[traceIndex+1];if(doSegmentsIntersect22(pathStart,pathEnd,traceStart,traceEnd)&&!isStrictInteriorPerpendicularCrossing({firstSegmentStart:pathStart,firstSegmentEnd:pathEnd,secondSegmentStart:traceStart,secondSegmentEnd:traceEnd}))return!0}}return!1},getTraceRecoveryConnectivityMaps=inputProblem=>{let chipMap={},pinMap=new Map;for(let chip of inputProblem.chips){chipMap[chip.chipId]=chip;for(let pin of chip.pins)pinMap.set(pin.pinId,{...pin,chipId:chip.chipId,_facingDirection:pin._facingDirection??getPinDirection2(pin,chip)})}return{chipMap,pinMap}},getSimpleElbowPath=(first,second)=>{let firstDirection=dir(first._facingDirection),secondDirection=dir(second._facingDirection);if(firstDirection.x*secondDirection.x||firstDirection.y*secondDirection.y)return;let elbow=firstDirection.x?{x:second.x,y:first.y}:{x:first.x,y:second.y};for(let[pin,direction2]of[[first,firstDirection],[second,secondDirection]])if((elbow.x-pin.x)*direction2.x+(elbow.y-pin.y)*direction2.y<=1e-6)return;return[{x:first.x,y:first.y},elbow,{x:second.x,y:second.y}]},EPS18=1e-9,isHorizontal4=(start,end)=>Math.abs(start.y-end.y)<EPS18,isVertical5=(start,end)=>Math.abs(start.x-end.x)<EPS18,compactConsecutivePoints=path=>path.filter((point62,index)=>{let previousPoint=path[index-1];return!previousPoint||Math.abs(point62.x-previousPoint.x)>=EPS18||Math.abs(point62.y-previousPoint.y)>=EPS18}),isValidOrthogonalPath=path=>{if(path.length<2||!path.every((point62,index)=>{let nextPoint=path[index+1];return nextPoint?isHorizontal4(point62,nextPoint)||isVertical5(point62,nextPoint):!0}))return!1;for(let firstSegmentIndex=0;firstSegmentIndex<path.length-1;firstSegmentIndex++)for(let secondSegmentIndex=firstSegmentIndex+2;secondSegmentIndex<path.length-1;secondSegmentIndex++)if(segmentsIntersect22(path[firstSegmentIndex],path[firstSegmentIndex+1],path[secondSegmentIndex],path[secondSegmentIndex+1]))return!1;return!0},getEndpointAlignedSegmentCandidates=tracePath=>{let candidates=[];for(let segmentIndex=2;segmentIndex<=tracePath.length-4;segmentIndex++){let previousPoint=tracePath[segmentIndex-1],start=tracePath[segmentIndex],end=tracePath[segmentIndex+1],nextPoint=tracePath[segmentIndex+2],segmentIsVertical=isVertical5(start,end),segmentIsHorizontal=isHorizontal4(start,end);if(!segmentIsVertical&&!segmentIsHorizontal||segmentIsVertical&&(!isHorizontal4(previousPoint,start)||!isHorizontal4(end,nextPoint))||segmentIsHorizontal&&(!isVertical5(previousPoint,start)||!isVertical5(end,nextPoint)))continue;let alignedCoordinates=segmentIsVertical?[previousPoint.x,nextPoint.x]:[previousPoint.y,nextPoint.y];for(let alignedCoordinate of alignedCoordinates){if(Math.abs(alignedCoordinate-(segmentIsVertical?start.x:start.y))<EPS18)continue;let candidate=tracePath.map(point62=>({...point62}));segmentIsVertical?(candidate[segmentIndex].x=alignedCoordinate,candidate[segmentIndex+1].x=alignedCoordinate):(candidate[segmentIndex].y=alignedCoordinate,candidate[segmentIndex+1].y=alignedCoordinate);let compactedCandidate=compactConsecutivePoints(candidate);isValidOrthogonalPath(compactedCandidate)&&candidates.push(compactedCandidate)}}return candidates},countOtherNetCrossings2=({tracePath,globalConnNetId,otherTraces})=>otherTraces.reduce((crossingCount,otherTrace)=>crossingCount+(otherTrace.globalConnNetId===globalConnNetId?0:countPathIntersections(tracePath,otherTrace.tracePath)),0),reduceTraceCrossings=({tracePath,globalConnNetId,otherTraces,isCandidateValid})=>{let bestPath=tracePath,bestCrossingCount=countOtherNetCrossings2({tracePath,globalConnNetId,otherTraces}),bestPathLength=getPathLength4(tracePath);for(let candidate of getEndpointAlignedSegmentCandidates(tracePath)){if(!isCandidateValid(candidate))continue;let crossingCount=countOtherNetCrossings2({tracePath:candidate,globalConnNetId,otherTraces}),pathLength4=getPathLength4(candidate);(crossingCount<bestCrossingCount||crossingCount===bestCrossingCount&&pathLength4<bestPathLength)&&(bestPath=candidate,bestCrossingCount=crossingCount,bestPathLength=pathLength4)}return bestPath},RECOVERED_TRACE_PREFIX="net-label-to-trace-",MAX_NAMED_NET_RECOVERY_PERPENDICULAR_OFFSET=.05,MAX_ROUTED_COMPONENT_RECOVERY_PERPENDICULAR_OFFSET=.25,getCanonicalPairKey=(firstPinId,secondPinId)=>[firstPinId,secondPinId].sort().join("--"),getPerpendicularOffset=(firstPoint,secondPoint)=>{let xDistance=Math.abs(firstPoint.x-secondPoint.x),yDistance=Math.abs(firstPoint.y-secondPoint.y);return xDistance>=yDistance?yDistance:xDistance},arePinsCoFacingAlongSeparationAxis=(firstPin,secondPin)=>{if(firstPin._facingDirection!==secondPin._facingDirection)return!1;let xDistance=Math.abs(firstPin.x-secondPin.x),yDistance=Math.abs(firstPin.y-secondPin.y);return xDistance>=yDistance?firstPin._facingDirection==="x+"||firstPin._facingDirection==="x-":firstPin._facingDirection==="y+"||firstPin._facingDirection==="y-"},NetLabelToTraceSolver=class extends BaseSolver10{constructor(input2,options={}){super();__publicField(this,"input");__publicField(this,"options");__publicField(this,"inputProblem");__publicField(this,"outputTraces");__publicField(this,"outputNetLabelPlacements");__publicField(this,"recoveredTraceIds",new Set);__publicField(this,"chipMap");__publicField(this,"pinMap");__publicField(this,"canRecoverParallelPair");__publicField(this,"queuedCandidates");__publicField(this,"currentCandidate",null);this.input=input2,this.options=options,this.inputProblem=input2.inputProblem,this.outputTraces=[...input2.traces],this.outputNetLabelPlacements=[...input2.netLabelPlacements];let{chipMap,pinMap}=getTraceRecoveryConnectivityMaps(this.inputProblem);this.chipMap=chipMap,this.pinMap=pinMap,this.canRecoverParallelPair=getParallelNetLabelPolicy(this.inputProblem,getConnectivityMapsFromInputProblem(this.inputProblem).netConnMap,new Set(input2.traces.filter(trace=>trace.pinIds.length>1).flatMap(trace=>trace.pinIds))),this.queuedCandidates=this.buildCandidatePairs(),this.stats.candidateCount=this.queuedCandidates.length,this.stats.recoveredTraceCount=0}getConstructorParams(){return[this.input,this.options]}isPortOnlyFallbackLabel(label,groundGlobalConnNetIds){return!(label.pinIds.length!==1||label.mspConnectionPairIds.length!==0||!label.netId||groundGlobalConnNetIds.has(label.globalConnNetId))}isDirectConnectionLabel(label){if(!label.netId||label.pinIds.length!==1)return!1;let pinId=label.pinIds[0];return this.inputProblem.directConnections.some(connection=>connection.netId===label.netId&&connection.pinIds.includes(pinId))}getMultiPinNetConnection(label){if(!label.netId||label.pinIds.length!==1)return;let pinId=label.pinIds[0];return this.inputProblem.netConnections.find(connection=>connection.isGround===!1&&connection.pinIds.length>2&&connection.netId===label.netId&&connection.pinIds.includes(pinId))}getTwoPinNetConnection(label){return this.inputProblem.netConnections.find(connection=>!connection.isGround&&connection.pinIds.length===2&&connection.netId===label.netId&&connection.pinIds.includes(label.pinIds[0]))}buildCandidatePairs(){let{netConnMap}=getConnectivityMapsFromInputProblem(this.inputProblem),groundGlobalConnNetIds=new Set;for(let connection of this.inputProblem.netConnections){if(!connection.isGround)continue;let globalConnNetId=netConnMap.getNetConnectedToId(connection.netId);globalConnNetId&&groundGlobalConnNetIds.add(globalConnNetId)}let labelsByGlobalNet=new Map;for(let label of this.input.netLabelPlacements){if(!this.isPortOnlyFallbackLabel(label,groundGlobalConnNetIds)||!this.isDirectConnectionLabel(label)&&!this.getMultiPinNetConnection(label)&&!this.getTwoPinNetConnection(label))continue;let labels=labelsByGlobalNet.get(label.globalConnNetId)??[];labels.push(label),labelsByGlobalNet.set(label.globalConnNetId,labels)}let candidates=[];for(let labels of labelsByGlobalNet.values())for(let firstIndex=0;firstIndex<labels.length;firstIndex++)for(let secondIndex=firstIndex+1;secondIndex<labels.length;secondIndex++){let firstLabel=labels[firstIndex],secondLabel=labels[secondIndex],firstPin=this.pinMap.get(firstLabel.pinIds[0]),secondPin=this.pinMap.get(secondLabel.pinIds[0]);if(!firstPin||!secondPin||!this.canRecoverParallelPair(firstPin,secondPin))continue;let perpendicularOffset=getPerpendicularOffset(firstPin,secondPin),bothLabelsBelongToDirectConnections=this.isDirectConnectionLabel(firstLabel)&&this.isDirectConnectionLabel(secondLabel),firstMultiPinNetConnection=this.getMultiPinNetConnection(firstLabel),secondMultiPinNetConnection=this.getMultiPinNetConnection(secondLabel),twoPinNetConnection=this.getTwoPinNetConnection(firstLabel),simpleElbowPath=!bothLabelsBelongToDirectConnections&&twoPinNetConnection&&firstPin.chipId!==secondPin.chipId&&twoPinNetConnection===this.getTwoPinNetConnection(secondLabel)?getSimpleElbowPath(firstPin,secondPin):void 0;!simpleElbowPath&&!bothLabelsBelongToDirectConnections&&(!firstMultiPinNetConnection||firstMultiPinNetConnection!==secondMultiPinNetConnection||perpendicularOffset>MAX_NAMED_NET_RECOVERY_PERPENDICULAR_OFFSET)||arePinsInDifferentSchematicSections(this.inputProblem,firstPin,secondPin)||doesPairCrossRestrictedCenterLines({inputProblem:this.inputProblem,chipMap:this.chipMap,pinIdMap:this.pinMap,p1:firstPin,p2:secondPin})||candidates.push({firstLabel,secondLabel,pins:[firstPin,secondPin],perpendicularOffset,routeDistance:Math.abs(firstPin.x-secondPin.x)+Math.abs(firstPin.y-secondPin.y),key:getCanonicalPairKey(firstPin.pinId,secondPin.pinId),recoveryMode:"fallback_labels",simpleElbowPath})}candidates.push(...this.buildRoutedComponentCandidates(groundGlobalConnNetIds));let selectedCandidates=this.options.onlyInlineDirectConnections?candidates.filter(candidate=>this.inputProblem.directConnections.some(connection=>candidate.pins.every(pin=>connection.pinIds.includes(pin.pinId))&&(connection.allowInlineNetLabel||this.inputProblem.netConnections.some(net=>net.allowInlineNetLabel&&candidate.pins.every(pin=>net.pinIds.includes(pin.pinId)))))):candidates;return selectedCandidates.sort((first,second)=>first.perpendicularOffset-second.perpendicularOffset||first.routeDistance-second.routeDistance||first.key.localeCompare(second.key)),selectedCandidates}buildRoutedComponentCandidates(groundGlobalConnNetIds){let{netConnMap}=getConnectivityMapsFromInputProblem(this.inputProblem),candidates=[],directConnections=new Set(this.inputProblem.directConnections);for(let connection of[...this.inputProblem.netConnections.filter(connection2=>connection2.pinIds.length>2&&connection2.isGround===!1),...this.inputProblem.directConnections]){let isDirectConnection=directConnections.has(connection),canRecoverElbow=isDirectConnection&&this.options.onlyInlineDirectConnections,globalConnNetId=netConnMap.getNetConnectedToId(connection.pinIds[0]);if(!globalConnNetId||isDirectConnection&&groundGlobalConnNetIds.has(globalConnNetId))continue;let connectionPinIds=connection.pinIds;isDirectConnection&&(connectionPinIds=[...this.pinMap.keys()].filter(pinId=>netConnMap.getNetConnectedToId(pinId)===globalConnNetId));let traceConnectedPinComponents=getTraceConnectedPinComponents({pinIds:connectionPinIds,traces:this.outputTraces.filter(trace=>trace.globalConnNetId===globalConnNetId)}).filter(component=>component.traces.length>0);for(let firstIndex=0;firstIndex<traceConnectedPinComponents.length;firstIndex++)for(let secondIndex=firstIndex+1;secondIndex<traceConnectedPinComponents.length;secondIndex++){let firstComponent=traceConnectedPinComponents[firstIndex],secondComponent=traceConnectedPinComponents[secondIndex];if(isDirectConnection&&!(firstComponent.pinIds.includes(connection.pinIds[0])&&secondComponent.pinIds.includes(connection.pinIds[1])||firstComponent.pinIds.includes(connection.pinIds[1])&&secondComponent.pinIds.includes(connection.pinIds[0])))continue;let firstLabel=this.input.netLabelPlacements.find(label=>label.globalConnNetId===globalConnNetId&&label.mspConnectionPairIds.length>0&&label.pinIds.some(pinId=>firstComponent.pinIds.includes(pinId))),secondLabel=this.input.netLabelPlacements.find(label=>label.globalConnNetId===globalConnNetId&&label.mspConnectionPairIds.length>0&&label.pinIds.some(pinId=>secondComponent.pinIds.includes(pinId)));if(!firstLabel||!secondLabel||firstLabel===secondLabel)continue;let labelsAreAligned=getPerpendicularOffset(firstLabel.anchorPoint,secondLabel.anchorPoint)<=MAX_ROUTED_COMPONENT_RECOVERY_PERPENDICULAR_OFFSET;if(!labelsAreAligned&&!canRecoverElbow)continue;let bestCandidate,firstPinIds=firstComponent.pinIds,secondPinIds=secondComponent.pinIds;isDirectConnection&&(firstPinIds=connection.pinIds.filter(pinId=>firstComponent.pinIds.includes(pinId)),secondPinIds=connection.pinIds.filter(pinId=>secondComponent.pinIds.includes(pinId)));for(let firstPinId of firstPinIds)for(let secondPinId of secondPinIds){let firstPin=this.pinMap.get(firstPinId),secondPin=this.pinMap.get(secondPinId);if(!firstPin||!secondPin||!this.canRecoverParallelPair(firstPin,secondPin)||isDirectConnection&&firstPin.chipId===secondPin.chipId)continue;let perpendicularOffset=getPerpendicularOffset(firstPin,secondPin),simpleElbowPath=canRecoverElbow&&(!labelsAreAligned||perpendicularOffset>MAX_ROUTED_COMPONENT_RECOVERY_PERPENDICULAR_OFFSET)?getSimpleElbowPath(firstPin,secondPin):void 0;if((!labelsAreAligned||perpendicularOffset>MAX_ROUTED_COMPONENT_RECOVERY_PERPENDICULAR_OFFSET)&&!simpleElbowPath||arePinsCoFacingAlongSeparationAxis(firstPin,secondPin)||arePinsInDifferentSchematicSections(this.inputProblem,firstPin,secondPin)||doesPairCrossRestrictedCenterLines({inputProblem:this.inputProblem,chipMap:this.chipMap,pinIdMap:this.pinMap,p1:firstPin,p2:secondPin}))continue;let routeDistance=Math.abs(firstPin.x-secondPin.x)+Math.abs(firstPin.y-secondPin.y),recoveryMode="routed_components";isDirectConnection&&(recoveryMode="routed_direct_connection");let candidate={firstLabel,secondLabel,pins:[firstPin,secondPin],perpendicularOffset,routeDistance,key:getCanonicalPairKey(firstPin.pinId,secondPin.pinId),recoveryMode,netConnectionPinIds:connectionPinIds,simpleElbowPath};(!bestCandidate||candidate.routeDistance<bestCandidate.routeDistance||candidate.routeDistance===bestCandidate.routeDistance&&(candidate.perpendicularOffset<bestCandidate.perpendicularOffset||candidate.perpendicularOffset===bestCandidate.perpendicularOffset&&candidate.key.localeCompare(bestCandidate.key)<0))&&(bestCandidate=candidate)}bestCandidate&&candidates.push(bestCandidate)}}return candidates}isSupersededConnectorTrace(trace,candidate){return!this.input.netLabelConnectorTraceIds?.has(trace.mspPairId)||trace.pinIds.length!==1?!1:candidate.pins.some(pin=>pin.pinId===trace.pinIds[0])}routeIntersectsRemainingLabels(tracePath,candidate){for(let label of this.outputNetLabelPlacements)if(!(label===candidate.firstLabel||label===candidate.secondLabel)&&pathIntersectsRenderedLabel(tracePath,label))return!0;return this.input.inlineNetLabelPlacements.some(label=>pathIntersectsRenderedLabel(tracePath,label))}tryAcceptCurrentRoute(){let candidate=this.currentCandidate,tracePath=this.activeSubSolver?.solvedTracePath;if(!candidate||!tracePath)return;let retainedTraces=this.outputTraces.filter(trace=>!this.isSupersededConnectorTrace(trace,candidate)),collisionTraces=retainedTraces;if(candidate.recoveryMode!=="fallback_labels"&&(collisionTraces=retainedTraces.filter(trace=>trace.globalConnNetId!==candidate.firstLabel.globalConnNetId)),candidate.simpleElbowPath&&(tracePath=candidate.simpleElbowPath,findFirstCollision(tracePath,this.activeSubSolver.obstacles)||collisionTraces.reduce((count,trace)=>count+findPerpendicularPathCrossings(tracePath,trace.tracePath,{includeTerminalSegments:!0}).length,0)>1)||doesTraceRecoveryPathConflict(tracePath,collisionTraces)||this.routeIntersectsRemainingLabels(tracePath,candidate))return;tracePath=reduceTraceCrossings({tracePath,globalConnNetId:candidate.firstLabel.globalConnNetId,otherTraces:collisionTraces,isCandidateValid:candidatePath=>findFirstCollision(candidatePath,this.activeSubSolver.obstacles)===null&&!doesTraceRecoveryPathConflict(candidatePath,collisionTraces)&&!this.routeIntersectsRemainingLabels(candidatePath,candidate)});let[firstPin,secondPin]=candidate.pins,mspPairId=`${RECOVERED_TRACE_PREFIX}${candidate.key}`,recoveredTrace={mspPairId,dcConnNetId:candidate.firstLabel.globalConnNetId,globalConnNetId:candidate.firstLabel.globalConnNetId,pins:[firstPin,secondPin],tracePath,mspConnectionPairIds:[mspPairId],pinIds:[firstPin.pinId,secondPin.pinId]};this.recoveredTraceIds.add(mspPairId),this.outputTraces=[...retainedTraces,recoveredTrace],candidate.recoveryMode!=="routed_components"&&(this.outputNetLabelPlacements=this.outputNetLabelPlacements.filter(label=>label!==candidate.firstLabel&&label!==candidate.secondLabel)),this.stats.recoveredTraceCount++}areCandidatePinsAlreadyConnected(candidate){return candidate.netConnectionPinIds?getTraceConnectedPinComponents({pinIds:candidate.netConnectionPinIds,traces:this.outputTraces}).some(component=>component.pinIds.includes(candidate.pins[0].pinId)&&component.pinIds.includes(candidate.pins[1].pinId)):!1}_step(){if(this.activeSubSolver){this.activeSubSolver.step(),this.activeSubSolver.solved?(this.tryAcceptCurrentRoute(),this.activeSubSolver=null,this.currentCandidate=null):this.activeSubSolver.failed&&(this.activeSubSolver=null,this.currentCandidate=null);return}let candidate=this.queuedCandidates.shift();for(;candidate&&(!this.outputNetLabelPlacements.includes(candidate.firstLabel)||!this.outputNetLabelPlacements.includes(candidate.secondLabel)||this.areCandidatePinsAlreadyConnected(candidate));)candidate=this.queuedCandidates.shift();if(!candidate){this.solved=!0;return}this.currentCandidate=candidate,this.activeSubSolver=new SchematicTraceSingleLineSolver2({inputProblem:this.inputProblem,pins:candidate.pins,chipMap:this.chipMap})}getOutput(){return{traces:this.outputTraces,netLabelPlacements:this.outputNetLabelPlacements,inlineNetLabelPlacements:this.input.inlineNetLabelPlacements}}visualize(){if(this.activeSubSolver)return this.activeSubSolver.visualize();let graphics=visualizeInlineNetLabelOutput({inputProblem:this.inputProblem,...this.getOutput()});for(let trace of this.outputTraces)this.recoveredTraceIds.has(trace.mspPairId)&&graphics.lines.push({points:trace.tracePath,strokeColor:"green",label:`recovered from net labels: ${trace.pinIds.join(" -> ")}`});return graphics}};function definePipelineStep22(solverName,solverClass,getConstructorParams,opts={}){return{solverName,solverClass,getConstructorParams,onSolved:opts.onSolved,shouldSkip:opts.shouldSkip}}var SchematicTracePipelineSolver=class extends BaseSolver10{constructor(inputProblem,opts){super();__publicField(this,"mspConnectionPairSolver");__publicField(this,"schematicTraceLinesSolver");__publicField(this,"longDistancePairSolver");__publicField(this,"unroutedTraceRecoverySolver");__publicField(this,"traceOverlapShiftSolver");__publicField(this,"netLabelPlacementSolver");__publicField(this,"labelMergingSolver");__publicField(this,"traceLabelOverlapAvoidanceSolver");__publicField(this,"traceCleanupSolver");__publicField(this,"example28Solver");__publicField(this,"availableNetOrientationSolver");__publicField(this,"postLabelTraceOverlapShiftSolver");__publicField(this,"railNetLabelCornerPlacementSolver");__publicField(this,"traceAnchoredNetLabelOverlapSolver");__publicField(this,"finalTraceAnchoredNetLabelOverlapSolver");__publicField(this,"preAlignmentNetLabelTraceCollisionSolver");__publicField(this,"netLabelTraceCollisionSolver");__publicField(this,"traceCleanupSolver2");__publicField(this,"netLabelNetLabelCollisionSolver");__publicField(this,"finalRailNetLabelCornerPlacementSolver");__publicField(this,"traceElbowTransitionSimplificationSolver");__publicField(this,"preAlignmentTraceElbowTransitionSimplificationSolver");__publicField(this,"finalTraceElbowTransitionSimplificationSolver");__publicField(this,"sameNetJunctionAlignmentSolver");__publicField(this,"inlineDirectTraceRecoverySolver");__publicField(this,"inlineNetLabelSolver");__publicField(this,"netLabelToTraceSolver");__publicField(this,"startTimeOfPhase");__publicField(this,"endTimeOfPhase");__publicField(this,"timeSpentOnPhase");__publicField(this,"firstIterationOfPhase");__publicField(this,"inputProblem");__publicField(this,"hideRatsNet");__publicField(this,"pipelineDef",[definePipelineStep22("mspConnectionPairSolver",MspConnectionPairSolver,()=>[{inputProblem:this.inputProblem}],{onSolved:mspSolver=>{}}),definePipelineStep22("schematicTraceLinesSolver",SchematicTraceLinesSolver,()=>[{mspConnectionPairs:this.mspConnectionPairSolver.mspConnectionPairs,dcConnMap:this.mspConnectionPairSolver.dcConnMap,globalConnMap:this.mspConnectionPairSolver.globalConnMap,inputProblem:this.inputProblem,chipMap:this.mspConnectionPairSolver.chipMap}]),definePipelineStep22("longDistancePairSolver",LongDistancePairSolver,instance=>[{inputProblem:instance.inputProblem,primaryMspConnectionPairs:instance.mspConnectionPairSolver.mspConnectionPairs,alreadySolvedTraces:instance.schematicTraceLinesSolver.solvedTracePaths,failedConnectionPairs:instance.schematicTraceLinesSolver.failedConnectionPairs}],{onSolved:schematicTraceLinesSolver=>{}}),definePipelineStep22("unroutedTraceRecoverySolver",UnroutedTraceRecoverySolver,instance=>[{inputProblem:instance.inputProblem,failedConnectionPairs:instance.schematicTraceLinesSolver.failedConnectionPairs,alreadySolvedTraces:instance.longDistancePairSolver.getOutput().allTracesMerged}]),definePipelineStep22("traceOverlapShiftSolver",TraceOverlapShiftSolver,()=>[{inputProblem:this.inputProblem,inputTracePaths:this.unroutedTraceRecoverySolver?.getOutput().allTracesMerged,globalConnMap:this.mspConnectionPairSolver.globalConnMap}],{onSolved:_solver=>{}}),definePipelineStep22("netLabelPlacementSolver",NetLabelPlacementSolver,()=>[{inputProblem:this.inputProblem,inputTraceMap:this.traceOverlapShiftSolver?.correctedTraceMap??Object.fromEntries(this.unroutedTraceRecoverySolver.getOutput().allTracesMerged.map(p22=>[p22.mspPairId,p22]))}],{onSolved:_solver=>{}}),definePipelineStep22("traceLabelOverlapAvoidanceSolver",TraceLabelOverlapAvoidanceSolver,instance=>{let traceMap=instance.traceOverlapShiftSolver?.correctedTraceMap??Object.fromEntries(instance.unroutedTraceRecoverySolver.getOutput().allTracesMerged.map(p22=>[p22.mspPairId,p22])),traces=Object.values(traceMap),netLabelPlacements=instance.netLabelPlacementSolver.netLabelPlacements;return[{inputProblem:instance.inputProblem,traces,netLabelPlacements}]}),definePipelineStep22("traceElbowTransitionSimplificationSolver",TraceElbowTransitionSimplificationSolver,instance=>{let overlapAvoidanceOutput=instance.traceLabelOverlapAvoidanceSolver.getOutput();return[{inputProblem:instance.inputProblem,traces:overlapAvoidanceOutput.traces,completedReroutes:overlapAvoidanceOutput.completedReroutes,netLabelPlacements:instance.traceLabelOverlapAvoidanceSolver.netLabelPlacements,paddingBuffer:.1}]}),definePipelineStep22("traceCleanupSolver",TraceCleanupSolver,instance=>{let traces=instance.traceElbowTransitionSimplificationSolver.getOutput().traces,overlapShiftSolver=instance.traceOverlapShiftSolver,inlineLabelNetIds=new Set([...instance.inputProblem.directConnections,...instance.inputProblem.netConnections].filter(connection=>connection.allowInlineNetLabel).map(connection=>connection.netId)),traceIdsInNewCrossingsAfterOverlapShift=new Set;for(let traceIndex=0;traceIndex<overlapShiftSolver.inputTracePaths.length;traceIndex++){let inputTrace=overlapShiftSolver.inputTracePaths[traceIndex],shiftedTrace=overlapShiftSolver.correctedTraceMap[inputTrace.mspPairId];for(let otherTraceIndex=traceIndex+1;otherTraceIndex<overlapShiftSolver.inputTracePaths.length;otherTraceIndex++){let otherInputTrace=overlapShiftSolver.inputTracePaths[otherTraceIndex];if(inputTrace.globalConnNetId===otherInputTrace.globalConnNetId||!inlineLabelNetIds.has(inputTrace.userNetId??"")&&!inlineLabelNetIds.has(otherInputTrace.userNetId??""))continue;let otherShiftedTrace=overlapShiftSolver.correctedTraceMap[otherInputTrace.mspPairId],crossingCountBeforeShift=findPerpendicularPathCrossings(inputTrace.tracePath,otherInputTrace.tracePath).length;findPerpendicularPathCrossings(shiftedTrace.tracePath,otherShiftedTrace.tracePath).length>crossingCountBeforeShift&&(traceIdsInNewCrossingsAfterOverlapShift.add(inputTrace.mspPairId),traceIdsInNewCrossingsAfterOverlapShift.add(otherInputTrace.mspPairId))}}let labelMergingOutput=instance.traceLabelOverlapAvoidanceSolver.labelMergingSolver.getOutput();return[{inputProblem:instance.inputProblem,allTraces:traces,allLabelPlacements:labelMergingOutput.netLabelPlacements,mergedLabelNetIdMap:labelMergingOutput.mergedLabelNetIdMap,paddingBuffer:.1,eligibleTraceIds:traceIdsInNewCrossingsAfterOverlapShift}]}),definePipelineStep22("netLabelPlacementSolver",NetLabelPlacementSolver,instance=>{let traces=instance.traceCleanupSolver?.getOutput().traces??instance.traceLabelOverlapAvoidanceSolver.getOutput().traces;return[{inputProblem:instance.inputProblem,inputTraceMap:Object.fromEntries(traces.map(trace=>[trace.mspPairId,trace]))}]}),definePipelineStep22("example28Solver",Example28Solver,instance=>{let traces=instance.traceCleanupSolver?.getOutput().traces??instance.traceLabelOverlapAvoidanceSolver.getOutput().traces;return[{inputProblem:instance.inputProblem,traces,netLabelPlacements:instance.netLabelPlacementSolver.netLabelPlacements}]}),definePipelineStep22("availableNetOrientationSolver",AvailableNetOrientationSolver,instance=>[{inputProblem:instance.inputProblem,traces:instance.example28Solver.outputTraces,netLabelPlacements:instance.example28Solver.outputNetLabelPlacements}]),definePipelineStep22("postLabelTraceOverlapShiftSolver",TraceOverlapShiftSolver,instance=>[{inputProblem:instance.inputProblem,inputTracePaths:instance.availableNetOrientationSolver.traces,globalConnMap:instance.mspConnectionPairSolver.globalConnMap,traceIdsToShift:new Set(instance.availableNetOrientationSolver.netLabelConnectorTraceIds)}]),definePipelineStep22("railNetLabelCornerPlacementSolver",RailNetLabelCornerPlacementSolver,instance=>[{inputProblem:instance.inputProblem,traces:Object.values(instance.postLabelTraceOverlapShiftSolver.correctedTraceMap),netLabelPlacements:instance.availableNetOrientationSolver.outputNetLabelPlacements,netLabelConnectorTraceIds:instance.availableNetOrientationSolver.netLabelConnectorTraceIds}]),definePipelineStep22("traceAnchoredNetLabelOverlapSolver",TraceAnchoredNetLabelOverlapSolver,instance=>[{inputProblem:instance.inputProblem,netLabelConnectorTraceIds:instance.availableNetOrientationSolver.netLabelConnectorTraceIds,traces:instance.railNetLabelCornerPlacementSolver.getOutput().traces,netLabelPlacements:instance.railNetLabelCornerPlacementSolver.outputNetLabelPlacements}]),definePipelineStep22("preAlignmentNetLabelTraceCollisionSolver",NetLabelTraceCollisionSolver,instance=>[{inputProblem:instance.inputProblem,traces:instance.railNetLabelCornerPlacementSolver.getOutput().traces,netLabelPlacements:instance.traceAnchoredNetLabelOverlapSolver.outputNetLabelPlacements}]),definePipelineStep22("preAlignmentTraceElbowTransitionSimplificationSolver",TraceElbowTransitionSimplificationSolver,instance=>{let collisionOutput=instance.preAlignmentNetLabelTraceCollisionSolver.getOutput();return[{inputProblem:instance.inputProblem,traces:collisionOutput.traces,completedReroutes:collisionOutput.completedReroutes,netLabelPlacements:collisionOutput.netLabelPlacements,paddingBuffer:.1,allowShorterPaths:!0}]}),definePipelineStep22("traceCleanupSolver2",TraceCleanupSolver,instance=>{let collisionOutput=instance.preAlignmentTraceElbowTransitionSimplificationSolver.getOutput(),labelMergingOutput=instance.traceLabelOverlapAvoidanceSolver.labelMergingSolver.getOutput();return[{inputProblem:instance.inputProblem,allTraces:collisionOutput.traces,allLabelPlacements:collisionOutput.netLabelPlacements,mergedLabelNetIdMap:labelMergingOutput.mergedLabelNetIdMap,paddingBuffer:.1,operations:["rerouting_generated_net_label_connector_crossings","aligning_same_net_rails"],eligibleTraceIds:new Set(instance.traceCleanupSolver.getOutput().traces.map(trace=>trace.mspPairId)),netLabelConnectorTraceIds:instance.availableNetOrientationSolver.netLabelConnectorTraceIds}]}),definePipelineStep22("netLabelTraceCollisionSolver",NetLabelTraceCollisionSolver,instance=>{let previousOutput=instance.preAlignmentNetLabelTraceCollisionSolver.getOutput(),alignmentOutput=instance.traceCleanupSolver2.getOutput(),connectorMovement=moveNetLabelConnectorsToReroutedTraces({originalTraces:previousOutput.traces,reroutedTraces:alignmentOutput.traces,netLabelPlacements:previousOutput.netLabelPlacements}),previousTraceMap=new Map(previousOutput.traces.map(trace=>[trace.mspPairId,trace])),netLabelPlacements=connectorMovement.netLabelPlacements;for(let trace of connectorMovement.traces){let previousTrace=previousTraceMap.get(trace.mspPairId);if(!previousTrace||previousTrace.tracePath===trace.tracePath)continue;let currentLabels=netLabelPlacements;netLabelPlacements=moveAttachedLabelsToReroutedTrace({trace:previousTrace,originalTracePath:previousTrace.tracePath,reroutedTracePath:trace.tracePath,netLabelPlacements:currentLabels}).map((movedLabel,labelIndex)=>{let label=currentLabels[labelIndex];return label.orientation==="y+"||label.orientation==="y-"?movedLabel:label})}return[{inputProblem:instance.inputProblem,traces:connectorMovement.traces,netLabelPlacements}]}),definePipelineStep22("finalTraceElbowTransitionSimplificationSolver",TraceElbowTransitionSimplificationSolver,instance=>{let collisionOutput=instance.netLabelTraceCollisionSolver.getOutput(),completedReroutes=[...instance.traceLabelOverlapAvoidanceSolver.getOutput().completedReroutes,...instance.preAlignmentNetLabelTraceCollisionSolver.getOutput().completedReroutes,...collisionOutput.completedReroutes];return[{inputProblem:instance.inputProblem,traces:collisionOutput.traces,completedReroutes,netLabelPlacements:collisionOutput.netLabelPlacements,paddingBuffer:.1,allowShorterPaths:!0}]}),definePipelineStep22("finalRailNetLabelCornerPlacementSolver",RailNetLabelCornerPlacementSolver,instance=>[{inputProblem:instance.inputProblem,...instance.finalTraceElbowTransitionSimplificationSolver.getOutput(),originalTraces:instance.railNetLabelCornerPlacementSolver.getOutput().traces,netLabelConnectorTraceIds:instance.availableNetOrientationSolver.netLabelConnectorTraceIds,onlyOverlappingLabels:!0}]),definePipelineStep22("netLabelNetLabelCollisionSolver",NetLabelNetLabelCollisionSolver,instance=>{let placementOutput=instance.finalRailNetLabelCornerPlacementSolver.getOutput();return[{inputProblem:instance.inputProblem,traces:placementOutput.traces,netLabelPlacements:placementOutput.netLabelPlacements,preserveNonInlineLabelsAgainstInlineEligibleCollisions:!0}]}),definePipelineStep22("finalTraceAnchoredNetLabelOverlapSolver",TraceAnchoredNetLabelOverlapSolver,instance=>[{inputProblem:instance.inputProblem,netLabelConnectorTraceIds:instance.availableNetOrientationSolver.netLabelConnectorTraceIds,traces:instance.netLabelNetLabelCollisionSolver.traces,netLabelPlacements:instance.netLabelNetLabelCollisionSolver.getOutput().netLabelPlacements,overlapMode:"traces"}]),definePipelineStep22("sameNetJunctionAlignmentSolver",SameNetJunctionAlignmentSolver,instance=>{let collisionOutput=instance.finalTraceAnchoredNetLabelOverlapSolver.getOutput();return[{inputProblem:instance.inputProblem,traces:instance.netLabelNetLabelCollisionSolver.traces,netLabelPlacements:collisionOutput.netLabelPlacements,netLabelConnectorTraceIds:instance.availableNetOrientationSolver.netLabelConnectorTraceIds}]}),definePipelineStep22("inlineDirectTraceRecoverySolver",NetLabelToTraceSolver,instance=>[{inputProblem:instance.inputProblem,...instance.sameNetJunctionAlignmentSolver.getOutput(),inlineNetLabelPlacements:[],netLabelConnectorTraceIds:instance.availableNetOrientationSolver.netLabelConnectorTraceIds},{onlyInlineDirectConnections:!0}]),definePipelineStep22("inlineNetLabelSolver",InlineNetLabelSolver,instance=>{let recoveredOutput=instance.inlineDirectTraceRecoverySolver.getOutput(),completedReroutes=[...instance.traceLabelOverlapAvoidanceSolver.getOutput().completedReroutes,...instance.preAlignmentNetLabelTraceCollisionSolver.getOutput().completedReroutes,...instance.netLabelTraceCollisionSolver.getOutput().completedReroutes];return[{inputProblem:instance.inputProblem,traces:recoveredOutput.traces,netLabelPlacements:recoveredOutput.netLabelPlacements,completedReroutes,resolveTraceCollisions:!0,netLabelConnectorTraceIds:instance.availableNetOrientationSolver.netLabelConnectorTraceIds}]}),definePipelineStep22("netLabelToTraceSolver",NetLabelToTraceSolver,instance=>{let inlineOutput=instance.inlineNetLabelSolver.getOutput();return[{inputProblem:instance.inputProblem,...inlineOutput}]})]);__publicField(this,"currentPipelineStepIndex",0);this.hideRatsNet=opts?.hideRatsNet??!1,this.inputProblem=this.cloneAndCorrectInputProblem(inputProblem),this.MAX_ITERATIONS=1e6,this.startTimeOfPhase={},this.endTimeOfPhase={},this.timeSpentOnPhase={},this.firstIterationOfPhase={}}getSolverName(){return"SchematicTracePipelineSolver"}getConstructorParams(){return[this.inputProblem,{hideRatsNet:this.hideRatsNet}]}cloneAndCorrectInputProblem(original){let cloned=structuredClone({...original,_chipObstacleSpatialIndex:void 0,_hideRatsNet:this.hideRatsNet});return expandChipsToFitPins(cloned),correctPinsInsideChips(cloned),cloned}_step(){let pipelineStepDef=this.pipelineDef[this.currentPipelineStepIndex];if(!pipelineStepDef){this.solved=!0;return}if(this.activeSubSolver){this.activeSubSolver.step(),this.activeSubSolver.solved?(this.endTimeOfPhase[pipelineStepDef.solverName]=performance.now(),this.timeSpentOnPhase[pipelineStepDef.solverName]=this.endTimeOfPhase[pipelineStepDef.solverName]-this.startTimeOfPhase[pipelineStepDef.solverName],pipelineStepDef.onSolved?.(this),this.activeSubSolver=null,this.currentPipelineStepIndex++):this.activeSubSolver.failed&&(this.error=this.activeSubSolver?.error,this.failed=!0,this.activeSubSolver=null);return}let constructorParams=pipelineStepDef.getConstructorParams(this);this.activeSubSolver=new pipelineStepDef.solverClass(...constructorParams),this[pipelineStepDef.solverName]=this.activeSubSolver,this.timeSpentOnPhase[pipelineStepDef.solverName]=0,this.startTimeOfPhase[pipelineStepDef.solverName]=performance.now(),this.firstIterationOfPhase[pipelineStepDef.solverName]=this.iterations}solveUntilPhase(phase){for(;this.getCurrentPhase().toLowerCase()!==phase.toLowerCase();)this.step()}getCurrentPhase(){return this.pipelineDef[this.currentPipelineStepIndex]?.solverName??"none"}visualize(){if(!this.solved&&this.activeSubSolver)return this.activeSubSolver.visualize();let visualizations=[visualizeInputProblem2(this.inputProblem,{hideRatsNet:this.hideRatsNet}),...this.pipelineDef.map(p22=>this[p22.solverName]?.visualize()).filter(Boolean).map((viz,stepIndex)=>{for(let rect of viz.rects??[])rect.step=stepIndex;for(let point62 of viz.points??[])point62.step=stepIndex;for(let circle3 of viz.circles??[])circle3.step=stepIndex;for(let text of viz.texts??[])text.step=stepIndex;for(let line2 of viz.lines??[])line2.step=stepIndex;return viz})];if(visualizations.length===1)return visualizations[0];let finalGraphics={points:visualizations.flatMap(v22=>v22.points||[]),rects:visualizations.flatMap(v22=>v22.rects||[]),lines:visualizations.flatMap(v22=>v22.lines||[]),circles:visualizations.flatMap(v22=>v22.circles||[]),texts:visualizations.flatMap(v22=>v22.texts||[])};return colorAvailableNetOrientationLabels(finalGraphics,this.inputProblem),finalGraphics}preview(){return this.activeSubSolver?this.activeSubSolver.preview():super.preview()}},POINT_EPSILON2=1e-8,isPointOnSegment32=(point62,start,end)=>{let cross5=(point62.y-start.y)*(end.x-start.x)-(point62.x-start.x)*(end.y-start.y);if(Math.abs(cross5)>POINT_EPSILON2)return!1;let dot4=(point62.x-start.x)*(end.x-start.x)+(point62.y-start.y)*(end.y-start.y);if(dot4<-POINT_EPSILON2)return!1;let squaredLength=(end.x-start.x)**2+(end.y-start.y)**2;return dot4<=squaredLength+POINT_EPSILON2},isPointInRing=(point62,ring4)=>{let isInside=!1;for(let currentIndex=0,previousIndex=ring4.vertices.length-1;currentIndex<ring4.vertices.length;previousIndex=currentIndex++){let current3=ring4.vertices[currentIndex],previous=ring4.vertices[previousIndex];if(isPointOnSegment32(point62,previous,current3))return!0;current3.y>point62.y!=previous.y>point62.y&&point62.x<(previous.x-current3.x)*(point62.y-current3.y)/(previous.y-current3.y)+current3.x&&(isInside=!isInside)}return isInside},isPointInShape=(point62,shape)=>isPointInRing(point62,shape.outer_ring)&&!shape.inner_rings.some(innerRing=>isPointInRing(point62,innerRing)),isPointInShapeUnion=(point62,shapes)=>shapes.some(shape=>isPointInShape(point62,shape)),getShapeUnionBounds=shapes=>{let vertices=shapes.flatMap(shape=>shape.outer_ring.vertices);if(vertices.length!==0)return{minX:Math.min(...vertices.map(vertex=>vertex.x)),maxX:Math.max(...vertices.map(vertex=>vertex.x)),minY:Math.min(...vertices.map(vertex=>vertex.y)),maxY:Math.max(...vertices.map(vertex=>vertex.y))}},isViaAnnulusInsideShapeUnion=({center:center2,radius,shapes})=>{let samplePoints=[center2];for(let sampleIndex=0;sampleIndex<32;sampleIndex++){let angle=sampleIndex/32*Math.PI*2;samplePoints.push({x:center2.x+Math.cos(angle)*radius,y:center2.y+Math.sin(angle)*radius})}return samplePoints.every(samplePoint=>isPointInShapeUnion(samplePoint,shapes))},layerMatches=(layer,layers)=>layers.some(candidateLayer=>String(candidateLayer)===String(layer)),componentToObstacle=component=>{if(!(component.do_not_place||!component.obstructs_within_bounds))return{kind:"rect",center:component.center,width:component.width,height:component.height,ccwRotation:component.rotation}},smtPadToObstacle=smtPad2=>smtPad2.shape==="circle"?{kind:"circle",center:{x:smtPad2.x,y:smtPad2.y},radius:smtPad2.radius}:smtPad2.shape==="polygon"?{kind:"polygon",points:smtPad2.points}:{kind:"rect",center:{x:smtPad2.x,y:smtPad2.y},width:smtPad2.width,height:smtPad2.height,ccwRotation:smtPad2.shape==="rotated_rect"||smtPad2.shape==="rotated_pill"?smtPad2.ccw_rotation:0},platedHoleToObstacle=platedHole2=>{if(platedHole2.shape==="circle")return{kind:"circle",center:{x:platedHole2.x,y:platedHole2.y},radius:platedHole2.outer_diameter/2};if("outer_width"in platedHole2)return{kind:"rect",center:{x:platedHole2.x,y:platedHole2.y},width:platedHole2.outer_width,height:platedHole2.outer_height,ccwRotation:platedHole2.ccw_rotation};if(platedHole2.shape==="hole_with_polygon_pad"){let rotationRadians=(platedHole2.ccw_rotation??0)*Math.PI/180,cosine=Math.cos(rotationRadians),sine=Math.sin(rotationRadians);return{kind:"polygon",points:platedHole2.pad_outline.map(point62=>({x:platedHole2.x+point62.x*cosine-point62.y*sine,y:platedHole2.y+point62.x*sine+point62.y*cosine}))}}return{kind:"rect",center:{x:platedHole2.x,y:platedHole2.y},width:platedHole2.rect_pad_width,height:platedHole2.rect_pad_height,ccwRotation:"rect_ccw_rotation"in platedHole2?platedHole2.rect_ccw_rotation??0:0}},holeToObstacle=hole=>"hole_diameter"in hole?hole.hole_shape==="circle"?{kind:"circle",center:{x:hole.x,y:hole.y},radius:hole.hole_diameter/2}:{kind:"rect",center:{x:hole.x,y:hole.y},width:hole.hole_diameter,height:hole.hole_diameter,ccwRotation:0}:{kind:"rect",center:{x:hole.x,y:hole.y},width:hole.hole_width,height:hole.hole_height,ccwRotation:hole.hole_shape==="rotated_pill"?hole.ccw_rotation:0},getDistanceToSegment=(point62,start,end)=>{let segmentX=end.x-start.x,segmentY=end.y-start.y,squaredLength=segmentX**2+segmentY**2;if(squaredLength===0)return Math.hypot(point62.x-start.x,point62.y-start.y);let projection=Math.max(0,Math.min(1,((point62.x-start.x)*segmentX+(point62.y-start.y)*segmentY)/squaredLength));return Math.hypot(point62.x-(start.x+projection*segmentX),point62.y-(start.y+projection*segmentY))},isPointInPolygon4=(point62,polygon2)=>{let isInside=!1;for(let currentIndex=0,previousIndex=polygon2.length-1;currentIndex<polygon2.length;previousIndex=currentIndex++){let current3=polygon2[currentIndex],previous=polygon2[previousIndex];current3.y>point62.y!=previous.y>point62.y&&point62.x<(previous.x-current3.x)*(point62.y-current3.y)/(previous.y-current3.y)+current3.x&&(isInside=!isInside)}return isInside},doesCircleIntersectObstacle=(center2,radius,obstacle)=>{if(obstacle.kind==="circle")return Math.hypot(center2.x-obstacle.center.x,center2.y-obstacle.center.y)<radius+obstacle.radius;if(obstacle.kind==="polygon")return isPointInPolygon4(center2,obstacle.points)?!0:obstacle.points.some((point62,pointIndex)=>getDistanceToSegment(center2,point62,obstacle.points[(pointIndex+1)%obstacle.points.length])<radius);let rotationRadians=-obstacle.ccwRotation*Math.PI/180,deltaX=center2.x-obstacle.center.x,deltaY=center2.y-obstacle.center.y,localX=deltaX*Math.cos(rotationRadians)-deltaY*Math.sin(rotationRadians),localY=deltaX*Math.sin(rotationRadians)+deltaY*Math.cos(rotationRadians),outsideX=Math.max(Math.abs(localX)-obstacle.width/2,0),outsideY=Math.max(Math.abs(localY)-obstacle.height/2,0);return Math.hypot(outsideX,outsideY)<radius},getStitchingObstacles=(circuitJson,layers)=>circuitJson.flatMap(element=>{if(element.type==="pcb_component"&&layerMatches(element.layer,layers)){let obstacle=componentToObstacle(element);return obstacle?[obstacle]:[]}return element.type==="pcb_smtpad"&&layerMatches(element.layer,layers)?[smtPadToObstacle(element)]:element.type==="pcb_plated_hole"&&element.layers.some(layer=>layerMatches(layer,layers))?[platedHoleToObstacle(element)]:element.type==="pcb_hole"?[holeToObstacle(element)]:[]}),doesViaIntersectStitchingObstacle=({center:center2,radius,obstacles})=>obstacles.some(obstacle=>doesCircleIntersectObstacle(center2,radius,obstacle)),resolveOptions=(options={})=>{let resolvedOptions={sourceNetIds:options.sourceNetIds?new Set(options.sourceNetIds):void 0,layers:options.layers??["top","bottom"],viaStitchPitch:options.viaStitchPitch??1,viaHoleDiameter:options.viaHoleDiameter??.3,viaOuterDiameter:options.viaOuterDiameter??.6,pourEdgeClearance:options.pourEdgeClearance??.2,obstacleClearance:options.obstacleClearance??.2,minimumViaSeparation:options.minimumViaSeparation??Math.max(options.viaOuterDiameter??.6,.8),gridOrigin:options.gridOrigin??{x:0,y:0},isTented:options.isTented??!0};for(let[optionName,optionValue]of[["viaStitchPitch",resolvedOptions.viaStitchPitch],["viaHoleDiameter",resolvedOptions.viaHoleDiameter],["viaOuterDiameter",resolvedOptions.viaOuterDiameter],["minimumViaSeparation",resolvedOptions.minimumViaSeparation]])if(!Number.isFinite(optionValue)||optionValue<=0)throw new Error(`${optionName} must be a finite number greater than zero`);if(!Number.isFinite(resolvedOptions.pourEdgeClearance)||resolvedOptions.pourEdgeClearance<0)throw new Error("pourEdgeClearance must be a finite non-negative number");if(!Number.isFinite(resolvedOptions.obstacleClearance)||resolvedOptions.obstacleClearance<0)throw new Error("obstacleClearance must be a finite non-negative number");if(!Number.isFinite(resolvedOptions.gridOrigin.x)||!Number.isFinite(resolvedOptions.gridOrigin.y))throw new Error("gridOrigin coordinates must be finite numbers");if(resolvedOptions.viaHoleDiameter>=resolvedOptions.viaOuterDiameter)throw new Error("viaHoleDiameter must be smaller than viaOuterDiameter");if(String(resolvedOptions.layers[0])===String(resolvedOptions.layers[1]))throw new Error("layers must contain two distinct PCB layers");return resolvedOptions},isBrepCopperPour=element=>element.type==="pcb_copper_pour"&&element.shape==="brep",getCopperPourPairContexts=(input2,options)=>{let sourceNetsById=new Map(input2.circuitJson.filter(element=>element.type==="source_net").map(sourceNet=>[sourceNet.source_net_id,sourceNet])),poursBySourceNetId=new Map;for(let element of input2.circuitJson){if(!isBrepCopperPour(element)||!element.source_net_id||options.sourceNetIds&&!options.sourceNetIds.has(element.source_net_id))continue;let sourceNetPours=poursBySourceNetId.get(element.source_net_id)??[];sourceNetPours.push(element),poursBySourceNetId.set(element.source_net_id,sourceNetPours)}let[fromLayer,toLayer]=options.layers,contexts=[];for(let[sourceNetId,sourceNetPours]of poursBySourceNetId){let fromLayerPours=sourceNetPours.filter(copperPour=>String(copperPour.layer)===String(fromLayer)),toLayerPours=sourceNetPours.filter(copperPour=>String(copperPour.layer)===String(toLayer));fromLayerPours.length===0||toLayerPours.length===0||contexts.push({sourceNetId,sourceNet:sourceNetsById.get(sourceNetId),fromLayerPours,toLayerPours})}return contexts},getPcbTraceViaRadius=(routePoint2,fallbackRadius)=>(routePoint2.outer_diameter??fallbackRadius*2)/2,isTooCloseToOccupiedVia=({center:center2,radius,occupiedVias,minimumViaSeparation})=>occupiedVias.some(occupiedVia=>Math.hypot(center2.x-occupiedVia.center.x,center2.y-occupiedVia.center.y)<Math.max(minimumViaSeparation,radius+occupiedVia.radius)),getGridCoordinates=({minimum,maximum,origin,pitch})=>{let coordinates=[],firstGridIndex=Math.ceil((minimum-origin)/pitch),lastGridIndex=Math.floor((maximum-origin)/pitch);for(let gridIndex=firstGridIndex;gridIndex<=lastGridIndex;gridIndex++)coordinates.push(origin+gridIndex*pitch);return coordinates},ViaStitchSolver=class extends BaseSolver{constructor(input2){super();__publicField(this,"input");__publicField(this,"options");__publicField(this,"copperPourPairContexts");__publicField(this,"pcbVias",[]);__publicField(this,"occupiedVias",[]);__publicField(this,"existingPcbViaIds",new Set);__publicField(this,"stitchingObstacles");__publicField(this,"nextCopperPourPairIndex",0);__publicField(this,"nextViaId",0);this.input=input2,this.options=resolveOptions(input2.options),this.copperPourPairContexts=getCopperPourPairContexts(input2,this.options),this.stitchingObstacles=getStitchingObstacles(input2.circuitJson,this.options.layers);let fallbackViaRadius=this.options.viaOuterDiameter/2;for(let element of input2.circuitJson)if(element.type==="pcb_via"){let pcbVia=element;this.existingPcbViaIds.add(pcbVia.pcb_via_id),this.occupiedVias.push({center:{x:pcbVia.x,y:pcbVia.y},radius:pcbVia.outer_diameter/2})}else if(element.type==="pcb_trace")for(let routePoint2 of element.route)routePoint2.route_type==="via"&&this.occupiedVias.push({center:{x:routePoint2.x,y:routePoint2.y},radius:getPcbTraceViaRadius(routePoint2,fallbackViaRadius)})}_step(){let copperPourPairContext=this.copperPourPairContexts[this.nextCopperPourPairIndex];if(!copperPourPairContext){this.solved=!0,this.progress=1;return}this.processCopperPourPair(copperPourPairContext),this.nextCopperPourPairIndex+=1,this.progress=this.copperPourPairContexts.length===0?1:this.nextCopperPourPairIndex/this.copperPourPairContexts.length,this.solved=this.nextCopperPourPairIndex===this.copperPourPairContexts.length}processCopperPourPair(context){let[fromLayer,toLayer]=this.options.layers,fromLayerShapes=context.fromLayerPours.map(copperPour=>copperPour.brep_shape),toLayerShapes=context.toLayerPours.map(copperPour=>copperPour.brep_shape),fromBounds=getShapeUnionBounds(fromLayerShapes),toBounds=getShapeUnionBounds(toLayerShapes);if(!fromBounds||!toBounds)return;let overlapBounds={minX:Math.max(fromBounds.minX,toBounds.minX),maxX:Math.min(fromBounds.maxX,toBounds.maxX),minY:Math.max(fromBounds.minY,toBounds.minY),maxY:Math.min(fromBounds.maxY,toBounds.maxY)};if(overlapBounds.minX>overlapBounds.maxX||overlapBounds.minY>overlapBounds.maxY)return;let viaRadius=this.options.viaOuterDiameter/2,requiredCopperRadius=viaRadius+this.options.pourEdgeClearance,requiredObstacleRadius=viaRadius+this.options.obstacleClearance,xCoordinates=getGridCoordinates({minimum:overlapBounds.minX+requiredCopperRadius,maximum:overlapBounds.maxX-requiredCopperRadius,origin:this.options.gridOrigin.x,pitch:this.options.viaStitchPitch}),yCoordinates=getGridCoordinates({minimum:overlapBounds.minY+requiredCopperRadius,maximum:overlapBounds.maxY-requiredCopperRadius,origin:this.options.gridOrigin.y,pitch:this.options.viaStitchPitch});for(let y22 of yCoordinates)for(let x22 of xCoordinates){let center2={x:x22,y:y22};if(isTooCloseToOccupiedVia({center:center2,radius:viaRadius,occupiedVias:this.occupiedVias,minimumViaSeparation:this.options.minimumViaSeparation})||doesViaIntersectStitchingObstacle({center:center2,radius:requiredObstacleRadius,obstacles:this.stitchingObstacles})||!isViaAnnulusInsideShapeUnion({center:center2,radius:requiredCopperRadius,shapes:fromLayerShapes})||!isViaAnnulusInsideShapeUnion({center:center2,radius:requiredCopperRadius,shapes:toLayerShapes}))continue;let pcbViaId=`via_stitch_via_${this.nextViaId++}`;for(;this.existingPcbViaIds.has(pcbViaId);)pcbViaId=`via_stitch_via_${this.nextViaId++}`;let referencePour=context.fromLayerPours[0],pcbVia={type:"pcb_via",pcb_via_id:pcbViaId,x:x22,y:y22,hole_diameter:this.options.viaHoleDiameter,outer_diameter:this.options.viaOuterDiameter,layers:[fromLayer,toLayer],from_layer:fromLayer,to_layer:toLayer,source_net_id:context.sourceNetId,subcircuit_id:referencePour.subcircuit_id,pcb_group_id:referencePour.pcb_group_id,subcircuit_connectivity_map_key:context.sourceNet?.subcircuit_connectivity_map_key,is_tented:this.options.isTented};this.pcbVias.push(pcbVia),this.existingPcbViaIds.add(pcbViaId),this.occupiedVias.push({center:center2,radius:viaRadius})}}getOutput(){return{processedCopperPourPairCount:this.copperPourPairContexts.length,pcbVias:this.pcbVias}}},SOLVERS={DogboneFanoutSolver,BusLanesSolver,BusLanesPipelineSolver,PackSolver2,LayoutPipelineSolver,AutoroutingPipelineSolver:bne,AssignableAutoroutingPipeline2:mj,AssignableAutoroutingPipeline3:CH,AutoroutingPipeline1_OriginalUnravel:jF,AutoroutingPipelineSolver3_HgPortPointPathing:ZH,AutoroutingPipelineSolver4:N02,AutoroutingPipelineSolver5:F02,AutoroutingPipelineSolver7_MultiGraph:g7,AutoroutingPipelineSolver8:b7,AutoroutingPipelineSolver9_PreloadedTraceGraph:bne,AutoroutingPipelineSolver9_Networked:Wne,AutoroutingPipelineSolver11_Simplification:Ise,CopperPourPipelineSolver,CreateFdmEnclosureSolver,FanoutSolver,ImplicitCopperPourPipelineSolver,SchematicTracePipelineSolver,ViaStitchSolver},AUTOROUTER_CACHE_KEY_PREFIX="capacity-autorouter:",cacheProvidersByLocalCacheEngine=new WeakMap;function isPromiseLike(value){return typeof value=="object"&&value!==null&&"then"in value&&typeof value.then=="function"}function isAsyncFunction(fn3){return fn3.constructor.name==="AsyncFunction"}var LocalCacheEngineCacheProvider=class{constructor(localCacheEngine2){__publicField(this,"localCacheEngine");__publicField(this,"isSyncCache");__publicField(this,"cacheHits",0);__publicField(this,"cacheMisses",0);__publicField(this,"cacheHitsByPrefix",{});__publicField(this,"cacheMissesByPrefix",{});__publicField(this,"knownCacheKeys",new Set);this.localCacheEngine=localCacheEngine2,this.isSyncCache=!isAsyncFunction(localCacheEngine2.getItem)&&!isAsyncFunction(localCacheEngine2.setItem)}getCachedSolutionSync(cacheKey){if(this.isSyncCache){this.knownCacheKeys.add(cacheKey);try{let cachedItem=this.localCacheEngine.getItem(this.getLocalCacheEngineKey(cacheKey));if(isPromiseLike(cachedItem)){this.isSyncCache=!1,Promise.resolve(cachedItem).catch(()=>{}),this.recordCacheMiss(cacheKey);return}return this.parseCachedItem(cacheKey,cachedItem)}catch{this.recordCacheMiss(cacheKey);return}}}async getCachedSolution(cacheKey){this.knownCacheKeys.add(cacheKey);try{let cachedItem=await this.localCacheEngine.getItem(this.getLocalCacheEngineKey(cacheKey));return this.parseCachedItem(cacheKey,cachedItem)}catch{this.recordCacheMiss(cacheKey);return}}setCachedSolutionSync(cacheKey,cachedSolution){if(this.isSyncCache){this.knownCacheKeys.add(cacheKey);try{let serializedSolution=JSON.stringify(cachedSolution);if(serializedSolution===void 0)return;let writeResult=this.localCacheEngine.setItem(this.getLocalCacheEngineKey(cacheKey),serializedSolution);isPromiseLike(writeResult)&&(this.isSyncCache=!1,Promise.resolve(writeResult).catch(()=>{}))}catch{}}}async setCachedSolution(cacheKey,cachedSolution){this.knownCacheKeys.add(cacheKey);try{let serializedSolution=JSON.stringify(cachedSolution);if(serializedSolution===void 0)return;await this.localCacheEngine.setItem(this.getLocalCacheEngineKey(cacheKey),serializedSolution)}catch{}}getAllCacheKeys(){return[...this.knownCacheKeys]}clearCache(){for(let cacheKey of this.knownCacheKeys){let localCacheEngineKey=this.getLocalCacheEngineKey(cacheKey);try{let clearResult=this.localCacheEngine.removeItem?this.localCacheEngine.removeItem(localCacheEngineKey):this.localCacheEngine.setItem(localCacheEngineKey,"null");isPromiseLike(clearResult)&&Promise.resolve(clearResult).catch(()=>{})}catch{}}this.knownCacheKeys.clear(),this.cacheHits=0,this.cacheMisses=0,this.cacheHitsByPrefix={},this.cacheMissesByPrefix={}}getLocalCacheEngineKey(cacheKey){return`${AUTOROUTER_CACHE_KEY_PREFIX}${cacheKey}`}parseCachedItem(cacheKey,cachedItem){if(cachedItem===null){this.recordCacheMiss(cacheKey);return}try{let cachedSolution=JSON.parse(cachedItem);if(cachedSolution===null){this.recordCacheMiss(cacheKey);return}return this.recordCacheHit(cacheKey),cachedSolution}catch{this.recordCacheMiss(cacheKey);return}}recordCacheHit(cacheKey){this.cacheHits++;let prefix=cacheKey.split(":")[0];this.cacheHitsByPrefix[prefix]=(this.cacheHitsByPrefix[prefix]??0)+1}recordCacheMiss(cacheKey){this.cacheMisses++;let prefix=cacheKey.split(":")[0];this.cacheMissesByPrefix[prefix]=(this.cacheMissesByPrefix[prefix]??0)+1}};function getCacheProviderForLocalCacheEngine(localCacheEngine2){let cacheProvider=cacheProvidersByLocalCacheEngine.get(localCacheEngine2);return cacheProvider||(cacheProvider=new LocalCacheEngineCacheProvider(localCacheEngine2),cacheProvidersByLocalCacheEngine.set(localCacheEngine2,cacheProvider)),cacheProvider}var getAutorouterSolverName=({useAssignableSolver=!1,useAutoJumperSolver=!1,autorouterVersion:autorouterVersion22,useLaserPrefabSolver=!1,useTraceSimplificationSolver=!1,platformConfig:platformConfig2,effort})=>{let pipeline9SolverName=platformConfig2?.useCloudAutorouter&&(effort===void 0||effort===1)?"AutoroutingPipelineSolver9_Networked":"AutoroutingPipelineSolver9_PreloadedTraceGraph";return useTraceSimplificationSolver?"AutoroutingPipelineSolver11_Simplification":autorouterVersion22==="beta_pipeline1"?"AutoroutingPipeline1_OriginalUnravel":autorouterVersion22==="beta_pipeline3"?"AutoroutingPipelineSolver3_HgPortPointPathing":autorouterVersion22==="beta_pipeline4"?"AutoroutingPipelineSolver4":autorouterVersion22==="beta_pipeline5"?"AutoroutingPipelineSolver5":autorouterVersion22==="beta_pipeline7"?"AutoroutingPipelineSolver7_MultiGraph":autorouterVersion22==="beta_pipeline9"||autorouterVersion22==="latest"?pipeline9SolverName:useLaserPrefabSolver?"AutoroutingPipelineSolver8":useAutoJumperSolver?"AssignableAutoroutingPipeline3":useAssignableSolver?"AssignableAutoroutingPipeline2":pipeline9SolverName};function getCapacityAutorouterCacheProvider(platformConfig2){return platformConfig2?.localCacheEngine?getCacheProviderForLocalCacheEngine(platformConfig2.localCacheEngine):null}var 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:autorouterVersion22,useLaserPrefabSolver=!1,useTraceSimplificationSolver=!1,effort,platformConfig:platformConfig2,onSolverStarted}=options,solverName=getAutorouterSolverName({useAssignableSolver,useAutoJumperSolver,autorouterVersion:autorouterVersion22,useLaserPrefabSolver,useTraceSimplificationSolver,platformConfig:platformConfig2,effort}),solverCacheProvider=getCapacityAutorouterCacheProvider(platformConfig2),solverOptions={capacityDepth,targetMinCapacity,cacheProvider:solverCacheProvider,effort};this.solver=solverName==="AutoroutingPipelineSolver9_Networked"?new Wne(input2,{...solverOptions,effort:1}):new SOLVERS[solverName](input2,solverOptions),onSolverStarted?.({solverName,solverParams:{input:input2,options:{capacityDepth,targetMinCapacity,cacheProvider:solverCacheProvider,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.getOutputSimplifiedPcbTraces()}),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:"getCurrentPhase"in this.solver?this.solver.getCurrentPhase():this.solver.activeSubSolver?.getSolverName()??this.solver.getSolverName(),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.getOutputSimplifiedPcbTraces()}getConnectedOffboardObstacles(){return"getConnectedOffboardObstacles"in this.solver?this.solver.getConnectedOffboardObstacles():{}}},createTscircuitAutorouterStrategy=(name,strategyOptions)=>({name,cacheable:!0,getSolverName:options=>getAutorouterSolverName({...options,...strategyOptions}),create:({simpleRouteJson,commonAutorouterOptions,onSolverStarted})=>new TscircuitAutorouter(simpleRouteJson,{...commonAutorouterOptions,...strategyOptions,onSolverStarted:details=>onSolverStarted?.({...details,solverConstructorArgs:[details.solverParams]})})}),defaultLocalAutorouterStrategy=createTscircuitAutorouterStrategy("tscircuit",{}),simplificationLocalAutorouterStrategy=createTscircuitAutorouterStrategy("tscircuit_simplify",{useTraceSimplificationSolver:!0}),createFanoutAutorouterStrategy=mode=>({name:mode,cacheable:!1,followUpAutorouter:"default",getSolverName:()=>"FanoutSolver",create:({simpleRouteJson,busFanoutDirections,fanoutBounds,fanoutRoutingLayers,allowBlindAndBuriedVias,componentNamesById,onSolverStarted})=>new FanoutAutorouter(simpleRouteJson,{mode,busFanoutDirections,fanoutBounds,fanoutRoutingLayers,allowBlindAndBuriedVias,componentNamesById,onSolverStarted})}),localAutorouterStrategies=new Map([["single_layer_fanout",createFanoutAutorouterStrategy("single_layer_fanout")],["fanout",createFanoutAutorouterStrategy("fanout")],["dogbone",{name:"dogbone",preserveOutputTraces:!0,followUpAutorouter:"default",cacheable:!1,getSolverName:()=>"DogboneFanoutSolver",create:({simpleRouteJson,fanoutRoutingLayers,onSolverStarted,onSolverEnded})=>new DogboneAutorouter({input:simpleRouteJson,fanoutRoutingLayers},{onSolverStarted,onSolverEnded})}],["bus_lanes",{name:"bus_lanes",cacheable:!1,getSolverName:()=>"BusLanesPipelineSolver",create:({simpleRouteJson,onSolverStarted})=>(onSolverStarted?.({solverName:"BusLanesPipelineSolver",solverParams:simpleRouteJson,solverConstructorArgs:[simpleRouteJson]}),new BusLanesAutorouter(simpleRouteJson))}],["simplify",simplificationLocalAutorouterStrategy]]),getLocalAutorouterStrategy=preset=>localAutorouterStrategies.get(preset??"")??defaultLocalAutorouterStrategy,getLocalAutoroutingStages=(autorouterConfig2,platformConfig2)=>{let strategy=getLocalAutorouterStrategy(autorouterConfig2.preset),stages=[{autorouterConfig:autorouterConfig2,strategy,usesPreviousStageOutput:!1}];if(strategy.followUpAutorouter&&!autorouterConfig2.algorithmFn){let followUpAutorouterConfig=getPresetAutoroutingConfig(strategy.followUpAutorouter,platformConfig2);stages.push({autorouterConfig:followUpAutorouterConfig,strategy:getLocalAutorouterStrategy(followUpAutorouterConfig.preset),usesPreviousStageOutput:!0})}return stages},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=su3(circuitJson).pcb_component.get(pcb_component_id);if(!pcb_component3)continue;let source_component=su3(circuitJson).source_component.get(pcb_component3.source_component_id);if(!source_component)continue;let existingPlacementIndex=updatedManualEditsFile.pcb_placements?.findIndex(p22=>p22.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=su3(circuitJson).schematic_component.get(schematic_component_id);if(!schematic_component22||!schematic_component22.source_component_id)continue;let source_component=su3(circuitJson).source_component.get(schematic_component22.source_component_id);if(!source_component)continue;let existingPlacementIndex=updatedManualEditsFile.schematic_placements?.findIndex(p22=>p22.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(su3(circuitJson).pcb_trace_hint.get(edit_event.pcb_trace_hint_id))circuitJson=circuitJson.map(e210=>e210.pcb_trace_hint_id===edit_event.pcb_trace_hint_id?{...e210,route:edit_event.route}:e210);else{let pcbPort=su3(circuitJson).pcb_port.get(edit_event.pcb_port_id);circuitJson=circuitJson.filter(e210=>!(e210.type==="pcb_trace_hint"&&e210.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(e210=>e210.type==="pcb_component"&&e210.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(e210=>e210.pcb_component_id!==editEvent.pcb_component_id?e210:transformPCBElement(e210,mat))}}else editEvent.edit_event_type==="edit_schematic_component_location"?circuitJson=circuitJson.map(e210=>e210.type==="schematic_component"&&e210.schematic_component_id===editEvent.schematic_component_id?{...e210,center:editEvent.new_center}:e210):editEvent.edit_event_type==="edit_pcb_trace_hint"&&(circuitJson=applyTraceHintEditEvent(circuitJson,editEvent));return circuitJson},getBusSourceTraceIdOrThrow=({bus,busSourceTraces,traceNameOrPortSelector})=>{let sourceTracesWithMatchingName=busSourceTraces.filter(sourceTrace2=>sourceTrace2.name===traceNameOrPortSelector),selectedSourcePortId=(sourceTracesWithMatchingName.length===0?bus.getSubcircuit().selectOne(traceNameOrPortSelector,{type:"port"}):null)?.source_port_id??void 0,matchingSourceTraces=selectedSourcePortId?busSourceTraces.filter(sourceTrace2=>sourceTrace2.connected_source_port_ids.includes(selectedSourcePortId)):sourceTracesWithMatchingName;if(matchingSourceTraces.length===0)throw new Error(`Could not find source trace for trace name or port selector "${traceNameOrPortSelector}" in bus "${bus.name}"`);if(matchingSourceTraces.length>1)throw new Error(`Trace name or port selector "${traceNameOrPortSelector}" matches multiple source traces in bus "${bus.name}"`);return matchingSourceTraces[0].source_trace_id},Bus=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"source_bus_id")}get config(){return{componentName:"Bus",zodProps:busProps}}doInitialSourceAddConnectivityMapKey(){let{db:db22}=this.root,subcircuit_id=this.getSubcircuit().subcircuit_id,busSourceTraces=db22.source_trace.list().filter(sourceTrace=>sourceTrace.subcircuit_id===subcircuit_id),source_trace_ids=this._parsedProps.connections.map(traceNameOrPortSelector=>getBusSourceTraceIdOrThrow({bus:this,busSourceTraces,traceNameOrPortSelector}));if(new Set(source_trace_ids).size!==source_trace_ids.length)throw new Error(`Bus "${this.name}" resolves multiple entries to one trace`);let sourceBus=db22.source_bus.insert({name:this._parsedProps.name,source_trace_ids,max_length_skew:this._parsedProps.maxLengthSkew,subcircuit_id});this.source_bus_id=sourceBus.source_bus_id}},resolvePointToPointConnection=(differentialPair,connectionSelector)=>{let{db:db22}=differentialPair.root,subcircuit=differentialPair.getSubcircuit(),subcircuitSourceTraces=db22.source_trace.list().filter(sourceTrace=>sourceTrace.subcircuit_id===subcircuit.subcircuit_id),matchingSourceTraces=subcircuitSourceTraces.filter(sourceTrace=>sourceTrace.name===connectionSelector),connectivityMapKeys=new Set;if(matchingSourceTraces.length>0)for(let sourceTrace of matchingSourceTraces)sourceTrace.subcircuit_connectivity_map_key&&connectivityMapKeys.add(sourceTrace.subcircuit_connectivity_map_key);else{let selectedPort=subcircuit.selectOne(connectionSelector,{type:"port"});if(selectedPort?.source_port_id){let sourcePort=db22.source_port.get(selectedPort.source_port_id);sourcePort?.subcircuit_connectivity_map_key&&connectivityMapKeys.add(sourcePort.subcircuit_connectivity_map_key)}}if(connectivityMapKeys.size!==1)return;let connectivityMapKey=connectivityMapKeys.values().next().value;if(!connectivityMapKey)return;let sourcePorts=db22.source_port.list().filter(sourcePort=>sourcePort.subcircuit_connectivity_map_key===connectivityMapKey);return{sourceTraceIds:subcircuitSourceTraces.filter(trace=>trace.subcircuit_connectivity_map_key===connectivityMapKey).map(trace=>trace.source_trace_id),sourcePorts,sourceTraceName:matchingSourceTraces.length>0?connectionSelector:void 0}},formatTerminalPinList=terminalPinSelectors=>terminalPinSelectors.length<=1?terminalPinSelectors.join(""):terminalPinSelectors.length===2?`${terminalPinSelectors[0]} and ${terminalPinSelectors[1]}`:`${terminalPinSelectors.slice(0,-1).join(", ")}, and ${terminalPinSelectors.at(-1)}`,getTerminalPinSelector=(sourcePort,sourceComponentsById)=>{let sourceComponent;if(sourcePort.source_component_id&&(sourceComponent=sourceComponentsById.get(sourcePort.source_component_id)),!sourceComponent?.name)return sourcePort.source_port_id;let portName=sourcePort.most_frequently_referenced_by_name??sourcePort.name;return`.${sourceComponent.name} > .${portName}`},getPointToPointWarningMessage=({differentialPairName,connectionPolarity,connectionSelector,sourceTraceName,terminalPinSelectors})=>{let terminalList=formatTerminalPinList(terminalPinSelectors),terminalListDescription=terminalList?`: ${terminalList}`:"";return sourceTraceName&&terminalPinSelectors.length>2?`Differential pair "${differentialPairName}" ${connectionPolarity}Connection uses the ambiguous trace name "${sourceTraceName}": its connection has more than 2 terminal pins${terminalListDescription}.`:`Differential pair "${differentialPairName}" ${connectionPolarity}Connection="${connectionSelector}" is not point-to-point: expected exactly 2 terminal pins, found ${terminalPinSelectors.length}${terminalListDescription}.`},DifferentialPair_doInitialSourceDesignRuleChecks=differentialPair=>{let{db:db22}=differentialPair.root,sourceComponentsById=new Map;for(let sourceComponent of db22.source_component.list())sourceComponentsById.set(sourceComponent.source_component_id,{name:sourceComponent.name});let memberTraceIds=[],resolvedPolarityCount=0;for(let connectionPolarity of["positive","negative"]){let connectionSelector=differentialPair._parsedProps.negativeConnection;connectionPolarity==="positive"&&(connectionSelector=differentialPair._parsedProps.positiveConnection);let resolvedConnection=resolvePointToPointConnection(differentialPair,connectionSelector);if(!resolvedConnection)continue;resolvedPolarityCount++,memberTraceIds.push(...resolvedConnection.sourceTraceIds);let terminalSourcePorts=resolvedConnection.sourcePorts;if(terminalSourcePorts.length===2)continue;let warningSourceComponentId="",firstTerminalSourcePort=terminalSourcePorts[0];if(firstTerminalSourcePort){if(!firstTerminalSourcePort.source_component_id)throw new Error(`Differential pair "${differentialPair.name}" resolved terminal port "${firstTerminalSourcePort.source_port_id}" without a source_component_id`);warningSourceComponentId=firstTerminalSourcePort.source_component_id}let terminalPinSelectors=terminalSourcePorts.map(sourcePort=>getTerminalPinSelector(sourcePort,sourceComponentsById)).sort((selectorA,selectorB)=>selectorA.localeCompare(selectorB));db22.source_property_ignored_warning.insert({source_component_id:warningSourceComponentId,property_name:`${connectionPolarity}Connection`,error_type:"source_property_ignored_warning",message:getPointToPointWarningMessage({differentialPairName:differentialPair.name,connectionPolarity,connectionSelector,sourceTraceName:resolvedConnection.sourceTraceName,terminalPinSelectors}),subcircuit_id:differentialPair.getSubcircuit().subcircuit_id??void 0})}resolvedPolarityCount===2&&memberTraceIds.length>0&&db22.source_bus.insert({name:differentialPair.name,source_trace_ids:[...new Set(memberTraceIds)],max_length_skew:differentialPair._parsedProps.maxLengthSkew,subcircuit_id:differentialPair.getSubcircuit().subcircuit_id??void 0})},DifferentialPair=class extends PrimitiveComponent2{get config(){return{componentName:"DifferentialPair",zodProps:differentialPairProps}}doInitialSourceDesignRuleChecks(){DifferentialPair_doInitialSourceDesignRuleChecks(this)}},expandSrjBoundsToIncludeConnectionPoints=input2=>{let expandedBounds={...input2.bounds};for(let connection of input2.connections)if(!connection.isOffBoard)for(let point62 of connection.pointsToConnect)expandedBounds.minX=Math.min(expandedBounds.minX,point62.x),expandedBounds.maxX=Math.max(expandedBounds.maxX,point62.x),expandedBounds.minY=Math.min(expandedBounds.minY,point62.y),expandedBounds.maxY=Math.max(expandedBounds.maxY,point62.y);return expandedBounds},getSrjOutlineForRoutingBounds=({bounds,outline},routingBounds2)=>{if(outline)return outline;if(!(bounds.minX===routingBounds2.minX&&bounds.maxX===routingBounds2.maxX&&bounds.minY===routingBounds2.minY&&bounds.maxY===routingBounds2.maxY))return new Box(bounds.minX,bounds.minY,bounds.maxX,bounds.maxY).toPoints().map(({x:x22,y:y22})=>({x:x22,y:y22}))},getBusSrjConnectionNamesOrThrow=({srjConnections,bus,sourceTraceId,traceNameOrPortSelector,busSourceTraces})=>{let directSrjConnections=srjConnections.filter(srjConnection=>srjConnection.source_trace_id===sourceTraceId);if(directSrjConnections.length>0)return directSrjConnections.map(srjConnection=>srjConnection.name);let sourceTrace=busSourceTraces.find(trace=>trace.source_trace_id===sourceTraceId),connectedSourceTraces=busSourceTraces.filter(trace=>trace.source_trace_id===sourceTraceId||sourceTrace.subcircuit_connectivity_map_key!==void 0&&trace.subcircuit_connectivity_map_key===sourceTrace.subcircuit_connectivity_map_key),connectedSourceNetIds=new Set(connectedSourceTraces.flatMap(trace=>trace.connected_source_net_ids??[])),matchingSrjConnections=srjConnections.filter(srjConnection=>connectedSourceNetIds.has(srjConnection.name));if(matchingSrjConnections.length===0)throw new Error(`Could not find an SRJ connection for "${traceNameOrPortSelector}" in bus "${bus.name}"`);return matchingSrjConnections.map(srjConnection=>srjConnection.name)},normalizeNetName=netNameOrSelector=>netNameOrSelector.trim().replace(/^net\./,"").replace(/^\./,""),getPlaneTerminatedSourceTraceLayers=({fanoutPourNetMap,sourceNets,sourceTraces,subcircuitId})=>{let traceLayers=new Map;if(!fanoutPourNetMap)return traceLayers;let planeLayerBySourceNetId=new Map;for(let[layer,netOrNets]of Object.entries(fanoutPourNetMap)){let netNames=Array.isArray(netOrNets)?netOrNets:[netOrNets];for(let netNameOrSelector of netNames){let netName=normalizeNetName(netNameOrSelector);for(let sourceNet of sourceNets){if(sourceNet.name!==netName)continue;let previousLayer=planeLayerBySourceNetId.get(sourceNet.source_net_id);if(previousLayer&&previousLayer!==layer)throw new Error(`Fanout plane net "${netName}" maps to multiple layers ("${previousLayer}" and "${layer}"); use fanoutPourNetMap to select one`);planeLayerBySourceNetId.set(sourceNet.source_net_id,layer)}}}for(let sourceTrace of sourceTraces){if(subcircuitId&&sourceTrace.subcircuit_id!==subcircuitId||sourceTrace.connected_source_port_ids.length!==1)continue;let mappedLayers=new Set((sourceTrace.connected_source_net_ids??[]).map(sourceNetId=>planeLayerBySourceNetId.get(sourceNetId)).filter(layer2=>layer2!==void 0));if(mappedLayers.size>1)throw new Error(`Source trace "${sourceTrace.name??sourceTrace.source_trace_id}" connects to fanout planes on multiple layers`);let layer=mappedLayers.values().next().value;layer&&traceLayers.set(sourceTrace.source_trace_id,layer)}return traceLayers},getBusesForSimpleRouteJson=({srjConnections,buses,sourceTraces,subcircuitId,planeTerminatedSourceTraceLayers,preservedSourceTraceIds})=>{let declaredSrjBuses=[];for(let bus of buses){let busSubcircuitId=bus.getSubcircuit().subcircuit_id;if(subcircuitId&&busSubcircuitId!==subcircuitId)continue;let busSourceTraces=sourceTraces.filter(sourceTrace=>sourceTrace.subcircuit_id===busSubcircuitId),connectionNames=bus._parsedProps.connections.flatMap(traceNameOrPortSelector=>{let sourceTraceId=getBusSourceTraceIdOrThrow({bus,busSourceTraces,traceNameOrPortSelector});return preservedSourceTraceIds?.has(sourceTraceId)?[]:getBusSrjConnectionNamesOrThrow({srjConnections,bus,sourceTraceId,traceNameOrPortSelector,busSourceTraces})});if(new Set(connectionNames).size!==connectionNames.length)throw new Error(`Bus "${bus.name}" resolves multiple entries to one trace`);connectionNames.length!==0&&declaredSrjBuses.push({busId:bus.name,name:bus.name,connectionNames,...bus._parsedProps.maxLengthSkew!==void 0?{maxLengthSkew:bus._parsedProps.maxLengthSkew}:{},...bus._parsedProps.pcbTraceWidth!==void 0?{traceWidth:bus._parsedProps.pcbTraceWidth}:{},...bus._parsedProps.pcbAllowedLayers!==void 0?{allowedLayers:bus._parsedProps.pcbAllowedLayers}:{},...bus._parsedProps.preferredLayer!==void 0?{preferredLayer:bus._parsedProps.preferredLayer}:{},...bus._parsedProps.preferredLayers!==void 0?{preferredLayers:bus._parsedProps.preferredLayers}:{}})}let planeSrjBuses=[];for(let[sourceTraceId,layer]of planeTerminatedSourceTraceLayers??[]){let sourceTrace=sourceTraces.find(candidate=>candidate.source_trace_id===sourceTraceId),srjConnection=srjConnections.find(connection=>connection.source_trace_id===sourceTraceId);if(!sourceTrace||!srjConnection)continue;let busId=sourceTrace.name??sourceTrace.source_trace_id;if([...declaredSrjBuses,...planeSrjBuses].some(bus=>bus.busId===busId))throw new Error(`Fanout plane trace "${busId}" conflicts with an existing bus name`);planeSrjBuses.push({busId,name:busId,connectionNames:[srjConnection.name],termination:{type:"plane",layer}})}let srjBuses=[...planeSrjBuses,...declaredSrjBuses];return srjBuses.length>0?srjBuses:void 0},getDifferentialPairSourceTracesByTraceName=(differentialPairSourceTraces,traceName)=>differentialPairSourceTraces.filter(sourceTrace=>sourceTrace.name===traceName),getDifferentialPairSourceTracesByPortId=(differentialPairSourceTraces,sourcePortId)=>differentialPairSourceTraces.filter(sourceTrace=>sourceTrace.connected_source_port_ids.includes(sourcePortId)),getDifferentialPairTraceSubcircuitConnectivityMapKeyOrThrow=({differentialPair,differentialPairSourceTraces,traceNameOrPortSelector})=>{let differentialPairSubcircuit=differentialPair.getSubcircuit(),sourceTracesWithMatchingName=getDifferentialPairSourceTracesByTraceName(differentialPairSourceTraces,traceNameOrPortSelector),selectedSourcePortId=(sourceTracesWithMatchingName.length===0?differentialPairSubcircuit.selectOne(traceNameOrPortSelector,{type:"port"}):null)?.source_port_id??void 0,matchingSourceTraces=selectedSourcePortId?getDifferentialPairSourceTracesByPortId(differentialPairSourceTraces,selectedSourcePortId):sourceTracesWithMatchingName;if(matchingSourceTraces.length===0)throw new Error(`Could not find source trace for trace name or port selector "${traceNameOrPortSelector}" in differential pair "${differentialPair.name}"`);if(matchingSourceTraces.length>1)throw new Error(`Trace name or port selector "${traceNameOrPortSelector}" matches multiple source traces for differential pair "${differentialPair.name}"`);let sourceTrace=matchingSourceTraces[0];if(!sourceTrace)throw new Error(`Expected one source trace for trace name or port selector "${traceNameOrPortSelector}" in differential pair "${differentialPair.name}"`);let subcircuitConnectivityMapKey=sourceTrace.subcircuit_connectivity_map_key;if(!subcircuitConnectivityMapKey)throw new Error(`Source trace "${sourceTrace.source_trace_id}" does not have a subcircuit connectivity map key for differential pair "${differentialPair.name}"`);return subcircuitConnectivityMapKey},getDifferentialPairSrjConnectionNamesByCohortOrThrow=({srjConnections,differentialPairName,differentialPairSourceTraces,traceSubcircuitConnectivityMapKey,traceNameOrPortSelector})=>{let differentialPairSourceTraceIds=[],differentialPairSourceNetIds=new Set;for(let sourceTrace of differentialPairSourceTraces)if(sourceTrace.subcircuit_connectivity_map_key===traceSubcircuitConnectivityMapKey){differentialPairSourceTraceIds.push(sourceTrace.source_trace_id);for(let sourceNetId of sourceTrace.connected_source_net_ids??[])differentialPairSourceNetIds.add(sourceNetId)}let matchingSrjConnections=[];for(let srjConnection of srjConnections)(differentialPairSourceNetIds.has(srjConnection.name)||srjConnection.source_trace_id&&differentialPairSourceTraceIds.includes(srjConnection.source_trace_id))&&matchingSrjConnections.push(srjConnection);if(matchingSrjConnections.length===0)throw new Error(`Could not find an SRJ connection for trace name or port selector "${traceNameOrPortSelector}" in differential pair "${differentialPairName}"`);let connectionNamesByCohort=new Map;for(let srjConnection of matchingSrjConnections){let cohort=srjConnection.routingPcbGroupId;if(connectionNamesByCohort.has(cohort)){let cohortLabel=cohort===void 0?"the global routing cohort":`routing PCB group "${cohort}"`;throw new Error(`Subcircuit connectivity map key "${traceSubcircuitConnectivityMapKey}" matches multiple SRJ connections in ${cohortLabel} for differential pair "${differentialPairName}"`)}connectionNamesByCohort.set(cohort,srjConnection.name)}return connectionNamesByCohort},getDifferentialPairCohortLabel=cohort=>cohort===void 0?"the global routing cohort":`routing PCB group "${cohort}"`,getDifferentialPairsForSimpleRouteJson=({srjConnections,differentialPairs,sourceTraces,subcircuitId})=>{let srjDifferentialPairs=[];for(let differentialPair of differentialPairs){let differentialPairSubcircuitId=differentialPair.getSubcircuit().subcircuit_id;if(subcircuitId&&differentialPairSubcircuitId!==subcircuitId)continue;let differentialPairSourceTraces=sourceTraces.filter(sourceTrace=>sourceTrace.subcircuit_id===differentialPairSubcircuitId),positiveTraceNameOrPortSelector=differentialPair._parsedProps.positiveConnection,negativeTraceNameOrPortSelector=differentialPair._parsedProps.negativeConnection,positiveSubcircuitConnectivityMapKey=getDifferentialPairTraceSubcircuitConnectivityMapKeyOrThrow({differentialPair,differentialPairSourceTraces,traceNameOrPortSelector:positiveTraceNameOrPortSelector}),negativeSubcircuitConnectivityMapKey=getDifferentialPairTraceSubcircuitConnectivityMapKeyOrThrow({differentialPair,differentialPairSourceTraces,traceNameOrPortSelector:negativeTraceNameOrPortSelector}),positiveSrjConnectionNamesByCohort=getDifferentialPairSrjConnectionNamesByCohortOrThrow({srjConnections,differentialPairName:differentialPair.name,differentialPairSourceTraces,traceSubcircuitConnectivityMapKey:positiveSubcircuitConnectivityMapKey,traceNameOrPortSelector:positiveTraceNameOrPortSelector}),negativeSrjConnectionNamesByCohort=getDifferentialPairSrjConnectionNamesByCohortOrThrow({srjConnections,differentialPairName:differentialPair.name,differentialPairSourceTraces,traceSubcircuitConnectivityMapKey:negativeSubcircuitConnectivityMapKey,traceNameOrPortSelector:negativeTraceNameOrPortSelector}),lengthTolerance=differentialPair._parsedProps.maxLengthSkew??.1;for(let cohort of positiveSrjConnectionNamesByCohort.keys())if(!negativeSrjConnectionNamesByCohort.has(cohort))throw new Error(`Differential pair "${differentialPair.name}" has a positive SRJ connection in ${getDifferentialPairCohortLabel(cohort)} without a matching negative SRJ connection`);for(let cohort of negativeSrjConnectionNamesByCohort.keys())if(!positiveSrjConnectionNamesByCohort.has(cohort))throw new Error(`Differential pair "${differentialPair.name}" has a negative SRJ connection in ${getDifferentialPairCohortLabel(cohort)} without a matching positive SRJ connection`);for(let[cohort,positiveSrjConnectionName]of positiveSrjConnectionNamesByCohort){let negativeSrjConnectionName=negativeSrjConnectionNamesByCohort.get(cohort);srjDifferentialPairs.push({connectionNames:[positiveSrjConnectionName,negativeSrjConnectionName],lengthTolerance,...differentialPair._parsedProps.pcbTraceGap!==void 0?{traceGap:differentialPair._parsedProps.pcbTraceGap}:{},...differentialPair._parsedProps.maxUncoupledLength!==void 0?{maxUncoupledLength:differentialPair._parsedProps.maxUncoupledLength}:{}})}}return srjDifferentialPairs.length>0?srjDifferentialPairs:void 0},getLayerName=layer=>typeof layer=="string"?layer:layer.name,getPreservedTraceConnectionName=trace=>trace.source_trace_id??trace.connection_name??trace.pcb_trace_id,getPhysicalConnectionIdsForPreservedTrace=trace=>{let physicallyConnectedIds=new Set(trace.connectsTo??[]);for(let routePoint2 of trace.route)if(routePoint2.route_type==="wire")for(let pcbPortId of[routePoint2.start_pcb_port_id,routePoint2.end_pcb_port_id])pcbPortId&&physicallyConnectedIds.add(pcbPortId);return Array.from(physicallyConnectedIds)},getSimpleRouteForPreservedTrace=trace=>trace.route.map(routePoint2=>{if(routePoint2.route_type==="wire")return{route_type:"wire",x:routePoint2.x,y:routePoint2.y,width:routePoint2.width,layer:getLayerName(routePoint2.layer)};if(routePoint2.route_type==="via"){let preservedViaRoutePoint=routePoint2,viaDiameter=preservedViaRoutePoint.outer_diameter??preservedViaRoutePoint.via_diameter,viaHoleDiameter=preservedViaRoutePoint.hole_diameter??preservedViaRoutePoint.via_hole_diameter;return{route_type:"via",x:routePoint2.x,y:routePoint2.y,from_layer:getLayerName(routePoint2.from_layer),to_layer:getLayerName(routePoint2.to_layer),...viaDiameter!==void 0?{via_diameter:viaDiameter}:{},...viaHoleDiameter!==void 0?{via_hole_diameter:viaHoleDiameter}:{}}}return{route_type:"through_obstacle",start:routePoint2.start,end:routePoint2.end,from_layer:getLayerName(routePoint2.start_layer),to_layer:getLayerName(routePoint2.end_layer),width:routePoint2.width}}),getPreservedRoutedSubcircuitTraces=({scopedDb,relevantSubcircuitIds})=>scopedDb.pcb_trace.list().filter(trace=>!trace.subcircuit_id||trace.pcb_component_id&&!trace.source_trace_id?!1:relevantSubcircuitIds===null||relevantSubcircuitIds.has(trace.subcircuit_id)).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,connectsTo:getPhysicalConnectionIdsForPreservedTrace(preservedTrace),route:getSimpleRouteForPreservedTrace(preservedTrace)}}).filter(trace=>trace.route.length>=2),COPPER_POUR_RECT_HEIGHT=.5,dedupeStrings2=values=>Array.from(new Set(values.filter(value=>!!value))),getLayerName2=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:group2,board})=>outline&&outline.length>=3?outline:group2?.outline&&group2.outline.length>=3?group2.outline:board?.outline&&board.outline.length>=3?board.outline:null,getCopperPourBoundsRect=({group:group2,board})=>group2?.width&&group2.height?{center:group2.center,width:group2.width,height:group2.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:group2})=>{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=getLayerName2(props.layer),connectedTo=getCopperPourConnectedTo(net,connMap);if(connectedTo.length===0)continue;let boundary=getCopperPourBoundary({outline:props.outline,group:group2,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:group2,board});boundsRect&&obstacles.push(createCopperPourObstacle({layer,connectedTo,center:boundsRect.center,width:boundsRect.width,height:boundsRect.height}))}return obstacles},getSrjConnectionPointsFromPcbTraceHints=(connectedPcbPorts,pcbTraceHints)=>{let connectedPcbPortById=new Map(connectedPcbPorts.map(pcbPort=>[pcbPort.pcb_port_id,pcbPort]));return pcbTraceHints.flatMap(pcbTraceHint=>{let pcbPort=connectedPcbPortById.get(pcbTraceHint.pcb_port_id);if(!pcbPort)return[];let layer=pcbPort.layers?.[0]??"top";return pcbTraceHint.route.map(routePoint2=>({x:routePoint2.x,y:routePoint2.y,layer}))})},getOwningPcbBoardForSubcircuit=(db22,subcircuitId)=>{let visitedSubcircuitIds=new Set,currentSubcircuitId=subcircuitId,isRequestedSubcircuit=!0;for(;currentSubcircuitId&&!visitedSubcircuitIds.has(currentSubcircuitId);){visitedSubcircuitIds.add(currentSubcircuitId);let sourceGroup=db22.source_group.getWhere({subcircuit_id:currentSubcircuitId}),sourceBoard=sourceGroup?db22.source_board.getWhere({source_group_id:sourceGroup.source_group_id}):void 0;if(sourceBoard)return{board:db22.pcb_board.getWhere({source_board_id:sourceBoard.source_board_id})??null,subcircuitIsBoard:isRequestedSubcircuit};currentSubcircuitId=sourceGroup?.parent_subcircuit_id??null,isRequestedSubcircuit=!1}return{board:null,subcircuitIsBoard:!1}},getSimpleRouteJsonFromCircuitJson=({db:db22,circuitJson,subcircuit_id,minTraceWidth,minTraceToPadEdgeClearance,minTraceToHoleEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance,minViaHoleDiameter,minViaPadDiameter,nominalTraceWidth,subcircuitComponent,routingPcbGroupId,fanoutPourNetMap,ignoreExistingTopLevelPcbRouteState=!1})=>{if(!db22&&circuitJson&&(db22=su3(circuitJson)),!db22)throw new Error("db or circuitJson is required");let traceHints=db22.pcb_trace_hint.list(),relevantSubcircuitIds=subcircuit_id?new Set([subcircuit_id]):null;if(subcircuit_id){let descendantSubcircuitIds=getDescendantSubcircuitIds2(db22,subcircuit_id);for(let id3 of descendantSubcircuitIds)relevantSubcircuitIds.add(id3)}let subcircuitElements=(circuitJson??db22.toArray()).filter(e210=>!subcircuit_id||"subcircuit_id"in e210&&relevantSubcircuitIds.has(e210.subcircuit_id)),board=null,subcircuitIsBoard=!1;if(subcircuit_id){let owningBoard=getOwningPcbBoardForSubcircuit(db22,subcircuit_id);board=owningBoard.board,subcircuitIsBoard=owningBoard.subcircuitIsBoard&&board!==null}board||(board=db22.pcb_board.list()[0]),db22=su3(subcircuitElements);let getPortSelector=sourcePort=>{if(!sourcePort?.source_component_id)return;let sourceComponent=db22.source_component.get(sourcePort.source_component_id);if(sourceComponent?.name)return`${sourceComponent.name}.${sourcePort.name}`},pcbGroup=routingPcbGroupId?db22.pcb_group.get(routingPcbGroupId):subcircuit_id?db22.pcb_group.getWhere({subcircuit_id}):void 0,activeRoutingPcbGroupId=subcircuitComponent?.pcb_group_id;activeRoutingPcbGroupId==null&&!subcircuitIsBoard&&(activeRoutingPcbGroupId=pcbGroup?.pcb_group_id);let sharedConnMap=getFullConnectivityMapFromCircuitJson(subcircuitElements),breakoutPoints=db22.pcb_breakout_point.list().filter(bp22=>!subcircuit_id||relevantSubcircuitIds?.has(bp22.subcircuit_id)),breakoutPointIsInActiveRoutingGroup=breakoutPoint=>breakoutPoint.subcircuit_id===subcircuit_id&&(activeRoutingPcbGroupId?breakoutPoint.pcb_group_id===activeRoutingPcbGroupId:!subcircuitIsBoard),preservedRoutedSubcircuitTraces=getPreservedRoutedSubcircuitTraces({scopedDb:db22,relevantSubcircuitIds}),preservedSrjTraceByPcbTraceId=new Map(preservedRoutedSubcircuitTraces.map(trace=>[trace.pcb_trace_id,trace])),isPcbViaRepresentedByPreservedSrjTrace=via=>{if(!via.pcb_trace_id)return!1;let preservedTrace=preservedSrjTraceByPcbTraceId.get(via.pcb_trace_id);if(!preservedTrace)return!1;let pcbViaLayerNames=new Set(via.layers);return preservedTrace.route.some(routePoint2=>{if(routePoint2.route_type!=="via"||routePoint2.x!==via.x||routePoint2.y!==via.y)return!1;let routeViaLayerNames=new Set(getViaSpanLayers({fromLayer:routePoint2.from_layer,toLayer:routePoint2.to_layer,layerCount:board?.num_layers??2}));return routeViaLayerNames.size===pcbViaLayerNames.size&&[...routeViaLayerNames].every(layer=>pcbViaLayerNames.has(layer))})},obstacles=getObstaclesFromCircuitJson2([...board?[board]:[],...db22.source_component.list(),...db22.source_port.list(),...db22.pcb_port.list(),...db22.pcb_component.list(),...db22.pcb_smtpad.list(),...db22.pcb_plated_hole.list(),...db22.pcb_hole.list(),...db22.pcb_trace.list().filter(trace=>!trace.source_trace_id),...db22.pcb_via.list().filter(via=>(!ignoreExistingTopLevelPcbRouteState||!!via.subcircuit_id)&&!isPcbViaRepresentedByPreservedSrjTrace(via)),...db22.pcb_keepout.list(),...db22.pcb_cutout.list()].filter(e210=>e210.type==="pcb_board"||!subcircuit_id||relevantSubcircuitIds?.has(e210.subcircuit_id)),sharedConnMap);obstacles.push(...getUnbrokenCopperPourObstacles({connMap:sharedConnMap,subcircuitComponent,board,group:pcbGroup}));for(let obstacle of obstacles){let additionalIds=obstacle.connectedTo.flatMap(id3=>sharedConnMap.getIdsConnectedToNet(id3));obstacle.connectedTo=[...new Set([...obstacle.connectedTo,...additionalIds])]}let internalConnections=db22.source_component_internal_connection.list(),sourcePortIdToInternalConnectionId=new Map;for(let ic3 of internalConnections)for(let sourcePortId of ic3.source_port_ids)sourcePortIdToInternalConnectionId.set(sourcePortId,ic3.source_component_internal_connection_id);let pcbElementIdToSourcePortId=new Map;for(let pcbPort of db22.pcb_port.list())if(pcbPort.source_port_id){let smtpad2=db22.pcb_smtpad.getWhere({pcb_port_id:pcbPort.pcb_port_id});smtpad2&&pcbElementIdToSourcePortId.set(smtpad2.pcb_smtpad_id,pcbPort.source_port_id);let platedHole2=db22.pcb_plated_hole.getWhere({pcb_port_id:pcbPort.pcb_port_id});platedHole2&&pcbElementIdToSourcePortId.set(platedHole2.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(o22=>[{x:o22.center.x-o22.width/2,y:o22.center.y-o22.height/2},{x:o22.center.x+o22.width/2,y:o22.center.y+o22.height/2}]).concat(board?.outline??[]),boardBounds=board&&!board.outline?{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}:void 0,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}:boardBounds?bounds=boardBounds:bounds={minX:Math.min(...allPoints.map(p22=>p22.x))-1,maxX:Math.max(...allPoints.map(p22=>p22.x))+1,minY:Math.min(...allPoints.map(p22=>p22.y))-1,maxY:Math.max(...allPoints.map(p22=>p22.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(db22.pcb_trace.list().filter(t48=>t48.source_trace_id?subcircuit_id?t48.subcircuit_id===subcircuit_id:t48.subcircuit_id?db22.source_trace.get(t48.source_trace_id)?.subcircuit_id===t48.subcircuit_id:!1:!1).map(t48=>t48.source_trace_id).filter(id3=>!!id3)),sourcePortIdToBreakoutPoint=new Map;for(let bp22 of breakoutPoints){let spId=bp22.source_port_id;spId&&sourcePortIdToBreakoutPoint.set(spId,bp22)}let getPcbPortRoutePoint=pcbPort=>{let layer=pcbPort.layers?.[0]??"top",breakoutPoint=sourcePortIdToBreakoutPoint.get(pcbPort.source_port_id),portSelector=getPortSelector(db22.source_port.get(pcbPort.source_port_id));return breakoutPoint&&!breakoutPointIsInActiveRoutingGroup(breakoutPoint)?{x:breakoutPoint.x,y:breakoutPoint.y,layer:breakoutPoint.layer??layer,pointId:breakoutPoint.pcb_breakout_point_id,port_selector:portSelector}:{x:pcbPort.x,y:pcbPort.y,layer,pointId:pcbPort.pcb_port_id,pcb_port_id:pcbPort.pcb_port_id,port_selector:portSelector}},sourceTraces=db22.source_trace.list(),planeTerminatedSourceTraceLayers=getPlaneTerminatedSourceTraceLayers({fanoutPourNetMap,sourceNets:db22.source_net.list(),sourceTraces,subcircuitId:subcircuit_id}),directTraceConnections=sourceTraces.filter(trace=>!sourceTraceIdsAlreadyPreservedAsSrjTraces.has(trace.source_trace_id)).filter(trace=>!subcircuit_id||trace.subcircuit_id===subcircuit_id).filter(sourceTrace=>sourceTrace.connected_source_net_ids.length===0||planeTerminatedSourceTraceLayers.has(sourceTrace.source_trace_id)).map(trace=>{let connectedPcbPorts=trace.connected_source_port_ids.map(sourcePortId=>db22.pcb_port.getWhere({source_port_id:sourcePortId})).filter(pcbPort=>pcbPort!==null),isPlaneTerminatedSourceTrace=planeTerminatedSourceTraceLayers.has(trace.source_trace_id);if(connectedPcbPorts.length<2&&!(isPlaneTerminatedSourceTrace&&connectedPcbPorts.length===1))return null;for(let connectedPort of connectedPcbPorts)if(connectedPort.x===void 0||connectedPort.y===void 0)return console.error(`(source_port_id: ${connectedPort.source_port_id}) for trace ${trace.source_trace_id} does not have x/y coordinates. Skipping this trace.`),null;let srjTraceHintConnectionPoints=getSrjConnectionPointsFromPcbTraceHints(connectedPcbPorts,traceHints),connectedPortRoutePoints=connectedPcbPorts.map(port=>getPcbPortRoutePoint(port)),[firstConnectedPortRoutePoint,...remainingPortRoutePoints]=connectedPortRoutePoints;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:[firstConnectedPortRoutePoint,...srjTraceHintConnectionPoints,...remainingPortRoutePoints]}}).filter(c22=>c22!==null),source_nets=db22.source_net.list().filter(e210=>!subcircuit_id||e210.subcircuit_id===subcircuit_id),connectionsFromNets=[],connectionFromNetId=new Map,handledNetConnectivityKeys=new Set,sourceNetIds=new Set(source_nets.map(net=>net.source_net_id)),currentSubcircuitSourceTraces=db22.source_trace.list().filter(trace=>!subcircuit_id||trace.subcircuit_id===subcircuit_id),exposedBridgeSourceTraceIds=new Set((subcircuitComponent?.selectAll("trace")??[]).flatMap(trace=>{let candidate=trace;return candidate._exposesSubcircuitConnection&&candidate.source_trace_id?[candidate.source_trace_id]:[]})),exposedDescendantSourceNetIds=new Set;for(let trace of currentSubcircuitSourceTraces)if(exposedBridgeSourceTraceIds.has(trace.source_trace_id))for(let sourceNetId of trace.connected_source_net_ids??[])sourceNetIds.has(sourceNetId)||exposedDescendantSourceNetIds.add(sourceNetId);let routedDescendantSourceTraceIds=new Set(subcircuit_id?db22.pcb_trace.list().filter(trace=>trace.subcircuit_id&&trace.subcircuit_id!==subcircuit_id&&relevantSubcircuitIds?.has(trace.subcircuit_id)).map(trace=>trace.source_trace_id).filter(id3=>!!id3):[]),sourceTracesEligibleForNetConnections=db22.source_trace.list().filter(trace=>!planeTerminatedSourceTraceLayers.has(trace.source_trace_id)).filter(trace=>!sourceTraceIdsAlreadyPreservedAsSrjTraces.has(trace.source_trace_id)||subcircuit_id!=null&&trace.subcircuit_id===subcircuit_id).filter(trace=>!subcircuit_id||trace.subcircuit_id===subcircuit_id||(trace.connected_source_net_ids?.some(id3=>sourceNetIds.has(id3))??!1)||(trace.connected_source_net_ids?.some(id3=>exposedDescendantSourceNetIds.has(id3))??!1)&&!routedDescendantSourceTraceIds.has(trace.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 connectedSourceNets=source_nets.filter(sourceNet=>getSourceConnectivityKey(sourceNet.source_net_id)===netConnectivityKey),connectedSourceNetIds=connectedSourceNets.map(sourceNet=>sourceNet.source_net_id),connectedSourceTraces=sourceTracesEligibleForNetConnections.filter(st22=>[st22.source_trace_id,...st22.connected_source_net_ids??[]].some(id3=>getSourceConnectivityKey(id3)===netConnectivityKey)),nominalTraceWidthForConnection;for(let sourceNet of connectedSourceNets)sourceNet.trace_width!==void 0&&(nominalTraceWidthForConnection=Math.max(nominalTraceWidthForConnection??0,sourceNet.trace_width));for(let sourceTrace of connectedSourceTraces)sourceTrace.min_trace_thickness!==void 0&&(nominalTraceWidthForConnection=Math.max(nominalTraceWidthForConnection??0,sourceTrace.min_trace_thickness));let pointsToConnect=[],addedPointIds=new Set,connectedPcbPorts=[];for(let st22 of connectedSourceTraces){let pcb_ports=db22.pcb_port.list().filter(p22=>st22.connected_source_port_ids.includes(p22.source_port_id));for(let p22 of pcb_ports){let routePoint2=getPcbPortRoutePoint(p22);addedPointIds.has(routePoint2.pointId)||(addedPointIds.add(routePoint2.pointId),connectedPcbPorts.push(p22),pointsToConnect.push(routePoint2))}}pointsToConnect.push(...getSrjConnectionPointsFromPcbTraceHints(connectedPcbPorts,traceHints));let connection={name:net.source_net_id??sharedConnMap.getNetConnectedToId(net.source_net_id),nominalTraceWidth:nominalTraceWidthForConnection,width:nominalTraceWidthForConnection,pointsToConnect};if(pointsToConnect.length!==0){connectionsFromNets.push(connection);for(let sourceNetId of connectedSourceNetIds)connectionFromNetId.set(sourceNetId,connection)}}let connectionsFromBreakoutPoints=[];for(let bp22 of breakoutPoints){let bpSourcePortId=bp22.source_port_id,pt22={x:bp22.x,y:bp22.y,layer:bp22.layer??"top",pointId:bp22.pcb_breakout_point_id};if(bpSourcePortId){let pcb_port3=db22.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,port_selector:getPortSelector(db22.source_port.get(pcb_port3.source_port_id))},isInActiveRoutingGroup=breakoutPointIsInActiveRoutingGroup(bp22),isInTransparentChildRoutingGroup=!isInActiveRoutingGroup&&bp22.subcircuit_id===subcircuit_id;if(isInActiveRoutingGroup||isInTransparentChildRoutingGroup){connectionsFromBreakoutPoints.push({name:isInTransparentChildRoutingGroup?`breakout:${bp22.pcb_breakout_point_id}`:bpSourcePortId,source_trace_id:bp22.source_trace_id,routingPcbGroupId:isInTransparentChildRoutingGroup?bp22.pcb_group_id:void 0,pointsToConnect:[portPt,pt22]});continue}bp22.source_trace_id||connectionsFromBreakoutPoints.push({name:bpSourcePortId,pointsToConnect:[portPt,pt22]});continue}if(bp22.source_net_id){let conn=connectionFromNetId.get(bp22.source_net_id);conn?conn.pointsToConnect.push(pt22):connectionsFromBreakoutPoints.push({name:bp22.source_net_id,pointsToConnect:[pt22]})}}let routableConnectionsFromNets=connectionsFromNets.filter(connection=>connection.pointsToConnect.length>=2),allConns=[...directTraceConnections,...routableConnectionsFromNets,...connectionsFromBreakoutPoints],defaultTraceWidth=minTraceWidth??board?.min_trace_width??.1;for(let conn of allConns)conn.nominalTraceWidth??(conn.nominalTraceWidth=nominalTraceWidth??defaultTraceWidth),conn.width??(conn.width=nominalTraceWidth??defaultTraceWidth);bounds=expandSrjBoundsToIncludeConnectionPoints({bounds,connections:allConns});let differentialPairs=subcircuitComponent?.selectAll("differentialpair")??[],buses=subcircuitComponent?.selectAll("bus")??[],srjDifferentialPairs=getDifferentialPairsForSimpleRouteJson({srjConnections:allConns,differentialPairs,sourceTraces:db22.source_trace.list(),subcircuitId:subcircuit_id}),srjBuses=getBusesForSimpleRouteJson({srjConnections:allConns,buses,sourceTraces:db22.source_trace.list(),subcircuitId:subcircuit_id,planeTerminatedSourceTraceLayers,preservedSourceTraceIds:sourceTraceIdsAlreadyPreservedAsSrjTraces});if(subcircuit_id){let pointIdToConn=new Map;for(let conn of allConns)for(let pt22 of conn.pointsToConnect)pt22.pointId&&pointIdToConn.set(pt22.pointId,conn);let existingTraces=db22.pcb_trace.list().filter(t48=>relevantSubcircuitIds?.has(t48.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,resolvedMinTraceToHoleEdgeClearance=minTraceToHoleEdgeClearance??board?.min_trace_to_hole_edge_clearance,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,differentialPairs:srjDifferentialPairs,...srjBuses?{buses:srjBuses}:{},traces:preservedRoutedSubcircuitTraces.length>0?preservedRoutedSubcircuitTraces:void 0,layerCount:board?.num_layers??2,allowBlindAndBuriedVias:board?.allow_blind_and_buried_vias??!1,minTraceWidth:Math.min(defaultTraceWidth,...allConns.map(c22=>c22.width)),minViaDiameter:resolvedMinViaPadDiameter,minViaHoleDiameter:resolvedMinViaHoleDiameter,minViaPadDiameter:resolvedMinViaPadDiameter,min_via_hole_diameter:resolvedMinViaHoleDiameter,min_via_pad_diameter:resolvedMinViaPadDiameter,minTraceToPadEdgeClearance:resolvedMinTraceToPadEdgeClearance,minTraceToHoleEdgeClearance:resolvedMinTraceToHoleEdgeClearance,minViaEdgeToPadEdgeClearance:resolvedMinViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance:resolvedMinViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance:resolvedMinPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance:resolvedMinPadEdgeToPadEdgeClearance,minBoardEdgeClearance:resolvedMinBoardEdgeClearance,nominalTraceWidth,outline:getSrjOutlineForRoutingBounds({bounds:boardBounds??bounds,outline:board?.outline?.map(point62=>({...point62}))},bounds)},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 i22=0;i22<unqInputPinLabels.length;i22++)for(let label of unqInputPinLabels[i22])if(/^\d+$/.test(label)){desiredNumbers[i22]=Number.parseInt(label);break}let highestPinNumber=0,alreadyAcceptedDesiredNumbers=new Set;for(let i22=0;i22<desiredNumbers.length;i22++){let desiredNumber=desiredNumbers[i22];if(desiredNumber===null||desiredNumber<1)continue;if(!alreadyAcceptedDesiredNumbers.has(desiredNumber)){alreadyAcceptedDesiredNumbers.add(desiredNumber),result[i22].push(`pin${desiredNumber}`),highestPinNumber=Math.max(highestPinNumber,desiredNumber);continue}let existingAltsForPin=0;for(let label of result[i22])label.startsWith(`pin${desiredNumber}_alt`)&&existingAltsForPin++;result[i22].push(`pin${desiredNumber}_alt${existingAltsForPin+1}`)}for(let i22=0;i22<result.length;i22++)result[i22][0]?.includes("_alt")&&(highestPinNumber++,result[i22].unshift(`pin${highestPinNumber}`));for(let i22=0;i22<result.length;i22++)result[i22].length===0&&(highestPinNumber++,result[i22].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 i22=0;i22<unqInputPinLabels.length;i22++){let inputLabels=unqInputPinLabels[i22];for(let label of inputLabels)/^\d+$/.test(label)||(totalLabelCounts[label]===1?result[i22].push(label):(incrementalLabelCounts[label]=(incrementalLabelCounts[label]??0)+1,result[i22].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:db22}=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:db22}=this.root,{_parsedProps:props}=this;db22.pcb_trace_hint.insert({pcb_component_id:this.matchedPort?.pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,route:this.getPcbRouteHints()})}};function getTitleAnchorAndPosition({anchor,x:x22,y:y22,width,height,isInside}){switch(anchor){case"top_left":return{x:x22,y:y22+height,textAnchor:isInside?"top_left":"bottom_left"};case"top_center":return{x:x22+width/2,y:y22+height,textAnchor:isInside?"top_center":"bottom_center"};case"top_right":return{x:x22+width,y:y22+height,textAnchor:isInside?"top_right":"bottom_right"};case"center_left":return{x:x22,y:y22+height/2,textAnchor:isInside?"center_left":"center_right"};case"center":return{x:x22+width/2,y:y22+height/2,textAnchor:"center"};case"center_right":return{x:x22+width,y:y22+height/2,textAnchor:isInside?"center_right":"center_left"};case"bottom_left":return{x:x22,y:y22,textAnchor:isInside?"bottom_left":"top_left"};case"bottom_center":return{x:x22+width/2,y:y22,textAnchor:isInside?"bottom_center":"top_center"};case"bottom_right":return{x:x22+width,y:y22,textAnchor:isInside?"bottom_right":"top_right"};default:return{x:x22+width/2,y:y22+height,textAnchor:"center"}}}var getSchematicBoxPinLabels=pinLabels=>pinLabels?Object.entries(pinLabels).map(([pinKey,pinLabel])=>{let pinNumber=getPinNumberFromPinLabelsKey(pinKey);if(pinNumber===null)throw new Error(`Invalid schematicbox pinLabels key "${pinKey}". Expected pin<number>.`);let pinAliases=typeof pinLabel=="string"?[pinLabel]:[...pinLabel];return{pinNumber,displayPinLabel:pinAliases[0]??pinKey,pinAliases}}):[],getSchematicBoxPinStyleFromReferencedChip=({referencedChip,schematicBoxPins})=>{let referencedChipPinStyle=getNumericSchPinStyle(referencedChip._parsedProps.schPinStyle,referencedChip._parsedProps.pinLabels);if(!referencedChipPinStyle)return;let schematicBoxPinStyle={};for(let{pinNumber,referencedSourcePort}of schematicBoxPins){if(referencedSourcePort.pin_number===void 0)continue;let pinStyle=referencedChipPinStyle[`pin${referencedSourcePort.pin_number}`];pinStyle&&(schematicBoxPinStyle[`pin${pinNumber}`]=pinStyle)}return Object.keys(schematicBoxPinStyle).length>0?schematicBoxPinStyle:void 0},mergeSchematicBoxPinStyles=({inheritedPinStyle,overridePinStyle})=>{if(!inheritedPinStyle&&!overridePinStyle)return;let mergedPinStyle={...inheritedPinStyle};for(let[pinKey,pinStyle]of Object.entries(overridePinStyle??{}))mergedPinStyle[pinKey]={...mergedPinStyle[pinKey],...pinStyle};return Object.keys(mergedPinStyle).length>0?mergedPinStyle:void 0},SchematicBox_doInitialSchematicComponentRender=schematicBox=>{if(schematicBox.root?.schematicDisabled)return;let{db:db22}=schematicBox.root,props=schematicBox._parsedProps;if(!props.chipRef)return;let referencedChip=schematicBox.getSubcircuit().selectOne(props.chipRef);if(!referencedChip?.source_component_id)throw new Error(`Could not resolve chipRef "${props.chipRef}" for ${schematicBox.getString()}`);let schematicBoxPinLabels=getSchematicBoxPinLabels(props.pinLabels),pinLabelsByPinKey=Object.fromEntries(schematicBoxPinLabels.map(({pinNumber,displayPinLabel})=>[`pin${pinNumber}`,displayPinLabel])),sourcePorts=db22.source_port.list({source_component_id:referencedChip.source_component_id}),schematicBoxPins=schematicBoxPinLabels.map(schematicBoxPin=>{let referencedSourcePort=sourcePorts.find(sourcePort=>schematicBoxPin.pinAliases.some(pinAlias=>sourcePort.name===pinAlias||sourcePort.port_hints?.includes(pinAlias)));if(!referencedSourcePort)throw new Error(`Could not find pin "${schematicBoxPin.displayPinLabel}" on chipRef "${props.chipRef}"`);return{...schematicBoxPin,referencedSourcePort}}),inheritedPinStyle=getSchematicBoxPinStyleFromReferencedChip({referencedChip,schematicBoxPins}),schematicBoxPinStyle=mergeSchematicBoxPinStyles({inheritedPinStyle,overridePinStyle:getNumericSchPinStyle(props.schPinStyle,props.pinLabels)}),dimensions=getAllDimensionsForSchematicBox({schWidth:props.width,schHeight:props.height,schPinSpacing:.2,pinCount:schematicBoxPinLabels.length,schPortArrangement:props.schPinArrangement,numericSchPinStyle:getNumericSchPinStyle(schematicBoxPinStyle),pinLabels:pinLabelsByPinKey}),center2=schematicBox._getGlobalSchematicPositionBeforeLayout(),size3=dimensions.getSize(),schematicSheetId=schematicBox._resolveSchematicSheetId(),portLabels=Object.fromEntries(schematicBoxPinLabels.map(({pinNumber,displayPinLabel})=>[String(pinNumber),displayPinLabel])),schematicComponent=db22.schematic_component.insert({center:center2,size:size3,source_component_id:referencedChip.source_component_id,is_box_with_pins:!0,port_arrangement:underscorifyPortArrangement(props.schPinArrangement),port_labels:portLabels,pin_spacing:.2,pin_styles:underscorifyPinStyles(schematicBoxPinStyle),schematic_sheet_id:schematicSheetId});schematicBox.schematic_component_id=schematicComponent.schematic_component_id;for(let{pinNumber,displayPinLabel,referencedSourcePort}of schematicBoxPins){let portPosition=dimensions.getPortPositionByPinNumber(pinNumber);if(!portPosition)throw new Error(`Could not determine schematic position for ${schematicBox.getString()} pin${pinNumber}`);let facingDirection={left:"left",right:"right",top:"up",bottom:"down"}[portPosition.side];db22.schematic_port.insert({schematic_component_id:schematicComponent.schematic_component_id,center:{x:center2.x+portPosition.x,y:center2.y+portPosition.y},source_port_id:referencedSourcePort.source_port_id,facing_direction:facingDirection,distance_from_component_edge:.4,side_of_component:portPosition.side,pin_number:pinNumber,true_ccw_index:portPosition.trueIndex,display_pin_label:displayPinLabel,is_connected:!1,schematic_sheet_id:schematicSheetId})}let sectionName=props.name??props.chipRef;db22.schematic_text.insert({text:sectionName,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:schematicSheetId});let referencedSourceComponent=db22.source_component.get(referencedChip.source_component_id);db22.schematic_text.insert({text:referencedSourceComponent?.manufacturer_part_number??"",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:schematicSheetId})},SchematicBox=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicBox",zodProps:schematicBoxProps,shouldRenderAsSchematicBox:!0}}doInitialSchematicComponentRender(){SchematicBox_doInitialSchematicComponentRender(this)}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db22}=this.root,{_parsedProps:props}=this;if(props.chipRef)return;let 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,x22,y22,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(p22=>p22.position.x),ys3=portsWithPosition.map(p22=>p22.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,x22=left+(props.schX??0),y22=top+(props.schY??0),centerX=x22+width/2,centerY=y22+height/2}else if(hasFixedSize){width=props.width,height=props.height;let center2=this._getGlobalSchematicPositionBeforeLayout();centerX=center2.x,centerY=center2.y,x22=centerX-width/2,y22=centerY-height/2}else return;if(db22.schematic_box.insert({height,width,x:x22,y:y22,is_dashed:props.strokeStyle==="dashed",schematic_sheet_id:this._resolveSchematicSheetId()}),props.title){let isInside=props.titleInside,TITLE_PADDING=.1,anchor=props.titleAlignment,anchorPos=getTitleAnchorAndPosition({anchor,x:x22,y:y22,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;db22.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()})}}},Group_doInitialAssignSchematicSheetToConnectedComponents=group2=>{if(!group2.isSubcircuit||group2.root?.schematicDisabled)return;let{db:db22}=group2.root,schematicSheetIdsBySubcircuitConnectivityMapKey=new Map,schematicBoxReferencedSourceComponentIds=new Set,schematicBoxes=group2.getDescendants().filter(component=>component instanceof SchematicBox&&component.getSubcircuit()===group2);for(let schematicBox of schematicBoxes){let{chipRef,pinLabels}=schematicBox._parsedProps,schematicSheetId=schematicBox._resolveSchematicSheetId();if(!chipRef||!schematicSheetId)continue;let referencedComponent=schematicBox.getSubcircuit().selectOne(chipRef);if(!(referencedComponent instanceof NormalComponent)||!referencedComponent.source_component_id)continue;schematicBoxReferencedSourceComponentIds.add(referencedComponent.source_component_id);let referencedSourcePorts=db22.source_port.list({source_component_id:referencedComponent.source_component_id});for(let{pinAliases}of getSchematicBoxPinLabels(pinLabels)){let subcircuitConnectivityMapKey=referencedSourcePorts.find(sourcePort=>pinAliases.some(pinAlias=>sourcePort.name===pinAlias||sourcePort.port_hints?.includes(pinAlias)))?.subcircuit_connectivity_map_key;if(!subcircuitConnectivityMapKey)continue;let schematicSheetIds=schematicSheetIdsBySubcircuitConnectivityMapKey.get(subcircuitConnectivityMapKey)??new Set;schematicSheetIds.add(schematicSheetId),schematicSheetIdsBySubcircuitConnectivityMapKey.set(subcircuitConnectivityMapKey,schematicSheetIds)}}let normalComponents=group2.getDescendants().filter(component=>component instanceof NormalComponent&&component.getSubcircuit()===group2);for(let normalComponent of normalComponents){if(!normalComponent.source_component_id||schematicBoxReferencedSourceComponentIds.has(normalComponent.source_component_id)||normalComponent._resolveSchematicSheetId())continue;let connectedSchematicSheetIds=new Set,sourcePorts=db22.source_port.list({source_component_id:normalComponent.source_component_id});for(let sourcePort of sourcePorts){let subcircuitConnectivityMapKey=sourcePort.subcircuit_connectivity_map_key;if(!subcircuitConnectivityMapKey)continue;let schematicSheetIds=schematicSheetIdsBySubcircuitConnectivityMapKey.get(subcircuitConnectivityMapKey);if(schematicSheetIds)for(let schematicSheetId of schematicSheetIds)connectedSchematicSheetIds.add(schematicSheetId)}if(connectedSchematicSheetIds.size!==1)continue;let[inferredSchematicSheetId]=connectedSchematicSheetIds;inferredSchematicSheetId&&(normalComponent.schematic_sheet_id=inferredSchematicSheetId)}},SUPPORTED_COMPONENT_FIELDS=new Set(["x","y","minx","maxx","miny","maxy","width","height"]);function Group_doInitialPcbCalcPlacementResolution(group2){if(group2.root?.pcbDisabled||!group2.isSubcircuit)return;let{db:db22}=group2.root,normalComponentNameMap=group2.getNormalComponentNameMap?.()??new Map,allNormalComponents=collectNormalComponentsInSubcircuit(group2);if(!allNormalComponents.some(shouldResolvePlacementInCalcPhase))return;let 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=db22.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(group2){let components=[],walk=node=>{node._isNormalComponent&&components.push(node);for(let child of node.children)child.isSubcircuit||walk(child)};for(let child of group2.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,x22=pcbComponent.center.x,y22=pcbComponent.center.y;setSubcircuitPcbComponentCalcVariables({vars,componentName:component.name,position:{x:x22,y:y22},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:db22}=component.root,padElements=[...db22.pcb_smtpad.list({pcb_component_id:component.pcb_component_id}),...db22.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=db22.pcb_port.get(pcbPortId),sourcePort=pcbPort?.source_port_id?db22.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(group2){if(group2.root?.pcbDisabled||!group2.pcb_group_id)return;let pcbPositionAnchor=group2._parsedProps?.pcbPositionAnchor;if(!pcbPositionAnchor)return;let targetPosition=group2._getGlobalPcbPositionBeforeLayout(),{pcbX,pcbY}=group2._parsedProps;if(pcbX===void 0&&pcbY===void 0)return;let{db:db22}=group2.root,pcbGroup=db22.pcb_group.get(group2.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=getBoundsFromPoints2(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)&&(group2._repositionOnPcb(newCenter),db22.pcb_group.update(group2.pcb_group_id,{center:newCenter})),db22.pcb_group.update(group2.pcb_group_id,{anchor_position:targetPosition,anchor_alignment:pcbPositionAnchor,display_offset_x:pcbX,display_offset_y:pcbY})}var Group_doInitialPcbLayoutFlex=group2=>{let{db:db22}=group2.root,{_parsedProps:props}=group2,pcbChildren=group2.children.filter(c22=>c22.pcb_component_id||c22.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=group2._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});db22.pcb_group.update(group2.pcb_group_id,{width:bounds.width,height:bounds.height,center:groupCenter})},MIN_GAP=1;function Group_doInitialPcbLayoutGrid(group2){let{db:db22}=group2.root,props=group2._parsedProps,pcbChildren=getPcbChildren(group2);if(pcbChildren.length===0)return;let childDimensions=calculateChildDimensions({db:db22,pcbChildren}),gridConfig=parseGridConfiguration(props),gridLayout=createGridLayout({props,pcbChildren,childDimensions,gridConfig}),cssGrid=createCssGrid({pcbChildren,childDimensions,gridLayout,gridConfig}),{itemCoordinates}=cssGrid.layout();positionChildren({db:db22,group:group2,pcbChildren,itemCoordinates,gridLayout}),updateGroupDimensions({db:db22,group:group2,props,gridLayout})}function getPcbChildren(group2){return group2.children.filter(child=>child.pcb_component_id||child.pcb_group_id)}function calculateChildDimensions(params){let{db:db22,pcbChildren}=params,maxWidth=0,maxHeight=0;for(let child of pcbChildren){let width=0,height=0;if(child.pcb_group_id){let pcbGroup=db22.pcb_group.get(child.pcb_group_id);width=pcbGroup?.width??0,height=pcbGroup?.height??0}else if(child.pcb_component_id){let pcbComp=db22.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:db22,group:group2,pcbChildren,itemCoordinates,gridLayout}=params,groupCenter=group2._getGlobalPcbPositionBeforeLayout(),allCircuitJson=db22.toArray();for(let i22=0;i22<pcbChildren.length;i22++){let child=pcbChildren[i22],childKey=child.getString()||`child-${i22}`,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:db22,group:group2,props,gridLayout}=params;if(group2.pcb_group_id){let groupCenter=group2._getGlobalPcbPositionBeforeLayout();db22.pcb_group.update(group2.pcb_group_id,{width:props.width??gridLayout.containerWidth,height:props.height??gridLayout.containerHeight,center:groupCenter})}}var solvePackSolverWithTimeout=(solver,timeoutMs,getCurrentTime=()=>performance.now())=>{if(timeoutMs===void 0||!Number.isFinite(timeoutMs)||timeoutMs<=0)return solver.solve(),{elapsedMs:0,timedOut:!1};let startedAt=getCurrentTime(),elapsedMs=0;for(;!solver.solved&&!solver.failed&&(solver.step(),!(solver.solved||solver.failed));)if(elapsedMs=getCurrentTime()-startedAt,elapsedMs>=timeoutMs)return{elapsedMs,timedOut:!0};return{elapsedMs,timedOut:!1}},applyComponentConstraintClusters=(group2,packInput)=>{let constraints=group2.children.filter(c22=>c22.componentName==="Constraint"&&c22._parsedProps.pcb),clusterByRoot=new Map,parent={},find2=x22=>(parent[x22]!==x22&&(parent[x22]=find2(parent[x22])),parent[x22]),union2=(a22,b22)=>{let ra3=find2(a22),rb22=find2(b22);ra3!==rb22&&(parent[rb22]=ra3)},makeSet=x22=>{x22 in parent||(parent[x22]=x22)},getIdFromSelector=sel2=>{let name=sel2.startsWith(".")?sel2.slice(1):sel2;return group2.children.find(c22=>c22.name===name)?.pcb_component_id??void 0};for(let constraint of constraints){let props=constraint._parsedProps;if("left"in props&&"right"in props){let a22=getIdFromSelector(props.left),b22=getIdFromSelector(props.right);a22&&b22&&(makeSet(a22),makeSet(b22),union2(a22,b22))}else if("top"in props&&"bottom"in props){let a22=getIdFromSelector(props.top),b22=getIdFromSelector(props.bottom);a22&&b22&&(makeSet(a22),makeSet(b22),union2(a22,b22))}else if("for"in props&&Array.isArray(props.for)){let ids=props.for.map(s22=>getIdFromSelector(s22)).filter(s22=>!!s22);for(let id3 of ids)makeSet(id3);for(let i22=1;i22<ids.length;i22++)union2(ids[0],ids[i22])}}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(c22=>[c22.componentId,c22]));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(s22=>getIdFromSelector(s22)).filter(s22=>!!s22);if(ids.length>1){let base=getVar(ids[0],"x");for(let i22=1;i22<ids.length;i22++)solver.addConstraint(new Constraint(new Expression(getVar(ids[i22],"x"),[-1,base]),Operator.Eq,0,Strength.required))}}else if("sameY"in props&&Array.isArray(props.for)){let ids=props.for.map(s22=>getIdFromSelector(s22)).filter(s22=>!!s22);if(ids.length>1){let base=getVar(ids[0],"y");for(let i22=1;i22<ids.length;i22++)solver.addConstraint(new Constraint(new Expression(getVar(ids[i22],"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 ax22=pos.x+pad2.offset.x,ay22=pos.y+pad2.offset.y;minX=Math.min(minX,ax22-pad2.size.x/2),maxX=Math.max(maxX,ax22+pad2.size.x/2),minY=Math.min(minY,ay22-pad2.size.y/2),maxY=Math.max(maxY,ay22+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(c22=>!info.componentIds.includes(c22.componentId)),packInput.components.push({componentId:info.componentIds[0],pads:mergedPads,availableRotationDegrees:[0]}),info.relativeCenters=relCenters,clusterMap[info.componentIds[0]]=info}return clusterMap},updateCadRotation=({db:db22,pcbComponentId,rotationDegrees,layer})=>{if(rotationDegrees==null||!db22?.cad_component?.list)return;let cadComponent=db22.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)};db22.cad_component.update(cadComponent.cad_component_id,{rotation:nextRotation}),cadComponent.rotation=nextRotation},isDescendantGroup=(db22,groupId,ancestorId)=>{if(groupId===ancestorId)return!0;let group2=db22.source_group.get(groupId);return!group2||!group2.parent_source_group_id?!1:isDescendantGroup(db22,group2.parent_source_group_id,ancestorId)},applyPackOutput=(group2,packOutput,clusterMap,initialPackOutput)=>{let{db:db22}=group2.root;for(let packedComponent of packOutput.components){if(packedComponent.isStatic)continue;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;db22.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=db22.pcb_component.get(memberId);if(!member)continue;let originalCenter2=member.center,transformMatrix2=compose2(group2._computePcbGlobalTransformBeforeLayout(),translate2(center2.x+rotatedRel.x,center2.y+rotatedRel.y),rotate2(angleRad),translate2(-originalCenter2.x,-originalCenter2.y)),related=db22.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===memberId);transformPCBElements(related,transformMatrix2),updateCadRotation({db:db22,pcbComponentId:memberId,rotationDegrees:rotationDegrees2,layer:member.layer})}continue}let pcbComponent=db22.pcb_component.get(componentId);if(pcbComponent){db22.pcb_component.update(componentId,{position_mode:"packed"});let currentGroupId=group2.source_group_id,componentGroupId=db22.source_component.get(pcbComponent.source_component_id)?.source_group_id;if(componentGroupId!==void 0&&!isDescendantGroup(db22,componentGroupId,currentGroupId))continue;let originalCenter2=pcbComponent.center,rotationDegrees2=ccwRotationDegrees??ccwRotationOffset??0,transformMatrix2=compose2(group2._computePcbGlobalTransformBeforeLayout(),translate2(center2.x,center2.y),rotate2(rotationDegrees2*Math.PI/180),translate2(-originalCenter2.x,-originalCenter2.y)),related=db22.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===componentId);transformPCBElements(related,transformMatrix2),updateCadRotation({db:db22,pcbComponentId:componentId,rotationDegrees:rotationDegrees2,layer:pcbComponent.layer});continue}let pcbGroup=db22.pcb_group.list().find(g22=>g22.source_group_id===componentId);if(!pcbGroup)continue;let originalCenter=initialPackOutput.components.find(component=>component.componentId===componentId)?.center??pcbGroup.center,rotationDegrees=ccwRotationDegrees??ccwRotationOffset??0,transformMatrix=compose2(group2._computePcbGlobalTransformBeforeLayout(),translate2(center2.x,center2.y),rotate2(rotationDegrees*Math.PI/180),translate2(-originalCenter.x,-originalCenter.y)),relatedElements=db22.toArray().filter(elm=>{if("source_group_id"in elm&&elm.source_group_id&&(elm.source_group_id===componentId||isDescendantGroup(db22,elm.source_group_id,componentId)))return!0;if("source_component_id"in elm&&elm.source_component_id){let sourceComponent=db22.source_component.get(elm.source_component_id);if(sourceComponent?.source_group_id&&(sourceComponent.source_group_id===componentId||isDescendantGroup(db22,sourceComponent.source_group_id,componentId)))return!0}if("pcb_component_id"in elm&&elm.pcb_component_id){let pcbComp=db22.pcb_component.get(elm.pcb_component_id);if(pcbComp?.source_component_id){let sourceComp=db22.source_component.get(pcbComp.source_component_id);if(sourceComp?.source_group_id&&(sourceComp.source_group_id===componentId||isDescendantGroup(db22,sourceComp.source_group_id,componentId)))return!0}}return!1});for(let elm of relatedElements)elm.type==="pcb_component"&&db22.pcb_component.update(elm.pcb_component_id,{position_mode:"packed"});transformPCBElements(relatedElements,transformMatrix),db22.pcb_group.update(pcbGroup.pcb_group_id,{center:center2})}if(group2.pcb_group_id){let groupPcbComponents=db22.pcb_component.list({pcb_group_id:group2.pcb_group_id});group2.calculatePcbGroupBounds(findBoundsAndCenter(groupPcbComponents))}},normalizeLayer=layer=>(layer??"top").toLowerCase(),getPackComponentPcbLayer=(component,db22)=>{let layers=new Set,directPcbComponent=db22.pcb_component.get(component.componentId);directPcbComponent&&layers.add(normalizeLayer(directPcbComponent.layer));for(let pad2 of component.pads){let via=db22.pcb_via.get(pad2.padId),pcbComponentId=db22.pcb_smtpad.get(pad2.padId)?.pcb_component_id??db22.pcb_plated_hole.get(pad2.padId)?.pcb_component_id??via?.pcb_component_id;if(!pcbComponentId)continue;let pcbComponent=db22.pcb_component.get(pcbComponentId);pcbComponent&&layers.add(normalizeLayer(pcbComponent.layer))}return layers.size===1?layers.values().next().value:void 0},getPackInputsByPcbLayer=(packInput,db22)=>{let componentsByLayer=new Map;for(let component of packInput.components){let layer=getPackComponentPcbLayer(component,db22);if(!layer)return[packInput];let components=componentsByLayer.get(layer)??[];components.push(component),componentsByLayer.set(layer,components)}if(componentsByLayer.size<=1)return[packInput];let layerPriority=layer=>layer==="top"?0:layer==="bottom"?1:2;return Array.from(componentsByLayer.entries()).sort(([layerA],[layerB])=>layerPriority(layerA)-layerPriority(layerB)||layerA.localeCompare(layerB)).map(([,components])=>({...packInput,components}))},DEFAULT_MIN_GAP="1mm",debug42=(0,import_debug12.default)("Group_doInitialPcbLayoutPack"),getCollisionObstacleForStaticComponent=component=>{if(component.courtyard&&component.center)return{obstacleId:component.componentId,absoluteCenter:{x:component.center.x+component.courtyard.offsetFromCenter.x,y:component.center.y+component.courtyard.offsetFromCenter.y},width:component.courtyard.width,height:component.courtyard.height};if(component.pads.length===0)return;let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let pad2 of component.pads){let absoluteCenter=pad2.absoluteCenter??(component.center?{x:component.center.x+pad2.offset.x,y:component.center.y+pad2.offset.y}:pad2.offset);minX=Math.min(minX,absoluteCenter.x-pad2.size.x/2),minY=Math.min(minY,absoluteCenter.y-pad2.size.y/2),maxX=Math.max(maxX,absoluteCenter.x+pad2.size.x/2),maxY=Math.max(maxY,absoluteCenter.y+pad2.size.y/2)}return{obstacleId:component.componentId,absoluteCenter:{x:(minX+maxX)/2,y:(minY+maxY)/2},width:maxX-minX,height:maxY-minY}},getCrossLayerPadObstacles=({components,targetLayer:targetLayer2,db:db22})=>components.flatMap(component=>component.pads.flatMap(pad2=>{let platedHole2=db22.pcb_plated_hole.get(pad2.padId),via=db22.pcb_via.get(pad2.padId);if(!(platedHole2?.layers??via?.layers)?.includes(targetLayer2))return[];let absoluteCenter=pad2.absoluteCenter??(component.center?{x:component.center.x+pad2.offset.x,y:component.center.y+pad2.offset.y}:pad2.offset);return[{obstacleId:`cross_layer_${targetLayer2}_${pad2.padId}`,absoluteCenter,width:pad2.size.x,height:pad2.size.y}]})),Group_doInitialPcbLayoutPack=group2=>{let{db:db22}=group2.root,{_parsedProps:props}=group2;group2.root?.emit("packing:start",{subcircuit_id:group2.subcircuit_id,componentDisplayName:group2.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(group2);let excludedPcbGroupIds=new Set;for(let child of group2.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=(db32,groupId,ancestorId)=>{if(groupId===ancestorId)return!0;let group22=db32.source_group.get(groupId);return!group22||!group22.parent_source_group_id?!1:isDescendantGroup2(db32,group22.parent_source_group_id,ancestorId)};if(excludedPcbGroupIds.size>0)for(let element of db22.toArray()){if(element.type!=="pcb_component")continue;let sourceComponent=db22.source_component.get(element.source_component_id);if(sourceComponent?.source_group_id)for(let groupId of excludedPcbGroupIds)isDescendantGroup2(db22,sourceComponent.source_group_id,groupId)&&staticPcbComponentIds.add(element.pcb_component_id)}let filteredCircuitJson=db22.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 initialPackOutput=convertCircuitJsonToPackOutput(filteredCircuitJson,{source_group_id:group2.source_group_id,chipMarginsMap,staticPcbComponentIds:Array.from(staticPcbComponentIds)}),packInput={...convertPackOutputToPackInput(initialPackOutput),packOrderStrategy:packOrderStrategy??"largest_to_smallest",packPlacementStrategy:packPlacementStrategy??"minimum_sum_squared_distance_to_network",minGap:gapMm,bounds},clusterMap=applyComponentConstraintClusters(group2,packInput);debug42.enabled&&(group2.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`packInput-circuitjson-${group2.name}`,content:JSON.stringify(db22.toArray())}),group2.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`packInput-${group2.name}`,content:packInput}));let packInputs=getPackInputsByPcbLayer(packInput,db22),packOutput={...packInput,components:[]},packingFailed=!1,reportPackingError=solverErrorMessage=>{let message=`Unable to pack all PCB components within the layout bounds: ${solverErrorMessage}`;db22.pcb_packing_error.insert({error_type:"pcb_packing_error",message,pcb_group_id:group2.pcb_group_id??void 0,subcircuit_id:group2.subcircuit_id??void 0}),group2.root?.emit("packing:error",{subcircuit_id:group2.subcircuit_id,componentDisplayName:group2.getString(),error:{message}})};try{for(let layerPackInput of packInputs){let targetLayer2=getPackComponentPcbLayer(layerPackInput.components[0],db22),componentIdsForLayer=new Set(layerPackInput.components.map(component=>component.componentId)),staticLayerObstacles=layerPackInput.components.flatMap(component=>{if(!component.isStatic)return[];let obstacle=getCollisionObstacleForStaticComponent(component);return obstacle?[obstacle]:[]}),canUseCrossLayerNetworkReferences=layerPackInput.components.every(component=>!!db22.pcb_component.get(component.componentId)&&!clusterMap[component.componentId]),crossLayerStaticComponents=packInput.components.filter(component=>component.isStatic&&!componentIdsForLayer.has(component.componentId)),fallbackCrossLayerObstacles=canUseCrossLayerNetworkReferences?[]:crossLayerStaticComponents.flatMap(component=>{let obstacle=getCollisionObstacleForStaticComponent(component);return obstacle?[obstacle]:[]}),collisionOnlyPadIds=new Set([...layerPackInput.components.filter(component=>component.isStatic),...canUseCrossLayerNetworkReferences?[]:crossLayerStaticComponents].flatMap(component=>component.pads.map(pad2=>pad2.padId))),networkReferenceSources=new Map([...packOutput.components.map(component=>[component.componentId,{component,courtyardSize:Number.EPSILON}]),...canUseCrossLayerNetworkReferences?crossLayerStaticComponents.map(component=>[component.componentId,{component,courtyardSize:1e-6}]):[]]),networkReferenceComponents=Array.from(networkReferenceSources.values(),({component,courtyardSize})=>({...component,componentId:`network_reference_${component.componentId}`,isStatic:!0,courtyard:{offsetFromCenter:{x:0,y:0},width:courtyardSize,height:courtyardSize}})),crossLayerPadObstacles=targetLayer2?getCrossLayerPadObstacles({components:Array.from(networkReferenceSources.values(),({component})=>component),targetLayer:targetLayer2,db:db22}):[],solverInput={...layerPackInput,weightedConnections:layerPackInput.weightedConnections?.filter(connection=>connection.padIds.every(padId=>!collisionOnlyPadIds.has(padId))),obstacles:[...layerPackInput.obstacles??[],...staticLayerObstacles,...fallbackCrossLayerObstacles,...crossLayerPadObstacles],components:[...networkReferenceComponents,...layerPackInput.components.filter(component=>!component.isStatic)]},solver=new PackSolver2(solverInput),solverParams=solver.getConstructorParams();group2.root?.emit("solver:started",{type:"solver:started",solverName:"PackSolver2",solverParams,solverConstructorArgs:[solverParams],componentName:group2.getString()});let pcbPackSolverTimeoutMs=group2.root?.platform?.pcbPackSolverTimeoutMs,{timedOut}=solvePackSolverWithTimeout(solver,pcbPackSolverTimeoutMs);if(timedOut&&(packingFailed=!0,reportPackingError(`PackSolver2 timed out after ${pcbPackSolverTimeoutMs}ms`)),solver.failed){packingFailed=!0;let solverErrorMessage=solver.error??solver.activeSubSolver?.error??"No valid packing solution found";reportPackingError(solverErrorMessage)}if(packOutput.components.push(...solver.packedComponents.filter(component=>componentIdsForLayer.has(component.componentId))),timedOut)break}}catch(error2){throw reportPackingError(error2 instanceof Error?error2.message:String(error2)),error2}if(debug42.enabled&&global?.debugGraphics){let graphics=getGraphicsFromPackOutput(packOutput);graphics.title=`packOutput-${group2.name}`,global.debugGraphics?.push(graphics)}applyPackOutput(group2,packOutput,clusterMap,initialPackOutput),!packingFailed&&group2.root?.emit("packing:end",{subcircuit_id:group2.subcircuit_id,componentDisplayName:group2.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=group2=>group2.children.filter(child=>child.componentName==="Port"),normalizeGroupSchematicBoxPorts=group2=>{let{db:db22}=group2.root,ports=getDirectGroupPorts(group2);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&&db22.source_port.update(port.source_port_id,{pin_number:port._parsedProps.pinNumber,port_hints:port.getNameAndAliases()})}},getGroupSchematicBoxPinLabels=group2=>{let pinLabels={};for(let port of getDirectGroupPorts(group2)){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=group2=>{if(group2.root?.schematicDisabled)return;let{db:db22}=group2.root,props=group2._parsedProps;props.schPinSpacing!==void 0&&db22.source_property_ignored_warning.insert({source_component_id:group2.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(group2);let dimensions=group2._getSchematicBoxDimensions();if(!dimensions)return;let center2=group2._getGlobalSchematicPositionBeforeLayout(),size3=dimensions.getSize(),portLabels=group2._getPinLabelsFromPorts(),schPortArrangement=group2._getSchematicPortArrangement(),schematicComponent=db22.schematic_component.insert({center:center2,size:size3,source_group_id:group2.source_group_id,schematic_group_id:group2.schematic_group_id??void 0,subcircuit_id:group2.subcircuit_id??group2.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:group2._resolveSchematicSheetId()});group2.schematic_component_id=schematicComponent.schematic_component_id,group2.schematic_group_id&&db22.schematic_group.update(group2.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&&db22.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:group2._resolveSchematicSheetId()})},getSizeOfTreeNodeChild=(db22,child)=>{let{sourceComponent,sourceGroup}=child;if(child.nodeType==="component"){let schComponent=db22.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=db22.schematic_group.getWhere({source_group_id:sourceGroup?.source_group_id});if(schGroup?.width&&schGroup?.height)return{width:schGroup.width,height:schGroup.height};let groupComponents=db22.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=group2=>{let{db:db22}=group2.root,props=group2._parsedProps,tree=getCircuitJsonTree(db22.toArray(),{source_group_id:group2.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(db22,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(db22,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=db22.toArray();for(let child of flexBox.children){let{sourceComponent,sourceGroup}=child.metadata;if(sourceComponent){let schComponent=db22.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(!db22.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})}}group2.schematic_group_id&&db22.schematic_group.update(group2.schematic_group_id,{width:bounds.width,height:bounds.height})};function updateSchematicPrimitivesForLayoutShift({db:db22,schematicComponentId,deltaX,deltaY}){let rects=db22.schematic_rect.list({schematic_component_id:schematicComponentId});for(let rect of rects)rect.center.x+=deltaX,rect.center.y+=deltaY;let lines=db22.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=db22.schematic_circle.list({schematic_component_id:schematicComponentId});for(let circle3 of circles)circle3.center.x+=deltaX,circle3.center.y+=deltaY;let arcs=db22.schematic_arc.list({schematic_component_id:schematicComponentId});for(let arc2 of arcs)arc2.center.x+=deltaX,arc2.center.y+=deltaY;let paths=db22.schematic_path.list({schematic_component_id:schematicComponentId});for(let path of paths)for(let point62 of path.points)point62.x+=deltaX,point62.y+=deltaY}function Group_doInitialSchematicLayoutGrid(group2){let{db:db22}=group2.root,props=group2._parsedProps,schematicChildren=group2.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=db22.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=group2._getGlobalSchematicPositionBeforeLayout(),firstCellCenterX=groupCenter.x-totalGridWidth/2+maxCellWidth/2,firstCellCenterY=groupCenter.y+totalGridHeight/2-maxCellHeight/2;for(let i22=0;i22<schematicChildren.length;i22++){let child=schematicChildren[i22];if(!child.schematic_component_id)continue;let row=Math.floor(i22/numCols),col=i22%numCols;if(row>=numRows||col>=numCols){console.warn(`Schematic grid layout: Child ${child.getString()} at index ${i22} (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=db22.schematic_component.get(child.schematic_component_id);if(schComp){let oldChildCenter=schComp.center,newChildCenter={x:targetCellCenterX,y:targetCellCenterY};db22.schematic_component.update(child.schematic_component_id,{center:newChildCenter});let deltaX=newChildCenter.x-oldChildCenter.x,deltaY=newChildCenter.y-oldChildCenter.y,schPorts=db22.schematic_port.list({schematic_component_id:child.schematic_component_id});for(let port of schPorts)db22.schematic_port.update(port.schematic_port_id,{center:{x:port.center.x+deltaX,y:port.center.y+deltaY}});let schTexts=db22.schematic_text.list({schematic_component_id:child.schematic_component_id});for(let text of schTexts)db22.schematic_text.update(text.schematic_text_id,{position:{x:text.position.x+deltaX,y:text.position.y+deltaY}});updateSchematicPrimitivesForLayoutShift({db:db22,schematicComponentId:child.schematic_component_id,deltaX,deltaY})}}group2.schematic_group_id&&db22.schematic_group.update(group2.schematic_group_id,{width:totalGridWidth,height:totalGridHeight,center:groupCenter})}var debug52=(0,import_debug13.default)("Group_doInitialSchematicLayoutMatchAdapt");function Group_doInitialSchematicLayoutMatchAdapt(group2){let{db:db22}=group2.root,subtreeCircuitJson=buildSubtree(db22.toArray(),{source_group_id:group2.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-${group2.name}`}));let floatingGraphNoNotConnected={boxes:floatingGraph.boxes,pins:floatingGraph.pins.map(p22=>({...p22,color:p22.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(p22=>p22.boxId===box2.boxId).filter(bp22=>!bp22.color.includes("center")).length<=2).map(b22=>b22.boxId)),corpus:{}});debug52.enabled&&global?.debugGraphics&&global.debugGraphics?.push(getGraphicsForBpcGraph(laidOutBpcGraph,{title:`laidOutBpcGraph-${group2.name}`}));let groupOffset=group2._getGlobalSchematicPositionBeforeLayout();for(let box2 of laidOutBpcGraph.boxes){if(!box2.center)continue;let schematic_component22=db22.schematic_component.get(box2.boxId);if(schematic_component22){let newCenter={x:box2.center.x+groupOffset.x,y:box2.center.y+groupOffset.y},ports=db22.schematic_port.list({schematic_component_id:schematic_component22.schematic_component_id}),texts=db22.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:db22,schematicComponentId:schematic_component22.schematic_component_id,deltaX:positionDelta.x,deltaY:positionDelta.y}),schematic_component22.center=newCenter;continue}let schematic_net_label3=db22.schematic_net_label.get(box2.boxId);if(schematic_net_label3){let pin=laidOutBpcGraph.pins.find(p22=>p22.boxId===box2.boxId&&p22.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`)}}function getSchematicTextWidth({text,fontSize}){let charWidth=.12*(fontSize/.18);return text.length*charWidth}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","simple_voltage_source","simple_test_point"]);function getSchematicTextBounds({text,position:position4,anchor,fontSize}){let width=getSchematicTextWidth({text,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=zh[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(getSchematicTextBounds({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(db22,schematicComponent){if(!schematicComponent.center||!schematicComponent.size)return null;let sourceComponent=schematicComponent.source_component_id?db22.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 getOrientedSchematicComponent(schematicComponent,ccwRotationDegrees){let size3=schematicComponent.size;return size3&&(size3=getRotatedSize2(size3,ccwRotationDegrees)),{...schematicComponent,symbol_name:getRotatedSymbolName(schematicComponent.symbol_name,ccwRotationDegrees),size:size3}}function getSchematicComponentWithTextBounds({db:db22,schematicComponent,ccwRotationDegrees=0}){let orientedComponent=getOrientedSchematicComponent(schematicComponent,ccwRotationDegrees),textBounds=getSchematicComponentTextInclusiveBounds(db22,orientedComponent);if(!textBounds)return null;let boxBounds=getSymbolBoxBounds(orientedComponent);if(orientedComponent.size.height>orientedComponent.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 getPowerGroundForcedRotation(db22,ports){if(ports.length!==2)return null;let powerGroundRotations=new Set;for(let port of ports){let connectivityKey=db22.source_port.get(port.source_port_id)?.subcircuit_connectivity_map_key;if(!connectivityKey)continue;let net=db22.source_net.getWhere({subcircuit_connectivity_map_key:connectivityKey});if(!net)continue;let isGround=net.is_ground??!1,isPositiveVoltageSource=net.is_power===!0||net.is_positive_voltage_source===!0;if(isPositiveVoltageSource===isGround)continue;let rotationToPlacePinOnTop=ROTATION_TO_PLACE_SIDE_ON_TOP[facingDirectionToSide(port.facing_direction)],rotation5=isPositiveVoltageSource?rotationToPlacePinOnTop:(rotationToPlacePinOnTop+180)%360;powerGroundRotations.add(rotation5)}return powerGroundRotations.size===1?powerGroundRotations.values().next().value:null}function getChipSize({db:db22,schematicComponent,component,ccwRotationDegrees}){let orientedSymbolSize=schematicComponent.size;orientedSymbolSize&&(orientedSymbolSize=getRotatedSize2(orientedSymbolSize,ccwRotationDegrees));let componentWithTextBounds=getSchematicComponentWithTextBounds({db:db22,schematicComponent,ccwRotationDegrees}),textPadLeft=0,textPadRight=0,textPadTop=0,textPadBottom=0;if(componentWithTextBounds&&schematicComponent.center){let halfWidth=(orientedSymbolSize?.width??0)/2,halfHeight=(orientedSymbolSize?.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 orientedFootprint={width:(orientedSymbolSize?.width||1)+marginLeft+marginRight,height:(orientedSymbolSize?.height||1)+marginTop+marginBottom},chipSize=getRotatedSize2(orientedFootprint,ccwRotationDegrees);return{x:chipSize.width,y:chipSize.height}}function getReservedChipSize({db:db22,schematicComponent,component,ccwRotationDegrees,chipGap}){let unrotatedSize=getChipSize({db:db22,schematicComponent,component,ccwRotationDegrees:0});if(!shouldSwapOrientation(ccwRotationDegrees))return unrotatedSize;let rotatedSize=getChipSize({db:db22,schematicComponent,component,ccwRotationDegrees});return rotatedSize.x-unrotatedSize.x>=chipGap||rotatedSize.y-unrotatedSize.y>=chipGap?rotatedSize:unrotatedSize}function getNestedGroupMatchpackProxy({db:db22,schematicGroup,groupComponents,groupInstance}){let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0,hasValidBounds=!1;for(let component of groupComponents){if(!component.center||!component.size)continue;hasValidBounds=!0;let componentBounds=getSchematicComponentWithTextBounds({db:db22,schematicComponent:component})??getBoundFromCenteredRect({center:component.center,width:component.size.width,height:component.size.height});minX=Math.min(minX,componentBounds.minX),maxX=Math.max(maxX,componentBounds.maxX),minY=Math.min(minY,componentBounds.minY),maxY=Math.max(maxY,componentBounds.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,contentCenter=hasValidBounds?{x:(minX+maxX)/2,y:(minY+maxY)/2}:schematicGroup.center??{x:0,y:0};return{center:{x:contentCenter.x+(marginRight-marginLeft)/2,y:contentCenter.y+(marginTop-marginBottom)/2},size:{x:(hasValidBounds?maxX-minX:2)+marginLeft+marginRight,y:(hasValidBounds?maxY-minY:2)+marginTop+marginBottom}}}function isTreeChildExplicitlyPositioned(treeChild,group2){if(treeChild.nodeType==="component"&&treeChild.sourceComponent){let component=group2.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=group2.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}var getSchematicComponentForSourceComponent=({db:db22,sourceComponentId,schematicSheetId})=>db22.schematic_component.getWhere({source_component_id:sourceComponentId,...schematicSheetId?{schematic_sheet_id:schematicSheetId}:{}});function convertTreeToMatchPackInputProblem(tree,db22,group2,opts={}){let problem={chipMap:{},chipPinMap:{},netMap:{},pinStrongConnMap:{},netConnMap:{},chipGap:.6,decouplingCapsGap:.4,partitionGap:1.2},nestedGroupMatchpackProxyMap={},groupOffset=group2._getGlobalSchematicPositionBeforeLayout();debug62(`[${group2.name}] Processing ${tree.childNodes.length} child nodes for input problem`),tree.childNodes.forEach((child,index)=>{let explicitlyPositioned=isTreeChildExplicitlyPositioned(child,group2);if(debug62(explicitlyPositioned?`[${group2.name}] Child ${index} explicitly positioned, including as fixed chip`:`[${group2.name}] Processing child ${index}: nodeType=${child.nodeType}`),child.nodeType==="component"?debug62(`[${group2.name}] - Component: ${child.sourceComponent?.name}`):child.nodeType==="group"&&debug62(`[${group2.name}] - Group: ${child.sourceGroup?.name}`),child.nodeType==="component"&&child.sourceComponent){let chipId=getTreeChildChipId(child,index),schematicComponent=getSchematicComponentForSourceComponent({db:db22,sourceComponentId:child.sourceComponent.source_component_id,schematicSheetId:opts.schematicSheetId});if(!schematicComponent)return;let component=group2.children.find(groupChild=>groupChild.source_component_id===child.sourceComponent?.source_component_id),ports=db22.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id}),availableRotations=[...DEFAULT_AVAILABLE_ROTATIONS];if(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]),availableRotations.length===DEFAULT_AVAILABLE_ROTATIONS.length){let forcedRotation=getPowerGroundForcedRotation(db22,ports);forcedRotation!==null&&(availableRotations=[forcedRotation])}let ccwRotationDegrees=availableRotations.length===1?availableRotations[0]:0;problem.chipMap[chipId]={chipId,pins:[],size:getReservedChipSize({db:db22,schematicComponent,component,ccwRotationDegrees,chipGap:problem.chipGap}),isCapacitor:child.sourceComponent.ftype==="simple_capacitor",isCrystal:child.sourceComponent.ftype==="simple_crystal",isResistor:child.sourceComponent.ftype==="simple_resistor",isTestPoint:child.sourceComponent.ftype==="simple_test_point",availableRotations,...explicitlyPositioned&&{fixedPosition:{x:schematicComponent.center.x-groupOffset.x,y:schematicComponent.center.y-groupOffset.y}}};for(let port of ports){let sourcePort=db22.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(`[${group2.name}] Processing nested group: ${groupId}`);let schematicGroup=db22.schematic_group?.getWhere?.({source_group_id:child.sourceGroup.source_group_id}),groupInstance=group2.children.find(groupChild=>groupChild.source_group_id===child.sourceGroup?.source_group_id);if(debug62(`[${group2.name}] Found schematic_group for ${groupId}:`,schematicGroup),schematicGroup){debug62(`[${group2.name}] Treating group ${groupId} as composite chip`);let groupComponents=db22.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});debug62(`[${group2.name}] Group ${groupId} has ${groupComponents.length} components:`,groupComponents.map(c22=>c22.source_component_id));let matchpackProxy=getNestedGroupMatchpackProxy({db:db22,schematicGroup,groupComponents,groupInstance});nestedGroupMatchpackProxyMap[groupId]=matchpackProxy,debug62(`[${group2.name}] Group ${groupId} computed proxy: ${matchpackProxy.size.x} x ${matchpackProxy.size.y} centered at (${matchpackProxy.center.x}, ${matchpackProxy.center.y})`);let groupPins=[];for(let comp of groupComponents){let ports=db22.schematic_port.list({schematic_component_id:comp.schematic_component_id});for(let port of ports){let sourcePort=db22.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 side=facingDirectionToSide(port.facing_direction);problem.chipPinMap[pinId]={pinId,offset:{x:(port.center?.x||0)-matchpackProxy.center.x,y:(port.center?.y||0)-matchpackProxy.center.y},side}}}debug62(`[${group2.name}] Group ${groupId} has ${groupPins.length} pins:`,groupPins),problem.chipMap[groupId]={chipId:groupId,pins:groupPins,size:matchpackProxy.size},debug62(`[${group2.name}] Added group ${groupId} to chipMap`)}else debug62(`[${group2.name}] Warning: No schematic_group found for group ${groupId}`)}}),debug62(`[${group2.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=db22.schematic_group?.getWhere?.({source_group_id:treeNode.sourceGroup.source_group_id});if(schematicGroup){let groupComponents=db22.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});for(let comp of groupComponents){let sourcePorts=db22.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(`[${group2.name}] \u2713 Pin ${pinId} has connectivity key: ${connectivityKey}`)}else debug62(`[${group2.name}] Pin ${pinId} has no connectivity key`)}}}}else if(treeNode?.nodeType==="component"&&treeNode.sourceComponent){let sourcePorts=db22.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(`[${group2.name}] Pin ${pinId} has connectivity key: ${connectivityKey}`)}}}}debug62(`[${group2.name}] Found ${connectivityGroups.size} connectivity groups:`,Array.from(connectivityGroups.entries()).map(([key,pins])=>({key,pins})));for(let[connectivityKey,pins]of connectivityGroups){let tracesWithThisKey=db22.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(`[${group2.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=db22.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&&db22.source_port.list({source_component_id:treeNode.sourceComponent.source_component_id}).some(p22=>p22.source_port_id===portId)&&directlyConnectedPins.push(pinId)}}for(let i22=0;i22<directlyConnectedPins.length;i22++)for(let j22=i22+1;j22<directlyConnectedPins.length;j22++){let pin1=directlyConnectedPins[i22],pin2=directlyConnectedPins[j22];problem.pinStrongConnMap[`${pin1}-${pin2}`]=!0,problem.pinStrongConnMap[`${pin2}-${pin1}`]=!0,debug62(`[${group2.name}] Created strong connection: ${pin1} <-> ${pin2}`)}}}if(hasNetConnections){let source_net3=db22.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(`[${group2.name}] Created net ${connectivityKey} with ${pins.length} pins:`,pins)}}return{inputProblem:problem,nestedGroupMatchpackProxyMap}}function applySchematicMatchPackLayoutToTree(group2,tree,opts={}){let{db:db22}=group2.root;if(debug62(`[${group2.name}] Starting matchpack layout with ${tree.childNodes.length} children`),debug62(`[${group2.name}] Tree structure:`,JSON.stringify(tree,null,2)),tree.childNodes.length<=1){debug62(`[${group2.name}] Only ${tree.childNodes.length} children, skipping layout`);return}debug62("Converting circuit tree to InputProblem...");let{inputProblem,nestedGroupMatchpackProxyMap}=convertTreeToMatchPackInputProblem(tree,db22,group2,opts);debug62.enabled&&group2.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`matchpack-input-problem-${group2.name}`,content:JSON.stringify(inputProblem,null,2)});let solver=new LayoutPipelineSolver(inputProblem);if(group2.root?.emit("solver:started",{type:"solver:started",solverName:"LayoutPipelineSolver",solverParams:inputProblem,solverConstructorArgs:[inputProblem],componentName:group2.getString()}),debug62("Starting LayoutPipelineSolver..."),debug62.enabled&&global?.debugGraphics){let initialViz=solver.visualize();global.debugGraphics.push({...initialViz,title:`matchpack-initial-${group2.name}`})}if(solver.solve(),group2.root?.emit("solver:ended",{type:"solver:ended",solverName:"LayoutPipelineSolver",componentName:group2.getString(),solved:solver.solved,failed:solver.failed,iterations:solver.iterations,error:solver.error}),debug62(`Solver completed in ${solver.iterations} iterations`),debug62(`Solved: ${solver.solved}, Failed: ${solver.failed}`),solver.failed){let solverError=solver.error??"Unknown Matchpack failure";debug62(`Solver failed with error: ${solverError}`),db22.schematic_layout_error.insert({error_type:"schematic_layout_error",message:`Matchpack layout solver failed: ${solverError}`,is_fatal:!1,source_group_id:group2.source_group_id,schematic_group_id:group2.schematic_group_id,subcircuit_id:group2.subcircuit_id??void 0});return}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-${group2.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=group2._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=group2.children.find(c22=>c22.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=getSchematicComponentForSourceComponent({db:db22,sourceComponentId:treeNode.sourceComponent.source_component_id,schematicSheetId:opts.schematicSheetId});if(schematicComponent){debug62(`Moving component ${chipId} to (${newCenter.x}, ${newCenter.y})`);let ports=db22.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id}),texts=db22.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:db22,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,cos32=Math.cos(angleRad),sin32=Math.sin(angleRad);for(let port of ports){let dx22=port.center.x-newCenter.x,dy22=port.center.y-newCenter.y,rotatedDx=dx22*cos32-dy22*sin32,rotatedDy=dx22*sin32+dy22*cos32;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 dx22=text.position.x-newCenter.x,dy22=text.position.y-newCenter.y,rotatedDx=dx22*cos32-dy22*sin32,rotatedDy=dx22*sin32+dy22*cos32;text.position.x=newCenter.x+rotatedDx,text.position.y=newCenter.y+rotatedDy}schematicComponent.symbol_name&&(schematicComponent.symbol_name=getRotatedSymbolName(schematicComponent.symbol_name,placement.ccwRotationDegrees))}}}else if(treeNode.nodeType==="group"&&treeNode.sourceGroup){let schematicGroup=db22.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=db22.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});debug62(`Group ${chipId} has ${groupComponents.length} components to move`);let matchpackProxy=nestedGroupMatchpackProxyMap[chipId],oldCenter=matchpackProxy?.center??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=db22.schematic_port.list({schematic_component_id:component.schematic_component_id}),texts=db22.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);updateSchematicPrimitivesForLayoutShift({db:db22,schematicComponentId:component.schematic_component_id,deltaX:positionDelta.x,deltaY:positionDelta.y})}schematicGroup.center=newCenter,matchpackProxy&&(schematicGroup.width=matchpackProxy.size.x,schematicGroup.height=matchpackProxy.size.y),debug62(`Updated group ${chipId} center to (${newCenter.x}, ${newCenter.y})`)}}}debug62("Matchpack layout completed successfully")}function getSchematicSheetIdsBySourceGroupId({circuitJson,schematicSheetIdsBySourceComponentId}){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 schematicSheetIdsBySourceGroupId=new Map;for(let element of circuitJson){if(element.type!=="source_component"||!element.source_group_id)continue;let schematicSheetIds=schematicSheetIdsBySourceComponentId.get(element.source_component_id);if(schematicSheetIds!==void 0)for(let schematicSheetId of schematicSheetIds){let sourceGroupId=element.source_group_id,visitedSourceGroupIds=new Set;for(;sourceGroupId&&!visitedSourceGroupIds.has(sourceGroupId);){visitedSourceGroupIds.add(sourceGroupId);let groupSchematicSheetIds=schematicSheetIdsBySourceGroupId.get(sourceGroupId)??new Set;groupSchematicSheetIds.add(schematicSheetId),schematicSheetIdsBySourceGroupId.set(sourceGroupId,groupSchematicSheetIds),sourceGroupId=parentBySourceGroupId.get(sourceGroupId)}}}return schematicSheetIdsBySourceGroupId}function getCircuitJsonScopedToSchematicSheet({circuitJson,schematicSheetId,rootSourceGroupId,schematicSheetIdsBySourceComponentId,schematicSheetIdsBySourceGroupId}){let isGroupOnSheet=sourceGroupId=>sourceGroupId===rootSourceGroupId||schematicSheetIdsBySourceGroupId.get(sourceGroupId)?.has(schematicSheetId)===!0;return circuitJson.filter(element=>element.type==="source_group"?isGroupOnSheet(element.source_group_id):element.type==="source_component"?schematicSheetIdsBySourceComponentId.get(element.source_component_id)?.has(schematicSheetId)!==!0?!1:element.source_group_id?isGroupOnSheet(element.source_group_id):!0:!0)}function getSchematicCircuitJsonTrees(circuitJson,opts){let{source_group_id}=opts,schematicSheetIdsBySourceComponentId=new Map;for(let element of circuitJson){if(element.type!=="schematic_component"||!element.source_component_id||!element.schematic_sheet_id)continue;let schematicSheetIds2=schematicSheetIdsBySourceComponentId.get(element.source_component_id)??new Set;schematicSheetIds2.add(element.schematic_sheet_id),schematicSheetIdsBySourceComponentId.set(element.source_component_id,schematicSheetIds2)}let schematicSheetIds=new Set;for(let componentSchematicSheetIds of schematicSheetIdsBySourceComponentId.values())for(let schematicSheetId of componentSchematicSheetIds)schematicSheetIds.add(schematicSheetId);if(schematicSheetIds.size<=1)return[{tree:getCircuitJsonTree(circuitJson,{source_group_id}),schematicSheetId:schematicSheetIds.values().next().value}];let schematicSheetIdsBySourceGroupId=getSchematicSheetIdsBySourceGroupId({circuitJson,schematicSheetIdsBySourceComponentId});return Array.from(schematicSheetIds).map(schematicSheetId=>({tree:getCircuitJsonTree(getCircuitJsonScopedToSchematicSheet({circuitJson,schematicSheetId,rootSourceGroupId:source_group_id,schematicSheetIdsBySourceComponentId,schematicSheetIdsBySourceGroupId}),{source_group_id}),schematicSheetId}))}function Group_doInitialSchematicLayoutMatchPack(group2){let{db:db22}=group2.root,trees=getSchematicCircuitJsonTrees(db22.toArray(),{source_group_id:group2.source_group_id});for(let{tree,schematicSheetId}of trees)applySchematicMatchPackLayoutToTree(group2,tree,{schematicSheetId})}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(group2){let{db:db22}=group2.root,sectionNamesUsedByChildren=new Set,hasChildrenWithoutSection=!1;for(let child of group2.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&§ionNamesToLayout.push(null),sectionNamesToLayout.length===0)return;for(let sectionName of sectionNamesToLayout){let sectionTree=getCircuitJsonTree(db22.toArray(),{source_group_id:group2.source_group_id});sectionTree.childNodes=sectionTree.childNodes.filter(child=>child.nodeType!=="component"||!child.sourceComponent?!1:(group2.children.find(c22=>c22.source_component_id===child.sourceComponent?.source_component_id)?.getSchematicSectionName()??null)===sectionName),applySchematicMatchPackLayoutToTree(group2,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 group2.children){let sourceComponentId=child.source_component_id;if(!sourceComponentId||child.getSchematicSectionName()!==sectionName)continue;let schComp=db22.schematic_component.getWhere({source_component_id:sourceComponentId});if(!schComp)continue;sourceCompIds.add(sourceComponentId);let hw22=schComp.size.width/2,hh22=schComp.size.height/2;minX=Math.min(minX,schComp.center.x-hw22),maxX=Math.max(maxX,schComp.center.x+hw22),minY=Math.min(minY,schComp.center.y-hh22),maxY=Math.max(maxY,schComp.center.y+hh22)}!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 group2.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=group2._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(`[${group2.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=db22.schematic_component.getWhere({source_component_id:sourceComponentId});if(!schComp)continue;let ports=db22.schematic_port.list({schematic_component_id:schComp.schematic_component_id}),texts=db22.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:db22,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 updateMissingSchematicSheetWarning=({db:db22,schematicDisabled})=>{let existingWarning=db22.schematic_missing_sheet_warning.list()[0],hasSchematicComponents=db22.schematic_component.list().length>0;if(!(!schematicDisabled&&hasSchematicComponents&&db22.schematic_sheet.list().length===0)){existingWarning&&db22.schematic_missing_sheet_warning.delete(existingWarning.schematic_missing_sheet_warning_id);return}existingWarning||db22.schematic_missing_sheet_warning.insert({warning_type:"schematic_missing_sheet_warning",message:"No <schematicsheet> was found. Add a <schematicsheet> to define the schematic drawing area."})},Group_doInitialSchematicSheetRender=group2=>{let root=group2.root;if(!root?.isRootCircuit)return;let isRootGroup=root.firstChild===group2,isRootAssemblyChild=isAssemblyDeviceContainer(root.firstChild)&&group2.parent===root.firstChild;!isRootGroup&&!isRootAssemblyChild||updateMissingSchematicSheetWarning({db:root.db,schematicDisabled:root.schematicDisabled})},Group_updateSchematicSheetRender=group2=>{Group_doInitialSchematicSheetRender(group2)},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(),dx22=connectedPortPosition.x-anchorPos.x,dy22=connectedPortPosition.y-anchorPos.y;if(Math.abs(dx22)>Math.abs(dy22)){if(dx22>0)return"right";if(dx22<0)return"left"}else{if(dy22>0)return"top";if(dy22<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:db22}=this.root,{_parsedProps:props}=this;if(props.inline&&this.root?._featureMspSchematicTraceRouting&&this._getConnectedPorts().length>0)return;let 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=db22.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(){let connectsTo=this._resolveConnectsTo();if(connectsTo)for(let connection of connectsTo)this.add(new Trace({from:connection,to:`net.${this._getNetName()}`}))}doInitialSchematicTraceRender(){if(!this.root?._featureMspSchematicTraceRouting||this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor()||this._parsedProps.inline)return;let{schX,schY}=this._parsedProps;if(schX===void 0&&schY===void 0)return;let{db:db22}=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=db22.source_trace.list().find(st22=>st22.connected_source_net_ids?.includes(net.source_net_id)&&st22.connected_source_port_ids?.includes(port.source_port_id??""));if(candidateSourceTrace&&(existingTraceForThisConnection=db22.schematic_trace.list().some(t48=>t48.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 i22=0;i22<path.length-1;i22++)edges.push({from:{x:path[i22].x,y:path[i22].y},to:{x:path[i22+1].x,y:path[i22+1].y}});let source_trace_id,subcircuit_connectivity_map_key;if(net?.source_net_id&&port.source_port_id){let st22=db22.source_trace.list().find(s22=>s22.connected_source_net_ids?.includes(net.source_net_id)&&s22.connected_source_port_ids?.includes(port.source_port_id));source_trace_id=st22?.source_trace_id,subcircuit_connectivity_map_key=st22?.subcircuit_connectivity_map_key||db22.source_net.get(net.source_net_id)?.subcircuit_connectivity_map_key}db22.schematic_trace.insert({source_trace_id,edges,junctions:[],subcircuit_connectivity_map_key,schematic_sheet_id:this._resolveSchematicSheetId()}),db22.schematic_port.update(port.schematic_port_id,{is_connected:!0})}}},getNetNameFromPorts=ports=>{let directlyConnectedTraces=[...new Set(ports.flatMap(port=>port._getDirectlyConnectedTraces()))],displayLabel=directlyConnectedTraces.find(trace=>trace._parsedProps.schDisplayLabel)?._parsedProps.schDisplayLabel??directlyConnectedTraces.find(trace=>trace._parsedProps.displayName)?._parsedProps.displayName??directlyConnectedTraces.find(trace=>trace._parsedProps.name)?._parsedProps.name;if(displayLabel)return{name:displayLabel,wasAssignedDisplayLabel:!0};let db22=ports.find(port=>port.root)?.root?.db,sourcePortIds=ports.map(port=>port.source_port_id).filter(sourcePortId=>!!sourcePortId);return{name:(db22?getNetNameFromSourcePorts(db22,sourcePortIds):ports.map(port=>port._getNetLabelText()).filter(name=>!!name).sort((a22,b22)=>a22.localeCompare(b22,void 0,{numeric:!0,sensitivity:"base"}))[0])??"",wasAssignedDisplayLabel:!1}},appendToMap=(map,key,value)=>{let values=map.get(key);values?values.push(value):map.set(key,[value])},createCanonicalSchematicNetLabelTextResolver=group2=>{let{db:db22}=group2.root,sourceNetByConnectionKey=new Map,portsByConnectionKey=new Map,sourcePortIdsByConnectionKey=new Map,resolvedTextByConnectionKey=new Map;for(let sourceNet of db22.source_net.list())sourceNet.subcircuit_connectivity_map_key&&sourceNetByConnectionKey.set(sourceNet.subcircuit_connectivity_map_key,sourceNet);for(let port of group2.selectAll("port")){let connectionKey=port._getSubcircuitConnectivityKey();connectionKey&&appendToMap(portsByConnectionKey,connectionKey,port)}for(let sourcePort of db22.source_port.list())sourcePort.subcircuit_connectivity_map_key&&appendToMap(sourcePortIdsByConnectionKey,sourcePort.subcircuit_connectivity_map_key,sourcePort.source_port_id);return({subcircuitConnectivityMapKey})=>{let cached=resolvedTextByConnectionKey.get(subcircuitConnectivityMapKey);if(cached)return cached;let resolvedSourceNet=sourceNetByConnectionKey.get(subcircuitConnectivityMapKey);if(resolvedSourceNet?.name){let result2={name:resolvedSourceNet.name,wasAssignedDisplayLabel:!0};return resolvedTextByConnectionKey.set(subcircuitConnectivityMapKey,result2),result2}let portLabel=getNetNameFromPorts(portsByConnectionKey.get(subcircuitConnectivityMapKey)??[]);if(portLabel.name)return resolvedTextByConnectionKey.set(subcircuitConnectivityMapKey,portLabel),portLabel;let result={name:getNetNameFromSourcePorts(db22,sourcePortIdsByConnectionKey.get(subcircuitConnectivityMapKey)??[])??"",wasAssignedDisplayLabel:!1};return resolvedTextByConnectionKey.set(subcircuitConnectivityMapKey,result),result}},asSchematicPortId=id3=>id3,asSourcePortId=id3=>id3,debug8=(0,import_debug17.default)("Group_doInitialSchematicTraceRender"),INLINE_NET_LABEL_COLOR="rgb(132, 0, 0)",VERTICAL_INLINE_NET_LABEL_ROTATION=-90;function applyInlineNetLabelPlacements(args){let{group:group2,solver,userNetIdToConnKey,sourceTraceIdByPinPairKey,crossScopeSourceTraceIdBySchematicPortIdAndNetId}=args,{db:db22}=group2.root,inlineNetLabelPlacements=solver.inlineNetLabelSolver?.getOutput().inlineNetLabelPlacements??[];if(inlineNetLabelPlacements.length===0)return;let resolveCanonicalNetLabelText=createCanonicalSchematicNetLabelTextResolver(group2),globalConnMap=solver.mspConnectionPairSolver.globalConnMap;for(let placement of inlineNetLabelPlacements){let schematicPortIds=placement.pinIds.map(asSchematicPortId),placementUserNetId=globalConnMap.getIdsConnectedToNet(placement.globalConnNetId).find(id3=>userNetIdToConnKey.has(id3)),crossScopeSourceTraceId=schematicPortIds.length===1?crossScopeSourceTraceIdBySchematicPortIdAndNetId.get(schematicPortIds[0])?.get(placement.netId??placement.globalConnNetId):void 0,connKey=(crossScopeSourceTraceId?db22.source_trace.get(crossScopeSourceTraceId)?.subcircuit_connectivity_map_key:void 0)??(placementUserNetId?userNetIdToConnKey.get(placementUserNetId):void 0),text=placement.netLabelText??(connKey?resolveCanonicalNetLabelText({subcircuitConnectivityMapKey:connKey}).name:placement.netId??placement.globalConnNetId);if(!text){debug8(`skipping inline net label for "${placement.netId}" REASON:no resolvable text`);continue}let sourceTraceId=crossScopeSourceTraceId??sourceTraceIdByPinPairKey.get([...schematicPortIds].sort().join("::"));if(!sourceTraceId&&connKey){let sourcePortIds=schematicPortIds.flatMap(schematicPortId=>{let sourcePortId=db22.schematic_port.get(schematicPortId)?.source_port_id;return sourcePortId?[sourcePortId]:[]});sourceTraceId=db22.source_trace.list().find(sourceTrace=>sourceTrace.subcircuit_connectivity_map_key===connKey&&sourcePortIds.some(sourcePortId=>sourceTrace.connected_source_port_ids.includes(sourcePortId)))?.source_trace_id}let schematicSheetId=group2._resolveSchematicSheetId(),schematicPort=db22.schematic_port.get(schematicPortIds[0]);schematicPort?.schematic_sheet_id&&(schematicSheetId=schematicPort.schematic_sheet_id);let placementOffset={x:0,y:0},stubTracePath=placement.stubTracePath?.map(point62=>({...point62}));if(stubTracePath&&schematicPortIds.length===1){let portCenter=db22.schematic_port.get(schematicPortIds[0])?.center;portCenter&&(placementOffset={x:portCenter.x-stubTracePath[0].x,y:portCenter.y-stubTracePath[0].y},stubTracePath=stubTracePath.map(point62=>({x:point62.x+placementOffset.x,y:point62.y+placementOffset.y})))}let shiftedAnchorPoint={x:placement.anchorPoint.x+placementOffset.x,y:placement.anchorPoint.y+placementOffset.y},position4={x:placement.center.x+placementOffset.x,y:placement.center.y+placementOffset.y},textAnchor="center",halfHeight=placement.height/2;switch(placement.side){case"y+":position4.y=shiftedAnchorPoint.y+halfHeight;break;case"y-":position4.y=shiftedAnchorPoint.y-halfHeight;break;case"x+":position4.x=shiftedAnchorPoint.x+halfHeight;break;case"x-":position4.x=shiftedAnchorPoint.x-halfHeight;break}if(stubTracePath&&stubTracePath.length===2){let[start,end]=stubTracePath;if(placement.axis==="x"){let extendsRight=end.x>start.x;textAnchor=extendsRight?"left":"right",position4.x+=extendsRight?-placement.width/2:placement.width/2}else{let extendsUp=end.y>start.y;textAnchor=extendsUp?"left":"right",position4.y+=extendsUp?-placement.width/2:placement.width/2}}stubTracePath&&stubTracePath.length===2&&(db22.schematic_trace.insert({source_trace_id:sourceTraceId,edges:[{from:stubTracePath[0],to:stubTracePath[1]}],junctions:[],subcircuit_connectivity_map_key:connKey,schematic_sheet_id:schematicSheetId}),db22.schematic_port.update(schematicPortIds[0],{is_connected:!0})),db22.schematic_text.insert({text,source_trace_id:sourceTraceId,anchor:textAnchor,position:position4,rotation:placement.axis==="y"?VERTICAL_INLINE_NET_LABEL_ROTATION:0,font_size:placement.height,color:INLINE_NET_LABEL_COLOR,schematic_sheet_id:schematicSheetId})}}var NET_LABEL_TEXT_HEIGHT=.18,getNetLabelTextBounds=({center:center2,text})=>{let halfWidth=getSchematicNetLabelTextWidth2({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}},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"}},debug9=(0,import_debug18.default)("Group_doInitialSchematicTraceRender"),isSameNet=(label,sourceNet)=>label.schematicNetLabel.source_net_id!=null&&label.schematicNetLabel.source_net_id===sourceNet.source_net_id,isUserDefinedNetLabelRedundantWithPlacement=(label,solverPlacement)=>isSameNet(label,solverPlacement.sourceNet)?label.schematicPortIds.some(id3=>solverPlacement.schematicPortIds.has(id3))?!0:label.schematicNetLabel.center?doBoundsOverlap(getNetLabelTextBounds({center:label.schematicNetLabel.center,text:label.schematicNetLabel.text}),solverPlacement.bounds):!1:!1;function applyNetLabelPlacements(args){let{group:group2,routedSchematicPortIdBySchematicPortId,solver,connKeyToSourceNet,userNetIdToConnKey,crossScopeSourceTraceIdBySchematicPortIdAndNetId,sourceTraceIdByPortOnlyLabelSchematicPortId,connKeysWithExplicitPortNetTraces,schematicPortIdsWithPreExistingNetLabels,schematicPortIdsWithRoutedTraces,netLabels}=args,{db:db22}=group2.root,resolveCanonicalNetLabelText=createCanonicalSchematicNetLabelTextResolver(group2),netLabelPlacements=solver.inlineNetLabelSolver?.getOutput().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=netLabels.map(label=>{if(!label.schematic_net_label_id)return null;let dbLabel=db22.schematic_net_label.get(label.schematic_net_label_id);return dbLabel?{schematicNetLabel:dbLabel,schematicPortIds:label._getConnectedPorts().map(port=>port.schematic_port_id).filter(id3=>!!id3).map(id3=>routedSchematicPortIdBySchematicPortId.get(id3)??id3),shouldUseSchematicTraceSolver:label._parsedProps.schX===void 0&&label._parsedProps.schY===void 0}:null}).filter(label=>label!==null);for(let placement of dedupedNetLabelPlacements){debug9(`processing placement: ${placement.netId}`);let schPortIds=placement.pinIds.map(asSchematicPortId),placementSourceTraceId=(schPortIds.length===1?crossScopeSourceTraceIdBySchematicPortIdAndNetId.get(schPortIds[0])?.get(placement.netId??placement.globalConnNetId):void 0)??(schPortIds.length===1?sourceTraceIdByPortOnlyLabelSchematicPortId.get(schPortIds[0]):void 0),placementSourceTrace=placementSourceTraceId?db22.source_trace.get(placementSourceTraceId):void 0,placementUserNetId=globalConnMap.getIdsConnectedToNet(placement.globalConnNetId).find(id3=>userNetIdToConnKey.get(id3)),placementConnKey=placementSourceTrace?.subcircuit_connectivity_map_key??userNetIdToConnKey.get(placementUserNetId),orientation22=placement.orientation,anchor_side=oppositeSide2(orientation22),sourceNet;placementConnKey&&(sourceNet=connKeyToSourceNet.get(placementConnKey));let resolvedCanonicalNetLabel=placementConnKey?resolveCanonicalNetLabelText({subcircuitConnectivityMapKey:placementConnKey}):{name:placement.netId??placement.globalConnNetId,wasAssignedDisplayLabel:!1},canonicalNetLabel=placement.netLabelText?{name:placement.netLabelText,wasAssignedDisplayLabel:!0}:resolvedCanonicalNetLabel,schematicSheetId=group2._resolveSchematicSheetId(),schematicPort=db22.schematic_port.get(schPortIds[0]);schematicPort?.schematic_sheet_id&&(schematicSheetId=schematicPort.schematic_sheet_id);let anchor_position=placement.anchorPoint;if(schPortIds.length===1&&schPortIds[0]){let anchorSchPort=db22.schematic_port.get(schPortIds[0]);anchorSchPort?.center&&!anchorSchPort.is_connected&&(anchor_position=anchorSchPort.center)}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=canonicalNetLabel.name,center22=computeSchematicNetLabelCenter({anchor_position,anchor_side,text:text2}),solverManagedUserNetLabel=userDefinedNetLabels.find(label=>label.shouldUseSchematicTraceSolver&&isSameNet(label,sourceNet)&&label.schematicPortIds.some(id3=>schPortIds.includes(id3)));if(solverManagedUserNetLabel){db22.schematic_net_label.update(solverManagedUserNetLabel.schematicNetLabel.schematic_net_label_id,{anchor_position,center:center22,anchor_side,schematic_sheet_id:schematicSheetId,source_trace_id:placementSourceTraceId});continue}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:schematicSheetId,source_trace_id:placementSourceTraceId};db22.schematic_net_label.insert(netLabel2);continue}let{name:text,wasAssignedDisplayLabel}=canonicalNetLabel,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:schematicSheetId,source_trace_id:placementSourceTraceId};db22.schematic_net_label.insert(netLabel)}}var cross42=(ax22,ay22,bx22,by22)=>ax22*by22-ay22*bx22;function segmentIntersection(p12,p22,q12,q22,tol){let r22={x:p22.x-p12.x,y:p22.y-p12.y},s22={x:q22.x-q12.x,y:q22.y-q12.y},rxs=cross42(r22.x,r22.y,s22.x,s22.y),q_p={x:q12.x-p12.x,y:q12.y-p12.y},q_pxr=cross42(q_p.x,q_p.y,r22.x,r22.y);if(Math.abs(rxs)<tol&&Math.abs(q_pxr)<tol||Math.abs(rxs)<tol&&Math.abs(q_pxr)>=tol)return null;let t48=cross42(q_p.x,q_p.y,s22.x,s22.y)/rxs,u22=cross42(q_p.x,q_p.y,r22.x,r22.y)/rxs;return t48<-tol||t48>1+tol||u22<-tol||u22>1+tol?null:{x:p12.x+t48*r22.x,y:p12.y+t48*r22.y}}var TOL4=1e-6;function isHorizontalEdge(edge){let dx22=Math.abs(edge.to.x-edge.from.x),dy22=Math.abs(edge.to.y-edge.from.y);return dx22>=dy22}function length7(a22,b22){return Math.hypot(b22.x-a22.x,b22.y-a22.y)}function pointAt(a22,b22,t48){return{x:a22.x+(b22.x-a22.x)*t48,y:a22.y+(b22.y-a22.y)*t48}}function paramAlong(a22,b22,p22){let L22=length7(a22,b22);if(L22<TOL4)return 0;let t48=((p22.x-a22.x)*(b22.x-a22.x)+(p22.y-a22.y)*(b22.y-a22.y))/((b22.x-a22.x)*(b22.x-a22.x)+(b22.y-a22.y)*(b22.y-a22.y));return Math.max(0,Math.min(1,t48))*L22}function mergeIntervals(intervals,tol=TOL4){if(intervals.length===0)return intervals;intervals.sort((a22,b22)=>a22.start-b22.start);let merged=[],cur={...intervals[0]};for(let i22=1;i22<intervals.length;i22++){let nxt=intervals[i22];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 L22=length7(edge.from,edge.to);if(L22<TOL4||crossingDistances.length===0)return[edge];let half=crossLen/2,rawIntervals=crossingDistances.map(d22=>({start:Math.max(0,d22-half),end:Math.min(L22,d22+half)})).filter(iv22=>iv22.end-iv22.start>TOL4),intervals=mergeIntervals(rawIntervals),result=[],cursor=0,dir2={x:edge.to.x-edge.from.x,y:edge.to.y-edge.from.y},addSeg=(d03,d12,isCrossing)=>{if(d12-d03<=TOL4)return;let t03=d03/L22,t110=d12/L22;result.push({from:pointAt(edge.from,edge.to,t03),to:pointAt(edge.from,edge.to,t110),...isCrossing?{is_crossing:!0}:{}})};for(let iv22 of intervals)iv22.start-cursor>TOL4&&addSeg(cursor,iv22.start,!1),addSeg(iv22.start,iv22.end,!0),cursor=iv22.end;return L22-cursor>TOL4&&addSeg(cursor,L22,!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 A22=traces[ti3];for(let ei3=0;ei3<A22.edges.length;ei3++){let eA22=A22.edges[ei3];for(let tj2=ti3;tj2<traces.length;tj2++){let B22=traces[tj2];for(let ej2=tj2===ti3?ei3+1:0;ej2<B22.edges.length;ej2++){let eB2=B22.edges[ej2];if(A22.connectivity_key!==void 0&&A22.connectivity_key===B22.connectivity_key)continue;let P22=segmentIntersection(eA22.from,eA22.to,eB2.from,eB2.to,tol);if(!P22)continue;let LA22=length7(eA22.from,eA22.to),LB2=length7(eB2.from,eB2.to);if(LA22<tol||LB2<tol)continue;let dA22=paramAlong(eA22.from,eA22.to,P22),dB3=paramAlong(eB2.from,eB2.to,P22),nearEndpointA=dA22<=tol||Math.abs(LA22-dA22)<=tol||Number.isNaN(dA22),nearEndpointB=dB3<=tol||Math.abs(LB2-dB3)<=tol||Number.isNaN(dB3);if(!nearEndpointA&&!nearEndpointB){let aIsHorizontal=isHorizontalEdge(eA22),bIsHorizontal=isHorizontalEdge(eB2),assignToA;if(aIsHorizontal!==bIsHorizontal)assignToA=aIsHorizontal;else{let ax22=Math.abs(eA22.to.x-eA22.from.x),ay22=Math.abs(eA22.to.y-eA22.from.y),bx22=Math.abs(eB2.to.x-eB2.from.x),by22=Math.abs(eB2.to.y-eB2.from.y),aScore=ax22-ay22,bScore=bx22-by22;assignToA=aScore===bScore?!0:aScore>bScore}let chosenKey=keyOf({traceIdx:assignToA?ti3:tj2,edgeIdx:assignToA?ei3:ej2}),chosenList=crossingsByEdge.get(chosenKey)??[];chosenList.push(assignToA?dA22:dB3),crossingsByEdge.set(chosenKey,chosenList)}}}}}let out=traces.map(t48=>({source_trace_id:t48.source_trace_id,connectivity_key:t48.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 uniqueSorted3=Array.from(new Set(splittingDistances.map(d22=>Number(d22.toFixed(6))))).sort((a22,b22)=>a22-b22),split=splitEdgeByCrossings(trace.edges[ei3],uniqueSorted3,crossLen);out[ti3].edges.push(...split)}}return out}var TOL22=1e-6;function nearlyEqual2(a22,b22,tol=TOL22){return Math.abs(a22-b22)<=tol}function pointEq(a22,b22,tol=TOL22){return nearlyEqual2(a22.x,b22.x,tol)&&nearlyEqual2(a22.y,b22.y,tol)}function onSegment32(p22,a22,b22,tol=TOL22){let minX=Math.min(a22.x,b22.x)-tol,maxX=Math.max(a22.x,b22.x)+tol,minY=Math.min(a22.y,b22.y)-tol,maxY=Math.max(a22.y,b22.y)+tol;return p22.x<minX||p22.x>maxX||p22.y<minY||p22.y>maxY?!1:Math.abs((b22.x-a22.x)*(p22.y-a22.y)-(b22.y-a22.y)*(p22.x-a22.x))<=tol}function dedupePoints(points,tol=TOL22){let map=new Map;for(let p22 of points){let key=`${p22.x.toFixed(6)},${p22.y.toFixed(6)}`;map.has(key)||map.set(key,p22)}return Array.from(map.values())}function edgeVec(e210){return{x:e210.to.x-e210.from.x,y:e210.to.y-e210.from.y}}function isEndpointOfEdge(p22,e210,tol=TOL22){return pointEq(p22,e210.from,tol)||pointEq(p22,e210.to,tol)}function isParallel(e110,e210,tol=TOL22){let v12=edgeVec(e110),v22=edgeVec(e210),L12=Math.hypot(v12.x,v12.y),L22=Math.hypot(v22.x,v22.y);if(L12<tol||L22<tol)return!0;let cross5=v12.x*v22.y-v12.y*v22.x;return Math.abs(cross5)<=tol*L12*L22}function incidentEdgesAtPoint(trace,p22,tol=TOL22){return trace.edges.filter(e210=>pointEq(e210.from,p22,tol)||pointEq(e210.to,p22,tol))}function nearestEndpointOnTrace(trace,p22,tol=TOL22){for(let e210 of trace.edges){if(pointEq(e210.from,p22,tol))return e210.from;if(pointEq(e210.to,p22,tol))return e210.to}return null}function edgeDirectionFromPoint(e210,p22,tol=TOL22){let other=pointEq(e210.from,p22,tol)||nearlyEqual2(e210.from.x,p22.x,tol)&&nearlyEqual2(e210.from.y,p22.y,tol)?e210.to:e210.from,dx22=other.x-p22.x,dy22=other.y-p22.y;return Math.abs(dx22)<tol&&Math.abs(dy22)<tol?null:Math.abs(dx22)>=Math.abs(dy22)?dx22>=0?"right":"left":dy22>=0?"up":"down"}function getCornerOrientationAtPoint(trace,p22,tol=TOL22){let incident=incidentEdgesAtPoint(trace,p22,tol);if(incident.length<2)return null;let dirs=incident.map(e210=>edgeDirectionFromPoint(e210,p22,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 t48 of traces)result[t48.source_trace_id]=[];let endpointsByTrace=traces.map(t48=>{let pts=[];for(let e210 of t48.edges)pts.push(e210.from,e210.to);return dedupePoints(pts,tol)});for(let i22=0;i22<traces.length;i22++){let A22=traces[i22],AEnds=endpointsByTrace[i22];for(let j22=i22+1;j22<traces.length;j22++){let B22=traces[j22],BEnds=endpointsByTrace[j22];if(A22.connectivity_key!==void 0&&A22.connectivity_key===B22.connectivity_key){for(let eA22 of A22.edges)for(let eB2 of B22.edges){let p22=segmentIntersection(eA22.from,eA22.to,eB2.from,eB2.to,tol);p22&&(isEndpointOfEdge(p22,eA22,tol)||isEndpointOfEdge(p22,eB2,tol)||(result[A22.source_trace_id].push(p22),A22.source_trace_id!==B22.source_trace_id&&result[B22.source_trace_id].push(p22)))}for(let pa3 of AEnds)for(let pb22 of BEnds)if(pointEq(pa3,pb22,tol)){let aEdgesAtP=incidentEdgesAtPoint(A22,pa3,tol),bEdgesAtP=incidentEdgesAtPoint(B22,pb22,tol),hasCorner=aEdgesAtP.some(eA22=>bEdgesAtP.some(eB2=>!isParallel(eA22,eB2,tol))),aCorner=getCornerOrientationAtPoint(A22,pa3,tol),bCorner=getCornerOrientationAtPoint(B22,pb22,tol);hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[A22.source_trace_id].push(pa3),A22.source_trace_id!==B22.source_trace_id&&result[B22.source_trace_id].push(pb22))}for(let pa3 of AEnds)for(let eB2 of B22.edges)if(onSegment32(pa3,eB2.from,eB2.to,tol)){let hasCorner=incidentEdgesAtPoint(A22,pa3,tol).some(eA22=>!isParallel(eA22,eB2,tol)),aCorner=getCornerOrientationAtPoint(A22,pa3,tol),bEndpointNearPa=nearestEndpointOnTrace(B22,pa3,tol*1e3),bCorner=bEndpointNearPa?getCornerOrientationAtPoint(B22,bEndpointNearPa,tol):null;hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[A22.source_trace_id].push(pa3),A22.source_trace_id!==B22.source_trace_id&&result[B22.source_trace_id].push(pa3))}for(let pb22 of BEnds)for(let eA22 of A22.edges)if(onSegment32(pb22,eA22.from,eA22.to,tol)){let hasCorner=incidentEdgesAtPoint(B22,pb22,tol).some(eB2=>!isParallel(eA22,eB2,tol)),bCorner=getCornerOrientationAtPoint(B22,pb22,tol),aEndpointNearPb=nearestEndpointOnTrace(A22,pb22,tol*1e3),aCorner=aEndpointNearPb?getCornerOrientationAtPoint(A22,aEndpointNearPb,tol):null;hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[B22.source_trace_id].push(pb22),A22.source_trace_id!==B22.source_trace_id&&result[A22.source_trace_id].push(pb22))}}}}for(let id3 of Object.keys(result))result[id3]=dedupePoints(result[id3],tol);return result}var TOL32=1e-6;function isCollinear(a22,b22,tol=TOL32){let adx=a22.to.x-a22.from.x,ady=a22.to.y-a22.from.y,bdx=b22.to.x-b22.from.x,bdy=b22.to.y-b22.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*(b22.from.y-a22.from.y)-ady*(b22.from.x-a22.from.x);return Math.abs(offsetCross)<=tol*aLen}function splitEdgeAroundIntervals(edge,intervals){let merged=mergeIntervals(intervals);if(merged.length===0)return[edge];let edgeLength=length7(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||length7(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=length7(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 debug10=(0,import_debug19.default)("Group_doInitialSchematicTraceRender"),MAX_PIN_SNAP_GAP=1.5;function extendTraceEndpointsToReachPinsInsideExpandedBoundingBox(params,db22){let{points,schematicPortIds,componentBoundsByPortId}=params,centers=schematicPortIds.map(id3=>{let center2=db22.schematic_port.get(id3)?.center,bounds=componentBoundsByPortId.get(id3);return!center2||!bounds?null:{center:center2,bounds}}).filter(port=>!!port);if(centers.length===0)return points;let result=points.map(p22=>({x:p22.x,y:p22.y})),d22=(a22,b22)=>(a22.x-b22.x)**2+(a22.y-b22.y)**2,usedCenters=new Set;for(let i22=0;i22<centers.length;i22++)result.some(p22=>d22(centers[i22].center,p22)<=1e-12)&&usedCenters.add(i22);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 i22=0;i22<centers.length;i22++){if(usedCenters.has(i22))continue;let{center:center2,bounds}=centers[i22],dist=d22(center2,endpointPoint);Math.abs(center2.x-endpointPoint.x)>ALIGN_EPS&&Math.abs(center2.y-endpointPoint.y)>ALIGN_EPS||dist>MAX_PIN_SNAP_GAP**2&&pointToBoundsDistance(endpointPoint,bounds)>ALIGN_EPS||candidates.push({endpoint,centerIndex:i22,dist})}}candidates.sort((a22,b22)=>a22.dist-b22.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].center;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:group2,solver,userNetIdToConnKey,schematicPortIdsWithPreExistingNetLabels}=args,{db:db22}=group2.root,customSymbolPortIds=new Set(group2.selectAll("port").filter(port=>{if(!port._getSymbolAncestor())return!1;let symbol=port.getParentNormalComponent()?._parsedProps.symbol;return(0,import_react6.isValidElement)(symbol)||isCircuitJsonSymbol(symbol)}).map(port=>port.schematic_port_id).filter(schematicPortId=>schematicPortId!=null).map(asSchematicPortId)),componentBoundsByPortId=new Map;for(let schematicComponent of db22.schematic_component.list()){let textInclusiveBounds=getSchematicComponentWithTextBounds({db:db22,schematicComponent}),componentBounds=getBoundFromCenteredRect({center:schematicComponent.center,width:schematicComponent.size.width,height:schematicComponent.size.height});for(let port of db22.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id})){let isInsideComponentBounds=port.center.x>componentBounds.minX&&port.center.x<componentBounds.maxX&&port.center.y>componentBounds.minY&&port.center.y<componentBounds.maxY,schematicPortId=asSchematicPortId(port.schematic_port_id);!textInclusiveBounds&&!customSymbolPortIds.has(schematicPortId)||!textInclusiveBounds&&isInsideComponentBounds||componentBoundsByPortId.set(schematicPortId,textInclusiveBounds??componentBounds)}}let traces=solver.inlineNetLabelSolver?.getOutput().traces??solver.sameNetJunctionAlignmentSolver?.getOutput().traces??solver.netLabelTraceCollisionSolver?.getOutput().traces??solver.traceCleanupSolver?.getOutput().traces??solver.traceLabelOverlapAvoidanceSolver?.getOutput().traces??solver.schematicTraceLinesSolver?.solvedTracePaths,pendingTraces=[];debug10(`Traces inside SchematicTraceSolver output: ${(traces??[]).length}`);for(let solvedTracePath of traces??[]){let solvedTraceSchematicPortIds=Array.from(new Set(solvedTracePath.pinIds??[])).map(asSchematicPortId);if(solvedTraceSchematicPortIds.length>0&&solvedTraceSchematicPortIds.every(id3=>schematicPortIdsWithPreExistingNetLabels.has(id3))){debug10(`Skipping solver netlabel-covered trace ${solvedTracePath?.mspPairId} because all schematic ports already have netlabels`);continue}let points=solvedTracePath?.tracePath;if(!Array.isArray(points)||points.length<2){debug10(`Skipping trace ${solvedTracePath?.pinIds.join(",")} because it has less than 2 points`);continue}let snappedPoints=extendTraceEndpointsToReachPinsInsideExpandedBoundingBox({points,schematicPortIds:solvedTraceSchematicPortIds,componentBoundsByPortId},db22),edges=[];for(let i22=0;i22<snappedPoints.length-1;i22++)edges.push({from:{x:snappedPoints[i22].x,y:snappedPoints[i22].y},to:{x:snappedPoints[i22+1].x,y:snappedPoints[i22+1].y}});let source_trace_id=String(solvedTracePath?.mspPairId),subcircuit_connectivity_map_key;if(Array.isArray(solvedTracePath?.pins)&&solvedTracePath.pins.length===2){let firstPinId=solvedTracePath.pins[0]?.pinId,secondPinId=solvedTracePath.pins[1]?.pinId,pA22=firstPinId?asSchematicPortId(firstPinId):void 0,pB2=secondPinId?asSchematicPortId(secondPinId):void 0;if(pA22&&pB2){let routedSchematicPortIds=new Set([pA22,pB2]);for(let routedSchematicPortId of routedSchematicPortIds)db22.schematic_port.update(routedSchematicPortId,{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=db22.schematic_port.get(schematicPortId)?.source_port_id;if(sourcePortId)return db22.source_port.get(sourcePortId)?.subcircuit_connectivity_map_key}).filter(key=>!!key);new Set(sourcePortConnKeys).size===1&&(subcircuit_connectivity_map_key=sourcePortConnKeys[0])}let endpointSchematicSheetIds=new Set(solvedTraceSchematicPortIds.map(schematicPortId=>db22.schematic_port.get(schematicPortId)?.schematic_sheet_id).filter(sheetId=>!!sheetId)),schematicSheetId2;endpointSchematicSheetIds.size===1?schematicSheetId2=endpointSchematicSheetIds.values().next().value:endpointSchematicSheetIds.size===0&&(schematicSheetId2=group2._resolveSchematicSheetId()),pendingTraces.push({source_trace_id,edges,subcircuit_connectivity_map_key,schematic_sheet_id:schematicSheetId2})}debug10(`Applying ${pendingTraces.length} traces from SchematicTraceSolver output`);let withCrossings=computeCrossings(pendingTraces.map(t48=>({source_trace_id:t48.source_trace_id,edges:t48.edges,connectivity_key:t48.subcircuit_connectivity_map_key}))),existingTracesForJunctions=[],schematicSheetId=group2._resolveSchematicSheetId();for(let t48 of db22.schematic_trace.list()){if(t48.edges.length===0||t48.schematic_sheet_id!==schematicSheetId)continue;let sourceTrace=t48.source_trace_id?db22.source_trace.get(t48.source_trace_id):void 0;existingTracesForJunctions.push({schematic_trace_id:t48.schematic_trace_id,source_trace_id:t48.source_trace_id??t48.schematic_trace_id,edges:t48.edges,connectivity_key:t48.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&&db22.schematic_trace.update(trace.schematic_trace_id,{edges:trace.edges});let junctionsById=computeJunctions([...visibleTraces,...visibleExistingTraces]);for(let t48 of visibleTraces){let pendingTrace=pendingTraces.find(pendingTrace2=>pendingTrace2.source_trace_id===t48.source_trace_id),traceSchematicSheetId=schematicSheetId;pendingTrace?.schematic_sheet_id&&(traceSchematicSheetId=pendingTrace.schematic_sheet_id),db22.schematic_trace.insert({source_trace_id:t48.source_trace_id,edges:t48.edges,junctions:junctionsById[t48.source_trace_id]??[],subcircuit_connectivity_map_key:pendingTrace?.subcircuit_connectivity_map_key,schematic_sheet_id:traceSchematicSheetId})}}var INLINE_NET_LABEL_FONT_SIZE=.12,markConnectionEligibleForInlineNetLabel=(connection,name)=>{connection.anchoredNetLabelWidth??(connection.anchoredNetLabelWidth=Number(getSchematicNetLabelTextWidth2({text:name}).toFixed(2))),connection.allowInlineNetLabel=!0,connection.inlineNetLabelHeight=INLINE_NET_LABEL_FONT_SIZE,connection.inlineNetLabelWidth=Number(getSchematicNetLabelTextWidth2({text:name,font_size:INLINE_NET_LABEL_FONT_SIZE}).toFixed(2))},applyInlineNetLabelEligibility=({directConnections,netConnections,connKeyToSchematicPortIds,connKeyToSourceNet,connKeysWithExplicitPortNetTraces,schematicPortIdsWithExplicitNetLabels,schematicPortIdsWithInlineNetLabels,areSchematicPortsOnDifferentComponents,resolveCanonicalNetLabelText})=>{for(let directConnection of directConnections){let{connKey}=directConnection;if(!connKey||connKeyToSchematicPortIds.get(connKey)?.length!==2)continue;let sourceNet=connKeyToSourceNet.get(connKey);if(sourceNet?.is_power||sourceNet?.is_ground)continue;let{name,wasAssignedDisplayLabel}=resolveCanonicalNetLabelText({subcircuitConnectivityMapKey:connKey});!name||!wasAssignedDisplayLabel||markConnectionEligibleForInlineNetLabel(directConnection,name)}for(let netConnection of netConnections){let{schematicPortIds}=netConnection,{isSameSheetCrossSectionConnection}=netConnection,hasInlineNetLabel=schematicPortIds.some(schematicPortId=>schematicPortIdsWithInlineNetLabels.has(schematicPortId)),isSinglePort=schematicPortIds.length===1,firstSchematicPortId=schematicPortIds[0],hasPortsOnDifferentComponents=firstSchematicPortId!==void 0&&schematicPortIds.slice(1).some(otherSchematicPortId=>areSchematicPortsOnDifferentComponents([firstSchematicPortId,otherSchematicPortId]));if(!hasInlineNetLabel&&!isSameSheetCrossSectionConnection&&!isSinglePort&&!hasPortsOnDifferentComponents||!hasInlineNetLabel&&schematicPortIds.some(schematicPortId=>schematicPortIdsWithExplicitNetLabels.has(schematicPortId)))continue;let{connKey}=netConnection;if(!connKey&&!isSameSheetCrossSectionConnection||connKey&&!isSameSheetCrossSectionConnection&&!connKeysWithExplicitPortNetTraces.has(connKey))continue;let sourceNet=connKey?connKeyToSourceNet.get(connKey):void 0;if(!hasInlineNetLabel&&(netConnection.isPowerOrGroundConnection||sourceNet?.is_power||sourceNet?.is_ground))continue;let name=netConnection.netLabelText??"",wasAssignedDisplayLabel=!!name;if(!isSameSheetCrossSectionConnection){if(!connKey)continue;let resolvedLabel=resolveCanonicalNetLabelText({subcircuitConnectivityMapKey:connKey});name=resolvedLabel.name,wasAssignedDisplayLabel=resolvedLabel.wasAssignedDisplayLabel}!name||!hasInlineNetLabel&&!wasAssignedDisplayLabel||markConnectionEligibleForInlineNetLabel(netConnection,name)}},getPortForSchematicSymbolPort=port=>{let{schX,schY}=port._parsedProps;if(schX!==void 0&&schY!==void 0||!port.getParentNormalComponent()?.getSchematicSymbol())return port;let internallyConnectedPorts=port._getPortsInternallyConnectedToThisPort(),schematicSymbolPortDef=port.schematicSymbolPortDef??internallyConnectedPorts.find(connectedPort=>connectedPort.schematicSymbolPortDef)?.schematicSymbolPortDef;return schematicSymbolPortDef?internallyConnectedPorts.find(connectedPort=>connectedPort.schematicSymbolPortDef===schematicSymbolPortDef)??port:port};function createRoutedSchematicPortIdMap(group2){let{db:db22}=group2.root,routedSchematicPortIdBySchematicPortId=new Map;for(let port of group2.selectAll("port")){if(!port.schematic_port_id)continue;let schematicPort=db22.schematic_port.get(port.schematic_port_id),terminalPort=getPortForSchematicSymbolPort(port),terminalSchematicPort=terminalPort.schematic_port_id?db22.schematic_port.get(terminalPort.schematic_port_id):void 0;!schematicPort||!terminalSchematicPort||schematicPort.schematic_component_id!==terminalSchematicPort.schematic_component_id||schematicPort.schematic_sheet_id!==terminalSchematicPort.schematic_sheet_id||routedSchematicPortIdBySchematicPortId.set(asSchematicPortId(schematicPort.schematic_port_id),asSchematicPortId(terminalSchematicPort.schematic_port_id))}return routedSchematicPortIdBySchematicPortId}var isDirectConnectionEndpointOutsideSchematicScope=({db:db22,sourcePortId,otherSourcePortId,sourcePortIdsInSchematicScope,schematicSheetId})=>{if(sourcePortIdsInSchematicScope.has(otherSourcePortId))return!1;let sourcePort=db22.source_port.get(sourcePortId),otherSourcePort=db22.source_port.get(otherSourcePortId);if(!sourcePort||!otherSourcePort)return!1;if(sourcePort.subcircuit_id!==otherSourcePort.subcircuit_id)return!0;if(!schematicSheetId)return!1;let otherEndpointSchematicPorts=db22.schematic_port.list({source_port_id:otherSourcePortId});return otherEndpointSchematicPorts.some(schematicPort=>schematicPort.schematic_sheet_id===schematicSheetId)?!1:otherEndpointSchematicPorts.some(schematicPort=>schematicPort.schematic_sheet_id!==void 0)},getDirectConnectionOutsideSchematicScopeSourcePortId=({db:db22,sourcePortId,sourcePortIdsInSchematicScope,schematicSheetId})=>{if(db22.source_port.get(sourcePortId))for(let sourceTrace of db22.source_trace.list()){let connectedSourcePortIds=(sourceTrace.connected_source_port_ids??[]).map(asSourcePortId);if(connectedSourcePortIds.length!==2||(sourceTrace.connected_source_net_ids??[]).length>0||!connectedSourcePortIds.includes(sourcePortId))continue;let otherSourcePortId=connectedSourcePortIds.find(portId=>portId!==sourcePortId);if(otherSourcePortId&&isDirectConnectionEndpointOutsideSchematicScope({db:db22,sourcePortId,otherSourcePortId,sourcePortIdsInSchematicScope,schematicSheetId}))return otherSourcePortId}},resolveNetLabelForPortMissingTrace=({group:group2,sourcePortId,connectedSourcePortIdsForKey,sourcePortIdsInSchematicScope,schematicSheetId,connKey,sourceNet})=>{let{db:db22}=group2.root,connectedPortsForKey=group2.selectAll("port").filter(port=>port._getSubcircuitConnectivityKey()===connKey),{name:resolvedPortNetLabelText,wasAssignedDisplayLabel}=getNetNameFromPorts(connectedPortsForKey),assignedPortNetLabelText=wasAssignedDisplayLabel?resolvedPortNetLabelText:void 0,fallbackPortNetLabelText=wasAssignedDisplayLabel?void 0:resolvedPortNetLabelText||void 0,implicitPortLabelText=getNetNameFromSourcePorts(db22,connectedSourcePortIdsForKey),directConnectionOutsideSchematicScopeSourcePortId=getDirectConnectionOutsideSchematicScopeSourcePortId({db:db22,sourcePortId,sourcePortIdsInSchematicScope,schematicSheetId}),directConnectionOutsideSchematicScopeLabelText=directConnectionOutsideSchematicScopeSourcePortId?getSourcePortNetLabelText(db22,directConnectionOutsideSchematicScopeSourcePortId):void 0;return{text:sourceNet?.name||sourceNet?.source_net_id||assignedPortNetLabelText||directConnectionOutsideSchematicScopeLabelText||fallbackPortNetLabelText||implicitPortLabelText||connKey,wasAssignedDisplayLabel,directConnectionOutsideSchematicScopeSourcePortId}},DEFAULT_SCHEMATIC_TEXT_FONT_SIZE=.18;function getSchematicTextBounds2(text){let fontSize=text.font_size??DEFAULT_SCHEMATIC_TEXT_FONT_SIZE,width=getSchematicTextWidth({text:text.text??"",fontSize}),height=fontSize,anchor=text.anchor??"center",minX,maxX;anchor.includes("left")?(minX=0,maxX=width):anchor.includes("right")?(minX=-width,maxX=0):(minX=-width/2,maxX=width/2);let minY,maxY;anchor.includes("top")?(minY=-height,maxY=0):anchor.includes("bottom")?(minY=0,maxY=height):(minY=-height/2,maxY=height/2);let rotation5=(text.rotation??0)*Math.PI/180,cos32=Math.cos(rotation5),sin32=Math.sin(rotation5),corners=[{x:minX,y:minY},{x:minX,y:maxY},{x:maxX,y:minY},{x:maxX,y:maxY}].map(corner=>({x:text.position.x+corner.x*cos32-corner.y*sin32,y:text.position.y+corner.x*sin32+corner.y*cos32}));return getBoundsFromPoints2(corners)}var REFDES_TEXT_BOX_CHIP_OVERLAP=.01,REFDES_TEXT_BOX_CLEARANCE=.06;function isReferenceDesignatorText(text,sourceComponent){return sourceComponent?text.text===sourceComponent.display_name||text.text===sourceComponent.name:!1}function schematicTextToTextBox(text,options={}){if(!text.text)return null;let bounds=getSchematicTextBounds2(text);if(isReferenceDesignatorText(text,options.sourceComponent)&&options.schematicComponent?.center&&options.schematicComponent?.size){let componentBounds=getBoundFromCenteredRect({center:options.schematicComponent.center,width:options.schematicComponent.size.width,height:options.schematicComponent.size.height}),textHeight=bounds.maxY-bounds.minY;bounds.minY>componentBounds.maxY&&(bounds.minX-=REFDES_TEXT_BOX_CLEARANCE,bounds.maxX+=REFDES_TEXT_BOX_CLEARANCE,bounds.minY=componentBounds.maxY-REFDES_TEXT_BOX_CHIP_OVERLAP,bounds.maxY=componentBounds.maxY+textHeight+REFDES_TEXT_BOX_CLEARANCE)}return{chipId:text.schematic_component_id,center:getBoundsCenter2(bounds),width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY,text:text.text}}var DEFAULT_MAX_MSP_PAIR_DISTANCE2=2.4,SCHEMATIC_RAIL_NET_LABEL_HEIGHT=.42;function createSchematicTraceSolverInputProblem(group2,opts={}){let{db:db22}=group2.root,routedSchematicPortIdBySchematicPortId=createRoutedSchematicPortIdMap(group2),resolveRoutedSchematicPortId=schematicPortId=>routedSchematicPortIdBySchematicPortId.get(schematicPortId)??schematicPortId,sourcePortConnectivityMap=getSourcePortConnectivityMapFromCircuitJson(db22.toArray()),getStableSourceConnectivityNetId=connectivityNetId=>{let canonicalSourceId=[...sourcePortConnectivityMap.getIdsConnectedToNet(connectivityNetId)].sort()[0];return canonicalSourceId?`source_connectivity_${canonicalSourceId}`:`source_${connectivityNetId}`},getSourceConnectivityNetId=sourceTrace=>{let connectivityNetId=[...sourceTrace.connected_source_port_ids,...sourceTrace.connected_source_net_ids].map(sourceId=>sourcePortConnectivityMap.getNetConnectedToId(sourceId)).find(netId=>!!netId);return connectivityNetId?getStableSourceConnectivityNetId(connectivityNetId):sourceTrace.subcircuit_connectivity_map_key??sourceTrace.source_trace_id},powerOrGroundSourceConnectivityNetIds=new Set;for(let sourceNet of db22.source_net.list()){if(!sourceNet.is_power&&!sourceNet.is_ground)continue;let connectivityNetId=sourcePortConnectivityMap.getNetConnectedToId(sourceNet.source_net_id);connectivityNetId&&powerOrGroundSourceConnectivityNetIds.add(getStableSourceConnectivityNetId(connectivityNetId))}let connKeyToSourceNet=new Map,childGroups=[],componentsToVisit=[...group2.children].reverse();for(;componentsToVisit.length>0;){let child=componentsToVisit.pop();if(child instanceof Group5){if(child.isSubcircuit){child._parsedProps.showAsSchematicBox&&childGroups.push(child);continue}childGroups.push(child)}componentsToVisit.push(...[...child.children].reverse())}let allSchematicGroupIds=[group2.schematic_group_id,...childGroups.map(a22=>a22.schematic_group_id)],schematicComponents=db22.schematic_component.list().filter(component=>allSchematicGroupIds.includes(component.schematic_group_id)).filter(component=>opts.schematicSheetId===void 0||component.schematic_sheet_id===opts.schematicSheetId),schematicComponentIds=new Set(schematicComponents.map(component=>component.schematic_component_id)),schematicComponentsById=new Map(schematicComponents.map(component=>[component.schematic_component_id,component])),textBoxes=db22.schematic_text.list().filter(text=>text.schematic_component_id&&schematicComponentIds.has(text.schematic_component_id)).map(text=>{let schematicComponent=schematicComponentsById.get(text.schematic_component_id);if(!schematicComponent)return;let sourceComponent=db22.source_component.get(schematicComponent.source_component_id);return schematicTextToTextBox(text,{schematicComponent,sourceComponent})}).filter(textBox=>!!textBox),sectionIdBySchematicComponentId=new Map,boardDescendants=group2._getBoard()?.getDescendants()??[];for(let component of boardDescendants){let schematicComponentId=component.schematic_component_id,sectionId=component.getSchematicSectionName();schematicComponentId&§ionId&§ionIdBySchematicComponentId.set(schematicComponentId,sectionId)}let chips=[];for(let schematicComponent of schematicComponents){let chipId=schematicComponent.schematic_component_id,pins=db22.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id}).filter(schematicPort=>{let id3=asSchematicPortId(schematicPort.schematic_port_id);return resolveRoutedSchematicPortId(id3)===id3}).map(schematicPort=>{let schematicPortId=asSchematicPortId(schematicPort.schematic_port_id),sourcePort=schematicPort.source_port_id?db22.source_port.get(schematicPort.source_port_id):void 0;return{pinId:schematicPortId,displayName:schematicPort.display_pin_label??schematicPort.pin_number?.toString()??sourcePort?.name,x:schematicPort.center.x,y:schematicPort.center.y,_facingDirection:convertFacingDirectionToElbowDirection(schematicPort.facing_direction??null)}}),sectionId=sectionIdBySchematicComponentId.get(schematicComponent.schematic_component_id),layoutBounds=getSchematicComponentWithTextBounds({db:db22,schematicComponent})??getBoundFromCenteredRect({center:schematicComponent.center,width:schematicComponent.size.width,height:schematicComponent.size.height});chips.push({chipId,center:getBoundsCenter2(layoutBounds),width:layoutBounds.maxX-layoutBounds.minX,height:layoutBounds.maxY-layoutBounds.minY,pins,sectionId})}let schematicPortIdsInScope=new Set,schPortIdToSourcePortId=new Map,sourcePortIdToSchPortId=new Map,userNetIdToConnKey=new Map,componentPortBySchematicPortId=new Map(group2.selectAll("port").filter(port=>port.schematic_port_id).map(port=>[asSchematicPortId(port.schematic_port_id),port])),resolveCanonicalNetLabelText=createCanonicalSchematicNetLabelTextResolver(group2);for(let sc3 of schematicComponents){let ports=db22.schematic_port.list({schematic_component_id:sc3.schematic_component_id});for(let sp22 of ports){let schematicPortId=asSchematicPortId(sp22.schematic_port_id);if(schematicPortIdsInScope.add(schematicPortId),sp22.source_port_id){let sourcePortId=asSourcePortId(sp22.source_port_id);schPortIdToSourcePortId.set(schematicPortId,sourcePortId),sourcePortIdToSchPortId.set(sourcePortId,schematicPortId)}}}let sourcePortIdsInSchematicScope=new Set(sourcePortIdToSchPortId.keys()),netLabelsInScope=(opts.netLabels??[]).filter(netLabel=>netLabel._getConnectedPorts().some(port=>port.schematic_port_id?schematicPortIdsInScope.has(asSchematicPortId(port.schematic_port_id)):!1)),schematicPortIdsWithExplicitNetLabels=new Set(netLabelsInScope.filter(netLabel=>!netLabel._parsedProps.inline).flatMap(netLabel=>netLabel._getConnectedPorts()).map(port=>port.schematic_port_id).filter(schematicPortId=>schematicPortId!=null).map(asSchematicPortId).map(resolveRoutedSchematicPortId)),solverManagedNetLabelSchematicPortIds=new Set(netLabelsInScope.filter(netLabel=>netLabel._parsedProps.inline||netLabel._parsedProps.schX===void 0&&netLabel._parsedProps.schY===void 0).flatMap(netLabel=>netLabel._getConnectedPorts()).map(port=>port.schematic_port_id).filter(schematicPortId=>schematicPortId!=null).map(asSchematicPortId).map(resolveRoutedSchematicPortId)),schematicPortIdsWithInlineNetLabels=new Set(netLabelsInScope.filter(netLabel=>netLabel._parsedProps.inline).flatMap(netLabel=>netLabel._getConnectedPorts()).map(port=>port.schematic_port_id).filter(schematicPortId=>schematicPortId!=null).map(asSchematicPortId).map(resolveRoutedSchematicPortId)),allowedSubcircuitIds=new Set;group2.subcircuit_id&&allowedSubcircuitIds.add(group2.subcircuit_id);for(let cg2 of childGroups)cg2.subcircuit_id&&allowedSubcircuitIds.add(cg2.subcircuit_id);let tracesInScope=db22.source_trace.list().filter(st22=>{if(st22.subcircuit_id===group2.subcircuit_id)return!0;for(let source_port_id of st22.connected_source_port_ids)if(sourcePortIdToSchPortId.has(asSourcePortId(source_port_id)))return!0;return!1}),schematicPortIdsWithExternallyRoutedRepresentations=new Set;for(let sourceTrace of tracesInScope)if(sourceTrace.subcircuit_id!==group2.subcircuit_id&&sourceTrace.connected_source_net_ids.length!==0)for(let sourcePortId of sourceTrace.connected_source_port_ids){let typedSourcePortId=asSourcePortId(sourcePortId),schematicPortId=sourcePortIdToSchPortId.get(typedSourcePortId);!schematicPortId||solverManagedNetLabelSchematicPortIds.has(schematicPortId)||!db22.schematic_port.list({source_port_id:sourcePortId}).some(port=>port.schematic_port_id===schematicPortId?!1:(port.schematic_component_id?db22.schematic_component.get(port.schematic_component_id):void 0)?.schematic_sheet_id===opts.schematicSheetId)||schematicPortIdsWithExternallyRoutedRepresentations.add(schematicPortId)}let externalNetIds=tracesInScope.flatMap(st22=>st22.connected_source_net_ids);for(let netId of externalNetIds){let net=db22.source_net.get(netId);net?.subcircuit_id&&allowedSubcircuitIds.add(net.subcircuit_id)}for(let net of db22.source_net.list().filter(sourceNet=>!sourceNet.subcircuit_id||allowedSubcircuitIds.has(sourceNet.subcircuit_id)))net.subcircuit_connectivity_map_key&&connKeyToSourceNet.set(net.subcircuit_connectivity_map_key,net);let directConnections=[],boundaryTraceNetConnections=[],connectedPairKeys=new Set,crossScopeSourceTraceIdBySchematicPortIdAndNetId=new Map,crossSectionNetConnectionByKey=new Map,setCrossScopeSourceTraceId=({schematicPortId,netId,sourceTraceId,replaceExisting=!1})=>{let sourceTraceIdByNetId=crossScopeSourceTraceIdBySchematicPortIdAndNetId.get(schematicPortId)??new Map;return sourceTraceIdByNetId.has(netId)&&!replaceExisting?!1:(sourceTraceIdByNetId.set(netId,sourceTraceId),crossScopeSourceTraceIdBySchematicPortIdAndNetId.set(schematicPortId,sourceTraceIdByNetId),!0)},addPortToCrossSectionInlineNetConnection=({sourceConnectivityNetId,schematicPortId,text,sourceTraceId,connKey,preferInScopeTraceMetadata=!1})=>{let netId=sourceConnectivityNetId;if(setCrossScopeSourceTraceId({schematicPortId,netId,sourceTraceId,replaceExisting:preferInScopeTraceMetadata}),schematicPortIdsWithExplicitNetLabels.has(schematicPortId))return;let connection=crossSectionNetConnectionByKey.get(sourceConnectivityNetId);connection?preferInScopeTraceMetadata&&(connection.netLabelText=text,connection.netLabelWidth=Number(getSchematicNetLabelTextWidth2({text}).toFixed(2)),connection.connKey=connKey??connection.connKey):(connection={netId,netLabelText:text,schematicPortIds:[],netLabelWidth:Number(getSchematicNetLabelTextWidth2({text}).toFixed(2)),connKey,isSameSheetCrossSectionConnection:!0,isPowerOrGroundConnection:powerOrGroundSourceConnectivityNetIds.has(netId)},crossSectionNetConnectionByKey.set(sourceConnectivityNetId,connection),boundaryTraceNetConnections.push(connection)),connection.schematicPortIds.includes(schematicPortId)||connection.schematicPortIds.push(schematicPortId)},sourceTraceIdsByPortOnlyLabelSchematicPortId=new Map,sourceTraceIdByPinPairKey=new Map,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);let areSchematicPortsInDifferentSectionsOnSameSheet=(firstSchematicPortId,secondSchematicPortId)=>{let firstSchematicPort=db22.schematic_port.get(firstSchematicPortId),secondSchematicPort=db22.schematic_port.get(secondSchematicPortId);if(!firstSchematicPort||!secondSchematicPort||!(firstSchematicPort.schematic_sheet_id===secondSchematicPort.schematic_sheet_id))return!1;let firstSectionId=firstSchematicPort.schematic_component_id?sectionIdBySchematicComponentId.get(firstSchematicPort.schematic_component_id):void 0,secondSectionId=secondSchematicPort.schematic_component_id?sectionIdBySchematicComponentId.get(secondSchematicPort.schematic_component_id):void 0;return firstSectionId!==secondSectionId&&(firstSectionId!==void 0||secondSectionId!==void 0)},doesSourcePortCrossSectionOnSameSheet=({schematicPortId,otherSourcePortId})=>db22.schematic_port.list({source_port_id:otherSourcePortId}).some(otherSchematicPort=>areSchematicPortsInDifferentSectionsOnSameSheet(schematicPortId,asSchematicPortId(otherSchematicPort.schematic_port_id)));for(let st22 of tracesInScope){let connected=Array.from(new Set((st22.connected_source_port_ids??[]).map(sourcePortId=>sourcePortIdToSchPortId.get(asSourcePortId(sourcePortId))).filter(schematicPortId=>!!schematicPortId&&schematicPortIdsInScope.has(schematicPortId)).map(resolveRoutedSchematicPortId))),sourcePortIdForSingleConnectedEndpoint=connected.length===1?schPortIdToSourcePortId.get(connected[0]):void 0,otherSourcePortId=sourcePortIdForSingleConnectedEndpoint?st22.connected_source_port_ids.map(asSourcePortId).find(sourcePortId=>sourcePortId!==sourcePortIdForSingleConnectedEndpoint):void 0,crossesSchematicScopeBoundary=!!(sourcePortIdForSingleConnectedEndpoint&&otherSourcePortId&&isDirectConnectionEndpointOutsideSchematicScope({db:db22,sourcePortId:sourcePortIdForSingleConnectedEndpoint,otherSourcePortId,sourcePortIdsInSchematicScope,schematicSheetId:opts.schematicSheetId})),crossesSchematicSectionOnSameSheet=!!(connected.length===1&&otherSourcePortId&&doesSourcePortCrossSectionOnSameSheet({schematicPortId:connected[0],otherSourcePortId}));if(connected.length===1&&st22.connected_source_port_ids.length===2&&crossesSchematicScopeBoundary&&st22.connected_source_net_ids.length===0&&st22.subcircuit_connectivity_map_key){let schematicPortId=connected[0],sourcePortId=schPortIdToSourcePortId.get(schematicPortId);if(sourcePortId){let connKey=st22.subcircuit_connectivity_map_key,sourcePortConnKey=db22.source_port.get(sourcePortId)?.subcircuit_connectivity_map_key,sourceNetInCurrentSubcircuit=db22.source_net.list().find(sourceNet=>sourceNet.subcircuit_id===group2.subcircuit_id&&sourcePortConnectivityMap.areIdsConnected(sourceNet.source_net_id,sourcePortId)),sourceNetForLabel=connKeyToSourceNet.get(connKey)??(sourcePortConnKey?connKeyToSourceNet.get(sourcePortConnKey):void 0)??sourceNetInCurrentSubcircuit,connectedSourcePortIdsForKey=Array.from(schematicPortIdsInScope).map(portId=>schPortIdToSourcePortId.get(portId)).filter(sourcePortId2=>sourcePortId2?db22.source_port.get(sourcePortId2)?.subcircuit_connectivity_map_key===connKey:!1),{text}=resolveNetLabelForPortMissingTrace({group:group2,sourcePortId,connectedSourcePortIdsForKey,sourcePortIdsInSchematicScope,schematicSheetId:opts.schematicSheetId,connKey,sourceNet:sourceNetForLabel});if(text){let sourceConnectivityNetId=getSourceConnectivityNetId(st22);userNetIdToConnKey.has(sourceConnectivityNetId)||userNetIdToConnKey.set(sourceConnectivityNetId,connKey),crossesSchematicSectionOnSameSheet?addPortToCrossSectionInlineNetConnection({sourceConnectivityNetId,schematicPortId,text,sourceTraceId:st22.source_trace_id,connKey}):setCrossScopeSourceTraceId({schematicPortId,netId:sourceConnectivityNetId,sourceTraceId:st22.source_trace_id})&&boundaryTraceNetConnections.push({netId:sourceConnectivityNetId,netLabelText:text,schematicPortIds:[schematicPortId],netLabelWidth:Number(getSchematicNetLabelTextWidth2({text}).toFixed(2)),connKey})}}}else if(connected.length>=2){for(let schematicPortId of connected){let sourceTraceIds=sourceTraceIdsByPortOnlyLabelSchematicPortId.get(schematicPortId)??new Set;sourceTraceIds.add(st22.source_trace_id),sourceTraceIdsByPortOnlyLabelSchematicPortId.set(schematicPortId,sourceTraceIds)}let traceLabel=st22.name??st22.display_name,userNetId=traceLabel??st22.source_trace_id;st22.subcircuit_connectivity_map_key&&userNetIdToConnKey.set(userNetId,st22.subcircuit_connectivity_map_key);let maxMspDist=group2._parsedProps.schMaxTraceDistance??DEFAULT_MAX_MSP_PAIR_DISTANCE2,portsForConnection=connected.map(schematicPortId=>componentPortBySchematicPortId.get(schematicPortId)).filter(port=>!!port),renderedNetLabelText=st22.subcircuit_connectivity_map_key?resolveCanonicalNetLabelText({subcircuitConnectivityMapKey:st22.subcircuit_connectivity_map_key}).name:getNetNameFromPorts(portsForConnection).name||traceLabel,shouldRenderNetLabels=connected.slice(1).some((b22,index)=>{let a22=connected[index],portA=db22.schematic_port.get(a22),portB=db22.schematic_port.get(b22);return!portA||!portB?!1:Math.sqrt((portA.center.x-portB.center.x)**2+(portA.center.y-portB.center.y)**2)>maxMspDist}),netLabelWidth=renderedNetLabelText&&shouldRenderNetLabels?Number(getSchematicNetLabelTextWidth2({text:renderedNetLabelText}).toFixed(2)):void 0,crossSectionNetLabelText=renderedNetLabelText;for(let i22=0;i22<connected.length-1;i22++){let a22=connected[i22],b22=connected[i22+1],pairKey=[a22,b22].sort().join("::");if(!connectedPairKeys.has(pairKey)){if(connectedPairKeys.add(pairKey),crossSectionNetLabelText&&areSchematicPortsInDifferentSectionsOnSameSheet(a22,b22)){let sourceConnectivityNetId=getSourceConnectivityNetId(st22);st22.subcircuit_connectivity_map_key&&userNetIdToConnKey.set(sourceConnectivityNetId,st22.subcircuit_connectivity_map_key),addPortToCrossSectionInlineNetConnection({sourceConnectivityNetId,schematicPortId:a22,text:crossSectionNetLabelText,sourceTraceId:st22.source_trace_id,connKey:st22.subcircuit_connectivity_map_key,preferInScopeTraceMetadata:!0}),addPortToCrossSectionInlineNetConnection({sourceConnectivityNetId,schematicPortId:b22,text:crossSectionNetLabelText,sourceTraceId:st22.source_trace_id,connKey:st22.subcircuit_connectivity_map_key,preferInScopeTraceMetadata:!0});continue}sourceTraceIdByPinPairKey.set(pairKey,st22.source_trace_id),directConnections.push({schematicPortIds:[a22,b22],netId:userNetId,netLabelWidth,connKey:st22.subcircuit_connectivity_map_key})}}}}let netConnections=[...boundaryTraceNetConnections],connKeyToSchematicPortIds=new Map;for(let[schId,srcPortId]of schPortIdToSourcePortId){if(schematicPortIdsWithExternallyRoutedRepresentations.has(schId))continue;let sp22=db22.source_port.get(srcPortId);if(!sp22?.subcircuit_connectivity_map_key)continue;let connKey=sp22.subcircuit_connectivity_map_key;connKeyToSchematicPortIds.has(connKey)||connKeyToSchematicPortIds.set(connKey,[]);let routedSchematicPortId=resolveRoutedSchematicPortId(schId),netSchematicPortIds=connKeyToSchematicPortIds.get(connKey);netSchematicPortIds.includes(routedSchematicPortId)||netSchematicPortIds.push(routedSchematicPortId)}for(let[connKey,schematicPortIds]of connKeyToSchematicPortIds){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 netLabelTextWidth=Number(getSchematicNetLabelTextWidth2({text:String(userNetId)}).toFixed(2)),netLabelWidth=netLabelTextWidth,netLabelHeight;(sourceNet.is_ground||sourceNet.is_power)&&(netLabelWidth=SCHEMATIC_RAIL_NET_LABEL_HEIGHT,netLabelHeight=netLabelTextWidth),netConnections.push({netId:userNetId,schematicPortIds,isGround:sourceNet.is_ground,netLabelWidth,netLabelHeight,connKey})}}applyInlineNetLabelEligibility({directConnections,netConnections,connKeyToSchematicPortIds,connKeyToSourceNet,connKeysWithExplicitPortNetTraces,schematicPortIdsWithExplicitNetLabels,schematicPortIdsWithInlineNetLabels,areSchematicPortsOnDifferentComponents:schematicPortIds=>{let componentIds=schematicPortIds.map(schematicPortId=>db22.schematic_port.get(schematicPortId)?.schematic_component_id);return componentIds.every(componentId=>!!componentId)&&componentIds[0]!==componentIds[1]},resolveCanonicalNetLabelText});let availableNetLabelOrientations=(()=>{let netToAllowedOrientations={},presentNetIds=new Set(netConnections.map(nc3=>nc3.netId));for(let net of db22.source_net.list().filter(n22=>!n22.subcircuit_id||allowedSubcircuitIds.has(n22.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+"]);for(let{netId}of boundaryTraceNetConnections)netToAllowedOrientations[netId]??(netToAllowedOrientations[netId]=["x-","x+"]);return netToAllowedOrientations})(),inputProblem={chips,directConnections:directConnections.map(({schematicPortIds,connKey,...connection})=>({...connection,pinIds:schematicPortIds})),netConnections:netConnections.map(({schematicPortIds,connKey,isSameSheetCrossSectionConnection,isPowerOrGroundConnection,...connection})=>({...connection,pinIds:schematicPortIds})),textBoxes,availableNetLabelOrientations,maxMspPairDistance:group2._parsedProps.schMaxTraceDistance??DEFAULT_MAX_MSP_PAIR_DISTANCE2},sourceTraceIdByPortOnlyLabelSchematicPortId=new Map(Array.from(sourceTraceIdsByPortOnlyLabelSchematicPortId).flatMap(([schematicPortId,sourceTraceIds])=>sourceTraceIds.size!==1?[]:[[schematicPortId,sourceTraceIds.values().next().value]]));return{inputProblem,routedSchematicPortIdBySchematicPortId,connKeyToSourceNet,userNetIdToConnKey,crossScopeSourceTraceIdBySchematicPortIdAndNetId,sourceTraceIdByPortOnlyLabelSchematicPortId,connKeysWithExplicitPortNetTraces,schematicPortIdsInScope,schematicPortIdsWithExternallyRoutedRepresentations,schPortIdToSourcePortId,netLabelsInScope,sourceTraceIdByPinPairKey}}var getSchematicPortIdsWithAssignedNetLabels=(netLabels,routedSchematicPortIdBySchematicPortId)=>{let schematicPortIdsWithNetLabels=new Set;for(let netLabel of netLabels){let{inline,schX,schY}=netLabel._parsedProps;if(inline||schX===void 0&&schY===void 0)continue;let netLabelPorts=netLabel._getConnectedPorts();for(let port of netLabelPorts)port.schematic_port_id&&schematicPortIdsWithNetLabels.add(routedSchematicPortIdBySchematicPortId.get(asSchematicPortId(port.schematic_port_id))??asSchematicPortId(port.schematic_port_id))}return schematicPortIdsWithNetLabels},getSchematicPortIdsWithRoutedTraces=({solver})=>{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=asSchematicPortId(pinId);schPortId&&schematicPortIdsWithRoutedTraces.add(schPortId)}}return schematicPortIdsWithRoutedTraces},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},insertNetLabelsForPortsMissingTrace=({schematicPortIdsInScope,schematicPortIdsWithExternallyRoutedRepresentations,group:group2,schPortIdToSourcePortId,connKeyToSourceNet})=>{let{db:db22}=group2.root,sourcePortIdsInSchematicScope=new Set(Array.from(schematicPortIdsInScope).map(schematicPortId=>schPortIdToSourcePortId.get(schematicPortId)).filter(sourcePortId=>sourcePortId!==void 0));for(let schematicPortId of schematicPortIdsInScope){if(schematicPortIdsWithExternallyRoutedRepresentations.has(schematicPortId))continue;let schPort=db22.schematic_port.get(schematicPortId);if(!schPort||schPort.is_connected)continue;let srcPortId=schPortIdToSourcePortId.get(schematicPortId);if(!srcPortId)continue;let sourcePort=db22.source_port.get(srcPortId);if(group2._parsedProps.showAsSchematicBox&&sourcePort?.subcircuit_id===group2.subcircuit_id&&!sourcePort.source_component_id&&getDirectConnectionOutsideSchematicScopeSourcePortId({db:db22,sourcePortId:srcPortId,sourcePortIdsInSchematicScope,schematicSheetId:schPort.schematic_sheet_id}))continue;let connKey=sourcePort?.subcircuit_connectivity_map_key;if(!connKey)continue;let sourceNet=connKeyToSourceNet.get(connKey),schComponent=schPort.schematic_component_id?db22.schematic_component.get(schPort.schematic_component_id):void 0,portSchematicSheetId=schComponent?.schematic_sheet_id??group2._resolveSchematicSheetId(),connectedSourcePortIdsForKey=Array.from(schematicPortIdsInScope).map(portId=>schPortIdToSourcePortId.get(portId)).filter(sourcePortId=>sourcePortId?db22.source_port.get(sourcePortId)?.subcircuit_connectivity_map_key===connKey:!1),{text,wasAssignedDisplayLabel,directConnectionOutsideSchematicScopeSourcePortId}=resolveNetLabelForPortMissingTrace({group:group2,sourcePortId:srcPortId,connectedSourcePortIdsForKey,sourcePortIdsInSchematicScope,schematicSheetId:schPort.schematic_sheet_id,connKey,sourceNet}),shouldPreserveDirectConnectionEndpointLabels=directConnectionOutsideSchematicScopeSourcePortId?db22.schematic_port.list({source_port_id:directConnectionOutsideSchematicScopeSourcePortId}).some(port=>!port.is_connected):!1,isCollapsedBoxPort=schComponent?.is_box_with_pins&&sourcePort&&!sourcePort.source_component_id,hasExternalTrace=db22.source_trace.list().some(trace=>trace.connected_source_port_ids.includes(srcPortId)&&trace.subcircuit_id!==sourcePort?.subcircuit_id);if(isCollapsedBoxPort&&!hasExternalTrace&&!!!(sourceNet||wasAssignedDisplayLabel))continue;let connectedPortCountForKey=Array.from(schematicPortIdsInScope).filter(portId=>{let sourcePortId=schPortIdToSourcePortId.get(portId);return sourcePortId?db22.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=db22.schematic_net_label.list().find(nl3=>nl3.schematic_sheet_id!==portSchematicSheetId?!1:doesSchematicNetLabelRepresentCurrentSourceConnection({nl:nl3,connKey,sourceNet,text}));if(existingNetLabelForCurrentSourceConnection&&connectedPortCountForKey<=1&&!shouldPreserveDirectConnectionEndpointLabels){db22.schematic_net_label.update(existingNetLabelForCurrentSourceConnection.schematic_net_label_id,{text,anchor_position:schPort.center,center:center2,anchor_side:side});continue}if(existingNetLabelForCurrentSourceConnection){let dx22=existingNetLabelForCurrentSourceConnection.anchor_position.x-schPort.center.x,dy22=existingNetLabelForCurrentSourceConnection.anchor_position.y-schPort.center.y;if(dx22*dx22+dy22*dy22<NEAR_EXISTING_NET_LABEL_DISTANCE*NEAR_EXISTING_NET_LABEL_DISTANCE){if(isGndNet){let anchor_side=existingNetLabelForCurrentSourceConnection.anchor_side??side;db22.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})}else if(!isPowerNet&&existingNetLabelForCurrentSourceConnection.text===text){let anchor_side=existingNetLabelForCurrentSourceConnection.anchor_side??side;db22.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(db22.schematic_net_label.list().some(nl3=>{if(nl3.schematic_sheet_id!==portSchematicSheetId)return!1;let dx32=nl3.anchor_position.x-schPort.center.x,dy32=nl3.anchor_position.y-schPort.center.y;return dx32*dx32+dy32*dy32>=SAME_ANCHOR_POSITION_DISTANCE*SAME_ANCHOR_POSITION_DISTANCE?!1:doesSchematicNetLabelRepresentCurrentSourceConnection({nl:nl3,connKey,sourceNet,text})}))continue}if(!sourceNet&&!shouldPreserveDirectConnectionEndpointLabels)for(let nl3 of db22.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=db22.schematic_port.get(schPortId)),!connectedSchPort?.center||!nl3.anchor_position)return!1;let dx22=nl3.anchor_position.x-connectedSchPort.center.x,dy22=nl3.anchor_position.y-connectedSchPort.center.y;return dx22*dx22+dy22*dy22<SAME_ANCHOR_POSITION_DISTANCE*SAME_ANCHOR_POSITION_DISTANCE})||db22.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};db22.schematic_net_label.insert(netLabel)}},debug11=(0,import_debug16.default)("Group_doInitialSchematicTraceRender"),renderSchematicTracesForSheet=({group:group2,schematicSheetId,netLabels})=>{let{inputProblem,routedSchematicPortIdBySchematicPortId,connKeyToSourceNet,schematicPortIdsInScope,schematicPortIdsWithExternallyRoutedRepresentations,schPortIdToSourcePortId,userNetIdToConnKey,crossScopeSourceTraceIdBySchematicPortIdAndNetId,sourceTraceIdByPortOnlyLabelSchematicPortId,connKeysWithExplicitPortNetTraces,netLabelsInScope,sourceTraceIdByPinPairKey}=createSchematicTraceSolverInputProblem(group2,{schematicSheetId,netLabels});if(inputProblem.chips.length===0)return;let schematicPortIdsWithPreExistingNetLabels=getSchematicPortIdsWithAssignedNetLabels(netLabelsInScope,routedSchematicPortIdBySchematicPortId);if(!(inputProblem.directConnections.length>0||inputProblem.netConnections.length>0)){insertNetLabelsForPortsMissingTrace({group:group2,schematicPortIdsInScope,schematicPortIdsWithExternallyRoutedRepresentations,schPortIdToSourcePortId,connKeyToSourceNet});return}debug11.enabled&&group2.root?.emit("debug:logOutput",{type:"debug:logOutput",name:"group-trace-render-input-problem",content:JSON.stringify(inputProblem,null,2)});let solver=new SchematicTracePipelineSolver(inputProblem),solverConstructorArgs=solver.getConstructorParams();group2.root?.emit("solver:started",{type:"solver:started",solverName:"SchematicTracePipelineSolver",solverParams:solverConstructorArgs[0],solverConstructorArgs,componentName:group2.getString()}),solver.solve();let schematicPortIdsWithRoutedTraces=getSchematicPortIdsWithRoutedTraces({solver});applyTracesFromSolverOutput({group:group2,solver,userNetIdToConnKey,schematicPortIdsWithPreExistingNetLabels}),applyNetLabelPlacements({group:group2,routedSchematicPortIdBySchematicPortId,solver,connKeyToSourceNet,userNetIdToConnKey,crossScopeSourceTraceIdBySchematicPortIdAndNetId,sourceTraceIdByPortOnlyLabelSchematicPortId,connKeysWithExplicitPortNetTraces,schematicPortIdsWithPreExistingNetLabels,schematicPortIdsWithRoutedTraces,netLabels:netLabelsInScope}),applyInlineNetLabelPlacements({group:group2,solver,userNetIdToConnKey,sourceTraceIdByPinPairKey,crossScopeSourceTraceIdBySchematicPortIdAndNetId});let{db:db22}=group2.root;for(let[schematicPortId,routedSchematicPortId]of routedSchematicPortIdBySchematicPortId)db22.schematic_port.get(routedSchematicPortId)?.is_connected&&db22.schematic_port.update(schematicPortId,{is_connected:!0});insertNetLabelsForPortsMissingTrace({group:group2,schematicPortIdsInScope,schematicPortIdsWithExternallyRoutedRepresentations,schPortIdToSourcePortId,connKeyToSourceNet})},Group_doInitialSchematicTraceRender=group2=>{if(!group2.root?._featureMspSchematicTraceRouting||!group2.isSubcircuit||group2.root?.schematicDisabled)return;let netLabels=new Set,board=group2._getBoard(),schematicScope=group2;for(;schematicScope;){if(schematicScope instanceof Group5)for(let netLabel of schematicScope.selectAll("netlabel"))netLabels.add(netLabel);if(schematicScope===board)break;schematicScope=schematicScope.parent}let netLabelComponents=[...netLabels],schematicGroupIds=new Set([group2,...group2.getDescendants().filter(component=>component instanceof Group5)].map(schematicGroup=>schematicGroup.schematic_group_id).filter(schematicGroupId=>!!schematicGroupId)),schematicSheetIds=new Set(group2.root.db.schematic_component.list().filter(schematicComponent=>schematicGroupIds.has(schematicComponent.schematic_group_id)).map(schematicComponent=>schematicComponent.schematic_sheet_id).filter(schematicSheetId=>!!schematicSheetId));if(schematicSheetIds.size===0){renderSchematicTracesForSheet({group:group2,netLabels:netLabelComponents});return}for(let schematicSheetId of schematicSheetIds)renderSchematicTracesForSheet({group:group2,schematicSheetId,netLabels:netLabelComponents})};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)}}}),isCurrentGraph2=element=>element.type==="simulation_transient_current_graph",isSimulationCurrentResult=circuitElement=>circuitElement.type==="simulation_dc_operating_point_current"||circuitElement.type==="simulation_dc_sweep_current_graph"||circuitElement.type==="simulation_ac_sweep_current_graph",isSimulationVoltageResult=circuitElement=>circuitElement.type==="simulation_dc_operating_point_voltage"||circuitElement.type==="simulation_dc_sweep_voltage_graph"||circuitElement.type==="simulation_ac_sweep_voltage_graph",isVoltageGraph=element=>element.type==="simulation_transient_voltage_graph",isSimulationAnalysisResult2=circuitElement=>isVoltageGraph(circuitElement)||isCurrentGraph2(circuitElement)||isSimulationVoltageResult(circuitElement)||isSimulationCurrentResult(circuitElement),attachSweepCoordinateToSimulationResult=({simulationResult,simulationParameterSweepCoordinate})=>{if(!simulationParameterSweepCoordinate||!isSimulationAnalysisResult2(simulationResult))return simulationResult;let simulationResultWithSweepCoordinate={...simulationResult},simulationResultIdKey=`${simulationResultWithSweepCoordinate.type}_id`;return Reflect.deleteProperty(simulationResultWithSweepCoordinate,simulationResultIdKey),simulationResultWithSweepCoordinate.simulation_parameter_sweep_coordinate=simulationParameterSweepCoordinate,simulationResultWithSweepCoordinate},getSourceComponentOrThrow=({circuitJson,sourceComponentId,isMatchingSourceComponent})=>{let sourceComponent=circuitJson.find(circuitElement=>isMatchingSourceComponent(circuitElement)&&circuitElement.source_component_id===sourceComponentId);if(!sourceComponent)throw new Error(`Parameter sweep target ${sourceComponentId} was not found`);return sourceComponent},applyParameterSweepCoordinate=({circuitJson,parameterSweep,simulationParameterSweepCoordinate})=>{let sweptCircuitJson=structuredClone(circuitJson),parameterValue=simulationParameterSweepCoordinate.parameter_value;if(parameterSweep.parameter_type==="resistance"){let resistor=getSourceComponentOrThrow({circuitJson:sweptCircuitJson,sourceComponentId:parameterSweep.resistor_source_component_id,isMatchingSourceComponent:circuitElement=>circuitElement.type==="source_component"&&circuitElement.ftype==="simple_resistor"});return resistor.resistance=parameterValue,sweptCircuitJson}if(parameterSweep.parameter_type==="capacitance"){let capacitor=getSourceComponentOrThrow({circuitJson:sweptCircuitJson,sourceComponentId:parameterSweep.capacitor_source_component_id,isMatchingSourceComponent:circuitElement=>circuitElement.type==="source_component"&&circuitElement.ftype==="simple_capacitor"});return capacitor.capacitance=parameterValue,sweptCircuitJson}if(parameterSweep.parameter_type==="inductance"){let inductor=getSourceComponentOrThrow({circuitJson:sweptCircuitJson,sourceComponentId:parameterSweep.inductor_source_component_id,isMatchingSourceComponent:circuitElement=>circuitElement.type==="source_component"&&circuitElement.ftype==="simple_inductor"});return inductor.inductance=parameterValue,sweptCircuitJson}if(parameterSweep.parameter_type==="voltage"){let groundNet=sweptCircuitJson.find(circuitElement=>circuitElement.type==="source_net"&&circuitElement.name.toUpperCase()==="GND");if(!groundNet||groundNet.type!=="source_net")throw new Error("A voltage parameter sweep requires a GND net");let sweepVoltageSource={type:"simulation_voltage_source",simulation_voltage_source_id:`simulation_voltage_source_${simulationParameterSweepCoordinate.simulation_parameter_sweep_id}_${simulationParameterSweepCoordinate.sweep_index}`,is_dc_source:!0,positive_source_net_id:parameterSweep.source_net_id,negative_source_net_id:groundNet.source_net_id,voltage:parameterValue};return sweptCircuitJson.push(sweepVoltageSource),sweptCircuitJson}if(parameterSweep.parameter_type==="current"){let currentSourcePortIds=new Set(sweptCircuitJson.filter(circuitElement=>circuitElement.type==="source_port"&&circuitElement.source_component_id===parameterSweep.current_source_component_id).map(sourcePort=>sourcePort.source_port_id)),currentSource=sweptCircuitJson.find(circuitElement=>circuitElement.type==="simulation_current_source"&&(circuitElement.is_dc_source?!!(circuitElement.positive_source_port_id&¤tSourcePortIds.has(circuitElement.positive_source_port_id)):!!(circuitElement.terminal1_source_port_id&¤tSourcePortIds.has(circuitElement.terminal1_source_port_id))));if(!currentSource)throw new Error(`Current sweep target ${parameterSweep.current_source_component_id} has no simulation source`);return currentSource.current=parameterValue,sweptCircuitJson}throw new Error("Parameter sweep target is incomplete")},createSimulationRun=({circuitJson,simulationParameterSweepCoordinate})=>{let spiceNetlist=circuitJsonToSpice(circuitJson);return{spiceNetlist,spiceString:spiceNetlist.toSpiceString(),simulationParameterSweepCoordinate}},createSimulationRuns=({circuitJson,simulationExperimentId})=>{let parameterSweep=circuitJson.find(circuitElement=>circuitElement.type==="simulation_parameter_sweep"&&circuitElement.simulation_experiment_id===simulationExperimentId);return parameterSweep?parameterSweep.parameter_values.map((parameterValue,sweepIndex)=>{let simulationParameterSweepCoordinate={simulation_parameter_sweep_id:parameterSweep.simulation_parameter_sweep_id,sweep_index:sweepIndex,parameter_value:parameterValue,parameter_unit:parameterSweep.parameter_unit};return createSimulationRun({circuitJson:applyParameterSweepCoordinate({circuitJson,parameterSweep,simulationParameterSweepCoordinate}),simulationParameterSweepCoordinate})}):[createSimulationRun({circuitJson})]},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:db22,graphs,graphDisplayOverridesByProbeId})=>{if(graphs.length===0)return;let existingScopeTraces=db22.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 scale32=getAutoDisplayScale({graph,index,graphCount:graphs.length});if(!scale32)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??scale32.value_per_div,displayCenter=overrides?.center??scale32.display_center_value,displayCenterOffsetDivs=overrides?.verticalOffset!==void 0&&valuePerDiv!==0?overrides.verticalOffset/valuePerDiv:probeTrace?.display_center_offset_divs??scale32.display_center_offset_divs;db22.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),debug12=(0,import_debug20.default)("tscircuit:core:Group_doInitialSimulationSpiceEngineRender"),getCircuitJsonForAnalogSimulation=({circuitJson,simulationExperimentId,voltageProbes,ammeters})=>{let voltageProbeIds=new Set(voltageProbes.map(voltageProbe=>voltageProbe.simulation_voltage_probe_id).filter(simulationVoltageProbeId=>!!simulationVoltageProbeId)),currentProbeIds=new Set(ammeters.map(ammeter=>ammeter.simulation_current_probe_id).filter(simulationCurrentProbeId=>!!simulationCurrentProbeId));return circuitJson.filter(element=>{if(element.type==="simulation_experiment")return element.simulation_experiment_id===simulationExperimentId;if(element.type==="simulation_voltage_probe")return voltageProbeIds.has(element.simulation_voltage_probe_id);if(element.type==="simulation_current_probe")return currentProbeIds.has(element.simulation_current_probe_id);if(element.type==="simulation_parameter_sweep")return element.simulation_experiment_id===simulationExperimentId;if(element.type==="simulation_oscilloscope_trace"){if(element.simulation_voltage_probe_id)return voltageProbeIds.has(element.simulation_voltage_probe_id);if(element.simulation_current_probe_id)return currentProbeIds.has(element.simulation_current_probe_id)}return!(element.type==="simulation_transient_voltage_graph"||element.type==="simulation_transient_current_graph"||element.type==="simulation_dc_operating_point_voltage"||element.type==="simulation_dc_operating_point_current"||element.type==="simulation_dc_sweep_voltage_graph"||element.type==="simulation_dc_sweep_current_graph"||element.type==="simulation_ac_sweep_voltage_graph"||element.type==="simulation_ac_sweep_current_graph"||element.type==="simulation_unknown_experiment_error")})};function Group_doInitialSimulationSpiceEngineRender(group2){if(group2.getInheritedProperty("analogSimulationDisabled")||!group2.isSubcircuit)return;let{root}=group2;if(!root)return;let analogSimulations=[...group2.selectAll("analogsimulation"),...group2.selectAll("analogtransientsimulation"),...group2.selectAll("analogdcoperatingpointsimulation"),...group2.selectAll("analogdcsweepsimulation"),...group2.selectAll("analogacsweepsimulation")];if(analogSimulations.length===0)return;resetSimulationColorState();let spiceEngineMap={...root.platform?.spiceEngineMap};spiceEngineMap.spicey||(spiceEngineMap.spicey=getSpiceyEngine());for(let analogSimulation of analogSimulations){let simulationExperimentId=analogSimulation.simulation_experiment_id;if(!simulationExperimentId){debug12("No simulation experiment id found, skipping simulation");continue}let simulationExperiment=root.db.simulation_experiment.get(simulationExperimentId);if(!simulationExperiment){debug12("No simulation experiment found, skipping simulation");continue}let simulationScope=analogSimulation.getGroup()??group2,voltageProbes=simulationScope.selectAll("voltageprobe"),ammeters=simulationScope.selectAll("ammeter"),circuitJson=getCircuitJsonForAnalogSimulation({circuitJson:root.db.toArray(),simulationExperimentId,voltageProbes,ammeters}),simulationRuns;try{simulationRuns=createSimulationRuns({circuitJson,simulationExperimentId}),debug12(`Generated ${simulationRuns.length} SPICE run(s):
|
|
952
952
|
${simulationRuns.map(simulationRun=>simulationRun.spiceString).join(`
|
|
953
|
-
`)}`)}catch(error2){debug12(`Failed to convert circuit JSON to SPICE: ${error2}`),root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperimentId,error_type:"simulation_unknown_experiment_error",message:error2 instanceof Error?error2.message:String(error2)});continue}let voltageProbeByGraphName=new Map,voltageProbeById=new Map,graphDisplayOverridesByProbeId=new Map;for(let probe of voltageProbes)probe.finalProbeName&&voltageProbeByGraphName.set(probe.finalProbeName,probe),probe.simulation_voltage_probe_id&&(voltageProbeById.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 scopedCurrentProbeIds=new Set(ammeters.map(ammeter=>ammeter.simulation_current_probe_id).filter(simulationCurrentProbeId=>!!simulationCurrentProbeId)),currentProbeById=new Map,currentProbeByName=new Map;for(let probe of root.db.simulation_current_probe.list().filter(probe2=>scopedCurrentProbeIds.has(probe2.simulation_current_probe_id)))currentProbeById.set(probe.simulation_current_probe_id,probe),probe.name!==void 0&¤tProbeByName.set(probe.name,probe);let orderedSimulationProbes=root.db.simulation_voltage_probe.list().filter(probe=>voltageProbeById.has(probe.simulation_voltage_probe_id)),firstSpiceNetlist=simulationRuns[0]?.spiceNetlist,graphNamesFromNetlist=firstSpiceNetlist?getTransientVoltageGraphNamesFromSpiceNetlist(firstSpiceNetlist):[];if(graphNamesFromNetlist.length===orderedSimulationProbes.length)for(let[simulationProbeIndex,simulationProbe]of orderedSimulationProbes.entries()){let probe=voltageProbeById.get(simulationProbe.simulation_voltage_probe_id),graphName=graphNamesFromNetlist[simulationProbeIndex];probe&&graphName&&voltageProbeByGraphName.set(graphName,probe)}else debug12(`Skipping probe-to-graph order mapping because counts differ: probes=${orderedSimulationProbes.length} graphNames=${graphNamesFromNetlist.length}`);let engineName=analogSimulation.getSpiceEngineName()??"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(spiceEngineName=>spiceEngineName!=="spicey"))}`);let effectId=`spice-simulation-${engineName}-${simulationExperimentId}`;debug12(`Queueing simulation for spice engine: ${engineName} (id: ${effectId})`),group2._queueAsyncEffect(effectId,async()=>{try{let insertedVoltageGraphs=[],insertedCurrentGraphs=[];for(let simulationRun of simulationRuns){debug12(`Running simulation with engine: ${engineName}`);let simulationResult=await spiceEngine2.simulate(simulationRun.spiceString);debug12(`Simulation completed, received ${simulationResult.simulationResultCircuitJson.length} elements`);for(let simulationResultCircuitElement of simulationResult.simulationResultCircuitJson){if(!isCircuitElementInput(simulationResultCircuitElement)){debug12("Skipping invalid simulation result element");continue}let simulationResultWithSweepCoordinate=attachSweepCoordinateToSimulationResult({simulationResult:simulationResultCircuitElement,simulationParameterSweepCoordinate:simulationRun.simulationParameterSweepCoordinate});if(isVoltageGraph(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=simulationResultWithSweepCoordinate.name?voltageProbeByGraphName.get(simulationResultWithSweepCoordinate.name):void 0;probeMatch&&(simulationResultWithSweepCoordinate.color=probeMatch.color??void 0,simulationResultWithSweepCoordinate.source_probe_id=probeMatch.simulation_voltage_probe_id??void 0)}else if(isSimulationVoltageResult(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=voltageProbeById.get(simulationResultWithSweepCoordinate.simulation_voltage_probe_id)??(simulationResultWithSweepCoordinate.name?voltageProbeByGraphName.get(simulationResultWithSweepCoordinate.name):void 0);probeMatch?.simulation_voltage_probe_id&&(simulationResultWithSweepCoordinate.color=probeMatch.color??void 0,simulationResultWithSweepCoordinate.simulation_voltage_probe_id=probeMatch.simulation_voltage_probe_id)}if(isCurrentGraph2(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=(simulationResultWithSweepCoordinate.source_probe_id?currentProbeById.get(simulationResultWithSweepCoordinate.source_probe_id):void 0)??(simulationResultWithSweepCoordinate.name?currentProbeByName.get(simulationResultWithSweepCoordinate.name):void 0);probeMatch&&(simulationResultWithSweepCoordinate.color=probeMatch.color,simulationResultWithSweepCoordinate.source_probe_id=probeMatch.simulation_current_probe_id)}else if(isSimulationCurrentResult(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=currentProbeById.get(simulationResultWithSweepCoordinate.simulation_current_probe_id)??(simulationResultWithSweepCoordinate.name?currentProbeByName.get(simulationResultWithSweepCoordinate.name):void 0);probeMatch&&(simulationResultWithSweepCoordinate.color=probeMatch.color,simulationResultWithSweepCoordinate.simulation_current_probe_id=probeMatch.simulation_current_probe_id)}let insertedSimulationResult=root.db.insert(simulationResultWithSweepCoordinate);isVoltageGraph(insertedSimulationResult)&&insertedVoltageGraphs.push({type:"voltage",graph:insertedSimulationResult}),isCurrentGraph2(insertedSimulationResult)&&insertedCurrentGraphs.push({type:"current",graph:insertedSimulationResult}),debug12(`Inserted ${simulationResultWithSweepCoordinate.type} into database`)}}analogSimulation.usesIndependentGraphAxes()&&insertIndependentAxisScopeTraces({db:root.db,graphs:[...insertedVoltageGraphs,...insertedCurrentGraphs],graphDisplayOverridesByProbeId}),group2._markDirty("SimulationSpiceEngineRender")}catch(error2){debug12(`Simulation failed for engine ${engineName}: ${error2}`),root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperimentId,error_type:"simulation_unknown_experiment_error",message:error2 instanceof Error?error2.message:String(error2)})}})}}function Group_doInitialSourceAddConnectivityMapKey(group2){if(!group2.isSubcircuit)return;let{db:db22}=group2.root,traces=group2.selectAll("trace"),vias=group2.selectAll("via"),nets=group2.selectAll("net"),connMap=new ConnectivityMap({});connMap.addConnections(traces.map(t48=>{let source_trace3=db22.source_trace.get(t48.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(c22=>c22!==null));let sourceNets=db22.source_net.list().filter(net=>net.subcircuit_id===group2.subcircuit_id);for(let sourceNet of sourceNets)connMap.addConnections([[sourceNet.source_net_id]]);let{name:subcircuitName}=group2._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${group2.subcircuit_id??group2.source_group_id??group2._renderId}`}_${connNetId}`,db22.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=db22.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${group2.subcircuit_id??group2.source_group_id??group2._renderId}`}_${connNetId}`;db22.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=db22.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${group2.subcircuit_id??group2.source_group_id??group2._renderId}`}_${connNetId}`;db22.source_net.update(netId,{subcircuit_connectivity_map_key:connectivityMapKey});let netInstance=nets.find(n22=>n22.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)}}var Group_doInitialStandaloneSubcircuitPcbDesignRuleChecks=group2=>{let isRootSubcircuit=group2.root?.firstChild===group2;if(!group2.isSubcircuit||!isRootSubcircuit||group2._getBoard())return;let routingDisabled=group2.root?.pcbRoutingDisabled||group2.getInheritedProperty("routingDisabled"),drcChecksDisabled=group2.root?.platform?.drcChecksDisabled??group2.getInheritedProperty("drcChecksDisabled"),routingDrcChecksDisabled=group2.root?.platform?.routingDrcChecksDisabled??group2.getInheritedProperty("routingDrcChecksDisabled");if(group2.root?.pcbDisabled||routingDisabled||drcChecksDisabled||routingDrcChecksDisabled||group2._hasIncompleteAsyncEffectsInSubtreeForPhase("PcbTraceRender")||group2._hasTracesToRoute()&&!group2._areChildSubcircuitsRouted()||group2._standaloneSubcircuitDrcChecksComplete||group2._standaloneSubcircuitDrcChecksInProgress)return;let{db:db22}=group2.root,subcircuitCircuitJson=db22.subtree({subcircuit_id:group2.subcircuit_id}).toArray();group2._standaloneSubcircuitDrcChecksInProgress=!0,group2._queueAsyncEffect("standalone-subcircuit:routing-drc-checks",async()=>{try{let results=await runAllRoutingChecks(subcircuitCircuitJson);db22.insertAll(dedupePcbDrcErrors(results)),group2._standaloneSubcircuitDrcChecksComplete=!0}finally{group2._standaloneSubcircuitDrcChecksInProgress=!1}})},addPourNetMap=(target,pourNetMap)=>{for(let[layer,netOrNets]of Object.entries(pourNetMap)){if(!netOrNets)continue;let nets=Array.isArray(netOrNets)?netOrNets:[netOrNets],layerNets=target.get(layer)??new Set;for(let net of nets)layerNets.add(net);target.set(layer,layerNets)}},toFanoutPourNetMap=netsByLayer=>Object.fromEntries(Array.from(netsByLayer,([layer,nets])=>[layer,nets.size===1?Array.from(nets)[0]:Array.from(nets)])),Group_getFanoutPourNetMap=(group2,routingPhasePlans)=>{let explicitMaps=routingPhasePlans.map(plan=>plan.fanoutPourNetMap).filter(map=>map!==void 0),netsByLayer=new Map;if(explicitMaps.length>0){for(let explicitMap of explicitMaps)addPourNetMap(netsByLayer,explicitMap);return toFanoutPourNetMap(netsByLayer)}let scope=group2;for(;scope;){if(scope.isSubcircuit){let subcircuit=scope,copperPours=subcircuit.selectAll("copperpour");for(let copperPour of copperPours){if(copperPour.getSubcircuit()!==subcircuit)continue;let{layer,connectsTo}=copperPour._parsedProps;addPourNetMap(netsByLayer,{[layer]:connectsTo})}}scope=scope.parent}return netsByLayer.size>0?toFanoutPourNetMap(netsByLayer):void 0},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:db22}=this.root;return db22.source_trace.list().find(st22=>st22.connected_source_port_ids.includes(port.source_port_id))?.source_trace_id}_getSourceNetIdForPort(port){let{db:db22}=this.root;return db22.source_trace.list().find(st22=>st22.connected_source_port_ids.includes(port.source_port_id))?.connected_source_net_ids[0]}_renderPcbBreakoutPoint({layer}={}){if(this.pcb_breakout_point_id||this.root?.pcbDisabled)return;let{db:db22}=this.root,position4=this._getGlobalPcbPositionBeforeLayout(),group2=this.parent?.getGroup(),subcircuit=this.getSubcircuit();if(!group2||!group2.pcb_group_id)return;let pcb_breakout_point3=db22.pcb_breakout_point.insert({pcb_group_id:group2.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,layer,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:db22}=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),db22.pcb_breakout_point.update(this.pcb_breakout_point_id,updatedProperties)}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db22}=this.root;if(!this.pcb_breakout_point_id)return;let point62=db22.pcb_breakout_point.get(this.pcb_breakout_point_id);point62&&db22.pcb_breakout_point.update(this.pcb_breakout_point_id,{x:point62.x+deltaX,y:point62.y+deltaY})}getPcbSize(){return{width:0,height:0}}},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()}},SavedFanoutPoint=class extends BreakoutPoint{constructor(){super(...arguments);__publicField(this,"exitLayer","top")}doInitialPcbPrimitiveRender(){this._matchConnection(),this._renderPcbBreakoutPoint({layer:this.exitLayer})}};function getSavedFanoutTraces(breakout,input2){let{db:db22}=breakout.root,boardLayers=getViaBoardLayers(input2.layerCount),coveredConnections=new Set,exits=breakout.children.filter(child=>child instanceof SavedFanoutPoint),traces=(breakout._parsedProps.pcbTracePaths??[]).map((path,pathIndex)=>{for(let point62 of path.route)if((point62.route_type==="wire"?[point62.layer]:[point62.from_layer,point62.to_layer]).some(layer=>!boardLayers.includes(layer)))throw new Error(`Saved fanout path "${path.connection}" uses a layer unavailable on this board`);let exit=exits[pathIndex],port=exit.matchedPort,connection=input2.connections.find(connection2=>connection2.pointsToConnect.some(point62=>point62.pcb_port_id===port.pcb_port_id));if(!connection)throw new Error(`No fanout connection for saved path "${path.connection}"`);let pcbExit=db22.pcb_breakout_point.get(exit.pcb_breakout_point_id),localExit=path.route.at(-1),transform7=compose2(exit._computePcbGlobalTransformBeforeLayout(),translate2(-localExit.x,-localExit.y)),originalExit=applyToPoint2(transform7,localExit),route=resolveSavedTraceRouteWidths(path.route).map(point62=>{let position4=applyToPoint2(transform7,point62);return{...point62,x:position4.x+pcbExit.x-originalExit.x,y:position4.y+pcbExit.y-originalExit.y}}),first=route[0],firstLayer=first.route_type==="wire"?first.layer:first.from_layer,portPosition=port._getGlobalPcbPositionAfterLayout();if(Math.hypot(first.x-portPosition.x,first.y-portPosition.y)>1e-4||!port.getAvailablePcbLayers().includes(firstLayer))throw new Error(`Saved fanout path "${path.connection}" must start at its PCB port on an available layer`);if(first.route_type==="via"&&!input2.allowViaInPad)throw new Error(`Saved fanout path "${path.connection}" starts with a via at a pad; enable allowViaInPad`);let last=route.at(-1),lastLayer=last.route_type==="wire"?last.layer:last.to_layer,endpoints=[{...first,layer:firstLayer},{...last,layer:lastLayer}];if(connection.pointsToConnect.some(point62=>!endpoints.some(endpoint=>Math.hypot(point62.x-endpoint.x,point62.y-endpoint.y)<1e-4&&point62.layer===endpoint.layer)))throw new Error(`Saved fanout path "${path.connection}" does not cover its connection endpoints`);let startContactWidths=getSavedTraceViaContactWidths(route,0,input2.minTraceWidth),endContactWidths=getSavedTraceViaContactWidths(route,route.length-1,input2.minTraceWidth);return first.route_type==="via"&&(route.splice(1,0,{route_type:"wire",x:first.x,y:first.y,layer:first.to_layer,width:startContactWidths.toWidth}),route.unshift({route_type:"wire",x:first.x,y:first.y,layer:first.from_layer,width:startContactWidths.fromWidth})),last.route_type==="via"&&(route.splice(route.length-1,0,{route_type:"wire",x:last.x,y:last.y,layer:last.from_layer,width:endContactWidths.fromWidth}),route.push({route_type:"wire",x:last.x,y:last.y,layer:last.to_layer,width:endContactWidths.toWidth})),last.route_type==="via"&&route.push({route_type:"wire",x:last.x,y:last.y,layer:last.to_layer,width:endContactWidths.toWidth}),coveredConnections.add(connection),{type:"pcb_trace",pcb_trace_id:`saved_fanout_${breakout.pcb_group_id}_${pathIndex}`,connection_name:connection.name,source_trace_id:connection.source_trace_id,connectsTo:[connection.source_trace_id,...connection.pointsToConnect.map(point62=>point62.pointId)].filter(id3=>!!id3),route}}),missing=input2.connections.filter(connection=>!coveredConnections.has(connection));if(missing.length)throw new Error(`pcbTracePaths must cover every fanout connection; missing: ${missing.map(connection=>connection.name).join(", ")}`);return traces}function getPhaseSortValue(routingPhaseIndex){return routingPhaseIndex===null?Number.POSITIVE_INFINITY:routingPhaseIndex}function compareRoutingPhasePlans(a22,b22){return getPhaseSortValue(a22.routingPhaseIndex)-getPhaseSortValue(b22.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,buses=[]){let busRoutingPhaseIndexes=new Set;for(let bus of buses){if(bus._parsedProps.routingPhaseIndex===void 0)continue;bus._parsedProps.connections.some(connection=>connection===trace.name||traceHasEndpointMatchingConnectionSelector(trace,convertPortSelectorToEndpointKey(connection)))&&busRoutingPhaseIndexes.add(bus._parsedProps.routingPhaseIndex)}if(busRoutingPhaseIndexes.size>1)throw new Error(`Trace "${trace.name}" belongs to buses with different routing phases`);let busRoutingPhaseIndex=busRoutingPhaseIndexes.values().next().value;if(busRoutingPhaseIndex!==void 0)return busRoutingPhaseIndex;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===void 0&&phaseProps.connections===void 0?phaseProps.pcbTracePaths?.map(path=>path.connection)??[]:[...phaseProps.connection?[phaseProps.connection]:[],...phaseProps.connections??[]]}function traceHasEndpointMatchingConnectionSelector(trace,connectionSelectorEndpointKey){if(trace.getTracePortPathSelectors().some(selector=>convertPortSelectorToEndpointKey(selector)===connectionSelectorEndpointKey))return!0;let port=trace.getSubcircuit().selectOne(connectionSelectorEndpointKey,{type:"port"});return port!==null&&(trace._findConnectedPorts().ports?.includes(port)??!1)}function getAutoroutersByPhaseIndex(group2){let autoroutingPhases=group2.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(group2){let autoroutingPhases=group2.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,minTraceToHoleEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleDiameter,minViaPadDiameter}=phaseProps;if(!(minTraceWidth===void 0&&minViaHoleEdgeToViaHoleEdgeClearance===void 0&&minPlatedHoleDrillEdgeToDrillEdgeClearance===void 0&&minTraceToPadEdgeClearance===void 0&&minTraceToHoleEdgeClearance===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),minTraceToHoleEdgeClearance:toParsedDistance(minTraceToHoleEdgeClearance),minPadEdgeToPadEdgeClearance:toParsedDistance(minPadEdgeToPadEdgeClearance),minBoardEdgeClearance:toParsedDistance(minBoardEdgeClearance),minViaEdgeToPadEdgeClearance:toParsedDistance(minViaEdgeToPadEdgeClearance),minViaHoleDiameter:toParsedDistance(minViaHoleDiameter),minViaPadDiameter:toParsedDistance(minViaPadDiameter)}}function Group_getRoutingPhasePlans(group2){let traces=group2.selectAll("trace"),nets=group2.selectAll("net"),buses=group2.selectAll("bus"),breakouts=group2.selectAll("group").filter(candidate=>candidate.isRoutingDirective),breakoutByTrace=new Map,breakoutByNet=new Map;for(let trace of traces){let ancestor=trace.parent;for(;ancestor&&ancestor!==group2;){if(ancestor.isRoutingDirective){breakoutByTrace.set(trace,ancestor);break}ancestor=ancestor.parent}}for(let net of nets)net.parent?.isRoutingDirective&&breakouts.includes(net.parent)&&breakoutByNet.set(net,net.parent);let plansByPhaseIndex=new Map,autoroutersByPhaseIndex=getAutoroutersByPhaseIndex(group2),phasePropsByPhaseIndex=getAutoroutingPhasePropsByPhaseIndex(group2),groupFanoutProps=group2._parsedProps,routeRemaining=group2.getInheritedProperty("routeRemaining")!==!1,defaultPhaseProps=phasePropsByPhaseIndex.get(null),includeUnassignedConnections=routeRemaining||defaultPhaseProps!==void 0&&!defaultPhaseProps.reroute&&getConnectionSelectorsFromAutoroutingPhaseProps(defaultPhaseProps).length===0,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&&breakouts.length===0)return[];for(let net of nets){if(breakoutByNet.has(net))continue;let routingPhaseIndex=getNetRoutingPhaseIndex(net);routingPhaseIndex===null&&!includeUnassignedConnections||getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex).nets.push(net)}for(let trace of traces){if(breakoutByTrace.has(trace))continue;let routingPhaseIndex=getTraceRoutingPhaseIndex(trace,buses);routingPhaseIndex===null&&!includeUnassignedConnections||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(!breakoutByTrace.has(trace)&&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||phaseProps.pcbTracePaths!==void 0)&&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.algorithmFn=phaseProps?.algorithmFn,plan.isImplicitRemainingPhase=plan.routingPhaseIndex===null&&phaseProps===void 0,plan.phaseName=phaseProps?.name,plan.reroute=phaseProps?.reroute,plan.region=phaseProps?.region,plan.connectionSelectors=phaseProps?getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps):void 0,plan.busFanoutDirections=phaseProps?.busFanoutDirections??groupFanoutProps.busFanoutDirections,plan.fanoutBoundaryPadding=phaseProps?.fanoutBoundaryPadding??groupFanoutProps.fanoutBoundaryPadding;let fanoutRoutingLayers=phaseProps?.fanoutRoutingLayers??groupFanoutProps.fanoutRoutingLayers;plan.fanoutRoutingLayers=fanoutRoutingLayers?.map(layer=>typeof layer=="string"?layer:layer.name),plan.fanoutPourNetMap=phaseProps?.fanoutPourNetMap??groupFanoutProps.fanoutPourNetMap,plan.drcTolerances=phaseProps?getDrcTolerancesFromAutoroutingPhaseProps(phaseProps):void 0}for(let phase of group2.selectAll("autoroutingphase")){let plan=plansByPhaseIndex.get(phase._parsedProps.phaseIndex??null);if(!plan||(plan.autoroutingPhase=phase,phase._parsedProps.pcbTracePaths===void 0))continue;let config=plan.autorouter!==void 0?getPresetAutoroutingConfig(plan.autorouter,group2.root?.platform):group2._getAutorouterConfig(),isFanout=["fanout","single_layer_fanout"].includes(config.preset??"");plan.getPrecomputedRoutingResult=input2=>getSavedAutoroutingPhaseTraces(phase,input2,isFanout)}let breakoutPlans=[];for(let breakout of breakouts){let breakoutProps2=breakout._parsedProps,shouldUseDefaultAutorouterForBreakoutPoints=breakout.children.some(child=>child instanceof BreakoutPoint)&&breakout.props.autorouter===void 0,breakoutTraces=traces.filter(trace=>breakoutByTrace.get(trace)===breakout),unroutedBreakoutTraces=breakoutTraces.filter(trace=>!trace.pcb_trace_id),pcbGroup=breakout.pcb_group_id?breakout.root?.db.pcb_group.get(breakout.pcb_group_id):null,outlineBounds=pcbGroup?.outline?getBoundsFromPoints2(pcbGroup.outline):null,routingWidth=pcbGroup?.width??(outlineBounds?outlineBounds.maxX-outlineBounds.minX:void 0),routingHeight=pcbGroup?.height??(outlineBounds?outlineBounds.maxY-outlineBounds.minY:void 0),routingBounds2=pcbGroup&&routingWidth&&routingHeight?{minX:pcbGroup.center.x-routingWidth/2,maxX:pcbGroup.center.x+routingWidth/2,minY:pcbGroup.center.y-routingHeight/2,maxY:pcbGroup.center.y+routingHeight/2}:void 0,rawBreakoutProps=breakout.props,hasExplicitGeometry=rawBreakoutProps.width!==void 0||rawBreakoutProps.height!==void 0||!!rawBreakoutProps.outline?.length,hasExplicitFanoutBoundaryPadding=rawBreakoutProps.fanoutBoundaryPadding!==void 0,breakoutPlan={routingPhaseIndex:null,routingPcbGroupId:breakout.pcb_group_id??void 0,fanoutRegionPcbGroupId:breakout.pcb_group_id??void 0,routingBounds:routingBounds2,fanoutBounds:hasExplicitGeometry?routingBounds2:hasExplicitFanoutBoundaryPadding?void 0:routingBounds2,autorouter:breakoutProps2.autorouter??"fanout",busFanoutDirections:breakoutProps2.busFanoutDirections,fanoutBoundaryPadding:breakoutProps2.fanoutBoundaryPadding,fanoutRoutingLayers:breakoutProps2.fanoutRoutingLayers?.map(layer=>typeof layer=="string"?layer:layer.name),fanoutPourNetMap:breakoutProps2.fanoutPourNetMap,nets:nets.filter(net=>breakoutByNet.get(net)===breakout),traces:breakoutTraces};if(breakout.isDogboneFanout&&breakoutProps2.pcbTracePaths===void 0){breakoutPlans.push({...breakoutPlan,routingBounds:void 0,fanoutBounds:routingBounds2});continue}if(breakout._parsedProps.pcbTracePaths!==void 0){breakoutPlans.push({...breakoutPlan,autorouter:{local:!0,groupMode:"subcircuit",allowViaInPad:(typeof breakoutProps2.autorouter=="object"?breakoutProps2.autorouter.allowViaInPad:void 0)??group2._getAutorouterConfig().allowViaInPad},getPrecomputedRoutingResult:input2=>({traces:getSavedFanoutTraces(breakout,input2)})});continue}if(!shouldUseDefaultAutorouterForBreakoutPoints){breakoutPlans.push(breakoutPlan);continue}if(breakoutPlans.push({...breakoutPlan,autorouter:"default",traces:[]}),unroutedBreakoutTraces.length>0){let automaticFanoutBusIds=new Set(buses.filter(bus=>unroutedBreakoutTraces.some(trace=>bus._parsedProps.connections.some(connection=>connection===trace.name||traceHasEndpointMatchingConnectionSelector(trace,convertPortSelectorToEndpointKey(connection))))).map(bus=>bus.name));for(let trace of unroutedBreakoutTraces)trace.name&&automaticFanoutBusIds.add(trace.name);let automaticBusFanoutDirections=breakoutProps2.busFanoutDirections?Object.fromEntries(Object.entries(breakoutProps2.busFanoutDirections).filter(([busId])=>automaticFanoutBusIds.has(busId))):void 0;breakoutPlans.push({...breakoutPlan,routingPcbGroupId:void 0,busFanoutDirections:automaticBusFanoutDirections,traces:unroutedBreakoutTraces})}}if(routeRemaining&&hasDirectRoutingTargets&&phasePropsByPhaseIndex.size===1&&defaultPhaseProps?.reroute&&plans.length===1&&plans[0]?.routingPhaseIndex===null){let reroutePlan=plans[0];return[...breakoutPlans,{routingPhaseIndex:null,isImplicitRemainingPhase:!0,nets:[...reroutePlan.nets],traces:[...reroutePlan.traces]},reroutePlan]}return[...breakoutPlans,...plans]}var package_default3={name:"@tscircuit/core",type:"module",version:"0.0.2044",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 && bun run scripts/smoke-tests/check-dist-bundled-schematic-solver.ts","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","@tsci/tscircuit.ti":"github:tscircuit/ti#57e314be4b2b06bc546d4def7453e619604d1157","@tscircuit/alphabet":"0.0.25","@tscircuit/bga-fanout-solver":"github:tscircuit/bga-fanout-solver#247c835cb8d69b65e53891dcf869731079415b39","@tscircuit/bus-lanes-solver":"https://jscdn.tscircuit.com/@tscircuit/bus-lanes-solver/0.0.6.tgz","@tscircuit/capacity-autorouter":"^0.0.951","@tscircuit/checks":"^0.0.233","@tscircuit/circuit-json-util":"^0.0.117","@tscircuit/common":"^0.0.20","@tscircuit/copper-pour-solver":"^0.0.62","@tscircuit/create-fdm-enclosure":"0.0.4","@tscircuit/dogbone-solver":"https://jscdn.tscircuit.com/@tscircuit/dogbone-solver/0.0.1.tgz","@tscircuit/fanout-solver":"0.0.78","@tscircuit/flex-utils":"https://jscdn.tscircuit.com/@tscircuit/flex-utils/0.0.8.tgz","@tscircuit/footprinter":"^0.0.426","@tscircuit/image-utils":"^0.0.8","@tscircuit/implicit-copper-pour-solver":"github:tscircuit/implicit-copper-pour-solver#a5cbbda0cd65fd4707c5c1af25779837c25aba92","@tscircuit/infer-cable-insertion-point":"^0.0.4","@tscircuit/infgrid-ijump-astar":"^0.0.35","@tscircuit/jlcpcb-manufacturing-specs":"git+https://github.com/tscircuit/jlcpcb-manufacturing-specs#23260504fceffff2d64bf11720f74e974d1d9321","@tscircuit/krt-wasm":"^0.1.1","@tscircuit/log-soup":"^1.0.2","@tscircuit/matchpack":"^0.0.97","@tscircuit/math-utils":"^0.0.36","@tscircuit/miniflex":"^0.0.4","@tscircuit/ngspice-spice-engine":"^0.0.20","@tscircuit/props":"^0.0.676","@tscircuit/schematic-match-adapt":"^0.0.18","@tscircuit/schematic-trace-solver":"https://jscdn.tscircuit.com/@tscircuit/schematic-trace-solver/0.0.220.tgz","@tscircuit/solver-utils":"^0.0.16","@tscircuit/soup-util":"^0.0.41","@tscircuit/via-stitch-solver":"github:tscircuit/via-stitch-solver#64f2ac7781b795bdc0d74ba411988e60767fa653","@tscircuit/winding-breakout-point-solver":"github:tscircuit/winding-breakout-point-solver#202dbe9eb0088633b6fa094120dba6f2f41f8803","@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.507","circuit-json-to-bpc":"^0.0.13","circuit-json-to-connectivity-map":"^0.0.33","circuit-json-to-gltf":"^0.0.141","circuit-json-to-spice":"^0.0.45","circuit-to-svg":"^0.0.437",concurrently:"^9.1.2","connectivity-map":"^1.0.1",debug:"^4.3.6",flatbush:"^4.5.0","graphics-debug":"^0.0.95",howfat:"^0.3.8","kicad-to-circuit-json":"^0.0.117",kicadts:"^0.0.53","live-server":"^1.2.2",minicssgrid:"^0.0.9","pkg-pr-new":"^0.0.37",poppygl:"0.0.29",react:"^19.1.0","react-dom":"^19.1.0","schematic-symbols":"^0.0.248",spicets:"^0.0.4",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/create-fdm-enclosure":"*","@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":"*","circuit-json-to-spice":"*","schematic-symbols":"*",spicets:"*",typescript:"^5.0.0"},dependencies:{"@flatten-js/core":"^1.6.2","@lume/kiwi":"^0.4.3","calculate-cell-boundaries":"^0.0.24","calculate-packing":"^0.0.90","css-select":"5.1.0","format-si-unit":"^0.0.12",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"},overrides:{"@tscircuit/circuit-json-util":"^0.0.117","@tscircuit/props":"^0.0.676","circuit-json":"^0.0.507"}},getFnv1aHash=value=>{let hash=2166136261;for(let i22=0;i22<value.length;i22++)hash^=value.charCodeAt(i22),hash=Math.imul(hash,16777619);return hash>>>0},getJsonHash=value=>{let serializedValue=JSON.stringify(value),hash1=getFnv1aHash(serializedValue),hash2=getFnv1aHash(`${serializedValue}${hash1}`);return`${hash1.toString(16).padStart(8,"0")}${hash2.toString(16).padStart(8,"0")}`},getLocalAutoroutingCacheKey=(simpleRouteJson,solverOptions)=>`routes:core@${package_default3.version}:solver:${getJsonHash(solverOptions)}:srj:${getJsonHash(simpleRouteJson)}`,getCachedLocalAutoroutingPhaseResult=async({cacheEngine,cacheKey})=>{if(!cacheEngine)return null;try{let cachedResult=await cacheEngine.getItem(cacheKey);if(!cachedResult)return null;let parsedResult=JSON.parse(cachedResult);return!parsedResult||!Array.isArray(parsedResult.traces)?null:parsedResult}catch{return null}},cacheLocalAutoroutingPhaseResult=async({cacheEngine,cacheKey,result})=>{if(cacheEngine)try{await cacheEngine.setItem(cacheKey,JSON.stringify(result))}catch{}},SRJ_POINT_POSITION_TOLERANCE_MM=1e-6,srjPointsHaveSamePointId=(first,second)=>first.pointId!==void 0&&second.pointId!==void 0&&first.pointId===second.pointId,srjPointsHaveSameBoardPositionAndLayer=(first,second)=>Math.abs(first.x-second.x)<=SRJ_POINT_POSITION_TOLERANCE_MM&&Math.abs(first.y-second.y)<=SRJ_POINT_POSITION_TOLERANCE_MM&&first.layer===second.layer,srjPointsReferToSameEndpoint=(first,second)=>first.pointId!==void 0&&second.pointId!==void 0?srjPointsHaveSamePointId(first,second):srjPointsHaveSameBoardPositionAndLayer(first,second),getPairedGlobalPoint=(simpleRouteJson,connection)=>{let globalConnection=simpleRouteJson.connections.find(candidate=>candidate.routingPcbGroupId!==connection.routingPcbGroupId&&candidate.source_trace_id===connection.source_trace_id&&candidate.pointsToConnect.some(globalPoint=>connection.pointsToConnect.some(localPoint=>srjPointsReferToSameEndpoint(globalPoint,localPoint))));if(!globalConnection)return;let pairedPoints=globalConnection.pointsToConnect.filter(globalPoint=>!connection.pointsToConnect.some(localPoint=>srjPointsReferToSameEndpoint(globalPoint,localPoint)));return pairedPoints.length===1?pairedPoints[0]:void 0},getPairedBreakoutExitTarget=(simpleRouteJson,connection)=>{if(!connection.routingPcbGroupId||!connection.source_trace_id)return;let pairedGlobalPoint=getPairedGlobalPoint(simpleRouteJson,connection);if(!(!pairedGlobalPoint||!simpleRouteJson.connections.some(candidate=>candidate.routingPcbGroupId!==void 0&&candidate.routingPcbGroupId!==connection.routingPcbGroupId&&candidate.source_trace_id===connection.source_trace_id&&candidate.pointsToConnect.some(candidatePoint=>srjPointsReferToSameEndpoint(candidatePoint,pairedGlobalPoint)))))return{x:pairedGlobalPoint.x,y:pairedGlobalPoint.y,layer:pairedGlobalPoint.layer}};function connectionIsInRoutingPhase(connection,phasePlan){if(connection.routingPcbGroupId)return connection.routingPcbGroupId===phasePlan.routingPcbGroupId;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.routingPcbGroupId||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);let includedConnectionNames=new Set;for(let connection of connections)includedConnectionNames.add(connection.name);let differentialPairs=[];for(let differentialPair of simpleRouteJson.differentialPairs??[]){let positiveConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[0]),negativeConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[1]);if(positiveConnectionIncluded!==negativeConnectionIncluded)throw new Error(`Differential pair "${differentialPair.connectionNames.join("/")}" cannot be split across autorouting phases`);positiveConnectionIncluded&&differentialPairs.push(differentialPair)}let connectionByName=new Map(connections.map(connection=>[connection.name,connection])),buses=(simpleRouteJson.buses??[]).map(bus=>{let connectionNames=bus.connectionNames.filter(connectionName=>includedConnectionNames.has(connectionName)),connectionExitTargets=Object.fromEntries(connectionNames.flatMap(connectionName=>{let connection=connectionByName.get(connectionName);if(!connection)return[];let pairedTarget=getPairedBreakoutExitTarget(simpleRouteJson,connection);return pairedTarget?[[connectionName,pairedTarget]]:[]}));return{...bus,connectionNames,...Object.keys(connectionExitTargets).length>0?{connectionExitTargets}:{}}}).filter(bus=>bus.connectionNames.length>0),bounds=expandSrjBoundsToIncludeConnectionPoints({bounds:phasePlan.routingBounds??simpleRouteJson.bounds,connections});return{...simpleRouteJson,bounds,outline:getSrjOutlineForRoutingBounds(simpleRouteJson,bounds),connections,differentialPairs:differentialPairs.length>0?differentialPairs:void 0,buses:buses.length>0?buses:void 0}}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,minTraceToHoleEdgeClearance=drcTolerances.minTraceToHoleEdgeClearance??simpleRouteJson.minTraceToHoleEdgeClearance,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,minTraceToHoleEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance}}var removeCompletedFanoutConnections=(simpleRouteJson,routingPcbGroupId)=>{let connections=simpleRouteJson.connections.filter(connection=>connection.routingPcbGroupId!==routingPcbGroupId),includedConnectionNames=new Set(connections.map(connection=>connection.name)),differentialPairs=[];for(let differentialPair of simpleRouteJson.differentialPairs??[]){let positiveConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[0]),negativeConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[1]);if(positiveConnectionIncluded!==negativeConnectionIncluded)throw new Error(`Differential pair "${differentialPair.connectionNames.join("/")}" cannot be split at a breakout boundary`);positiveConnectionIncluded&&differentialPairs.push(differentialPair)}let buses=(simpleRouteJson.buses??[]).map(bus=>({...bus,connectionNames:bus.connectionNames.filter(connectionName=>includedConnectionNames.has(connectionName))})).filter(bus=>bus.connectionNames.length>0);return{...simpleRouteJson,connections,differentialPairs:differentialPairs.length>0?differentialPairs:void 0,buses:buses.length>0?buses:void 0}},connectFanoutTracesToBreakoutPoints=(simpleRouteJson,breakoutPointIdByConnectionName)=>({...simpleRouteJson,traces:simpleRouteJson.traces?.map(trace=>{let breakoutPointId=breakoutPointIdByConnectionName.get(trace.connection_name??"");return breakoutPointId?{...trace,connectsTo:[...new Set([...trace.connectsTo??[],breakoutPointId])]}:trace})});function Group_syncFanoutExitsWithGlobalConnections({fanoutInputSimpleRouteJson,fanoutOutputSimpleRouteJson,baseSimpleRouteJson,routingPhasePlan}){let routingPcbGroupId=routingPhasePlan.routingPcbGroupId;if(!routingPcbGroupId)return{downstreamSimpleRouteJson:fanoutOutputSimpleRouteJson,baseSimpleRouteJson,synchronizedBreakoutPoints:[]};let outputConnectionByName=new Map(fanoutOutputSimpleRouteJson.connections.map(connection=>[connection.name,connection])),baseConnections=baseSimpleRouteJson.connections.map(connection=>({...connection,pointsToConnect:connection.pointsToConnect.map(point62=>({...point62}))})),synchronizedBreakoutPoints=[],breakoutPointIdByConnectionName=new Map;for(let inputConnection of fanoutInputSimpleRouteJson.connections){if(inputConnection.routingPcbGroupId!==routingPcbGroupId||!inputConnection.source_trace_id)continue;let outputConnection=outputConnectionByName.get(inputConnection.name);if(!outputConnection)continue;let globalPointMatches=baseConnections.filter(connection=>{if(connection.routingPcbGroupId===routingPcbGroupId)return!1;let sharesSourceTrace=connection.source_trace_id===inputConnection.source_trace_id,sharesPointId=connection.pointsToConnect.some(globalPoint=>inputConnection.pointsToConnect.some(inputPoint=>srjPointsHaveSamePointId(globalPoint,inputPoint)));return!sharesSourceTrace&&!sharesPointId?!1:connection.pointsToConnect.some(globalPoint=>inputConnection.pointsToConnect.some(inputPoint=>srjPointsReferToSameEndpoint(globalPoint,inputPoint)))}).flatMap(globalConnection=>globalConnection.pointsToConnect.flatMap((previousPoint,pointIndex)=>inputConnection.pointsToConnect.some(inputPoint=>srjPointsReferToSameEndpoint(previousPoint,inputPoint))?[{globalConnection,pointIndex,previousPoint}]:[])),changedPointIndex=outputConnection.pointsToConnect.findIndex((outputPoint,pointIndex)=>{let inputPoint=inputConnection.pointsToConnect[pointIndex];return inputPoint!==void 0&&!srjPointsHaveSameBoardPositionAndLayer(outputPoint,inputPoint)});if(changedPointIndex<0)continue;let fanoutExitPoint=outputConnection.pointsToConnect[changedPointIndex];globalPointMatches.length===0&&synchronizedBreakoutPoints.push({sourceTraceId:inputConnection.source_trace_id,routingPcbGroupId,previousPoint:inputConnection.pointsToConnect[changedPointIndex],fanoutExitPoint});for(let{globalConnection,pointIndex,previousPoint}of globalPointMatches){let{terminalVia:_previousTerminalVia,...previousPointWithoutLayerOverrides}=previousPoint,synchronizedGlobalPoint={...previousPointWithoutLayerOverrides,x:fanoutExitPoint.x,y:fanoutExitPoint.y,layer:fanoutExitPoint.layer,...fanoutExitPoint.terminalVia?{terminalVia:{...fanoutExitPoint.terminalVia}}:{}};globalConnection.pointsToConnect[pointIndex]=synchronizedGlobalPoint,previousPoint.pointId&&breakoutPointIdByConnectionName.set(inputConnection.name,previousPoint.pointId),synchronizedBreakoutPoints.push({sourceTraceId:inputConnection.source_trace_id,routingPcbGroupId,previousPoint,fanoutExitPoint})}}let newFanoutSourceKeepouts=fanoutOutputSimpleRouteJson.obstacles.filter(obstacle=>obstacle.isFanoutSourceKeepout===!0&&obstacle.componentId!==void 0),completedSourceComponentIds=new Set(newFanoutSourceKeepouts.flatMap(obstacle=>obstacle.componentId===void 0?[]:[obstacle.componentId])),retainedBaseObstacles=baseSimpleRouteJson.obstacles.filter(obstacle=>!obstacle.componentId||!completedSourceComponentIds.has(obstacle.componentId));return{downstreamSimpleRouteJson:removeCompletedFanoutConnections(connectFanoutTracesToBreakoutPoints(fanoutOutputSimpleRouteJson,breakoutPointIdByConnectionName),routingPcbGroupId),baseSimpleRouteJson:{...baseSimpleRouteJson,connections:baseConnections,obstacles:[...retainedBaseObstacles,...newFanoutSourceKeepouts]},synchronizedBreakoutPoints}}function getJumperPadInfos(db22){let padInfos=[],jumperSourceComponentIds=new Set(db22.source_component.list().filter(component=>component.name?.startsWith("__autoplaced_jumper")).map(component=>component.source_component_id));if(jumperSourceComponentIds.size===0)return padInfos;let jumperPcbComponentIds=new Set(db22.pcb_component.list().filter(component=>jumperSourceComponentIds.has(component.source_component_id)).map(component=>component.pcb_component_id)),jumperSmtpads=db22.pcb_smtpad.list().filter(pad2=>jumperPcbComponentIds.has(pad2.pcb_component_id));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,x22,y22,tolerance=.01){for(let pad2 of padInfos)if(Math.abs(pad2.x-x22)<tolerance&&Math.abs(pad2.y-y22)<tolerance)return pad2.pcb_port_id}function findJumperPortContainingPoint(padInfos,x22,y22){for(let pad2 of padInfos)if(x22>=pad2.minX&&x22<=pad2.maxX&&y22>=pad2.minY&&y22<=pad2.maxY)return pad2}function splitRouteAtJumperPads(route,padInfos){if(route.length===0||padInfos.length===0)return[route];let segments=[],currentSegment=[];for(let i22=0;i22<route.length;i22++){let point62=route[i22];if(currentSegment.push(point62),point62.route_type==="wire"&&i22>0&&i22<route.length-1){let padInfo=findJumperPortContainingPoint(padInfos,point62.x,point62.y);if(padInfo){point62.end_pcb_port_id||(point62.end_pcb_port_id=padInfo.pcb_port_id),segments.push(currentSegment);let newStartPoint={...point62};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,padInfos){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 claimSrjAssignablePcbViasTraversedByRoute=({db:db22,pcbTrace,routeWithSrjMetadata})=>{for(let routePoint2 of routeWithSrjMetadata){if(routePoint2.route_type!=="through_pad")continue;let pcbViaId=routePoint2.circuitJsonMetadata?.pcb_via_id;if(!pcbViaId)continue;let assignablePcbVia=db22.pcb_via.get(pcbViaId);!assignablePcbVia?.net_is_assignable||assignablePcbVia.net_assigned&&assignablePcbVia.pcb_trace_id!==pcbTrace.pcb_trace_id||db22.pcb_via.update(assignablePcbVia.pcb_via_id,{pcb_trace_id:pcbTrace.pcb_trace_id,net_assigned:!0})}},getAxisGap=(firstMinimum,firstMaximum,secondMinimum,secondMaximum)=>Math.max(secondMinimum-firstMaximum,firstMinimum-secondMaximum),findFanoutPhaseSeparationConflict=regions=>{for(let firstIndex=0;firstIndex<regions.length;firstIndex++){let firstRegion=regions[firstIndex];for(let secondIndex=firstIndex+1;secondIndex<regions.length;secondIndex++){let secondRegion=regions[secondIndex];if(firstRegion.regionId&&firstRegion.regionId===secondRegion.regionId)continue;let horizontalGap=getAxisGap(firstRegion.bounds.minX,firstRegion.bounds.maxX,secondRegion.bounds.minX,secondRegion.bounds.maxX),verticalGap=getAxisGap(firstRegion.bounds.minY,firstRegion.bounds.maxY,secondRegion.bounds.minY,secondRegion.bounds.maxY),availableGap=Math.max(horizontalGap,verticalGap),requiredGap=firstRegion.boundaryKeepaway+secondRegion.boundaryKeepaway;if(availableGap+1e-6<requiredGap)return{firstRegion,secondRegion,availableGap,requiredGap}}}};function getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces,stageOutputPcbTraces}){let replacedPcbTraceIds=new Set(stageOutputPcbTraces.flatMap(trace=>[trace.pcb_trace_id,...trace.__replaces_pcb_trace_id?[trace.__replaces_pcb_trace_id]:[]]));return[...accumulatedPcbTraces.filter(trace=>!replacedPcbTraceIds.has(trace.pcb_trace_id)),...stageOutputPcbTraces]}var POINT_EPSILON3=1e-6;function isPointOnWireSegment({point:point62,segmentStart,segmentEnd}){return point62.layer&&(segmentStart.layer!==point62.layer||segmentEnd.layer!==point62.layer)?!1:pointToSegmentDistance(point62,segmentStart,segmentEnd)<=POINT_EPSILON3}function isPointInSmtPad({point:point62,pad:pad2,traceWidth=0}){return pad2.shape==="rect"||pad2.shape==="rotated_rect"?Math.abs(point62.x-pad2.x)<=pad2.width/2+traceWidth/2&&Math.abs(point62.y-pad2.y)<=pad2.height/2+traceWidth/2:pad2.shape==="circle"?distance2(point62,pad2)<=pad2.radius+traceWidth/2:!1}function isPointInPlatedHole({point:point62,hole,traceWidth=0}){return distance2(point62,hole)<=(hole.outer_diameter??hole.hole_diameter??0)/2+traceWidth/2}function getEndpointSourcePortIdsFromGeometry(db22,trace){let sourcePortIds=new Set,route=trace.route,endpoints=[route[0],route[route.length-1]].filter(point62=>!!point62&&point62.route_type==="wire"&&point62.x!==void 0&&point62.y!==void 0);for(let endpoint of endpoints){for(let pcbPort of db22.pcb_port.list())pcbPort.source_port_id&&(endpoint.layer&&pcbPort.layers&&!pcbPort.layers.includes(endpoint.layer)||distance2(endpoint,pcbPort)<=.01&&sourcePortIds.add(pcbPort.source_port_id));for(let smtpad2 of db22.pcb_smtpad.list()){if(!smtpad2.pcb_port_id||endpoint.layer&&smtpad2.layer!==endpoint.layer||!isPointInSmtPad({point:endpoint,pad:smtpad2,traceWidth:endpoint.width}))continue;let sourcePortId=db22.pcb_port.get(smtpad2.pcb_port_id)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}for(let hole of db22.pcb_plated_hole.list()){if(!hole.pcb_port_id||!isPointInPlatedHole({point:endpoint,hole,traceWidth:endpoint.width}))continue;let sourcePortId=db22.pcb_port.get(hole.pcb_port_id)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}}return[...sourcePortIds]}function getWireRouteEndpoints(trace){let route=trace.route.filter(point62=>point62.route_type==="wire"&&point62.x!==void 0&&point62.y!==void 0);return[route[0],route[route.length-1]].filter(point62=>!!point62)}function getSourceIdsFromConnectedPcbTraces(db22,trace){let sourceIds=new Set,endpoints=getWireRouteEndpoints(trace);if(endpoints.length===0)return[];for(let existingTrace of db22.pcb_trace.list()){if(!existingTrace.source_trace_id||existingTrace.pcb_trace_id===trace.pcb_trace_id||!db22.source_trace.get(existingTrace.source_trace_id)&&!db22.source_net.get(existingTrace.source_trace_id))continue;let existingRoute=existingTrace.route.filter(point62=>point62.route_type==="wire");for(let i22=0;i22<existingRoute.length-1;i22++){let segmentStart=existingRoute[i22],segmentEnd=existingRoute[i22+1];if(!(!segmentStart||!segmentEnd))for(let endpoint of endpoints)isPointOnWireSegment({point:endpoint,segmentStart,segmentEnd})&&sourceIds.add(existingTrace.source_trace_id)}}return[...sourceIds]}function getSourcePortIdsFromRoutedTrace(db22,trace){let sourcePortIds=new Set;for(let point62 of trace.route)for(let pcbPortId of[point62.start_pcb_port_id,point62.end_pcb_port_id]){if(!pcbPortId)continue;let sourcePortId=db22.pcb_port.get(pcbPortId)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}return sourcePortIds.size>0?[...sourcePortIds]:getEndpointSourcePortIdsFromGeometry(db22,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:db22,trace,subcircuit_id}){if(trace.source_trace_id&&(db22.source_trace.get(trace.source_trace_id)??db22.source_net.get(trace.source_trace_id)))return trace.source_trace_id;let sourcePortIds=getSourcePortIdsFromRoutedTrace(db22,trace);if(sourcePortIds.length===0)return getSourceIdsFromConnectedPcbTraces(db22,trace)[0];let sourceTraces=db22.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,orientation22){let groups=[];for(let pad2 of pads){let key=orientation22==="vertical"?pad2.center.y:pad2.center.x,foundGroup=!1;for(let group2 of groups){let groupKey=orientation22==="vertical"?group2[0].center.y:group2[0].center.x;if(Math.abs(key-groupKey)<.01){group2.push(pad2),foundGroup=!0;break}}foundGroup||groups.push([pad2])}return groups.filter(g22=>g22.length>=2)}function insertAutoplacedJumpers(params){let{db:db22,output_jumpers,subcircuit_id}=params;for(let jumperIndex=0;jumperIndex<output_jumpers.length;jumperIndex++){let jumper=output_jumpers[jumperIndex],sourceComponent=db22.source_component.insert({ftype:"simple_chip",name:`__autoplaced_jumper_${jumperIndex}`,supplier_part_numbers:{}}),rotation5=jumper.orientation==="horizontal"?0:90,firstPadLayer=jumper.pads[0]?.layer||jumper.pads[0]?.layers?.[0]||"top",pcbComponent=db22.pcb_component.insert({source_component_id:sourceComponent.source_component_id,center:jumper.center,rotation:rotation5,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=db22.source_port.insert({source_component_id:sourceComponent.source_component_id,name:`pin${pinNumber}`,pin_number:pinNumber}),padLayer=pad2.layer||pad2.layers?.[0]||"top",pcbPort=db22.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=db22.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 group2 of internalGroups){let sourcePortIds=[];for(let groupPad of group2){let padInfo=padData.find(p22=>Math.abs(p22.pad.center.x-groupPad.center.x)<.01&&Math.abs(p22.pad.center.y-groupPad.center.y)<.01);padInfo&&sourcePortIds.push(padInfo.sourcePortId)}sourcePortIds.length>=2&&db22.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(point62=>({...point62}))}}function getRelevantSubcircuitIdsForReroute(group2){let relevantSubcircuitIds=new Set;if(!group2.subcircuit_id)return relevantSubcircuitIds;relevantSubcircuitIds.add(group2.subcircuit_id);let db22=group2.root?.db;if(!db22)return relevantSubcircuitIds;for(let subcircuitId of getDescendantSubcircuitIds2(db22,group2.subcircuit_id))relevantSubcircuitIds.add(subcircuitId);return relevantSubcircuitIds}function getExistingPcbTracesForReroute(group2){let db22=group2.root?.db;if(!db22)return[];let relevantSubcircuitIds=getRelevantSubcircuitIdsForReroute(group2);return db22.pcb_trace.list().filter(trace=>!trace.route||trace.route.length<2?!1:group2.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:group2,outputPcbTraces,pcbTraceIdsToReplace=[]}){let db22=group2.root?.db;if(!db22)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(group2).filter(trace=>replacementPcbTraceIds.has(trace.pcb_trace_id)||!!(trace.source_trace_id&&trace.subcircuit_id===group2.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 db22.pcb_via.list())via.pcb_trace_id&&deletedPcbTraceIds.has(via.pcb_trace_id)&&db22.pcb_via.delete(via.pcb_via_id);for(let trace of tracesToDelete)db22.pcb_trace.delete(trace.pcb_trace_id)}function getExistingSimplifiedPcbTracesForReroute(group2){return getExistingPcbTracesForReroute(group2).map(convertPcbTraceToSimplifiedPcbTrace)}function splitPcbTracesOnJumperSegments(route){let jumperRoutes=route.filter(p22=>p22.route_type==="jumper"),wireAndViaRoutes=route.filter(p22=>p22.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 i22=0;i22<wireAndViaRoutes.length;i22++){let p22=wireAndViaRoutes[i22];if(p22.route_type!=="wire")continue;let distToStart=Math.hypot(p22.x-jumperStart.x,p22.y-jumperStart.y),distToEnd=Math.hypot(p22.x-jumperEnd.x,p22.y-jumperEnd.y);distToStart<minStartDist&&(minStartDist=distToStart,startIdx=i22),distToEnd<minEndDist&&(minEndDist=distToEnd,endIdx=i22)}startIdx>endIdx&&([startIdx,endIdx]=[endIdx,startIdx]),startIdx>=0&&endIdx>=0&&startIdx!==endIdx&&splitRanges.push({startIdx,endIdx})}splitRanges.sort((a22,b22)=>a22.startIdx-b22.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 ax22=anchorPosition.x,ay22=anchorPosition.y;switch(alignment){case"top_left":return{x:ax22+width/2,y:ay22-height/2};case"top_center":return{x:ax22,y:ay22-height/2};case"top_right":return{x:ax22-width/2,y:ay22-height/2};case"center_left":return{x:ax22+width/2,y:ay22};case"center_right":return{x:ax22-width/2,y:ay22};case"bottom_left":return{x:ax22+width/2,y:ay22+height/2};case"bottom_center":return{x:ax22,y:ay22+height/2};case"bottom_right":return{x:ax22-width/2,y:ay22+height/2};default:return anchorPosition}}var getDistanceToPoint=(routePoint2,targetPoint)=>{let position4=getRoutePointPosition(routePoint2);return Math.hypot(position4.x-targetPoint.x,position4.y-targetPoint.y)},platformAllowsLegacyAutorouters=group2=>{let platform=group2.root?.platform;return platform!==void 0&&"allowLegacyAutorouters"in platform&&platform.allowLegacyAutorouters===!0},getDisabledLegacyGroupAutorouterPreset=group2=>{if(platformAllowsLegacyAutorouters(group2))return null;let resolvedGroupAutorouter=group2._parsedProps.autorouter??group2.getInheritedProperty("autorouter");return getLegacyAutorouterPreset(resolvedGroupAutorouter)},getDisabledLegacyAutorouterPreset=group2=>{if(platformAllowsLegacyAutorouters(group2))return null;let legacyGroupAutorouterPreset=getDisabledLegacyGroupAutorouterPreset(group2);if(legacyGroupAutorouterPreset)return legacyGroupAutorouterPreset;let routingPhaseAutorouters=group2.selectAll("autoroutingphase").map(autoroutingPhase=>autoroutingPhase._parsedProps.autorouter);for(let autorouter of routingPhaseAutorouters){let legacyAutorouterPreset=getLegacyAutorouterPreset(autorouter);if(legacyAutorouterPreset)return legacyAutorouterPreset}return null},ensureRouteStartsAtSourceTraceStart=({db:db22,route,routeThicknessMode,sourceTraceId})=>{if(!sourceTraceId||route.length<2)return route;let firstSourcePortId=db22.source_trace.get(sourceTraceId)?.connected_source_port_ids[0];if(!firstSourcePortId)return route;let firstPcbPort=db22.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,routeThicknessMode):route},Group5=class extends NormalComponent{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,"_pcbPlacementDrcErrorCount",null);__publicField(this,"_pcbPlacementDrcCheckError",null);__publicField(this,"_pcbPlacementDrcChecksPending",!1);__publicField(this,"_standaloneSubcircuitDrcChecksComplete",!1);__publicField(this,"_standaloneSubcircuitDrcChecksInProgress",!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:db22}=this.root,hasExplicitName=typeof this._parsedProps.name=="string"&&this._parsedProps.name.length>0,source_group3=db22.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}`,db22.source_group.update(source_group3.source_group_id,{subcircuit_id:this.subcircuit_id}))}doInitialSourceRender(){let{db:db22}=this.root;for(let child of this.getDescendants())child.getGroup()?.source_group_id===this.source_group_id&&db22.source_component.update(child.source_component_id,{source_group_id:this.source_group_id});if(!this.isSubcircuit)return;let disabledLegacyAutorouterPreset=getDisabledLegacyAutorouterPreset(this);disabledLegacyAutorouterPreset&&db22.source_property_ignored_warning.insert({source_component_id:this.source_component_id??"",property_name:"autorouter",subcircuit_id:this.subcircuit_id??void 0,error_type:"source_property_ignored_warning",message:`The "${disabledLegacyAutorouterPreset}" autorouter is deprecated, so autorouting has been disabled for this subcircuit. Use the default autorouter and introduce <autoroutingphase /> or <fanout /> elements as needed.`})}doInitialSourceParentAttachment(){let{db:db22}=this.root,parentGroup=this.parent?.getGroup?.();if(parentGroup?.source_group_id&&db22.source_group.update(this.source_group_id,{parent_source_group_id:parentGroup.source_group_id}),!this.isSubcircuit||isAssemblyDeviceContainer(this.parent))return;let parent_subcircuit_id=this.parent?.getSubcircuit?.()?.subcircuit_id;parent_subcircuit_id&&db22.source_group.update(this.source_group_id,{parent_subcircuit_id})}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db22}=this.root,{_parsedProps:props}=this,groupProps2=props,hasOutline=groupProps2.outline&&groupProps2.outline.length>0,numericOutline=hasOutline?groupProps2.outline.map(point62=>({x:distance.parse(point62.x),y:distance.parse(point62.y)})):void 0,ctx=this.props,anchorPosition=this._getGlobalPcbPositionBeforeLayout(),center2=computeCenterFromAnchorPosition(anchorPosition,ctx),pcb_group3=db22.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)db22.pcb_component.update(child.pcb_component_id,{pcb_group_id:pcb_group3.pcb_group_id})}doInitialPcbPrimitiveRender(){this.calculatePcbGroupBounds()}calculatePcbGroupBounds(pcbContentBounds){if(!this.pcb_group_id||this.root?.pcbDisabled)return;let{db:db22}=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(point62=>({x:distance.parse(point62.x),y:distance.parse(point62.y)})),outlineBounds=getBoundsFromPoints2(numericOutline);if(!outlineBounds)return;let centerX2=(outlineBounds.minX+outlineBounds.maxX)/2,centerY2=(outlineBounds.minY+outlineBounds.maxY)/2,center22=hasExplicitPositioning?db22.pcb_group.get(this.pcb_group_id)?.center??{x:centerX2,y:centerY2}:{x:centerX2,y:centerY2};db22.pcb_group.update(this.pcb_group_id,{center:center22});return}let contentBounds=pcbContentBounds;if(!contentBounds){let bounds=getBoundsOfPcbComponents(this.children);contentBounds={center:{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},width:bounds.width,height:bounds.height}}let{width,height}=contentBounds,{x:centerX,y:centerY}=contentBounds.center;if(this.isSubcircuit||this.isRoutingDirective){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),existingCenter=db22.pcb_group.get(this.pcb_group_id)?.center??{x:centerX,y:centerY},shouldUsePcbContentCenter=this.isSubcircuit||this.isRoutingDirective||pcbContentBounds!==void 0,center2=hasExplicitPositioning?shouldUsePcbContentCenter?{x:props.width===void 0?centerX:existingCenter.x,y:props.height===void 0?centerY:existingCenter.y}:existingCenter:{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}db22.pcb_group.update(this.pcb_group_id,{width:resolvedWidth,height:resolvedHeight,center:center2})}updatePcbPrimitiveRender(){this.calculatePcbGroupBounds()}getNextAvailableName(elm){var _a543,_b6;return(_a543=this.unnamedElementCounter)[_b6=elm.lowercaseComponentName]??(_a543[_b6]=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:db22}=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),Group_doInitialAssignSchematicSheetToConnectedComponents(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(){if(this._isLegacyAutorouterDisabled())return!1;let autorouter=this._getAutorouterConfig();return autorouter.groupMode==="sequential-trace"?!1:!!(autorouter.local&&autorouter.groupMode==="subcircuit"||!autorouter.local)}_getRoutingPhasePlans(){return Group_getRoutingPhasePlans(this)}_hasTracesToRoute(){let debug132=(0,import_debug11.default)("tscircuit:core:_hasTracesToRoute"),routingPhasePlans=this._getRoutingPhasePlans(),traceCount=0,hasReroutePhaseWithExistingTraceInput=!1;for(let routingPhasePlan of routingPhasePlans){traceCount+=routingPhasePlan.traces.length;let phaseAutorouterConfig=routingPhasePlan.autorouter?getPresetAutoroutingConfig(routingPhasePlan.autorouter,this.root?.platform):void 0;hasReroutePhaseWithExistingTraceInput||(hasReroutePhaseWithExistingTraceInput=!!(routingPhasePlan.reroute&&(routingPhasePlan.region||phaseAutorouterConfig?.preset==="simplify")))}if(debug132(`[${this.getString()}] has ${traceCount} traces to route`),traceCount>0)return!0;if(hasReroutePhaseWithExistingTraceInput){let existingTraceCount=getExistingPcbTracesForReroute(this).length;return debug132(`[${this.getString()}] has ${existingTraceCount} existing pcb traces available for reroute`),existingTraceCount>0}return!1}async _runEffectMakeHttpAutoroutingRequest(){let{db:db22}=this.root,debug132=(0,import_debug11.default)("tscircuit:core:_runEffectMakeHttpAutoroutingRequest"),props=this._parsedProps,autorouterConfig2=this._getAutorouterConfig(),serverUrl=autorouterConfig2.serverUrl,serverMode=autorouterConfig2.serverMode,fetchWithDebug=(url2,options)=>(debug132("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 preferredTraceWidth=props.defaultTraceWidth??props.nominalTraceWidth,{simpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db:db22,minTraceWidth:Number(props.minTraceWidth??.15),nominalTraceWidth:preferredTraceWidth!=null?Number(preferredTraceWidth):void 0,subcircuit_id:this.subcircuit_id,subcircuitComponent:this});simpleRouteJson.allowViaInPad=autorouterConfig2.allowViaInPad;let{autorouting_result:autorouting_result2}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_simple_route_json:simpleRouteJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r22=>r22.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(r22=>r22.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(r22=>r22.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(r22=>r22.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(r22=>r22.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 db22.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:db22}=this.root,props=this._parsedProps,debug132=(0,import_debug11.default)("tscircuit:core:_runLocalAutorouting");debug132(`[${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.defaultTraceWidth??props.nominalTraceWidth??minTraceWidth),routingPhasePlans=this._getRoutingPhasePlans(),hasPhasedAutorouting=this.getInheritedProperty("routeRemaining")===!1||Group_hasPhasedAutorouting(routingPhasePlans),shouldEmitRoutingPhaseDebugObjects=routingPhasePlans.length>1,routingPhaseDebugLabels=new Map;if(shouldEmitRoutingPhaseDebugObjects)for(let debugObject of db22.pcb_debug_object.list())debugObject.subcircuit_id===this.subcircuit_id&&(debugObject.label?.startsWith("Autorouting phase: ")||debugObject.label?.startsWith("autorouting phase "))&&db22.pcb_debug_object.delete(debugObject.pcb_debug_object_id);let emitRoutingPhaseDebugObject=(routingPhasePlan,bounds)=>{if(!shouldEmitRoutingPhaseDebugObjects)return;let phaseLabel=routingPhaseDebugLabels.get(routingPhasePlan),phaseName=routingPhasePlan.phaseName?.trim();db22.pcb_debug_object.insert({shape:"rect",center:{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},size:{width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY},label:`autorouting phase ${phaseLabel}${phaseName?` ${phaseName}`:""}`,subcircuit_id:this.subcircuit_id??void 0})},routingStages=routingPhasePlans.flatMap(routingPhasePlan=>{let resolvedPhaseAutorouterConfig=routingPhasePlan.autorouter?getPresetAutoroutingConfig(routingPhasePlan.autorouter,this.root?.platform):autorouterConfig2,preset=resolvedPhaseAutorouterConfig.preset,implicitPhaseLabel=routingPhasePlan.reroute?preset==="simplify"?"simplify":"reroute":routingPhasePlan.fanoutRegionPcbGroupId?routingPhasePlan.autorouter==="default"&&!routingPhasePlan.getPrecomputedRoutingResult?"breakout":"fanout":preset&&preset!=="default"?preset.replaceAll("_"," "):"default";routingPhaseDebugLabels.set(routingPhasePlan,routingPhasePlan.routingPhaseIndex?.toString()??implicitPhaseLabel);let phaseAutorouterConfig=routingPhasePlan.getPrecomputedRoutingResult?{...resolvedPhaseAutorouterConfig,allowViaInPad:(typeof routingPhasePlan.autorouter=="object"?routingPhasePlan.autorouter.allowViaInPad:void 0)??autorouterConfig2.allowViaInPad}:resolvedPhaseAutorouterConfig,stages=getLocalAutoroutingStages(routingPhasePlan.algorithmFn?{...phaseAutorouterConfig,algorithmFn:routingPhasePlan.algorithmFn}:phaseAutorouterConfig,this.root?.platform);return stages.map((stage,phaseStageIndex)=>({...stage,routingPhasePlan,phaseStageIndex,phaseStageCount:stages.length}))}),implicitPhaseLabelCounts=new Map;for(let plan of routingPhasePlans){if(plan.routingPhaseIndex!==null)continue;let label=routingPhaseDebugLabels.get(plan);implicitPhaseLabelCounts.set(label,(implicitPhaseLabelCounts.get(label)??0)+1)}let implicitPhaseLabelOrdinals=new Map;for(let plan of routingPhasePlans){if(plan.routingPhaseIndex!==null)continue;let label=routingPhaseDebugLabels.get(plan);if(implicitPhaseLabelCounts.get(label)<=1)continue;let ordinal=(implicitPhaseLabelOrdinals.get(label)??0)+1;implicitPhaseLabelOrdinals.set(label,ordinal),routingPhaseDebugLabels.set(plan,`${label} ${ordinal}`)}let fanoutPourNetMap=routingStages.some(({autorouterConfig:autorouterConfig22})=>["fanout","single_layer_fanout","dogbone"].includes(autorouterConfig22.preset??""))?Group_getFanoutPourNetMap(this,routingPhasePlans):void 0,{simpleRouteJson:baseSimpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db:db22,minTraceWidth,nominalTraceWidth,subcircuit_id:this.subcircuit_id,subcircuitComponent:this,fanoutPourNetMap}),emitFanoutBoundsConflictWarning=routingPhasePlan=>{let fanoutRegionPcbGroupId=routingPhasePlan.fanoutRegionPcbGroupId;if(!fanoutRegionPcbGroupId)return;let pcbGroup=db22.pcb_group.get(fanoutRegionPcbGroupId),sourceComponentId=db22.pcb_component.list().find(component=>component.pcb_group_id===fanoutRegionPcbGroupId)?.source_component_id;if(!sourceComponentId)return;let message=`${pcbGroup?.name??"Breakout"} defines conflicting fanout bounds with explicit breakout geometry and fanoutBoundaryPadding. Explicit breakout geometry takes precedence, so fanoutBoundaryPadding is ignored.`;db22.source_property_ignored_warning.list().some(warning=>warning.source_component_id===sourceComponentId&&warning.property_name==="fanoutBoundaryPadding"&&warning.message===message)||db22.source_property_ignored_warning.insert({source_component_id:sourceComponentId,property_name:"fanoutBoundaryPadding",message,error_type:"source_property_ignored_warning",subcircuit_id:pcbGroup?.subcircuit_id})},fanoutConfigByPhasePlan=new Map;for(let routingStage of routingStages){let fanoutMode=routingStage.autorouterConfig.preset;(fanoutMode==="fanout"||fanoutMode==="single_layer_fanout")&&!fanoutConfigByPhasePlan.has(routingStage.routingPhasePlan)&&fanoutConfigByPhasePlan.set(routingStage.routingPhasePlan,routingStage.autorouterConfig)}let fanoutPhaseRegions=[];for(let[routingPhasePlan,phaseAutorouterConfig]of fanoutConfigByPhasePlan){let fanoutRegionPcbGroupId=routingPhasePlan.fanoutRegionPcbGroupId;if(!fanoutRegionPcbGroupId)continue;let phaseSimpleRouteJson=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan);if(phaseSimpleRouteJson.connections.length===0)continue;phaseSimpleRouteJson=Group_applyDrcTolerancesToSimpleRouteJson(phaseSimpleRouteJson,routingPhasePlan.drcTolerances);let breakoutPoints=db22.pcb_breakout_point.list().filter(point62=>point62.pcb_group_id===fanoutRegionPcbGroupId).map(point62=>({x:point62.x,y:point62.y})),fanoutMode=phaseAutorouterConfig.preset,fanoutBounds=FanoutAutorouter.resolveFanoutBounds(phaseSimpleRouteJson,{mode:fanoutMode,busFanoutDirections:routingPhasePlan.busFanoutDirections,fanoutBounds:routingPhasePlan.fanoutBounds,fanoutBoundaryPadding:routingPhasePlan.fanoutBoundaryPadding,fanoutRoutingLayers:routingPhasePlan.fanoutRoutingLayers,allowBlindAndBuriedVias:phaseSimpleRouteJson.allowBlindAndBuriedVias,breakoutPoints,onFanoutBoundsConflict:()=>emitFanoutBoundsConflictWarning(routingPhasePlan)});if(routingPhasePlan.fanoutBounds=fanoutBounds,!fanoutBounds)continue;let pcbGroup=db22.pcb_group.get(fanoutRegionPcbGroupId),maximumTraceWidth=Math.max(phaseSimpleRouteJson.minTraceWidth,...phaseSimpleRouteJson.connections.map(connection=>connection.nominalTraceWidth??connection.width??phaseSimpleRouteJson.minTraceWidth)),viaPadDiameter=phaseSimpleRouteJson.minViaPadDiameter??phaseSimpleRouteJson.min_via_pad_diameter??phaseSimpleRouteJson.minViaDiameter,traceToPadClearance=phaseSimpleRouteJson.minTraceToPadEdgeClearance??phaseSimpleRouteJson.defaultObstacleMargin??maximumTraceWidth;fanoutPhaseRegions.push({regionId:fanoutRegionPcbGroupId,name:pcbGroup?.name??routingPhasePlan.phaseName??fanoutRegionPcbGroupId,bounds:fanoutBounds,boundaryKeepaway:getFanoutBoundaryPointSpacing({traceWidth:maximumTraceWidth,traceToPadClearance,viaPadDiameter})/2})}let fanoutSeparationConflict=findFanoutPhaseSeparationConflict(fanoutPhaseRegions);if(fanoutSeparationConflict){let{firstRegion,secondRegion,availableGap,requiredGap}=fanoutSeparationConflict,separationDescription=availableGap<0?`overlap by ${Math.abs(availableGap).toFixed(3)}mm`:`are only ${availableGap.toFixed(3)}mm apart`,message=`Fanout regions "${firstRegion.name}" and "${secondRegion.name}" ${separationDescription}, but at least ${requiredGap.toFixed(3)}mm of separation is required for a via-safe routing channel. Move the components farther apart or reduce their facing fanout padding.`;throw db22.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouter_error_subcircuit_${this.subcircuit_id}`,error_type:"pcb_autorouting_error",message}),this.root?.emit("autorouting:error",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),error:{message},simpleRouteJson:baseSimpleRouteJson}),new Error(message)}for(let{regionId,bounds}of fanoutPhaseRegions)db22.pcb_group.update(regionId,{center:{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY});let 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)},manualSourceTraceIds=new Set(this.getDescendants().filter(child=>child instanceof Trace&&!child.getSubcircuit()._isInflatedFromCircuitJson&&!!child._parsedProps.pcbPath?.length).map(trace=>trace.source_trace_id)),manualPcbTraceIds=new Set(db22.pcb_trace.list().filter(trace=>trace.source_trace_id&&manualSourceTraceIds.has(trace.source_trace_id)).map(trace=>trace.pcb_trace_id)),fixedTraceIds=new Set(manualPcbTraceIds),previousStageOutputSimpleRouteJson,skippedRemainingPhases=new Set;for(let[routingStageIndex,{routingPhasePlan,autorouterConfig:phaseAutorouterConfig,strategy:localAutorouterStrategy,usesPreviousStageOutput,phaseStageIndex,phaseStageCount}]of routingStages.entries()){if(skippedRemainingPhases.has(routingPhasePlan))continue;if(usesPreviousStageOutput||(previousStageOutputSimpleRouteJson=void 0),usesPreviousStageOutput&&previousStageOutputSimpleRouteJson===void 0)throw new Error("Autorouting follow-up stage is missing the preceding stage output");let simpleRouteJson=previousStageOutputSimpleRouteJson??baseSimpleRouteJson,isTraceSimplificationPhase=!!(routingPhasePlan.reroute&&phaseAutorouterConfig.preset==="simplify"),isRegionReroutePhase=!!(routingPhasePlan.reroute&&routingPhasePlan.region&&!isTraceSimplificationPhase),isConnectionReroutePhase=!!(routingPhasePlan.reroute&&!isTraceSimplificationPhase&&!routingPhasePlan.region&&routingPhasePlan.traces.length>0),isReroutePhase=isRegionReroutePhase||isConnectionReroutePhase||isTraceSimplificationPhase,rerouteOriginalSrj=isRegionReroutePhase?{...baseSimpleRouteJson,traces:[...existingRerouteSeedTraces,...outputTraces]}:null;if(!usesPreviousStageOutput&&isTraceSimplificationPhase)simpleRouteJson={...Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan),traces:getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:existingRerouteSeedTraces,stageOutputPcbTraces:outputTraces})};else if(!usesPreviousStageOutput&&isRegionReroutePhase&&rerouteOriginalSrj)simpleRouteJson=qse(rerouteOriginalSrj,{shape:"rect",...routingPhasePlan.region});else if(!usesPreviousStageOutput&&isConnectionReroutePhase){let phaseInput=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan);simpleRouteJson={...phaseInput,traces:[...phaseInput.traces??[],...outputTraces.filter(trace=>!traceMatchesRoutingPhase(trace,routingPhasePlan))]}}else if(!usesPreviousStageOutput&&hasPhasedAutorouting){let phaseInput=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan),activeCustomBreakoutRoutingGroupId=routingPhasePlan.routingPcbGroupId;if(activeCustomBreakoutRoutingGroupId){let activeGroupCopperPourObstacles=getSimpleRouteJsonFromCircuitJson({db:db22,minTraceWidth,nominalTraceWidth,subcircuit_id:this.subcircuit_id,subcircuitComponent:this,routingPcbGroupId:activeCustomBreakoutRoutingGroupId,fanoutPourNetMap}).simpleRouteJson.obstacles.filter(obstacle=>obstacle.isCopperPour),nonCopperPourObstacles=phaseInput.obstacles.filter(obstacle=>!obstacle.isCopperPour);phaseInput.obstacles=nonCopperPourObstacles.concat(activeGroupCopperPourObstacles)}simpleRouteJson={...phaseInput,traces:getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:phaseInput.traces??[],stageOutputPcbTraces:outputTraces})}}if(phaseAutorouterConfig.preset!=="bus_lanes"){let preservesManualTraceGeometry=!phaseAutorouterConfig.algorithmFn&&(phaseAutorouterConfig.preset==="fanout"||phaseAutorouterConfig.preset==="single_layer_fanout");simpleRouteJson=withFixedTraces(simpleRouteJson,preservesManualTraceGeometry?new Set([...fixedTraceIds].filter(pcbTraceId=>!manualPcbTraceIds.has(pcbTraceId))):fixedTraceIds)}simpleRouteJson=Group_applyDrcTolerancesToSimpleRouteJson(simpleRouteJson,routingPhasePlan.drcTolerances),simpleRouteJson.allowViaInPad=phaseAutorouterConfig.allowViaInPad;let getPrecomputedRoutingResult=usesPreviousStageOutput?void 0:routingPhasePlan.getPrecomputedRoutingResult,preflightRoutingCheckPolicy2=this.getInheritedProperty("preflightRoutingCheckPolicy");if(routingPhasePlan.isImplicitRemainingPhase&&phaseStageIndex===0&&this.getInheritedProperty("routeRemaining")===void 0&&(preflightRoutingCheckPolicy2==="basic"||preflightRoutingCheckPolicy2==="conservative")&&simpleRouteJson.connections.length>50){skippedRemainingPhases.add(routingPhasePlan),db22.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouting_error_remaining_routes_${this.subcircuit_id}`,subcircuit_id:this.subcircuit_id??void 0,error_type:"pcb_autorouting_error",message:`Remaining routes left unrouted (over 50 traces remaining and preflightRoutingCheckPolicy="${preflightRoutingCheckPolicy2}"). Set <board routeRemaining={true} /> or create <autoroutingphase /> elements for specific connections in the order you'd like to route them. The autorouter may hang unless you create autorouting phases incrementally.`});continue}let simplificationHasNoTraceInput=!!(isTraceSimplificationPhase&&simpleRouteJson.traces?.length===0);if((hasPhasedAutorouting||isReroutePhase||usesPreviousStageOutput)&&(simpleRouteJson.connections.length===0&&!isTraceSimplificationPhase&&!getPrecomputedRoutingResult||simplificationHasNoTraceInput)){phaseStageIndex===0&&emitRoutingPhaseDebugObject(routingPhasePlan,simpleRouteJson.bounds),previousStageOutputSimpleRouteJson=simpleRouteJson;continue}let phaseIsAutoJumperPreset=routingPhasePlan.autorouter!==void 0?this._isAutoJumperAutorouter(phaseAutorouterConfig):isAutoJumperPreset,phaseIsLaserPrefabPreset=routingPhasePlan.autorouter!==void 0?this._isLaserPrefabAutorouter(phaseAutorouterConfig):isLaserPrefabPreset;phaseIsAutoJumperPreset&&(simpleRouteJson.allowJumpers=!0,phaseAutorouterConfig.availableJumperTypes&&(simpleRouteJson.availableJumperTypes=phaseAutorouterConfig.availableJumperTypes));let fanoutMode=phaseAutorouterConfig.preset;if((fanoutMode==="fanout"||fanoutMode==="single_layer_fanout")&&!routingPhasePlan.fanoutRegionPcbGroupId&&!getPrecomputedRoutingResult&&(routingPhasePlan.fanoutBounds=FanoutAutorouter.resolveFanoutBounds(simpleRouteJson,{mode:fanoutMode,busFanoutDirections:routingPhasePlan.busFanoutDirections,fanoutBounds:routingPhasePlan.fanoutBounds,fanoutBoundaryPadding:routingPhasePlan.fanoutBoundaryPadding,fanoutRoutingLayers:routingPhasePlan.fanoutRoutingLayers,allowBlindAndBuriedVias:simpleRouteJson.allowBlindAndBuriedVias})),phaseStageIndex===0&&emitRoutingPhaseDebugObject(routingPhasePlan,routingPhasePlan.fanoutBounds??simpleRouteJson.bounds),debug132.enabled&&global.debugOutputArray?.push({name:`simpleroutejson-${this.props.name}.json`,obj:simpleRouteJson}),debug132.enabled){let graphicsObject=Go2(simpleRouteJson);graphicsObject.title=`autorouting-${this.props.name}`,global.debugGraphics?.push(graphicsObject)}let autorouterVersion22=phaseAutorouterConfig.autorouterVersion??this.props.autorouterVersion,effortLevel=this.props.autorouterEffortLevel,effort=effortLevel?Number.parseInt(effortLevel.replace("x",""),10):void 0,commonAutorouterOptions={capacityDepth:phaseAutorouterConfig.capacityDepth,targetMinCapacity:phaseAutorouterConfig.targetMinCapacity,platformConfig:this.root?.platform,useAssignableSolver:phaseIsLaserPrefabPreset||isSingleLayerBoard,useAutoJumperSolver:phaseIsAutoJumperPreset,useLaserPrefabSolver:phaseIsLaserPrefabPreset,autorouterVersion:autorouterVersion22,effort},autorouterName=getPrecomputedRoutingResult?"precomputed":phaseAutorouterConfig.algorithmFn?"custom":localAutorouterStrategy.name,solverName=getPrecomputedRoutingResult||phaseAutorouterConfig.algorithmFn?void 0:localAutorouterStrategy.getSolverName(commonAutorouterOptions),localAutoroutingCacheSolverOptions={autorouterName,solverName,capacityDepth:commonAutorouterOptions.capacityDepth,targetMinCapacity:commonAutorouterOptions.targetMinCapacity,useAssignableSolver:commonAutorouterOptions.useAssignableSolver,useAutoJumperSolver:commonAutorouterOptions.useAutoJumperSolver,useLaserPrefabSolver:commonAutorouterOptions.useLaserPrefabSolver,useTraceSimplificationSolver:phaseAutorouterConfig.preset==="simplify",autorouterVersion:commonAutorouterOptions.autorouterVersion,effort:commonAutorouterOptions.effort},cacheEngine=getPrecomputedRoutingResult||phaseAutorouterConfig.algorithmFn||!localAutorouterStrategy.cacheable?void 0:this.root?.platform?.localCacheEngine,cacheKey=cacheEngine?getLocalAutoroutingCacheKey(simpleRouteJson,localAutoroutingCacheSolverOptions):void 0,cachedResult=cacheKey?await getCachedLocalAutoroutingPhaseResult({cacheEngine,cacheKey}):null,cacheDisabledReason=getPrecomputedRoutingResult?"precomputed":phaseAutorouterConfig.algorithmFn?"custom_algorithm":localAutorouterStrategy.cacheable?cacheEngine?void 0:"no_cache_engine":"strategy_not_cacheable",autoroutingMetadata={routingPhaseIndex:routingPhasePlan.routingPhaseIndex,_actualRoutingPhaseOrderIndex:routingStageIndex,phaseOrdinal:routingStageIndex+1,phaseCount:routingStages.length,connectionCount:simpleRouteJson.connections.length,obstacleCount:simpleRouteJson.obstacles.length,previousTraceCount:simpleRouteJson.traces?.length??0,isReroutePhase,autorouterName,autorouterVersion:autorouterVersion22,solverName,effort,cacheStatus:cacheEngine?cachedResult?"hit":"miss":"disabled",cacheKey,cacheDisabledReason};this.root?.emit("autorouting:start",{type:"autorouting:start",subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},...autoroutingMetadata,simpleRouteJson});let autorouter;try{let traces,precomputedOutputSimpleRouteJson;if(getPrecomputedRoutingResult){let result=getPrecomputedRoutingResult(simpleRouteJson);traces=result.traces,precomputedOutputSimpleRouteJson=result.outputSimpleRouteJson;for(let trace of traces)fixedTraceIds.add(trace.pcb_trace_id)}else if(cachedResult)debug132(`[${this.getString()}] using cached local autorouting result`),traces=cachedResult.traces;else{if(phaseAutorouterConfig.algorithmFn?autorouter=await phaseAutorouterConfig.algorithmFn(simpleRouteJson):autorouter=localAutorouterStrategy.create({simpleRouteJson,onSolverEnded:event=>this.root?.emit("solver:ended",{...event,type:"solver:ended",componentName:this.getString()}),commonAutorouterOptions,busFanoutDirections:routingPhasePlan.busFanoutDirections,fanoutBounds:routingPhasePlan.fanoutBounds,fanoutRoutingLayers:routingPhasePlan.fanoutRoutingLayers,allowBlindAndBuriedVias:simpleRouteJson.allowBlindAndBuriedVias,componentNamesById:getPcbComponentNamesById(db22),onSolverStarted:({solverName:solverName2,solverParams,solverConstructorArgs})=>this.root?.emit("solver:started",{type:"solver:started",solverName:solverName2,solverParams,solverConstructorArgs,componentName:this.getString()})}),!autorouter)throw new Error("Failed to create local autorouter");let activeAutorouter=autorouter,routingPromise=new Promise((resolve,reject)=>{activeAutorouter.on("complete",event=>{debug132(`[${this.getString()}] local autorouting complete`),resolve(event.traces)}),activeAutorouter.on("error",event=>{debug132(`[${this.getString()}] local autorouting error: ${event.error.message}`),reject(event.error)})});activeAutorouter.on("progress",event=>{this.root?.emit("autorouting:progress",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},...autoroutingMetadata,...event,type:"autorouting:progress"})}),activeAutorouter.start(),traces=await routingPromise}let transformedSimpleRouteJson=precomputedOutputSimpleRouteJson??autorouter?.getOutputSimpleRouteJson?.();if(transformedSimpleRouteJson&&!usesPreviousStageOutput&&["fanout","single_layer_fanout","dogbone"].includes(phaseAutorouterConfig.preset??"")&&routingPhasePlan.routingPcbGroupId){let synchronizedFanout=Group_syncFanoutExitsWithGlobalConnections({fanoutInputSimpleRouteJson:simpleRouteJson,fanoutOutputSimpleRouteJson:transformedSimpleRouteJson,baseSimpleRouteJson,routingPhasePlan});baseSimpleRouteJson=synchronizedFanout.baseSimpleRouteJson,transformedSimpleRouteJson=synchronizedFanout.downstreamSimpleRouteJson;for(let synchronizedPoint of synchronizedFanout.synchronizedBreakoutPoints){let breakoutPoint=db22.pcb_breakout_point.list().find(point62=>point62.pcb_group_id===synchronizedPoint.routingPcbGroupId&&point62.source_trace_id===synchronizedPoint.sourceTraceId&&Math.abs(point62.x-synchronizedPoint.previousPoint.x)<=1e-6&&Math.abs(point62.y-synchronizedPoint.previousPoint.y)<=1e-6);breakoutPoint&&db22.pcb_breakout_point.update(breakoutPoint.pcb_breakout_point_id,{x:synchronizedPoint.fanoutExitPoint.x,y:synchronizedPoint.fanoutExitPoint.y,layer:synchronizedPoint.fanoutExitPoint.layer})}}if(localAutorouterStrategy.preserveOutputTraces)for(let trace of traces)fixedTraceIds.add(trace.pcb_trace_id);let stageOutputTraces=traces;transformedSimpleRouteJson?.traces?stageOutputTraces=transformedSimpleRouteJson.traces:usesPreviousStageOutput&&(stageOutputTraces=getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:simpleRouteJson.traces??[],stageOutputPcbTraces:traces}));let eventOutputPcbTraces=stageOutputTraces;!transformedSimpleRouteJson&&!usesPreviousStageOutput&&routingPhasePlan.routingPhaseIndex!==null&&(eventOutputPcbTraces=getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:simpleRouteJson.traces??[],stageOutputPcbTraces:traces}));let outputSimpleRouteJson={...transformedSimpleRouteJson??simpleRouteJson,traces:eventOutputPcbTraces};previousStageOutputSimpleRouteJson=transformedSimpleRouteJson?outputSimpleRouteJson:void 0,!cachedResult&&cacheKey&&await cacheLocalAutoroutingPhaseResult({cacheEngine,cacheKey,result:{...simpleRouteJson,traces}});let savedPhasePaths=getAutoroutingPhasePcbTracePaths({group:this.selectAll("group").find(group2=>group2.pcb_group_id===routingPhasePlan.fanoutRegionPcbGroupId)??routingPhasePlan.autoroutingPhase?.getGroup()??this,subcircuit:this,input:simpleRouteJson,traces,isFanout:["fanout","single_layer_fanout","dogbone"].includes(phaseAutorouterConfig.preset??"")});if(this.root?.emit("autorouting:end",{...savedPhasePaths,type:"autorouting:end",subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},...autoroutingMetadata,simpleRouteJson:outputSimpleRouteJson}),autorouter?.getConnectedOffboardObstacles){let connectedOffboardObstacles=autorouter.getConnectedOffboardObstacles();createSourceTracesFromOffboardConnections({db:db22,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=Jse(rerouteOriginalSrj,{...simpleRouteJson,traces:[...simpleRouteJson.traces??[],...traces]});outputTraces.splice(0,outputTraces.length,...reconnectedSrj.traces??[])}else if(isConnectionReroutePhase){let retainedPcbTraces=outputTraces.filter(trace=>!traceMatchesRoutingPhase(trace,routingPhasePlan));outputTraces.splice(0,outputTraces.length,...getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:retainedPcbTraces,stageOutputPcbTraces:stageOutputTraces}))}else{if(isTraceSimplificationPhase)for(let existingTrace of existingRerouteSeedTraces)fixedTraceIds.has(existingTrace.pcb_trace_id)||pcbTraceIdsToDelete.add(existingTrace.pcb_trace_id);outputTraces.splice(0,outputTraces.length,...getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:outputTraces,stageOutputPcbTraces:stageOutputTraces}))}}catch(error2){let{db:db32}=this.root;throw db32.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",{type:"autorouting:error",subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},...autoroutingMetadata,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]},this._markDirty("PcbTraceRender")}_startAsyncAutorouting(){this._hasStartedAsyncAutorouting||(this._hasStartedAsyncAutorouting=!0,this._getAutorouterConfig().local?this._queueAsyncEffect("autorouting",async()=>this._runLocalAutorouting()):this._queueAsyncEffect("make-http-autorouting-request",async()=>this._runEffectMakeHttpAutoroutingRequest()))}doInitialPcbTraceRender(){let debug132=(0,import_debug11.default)("tscircuit:core:doInitialPcbTraceRender");if(!this.isSubcircuit||this.root?.pcbDisabled||this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled")||this._isInflatedFromCircuitJson||this._isLegacyAutorouterDisabled()||this._shouldUseTraceByTraceRouting())return;if(!this._areChildSubcircuitsRouted()){debug132(`[${this.getString()}] child subcircuits are not routed, skipping async autorouting until subcircuits routed`);return}if(debug132(`[${this.getString()}] no child subcircuits to wait for, initiating async routing`),!this._hasTracesToRoute())return;let shouldSkipBecauseOfPlacementErrors=shouldSkipAutoroutingBecauseOfPlacementErrors({component:this,subcircuit:this}),shouldSkipBecauseOfTraceLengthViolations=shouldSkipAutoroutingBecauseOfTraceLengthViolations({component:this,subcircuit:this});shouldSkipBecauseOfPlacementErrors||shouldSkipBecauseOfTraceLengthViolations||this._startAsyncAutorouting()}doInitialSchematicTraceRender(){this._parsedProps.showAsSchematicBox||Group_doInitialSchematicTraceRender(this)}doInitialSchematicSheetRender(){Group_doInitialSchematicSheetRender(this)}updateSchematicSheetRender(){Group_updateSchematicSheetRender(this)}updatePcbTraceRender(){let debug132=(0,import_debug11.default)("tscircuit:core:updatePcbTraceRender");if(debug132(`[${this.getString()}] updating...`),!this.isSubcircuit||this._isInflatedFromCircuitJson||this._isLegacyAutorouterDisabled())return;if(this._shouldRouteAsync()&&this._hasTracesToRoute()&&!this._hasStartedAsyncAutorouting){if(this._areChildSubcircuitsRouted()){let shouldSkipBecauseOfPlacementErrors=shouldSkipAutoroutingBecauseOfPlacementErrors({component:this,subcircuit:this}),shouldSkipBecauseOfTraceLengthViolations=shouldSkipAutoroutingBecauseOfTraceLengthViolations({component:this,subcircuit:this});if(shouldSkipBecauseOfPlacementErrors||shouldSkipBecauseOfTraceLengthViolations)return;debug132(`[${this.getString()}] child subcircuits are now routed, starting async autorouting`),this._startAsyncAutorouting()}return}if(!this._asyncAutoroutingResult||this._shouldUseTraceByTraceRouting())return;let{db:db22}=this.root;if(this._asyncAutoroutingResult.output_simple_route_json){debug132(`[${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){debug132(`[${this.getString()}] updating PCB traces from ${this._asyncAutoroutingResult.output_pcb_traces.length} traces`),this._updatePcbTraceRenderFromPcbTraces();return}}_updatePcbTraceRenderFromSimpleRouteJson(){let{db:db22}=this.root,{traces:routedTraces}=this._asyncAutoroutingResult.output_simple_route_json;if(routedTraces)for(let routedTrace of routedTraces){let cjRoute=routedTrace.route.map(point62=>point62.route_type!=="through_obstacle"?point62:{route_type:"through_pad",start:point62.start,end:point62.end,start_layer:point62.from_layer,end_layer:point62.to_layer,width:point62.width,circuitJsonMetadata:point62.circuitJsonMetadata}),pcb_trace3=db22.pcb_trace.insert({subcircuit_id:this.subcircuit_id,route:getCircuitJsonPcbTraceRoute(cjRoute)});claimSrjAssignablePcbViasTraversedByRoute({db:db22,pcbTrace:pcb_trace3,routeWithSrjMetadata:cjRoute})}}_updatePcbTraceRenderFromPcbTraces(){let{output_pcb_traces,output_jumpers,pcb_trace_ids_to_be_replaced}=this._asyncAutoroutingResult;if(!output_pcb_traces)return;let{db:db22}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2),boardComponent=this._getBoard(),board=boardComponent?.pcb_board_id?db22.pcb_board.get(boardComponent.pcb_board_id):db22.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:db22,output_jumpers,subcircuit_id:this.subcircuit_id}),deleteExistingPcbTracesReplacedBy({group:this,outputPcbTraces:output_pcb_traces,pcbTraceIdsToReplace:pcb_trace_ids_to_be_replaced});let materializedPcbVias=db22.pcb_via.list(),jumperPadInfos=getJumperPadInfos(db22);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(point62=>point62.route_type!=="through_obstacle"?point62:{route_type:"through_pad",start:point62.start,end:point62.end,start_layer:point62.from_layer,end_layer:point62.to_layer,width:point62.width,circuitJsonMetadata:point62.circuitJsonMetadata}),routeSourceTraceId=getSourceTraceIdForRoutedTrace({db:db22,trace:{...pcb_trace3,route:cjRoute},subcircuit_id:this.subcircuit_id});cjRoute=ensureRouteStartsAtSourceTraceStart({db:db22,route:cjRoute,routeThicknessMode:pcb_trace3.route_thickness_mode,sourceTraceId:routeSourceTraceId}),pcb_trace3.route=cjRoute;let segments=splitPcbTracesOnJumperSegments(cjRoute);segments===null&&(segments=[cjRoute]);let processedSegments=addPortIdsToTracesAtJumperPads(segments,jumperPadInfos);for(let segment2 of processedSegments)if(segment2.length>0){let circuitJsonSegment=getCircuitJsonPcbTraceRoute(segment2),sourceTraceId=getSourceTraceIdForRoutedTrace({db:db22,trace:{...pcb_trace3,route:circuitJsonSegment},subcircuit_id:this.subcircuit_id}),insertedPcbTrace=db22.pcb_trace.insert({...pcb_trace3,source_trace_id:sourceTraceId,route:circuitJsonSegment});claimSrjAssignablePcbViasTraversedByRoute({db:db22,pcbTrace:insertedPcbTrace,routeWithSrjMetadata:segment2})}}for(let pcb_trace3 of output_pcb_traces)if(pcb_trace3.type!=="pcb_via"&&pcb_trace3.type==="pcb_trace"){let sourceTraceId=getSourceTraceIdForRoutedTrace({db:db22,trace:pcb_trace3,subcircuit_id:this.subcircuit_id}),{connection_name:inputConnectionName}=pcb_trace3,subcircuitConnectivityMapKey;if(sourceTraceId&&(subcircuitConnectivityMapKey=db22.source_trace.get(sourceTraceId)?.subcircuit_connectivity_map_key),!subcircuitConnectivityMapKey&&inputConnectionName){let sourceNet=db22.source_net.get(inputConnectionName);sourceNet&&(subcircuitConnectivityMapKey=sourceNet.subcircuit_connectivity_map_key)}for(let point62 of pcb_trace3.route)if(point62.route_type==="via"){let routedViaPoint=point62,fromLayer=point62.from_layer,toLayer=point62.to_layer,pcbVia={pcb_trace_id:pcb_trace3.pcb_trace_id,x:point62.x,y:point62.y,hole_diameter:routedViaPoint.via_hole_diameter??routedViaPoint.hole_diameter??routedViaHoleDiameter,outer_diameter:routedViaPoint.via_diameter??routedViaPoint.outer_diameter??routedViaPadDiameter,layers:getAutoroutedViaLayers({fromLayer,toLayer,layerCount:this._getSubcircuitLayerCount(),allowBlindAndBuriedVias:board?.allow_blind_and_buried_vias??!1,physicalLayers:routedViaPoint.layers}),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};if(materializedPcbVias.some(materializedPcbVia=>pcbViasSharePhysicalHole(materializedPcbVia,pcbVia)))continue;materializedPcbVias.push(db22.pcb_via.insert(pcbVia))}}}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db:db22}=this.root,{_parsedProps:props}=this,schematic_group3=db22.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.getDescendants())child.getGroup()?.source_group_id===this.source_group_id&&(child._parsedProps?.showAsSchematicBox||child.schematic_component_id&&db22.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(c22=>c22.source_component_id!==null&&c22._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:db22}=this.root,props=this._parsedProps;if(props.pcbX!==void 0||props.pcbY!==void 0){let parentGroup=this.parent?.getGroup?.(),pcbParentGroupId=parentGroup?.pcb_group_id?db22.pcb_group.get(parentGroup.pcb_group_id)?.pcb_group_id:void 0,positionedRelativeToBoardId=pcbParentGroupId?void 0:this._getBoard()?.pcb_board_id??void 0;db22.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:db22}=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?db22.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;db22.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 dx22=port.center.x-component.center.x,dy22=port.center.y-component.center.y;return Math.abs(dx22)>Math.abs(dy22)?dx22>0?"right":"left":dy22>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)}_isLegacyAutorouterDisabled(){return getDisabledLegacyAutorouterPreset(this)!==null}_isLaserPrefabAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize4=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="laser_prefab"?!0:typeof autorouterProp2=="string"?normalize4(autorouterProp2)==="laser_prefab":typeof autorouterProp2=="object"&&autorouterProp2?normalize4(autorouterProp2.preset)==="laser_prefab":!1}_isAutoJumperAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize4=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="auto_jumper"?!0:typeof autorouterProp2=="string"?normalize4(autorouterProp2)==="auto_jumper":typeof autorouterProp2=="object"&&autorouterProp2?normalize4(autorouterProp2.preset)==="auto_jumper":!1}_getSubcircuitLayerCount(){let layers=this.getInheritedProperty("layers");return typeof layers=="number"?layers:2}_shouldUseTraceByTraceRouting(){return getDisabledLegacyGroupAutorouterPreset(this)?!1:this._getAutorouterConfig().groupMode==="sequential-trace"}doInitialPcbDesignRuleChecks(){if(this.root?.pcbDisabled||this._isLegacyAutorouterDisabled()||this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"))return;let{db:db22}=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 Trace),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.`;db22.pcb_trace_error.insert({error_type:"pcb_trace_error",message,source_trace_id:"",pcb_trace_id:"",pcb_component_ids:components.map(c22=>c22.pcb_component_id).filter(Boolean),pcb_port_ids:[]})}}}Group_doInitialStandaloneSubcircuitPcbDesignRuleChecks(this)}doInitialSchematicLabelNetsWithConflictingNames(){this.root?.schematicDisabled||this.getTopLevelRenderable()===this&&assignSchematicNetLabelSuperscripts(this.root.db)}updateSchematicLabelNetsWithConflictingNames(){this.doInitialSchematicLabelNetsWithConflictingNames()}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled||!this.isSubcircuit)return;let{db:db22}=this.root,subtree=db22;for(let nl3 of subtree.schematic_net_label.list()){let net=subtree.source_net.get(nl3.source_net_id),text=nl3.text||net?.name||"",isGroundNet=net?.is_ground||GROUND_NET_REGEX.test(text),isPowerNet=net?.is_power||POWER_NET_REGEX.test(text);if(nl3.anchor_side==="top"&&isGroundNet){subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_down"});continue}nl3.anchor_side==="bottom"&&isPowerNet&&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 group2=new Group5(groupProps2);return group2._isInflatedFromCircuitJson=!0,group2.source_group_id=sourceGroup.source_group_id,groupsMap&&groupsMap.set(sourceGroup.source_group_id,group2),sourceGroup.parent_source_group_id&&groupsMap?.has(sourceGroup.parent_source_group_id)?groupsMap.get(sourceGroup.parent_source_group_id).add(group2):subcircuit.add(group2),group2}var Inductor2=class extends NormalComponent{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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({name:this.name,ftype:FTYPE.simple_inductor,inductance:this.props.inductance,max_current_rating:props.maxCurrentRating===void 0?void 0:parseAndConvertSiUnit(props.maxCurrentRating,"A").value,display_inductance:this._getSchematicSymbolDisplayValue(),supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,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 generatedNotes=new WeakMap,getPolarity2=port=>{let hints=[port.name,...port.port_hints??[]].map(hint=>hint.toLowerCase().replace(/[^a-z0-9+-]/g,"")),anode=hints.some(hint=>["a","anode","pos","positive","+"].includes(hint)),cathode=hints.some(hint=>["k","c","cathode","neg","negative","-"].includes(hint));return anode===cathode?null:anode?"anode":"cathode"},Led_addPolarityFabricationSymbol=led2=>{let root=led2.root;if(!root)return;let{db:db22}=root,previous=generatedNotes.get(led2);for(let path of previous??[])db22.pcb_fabrication_note_path.delete(path.pcb_fabrication_note_path_id);if(generatedNotes.delete(led2),root.pcbDisabled||!led2.pcb_component_id)return;let pcb=db22.pcb_component.get(led2.pcb_component_id);if(!pcb||pcb.layer!=="top"&&pcb.layer!=="bottom")return;let ports=db22.source_port.list({source_component_id:led2.source_component_id}),anodes=ports.filter(port=>getPolarity2(port)==="anode"),cathodes=ports.filter(port=>getPolarity2(port)==="cathode");if(anodes.length!==1||cathodes.length!==1)return;let anode=anodes[0],cathode=cathodes[0],a22=db22.pcb_port.getWhere({source_port_id:anode.source_port_id}),k22=db22.pcb_port.getWhere({source_port_id:cathode.source_port_id});if(!a22||!k22)return;let distance27=Math.hypot(k22.x-a22.x,k22.y-a22.y);if(distance27<1e-6)return;let angle=Math.atan2(k22.y-a22.y,k22.x-a22.x),frame=compose2(translate2((a22.x+k22.x)/2,(a22.y+k22.y)/2),rotate2(angle)),point62=(x22,y22)=>applyToPoint2(frame,{x:x22,y:y22}),common={pcb_component_id:pcb.pcb_component_id,subcircuit_id:led2.getSubcircuit()?.subcircuit_id??void 0,layer:pcb.layer},notes=[];generatedNotes.set(led2,notes);let halfLength=Math.min(distance27*.2,.4),halfHeight=halfLength*.75,routes=[[point62(-distance27/2,0),point62(-halfLength,0)],[point62(-halfLength,-halfHeight),point62(halfLength,0),point62(-halfLength,halfHeight),point62(-halfLength,-halfHeight)],[point62(halfLength,-halfHeight),point62(halfLength,halfHeight)],[point62(halfLength,0),point62(distance27/2,0)]];for(let route of routes)notes.push(db22.pcb_fabrication_note_path.insert({...common,route,stroke_width:.08}))},Led=class extends NormalComponent{get config(){let symbolMap={laser:"laser_diode"},variantSymbol=this.props.laser?"laser":null,baseSymbolName=variantSymbol?symbolMap[variantSymbol]:this.props.symbolName??"led",compactSize=this.props.schSize==="sm"||this.props.schSize==="xs"?this.props.schSize:void 0,compactSymbolName=compactSize&&baseSymbolName==="led"?`led_${compactSize}`:void 0;return{schematicSymbolName:compactSymbolName&&`${compactSymbolName}_right`in zh?compactSymbolName:baseSymbolName,componentName:"Led",zodProps:ledProps,sourceFtype:"simple_led"}}initPorts(){let hasFootprintChild=this.children.some(child=>child.componentName==="Footprint"),footprint=this.resolveFootprint(),hasPinLabels=!!this._resolvePinLabels(),shouldAddDefaultAliases=!hasPinLabels&&!hasFootprintChild&&(!footprint||isFootprinterString(footprint));super.initPorts({pinCount:2,ignoreSymbolPorts:!hasPinLabels&&!shouldAddDefaultAliases,additionalAliases:{pin1:shouldAddDefaultAliases?["anode","pos","left"]:[],pin2:shouldAddDefaultAliases?["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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.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}get pos(){return this.portMap.pos}doInitialPcbComponentSizeCalculation(){super.doInitialPcbComponentSizeCalculation(),Led_addPolarityFabricationSymbol(this)}get anode(){return this.portMap.anode}get neg(){return this.portMap.neg}get cathode(){return this.portMap.cathode}};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)}var possibleOrientations=[{gate:"left",drain:"top",source:"bottom"},{gate:"left",drain:"bottom",source:"top"},{gate:"right",drain:"top",source:"bottom"},{gate:"right",drain:"bottom",source:"top"},{gate:"top",drain:"left",source:"right"},{gate:"top",drain:"right",source:"left"},{gate:"bottom",drain:"left",source:"right"},{gate:"bottom",drain:"right",source:"left"}],getBaselineOrientation=rotation5=>{let normalizedRotation=(rotation5%360+360)%360;if(normalizedRotation%90!==0)throw new Error(`Schematic rotation ${rotation5} is not supported for Mosfet`);return[{gate:"left",drain:"top",source:"bottom"},{gate:"top",drain:"right",source:"left"},{gate:"right",drain:"bottom",source:"top"},{gate:"bottom",drain:"left",source:"right"}][normalizedRotation/90]},getRequestedOrientation=props=>{let requestedSides={drain:props.symbolDrainSide,source:props.symbolSourceSide,gate:props.symbolGateSide},baseline=getBaselineOrientation(Number(props.schRotation??0)),matchingOrientations=possibleOrientations.filter(orientation22=>Object.keys(requestedSides).every(portName=>requestedSides[portName]===void 0||requestedSides[portName]===orientation22[portName]));if(matchingOrientations.length===0){let requestedDescription=Object.entries(requestedSides).filter(([,side])=>side!==void 0).map(([portName,side])=>`${portName}=${side}`).join(", ");throw new Error(`Invalid MOSFET symbol port side combination (${requestedDescription}). The gate must be perpendicular to the drain and source, and the drain and source must be opposite.`)}return matchingOrientations.sort((a22,b22)=>{let score=orientation22=>Object.keys(baseline).filter(portName=>orientation22[portName]!==baseline[portName]).length;return score(a22)-score(b22)})[0]},getMosfetSchematicSymbolName=props=>{let mosfetMode=props.mosfetMode==="depletion"?"d":"e",baseSymbolName=`${props.channelType}_channel_${mosfetMode}_mosfet_transistor`;if(!(props.symbolDrainSide!==void 0||props.symbolSourceSide!==void 0||props.symbolGateSide!==void 0))return baseSymbolName;let{gate,drain}=getRequestedOrientation(props);return`${baseSymbolName}_gate_${gate}_drain_${drain}`},Mosfet2=class extends NormalComponent{get config(){return{componentName:"Mosfet",schematicSymbolName:this.props.symbolName??getMosfetSchematicSymbolName(this.props),zodProps:mosfetProps,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_mosfet",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,mosfet_mode:props.mosfetMode,channel_type:props.channelType,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceMosfet(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}),mosfet=new Mosfet2({name:sourceElm.name,channelType:sourceElm.channel_type,mosfetMode:sourceElm.mosfet_mode,manufacturerPartNumber:sourceElm.manufacturer_part_number,supplierPartNumbers:sourceElm.supplier_part_numbers??void 0,displayName:sourceElm.display_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:mosfet});footprint&&mosfet.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(mosfet):subcircuit.add(mosfet)}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:db22}=root,pcb_port3=db22.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 NormalComponent{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=zh[this._getSchematicSymbolNameOrThrow()],symPort1=symbol.ports.find(p22=>p22.labels.includes("1")),symPort2=symbol.ports.find(p22=>p22.labels.includes("2")),ports=this.selectAll("port"),pin1Port=ports.find(port=>port.props.pinNumber===1);pin1Port.schematicSymbolPortDef=symPort1;let firstTerminalPorts=new Set(pin1Port._getPortsInternallyConnectedToThisPort()),secondTerminalPort=ports.filter(port=>port!==pin1Port&&!firstTerminalPorts.has(port)).sort((a22,b22)=>(a22.props.pinNumber??0)-(b22.props.pinNumber??0))[0];secondTerminalPort&&(secondTerminalPort.schematicSymbolPortDef=symPort2)}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({name:this.name,ftype:FTYPE.simple_push_button,supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,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 NormalComponent{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){let baseSymbolName=this.props.symbolName??"boxresistor",compactSize=this.props.schSize==="sm"||this.props.schSize==="xs"?this.props.schSize:void 0,compactSymbolName=compactSize&&(baseSymbolName==="boxresistor"||baseSymbolName==="resistor")?`${baseSymbolName}_${compactSize}`:void 0;return{componentName:"Resistor",schematicSymbolName:compactSymbolName&&`${compactSymbolName}_right`in zh?compactSymbolName:baseSymbolName,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 Trace({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pullupFor})),this.add(new Trace({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pullupTo}))),this.props.pulldownFor&&this.props.pulldownTo&&(this.add(new Trace({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pulldownFor})),this.add(new Trace({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pulldownTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.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 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 NormalComponent{_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:db22}=this.root,props=this._parsedProps??{},source_component=db22.source_component.insert({ftype:"simple_switch",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,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:db22}=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),db22.simulation_switch.insert(simulationSwitch)}},getImportedSwitchProps=(sourceElm,inflatorContext)=>{let sourcePorts=inflatorContext.injectionDb.source_port.list().filter(port=>port.source_component_id===sourceElm.source_component_id),pinLabels={},highestPinNumber=0;for(let sourcePort of sourcePorts){let pinNumber=sourcePort.pin_number;if(pinNumber==null)continue;highestPinNumber=Math.max(highestPinNumber,pinNumber);let labels=Array.from(new Set([sourcePort.name,...sourcePort.port_hints??[]].filter(label=>typeof label=="string"&&label.length>0)));labels.length>0&&(pinLabels[`pin${pinNumber}`]=labels)}let type="spst";return highestPinNumber>=5?type="dpdt":highestPinNumber===4?type="dpst":highestPinNumber===3&&(type="spdt"),{type,pinLabels:Object.keys(pinLabels).length>0?pinLabels:void 0}};function inflateSourceSwitch(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}),importedSwitchProps=getImportedSwitchProps(sourceElm,inflatorContext),switchComponent=new Switch({name:sourceElm.name,displayName:sourceElm.display_name,...importedSwitchProps,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:switchComponent});footprint&&switchComponent.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(switchComponent):subcircuit.add(switchComponent)}function pcbTraceRouteToPcbPath(route){if(route.length<=2)return[];let firstPoint=route[0],lastPoint=route[route.length-1];return route.slice(1,-1).filter(point62=>{let position4=getRoutePointPosition(point62),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(point62=>{if(point62.route_type==="via")return{x:point62.x,y:point62.y,via:!0,fromLayer:point62.from_layer,toLayer:point62.to_layer};let position4=getRoutePointPosition(point62);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&¤tGroupId!==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(pt22=>pt22.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 Trace(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 SHORT_ALIASES={collector:["c"],base:["b"],emitter:["e"]},Transistor=class extends NormalComponent{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 additionalAliases={},symbol=this.getSchematicSymbol();for(let symPort of symbol?.ports??[]){let pinNumber=getPinNumberFromLabels(symPort.labels);if(pinNumber)for(let label of symPort.labels){let shortAliases=SHORT_ALIASES[label];shortAliases&&(additionalAliases[`pin${pinNumber}`]=shortAliases)}}super.initPorts({pinCount:3,additionalAliases})}get collector(){return this.portMap.collector}get base(){return this.portMap.base}get emitter(){return this.portMap.emitter}doInitialCreateNetsFromProps(){this._createNetsFromProps([...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_transistor",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,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","pcb_hole","pcb_plated_hole","pcb_cutout"],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(point62=>point62.route_type==="via"&&Math.abs(point62.x-elm.x)<1e-4&&Math.abs(point62.y-elm.y)<1e-4))}return elm.type==="pcb_cutout"?!0:"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(g22=>!g22.parent_source_group_id||renderedGroupIds.has(g22.parent_source_group_id));if(groupIndex===-1){let remainingIds=groupsToRender.map(g22=>g22.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_connector":inflateSourceConnector(sourceComponent,inflationCtx);break;case"simple_transistor":inflateSourceTransistor(sourceComponent,inflationCtx);break;case"simple_mosfet":inflateSourceMosfet(sourceComponent,inflationCtx);break;case"simple_push_button":inflateSourcePushButton(sourceComponent,inflationCtx);break;case"simple_switch":inflateSourceSwitch(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)};function createCircuitJsonDatabase(){if(typeof cju_indexed_default!="function")return cju_default([]);let indexed=cju_indexed_default([],{indexConfig:{byId:!0,byType:!0}});return typeof indexed.insert!="function"||typeof indexed.insertAll!="function"||typeof indexed.subtree!="function"?cju_default([]):indexed}var 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,"_featurePcbViaStitching",!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,"_hasRenderLifecycleListeners",!1);__publicField(this,"_eventListeners",{});this.children=[],this.db=createCircuitJsonDatabase(),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_react7.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 findBoard=components=>{for(let child of components){if(child.componentName==="Board")return child;if(isAssemblyDeviceContainer(child)){let nested=findBoard(child.children);if(nested)return nested}}};return findBoard(this.children)}_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||isAssemblyDeviceContainer(this.children[0]))){this.firstChild=this.children[0];return}let group2=new Group5({subcircuit:!0});group2.parent=this,group2.addAll(this.children),this.children=[group2],this.firstChild=group2}render(){this.firstChild||this._guessRootComponent();let{firstChild,db:db22}=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=>{let resume=()=>{clearTimeout(timer),this.removeListener("asyncEffect:end",resume),resolve()},timer=setTimeout(resume,100);this.on("asyncEffect:end",resume),this._hasUnrenderedUpdatesFromAsyncEffects&&resume()}),(this._hasUnrenderedUpdatesFromAsyncEffects||this._asyncEffectPhaseById.size===0)&&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(e210=>{throw new Error(`To use circuit.getSvg, you must install the "circuit-to-svg" package.
|
|
953
|
+
`)}`)}catch(error2){debug12(`Failed to convert circuit JSON to SPICE: ${error2}`),root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperimentId,error_type:"simulation_unknown_experiment_error",message:error2 instanceof Error?error2.message:String(error2)});continue}let voltageProbeByGraphName=new Map,voltageProbeById=new Map,graphDisplayOverridesByProbeId=new Map;for(let probe of voltageProbes)probe.finalProbeName&&voltageProbeByGraphName.set(probe.finalProbeName,probe),probe.simulation_voltage_probe_id&&(voltageProbeById.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 scopedCurrentProbeIds=new Set(ammeters.map(ammeter=>ammeter.simulation_current_probe_id).filter(simulationCurrentProbeId=>!!simulationCurrentProbeId)),currentProbeById=new Map,currentProbeByName=new Map;for(let probe of root.db.simulation_current_probe.list().filter(probe2=>scopedCurrentProbeIds.has(probe2.simulation_current_probe_id)))currentProbeById.set(probe.simulation_current_probe_id,probe),probe.name!==void 0&¤tProbeByName.set(probe.name,probe);let orderedSimulationProbes=root.db.simulation_voltage_probe.list().filter(probe=>voltageProbeById.has(probe.simulation_voltage_probe_id)),firstSpiceNetlist=simulationRuns[0]?.spiceNetlist,graphNamesFromNetlist=firstSpiceNetlist?getTransientVoltageGraphNamesFromSpiceNetlist(firstSpiceNetlist):[];if(graphNamesFromNetlist.length===orderedSimulationProbes.length)for(let[simulationProbeIndex,simulationProbe]of orderedSimulationProbes.entries()){let probe=voltageProbeById.get(simulationProbe.simulation_voltage_probe_id),graphName=graphNamesFromNetlist[simulationProbeIndex];probe&&graphName&&voltageProbeByGraphName.set(graphName,probe)}else debug12(`Skipping probe-to-graph order mapping because counts differ: probes=${orderedSimulationProbes.length} graphNames=${graphNamesFromNetlist.length}`);let engineName=analogSimulation.getSpiceEngineName()??"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(spiceEngineName=>spiceEngineName!=="spicey"))}`);let effectId=`spice-simulation-${engineName}-${simulationExperimentId}`;debug12(`Queueing simulation for spice engine: ${engineName} (id: ${effectId})`),group2._queueAsyncEffect(effectId,async()=>{try{let insertedVoltageGraphs=[],insertedCurrentGraphs=[];for(let simulationRun of simulationRuns){debug12(`Running simulation with engine: ${engineName}`);let simulationResult=await spiceEngine2.simulate(simulationRun.spiceString);debug12(`Simulation completed, received ${simulationResult.simulationResultCircuitJson.length} elements`);for(let simulationResultCircuitElement of simulationResult.simulationResultCircuitJson){if(!isCircuitElementInput(simulationResultCircuitElement)){debug12("Skipping invalid simulation result element");continue}let simulationResultWithSweepCoordinate=attachSweepCoordinateToSimulationResult({simulationResult:simulationResultCircuitElement,simulationParameterSweepCoordinate:simulationRun.simulationParameterSweepCoordinate});if(isVoltageGraph(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=simulationResultWithSweepCoordinate.name?voltageProbeByGraphName.get(simulationResultWithSweepCoordinate.name):void 0;probeMatch&&(simulationResultWithSweepCoordinate.color=probeMatch.color??void 0,simulationResultWithSweepCoordinate.source_probe_id=probeMatch.simulation_voltage_probe_id??void 0)}else if(isSimulationVoltageResult(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=voltageProbeById.get(simulationResultWithSweepCoordinate.simulation_voltage_probe_id)??(simulationResultWithSweepCoordinate.name?voltageProbeByGraphName.get(simulationResultWithSweepCoordinate.name):void 0);probeMatch?.simulation_voltage_probe_id&&(simulationResultWithSweepCoordinate.color=probeMatch.color??void 0,simulationResultWithSweepCoordinate.simulation_voltage_probe_id=probeMatch.simulation_voltage_probe_id)}if(isCurrentGraph2(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=(simulationResultWithSweepCoordinate.source_probe_id?currentProbeById.get(simulationResultWithSweepCoordinate.source_probe_id):void 0)??(simulationResultWithSweepCoordinate.name?currentProbeByName.get(simulationResultWithSweepCoordinate.name):void 0);probeMatch&&(simulationResultWithSweepCoordinate.color=probeMatch.color,simulationResultWithSweepCoordinate.source_probe_id=probeMatch.simulation_current_probe_id)}else if(isSimulationCurrentResult(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=currentProbeById.get(simulationResultWithSweepCoordinate.simulation_current_probe_id)??(simulationResultWithSweepCoordinate.name?currentProbeByName.get(simulationResultWithSweepCoordinate.name):void 0);probeMatch&&(simulationResultWithSweepCoordinate.color=probeMatch.color,simulationResultWithSweepCoordinate.simulation_current_probe_id=probeMatch.simulation_current_probe_id)}let insertedSimulationResult=root.db.insert(simulationResultWithSweepCoordinate);isVoltageGraph(insertedSimulationResult)&&insertedVoltageGraphs.push({type:"voltage",graph:insertedSimulationResult}),isCurrentGraph2(insertedSimulationResult)&&insertedCurrentGraphs.push({type:"current",graph:insertedSimulationResult}),debug12(`Inserted ${simulationResultWithSweepCoordinate.type} into database`)}}analogSimulation.usesIndependentGraphAxes()&&insertIndependentAxisScopeTraces({db:root.db,graphs:[...insertedVoltageGraphs,...insertedCurrentGraphs],graphDisplayOverridesByProbeId}),group2._markDirty("SimulationSpiceEngineRender")}catch(error2){debug12(`Simulation failed for engine ${engineName}: ${error2}`),root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperimentId,error_type:"simulation_unknown_experiment_error",message:error2 instanceof Error?error2.message:String(error2)})}})}}function Group_doInitialSourceAddConnectivityMapKey(group2){if(!group2.isSubcircuit)return;let{db:db22}=group2.root,traces=group2.selectAll("trace"),vias=group2.selectAll("via"),nets=group2.selectAll("net"),connMap=new ConnectivityMap({});connMap.addConnections(traces.map(t48=>{let source_trace3=db22.source_trace.get(t48.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(c22=>c22!==null));let sourceNets=db22.source_net.list().filter(net=>net.subcircuit_id===group2.subcircuit_id);for(let sourceNet of sourceNets)connMap.addConnections([[sourceNet.source_net_id]]);let{name:subcircuitName}=group2._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${group2.subcircuit_id??group2.source_group_id??group2._renderId}`}_${connNetId}`,db22.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=db22.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${group2.subcircuit_id??group2.source_group_id??group2._renderId}`}_${connNetId}`;db22.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=db22.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${group2.subcircuit_id??group2.source_group_id??group2._renderId}`}_${connNetId}`;db22.source_net.update(netId,{subcircuit_connectivity_map_key:connectivityMapKey});let netInstance=nets.find(n22=>n22.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)}}var Group_doInitialStandaloneSubcircuitPcbDesignRuleChecks=group2=>{let isRootSubcircuit=group2.root?.firstChild===group2;if(!group2.isSubcircuit||!isRootSubcircuit||group2._getBoard())return;let routingDisabled=group2.root?.pcbRoutingDisabled||group2.getInheritedProperty("routingDisabled"),drcChecksDisabled=group2.root?.platform?.drcChecksDisabled??group2.getInheritedProperty("drcChecksDisabled"),routingDrcChecksDisabled=group2.root?.platform?.routingDrcChecksDisabled??group2.getInheritedProperty("routingDrcChecksDisabled");if(group2.root?.pcbDisabled||routingDisabled||drcChecksDisabled||routingDrcChecksDisabled||group2._hasIncompleteAsyncEffectsInSubtreeForPhase("PcbTraceRender")||group2._hasTracesToRoute()&&!group2._areChildSubcircuitsRouted()||group2._standaloneSubcircuitDrcChecksComplete||group2._standaloneSubcircuitDrcChecksInProgress)return;let{db:db22}=group2.root,subcircuitCircuitJson=db22.subtree({subcircuit_id:group2.subcircuit_id}).toArray();group2._standaloneSubcircuitDrcChecksInProgress=!0,group2._queueAsyncEffect("standalone-subcircuit:routing-drc-checks",async()=>{try{let results=await runAllRoutingChecks(subcircuitCircuitJson);db22.insertAll(dedupePcbDrcErrors(results)),group2._standaloneSubcircuitDrcChecksComplete=!0}finally{group2._standaloneSubcircuitDrcChecksInProgress=!1}})},addPourNetMap=(target,pourNetMap)=>{for(let[layer,netOrNets]of Object.entries(pourNetMap)){if(!netOrNets)continue;let nets=Array.isArray(netOrNets)?netOrNets:[netOrNets],layerNets=target.get(layer)??new Set;for(let net of nets)layerNets.add(net);target.set(layer,layerNets)}},toFanoutPourNetMap=netsByLayer=>Object.fromEntries(Array.from(netsByLayer,([layer,nets])=>[layer,nets.size===1?Array.from(nets)[0]:Array.from(nets)])),Group_getFanoutPourNetMap=(group2,routingPhasePlans)=>{let explicitMaps=routingPhasePlans.map(plan=>plan.fanoutPourNetMap).filter(map=>map!==void 0),netsByLayer=new Map;if(explicitMaps.length>0){for(let explicitMap of explicitMaps)addPourNetMap(netsByLayer,explicitMap);return toFanoutPourNetMap(netsByLayer)}let scope=group2;for(;scope;){if(scope.isSubcircuit){let subcircuit=scope,copperPours=subcircuit.selectAll("copperpour");for(let copperPour of copperPours){if(copperPour.getSubcircuit()!==subcircuit)continue;let{layer,connectsTo}=copperPour._parsedProps;addPourNetMap(netsByLayer,{[layer]:connectsTo})}}scope=scope.parent}return netsByLayer.size>0?toFanoutPourNetMap(netsByLayer):void 0},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:db22}=this.root;return db22.source_trace.list().find(st22=>st22.connected_source_port_ids.includes(port.source_port_id))?.source_trace_id}_getSourceNetIdForPort(port){let{db:db22}=this.root;return db22.source_trace.list().find(st22=>st22.connected_source_port_ids.includes(port.source_port_id))?.connected_source_net_ids[0]}_renderPcbBreakoutPoint({layer}={}){if(this.pcb_breakout_point_id||this.root?.pcbDisabled)return;let{db:db22}=this.root,position4=this._getGlobalPcbPositionBeforeLayout(),group2=this.parent?.getGroup(),subcircuit=this.getSubcircuit();if(!group2||!group2.pcb_group_id)return;let pcb_breakout_point3=db22.pcb_breakout_point.insert({pcb_group_id:group2.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,layer,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:db22}=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),db22.pcb_breakout_point.update(this.pcb_breakout_point_id,updatedProperties)}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db22}=this.root;if(!this.pcb_breakout_point_id)return;let point62=db22.pcb_breakout_point.get(this.pcb_breakout_point_id);point62&&db22.pcb_breakout_point.update(this.pcb_breakout_point_id,{x:point62.x+deltaX,y:point62.y+deltaY})}getPcbSize(){return{width:0,height:0}}},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()}},SavedFanoutPoint=class extends BreakoutPoint{constructor(){super(...arguments);__publicField(this,"exitLayer","top")}doInitialPcbPrimitiveRender(){this._matchConnection(),this._renderPcbBreakoutPoint({layer:this.exitLayer})}};function getSavedFanoutTraces(breakout,input2){let{db:db22}=breakout.root,boardLayers=getViaBoardLayers(input2.layerCount),coveredConnections=new Set,exits=breakout.children.filter(child=>child instanceof SavedFanoutPoint),traces=(breakout._parsedProps.pcbTracePaths??[]).map((path,pathIndex)=>{for(let point62 of path.route)if((point62.route_type==="wire"?[point62.layer]:[point62.from_layer,point62.to_layer]).some(layer=>!boardLayers.includes(layer)))throw new Error(`Saved fanout path "${path.connection}" uses a layer unavailable on this board`);let exit=exits[pathIndex],port=exit.matchedPort,connection=input2.connections.find(connection2=>connection2.pointsToConnect.some(point62=>point62.pcb_port_id===port.pcb_port_id));if(!connection)throw new Error(`No fanout connection for saved path "${path.connection}"`);let pcbExit=db22.pcb_breakout_point.get(exit.pcb_breakout_point_id),localExit=path.route.at(-1),transform7=compose2(exit._computePcbGlobalTransformBeforeLayout(),translate2(-localExit.x,-localExit.y)),originalExit=applyToPoint2(transform7,localExit),route=resolveSavedTraceRouteWidths(path.route).map(point62=>{let position4=applyToPoint2(transform7,point62);return{...point62,x:position4.x+pcbExit.x-originalExit.x,y:position4.y+pcbExit.y-originalExit.y}}),first=route[0],firstLayer=first.route_type==="wire"?first.layer:first.from_layer,portPosition=port._getGlobalPcbPositionAfterLayout();if(Math.hypot(first.x-portPosition.x,first.y-portPosition.y)>1e-4||!port.getAvailablePcbLayers().includes(firstLayer))throw new Error(`Saved fanout path "${path.connection}" must start at its PCB port on an available layer`);if(first.route_type==="via"&&!input2.allowViaInPad)throw new Error(`Saved fanout path "${path.connection}" starts with a via at a pad; enable allowViaInPad`);let last=route.at(-1),lastLayer=last.route_type==="wire"?last.layer:last.to_layer,endpoints=[{...first,layer:firstLayer},{...last,layer:lastLayer}];if(connection.pointsToConnect.some(point62=>!endpoints.some(endpoint=>Math.hypot(point62.x-endpoint.x,point62.y-endpoint.y)<1e-4&&point62.layer===endpoint.layer)))throw new Error(`Saved fanout path "${path.connection}" does not cover its connection endpoints`);let startContactWidths=getSavedTraceViaContactWidths(route,0,input2.minTraceWidth),endContactWidths=getSavedTraceViaContactWidths(route,route.length-1,input2.minTraceWidth);return first.route_type==="via"&&(route.splice(1,0,{route_type:"wire",x:first.x,y:first.y,layer:first.to_layer,width:startContactWidths.toWidth}),route.unshift({route_type:"wire",x:first.x,y:first.y,layer:first.from_layer,width:startContactWidths.fromWidth})),last.route_type==="via"&&(route.splice(route.length-1,0,{route_type:"wire",x:last.x,y:last.y,layer:last.from_layer,width:endContactWidths.fromWidth}),route.push({route_type:"wire",x:last.x,y:last.y,layer:last.to_layer,width:endContactWidths.toWidth})),last.route_type==="via"&&route.push({route_type:"wire",x:last.x,y:last.y,layer:last.to_layer,width:endContactWidths.toWidth}),coveredConnections.add(connection),{type:"pcb_trace",pcb_trace_id:`saved_fanout_${breakout.pcb_group_id}_${pathIndex}`,connection_name:connection.name,source_trace_id:connection.source_trace_id,connectsTo:[connection.source_trace_id,...connection.pointsToConnect.map(point62=>point62.pointId)].filter(id3=>!!id3),route}}),missing=input2.connections.filter(connection=>!coveredConnections.has(connection));if(missing.length)throw new Error(`pcbTracePaths must cover every fanout connection; missing: ${missing.map(connection=>connection.name).join(", ")}`);return traces}function getPhaseSortValue(routingPhaseIndex){return routingPhaseIndex===null?Number.POSITIVE_INFINITY:routingPhaseIndex}function compareRoutingPhasePlans(a22,b22){return getPhaseSortValue(a22.routingPhaseIndex)-getPhaseSortValue(b22.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,buses=[]){let busRoutingPhaseIndexes=new Set;for(let bus of buses){if(bus._parsedProps.routingPhaseIndex===void 0)continue;bus._parsedProps.connections.some(connection=>connection===trace.name||traceHasEndpointMatchingConnectionSelector(trace,convertPortSelectorToEndpointKey(connection)))&&busRoutingPhaseIndexes.add(bus._parsedProps.routingPhaseIndex)}if(busRoutingPhaseIndexes.size>1)throw new Error(`Trace "${trace.name}" belongs to buses with different routing phases`);let busRoutingPhaseIndex=busRoutingPhaseIndexes.values().next().value;if(busRoutingPhaseIndex!==void 0)return busRoutingPhaseIndex;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===void 0&&phaseProps.connections===void 0?phaseProps.pcbTracePaths?.map(path=>path.connection)??[]:[...phaseProps.connection?[phaseProps.connection]:[],...phaseProps.connections??[]]}function traceHasEndpointMatchingConnectionSelector(trace,connectionSelectorEndpointKey){if(trace.getTracePortPathSelectors().some(selector=>convertPortSelectorToEndpointKey(selector)===connectionSelectorEndpointKey))return!0;let port=trace.getSubcircuit().selectOne(connectionSelectorEndpointKey,{type:"port"});return port!==null&&(trace._findConnectedPorts().ports?.includes(port)??!1)}function getAutoroutersByPhaseIndex(group2){let autoroutingPhases=group2.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(group2){let autoroutingPhases=group2.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,minTraceToHoleEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleDiameter,minViaPadDiameter}=phaseProps;if(!(minTraceWidth===void 0&&minViaHoleEdgeToViaHoleEdgeClearance===void 0&&minPlatedHoleDrillEdgeToDrillEdgeClearance===void 0&&minTraceToPadEdgeClearance===void 0&&minTraceToHoleEdgeClearance===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),minTraceToHoleEdgeClearance:toParsedDistance(minTraceToHoleEdgeClearance),minPadEdgeToPadEdgeClearance:toParsedDistance(minPadEdgeToPadEdgeClearance),minBoardEdgeClearance:toParsedDistance(minBoardEdgeClearance),minViaEdgeToPadEdgeClearance:toParsedDistance(minViaEdgeToPadEdgeClearance),minViaHoleDiameter:toParsedDistance(minViaHoleDiameter),minViaPadDiameter:toParsedDistance(minViaPadDiameter)}}function Group_getRoutingPhasePlans(group2){let traces=group2.selectAll("trace"),nets=group2.selectAll("net"),buses=group2.selectAll("bus"),breakouts=group2.selectAll("group").filter(candidate=>candidate.isRoutingDirective),breakoutByTrace=new Map,breakoutByNet=new Map;for(let trace of traces){let ancestor=trace.parent;for(;ancestor&&ancestor!==group2;){if(ancestor.isRoutingDirective){breakoutByTrace.set(trace,ancestor);break}ancestor=ancestor.parent}}for(let net of nets)net.parent?.isRoutingDirective&&breakouts.includes(net.parent)&&breakoutByNet.set(net,net.parent);let plansByPhaseIndex=new Map,autoroutersByPhaseIndex=getAutoroutersByPhaseIndex(group2),phasePropsByPhaseIndex=getAutoroutingPhasePropsByPhaseIndex(group2),groupFanoutProps=group2._parsedProps,routeRemaining=group2.getInheritedProperty("routeRemaining")!==!1,defaultPhaseProps=phasePropsByPhaseIndex.get(null),includeUnassignedConnections=routeRemaining||defaultPhaseProps!==void 0&&!defaultPhaseProps.reroute&&getConnectionSelectorsFromAutoroutingPhaseProps(defaultPhaseProps).length===0,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&&breakouts.length===0)return[];for(let net of nets){if(breakoutByNet.has(net))continue;let routingPhaseIndex=getNetRoutingPhaseIndex(net);routingPhaseIndex===null&&!includeUnassignedConnections||getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex).nets.push(net)}for(let trace of traces){if(breakoutByTrace.has(trace))continue;let routingPhaseIndex=getTraceRoutingPhaseIndex(trace,buses);routingPhaseIndex===null&&!includeUnassignedConnections||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(!breakoutByTrace.has(trace)&&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||phaseProps.pcbTracePaths!==void 0)&&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.algorithmFn=phaseProps?.algorithmFn,plan.isImplicitRemainingPhase=plan.routingPhaseIndex===null&&phaseProps===void 0,plan.phaseName=phaseProps?.name,plan.reroute=phaseProps?.reroute,plan.region=phaseProps?.region,plan.connectionSelectors=phaseProps?getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps):void 0,plan.busFanoutDirections=phaseProps?.busFanoutDirections??groupFanoutProps.busFanoutDirections,plan.fanoutBoundaryPadding=phaseProps?.fanoutBoundaryPadding??groupFanoutProps.fanoutBoundaryPadding;let fanoutRoutingLayers=phaseProps?.fanoutRoutingLayers??groupFanoutProps.fanoutRoutingLayers;plan.fanoutRoutingLayers=fanoutRoutingLayers?.map(layer=>typeof layer=="string"?layer:layer.name),plan.fanoutPourNetMap=phaseProps?.fanoutPourNetMap??groupFanoutProps.fanoutPourNetMap,plan.drcTolerances=phaseProps?getDrcTolerancesFromAutoroutingPhaseProps(phaseProps):void 0}for(let phase of group2.selectAll("autoroutingphase")){let plan=plansByPhaseIndex.get(phase._parsedProps.phaseIndex??null);if(!plan||(plan.autoroutingPhase=phase,phase._parsedProps.pcbTracePaths===void 0))continue;let config=plan.autorouter!==void 0?getPresetAutoroutingConfig(plan.autorouter,group2.root?.platform):group2._getAutorouterConfig(),isFanout=["fanout","single_layer_fanout"].includes(config.preset??"");plan.getPrecomputedRoutingResult=input2=>getSavedAutoroutingPhaseTraces(phase,input2,isFanout)}let breakoutPlans=[];for(let breakout of breakouts){let breakoutProps2=breakout._parsedProps,shouldUseDefaultAutorouterForBreakoutPoints=breakout.children.some(child=>child instanceof BreakoutPoint)&&breakout.props.autorouter===void 0,breakoutTraces=traces.filter(trace=>breakoutByTrace.get(trace)===breakout),unroutedBreakoutTraces=breakoutTraces.filter(trace=>!trace.pcb_trace_id),pcbGroup=breakout.pcb_group_id?breakout.root?.db.pcb_group.get(breakout.pcb_group_id):null,outlineBounds=pcbGroup?.outline?getBoundsFromPoints2(pcbGroup.outline):null,routingWidth=pcbGroup?.width??(outlineBounds?outlineBounds.maxX-outlineBounds.minX:void 0),routingHeight=pcbGroup?.height??(outlineBounds?outlineBounds.maxY-outlineBounds.minY:void 0),routingBounds2=pcbGroup&&routingWidth&&routingHeight?{minX:pcbGroup.center.x-routingWidth/2,maxX:pcbGroup.center.x+routingWidth/2,minY:pcbGroup.center.y-routingHeight/2,maxY:pcbGroup.center.y+routingHeight/2}:void 0,rawBreakoutProps=breakout.props,hasExplicitGeometry=rawBreakoutProps.width!==void 0||rawBreakoutProps.height!==void 0||!!rawBreakoutProps.outline?.length,hasExplicitFanoutBoundaryPadding=rawBreakoutProps.fanoutBoundaryPadding!==void 0,breakoutPlan={routingPhaseIndex:null,routingPcbGroupId:breakout.pcb_group_id??void 0,fanoutRegionPcbGroupId:breakout.pcb_group_id??void 0,routingBounds:routingBounds2,fanoutBounds:hasExplicitGeometry?routingBounds2:hasExplicitFanoutBoundaryPadding?void 0:routingBounds2,autorouter:breakoutProps2.autorouter??"fanout",busFanoutDirections:breakoutProps2.busFanoutDirections,fanoutBoundaryPadding:breakoutProps2.fanoutBoundaryPadding,fanoutRoutingLayers:breakoutProps2.fanoutRoutingLayers?.map(layer=>typeof layer=="string"?layer:layer.name),fanoutPourNetMap:breakoutProps2.fanoutPourNetMap,nets:nets.filter(net=>breakoutByNet.get(net)===breakout),traces:breakoutTraces};if(breakout.isDogboneFanout&&breakoutProps2.pcbTracePaths===void 0){breakoutPlans.push({...breakoutPlan,routingBounds:void 0,fanoutBounds:routingBounds2});continue}if(breakout._parsedProps.pcbTracePaths!==void 0){breakoutPlans.push({...breakoutPlan,autorouter:{local:!0,groupMode:"subcircuit",allowViaInPad:(typeof breakoutProps2.autorouter=="object"?breakoutProps2.autorouter.allowViaInPad:void 0)??group2._getAutorouterConfig().allowViaInPad},getPrecomputedRoutingResult:input2=>({traces:getSavedFanoutTraces(breakout,input2)})});continue}if(!shouldUseDefaultAutorouterForBreakoutPoints){breakoutPlans.push(breakoutPlan);continue}if(breakoutPlans.push({...breakoutPlan,autorouter:"default",traces:[]}),unroutedBreakoutTraces.length>0){let automaticFanoutBusIds=new Set(buses.filter(bus=>unroutedBreakoutTraces.some(trace=>bus._parsedProps.connections.some(connection=>connection===trace.name||traceHasEndpointMatchingConnectionSelector(trace,convertPortSelectorToEndpointKey(connection))))).map(bus=>bus.name));for(let trace of unroutedBreakoutTraces)trace.name&&automaticFanoutBusIds.add(trace.name);let automaticBusFanoutDirections=breakoutProps2.busFanoutDirections?Object.fromEntries(Object.entries(breakoutProps2.busFanoutDirections).filter(([busId])=>automaticFanoutBusIds.has(busId))):void 0;breakoutPlans.push({...breakoutPlan,routingPcbGroupId:void 0,busFanoutDirections:automaticBusFanoutDirections,traces:unroutedBreakoutTraces})}}if(routeRemaining&&hasDirectRoutingTargets&&phasePropsByPhaseIndex.size===1&&defaultPhaseProps?.reroute&&plans.length===1&&plans[0]?.routingPhaseIndex===null){let reroutePlan=plans[0];return[...breakoutPlans,{routingPhaseIndex:null,isImplicitRemainingPhase:!0,nets:[...reroutePlan.nets],traces:[...reroutePlan.traces]},reroutePlan]}return[...breakoutPlans,...plans]}var package_default3={name:"@tscircuit/core",type:"module",version:"0.0.2045",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 && bun run scripts/smoke-tests/check-dist-bundled-schematic-solver.ts","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","@tsci/tscircuit.ti":"github:tscircuit/ti#57e314be4b2b06bc546d4def7453e619604d1157","@tscircuit/alphabet":"0.0.25","@tscircuit/bga-fanout-solver":"github:tscircuit/bga-fanout-solver#247c835cb8d69b65e53891dcf869731079415b39","@tscircuit/bus-lanes-solver":"https://jscdn.tscircuit.com/@tscircuit/bus-lanes-solver/0.0.6.tgz","@tscircuit/capacity-autorouter":"^0.0.951","@tscircuit/checks":"^0.0.233","@tscircuit/circuit-json-util":"^0.0.117","@tscircuit/common":"^0.0.20","@tscircuit/copper-pour-solver":"^0.0.62","@tscircuit/create-fdm-enclosure":"0.0.4","@tscircuit/dogbone-solver":"https://jscdn.tscircuit.com/@tscircuit/dogbone-solver/0.0.1.tgz","@tscircuit/fanout-solver":"0.0.78","@tscircuit/flex-utils":"https://jscdn.tscircuit.com/@tscircuit/flex-utils/0.0.8.tgz","@tscircuit/footprinter":"^0.0.426","@tscircuit/image-utils":"^0.0.8","@tscircuit/implicit-copper-pour-solver":"github:tscircuit/implicit-copper-pour-solver#a5cbbda0cd65fd4707c5c1af25779837c25aba92","@tscircuit/infer-cable-insertion-point":"^0.0.4","@tscircuit/infgrid-ijump-astar":"^0.0.35","@tscircuit/jlcpcb-manufacturing-specs":"git+https://github.com/tscircuit/jlcpcb-manufacturing-specs#23260504fceffff2d64bf11720f74e974d1d9321","@tscircuit/krt-wasm":"^0.1.1","@tscircuit/log-soup":"^1.0.2","@tscircuit/matchpack":"^0.0.97","@tscircuit/math-utils":"^0.0.36","@tscircuit/miniflex":"^0.0.4","@tscircuit/ngspice-spice-engine":"^0.0.20","@tscircuit/props":"^0.0.676","@tscircuit/schematic-match-adapt":"^0.0.18","@tscircuit/schematic-trace-solver":"https://jscdn.tscircuit.com/@tscircuit/schematic-trace-solver/0.0.221.tgz","@tscircuit/solver-utils":"^0.0.16","@tscircuit/soup-util":"^0.0.41","@tscircuit/via-stitch-solver":"github:tscircuit/via-stitch-solver#64f2ac7781b795bdc0d74ba411988e60767fa653","@tscircuit/winding-breakout-point-solver":"github:tscircuit/winding-breakout-point-solver#202dbe9eb0088633b6fa094120dba6f2f41f8803","@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.507","circuit-json-to-bpc":"^0.0.13","circuit-json-to-connectivity-map":"^0.0.33","circuit-json-to-gltf":"^0.0.141","circuit-json-to-spice":"^0.0.45","circuit-to-svg":"^0.0.437",concurrently:"^9.1.2","connectivity-map":"^1.0.1",debug:"^4.3.6",flatbush:"^4.5.0","graphics-debug":"^0.0.95",howfat:"^0.3.8","kicad-to-circuit-json":"^0.0.117",kicadts:"^0.0.53","live-server":"^1.2.2",minicssgrid:"^0.0.9","pkg-pr-new":"^0.0.37",poppygl:"0.0.29",react:"^19.1.0","react-dom":"^19.1.0","schematic-symbols":"^0.0.248",spicets:"^0.0.4",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/create-fdm-enclosure":"*","@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":"*","circuit-json-to-spice":"*","schematic-symbols":"*",spicets:"*",typescript:"^5.0.0"},dependencies:{"@flatten-js/core":"^1.6.2","@lume/kiwi":"^0.4.3","calculate-cell-boundaries":"^0.0.24","calculate-packing":"^0.0.90","css-select":"5.1.0","format-si-unit":"^0.0.12",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"},overrides:{"@tscircuit/circuit-json-util":"^0.0.117","@tscircuit/props":"^0.0.676","circuit-json":"^0.0.507"}},getFnv1aHash=value=>{let hash=2166136261;for(let i22=0;i22<value.length;i22++)hash^=value.charCodeAt(i22),hash=Math.imul(hash,16777619);return hash>>>0},getJsonHash=value=>{let serializedValue=JSON.stringify(value),hash1=getFnv1aHash(serializedValue),hash2=getFnv1aHash(`${serializedValue}${hash1}`);return`${hash1.toString(16).padStart(8,"0")}${hash2.toString(16).padStart(8,"0")}`},getLocalAutoroutingCacheKey=(simpleRouteJson,solverOptions)=>`routes:core@${package_default3.version}:solver:${getJsonHash(solverOptions)}:srj:${getJsonHash(simpleRouteJson)}`,getCachedLocalAutoroutingPhaseResult=async({cacheEngine,cacheKey})=>{if(!cacheEngine)return null;try{let cachedResult=await cacheEngine.getItem(cacheKey);if(!cachedResult)return null;let parsedResult=JSON.parse(cachedResult);return!parsedResult||!Array.isArray(parsedResult.traces)?null:parsedResult}catch{return null}},cacheLocalAutoroutingPhaseResult=async({cacheEngine,cacheKey,result})=>{if(cacheEngine)try{await cacheEngine.setItem(cacheKey,JSON.stringify(result))}catch{}},SRJ_POINT_POSITION_TOLERANCE_MM=1e-6,srjPointsHaveSamePointId=(first,second)=>first.pointId!==void 0&&second.pointId!==void 0&&first.pointId===second.pointId,srjPointsHaveSameBoardPositionAndLayer=(first,second)=>Math.abs(first.x-second.x)<=SRJ_POINT_POSITION_TOLERANCE_MM&&Math.abs(first.y-second.y)<=SRJ_POINT_POSITION_TOLERANCE_MM&&first.layer===second.layer,srjPointsReferToSameEndpoint=(first,second)=>first.pointId!==void 0&&second.pointId!==void 0?srjPointsHaveSamePointId(first,second):srjPointsHaveSameBoardPositionAndLayer(first,second),getPairedGlobalPoint=(simpleRouteJson,connection)=>{let globalConnection=simpleRouteJson.connections.find(candidate=>candidate.routingPcbGroupId!==connection.routingPcbGroupId&&candidate.source_trace_id===connection.source_trace_id&&candidate.pointsToConnect.some(globalPoint=>connection.pointsToConnect.some(localPoint=>srjPointsReferToSameEndpoint(globalPoint,localPoint))));if(!globalConnection)return;let pairedPoints=globalConnection.pointsToConnect.filter(globalPoint=>!connection.pointsToConnect.some(localPoint=>srjPointsReferToSameEndpoint(globalPoint,localPoint)));return pairedPoints.length===1?pairedPoints[0]:void 0},getPairedBreakoutExitTarget=(simpleRouteJson,connection)=>{if(!connection.routingPcbGroupId||!connection.source_trace_id)return;let pairedGlobalPoint=getPairedGlobalPoint(simpleRouteJson,connection);if(!(!pairedGlobalPoint||!simpleRouteJson.connections.some(candidate=>candidate.routingPcbGroupId!==void 0&&candidate.routingPcbGroupId!==connection.routingPcbGroupId&&candidate.source_trace_id===connection.source_trace_id&&candidate.pointsToConnect.some(candidatePoint=>srjPointsReferToSameEndpoint(candidatePoint,pairedGlobalPoint)))))return{x:pairedGlobalPoint.x,y:pairedGlobalPoint.y,layer:pairedGlobalPoint.layer}};function connectionIsInRoutingPhase(connection,phasePlan){if(connection.routingPcbGroupId)return connection.routingPcbGroupId===phasePlan.routingPcbGroupId;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.routingPcbGroupId||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);let includedConnectionNames=new Set;for(let connection of connections)includedConnectionNames.add(connection.name);let differentialPairs=[];for(let differentialPair of simpleRouteJson.differentialPairs??[]){let positiveConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[0]),negativeConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[1]);if(positiveConnectionIncluded!==negativeConnectionIncluded)throw new Error(`Differential pair "${differentialPair.connectionNames.join("/")}" cannot be split across autorouting phases`);positiveConnectionIncluded&&differentialPairs.push(differentialPair)}let connectionByName=new Map(connections.map(connection=>[connection.name,connection])),buses=(simpleRouteJson.buses??[]).map(bus=>{let connectionNames=bus.connectionNames.filter(connectionName=>includedConnectionNames.has(connectionName)),connectionExitTargets=Object.fromEntries(connectionNames.flatMap(connectionName=>{let connection=connectionByName.get(connectionName);if(!connection)return[];let pairedTarget=getPairedBreakoutExitTarget(simpleRouteJson,connection);return pairedTarget?[[connectionName,pairedTarget]]:[]}));return{...bus,connectionNames,...Object.keys(connectionExitTargets).length>0?{connectionExitTargets}:{}}}).filter(bus=>bus.connectionNames.length>0),bounds=expandSrjBoundsToIncludeConnectionPoints({bounds:phasePlan.routingBounds??simpleRouteJson.bounds,connections});return{...simpleRouteJson,bounds,outline:getSrjOutlineForRoutingBounds(simpleRouteJson,bounds),connections,differentialPairs:differentialPairs.length>0?differentialPairs:void 0,buses:buses.length>0?buses:void 0}}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,minTraceToHoleEdgeClearance=drcTolerances.minTraceToHoleEdgeClearance??simpleRouteJson.minTraceToHoleEdgeClearance,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,minTraceToHoleEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance}}var removeCompletedFanoutConnections=(simpleRouteJson,routingPcbGroupId)=>{let connections=simpleRouteJson.connections.filter(connection=>connection.routingPcbGroupId!==routingPcbGroupId),includedConnectionNames=new Set(connections.map(connection=>connection.name)),differentialPairs=[];for(let differentialPair of simpleRouteJson.differentialPairs??[]){let positiveConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[0]),negativeConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[1]);if(positiveConnectionIncluded!==negativeConnectionIncluded)throw new Error(`Differential pair "${differentialPair.connectionNames.join("/")}" cannot be split at a breakout boundary`);positiveConnectionIncluded&&differentialPairs.push(differentialPair)}let buses=(simpleRouteJson.buses??[]).map(bus=>({...bus,connectionNames:bus.connectionNames.filter(connectionName=>includedConnectionNames.has(connectionName))})).filter(bus=>bus.connectionNames.length>0);return{...simpleRouteJson,connections,differentialPairs:differentialPairs.length>0?differentialPairs:void 0,buses:buses.length>0?buses:void 0}},connectFanoutTracesToBreakoutPoints=(simpleRouteJson,breakoutPointIdByConnectionName)=>({...simpleRouteJson,traces:simpleRouteJson.traces?.map(trace=>{let breakoutPointId=breakoutPointIdByConnectionName.get(trace.connection_name??"");return breakoutPointId?{...trace,connectsTo:[...new Set([...trace.connectsTo??[],breakoutPointId])]}:trace})});function Group_syncFanoutExitsWithGlobalConnections({fanoutInputSimpleRouteJson,fanoutOutputSimpleRouteJson,baseSimpleRouteJson,routingPhasePlan}){let routingPcbGroupId=routingPhasePlan.routingPcbGroupId;if(!routingPcbGroupId)return{downstreamSimpleRouteJson:fanoutOutputSimpleRouteJson,baseSimpleRouteJson,synchronizedBreakoutPoints:[]};let outputConnectionByName=new Map(fanoutOutputSimpleRouteJson.connections.map(connection=>[connection.name,connection])),baseConnections=baseSimpleRouteJson.connections.map(connection=>({...connection,pointsToConnect:connection.pointsToConnect.map(point62=>({...point62}))})),synchronizedBreakoutPoints=[],breakoutPointIdByConnectionName=new Map;for(let inputConnection of fanoutInputSimpleRouteJson.connections){if(inputConnection.routingPcbGroupId!==routingPcbGroupId||!inputConnection.source_trace_id)continue;let outputConnection=outputConnectionByName.get(inputConnection.name);if(!outputConnection)continue;let globalPointMatches=baseConnections.filter(connection=>{if(connection.routingPcbGroupId===routingPcbGroupId)return!1;let sharesSourceTrace=connection.source_trace_id===inputConnection.source_trace_id,sharesPointId=connection.pointsToConnect.some(globalPoint=>inputConnection.pointsToConnect.some(inputPoint=>srjPointsHaveSamePointId(globalPoint,inputPoint)));return!sharesSourceTrace&&!sharesPointId?!1:connection.pointsToConnect.some(globalPoint=>inputConnection.pointsToConnect.some(inputPoint=>srjPointsReferToSameEndpoint(globalPoint,inputPoint)))}).flatMap(globalConnection=>globalConnection.pointsToConnect.flatMap((previousPoint,pointIndex)=>inputConnection.pointsToConnect.some(inputPoint=>srjPointsReferToSameEndpoint(previousPoint,inputPoint))?[{globalConnection,pointIndex,previousPoint}]:[])),changedPointIndex=outputConnection.pointsToConnect.findIndex((outputPoint,pointIndex)=>{let inputPoint=inputConnection.pointsToConnect[pointIndex];return inputPoint!==void 0&&!srjPointsHaveSameBoardPositionAndLayer(outputPoint,inputPoint)});if(changedPointIndex<0)continue;let fanoutExitPoint=outputConnection.pointsToConnect[changedPointIndex];globalPointMatches.length===0&&synchronizedBreakoutPoints.push({sourceTraceId:inputConnection.source_trace_id,routingPcbGroupId,previousPoint:inputConnection.pointsToConnect[changedPointIndex],fanoutExitPoint});for(let{globalConnection,pointIndex,previousPoint}of globalPointMatches){let{terminalVia:_previousTerminalVia,...previousPointWithoutLayerOverrides}=previousPoint,synchronizedGlobalPoint={...previousPointWithoutLayerOverrides,x:fanoutExitPoint.x,y:fanoutExitPoint.y,layer:fanoutExitPoint.layer,...fanoutExitPoint.terminalVia?{terminalVia:{...fanoutExitPoint.terminalVia}}:{}};globalConnection.pointsToConnect[pointIndex]=synchronizedGlobalPoint,previousPoint.pointId&&breakoutPointIdByConnectionName.set(inputConnection.name,previousPoint.pointId),synchronizedBreakoutPoints.push({sourceTraceId:inputConnection.source_trace_id,routingPcbGroupId,previousPoint,fanoutExitPoint})}}let newFanoutSourceKeepouts=fanoutOutputSimpleRouteJson.obstacles.filter(obstacle=>obstacle.isFanoutSourceKeepout===!0&&obstacle.componentId!==void 0),completedSourceComponentIds=new Set(newFanoutSourceKeepouts.flatMap(obstacle=>obstacle.componentId===void 0?[]:[obstacle.componentId])),retainedBaseObstacles=baseSimpleRouteJson.obstacles.filter(obstacle=>!obstacle.componentId||!completedSourceComponentIds.has(obstacle.componentId));return{downstreamSimpleRouteJson:removeCompletedFanoutConnections(connectFanoutTracesToBreakoutPoints(fanoutOutputSimpleRouteJson,breakoutPointIdByConnectionName),routingPcbGroupId),baseSimpleRouteJson:{...baseSimpleRouteJson,connections:baseConnections,obstacles:[...retainedBaseObstacles,...newFanoutSourceKeepouts]},synchronizedBreakoutPoints}}function getJumperPadInfos(db22){let padInfos=[],jumperSourceComponentIds=new Set(db22.source_component.list().filter(component=>component.name?.startsWith("__autoplaced_jumper")).map(component=>component.source_component_id));if(jumperSourceComponentIds.size===0)return padInfos;let jumperPcbComponentIds=new Set(db22.pcb_component.list().filter(component=>jumperSourceComponentIds.has(component.source_component_id)).map(component=>component.pcb_component_id)),jumperSmtpads=db22.pcb_smtpad.list().filter(pad2=>jumperPcbComponentIds.has(pad2.pcb_component_id));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,x22,y22,tolerance=.01){for(let pad2 of padInfos)if(Math.abs(pad2.x-x22)<tolerance&&Math.abs(pad2.y-y22)<tolerance)return pad2.pcb_port_id}function findJumperPortContainingPoint(padInfos,x22,y22){for(let pad2 of padInfos)if(x22>=pad2.minX&&x22<=pad2.maxX&&y22>=pad2.minY&&y22<=pad2.maxY)return pad2}function splitRouteAtJumperPads(route,padInfos){if(route.length===0||padInfos.length===0)return[route];let segments=[],currentSegment=[];for(let i22=0;i22<route.length;i22++){let point62=route[i22];if(currentSegment.push(point62),point62.route_type==="wire"&&i22>0&&i22<route.length-1){let padInfo=findJumperPortContainingPoint(padInfos,point62.x,point62.y);if(padInfo){point62.end_pcb_port_id||(point62.end_pcb_port_id=padInfo.pcb_port_id),segments.push(currentSegment);let newStartPoint={...point62};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,padInfos){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 claimSrjAssignablePcbViasTraversedByRoute=({db:db22,pcbTrace,routeWithSrjMetadata})=>{for(let routePoint2 of routeWithSrjMetadata){if(routePoint2.route_type!=="through_pad")continue;let pcbViaId=routePoint2.circuitJsonMetadata?.pcb_via_id;if(!pcbViaId)continue;let assignablePcbVia=db22.pcb_via.get(pcbViaId);!assignablePcbVia?.net_is_assignable||assignablePcbVia.net_assigned&&assignablePcbVia.pcb_trace_id!==pcbTrace.pcb_trace_id||db22.pcb_via.update(assignablePcbVia.pcb_via_id,{pcb_trace_id:pcbTrace.pcb_trace_id,net_assigned:!0})}},getAxisGap=(firstMinimum,firstMaximum,secondMinimum,secondMaximum)=>Math.max(secondMinimum-firstMaximum,firstMinimum-secondMaximum),findFanoutPhaseSeparationConflict=regions=>{for(let firstIndex=0;firstIndex<regions.length;firstIndex++){let firstRegion=regions[firstIndex];for(let secondIndex=firstIndex+1;secondIndex<regions.length;secondIndex++){let secondRegion=regions[secondIndex];if(firstRegion.regionId&&firstRegion.regionId===secondRegion.regionId)continue;let horizontalGap=getAxisGap(firstRegion.bounds.minX,firstRegion.bounds.maxX,secondRegion.bounds.minX,secondRegion.bounds.maxX),verticalGap=getAxisGap(firstRegion.bounds.minY,firstRegion.bounds.maxY,secondRegion.bounds.minY,secondRegion.bounds.maxY),availableGap=Math.max(horizontalGap,verticalGap),requiredGap=firstRegion.boundaryKeepaway+secondRegion.boundaryKeepaway;if(availableGap+1e-6<requiredGap)return{firstRegion,secondRegion,availableGap,requiredGap}}}};function getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces,stageOutputPcbTraces}){let replacedPcbTraceIds=new Set(stageOutputPcbTraces.flatMap(trace=>[trace.pcb_trace_id,...trace.__replaces_pcb_trace_id?[trace.__replaces_pcb_trace_id]:[]]));return[...accumulatedPcbTraces.filter(trace=>!replacedPcbTraceIds.has(trace.pcb_trace_id)),...stageOutputPcbTraces]}var POINT_EPSILON3=1e-6;function isPointOnWireSegment({point:point62,segmentStart,segmentEnd}){return point62.layer&&(segmentStart.layer!==point62.layer||segmentEnd.layer!==point62.layer)?!1:pointToSegmentDistance(point62,segmentStart,segmentEnd)<=POINT_EPSILON3}function isPointInSmtPad({point:point62,pad:pad2,traceWidth=0}){return pad2.shape==="rect"||pad2.shape==="rotated_rect"?Math.abs(point62.x-pad2.x)<=pad2.width/2+traceWidth/2&&Math.abs(point62.y-pad2.y)<=pad2.height/2+traceWidth/2:pad2.shape==="circle"?distance2(point62,pad2)<=pad2.radius+traceWidth/2:!1}function isPointInPlatedHole({point:point62,hole,traceWidth=0}){return distance2(point62,hole)<=(hole.outer_diameter??hole.hole_diameter??0)/2+traceWidth/2}function getEndpointSourcePortIdsFromGeometry(db22,trace){let sourcePortIds=new Set,route=trace.route,endpoints=[route[0],route[route.length-1]].filter(point62=>!!point62&&point62.route_type==="wire"&&point62.x!==void 0&&point62.y!==void 0);for(let endpoint of endpoints){for(let pcbPort of db22.pcb_port.list())pcbPort.source_port_id&&(endpoint.layer&&pcbPort.layers&&!pcbPort.layers.includes(endpoint.layer)||distance2(endpoint,pcbPort)<=.01&&sourcePortIds.add(pcbPort.source_port_id));for(let smtpad2 of db22.pcb_smtpad.list()){if(!smtpad2.pcb_port_id||endpoint.layer&&smtpad2.layer!==endpoint.layer||!isPointInSmtPad({point:endpoint,pad:smtpad2,traceWidth:endpoint.width}))continue;let sourcePortId=db22.pcb_port.get(smtpad2.pcb_port_id)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}for(let hole of db22.pcb_plated_hole.list()){if(!hole.pcb_port_id||!isPointInPlatedHole({point:endpoint,hole,traceWidth:endpoint.width}))continue;let sourcePortId=db22.pcb_port.get(hole.pcb_port_id)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}}return[...sourcePortIds]}function getWireRouteEndpoints(trace){let route=trace.route.filter(point62=>point62.route_type==="wire"&&point62.x!==void 0&&point62.y!==void 0);return[route[0],route[route.length-1]].filter(point62=>!!point62)}function getSourceIdsFromConnectedPcbTraces(db22,trace){let sourceIds=new Set,endpoints=getWireRouteEndpoints(trace);if(endpoints.length===0)return[];for(let existingTrace of db22.pcb_trace.list()){if(!existingTrace.source_trace_id||existingTrace.pcb_trace_id===trace.pcb_trace_id||!db22.source_trace.get(existingTrace.source_trace_id)&&!db22.source_net.get(existingTrace.source_trace_id))continue;let existingRoute=existingTrace.route.filter(point62=>point62.route_type==="wire");for(let i22=0;i22<existingRoute.length-1;i22++){let segmentStart=existingRoute[i22],segmentEnd=existingRoute[i22+1];if(!(!segmentStart||!segmentEnd))for(let endpoint of endpoints)isPointOnWireSegment({point:endpoint,segmentStart,segmentEnd})&&sourceIds.add(existingTrace.source_trace_id)}}return[...sourceIds]}function getSourcePortIdsFromRoutedTrace(db22,trace){let sourcePortIds=new Set;for(let point62 of trace.route)for(let pcbPortId of[point62.start_pcb_port_id,point62.end_pcb_port_id]){if(!pcbPortId)continue;let sourcePortId=db22.pcb_port.get(pcbPortId)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}return sourcePortIds.size>0?[...sourcePortIds]:getEndpointSourcePortIdsFromGeometry(db22,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:db22,trace,subcircuit_id}){if(trace.source_trace_id&&(db22.source_trace.get(trace.source_trace_id)??db22.source_net.get(trace.source_trace_id)))return trace.source_trace_id;let sourcePortIds=getSourcePortIdsFromRoutedTrace(db22,trace);if(sourcePortIds.length===0)return getSourceIdsFromConnectedPcbTraces(db22,trace)[0];let sourceTraces=db22.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,orientation22){let groups=[];for(let pad2 of pads){let key=orientation22==="vertical"?pad2.center.y:pad2.center.x,foundGroup=!1;for(let group2 of groups){let groupKey=orientation22==="vertical"?group2[0].center.y:group2[0].center.x;if(Math.abs(key-groupKey)<.01){group2.push(pad2),foundGroup=!0;break}}foundGroup||groups.push([pad2])}return groups.filter(g22=>g22.length>=2)}function insertAutoplacedJumpers(params){let{db:db22,output_jumpers,subcircuit_id}=params;for(let jumperIndex=0;jumperIndex<output_jumpers.length;jumperIndex++){let jumper=output_jumpers[jumperIndex],sourceComponent=db22.source_component.insert({ftype:"simple_chip",name:`__autoplaced_jumper_${jumperIndex}`,supplier_part_numbers:{}}),rotation5=jumper.orientation==="horizontal"?0:90,firstPadLayer=jumper.pads[0]?.layer||jumper.pads[0]?.layers?.[0]||"top",pcbComponent=db22.pcb_component.insert({source_component_id:sourceComponent.source_component_id,center:jumper.center,rotation:rotation5,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=db22.source_port.insert({source_component_id:sourceComponent.source_component_id,name:`pin${pinNumber}`,pin_number:pinNumber}),padLayer=pad2.layer||pad2.layers?.[0]||"top",pcbPort=db22.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=db22.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 group2 of internalGroups){let sourcePortIds=[];for(let groupPad of group2){let padInfo=padData.find(p22=>Math.abs(p22.pad.center.x-groupPad.center.x)<.01&&Math.abs(p22.pad.center.y-groupPad.center.y)<.01);padInfo&&sourcePortIds.push(padInfo.sourcePortId)}sourcePortIds.length>=2&&db22.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(point62=>({...point62}))}}function getRelevantSubcircuitIdsForReroute(group2){let relevantSubcircuitIds=new Set;if(!group2.subcircuit_id)return relevantSubcircuitIds;relevantSubcircuitIds.add(group2.subcircuit_id);let db22=group2.root?.db;if(!db22)return relevantSubcircuitIds;for(let subcircuitId of getDescendantSubcircuitIds2(db22,group2.subcircuit_id))relevantSubcircuitIds.add(subcircuitId);return relevantSubcircuitIds}function getExistingPcbTracesForReroute(group2){let db22=group2.root?.db;if(!db22)return[];let relevantSubcircuitIds=getRelevantSubcircuitIdsForReroute(group2);return db22.pcb_trace.list().filter(trace=>!trace.route||trace.route.length<2?!1:group2.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:group2,outputPcbTraces,pcbTraceIdsToReplace=[]}){let db22=group2.root?.db;if(!db22)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(group2).filter(trace=>replacementPcbTraceIds.has(trace.pcb_trace_id)||!!(trace.source_trace_id&&trace.subcircuit_id===group2.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 db22.pcb_via.list())via.pcb_trace_id&&deletedPcbTraceIds.has(via.pcb_trace_id)&&db22.pcb_via.delete(via.pcb_via_id);for(let trace of tracesToDelete)db22.pcb_trace.delete(trace.pcb_trace_id)}function getExistingSimplifiedPcbTracesForReroute(group2){return getExistingPcbTracesForReroute(group2).map(convertPcbTraceToSimplifiedPcbTrace)}function splitPcbTracesOnJumperSegments(route){let jumperRoutes=route.filter(p22=>p22.route_type==="jumper"),wireAndViaRoutes=route.filter(p22=>p22.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 i22=0;i22<wireAndViaRoutes.length;i22++){let p22=wireAndViaRoutes[i22];if(p22.route_type!=="wire")continue;let distToStart=Math.hypot(p22.x-jumperStart.x,p22.y-jumperStart.y),distToEnd=Math.hypot(p22.x-jumperEnd.x,p22.y-jumperEnd.y);distToStart<minStartDist&&(minStartDist=distToStart,startIdx=i22),distToEnd<minEndDist&&(minEndDist=distToEnd,endIdx=i22)}startIdx>endIdx&&([startIdx,endIdx]=[endIdx,startIdx]),startIdx>=0&&endIdx>=0&&startIdx!==endIdx&&splitRanges.push({startIdx,endIdx})}splitRanges.sort((a22,b22)=>a22.startIdx-b22.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 ax22=anchorPosition.x,ay22=anchorPosition.y;switch(alignment){case"top_left":return{x:ax22+width/2,y:ay22-height/2};case"top_center":return{x:ax22,y:ay22-height/2};case"top_right":return{x:ax22-width/2,y:ay22-height/2};case"center_left":return{x:ax22+width/2,y:ay22};case"center_right":return{x:ax22-width/2,y:ay22};case"bottom_left":return{x:ax22+width/2,y:ay22+height/2};case"bottom_center":return{x:ax22,y:ay22+height/2};case"bottom_right":return{x:ax22-width/2,y:ay22+height/2};default:return anchorPosition}}var getDistanceToPoint=(routePoint2,targetPoint)=>{let position4=getRoutePointPosition(routePoint2);return Math.hypot(position4.x-targetPoint.x,position4.y-targetPoint.y)},platformAllowsLegacyAutorouters=group2=>{let platform=group2.root?.platform;return platform!==void 0&&"allowLegacyAutorouters"in platform&&platform.allowLegacyAutorouters===!0},getDisabledLegacyGroupAutorouterPreset=group2=>{if(platformAllowsLegacyAutorouters(group2))return null;let resolvedGroupAutorouter=group2._parsedProps.autorouter??group2.getInheritedProperty("autorouter");return getLegacyAutorouterPreset(resolvedGroupAutorouter)},getDisabledLegacyAutorouterPreset=group2=>{if(platformAllowsLegacyAutorouters(group2))return null;let legacyGroupAutorouterPreset=getDisabledLegacyGroupAutorouterPreset(group2);if(legacyGroupAutorouterPreset)return legacyGroupAutorouterPreset;let routingPhaseAutorouters=group2.selectAll("autoroutingphase").map(autoroutingPhase=>autoroutingPhase._parsedProps.autorouter);for(let autorouter of routingPhaseAutorouters){let legacyAutorouterPreset=getLegacyAutorouterPreset(autorouter);if(legacyAutorouterPreset)return legacyAutorouterPreset}return null},ensureRouteStartsAtSourceTraceStart=({db:db22,route,routeThicknessMode,sourceTraceId})=>{if(!sourceTraceId||route.length<2)return route;let firstSourcePortId=db22.source_trace.get(sourceTraceId)?.connected_source_port_ids[0];if(!firstSourcePortId)return route;let firstPcbPort=db22.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,routeThicknessMode):route},Group5=class extends NormalComponent{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,"_pcbPlacementDrcErrorCount",null);__publicField(this,"_pcbPlacementDrcCheckError",null);__publicField(this,"_pcbPlacementDrcChecksPending",!1);__publicField(this,"_standaloneSubcircuitDrcChecksComplete",!1);__publicField(this,"_standaloneSubcircuitDrcChecksInProgress",!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:db22}=this.root,hasExplicitName=typeof this._parsedProps.name=="string"&&this._parsedProps.name.length>0,source_group3=db22.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}`,db22.source_group.update(source_group3.source_group_id,{subcircuit_id:this.subcircuit_id}))}doInitialSourceRender(){let{db:db22}=this.root;for(let child of this.getDescendants())child.getGroup()?.source_group_id===this.source_group_id&&db22.source_component.update(child.source_component_id,{source_group_id:this.source_group_id});if(!this.isSubcircuit)return;let disabledLegacyAutorouterPreset=getDisabledLegacyAutorouterPreset(this);disabledLegacyAutorouterPreset&&db22.source_property_ignored_warning.insert({source_component_id:this.source_component_id??"",property_name:"autorouter",subcircuit_id:this.subcircuit_id??void 0,error_type:"source_property_ignored_warning",message:`The "${disabledLegacyAutorouterPreset}" autorouter is deprecated, so autorouting has been disabled for this subcircuit. Use the default autorouter and introduce <autoroutingphase /> or <fanout /> elements as needed.`})}doInitialSourceParentAttachment(){let{db:db22}=this.root,parentGroup=this.parent?.getGroup?.();if(parentGroup?.source_group_id&&db22.source_group.update(this.source_group_id,{parent_source_group_id:parentGroup.source_group_id}),!this.isSubcircuit||isAssemblyDeviceContainer(this.parent))return;let parent_subcircuit_id=this.parent?.getSubcircuit?.()?.subcircuit_id;parent_subcircuit_id&&db22.source_group.update(this.source_group_id,{parent_subcircuit_id})}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db22}=this.root,{_parsedProps:props}=this,groupProps2=props,hasOutline=groupProps2.outline&&groupProps2.outline.length>0,numericOutline=hasOutline?groupProps2.outline.map(point62=>({x:distance.parse(point62.x),y:distance.parse(point62.y)})):void 0,ctx=this.props,anchorPosition=this._getGlobalPcbPositionBeforeLayout(),center2=computeCenterFromAnchorPosition(anchorPosition,ctx),pcb_group3=db22.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)db22.pcb_component.update(child.pcb_component_id,{pcb_group_id:pcb_group3.pcb_group_id})}doInitialPcbPrimitiveRender(){this.calculatePcbGroupBounds()}calculatePcbGroupBounds(pcbContentBounds){if(!this.pcb_group_id||this.root?.pcbDisabled)return;let{db:db22}=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(point62=>({x:distance.parse(point62.x),y:distance.parse(point62.y)})),outlineBounds=getBoundsFromPoints2(numericOutline);if(!outlineBounds)return;let centerX2=(outlineBounds.minX+outlineBounds.maxX)/2,centerY2=(outlineBounds.minY+outlineBounds.maxY)/2,center22=hasExplicitPositioning?db22.pcb_group.get(this.pcb_group_id)?.center??{x:centerX2,y:centerY2}:{x:centerX2,y:centerY2};db22.pcb_group.update(this.pcb_group_id,{center:center22});return}let contentBounds=pcbContentBounds;if(!contentBounds){let bounds=getBoundsOfPcbComponents(this.children);contentBounds={center:{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},width:bounds.width,height:bounds.height}}let{width,height}=contentBounds,{x:centerX,y:centerY}=contentBounds.center;if(this.isSubcircuit||this.isRoutingDirective){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),existingCenter=db22.pcb_group.get(this.pcb_group_id)?.center??{x:centerX,y:centerY},shouldUsePcbContentCenter=this.isSubcircuit||this.isRoutingDirective||pcbContentBounds!==void 0,center2=hasExplicitPositioning?shouldUsePcbContentCenter?{x:props.width===void 0?centerX:existingCenter.x,y:props.height===void 0?centerY:existingCenter.y}:existingCenter:{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}db22.pcb_group.update(this.pcb_group_id,{width:resolvedWidth,height:resolvedHeight,center:center2})}updatePcbPrimitiveRender(){this.calculatePcbGroupBounds()}getNextAvailableName(elm){var _a543,_b6;return(_a543=this.unnamedElementCounter)[_b6=elm.lowercaseComponentName]??(_a543[_b6]=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:db22}=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),Group_doInitialAssignSchematicSheetToConnectedComponents(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(){if(this._isLegacyAutorouterDisabled())return!1;let autorouter=this._getAutorouterConfig();return autorouter.groupMode==="sequential-trace"?!1:!!(autorouter.local&&autorouter.groupMode==="subcircuit"||!autorouter.local)}_getRoutingPhasePlans(){return Group_getRoutingPhasePlans(this)}_hasTracesToRoute(){let debug132=(0,import_debug11.default)("tscircuit:core:_hasTracesToRoute"),routingPhasePlans=this._getRoutingPhasePlans(),traceCount=0,hasReroutePhaseWithExistingTraceInput=!1;for(let routingPhasePlan of routingPhasePlans){traceCount+=routingPhasePlan.traces.length;let phaseAutorouterConfig=routingPhasePlan.autorouter?getPresetAutoroutingConfig(routingPhasePlan.autorouter,this.root?.platform):void 0;hasReroutePhaseWithExistingTraceInput||(hasReroutePhaseWithExistingTraceInput=!!(routingPhasePlan.reroute&&(routingPhasePlan.region||phaseAutorouterConfig?.preset==="simplify")))}if(debug132(`[${this.getString()}] has ${traceCount} traces to route`),traceCount>0)return!0;if(hasReroutePhaseWithExistingTraceInput){let existingTraceCount=getExistingPcbTracesForReroute(this).length;return debug132(`[${this.getString()}] has ${existingTraceCount} existing pcb traces available for reroute`),existingTraceCount>0}return!1}async _runEffectMakeHttpAutoroutingRequest(){let{db:db22}=this.root,debug132=(0,import_debug11.default)("tscircuit:core:_runEffectMakeHttpAutoroutingRequest"),props=this._parsedProps,autorouterConfig2=this._getAutorouterConfig(),serverUrl=autorouterConfig2.serverUrl,serverMode=autorouterConfig2.serverMode,fetchWithDebug=(url2,options)=>(debug132("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 preferredTraceWidth=props.defaultTraceWidth??props.nominalTraceWidth,{simpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db:db22,minTraceWidth:Number(props.minTraceWidth??.15),nominalTraceWidth:preferredTraceWidth!=null?Number(preferredTraceWidth):void 0,subcircuit_id:this.subcircuit_id,subcircuitComponent:this});simpleRouteJson.allowViaInPad=autorouterConfig2.allowViaInPad;let{autorouting_result:autorouting_result2}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_simple_route_json:simpleRouteJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r22=>r22.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(r22=>r22.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(r22=>r22.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(r22=>r22.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(r22=>r22.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 db22.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:db22}=this.root,props=this._parsedProps,debug132=(0,import_debug11.default)("tscircuit:core:_runLocalAutorouting");debug132(`[${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.defaultTraceWidth??props.nominalTraceWidth??minTraceWidth),routingPhasePlans=this._getRoutingPhasePlans(),hasPhasedAutorouting=this.getInheritedProperty("routeRemaining")===!1||Group_hasPhasedAutorouting(routingPhasePlans),shouldEmitRoutingPhaseDebugObjects=routingPhasePlans.length>1,routingPhaseDebugLabels=new Map;if(shouldEmitRoutingPhaseDebugObjects)for(let debugObject of db22.pcb_debug_object.list())debugObject.subcircuit_id===this.subcircuit_id&&(debugObject.label?.startsWith("Autorouting phase: ")||debugObject.label?.startsWith("autorouting phase "))&&db22.pcb_debug_object.delete(debugObject.pcb_debug_object_id);let emitRoutingPhaseDebugObject=(routingPhasePlan,bounds)=>{if(!shouldEmitRoutingPhaseDebugObjects)return;let phaseLabel=routingPhaseDebugLabels.get(routingPhasePlan),phaseName=routingPhasePlan.phaseName?.trim();db22.pcb_debug_object.insert({shape:"rect",center:{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},size:{width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY},label:`autorouting phase ${phaseLabel}${phaseName?` ${phaseName}`:""}`,subcircuit_id:this.subcircuit_id??void 0})},routingStages=routingPhasePlans.flatMap(routingPhasePlan=>{let resolvedPhaseAutorouterConfig=routingPhasePlan.autorouter?getPresetAutoroutingConfig(routingPhasePlan.autorouter,this.root?.platform):autorouterConfig2,preset=resolvedPhaseAutorouterConfig.preset,implicitPhaseLabel=routingPhasePlan.reroute?preset==="simplify"?"simplify":"reroute":routingPhasePlan.fanoutRegionPcbGroupId?routingPhasePlan.autorouter==="default"&&!routingPhasePlan.getPrecomputedRoutingResult?"breakout":"fanout":preset&&preset!=="default"?preset.replaceAll("_"," "):"default";routingPhaseDebugLabels.set(routingPhasePlan,routingPhasePlan.routingPhaseIndex?.toString()??implicitPhaseLabel);let phaseAutorouterConfig=routingPhasePlan.getPrecomputedRoutingResult?{...resolvedPhaseAutorouterConfig,allowViaInPad:(typeof routingPhasePlan.autorouter=="object"?routingPhasePlan.autorouter.allowViaInPad:void 0)??autorouterConfig2.allowViaInPad}:resolvedPhaseAutorouterConfig,stages=getLocalAutoroutingStages(routingPhasePlan.algorithmFn?{...phaseAutorouterConfig,algorithmFn:routingPhasePlan.algorithmFn}:phaseAutorouterConfig,this.root?.platform);return stages.map((stage,phaseStageIndex)=>({...stage,routingPhasePlan,phaseStageIndex,phaseStageCount:stages.length}))}),implicitPhaseLabelCounts=new Map;for(let plan of routingPhasePlans){if(plan.routingPhaseIndex!==null)continue;let label=routingPhaseDebugLabels.get(plan);implicitPhaseLabelCounts.set(label,(implicitPhaseLabelCounts.get(label)??0)+1)}let implicitPhaseLabelOrdinals=new Map;for(let plan of routingPhasePlans){if(plan.routingPhaseIndex!==null)continue;let label=routingPhaseDebugLabels.get(plan);if(implicitPhaseLabelCounts.get(label)<=1)continue;let ordinal=(implicitPhaseLabelOrdinals.get(label)??0)+1;implicitPhaseLabelOrdinals.set(label,ordinal),routingPhaseDebugLabels.set(plan,`${label} ${ordinal}`)}let fanoutPourNetMap=routingStages.some(({autorouterConfig:autorouterConfig22})=>["fanout","single_layer_fanout","dogbone"].includes(autorouterConfig22.preset??""))?Group_getFanoutPourNetMap(this,routingPhasePlans):void 0,{simpleRouteJson:baseSimpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db:db22,minTraceWidth,nominalTraceWidth,subcircuit_id:this.subcircuit_id,subcircuitComponent:this,fanoutPourNetMap}),emitFanoutBoundsConflictWarning=routingPhasePlan=>{let fanoutRegionPcbGroupId=routingPhasePlan.fanoutRegionPcbGroupId;if(!fanoutRegionPcbGroupId)return;let pcbGroup=db22.pcb_group.get(fanoutRegionPcbGroupId),sourceComponentId=db22.pcb_component.list().find(component=>component.pcb_group_id===fanoutRegionPcbGroupId)?.source_component_id;if(!sourceComponentId)return;let message=`${pcbGroup?.name??"Breakout"} defines conflicting fanout bounds with explicit breakout geometry and fanoutBoundaryPadding. Explicit breakout geometry takes precedence, so fanoutBoundaryPadding is ignored.`;db22.source_property_ignored_warning.list().some(warning=>warning.source_component_id===sourceComponentId&&warning.property_name==="fanoutBoundaryPadding"&&warning.message===message)||db22.source_property_ignored_warning.insert({source_component_id:sourceComponentId,property_name:"fanoutBoundaryPadding",message,error_type:"source_property_ignored_warning",subcircuit_id:pcbGroup?.subcircuit_id})},fanoutConfigByPhasePlan=new Map;for(let routingStage of routingStages){let fanoutMode=routingStage.autorouterConfig.preset;(fanoutMode==="fanout"||fanoutMode==="single_layer_fanout")&&!fanoutConfigByPhasePlan.has(routingStage.routingPhasePlan)&&fanoutConfigByPhasePlan.set(routingStage.routingPhasePlan,routingStage.autorouterConfig)}let fanoutPhaseRegions=[];for(let[routingPhasePlan,phaseAutorouterConfig]of fanoutConfigByPhasePlan){let fanoutRegionPcbGroupId=routingPhasePlan.fanoutRegionPcbGroupId;if(!fanoutRegionPcbGroupId)continue;let phaseSimpleRouteJson=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan);if(phaseSimpleRouteJson.connections.length===0)continue;phaseSimpleRouteJson=Group_applyDrcTolerancesToSimpleRouteJson(phaseSimpleRouteJson,routingPhasePlan.drcTolerances);let breakoutPoints=db22.pcb_breakout_point.list().filter(point62=>point62.pcb_group_id===fanoutRegionPcbGroupId).map(point62=>({x:point62.x,y:point62.y})),fanoutMode=phaseAutorouterConfig.preset,fanoutBounds=FanoutAutorouter.resolveFanoutBounds(phaseSimpleRouteJson,{mode:fanoutMode,busFanoutDirections:routingPhasePlan.busFanoutDirections,fanoutBounds:routingPhasePlan.fanoutBounds,fanoutBoundaryPadding:routingPhasePlan.fanoutBoundaryPadding,fanoutRoutingLayers:routingPhasePlan.fanoutRoutingLayers,allowBlindAndBuriedVias:phaseSimpleRouteJson.allowBlindAndBuriedVias,breakoutPoints,onFanoutBoundsConflict:()=>emitFanoutBoundsConflictWarning(routingPhasePlan)});if(routingPhasePlan.fanoutBounds=fanoutBounds,!fanoutBounds)continue;let pcbGroup=db22.pcb_group.get(fanoutRegionPcbGroupId),maximumTraceWidth=Math.max(phaseSimpleRouteJson.minTraceWidth,...phaseSimpleRouteJson.connections.map(connection=>connection.nominalTraceWidth??connection.width??phaseSimpleRouteJson.minTraceWidth)),viaPadDiameter=phaseSimpleRouteJson.minViaPadDiameter??phaseSimpleRouteJson.min_via_pad_diameter??phaseSimpleRouteJson.minViaDiameter,traceToPadClearance=phaseSimpleRouteJson.minTraceToPadEdgeClearance??phaseSimpleRouteJson.defaultObstacleMargin??maximumTraceWidth;fanoutPhaseRegions.push({regionId:fanoutRegionPcbGroupId,name:pcbGroup?.name??routingPhasePlan.phaseName??fanoutRegionPcbGroupId,bounds:fanoutBounds,boundaryKeepaway:getFanoutBoundaryPointSpacing({traceWidth:maximumTraceWidth,traceToPadClearance,viaPadDiameter})/2})}let fanoutSeparationConflict=findFanoutPhaseSeparationConflict(fanoutPhaseRegions);if(fanoutSeparationConflict){let{firstRegion,secondRegion,availableGap,requiredGap}=fanoutSeparationConflict,separationDescription=availableGap<0?`overlap by ${Math.abs(availableGap).toFixed(3)}mm`:`are only ${availableGap.toFixed(3)}mm apart`,message=`Fanout regions "${firstRegion.name}" and "${secondRegion.name}" ${separationDescription}, but at least ${requiredGap.toFixed(3)}mm of separation is required for a via-safe routing channel. Move the components farther apart or reduce their facing fanout padding.`;throw db22.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouter_error_subcircuit_${this.subcircuit_id}`,error_type:"pcb_autorouting_error",message}),this.root?.emit("autorouting:error",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),error:{message},simpleRouteJson:baseSimpleRouteJson}),new Error(message)}for(let{regionId,bounds}of fanoutPhaseRegions)db22.pcb_group.update(regionId,{center:{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY});let 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)},manualSourceTraceIds=new Set(this.getDescendants().filter(child=>child instanceof Trace&&!child.getSubcircuit()._isInflatedFromCircuitJson&&!!child._parsedProps.pcbPath?.length).map(trace=>trace.source_trace_id)),manualPcbTraceIds=new Set(db22.pcb_trace.list().filter(trace=>trace.source_trace_id&&manualSourceTraceIds.has(trace.source_trace_id)).map(trace=>trace.pcb_trace_id)),fixedTraceIds=new Set(manualPcbTraceIds),previousStageOutputSimpleRouteJson,skippedRemainingPhases=new Set;for(let[routingStageIndex,{routingPhasePlan,autorouterConfig:phaseAutorouterConfig,strategy:localAutorouterStrategy,usesPreviousStageOutput,phaseStageIndex,phaseStageCount}]of routingStages.entries()){if(skippedRemainingPhases.has(routingPhasePlan))continue;if(usesPreviousStageOutput||(previousStageOutputSimpleRouteJson=void 0),usesPreviousStageOutput&&previousStageOutputSimpleRouteJson===void 0)throw new Error("Autorouting follow-up stage is missing the preceding stage output");let simpleRouteJson=previousStageOutputSimpleRouteJson??baseSimpleRouteJson,isTraceSimplificationPhase=!!(routingPhasePlan.reroute&&phaseAutorouterConfig.preset==="simplify"),isRegionReroutePhase=!!(routingPhasePlan.reroute&&routingPhasePlan.region&&!isTraceSimplificationPhase),isConnectionReroutePhase=!!(routingPhasePlan.reroute&&!isTraceSimplificationPhase&&!routingPhasePlan.region&&routingPhasePlan.traces.length>0),isReroutePhase=isRegionReroutePhase||isConnectionReroutePhase||isTraceSimplificationPhase,rerouteOriginalSrj=isRegionReroutePhase?{...baseSimpleRouteJson,traces:[...existingRerouteSeedTraces,...outputTraces]}:null;if(!usesPreviousStageOutput&&isTraceSimplificationPhase)simpleRouteJson={...Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan),traces:getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:existingRerouteSeedTraces,stageOutputPcbTraces:outputTraces})};else if(!usesPreviousStageOutput&&isRegionReroutePhase&&rerouteOriginalSrj)simpleRouteJson=qse(rerouteOriginalSrj,{shape:"rect",...routingPhasePlan.region});else if(!usesPreviousStageOutput&&isConnectionReroutePhase){let phaseInput=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan);simpleRouteJson={...phaseInput,traces:[...phaseInput.traces??[],...outputTraces.filter(trace=>!traceMatchesRoutingPhase(trace,routingPhasePlan))]}}else if(!usesPreviousStageOutput&&hasPhasedAutorouting){let phaseInput=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan),activeCustomBreakoutRoutingGroupId=routingPhasePlan.routingPcbGroupId;if(activeCustomBreakoutRoutingGroupId){let activeGroupCopperPourObstacles=getSimpleRouteJsonFromCircuitJson({db:db22,minTraceWidth,nominalTraceWidth,subcircuit_id:this.subcircuit_id,subcircuitComponent:this,routingPcbGroupId:activeCustomBreakoutRoutingGroupId,fanoutPourNetMap}).simpleRouteJson.obstacles.filter(obstacle=>obstacle.isCopperPour),nonCopperPourObstacles=phaseInput.obstacles.filter(obstacle=>!obstacle.isCopperPour);phaseInput.obstacles=nonCopperPourObstacles.concat(activeGroupCopperPourObstacles)}simpleRouteJson={...phaseInput,traces:getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:phaseInput.traces??[],stageOutputPcbTraces:outputTraces})}}if(phaseAutorouterConfig.preset!=="bus_lanes"){let preservesManualTraceGeometry=!phaseAutorouterConfig.algorithmFn&&(phaseAutorouterConfig.preset==="fanout"||phaseAutorouterConfig.preset==="single_layer_fanout");simpleRouteJson=withFixedTraces(simpleRouteJson,preservesManualTraceGeometry?new Set([...fixedTraceIds].filter(pcbTraceId=>!manualPcbTraceIds.has(pcbTraceId))):fixedTraceIds)}simpleRouteJson=Group_applyDrcTolerancesToSimpleRouteJson(simpleRouteJson,routingPhasePlan.drcTolerances),simpleRouteJson.allowViaInPad=phaseAutorouterConfig.allowViaInPad;let getPrecomputedRoutingResult=usesPreviousStageOutput?void 0:routingPhasePlan.getPrecomputedRoutingResult,preflightRoutingCheckPolicy2=this.getInheritedProperty("preflightRoutingCheckPolicy");if(routingPhasePlan.isImplicitRemainingPhase&&phaseStageIndex===0&&this.getInheritedProperty("routeRemaining")===void 0&&(preflightRoutingCheckPolicy2==="basic"||preflightRoutingCheckPolicy2==="conservative")&&simpleRouteJson.connections.length>50){skippedRemainingPhases.add(routingPhasePlan),db22.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouting_error_remaining_routes_${this.subcircuit_id}`,subcircuit_id:this.subcircuit_id??void 0,error_type:"pcb_autorouting_error",message:`Remaining routes left unrouted (over 50 traces remaining and preflightRoutingCheckPolicy="${preflightRoutingCheckPolicy2}"). Set <board routeRemaining={true} /> or create <autoroutingphase /> elements for specific connections in the order you'd like to route them. The autorouter may hang unless you create autorouting phases incrementally.`});continue}let simplificationHasNoTraceInput=!!(isTraceSimplificationPhase&&simpleRouteJson.traces?.length===0);if((hasPhasedAutorouting||isReroutePhase||usesPreviousStageOutput)&&(simpleRouteJson.connections.length===0&&!isTraceSimplificationPhase&&!getPrecomputedRoutingResult||simplificationHasNoTraceInput)){phaseStageIndex===0&&emitRoutingPhaseDebugObject(routingPhasePlan,simpleRouteJson.bounds),previousStageOutputSimpleRouteJson=simpleRouteJson;continue}let phaseIsAutoJumperPreset=routingPhasePlan.autorouter!==void 0?this._isAutoJumperAutorouter(phaseAutorouterConfig):isAutoJumperPreset,phaseIsLaserPrefabPreset=routingPhasePlan.autorouter!==void 0?this._isLaserPrefabAutorouter(phaseAutorouterConfig):isLaserPrefabPreset;phaseIsAutoJumperPreset&&(simpleRouteJson.allowJumpers=!0,phaseAutorouterConfig.availableJumperTypes&&(simpleRouteJson.availableJumperTypes=phaseAutorouterConfig.availableJumperTypes));let fanoutMode=phaseAutorouterConfig.preset;if((fanoutMode==="fanout"||fanoutMode==="single_layer_fanout")&&!routingPhasePlan.fanoutRegionPcbGroupId&&!getPrecomputedRoutingResult&&(routingPhasePlan.fanoutBounds=FanoutAutorouter.resolveFanoutBounds(simpleRouteJson,{mode:fanoutMode,busFanoutDirections:routingPhasePlan.busFanoutDirections,fanoutBounds:routingPhasePlan.fanoutBounds,fanoutBoundaryPadding:routingPhasePlan.fanoutBoundaryPadding,fanoutRoutingLayers:routingPhasePlan.fanoutRoutingLayers,allowBlindAndBuriedVias:simpleRouteJson.allowBlindAndBuriedVias})),phaseStageIndex===0&&emitRoutingPhaseDebugObject(routingPhasePlan,routingPhasePlan.fanoutBounds??simpleRouteJson.bounds),debug132.enabled&&global.debugOutputArray?.push({name:`simpleroutejson-${this.props.name}.json`,obj:simpleRouteJson}),debug132.enabled){let graphicsObject=Go2(simpleRouteJson);graphicsObject.title=`autorouting-${this.props.name}`,global.debugGraphics?.push(graphicsObject)}let autorouterVersion22=phaseAutorouterConfig.autorouterVersion??this.props.autorouterVersion,effortLevel=this.props.autorouterEffortLevel,effort=effortLevel?Number.parseInt(effortLevel.replace("x",""),10):void 0,commonAutorouterOptions={capacityDepth:phaseAutorouterConfig.capacityDepth,targetMinCapacity:phaseAutorouterConfig.targetMinCapacity,platformConfig:this.root?.platform,useAssignableSolver:phaseIsLaserPrefabPreset||isSingleLayerBoard,useAutoJumperSolver:phaseIsAutoJumperPreset,useLaserPrefabSolver:phaseIsLaserPrefabPreset,autorouterVersion:autorouterVersion22,effort},autorouterName=getPrecomputedRoutingResult?"precomputed":phaseAutorouterConfig.algorithmFn?"custom":localAutorouterStrategy.name,solverName=getPrecomputedRoutingResult||phaseAutorouterConfig.algorithmFn?void 0:localAutorouterStrategy.getSolverName(commonAutorouterOptions),localAutoroutingCacheSolverOptions={autorouterName,solverName,capacityDepth:commonAutorouterOptions.capacityDepth,targetMinCapacity:commonAutorouterOptions.targetMinCapacity,useAssignableSolver:commonAutorouterOptions.useAssignableSolver,useAutoJumperSolver:commonAutorouterOptions.useAutoJumperSolver,useLaserPrefabSolver:commonAutorouterOptions.useLaserPrefabSolver,useTraceSimplificationSolver:phaseAutorouterConfig.preset==="simplify",autorouterVersion:commonAutorouterOptions.autorouterVersion,effort:commonAutorouterOptions.effort},cacheEngine=getPrecomputedRoutingResult||phaseAutorouterConfig.algorithmFn||!localAutorouterStrategy.cacheable?void 0:this.root?.platform?.localCacheEngine,cacheKey=cacheEngine?getLocalAutoroutingCacheKey(simpleRouteJson,localAutoroutingCacheSolverOptions):void 0,cachedResult=cacheKey?await getCachedLocalAutoroutingPhaseResult({cacheEngine,cacheKey}):null,cacheDisabledReason=getPrecomputedRoutingResult?"precomputed":phaseAutorouterConfig.algorithmFn?"custom_algorithm":localAutorouterStrategy.cacheable?cacheEngine?void 0:"no_cache_engine":"strategy_not_cacheable",autoroutingMetadata={routingPhaseIndex:routingPhasePlan.routingPhaseIndex,_actualRoutingPhaseOrderIndex:routingStageIndex,phaseOrdinal:routingStageIndex+1,phaseCount:routingStages.length,connectionCount:simpleRouteJson.connections.length,obstacleCount:simpleRouteJson.obstacles.length,previousTraceCount:simpleRouteJson.traces?.length??0,isReroutePhase,autorouterName,autorouterVersion:autorouterVersion22,solverName,effort,cacheStatus:cacheEngine?cachedResult?"hit":"miss":"disabled",cacheKey,cacheDisabledReason};this.root?.emit("autorouting:start",{type:"autorouting:start",subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},...autoroutingMetadata,simpleRouteJson});let autorouter;try{let traces,precomputedOutputSimpleRouteJson;if(getPrecomputedRoutingResult){let result=getPrecomputedRoutingResult(simpleRouteJson);traces=result.traces,precomputedOutputSimpleRouteJson=result.outputSimpleRouteJson;for(let trace of traces)fixedTraceIds.add(trace.pcb_trace_id)}else if(cachedResult)debug132(`[${this.getString()}] using cached local autorouting result`),traces=cachedResult.traces;else{if(phaseAutorouterConfig.algorithmFn?autorouter=await phaseAutorouterConfig.algorithmFn(simpleRouteJson):autorouter=localAutorouterStrategy.create({simpleRouteJson,onSolverEnded:event=>this.root?.emit("solver:ended",{...event,type:"solver:ended",componentName:this.getString()}),commonAutorouterOptions,busFanoutDirections:routingPhasePlan.busFanoutDirections,fanoutBounds:routingPhasePlan.fanoutBounds,fanoutRoutingLayers:routingPhasePlan.fanoutRoutingLayers,allowBlindAndBuriedVias:simpleRouteJson.allowBlindAndBuriedVias,componentNamesById:getPcbComponentNamesById(db22),onSolverStarted:({solverName:solverName2,solverParams,solverConstructorArgs})=>this.root?.emit("solver:started",{type:"solver:started",solverName:solverName2,solverParams,solverConstructorArgs,componentName:this.getString()})}),!autorouter)throw new Error("Failed to create local autorouter");let activeAutorouter=autorouter,routingPromise=new Promise((resolve,reject)=>{activeAutorouter.on("complete",event=>{debug132(`[${this.getString()}] local autorouting complete`),resolve(event.traces)}),activeAutorouter.on("error",event=>{debug132(`[${this.getString()}] local autorouting error: ${event.error.message}`),reject(event.error)})});activeAutorouter.on("progress",event=>{this.root?.emit("autorouting:progress",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},...autoroutingMetadata,...event,type:"autorouting:progress"})}),activeAutorouter.start(),traces=await routingPromise}let transformedSimpleRouteJson=precomputedOutputSimpleRouteJson??autorouter?.getOutputSimpleRouteJson?.();if(transformedSimpleRouteJson&&!usesPreviousStageOutput&&["fanout","single_layer_fanout","dogbone"].includes(phaseAutorouterConfig.preset??"")&&routingPhasePlan.routingPcbGroupId){let synchronizedFanout=Group_syncFanoutExitsWithGlobalConnections({fanoutInputSimpleRouteJson:simpleRouteJson,fanoutOutputSimpleRouteJson:transformedSimpleRouteJson,baseSimpleRouteJson,routingPhasePlan});baseSimpleRouteJson=synchronizedFanout.baseSimpleRouteJson,transformedSimpleRouteJson=synchronizedFanout.downstreamSimpleRouteJson;for(let synchronizedPoint of synchronizedFanout.synchronizedBreakoutPoints){let breakoutPoint=db22.pcb_breakout_point.list().find(point62=>point62.pcb_group_id===synchronizedPoint.routingPcbGroupId&&point62.source_trace_id===synchronizedPoint.sourceTraceId&&Math.abs(point62.x-synchronizedPoint.previousPoint.x)<=1e-6&&Math.abs(point62.y-synchronizedPoint.previousPoint.y)<=1e-6);breakoutPoint&&db22.pcb_breakout_point.update(breakoutPoint.pcb_breakout_point_id,{x:synchronizedPoint.fanoutExitPoint.x,y:synchronizedPoint.fanoutExitPoint.y,layer:synchronizedPoint.fanoutExitPoint.layer})}}if(localAutorouterStrategy.preserveOutputTraces)for(let trace of traces)fixedTraceIds.add(trace.pcb_trace_id);let stageOutputTraces=traces;transformedSimpleRouteJson?.traces?stageOutputTraces=transformedSimpleRouteJson.traces:usesPreviousStageOutput&&(stageOutputTraces=getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:simpleRouteJson.traces??[],stageOutputPcbTraces:traces}));let eventOutputPcbTraces=stageOutputTraces;!transformedSimpleRouteJson&&!usesPreviousStageOutput&&routingPhasePlan.routingPhaseIndex!==null&&(eventOutputPcbTraces=getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:simpleRouteJson.traces??[],stageOutputPcbTraces:traces}));let outputSimpleRouteJson={...transformedSimpleRouteJson??simpleRouteJson,traces:eventOutputPcbTraces};previousStageOutputSimpleRouteJson=transformedSimpleRouteJson?outputSimpleRouteJson:void 0,!cachedResult&&cacheKey&&await cacheLocalAutoroutingPhaseResult({cacheEngine,cacheKey,result:{...simpleRouteJson,traces}});let savedPhasePaths=getAutoroutingPhasePcbTracePaths({group:this.selectAll("group").find(group2=>group2.pcb_group_id===routingPhasePlan.fanoutRegionPcbGroupId)??routingPhasePlan.autoroutingPhase?.getGroup()??this,subcircuit:this,input:simpleRouteJson,traces,isFanout:["fanout","single_layer_fanout","dogbone"].includes(phaseAutorouterConfig.preset??"")});if(this.root?.emit("autorouting:end",{...savedPhasePaths,type:"autorouting:end",subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},...autoroutingMetadata,simpleRouteJson:outputSimpleRouteJson}),autorouter?.getConnectedOffboardObstacles){let connectedOffboardObstacles=autorouter.getConnectedOffboardObstacles();createSourceTracesFromOffboardConnections({db:db22,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=Jse(rerouteOriginalSrj,{...simpleRouteJson,traces:[...simpleRouteJson.traces??[],...traces]});outputTraces.splice(0,outputTraces.length,...reconnectedSrj.traces??[])}else if(isConnectionReroutePhase){let retainedPcbTraces=outputTraces.filter(trace=>!traceMatchesRoutingPhase(trace,routingPhasePlan));outputTraces.splice(0,outputTraces.length,...getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:retainedPcbTraces,stageOutputPcbTraces:stageOutputTraces}))}else{if(isTraceSimplificationPhase)for(let existingTrace of existingRerouteSeedTraces)fixedTraceIds.has(existingTrace.pcb_trace_id)||pcbTraceIdsToDelete.add(existingTrace.pcb_trace_id);outputTraces.splice(0,outputTraces.length,...getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:outputTraces,stageOutputPcbTraces:stageOutputTraces}))}}catch(error2){let{db:db32}=this.root;throw db32.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",{type:"autorouting:error",subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},...autoroutingMetadata,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]},this._markDirty("PcbTraceRender")}_startAsyncAutorouting(){this._hasStartedAsyncAutorouting||(this._hasStartedAsyncAutorouting=!0,this._getAutorouterConfig().local?this._queueAsyncEffect("autorouting",async()=>this._runLocalAutorouting()):this._queueAsyncEffect("make-http-autorouting-request",async()=>this._runEffectMakeHttpAutoroutingRequest()))}doInitialPcbTraceRender(){let debug132=(0,import_debug11.default)("tscircuit:core:doInitialPcbTraceRender");if(!this.isSubcircuit||this.root?.pcbDisabled||this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled")||this._isInflatedFromCircuitJson||this._isLegacyAutorouterDisabled()||this._shouldUseTraceByTraceRouting())return;if(!this._areChildSubcircuitsRouted()){debug132(`[${this.getString()}] child subcircuits are not routed, skipping async autorouting until subcircuits routed`);return}if(debug132(`[${this.getString()}] no child subcircuits to wait for, initiating async routing`),!this._hasTracesToRoute())return;let shouldSkipBecauseOfPlacementErrors=shouldSkipAutoroutingBecauseOfPlacementErrors({component:this,subcircuit:this}),shouldSkipBecauseOfTraceLengthViolations=shouldSkipAutoroutingBecauseOfTraceLengthViolations({component:this,subcircuit:this});shouldSkipBecauseOfPlacementErrors||shouldSkipBecauseOfTraceLengthViolations||this._startAsyncAutorouting()}doInitialSchematicTraceRender(){this._parsedProps.showAsSchematicBox||Group_doInitialSchematicTraceRender(this)}doInitialSchematicSheetRender(){Group_doInitialSchematicSheetRender(this)}updateSchematicSheetRender(){Group_updateSchematicSheetRender(this)}updatePcbTraceRender(){let debug132=(0,import_debug11.default)("tscircuit:core:updatePcbTraceRender");if(debug132(`[${this.getString()}] updating...`),!this.isSubcircuit||this._isInflatedFromCircuitJson||this._isLegacyAutorouterDisabled())return;if(this._shouldRouteAsync()&&this._hasTracesToRoute()&&!this._hasStartedAsyncAutorouting){if(this._areChildSubcircuitsRouted()){let shouldSkipBecauseOfPlacementErrors=shouldSkipAutoroutingBecauseOfPlacementErrors({component:this,subcircuit:this}),shouldSkipBecauseOfTraceLengthViolations=shouldSkipAutoroutingBecauseOfTraceLengthViolations({component:this,subcircuit:this});if(shouldSkipBecauseOfPlacementErrors||shouldSkipBecauseOfTraceLengthViolations)return;debug132(`[${this.getString()}] child subcircuits are now routed, starting async autorouting`),this._startAsyncAutorouting()}return}if(!this._asyncAutoroutingResult||this._shouldUseTraceByTraceRouting())return;let{db:db22}=this.root;if(this._asyncAutoroutingResult.output_simple_route_json){debug132(`[${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){debug132(`[${this.getString()}] updating PCB traces from ${this._asyncAutoroutingResult.output_pcb_traces.length} traces`),this._updatePcbTraceRenderFromPcbTraces();return}}_updatePcbTraceRenderFromSimpleRouteJson(){let{db:db22}=this.root,{traces:routedTraces}=this._asyncAutoroutingResult.output_simple_route_json;if(routedTraces)for(let routedTrace of routedTraces){let cjRoute=routedTrace.route.map(point62=>point62.route_type!=="through_obstacle"?point62:{route_type:"through_pad",start:point62.start,end:point62.end,start_layer:point62.from_layer,end_layer:point62.to_layer,width:point62.width,circuitJsonMetadata:point62.circuitJsonMetadata}),pcb_trace3=db22.pcb_trace.insert({subcircuit_id:this.subcircuit_id,route:getCircuitJsonPcbTraceRoute(cjRoute)});claimSrjAssignablePcbViasTraversedByRoute({db:db22,pcbTrace:pcb_trace3,routeWithSrjMetadata:cjRoute})}}_updatePcbTraceRenderFromPcbTraces(){let{output_pcb_traces,output_jumpers,pcb_trace_ids_to_be_replaced}=this._asyncAutoroutingResult;if(!output_pcb_traces)return;let{db:db22}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2),boardComponent=this._getBoard(),board=boardComponent?.pcb_board_id?db22.pcb_board.get(boardComponent.pcb_board_id):db22.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:db22,output_jumpers,subcircuit_id:this.subcircuit_id}),deleteExistingPcbTracesReplacedBy({group:this,outputPcbTraces:output_pcb_traces,pcbTraceIdsToReplace:pcb_trace_ids_to_be_replaced});let materializedPcbVias=db22.pcb_via.list(),jumperPadInfos=getJumperPadInfos(db22);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(point62=>point62.route_type!=="through_obstacle"?point62:{route_type:"through_pad",start:point62.start,end:point62.end,start_layer:point62.from_layer,end_layer:point62.to_layer,width:point62.width,circuitJsonMetadata:point62.circuitJsonMetadata}),routeSourceTraceId=getSourceTraceIdForRoutedTrace({db:db22,trace:{...pcb_trace3,route:cjRoute},subcircuit_id:this.subcircuit_id});cjRoute=ensureRouteStartsAtSourceTraceStart({db:db22,route:cjRoute,routeThicknessMode:pcb_trace3.route_thickness_mode,sourceTraceId:routeSourceTraceId}),pcb_trace3.route=cjRoute;let segments=splitPcbTracesOnJumperSegments(cjRoute);segments===null&&(segments=[cjRoute]);let processedSegments=addPortIdsToTracesAtJumperPads(segments,jumperPadInfos);for(let segment2 of processedSegments)if(segment2.length>0){let circuitJsonSegment=getCircuitJsonPcbTraceRoute(segment2),sourceTraceId=getSourceTraceIdForRoutedTrace({db:db22,trace:{...pcb_trace3,route:circuitJsonSegment},subcircuit_id:this.subcircuit_id}),insertedPcbTrace=db22.pcb_trace.insert({...pcb_trace3,source_trace_id:sourceTraceId,route:circuitJsonSegment});claimSrjAssignablePcbViasTraversedByRoute({db:db22,pcbTrace:insertedPcbTrace,routeWithSrjMetadata:segment2})}}for(let pcb_trace3 of output_pcb_traces)if(pcb_trace3.type!=="pcb_via"&&pcb_trace3.type==="pcb_trace"){let sourceTraceId=getSourceTraceIdForRoutedTrace({db:db22,trace:pcb_trace3,subcircuit_id:this.subcircuit_id}),{connection_name:inputConnectionName}=pcb_trace3,subcircuitConnectivityMapKey;if(sourceTraceId&&(subcircuitConnectivityMapKey=db22.source_trace.get(sourceTraceId)?.subcircuit_connectivity_map_key),!subcircuitConnectivityMapKey&&inputConnectionName){let sourceNet=db22.source_net.get(inputConnectionName);sourceNet&&(subcircuitConnectivityMapKey=sourceNet.subcircuit_connectivity_map_key)}for(let point62 of pcb_trace3.route)if(point62.route_type==="via"){let routedViaPoint=point62,fromLayer=point62.from_layer,toLayer=point62.to_layer,pcbVia={pcb_trace_id:pcb_trace3.pcb_trace_id,x:point62.x,y:point62.y,hole_diameter:routedViaPoint.via_hole_diameter??routedViaPoint.hole_diameter??routedViaHoleDiameter,outer_diameter:routedViaPoint.via_diameter??routedViaPoint.outer_diameter??routedViaPadDiameter,layers:getAutoroutedViaLayers({fromLayer,toLayer,layerCount:this._getSubcircuitLayerCount(),allowBlindAndBuriedVias:board?.allow_blind_and_buried_vias??!1,physicalLayers:routedViaPoint.layers}),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};if(materializedPcbVias.some(materializedPcbVia=>pcbViasSharePhysicalHole(materializedPcbVia,pcbVia)))continue;materializedPcbVias.push(db22.pcb_via.insert(pcbVia))}}}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db:db22}=this.root,{_parsedProps:props}=this,schematic_group3=db22.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.getDescendants())child.getGroup()?.source_group_id===this.source_group_id&&(child._parsedProps?.showAsSchematicBox||child.schematic_component_id&&db22.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(c22=>c22.source_component_id!==null&&c22._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:db22}=this.root,props=this._parsedProps;if(props.pcbX!==void 0||props.pcbY!==void 0){let parentGroup=this.parent?.getGroup?.(),pcbParentGroupId=parentGroup?.pcb_group_id?db22.pcb_group.get(parentGroup.pcb_group_id)?.pcb_group_id:void 0,positionedRelativeToBoardId=pcbParentGroupId?void 0:this._getBoard()?.pcb_board_id??void 0;db22.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:db22}=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?db22.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;db22.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 dx22=port.center.x-component.center.x,dy22=port.center.y-component.center.y;return Math.abs(dx22)>Math.abs(dy22)?dx22>0?"right":"left":dy22>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)}_isLegacyAutorouterDisabled(){return getDisabledLegacyAutorouterPreset(this)!==null}_isLaserPrefabAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize4=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="laser_prefab"?!0:typeof autorouterProp2=="string"?normalize4(autorouterProp2)==="laser_prefab":typeof autorouterProp2=="object"&&autorouterProp2?normalize4(autorouterProp2.preset)==="laser_prefab":!1}_isAutoJumperAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize4=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="auto_jumper"?!0:typeof autorouterProp2=="string"?normalize4(autorouterProp2)==="auto_jumper":typeof autorouterProp2=="object"&&autorouterProp2?normalize4(autorouterProp2.preset)==="auto_jumper":!1}_getSubcircuitLayerCount(){let layers=this.getInheritedProperty("layers");return typeof layers=="number"?layers:2}_shouldUseTraceByTraceRouting(){return getDisabledLegacyGroupAutorouterPreset(this)?!1:this._getAutorouterConfig().groupMode==="sequential-trace"}doInitialPcbDesignRuleChecks(){if(this.root?.pcbDisabled||this._isLegacyAutorouterDisabled()||this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"))return;let{db:db22}=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 Trace),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.`;db22.pcb_trace_error.insert({error_type:"pcb_trace_error",message,source_trace_id:"",pcb_trace_id:"",pcb_component_ids:components.map(c22=>c22.pcb_component_id).filter(Boolean),pcb_port_ids:[]})}}}Group_doInitialStandaloneSubcircuitPcbDesignRuleChecks(this)}doInitialSchematicLabelNetsWithConflictingNames(){this.root?.schematicDisabled||this.getTopLevelRenderable()===this&&assignSchematicNetLabelSuperscripts(this.root.db)}updateSchematicLabelNetsWithConflictingNames(){this.doInitialSchematicLabelNetsWithConflictingNames()}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled||!this.isSubcircuit)return;let{db:db22}=this.root,subtree=db22;for(let nl3 of subtree.schematic_net_label.list()){let net=subtree.source_net.get(nl3.source_net_id),text=nl3.text||net?.name||"",isGroundNet=net?.is_ground||GROUND_NET_REGEX.test(text),isPowerNet=net?.is_power||POWER_NET_REGEX.test(text);if(nl3.anchor_side==="top"&&isGroundNet){subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_down"});continue}nl3.anchor_side==="bottom"&&isPowerNet&&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 group2=new Group5(groupProps2);return group2._isInflatedFromCircuitJson=!0,group2.source_group_id=sourceGroup.source_group_id,groupsMap&&groupsMap.set(sourceGroup.source_group_id,group2),sourceGroup.parent_source_group_id&&groupsMap?.has(sourceGroup.parent_source_group_id)?groupsMap.get(sourceGroup.parent_source_group_id).add(group2):subcircuit.add(group2),group2}var Inductor2=class extends NormalComponent{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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({name:this.name,ftype:FTYPE.simple_inductor,inductance:this.props.inductance,max_current_rating:props.maxCurrentRating===void 0?void 0:parseAndConvertSiUnit(props.maxCurrentRating,"A").value,display_inductance:this._getSchematicSymbolDisplayValue(),supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,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 generatedNotes=new WeakMap,getPolarity2=port=>{let hints=[port.name,...port.port_hints??[]].map(hint=>hint.toLowerCase().replace(/[^a-z0-9+-]/g,"")),anode=hints.some(hint=>["a","anode","pos","positive","+"].includes(hint)),cathode=hints.some(hint=>["k","c","cathode","neg","negative","-"].includes(hint));return anode===cathode?null:anode?"anode":"cathode"},Led_addPolarityFabricationSymbol=led2=>{let root=led2.root;if(!root)return;let{db:db22}=root,previous=generatedNotes.get(led2);for(let path of previous??[])db22.pcb_fabrication_note_path.delete(path.pcb_fabrication_note_path_id);if(generatedNotes.delete(led2),root.pcbDisabled||!led2.pcb_component_id)return;let pcb=db22.pcb_component.get(led2.pcb_component_id);if(!pcb||pcb.layer!=="top"&&pcb.layer!=="bottom")return;let ports=db22.source_port.list({source_component_id:led2.source_component_id}),anodes=ports.filter(port=>getPolarity2(port)==="anode"),cathodes=ports.filter(port=>getPolarity2(port)==="cathode");if(anodes.length!==1||cathodes.length!==1)return;let anode=anodes[0],cathode=cathodes[0],a22=db22.pcb_port.getWhere({source_port_id:anode.source_port_id}),k22=db22.pcb_port.getWhere({source_port_id:cathode.source_port_id});if(!a22||!k22)return;let distance27=Math.hypot(k22.x-a22.x,k22.y-a22.y);if(distance27<1e-6)return;let angle=Math.atan2(k22.y-a22.y,k22.x-a22.x),frame=compose2(translate2((a22.x+k22.x)/2,(a22.y+k22.y)/2),rotate2(angle)),point62=(x22,y22)=>applyToPoint2(frame,{x:x22,y:y22}),common={pcb_component_id:pcb.pcb_component_id,subcircuit_id:led2.getSubcircuit()?.subcircuit_id??void 0,layer:pcb.layer},notes=[];generatedNotes.set(led2,notes);let halfLength=Math.min(distance27*.2,.4),halfHeight=halfLength*.75,routes=[[point62(-distance27/2,0),point62(-halfLength,0)],[point62(-halfLength,-halfHeight),point62(halfLength,0),point62(-halfLength,halfHeight),point62(-halfLength,-halfHeight)],[point62(halfLength,-halfHeight),point62(halfLength,halfHeight)],[point62(halfLength,0),point62(distance27/2,0)]];for(let route of routes)notes.push(db22.pcb_fabrication_note_path.insert({...common,route,stroke_width:.08}))},Led=class extends NormalComponent{get config(){let symbolMap={laser:"laser_diode"},variantSymbol=this.props.laser?"laser":null,baseSymbolName=variantSymbol?symbolMap[variantSymbol]:this.props.symbolName??"led",compactSize=this.props.schSize==="sm"||this.props.schSize==="xs"?this.props.schSize:void 0,compactSymbolName=compactSize&&baseSymbolName==="led"?`led_${compactSize}`:void 0;return{schematicSymbolName:compactSymbolName&&`${compactSymbolName}_right`in zh?compactSymbolName:baseSymbolName,componentName:"Led",zodProps:ledProps,sourceFtype:"simple_led"}}initPorts(){let hasFootprintChild=this.children.some(child=>child.componentName==="Footprint"),footprint=this.resolveFootprint(),hasPinLabels=!!this._resolvePinLabels(),shouldAddDefaultAliases=!hasPinLabels&&!hasFootprintChild&&(!footprint||isFootprinterString(footprint));super.initPorts({pinCount:2,ignoreSymbolPorts:!hasPinLabels&&!shouldAddDefaultAliases,additionalAliases:{pin1:shouldAddDefaultAliases?["anode","pos","left"]:[],pin2:shouldAddDefaultAliases?["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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.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}get pos(){return this.portMap.pos}doInitialPcbComponentSizeCalculation(){super.doInitialPcbComponentSizeCalculation(),Led_addPolarityFabricationSymbol(this)}get anode(){return this.portMap.anode}get neg(){return this.portMap.neg}get cathode(){return this.portMap.cathode}};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)}var possibleOrientations=[{gate:"left",drain:"top",source:"bottom"},{gate:"left",drain:"bottom",source:"top"},{gate:"right",drain:"top",source:"bottom"},{gate:"right",drain:"bottom",source:"top"},{gate:"top",drain:"left",source:"right"},{gate:"top",drain:"right",source:"left"},{gate:"bottom",drain:"left",source:"right"},{gate:"bottom",drain:"right",source:"left"}],getBaselineOrientation=rotation5=>{let normalizedRotation=(rotation5%360+360)%360;if(normalizedRotation%90!==0)throw new Error(`Schematic rotation ${rotation5} is not supported for Mosfet`);return[{gate:"left",drain:"top",source:"bottom"},{gate:"top",drain:"right",source:"left"},{gate:"right",drain:"bottom",source:"top"},{gate:"bottom",drain:"left",source:"right"}][normalizedRotation/90]},getRequestedOrientation=props=>{let requestedSides={drain:props.symbolDrainSide,source:props.symbolSourceSide,gate:props.symbolGateSide},baseline=getBaselineOrientation(Number(props.schRotation??0)),matchingOrientations=possibleOrientations.filter(orientation22=>Object.keys(requestedSides).every(portName=>requestedSides[portName]===void 0||requestedSides[portName]===orientation22[portName]));if(matchingOrientations.length===0){let requestedDescription=Object.entries(requestedSides).filter(([,side])=>side!==void 0).map(([portName,side])=>`${portName}=${side}`).join(", ");throw new Error(`Invalid MOSFET symbol port side combination (${requestedDescription}). The gate must be perpendicular to the drain and source, and the drain and source must be opposite.`)}return matchingOrientations.sort((a22,b22)=>{let score=orientation22=>Object.keys(baseline).filter(portName=>orientation22[portName]!==baseline[portName]).length;return score(a22)-score(b22)})[0]},getMosfetSchematicSymbolName=props=>{let mosfetMode=props.mosfetMode==="depletion"?"d":"e",baseSymbolName=`${props.channelType}_channel_${mosfetMode}_mosfet_transistor`;if(!(props.symbolDrainSide!==void 0||props.symbolSourceSide!==void 0||props.symbolGateSide!==void 0))return baseSymbolName;let{gate,drain}=getRequestedOrientation(props);return`${baseSymbolName}_gate_${gate}_drain_${drain}`},Mosfet2=class extends NormalComponent{get config(){return{componentName:"Mosfet",schematicSymbolName:this.props.symbolName??getMosfetSchematicSymbolName(this.props),zodProps:mosfetProps,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_mosfet",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,mosfet_mode:props.mosfetMode,channel_type:props.channelType,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceMosfet(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}),mosfet=new Mosfet2({name:sourceElm.name,channelType:sourceElm.channel_type,mosfetMode:sourceElm.mosfet_mode,manufacturerPartNumber:sourceElm.manufacturer_part_number,supplierPartNumbers:sourceElm.supplier_part_numbers??void 0,displayName:sourceElm.display_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:mosfet});footprint&&mosfet.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(mosfet):subcircuit.add(mosfet)}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:db22}=root,pcb_port3=db22.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 NormalComponent{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=zh[this._getSchematicSymbolNameOrThrow()],symPort1=symbol.ports.find(p22=>p22.labels.includes("1")),symPort2=symbol.ports.find(p22=>p22.labels.includes("2")),ports=this.selectAll("port"),pin1Port=ports.find(port=>port.props.pinNumber===1);pin1Port.schematicSymbolPortDef=symPort1;let firstTerminalPorts=new Set(pin1Port._getPortsInternallyConnectedToThisPort()),secondTerminalPort=ports.filter(port=>port!==pin1Port&&!firstTerminalPorts.has(port)).sort((a22,b22)=>(a22.props.pinNumber??0)-(b22.props.pinNumber??0))[0];secondTerminalPort&&(secondTerminalPort.schematicSymbolPortDef=symPort2)}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({name:this.name,ftype:FTYPE.simple_push_button,supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,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 NormalComponent{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){let baseSymbolName=this.props.symbolName??"boxresistor",compactSize=this.props.schSize==="sm"||this.props.schSize==="xs"?this.props.schSize:void 0,compactSymbolName=compactSize&&(baseSymbolName==="boxresistor"||baseSymbolName==="resistor")?`${baseSymbolName}_${compactSize}`:void 0;return{componentName:"Resistor",schematicSymbolName:compactSymbolName&&`${compactSymbolName}_right`in zh?compactSymbolName:baseSymbolName,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 Trace({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pullupFor})),this.add(new Trace({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pullupTo}))),this.props.pulldownFor&&this.props.pulldownTo&&(this.add(new Trace({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pulldownFor})),this.add(new Trace({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pulldownTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.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 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 NormalComponent{_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:db22}=this.root,props=this._parsedProps??{},source_component=db22.source_component.insert({ftype:"simple_switch",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,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:db22}=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),db22.simulation_switch.insert(simulationSwitch)}},getImportedSwitchProps=(sourceElm,inflatorContext)=>{let sourcePorts=inflatorContext.injectionDb.source_port.list().filter(port=>port.source_component_id===sourceElm.source_component_id),pinLabels={},highestPinNumber=0;for(let sourcePort of sourcePorts){let pinNumber=sourcePort.pin_number;if(pinNumber==null)continue;highestPinNumber=Math.max(highestPinNumber,pinNumber);let labels=Array.from(new Set([sourcePort.name,...sourcePort.port_hints??[]].filter(label=>typeof label=="string"&&label.length>0)));labels.length>0&&(pinLabels[`pin${pinNumber}`]=labels)}let type="spst";return highestPinNumber>=5?type="dpdt":highestPinNumber===4?type="dpst":highestPinNumber===3&&(type="spdt"),{type,pinLabels:Object.keys(pinLabels).length>0?pinLabels:void 0}};function inflateSourceSwitch(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}),importedSwitchProps=getImportedSwitchProps(sourceElm,inflatorContext),switchComponent=new Switch({name:sourceElm.name,displayName:sourceElm.display_name,...importedSwitchProps,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:switchComponent});footprint&&switchComponent.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(switchComponent):subcircuit.add(switchComponent)}function pcbTraceRouteToPcbPath(route){if(route.length<=2)return[];let firstPoint=route[0],lastPoint=route[route.length-1];return route.slice(1,-1).filter(point62=>{let position4=getRoutePointPosition(point62),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(point62=>{if(point62.route_type==="via")return{x:point62.x,y:point62.y,via:!0,fromLayer:point62.from_layer,toLayer:point62.to_layer};let position4=getRoutePointPosition(point62);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&¤tGroupId!==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(pt22=>pt22.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 Trace(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 SHORT_ALIASES={collector:["c"],base:["b"],emitter:["e"]},Transistor=class extends NormalComponent{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 additionalAliases={},symbol=this.getSchematicSymbol();for(let symPort of symbol?.ports??[]){let pinNumber=getPinNumberFromLabels(symPort.labels);if(pinNumber)for(let label of symPort.labels){let shortAliases=SHORT_ALIASES[label];shortAliases&&(additionalAliases[`pin${pinNumber}`]=shortAliases)}}super.initPorts({pinCount:3,additionalAliases})}get collector(){return this.portMap.collector}get base(){return this.portMap.base}get emitter(){return this.portMap.emitter}doInitialCreateNetsFromProps(){this._createNetsFromProps([...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_transistor",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,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","pcb_hole","pcb_plated_hole","pcb_cutout"],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(point62=>point62.route_type==="via"&&Math.abs(point62.x-elm.x)<1e-4&&Math.abs(point62.y-elm.y)<1e-4))}return elm.type==="pcb_cutout"?!0:"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(g22=>!g22.parent_source_group_id||renderedGroupIds.has(g22.parent_source_group_id));if(groupIndex===-1){let remainingIds=groupsToRender.map(g22=>g22.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_connector":inflateSourceConnector(sourceComponent,inflationCtx);break;case"simple_transistor":inflateSourceTransistor(sourceComponent,inflationCtx);break;case"simple_mosfet":inflateSourceMosfet(sourceComponent,inflationCtx);break;case"simple_push_button":inflateSourcePushButton(sourceComponent,inflationCtx);break;case"simple_switch":inflateSourceSwitch(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)};function createCircuitJsonDatabase(){if(typeof cju_indexed_default!="function")return cju_default([]);let indexed=cju_indexed_default([],{indexConfig:{byId:!0,byType:!0}});return typeof indexed.insert!="function"||typeof indexed.insertAll!="function"||typeof indexed.subtree!="function"?cju_default([]):indexed}var 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,"_featurePcbViaStitching",!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,"_hasRenderLifecycleListeners",!1);__publicField(this,"_eventListeners",{});this.children=[],this.db=createCircuitJsonDatabase(),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_react7.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 findBoard=components=>{for(let child of components){if(child.componentName==="Board")return child;if(isAssemblyDeviceContainer(child)){let nested=findBoard(child.children);if(nested)return nested}}};return findBoard(this.children)}_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||isAssemblyDeviceContainer(this.children[0]))){this.firstChild=this.children[0];return}let group2=new Group5({subcircuit:!0});group2.parent=this,group2.addAll(this.children),this.children=[group2],this.firstChild=group2}render(){this.firstChild||this._guessRootComponent();let{firstChild,db:db22}=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=>{let resume=()=>{clearTimeout(timer),this.removeListener("asyncEffect:end",resume),resolve()},timer=setTimeout(resume,100);this.on("asyncEffect:end",resume),this._hasUnrenderedUpdatesFromAsyncEffects&&resume()}),(this._hasUnrenderedUpdatesFromAsyncEffects||this._asyncEffectPhaseById.size===0)&&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(e210=>{throw new Error(`To use circuit.getSvg, you must install the "circuit-to-svg" package.
|
|
954
954
|
|
|
955
955
|
"${e210.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)}hasEventListener(event){return(this._eventListeners[event]?.length??0)>0}on(event,listener){this._eventListeners[event]||(this._eventListeners[event]=[]),this._eventListeners[event].push(listener),event.startsWith("renderable:renderLifecycle:")&&(this._hasRenderLifecycleListeners=!0)}removeListener(event,listener){this._eventListeners[event]&&(this._eventListeners[event]=this._eventListeners[event].filter(l22=>l22!==listener),event.startsWith("renderable:renderLifecycle:")&&(this._hasRenderLifecycleListeners=Object.entries(this._eventListeners).some(([eventName,listeners])=>eventName.startsWith("renderable:renderLifecycle:")&&listeners.length>0)))}enableDebug(debug132){typeof debug132=="string"?import_debug21.default.enable(debug132):(debug132===null||debug132===!1)&&import_debug21.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(v22=>safeSerialize(v22,seen)).join(",")}]`:`{${Object.keys(value).sort().map(k22=>`${k22}:${safeSerialize(value[k22],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 i22=0;i22<str.length;i22++)hash^=str.charCodeAt(i22),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 Board_updatePcbDesignRuleChecks=board=>{let{db:db22}=board.root,routingDisabled=board.root?.pcbRoutingDisabled||board.getInheritedProperty("routingDisabled"),pcbDisabled=board.root?.pcbDisabled,schematicDisabled=board.root?.schematicDisabled,drcChecksDisabled=board.root?.platform?.drcChecksDisabled??board.getInheritedProperty("drcChecksDisabled");if(drcChecksDisabled){board._drcChecksComplete=!0;return}let netlistDrcChecksDisabled=board.root?.platform?.netlistDrcChecksDisabled??board.getInheritedProperty("netlistDrcChecksDisabled"),pinSpecificationDrcChecksDisabled=board.getInheritedProperty("pinSpecificationDrcChecksDisabled"),placementDrcChecksDisabled=board.root?.platform?.placementDrcChecksDisabled??board.getInheritedProperty("placementDrcChecksDisabled"),routingDrcChecksDisabled=board.root?.platform?.routingDrcChecksDisabled??board.getInheritedProperty("routingDrcChecksDisabled"),shouldRunNetlistChecks=!drcChecksDisabled&&!netlistDrcChecksDisabled,shouldRunPinSpecificationChecks=!drcChecksDisabled&&!pinSpecificationDrcChecksDisabled,shouldRunSchematicChecks=!drcChecksDisabled&&!schematicDisabled,shouldRunPlacementChecks=!drcChecksDisabled&&!pcbDisabled&&!placementDrcChecksDisabled,shouldRunRoutingChecks=!drcChecksDisabled&&!pcbDisabled&&!routingDisabled&&!routingDrcChecksDisabled,fabricatorEngine3=board.root?.platform?.fabricatorEngine,fabricatorPreset=board._parsedProps.fabricatorPreset,shouldRunFabricatorChecks=!drcChecksDisabled&&!pcbDisabled&&!!fabricatorEngine3&&!!fabricatorPreset;if((shouldRunRoutingChecks||shouldRunFabricatorChecks)&&board._hasIncompleteAsyncEffectsInSubtreeForPhase("PcbTraceRender"))return;let hasTracesToRoute=board._hasTracesToRoute();if((shouldRunRoutingChecks||shouldRunFabricatorChecks)&&hasTracesToRoute&&!board._areChildSubcircuitsRouted()||board._drcChecksComplete||board._drcChecksInProgress)return;let runDrcChecks2=async circuitJson=>{let checksToRun=[],queueCheck=(checkName,check)=>{checksToRun.push(Promise.resolve().then(check).catch(error2=>{let cause=error2 instanceof Error?error2.message:String(error2);return db22.source_runtime_error.insert({error_type:"source_runtime_error",phase_name:"PcbDesignRuleChecks",message:`DRC could not complete (${checkName}): ${cause}`}),[]}))},pcbBoardId=board.pcb_board_id;if(shouldRunFabricatorChecks&&fabricatorEngine3&&fabricatorPreset&&pcbBoardId&&queueCheck("fabricator",()=>fabricatorEngine3.runDrcChecks({circuitJson,fabricatorPreset,pcbBoardId})),shouldRunRoutingChecks&&queueCheck("routing",()=>runAllRoutingChecks(circuitJson).then(results=>results.filter(result=>!board._isExpectedCastellatedHoleDrcError(result)))),shouldRunPlacementChecks){let existingPlacementDiagnostics=db22.toArray();queueCheck("placement",()=>runAllPlacementChecks(circuitJson,{consolidateOverlaps:!1}).then(results=>consolidatePcbOverlapErrors(circuitJson,results.filter(result=>!board._isExpectedCastellatedHoleDrcError(result))).filter(result=>!existingPlacementDiagnostics.some(existing=>existing.type===result.type&&"message"in existing&&existing.message===result.message))))}if(shouldRunNetlistChecks&&queueCheck("netlist",()=>runAllNetlistChecks(circuitJson)),shouldRunPinSpecificationChecks&&queueCheck("pin_specification",()=>runAllPinSpecificationChecks(circuitJson)),shouldRunSchematicChecks&&queueCheck("schematic",()=>runAllSchematicChecks(circuitJson)),!drcChecksDisabled)for(let drcCheck of board.selectAll("drccheck"))queueCheck(drcCheck.getString(),()=>drcCheck.runCustomDrcCheck(circuitJson));let checkResults=await Promise.all(checksToRun);db22.insertAll(consolidatePcbOverlapErrors(circuitJson,dedupePcbDrcErrors(checkResults.flat())))},subcircuitCircuitJson=db22.subtree({subcircuit_id:board.subcircuit_id}).toArray();board._drcChecksInProgress=!0,board._queueAsyncEffect("board:drc-checks",async()=>{try{await runDrcChecks2(subcircuitCircuitJson),board._drcChecksComplete=!0}finally{board._drcChecksInProgress=!1}})},GEOMETRY_SCALE=1e6,CONTACT_TOLERANCE=1e-7*GEOMETRY_SCALE,getRouteEndpoint=(routePoint2,side)=>routePoint2.route_type==="wire"?{point:routePoint2,layer:routePoint2.layer}:routePoint2.route_type==="via"?{point:routePoint2,layer:side==="start"?routePoint2.from_layer:routePoint2.to_layer}:{point:routePoint2[side],layer:side==="start"?routePoint2.start_layer:routePoint2.end_layer},findFloatingCopper=(circuitJson,generatedStitchingViaIds=new Set)=>{let connectivity=getFullConnectivityMapFromCircuitJson(circuitJson),pours=circuitJson.filter(e210=>e210.type==="pcb_copper_pour"),pouredNets=new Set(pours.flatMap(pour=>pour.source_net_id?[connectivity.getNetConnectedToId(pour.source_net_id)??pour.source_net_id]:[])),conductors=[],add=conductor=>{pouredNets.has(conductor.netId)&&!conductor.polygon.isEmpty()&&conductors.push({...conductor,polygon:conductor.polygon.scale(GEOMETRY_SCALE,GEOMETRY_SCALE)})},components=new Map(circuitJson.filter(e210=>e210.type==="pcb_component").map(e210=>[e210.pcb_component_id,e210])),vias=circuitJson.filter(e210=>e210.type==="pcb_via"),board=circuitJson.find(e210=>e210.type==="pcb_board");for(let pour of pours)pour.source_net_id&&add({polygon:getPourPolygon(pour),layers:[pour.layer],netId:connectivity.getNetConnectedToId(pour.source_net_id)??pour.source_net_id,isTerminal:!1,pourId:pour.pcb_copper_pour_id});for(let element of circuitJson)if(element.type==="pcb_smtpad"){let netId=connectivity.getNetConnectedToId(element.pcb_smtpad_id);netId&&pouredNets.has(netId)&&add({polygon:getSmtPadPolygon(element),layers:[element.layer],netId,isTerminal:!!element.pcb_port_id})}else if(element.type==="pcb_plated_hole"){let netId=connectivity.getNetConnectedToId(element.pcb_plated_hole_id);netId&&pouredNets.has(netId)&&add({polygon:getPlatedHolePolygon(element,element.pcb_component_id?components.get(element.pcb_component_id)?.rotation:0),layers:element.layers,netId,isTerminal:!!element.pcb_port_id})}else if(element.type==="pcb_via"){let netId=connectivity.getNetConnectedToId(element.pcb_via_id);netId&&pouredNets.has(netId)&&add({polygon:getViaPolygon(element,element.outer_diameter,element.hole_diameter),layers:element.layers,netId,isTerminal:!generatedStitchingViaIds.has(element.pcb_via_id),viaId:element.pcb_via_id})}else if(element.type==="pcb_trace"){let netId=connectivity.getNetConnectedToId(element.pcb_trace_id);if(!netId||!pouredNets.has(netId))continue;for(let i22=0;i22<element.route.length;i22++){let routePoint2=element.route[i22];if(routePoint2.route_type==="via"){let actualVia=vias.find(via=>via.x===routePoint2.x&&via.y===routePoint2.y&&via.layers.includes(routePoint2.from_layer)&&via.layers.includes(routePoint2.to_layer));add({polygon:getViaPolygon(routePoint2,actualVia?.outer_diameter??routePoint2.outer_diameter??board?.min_via_pad_diameter??.3,actualVia?.hole_diameter??routePoint2.hole_diameter??board?.min_via_hole_diameter??.2),layers:actualVia?.layers??getViaSpanLayers({fromLayer:routePoint2.from_layer,toLayer:routePoint2.to_layer,layerCount:board?.num_layers??2}),netId,isTerminal:!1})}let next2=element.route[i22+1];if(!next2)continue;let start=getRouteEndpoint(routePoint2,"end"),end=getRouteEndpoint(next2,"start");if(start.layer!==end.layer)continue;let startWidth=routePoint2.route_type==="via"?next2.route_type==="via"?void 0:next2.width:routePoint2.width;if(startWidth===void 0)continue;let endWidth=element.route_thickness_mode==="interpolated"&&next2.route_type!=="via"?next2.width:startWidth;add({polygon:getTraceSegmentPolygon(start.point,end.point,startWidth,endWidth),layers:[start.layer],netId,isTerminal:!1})}}let floatingPourIds=new Set,floatingViaIds=new Set;if(conductors.length===0)return{floatingPourIds,floatingViaIds};let parent=conductors.map((_22,i22)=>i22),find2=i22=>{for(;parent[i22]!==i22;)parent[i22]=parent[parent[i22]],i22=parent[i22];return i22},bounds=conductors.map(conductor=>conductor.polygon.box),spatialIndex=new Flatbush(conductors.length);for(let box2 of bounds)spatialIndex.add(box2.xmin,box2.ymin,box2.xmax,box2.ymax);spatialIndex.finish();for(let[i22,conductor]of conductors.entries()){let box2=bounds[i22];for(let j22 of spatialIndex.search(box2.xmin-CONTACT_TOLERANCE,box2.ymin-CONTACT_TOLERANCE,box2.xmax+CONTACT_TOLERANCE,box2.ymax+CONTACT_TOLERANCE)){if(j22<=i22||find2(i22)===find2(j22))continue;let neighbor=conductors[j22];conductor.netId!==neighbor.netId||!conductor.layers.some(layer=>neighbor.layers.includes(layer))||copperPolygonsTouch(conductor.polygon,neighbor.polygon,CONTACT_TOLERANCE)&&(parent[find2(j22)]=find2(i22))}}let netsWithTerminals=new Set(conductors.flatMap(conductor=>conductor.isTerminal?[conductor.netId]:[])),terminalRoots=new Set(conductors.flatMap((conductor,i22)=>conductor.isTerminal?[find2(i22)]:[]));for(let[i22,conductor]of conductors.entries())!netsWithTerminals.has(conductor.netId)||terminalRoots.has(find2(i22))||(conductor.pourId&&floatingPourIds.add(conductor.pourId),conductor.viaId&&floatingViaIds.add(conductor.viaId));return{floatingPourIds,floatingViaIds}},Board_doInitialPcbCopperPourCleanup=board=>{if(!board.root||board.root.pcbDisabled)return;let{db:db22}=board.root;if(db22.pcb_copper_pour.list().length===0)return;let circuitJson=db22.subtree({subcircuit_id:board.subcircuit_id}).toArray();if(db22.pcb_autorouting_error.list().length>0||!circuitJson.some(element=>element.type==="pcb_copper_pour"))return;let{floatingPourIds,floatingViaIds}=findFloatingCopper(circuitJson,board._generatedStitchingViaIds);for(let pourId of floatingPourIds)db22.pcb_copper_pour.delete(pourId);for(let viaId of floatingViaIds)board._generatedStitchingViaIds.has(viaId)&&db22.pcb_via.delete(viaId);for(let trace of db22.pcb_trace.list())trace.route.some(point62=>"copper_pour_id"in point62&&point62.copper_pour_id&&floatingPourIds.has(point62.copper_pour_id))&&db22.pcb_trace.update(trace.pcb_trace_id,{route:trace.route.map(point62=>{if(!("copper_pour_id"in point62)||!point62.copper_pour_id||!floatingPourIds.has(point62.copper_pour_id))return point62;let{copper_pour_id,is_inside_copper_pour,...wireOrVia}=point62;return wireOrVia})})},resetPcbTraceRenderInSubtree=renderable=>{renderable._pcbTraceRenderWaitingForPlacementChecks&&(renderable.renderPhaseStates.PcbTraceRender.initialized=!1,renderable.renderPhaseStates.PcbTraceRender.dirty=!1,renderable._pcbTraceRenderWaitingForPlacementChecks=!1);for(let child of renderable.children)resetPcbTraceRenderInSubtree(child)},Board_doInitialPcbPlacementDesignRuleChecks=board=>{if(board.root?.pcbDisabled)return;let placementDrcChecksDisabled=board.root?.platform?.placementDrcChecksDisabled??board.getInheritedProperty("placementDrcChecksDisabled"),drcChecksDisabled=board.root?.platform?.drcChecksDisabled??board.getInheritedProperty("drcChecksDisabled");if(board._pcbPlacementDrcErrorCount=null,board._pcbPlacementDrcCheckError=null,board._pcbPlacementDrcChecksPending=!1,placementDrcChecksDisabled||drcChecksDisabled){board._pcbPlacementDrcErrorCount=0;return}let{db:db22}=board.root,subcircuitCircuitJson=db22.subtree({subcircuit_id:board.subcircuit_id}).toArray(),existingPlacementDiagnostics=db22.toArray();board._pcbPlacementDrcChecksPending=!0,board._queueAsyncEffect("board:pre-route-placement-checks",async()=>{try{let placementCheckResults=await runAllPlacementChecks(subcircuitCircuitJson,{consolidateOverlaps:!1}),relevantPlacementCheckResults=consolidatePcbOverlapErrors(subcircuitCircuitJson,placementCheckResults.filter(result=>!board._isExpectedCastellatedHoleDrcError(result))),newPlacementDiagnostics=relevantPlacementCheckResults.filter(result=>!existingPlacementDiagnostics.some(existing=>existing.type===result.type&&"message"in existing&&existing.message===result.message));db22.insertAll(newPlacementDiagnostics),board._pcbPlacementDrcErrorCount=relevantPlacementCheckResults.filter(result=>result.type.endsWith("_error")).length}catch(error2){board._pcbPlacementDrcCheckError=error2 instanceof Error?error2.message:String(error2)}finally{board._pcbPlacementDrcChecksPending=!1,resetPcbTraceRenderInSubtree(board)}})},CASTELLATED_HOLE_ENDPOINT_TOLERANCE_MM=1e-6,getConnectionTargets2=connectsTo=>connectsTo?Array.isArray(connectsTo)?connectsTo:[connectsTo]:[],BoardCastellatedHole=class _BoardCastellatedHole extends PlatedHole{constructor(outlinePoint,outlinePointIndex){let name=`castellated_hole_${outlinePointIndex+1}`,connectionTargets=getConnectionTargets2(outlinePoint.connectsTo),holeDiameter=distance.parse(outlinePoint.holeDiameter),padDiameter=distance.parse(outlinePoint.padDiameter);super({shape:"circle",holeDiameter,outerDiameter:padDiameter,portHints:[name]});__publicField(this,"outlinePointIndex");__publicField(this,"holeDiameter");__publicField(this,"padDiameter");__publicField(this,"port");__publicField(this,"trace");this.outlinePointIndex=outlinePointIndex,this.holeDiameter=holeDiameter,this.padDiameter=padDiameter,this.port=connectionTargets.length>0?new Port({name}):null,this.trace=this.port?new Trace({path:[`port.${name}`,...connectionTargets],displayName:`Castellated hole ${outlinePointIndex+1} connectivity`}):null}static fromBoardOutline(outline){return(outline??[]).flatMap((outlinePoint,outlinePointIndex)=>outlinePoint.isCastellatedHole?[new _BoardCastellatedHole(outlinePoint,outlinePointIndex)]:[])}_getParentBoard(){if(this.parent?.componentName!=="Board")throw new Error("A board castellated hole must be a direct board child");return this.parent}_getPositionFromBoardOutline(){let board=this._getParentBoard(),outlinePoint=(board.pcb_board_id?board.root?.db.pcb_board.get(board.pcb_board_id):null)?.outline?.[this.outlinePointIndex];if(!outlinePoint)throw new Error(`Missing emitted board outline point ${this.outlinePointIndex}`);return outlinePoint}_getGlobalPcbPositionBeforeLayout(){return this._getPositionFromBoardOutline()}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db22}=this.root,position4=this._getPositionFromBoardOutline(),pcbPlatedHole=db22.pcb_plated_hole.insert({shape:"circle",outer_diameter:this.padDiameter,hole_diameter:this.holeDiameter,...position4,layers:this.getAvailablePcbLayers(),port_hints:this.getNameAndAliases(),subcircuit_id:this.getSubcircuit()?.subcircuit_id??void 0});this.pcb_plated_hole_id=pcbPlatedHole.pcb_plated_hole_id}syncPositionToBoardOutline(){this.pcb_plated_hole_id&&this._setPositionFromLayout(this._getPositionFromBoardOutline())}removePcbPrimitiveRender(){let{db:db22}=this.root;this.pcb_plated_hole_id&&(db22.pcb_plated_hole.delete(this.pcb_plated_hole_id),this.pcb_plated_hole_id=null),this.matchedPort?.pcb_port_id&&(db22.pcb_port.delete(this.matchedPort.pcb_port_id),this.matchedPort.pcb_port_id=null)}isExpectedBoardEdgeDrcError(result){if(!this.pcb_plated_hole_id)return!1;if(result.type==="pcb_placement_error")return result.pcb_placement_error_id===`copper_too_close_to_board_edge_${this.pcb_plated_hole_id}`;if(result.type!=="pcb_trace_error"||!result.pcb_trace_error_id.startsWith("trace_too_close_to_board_"))return!1;let segmentIndexMatch=result.pcb_trace_error_id.match(/_segment_(\d+)$/);if(!segmentIndexMatch)return!1;let pcbTrace=this.root?.db.pcb_trace.get(result.pcb_trace_id),segmentIndex=Number(segmentIndexMatch[1]),segmentEndpoints=[pcbTrace?.route[segmentIndex],pcbTrace?.route[segmentIndex+1]].flatMap(routePoint2=>routePoint2&&"x"in routePoint2&&"y"in routePoint2?[{x:routePoint2.x,y:routePoint2.y}]:[]),platedHole2=this.root?.db.pcb_plated_hole.get(this.pcb_plated_hole_id);return platedHole2?segmentEndpoints.some(endpoint=>Math.hypot(endpoint.x-platedHole2.x,endpoint.y-platedHole2.y)<=CASTELLATED_HOLE_ENDPOINT_TOLERANCE_MM):!1}},MIN_EFFECTIVE_BORDER_RADIUS_MM=.01,DEFAULT_VIA_PAD_DIAMETER_OVER_HOLE_DIAMETER_MM=.15,getRoundedRectOutline=(width,height,radius)=>{let w22=width/2,h22=height/2,r22=Math.min(radius,w22,h22);if(r22<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*r22/.1)),step=Math.PI/2/segments,outline=[];outline.push({x:-w22+r22,y:-h22}),outline.push({x:w22-r22,y:-h22});for(let i22=1;i22<=segments;i22++){let theta=-Math.PI/2+i22*step;outline.push({x:w22-r22+r22*Math.cos(theta),y:-h22+r22+r22*Math.sin(theta)})}outline.push({x:w22,y:h22-r22});for(let i22=1;i22<=segments;i22++){let theta=0+i22*step;outline.push({x:w22-r22+r22*Math.cos(theta),y:h22-r22+r22*Math.sin(theta)})}outline.push({x:-w22+r22,y:h22});for(let i22=1;i22<=segments;i22++){let theta=Math.PI/2+i22*step;outline.push({x:-w22+r22+r22*Math.cos(theta),y:h22-r22+r22*Math.sin(theta)})}outline.push({x:-w22,y:-h22+r22});for(let i22=1;i22<=segments;i22++){let theta=Math.PI+i22*step;outline.push({x:-w22+r22+r22*Math.cos(theta),y:-h22+r22+r22*Math.sin(theta)})}return outline},Board=class extends Group5{constructor(props){super(props);__publicField(this,"pcbFold");__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);__publicField(this,"_castellatedHoles");__publicField(this,"_generatedStitchingViaIds",new Set);this._castellatedHoles=BoardCastellatedHole.fromBoardOutline(this._parsedProps.outline);for(let castellatedHole of this._castellatedHoles)castellatedHole.port&&this.add(castellatedHole.port),this.add(castellatedHole),castellatedHole.trace&&this.add(castellatedHole.trace)}doInitialPcbFlexRender(){if(!this.pcb_board_id)return;let bends=this.root.db.pcb_bend.list().filter(bend=>bend.pcb_board_id===this.pcb_board_id);if(this.pcbFold=void 0,!bends.length)return;let pcbBoard=this.root.db.pcb_board.get(this.pcb_board_id),foldResult=tryCreatePcbFold(bends,this.boardThickness,{outline:pcbBoard.outline?.map(point62=>({x:point62.x-pcbBoard.center.x,y:point62.y-pcbBoard.center.y}))});foldResult.ok?this.pcbFold=foldResult.value:this.root.db.pcb_placement_error.insert({error_type:"pcb_placement_error",subcircuit_id:this.subcircuit_id??void 0,message:`Unable to fold PCB board ${this.pcb_board_id}; CAD remains flat: ${foldResult.issue.message}`})}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(){return getBoardAvailableLayers(this._parsedProps.layers??2)}_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=getBoundsFromPoints2(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:db22}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalPcbPositionBeforeLayout(),pcbBoard=db22.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(db22,this.subcircuit_id),allowedSubcircuitIds=new Set([this.subcircuit_id,...descendantIds]),allPcbComponents=db22.pcb_component.list().filter(c22=>c22.subcircuit_id&&allowedSubcircuitIds.has(c22.subcircuit_id)),allPcbGroups=db22.pcb_group.list().filter(g22=>g22.subcircuit_id&&allowedSubcircuitIds.has(g22.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=getBoundsFromPoints2(pcbGroup.outline);bounds&&(width=bounds.maxX-bounds.minX,height=bounds.maxY-bounds.minY)}updateBounds(pcbGroup.center,width,height)}if(props.boardAnchorPosition){let{x:x22,y:y22}=props.boardAnchorPosition;minX=Math.min(minX,x22),minY=Math.min(minY,y22),maxX=Math.max(maxX,x22),maxY=Math.max(maxY,y22)}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(point62=>({x:point62.x+(props.outlineOffsetX??0),y:point62.y+(props.outlineOffsetY??0)}))),db22.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(`
|
|
956
956
|
`),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(d22=>d22.lowercaseComponentName==="board");if(nestedBoard)throw new Error(`Nested boards are not supported: found board "${nestedBoard.name}" inside board "${this.name}"`);super.doInitialSourceRender();let{db:db22}=this.root,source_board3=db22.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:db22}=this.root,{_parsedProps:props}=this,pcbBoardFromCircuitJson=props.circuitJson?.find(elm=>elm.type==="pcb_board"),viaTenting=getViaTenting(props.defaultViaTenting),rawProps=this.props,resolvedIsViaInPadAllowed=rawProps.isViaInPadAllowed??pcbBoardFromCircuitJson?.is_via_in_pad_allowed,resolvedAllowBlindAndBuriedVias=rawProps.allowBlindAndBuriedVias??pcbBoardFromCircuitJson?.allow_blind_and_buried_vias,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(point62=>point62.x),yValues=props.outline.map(point62=>point62.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=getBoundsFromPoints2(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,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),styledViaDimensions=getViaDiameterDefaults(pcbStyle2),configuredViaHoleDiameter=subcircuitProps2.minViaHoleDiameter??(pcbStyle2?.viaHoleDiameter!==void 0?styledViaDimensions.holeDiameter:void 0),resolvedMinViaHoleDiameter=configuredViaHoleDiameter??jlcMinTolerances2.min_via_hole_diameter,resolvedMinViaPadDiameter=subcircuitProps2.minViaPadDiameter??(pcbStyle2?.viaPadDiameter!==void 0?styledViaDimensions.padDiameter:configuredViaHoleDiameter!==void 0?configuredViaHoleDiameter+DEFAULT_VIA_PAD_DIAMETER_OVER_HOLE_DIAMETER_MM:jlcMinTolerances2.min_via_pad_diameter),pcb_board3=db22.pcb_board.insert({source_board_id:this.source_board_id,subcircuit_id:this.subcircuit_id??void 0,center:center2,default_via_tented_on_top:viaTenting.tented_on_top??pcbBoardFromCircuitJson?.default_via_tented_on_top,default_via_tented_on_bottom:viaTenting.tented_on_bottom??pcbBoardFromCircuitJson?.default_via_tented_on_bottom,thickness:this.boardThickness,num_layers:this.allLayers.length,width:computedWidth,height:computedHeight,outline:outline?.map(point62=>({x:point62.x+(props.outlineOffsetX??0)+outlineTranslation.x,y:point62.y+(props.outlineOffsetY??0)+outlineTranslation.y})),material:props.material,...resolvedIsViaInPadAllowed!==void 0&&{is_via_in_pad_allowed:resolvedIsViaInPadAllowed},...resolvedAllowBlindAndBuriedVias!==void 0&&{allow_blind_and_buried_vias:resolvedAllowBlindAndBuriedVias},...props.solderMaskColor!==void 0&&{solder_mask_color:props.solderMaskColor},...props.silkscreenColor!==void 0&&{silkscreen_color:props.silkscreenColor},min_trace_width:subcircuitProps2.minTraceWidth??jlcMinTolerances2.min_trace_width,min_via_hole_diameter:resolvedMinViaHoleDiameter,min_via_pad_diameter:resolvedMinViaPadDiameter,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_hole_edge_clearance:subcircuitProps2.minTraceToHoleEdgeClearance??jlcMinTolerances2.min_trace_to_hole_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:db22}=this.root;this.pcb_board_id&&(db22.pcb_board.delete(this.pcb_board_id),this.pcb_board_id=null)}doInitialPcbDesignRuleChecks(){super.doInitialPcbDesignRuleChecks(),this.updatePcbDesignRuleChecks()}doInitialPcbPlacementDesignRuleChecks(){Board_doInitialPcbPlacementDesignRuleChecks(this)}doInitialPcbCopperPourCleanup(){Board_doInitialPcbCopperPourCleanup(this)}updatePcbDesignRuleChecks(){Board_updatePcbDesignRuleChecks(this)}runRenderPhaseForChildren(phase){this.root?.emit("board:renderPhaseStarted",{renderId:this._renderId,phase}),super.runRenderPhaseForChildren(phase)}_repositionOnPcb(position4){let{db:db22}=this.root,pcbBoard=this.pcb_board_id?db22.pcb_board.get(this.pcb_board_id):null,oldPos=pcbBoard?.center;if(!oldPos){this.pcb_board_id&&db22.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&&(db22.pcb_board.update(this.pcb_board_id,{center:position4}),pcbBoard?.outline)){let outlineBounds=getBoundsFromPoints2(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(p22=>({x:p22.x+outlineDeltaX,y:p22.y+outlineDeltaY}));db22.pcb_board.update(this.pcb_board_id,{outline:newOutline});for(let castellatedHole of this._castellatedHoles)castellatedHole.syncPositionToBoardOutline()}}}_isExpectedCastellatedHoleDrcError(result){return this._castellatedHoles.some(castellatedHole=>castellatedHole.isExpectedBoardEdgeDrcError(result))}},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 Trace)||!child._exposesSubcircuitConnection)return!1;let childProps=child._parsedProps;return childProps.from===childNetSelector&&childProps.to===parentNetSelector}))continue;let trace=new Trace({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:db22}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalPcbPositionBeforeLayout(),pcb_board3=db22.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(p22=>point4(p22.x,p22.y))),is_ccw;if(outline.length>2){let p03=point4(outline[0].x,outline[0].y),p12=point4(outline[1].x,outline[1].y),segmentDir=vector$1(p03,p12).normalize(),normalToLeft=segmentDir.rotate(Math.PI/2),testPoint=p03.translate(segmentDir.multiply(segment(p03,p12).length/2)).translate(normalToLeft.multiply(.01));is_ccw=outlinePolygon.contains(testPoint)}else is_ccw=outlinePolygon.area()>0;for(let i22=0;i22<outline.length;i22++){let p1_=outline[i22],p2_=outline[(i22+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 k22=0;k22<numBitesInGap;k22++){let biteDist=firstBiteDistFromP1+k22*holeAndSpacing,pos=p12.translate(segmentDir.multiply(biteDist));mouseBiteHoles.push({x:pos.x,y:pos.y})}}}let p_prev_=outline[(i22-1+outline.length)%outline.length],p_next_=outline[(i22+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=effectiveGapLength<1e-6?[{start:0-start_ext,end:segmentLength+end_ext}]:[{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(p22=>point4(p22.x,p22.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}}function generatePanelOutlineRoutingCutouts(boards,options){return boards.map(board=>{if((!board.outline||board.outline.length===0)&&board.width&&board.height){let halfWidth=board.width/2,halfHeight=board.height/2;return{...board,outline:[{x:board.center.x-halfWidth,y:board.center.y-halfHeight},{x:board.center.x+halfWidth,y:board.center.y-halfHeight},{x:board.center.x+halfWidth,y:board.center.y+halfHeight},{x:board.center.x-halfWidth,y:board.center.y+halfHeight}]}}return board}).flatMap(board=>{if(!board.outline||board.outline.length===0)return[];let{tabCutouts}=generateCutoutsAndMousebitesForOutline(board.outline,{gapLength:0,cutoutWidth:options.cutoutWidth,mouseBites:!1,mouseBiteHoleDiameter:0,mouseBiteHoleSpacing:0});return tabCutouts.map(cutout=>({...cutout,pcb_board_id:board.pcb_board_id}))}).map((cutout,outlineRoutingCutoutIndex)=>({...cutout,pcb_cutout_id:`panel_outline_routing_cutout_${outlineRoutingCutoutIndex}`}))}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=getBoundsFromPoints2(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:db22,row,col,cellWidth,cellHeight,boardGap,availablePanelWidth,availablePanelHeight}){let itemsWithDims=items.map(item=>{let dims=getItemDimensions(item,db22);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(b22=>b22.width),minCellWidth),maxItemHeight=Math.max(...itemsWithDims.map(b22=>b22.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,i22)=>{let colIdx=i22%cols,rowIdx=Math.floor(i22/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 i22=0;i22<colWidths.length;i22++)colWidths[i22]=Math.max(colWidths[i22],minCellWidth);for(let i22=0;i22<rowHeights.length;i22++)rowHeights[i22]=Math.max(rowHeights[i22],minCellHeight);let gridWidth=colWidths.reduce((a22,b22)=>a22+b22,0)+(cols>1?(cols-1)*boardGap:0),gridHeight=rowHeights.reduce((a22,b22)=>a22+b22,0)+(rows>1?(rows-1)*boardGap:0),startX=-gridWidth/2,startY=-gridHeight/2,colXOffsets=[startX];for(let i22=1;i22<cols;i22++)colXOffsets.push(colXOffsets[i22-1]+colWidths[i22-1]+boardGap);let rowYOffsets=[startY];for(let i22=1;i22<rows;i22++)rowYOffsets.push(rowYOffsets[i22-1]+rowHeights[i22-1]+boardGap);let positions=[];return itemsWithDims.forEach((itemWithDims,i22)=>{let colIdx=i22%cols,rowIdx=Math.floor(i22/cols);if(rowIdx>=rowYOffsets.length||colIdx>=colXOffsets.length)return;let x22=colXOffsets[colIdx]+colWidths[colIdx]/2,y22=rowYOffsets[rowIdx]+rowHeights[rowIdx]/2;positions.push({item:itemWithDims.item,pos:{x:x22,y:y22}})}),{positions,gridWidth,gridHeight}}function getItemDimensions(item,db22){if(item.componentName==="Board"){let board=item;if(db22&&board.pcb_board_id){let pcbBoard=db22.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,"_panelizationFeaturesGenerated",!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(c22=>c22 instanceof Board)}doInitialPanelBoardLayout(){if(this.root?.pcbDisabled)return;let layoutMode=this._parsedProps.layoutMode??"none",gridItems=this.children.filter(c22=>c22 instanceof Board||c22 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(c22=>!c22._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:db22}=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;db22.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};db22.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=db22.pcb_board.get(board.pcb_board_id);if(!boardDb)continue;let relativeX=boardDb.center.x-panelGlobalPos.x,relativeY=boardDb.center.y-panelGlobalPos.y;db22.pcb_board.update(board.pcb_board_id,{position_mode:"relative_to_panel_anchor",display_offset_x:`${relativeX}mm`,display_offset_y:`${relativeY}mm`})}}this._generatePanelizationFeatures()}_updatePanelDimensions(){let{db:db22}=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)db22.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);db22.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})}}}_generatePanelizationFeatures(){if(this._panelizationFeaturesGenerated)return;let{db:db22}=this.root,props=this._parsedProps,panelizationMethod=props.panelizationMethod??"none",childBoardInstances=this._getAllBoardInstances();if(panelizationMethod!=="none"){let childBoardIds=childBoardInstances.map(c22=>c22.pcb_board_id).filter(id3=>!!id3),boardsInPanel=db22.pcb_board.list().filter(b22=>childBoardIds.includes(b22.pcb_board_id));if(boardsInPanel.length===0)return;let tabWidth=props.tabWidth??DEFAULT_TAB_WIDTH;if(panelizationMethod==="outline_routing"){let outlineRoutingCutouts=generatePanelOutlineRoutingCutouts(boardsInPanel,{cutoutWidth:tabWidth});for(let outlineRoutingCutout of outlineRoutingCutouts)db22.pcb_cutout.insert({...outlineRoutingCutout,pcb_group_id:this.pcb_group_id??void 0,pcb_panel_id:this.pcb_panel_id??void 0})}else{let 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)db22.pcb_cutout.insert(tabCutout);for(let mouseBiteHole of mouseBiteHoles)db22.pcb_hole.insert(mouseBiteHole)}}this._panelizationFeaturesGenerated=!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:db22}=this.root,props=this._parsedProps,inserted=db22.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:db22}=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)db22.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);db22.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:db22}=this.root,props=this._parsedProps,currentPanel=db22.pcb_panel.get(this.pcb_panel_id);db22.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)}},GENERATED_ANTENNA_KEEPOUT_CLEARANCE_MM=1,GENERATED_ANTENNA_FEED_OPENING_CLEARANCE_MM=1,getGeneratedAntennaKeepouts=geometry=>{let xCoordinates=geometry.route.map(point62=>point62.x),yCoordinates=geometry.route.map(point62=>point62.y),edgeClearance=geometry.traceWidth/2+GENERATED_ANTENNA_KEEPOUT_CLEARANCE_MM,left=Math.min(...xCoordinates)-edgeClearance,right=Math.max(...xCoordinates)+edgeClearance,bottom=Math.min(...yCoordinates)-edgeClearance,top=Math.max(...yCoordinates)+edgeClearance,feedOpeningPoints=[geometry.feedPoint,...geometry.secondaryPort?[geometry.secondaryPort.point]:[]],openingLeft=Math.min(...feedOpeningPoints.map(point62=>point62.x))-GENERATED_ANTENNA_FEED_OPENING_CLEARANCE_MM,openingRight=Math.max(...feedOpeningPoints.map(point62=>point62.x))+GENERATED_ANTENNA_FEED_OPENING_CLEARANCE_MM,openingBottom=Math.min(...feedOpeningPoints.map(point62=>point62.y))-GENERATED_ANTENNA_FEED_OPENING_CLEARANCE_MM,openingTop=Math.max(...feedOpeningPoints.map(point62=>point62.y))+GENERATED_ANTENNA_FEED_OPENING_CLEARANCE_MM,rects=[],addRect=(rectLeft,rectRight,rectBottom,rectTop)=>{rectRight<=rectLeft||rectTop<=rectBottom||rects.push({center:{x:(rectLeft+rectRight)/2,y:(rectBottom+rectTop)/2},width:rectRight-rectLeft,height:rectTop-rectBottom})};return geometry.feedKeepoutOpeningDirection==="left"?(addRect(left,right,openingTop,top),addRect(left,right,bottom,openingBottom),addRect(openingRight,right,openingBottom,openingTop)):(addRect(left,openingLeft,bottom,openingTop),addRect(openingRight,right,bottom,openingTop),addRect(left,right,openingTop,top)),rects},getGeneratedAntennaGeometry=antennaShape2=>{switch(antennaShape2){case"2.4ghz_quarter_wave_monopole":return{traceWidth:.6,feedPoint:{x:0,y:0},feedKeepoutOpeningDirection:"left",route:[{x:0,y:0},{x:31,y:0}]};case"2.4ghz_meandered_monopole":return{traceWidth:.5,feedPoint:{x:0,y:0},feedKeepoutOpeningDirection:"bottom",route:[{x:0,y:0},{x:0,y:6},{x:3,y:6},{x:3,y:1.5},{x:6,y:1.5},{x:6,y:6},{x:9,y:6},{x:9,y:1.5},{x:12,y:1.5},{x:12,y:6},{x:15,y:6}]};case"2.4ghz_inverted_f":return{traceWidth:.8,feedPoint:{x:0,y:0},feedKeepoutOpeningDirection:"bottom",secondaryPort:{point:{x:-4,y:0},role:"ground"},groundViaPoint:{x:-4,y:0},route:[{x:-4,y:0},{x:-4,y:3},{x:0,y:3},{x:0,y:0},{x:0,y:3},{x:-4,y:3},{x:-4,y:8},{x:22,y:8}]};case"2.4ghz_meandered_inverted_f":return{traceWidth:.5,feedPoint:{x:0,y:0},feedKeepoutOpeningDirection:"bottom",secondaryPort:{point:{x:-1.7,y:0},role:"ground"},groundViaPoint:{x:-1.7,y:0},route:[{x:-1.7,y:0},{x:-1.7,y:4.9},{x:0,y:4.9},{x:0,y:0},{x:0,y:4.9},{x:-1.7,y:4.9},{x:2.3,y:4.9},{x:2.3,y:1.4},{x:5.3,y:1.4},{x:5.3,y:4.9},{x:8.3,y:4.9},{x:8.3,y:1.4},{x:11.3,y:1.4},{x:11.3,y:4.9},{x:13.3,y:4.9}]};case"2.4ghz_folded_dipole":return{traceWidth:.9,feedPoint:{x:0,y:0},feedKeepoutOpeningDirection:"bottom",secondaryPort:{point:{x:1.2,y:0},role:"feed2"},route:[{x:0,y:0},{x:-22.4,y:0},{x:-22.4,y:9},{x:23.6,y:9},{x:23.6,y:0},{x:1.2,y:0}]}}},Antenna=class extends NormalComponent{get config(){return{componentName:"Antenna",zodProps:antennaProps,sourceFtype:FTYPE.simple_chip,shouldRenderAsSchematicBox:!0}}getRefDesPrefixes(){return["ANT"]}initPorts(){let{antennaShape:antennaShape2,pcbPath:pcbPath2}=this._parsedProps,secondaryPortRole=pcbPath2?void 0:antennaShape2==="2.4ghz_inverted_f"||antennaShape2==="2.4ghz_meandered_inverted_f"?"ground":antennaShape2==="2.4ghz_folded_dipole"?"feed2":void 0;super.initPorts({pinCount:secondaryPortRole?2:1,additionalAliases:{pin1:secondaryPortRole==="feed2"?["feed","feed1"]:["feed"],...secondaryPortRole==="ground"?{pin2:["ground","gnd"]}:secondaryPortRole==="feed2"?{pin2:["feed2"]}:{}}})}doInitialReactSubtreesRender(){super.doInitialReactSubtreesRender();let{antennaShape:antennaShape2,pcbPath:pcbPath2}=this._parsedProps;if(!antennaShape2)return;let hasFootprint=this.children.some(child=>child.componentName==="Footprint");if(pcbPath2&&hasFootprint)return;let geometry=pcbPath2?void 0:getGeneratedAntennaGeometry(antennaShape2),generatedFootprint=new Footprint({name:`${this.name}_generated_antenna`});if(hasFootprint||generatedFootprint.add(new SmtPad({shape:"rect",width:.8,height:.8,pcbX:geometry?.feedPoint.x??0,pcbY:geometry?.feedPoint.y??0,layer:"top",portHints:["pin1"],coveredWithSolderMask:!0})),geometry){let keepouts=getGeneratedAntennaKeepouts(geometry);for(let keepout of keepouts)generatedFootprint.add(new Keepout({shape:"rect",pcbX:keepout.center.x,pcbY:keepout.center.y,width:keepout.width,height:keepout.height,layers:[...this.root?._getBoard()?.allLayers??["top","bottom"]],excludeRefs:[this.getSubcircuitSelector()]}));let antennaTrace=new PcbTrace({route:geometry.route.map(point62=>({route_type:"wire",...point62,width:geometry.traceWidth,layer:"top"}))});antennaTrace.isAntennaTrace=!0,generatedFootprint.add(antennaTrace),geometry.secondaryPort&&!geometry.groundViaPoint&&!hasFootprint&&generatedFootprint.add(new SmtPad({shape:"rect",width:.8,height:.8,pcbX:geometry.secondaryPort.point.x,pcbY:geometry.secondaryPort.point.y,layer:"top",portHints:["pin2"],coveredWithSolderMask:!0})),geometry.groundViaPoint&&generatedFootprint.add(new PlatedHole({shape:"circle",pcbX:geometry.groundViaPoint.x,pcbY:geometry.groundViaPoint.y,holeDiameter:.3,outerDiameter:.7,portHints:["pin2"],coveredWithSolderMask:!0}))}this.add(generatedFootprint)}doInitialCreateTracesFromProps(){super.doInitialCreateTracesFromProps();let{pcbPath:pcbPath2}=this._parsedProps;if(!pcbPath2)return;let antennaTrace=new Trace({name:`${this.name}_pcb_path`,path:[`${this.getSubcircuitSelector()} > port.pin1`],pcbPath:pcbPath2});antennaTrace.isAntennaTrace=!0,this.add(antennaTrace)}},Pinout=class extends Chip{constructor(props){super(props)}get config(){return{...super.config,componentName:"Pinout",zodProps:pinoutProps}}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.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 NormalComponent{get config(){return{componentName:"fuse",schematicSymbolName:this.props.symbolName??"fuse",zodProps:fuseProps,sourceFtype:FTYPE.simple_fuse}}_getSchematicSymbolDisplayValue(){if(this._parsedProps.schShowRatings===!1)return"";let rawCurrent=this._parsedProps.currentRating,rawVoltage=this._parsedProps.voltageRating,current3=parseAndConvertSiUnit(rawCurrent,"A").value,voltage3=parseAndConvertSiUnit(rawVoltage,"V").value;return`${formatSiUnit(current3)}A / ${formatSiUnit(voltage3)}V`}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,currentRating=parseAndConvertSiUnit(props.currentRating,"A").value,voltageRating=parseAndConvertSiUnit(props.voltageRating,"V").value,display_current_rating,display_voltage_rating;props.schShowRatings!==!1&&(display_current_rating=`${formatSiUnit(currentRating)}A`,display_voltage_rating=`${formatSiUnit(voltageRating)}V`);let source_component=db22.source_component.insert({name:this.name,ftype:FTYPE.simple_fuse,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,...currentRating!=null?{current_rating_amps:currentRating}:{},...voltageRating!=null?{voltage_rating_volts:voltageRating}:{},display_current_rating,display_voltage_rating,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},Jumper=class extends NormalComponent{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:db22}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),source_component=db22.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:db22}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),globalTransformRotation=this.getGlobalTransformRotation(),pcb_component3=db22.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:props.layer??"top",rotation:normalizeDegrees(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,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}doInitialPcbPortAttachment(){let{db:db22}=this.root,pcb_ports=db22.pcb_port.list({pcb_component_id:this.pcb_component_id}),pinLabelToPortId={};for(let i22=0;i22<pcb_ports.length;i22++){let port=pcb_ports[i22],sourcePort=db22.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(h22=>/^(pin)?\d+$/.test(h22));matchedHint&&(/^pin\d+$/.test(matchedHint)?pinLabel=matchedHint.replace(/^pin/,""):pinLabel=matchedHint)}pinLabelToPortId[pinLabel]=port.pcb_port_id}let traces=db22.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 NormalComponent{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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"interconnect",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSourceParentAttachment(){let{db:db22}=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&&db22.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 NormalComponent{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((a22,b22)=>a22-b22):props.bridged?Array.from({length:pinCount},(_22,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(c22=>c22.componentName==="Port").map(p22=>p22.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(n22=>n22!==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(n22=>n22!==null))).sort((a22,b22)=>a22-b22):props.bridged&&resolvedPinCount&&(bridgedPinNumbers=Array.from({length:resolvedPinCount},(_22,i22)=>i22+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:db22}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),source_component=db22.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:db22}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),globalTransformRotation=this.getGlobalTransformRotation(),pcb_component3=db22.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:props.layer??"top",rotation:normalizeDegrees(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,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}doInitialPcbPortAttachment(){let{db:db22}=this.root,pcb_ports=db22.pcb_port.list({pcb_component_id:this.pcb_component_id}),pinLabelToPortId={};for(let i22=0;i22<pcb_ports.length;i22++){let port=pcb_ports[i22],sourcePort=db22.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(h22=>/^(pin)?\d+$/.test(h22));matchedHint&&(/^pin\d+$/.test(matchedHint)?pinLabel=matchedHint.replace(/^pin/,""):pinLabel=matchedHint)}pinLabelToPortId[pinLabel]=port.pcb_port_id}let traces=db22.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 NormalComponent{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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_power_source",name:this.name,voltage:props.voltage,supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},VoltageSource2=class extends NormalComponent{constructor(){super(...arguments);__publicField(this,"simulation_voltage_source_id",null);__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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.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,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db22}=this.root,{_parsedProps:props}=this,terminal1Port=this.portMap.terminal1,terminal2Port=this.portMap.terminal2,simulationVoltageSource=db22.simulation_voltage_source.insert({is_dc_source:!1,terminal1_source_port_id:terminal1Port.source_port_id??void 0,terminal2_source_port_id:terminal2Port.source_port_id??void 0,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,ac_magnitude:props.acMagnitude,ac_phase:props.acPhase});this.simulation_voltage_source_id=simulationVoltageSource.simulation_voltage_source_id}},CurrentSource2=class extends NormalComponent{constructor(){super(...arguments);__publicField(this,"simulation_current_source_id",null);__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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.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,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db22}=this.root,{_parsedProps:props}=this,isAc=props.frequency!==void 0||props.peakToPeakCurrent!==void 0||props.waveShape!==void 0||props.acMagnitude!==void 0||props.acPhase!==void 0,posPort=this.portMap.pos,negPort=this.portMap.neg;if(isAc){let simulationCurrentSource=db22.simulation_current_source.insert({is_dc_source:!1,terminal1_source_port_id:posPort.source_port_id??void 0,terminal2_source_port_id:negPort.source_port_id??void 0,current:props.current,frequency:props.frequency,peak_to_peak_current:props.peakToPeakCurrent,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle,ac_magnitude:props.acMagnitude,ac_phase:props.acPhase});this.simulation_current_source_id=simulationCurrentSource.simulation_current_source_id}else{if(props.current===void 0)return;let simulationCurrentSource=db22.simulation_current_source.insert({is_dc_source:!0,positive_source_port_id:posPort.source_port_id??void 0,negative_source_port_id:negPort.source_port_id??void 0,current:props.current,ac_magnitude:props.acMagnitude,ac_phase:props.acPhase});this.simulation_current_source_id=simulationCurrentSource.simulation_current_source_id}}},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}),rectsOverlap4=(a22,b22)=>a22.left<b22.right&&a22.right>b22.left&&a22.bottom<b22.top&&a22.top>b22.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},midpoint22=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:db22,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)){db22.schematic_component.update(schematicComponentId,{center:newCenter});for(let port of db22.schematic_port.list({schematic_component_id:schematicComponentId}))db22.schematic_port.update(port.schematic_port_id,{center:{x:port.center.x+deltaX,y:port.center.y+deltaY}});for(let text of db22.schematic_text.list({schematic_component_id:schematicComponentId}))db22.schematic_text.update(text.schematic_text_id,{position:{x:text.position.x+deltaX,y:text.position.y+deltaY}});updateSchematicPrimitivesForLayoutShift({db:db22,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:db22}=root,schematicComponent=db22.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=db22.schematic_port.list(),sourceTraces=db22.source_trace.list(),connectedSchematicPorts=ammeterSourcePortIds.map(ammeterSourcePortId=>getConnectedSchematicPort({ammeterSourcePortId,schematicPorts,sourceTraces})).filter(port=>port!==null);if(connectedSchematicPorts.length===0)return;let baseCenter=midpoint22(connectedSchematicPorts),obstacles=db22.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=>rectsOverlap4(candidateRect,obstacle))})??baseCenter;shiftAmmeterSchematicElements({ammeter,db:db22,oldCenter:schematicComponent.center,newCenter:bestCenter})},Ammeter=class extends NormalComponent{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=zh[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:db22}=this.root,{supplierPartNumbers,displayName}=this._parsedProps,source_component=db22.source_component.insert({ftype:"simple_ammeter",name:this.name,supplier_part_numbers:supplierPartNumbers,manufacturer_part_number:this._parsedProps.manufacturerPartNumber??this._parsedProps.mfn,display_name:displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db22}=this.root,{color,graphDisplayName,graphCenter,graphVerticalOffset,graphCurrentPerDiv}=this._parsedProps,posPort=this.portMap.pos,negPort=this.portMap.neg,{simulation_current_probe_id}=db22.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);db22.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}}},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:(a22,b22)=>this.isConnected(a22,b22,circuitJson),isPulledUp:a22=>this.isConnected(a22,"net.VCC",circuitJson)||this.isConnected(a22,"net.VDD",circuitJson)||this.getResistanceBetween(a22,"net.VCC",circuitJson)!==null||this.getResistanceBetween(a22,"net.VDD",circuitJson)!==null,isPulledDown:a22=>this.isConnected(a22,"net.GND",circuitJson)||this.getResistanceBetween(a22,"net.GND",circuitJson)!==null,getResistanceBetween:(a22,b22)=>this.getResistanceBetween(a22,b22,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(a22,b22,circuitJson){let aKeys=this.getConnectivityKeys(a22,circuitJson),bKeys=this.getConnectivityKeys(b22,circuitJson);return aKeys.some(key=>bKeys.includes(key))}getResistanceBetween(a22,b22,circuitJson){if(this.isConnected(a22,b22,circuitJson))return 0;let aKeys=this.getConnectivityKeys(a22,circuitJson),bKeys=this.getConnectivityKeys(b22,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[]}},AutoroutingPhase=class extends PrimitiveComponent2{get config(){return{componentName:"AutoroutingPhase",zodProps:autoroutingPhaseProps}}add(_component){throw new Error("<autoroutingphase> cannot contain children")}},resolvePcbDimensionOffsetDirection=({from,offset,offsetDirection,to:to3,transform:transform7})=>{if(offsetDirection)return applyToPoint2({...transform7,e:0,f:0},offsetDirection);let dx22=to3.x-from.x,dy22=to3.y-from.y,distance27=Math.hypot(dx22,dy22);if(!(offset===void 0||distance27===0))return{x:-dy22/distance27,y:dx22/distance27}},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:db22}=this.root,{_parsedProps:props}=this,transform7=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(props.from,transform7),to3=this._resolvePoint(props.to,transform7),subcircuit=this.getSubcircuit(),group2=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"}),offsetDirection=resolvePcbDimensionOffsetDirection({from,offset:props.offset,offsetDirection:props.offsetDirection,to:to3,transform:transform7}),fabrication_note_dimension=db22.pcb_fabrication_note_dimension.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group2?.pcb_group_id??void 0,layer,from,to:to3,text,offset:props.offset,offset_distance:props.offset,offset_direction:offsetDirection,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:db22}=this.root;if(!this.fabrication_note_dimension_id)return;let dimension=db22.pcb_fabrication_note_dimension.get(this.fabrication_note_dimension_id);dimension&&db22.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 dx22=to3.x-from.x,dy22=to3.y-from.y,distanceInMillimeters=Math.sqrt(dx22*dx22+dy22*dy22),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:db22}=this.root,{_parsedProps:props}=this,transform7=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(props.from,transform7),to3=this._resolvePoint(props.to,transform7),subcircuit=this.getSubcircuit(),group2=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"}),offsetDirection=resolvePcbDimensionOffsetDirection({from,offset:props.offset,offsetDirection:props.offsetDirection,to:to3,transform:transform7}),pcb_note_dimension3=db22.pcb_note_dimension.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group2?.pcb_group_id??void 0,from,to:to3,text,offset_distance:props.offset,offset_direction:offsetDirection,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:db22}=root,transform7=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform7),to3=this._resolvePoint(this._parsedProps.to,transform7);db22.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 dx22=to3.x-from.x,dy22=to3.y-from.y,distanceInMillimeters=Math.sqrt(dx22*dx22+dy22*dy22),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:db22}=this.root;if(!this.pcb_note_dimension_id)return;let dimension=db22.pcb_note_dimension.get(this.pcb_note_dimension_id);dimension&&db22.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}})}},AutoplacedBreakoutPoint=class extends BaseBreakoutPoint{get config(){return{componentName:"AutoplacedBreakoutPoint",zodProps:baseBreakoutPointProps}}_applySolvedBreakoutPoint({sourceTraceId,layer,position:position4}){this.matchedSourceTraceId=sourceTraceId,this._renderPcbBreakoutPoint({layer:layer_ref.parse(layer)}),this._setPositionFromLayout(position4)}},DDR_BYTE0_PORTS=[{id:"DQ0",layer:"inner3",soc:{x:-6,y:-3},ram:{x:3.941917,y:-3.650917}},{id:"DQ1",layer:"inner6",fullLayer:"inner2",soc:{x:-5.5,y:-3},ram:{x:4.591917,y:-3.650917}},{id:"DQ2",layer:"inner5",fullLayer:"inner4",soc:{x:-4.5,y:-3},ram:{x:5.891917,y:-3.650917}},{id:"DQ3",layer:"inner2",fullLayer:"inner6",soc:{x:-4.5,y:-3.5},ram:{x:6.541917,y:-3.650917}},{id:"DQ4",layer:"inner3",fullLayer:"inner2",soc:{x:-6,y:-2.5},ram:{x:6.541917,y:-2.050917}},{id:"DQ5",layer:"inner2",fullLayer:"inner5",soc:{x:-6,y:-2},ram:{x:5.891917,y:-2.050917}},{id:"DQ6",layer:"inner5",fullLayer:"inner4",soc:{x:-5,y:-2},ram:{x:4.591917,y:-2.050917}},{id:"DQ7",layer:"inner4",fullLayer:"inner6",soc:{x:-5.5,y:-2},ram:{x:3.941917,y:-2.050917}},{id:"DM0",layer:"inner4",fullLayer:"inner5",soc:{x:-5,y:-3},ram:{x:4.591917,y:-2.850917}},{id:"DQS0",layer:"inner1",differentialPairId:"DQS0",soc:{x:-4.5,y:-2.5},ram:{x:5.241917,y:-2.850917}},{id:"DQS0_n",layer:"inner1",differentialPairId:"DQS0",soc:{x:-5,y:-2.5},ram:{x:5.891917,y:-2.850917}}],DDR_BYTE1_PORTS=[{id:"DQ8",layer:"inner6",fullLayer:"inner4",soc:{x:-6,y:3},ram:{x:3.941917,y:3.549083}},{id:"DQ9",layer:"inner3",fullLayer:"inner4",soc:{x:-5.5,y:2},ram:{x:4.591917,y:3.549083}},{id:"DQ10",layer:"inner3",fullLayer:"inner2",soc:{x:-4.5,y:2},ram:{x:5.891917,y:3.549083}},{id:"DQ11",layer:"inner6",fullLayer:"inner5",soc:{x:-4.5,y:2.5},ram:{x:6.541917,y:3.549083}},{id:"DQ12",layer:"inner5",fullLayer:"inner1",soc:{x:-6,y:2.5},ram:{x:6.541917,y:1.949083}},{id:"DQ13",layer:"inner2",fullLayer:"inner3",soc:{x:-6.5,y:3},ram:{x:5.891917,y:1.949083}},{id:"DQ14",layer:"inner5",fullLayer:"inner6",soc:{x:-5,y:2.5},ram:{x:4.591917,y:1.949083}},{id:"DQ15",layer:"inner4",fullLayer:"inner1",soc:{x:-4.5,y:3.5},ram:{x:3.941917,y:1.949083}},{id:"DM1",layer:"inner4",fullLayer:"inner5",soc:{x:-5,y:3.5},ram:{x:4.591917,y:2.749083}},{id:"DQS1",layer:"inner1",fullLayer:"bottom",differentialPairId:"DQS1",soc:{x:-4.5,y:3},ram:{x:5.241917,y:2.749083}},{id:"DQS1_n",layer:"inner1",fullLayer:"bottom",differentialPairId:"DQS1",soc:{x:-5,y:3},ram:{x:5.891917,y:2.749083}}],DDR_ADDR_CTRL_PORTS=[{id:"A0",layer:"bottom",soc:{x:-6.5,y:-.5},ram:{x:7.841917,y:-3.650917}},{id:"A1",layer:"inner3",soc:{x:-7,y:-2},ram:{x:8.491917,y:-3.650917}},{id:"A2",layer:"inner3",soc:{x:-7,y:-.5},ram:{x:7.841917,y:1.949083}},{id:"A3",layer:"inner6",soc:{x:-5,y:-1},ram:{x:7.841917,y:2.749083}},{id:"A4",layer:"inner4",soc:{x:-4.5,y:-1.5},ram:{x:7.841917,y:3.549083}},{id:"A5",layer:"inner2",soc:{x:-6.5,y:-2},ram:{x:8.491917,y:3.549083}},{id:"CS0_n",layer:"inner5",soc:{x:-5.5,y:-.5},ram:{x:7.841917,y:-2.050917}},{id:"CKE0",layer:"inner1",soc:{x:-4.5,y:-1},ram:{x:8.491917,y:-2.050917}},{id:"CK0",layer:"bottom",differentialPairId:"CK0",soc:{x:-4.5,y:1},ram:{x:8.491917,y:1.149083}},{id:"CK0_n",layer:"bottom",differentialPairId:"CK0",soc:{x:-5,y:1},ram:{x:8.491917,y:1.949083}},{id:"DDR_LINK_RESET0_n",layer:"inner6",soc:{x:-5,y:-1.5},ram:{x:13.041917,y:3.549083}}],createAm62lExample=options=>{let ports=options.buses.flatMap(bus=>bus.ports),addedPairIds=new Set,makeEndpoints=port=>[{regionId:"soc",position:port.soc},{regionId:"ram",position:port.ram}],connections=[];for(let port of ports){if(!port.differentialPairId){connections.push({id:port.id,endpoints:makeEndpoints(port)});continue}if(addedPairIds.has(port.differentialPairId))continue;addedPairIds.add(port.differentialPairId);let pair=ports.filter(candidate=>candidate.differentialPairId===port.differentialPairId);if(pair.length!==2)throw new Error(`Differential pair ${port.differentialPairId} must have two members`);let[first,second]=pair;connections.push({type:"differential",connections:[{id:first.id,endpoints:makeEndpoints(first)},{id:second.id,endpoints:makeEndpoints(second)}]})}let buses=options.buses.map(bus=>{let solverBus={id:bus.id,connectionIds:bus.ports.map(port=>port.id)};return bus.preferredLayer!==void 0&&(solverBus={...solverBus,preferredLayer:bus.preferredLayer}),bus.preferredLayers!==void 0&&(solverBus={...solverBus,preferredLayers:bus.preferredLayers}),solverBus});return{regions:[{id:"soc",bounds:{minX:-16.62808,maxX:-2.37192,minY:-10.62808,maxY:10.62808},edge:"right"},{id:"ram",bounds:{minX:1.091917,maxX:18.141917,minY:-9.650917,maxY:9.549083},edge:"left"}],connections,buses,boundaryPointSpacing:.48}},ddrByte0Example=createAm62lExample({buses:[{id:"DDR_BYTE0",ports:DDR_BYTE0_PORTS,preferredLayers:["inner1","inner4"]}]}),ddrByte1Example=createAm62lExample({buses:[{id:"DDR_BYTE1",ports:DDR_BYTE1_PORTS,preferredLayers:["inner2","inner5"]}]}),fullDdrExample=createAm62lExample({buses:[{id:"DDR_BYTE0",ports:DDR_BYTE0_PORTS,preferredLayers:["inner1","inner4"]},{id:"DDR_BYTE1",ports:DDR_BYTE1_PORTS,preferredLayers:["inner2","inner5"]},{id:"DDR_ADDR_CTRL",ports:DDR_ADDR_CTRL_PORTS,preferredLayers:["inner3","inner6"]}]}),controlBusExample=createAm62lExample({buses:[{id:"DDR_ADDR_CTRL",ports:DDR_ADDR_CTRL_PORTS,preferredLayers:["inner3","inner6"]}]}),WindingBreakoutInputError=class extends Error{constructor(){super(...arguments);__publicField(this,"name","WindingBreakoutInputError")}},WindingBreakoutInfeasibleError=class extends Error{constructor(){super(...arguments);__publicField(this,"name","WindingBreakoutInfeasibleError")}},WindingBreakoutInvariantError=class extends Error{constructor(){super(...arguments);__publicField(this,"name","WindingBreakoutInvariantError")}},WindingBreakoutOutputUnavailableError=class extends Error{constructor(){super(...arguments);__publicField(this,"name","WindingBreakoutOutputUnavailableError")}},getCanonicalConnections=input2=>{let connections=[];for(let entry of input2.connections)"type"in entry?connections.push(...entry.connections):connections.push(entry);return connections},getBusLayerCandidates=bus=>bus.preferredLayer!==void 0?[bus.preferredLayer]:bus.preferredLayers!==void 0?[...new Set(bus.preferredLayers)]:["top"],getLayerCandidatesByConnection=input2=>{let candidatesByConnection=new Map;for(let bus of input2.buses){let candidates=getBusLayerCandidates(bus);for(let connectionId of bus.connectionIds)candidatesByConnection.set(connectionId,candidates)}return Object.fromEntries(getCanonicalConnections(input2).map(connection=>[connection.id,candidatesByConnection.get(connection.id)??["top"]]))},fail=message=>{throw new WindingBreakoutInputError(`WindingBreakoutSolver: ${message}`)},isRecord=value=>typeof value=="object"&&value!==null&&!Array.isArray(value),requireRecord=(value,label)=>{isRecord(value)||fail(`${label} must be an object`)},requireId=(value,label)=>{(typeof value!="string"||value.trim().length===0)&&fail(`${label} must be a non-empty string`)},requireFinite=(value,label)=>{(typeof value!="number"||!Number.isFinite(value))&&fail(`${label} must be finite`)},requirePositive=(value,label)=>{requireFinite(value,label),value<=0&&fail(`${label} must be positive`)},requireArray=(value,message)=>Array.isArray(value)?value:fail(message),validatePoint=(value,label)=>(requireRecord(value,label),requireFinite(value.x,`${label}.x`),requireFinite(value.y,`${label}.y`),value),validateBounds=(value,label)=>(requireRecord(value,label),requireFinite(value.minX,`${label}.minX`),requireFinite(value.maxX,`${label}.maxX`),requireFinite(value.minY,`${label}.minY`),requireFinite(value.maxY,`${label}.maxY`),(value.minX>=value.maxX||value.minY>=value.maxY)&&fail(`${label} must have positive width and height`),{minX:value.minX,maxX:value.maxX,minY:value.minY,maxY:value.maxY}),pointIsInsideBounds4=(point62,bounds)=>point62.x>=bounds.minX&&point62.x<=bounds.maxX&&point62.y>=bounds.minY&&point62.y<=bounds.maxY,validateWindingBreakoutInput=input2=>{(!Array.isArray(input2.regions)||input2.regions.length===0)&&fail("at least one region is required"),requirePositive(input2.boundaryPointSpacing,"boundaryPointSpacing");let regionIds=new Set,regions=input2.regions.map((value,index)=>{requireRecord(value,`regions[${index}]`),requireId(value.id,`regions[${index}].id`),regionIds.has(value.id)&&fail(`duplicate region id "${value.id}"`),regionIds.add(value.id);let bounds=validateBounds(value.bounds,`region "${value.id}" bounds`);return(typeof value.edge!="string"||!new Set(["left","right","bottom","top"]).has(value.edge))&&fail(`region "${value.id}" has invalid edge`),{id:value.id,bounds,edge:value.edge,center:{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2}}}),vertical=regions.every(region=>region.edge==="left"||region.edge==="right"),horizontal=regions.every(region=>region.edge==="bottom"||region.edge==="top");!vertical&&!horizontal&&fail("all coordinated region edges must be parallel"),(!Array.isArray(input2.connections)||input2.connections.length===0)&&fail("at least one connection is required");let connections=[],connectionIds=new Set,atomicConnectionGroups=[],validateConnection=(value,label)=>{requireRecord(value,label),requireId(value.id,`${label}.id`),connectionIds.has(value.id)&&fail(`duplicate connection id "${value.id}"`),"layer"in value&&fail(`${label}.layer is not accepted; declare layer preferences on a bus`);let endpointValues=requireArray(value.endpoints,`${label}.endpoints must be an array`),endpointRegionIds=new Set,endpoints=endpointValues.map((endpointValue,endpointIndex)=>{let endpointLabel=`${label}.endpoints[${endpointIndex}]`;requireRecord(endpointValue,endpointLabel),requireId(endpointValue.regionId,`${endpointLabel}.regionId`),regionIds.has(endpointValue.regionId)||fail(`${endpointLabel} references unknown region "${endpointValue.regionId}"`),endpointRegionIds.has(endpointValue.regionId)&&fail(`${label} has duplicate endpoint for region "${endpointValue.regionId}"`),endpointRegionIds.add(endpointValue.regionId);let position4=validatePoint(endpointValue.position,`${endpointLabel}.position`),region=regions.find(candidate=>candidate.id===endpointValue.regionId);return pointIsInsideBounds4(position4,region.bounds)||fail(`${label} endpoint for region "${region.id}" is outside its bounds`),{regionId:endpointValue.regionId,position:position4}});for(let region of regions)endpointRegionIds.has(region.id)||fail(`${label} is missing endpoint for region "${region.id}"`);return endpoints.length!==regions.length&&fail(`${label} must contain exactly one endpoint for every region`),connectionIds.add(value.id),{id:value.id,endpoints}};for(let[index,value]of input2.connections.entries()){let label=`connections[${index}]`;if(requireRecord(value,label),"type"in value||"connections"in value){value.type!=="differential"&&fail(`${label} has invalid differential-pair type`),"layer"in value&&fail(`${label}.layer is not accepted; declare layer preferences on a bus`);let pairConnections=requireArray(value.connections,`${label}.connections must contain exactly two members`);pairConnections.length!==2&&fail(`${label}.connections must contain exactly two members`);let first=validateConnection(pairConnections[0],`${label}.connections[0]`),second=validateConnection(pairConnections[1],`${label}.connections[1]`);first.id===second.id&&fail(`${label} members must have distinct connection ids`),connections.push(first,second),atomicConnectionGroups.push([first.id,second.id])}else connections.push(validateConnection(value,label))}let busValues=requireArray(input2.buses,"buses must be an array"),busIds=new Set,busByConnection=new Map,buses=busValues.map((value,busIndex)=>{let label=`buses[${busIndex}]`;requireRecord(value,label),requireId(value.id,`${label}.id`);let busId=value.id;busIds.has(busId)&&fail(`duplicate bus id "${busId}"`),busIds.add(busId);let connectionIdValues=requireArray(value.connectionIds,`${label}.connectionIds must be a non-empty array`);connectionIdValues.length===0&&fail(`${label}.connectionIds must be a non-empty array`);let localConnectionIds=new Set,busConnectionIds=connectionIdValues.map((connectionId,connectionIndex)=>{requireId(connectionId,`${label}.connectionIds[${connectionIndex}]`),connectionIds.has(connectionId)||fail(`${label} references unknown connection "${connectionId}"`),localConnectionIds.has(connectionId)&&fail(`${label} contains duplicate connection "${connectionId}"`),localConnectionIds.add(connectionId);let previousBusId=busByConnection.get(connectionId);return previousBusId!==void 0&&fail(`connection "${connectionId}" belongs to multiple buses "${previousBusId}" and "${value.id}"`),busByConnection.set(connectionId,busId),connectionId}),preferredLayer;value.preferredLayer!==void 0&&(requireId(value.preferredLayer,`${label}.preferredLayer`),preferredLayer=value.preferredLayer);let preferredLayers;if(value.preferredLayers!==void 0){let preferredLayerValues=requireArray(value.preferredLayers,`${label}.preferredLayers must be a non-empty array`);preferredLayerValues.length===0&&fail(`${label}.preferredLayers must be a non-empty array`);let uniquePreferredLayers=new Set;preferredLayers=preferredLayerValues.map((layer,layerIndex)=>(requireId(layer,`${label}.preferredLayers[${layerIndex}]`),uniquePreferredLayers.has(layer)&&fail(`${label}.preferredLayers contains duplicate layer "${layer}"`),uniquePreferredLayers.add(layer),layer))}let validatedBus={id:busId,connectionIds:busConnectionIds};return preferredLayer!==void 0&&(validatedBus={...validatedBus,preferredLayer}),preferredLayers!==void 0&&(validatedBus={...validatedBus,preferredLayers}),validatedBus});for(let[firstConnectionId,secondConnectionId]of atomicConnectionGroups){let firstBusId=busByConnection.get(firstConnectionId),secondBusId=busByConnection.get(secondConnectionId);firstBusId!==secondBusId&&fail(`differential pair "${firstConnectionId}/${secondConnectionId}" must belong to the same bus`)}let layerNames=[...new Set([...buses.flatMap(bus=>getBusLayerCandidates(bus)),...connections.filter(connection=>!busByConnection.has(connection.id)).map(()=>"top")])].sort((first,second)=>first.localeCompare(second));return{regions,connections,buses,layerNames,atomicConnectionGroups}},GEOMETRY_EPSILON22=1e-9,isVerticalEdge=edge=>edge==="left"||edge==="right",getAxisMinimum=(region,vertical)=>vertical?region.bounds.minY:region.bounds.minX,getAxisMaximum=(region,vertical)=>vertical?region.bounds.maxY:region.bounds.maxX,getAxisPosition=(position4,vertical)=>vertical?position4.y:position4.x,deriveLayerOffsets=(layerNames,boundaryPointSpacing)=>{let staggerOffset=boundaryPointSpacing/2;return Object.fromEntries(layerNames.map((layer,index)=>[layer,(index-(layerNames.length-1)/2)*staggerOffset]))},makeAtomicLayerOrder=({referenceOrder,layer,layerByConnection,atomicGroups})=>{let candidates=referenceOrder.filter(connectionId=>layerByConnection[connectionId]===layer),groupByConnection=new Map(atomicGroups.flatMap(group2=>group2.map(connectionId=>[connectionId,group2]))),addedGroups=new Set,result=[];for(let connectionId of candidates){let group2=groupByConnection.get(connectionId);if(!group2){result.push(connectionId);continue}addedGroups.has(group2)||(addedGroups.add(group2),result.push(...candidates.filter(candidate=>group2.includes(candidate))))}return result},makeGateAxes=({regions,connections,spacing,count,layerOffsets})=>{let vertical=regions.every(region=>isVerticalEdge(region.edge)),minAxis=Math.max(...regions.map(region=>getAxisMinimum(region,vertical))),maxAxis=Math.min(...regions.map(region=>getAxisMaximum(region,vertical))),minimumOffset=Math.min(...Object.values(layerOffsets)),maximumOffset=Math.max(...Object.values(layerOffsets)),span=spacing*Math.max(0,count-1)+maximumOffset-minimumOffset;if(maxAxis-minAxis+GEOMETRY_EPSILON22<span)throw new WindingBreakoutInfeasibleError(`WindingBreakoutSolver: declared breakout edges need ${span.toFixed(2)}mm but expose only ${(maxAxis-minAxis).toFixed(2)}mm`);let meanAxis=regions.reduce((regionSum,region)=>{let positions=connections.map(connection=>connection.endpoints.find(endpoint=>endpoint.regionId===region.id).position);return regionSum+positions.reduce((sum,position4)=>sum+getAxisPosition(position4,vertical),0)/positions.length},0)/regions.length,start=Math.max(minAxis-minimumOffset,Math.min(maxAxis-spacing*Math.max(0,count-1)-maximumOffset,meanAxis-spacing*Math.max(0,count-1)/2));return{vertical,axes:Array.from({length:count},(_22,index)=>start+index*spacing)}},pointOnEdge=(region,axis,vertical)=>{if(vertical){let x22=region.bounds.maxX;return region.edge==="left"&&(x22=region.bounds.minX),{x:x22,y:axis}}let y22=region.bounds.maxY;return region.edge==="bottom"&&(y22=region.bounds.minY),{x:axis,y:y22}},placeBreakoutGates=({regions,connections,referenceOrder,layerNames,layerByConnection,boundaryPointSpacing,atomicGroups})=>{let layerOffsets=deriveLayerOffsets(layerNames,boundaryPointSpacing),gateOrderByLayer=Object.fromEntries(layerNames.map(layer=>[layer,makeAtomicLayerOrder({referenceOrder,layer,layerByConnection,atomicGroups})])),maxLayerNetCount=Math.max(...layerNames.map(layer=>connections.filter(connection=>layerByConnection[connection.id]===layer).length)),{vertical,axes:axes2}=makeGateAxes({regions,connections,spacing:boundaryPointSpacing,count:maxLayerNetCount,layerOffsets});return{breakoutPoints:regions.flatMap(region=>layerNames.flatMap(layer=>gateOrderByLayer[layer].map((connectionId,slotIndex)=>({regionId:region.id,connectionId,layer,...pointOnEdge(region,axes2[slotIndex]+layerOffsets[layer],vertical)}))))}},getAtomicUnits=(connectionIds,atomicGroups)=>{let connectionSet=new Set(connectionIds),groupByConnection=new Map(atomicGroups.flatMap(group2=>group2.map(connectionId=>[connectionId,group2]))),addedGroups=new Set,units=[];for(let connectionId of connectionIds){let group2=groupByConnection.get(connectionId);if(!group2){units.push([connectionId]);continue}addedGroups.has(group2)||(addedGroups.add(group2),units.push(group2.filter(memberId=>connectionSet.has(memberId))))}return units},assignConnectionLayers=({validated,referenceOrder})=>{let assignments=new Map;for(let bus of validated.buses){let busConnectionSet=new Set(bus.connectionIds),orderedBusConnections=referenceOrder.filter(connectionId=>busConnectionSet.has(connectionId)),candidates=getBusLayerCandidates(bus),units=getAtomicUnits(orderedBusConnections,validated.atomicConnectionGroups);for(let[unitIndex,unit2]of units.entries()){let layer=candidates[unitIndex%candidates.length];for(let connectionId of unit2)assignments.set(connectionId,layer)}}for(let connectionId of referenceOrder)assignments.has(connectionId)||assignments.set(connectionId,"top");let layerByConnection=Object.fromEntries(referenceOrder.map(connectionId=>[connectionId,assignments.get(connectionId)])),layerNames=[...new Set(Object.values(layerByConnection))].sort((first,second)=>first.localeCompare(second));return{layerByConnection,layerNames}},getLayerNames=input2=>[...new Set(Object.values(getLayerCandidatesByConnection(input2)).flat())].sort((first,second)=>first.localeCompare(second)),CONNECTION_COLORS=["#2563eb","#dc2626","#059669","#7c3aed","#d97706","#0891b2","#db2777","#4f46e5","#65a30d","#c2410c","#0f766e","#9333ea"],getConnectionColor=connectionId=>{let hash=2166136261;for(let character of connectionId)hash^=character.charCodeAt(0),hash=Math.imul(hash,16777619);return CONNECTION_COLORS[(hash>>>0)%CONNECTION_COLORS.length]},getGraphicsLayer3=(input2,layerIds)=>{let signalLayerIds=getLayerNames(input2),indexes=[...new Set(layerIds)].map(layerId=>{let index=signalLayerIds.indexOf(layerId);if(index<0)throw new Error(`Cannot visualize unknown signal layer "${layerId}"`);return index});if(indexes.length===0)throw new Error("Cannot create graphics metadata without a signal layer");return indexes.sort((first,second)=>first-second),`z${indexes.join(",")}`},createInputGraphics=(input2,activeLayer)=>{let graphics={circles:[],rects:[],texts:[]},displayedLayers=getLayerNames(input2);activeLayer&&(displayedLayers=[activeLayer]);let visibleLayers=getGraphicsLayer3(input2,displayedLayers),connections=getCanonicalConnections(input2),layerCandidatesByConnection=getLayerCandidatesByConnection(input2),endpointRadius=Math.min(.12,input2.boundaryPointSpacing/4);for(let region of input2.regions){let center2={x:(region.bounds.minX+region.bounds.maxX)/2,y:(region.bounds.minY+region.bounds.maxY)/2};graphics.rects.push({center:center2,width:region.bounds.maxX-region.bounds.minX,height:region.bounds.maxY-region.bounds.minY,fill:"rgba(226, 232, 240, 0.035)",stroke:"rgba(71, 85, 105, 0.55)",layer:visibleLayers});for(let connection of connections){let layerCandidates=layerCandidatesByConnection[connection.id];if(activeLayer&&!layerCandidates.includes(activeLayer))continue;let endpoint=connection.endpoints.find(candidate=>candidate.regionId===region.id);if(!endpoint)continue;let color=getConnectionColor(connection.id);graphics.circles.push({center:endpoint.position,radius:endpointRadius,fill:`${color}70`,stroke:color,layer:getGraphicsLayer3(input2,layerCandidates)})}graphics.texts.push({x:center2.x,y:region.bounds.maxY+.35,text:region.id,anchorSide:"bottom_center",color:"#334155",fontSize:.34,layer:visibleLayers})}return graphics},createStateGraphics=(input2,state2,activeLayer)=>{let connections=getCanonicalConnections(input2),breakoutPoints=state2.breakoutPoints.filter(point62=>!activeLayer||point62.layer===activeLayer),sharedGateSlots=new Map;for(let point62 of state2.breakoutPoints){let key=`${point62.regionId}:${point62.x.toFixed(9)}:${point62.y.toFixed(9)}`,slot=sharedGateSlots.get(key)??{x:point62.x,y:point62.y,layers:new Set};slot.layers.add(point62.layer),sharedGateSlots.set(key,slot)}return{lines:state2.referenceOrder.flatMap(connectionId=>{let connection=connections.find(candidate=>candidate.id===connectionId);if(!connection)return[];let connectionBreakouts=breakoutPoints.filter(point62=>point62.connectionId===connectionId),layer=connectionBreakouts[0]?.layer;if(!layer||activeLayer&&layer!==activeLayer)return[];if(connectionBreakouts.length!==input2.regions.length)return[];let points=input2.regions.flatMap((region,regionIndex)=>{let endpoint=connection.endpoints.find(candidate=>candidate.regionId===region.id),breakout=connectionBreakouts.find(candidate=>candidate.regionId===region.id);return!endpoint||!breakout?[]:regionIndex===0?[endpoint.position,breakout]:[breakout,endpoint.position]});return points.length<2?[]:[{points,strokeColor:`${getConnectionColor(connectionId)}55`,strokeWidth:.012,strokeDash:[.025,.07],layer:getGraphicsLayer3(input2,[layer])}]}),circles:[...sharedGateSlots.values()].flatMap(slot=>{let layers=[...slot.layers].filter(layer=>!activeLayer||layer===activeLayer);return layers.length===0?[]:[{center:slot,radius:.11,fill:"rgba(15, 23, 42, 0.06)",stroke:"#475569",layer:getGraphicsLayer3(input2,layers)}]}),points:breakoutPoints.map(point62=>({x:point62.x,y:point62.y,color:getConnectionColor(point62.connectionId),label:`${point62.connectionId} \xB7 ${point62.layer}`,layer:getGraphicsLayer3(input2,[point62.layer])}))}},createSolverPhaseVisualization=({input:input2,phase,detail,activeLayer,referenceOrder,referenceRegionId,showReferenceNumbers=!1,state:state2})=>{let inputGraphics=createInputGraphics(input2,activeLayer),stateGraphics;state2&&(stateGraphics=createStateGraphics(input2,state2,activeLayer));let displayedLayers=getLayerNames(input2);activeLayer&&(displayedLayers=[activeLayer]);let textLayer=getGraphicsLayer3(input2,displayedLayers),maxY=Math.max(...input2.regions.map(region=>region.bounds.maxY)),minX=Math.min(...input2.regions.map(region=>region.bounds.minX)),texts=[...inputGraphics.texts??[],...stateGraphics?.texts??[],{x:minX,y:maxY+1.05,text:phase,anchorSide:"bottom_left",color:"#0f172a",fontSize:.42,layer:textLayer},{x:minX,y:maxY+.68,text:detail,anchorSide:"bottom_left",color:"#475569",fontSize:.25,layer:textLayer}],referenceLines=[],referenceCircles=[];if(showReferenceNumbers&&referenceOrder){let referenceRegion=input2.regions.find(region=>region.id===referenceRegionId)??input2.regions[0],connections=getCanonicalConnections(input2),layerCandidatesByConnection=getLayerCandidatesByConnection(input2),orderedPositions=[];for(let[index,connectionId]of referenceOrder.entries()){let connection=connections.find(candidate=>candidate.id===connectionId),layerCandidates=layerCandidatesByConnection[connectionId];if(!connection||!layerCandidates||activeLayer&&!layerCandidates.includes(activeLayer))continue;let endpoint=connection.endpoints.find(candidate=>candidate.regionId===referenceRegion.id);endpoint&&(orderedPositions.push(endpoint.position),texts.push({x:endpoint.position.x+.18,y:endpoint.position.y+.18,text:`${index+1} \xB7 ${connectionId}`,anchorSide:"bottom_left",color:getConnectionColor(connectionId),fontSize:.21,layer:getGraphicsLayer3(input2,layerCandidates)}))}let center2={x:(referenceRegion.bounds.minX+referenceRegion.bounds.maxX)/2,y:(referenceRegion.bounds.minY+referenceRegion.bounds.maxY)/2};referenceLines.push(...orderedPositions.map(position4=>({points:[center2,position4],strokeColor:"rgba(100, 116, 139, 0.35)",strokeWidth:.01,strokeDash:[.03,.05],layer:textLayer}))),orderedPositions.length>1&&referenceLines.push({points:orderedPositions,strokeColor:"rgba(15, 23, 42, 0.65)",strokeWidth:.018,strokeDash:[.04,.04],label:`${referenceRegion.id} angular winding order`,layer:textLayer}),referenceCircles.push({center:center2,radius:.07,fill:"#0f172a",stroke:"#ffffff",label:`${referenceRegion.id} angular reference center`,layer:textLayer})}return{title:phase,coordinateSystem:"cartesian",rects:inputGraphics.rects,polygons:inputGraphics.polygons,lines:[...stateGraphics?.lines??[],...referenceLines],circles:[...inputGraphics.circles??[],...stateGraphics?.circles??[],...referenceCircles],points:stateGraphics?.points,texts}},getSharedGateSlotCount=points=>new Set(points.map(point62=>`${point62.regionId}:${point62.x.toFixed(9)}:${point62.y.toFixed(9)}`)).size,GatePlacementSolver=class extends BaseSolver{constructor(params){super();__publicField(this,"params");__publicField(this,"batchIndex",0);__publicField(this,"output");__publicField(this,"plannedPlacement");__publicField(this,"placementBatches");__publicField(this,"visibleBreakoutPoints",[]);__publicField(this,"layerByConnection");__publicField(this,"visualizationLayer");this.params=params,this.visualizationLayer=params.visualizationLayer;let assignment=assignConnectionLayers({validated:params.validated,referenceOrder:params.ordering.referenceOrder});this.layerByConnection=assignment.layerByConnection,this.placementBatches=params.validated.regions.flatMap(region=>assignment.layerNames.map(layer=>({regionId:region.id,layer}))),this.MAX_ITERATIONS=this.placementBatches.length+2}setVisualizationLayer(layer){this.visualizationLayer=layer}_step(){if(!this.plannedPlacement){this.plannedPlacement=placeBreakoutGates({regions:this.params.validated.regions,connections:this.params.validated.connections,referenceOrder:this.params.ordering.referenceOrder,layerNames:[...new Set(Object.values(this.layerByConnection))].sort((first,second)=>first.localeCompare(second)),layerByConnection:this.layerByConnection,boundaryPointSpacing:this.params.input.boundaryPointSpacing,atomicGroups:this.params.validated.atomicConnectionGroups}),this.stats={phase:"plan-gate-grid",regionLayerBatches:this.placementBatches.length,placedBreakpoints:0};return}let batch=this.placementBatches[this.batchIndex];if(batch){this.visibleBreakoutPoints.push(...this.plannedPlacement.breakoutPoints.filter(point62=>point62.regionId===batch.regionId&&point62.layer===batch.layer)),this.batchIndex+=1,this.stats={phase:"place-region-layer-batch",regionId:batch.regionId,layer:batch.layer,completedBatches:this.batchIndex,totalBatches:this.placementBatches.length,placedBreakpoints:this.visibleBreakoutPoints.length};return}this.output=this.plannedPlacement,this.stats={phase:"finalize-shared-gate-slots",placedBreakpoints:this.output.breakoutPoints.length,sharedGateSlots:getSharedGateSlotCount(this.output.breakoutPoints)},this.solved=!0}computeProgress(){let completedMicrosteps=this.batchIndex;return this.plannedPlacement&&(completedMicrosteps+=1),this.output&&(completedMicrosteps+=1),completedMicrosteps/this.MAX_ITERATIONS}getConstructorParams(){return[this.params]}getOutput(){if(!this.solved||!this.output)throw new WindingBreakoutInvariantError("WindingBreakoutSolver: gate placement requested before placement completed");return this.output}visualize(){let detail="Next microstep: derive layer offsets, atomic gate orders, and the common boundary slot grid";if(this.plannedPlacement&&this.batchIndex===0)detail=`Gate grid planned \xB7 ${this.placementBatches.length} region/layer batches remain`;else if(this.plannedPlacement&&!this.output){let latestBatch=this.placementBatches[this.batchIndex-1];detail=`Placed region \u201C${latestBatch.regionId}\u201D on layer \u201C${latestBatch.layer}\u201D \xB7 ${this.batchIndex}/${this.placementBatches.length} batches`}else if(this.output){let sharedGateSlotCount=getSharedGateSlotCount(this.output.breakoutPoints);detail=`${this.output.breakoutPoints.length} gates placed; coincident layer positions form ${sharedGateSlotCount} shared slots`}let visualizationState;if(this.plannedPlacement){let breakoutPoints=this.visibleBreakoutPoints;this.output&&(breakoutPoints=this.output.breakoutPoints),visualizationState={referenceOrder:this.params.ordering.referenceOrder,breakoutPoints}}let graphics=createSolverPhaseVisualization({input:this.params.input,activeLayer:this.visualizationLayer,phase:"Step 2 \xB7 Place boundary gates",detail,state:visualizationState}),plannedSlotGuides=(this.plannedPlacement?.breakoutPoints??[]).filter(point62=>!this.visualizationLayer||point62.layer===this.visualizationLayer).map(point62=>({center:point62,radius:.065,fill:"rgba(255, 255, 255, 0.75)",stroke:"rgba(100, 116, 139, 0.5)",label:`planned slot ${point62.regionId} \xB7 ${point62.layer}`,layer:getGraphicsLayer3(this.params.input,[point62.layer])}));return{...graphics,circles:[...graphics.circles??[],...plannedSlotGuides]}}},getNaturalWindingOrder=(region,connections)=>connections.map(connection=>{let position4=connection.endpoints.find(endpoint=>endpoint.regionId===region.id).position;return{id:connection.id,angle:Math.atan2(position4.y-region.center.y,position4.x-region.center.x),radius:Math.hypot(position4.x-region.center.x,position4.y-region.center.y)}}).sort((first,second)=>first.angle-second.angle||second.radius-first.radius||first.id.localeCompare(second.id)).map(connection=>connection.id),getReferenceWindingOrder=(naturalOrder,atomicGroups,buses)=>{let groupByConnection=new Map(atomicGroups.flatMap(group2=>group2.map(connectionId=>[connectionId,group2]))),addedGroups=new Set,result=[];for(let connectionId of naturalOrder){let group2=groupByConnection.get(connectionId);if(!group2){result.push(connectionId);continue}addedGroups.has(group2)||(addedGroups.add(group2),result.push(...naturalOrder.filter(candidate=>group2.includes(candidate))))}let busByConnection=new Map(buses.flatMap(bus=>bus.connectionIds.map(connectionId=>[connectionId,bus]))),addedBuses=new Set,busContiguousResult=[];for(let connectionId of result){let bus=busByConnection.get(connectionId);if(!bus){busContiguousResult.push(connectionId);continue}if(addedBuses.has(bus))continue;addedBuses.add(bus);let busConnectionIds=new Set(bus.connectionIds);busContiguousResult.push(...result.filter(candidate=>busConnectionIds.has(candidate)))}return busContiguousResult},ReferenceOrderingSolver=class extends BaseSolver{constructor(params){super();__publicField(this,"params");__publicField(this,"naturalOrderByRegion",{});__publicField(this,"currentRegionIndex",0);__publicField(this,"output");__publicField(this,"visualizedOrder");__publicField(this,"visualizedRegionId");__publicField(this,"visualizationLayer");this.params=params,this.visualizationLayer=params.visualizationLayer,this.MAX_ITERATIONS=params.validated.regions.length+1}setVisualizationLayer(layer){this.visualizationLayer=layer}_step(){let region=this.params.validated.regions[this.currentRegionIndex];if(region){let naturalOrder=getNaturalWindingOrder(region,this.params.validated.connections);this.naturalOrderByRegion[region.id]=naturalOrder,this.visualizedRegionId=region.id,this.visualizedOrder=naturalOrder,this.currentRegionIndex+=1,this.stats={phase:"derive-natural-order",regionId:region.id,completedRegions:this.currentRegionIndex,totalRegions:this.params.validated.regions.length,naturalOrder};return}let firstRegion=this.params.validated.regions[0],referenceOrder=getReferenceWindingOrder(this.naturalOrderByRegion[firstRegion.id],this.params.validated.atomicConnectionGroups,this.params.validated.buses);this.output={naturalOrderByRegion:this.naturalOrderByRegion,referenceOrder},this.visualizedRegionId=firstRegion.id,this.visualizedOrder=referenceOrder,this.stats={phase:"atomicize-reference-order",referenceRegion:firstRegion.id,referenceOrder},this.solved=!0}computeProgress(){let completedMicrosteps=this.currentRegionIndex;return this.output&&(completedMicrosteps+=1),completedMicrosteps/this.MAX_ITERATIONS}getConstructorParams(){return[this.params]}getOutput(){if(!this.solved||!this.output)throw new WindingBreakoutInvariantError("WindingBreakoutSolver: reference order requested before ordering completed");return this.output}visualize(){let firstRegionId=this.params.validated.regions[0].id,detail=`Next microstep: derive natural order for region \u201C${firstRegionId}\u201D`;return this.visualizedRegionId&&!this.output&&(detail=`Natural order for region \u201C${this.visualizedRegionId}\u201D \xB7 ${this.currentRegionIndex}/${this.params.validated.regions.length} regions processed`),this.output&&(detail=`Reference region \u201C${firstRegionId}\u201D finalized; buses are contiguous and differential pairs are atomic`),createSolverPhaseVisualization({input:this.params.input,activeLayer:this.visualizationLayer,phase:"Step 1 \xB7 Derive reference order",detail,referenceOrder:this.visualizedOrder,referenceRegionId:this.visualizedRegionId,showReferenceNumbers:!0})}},validateBreakoutPoints=({points,connectionIds,regions,atomicGroups})=>{let regionIds=regions.map(region=>region.id),endpointCounts=new Map,layerByConnection=new Map,connectionLayersAreValid=!0;for(let point62 of points){let key=`${point62.regionId}:${point62.connectionId}`;endpointCounts.set(key,(endpointCounts.get(key)??0)+1);let previousLayer=layerByConnection.get(point62.connectionId);previousLayer!==void 0&&previousLayer!==point62.layer&&(connectionLayersAreValid=!1),layerByConnection.set(point62.connectionId,point62.layer)}let expected=regionIds.flatMap(regionId=>connectionIds.map(connectionId=>`${regionId}:${connectionId}`)),endpointsAreValid=endpointCounts.size===expected.length&&expected.every(endpoint=>endpointCounts.get(endpoint)===1),atomicGroupsAreValid=atomicGroups.every(group2=>{let layer=layerByConnection.get(group2[0]);return!layer||group2.some(connectionId=>layerByConnection.get(connectionId)!==layer)?!1:regions.every(region=>{let layerPoints=points.filter(point62=>point62.regionId===region.id&&point62.layer===layer),vertical=region.edge==="left"||region.edge==="right",orderedConnectionIds=[...layerPoints].sort((first,second)=>vertical?first.y-second.y:first.x-second.x).map(point62=>point62.connectionId),firstIndex=orderedConnectionIds.indexOf(group2[0]),secondIndex=orderedConnectionIds.indexOf(group2[1]);return firstIndex!==-1&&secondIndex!==-1&&Math.abs(firstIndex-secondIndex)===1})});return endpointsAreValid&&connectionLayersAreValid&&atomicGroupsAreValid},finalizeWindingBreakoutOutput=({validated,placement})=>{if(!validateBreakoutPoints({points:placement.breakoutPoints,connectionIds:validated.connections.map(connection=>connection.id),regions:validated.regions,atomicGroups:validated.atomicConnectionGroups}))throw new WindingBreakoutInvariantError("WindingBreakoutSolver: generated invalid breakout points");return{breakoutPoints:placement.breakoutPoints}},PIPELINE_STAGE_NAMES=["referenceOrdering","gatePlacement"],WindingBreakoutSolver=class extends BasePipelineSolver{constructor(input2){super(input2);__publicField(this,"validatedInput");__publicField(this,"output");__publicField(this,"visualizationLayer");__publicField(this,"pipelineDef",[definePipelineStep("referenceOrdering",ReferenceOrderingSolver,pipeline=>[{input:pipeline.inputProblem,validated:pipeline.getValidatedInput(),visualizationLayer:pipeline.visualizationLayer}]),definePipelineStep("gatePlacement",GatePlacementSolver,pipeline=>[{input:pipeline.inputProblem,validated:pipeline.getValidatedInput(),ordering:pipeline.getRequiredStageOutput("referenceOrdering"),visualizationLayer:pipeline.visualizationLayer}])])}_setup(){this.validatedInput=validateWindingBreakoutInput(this.inputProblem),this.stats={phase:"setup-input-validation",regionCount:this.validatedInput.regions.length,connectionCount:this.validatedInput.connections.length,layerCount:this.validatedInput.layerNames.length}}getValidatedInput(){if(!this.validatedInput)throw new Error("WindingBreakoutSolver: input has not been validated");return this.validatedInput}_step(){super._step(),!this.output&&!this.activeSubSolver&&this.currentPipelineStageIndex>=this.pipelineDef.length&&(this.output=finalizeWindingBreakoutOutput({validated:this.getValidatedInput(),placement:this.getRequiredStageOutput("gatePlacement")}),this.solved=!0),this.stats={phase:this.getCurrentStageName(),completedStages:this.currentPipelineStageIndex,totalStages:this.pipelineDef.length},this.solved&&(this.stats.phase="finalize-output-validation"),this.output&&(this.stats.valid=!0,this.stats.breakoutPointCount=this.output.breakoutPoints.length)}getRequiredStageOutput(stageName){let output=this.getStageOutput(stageName);if(output===void 0)throw new Error(`WindingBreakoutSolver: pipeline stage \u201C${stageName}\u201D has no output`);return output}setVisualizationLayer(layer){this.visualizationLayer=layer;for(let stageName of PIPELINE_STAGE_NAMES){let solver=this.getSolver(stageName);solver&&"setVisualizationLayer"in solver&&solver.setVisualizationLayer(layer)}}getConstructorParams(){return[this.inputProblem]}getOutput(){if(!this.solved||!this.output)throw new WindingBreakoutOutputUnavailableError("WindingBreakoutSolver: getOutput() called before successful completion");return this.output}initialVisualize(){return createSolverPhaseVisualization({input:this.inputProblem,activeLayer:this.visualizationLayer,phase:"Input \xB7 Validated during setup",detail:"Region bounds, breakout edges, bus layer preferences, and canonical endpoints"})}finalVisualize(){if(!this.output)return null;let ordering=this.getRequiredStageOutput("referenceOrdering");return createSolverPhaseVisualization({input:this.inputProblem,activeLayer:this.visualizationLayer,phase:"Output \xB7 Validated after gate placement",detail:"Valid: one bus-constrained breakout point per connection and region; pairs are adjacent",state:{referenceOrder:ordering.referenceOrder,breakoutPoints:this.output.breakoutPoints}})}visualize(){return{...super.visualize(),title:"Winding breakout solver \xB7 step-by-step pipeline",coordinateSystem:"cartesian"}}},toWindingConnection=connection=>({id:connection.connectionId,endpoints:connection.endpoints}),defaultImplicitBreakoutPointSolverFn=input2=>{let windingInput={regions:input2.regions.map(region=>({id:region.regionId,bounds:region.bounds,edge:region.edge})),connections:input2.connections.map(connection=>"type"in connection?{type:"differential",connections:connection.connections.map(toWindingConnection)}:toWindingConnection(connection)),buses:input2.buses.map(bus=>({id:bus.busId,connectionIds:bus.connectionIds,preferredLayers:bus.targetLayers})),boundaryPointSpacing:input2.boundaryPointSpacing},solver=new WindingBreakoutSolver(windingInput);return solver.solve(),solver.getOutput()},getFanoutBounds=pcbGroup=>{let outlineBounds=pcbGroup.outline?getBoundsFromPoints2(pcbGroup.outline):null,width=pcbGroup.width??(outlineBounds?outlineBounds.maxX-outlineBounds.minX:void 0),height=pcbGroup.height??(outlineBounds?outlineBounds.maxY-outlineBounds.minY:void 0);return width===void 0||height===void 0?null:{minX:pcbGroup.center.x-width/2,maxX:pcbGroup.center.x+width/2,minY:pcbGroup.center.y-height/2,maxY:pcbGroup.center.y+height/2}},getAxisGap2=(firstMin,firstMax,secondMin,secondMax)=>Math.max(firstMin-secondMax,secondMin-firstMax,0),Breakout_doInitialPcbPlacementDesignRuleChecks=breakout=>{if(breakout.root?.pcbDisabled||!breakout.pcb_group_id)return;let root=breakout.root;if(!root)return;let siblingFanouts=breakout.parent?.children.filter(sibling=>sibling instanceof breakout.constructor);if(!siblingFanouts)return;let breakoutIndex=siblingFanouts.indexOf(breakout);if(breakoutIndex<0)return;let{db:db22}=root,pcbGroup=db22.pcb_group.get(breakout.pcb_group_id);if(!pcbGroup)return;let bounds=getFanoutBounds(pcbGroup);if(bounds)for(let otherFanout of siblingFanouts.slice(breakoutIndex+1)){if(!otherFanout.pcb_group_id)continue;let otherPcbGroup=db22.pcb_group.get(otherFanout.pcb_group_id);if(!otherPcbGroup)continue;let otherBounds=getFanoutBounds(otherPcbGroup);if(!otherBounds)continue;let breakoutMargin=breakout._parsedProps.fanoutMargin,otherFanoutMargin=otherFanout._parsedProps.fanoutMargin,requiredMargin=Math.max(typeof breakoutMargin=="number"?breakoutMargin:0,typeof otherFanoutMargin=="number"?otherFanoutMargin:0),horizontalGap=getAxisGap2(bounds.minX,bounds.maxX,otherBounds.minX,otherBounds.maxX),verticalGap=getAxisGap2(bounds.minY,bounds.maxY,otherBounds.minY,otherBounds.maxY),horizontalOverlap=Math.min(bounds.maxX,otherBounds.maxX)-Math.max(bounds.minX,otherBounds.minX),verticalOverlap=Math.min(bounds.maxY,otherBounds.maxY)-Math.max(bounds.minY,otherBounds.minY),boundariesOverlap=horizontalOverlap>0&&verticalOverlap>0,violatesMargin=requiredMargin>0&&horizontalGap<requiredMargin&&verticalGap<requiredMargin;if(!boundariesOverlap&&!violatesMargin)continue;let message=boundariesOverlap?`Fanout boundaries "${breakout.name}" and "${otherFanout.name}" overlap. Fanout boundaries may not overlap.`:`Fanout boundaries "${breakout.name}" and "${otherFanout.name}" do not maintain the required ${requiredMargin}mm fanoutMargin.`;db22.pcb_placement_error.list().some(error2=>error2.message===message)||db22.pcb_placement_error.insert({error_type:"pcb_placement_error",message,subcircuit_id:breakout.subcircuit_id??void 0})}},reportWindingBreakoutInfeasibleError=(breakout,error2)=>{if(!(error2 instanceof WindingBreakoutInfeasibleError)||!breakout.root||!breakout.pcb_group_id)return!1;let componentNames=breakout.root.db.pcb_component.list().filter(pcbComponent=>pcbComponent.pcb_group_id===breakout.pcb_group_id).map(pcbComponent=>pcbComponent.source_component_id?breakout.root.db.source_component.get(pcbComponent.source_component_id)?.name:void 0).filter(name=>!!name);return breakout.root.db.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouting_error_winding_breakout_${breakout.pcb_group_id}`,error_type:"pcb_autorouting_error",message:`Winding fanout failed for ${componentNames.join(", ")||breakout.name}: ${error2.message}. The connections could not escape to the breakout boundary. Give the fanout more room by increasing the breakout's padding, or by extending the breakout to include the parts crowding it (decoupling capacitors, series resistors).`}),!0},getRoutingScopeOrThrow=breakout=>{let routingScope=breakout.parent;if(!routingScope?.selectAll)throw new Error(`Automatic breakout "${breakout.name}" has no coordinated routing scope`);return routingScope},getAutomaticBreakouts=(routingScope,breakoutToSolve)=>{let automaticBreakouts=[];for(let group2 of routingScope.selectAll("group")){if(!group2.isRoutingDirective||group2.parent!==routingScope)continue;let breakout=group2;breakout.children.some(child=>child instanceof AutoplacedBreakoutPoint)&&automaticBreakouts.push(breakout)}let getSourceTraceIds=breakout=>new Set(collectBreakoutRegionGeometry(breakout).endpointBySourceTraceId.keys()),sourceTraceIdsToSolve=getSourceTraceIds(breakoutToSolve);return automaticBreakouts.filter(automaticBreakout=>{let automaticBreakoutSourceTraceIds=getSourceTraceIds(automaticBreakout);return automaticBreakoutSourceTraceIds.size===sourceTraceIdsToSolve.size&&[...sourceTraceIdsToSolve].every(sourceTraceId=>automaticBreakoutSourceTraceIds.has(sourceTraceId))})},collectBreakoutRegionGeometry=breakout=>{if(!breakout.root||!breakout.pcb_group_id)throw new Error(`Automatic breakout "${breakout.name}" has no PCB region`);let pcbGroup=breakout.root.db.pcb_group.get(breakout.pcb_group_id);if(!pcbGroup||!pcbGroup.width||!pcbGroup.height)throw new Error(`Automatic breakout "${breakout.name}" has invalid PCB region bounds`);let 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},center2={x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},endpointBySourceTraceId=new Map,sourcePortIdBySourceTraceId=new Map;for(let breakoutPoint of breakout.children.filter(child=>child instanceof AutoplacedBreakoutPoint)){let matchedPort=breakoutPoint.matchedPort;if(!matchedPort?.pcb_port_id||!matchedPort.source_port_id)throw new Error(`Automatic breakout "${breakout.name}" is missing a PCB endpoint`);let sourceTraceId=breakoutPoint.matchedSourceTraceId;if(!sourceTraceId){let matchingSourceTraces=breakout.root.db.source_trace.list().filter(sourceTrace=>sourceTrace.connected_source_port_ids.includes(matchedPort.source_port_id));if(matchingSourceTraces.length===0)throw new Error(`Automatic breakout "${breakout.name}" has a point without a source trace identity`);let boundaryCrossingSourceTraces=matchingSourceTraces.filter(sourceTrace=>sourceTrace.connected_source_port_ids.some(sourcePortId=>{if(sourcePortId===matchedPort.source_port_id)return!1;let pcbPort2=breakout.root.db.pcb_port.getWhere({source_port_id:sourcePortId});return!pcbPort2||pcbPort2.pcb_group_id===breakout.pcb_group_id?!1:!(pcbPort2.x>=bounds.minX&&pcbPort2.x<=bounds.maxX&&pcbPort2.y>=bounds.minY&&pcbPort2.y<=bounds.maxY)}));sourceTraceId=(boundaryCrossingSourceTraces.length>0?boundaryCrossingSourceTraces:matchingSourceTraces).slice().sort((first,second)=>first.source_trace_id.localeCompare(second.source_trace_id))[0].source_trace_id,breakoutPoint.matchedSourceTraceId=sourceTraceId}if(endpointBySourceTraceId.has(sourceTraceId))throw new Error(`Connection "${sourceTraceId}" has duplicate endpoint for region "${breakout.pcb_group_id}"`);let pcbPort=breakout.root.db.pcb_port.get(matchedPort.pcb_port_id);if(!pcbPort)throw new Error(`Connection "${sourceTraceId}" references unknown PCB endpoint "${matchedPort.pcb_port_id}"`);if(pcbPort.pcb_group_id!==breakout.pcb_group_id)throw new Error(`Connection "${sourceTraceId}" endpoint references unknown region "${pcbPort.pcb_group_id??"unassigned"}" instead of "${breakout.pcb_group_id}"`);if(pcbPort.x===void 0||pcbPort.y===void 0)throw new Error(`Connection "${sourceTraceId}" is missing endpoint coordinates for region "${breakout.pcb_group_id}"`);endpointBySourceTraceId.set(sourceTraceId,{regionId:breakout.pcb_group_id,position:{x:pcbPort.x,y:pcbPort.y}}),sourcePortIdBySourceTraceId.set(sourceTraceId,matchedPort.source_port_id)}return{breakout,pcbGroupId:breakout.pcb_group_id,bounds,center:center2,endpointBySourceTraceId,sourcePortIdBySourceTraceId}},sortRegionsByPlacement=regions=>{let xCoordinates=regions.map(region=>region.center.x),yCoordinates=regions.map(region=>region.center.y),xSpan=Math.max(...xCoordinates)-Math.min(...xCoordinates),ySpan=Math.max(...yCoordinates)-Math.min(...yCoordinates),horizontalPlacement=xSpan>=ySpan;return regions.sort((firstRegion,secondRegion)=>{if(horizontalPlacement){let xDifference=firstRegion.center.x-secondRegion.center.x;if(xDifference!==0)return xDifference;let yDifference=firstRegion.center.y-secondRegion.center.y;if(yDifference!==0)return yDifference}else{let yDifference=firstRegion.center.y-secondRegion.center.y;if(yDifference!==0)return yDifference;let xDifference=firstRegion.center.x-secondRegion.center.x;if(xDifference!==0)return xDifference}return firstRegion.breakout.name.localeCompare(secondRegion.breakout.name)}),{regions,horizontalPlacement}},getFacingEdge=({region,regionIndex,regions,horizontalPlacement,singleRegionPreferredEdge})=>{if(regions.length===1&&singleRegionPreferredEdge)return singleRegionPreferredEdge;let otherRegions=regions.filter(candidate=>candidate!==region),otherCenter=otherRegions.reduce((sum,candidate)=>({x:sum.x+candidate.center.x/otherRegions.length,y:sum.y+candidate.center.y/otherRegions.length}),{x:0,y:0});return horizontalPlacement?otherCenter.x>region.center.x?"right":otherCenter.x<region.center.x?"left":regionIndex<regions.length/2?"right":"left":otherCenter.y>region.center.y?"top":otherCenter.y<region.center.y?"bottom":regionIndex<regions.length/2?"top":"bottom"},getSingleRegionPreferredEdge=({region,sourceTraces})=>{let root=region.breakout.root;if(!root)return;let internalSourcePortIds=new Set(region.sourcePortIdBySourceTraceId.values()),externalPcbPorts=new Map;for(let sourceTrace of sourceTraces)if(sourceTrace.connected_source_port_ids.some(sourcePortId=>internalSourcePortIds.has(sourcePortId)))for(let sourcePortId of sourceTrace.connected_source_port_ids){if(internalSourcePortIds.has(sourcePortId))continue;let pcbPort=root.db.pcb_port.getWhere({source_port_id:sourcePortId});!pcbPort?.pcb_port_id||pcbPort.x===void 0||pcbPort.y===void 0||pcbPort.x>=region.bounds.minX&&pcbPort.x<=region.bounds.maxX&&pcbPort.y>=region.bounds.minY&&pcbPort.y<=region.bounds.maxY||externalPcbPorts.set(pcbPort.pcb_port_id,{x:pcbPort.x,y:pcbPort.y})}if(externalPcbPorts.size===0)return;let distanceToEdge=(target,edge)=>{let edgePoint=edge==="left"||edge==="right"?{x:edge==="left"?region.bounds.minX:region.bounds.maxX,y:Math.max(region.bounds.minY,Math.min(region.bounds.maxY,target.y))}:{x:Math.max(region.bounds.minX,Math.min(region.bounds.maxX,target.x)),y:edge==="bottom"?region.bounds.minY:region.bounds.maxY};return Math.hypot(target.x-edgePoint.x,target.y-edgePoint.y)},edges=["right","left","top","bottom"];return edges.reduce((bestEdge,edge)=>{let bestCost=[...externalPcbPorts.values()].reduce((sum,target)=>sum+distanceToEdge(target,bestEdge),0);return[...externalPcbPorts.values()].reduce((sum,target)=>sum+distanceToEdge(target,edge),0)<bestCost?edge:bestEdge},edges[0])},getSourceTraceForConnectionOrThrow=({connectionOwner,connectionOwnerLabel,connectionSelector,sourceTraces})=>{let matchingSourceTraces=sourceTraces.filter(sourceTrace=>sourceTrace.name===connectionSelector);if(matchingSourceTraces.length===0){let selectedPort=connectionOwner.getSubcircuit().selectOne(connectionSelector,{type:"port"});selectedPort?.source_port_id&&(matchingSourceTraces=sourceTraces.filter(sourceTrace=>sourceTrace.connected_source_port_ids.includes(selectedPort.source_port_id)))}if(matchingSourceTraces.length===0)throw new Error(`Could not resolve "${connectionSelector}" in ${connectionOwnerLabel}`);if(matchingSourceTraces.length>1)throw new Error(`Connection "${connectionSelector}" resolves to multiple source traces in ${connectionOwnerLabel}`);return matchingSourceTraces[0]},getImplicitBreakoutSolverBuses=({routingScope,sourceTraces,coordinatedSourceTraceIds,availableLayers})=>{let solverBuses=[],subcircuitId=routingScope.getSubcircuit().subcircuit_id;for(let bus of routingScope.selectAll("bus")){if(bus.getSubcircuit().subcircuit_id!==subcircuitId)continue;let connectionIds=[];for(let connectionSelector of bus._parsedProps.connections){let sourceTrace=getSourceTraceForConnectionOrThrow({connectionOwner:bus,connectionOwnerLabel:`bus "${bus.name}"`,connectionSelector,sourceTraces});coordinatedSourceTraceIds.has(sourceTrace.source_trace_id)&&connectionIds.push(sourceTrace.source_trace_id)}if(connectionIds.length===0)continue;let solverBus={busId:bus.name,connectionIds};if(bus._parsedProps.preferredLayer!==void 0)solverBus={...solverBus,targetLayers:[bus._parsedProps.preferredLayer]};else if(bus._parsedProps.preferredLayers!==void 0)solverBus={...solverBus,targetLayers:bus._parsedProps.preferredLayers};else{let targetLayers=bus._parsedProps.pcbAllowedLayers??availableLayers;solverBus={...solverBus,targetLayers:[...new Set(targetLayers)]}}solverBuses.push(solverBus)}return solverBuses},getDifferentialPairSourceTraces=({routingScope,sourceTraces})=>{let subcircuitId=routingScope.getSubcircuit().subcircuit_id,pairs32=[];for(let differentialPair of routingScope.selectAll("differentialpair")){if(differentialPair.getSubcircuit().subcircuit_id!==subcircuitId)continue;let positiveSourceTrace=getSourceTraceForConnectionOrThrow({connectionOwner:differentialPair,connectionOwnerLabel:`differential pair "${differentialPair.name}"`,connectionSelector:differentialPair._parsedProps.positiveConnection,sourceTraces}),negativeSourceTrace=getSourceTraceForConnectionOrThrow({connectionOwner:differentialPair,connectionOwnerLabel:`differential pair "${differentialPair.name}"`,connectionSelector:differentialPair._parsedProps.negativeConnection,sourceTraces});pairs32.push({differentialPair,positiveSourceTraceId:positiveSourceTrace.source_trace_id,negativeSourceTraceId:negativeSourceTrace.source_trace_id})}return pairs32},getBoundaryPointSpacing=breakout=>{let board=breakout.root?.db.pcb_board.list()[0],traceWidth=board?.min_trace_width??.15,traceToPadClearance=board?.min_trace_to_pad_edge_clearance??.2,viaPadDiameter=board?.min_via_pad_diameter??.3;return getFanoutBoundaryPointSpacing({traceWidth,traceToPadClearance,viaPadDiameter})},getCoordinatedFanoutLayers=({routingScope,automaticBreakouts})=>{let coordinatedLayers=getBoardAvailableLayers(routingScope._getSubcircuitLayerCount());for(let automaticBreakout of automaticBreakouts){let fanoutRoutingLayers=automaticBreakout._parsedProps.fanoutRoutingLayers?.map(String);if(!fanoutRoutingLayers)continue;let fanoutLayerSet=new Set(fanoutRoutingLayers);coordinatedLayers=coordinatedLayers.filter(layer=>fanoutLayerSet.has(layer))}if(coordinatedLayers.length===0)throw new Error(`Automatic breakouts in routing scope "${routingScope.name}" have no shared fanout routing layer`);return coordinatedLayers},createImplicitBreakoutPointSolverContext=breakout=>{if(!breakout.root)throw new Error(`Automatic breakout "${breakout.name}" has no circuit root`);let routingScope=getRoutingScopeOrThrow(breakout),automaticBreakouts=getAutomaticBreakouts(routingScope,breakout),regionIds=new Set,collectedRegions=automaticBreakouts.map(automaticBreakout=>{let region=collectBreakoutRegionGeometry(automaticBreakout);if(regionIds.has(region.pcbGroupId))throw new Error(`Duplicate automatic breakout region "${region.pcbGroupId}"`);return regionIds.add(region.pcbGroupId),region}),{regions,horizontalPlacement}=sortRegionsByPlacement(collectedRegions),sourceTraceIds=new Set;for(let region of regions)for(let sourceTraceId of region.endpointBySourceTraceId.keys())sourceTraceIds.add(sourceTraceId);let sourceTraces=breakout.root.db.source_trace.list().filter(sourceTrace=>sourceTrace.subcircuit_id===routingScope.getSubcircuit().subcircuit_id),sourceTraceById=new Map;for(let sourceTrace of sourceTraces){if(sourceTraceById.has(sourceTrace.source_trace_id))throw new Error(`Duplicate connection identity "${sourceTrace.source_trace_id}"`);sourceTraceById.set(sourceTrace.source_trace_id,sourceTrace)}let sortedSourceTraceIds=[...sourceTraceIds].sort((firstSourceTraceId,secondSourceTraceId)=>{let firstName=sourceTraceById.get(firstSourceTraceId)?.name??firstSourceTraceId,secondName=sourceTraceById.get(secondSourceTraceId)?.name??secondSourceTraceId,nameDifference=firstName.localeCompare(secondName);return nameDifference!==0?nameDifference:firstSourceTraceId.localeCompare(secondSourceTraceId)});for(let sourceTraceId of sortedSourceTraceIds){if(!sourceTraceById.has(sourceTraceId))throw new Error(`Unknown connection identity "${sourceTraceId}"`);for(let region of regions)if(!region.endpointBySourceTraceId.has(sourceTraceId))throw new Error(`Connection "${sourceTraceId}" is missing endpoint for region "${region.pcbGroupId}"`)}let buses=getImplicitBreakoutSolverBuses({routingScope,sourceTraces,coordinatedSourceTraceIds:sourceTraceIds,availableLayers:getCoordinatedFanoutLayers({routingScope,automaticBreakouts})}),endpointsBySourceTraceId=new Map;for(let sourceTraceId of sortedSourceTraceIds)endpointsBySourceTraceId.set(sourceTraceId,regions.map(region=>region.endpointBySourceTraceId.get(sourceTraceId)));let differentialPairBySourceTraceId=new Map;for(let pair of getDifferentialPairSourceTraces({routingScope,sourceTraces})){let positiveIsCoordinated=sourceTraceIds.has(pair.positiveSourceTraceId),negativeIsCoordinated=sourceTraceIds.has(pair.negativeSourceTraceId);if(positiveIsCoordinated!==negativeIsCoordinated)throw new Error(`Differential pair "${pair.differentialPair.name}" is missing one coordinated member`);if(positiveIsCoordinated){if(differentialPairBySourceTraceId.has(pair.positiveSourceTraceId)||differentialPairBySourceTraceId.has(pair.negativeSourceTraceId))throw new Error("A connection belongs to multiple differential pairs");differentialPairBySourceTraceId.set(pair.positiveSourceTraceId,pair),differentialPairBySourceTraceId.set(pair.negativeSourceTraceId,pair)}}let connections=[],addedDifferentialPairs=new Set;for(let sourceTraceId of sortedSourceTraceIds){let differentialPair=differentialPairBySourceTraceId.get(sourceTraceId);if(!differentialPair){connections.push({connectionId:sourceTraceId,endpoints:endpointsBySourceTraceId.get(sourceTraceId)});continue}addedDifferentialPairs.has(differentialPair.differentialPair)||(addedDifferentialPairs.add(differentialPair.differentialPair),connections.push({type:"differential",connections:[{connectionId:differentialPair.positiveSourceTraceId,endpoints:endpointsBySourceTraceId.get(differentialPair.positiveSourceTraceId)},{connectionId:differentialPair.negativeSourceTraceId,endpoints:endpointsBySourceTraceId.get(differentialPair.negativeSourceTraceId)}]}))}let sourcePortIdByConnectionIdByRegionId=new Map,singleRegionPreferredEdge=regions.length===1?getSingleRegionPreferredEdge({region:regions[0],sourceTraces}):void 0;return{input:{regions:regions.map((region,regionIndex)=>(sourcePortIdByConnectionIdByRegionId.set(region.pcbGroupId,region.sourcePortIdBySourceTraceId),{regionId:region.pcbGroupId,bounds:region.bounds,edge:getFacingEdge({region,regionIndex,regions,horizontalPlacement,singleRegionPreferredEdge})})),connections,buses,boundaryPointSpacing:getBoundaryPointSpacing(breakout)},sourcePortIdByConnectionIdByRegionId}},cachedSolutionsByRoutingScope=new WeakMap,solveScope=(breakout,solverFn)=>{let context=createImplicitBreakoutPointSolverContext(breakout),output=solverFn(context.input);if(output instanceof Promise)throw new Error("Implicit breakout point solvers must return synchronously during PCB layout");let expectedConnectionCount=0;for(let connection of context.input.connections){if("type"in connection){expectedConnectionCount+=connection.connections.length;continue}expectedConnectionCount+=1}let breakoutPointsByRegionId=new Map,outputPointKeys=new Set;for(let region of context.input.regions)breakoutPointsByRegionId.set(region.regionId,[]);for(let breakoutPoint of output.breakoutPoints){let regionBreakoutPoints=breakoutPointsByRegionId.get(breakoutPoint.regionId);if(!regionBreakoutPoints)throw new Error(`Implicit breakout point solver returned unknown region "${breakoutPoint.regionId}"`);let outputPointKey=`${breakoutPoint.regionId}:${breakoutPoint.connectionId}`;if(outputPointKeys.has(outputPointKey))throw new Error(`Implicit breakout point solver returned duplicate endpoint for connection "${breakoutPoint.connectionId}" in region "${breakoutPoint.regionId}"`);outputPointKeys.add(outputPointKey);let sourcePortId=context.sourcePortIdByConnectionIdByRegionId.get(breakoutPoint.regionId)?.get(breakoutPoint.connectionId);if(!sourcePortId)throw new Error(`Implicit breakout point solver returned unknown connection "${breakoutPoint.connectionId}" for region "${breakoutPoint.regionId}"`);regionBreakoutPoints.push({sourcePortId,sourceTraceId:breakoutPoint.connectionId,layer:breakoutPoint.layer,x:breakoutPoint.x,y:breakoutPoint.y})}for(let[regionId,regionBreakoutPoints]of breakoutPointsByRegionId)if(regionBreakoutPoints.length!==expectedConnectionCount)throw new Error(`Implicit breakout point solver output is missing endpoints for region "${regionId}"`);return{breakoutPointsByRegionId}},solveImplicitBreakoutPoints=(breakout,solverFn)=>{let routingScope=breakout.parent;if(!routingScope||!breakout.pcb_group_id)throw new Error(`Automatic breakout "${breakout.name}" has no coordinated PCB region`);let cachedSolutions=cachedSolutionsByRoutingScope.get(routingScope);(!cachedSolutions||cachedSolutions.solverFn!==solverFn)&&(cachedSolutions={solverFn,solutions:[]},cachedSolutionsByRoutingScope.set(routingScope,cachedSolutions));let solution=cachedSolutions.solutions.find(candidateSolution=>candidateSolution.breakoutPointsByRegionId.has(breakout.pcb_group_id));solution||(solution=solveScope(breakout,solverFn),cachedSolutions.solutions.push(solution));let breakoutPoints=solution.breakoutPointsByRegionId.get(breakout.pcb_group_id);if(!breakoutPoints)throw new Error(`Automatic breakout "${breakout.name}" references unknown implicit-breakout region "${breakout.pcb_group_id}"`);return breakoutPoints},Breakout=class extends Group5{get isDogboneFanout(){let autorouter=this._parsedProps.autorouter;return(typeof autorouter=="string"?autorouter:autorouter?.preset)==="dogbone"}get isRoutingDirective(){return!0}get config(){return{...super.config,zodProps:breakoutProps}}doInitialCreateAutoplacedBreakoutPoints(){for(let path of this._parsedProps.pcbTracePaths??[]){let exit=path.route.at(-1),point62=new SavedFanoutPoint({connection:path.connection,pcbX:exit.x,pcbY:exit.y});if(point62.exitLayer=exit.route_type==="wire"?exit.layer:exit.to_layer,this.add(point62),point62._matchConnection(),!point62.matchedPort||!this.selectAll("port").includes(point62.matchedPort))throw new Error(`Fanout trace path "${path.connection}" must select a port inside the fanout`);if(this.children.some(child=>!(child instanceof BreakoutPoint)||child===point62?!1:(child._matchConnection(),child.matchedPort===point62.matchedPort)))throw new Error(`Duplicate fanout exit for "${path.connection}"`)}let portsInBreakout=this.selectAll("port"),breakoutPortSet=new Set(portsInBreakout),manualBreakoutPoints=this.children.filter(c22=>c22 instanceof BreakoutPoint),manuallyMappedPorts=new Set(manualBreakoutPoints.map(bp22=>(bp22._matchConnection(),bp22.matchedPort)).filter(Boolean)),allTraces=this.getSubcircuit().selectAll("trace"),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(p22=>!breakoutPortSet.has(p22));if(!isInside||!hasOutsidePort&&!this.isDogboneFanout||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;if(this.isDogboneFanout&&this._parsedProps.pcbTracePaths===void 0){for(let point62 of this.children){if(!(point62 instanceof AutoplacedBreakoutPoint))continue;let port=this.root.db.pcb_port.get(point62.matchedPort.pcb_port_id);point62._applySolvedBreakoutPoint({sourceTraceId:point62.matchedSourceTraceId,layer:port.layers[0],position:port})}return}let ownAutorouter=this.props.autorouter,inheritedAutorouter=ownAutorouter===void 0?this.parent?.getInheritedProperty("autorouter"):void 0,implicitBreakoutPointSolverFn=typeof ownAutorouter=="object"?ownAutorouter.implicitBreakoutPointSolverFn:typeof inheritedAutorouter=="object"?inheritedAutorouter.implicitBreakoutPointSolverFn:void 0,autoBreakoutPoints=this.children.filter(child=>child instanceof AutoplacedBreakoutPoint);if(autoBreakoutPoints.length===0||!this.root||!this.pcb_group_id)return;let pcbGroup=this.root.db.pcb_group.get(this.pcb_group_id);if(!pcbGroup?.width||!pcbGroup.height)return;let 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},solvedBreakoutPoints;try{solvedBreakoutPoints=solveImplicitBreakoutPoints(this,implicitBreakoutPointSolverFn??defaultImplicitBreakoutPointSolverFn)}catch(error2){if(implicitBreakoutPointSolverFn||!reportWindingBreakoutInfeasibleError(this,error2))throw error2;return}let BOUNDARY_INSET_MM=1e-4,insetWithinBounds=(x22,y22)=>({x:Math.max(bounds.minX+BOUNDARY_INSET_MM,Math.min(bounds.maxX-BOUNDARY_INSET_MM,x22)),y:Math.max(bounds.minY+BOUNDARY_INSET_MM,Math.min(bounds.maxY-BOUNDARY_INSET_MM,y22))});for(let solvedPoint of solvedBreakoutPoints){let matchingBreakoutPoint=autoBreakoutPoints.find(child=>child.matchedPort?.source_port_id===solvedPoint.sourcePortId);if(matchingBreakoutPoint){let insetPoint=insetWithinBounds(solvedPoint.x,solvedPoint.y);matchingBreakoutPoint._applySolvedBreakoutPoint({sourceTraceId:solvedPoint.sourceTraceId,layer:solvedPoint.layer,position:insetPoint})}}}doInitialPcbPrimitiveRender(){super.doInitialPcbPrimitiveRender()}doInitialPcbPlacementDesignRuleChecks(){Breakout_doInitialPcbPlacementDesignRuleChecks(this)}},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:db22}=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=db22.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:db22}=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=db22.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(point62=>applyToPoint2(transform7,point62))},inner_rings:[]}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db22}=this.root,moveVertex=vertex=>({...vertex,x:vertex.x+deltaX,y:vertex.y+deltaY});for(let graphicId of this.pcb_silkscreen_graphic_ids){let graphic=db22.pcb_silkscreen_graphic.get(graphicId);graphic&&db22.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(ring4=>({vertices:ring4.vertices.map(moveVertex)}))}})}for(let pathId of this.pcb_silkscreen_path_ids){let path=db22.pcb_silkscreen_path.get(pathId);path&&db22.pcb_silkscreen_path.update(pathId,{route:path.route.map(point62=>({...point62,x:point62.x+deltaX,y:point62.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:db22}=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=db22.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,d22=distance.parse(props.padDiameter);return{width:d22,height:d22}}_setPositionFromLayout(newCenter){if(!this.pcb_smtpad_id)return;let{db:db22}=this.root;db22.pcb_smtpad.update(this.pcb_smtpad_id,{x:newCenter.x,y:newCenter.y})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db22}=this.root;if(!this.pcb_smtpad_id)return;let pad2=db22.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"&&db22.pcb_smtpad.update(this.pcb_smtpad_id,{points:pad2.points.map(p22=>({x:p22.x+deltaX,y:p22.y+deltaY}))}))}},EPSILON30=1e-9,isWireRoutePoint=routePoint2=>routePoint2.route_type==="wire",isPointOnSegment42=(p22,a22,b22)=>{let cross5=(p22.y-a22.y)*(b22.x-a22.x)-(p22.x-a22.x)*(b22.y-a22.y);if(Math.abs(cross5)>EPSILON30)return!1;let dot4=(p22.x-a22.x)*(b22.x-a22.x)+(p22.y-a22.y)*(b22.y-a22.y);if(dot4<-EPSILON30)return!1;let squaredLength=(b22.x-a22.x)**2+(b22.y-a22.y)**2;return!(dot4-squaredLength>EPSILON30)},isPointInRing2=(point62,ring4)=>{if(ring4.length<3)return!1;let inside22=!1,previous=ring4[ring4.length-1];for(let current3 of ring4){if(isPointOnSegment42(point62,previous,current3))return!0;current3.y>point62.y!=previous.y>point62.y&&point62.x<(previous.x-current3.x)*(point62.y-current3.y)/(previous.y-current3.y)+current3.x&&(inside22=!inside22),previous=current3}return inside22},isPointInRectPour=(p22,pour)=>{let{center:center2,width,height}=pour,rotationRad=(pour.rotation??0)*Math.PI/180,cosR=Math.cos(-rotationRad),sinR=Math.sin(-rotationRad),dx22=p22.x-center2.x,dy22=p22.y-center2.y,localX=dx22*cosR-dy22*sinR,localY=dx22*sinR+dy22*cosR;return Math.abs(localX)<=width/2+EPSILON30&&Math.abs(localY)<=height/2+EPSILON30},isPointInBrepPour=(p22,pour)=>{let outerRing=pour.brep_shape.outer_ring.vertices.map(v22=>({x:v22.x,y:v22.y}));if(!isPointInRing2(p22,outerRing))return!1;for(let innerRing of pour.brep_shape.inner_rings){let points=innerRing.vertices.map(v22=>({x:v22.x,y:v22.y}));if(isPointInRing2(p22,points))return!1}return!0},isPointInCopperPour=(point62,pour)=>pour.shape==="rect"?isPointInRectPour(point62,pour):pour.shape==="brep"?isPointInBrepPour(point62,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 dx22=end.x-start.x,dy22=end.y-start.y;return Math.hypot(dx22,dy22)<=EPSILON30?!1:[0,.25,.5,.75,1].every(t48=>isPointInCopperPour({x:start.x+dx22*t48,y:start.y+dy22*t48},pour))},markTraceSegmentsInsideCopperPour=({db:db22,copperPour})=>{if(!copperPour.source_net_id)return;let sourceTraceById=new Map(db22.source_trace.list().map(sourceTrace=>[sourceTrace.source_trace_id,sourceTrace]));for(let trace of db22.pcb_trace.list()){if(!isTraceConnectedToSourceNet(trace,copperPour.source_net_id,sourceTraceById))continue;let routeChanged=!1,nextRoute=trace.route.map(routePoint2=>({...routePoint2}));for(let i22=0;i22<nextRoute.length-1;i22++){let fromRoutePoint=nextRoute[i22],toRoutePoint=nextRoute[i22+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&&db22.pcb_trace.update(trace.pcb_trace_id,{route:nextRoute})}},pendingCopperPourRenders=new WeakMap,DEFAULT_THERMAL_RELIEF_SPOKE_WIDTH_MM=.3,renderAllCopperPoursForSubcircuit=async subcircuit=>{if(!subcircuit.root)return;let{db:db22}=subcircuit.root,copperPours=subcircuit.selectAll("copperpour").filter(copperPour=>copperPour.getSubcircuit()===subcircuit),resolvedCopperPours=[];for(let copperPour of copperPours){let{_parsedProps:props}=copperPour,sourceNetId=subcircuit.selectOne(props.connectsTo)?.source_net_id;if(!sourceNetId){copperPour.renderError(`Net "${props.connectsTo}" not found for copper pour`);continue}resolvedCopperPours.push({copperPour,sourceNetId})}if(resolvedCopperPours.length===0)return;let circuitJson=db22.toArray(),boardComponent=subcircuit._getBoard(),pcbBoard=boardComponent?.pcb_board_id?db22.pcb_board.get(boardComponent.pcb_board_id):void 0,resolvedPcbBoardOutline=pcbBoard?.outline?.length?pcbBoard.outline:void 0;if(!resolvedPcbBoardOutline&&pcbBoard?.width!==void 0&&pcbBoard.height!==void 0){let{center:center2,width,height}=pcbBoard;resolvedPcbBoardOutline=[{x:center2.x-width/2,y:center2.y-height/2},{x:center2.x+width/2,y:center2.y-height/2},{x:center2.x+width/2,y:center2.y+height/2},{x:center2.x-width/2,y:center2.y+height/2}]}let inputProblem=convertCircuitJsonToInputProblem(circuitJson,resolvedCopperPours.map(({copperPour,sourceNetId})=>{let{_parsedProps:props}=copperPour,clearance=props.clearance??.2;return{layer:props.layer,subcircuit_id:subcircuit.subcircuit_id??void 0,source_net_id:sourceNetId,pad_margin:props.padMargin??clearance,trace_margin:props.traceMargin??clearance,pour_margin:clearance,board_edge_margin:props.boardEdgeMargin??clearance,board_edge_outline:copperPour._isImplicitCopperPour?resolvedPcbBoardOutline:void 0,cutout_margin:props.cutoutMargin??clearance,...props.useThermalReliefs?{use_thermal_reliefs:!0,thermal_relief_spoke_width:DEFAULT_THERMAL_RELIEF_SPOKE_WIDTH_MM}:{},outline:props.outline??resolvedPcbBoardOutline}}));await initializeManifoldGeometry();let solver=new CopperPourPipelineSolver(inputProblem);subcircuit.root.emit("solver:started",{type:"solver:started",solverName:"CopperPourPipelineSolver",solverParams:inputProblem,solverConstructorArgs:[inputProblem],componentName:subcircuit.getString()});let{brep_shapes_by_region}=solver.getOutput();for(let[regionIndex,{copperPour,sourceNetId}]of resolvedCopperPours.entries()){let{_parsedProps:props}=copperPour,coveredWithSolderMask=props.coveredWithSolderMask??!1;for(let brepShape of brep_shapes_by_region[regionIndex]??[]){let insertedPour=db22.pcb_copper_pour.insert({shape:"brep",layer:props.layer,brep_shape:brepShape,source_net_id:sourceNetId,subcircuit_id:subcircuit.subcircuit_id??void 0,covered_with_solder_mask:coveredWithSolderMask});markTraceSegmentsInsideCopperPour({db:db22,copperPour:insertedPour})}}};function CopperPour_doInitialPcbCopperPourRender(copperPour){copperPour.root?.pcbDisabled||copperPour._queueAsyncEffect("PcbCopperPourRender",async()=>{let subcircuit=copperPour.getSubcircuit(),pendingRender=pendingCopperPourRenders.get(subcircuit);if(pendingRender){await pendingRender;return}let renderPromise=renderAllCopperPoursForSubcircuit(subcircuit);pendingCopperPourRenders.set(subcircuit,renderPromise);try{await renderPromise}finally{pendingCopperPourRenders.delete(subcircuit)}})}var renderViaStitchingForCopperPours=copperPour=>{let subcircuit=copperPour.getSubcircuit();if(!subcircuit.root)return;let copperPours=subcircuit.selectAll("copperpour").filter(candidateCopperPour=>candidateCopperPour.getSubcircuit()===subcircuit);if(copperPours[0]!==copperPour)return;let sourceNetIds=copperPours.flatMap(candidateCopperPour=>{let net=subcircuit.selectOne(candidateCopperPour._parsedProps.connectsTo);return net?.source_net_id?[net.source_net_id]:[]});if(sourceNetIds.length===0)return;let{db:db22}=subcircuit.root,pcbStyle2=copperPour.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2),boardComponent=copperPour._getBoard(),pcbBoard=boardComponent?.pcb_board_id?db22.pcb_board.get(boardComponent.pcb_board_id):void 0,solverInput={circuitJson:db22.toArray(),options:{sourceNetIds:[...new Set(sourceNetIds)],viaHoleDiameter:pcbBoard?.min_via_hole_diameter??holeDiameter,viaOuterDiameter:pcbBoard?.min_via_pad_diameter??padDiameter,viaStitchPitch:boardComponent?._parsedProps.viaStitchPitch}},solver=new ViaStitchSolver(solverInput);if(subcircuit.root.emit("solver:started",{type:"solver:started",solverName:"ViaStitchSolver",solverParams:solverInput,solverConstructorArgs:[solverInput],componentName:subcircuit.getString()}),solver.solve(),solver.failed)throw new Error(solver.error??"Via stitching solver failed");for(let pcbVia of solver.getOutput().pcbVias){let{pcb_via_id:_solverViaId,...pcbViaInput}=pcb_via.parse(pcbVia),insertedVia=db22.pcb_via.insert({...pcbViaInput,tented_on_top:void 0,tented_on_bottom:void 0});boardComponent?._generatedStitchingViaIds?.add(insertedVia.pcb_via_id)}};function CopperPour_doInitialPcbViaStitchRender(copperPour){copperPour.root?.pcbDisabled||!copperPour.root?._featurePcbViaStitching||copperPour._getBoard()?._parsedProps.enableViaStitching&&copperPour._queueAsyncEffect("PcbViaStitchRender",async()=>{renderViaStitchingForCopperPours(copperPour)})}var CopperPour=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPcbPrimitive",!0);__publicField(this,"_isImplicitCopperPour",!1)}get config(){return{componentName:"CopperPour",zodProps:copperPourProps}}getPcbSize(){return{width:0,height:0}}doInitialCreateNetsFromProps(){let{_parsedProps:props}=this;createNetsFromProps(this,[props.connectsTo])}doInitialPcbCopperPourRender(){CopperPour_doInitialPcbCopperPourRender(this)}doInitialPcbViaStitchRender(){CopperPour_doInitialPcbViaStitchRender(this)}},resolveAssemblyModel=props=>{if(props.model!==void 0)return/^https?:\/\//i.test(props.model)?resolveAssemblyModelUrl(props.model):{glbUrl:`https://modelcdn.tscircuit.com/jscad_models/${encodeURIComponent(props.model)}.glb`};if(props.modelUrl!==void 0)return resolveAssemblyModelUrl(props.modelUrl)},AssemblyDevice=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isAssemblyDeviceContainer",!0)}get config(){return{componentName:"AssemblyDevice",zodProps:assemblyDeviceProps}}doInitialAssignNameToUnnamedComponents(){}computeSchematicGlobalTransform(){return identity()}_computePcbGlobalTransformBeforeLayout(){return identity()}doInitialSourceRender(){this._parsedProps.modelUrl===void 0&&this._parsedProps.model===void 0||!this.root||(this.source_component_id=this.root.db.source_component.insert({ftype:"simple_chip",name:this.name}).source_component_id)}doInitialCadModelRender(){let model=resolveAssemblyModel(this._parsedProps);!this.root||this.root.pcbDisabled||!this.source_component_id||!model||(this.cad_component_id=renderAssemblyCadModel(this,model,{position:{x:0,y:0,z:0},pcbRotation:0,layer:"top"}))}},formatMillimetersForModelprinter=millimeters=>Number(millimeters.toFixed(6)).toString(),getDefaultFlexScreenModel=component=>{let{width,height}=component._parsedProps;if(width===void 0||height===void 0)throw new Error(`assembly.screen "${component.name}" requires both width and height when cadModel is omitted`);return`flexscreen_w${formatMillimetersForModelprinter(width)}mm_h${formatMillimetersForModelprinter(height)}mm`},AssemblyScreen_doInitialCadModelRender=component=>{if(!component.root||component.root.pcbDisabled||!component.source_component_id)return;let placement=resolveAssemblyPlacement(component);component.cad_component_id=renderAssemblyCadModel(component,resolveAssemblyModel(component._parsedProps)??component._parsedProps.cadModel??getDefaultFlexScreenModel(component),placement)},AssemblyScreen=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isAssemblyDeviceContainer",!0)}get config(){return{componentName:"AssemblyScreen",zodProps:assemblyScreenProps}}doInitialAssignNameToUnnamedComponents(){if(!this._parsedProps.name)throw new Error("assembly.screen requires a non-empty name")}doInitialSourceRender(){let sourceComponent=this.root.db.source_component.insert({ftype:"simple_chip",name:this.name});this.source_component_id=sourceComponent.source_component_id}doInitialCadModelRender(){AssemblyScreen_doInitialCadModelRender(this)}},AssemblySubassembly=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isAssemblyDeviceContainer",!0)}get config(){return{componentName:"AssemblySubassembly",zodProps:assemblySubassemblyProps}}doInitialAssignNameToUnnamedComponents(){if(!this._parsedProps.name)throw new Error("assembly.subassembly requires a non-empty name")}doInitialReactSubtreesRender(){(0,import_react8.isValidElement)(this.props.cadModel)&&this.add(createInstanceFromReactElement(this.props.cadModel))}doInitialSourceRender(){let sourceComponent=this.root.db.source_component.insert({ftype:"simple_chip",name:this.name});this.source_component_id=sourceComponent.source_component_id}doInitialCadModelRender(){if(!this.root||this.root.pcbDisabled||!this.source_component_id)return;let placement=resolveAssemblyPlacement(this),model=resolveAssemblyModel(this._parsedProps)??this._parsedProps.cadModel;model&&!(typeof model=="object"&&"type"in model)&&(this.cad_component_id=renderAssemblyCadModel(this,model,placement))}},getModelReachAboveOrigin=({cad,authoredModel})=>{let bounds=cad.model_bounds??authoredModel?.modelBounds,origin=cad.model_origin_position??authoredModel?.modelOriginPosition;if(!bounds?.min||!bounds?.max||!origin)return;let normal=cad.model_board_normal_direction??authoredModel?.modelBoardNormalDirection??"z+",axis=normal[0];if(axis!=="x"&&axis!=="y"&&axis!=="z")return;let min=bounds.min[axis],max2=bounds.max[axis],at22=origin[axis];if(min===void 0||max2===void 0||at22===void 0)return;let reach=normal.endsWith("-")?at22-min:max2-at22;return Number.isFinite(reach)&&reach>=0?reach:void 0},getComponentBody=({owner,pcbComponent,cadComponent,boardSurfaceZ})=>{let cadModelProp2=owner?._parsedProps?.cadModel,authoredModel=cadModelProp2&&typeof cadModelProp2=="object"?cadModelProp2:void 0,size3=cadComponent?.size??authoredModel?.size,x22=size3?.x,y22=size3?.y,z19=size3?.z,reach=cadComponent?getModelReachAboveOrigin({cad:cadComponent,authoredModel}):void 0,originZ=cadComponent?.position?.z,aboveBoardHeight=reach!==void 0&&originZ!==void 0?reach+Math.abs(originZ-boardSurfaceZ):void 0;return{size:x22!==void 0&&y22!==void 0?{x:x22,y:y22,z:z19}:void 0,aboveBoardHeight,rotation:cadComponent?.rotation?.z??pcbComponent.rotation??0,footprint:{width:pcbComponent.width,height:pcbComponent.height}}},getNearestBoardWall=({point:point62,board})=>{let halfWidth=(board.width??0)/2,halfHeight=(board.height??0)/2,distances=[["x_neg",Math.abs(point62.x-(board.center.x-halfWidth))],["x_pos",Math.abs(point62.x-(board.center.x+halfWidth))],["y_neg",Math.abs(point62.y-(board.center.y-halfHeight))],["y_pos",Math.abs(point62.y-(board.center.y+halfHeight))]];return distances.sort((a22,b22)=>a22[1]-b22[1]),distances[0][0]},getSolverWall=boardWall=>boardWall,INSERTION_DIRECTION_TO_BOARD_WALL={from_top:"y_pos",from_bottom:"y_neg",from_left:"x_neg",from_right:"x_pos"},getFdmEnclosureSolverInput=(apertureComponent,{board,pcbBoard})=>{let owner=apertureComponent.parent;for(;owner&&owner!==board&&!owner.pcb_component_id;)owner=owner.parent;let pcbComponent=owner?.pcb_component_id?apertureComponent.root?.db.pcb_component.get(owner.pcb_component_id):null;if(!pcbComponent)throw new Error("<enclosure.cutoutaperture /> must be nested inside a component with a PCB footprint");let aperture=apertureComponent._parsedProps,apertureAxisDirection=owner?._getEnclosureApertureAxisDirection?.(pcbComponent.layer,pcbComponent.rotation??0),apertureDirection=apertureAxisDirection?apertureAxisDirection.z!==0?apertureAxisDirection.z>0?"from_above":"from_below":Math.abs(apertureAxisDirection.x)>=Math.abs(apertureAxisDirection.y)?apertureAxisDirection.x>=0?"from_right":"from_left":apertureAxisDirection.y>=0?"from_top":"from_bottom":pcbComponent.insertion_direction,verticalFace=apertureDirection==="from_above"?"z_pos":apertureDirection==="from_below"?"z_neg":void 0,boardSide=pcbComponent.layer==="bottom"?"bottom":"top",face,center2;if(verticalFace)face=verticalFace,center2={x:pcbComponent.center.x-pcbBoard.center.x,y:pcbComponent.center.y-pcbBoard.center.y};else{let point62=pcbComponent.cable_insertion_center??pcbComponent.center,boardWall=INSERTION_DIRECTION_TO_BOARD_WALL[apertureDirection]??getNearestBoardWall({point:point62,board:pcbBoard}),cableDelta=pcbComponent.cable_insertion_center?{x:pcbComponent.cable_insertion_center.x-pcbComponent.center.x,y:pcbComponent.cable_insertion_center.y-pcbComponent.center.y}:null,cableProjectionMatchesWall=cableDelta!=null&&(boardWall==="x_neg"||boardWall==="x_pos"?Math.abs(cableDelta.x)>=Math.abs(cableDelta.y):Math.abs(cableDelta.y)>=Math.abs(cableDelta.x)),tangentPoint=apertureAxisDirection?pcbComponent.center:cableProjectionMatchesWall?point62:pcbComponent.center;face=getSolverWall(boardWall),center2={x:tangentPoint.x-pcbBoard.center.x,y:tangentPoint.y-pcbBoard.center.y}}let cadComponent=apertureComponent.root?.db.cad_component.getWhere({pcb_component_id:pcbComponent.pcb_component_id})??null,boardSurfaceZ=(boardSide==="bottom"?-1:1)*((pcbBoard.thickness??board.boardThickness)/2),componentBody=getComponentBody({owner,pcbComponent,cadComponent,boardSurfaceZ}),commonInput={face,center:center2,boardSide,apertureAxisDirection,rotation:pcbComponent.rotation??void 0,depth:aperture.depth,componentBody,widthDimensionOffset:aperture.widthDimensionOffset,heightDimensionOffset:aperture.heightDimensionOffset,margin:aperture.margin};switch(aperture.shape){case"pill":case"rect":return{...commonInput,shape:aperture.shape,width:aperture.width,height:aperture.height};case"circle":return{...commonInput,shape:"circle",radius:aperture.radius}}},EnclosureCutoutAperture=class extends PrimitiveComponent2{get config(){return{componentName:"EnclosureCutoutAperture",zodProps:enclosureCutoutApertureProps}}getFdmEnclosureSolverInput(params){return getFdmEnclosureSolverInput(this,params)}},getReferencedEnclosureBoard=(component,boardRef)=>{let rootComponent=component.root?.firstChild,selectedComponent=rootComponent?selectOne(boardRef,rootComponent,{adapter:cssSelectPrimitiveComponentAdapter}):null,board=selectedComponent instanceof Board?selectedComponent:[rootComponent,...rootComponent?.getDescendants()??[]].find(descendant=>descendant instanceof Board&&descendant.isMatchingNameOrAlias(boardRef));if(!(board instanceof Board))throw new Error(`Could not find a <board /> matching enclosure boardRef "${boardRef}"`);return board},EnclosureFdmBox_doInitialCadModelRender=component=>{let root=component.root;if(!root||root.pcbDisabled||!component.source_component_id||!component.pcb_component_id)return;let{db:db22}=root,props=component._parsedProps,board=getReferencedEnclosureBoard(component,props.boardRef),pcbBoard=board.pcb_board_id?db22.pcb_board.get(board.pcb_board_id):null;if(!pcbBoard?.width||!pcbBoard.height)throw new Error(`Could not resolve dimensions for boardRef "${props.boardRef}"`);let boardThickness=pcbBoard.thickness??board.boardThickness,inputProblem={board:{width:pcbBoard.width,height:pcbBoard.height,thickness:boardThickness},width:props.width,height:props.height,depth:props.depth,wallThickness:props.wallThickness,floorThickness:props.floorThickness,lidThickness:props.lidThickness,boardClearance:props.boardClearance,standoffHeight:props.standoffHeight,topHeadroom:props.topHeadroom,lidLipDepth:props.lidLipDepth,apertures:props.disableCutouts?[]:board.getDescendants().filter(descendant=>descendant instanceof EnclosureCutoutAperture).map(aperture=>aperture.getFdmEnclosureSolverInput({board,pcbBoard}))},solver=new CreateFdmEnclosureSolver(inputProblem),solverConstructorArgs=solver.getConstructorParams();if(root.emit("solver:started",{type:"solver:started",solverName:"CreateFdmEnclosureSolver",solverParams:solverConstructorArgs[0],solverConstructorArgs,componentName:component.getString()}),solver.solve(),solver.failed)throw new Error(solver.error??"Failed to create FDM enclosure");let output=solver.getOutput();db22.pcb_component.update(component.pcb_component_id,{center:pcbBoard.center,width:output.dimensions.width,height:output.dimensions.height});let position4={x:pcbBoard.center.x,y:pcbBoard.center.y,z:-boardThickness/2-output.dimensions.floorThickness-output.dimensions.standoffHeight},cadComponents=output.parts.map(part=>db22.cad_component.insert({position:position4,rotation:{x:0,y:0,z:0},pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,model_jscad:part.jscadPlan,model_unit_to_mm_scale_factor:1,model_object_fit:"contain_within_bounds",model_origin_alignment:"bottom_center_of_component",anchor_alignment:"center",show_as_translucent_model:!1,show_hidden_edges:props.showHiddenEdges}));component.cad_component_id=cadComponents[0]?.cad_component_id??null},EnclosureFdmBox=class _EnclosureFdmBox extends PrimitiveComponent2{get config(){return{componentName:"EnclosureFdmBox",zodProps:enclosureFdmBoxProps}}doInitialAssignNameToUnnamedComponents(){if(this._parsedProps.name)return;let top=this;for(;top.parent instanceof PrimitiveComponent2;)top=top.parent;let index=[top,...top.getDescendants()].filter(component=>component instanceof _EnclosureFdmBox).indexOf(this);this.fallbackUnassignedName=`unnamed_enclosure_fdm_box_${index===-1?0:index+1}`}doInitialSourceRender(){let sourceComponent=this.root.db.source_component.insert({ftype:"simple_chip",name:this.name});this.source_component_id=sourceComponent.source_component_id}doInitialPcbComponentRender(){let root=this.root;if(!root||root.pcbDisabled||!this.source_component_id)return;let board=getReferencedEnclosureBoard(this,this._parsedProps.boardRef),center2=(board.pcb_board_id?root.db.pcb_board.get(board.pcb_board_id):null)?.center??board._getGlobalPcbPositionBeforeLayout(),pcbComponent=root.db.pcb_component.insert({center:center2,width:0,height:0,layer:"top",rotation:0,source_component_id:this.source_component_id,obstructs_within_bounds:!1,do_not_place:!0,is_allowed_to_be_off_board:!0});this.pcb_component_id=pcbComponent.pcb_component_id}doInitialCadModelRender(){EnclosureFdmBox_doInitialCadModelRender(this)}},Battery=class extends NormalComponent{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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({name:this.name,ftype:"simple_power_source",capacity:props.capacity,supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},PinHeader=class extends NormalComponent{_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 i22=1;i22<=pinCount;i22++){let rawLabel=Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels[i22-1]:this._parsedProps.pinLabels?.[`pin${i22}`];if(rawLabel){let primaryLabel=Array.isArray(rawLabel)?rawLabel[0]:rawLabel,otherLabels=Array.isArray(rawLabel)?rawLabel.slice(1):[];this.add(new Port({pinNumber:i22,name:primaryLabel,aliases:[`pin${i22}`,...otherLabels]}))}else this.add(new Port({pinNumber:i22,name:`pin${i22}`}))}}_getSchematicPortArrangement(){let pinCount=this._parsedProps.pinCount??1,facingDirection=this._parsedProps.schFacingDirection??this._parsedProps.facingDirection??"right",schPinArrangement=this._parsedProps.schPinArrangement,pins=Array.from({length:pinCount},(_22,i22)=>`pin${i22+1}`);return facingDirection==="left"?{leftSide:{direction:schPinArrangement?.leftSide?.direction??"top-to-bottom",pins:schPinArrangement?.leftSide?.pins??pins}}:facingDirection==="up"?{topSide:{direction:schPinArrangement?.topSide?.direction??"left-to-right",pins:schPinArrangement?.topSide?.pins??pins}}:facingDirection==="down"?{bottomSide:{direction:schPinArrangement?.bottomSide?.direction??"left-to-right",pins:schPinArrangement?.bottomSide?.pins??pins}}:{rightSide:{direction:schPinArrangement?.rightSide?.direction??"top-to-bottom",pins:schPinArrangement?.rightSide?.pins??pins}}}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_pin_header",name:this.name,supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,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 NormalComponent{get config(){return{componentName:"Resonator",schematicSymbolName:this.props.symbolName??getResonatorSymbolName(this.props.pinVariant),zodProps:resonatorProps,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:db22}=this.root,{_parsedProps:props}=this,pinVariant=props.pinVariant||"no_ground",source_component=db22.source_component.insert({ftype:"simple_resonator",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,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 NormalComponent{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:db22}=this.root,{_parsedProps:props}=this,pinVariant=props.pinVariant||"two_pin",source_component=db22.source_component.insert({ftype:"simple_potentiometer",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,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}},DEFAULT_CRYSTAL_MAX_TRACE_LENGTH_MM=10,DEFAULT_CRYSTAL_MAX_VIA_COUNT=0,Crystal=class extends NormalComponent{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","X1"],pin2:["top1","2","gnd1"],pin3:["right1","3","X2"],pin4:["bottom1","4","gnd2"]}:{pin1:["pos","left","X1"],pin2:["neg","right","X2"]};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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({name:this.name,ftype:"simple_crystal",manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,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}doInitialSourceDesignRuleChecks(){if(super.doInitialSourceDesignRuleChecks(),!this.source_component_id)return;let{db:db22}=this.root,maximumTraceLength=this._parsedProps.maxTraceLength??DEFAULT_CRYSTAL_MAX_TRACE_LENGTH_MM,crystalSignalSourcePortIds=new Set,crystalSignalConnectivityMapKeys=new Set;for(let signalPort of[this.portMap.X1,this.portMap.X2]){if(!signalPort.source_port_id)continue;let sourcePort=db22.source_port.get(signalPort.source_port_id);sourcePort&&(crystalSignalSourcePortIds.add(signalPort.source_port_id),sourcePort.subcircuit_connectivity_map_key&&crystalSignalConnectivityMapKeys.add(sourcePort.subcircuit_connectivity_map_key))}for(let sourceTrace of db22.source_trace.list()){let isDirectlyConnectedToCrystal=sourceTrace.connected_source_port_ids.some(sourcePortId=>crystalSignalSourcePortIds.has(sourcePortId)),isOnCrystalNet=sourceTrace.subcircuit_connectivity_map_key!==void 0&&crystalSignalConnectivityMapKeys.has(sourceTrace.subcircuit_connectivity_map_key);if(!isDirectlyConnectedToCrystal&&!isOnCrystalNet)continue;let needsMaximumTraceLength=typeof sourceTrace.max_length!="number"||sourceTrace.max_length>maximumTraceLength,needsMaximumViaCount=sourceTrace.max_via_count!==DEFAULT_CRYSTAL_MAX_VIA_COUNT;!needsMaximumTraceLength&&!needsMaximumViaCount||db22.source_trace.update(sourceTrace.source_trace_id,{...needsMaximumTraceLength?{max_length:maximumTraceLength}:{},...needsMaximumViaCount?{max_via_count:DEFAULT_CRYSTAL_MAX_VIA_COUNT}:{}})}}},OpAmp=class extends NormalComponent{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:db22}=this.root,{_parsedProps:props}=this,source_component=db22.source_component.insert({ftype:"simple_op_amp",name:this.name,supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db22}=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||db22.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})}},TESTPOINT_DEFAULTS={HOLE_DIAMETER:.5,SMT_CIRCLE_DIAMETER:1.2,SMT_RECT_SIZE:2},TestPoint=class extends NormalComponent{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:db22}=this.root,{_parsedProps:props}=this,{padShape,holeDiameter,footprintVariant,padDiameter,width,height}=this._getPropsWithDefaults(),source_component=db22.source_component.insert({ftype:FTYPE.simple_test_point,name:this.name,supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,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}},SchematicSymbol_doInitialSchematicComponentRender=schematicSymbol=>{if(schematicSymbol.root?.schematicDisabled||schematicSymbol.getCollapsedSchematicBoxAncestor())return;let{db:db22}=schematicSymbol.root,symbolName=schematicSymbol._getSchematicSymbolNameOrThrow(),symbol=zh[symbolName];if(!symbol)throw new Error(`No schematic symbol found for "${symbolName}"`);let center2=schematicSymbol._getGlobalSchematicPositionBeforeLayout(),schematicSheetId=schematicSymbol._resolveSchematicSheetId(),subcircuitId=schematicSymbol.getSubcircuit().subcircuit_id??void 0,schematicComponent=db22.schematic_component.insert({center:center2,size:{...symbol.size},is_box_with_pins:!0,symbol_name:symbolName,source_component_id:schematicSymbol.source_component_id??void 0,schematic_sheet_id:schematicSheetId});schematicSymbol.schematic_component_id=schematicComponent.schematic_component_id;for(let symbolPort of symbol.ports){let port=schematicSymbol.getPortForSymbolPort(symbolPort);if(!port?.source_port_id)throw new Error(`Missing source port for schematic symbol port "${symbolPort.labels.join("/")}" on ${schematicSymbol.getString()}`);let portCenter={x:center2.x+symbolPort.x-symbol.center.x,y:center2.y+symbolPort.y-symbol.center.y},schematicPort=db22.schematic_port.insert({schematic_component_id:schematicComponent.schematic_component_id,center:portCenter,source_port_id:port.source_port_id,facing_direction:getRelativeDirection(center2,portCenter),distance_from_component_edge:.4,pin_number:port._parsedProps.pinNumber,display_pin_label:port._parsedProps.aliases?.[0],is_connected:!1,schematic_sheet_id:schematicSheetId,subcircuit_id:subcircuitId});port.schematic_port_id=schematicPort.schematic_port_id}},getSingleConnectionTarget=(connectionName,target)=>{let targets=Array.isArray(target)?target:[target];if(targets.length!==1)throw new Error(`SchematicSymbol connection "${connectionName}" must select exactly one physical port`);return targets[0]},SchematicSymbol_doInitialPortMatching=schematicSymbol=>{let{db:db22}=schematicSymbol.root,{chipRef,connections}=schematicSymbol._parsedProps;if(chipRef&&!connections){db22.source_property_ignored_warning.insert({source_component_id:schematicSymbol.source_component_id,property_name:"chipRef",message:`${schematicSymbol.getString()} has chipRef "${chipRef}" without connections. chipRef will be ignored.`,error_type:"source_property_ignored_warning",subcircuit_id:schematicSymbol.getSubcircuit().subcircuit_id??void 0});return}if(connections&&!chipRef){db22.source_property_ignored_warning.insert({source_component_id:schematicSymbol.source_component_id,property_name:"connections",message:`${schematicSymbol.getString()} has connections without chipRef. connections will be ignored.`,error_type:"source_property_ignored_warning",subcircuit_id:schematicSymbol.getSubcircuit().subcircuit_id??void 0});return}if(!chipRef||!connections)return;let referencedChip=schematicSymbol.getSubcircuit().selectOne(chipRef);if(!referencedChip?.source_component_id)throw new Error(`Could not resolve chipRef "${chipRef}" for ${schematicSymbol.getString()}`);let usedConnectionNames=new Set;for(let schematicPort of schematicSymbol.ports){let symbolPort=schematicPort.schematicSymbolPortDef,matchingConnections=Object.entries(connections).filter(([connectionName2])=>schematicPort.isMatchingAnyOf([connectionName2]));if(matchingConnections.length===0)throw new Error(`${schematicSymbol.getString()} is missing an explicit connection for symbol port "${symbolPort.labels.join("/")}"`);if(matchingConnections.length>1)throw new Error(`${schematicSymbol.getString()} has multiple connections for symbol port "${symbolPort.labels.join("/")}"`);let[connectionName,connectionTarget4]=matchingConnections[0];usedConnectionNames.add(connectionName);let targetSelector=getSingleConnectionTarget(connectionName,connectionTarget4),physicalPort=schematicSymbol.getSubcircuit().selectOne(targetSelector,{type:"port"});if(!physicalPort?.source_port_id)throw new Error(`Could not resolve connection "${connectionName}" target "${targetSelector}" for ${schematicSymbol.getString()}`);if(db22.source_port.get(physicalPort.source_port_id)?.source_component_id!==referencedChip.source_component_id)throw new Error(`Connection "${connectionName}" target "${targetSelector}" does not belong to chipRef "${chipRef}"`);schematicPort.source_port_id=physicalPort.source_port_id,schematicPort.source_component_id=physicalPort.source_component_id}let unusedConnectionNames=Object.keys(connections).filter(connectionName=>!usedConnectionNames.has(connectionName));if(unusedConnectionNames.length>0)throw new Error(`${schematicSymbol.getString()} has connections that do not match symbol ports: ${unusedConnectionNames.join(", ")}`)},SchematicSymbol=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"isPrimitiveContainer",!0)}get config(){return{componentName:"SchematicSymbol",schematicSymbolName:this.props.symbolName,zodProps:schematicSymbolProps}}initPorts(){let symbol=zh[this._getSchematicSymbolNameOrThrow()],shouldCreateSourcePort=!(this._parsedProps.chipRef&&this._parsedProps.connections);for(let symbolPort of symbol.ports){let pinNumber=getPinNumberFromLabels(symbolPort.labels);if(!pinNumber)throw new Error(`Schematic symbol port must have a numeric pin label: ${symbolPort.labels.join("/")}`);let existingPort=this.ports.find(port2=>port2._parsedProps.pinNumber===pinNumber);if(existingPort){existingPort.schematicSymbolPortDef=symbolPort;continue}let aliases2=symbolPort.labels.filter(label=>label!==pinNumber.toString()&&label!==`pin${pinNumber}`),port=new Port({pinNumber,aliases:aliases2},{shouldCreateSourcePort});port.schematicSymbolPortDef=symbolPort,this.add(port)}}doInitialInitializePortsFromChildren(){this.initPorts()}updateInitializePortsFromChildren(){this.initPorts()}get ports(){return this.children.filter(child=>child instanceof Port)}getPortForSymbolPort(symbolPort){return this.ports.find(port=>port.schematicSymbolPortDef===symbolPort)??null}doInitialSourceRender(){let sourceComponent=this.root.db.source_component.insert({ftype:"simple_chip",name:this.name,display_name:this._parsedProps.displayName,are_pins_interchangeable:!1});this.source_component_id=sourceComponent.source_component_id}doInitialPortMatching(){SchematicSymbol_doInitialPortMatching(this)}doInitialSchematicComponentRender(){SchematicSymbol_doInitialSchematicComponentRender(this)}},SchematicSection=class _SchematicSection extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicSection",zodProps:schematicSectionProps}}_computeSectionBounds(board,sectionName,schematicSheetId){let{db:db22}=this.root,members=board.getDescendants().filter(c22=>c22.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=db22.schematic_component.get(schematicComponentId);if(!schComp||schComp.schematic_sheet_id!==schematicSheetId)continue;let hw22=schComp.size.width/2,hh22=schComp.size.height/2;positions.push({minX:schComp.center.x-hw22,maxX:schComp.center.x+hw22,minY:schComp.center.y-hh22,maxY:schComp.center.y+hh22});for(let text of db22.schematic_text.list({schematic_component_id:schematicComponentId}))positions.push(getSchematicTextBounds({text:text.text,position:text.position,anchor:text.anchor,fontSize:text.font_size}))}return positions.length===0?null:computeBoundsFromCellContents(positions)}doInitialSchematicSectionRender(){if(this.root?.schematicDisabled)return;let board=this.root?._getBoard();if(!board)return;let schematicSheetId=this._resolveSchematicSheetId(),allSections=board.getDescendants().filter(component=>component instanceof _SchematicSection&&component._resolveSchematicSheetId()===schematicSheetId);if(allSections[0]!==this)return;let{db:db22}=this.root,PADDING=.5,LABEL_PADDING=.2,STROKE_WIDTH=.02,TOL42=.001,namedSectionsWithBounds=allSections.map(section=>{let bounds=section._computeSectionBounds(board,section._parsedProps.name,schematicSheetId);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(s22=>s22!==null),unsectionedBounds=this._computeSectionBounds(board,null,schematicSheetId),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(s22=>s22.cell),outer=computeBoundsFromCellContents(allCells),dividers=calculateCellBoundaries2(allSectionsWithBounds.map(s22=>s22.rawBounds),{cellMargin:1});for(let line2 of dividers)db22.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:!0,schematic_sheet_id:schematicSheetId});let hDividers=dividers.filter(l22=>Math.abs(l22.start.y-l22.end.y)<TOL42),vDividers=dividers.filter(l22=>Math.abs(l22.start.x-l22.end.x)<TOL42);for(let sectionWithBounds of allSectionsWithBounds){let{displayName,sectionTitleFontSize,rawBounds,cell}=sectionWithBounds;if(!displayName)continue;let overlapsAnotherSection=allSectionsWithBounds.some(section=>section!==sectionWithBounds&&doBoundsOverlap(section.rawBounds,rawBounds)),dividersAbove=hDividers.map(l22=>l22.start.y).filter(y22=>y22>rawBounds.maxY),topBoundary=dividersAbove.length>0?Math.min(...dividersAbove):outer.maxY,dividersToLeft=vDividers.map(l22=>l22.start.x).filter(x22=>x22<rawBounds.minX),leftBoundary=outer.minX;overlapsAnotherSection&&(leftBoundary=cell.minX),dividersToLeft.length>0&&(leftBoundary=Math.max(...dividersToLeft));let fontSize=sectionTitleFontSize??.18;db22.schematic_text.insert({anchor:"top_left",text:displayName,font_size:fontSize,color:"#000000",position:{x:leftBoundary+LABEL_PADDING,y:Math.max(topBoundary-LABEL_PADDING,rawBounds.maxY+LABEL_PADDING+fontSize)},rotation:0,schematic_sheet_id:schematicSheetId})}}},getCircuitJsonSchematicSheetSize=sheetSize=>schematic_sheet_size.parse(sheetSize.toLowerCase()),SCHEMATIC_SHEET_DIMENSIONS_MM={a4:{width:297,height:210},ansi_b:{width:431.8,height:279.4}},resolveCircuitJsonSchematicSheetProperties=({sheetSize,sheetWidth,sheetHeight})=>{let circuitJsonSheetSize=getCircuitJsonSchematicSheetSize(sheetSize),defaultDimensions=SCHEMATIC_SHEET_DIMENSIONS_MM[circuitJsonSheetSize];return{sheetSize:circuitJsonSheetSize,sheetWidth:sheetWidth??defaultDimensions.width,sheetHeight:sheetHeight??defaultDimensions.height}},SCHEMATIC_UNIT_TO_MM2=10.16/1.1,SCHEMATIC_SHEET_INNER_MARGIN2=5/SCHEMATIC_UNIT_TO_MM2,BOUNDS_EPSILON=1e-6,getSchematicElementId=schematicElement=>{switch(schematicElement.type){case"schematic_component":return schematicElement.schematic_component_id;case"schematic_net_label":return schematicElement.schematic_net_label_id;case"schematic_trace":return schematicElement.schematic_trace_id}},insertSchematicElementOutsideSheetWarnings=({db:db22,schematicSheetId,schematicSheetName,schematicSheetCenter,sheetWidth,sheetHeight})=>{let sheetWidthInSchematicUnits=sheetWidth/SCHEMATIC_UNIT_TO_MM2,sheetHeightInSchematicUnits=sheetHeight/SCHEMATIC_UNIT_TO_MM2,sheetContentBounds={minX:schematicSheetCenter.x-sheetWidthInSchematicUnits/2+SCHEMATIC_SHEET_INNER_MARGIN2,maxX:schematicSheetCenter.x+sheetWidthInSchematicUnits/2-SCHEMATIC_SHEET_INNER_MARGIN2,minY:schematicSheetCenter.y-sheetHeightInSchematicUnits/2+SCHEMATIC_SHEET_INNER_MARGIN2,maxY:schematicSheetCenter.y+sheetHeightInSchematicUnits/2-SCHEMATIC_SHEET_INNER_MARGIN2},checkedElements=[...db22.schematic_component.list(),...db22.schematic_net_label.list(),...db22.schematic_trace.list()].filter(schematicElement=>schematicElement.schematic_sheet_id===schematicSheetId);for(let schematicElement of checkedElements){let elementBounds=getSchematicElementBounds(schematicElement);if(!elementBounds||!(elementBounds.minX<sheetContentBounds.minX-BOUNDS_EPSILON||elementBounds.maxX>sheetContentBounds.maxX+BOUNDS_EPSILON||elementBounds.minY<sheetContentBounds.minY-BOUNDS_EPSILON||elementBounds.maxY>sheetContentBounds.maxY+BOUNDS_EPSILON))continue;let schematicElementId=getSchematicElementId(schematicElement);db22.schematic_element_outside_sheet_warning.insert({warning_type:"schematic_element_outside_sheet_warning",message:`${schematicElement.type} ${schematicElementId} extends outside the drawing area of schematic sheet "${schematicSheetName}"`,schematic_sheet_id:schematicSheetId,schematic_element_type:schematicElement.type,schematic_element_id:schematicElementId})}},SchematicSheet=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"resolvedSchematicSheetDisplayName","Schematic Sheet")}get config(){return{componentName:"SchematicSheet",zodProps:schematicSheetProps}}doInitialSourceGroupRender(){if(this.root?.schematicDisabled)return;let{db:db22}=this.root,{_parsedProps:props}=this,explicitlyReservedSheetIndices=new Set(this.root.children.flatMap(component=>[component,...component.getDescendants()]).filter(component=>component.componentName==="SchematicSheet").map(component=>component._parsedProps.sheetIndex).filter(sheetIndex2=>sheetIndex2!==void 0)),occupiedSheetIndices=new Set([...explicitlyReservedSheetIndices,...db22.schematic_sheet.list().map(schematicSheet2=>schematicSheet2.sheet_index).filter(sheetIndex2=>sheetIndex2!==void 0)]),nextAvailableSheetIndex=0;for(;occupiedSheetIndices.has(nextAvailableSheetIndex);)nextAvailableSheetIndex+=1;let sheetIndex=props.sheetIndex??nextAvailableSheetIndex,name=props.name??props.displayName??`Sheet ${sheetIndex+1}`,displayName=props.displayName??name;this.resolvedSchematicSheetDisplayName=displayName;let resolvedSheetProperties=resolveCircuitJsonSchematicSheetProperties(props),schematicSheet=db22.schematic_sheet.insert({name,display_name:displayName,sheet_index:sheetIndex,sheet_size:resolvedSheetProperties.sheetSize,sheet_width:resolvedSheetProperties.sheetWidth,sheet_height:resolvedSheetProperties.sheetHeight,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:db22}=this.root,resolvedSheetProperties=resolveCircuitJsonSchematicSheetProperties(this._parsedProps),schematicElements=[...db22.schematic_component.list(),...db22.schematic_port.list(),...db22.schematic_text.list(),...db22.schematic_line.list(),...db22.schematic_rect.list(),...db22.schematic_circle.list(),...db22.schematic_arc.list(),...db22.schematic_path.list()].filter(element=>element.schematic_sheet_id===this.schematic_sheet_id),schematicSheetCenter={x:0,y:0};if(schematicElements.length>0){let bounds=getBoundsForSchematic(schematicElements);Number.isFinite(bounds.minX)&&Number.isFinite(bounds.maxX)&&Number.isFinite(bounds.minY)&&Number.isFinite(bounds.maxY)&&(schematicSheetCenter={x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},db22.schematic_sheet.update(this.schematic_sheet_id,{center:schematicSheetCenter}))}insertSchematicElementOutsideSheetWarnings({db:db22,schematicSheetId:this.schematic_sheet_id,schematicSheetName:this.resolvedSchematicSheetDisplayName,schematicSheetCenter,sheetWidth:resolvedSheetProperties.sheetWidth,sheetHeight:resolvedSheetProperties.sheetHeight})}},SchematicGraphic=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_graphic_id")}get config(){return{componentName:"SchematicGraphic",zodProps:schematicGraphicProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db22}=this.root,{imageUrl,svgContent,width,height}=this._parsedProps;if(imageUrl!==void 0){this._queueAsyncEffect("SchematicGraphicRender",async()=>{if(this.root?.schematicDisabled)return;let resolvedImageUrl=await resolveStaticFileImport(imageUrl,this.root?.platform),sourceImage=await loadImageSource(resolvedImageUrl).catch(error2=>{if(svgContent===void 0||resolvedImageUrl.startsWith("data:"))throw error2;return null});if(sourceImage===null){let asset22={project_relative_path:imageUrl.startsWith("data:")?"inline":imageUrl,url:resolvedImageUrl,mimetype:SVG_MIMETYPE},schematicGraphic2=this.root.db.schematic_graphic.insert({asset:asset22,schematic_sheet_id:this._resolveSchematicSheetId(),svg_content:svgContent,...width===void 0?{}:{width},...height===void 0?{}:{height}});this.schematic_graphic_id=schematicGraphic2.schematic_graphic_id;return}if(sourceImage.mimetype!==SVG_MIMETYPE)throw new Error(`Unsupported imageUrl for SchematicGraphic: "${imageUrl}". Expected an SVG image.`);let asset3={project_relative_path:imageUrl.startsWith("data:")?sourceImage.projectRelativePath:imageUrl,url:sourceImage.dataUrl,mimetype:sourceImage.mimetype},fallbackSvgContent=sourceImage.dataUrl.startsWith("data:")?svgContent:sourceImage.text,schematicGraphic=this.root.db.schematic_graphic.insert({asset:asset3,schematic_sheet_id:this._resolveSchematicSheetId(),...fallbackSvgContent===void 0?{}:{svg_content:fallbackSvgContent},...width===void 0?{}:{width},...height===void 0?{}:{height}});this.schematic_graphic_id=schematicGraphic.schematic_graphic_id});return}if(svgContent!==void 0){let asset3={project_relative_path:"inline",url:`data:image/svg+xml,${encodeURIComponent(svgContent)}`,mimetype:SVG_MIMETYPE},schematicGraphic=db22.schematic_graphic.insert({asset:asset3,schematic_sheet_id:this._resolveSchematicSheetId(),...width===void 0?{}:{width},...height===void 0?{}:{height}});this.schematic_graphic_id=schematicGraphic.schematic_graphic_id}}},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:db22}=this.root,{_parsedProps:props}=this,rows=this.children.filter(c22=>c22.componentName==="SchematicRow");if(rows.length===0)return;let grid22=[],maxCols=0;for(let row of rows){let cells=row.children.filter(c22=>c22.componentName==="SchematicCell");maxCols=Math.max(maxCols,cells.length)}for(let i22=0;i22<rows.length;i22++)grid22[i22]=[];for(let i22=0;i22<rows.length;i22++){let cells=rows[i22].children.filter(c22=>c22.componentName==="SchematicCell"),k22=0;for(let j22=0;j22<cells.length;j22++){for(;grid22[i22][k22];)k22++;let cell=cells[j22],colSpan=cell._parsedProps.colSpan??1,rowSpan=cell._parsedProps.rowSpan??1;for(let r22=0;r22<rowSpan;r22++)for(let c22=0;c22<colSpan;c22++)grid22[i22+r22]||(grid22[i22+r22]=[]),grid22[i22+r22][k22+c22]=cell;k22+=colSpan}}maxCols=Math.max(0,...grid22.map(r22=>r22.length));let rowHeights=rows.map((row,i22)=>row._parsedProps.height??1),colWidths=Array.from({length:maxCols},(_22,j22)=>{let maxWidth=0;for(let i22=0;i22<rows.length;i22++){let cell=grid22[i22]?.[j22];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=db22.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 i22=0;i22<rows.length;i22++){let xOffset=0;for(let j22=0;j22<maxCols;j22++){let cell=grid22[i22]?.[j22];if(cell&&!processedCells.has(cell)){processedCells.add(cell);let cellProps=cell._parsedProps,rowSpan=cellProps.rowSpan??1,colSpan=cellProps.colSpan??1,cellWidth=0;for(let c22=0;c22<colSpan;c22++)cellWidth+=colWidths[j22+c22];let cellHeight=0;for(let r22=0;r22<rowSpan;r22++)cellHeight+=rowHeights[i22+r22];db22.schematic_table_cell.insert({schematic_table_id:this.schematic_table_id,start_row_index:i22,end_row_index:i22+rowSpan-1,start_column_index:j22,end_column_index:j22+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[j22]&&(xOffset+=colWidths[j22])}yOffset+=rowHeights[i22]}}},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{constructor(){super(...arguments);__publicField(this,"simulation_experiment_id",null)}get config(){return{componentName:"AnalogSimulation",zodProps:analogSimulationProps}}getSpiceEngineName(){return this._parsedProps.spiceEngine}usesIndependentGraphAxes(){return this._parsedProps.graphIndependentAxes===!0}doInitialSimulationRender(){let{db:db22}=this.root,{duration,name,startTime,timePerStep,spiceOptions:spiceOptions2}=this._parsedProps,durationMs=duration||10,timePerStepMs=timePerStep||.01,simulationExperiment=db22.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});this.simulation_experiment_id=simulationExperiment.simulation_experiment_id}},AnalogAnalysisSimulation=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"simulation_experiment_id",null)}getSpiceEngineName(){return typeof this.props.spiceEngine=="string"?this.props.spiceEngine:void 0}usesIndependentGraphAxes(){return this.props.graphIndependentAxes===!0}getOrCreateSimulationExperiment(){if(this.simulation_experiment_id)return this.root?.db.simulation_experiment.get(this.simulation_experiment_id)??null;if(this.children.filter(child=>child.componentName==="AnalogSweepParameter").length>1)return this.renderError("An analog simulation can contain at most one sweep parameter."),null;let simulationExperiment=this.insertSimulationExperiment();return this.simulation_experiment_id=simulationExperiment?.simulation_experiment_id??null,simulationExperiment}doInitialSimulationRender(){this.getOrCreateSimulationExperiment()}},AnalogTransientSimulation=class extends AnalogAnalysisSimulation{get config(){return{componentName:"AnalogTransientSimulation",zodProps:analogTransientSimulationProps}}insertSimulationExperiment(){let{db:db22}=this.root,{duration,name,startTime,timePerStep,spiceOptions:spiceOptions2}=this._parsedProps;return db22.simulation_experiment.insert({name:name??"spice_transient_analysis",experiment_type:"spice_transient_analysis",end_time_ms:duration,start_time_ms:startTime,time_per_step:timePerStep,spice_options:spiceOptions2})}},AnalogDcOperatingPointSimulation=class extends AnalogAnalysisSimulation{get config(){return{componentName:"AnalogDcOperatingPointSimulation",zodProps:analogDcOperatingPointSimulationProps}}insertSimulationExperiment(){let{name,spiceOptions:spiceOptions2}=this._parsedProps;return this.root.db.simulation_experiment.insert({name:name??"spice_dc_operating_point",experiment_type:"spice_dc_operating_point",spice_options:spiceOptions2})}},AnalogDcSweepSimulation=class extends AnalogAnalysisSimulation{get config(){return{componentName:"AnalogDcSweepSimulation",zodProps:analogDcSweepSimulationProps}}insertSimulationExperiment(){let{name,spiceOptions:spiceOptions2,sweepSource,sweepStart,sweepStop,sweepStep}=this._parsedProps,sweepSourceComponent=(this.getGroup()??this.getSubcircuit())?.selectOne(sweepSource),dcSweepSourceFields;if(sweepSourceComponent instanceof VoltageSource2){sweepSourceComponent.runRenderPhase("SimulationRender");let simulationVoltageSourceId=sweepSourceComponent.simulation_voltage_source_id;if(!simulationVoltageSourceId)return this.renderError(`DC sweep source "${sweepSource}" must resolve to one voltage or current source.`),null;dcSweepSourceFields={dc_sweep_voltage_source_id:simulationVoltageSourceId,dc_sweep_unit:"V"}}else if(sweepSourceComponent instanceof CurrentSource2){sweepSourceComponent.runRenderPhase("SimulationRender");let simulationCurrentSourceId=sweepSourceComponent.simulation_current_source_id;if(!simulationCurrentSourceId)return this.renderError(`DC sweep source "${sweepSource}" must resolve to one voltage or current source.`),null;dcSweepSourceFields={dc_sweep_current_source_id:simulationCurrentSourceId,dc_sweep_unit:"A"}}else return this.renderError(`DC sweep source "${sweepSource}" must resolve to one voltage or current source.`),null;return this.root.db.simulation_experiment.insert({name:name??"spice_dc_sweep",experiment_type:"spice_dc_sweep",spice_options:spiceOptions2,...dcSweepSourceFields,dc_sweep_start:sweepStart,dc_sweep_stop:sweepStop,dc_sweep_step:sweepStep})}},AnalogAcSweepSimulation=class extends AnalogAnalysisSimulation{get config(){return{componentName:"AnalogAcSweepSimulation",zodProps:analogAcSweepSimulationProps}}insertSimulationExperiment(){let{name,spiceOptions:spiceOptions2,sweepType,samplesPerInterval,sampleCount,startFrequency,stopFrequency}=this._parsedProps;return this.root.db.simulation_experiment.insert({name:name??"spice_ac_analysis",experiment_type:"spice_ac_analysis",spice_options:spiceOptions2,ac_sweep_type:sweepType,ac_samples_per_interval:samplesPerInterval,ac_sample_count:sampleCount,ac_start_frequency_hz:startFrequency,ac_stop_frequency_hz:stopFrequency})}},parameterUnits={resistance:"\u03A9",capacitance:"F",inductance:"H",voltage:"V",current:"A"},isParameterSweepCoordinateInRange=({parameterSweepCoordinate,stop,step})=>{let tolerance=Math.abs(step)*1e-9;return step>0?parameterSweepCoordinate<=stop+tolerance:parameterSweepCoordinate>=stop-tolerance},getGeneratedParameterSweepCoordinates=({start,stop,step})=>{let parameterSweepCoordinates=[];for(let parameterSweepCoordinate=start;isParameterSweepCoordinateInRange({parameterSweepCoordinate,stop,step});parameterSweepCoordinate=start+parameterSweepCoordinates.length*step)if(parameterSweepCoordinates.push(parameterSweepCoordinate),parameterSweepCoordinates.length>1e6)throw new Error("Parameter sweep exceeds 1,000,000 points");return parameterSweepCoordinates},getParameterSweepTargetSelector=props=>props.parameterType==="resistance"?props.resistorRef:props.parameterType==="capacitance"?props.capacitorRef:props.parameterType==="inductance"?props.inductorRef:props.parameterType==="voltage"?props.net:props.currentSourceRef,AnalogSweepParameter_doInitialSimulationRender=analogSweepParameter=>{if(!(analogSweepParameter.parent instanceof AnalogAnalysisSimulation)){analogSweepParameter.renderError("analog.sweepparameter must be nested directly in an analog simulation.");return}let simulationExperiment=analogSweepParameter.parent.getOrCreateSimulationExperiment();if(!simulationExperiment)return;let props=analogSweepParameter._parsedProps,parameterSweepCoordinates=props.values??getGeneratedParameterSweepCoordinates({start:props.start,stop:props.stop,step:props.step}),simulationScope=analogSweepParameter.parent.getGroup()??analogSweepParameter.parent.getSubcircuit(),targetSelector=getParameterSweepTargetSelector(props),parameterUnit=parameterUnits[props.parameterType],simulationParameterSweepTable=analogSweepParameter.root.db.simulation_parameter_sweep,simulationParameterSweepFields={simulation_experiment_id:simulationExperiment.simulation_experiment_id,name:props.name,parameter_type:props.parameterType,parameter_values:parameterSweepCoordinates,parameter_unit:parameterUnit},simulationParameterSweepId;if(props.parameterType==="voltage"){let sweepNet=simulationScope?.selectOne(targetSelector,{type:"net"});if(!sweepNet?.source_net_id){analogSweepParameter.renderError(`Voltage sweep net "${targetSelector}" could not be resolved.`);return}simulationParameterSweepId=simulationParameterSweepTable.insert({...simulationParameterSweepFields,parameter_type:"voltage",source_net_id:sweepNet.source_net_id}).simulation_parameter_sweep_id}else{let sourceComponentId=simulationScope?.selectOne(targetSelector)?.source_component_id;if(!sourceComponentId){analogSweepParameter.renderError(`Parameter sweep target "${targetSelector}" could not be resolved.`);return}props.parameterType==="resistance"?simulationParameterSweepId=simulationParameterSweepTable.insert({...simulationParameterSweepFields,parameter_type:"resistance",resistor_source_component_id:sourceComponentId}).simulation_parameter_sweep_id:props.parameterType==="capacitance"?simulationParameterSweepId=simulationParameterSweepTable.insert({...simulationParameterSweepFields,parameter_type:"capacitance",capacitor_source_component_id:sourceComponentId}).simulation_parameter_sweep_id:props.parameterType==="inductance"?simulationParameterSweepId=simulationParameterSweepTable.insert({...simulationParameterSweepFields,parameter_type:"inductance",inductor_source_component_id:sourceComponentId}).simulation_parameter_sweep_id:simulationParameterSweepId=simulationParameterSweepTable.insert({...simulationParameterSweepFields,parameter_type:"current",current_source_component_id:sourceComponentId}).simulation_parameter_sweep_id}analogSweepParameter.simulation_parameter_sweep_id=simulationParameterSweepId},AnalogSweepParameter=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"simulation_parameter_sweep_id",null)}get config(){return{componentName:"AnalogSweepParameter",zodProps:analogSweepParameterProps}}doInitialSimulationRender(){AnalogSweepParameter_doInitialSimulationRender(this)}};function getLabelBounds3(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 cx22,cy22,w22,h22;if(elm.type==="schematic_component")cx22=elm.center?.x,cy22=elm.center?.y,w22=elm.size?.width,h22=elm.size?.height;else if(elm.type==="schematic_text")cx22=elm.position?.x,cy22=elm.position?.y,w22=(elm.text?.length??0)*.1,h22=.2;else return null;return typeof cx22=="number"&&typeof cy22=="number"&&typeof w22=="number"&&typeof h22=="number"?{minX:cx22-w22/2,maxX:cx22+w22/2,minY:cy22-h22/2,maxY:cy22+h22/2}:null}function getOverlapArea(a22,b22){if(!doBoundsOverlap(a22,b22))return 0;let overlapWidth=Math.min(a22.maxX,b22.maxX)-Math.max(a22.minX,b22.minX),overlapHeight=Math.min(a22.maxY,b22.maxY)-Math.max(a22.minY,b22.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(a22=>a22!==defaultAlignment)],bestAlignment=defaultAlignment,minOverlapArea=1/0;for(let alignment of orderedAlignments){let labelBounds=getLabelBounds3(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:db22}=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(s22=>s22.replace(/^\./,"")).join(".")),this.finalProbeName=finalName??null;let{simulation_voltage_probe_id}=db22.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);db22.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:db22}=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 db22.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:[...db22.schematic_component.list(),...db22.schematic_text.list()],defaultAlignment:"top_right"}),schematic_voltage_probe3=db22.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(){if(this.getInheritedProperty("analogSimulationDisabled"))return;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"})}};function getPcbFlexBoardTransform(primitive){let boardId=primitive._getBoard()?.pcb_board_id,board=boardId?primitive.root.db.pcb_board.get(boardId):null;if(!board)throw new Error(`${primitive.componentName} must be inside a board`);let transform7=compose2(translate2(-board.center.x,-board.center.y),primitive._computePcbGlobalTransformBeforeLayout());return{board,transform:transform7}}var PcbBend=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_bend_id",null)}get config(){return{componentName:"PcbBend",zodProps:pcbBendProps}}doInitialPcbFlexRender(){if(this.root?.pcbDisabled)return;let{db:db22}=this.root,props=this._parsedProps,{board,transform:transform7}=getPcbFlexBoardTransform(this);this.pcb_bend_id=db22.pcb_bend.insert({pcb_board_id:board.pcb_board_id,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,name:props.name,start:applyToPoint2(transform7,{x:props.x1,y:props.y1}),end:applyToPoint2(transform7,{x:props.x2,y:props.y2}),bend_angle:props.bendAngle,bend_radius:props.bendRadius,bend_side:props.bendSide}).pcb_bend_id}doRemovePcbFlexRender(){this.pcb_bend_id&&(this.root.db.pcb_bend.delete(this.pcb_bend_id),this.pcb_bend_id=null)}},PcbStiffener=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_stiffener_id",null)}get config(){return{componentName:"PcbStiffener",zodProps:pcbStiffenerProps}}doInitialPcbFlexRender(){if(this.root?.pcbDisabled)return;let{db:db22}=this.root,props=this._parsedProps,{board,transform:transform7}=getPcbFlexBoardTransform(this),base={pcb_board_id:board.pcb_board_id,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,name:props.name,layer:props.layer,material:props.material,thickness:props.thickness,adhesive_thickness:props.adhesiveThickness},geometry=props.shape==="rect"?{shape:"rect",center:applyToPoint2(transform7,{x:0,y:0}),rotation:decomposeTSR2(transform7).rotation.angle*180/Math.PI,width:props.width,height:props.height}:{shape:"polygon",outline:props.outline.map(point62=>applyToPoint2(transform7,point62))};this.pcb_stiffener_id=db22.pcb_stiffener.insert({...base,...geometry}).pcb_stiffener_id}doRemovePcbFlexRender(){this.pcb_stiffener_id&&(this.root.db.pcb_stiffener.delete(this.pcb_stiffener_id),this.pcb_stiffener_id=null)}},createNamespacedElement=hostType=>{let Component2=props=>(0,import_react9.createElement)(hostType,props);return Component2.displayName=hostType,Component2},analog={transientsimulation:createNamespacedElement("analogtransientsimulation"),dcoperatingpointsimulation:createNamespacedElement("analogdcoperatingpointsimulation"),dcsweepsimulation:createNamespacedElement("analogdcsweepsimulation"),acsweepsimulation:createNamespacedElement("analogacsweepsimulation"),sweepparameter:createNamespacedElement("analogsweepparameter")},assembly={subassembly:createNamespacedElement("assembly.subassembly"),cadassembly:createNamespacedElement("assembly.cadassembly"),device:createNamespacedElement("assembly.device"),screen:createNamespacedElement("assembly.screen")},EnclosureFdmBoxElement=createNamespacedElement("enclosure.fdm.box"),enclosure={cutoutaperture:createNamespacedElement("enclosure.cutoutaperture"),fdm:{box:EnclosureFdmBoxElement,Box:EnclosureFdmBoxElement}},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_react10.default.useState(!0),[error2,setError]=import_react10.default.useState(null),[circuit,setCircuit]=import_react10.default.useState(),[circuitJson,setCircuitJson]=import_react10.default.useState();return import_react10.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 R22=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,i22)=>(0,import_jsx_runtime.jsx)("trace",{...trace},i22))]})};for(let port of pinLabelsFlatArray)R22[port]=`.${name} > .${port}`;return R22},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:(_22,pin)=>`.${refdes} > .${pin}`}),{get:(_22,prop1)=>{let fn3=(...args)=>{let chipFnOrPinType=args[0];return new Proxy({},{get:(_33,pinName)=>`.${prop1} > .${pinName}`})};return new Proxy(fn3,{get:(_33,prop2)=>prop1==="net"?`net.${prop2}`:prop1==="subcircuit"?new Proxy({},{get:(_43,prop3)=>new Proxy({},{get:(_52,prop4)=>`subcircuit.${prop2} > .${prop3} > .${prop4}`})}):`.${prop1} > .${prop2}`,apply:(target,_33,args)=>prop1==="net"?new Proxy({},{get:(_43,netName)=>`net.${netName}`}):new Proxy({},{get:(_43,pinOrSubComponentName)=>{let pinResult=`.${prop1} > .${pinOrSubComponentName}`;return["U","J","CN"].some(p22=>prop1.startsWith(p22))?pinResult:new Proxy(new String(pinResult),{get:(_52,nestedProp)=>typeof nestedProp=="symbol"||nestedProp==="toString"?()=>pinResult:`.${prop1} > .${pinOrSubComponentName} > .${nestedProp}`})}})})}});extendCatalogue(components_exports);extendCatalogue({"assembly.device":AssemblyDevice,"assembly.screen":AssemblyScreen,"assembly.subassembly":AssemblySubassembly,"assembly.cadassembly":AssemblySubassembly,Bug:Chip,"enclosure.cutoutaperture":EnclosureCutoutAperture,"enclosure.fdm.box":EnclosureFdmBox,Fanout:Breakout,FanoutPoint:BreakoutPoint});var React3=__toESM(require_react(),1),ReactJsxRuntime=__toESM(require_jsx_runtime(),1);var dist_exports6={};__export(dist_exports6,{default:()=>mm_default2,mil2mm:()=>mil2mm,mm:()=>mm5,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}),mm5=n10=>{let unit2=typeof n10=="number"?"mm":n10.replace(/^[^a-zA-Z]+/g,"").toLowerCase();unit2||(unit2="mm");let val=typeof n10=="number"?n10:Number.parseFloat(n10.split(unit2)[0]);if(unit2 in unitToMm2)return val*unitToMm2[unit2];throw new Error(`Unsupported unit: ${unit2}`)},mmStr=n10=>`${mmNumberFormatter.format(mm5(n10))}mm`,mil2mm=mil=>typeof mil=="number"?mm5(`${mil}mil`):mil.match(/^\d+$/)?mm5(`${mil}mil`):mm5(mil),mm_default2=mm5;init_dist2();var fabricatorPresets={jlcpcb_economy_20260912:{minimumViaHoleDiameterWithoutExtraCharge:.3},jlcpcb_standard_20260912:{minimumViaHoleDiameterWithoutExtraCharge:.3}},presetAliases={jlcpcb_economy:"jlcpcb_economy_20260912",jlcpcb_standard:"jlcpcb_standard_20260912"};function resolvePreset(name){let resolved=Object.hasOwn(presetAliases,name)?presetAliases[name]:name;return Object.hasOwn(fabricatorPresets,resolved)?fabricatorPresets[resolved]:void 0}function runDrcChecks({circuitJson,fabricatorPreset,pcbBoardId}){let preset=resolvePreset(fabricatorPreset);if(!preset)return[];let threshold=preset.minimumViaHoleDiameterWithoutExtraCharge,smallVias=circuitJson.filter(element=>element.type==="pcb_via").filter(via=>via.hole_diameter<threshold);return smallVias.length===0?[]:[pcb_fabricator_extra_charge_warning.parse({type:"pcb_fabricator_extra_charge_warning",fabricator_preset:fabricatorPreset,pcb_board_id:pcbBoardId,pcb_via_ids:smallVias.map(via=>via.pcb_via_id),message:`${fabricatorPreset}: ${smallVias.length} via(s) have a hole diameter below ${threshold} mm and incur an extra fabrication charge. Use a hole diameter of at least ${threshold} mm to avoid this charge.`})]}var fabricatorEngine2={runDrcChecks};var __defProp5=Object.defineProperty,__export4=(target,all)=>{for(var name in all)__defProp5(target,name,{get:all[name],enumerable:!0})},dist_exports7={};__export4(dist_exports7,{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,getRotationBetweenPcbPin1Locations:()=>getRotationBetweenPcbPin1Locations2,getZodPrefixedIdWithDefault:()=>getZodPrefixedIdWithDefault2,inductance:()=>inductance2,insertionDirectionToCanonical:()=>insertionDirectionToCanonical2,insertionDirectionToVector:()=>insertionDirectionToVector3,insertion_direction:()=>insertion_direction2,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:()=>length4,manufacturing_drc_properties:()=>manufacturing_drc_properties2,ms:()=>ms4,ninePointAnchor:()=>ninePointAnchor3,parseAndConvertSiUnit:()=>parseAndConvertSiUnit2,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_missing_courtyard_warning:()=>pcb_component_missing_courtyard_warning2,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_pill:()=>pcb_courtyard_pill2,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_debug_line:()=>pcb_debug_line2,pcb_debug_object:()=>pcb_debug_object2,pcb_debug_object_base:()=>pcb_debug_object_base2,pcb_debug_point:()=>pcb_debug_point2,pcb_debug_rect:()=>pcb_debug_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_packing_error:()=>pcb_packing_error2,pcb_pad_pad_clearance_error:()=>pcb_pad_pad_clearance_error2,pcb_pad_trace_clearance_error:()=>pcb_pad_trace_clearance_error2,pcb_panel:()=>pcb_panel2,pcb_panelization_placement_error:()=>pcb_panelization_placement_error2,pcb_pin1_location:()=>pcb_pin1_location2,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_graphic:()=>pcb_silkscreen_graphic2,pcb_silkscreen_graphic_brep:()=>pcb_silkscreen_graphic_brep2,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_through_pad:()=>pcb_trace_route_point_through_pad2,pcb_trace_route_point_via:()=>pcb_trace_route_point_via2,pcb_trace_route_point_wire:()=>pcb_trace_route_point_wire2,pcb_trace_too_long_warning:()=>pcb_trace_too_long_warning2,pcb_trace_too_many_vias_warning:()=>pcb_trace_too_many_vias_warning2,pcb_trace_warning:()=>pcb_trace_warning2,pcb_via:()=>pcb_via2,pcb_via_clearance_error:()=>pcb_via_clearance_error2,pcb_via_trace_clearance_error:()=>pcb_via_trace_clearance_error2,point:()=>point6,point3:()=>point33,point_with_bulge:()=>point_with_bulge2,port_arrangement:()=>port_arrangement2,position:()=>position2,position3:()=>position32,resistance:()=>resistance2,ring:()=>ring3,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_overlap_warning:()=>schematic_component_overlap_warning2,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_component_styling_warning:()=>schematic_component_styling_warning2,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_element_outside_sheet_warning:()=>schematic_element_outside_sheet_warning2,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_sweep_current_graph:()=>simulation_ac_sweep_current_graph2,simulation_ac_sweep_voltage_graph:()=>simulation_ac_sweep_voltage_graph2,simulation_ac_voltage_source:()=>simulation_ac_voltage_source2,simulation_complex_sample:()=>simulation_complex_sample2,simulation_current_probe:()=>simulation_current_probe2,simulation_current_source:()=>simulation_current_source2,simulation_dc_current_source:()=>simulation_dc_current_source2,simulation_dc_operating_point_current:()=>simulation_dc_operating_point_current2,simulation_dc_operating_point_voltage:()=>simulation_dc_operating_point_voltage2,simulation_dc_sweep_current_graph:()=>simulation_dc_sweep_current_graph2,simulation_dc_sweep_unit:()=>simulation_dc_sweep_unit2,simulation_dc_sweep_voltage_graph:()=>simulation_dc_sweep_voltage_graph2,simulation_dc_voltage_source:()=>simulation_dc_voltage_source2,simulation_experiment:()=>simulation_experiment2,simulation_op_amp:()=>simulation_op_amp2,simulation_oscilloscope_trace:()=>simulation_oscilloscope_trace2,simulation_parameter_sweep:()=>simulation_parameter_sweep2,simulation_parameter_sweep_coordinate:()=>simulation_parameter_sweep_coordinate2,simulation_parameter_type:()=>simulation_parameter_type2,simulation_parameter_unit:()=>simulation_parameter_unit2,simulation_spice_subcircuit:()=>simulation_spice_subcircuit2,simulation_switch:()=>simulation_switch2,simulation_transient_current_graph:()=>simulation_transient_current_graph2,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_misconfigured_error:()=>source_component_misconfigured_error2,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_manufacturer_part_number_warning:()=>source_missing_manufacturer_part_number_warning2,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_part_not_found_warning:()=>source_part_not_found_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_refdes_convention_warning:()=>source_refdes_convention_warning2,source_simple_ammeter:()=>source_simple_ammeter2,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_connector_standards:()=>source_simple_connector_standards2,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_fuse:()=>source_simple_fuse2,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,source_unnamed_trace_warning:()=>source_unnamed_trace_warning2,spice_simulation_options:()=>spice_simulation_options2,supplier_footprint_mismatch_warning:()=>supplier_footprint_mismatch_warning2,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 SI_PREFIX_VALUES2=new Map([["T",1e12],["G",1e9],["M",1e6],["K",1e3],["k",1e3],["",1],["m",.001],["\xB5",1e-6],["\u03BC",1e-6],["u",1e-6],["n",1e-9],["p",1e-12],["f",1e-15]]),SI_PREFIXES3=[...SI_PREFIX_VALUES2.keys()];function getSiPrefixMultiplier2(prefix){return SI_PREFIX_VALUES2.get(prefix)}var 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,mohm:.001,mOhm:.001,milliohm:.001,\u03A9:1,ohm:1,Ohm:1,k\u03A9:1e3,K\u03A9:1e3,kohm:1e3,kOhm:1e3,KOhm:1e3,Kohm:1e3,M\u03A9:1e6,Mohm:1e6,MOhm:1e6,megohm:1e6,Megohm:1e6,G\u03A9:1e9,Gohm:1e9,GOhm:1e9,T\u03A9:1e12,Tohm:1e12,TOhm: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,\u03BCA: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,\u03BCF:1e-6,uF:1e-6,mF:.001,F:1,kF:1e3,KF:1e3,MF:1e6}},H:{baseUnit:"H",variants:{pH:1e-12,nH:1e-9,\u00B5H:1e-6,\u03BCH:1e-6,uH:1e-6,mH:.001,H:1,kH:1e3,KH:1e3,MH:1e6}},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,\u03BCs:.001,ms:1,s:1e3}},mm:{baseUnit:"mm",variants:{nm:1e-6,\u00B5m:.001,\u03BCm:.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(unit2){for(let info of Object.values(unitMappings2)){if(unit2 in info.variants)return{baseUnit:info.baseUnit,conversionFactor:info.variants[unit2]};for(let[variant,conversionFactor]of Object.entries(info.variants)){if(!unit2.endsWith(variant))continue;let prefix=unit2.slice(0,-variant.length),prefixMultiplier=getSiPrefixMultiplier2(prefix);if(prefixMultiplier!=null)return{baseUnit:info.baseUnit,conversionFactor:prefixMultiplier*conversionFactor}}}return{baseUnit:unit2,conversionFactor:1}}function parseAndConvertSiUnit2(v11,unitOfValue){if(v11==null)return{parsedUnit:null,unitOfValue:null,value:null};if(typeof v11=="string"&&v11.match(/^-?[\d.]+$/))return{value:Number.parseFloat(v11),parsedUnit:null,unitOfValue:null};if(typeof v11=="number")return{value:v11,parsedUnit:null,unitOfValue:null};if(typeof v11=="object"&&"x"in v11&&"y"in v11){let firstResult=parseAndConvertSiUnit2(v11.x,unitOfValue),xResult=parseAndConvertSiUnit2(v11.x,unitOfValue),yResult=parseAndConvertSiUnit2(v11.y,unitOfValue);return xResult.value===null||yResult.value===null?{parsedUnit:null,unitOfValue:null,value:null}:{parsedUnit:firstResult.parsedUnit,unitOfValue:firstResult.unitOfValue,value:{x:xResult.value,y:yResult.value}}}let unitReversed=v11.toString().split("").reverse().join("").match(/[^\d\s]+/)?.[0];if(!unitReversed)throw new Error(`Could not determine unit: "${v11}"`);let unit2=unitReversed.split("").reverse().join(""),numberPart=v11.slice(0,-unit2.length),bareSiPrefixMultiplier=getSiPrefixMultiplier2(unit2);if(unitOfValue&&bareSiPrefixMultiplier!=null)return{parsedUnit:null,unitOfValue,value:Number.parseFloat(numberPart)*bareSiPrefixMultiplier};if(bareSiPrefixMultiplier!=null&&!unitMappingAndVariantSuffixes2.has(unit2))return{parsedUnit:null,unitOfValue:null,value:Number.parseFloat(numberPart)*bareSiPrefixMultiplier};let{baseUnit,conversionFactor}=getBaseTscircuitUnit2(unit2);return{parsedUnit:unit2,unitOfValue:baseUnit,value:conversionFactor*Number.parseFloat(numberPart)}}var SI_PREFIX_PATTERN2=SI_PREFIXES3.filter(prefix=>prefix!=="").sort((a10,b10)=>b10.length-a10.length).map(prefix=>prefix.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),SI_UNIT_PATTERN2=new RegExp(`^([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?)(?:(${SI_PREFIX_PATTERN2}))?$`),SI_PREFIXES22=[{value:1e12,symbol:"T"},{value:1e9,symbol:"G"},{value:1e6,symbol:"M"},{value:1e3,symbol:"k"},{value:1,symbol:""},{value:.001,symbol:"m"},{value:1e-6,symbol:"\xB5"},{value:1e-9,symbol:"n"},{value:1e-12,symbol:"p"}],FALLBACK_PREFIX2=SI_PREFIXES22[SI_PREFIXES22.length-1],external_exports2={};__export4(external_exports2,{BRAND:()=>BRAND2,DIRTY:()=>DIRTY2,EMPTY_PATH:()=>EMPTY_PATH2,INVALID:()=>INVALID2,NEVER:()=>NEVER2,OK:()=>OK3,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=_11=>{};function assertIs(_arg){}util22.assertIs=assertIs;function assertNever(_x4){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(k11=>typeof obj[obj[k11]]!="number"),filtered={};for(let k11 of validKeys)filtered[k11]=obj[k11];return util22.objectValues(filtered)},util22.objectValues=obj=>util22.objectKeys(obj).map(function(e54){return obj[e54]}),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=(_11,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,i11=0;for(;i11<issue.path.length;){let el3=issue.path[i11];i11===issue.path.length-1?(curr[el3]=curr[el3]||{_errors:[]},curr[el3]._errors.push(mapper(issue))):curr[el3]=curr[el3]||{_errors:[]},curr=curr[el3],i11++}}};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(m10=>!!m10).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(x11=>!!x11)});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 s11 of results){if(s11.status==="aborted")return INVALID2;s11.status==="dirty"&&status.dirty(),arrayValue.push(s11.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}),OK3=value=>({status:"valid",value}),isAborted2=x11=>x11.status==="aborted",isDirty2=x11=>x11.status==="dirty",isValid2=x11=>x11.status==="valid",isAsync2=x11=>typeof Promise<"u"&&x11 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(ip4,version2){return!!((version2==="v4"||!version2)&&ipv4Regex2.test(ip4)||(version2==="v6"||!version2)&&ipv6Regex2.test(ip4))}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(ip4,version2){return!!((version2==="v4"||!version2)&&ipv4CidrRegex2.test(ip4)||(version2==="v6"||!version2)&&ipv6CidrRegex2.test(ip4))}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(ch4=>ch4.kind==="datetime")}get isDate(){return!!this._def.checks.find(ch4=>ch4.kind==="date")}get isTime(){return!!this._def.checks.find(ch4=>ch4.kind==="time")}get isDuration(){return!!this._def.checks.find(ch4=>ch4.kind==="duration")}get isEmail(){return!!this._def.checks.find(ch4=>ch4.kind==="email")}get isURL(){return!!this._def.checks.find(ch4=>ch4.kind==="url")}get isEmoji(){return!!this._def.checks.find(ch4=>ch4.kind==="emoji")}get isUUID(){return!!this._def.checks.find(ch4=>ch4.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(ch4=>ch4.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(ch4=>ch4.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(ch4=>ch4.kind==="cuid2")}get isULID(){return!!this._def.checks.find(ch4=>ch4.kind==="ulid")}get isIP(){return!!this._def.checks.find(ch4=>ch4.kind==="ip")}get isCIDR(){return!!this._def.checks.find(ch4=>ch4.kind==="cidr")}get isBase64(){return!!this._def.checks.find(ch4=>ch4.kind==="base64")}get isBase64url(){return!!this._def.checks.find(ch4=>ch4.kind==="base64url")}get minLength(){let min=null;for(let ch4 of this._def.checks)ch4.kind==="min"&&(min===null||ch4.value>min)&&(min=ch4.value);return min}get maxLength(){let max2=null;for(let ch4 of this._def.checks)ch4.kind==="max"&&(max2===null||ch4.value<max2)&&(max2=ch4.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 ch4 of this._def.checks)ch4.kind==="min"&&(min===null||ch4.value>min)&&(min=ch4.value);return min}get maxValue(){let max2=null;for(let ch4 of this._def.checks)ch4.kind==="max"&&(max2===null||ch4.value<max2)&&(max2=ch4.value);return max2}get isInt(){return!!this._def.checks.find(ch4=>ch4.kind==="int"||ch4.kind==="multipleOf"&&util2.isInteger(ch4.value))}get isFinite(){let max2=null,min=null;for(let ch4 of this._def.checks){if(ch4.kind==="finite"||ch4.kind==="int"||ch4.kind==="multipleOf")return!0;ch4.kind==="min"?(min===null||ch4.value>min)&&(min=ch4.value):ch4.kind==="max"&&(max2===null||ch4.value<max2)&&(max2=ch4.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 ch4 of this._def.checks)ch4.kind==="min"&&(min===null||ch4.value>min)&&(min=ch4.value);return min}get maxValue(){let max2=null;for(let ch4 of this._def.checks)ch4.kind==="max"&&(max2===null||ch4.value<max2)&&(max2=ch4.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 OK3(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 ch4 of this._def.checks)ch4.kind==="min"&&(min===null||ch4.value>min)&&(min=ch4.value);return min!=null?new Date(min):null}get maxDate(){let max2=null;for(let ch4 of this._def.checks)ch4.kind==="max"&&(max2===null||ch4.value<max2)&&(max2=ch4.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 OK3(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 OK3(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 OK3(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 OK3(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 OK3(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 OK3(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,i11)=>def.type._parseAsync(new ParseInputLazyPath2(ctx,item,ctx.path,i11)))).then(result2=>ParseStatus2.mergeArray(status,result2));let result=[...ctx.data].map((item,i11)=>def.type._parseSync(new ParseInputLazyPath2(ctx,item,ctx.path,i11)));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(a10,b10){let aType=getParsedType2(a10),bType=getParsedType2(b10);if(a10===b10)return{valid:!0,data:a10};if(aType===ZodParsedType2.object&&bType===ZodParsedType2.object){let bKeys=util2.objectKeys(b10),sharedKeys=util2.objectKeys(a10).filter(key=>bKeys.indexOf(key)!==-1),newObj={...a10,...b10};for(let key of sharedKeys){let sharedValue=mergeValues2(a10[key],b10[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(a10.length!==b10.length)return{valid:!1};let newArray=[];for(let index=0;index<a10.length;index++){let itemA=a10[index],itemB=b10[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&&+a10==+b10?{valid:!0,data:a10}:{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(x11=>!!x11);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,i11)=>valueType._parse(new ParseInputLazyPath2(ctx,item,ctx.path,i11)));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(x11=>!!x11),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(x11=>!!x11),issueData:{code:ZodIssueCode2.invalid_return_type,returnTypeError:error2}})}let params={errorMap:ctx.common.contextualErrorMap},fn3=ctx.data;if(this._def.returns instanceof ZodPromise2){let me4=this;return OK3(async function(...args){let error2=new ZodError2([]),parsedArgs=await me4._def.args.parseAsync(args,params).catch(e54=>{throw error2.addIssue(makeArgsIssue(args,e54)),error2}),result=await Reflect.apply(fn3,this,parsedArgs);return await me4._def.returns._def.type.parseAsync(result,params).catch(e54=>{throw error2.addIssue(makeReturnsIssue(result,e54)),error2})})}else{let me4=this;return OK3(function(...args){let parsedArgs=me4._def.args.safeParse(args,params);if(!parsedArgs.success)throw new ZodError2([makeArgsIssue(args,parsedArgs.error)]);let result=Reflect.apply(fn3,this,parsedArgs.data),parsedReturns=me4._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 OK3(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 OK3(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 OK3(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?OK3(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?OK3(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(a10,b10){return new _ZodPipeline({in:a10,out:b10,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 p11=typeof params=="function"?params(data):typeof params=="string"?{message:params}:params;return typeof p11=="string"?{message:p11}:p11}function custom2(check,_params={},fatal){return check?ZodAny2.create().superRefine((data,ctx)=>{let r11=check(data);if(r11 instanceof Promise)return r11.then(r22=>{if(!r22){let params=cleanParams2(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}});if(!r11){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,resistance2=external_exports2.string().or(external_exports2.number()).transform(v11=>parseAndConvertSiUnit2(v11,"\u03A9").value),capacitance2=external_exports2.string().or(external_exports2.number()).transform(v11=>parseAndConvertSiUnit2(v11,"F").value).transform(value=>Number.parseFloat(value.toPrecision(12))),inductance2=external_exports2.string().or(external_exports2.number()).transform(v11=>parseAndConvertSiUnit2(v11,"H").value),voltage2=external_exports2.string().or(external_exports2.number()).transform(v11=>parseAndConvertSiUnit2(v11,"V").value),length4=external_exports2.string().or(external_exports2.number()).transform(v11=>parseAndConvertSiUnit2(v11).value),frequency2=external_exports2.string().or(external_exports2.number()).transform(v11=>parseAndConvertSiUnit2(v11,"Hz").value),distance7=length4,current2=external_exports2.string().or(external_exports2.number()).transform(v11=>parseAndConvertSiUnit2(v11,"A").value),duration_ms2=external_exports2.string().or(external_exports2.number()).transform(v11=>parseAndConvertSiUnit2(v11).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(v11=>{if(typeof v11=="string"){let valString=v11.replace("mAh",""),num=Number.parseFloat(valString);if(Number.isNaN(num))throw new Error("Invalid capacity");return num}return v11}).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 point6=external_exports2.object({x:distance7,y:distance7}),position2=point6;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=length42=>{let chars2="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";return Array.from({length:length42},()=>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","inner7_copper","inner8_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=point6.extend({rotation:rotation4.optional()});expectTypesMatch3(!0);var kicadFont3=external_exports2.object({size:point6.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:point6.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_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_ammeter2=source_component_base2.extend({ftype:external_exports2.literal("simple_ammeter")});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_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,display_inductance:external_exports2.string().optional(),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_connector_standards2=["usb_c","m2","jst_sh","jst_gh","jst_zh","jst_ph","jst_xh","jst_vh"],source_simple_connector2=source_component_base2.extend({ftype:external_exports2.literal("simple_connector"),standard:external_exports2.enum(source_simple_connector_standards2).optional(),pin_count:external_exports2.number().int().positive().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(),source_filesystem_md5_hash: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_missing_manufacturer_part_number_warning2=external_exports2.object({type:external_exports2.literal("source_missing_manufacturer_part_number_warning"),source_missing_manufacturer_part_number_warning_id:getZodPrefixedIdWithDefault2("source_missing_manufacturer_part_number_warning"),warning_type:external_exports2.literal("source_missing_manufacturer_part_number_warning").default("source_missing_manufacturer_part_number_warning"),message:external_exports2.string(),source_component_id:external_exports2.string(),standard:external_exports2.string(),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a standard connector is missing manufacturer part number");expectTypesMatch3(!0);var source_refdes_convention_warning2=external_exports2.object({type:external_exports2.literal("source_refdes_convention_warning"),source_refdes_convention_warning_id:getZodPrefixedIdWithDefault2("source_refdes_convention_warning"),warning_type:external_exports2.literal("source_refdes_convention_warning").default("source_refdes_convention_warning"),message:external_exports2.string(),source_component_id:external_exports2.string(),refdes:external_exports2.string(),source_component_ftype:external_exports2.string(),expected_prefixes:external_exports2.array(external_exports2.string()),actual_prefix:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a source component reference designator does not match the component type convention");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_component_misconfigured_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_component_misconfigured_error"),source_component_misconfigured_error_id:getZodPrefixedIdWithDefault2("source_component_misconfigured_error"),error_type:external_exports2.literal("source_component_misconfigured_error").default("source_component_misconfigured_error"),source_component_ids:external_exports2.array(external_exports2.string()),source_port_ids:external_exports2.array(external_exports2.string()).optional()}).describe("Error emitted when one or more source components have an invalid or conflicting configuration");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)"),pulse_delay:ms4.optional(),rise_time:ms4.optional(),fall_time:ms4.optional(),pulse_width:ms4.optional(),period:ms4.optional()});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_ammeter2,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_missing_manufacturer_part_number_warning2,source_refdes_convention_warning2,source_i2c_misconfigured_error2,source_component_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(),max_via_count:external_exports2.number().int().nonnegative().optional(),name:external_exports2.string().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","inner7","inner8"],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().min(1).optional(),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_unnamed_trace_warning2=external_exports2.object({type:external_exports2.literal("source_unnamed_trace_warning"),source_unnamed_trace_warning_id:getZodPrefixedIdWithDefault2("source_unnamed_trace_warning"),warning_type:external_exports2.literal("source_unnamed_trace_warning").default("source_unnamed_trace_warning"),message:external_exports2.string(),source_trace_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a source trace is missing a name");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 source_part_not_found_warning2=external_exports2.object({type:external_exports2.literal("source_part_not_found_warning"),source_part_not_found_warning_id:getZodPrefixedIdWithDefault2("source_part_not_found_warning"),warning_type:external_exports2.literal("source_part_not_found_warning").default("source_part_not_found_warning"),message:external_exports2.string(),source_component_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),supplier_name:supplier_name2.optional(),manufacturer_part_number:external_exports2.string().optional(),supplier_part_number:external_exports2.string().optional(),part_name:external_exports2.string().optional()}).describe("Warning emitted when a requested part can not be found");expectTypesMatch3(!0);var schematic_box2=external_exports2.object({type:external_exports2.literal("schematic_box"),schematic_sheet_id:external_exports2.string().optional(),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_sheet_id:external_exports2.string().optional(),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(),is_dashed:external_exports2.boolean().default(!1),stroke_width:distance7.nullable().optional(),stroke_color:external_exports2.string().optional(),dash_length:distance7.optional(),dash_gap:distance7.optional(),points:external_exports2.array(point6),subcircuit_id:external_exports2.string().optional()});expectTypesMatch3(!0);var schematic_pin_styles2=external_exports2.record(external_exports2.object({left_margin:length4.optional(),right_margin:length4.optional(),top_margin:length4.optional(),bottom_margin:length4.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:point6,source_component_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string(),schematic_sheet_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),pin_spacing:length4.optional(),pin_styles:schematic_pin_styles2.optional(),box_width:length4.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_sheet_id:external_exports2.string().optional(),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),dash_length:distance7.optional(),dash_gap:distance7.optional(),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_sheet_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),center:point6,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_sheet_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),center:point6,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_sheet_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),center:point6,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(),schematic_sheet_id:external_exports2.string().optional(),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_sheet_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),schematic_text_id:external_exports2.string(),source_trace_id:external_exports2.string().optional(),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_sheet_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string().optional(),center:point6,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(),display_pin_label_font_size:external_exports2.number().positive().finite().optional(),subcircuit_id:external_exports2.string().optional(),is_connected:external_exports2.boolean().optional(),is_internal_circuit_port:external_exports2.boolean().optional(),is_overlapping_internal_circuit_port: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_sheet_id:external_exports2.string().optional(),schematic_trace_id:external_exports2.string().optional(),source_trace_id:external_exports2.string().optional(),source_net_id:external_exports2.string(),center:point6,anchor_position:point6.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:point6,size:size2}),schematic_debug_line2=schematic_debug_object_base2.extend({shape:external_exports2.literal("line"),start:point6,end:point6}),schematic_debug_point2=schematic_debug_object_base2.extend({shape:external_exports2.literal("point"),center:point6}),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(),schematic_sheet_id:external_exports2.string().optional(),source_component_id:external_exports2.string().optional(),name:external_exports2.string().optional(),position:point6,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_component_overlap_warning2=external_exports2.object({type:external_exports2.literal("schematic_component_overlap_warning"),schematic_component_overlap_warning_id:getZodPrefixedIdWithDefault2("schematic_component_overlap_warning"),warning_type:external_exports2.literal("schematic_component_overlap_warning").default("schematic_component_overlap_warning"),message:external_exports2.string(),schematic_component_ids:external_exports2.tuple([external_exports2.string(),external_exports2.string()]),schematic_sheet_id:external_exports2.string().optional()}).describe("Warning emitted when the rendered bounds of two schematic components overlap");expectTypesMatch3(!0);var schematic_component_styling_warning2=external_exports2.object({type:external_exports2.literal("schematic_component_styling_warning"),schematic_component_styling_warning_id:getZodPrefixedIdWithDefault2("schematic_component_styling_warning"),warning_type:external_exports2.literal("schematic_component_styling_warning").default("schematic_component_styling_warning"),message:external_exports2.string(),schematic_component_id:external_exports2.string(),styling_issue_type:external_exports2.string(),schematic_port_ids:external_exports2.array(external_exports2.string()).optional(),source_component_id:external_exports2.string().optional(),schematic_sheet_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a schematic component has a visual styling issue");expectTypesMatch3(!0);var schematic_element_outside_sheet_warning2=external_exports2.object({type:external_exports2.literal("schematic_element_outside_sheet_warning"),schematic_element_outside_sheet_warning_id:getZodPrefixedIdWithDefault2("schematic_element_outside_sheet_warning"),warning_type:external_exports2.literal("schematic_element_outside_sheet_warning").default("schematic_element_outside_sheet_warning"),message:external_exports2.string(),schematic_sheet_id:external_exports2.string(),schematic_element_type:external_exports2.enum(["schematic_component","schematic_net_label","schematic_trace"]),schematic_element_id:external_exports2.string()}).describe("Warning emitted when a schematic component, net label, or trace extends outside its schematic sheet");expectTypesMatch3(!0);var schematic_group2=external_exports2.object({type:external_exports2.literal("schematic_group"),schematic_group_id:getZodPrefixedIdWithDefault2("schematic_group"),schematic_sheet_id:external_exports2.string().optional(),source_group_id:external_exports2.string(),is_subcircuit:external_exports2.boolean().optional(),subcircuit_id:external_exports2.string().optional(),width:length4,height:length4,center:point6,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"),schematic_sheet_id:external_exports2.string().optional(),anchor_position:point6,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_sheet_id:external_exports2.string().optional(),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:point6,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(),sheet_index:external_exports2.number().optional(),subcircuit_id:external_exports2.string().optional(),outline_color: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 ring3=external_exports2.object({vertices:external_exports2.array(point_with_bulge2)});expectTypesMatch3(!0);var brep_shape2=external_exports2.object({outer_ring:ring3,inner_rings:external_exports2.array(ring3).default([])});expectTypesMatch3(!0);var insertionDirectionToCanonical2={from_left:"from_left",from_right:"from_right",from_top:"from_top",from_bottom:"from_bottom",from_above:"from_above",from_below:"from_below",from_x_neg:"from_left",from_x_pos:"from_right",from_y_pos:"from_top",from_y_neg:"from_bottom",from_z_pos:"from_above",from_z_neg:"from_below",from_front:"from_top",from_back:"from_bottom"},insertionDirectionToVector3={from_left:{x:-1,y:0,z:0},from_right:{x:1,y:0,z:0},from_top:{x:0,y:1,z:0},from_bottom:{x:0,y:-1,z:0},from_above:{x:0,y:0,z:1},from_below:{x:0,y:0,z:-1}},insertion_direction2=external_exports2.enum(["from_left","from_right","from_top","from_bottom","from_above","from_below","from_x_neg","from_x_pos","from_y_pos","from_y_neg","from_z_pos","from_z_neg","from_front","from_back"]).transform(value=>insertionDirectionToCanonical2[value]).describe('The side exposing the receptacle where the cable or mating part is attached, following the 2D PCB diagram convention, not a 3D viewport frame. In project coordinate space, "from_top" is +Y, "from_bottom" -Y, "from_left" -X, "from_right" +X, "from_above" +Z and "from_below" -Z. A receptacle on the +Y edge is "from_top" even though the plug moves in -Y as it seats. Cartesian spellings such as "from_y_pos" are accepted and normalized to the named values, as are the deprecated "from_front" (now "from_top") and "from_back" (now "from_bottom").');expectTypesMatch3(!0);expectTypesMatch3(!0);var pcb_pin1_location2=external_exports2.enum(["leftside_top","leftside_bottom","rightside_top","rightside_bottom","topside_left","topside_right","bottomside_left","bottomside_right"]);expectTypesMatch3(!0);var pin1LocationRotationCycles2=[["leftside_top","bottomside_left","rightside_bottom","topside_right"],["leftside_bottom","bottomside_right","rightside_top","topside_left"]],getRotationBetweenPcbPin1Locations2=(from,to3)=>{for(let cycle of pin1LocationRotationCycles2){let fromIndex=cycle.indexOf(from),toIndex=cycle.indexOf(to3);if(fromIndex!==-1&&toIndex!==-1)return(toIndex-fromIndex+cycle.length)%cycle.length*90}return null},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 manufacturing_drc_properties2=external_exports2.object({min_trace_width:length4.optional(),min_board_edge_clearance:length4.optional(),min_via_hole_edge_to_via_hole_edge_clearance:length4.optional(),min_plated_hole_drill_edge_to_drill_edge_clearance:length4.optional(),min_trace_to_pad_edge_clearance:length4.optional(),min_pad_edge_to_pad_edge_clearance:length4.optional(),min_same_net_trace_edge_to_trace_edge_clearance:length4.optional(),min_different_net_trace_edge_to_trace_edge_clearance:length4.optional(),min_via_edge_to_pad_edge_clearance:length4.optional(),min_via_hole_diameter:length4.optional(),min_via_pad_diameter:length4.optional()}),pcb_component2=external_exports2.object({type:external_exports2.literal("pcb_component"),pcb_component_id:getZodPrefixedIdWithDefault2("pcb_component"),source_component_id:external_exports2.string(),center:point6,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:length4,height:length4,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:point6.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:point6.optional(),insertion_direction:insertion_direction2.optional(),pin1_location:pcb_pin1_location2.optional().describe("Location of pin 1 on the unrotated, top-view component footprint"),supplier_pin1_location_map:external_exports2.record(supplier_name2,pcb_pin1_location2).optional().describe("Pin 1 location for each supplier's unrotated, top-view footprint"),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_debug_object_base2=external_exports2.object({type:external_exports2.literal("pcb_debug_object"),pcb_debug_object_id:getZodPrefixedIdWithDefault2("pcb_debug_object"),label:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}),pcb_debug_rect2=pcb_debug_object_base2.extend({shape:external_exports2.literal("rect"),center:point6,size:size2}),pcb_debug_line2=pcb_debug_object_base2.extend({shape:external_exports2.literal("line"),start:point6,end:point6}),pcb_debug_point2=pcb_debug_object_base2.extend({shape:external_exports2.literal("point"),center:point6}),pcb_debug_object2=external_exports2.discriminatedUnion("shape",[pcb_debug_rect2,pcb_debug_line2,pcb_debug_point2]);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(),solderpaste_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(),solderpaste_margin: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(),solderpaste_margin: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(),solderpaste_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(),solderpaste_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(point6),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(),solderpaste_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_rotated_pill2=external_exports2.object({type:external_exports2.literal("pcb_solder_paste"),shape:external_exports2.literal("rotated_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(),ccw_rotation:rotation4,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_rotated_pill2,pcb_solder_paste_oval2]).describe("Defines solderpaste on the PCB");expectTypesMatch3(!0);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:point6,layer:layer_ref2,width:length4,height:length4,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:layer_ref2,to_layer:layer_ref2}),pcb_trace_route_point_through_pad2=external_exports2.object({route_type:external_exports2.literal("through_pad"),start:point6,end:point6,width:distance7,start_layer:layer_ref2,end_layer:layer_ref2,pcb_smtpad_id:external_exports2.string().optional(),pcb_plated_hole_id:external_exports2.string().optional()}),pcb_trace_route_point2=external_exports2.union([pcb_trace_route_point_wire2,pcb_trace_route_point_via2,pcb_trace_route_point_through_pad2]),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_warning2=external_exports2.object({type:external_exports2.literal("pcb_trace_warning"),pcb_trace_warning_id:getZodPrefixedIdWithDefault2("pcb_trace_warning"),warning_type:external_exports2.literal("pcb_trace_warning").default("pcb_trace_warning"),message:external_exports2.string(),center:point6.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 warning on the PCB");expectTypesMatch3(!0);var pcb_trace_too_long_warning2=external_exports2.object({type:external_exports2.literal("pcb_trace_too_long_warning"),pcb_trace_too_long_warning_id:getZodPrefixedIdWithDefault2("pcb_trace_too_long_warning"),warning_type:external_exports2.literal("pcb_trace_too_long_warning").default("pcb_trace_too_long_warning"),message:external_exports2.string(),pcb_trace_id:external_exports2.string(),source_net_id:external_exports2.string().optional(),source_trace_id:external_exports2.string().optional(),actual_trace_length:distance7,maximum_trace_length:distance7,subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a PCB trace is longer than its maximum allowed length");expectTypesMatch3(!0);var pcb_trace_too_many_vias_warning2=external_exports2.object({type:external_exports2.literal("pcb_trace_too_many_vias_warning"),pcb_trace_too_many_vias_warning_id:getZodPrefixedIdWithDefault2("pcb_trace_too_many_vias_warning"),warning_type:external_exports2.literal("pcb_trace_too_many_vias_warning").default("pcb_trace_too_many_vias_warning"),message:external_exports2.string(),pcb_trace_id:external_exports2.string(),source_net_id:external_exports2.string().optional(),source_trace_id:external_exports2.string().optional(),actual_via_count:external_exports2.number().int().nonnegative(),maximum_via_count:external_exports2.number().int().nonnegative(),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a PCB trace has more vias than its maximum allowed count");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:point6.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:point6.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(),source_trace_id:external_exports2.string().optional(),source_net_id:external_exports2.string().min(1).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(),is_via_in_pad_allowed:external_exports2.boolean().optional(),width:length4.optional(),height:length4.optional(),center:point6,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:length4.optional().default(1.4),num_layers:external_exports2.number().optional().default(4),allow_blind_and_buried_vias:external_exports2.boolean().optional().describe("Whether autorouters may generate blind and buried vias. False restricts newly generated vias to the full board stack."),outline:external_exports2.array(point6).optional(),shape:external_exports2.enum(["rect","polygon"]).optional(),material:external_exports2.enum(["fr4","fr1"]).default("fr4"),solder_mask_color:external_exports2.string().optional(),silkscreen_color:external_exports2.string().optional(),anchor_position:point6.optional(),anchor_alignment:ninePointAnchor3.optional(),position_mode:external_exports2.enum(["relative_to_panel_anchor","none"]).optional()}).merge(manufacturing_drc_properties2).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:length4,height:length4,center:point6,thickness:length4.optional().default(1.4),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_packing_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_packing_error"),pcb_packing_error_id:getZodPrefixedIdWithDefault2("pcb_packing_error"),error_type:external_exports2.literal("pcb_packing_error").default("pcb_packing_error"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Defines a failure to pack PCB components within layout bounds");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(point6),stroke_width:length4}).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:length4,top:length4,bottom:length4,right:length4}).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:point6.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:length4,top:length4,bottom:length4,right:length4}).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:point6.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:point6,width:length4,height:length4,layer:layer_ref2,stroke_width:length4.default("1mm"),corner_radius:length4.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:point6,radius:length4,layer:visible_layer2,stroke_width:length4.default("1mm"),is_filled:external_exports2.boolean().optional()}).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:point6,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_graphic_base2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_graphic"),pcb_silkscreen_graphic_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_graphic"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:visible_layer2,image_asset:asset2.optional()}),pcb_silkscreen_graphic_brep2=pcb_silkscreen_graphic_base2.extend({shape:external_exports2.literal("brep"),brep_shape:brep_shape2}).describe("Defines a BRep silkscreen graphic on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_graphic2=external_exports2.discriminatedUnion("shape",[pcb_silkscreen_graphic_brep2]).describe("Defines a silkscreen graphic 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:point6,width:length4,height:length4,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(),ccw_rotation:external_exports2.number().optional(),layer:visible_layer2,anchor_position:point6.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(point6),stroke_width:length4,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:point6,width:length4,height:length4,layer:visible_layer2,stroke_width:length4.default("0.1mm"),corner_radius:length4.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:point6,to:point6,text:external_exports2.string().optional(),text_ccw_rotation:external_exports2.number().optional(),offset:length4.optional(),offset_distance:length4.optional(),offset_direction:external_exports2.object({x:external_exports2.number(),y:external_exports2.number()}).optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:length4.default("1mm"),color:external_exports2.string().optional(),arrow_size:length4.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:point6.default({x:0,y:0}),anchor_alignment:external_exports2.enum(["center","top_left","top_right","bottom_left","bottom_right"]).default("center"),layer:visible_layer2.default("top"),is_mirrored_from_top_view:external_exports2.boolean().optional(),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:point6,width:length4,height:length4,layer:visible_layer2.default("top"),stroke_width:length4.default("0.1mm"),corner_radius:length4.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(point6),layer:visible_layer2.default("top"),stroke_width:length4.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,layer:visible_layer2.default("top"),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:point6,to:point6,text:external_exports2.string().optional(),text_ccw_rotation:external_exports2.number().optional(),offset_distance:length4.optional(),offset_direction:external_exports2.object({x:external_exports2.number(),y:external_exports2.number()}).optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:length4.default("1mm"),layer:visible_layer2.default("top"),color:external_exports2.string().optional(),arrow_size:length4.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:point6,width:distance7,height:distance7,pcb_keepout_id:external_exports2.string(),layers:external_exports2.array(external_exports2.string()),description:external_exports2.string().optional(),excluded_pcb_component_ids:external_exports2.array(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:point6,radius:distance7,pcb_keepout_id:external_exports2.string(),layers:external_exports2.array(external_exports2.string()),description:external_exports2.string().optional(),excluded_pcb_component_ids:external_exports2.array(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:point6,width:length4,height:length4,rotation:rotation4.optional(),corner_radius:length4.optional()});expectTypesMatch3(!0);var pcb_cutout_circle2=pcb_cutout_base2.extend({shape:external_exports2.literal("circle"),center:point6,radius:length4});expectTypesMatch3(!0);var pcb_cutout_polygon2=pcb_cutout_base2.extend({shape:external_exports2.literal("polygon"),points:external_exports2.array(point6)});expectTypesMatch3(!0);var pcb_cutout_path2=pcb_cutout_base2.extend({shape:external_exports2.literal("path"),route:external_exports2.array(point6),slot_width:length4,slot_length:length4.optional(),space_between_slots:length4.optional(),slot_corner_radius:length4.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:length4.optional(),height:length4.optional(),center:point6,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(point6).optional(),anchor_position:point6.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:length4}).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_component_missing_courtyard_warning2=external_exports2.object({type:external_exports2.literal("pcb_component_missing_courtyard_warning"),pcb_component_missing_courtyard_warning_id:getZodPrefixedIdWithDefault2("pcb_component_missing_courtyard_warning"),warning_type:external_exports2.literal("pcb_component_missing_courtyard_warning").default("pcb_component_missing_courtyard_warning"),message:external_exports2.string(),pcb_component_id:external_exports2.string(),source_component_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a PCB component has no courtyard geometry");expectTypesMatch3(!0);var supplier_footprint_mismatch_warning2=external_exports2.object({type:external_exports2.literal("supplier_footprint_mismatch_warning"),supplier_footprint_mismatch_warning_id:getZodPrefixedIdWithDefault2("supplier_footprint_mismatch_warning"),warning_type:external_exports2.literal("supplier_footprint_mismatch_warning").default("supplier_footprint_mismatch_warning"),message:external_exports2.string(),source_component_id:external_exports2.string(),pcb_component_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),supplier_name:supplier_name2.optional(),supplier_part_number:external_exports2.string().optional(),supplier_footprint_url:external_exports2.string().optional(),footprint_copper_intersection_over_union:external_exports2.number()}).describe("Warning emitted when a supplier part footprint does not match the expected footprint");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(),layer:layer_ref2.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(point6)}).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:point6,width:length4,height:length4,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(point6)});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:point6,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:point6,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_via_trace_clearance_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_via_trace_clearance_error"),pcb_via_trace_clearance_error_id:getZodPrefixedIdWithDefault2("pcb_via_trace_clearance_error"),error_type:external_exports2.literal("pcb_via_trace_clearance_error").default("pcb_via_trace_clearance_error"),pcb_via_id:external_exports2.string(),pcb_trace_id:external_exports2.string(),minimum_clearance:distance7.optional(),actual_clearance:distance7.optional(),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 a via and trace are closer than the allowed clearance");expectTypesMatch3(!0);var pcb_pad_pad_clearance_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_pad_pad_clearance_error"),pcb_pad_pad_clearance_error_id:getZodPrefixedIdWithDefault2("pcb_pad_pad_clearance_error"),error_type:external_exports2.literal("pcb_pad_pad_clearance_error").default("pcb_pad_pad_clearance_error"),pcb_pad_ids:external_exports2.array(external_exports2.string()).min(2),minimum_clearance:distance7.optional(),actual_clearance:distance7.optional(),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 pads are closer than the allowed clearance");expectTypesMatch3(!0);var pcb_pad_trace_clearance_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_pad_trace_clearance_error"),pcb_pad_trace_clearance_error_id:getZodPrefixedIdWithDefault2("pcb_pad_trace_clearance_error"),error_type:external_exports2.literal("pcb_pad_trace_clearance_error").default("pcb_pad_trace_clearance_error"),pcb_pad_id:external_exports2.string(),pcb_trace_id:external_exports2.string(),minimum_clearance:distance7.optional(),actual_clearance:distance7.optional(),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 a pad and trace are closer than 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:point6,width:length4,height:length4,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(point6).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(point6).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:point6,radius:length4,layer:visible_layer2,color:external_exports2.string().optional()}).describe("Defines a courtyard circle on the PCB");expectTypesMatch3(!0);var pcb_courtyard_pill2=external_exports2.object({type:external_exports2.literal("pcb_courtyard_pill"),pcb_courtyard_pill_id:getZodPrefixedIdWithDefault2("pcb_courtyard_pill"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point6,width:length4,height:length4,radius:length4,layer:visible_layer2,color:external_exports2.string().optional()}).describe("Defines a courtyard pill 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(),show_as_bounding_box:external_exports2.boolean().optional(),show_hidden_edges: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,ac_magnitude:voltage2.optional(),ac_phase:rotation4.optional()}).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(),pulse_delay:ms4.optional(),rise_time:ms4.optional(),fall_time:ms4.optional(),pulse_width:ms4.optional(),period:ms4.optional(),ac_magnitude:voltage2.optional(),ac_phase:rotation4.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,ac_magnitude:current2.optional(),ac_phase:rotation4.optional()}).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(),ac_magnitude:current2.optional(),ac_phase:rotation4.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 simulation_dc_sweep_unit2=external_exports2.custom(dcSweepUnit=>dcSweepUnit==="V"||dcSweepUnit==="A"),simulation_parameter_unit2=external_exports2.custom(parameterUnit=>parameterUnit==="\u03A9"||parameterUnit==="F"||parameterUnit==="H"||parameterUnit==="V"||parameterUnit==="A"),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")]),spice_simulation_options2=external_exports2.object({method:external_exports2.enum(["trap","gear"]).optional(),reltol:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),abstol:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),vntol:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional()}).describe("SPICE solver options for a simulation experiment"),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(),spice_options:spice_simulation_options2.optional(),dc_sweep_voltage_source_id:external_exports2.string().optional(),dc_sweep_current_source_id:external_exports2.string().optional(),dc_sweep_start:external_exports2.number().optional(),dc_sweep_stop:external_exports2.number().optional(),dc_sweep_step:external_exports2.number().refine(dcSweepStep=>dcSweepStep!==0).optional(),dc_sweep_unit:simulation_dc_sweep_unit2.optional(),ac_sweep_type:external_exports2.enum(["linear","decade","octave"]).optional(),ac_samples_per_interval:external_exports2.number().int().positive().optional(),ac_sample_count:external_exports2.number().int().positive().optional(),ac_start_frequency_hz:external_exports2.number().positive().optional(),ac_stop_frequency_hz:external_exports2.number().positive().optional()}).superRefine((experiment,context)=>{if(experiment.experiment_type==="spice_dc_sweep"){let requiredFields=["dc_sweep_start","dc_sweep_stop","dc_sweep_step","dc_sweep_unit"];for(let field of requiredFields)experiment[field]===void 0&&context.addIssue({code:external_exports2.ZodIssueCode.custom,path:[field],message:`${field} is required for a DC sweep`});let hasVoltageSource=experiment.dc_sweep_voltage_source_id!==void 0,hasCurrentSource=experiment.dc_sweep_current_source_id!==void 0;hasVoltageSource===hasCurrentSource&&context.addIssue({code:external_exports2.ZodIssueCode.custom,path:["dc_sweep_voltage_source_id"],message:"Exactly one DC sweep voltage or current source ID is required"})}experiment.experiment_type==="spice_ac_analysis"&&(experiment.ac_sweep_type===void 0&&context.addIssue({code:external_exports2.ZodIssueCode.custom,path:["ac_sweep_type"],message:"ac_sweep_type is required for an AC analysis"}),experiment.ac_start_frequency_hz===void 0&&context.addIssue({code:external_exports2.ZodIssueCode.custom,path:["ac_start_frequency_hz"],message:"ac_start_frequency_hz is required for an AC analysis"}),experiment.ac_stop_frequency_hz===void 0&&context.addIssue({code:external_exports2.ZodIssueCode.custom,path:["ac_stop_frequency_hz"],message:"ac_stop_frequency_hz is required for an AC analysis"}),experiment.ac_sweep_type==="linear"&&experiment.ac_sample_count===void 0&&context.addIssue({code:external_exports2.ZodIssueCode.custom,path:["ac_sample_count"],message:"ac_sample_count is required for a linear AC analysis"}),(experiment.ac_sweep_type==="decade"||experiment.ac_sweep_type==="octave")&&experiment.ac_samples_per_interval===void 0&&context.addIssue({code:external_exports2.ZodIssueCode.custom,path:["ac_samples_per_interval"],message:"ac_samples_per_interval is required for decade and octave AC analyses"}))}).describe("Defines a simulation experiment configuration");expectTypesMatch3(!0);var simulation_parameter_sweep_coordinate2=external_exports2.object({simulation_parameter_sweep_id:external_exports2.string(),sweep_index:external_exports2.number().int().nonnegative(),parameter_value:external_exports2.number(),parameter_unit:simulation_parameter_unit2});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(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate2.optional(),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_transient_current_graph2=external_exports2.object({type:external_exports2.literal("simulation_transient_current_graph"),simulation_transient_current_graph_id:getZodPrefixedIdWithDefault2("simulation_transient_current_graph"),simulation_experiment_id:external_exports2.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate2.optional(),timestamps_ms:external_exports2.array(external_exports2.number()).optional(),current_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 current 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_current_probe2=external_exports2.object({type:external_exports2.literal("simulation_current_probe"),simulation_current_probe_id:getZodPrefixedIdWithDefault2("simulation_current_probe"),source_component_id:external_exports2.string().optional(),name:external_exports2.string().optional(),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(),subcircuit_id:external_exports2.string().optional(),color:external_exports2.string().optional()}).describe("Defines a current probe for simulation. It measures current flowing from the positive endpoint to the negative endpoint.").superRefine((data,ctx)=>{let hasPositivePort=!!data.positive_source_port_id,hasNegativePort=!!data.negative_source_port_id,hasPositiveNet=!!data.positive_source_net_id,hasNegativeNet=!!data.negative_source_net_id,hasPorts=hasPositivePort||hasNegativePort,hasNets=hasPositiveNet||hasNegativeNet;if(hasPorts&&hasNets){ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Cannot mix port and net connections in a current probe."});return}if(hasPorts){(!hasPositivePort||!hasNegativePort)&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Current probe using source ports requires both positive_source_port_id and negative_source_port_id."});return}if(hasNets){(!hasPositiveNet||!hasNegativeNet)&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Current probe using source nets requires both positive_source_net_id and negative_source_net_id."});return}ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"A current probe must have either positive/negative source port ids or positive/negative source net ids."})});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_parameter_type2=external_exports2.enum(["resistance","capacitance","inductance","voltage","current"]),simulation_parameter_sweep_base2=external_exports2.object({type:external_exports2.literal("simulation_parameter_sweep"),simulation_parameter_sweep_id:getZodPrefixedIdWithDefault2("simulation_parameter_sweep"),simulation_experiment_id:external_exports2.string(),name:external_exports2.string().optional(),parameter_values:external_exports2.array(external_exports2.number()).min(1),parameter_unit:simulation_parameter_unit2}),simulation_parameter_sweep2=external_exports2.discriminatedUnion("parameter_type",[simulation_parameter_sweep_base2.extend({parameter_type:external_exports2.literal("resistance"),resistor_source_component_id:external_exports2.string()}),simulation_parameter_sweep_base2.extend({parameter_type:external_exports2.literal("capacitance"),capacitor_source_component_id:external_exports2.string()}),simulation_parameter_sweep_base2.extend({parameter_type:external_exports2.literal("inductance"),inductor_source_component_id:external_exports2.string()}),simulation_parameter_sweep_base2.extend({parameter_type:external_exports2.literal("voltage"),source_net_id:external_exports2.string()}),simulation_parameter_sweep_base2.extend({parameter_type:external_exports2.literal("current"),current_source_component_id:external_exports2.string()})]).describe("Repeats a simulation experiment over component parameter values");expectTypesMatch3(!0);var simulation_dc_operating_point_voltage2=external_exports2.object({type:external_exports2.literal("simulation_dc_operating_point_voltage"),simulation_dc_operating_point_voltage_id:getZodPrefixedIdWithDefault2("simulation_dc_operating_point_voltage"),simulation_experiment_id:external_exports2.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate2.optional(),simulation_voltage_probe_id:external_exports2.string(),voltage:external_exports2.number(),name:external_exports2.string().optional(),color:external_exports2.string().optional()});expectTypesMatch3(!0);var simulation_dc_operating_point_current2=external_exports2.object({type:external_exports2.literal("simulation_dc_operating_point_current"),simulation_dc_operating_point_current_id:getZodPrefixedIdWithDefault2("simulation_dc_operating_point_current"),simulation_experiment_id:external_exports2.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate2.optional(),simulation_current_probe_id:external_exports2.string(),current:external_exports2.number(),name:external_exports2.string().optional(),color:external_exports2.string().optional()});expectTypesMatch3(!0);var simulation_dc_sweep_voltage_graph2=external_exports2.object({type:external_exports2.literal("simulation_dc_sweep_voltage_graph"),simulation_dc_sweep_voltage_graph_id:getZodPrefixedIdWithDefault2("simulation_dc_sweep_voltage_graph"),simulation_experiment_id:external_exports2.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate2.optional(),simulation_voltage_probe_id:external_exports2.string(),sweep_values:external_exports2.array(external_exports2.number()),sweep_unit:simulation_dc_sweep_unit2,voltage_levels:external_exports2.array(external_exports2.number()),name:external_exports2.string().optional(),color:external_exports2.string().optional()}).refine(graph=>graph.sweep_values.length===graph.voltage_levels.length,{message:"sweep_values and voltage_levels must have the same length"});expectTypesMatch3(!0);var simulation_dc_sweep_current_graph2=external_exports2.object({type:external_exports2.literal("simulation_dc_sweep_current_graph"),simulation_dc_sweep_current_graph_id:getZodPrefixedIdWithDefault2("simulation_dc_sweep_current_graph"),simulation_experiment_id:external_exports2.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate2.optional(),simulation_current_probe_id:external_exports2.string(),sweep_values:external_exports2.array(external_exports2.number()),sweep_unit:simulation_dc_sweep_unit2,current_levels:external_exports2.array(external_exports2.number()),name:external_exports2.string().optional(),color:external_exports2.string().optional()}).refine(graph=>graph.sweep_values.length===graph.current_levels.length,{message:"sweep_values and current_levels must have the same length"});expectTypesMatch3(!0);var simulation_complex_sample2=external_exports2.object({re:external_exports2.number(),im:external_exports2.number()});expectTypesMatch3(!0);var simulation_ac_sweep_voltage_graph2=external_exports2.object({type:external_exports2.literal("simulation_ac_sweep_voltage_graph"),simulation_ac_sweep_voltage_graph_id:getZodPrefixedIdWithDefault2("simulation_ac_sweep_voltage_graph"),simulation_experiment_id:external_exports2.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate2.optional(),simulation_voltage_probe_id:external_exports2.string(),frequencies_hz:external_exports2.array(external_exports2.number()),complex_voltages:external_exports2.array(simulation_complex_sample2),name:external_exports2.string().optional(),color:external_exports2.string().optional()}).refine(graph=>graph.frequencies_hz.length===graph.complex_voltages.length,{message:"frequencies_hz and complex_voltages must have the same length"});expectTypesMatch3(!0);var simulation_ac_sweep_current_graph2=external_exports2.object({type:external_exports2.literal("simulation_ac_sweep_current_graph"),simulation_ac_sweep_current_graph_id:getZodPrefixedIdWithDefault2("simulation_ac_sweep_current_graph"),simulation_experiment_id:external_exports2.string(),simulation_parameter_sweep_coordinate:simulation_parameter_sweep_coordinate2.optional(),simulation_current_probe_id:external_exports2.string(),frequencies_hz:external_exports2.array(external_exports2.number()),complex_currents:external_exports2.array(simulation_complex_sample2),name:external_exports2.string().optional(),color:external_exports2.string().optional()}).refine(graph=>graph.frequencies_hz.length===graph.complex_currents.length,{message:"frequencies_hz and complex_currents must have the same length"});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 simulation_spice_subcircuit2=external_exports2.object({type:external_exports2.literal("simulation_spice_subcircuit"),simulation_spice_subcircuit_id:getZodPrefixedIdWithDefault2("simulation_spice_subcircuit"),source_component_id:external_exports2.string(),spice_pin_to_source_port_map:external_exports2.record(external_exports2.string(),external_exports2.string()),subcircuit_source:external_exports2.string()}).describe("Defines a custom SPICE subcircuit model for simulation");expectTypesMatch3(!0);var hasValue2=value=>value!==void 0,simulation_oscilloscope_trace2=external_exports2.object({type:external_exports2.literal("simulation_oscilloscope_trace"),simulation_oscilloscope_trace_id:getZodPrefixedIdWithDefault2("simulation_oscilloscope_trace"),simulation_transient_voltage_graph_id:external_exports2.string().optional(),simulation_transient_current_graph_id:external_exports2.string().optional(),simulation_voltage_probe_id:external_exports2.string().optional(),simulation_current_probe_id:external_exports2.string().optional(),display_name:external_exports2.string().optional(),color:external_exports2.string().optional(),display_center_value:external_exports2.number().optional(),display_center_offset_divs:external_exports2.number().optional(),volts_per_div:external_exports2.number().positive().optional(),amps_per_div:external_exports2.number().positive().optional()}).describe("Defines how a simulation measurement is rendered as an oscilloscope-style trace.").superRefine((data,ctx)=>{let voltageReferences=[data.simulation_transient_voltage_graph_id,data.simulation_voltage_probe_id].filter(hasValue2).length,currentReferences=[data.simulation_transient_current_graph_id,data.simulation_current_probe_id].filter(hasValue2).length;voltageReferences+currentReferences!==1&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"An oscilloscope trace must reference exactly one voltage graph, current graph, voltage probe, or current probe."}),voltageReferences>0&&data.amps_per_div!==void 0&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Voltage oscilloscope traces must use volts_per_div, not amps_per_div."}),currentReferences>0&&data.volts_per_div!==void 0&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Current oscilloscope traces must use amps_per_div, not volts_per_div."})});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_unnamed_trace_warning2,source_missing_manufacturer_part_number_warning2,source_refdes_convention_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_part_not_found_warning2,source_i2c_misconfigured_error2,source_component_misconfigured_error2,source_ambiguous_port_reference2,pcb_component2,pcb_debug_object2,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_component_missing_courtyard_warning2,supplier_footprint_mismatch_warning2,pcb_plated_hole2,pcb_keepout2,pcb_port2,pcb_net2,pcb_text2,pcb_trace2,pcb_trace_warning2,pcb_trace_too_long_warning2,pcb_trace_too_many_vias_warning2,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_silkscreen_graphic2,pcb_trace_error2,pcb_trace_missing_error2,pcb_placement_error2,pcb_packing_error2,pcb_panelization_placement_error2,pcb_port_not_matched_error2,pcb_port_not_connected_error2,pcb_via_clearance_error2,pcb_via_trace_clearance_error2,pcb_pad_pad_clearance_error2,pcb_pad_trace_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,pcb_courtyard_pill2,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_component_overlap_warning2,schematic_component_styling_warning2,schematic_element_outside_sheet_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_transient_current_graph2,simulation_dc_operating_point_voltage2,simulation_dc_operating_point_current2,simulation_dc_sweep_voltage_graph2,simulation_dc_sweep_current_graph2,simulation_ac_sweep_voltage_graph2,simulation_ac_sweep_current_graph2,simulation_parameter_sweep2,simulation_switch2,simulation_voltage_probe2,simulation_current_probe2,simulation_oscilloscope_trace2,simulation_unknown_experiment_error2,simulation_op_amp2,simulation_spice_subcircuit2]),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 translate6(tx4,ty4=0){return{a:1,c:0,e:tx4,b:0,d:1,f:ty4}}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,m10=multiply(m12,m22);return transform5(m10,...rest)}}}function compose5(...matrices){return transform5(...matrices)}var{cos:cos6,sin:sin6,PI:PI7}=Math;function scale5(sx4,sy4=void 0,cx4=void 0,cy4=void 0){isUndefined5(sy4)&&(sy4=sx4);let scaleMatrix={a:sx4,c:0,e:0,b:0,d:sy4,f:0};return isUndefined5(cx4)||isUndefined5(cy4)?scaleMatrix:transform5([translate6(cx4,cy4),scaleMatrix,translate6(-cx4,-cy4)])}var{tan:tan6}=Math;function peg$subclass4(child,parent){function C11(){this.constructor=child}C11.prototype=parent.prototype,child.prototype=new C11}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,k11;for(k11=0;k11<sources.length;k11++)if(sources[k11].source===this.location.source){src=sources[k11].text.split(/\r\n|\n|\r/g);break}var s11=this.location.start,offset_s=this.location.source&&typeof this.location.source.offset=="function"?this.location.source.offset(s11):s11,loc=this.location.source+":"+offset_s.line+":"+offset_s.column;if(src){var e54=this.location.end,filler=peg$padEnd4("",offset_s.line.toString().length," "),line2=src[s11.line-1],last=s11.line===e54.line?e54.column:line2.length+1,hatLen=last-s11.column||1;str+=`
|