jbrowse-plugin-graphgenomeviewer 4.0.13 → 4.0.15

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.
Files changed (53) hide show
  1. package/README.md +5 -1
  2. package/dist/chunks/{GbzBaseSyntenyAdapter-Y5NBXK7P.js → GbzBaseSyntenyAdapter-3ZTHTTHA.js} +2 -2
  3. package/dist/chunks/{GraphGenomeView-TTQEJJQD.js → GraphGenomeView-5SMMNFD4.js} +2 -2
  4. package/dist/chunks/{GraphTrackSettingsDialog-3A2PKZRI.js → GraphTrackSettingsDialog-2QV6TPX7.js} +2 -2
  5. package/dist/chunks/{LinearGraphDisplay-MJ5XZFE5.js → LinearGraphDisplay-BEOEIUGA.js} +2 -2
  6. package/dist/chunks/{MinigraphBubbleAdapter-APC7JYOM.js → MinigraphBubbleAdapter-NRDD66AK.js} +2 -2
  7. package/dist/chunks/{RgfaTabixAdapter-4E365PXO.js → RgfaTabixAdapter-NQEERXXI.js} +2 -2
  8. package/dist/chunks/{chunk-5DP7IXD3.js → chunk-33VHHB43.js} +2 -2
  9. package/dist/chunks/{chunk-LA7MQS33.js → chunk-5E7TVPCI.js} +2 -2
  10. package/dist/chunks/chunk-IUIIYSGF.js +2 -0
  11. package/dist/chunks/{chunk-M4YEAXSR.js.map → chunk-IUIIYSGF.js.map} +3 -3
  12. package/dist/chunks/chunk-JXAJ7YLT.js +2 -0
  13. package/dist/chunks/chunk-JXAJ7YLT.js.map +7 -0
  14. package/dist/chunks/chunk-KULNKXPT.js +2 -0
  15. package/dist/chunks/chunk-KULNKXPT.js.map +7 -0
  16. package/dist/chunks/chunk-QSH263Y6.js +2 -0
  17. package/dist/chunks/chunk-QSH263Y6.js.map +7 -0
  18. package/dist/chunks/chunk-UQEPPJEO.js +2 -0
  19. package/dist/chunks/{chunk-VAGPKHHS.js.map → chunk-UQEPPJEO.js.map} +3 -3
  20. package/dist/chunks/chunk-UQN2NWT5.js +4 -0
  21. package/dist/chunks/chunk-UQN2NWT5.js.map +7 -0
  22. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +2 -2
  23. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +3 -3
  24. package/package.json +2 -2
  25. package/src/GraphGenomeView/components/BubbleHalos.tsx +67 -3
  26. package/src/GraphGenomeView/components/BubbleOverlay.tsx +10 -0
  27. package/src/GraphGenomeView/components/GraphCanvas.tsx +46 -9
  28. package/src/GraphGenomeView/components/LabelChip.tsx +9 -1
  29. package/src/GraphGenomeView/components/LabelLayer.tsx +7 -0
  30. package/src/GraphGenomeView/components/ReferenceStripOverlay.tsx +116 -0
  31. package/src/GraphGenomeView/components/TubeMapOverlay.tsx +109 -41
  32. package/src/GraphGenomeView/model.test.ts +3 -0
  33. package/src/GraphGenomeView/model.ts +204 -43
  34. package/src/LinearGraphDisplay/model.ts +2 -0
  35. package/src/version.ts +1 -1
  36. package/dist/chunks/chunk-CJ56O2VG.js +0 -2
  37. package/dist/chunks/chunk-CJ56O2VG.js.map +0 -7
  38. package/dist/chunks/chunk-IFRDWMQ2.js +0 -2
  39. package/dist/chunks/chunk-IFRDWMQ2.js.map +0 -7
  40. package/dist/chunks/chunk-M4YEAXSR.js +0 -2
  41. package/dist/chunks/chunk-MUK3KYB4.js +0 -2
  42. package/dist/chunks/chunk-MUK3KYB4.js.map +0 -7
  43. package/dist/chunks/chunk-VAGPKHHS.js +0 -2
  44. package/dist/chunks/chunk-XDOIZTY6.js +0 -4
  45. package/dist/chunks/chunk-XDOIZTY6.js.map +0 -7
  46. /package/dist/chunks/{GbzBaseSyntenyAdapter-Y5NBXK7P.js.map → GbzBaseSyntenyAdapter-3ZTHTTHA.js.map} +0 -0
  47. /package/dist/chunks/{GraphGenomeView-TTQEJJQD.js.map → GraphGenomeView-5SMMNFD4.js.map} +0 -0
  48. /package/dist/chunks/{GraphTrackSettingsDialog-3A2PKZRI.js.map → GraphTrackSettingsDialog-2QV6TPX7.js.map} +0 -0
  49. /package/dist/chunks/{LinearGraphDisplay-MJ5XZFE5.js.map → LinearGraphDisplay-BEOEIUGA.js.map} +0 -0
  50. /package/dist/chunks/{MinigraphBubbleAdapter-APC7JYOM.js.map → MinigraphBubbleAdapter-NRDD66AK.js.map} +0 -0
  51. /package/dist/chunks/{RgfaTabixAdapter-4E365PXO.js.map → RgfaTabixAdapter-NQEERXXI.js.map} +0 -0
  52. /package/dist/chunks/{chunk-5DP7IXD3.js.map → chunk-33VHHB43.js.map} +0 -0
  53. /package/dist/chunks/{chunk-LA7MQS33.js.map → chunk-5E7TVPCI.js.map} +0 -0
@@ -4,6 +4,7 @@ import {
4
4
  } from '@jbrowse/bandage-core/anchoredNodes'
5
5
  import { BUBBLE_SPREAD_VALUES } from '@jbrowse/bandage-core/bubbleSpreads'
6
6
  import { bubbleHalos } from '@jbrowse/bandage-core/bubbles/bubbleHalos'
7
+ import { sameBubble } from '@jbrowse/bandage-core/bubbles/bubbleLine'
7
8
  import { bubblesFromGraph } from '@jbrowse/bandage-core/bubbles/bubblesFromGraph'
8
9
  import {
9
10
  BUBBLE_KIND_NAMES,
@@ -55,15 +56,18 @@ import {
55
56
  buildNeighbors,
56
57
  nodeReferenceSpan,
57
58
  } from '@jbrowse/bandage-core/referenceSpan'
59
+ import {
60
+ REFERENCE_STRIP_ZONE_PX,
61
+ nodeAnchor,
62
+ referenceStripBlocks,
63
+ stripBlockAt,
64
+ stripOverhang,
65
+ } from '@jbrowse/bandage-core/referenceStrip'
58
66
  import {
59
67
  buildGeometry,
60
68
  computeReferenceRamp,
61
69
  } from '@jbrowse/bandage-core/renderer/GeometryBuilder'
62
- import {
63
- referenceBoxes,
64
- rulerBoxes,
65
- rulerMarks,
66
- } from '@jbrowse/bandage-core/tubeMap/axis'
70
+ import { referenceBoxes, rulerBoxes } from '@jbrowse/bandage-core/tubeMap/axis'
67
71
  import { coarsenTubeMap } from '@jbrowse/bandage-core/tubeMap/coarsen'
68
72
  import {
69
73
  connectorAt,
@@ -71,7 +75,11 @@ import {
71
75
  tubeMapConnectors,
72
76
  } from '@jbrowse/bandage-core/tubeMap/connectors'
73
77
  import { deviationMarks } from '@jbrowse/bandage-core/tubeMap/deviations'
74
- import { tubeMapPicture } from '@jbrowse/bandage-core/tubeMap/draw'
78
+ import {
79
+ mismatchOnScreen,
80
+ mismatchesLegible,
81
+ tubeMapPicture,
82
+ } from '@jbrowse/bandage-core/tubeMap/draw'
75
83
  import {
76
84
  tubeMapFrame,
77
85
  tubeMapNodeAt,
@@ -412,11 +420,15 @@ export function GraphPaneMixin() {
412
420
  ),
413
421
  // Whether the node layouts draw each bubble as a halo along its nodes
414
422
  // with a label that opens it. The variant map draws glyphs instead.
415
- showBubbles: types.optional(types.boolean, true),
423
+ // Off by default: on a base-level cut every SNP's halo is a blob.
424
+ showBubbles: types.optional(types.boolean, false),
416
425
  showDeletionEdges: types.optional(types.boolean, false),
417
426
  // The session's genes drawn onto the backbone: exons along the nodes
418
427
  // that carry them, names pinned at their midpoints. See genes/.
419
428
  showGenes: types.optional(types.boolean, true),
429
+ // Whether a drawing in its own coordinates inside a linear view gets
430
+ // the strip of reference segments at their bp. See referenceStrip.ts.
431
+ showReferenceStrip: types.optional(types.boolean, true),
420
432
  // Variants under this many bp fold into the reference before a tube map
421
433
  // is laid out, each kept as a tick on its walk's tube (coarsen.ts); 0
422
434
  // draws every one
@@ -521,6 +533,11 @@ export function GraphPaneMixin() {
521
533
  loadCanceled: false,
522
534
  statusMessage: '',
523
535
  hoveredNode: null as string | null,
536
+ // the bubble whose label the pointer is on
537
+ hoveredBubble: null as MinigraphBubble | null,
538
+ // whether the pointer is over this pane, whose own hit test then says
539
+ // what it is on
540
+ pointerInPane: false,
524
541
  hoveredEdge: null as number | null,
525
542
  selectedNode: null as string | null,
526
543
  viewportDirty: 0,
@@ -696,12 +713,14 @@ export function GraphPaneMixin() {
696
713
  // Empty unless the ribbons are actually on: a colour key beside a drawing
697
714
  // with no colours in it is a legend for nothing.
698
715
  // The tube map colours its tubes whether or not paths are drawn on the
699
- // nodes, so under it the key follows the tubes.
716
+ // nodes, so under it the key follows the tubes, and names the colours
717
+ // the tubes were drawn in.
700
718
  get pathLegend() {
701
719
  const paths = self.graph?.paths
702
- const colouring = self.drawPaths || self.layoutResult?.tubeMap
720
+ const tubeMap = self.layoutResult?.tubeMap
721
+ const colouring = self.drawPaths || tubeMap
703
722
  return colouring && paths && pathColorsLegible(paths.length)
704
- ? pathLegend(paths)
723
+ ? pathLegend(paths, tubeMap?.pathColors)
705
724
  : []
706
725
  },
707
726
  // Every walk the graph carries, named for a picker, whatever the count.
@@ -1161,34 +1180,41 @@ export function GraphPaneMixin() {
1161
1180
  ? { start: ramp.start, end: ramp.start + ramp.span }
1162
1181
  : undefined
1163
1182
  },
1164
- // The reference interval of the hovered node, for a connected linear view
1165
- // to highlight. Only a graph cut from a track has one: a whole-file import
1166
- // has no region, and its stable names need not name anything in a loaded
1167
- // assembly.
1183
+ // A node's reference interval, an allele's between its flanks
1184
+ nodeSpan(nodeId: string) {
1185
+ const { nodeById, nodeNeighbors: neighbors } = self
1186
+ return nodeById && neighbors
1187
+ ? nodeReferenceSpan({ nodeId, nodeById, neighbors })
1188
+ : undefined
1189
+ },
1190
+ }))
1191
+ .views(self => ({
1192
+ // The reference interval under the pointer: the hovered node's, or the
1193
+ // hovered bubble's
1194
+ get hoveredSpan() {
1195
+ const nodeId = self.hoveredNode
1196
+ const bubble = self.hoveredBubble
1197
+ return nodeId !== null
1198
+ ? self.nodeSpan(nodeId)
1199
+ : bubble
1200
+ ? { start: bubble.start, end: bubble.end }
1201
+ : undefined
1202
+ },
1203
+ }))
1204
+ .views(self => ({
1205
+ // The hovered span, for a connected linear view to highlight. Only a
1206
+ // graph cut from a track has one: a whole-file import has no region, and
1207
+ // its stable names need not name anything in a loaded assembly.
1168
1208
  get hoverHighlight() {
1169
- let result:
1170
- | {
1171
- refName: string
1172
- assemblyName: string
1173
- start: number
1174
- end: number
1175
- }
1176
- | undefined
1177
1209
  const region = self.graphRegion
1178
- const nodeId = self.hoveredNode
1179
- const nodeById = self.nodeById
1180
- const neighbors = self.nodeNeighbors
1181
- if (region && nodeId !== null && nodeById && neighbors) {
1182
- const span = nodeReferenceSpan({ nodeId, nodeById, neighbors })
1183
- if (span) {
1184
- result = {
1210
+ const span = self.hoveredSpan
1211
+ return region && span
1212
+ ? {
1185
1213
  refName: region.refName,
1186
1214
  assemblyName: region.assemblyName,
1187
1215
  ...span,
1188
1216
  }
1189
- }
1190
- }
1191
- return result
1217
+ : undefined
1192
1218
  },
1193
1219
  }))
1194
1220
  .views(self => ({
@@ -1397,6 +1423,102 @@ export function GraphPaneMixin() {
1397
1423
  ? tubeMapGenes(reference, self.backboneGenes)
1398
1424
  : []
1399
1425
  },
1426
+ // A drawing of nodes in its own coordinates inside a linear view, whose
1427
+ // reference segments the strip can put back at their bp. A tube map has
1428
+ // its own bands, and walk rows' bars are lengths, not nodes.
1429
+ get referenceStripApplies() {
1430
+ const { host, layoutResult } = self
1431
+ return (
1432
+ !!host?.initialized &&
1433
+ !!layoutResult &&
1434
+ !layoutResult.tubeMap &&
1435
+ !self.hostPlacesX &&
1436
+ self.chosenLayoutMode !== 'walkrows'
1437
+ )
1438
+ },
1439
+ }))
1440
+ .views(self => ({
1441
+ get referenceStripBlocks() {
1442
+ const { graph } = self
1443
+ return self.showReferenceStrip && self.referenceStripApplies && graph
1444
+ ? referenceStripBlocks(graph, {
1445
+ colorScheme: self.effectiveColorScheme,
1446
+ referenceRamp: self.referenceRamp,
1447
+ walkNodes: self.walkHighlight?.nodeIds,
1448
+ })
1449
+ : []
1450
+ },
1451
+ // Read off the live blocks, so the strip follows every frame of a pan
1452
+ // in the linear view
1453
+ get referenceStripFrame() {
1454
+ const { host, graphRegion } = self
1455
+ return host?.initialized && graphRegion
1456
+ ? hostFrame(host, graphRegion)
1457
+ : undefined
1458
+ },
1459
+ }))
1460
+ .views(self => ({
1461
+ get referenceStripShown() {
1462
+ return (
1463
+ self.referenceStripBlocks.length > 0 &&
1464
+ self.referenceStripFrame !== undefined
1465
+ )
1466
+ },
1467
+ // Whether the graph draws reference past the window's edges. A boolean
1468
+ // rather than the bp, which moves on every frame of a pan and would
1469
+ // resize the legend with it.
1470
+ get referenceStripOverhangs() {
1471
+ const frame = self.referenceStripFrame
1472
+ if (!frame || self.referenceStripBlocks.length === 0) {
1473
+ return false
1474
+ }
1475
+ const { left, right } = stripOverhang(
1476
+ self.referenceStripBlocks,
1477
+ frame,
1478
+ self.paneWidth,
1479
+ )
1480
+ return left > 0 || right > 0
1481
+ },
1482
+ }))
1483
+ .views(self => ({
1484
+ // The lit span on the strip, and where the graph drew what it is of:
1485
+ // the hovered node, the hovered bubble's name, or the selected node
1486
+ get referenceStripLit() {
1487
+ if (!self.referenceStripShown) {
1488
+ return undefined
1489
+ }
1490
+ const toScreen = (p: { x: number; y: number }) => ({
1491
+ x: p.x * self.scaleX + self.translateX,
1492
+ y: p.y * self.scaleY + self.translateY,
1493
+ })
1494
+ const bubble = self.hoveredNode === null ? self.hoveredBubble : null
1495
+ if (bubble) {
1496
+ const halo = self.bubbleHalos.find(h => sameBubble(h.bubble, bubble))
1497
+ return {
1498
+ start: bubble.start,
1499
+ end: bubble.end,
1500
+ anchor: halo ? toScreen(halo.labelAt) : undefined,
1501
+ }
1502
+ }
1503
+ const nodeId = self.hoveredNode ?? self.selectedNode
1504
+ const span = nodeId === null ? undefined : self.nodeSpan(nodeId)
1505
+ return span && nodeId !== null
1506
+ ? {
1507
+ ...span,
1508
+ anchor: nodeAnchor(self.nodePositions?.[nodeId], toScreen),
1509
+ }
1510
+ : undefined
1511
+ },
1512
+ referenceStripNodeAt(sx: number, sy: number) {
1513
+ const frame = self.referenceStripFrame
1514
+ return self.referenceStripShown && frame
1515
+ ? stripBlockAt(self.referenceStripBlocks, frame, sx, sy)
1516
+ : undefined
1517
+ },
1518
+ // the strip, and the gap the fit leaves under it
1519
+ get referenceStripZonePx() {
1520
+ return self.referenceStripShown ? REFERENCE_STRIP_ZONE_PX : 0
1521
+ },
1400
1522
  }))
1401
1523
  .views(self => ({
1402
1524
  // `paneHeight` replaces the built-in ceiling rather than adding a second
@@ -1407,10 +1529,15 @@ export function GraphPaneMixin() {
1407
1529
  return Math.max(MIN_CANVAS_HEIGHT, self.paneHeight ?? MAX_CANVAS_HEIGHT)
1408
1530
  },
1409
1531
  // Room over a tube map for the rows its genes need, one inside the
1410
- // padding and one more for each further gene that overlaps it
1532
+ // padding and one more for each further gene that overlaps it, and
1533
+ // room for the reference strip
1411
1534
  get fitPadTop() {
1412
1535
  const rows = tubeMapGeneRows(self.tubeMapGenes)
1413
- return FIT_PADDING + Math.max(0, rows - 1) * GENE_ROW_PX
1536
+ return (
1537
+ FIT_PADDING +
1538
+ Math.max(0, rows - 1) * GENE_ROW_PX +
1539
+ self.referenceStripZonePx
1540
+ )
1414
1541
  },
1415
1542
  // A tube map on its own axis reads by panning along it, as in
1416
1543
  // sequenceTubeMap. Rather than shrink a long cut to a strip, the fit
@@ -1536,19 +1663,27 @@ export function GraphPaneMixin() {
1536
1663
  },
1537
1664
  }))
1538
1665
  .views(self => ({
1539
- // What the tube map's legend has to explain: a zigzag where the ruler
1540
- // squeezes a box on screen, and the fold its walks' ticks stand for
1666
+ // What the tube map's legend has to explain: that on the own axis a
1667
+ // box is as wide as the log of its length, the fold its walks' ticks
1668
+ // stand for, the reads' strands, and the marks on the reads in view
1541
1669
  get tubeMapKeys() {
1542
- const boxes = self.tubeMapRulerBoxes
1670
+ const layout = self.layoutResult
1671
+ const reads = layout?.tubeMap?.layout.reads ?? []
1672
+ const picture = self.tubeMapPicture
1543
1673
  const frame = self.tubeMapFrame
1544
- const marks =
1545
- boxes && frame
1546
- ? rulerMarks(boxes, frame.x, self.paneWidth, () => 0)
1547
- : undefined
1674
+ const shown =
1675
+ picture && frame && mismatchesLegible(frame.yScale)
1676
+ ? picture.mismatches.filter(m =>
1677
+ mismatchOnScreen(m, { x: frame.x, width: self.paneWidth }),
1678
+ )
1679
+ : []
1548
1680
  return {
1549
- squeezed: (marks?.squeezed.length ?? 0) > 0,
1681
+ logWidths: layout?.tubeMap !== undefined && !layout.referenceAxis,
1550
1682
  foldBp:
1551
1683
  self.tubeMapDeviations.length > 0 ? self.tubeMapFold : undefined,
1684
+ forwardReads: reads.some(r => !r.is_reverse),
1685
+ reverseReads: reads.some(r => r.is_reverse),
1686
+ mismatches: new Set(shown.map(m => m.kind)),
1552
1687
  }
1553
1688
  },
1554
1689
  tubeMapNodeAt(sx: number, sy: number) {
@@ -1644,6 +1779,9 @@ export function GraphPaneMixin() {
1644
1779
  setShowGenes(show: boolean) {
1645
1780
  self.showGenes = show
1646
1781
  },
1782
+ setShowReferenceStrip(show: boolean) {
1783
+ self.showReferenceStrip = show
1784
+ },
1647
1785
  setTubeMapFold(bp: number) {
1648
1786
  self.tubeMapFold = bp
1649
1787
  },
@@ -1690,6 +1828,12 @@ export function GraphPaneMixin() {
1690
1828
  setHoveredNode(nodeId: string | null) {
1691
1829
  self.hoveredNode = nodeId
1692
1830
  },
1831
+ setHoveredBubble(bubble: MinigraphBubble | null) {
1832
+ self.hoveredBubble = bubble
1833
+ },
1834
+ setPointerInPane(inside: boolean) {
1835
+ self.pointerInPane = inside
1836
+ },
1693
1837
  setLegendSize(size: { width: number; height: number }) {
1694
1838
  self.legendSize = size
1695
1839
  },
@@ -1713,6 +1857,7 @@ export function GraphPaneMixin() {
1713
1857
  // is replaced, and by clearGraph.
1714
1858
  clearInteractionState() {
1715
1859
  self.hoveredNode = null
1860
+ self.hoveredBubble = null
1716
1861
  self.hoveredEdge = null
1717
1862
  self.selectedNode = null
1718
1863
  self.draggingNode = null
@@ -2554,6 +2699,9 @@ export function GraphPaneMixin() {
2554
2699
  // LGV writes `{hoverPosition, hoverFeature}` to session.hovered on
2555
2700
  // every mousemove; neither field names the source view, so the guard
2556
2701
  // is that the position lies in the region this graph was cut from.
2702
+ // A pointer over the pane itself is the host's too, at a bp its x
2703
+ // only means on a reference-axis layout, so there the pane's own hit
2704
+ // test is the hover.
2557
2705
  //
2558
2706
  // Only `hovered` is tracked — the graph reads are untracked, so a
2559
2707
  // geometry rebuild can't re-fire this and clobber a hover the canvas
@@ -2566,7 +2714,7 @@ export function GraphPaneMixin() {
2566
2714
  untracked(() => {
2567
2715
  const region = self.graphRegion
2568
2716
  const graph = self.graph
2569
- if (region && graph) {
2717
+ if (region && graph && !self.pointerInPane) {
2570
2718
  self.setHoveredNode(
2571
2719
  hover && hoverInRegion(hover, region)
2572
2720
  ? nodeForLgvHover({ hover, nodes: graph.nodes })
@@ -2606,6 +2754,7 @@ export function GraphPaneMixin() {
2606
2754
  () => `${self.scale}-${self.translateX}-${self.translateY}`,
2607
2755
  () => {
2608
2756
  self.setHoveredNode(null)
2757
+ self.setHoveredBubble(null)
2609
2758
  self.setHoveredEdge(null)
2610
2759
  },
2611
2760
  { name: 'GraphClearHoverOnViewportChange' },
@@ -2996,6 +3145,18 @@ export function GraphPaneMixin() {
2996
3145
  self.setShowGenes(!self.showGenes)
2997
3146
  },
2998
3147
  },
3148
+ ...(self.referenceStripApplies
3149
+ ? [
3150
+ {
3151
+ type: 'checkbox' as const,
3152
+ label: 'Reference strip at bp',
3153
+ checked: self.showReferenceStrip,
3154
+ onClick: () => {
3155
+ self.setShowReferenceStrip(!self.showReferenceStrip)
3156
+ },
3157
+ },
3158
+ ]
3159
+ : []),
2999
3160
  ]
3000
3161
  },
3001
3162
  launchMenuItems(): MenuItem[] {
@@ -373,6 +373,8 @@ export function stateModelFactory(configSchema: LinearGraphDisplayConfigModel) {
373
373
  referencePath: self.referencePath,
374
374
  geneTrackId: self.geneTrackId,
375
375
  showGenes: self.showGenes,
376
+ showBubbles: self.showBubbles,
377
+ showDeletionEdges: self.showDeletionEdges,
376
378
  } satisfies GraphViewSpec
377
379
  },
378
380
  }))
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '4.0.13'
1
+ export const version = '4.0.15'
@@ -1,2 +0,0 @@
1
- import{c as at}from"./chunk-VAGPKHHS.js";import{c as st}from"./chunk-SCMIJAAX.js";import{i as Le,n as it,o as lt,p as bn,q as gn,t as ct,x as ut,y as yn}from"./chunk-M4YEAXSR.js";import{a as Be,b as B,c as Ke,d as le,e as ce,f as rt,h as Qe}from"./chunk-EFVAQ2KM.js";import{a as Ue,b as tt,c as ot}from"./chunk-MUK3KYB4.js";import{a as Ve}from"./chunk-XEJ47DLD.js";import{a as je,b as be}from"./chunk-FY3BTKY4.js";var ft=je((Vi,dt)=>{dt.exports=JBrowseExports["@mui/material/SvgIcon"]});var cs=je((ql,jt)=>{jt.exports=JBrowseExports.mobx});var Vn=je((jc,Wo)=>{Wo.exports=JBrowseExports["@jbrowse/core/util/colorBits"]});var Yi=je((Du,lr)=>{lr.exports=JBrowseExports["@jbrowse/render-core/canvas2dUtils"]});var te=be(ft(),1);function Zi(e){let n=t=>Math.round(t*100)/100;return e.map((t,r)=>`${r?"L":"M"}${n(t.x)},${n(t.y)}`).join("")}function pt(e,n,t,r,o){let s=Math.hypot(r-n,t-e);if(s===0)return[t,r];let a=(t-e)/s,i=(r-n)/s;return[t+o*a,r+o*i]}function Ln(e,n){let t=1-n,r=t*t*t,o=3*t*t*n,s=3*t*n*n,a=n*n*n;return{x:r*e.x0+o*e.cx0+s*e.cx1+a*e.x1,y:r*e.y0+o*e.cy0+s*e.cy1+a*e.y1}}function xt(e){let n=e[Math.floor(e.length/2)];return n?Ln(n,.5):void 0}function Mt(e){let n=1/0,t=1/0,r=-1/0,o=-1/0;for(let s of e)n=Math.min(n,s.x0,s.cx0,s.cx1,s.x1),r=Math.max(r,s.x0,s.cx0,s.cx1,s.x1),t=Math.min(t,s.y0,s.cy0,s.cy1,s.y1),o=Math.max(o,s.y0,s.cy0,s.cy1,s.y1);return{minX:n,minY:t,maxX:r,maxY:o}}function hr(e,n,t){let r=Ln(e,n),o=Ln(e,t),s=(t-n)/3,a=ht(e,n),i=ht(e,t);return{x0:r.x,y0:r.y,cx0:r.x+a.x*s,cy0:r.y+a.y*s,cx1:o.x-i.x*s,cy1:o.y-i.y*s,x1:o.x,y1:o.y}}function ht(e,n){let t=1-n,r=3*t*t,o=6*t*n,s=3*n*n;return{x:r*(e.cx0-e.x0)+o*(e.cx1-e.cx0)+s*(e.x1-e.cx1),y:r*(e.cy0-e.y0)+o*(e.cy1-e.cy0)+s*(e.y1-e.cy1)}}function wt(e,n){let t=[];for(let r of e){let o=Math.hypot(r.cx0-r.x0,r.cy0-r.y0)+Math.hypot(r.cx1-r.cx0,r.cy1-r.cy0)+Math.hypot(r.x1-r.cx1,r.y1-r.cy1),s=Math.max(3,Math.round(o/n)|1);for(let a=0;a<s;a+=2)t.push([hr(r,a/s,(a+1)/s)])}return t}function Lt(e,n,t){let r=new Array(e.length);for(let o=0;o<e.length;o++){let s=e[o];r[o]={x0:s.x0+n,y0:s.y0+t,cx0:s.cx0+n,cy0:s.cy0+t,cx1:s.cx1+n,cy1:s.cy1+t,x1:s.x1+n,y1:s.y1+t}}return r}function xn(e,n){let t=e.length-1;return n==="end"?{at:e[t],inward:e[t-1]}:{at:e[0],inward:e[1]}}var mr=.5,br=80;function mt(e){let n=1/0,t=-1/0;for(let r of e)n=Math.min(n,r.x),t=Math.max(t,r.x);return{min:n,max:t}}function bt(e,n){return Math.max(0,n.min-e,e-n.max)}function gt(e,n,t){let r=bt(e[0].x,n),o=bt(e[e.length-1].x,n);return r===o?t:r<o?"start":"end"}function gr(e,n){return{from:gt(e,mt(n),"end"),to:gt(n,mt(e),"start")}}var yr=.75,xr=1.15,Mr=.35,wr=60;function Lr(e,n,t,r,o,s){let a=Math.hypot(t-e,r-n),i=a===0?1:(t-e)/a,l=a===0?0:(r-n)/a,c=0,f=1/0,u=-1/0;for(let m of o){let b=m.x-e,g=m.y-n,y=b*-l+g*i;Math.abs(y)>Math.abs(c)&&(c=y);let w=b*i+g*l;f=Math.min(f,w),u=Math.max(u,w)}let d=o.length?u-f:0,h=Math.max(Math.abs(c)*xr/yr,d*Mr),p=s===void 0?h:Math.min(h,s);return c<0?-p:p}function Ze({scaleX:e,scaleY:n}){return n/e}var Nr=3;function Mn(e,n,t){let r=n.x-e.x,o=(n.y-e.y)*t,s=Math.hypot(r,o);return s===0?void 0:{x:r/s,y:o/s}}function Nt(e,n,t,r,o=Nr){let s=Ze(r),a=Mn(e[e.length-1],n[0],s)??Mn(e[0],e.at(-1),s)??Mn(n[0],n.at(-1),s)??{x:1,y:0},i=[];for(let l=0;l<t;l++){let c=(l-(t-1)/2)*o;i.push({x:-a.y*c,y:a.x*c/s})}return i}function wn(e,n){return e.map(t=>({x:t.x,y:t.y*n}))}function Sr(e,n){for(let t of e)t.y0/=n,t.cy0/=n,t.cy1/=n,t.y1/=n;return e}var Rr=12,Er=40;function yt(e,n){let t=0;for(let s=1;s<e.length;s++)t+=Math.hypot(e[s].x-e[s-1].x,e[s].y-e[s-1].y);let r=t*n;return Math.min(Er,Math.max(Rr,r/2))/Math.max(n,Number.EPSILON)}function St(e){return e.from!==e.to?!1:e.fromStrand&&e.toStrand&&e.fromStrand!==e.toStrand?e.fromStrand==="+"?"end":"start":!0}function Ar(e,n,t,r){let{at:o,inward:s}=e,a=s?o.x-s.x:1,i=s?o.y-s.y:0,l=Math.hypot(a,i)||1,c=a/l,f=i/l,u=o.x+t,d=o.y+r,h=u+c*n/3,p=d+f*n/3,m=u+c*n,b=d+f*n,g=-f*n/2,y=c*n/2;return[{x0:u,y0:d,cx0:h,cy0:p,cx1:m+g,cy1:b+y,x1:m,y1:b},{x0:m,y0:b,cx0:m-g,cy0:b-y,cx1:h,cy1:p,x1:u,y1:d}]}function Oe(e,n,t,r,o,s,a=[],i){let l=s.scaleX,c=Ze(s),f=i??(s.pixelRows?wr:void 0);if(c!==1)return Sr(Oe(wn(e,c),wn(n,c),t,r,o*c,{scaleX:l,scaleY:l},wn(a,c),f===void 0?void 0:f*c),c);if(typeof t=="string")return Ar(xn(e,t),yt(e,l),r,o);let u=t?{from:"end",to:"start"}:gr(e,n),d=xn(e,u.from),h=xn(n,u.to),p=d.at,m=h.at,b=p.x+r,g=p.y+o,y=m.x+r,w=m.y+o;if(t){let N=1,S=0;if(d.inward){let U=p.x-d.inward.x,j=p.y-d.inward.y,V=Math.hypot(U,j);V>0&&(N=U/V,S=j/V)}let R=yt(e,l),x=-S,E=N,C=(p.x+m.x)/2+r+x*R,P=(p.y+m.y)/2+o+E*R,z=b+N*R,W=g+S*R,q=y-N*R,F=w-S*R;return[{x0:b,y0:g,cx0:z,cy0:W,cx1:z+x*R,cy1:W+E*R,x1:C,y1:P},{x0:C,y0:P,cx0:q+x*R,cy0:F+E*R,cx1:q,cy1:F,x1:y,y1:w}]}else{let N=d.inward??{x:p.x-(m.x-p.x),y:p.y-(m.y-p.y)},S=h.inward??{x:m.x-(p.x-m.x),y:m.y-(p.y-m.y)},R=Math.hypot(y-b,w-g),x=(Z,J,se,Te)=>{let ae=J.x-Z.x,ie=J.y-Z.y,ee=Math.hypot(ae,ie),he=ee===0?0:(se*ae+Te*ie)/ee;return Math.max(0,Math.min(R*mr,br,he*.5))},E=m.x-p.x,C=m.y-p.y,[P,z]=pt(N.x,N.y,p.x,p.y,x(N,p,E,C)),[W,q]=pt(S.x,S.y,m.x,m.y,x(S,m,-E,-C)),F=a.length?Lr(b,g,y,w,a,f):0,U=R===0?1:R,j=(y-b)/U,V=(w-g)/U,We=-V*F,v=j*F,D=j*Math.abs(F),K=V*Math.abs(F);return[{x0:b,y0:g,cx0:P+r+We-D,cy0:z+o+v-K,cx1:W+r+We+D,cy1:q+o+v+K,x1:y,y1:w}]}}var Tr=1;function Nn(e,n){return n.flatMap(t=>e[t]??[])}function Rt(e,n,t){let r=e[n.from],o=e[n.to];return r?.length&&o?.length?Oe(r,o,n.from===n.to,0,0,t,Nn(e,n.bypassed)):void 0}function Cr(e){let n=new Map;for(let t of e.nodes)if(B(t)){let r=n.get(t.stable.refName);r?r.push(t):n.set(t.stable.refName,[t])}for(let t of n.values())t.sort((r,o)=>r.stable.start-o.stable.start);return n}function Ir(e,n,t){let r=[];if(e)for(let o=rt(e,n);o<e.length;o++){let s=e[o];if(s.stable.start>=t)break;s.stable.start+s.length<=t&&r.push(s.id)}return r}function _r(e,n,t,r){let{fromStrand:o,toStrand:s}=e;if(o===void 0||s===void 0)return!0;let a=o===(n.stable.strand??"+"),i=s===(t.stable.strand??"+");return r?a&&i:!a&&!i}function tl(e){let n=new Map(e.nodes.map(o=>[o.id,o])),t=Cr(e),r=[];for(let o=0;o<e.edges.length;o++){let s=e.edges[o],a=n.get(s.from),i=n.get(s.to);if(a!==void 0&&i!==void 0&&B(a)&&B(i)&&a.stable.refName===i.stable.refName){let l=a.stable.start<=i.stable.start,[c,f]=l?[a,i]:[i,a],u=c.stable.start+c.length,d=f.stable.start,h=d-u;if(h>=Tr&&_r(s,a,i,l)){let p=c.stable.refName;r.push({edgeIndex:o,from:s.from,to:s.to,refName:p,start:u,end:d,bp:h,bypassed:Ir(t.get(p),u,d)})}}}return r}function Ne(e){return e.endsWith("-")?"-":"+"}function Et(e){return e==="+"?"-":"+"}function vr(e){let n=(e.fromStrand??Ne(e.from))===Ne(e.from)?"end":"start",t=(e.toStrand??Ne(e.to))===Ne(e.to)?"start":"end";return{from:n,to:t}}function sl(e){let n=e.edges.map(vr),t=new Map,r=(d,h,p)=>{let m=`${d}|${h}`,b=t.get(m);b?b.push(p):t.set(m,[p])};e.edges.forEach((d,h)=>{r(d.from,n[h].from,h),r(d.to,n[h].to,h)});let o=d=>{let h=t.get(`${d}|end`);if(h?.length!==1)return;let p=h[0],m=e.edges[p];return m.from===d&&m.to!==d&&n[p].from==="end"&&n[p].to==="start"&&t.get(`${m.to}|start`)?.length===1?p:void 0},s=new Set,a=new Map,i=new Map;for(let d of e.nodes){let h=t.get(`${d.id}|start`),p=h?.length===1?e.edges[h[0]].from:void 0;if(a.has(d.id)||p!==void 0&&o(p)===h[0])continue;let m=[d.id];for(;;){let b=o(m.at(-1)),g=b===void 0?void 0:e.edges[b].to;if(g===void 0||a.has(g))break;s.add(b),m.push(g)}for(let b of m)a.set(b,d.id);m.length>1&&i.set(d.id,m)}for(let d of e.nodes)a.has(d.id)||a.set(d.id,d.id);let l=new Map(e.nodes.map(d=>[d.id,d])),c=[];for(let d of e.nodes){if(a.get(d.id)!==d.id)continue;let h=i.get(d.id);if(!h){c.push(d);continue}let p=h.map(g=>l.get(g)),m=p.filter(B),b=m.length?m.reduce((g,y)=>g.stable.start<=y.stable.start?g:y):p[0];c.push({id:d.id,name:d.name,length:p.reduce((g,y)=>g+y.length,0),depth:d.depth,stable:b.stable})}let f=new Set,u=[];return e.edges.forEach((d,h)=>{let p=a.get(d.from),m=a.get(d.to),b=n[h],g=`${p}|${b.from}>${m}|${b.to}`;s.has(h)||f.has(g)||(f.add(g),u.push({from:p,to:m,...b.from==="start"?{fromStrand:Et(Ne(p))}:{},...b.to==="end"?{toStrand:Et(Ne(m))}:{}}))}),{graph:{...e,nodes:c,edges:u,paths:void 0,pathVisits:void 0},runs:i}}function al(e,n,t){let r={...e};for(let[o,s]of n){let a=e[o];if(!a?.length)continue;delete r[o];let i=Rn(a),l=i.at(-1),c=s.map(d=>Math.max(t(d),0)),f=c.reduce((d,h)=>d+h,0)||s.length,u=0;s.forEach((d,h)=>{let p=f?c[h]/f*l:l/s.length,m=h===s.length-1?l:u+p;r[d]=Tt(a,i,u,m),u=m})}return r}function il(e,n,t){if(e.length===0)return[];let r=Rn(e),o=r.at(-1);return Tt(e,r,n*o,t*o)}function At(e){let n=Rn(e);return Sn(e,n,n.at(-1)/2)}function Rn(e){let n=[0];for(let t=1;t<e.length;t++)n.push(n[t-1]+Math.hypot(e[t].x-e[t-1].x,e[t].y-e[t-1].y));return n}function Sn(e,n,t){if(t<=0)return{...e[0]};let r=1;for(;r<n.length&&n[r]<t;)r++;if(r>=n.length)return{...e.at(-1)};let o=n[r]-n[r-1],s=o>0?(t-n[r-1])/o:0,a=e[r-1],i=e[r];return{x:a.x+(i.x-a.x)*s,y:a.y+(i.y-a.y)*s}}function Tt(e,n,t,r){let o=[Sn(e,n,t)];for(let s=0;s<e.length;s++)n[s]>t&&n[s]<r&&o.push({...e[s]});return o.push(Sn(e,n,r)),o}function En(e){return e.length*6.2+8}function Br(e,n){return e.x0<n.x1&&e.x1>n.x0&&e.y0<n.y1&&e.y1>n.y0}function Ct(e,n){return e.x1<=0||e.x0>=n.width||e.y1<=0||e.y0>=n.height}function Or(e,n){return e.x0>=0&&e.x1<=n.width&&e.y0>=0&&e.y1<=n.height}function An(e,n=[]){let t=[...n];return r=>Ct(r,e)||t.some(o=>Br(o,r))?!1:(t.push(r),!0)}function Pe(e,n,t){let r=[];for(let s of e){let a=En(s.text),i=s.y>n.height/2?-1:1;for(let l=0;l<=(s.stack??0);l++){let c=s.y+i*l*19,f={x0:s.x-a/2,x1:s.x+a/2,y0:c-11-4,y1:c+4};if(Ct(f,n))break;if(Or(f,n)&&t(f)){r.push({...s,y:c,w:a});break}}}return r}var Pr=26,Gr=4e4,Dr=8,$r=8,qr=5.7,Fr=6,Hr=13,Ge=3,Je=2;function tn(e){return(e.length*qr+Fr+Ge)/2}var ue=(Hr+Ge)/2,Wr=tn("1 bp");function en(e,n,t){return{x0:n-e,x1:n+e,y0:t-ue,y1:t+ue}}function Bt(e,n){return{x0:6,x1:6+e.length*6.2+8+Ge,y0:n-8-Ge/2,y1:n+8+Ge/2}}function nn(e,n,t){return t<n?e:Math.min(Math.max(e,n),t)}function on(e){return e>=1e6?`${+(e/1e6).toFixed(1)} Mb`:e>=1e3?`${+(e/1e3).toFixed(1)} kb`:`${e} bp`}function It(e){return`${on(e)} del`}function Xr(e,n,t,r){let o=e[0],s=e[e.length-1],a=(n.x-(o.x0+s.x1)/2)*t,i=(n.y-(o.y0+s.y1)/2)*r,l=Math.hypot(a,i);return l===0?{x:0,y:-1}:{x:a/l,y:i/l}}function Yr(e,n){return Math.abs(n.x)*(e.x1-e.x0)/2+Math.abs(n.y)*(e.y1-e.y0)/2}function kr(e,n){let t=(e.x1-e.x0)/2,r=(e.y1-e.y0)/2;return Math.min(n.x===0?1/0:t/Math.abs(n.x),n.y===0?1/0:r/Math.abs(n.y))}function zr(e,n,t){let r=0;for(let o=1;o<e.length;o++){let s=e[o-1],a=e[o];r+=Math.hypot((a.x-s.x)*n,(a.y-s.y)*t)}return r}function jr(e,n){let t=1/0,r=1/0,o=-1/0,s=-1/0;for(let a of e)for(let i of n[a]??[])t=Math.min(t,i.x),o=Math.max(o,i.x),r=Math.min(r,i.y),s=Math.max(s,i.y);return t===1/0?void 0:{minX:t,minY:r,maxX:o,maxY:s}}var _t=new WeakMap;function Vr(e,n){let t=_t.get(e);if(t?.nodeLengths===n)return t.order;let r=Object.entries(e).filter(([o,s])=>s.length>0&&n.has(o)).sort(([o],[s])=>n.get(s)-n.get(o));return _t.set(e,{nodeLengths:n,order:r}),r}var vt=new WeakMap;function Ur(e,n,t,r){let{scaleX:o,scaleY:s}=t,a=vt.get(e);if(a?.deletions===n&&a.scaleX===o&&a.scaleY===s&&a.version===r)return a.arcs;let i=[];for(let l of[...n].sort((c,f)=>f.bp-c.bp)){let c=Rt(e,l,t),f=c?xt(c):void 0;if(c&&f){let{minX:u,minY:d,maxX:h,maxY:p}=Mt(c);i.push({deletion:l,curves:c,apex:f,extent:Math.max((h-u)*o,(p-d)*s)})}}return vt.set(e,{deletions:n,scaleX:o,scaleY:s,version:r,arcs:i}),i}function Ot({nodePositions:e,nodeLengths:n,deletions:t,alleleDeletions:r,axis:o,translateX:s,translateY:a,width:i,height:l,version:c=0}){let{scaleX:f,scaleY:u}=o,d=[],h=[];for(let{deletion:b,curves:g,apex:y,extent:w}of Ur(e,t,o,c))if(w>=Pr){let N=It(b.bp),S=tn(N),R=en(S,0,0),x=y.x*f+s,E=y.y*u+a,C=w>=S*2/Je,P=Xr(g,y,f,u),z=Yr(R,P)+$r,W=C?x:nn(x+P.x*z,S,i-S),q=C?E:nn(E+P.y*z,ue,l-ue),F=Math.hypot(W-x,q-E),U;if(F>0){let j={x:(W-x)/F,y:(q-E)/F},V=kr(R,j);U={arcX:x,arcY:E,labelX:W-j.x*V,labelY:q-j.y*V}}d.push({label:{key:`del:${b.edgeIndex}`,text:N,x:W,y:q,kind:"deletion",leader:U},box:en(S,W,q)})}let p=new Set,m=[...r??[]].sort((b,g)=>g.bp-b.bp);for(let b of m){let g=jr(b.nodeIds,e);if(!g)continue;let y=Math.max(g.minX*f+s,0),w=Math.min(g.maxX*f+s,i),N=Math.max(g.minY*u+a,0),S=Math.min(g.maxY*u+a,l);if(w<y||S<N)continue;let R=Math.max(w-y,S-N),x=It(b.bp),E=tn(x);if(R>=E*2/Je){for(let z of b.nodeIds)p.add(z);let C=nn((y+w)/2,E,i-E),P=nn((N+S)/2,ue,l-ue);d.push({label:{key:`alleledel:${b.nodeIds.join(",")}`,text:x,x:C,y:P,kind:"deletion"},box:en(E,C,P)})}}for(let[b,g]of Vr(e,n)){if(p.has(b))continue;let{x:y,y:w}=At(g),N=w*u+a;if(N+ue<=0||N-ue>=l)continue;let S=zr(g,f,u);if(S<Wr*2/Je)continue;let R=on(n.get(b)),x=tn(R);if(S>=x*2/Je){let E=y*f+s;h.push({label:{key:`node:${b}`,text:R,x:E,y:N,kind:"node"},box:en(x,E,N)})}}return{deletions:d,nodes:h}}function Pt(e,n){return Math.max(Dr,Math.floor(e*n/Gr))}function Tn(e,n,t=1/0){let r=[];for(let{label:o,box:s}of e){if(r.length>=t)break;n(s)&&r.push(o)}return r}var Qr=3.4,Gt=6,Zr=8,Jr=18,es=2,ns=60,ts=8,Dt=15;function Cn(e,n){return[...e].sort((t,r)=>n(r)-n(t))}function gl(e){let{paneWidth:n,canvasHeight:t,translateX:r,translateY:o}=e,{scaleX:s,scaleY:a}=e.axisScale,i={width:n,height:t},l=x=>({x:x.x*s+r,y:x.y*a+o}),c=e.drawnRowLabels.map(({label:x,y:E})=>Bt(x,E*a+o));e.legendSize.width>0&&c.push({x0:n-Gt-e.legendSize.width,x1:n,y0:0,y1:Gt+e.legendSize.height}),e.poppedFrom&&c.push({x0:0,x1:60+e.poppedFrom.label.length*6.2*1.2,y0:0,y1:44});let f=An(i,c),u=e.drawnRowLabels.length>0,d=u?Math.min(...e.drawnRowLabels.map(x=>x.y)):1/0,h=e.contigThickness*Qr,p=Cn(e.bubbleHalos,x=>x.members),m=Pe(p.map(x=>{let{x:E,y:C}=l({x:x.labelAt.x,y:Math.min(x.labelAt.y,d)}),P=C-h/2-6;return{item:x,x:E,y:u?Math.max(P,Dt):P,text:x.label}}),i,f),b=Math.max(2,Math.min(ts,Math.floor((o-ns)/19))),g=Pe(Cn(e.bubbleGlyphs,x=>x.bubble.end-x.bubble.start).flatMap(x=>{let E=(x.bubble.start+x.bubble.end)/2*s+r,C=En(x.label)/2;return E<0||E>n?[]:[{item:{glyph:x,glyphX:E},x:Math.min(Math.max(E,C),n-C),y:Dt,text:x.label,stack:b-1}]}),i,f),y=Pe(Cn(e.genePins,x=>x.gene.end-x.gene.start).map(x=>{let{x:E,y:C}=l(x.at);return{item:x,x:E,y:C+e.contigThickness+Jr,text:x.covered<.98?`${x.gene.name} \u2026`:x.gene.name,stack:es}}),i,f),w=e.nodePositions&&e.labelsNodeSizes?Ot({nodePositions:e.nodePositions,nodeLengths:e.nodeLengths,deletions:e.showDeletionEdges?e.deletions:[],alleleDeletions:e.alleleDeletions,axis:e.axisScale,translateX:r,translateY:o,width:n,height:t,version:e.positionsVersion}):{deletions:[],nodes:[]},N=Tn(w.deletions,f),S=Pe(p.flatMap(x=>x.routes.map(E=>{let{x:C,y:P}=l(E.at);return{item:{halo:x,route:E},x:C,y:P+4,text:E.text,stack:Zr}})),i,f),R=Tn(w.nodes,f,Pt(n,t));return{bubbles:m,glyphs:g,genes:y,routes:S,sizes:[...N,...R]}}function wl(e){return Be(e)?Ft(e):void 0}function Ft(e){return{sample:Ue(e.stable.refName),haplotype:tt(e.stable.refName),refName:ot(e.stable.refName),start:e.stable.start,end:e.stable.start+e.length}}function os(e,n){let t=[...e].sort((s,a)=>s.start-a.start),r,o;for(let s of t)o=o&&s.start-o.end<=n?{start:o.start,end:Math.max(o.end,s.end)}:{start:s.start,end:s.end},(!r||o.end-o.start>r.end-r.start)&&(r=o);return r}function rs(e){return`${e.haplotype??e.sample}\0${e.refName}`}function Ll(e,{maxGap:n=1/0}={}){let t=new Map;for(let o of e.nodes)if(Be(o)){let s=Ft(o),a=rs(s),i=t.get(a);i?(i.spans.push({start:s.start,end:s.end}),i.rank=Math.min(i.rank,o.stable.rank)):t.set(a,{sample:s.sample,haplotype:s.haplotype,refName:s.refName,rank:o.stable.rank,spans:[{start:s.start,end:s.end}]})}let r=new Map;for(let o of t.values()){let s=os(o.spans,n);if(s){let a={sample:o.sample,haplotype:o.haplotype,refName:o.refName,start:s.start,end:s.end,rank:o.rank,nodeCount:o.spans.length},i=o.haplotype??o.sample,l=r.get(i);(!l||a.nodeCount>l.nodeCount)&&r.set(i,a)}}return[...r.values()].sort((o,s)=>+(o.rank!==0)-+(s.rank!==0)||o.sample.localeCompare(s.sample)||(o.haplotype??"").localeCompare(s.haplotype??""))}function ss(e,n){return(n.haplotype===void 0?void 0:e(n.haplotype))??e(n.sample)}function Nl(e,n){return e.flatMap(t=>{let r=ss(n,t);return r===void 0?[]:[{...t,sample:r}]})}function Sl(e){return`${e.refName}:${e.start+1}-${e.end}`}function In(e){return`${e.refName}:${(e.start+1).toLocaleString()}-${e.end.toLocaleString()}`}var Ht=be(Ve(),1),Wt=(0,te.createSvgIcon)((0,Ht.jsx)("path",{d:"M9.01 14H2v2h7.01v3L13 15l-3.99-4zm5.98-1v-3H22V8h-7.01V5L11 9z"}),"CompareArrows");var Xt=be(Ve(),1),Yt=(0,te.createSvgIcon)((0,Xt.jsx)("path",{d:"M17 5h-2V3h2zm-2 16h2v-2.59L19.59 21 21 19.59 18.41 17H21v-2h-6zm4-12h2V7h-2zm0 4h2v-2h-2zm-8 8h2v-2h-2zM7 5h2V3H7zM3 17h2v-2H3zm2 4v-2H3c0 1.1.9 2 2 2M19 3v2h2c0-1.1-.9-2-2-2m-8 2h2V3h-2zM3 9h2V7H3zm4 12h2v-2H7zm-4-8h2v-2H3zm0-8h2V3c-1.1 0-2 .9-2 2"}),"HighlightAlt");var kt=be(Ve(),1),_n=(0,te.createSvgIcon)((0,kt.jsx)("path",{d:"M3 16h5v-2H3zm6.5 0h5v-2h-5zm6.5 0h5v-2h-5zM3 20h2v-2H3zm4 0h2v-2H7zm4 0h2v-2h-2zm4 0h2v-2h-2zm4 0h2v-2h-2zM3 12h8v-2H3zm10 0h8v-2h-8zM3 4v4h18V4z"}),"LineStyle");var as="Linear genome view",is="Linear synteny view",ls="No synteny track in this session aligns these assemblies";function zt({label:e,icon:n,entries:t,entryLabel:r,onSelect:o,disabledHelpText:s,nameTheOnlyEntry:a=!0}){let[i]=t,l=s?[{label:e,icon:n,disabled:!0,disabledHelpText:s,onClick:()=>{}}]:[];return t.length===0?l:t.length===1&&i?[{label:a?`${e} \u2014 ${r(i)}`:e,icon:n,onClick:o(i)}]:[{label:e,icon:n,type:"subMenu",subMenu:t.map(c=>({label:r(c),onClick:o(c)}))}]}function Gl({contributors:e,syntenyTracks:n,onShowLinear:t,onShowSynteny:r}){let o=n[0]?.coverage??e.length;return[...zt({label:as,icon:_n,entries:e,entryLabel:s=>`${s.sample} ${In(s)}`,onSelect:s=>()=>{t({location:s,assembly:s.sample})}}),...e.length>=2?zt({label:`${is} (${o} assemblies)`,icon:Wt,entries:n,entryLabel:s=>s.coverage<o?`${s.name} (${s.coverage} of ${o})`:s.name,nameTheOnlyEntry:!1,disabledHelpText:ls,onSelect:s=>()=>{r(s.trackId)}}):[]]}function Dl({own:e,reference:n,highlight:t,onShowLinear:r,onHighlight:o}){let s=[e?{label:`Open in ${e.assembly} \u2014 ${In(e.location)}`,target:e}:void 0,n&&n.assembly!==e?.assembly?{label:`Open in ${n.assembly} \u2014 around this node`,target:n}:void 0].filter(a=>a!==void 0);return[...o&&t?[{label:`Highlight in ${t.assembly}`,icon:Yt,onClick:()=>{o(t)}}]:[],...s.map(({label:a,target:i})=>({label:a,icon:_n,onClick:()=>{r(i)}}))]}var us=10;function ds(e,n){let t=e.end-e.start,r=e.longestAlleleLength-e.shortestAlleleLength;return n.find(o=>r<=us*(o.end-o.start)&&(t===0?o.start<=e.start&&e.start<=o.end:Math.min(e.end,o.end)-Math.max(e.start,o.start)>=t/2))}var fs=40;function ge(e){return e>=1e4?`${(e/1e3).toFixed(0)} kb`:e>=1e3?`${(e/1e3).toFixed(1)} kb`:`${e} bp`}function ps(e,n){let t=ge(e),r=ge(n),o=r.slice(r.indexOf(" "));return t.endsWith(o)?`${t.slice(0,-o.length)}\u2013${r}`:`${t}\u2013${r}`}function Vt(e){return e>=at?"\u22652.1B routes":e>=1e5?`${(e/1e3).toFixed(0)}k routes`:`${e} routes`}function Hl(e,n=[]){let t=hs(e,n);return e.partial?{...t,label:`${t.label}, partial`}:t}function hs(e,n){let t=e.end-e.start,{shortestAlleleLength:r,longestAlleleLength:o,pathCount:s,segmentCount:a,inversion:i}=e,l=ps(r,o);if(a>=fs)return{kind:"superbubble",label:`${l} superbubble, ${a} segments, ${Vt(s)}${i?", inv":""}`};if(i)return{kind:"inversion",label:`${ge(o)} inv`};let c=o!==r?ds(e,n):void 0;if(c){let u=c.name?` (${c.name})`:"";return{kind:"repeat",label:`${l} repeat array${u}, ${Vt(s)}`}}let f=s>2?`, ${s} alleles`:"";return r===o&&r===t?t<=1?{kind:"snp",label:"SNP"}:{kind:"substitution",label:`${ge(t)} sub`}:t===0||r===t?{kind:"insertion",label:`\u2264${ge(o-t)} ins${f}`}:o===t?{kind:"deletion",label:`${ge(t-r)} del${f}`}:{kind:"complex",label:`${ge(t)} ref \u2192 ${l}, ${s} alleles`}}var Wl={snp:"#5b6b7a",substitution:"#5b6b7a",insertion:"#2f8fd6",deletion:"#c94040",inversion:"#e07b00",repeat:"#8e3fbf",superbubble:"#8e3fbf",complex:"#8e3fbf"},Xl={snp:"SNP",substitution:"substitution",insertion:"insertion",deletion:"deletion",inversion:"inversion",repeat:"repeat array",superbubble:"superbubble",complex:"site"};function Yl(e){return e.segments.split(",").filter(Boolean)}var ms=4;function De(e){let n=new Map;function t(r,o){let s=n.get(r);s?s.push(o):n.set(r,[o])}for(let r of e.edges)t(r.from,r.to),t(r.to,r.from);return n}function bs({nodeId:e,nodeById:n,neighbors:t}){let r=new Set([e]),o=[e],s=1/0,a=-1/0;for(let i=0;i<ms&&o.length>0;i++){let l=[];for(let c of o){let f=t.get(c);if(f){for(let u of f)if(!r.has(u)){r.add(u);let d=n.get(u);d&&B(d)?(s=Math.min(s,d.stable.start+d.length),a=Math.max(a,d.stable.start)):l.push(u)}}}o=l}return s===1/0?void 0:{start:Math.min(s,a),end:Math.max(s,a)}}function gs({nodeId:e,nodeById:n,neighbors:t}){let r=n.get(e);return r===void 0?void 0:B(r)?{start:r.stable.start,end:r.stable.start+r.length}:bs({nodeId:e,nodeById:n,neighbors:t})}function Ut(e){let n=new Map(e.nodes.map(o=>[o.id,o])),t=De(e),r=new Map;for(let o of e.nodes){let s=gs({nodeId:o.id,nodeById:n,neighbors:t});s&&r.set(o.id,(s.start+s.end)/2)}return r}function rn(e){let n=e.split("#"),t=n.length>=2?Number(n[1]):Number.NaN;return{sample:n[0]??e,haplotype:Number.isFinite(t)?t:void 0}}function ys(e,n,t,r){let o=[],s=[],a=[e];for(r.add(e);a.length>0;){let i=a.pop(),l=n.get(i);if(l){o.push(l);for(let c of t.get(i)??[]){let f=n.get(c);f&&(f.stable.rank===0?s.push(f):r.has(c)||(r.add(c),a.push(c)))}}}return{members:o,anchors:s}}function xs(e){if(new Set(e.map(i=>i.stable.refName)).size!==1||e.length<2)return;let t=[...e].sort((i,l)=>i.stable.start-l.stable.start),r=t[0],o=t.at(-1),s=r.stable.start+r.length,a=o.stable.start;return a>=s?{start:s,end:a,entry:r}:void 0}function Ms(e,n,t){let r=new Map(e.map(a=>[a.id,a])),o=new Map,s=[];for(let a of t.get(n.id)??[])r.has(a)&&(o.set(a,0),s.push(a));if(s.length===0)for(let a of e)o.set(a.id,0),s.push(a.id);for(let a of s){let i=o.get(a)+r.get(a).length;for(let l of t.get(a)??[])if(r.has(l)){let c=o.get(l);(c===void 0||i<c)&&(o.set(l,i),s.push(l))}}return o}function ws(e,n,t){let r=Ms(e,n,t),o=[...e].sort((l,c)=>r.get(l.id)-r.get(c.id)),s=new Map(o.map((l,c)=>[l.id,c])),a=new Map(e.map(l=>[l.id,l])),i=new Map;for(let[l,c]of o.entries()){let f=0;for(let u of t.get(c.id)??[]){let d=a.get(u);d&&s.get(u)<l&&(f=Math.max(f,i.get(u)+d.length))}i.set(c.id,f)}return{offsets:i,ordered:o}}function Qt(e){let n=new Map(e.nodes.filter(Be).map(s=>[s.id,s])),t=De(e),r=new Set,o=[];for(let s of n.values())if(s.stable.rank!==0&&!r.has(s.id)){let{members:a,anchors:i}=ys(s.id,n,t,r),l=xs(i);if(l){let{offsets:c,ordered:f}=ws(a,l.entry,t);o.push({start:l.start,refSpan:l.end-l.start,nodeIds:f.map(u=>u.id),nodeOffsets:f.map(u=>c.get(u.id)),pathLength:f.reduce((u,d)=>Math.max(u,c.get(d.id)+d.length),0)})}}return o.sort((s,a)=>s.start-a.start)}var Ls=1,Ns=.015;function sn({graph:e,span:n,rowY:t,positions:r}){let o=n*Ns,s=Qt(e),a=new Map(e.nodes.map(f=>[f.id,f])),i=[];for(let f of s){let u=f.refSpan-f.pathLength;u>=Ls&&i.push({nodeIds:f.nodeIds,bp:u});let d=Math.max(f.refSpan,o),h=f.pathLength>0?d/f.pathLength:0;f.nodeIds.forEach((p,m)=>{let b=a.get(p);if(b){let g=f.nodeOffsets[m],y=d/f.nodeIds.length,w=S=>f.start+S*h,N=t(b);r[p]=h?[{x:w(g),y:N},{x:w(g+b.length),y:N}]:[{x:f.start+m*y,y:N},{x:f.start+(m+1)*y,y:N}]}})}let l=De(e),c=Object.keys(r);for(let f of c){let u=r[f].at(-1).x;for(let d of l.get(f)??[]){let h=a.get(d);if(h&&!(d in r)){let p=t(h);r[d]=[{x:u,y:p},{x:u+o,y:p}],c.push(d)}}}return i}function Ss(e){let n=new Set;for(let t of e.nodes)t.stable&&n.add(t.stable.rank);return new Map([...n].sort((t,r)=>t-r).map((t,r)=>[t,r]))}function Zt(e,n){let t=le(e);if(t.length===0)return;let r=Qe(t,n),o=Ss(e),s=ce(t),a=sn({graph:e,span:r,rowY:l=>(l.stable?o.get(l.stable.rank)??o.size:o.size)*20,positions:s}),i=[...o].map(([l,c])=>({label:l===0?"Reference (rank 0)":`Rank ${l}`,y:c*20}));return{nodePositions:s,rowLabels:i,referenceAxis:!0,pixelRows:!0,alleleDeletions:a}}var Rs=12,vn=20;function Jt(e){return 10+8*Math.log2(1+e.length)}function de(e,n){return e<n?-1:e>n?1:0}function no(e,n){return de(e.at,n.at)||de(e.side,n.side)||de(e.hops,n.hops)}var eo={at:1/0,side:0,hops:0};function Es(e){let n=new Map(e.nodes.map(r=>[r.id,r])),t=Cs(e);return e.nodes.map(r=>r.id).sort((r,o)=>no(t.get(r)??eo,t.get(o)??eo)||de(n.get(r).name,n.get(o).name)||de(r,o))}function As(e,n){let t=new Set(e.nodes.map(f=>f.id)),r=new Map(n.map(f=>[f.id,f.stable.start])),o=new Map,s=new Map;n.forEach((f,u)=>{s.set(f.id,n[u-1]?.id),o.set(f.id,n[u+1]?.id)});let a=n[0]?.id,i=(f,u)=>{let d=o.get(f);o.set(f,u),s.set(u,f),o.set(u,d),d!==void 0&&s.set(d,u)},l=(f,u)=>{let d=s.get(f);d===void 0?(a=u,s.set(u,void 0),o.set(u,f),s.set(f,u)):i(d,u)};for(let f of e.paths??[]){let u=0,d=0,h;for(let g of f.nodeIds){let y=r.get(g);y!==void 0&&(h!==void 0&&y!==h&&(y>h?u++:d++),h=y)}let p=d>u?[...f.nodeIds].reverse():f.nodeIds,m,b=new Set;for(let g of p)if(o.has(g)){if(m===void 0)for(let y of b)l(g,y);m=g}else t.has(g)&&(m===void 0?b.add(g):(i(m,g),m=g))}let c=[];for(let f=a;f!==void 0;f=o.get(f))c.push(f);return c}function Ts(e,n){let t=[...n.entries()].sort(([a,i],[l,c])=>no(i,c)||de(a,l)).map(([a])=>a),r=t.length;for(let a of t){let i=n.get(a);for(let l of e.get(a)??[])n.has(l)||(n.set(l,{at:i.at,side:1,hops:i.hops+1}),t.push(l))}let o=new Set(t.slice(r)),s=new Set;for(let a of o){if(s.has(a))continue;let{at:i}=n.get(a),l=[a];s.add(a);let c=!0;for(let f of l){let{hops:u}=n.get(f),d=!0,h=!1;for(let p of e.get(f)??[]){let m=n.get(p);m.at===i&&o.has(p)?(d&&=m.hops<=u,s.has(p)||(s.add(p),l.push(p))):m.at!==i&&(h||=m.at<i,c&&=m.at<i)}c&&=!d||h}if(c)for(let f of l){let u=n.get(f);n.set(f,{...u,side:-1,hops:-u.hops})}}}function Cs(e){let n=new Set(e.nodes.map(s=>s.id)),t=new Map;for(let s of e.edges)!n.has(s.from)||!n.has(s.to)||((t.get(s.from)??t.set(s.from,[]).get(s.from)).push(s.to),(t.get(s.to)??t.set(s.to,[]).get(s.to)).push(s.from));let r=e.nodes.filter(B).sort((s,a)=>de(s.stable.start,a.stable.start)||de(s.name,a.name)),o=new Map;return As(e,r).forEach((s,a)=>{o.set(s,{at:a,side:0,hops:0})}),Ts(t,o),o}function Is(e){let n=new Map(e.nodes.map(u=>[u.id,u])),t=Es(e),r=new Map(t.map((u,d)=>[u,d])),o=u=>B(n.get(u)),s=new Map(t.map(u=>[u,[]])),a=new Map(t.map(u=>[u,[]])),i=(u,d)=>{s.get(d).push(u),a.get(u).push(d)};for(let u of e.edges)u.from===u.to||!r.has(u.from)||!r.has(u.to)||(r.get(u.from)<r.get(u.to)?i(u.from,u.to):i(u.to,u.from));let l=t.filter(o);for(let u=1;u<l.length;u++)i(l[u-1],l[u]);let c=new Map;for(let u of t){let d=0;for(let h of s.get(u))d=Math.max(d,c.get(h)+1);c.set(u,d)}for(let u=t.length-1;u>=0;u--){let d=t[u],h=a.get(d);if(o(d)||h.length===0)continue;let p=1/0;for(let g of h)p=Math.min(p,c.get(g));let m=c.get(d),b=Math.max(m,p-1);c.set(d,Math.floor((m+b)/2))}let f=[];for(let u of t)(f[c.get(u)]??=[]).push(u);return{layers:f,layerOf:c,preds:s}}function to(e){if(!e.nodes.some(B))return;let n=new Map(e.nodes.map(u=>[u.id,u])),t=u=>B(n.get(u)),{layers:r,layerOf:o,preds:s}=Is(e),a=r.map(u=>{let d=0;for(let h of u)d=Math.max(d,Jt(n.get(h)));return d}),i=[],l=0;for(let u=0;u<r.length;u++)i[u]=l,l+=a[u]+Rs;let c=new Map;for(let u of r){let d=[];for(let p of u){if(t(p)){c.set(p,0);continue}let m=s.get(p).filter(g=>c.has(g)),b=0;for(let g of m)b+=c.get(g)/m.length;d.push({id:p,ideal:b===0?vn:b})}d.sort((p,m)=>p.ideal-m.ideal);let h=new Set([0]);for(let{id:p,ideal:m}of d){let b=Math.round(m/vn);b===0&&(b=m>=0?1:-1);for(let g=1;h.has(b);g++)h.has(b+g)?h.has(b-g)||(b-=g):b+=g;h.add(b),c.set(p,b*vn)}}let f={};for(let u of e.nodes){let d=o.get(u.id),h=Jt(u),p=i[d]+a[d]/2,m=c.get(u.id);f[u.id]=[{x:p-h/2,y:m},{x:p+h/2,y:m}]}return{nodePositions:f,referenceAxis:!1,pixelRows:!0}}function _s(e,n){let t=new Map;for(let o of e.nodes)if(Ke(o)){let{sample:s}=rn(o.stable.refName);t.set(s,(t.get(s)??0)+o.length)}let r=new Map(n.map((o,s)=>[o,s]));return[...t.keys()].sort((o,s)=>(r.get(o)??1/0)-(r.get(s)??1/0)||t.get(s)-t.get(o)||o.localeCompare(s))}function oo(e,n,t=[]){let r=le(e),o=_s(e,t);if(r.length===0||o.length===0)return;let s=Qe(r,n),a=new Map(o.map((d,h)=>[d,h+1])),i=ce(r),l=o.length+1,c=sn({graph:e,span:s,rowY:d=>{let h=d.stable;return((h?a.get(rn(h.refName).sample):void 0)??l)*20},positions:i}),u=[{label:rn(r[0].stable.refName).sample,y:0},...o.map(d=>({label:d,y:a.get(d)*20}))];return{nodePositions:i,rowLabels:u,sampleRows:o,referenceAxis:!0,pixelRows:!0,alleleDeletions:c}}function Bn(){return{rectangles:[],curves:[],corners:[],verticalRectangles:[],featureRectangles:[]}}var Fe=!1,ro=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f"];function wo(e){return{mergeNodesFlag:e.mergeNodes??!0,showReads:e.showReads??!0,coarsenedReadView:e.coarsenedReadView??!1,ignoreStrand:e.ignoreStrand??!1,nodeWidthOption:e.nodeWidthOption??"normal",charWidth:e.charWidth??8.401,trackWidth:e.trackWidth??15,mappingQualityCutoff:e.mappingQualityCutoff??0,focusReadNames:e.focusReadNames??null,showExonsFlag:e.showExons??!1,trackColor:e.trackColor??(n=>ro[n.id%ro.length]),trackAlpha:e.trackAlpha??(()=>1)}}var _=wo({}),$n=null,M=[],L=[],A=[],I=new Map,Ee=[],T=[],ye=[],Fn=[],Hn=[],Q=-1,G=Bn(),qn={minX:0,maxX:0,minY:0,maxY:0},$e,an=new Map;function Lo(e,n,t=[],r={}){if(_=wo(r),$n=r.bed??null,G=Bn(),ye=[],Fn=[],Hn=[],Ee=[],qn={minX:0,maxX:0,minY:0,maxY:0},$e=void 0,an=new Map,e.length===0||n.length===0)return;let o=On(e);M=[],o.forEach((l,c)=>{M[c+1]=l}),L=On(n);let s=t.length>0;A=On(ya(t));for(let l=L.length-1;l>=0;l-=1){let c=L[l];if(c.type===void 0&&(c.type="haplotype"),c.hidden===!0){L.splice(l,1);continue}c.indexOfFirstBase!==void 0&&($e=c.name)}if(L.length===0)return;Bs(0),I=io(),Se(L),_.showReads&&A.length>0&&Se(A),Mo(),_.mergeNodesFlag&&(lo(),Gn(),_.showReads&&A.length>0&&Pn(),ga(),I=io(),Mo(),Se(L),_.showReads&&A.length>0&&Se(A)),lo(),ea(),Fe&&console.log(`${M.length} nodes.`),Gn(),Q=uo(),na(),Gn(),Q=uo();let a=_.showReads&&_.coarsenedReadView&&!s;if(a){let l=$e===void 0?-1:L.findIndex(u=>u.name===$e),c=l===-1?0:l,f=L.filter((u,d)=>d!==c);if(f.length>0){let u=bo(f,"haplotype");u.length>0&&(L=[L[c]],A=u)}}da(),sa(),_.showExonsFlag&&$n!==null&&ua();let i=_.showReads&&_.coarsenedReadView&&A.length>0&&!a;return _.showReads&&A.length>0?(Os(),Pn(),Se(A),i&&(A=bo(A,"read"),Pn(),Se(A)),Gs(),L=L.concat(A)):M.forEach(l=>{l&&(l.incomingReads=[],l.outgoingReads=[],l.internalReads=[])}),oa(),ha(),Fe&&(console.log("Tracks:"),console.log(L),console.log("Nodes:"),console.log(M),console.log("Lane assignment:"),console.log(ye)),Vs(),{nodes:M,tracks:L,reads:A,nodeMap:I,shapes:G,bounds:qn,maxOrder:Q,trackForRuler:$e,coarsenedEdgeMeta:an}}function Re(e,n="plain"){return _.trackColor(e,n)}function vs(e){return _.trackAlpha(e)}function On(e){return structuredClone(e)}function X(e){let n=String(e);return n.length>=1&&n.startsWith("-")}function O(e){return X(e)?String(e).substring(1):e}function fe(e){return X(e)?e:`-${e}`}function No(e){return X(e)?O(e):fe(e)}function ln(e){return(e||1/e)>=0}function Bs(e){let n=new Set,t=L[e].sequence;for(let r=0;r<t.length;r+=1){let o=t[r];if(X(o)){let s=O(o),a=t.indexOf(s);(a===-1||a>r)&&n.add(s)}}for(let r of L){t=r.sequence;for(let o=0;o<t.length;o+=1){let s=t[o];X(s)?n.has(O(s))&&(t[o]=O(s)):n.has(s)&&(t[o]=fe(s))}}M.forEach(r=>{r&&n.has(r.name)&&(r.seq=r.seq.split("").reverse().join(""))})}function Os(){Ee=[];for(let n=0;n<=Q;n+=1)Ee[n]=[];let e=new Map;M.forEach(n=>{n.y!==void 0&&so(e,n.order,n.y+n.contentHeight)}),L.forEach(n=>{n.type==="haplotype"&&n.path.forEach(t=>{so(e,t.order,(t.y??0)+n.width)})}),M.forEach((n,t)=>{n.order>=0&&n.y===void 0&&(n.y=(e.get(n.order)??0)+25,n.contentHeight=0,Ee[n.order].push(t))})}function so(e,n,t){let r=e.get(n);r===void 0?e.set(n,t):e.set(n,Math.max(r,t))}var cn=7;function Ps(){M.forEach(e=>{e&&(e.incomingReads=[],e.outgoingReads=[],e.internalReads=[])}),A.forEach((e,n)=>{if((e.width===void 0||e.width===0)&&(e.width=cn),e.path.length===1){let t=e.path[0].node;t!==null&&M[t].internalReads.push(n)}else e.path.forEach((t,r)=>{if(r===0){let o=e.path[0].node;o!==null&&M[o].outgoingReads.push([n,r])}else{let o=t.node;o!==null&&M[o].incomingReads.push([n,r])}})})}function Gs(){Ys(),Ps();let e=M.slice();e.sort(un);let n=new Map;for(let a=0;a<A.length;a++){let i=A[a].sourceTrackID,l=n.get(i);l===void 0?n.set(i,[a]):l.push(a)}let t=Array.from(n.keys()).sort((a,i)=>a-i),r=t.length>1?cn:0;e.forEach(a=>{if(a)for(let i of t)Ds(n.get(i),a,r)});let o=Xs(),s=[];A.forEach((a,i)=>{let l=a.path.length,c=new Array(l),f;for(let h=0;h<l;h++){h===0?c[h]=void 0:c[h]=f??a.path[0];let p=a.path[h];p.node!==null&&p.node&&(f=p)}let u=new Array(l),d;for(let h=l-1;h>=0;h--){h===l-1?u[h]=void 0:u[h]=d??a.path[l-1];let p=a.path[h];p.node!==null&&p.node&&(d=p)}a.path.forEach((h,p)=>{if(h.y===void 0){let m=c[p],b=u[p],g=!!(b&&m&&b.isForward!==void 0&&m.isForward!==void 0&&(m.order>b.order||b.order===m.order&&b.isForward===m.isForward));h.betweenCycleReverseTraversal=g,s.push({readIndex:i,pathIndex:p,previousY:m?.y,previousNode:m?.node})}})}),s.sort(qs),s.forEach(a=>{let i=A[a.readIndex],l=i.path[a.pathIndex];l.y=o[l.order],o[l.order]+=i.width}),Fe&&(console.log("Reads:"),console.log(A))}function Ds(e,n,t){let r=new Set(e),o=n.incomingReads.filter(([p])=>r.has(p)),s=n.outgoingReads.filter(([p])=>r.has(p)),a=n.internalReads.filter(p=>r.has(p));o.length===0&&s.length===0&&a.length===0&&(t=0);let i=n.y+n.contentHeight+t*2,l=o.map(p=>{let[m,b]=p,g=A[m].path,y=b+1,w;for(let N=1;N<=b;N++){let S=g[b-N]?.y;if(S!==void 0){y=N,w=S;break}}return{entry:p,decisionStep:y,y:w}});l.sort($s),o=l.map(p=>p.entry);let c=i,f=new Map;o.forEach(p=>{let m=A[p[0]];m.path[p[1]].y=c,ao(f,m,p[1],c,n),c+=m.width});let u=c;s.sort(Fs);let d=new Map;c=i,s.forEach(p=>{let m=A[p[0]],b=m.firstNodeOffset??0;m.path[p[1]].y=c,d.set(c,b);let g=f.get(c);g===void 0||g+1<=b?(c+=m.width,u=Math.max(u,c)):(f.set(c,0),o.forEach(y=>{let w=A[y[0]],N=w.path[y[1]];N.y!==void 0&&N.y>=c&&(N.y+=m.width,ao(f,w,y[1],N.y,n))}),c+=m.width,u+=m.width)}),a.sort(Ws),a.forEach(p=>{let m=A[p],b=m.firstNodeOffset??0,g=m.finalNodeCoverLength??0;for(c=i;b<(f.get(c)??-1/0)+2||g>(d.get(c)??1/0)-3;)c+=m.width||cn;m.path[0].y=c,f.set(c,g),u=Math.max(u,c)});let h=u-n.y-n.contentHeight;n.contentHeight+=h,ca(n,h)}function $s(e,n){return e.decisionStep!==n.decisionStep?e.decisionStep-n.decisionStep:e.y===void 0||n.y===void 0?(e.y===void 0?0:1)-(n.y===void 0?0:1):e.y-n.y}function ao(e,n,t,r,o){t===n.path.length-1?e.set(r,n.finalNodeCoverLength??0):e.set(r,o.sequenceLength)}function qs(e,n){let t=A[e.readIndex],r=A[n.readIndex],o=t.path[e.pathIndex],s=r.path[n.pathIndex];if(o.order!==s.order)return o.order-s.order;if(t.sourceTrackID!==r.sourceTrackID)return t.sourceTrackID-r.sourceTrackID;if(e.previousNode&&n.previousNode){let l=M[e.previousNode],c=M[n.previousNode];if(l&&c&&l.order!==c.order)return l.order-c.order}let a=e.previousY??0,i=n.previousY??0;return o.betweenCycleReverseTraversal&&s.betweenCycleReverseTraversal?i-a:a-i}function Fs([e,n],[t,r]){let o=A[e],s=A[t],a,i,l=o.path.length-1,c=s.path.length-1;for(;!a&&l>=0;)a=o.path[l]?.y,l-=1;for(;!i&&c>=0;)i=s.path[c]?.y,c-=1;if(a&&i)return a-i;let f=o.path[n]?.node,u=s.path[r]?.node,d=f!=null?M[f]:null,h=u!=null?M[u]:null;for(;d!=null&&h!=null&&d===h;){if(n<o.path.length-1){for(n+=1;o.path[n]?.node===null;)n+=1;let m=o.path[n]?.node;d=m!=null?M[m]:null}else d=null;if(r<s.path.length-1){for(r+=1;s.path[r]?.node===null;)r+=1;let m=s.path[r]?.node;h=m!=null?M[m]:null}else h=null}if(d!=null)return h!=null?un(d,h):1;if(h!=null)return-1;let p=(o.firstNodeOffset??0)-(s.firstNodeOffset??0);return p!==0?p:(o.finalNodeCoverLength??0)-(s.finalNodeCoverLength??0)}function Hs(e,n){if(e.path===void 0||n.path===void 0)return(e.path===void 0?0:1)-(n.path===void 0?0:1);let t=e.path,r=n.path,o=0,s=0;for(;o<t.length&&s<r.length;){let a=t[o],i=r[s],l=a.order,c=i.order;if(l===c&&a.node&&i.node)return(i.y??0)-(a.y??0);l<c?o+=1:(l>c||(o+=1),s+=1)}return 0}function Ws(e,n){let t=A[e],r=A[n],o=t.firstNodeOffset??0,s=r.firstNodeOffset??0;if(o<s)return-1;if(o>s)return 1;let a=t.finalNodeCoverLength??0,i=r.finalNodeCoverLength??0;return a<i?-1:a>i?1:0}function Xs(){let e=[];for(let n=0;n<=Q;n+=1)e.push(0);return M.forEach(n=>{n.y!==void 0&&(e[n.order]=Math.max(e[n.order],n.y+n.contentHeight+20))}),L.forEach(n=>{n.path.forEach(t=>{e[t.order]=Math.max(e[t.order],(t.y??0)+n.width)})}),e}function Ys(){A.forEach(e=>{let n=Math.abs(e.indexSequence[0]),t=ln(e.indexSequence[0]),r=M[n],o,s;e.path=[],e.path.push({order:r.order,isForward:t,node:n});for(let a=1;a<e.sequence.length;a+=1)if(o=r,s=t,n=Math.abs(e.indexSequence[a]),t=ln(e.indexSequence[a]),r=M[n],r.order>o.order){s||e.path.push({order:o.order,isForward:!0,node:null});for(let i=o.order+1;i<r.order;i+=1)e.path.push({order:i,isForward:!0,node:null});t?e.path.push({order:r.order,isForward:!0,node:n}):(e.path.push({order:r.order,isForward:!0,node:null}),e.path.push({order:r.order,isForward:!1,node:n}))}else if(r.order<o.order){s&&e.path.push({order:o.order,isForward:!1,node:null});for(let i=o.order-1;i>r.order;i-=1)e.path.push({order:i,isForward:!1,node:null});t?(e.path.push({order:r.order,isForward:!1,node:null}),e.path.push({order:r.order,isForward:!0,node:n})):e.path.push({order:r.order,isForward:!1,node:n})}else t!==s?e.path.push({order:r.order,isForward:t,node:n}):(e.path.push({order:r.order,isForward:!t,node:null}),e.path.push({order:r.order,isForward:t,node:n}))})}function Pn(){A.forEach(e=>{let n=0;for(;n<e.sequence.length&&e.sequence[n].startsWith("-");)n+=1;if(n===e.sequence.length){e.is_reverse=!0,e.sequence=e.sequence.reverse();for(let a=0;a<e.sequence.length;a+=1)e.sequence[a]=O(e.sequence[a]);let t=e.sequenceNew??[];t.reverse(),e.sequenceNew=t;for(let a of t)a.nodeName=O(a.nodeName),ks(a.mismatches,oe(a.nodeName).sequenceLength);let r=e.firstNodeOffset??0,o=oe(e.sequence[0]).sequenceLength;e.firstNodeOffset=o-(e.finalNodeCoverLength??0);let s=oe(e.sequence[e.sequence.length-1]).sequenceLength;e.finalNodeCoverLength=s-r}})}function ks(e,n){e.forEach(t=>{t.type==="insertion"?t.pos=n-t.pos:t.type==="deletion"?t.pos=n-t.pos-(t.length??0):t.type==="substitution"&&(t.pos=n-t.pos-(t.seq?.length??0)),t.seq!==void 0&&(t.seq=So(t.seq).split("").reverse().join(""))})}var zs={A:"T",T:"A",C:"G",G:"C"};function So(e){let n="";for(let t=e.length-1;t>=0;t-=1)n+=zs[e.charAt(t)]??"N";return n}function Se(e){e.forEach(n=>{n.indexSequence=[],n.sequence.forEach(t=>{let r=t,o=I.get(O(r)),s=M[o]?.switched??!1;s&&(r=No(r));let a=I.get(O(r));if(a===0)throw new Error("Node "+O(r)+" has prohibited index 0");X(r)!==s?n.indexSequence.push(-a):n.indexSequence.push(a)})})}var js=20;function Vs(){let e={minX:99,maxX:-99,minY:99,maxY:-99};M.forEach(n=>{n&&(n.x!==void 0&&(e.minX=Math.min(e.minX,n.x),e.maxX=Math.max(e.maxX,n.x+js+n.pixelWidth)),n.y!==void 0&&(e.minY=Math.min(e.minY,n.y-10),e.maxY=Math.max(e.maxY,n.y+n.contentHeight+10)))}),L.forEach(n=>{n.path.forEach(t=>{let r=t.y??0;e.maxY=Math.max(e.maxY,r+n.width),e.minY=Math.min(e.minY,r)})}),qn=e}function oe(e){let n=I.get(O(e)),t=n===void 0?void 0:M[n];if(t===void 0)throw new Error(`Unknown node ${e}`);return t}function io(){return I=new Map,M.forEach((e,n)=>{e&&I.set(e.name,n)}),I}function lo(){let e=M.map(()=>new Set),n=M.map(()=>new Set),t=r=>{for(let o=0;o<r.indexSequence.length-1;o+=1){let s=Math.abs(r.indexSequence[o]),a=Math.abs(r.indexSequence[o+1]);e[s].add(a),n[a].add(s)}};L.forEach(t),_.showReads&&A.length>0&&A.forEach(t),M.forEach((r,o)=>{r&&(r.successors=Array.from(e[o]),r.predecessors=Array.from(n[o]))})}function co(e){let n=0,t=0,r=0;e.forEach(o=>{let s=Math.abs(o);if(o<0){T[s]===void 0&&(T[s]=t);let a=T[s];a<r&&(r=a),n=a,t=a-1}else{T[s]===void 0&&(T[s]=n);let a=T[s];n=a+1,t=a}}),r<0&&Wn(-r)}function Us(e){let n=0,t=0;for(;n<e.length&&T[Math.abs(e[n])]===void 0;)n+=1;if(n>=e.length)return null;let r=e[n],o,s;r>=0?(o=T[r]-1,s=-1):(o=T[-r]+1,s=1);for(let a=n-1;a>=0;a-=1){let i=Math.abs(e[a]);T[i]===void 0&&(T[i]=o,t=Math.min(t,o),o+=s)}return t<0&&Wn(-t),n}var Ks=-1;function Qs(e){let n=[];for(let t of e)n.push(t??Ks);return n}function Gn(){let e,n,t,r,o=0,s=_.showReads&&A.length>0?L.concat(A):L,a={stamp:new Int32Array(M.length),generation:0};T=new Array(M.length).fill(void 0),M.forEach(l=>{l&&(l.order=void 0)}),co(L[0].indexSequence);for(let l=1;l<s.length;l+=1){if(Fe&&console.log(`generating order for track ${l+1}`),t=Us(s[l].indexSequence),t===null){s[l].type==="haplotype"?co(s[l].indexSequence):(s.splice(l,1),A.splice(l-L.length,1),l-=1);continue}for(e=Js(s[l].indexSequence);t<e.length;){for(r=t,t+=1;t<e.length&&T[e[t]]===void 0;)t+=1;if(t<e.length){n=T[e[r]]+1;for(let c=r+1;c<t;c+=1)T[e[c]]=n,n+=1;if(T[e[t]]>T[e[r]])T[e[t]]<n&&fo(e[t],e[t-1],n);else if(s[l].indexSequence[t]>=0&&!Zs(e[t],e[r],a))fo(e[t],e[t-1],n);else if(s[l].indexSequence[r]<0||M[e[r+1]].degree<2&&T[e[t]]<T[e[r]]){n=T[e[r]]-1;for(let c=r+1;c<t;c+=1)T[e[c]]=n,o=Math.min(o,n),n-=1}}else if(s[l].indexSequence[r]>=0){n=T[e[r]]+1;for(let c=r+1;c<e.length;c+=1){let f=e[c];T[f]===void 0&&(T[f]=n,n+=1)}}else{n=T[e[r]]-1;for(let c=r+1;c<e.length;c+=1){let f=e[c];T[f]===void 0&&(T[f]=n,o=Math.min(o,n),n-=1)}}}}o<0&&Wn(-o);let i=Qs(T);T=i,i.forEach((l,c)=>{let f=M[c];f!==void 0&&(f.order=l)})}function Zs(e,n,t){t.generation+=1;let{stamp:r,generation:o}=t,s=[e];for(r[e]=o;s.length>0;){let a=s.pop();if(a===n)return!0;for(let i of M[a].successors)r[i]!==o&&(r[i]=o,s.push(i))}return!1}function uo(){let e=-1;return T.forEach(n=>{n!==void 0&&n>e&&(e=n)}),e}function Js(e){return e.map(n=>Math.abs(n))}function Wn(e){T.forEach((n,t)=>{n!==void 0&&(T[t]=n+e)})}function fo(e,n,t){let r=new Map,o=[[e,t]],s=0;for(;s<o.length;){let[a,i]=o[s];s+=1;let l=T[a];l!==void 0&&l<i&&(!r.has(a)||r.get(a)<i)&&(r.set(a,i),M[a].successors.forEach(c=>{T[c]>l&&c!==n&&o.push([c,i+1])}),a!==e&&M[a].predecessors.forEach(c=>{T[c]>l&&c!==n&&o.push([c,i+1])}))}r.forEach((a,i)=>{T[i]=a})}function ea(){M.forEach(e=>{e.tracks=[]}),L.forEach(e=>{e.indexSequence.forEach(n=>{M[Math.abs(n)].tracks.push(e.id)})}),M.forEach(e=>{e.tracks!==void 0&&(e.degree=e.tracks.length)})}function na(){let e=L[0],n=L.slice(1,L.length);if(_.showReads&&A.length>0&&(n=n.concat(A)),ta(n,e),_.showReads&&A.length>0){for(let t=0;t<A.length;t++)if(A[t]!==n[t+L.length-1])throw new Error("Read inequality")}}function ta(e,n){let t=new Map,r=n?new Set(n.sequence):null;for(let o of e){let s=o.sequence;for(let a=0;a<s.length;a+=1){let i=O(s[a]),l=oe(i);if(r&&!r.has(i)){let c=a>0?oe(s[a-1]).order:void 0,f=a<s.length-1?oe(s[a+1]).order:void 0;(c===void 0||c<l.order)&&(f===void 0||l.order<f)&&po(t,i,X(s[a])?1:-1),(c===void 0||c>l.order)&&(f===void 0||l.order>f)&&po(t,i,X(s[a])?-1:1)}}}for(let o of e)o.sequence.forEach((s,a)=>{let i=t.get(O(s));i!==void 0&&i>0&&(o.sequence[a]=No(s),o.indexSequence[a]=-o.indexSequence[a])});t.forEach((o,s)=>{if(o>0){let a=oe(s);a.seq=So(a.seq),a.switched=!0}})}function po(e,n,t){e.set(n,(e.get(n)??0)+t)}function oa(){let e=0,n=20,t=-1,r=M.slice();r.sort(un);let o=ra();r.forEach(s=>{s.order>=0&&(s.order>t&&(t=s.order,e=n+10*o[s.order]),s.x=e,n=Math.max(n,e+40+s.pixelWidth))})}function ra(){let e=[],n=[],t=[],r=[];for(let o=0;o<=Q;o+=1)e.push(0),n.push(0),t.push(0);L.forEach(o=>{for(let s=1;s<o.path.length;s+=1){let a=o.path[s],i=o.path[s-1];if(a.order===i.order)a.isForward?e[a.order]=e[a.order]+1:n[a.order]=n[a.order]+1;else{let l=Math.abs((a.y??0)-(i.y??0));t[a.order]=Math.max(l/17.5,t[a.order])}}}),r.push(Math.max(0,e[0]-1));for(let o=1;o<=Q;o+=1)r.push(Math.max(Math.max(0,e[o]-1)+Math.max(0,n[o-1]-1),t[o]));return r}function sa(){let e,n,t,r,o,s,a=[],i=[];for(let l=0;l<=Q;l+=1){ye[l]=[],i[l]=new Map,a[l]=[];for(let c=0;c<L.length;c+=1)a[l][c]=null}L.forEach((l,c)=>{n=Math.abs(l.indexSequence[0]),t=ln(l.indexSequence[0]),r=M[n],l.path=[],l.path.push({order:r.order,lane:null,isForward:t,node:n}),H(r.order,n,c,0,a,i),e=1;for(let f=1;f<l.sequence.length;f+=1)if(o=r,s=t,n=Math.abs(l.indexSequence[f]),t=ln(l.indexSequence[f]),r=M[n],r.order>o.order){s||(l.path.push({order:o.order,lane:null,isForward:!0,node:null}),H(o.order,null,c,e,a,i),e+=1);for(let u=o.order+1;u<r.order;u+=1)l.path.push({order:u,lane:null,isForward:!0,node:null}),H(u,null,c,e,a,i),e+=1;t?(l.path.push({order:r.order,lane:null,isForward:!0,node:n}),H(r.order,n,c,e,a,i),e+=1):(l.path.push({order:r.order,lane:null,isForward:!0,node:null}),H(r.order,null,c,e,a,i),e+=1,l.path.push({order:r.order,lane:null,isForward:!1,node:n}),H(r.order,n,c,e,a,i),e+=1)}else if(r.order<o.order){s&&(l.path.push({order:o.order,lane:null,isForward:!1,node:null}),H(o.order,null,c,e,a,i),e+=1);for(let u=o.order-1;u>r.order;u-=1)l.path.push({order:u,lane:null,isForward:!1,node:null}),H(u,null,c,e,a,i),e+=1;t?(l.path.push({order:r.order,lane:null,isForward:!1,node:null}),H(r.order,null,c,e,a,i),e+=1,l.path.push({order:r.order,lane:null,isForward:!0,node:n}),H(r.order,n,c,e,a,i),e+=1):(l.path.push({order:r.order,lane:null,isForward:!1,node:n}),H(r.order,n,c,e,a,i),e+=1)}else t!==s?(l.path.push({order:r.order,lane:null,isForward:t,node:n}),H(r.order,n,c,e,a,i),e+=1):(l.path.push({order:r.order,lane:null,isForward:!t,node:null}),H(r.order,null,c,e,a,i),e+=1,l.path.push({order:r.order,lane:null,isForward:t,node:n}),H(r.order,n,c,e,a,i),e+=1)});for(let l=0;l<=Q;l+=1)ia(ye[l],l)}function H(e,n,t,r,o,s){let a={trackID:t,segmentID:r,compareToFromSame:o[e][t]??null},i=n===null?void 0:s[e].get(n);if(i===void 0){let l={type:"single",node:n,tracks:[a]};ye[e].push(l),n!==null&&s[e].set(n,l)}else i.type="multiple",i.tracks.push(a);o[e][t]=a}function aa(e,n){let t;e.forEach(r=>{r.idealLane=0,r.tracks.forEach(o=>{if(o.segmentID===0)o.idealLane=o.trackID,o.idealY=null;else if(L[o.trackID].path[o.segmentID-1].order===n-1)o.idealLane=L[o.trackID].path[o.segmentID-1].lane??void 0,o.idealY=L[o.trackID].path[o.segmentID-1].y;else if(o.segmentID<L[o.trackID].path.length-1&&L[o.trackID].path[o.segmentID+1].order===n-1)o.idealLane=L[o.trackID].path[o.segmentID+1].lane??void 0,o.idealY=L[o.trackID].path[o.segmentID+1].y;else{for(t=o.segmentID-1;t>=0&&L[o.trackID].path[t].order!==n-1;)t-=1;t<0?(o.idealLane=o.trackID,o.idealY=null):(o.idealLane=L[o.trackID].path[t].lane??void 0,o.idealY=L[o.trackID].path[t].y)}r.idealLane+=o.idealLane}),r.idealLane/=r.tracks.length})}function ia(e,n){let t=0,r=new Set,o=20,s=!1,a=-1;aa(e,n),e.sort(mo),e.forEach(i=>{i.node!==null?(M[i.node].topLane=t,s&&(o-=10),M[i.node].y=o,M[i.node].contentHeight=0,s=!1):(s?o-=25:o>20&&(o-=10),s=!0),i.tracks.sort(mo),i.tracks.forEach(l=>{l.lane=t,l.trackID===a&&i.node===null&&s&&(o+=10),L[l.trackID].path[l.segmentID].lane=t,L[l.trackID].path[l.segmentID].y=o,l.idealY!=null&&r.add(l.idealY-o),t+=1,o+=L[l.trackID].width,i.node!==null&&(M[i.node].contentHeight+=L[l.trackID].width),a=l.trackID}),o+=25}),la(e,r)}function la(e,n){let t=0,r=Number.MAX_SAFE_INTEGER;n.forEach(o=>{ho(e,o)<r&&(r=ho(e,o),t=o)}),e.forEach(o=>{o.node!==null&&(M[o.node].y+=t),o.tracks.forEach(s=>{let a=L[s.trackID].path[s.segmentID];a.y=a.y+t})})}function ca(e,n){e.order<0||ye[e.order]===void 0||(ye[e.order].forEach(t=>{if(t.node!==null){let r=M[t.node];r!==e&&r.y>e.y&&(r.y+=n,t.tracks.forEach(o=>{let s=L[o.trackID].path[o.segmentID];s.y=s.y+n}))}else t.tracks.forEach(r=>{let o=L[r.trackID].path[r.segmentID];o.y>=e.y&&(o.y=o.y+n)})}),Ee[e.order].length>0&&Ee[e.order].forEach(t=>{M[t]!==e&&M[t].y>e.y&&(M[t].y+=n)}))}function ho(e,n){let t=0;return e.forEach(r=>{r.tracks.forEach(o=>{o.idealY!=null&&L[o.trackID].type!=="read"&&(t+=Math.abs(o.idealY-n-L[o.trackID].path[o.segmentID].y)*L[o.trackID].width)})}),t}function mo(e,n){return e.idealLane!==void 0?n.idealLane!==void 0?e.idealLane<n.idealLane?-1:e.idealLane>n.idealLane?1:0:-1:n.idealLane!==void 0?1:0}function un(e,n){if(!e)return n?-1:0;if(!n)return 1;if(e.order!==void 0){if(n.order!==void 0){if(e.order<n.order)return-1;if(e.order>n.order)return 1;if(e.y!==void 0&&n.y!==void 0){if(e.y<n.y)return-1;if(e.y>n.y)return 1}return 0}return-1}return n.order!==void 0?1:0}function ua(){let e,n,t={};$n.forEach(r=>{let o=0;for(;o<L.length&&L[o].name!==r.track;)o+=1;o<L.length&&(e=0,L[o].path.forEach(s=>{s.node!==null&&(t={},n=e+M[s.node].sequenceLength-1,e>=r.start&&e<=r.end&&(t.start=0),e<r.start&&n>=r.start&&(t.start=r.start-e),n<=r.end&&n>=r.start&&(t.end=n-e,n<r.end&&(t.continue=!0)),n>r.end&&e<=r.end&&(t.end=r.end-e),t.start!==void 0&&(t.type=r.type,t.name=r.name,s.features===void 0&&(s.features=[]),s.features.push(t)),e=n+1)}))})}function da(){let e=!0,n=4,t=_.trackWidth;L.forEach(r=>{r.freq!==void 0?r.width=Math.round((Math.log(r.freq)+1)*n):(r.width=t,r.type!==void 0&&r.type==="read"&&(r.width=n)),r.width!==n&&(e=!1)}),e&&L.forEach(r=>{r.freq!==void 0&&(r.width=t)})}function fa(e){let n=e.path[0],t=M[n.node],r=e.firstNodeOffset??0;return Xn(t,n.isForward?r:t.sequenceLength-r)}function pa(e){let n=e.path[e.path.length-1],t=M[n.node],r=e.finalNodeCoverLength??0;return Xn(t,n.isForward?r:t.sequenceLength-r)}function Ro(e,n){return n>e.sequenceLength?null:Xn(e,n)}function Xn(e,n){let[t,r]=ba(e);if(e.sequenceLength===0)return t;let o=Math.min(Math.max(n,0),e.sequenceLength);return t+o/e.sequenceLength*(r-t)}function ha(){let e,n,t,r,o,s,a,i,l;for(let u=0;u<=Q;u+=1)Fn.push(0),Hn.push(0);let c=[],f=[];M.forEach(u=>{u.x!==void 0&&(c[u.order]=u.x,f[u.order]===void 0?f[u.order]=u.x+u.pixelWidth:f[u.order]=Math.max(f[u.order],u.x+u.pixelWidth))}),L.sort(Hs),L.forEach(u=>{a="plain",o=Re(u,a),s=vs(u);let d=a,h=()=>(d!==a&&(d=a,o=Re(u,a)),o);t=u.path[0].y,u.type!=="read"?u.sequence[0].startsWith("-")?e=f[u.path[0].order]+20:e=c[u.path[0].order]-20:e=fa(u);for(let p=0;p<u.path.length;p+=1)u.path[p].y===t?u.path[p].features!==void 0&&(l=p>0&&u.path[p-1].order===u.path[p].order,i=go(u.path[p],c[u.path[p].order],f[u.path[p].order],a,u,e,t,o,l),a=i.highlight,e=i.xStart):(u.path[p-1].isForward?n=f[u.path[p-1].order]:n=c[u.path[p-1].order],n!==e&&(o=h(),G.rectangles.push({xStart:Math.min(e,n),yStart:t,xEnd:Math.max(e,n),yEnd:t+u.width-1,color:o,alpha:s,id:u.id,name:u.name,type:u.type})),u.path[p].order-1===u.path[p-1].order?(e=n,n=c[u.path[p].order],r=u.path[p].y,o=h(),G.curves.push({xStart:e,yStart:t,xEnd:n+1,yEnd:r,width:u.width,color:o,alpha:s,laneChange:Math.abs(u.path[p].lane-u.path[p-1].lane),id:u.id,name:u.name,type:u.type,nodeStart:u.path[p-1]?.node,nodeEnd:u.path[p]?.node}),e=n,t=r):u.path[p].order+1===u.path[p-1].order?(e=n,n=f[u.path[p].order],r=u.path[p].y,o=h(),G.curves.push({xStart:e+1,yStart:t,xEnd:n,yEnd:r,width:u.width,color:o,alpha:s,laneChange:Math.abs(u.path[p].lane-u.path[p-1].lane),id:u.id,name:u.name,type:u.type,nodeStart:u.path[p-1]?.node,nodeEnd:u.path[p]?.node}),e=n,t=r):u.path[p-1].isForward?(r=u.path[p].y,xo(1,n,t,r,u.width,o,u.id,u.path[p].order,u.type,u.name),e=f[u.path[p].order],t=u.path[p].y):(r=u.path[p].y,xo(-1,n,t,r,u.width,o,u.id,u.path[p].order,u.type,u.name),e=c[u.path[p].order],t=u.path[p].y),u.path[p].features!==void 0&&(l=u.path[p-1].order===u.path[p].order,i=go(u.path[p],c[u.path[p].order],f[u.path[p].order],a,u,e,t,o,l),a=i.highlight,e=i.xStart));u.type!=="read"?u.path[u.path.length-1].isForward?n=f[u.path[u.path.length-1].order]+20:n=c[u.path[u.path.length-1].order]-20:n=pa(u),G.rectangles.push({xStart:Math.min(e,n),yStart:t,xEnd:Math.max(e,n),yEnd:t+u.width-1,color:o,alpha:s,id:u.id,name:u.name,type:u.type})})}var ma=1e9;function bo(e,n){an=new Map;let t=new Map,r=_.ignoreStrand;for(let d of e){let h=d.indexSequence;if(!(!h||h.length<2))for(let p=0;p<h.length-1;p+=1){let m=h[p],b=h[p+1],g=Math.abs(m),y=Math.abs(b),w=M[g],N=M[y];if(!w||!N)continue;let S;if(r){let x=`${m}>${b}`,E=`${-b}>${-m}`;S=x<E?x:E}else S=`${m}>${b}`;let R=t.get(S);R===void 0?t.set(S,{sSigned:m,dSigned:b,sName:m<0?`-${w.name}`:w.name,dName:b<0?`-${N.name}`:N.name,count:1,sourceTrackID:d.sourceTrackID}):R.count+=1}}let o=0;for(let d of t.values())d.count>o&&(o=d.count);let s=cn,a=60,i=d=>o<=1?s:s+(a-s)*Math.sqrt(d/o),l=[],c=0;for(let d of t.values()){let h=ma+c,p=`${d.count.toLocaleString()} ${n}${d.count===1?"":"s"}: Node ${d.sName} \u2192 Node ${d.dName}`;an.set(h,{count:d.count,label:p});let m=M[Math.abs(d.sSigned)]?.sequenceLength??0;l.push({id:h,sourceTrackID:d.sourceTrackID,type:"read",name:p,sequence:[d.sName,d.dName],indexSequence:[],path:[],width:i(d.count),firstNodeOffset:m,finalNodeCoverLength:0,sequenceNew:[{nodeName:d.sName,mismatches:[]},{nodeName:d.dName,mismatches:[]}],mapping_quality:0,is_secondary:!1,sample_name:null,read_group:null,score:d.count}),c+=1}let f="?",u=0;for(let d of M){if(!d)continue;let h=d.contentHeight;h>u&&(u=h,f=d.name)}return Fe&&console.log(`[coarsened] ${n}s_in=${e.length} edges_out=${l.length} tallestNodeBeforePlace=${f}(${u.toFixed(1)})`),l}function go(e,n,t,r,o,s,a,i,l){let c=r,f,u,d,h;n-=8,t+=8;let p=M[e.node].sequenceLength;return e.features.sort((m,b)=>m.start-b.start),e.features.forEach(m=>{c!==m.type&&(f=Re(o,c),e.isForward?(d=n+Math.round(m.start*(t-n+1)/p),l&&d<n+8&&(h=n+Math.round((m.end+1)*(t-n+1)/p)-1,u=Re(o,m.type),G.featureRectangles.push({xStart:d,yStart:a,xEnd:h,yEnd:a+o.width-1,color:u,id:o.id,name:o.name,type:o.type})),d>s+1&&G.featureRectangles.push({xStart:s,yStart:a,xEnd:d-1,yEnd:a+o.width-1,color:f,id:o.id,name:o.name,type:o.type})):(d=t-Math.round(m.start*(t-n+1)/p),l&&d>t-8&&(h=t-Math.round((m.end+1)*(t-n+1)/p)-1,u=Re(o,m.type),G.featureRectangles.push({xStart:h,yStart:a,xEnd:d,yEnd:a+o.width-1,color:u,id:o.id,name:o.name,type:o.type})),s>d+1&&G.featureRectangles.push({xStart:d+1,yStart:a,xEnd:s,yEnd:a+o.width-1,color:f,id:o.id,name:o.name,type:o.type})),s=d,c=m.type),(m.end<p-1||m.continue===void 0)&&(f=Re(o,c),e.isForward?(h=n+Math.round((m.end+1)*(t-n+1)/p)-1,G.featureRectangles.push({xStart:s,yStart:a,xEnd:h,yEnd:a+o.width-1,color:f,id:o.id,name:o.name,type:o.type})):(h=t-Math.round((m.end+1)*(t-n+1)/p)-1,G.featureRectangles.push({xStart:h,yStart:a,xEnd:s,yEnd:a+o.width-1,color:f,id:o.id,name:o.name,type:o.type})),s=h+1,c="plain")}),{xStart:s,highlight:c}}var yo=7;function xo(e,n,t,r,o,s,a,i,l,c){let f=e===1?Hn:Fn,u=10*f[i],d=n+e*(u+5),h=yo,p=Math.min(yo,o),m=Math.min(t,r),b=Math.max(t,r),g=e===1?n:d-1,y=e===1?d:n,w=x=>{G.verticalRectangles.push({xStart:g,yStart:x,xEnd:y,yEnd:x+o-1,color:s,id:a,name:c,type:l})};w(t),G.verticalRectangles.push({xStart:e===1?d+h:d-h-p,yStart:m+o+h-1,xEnd:e===1?d+h+p-1:d-h-1,yEnd:b-h+1,color:s,id:a,name:c,type:l}),w(r);let N=d+e*h,S=d+e*(h+p),R=`M ${d} ${b}`;R+=` Q ${N} ${b} ${N} ${b-h}`,R+=` H ${S}`,R+=` Q ${S} ${b+o} ${d} ${b+o}`,R+=" Z ",G.corners.push({path:R,color:s,id:a,type:l}),R=`M ${d} ${m}`,R+=` Q ${S} ${m} ${S} ${m+o+h}`,R+=` H ${N}`,R+=` Q ${N} ${m+o} ${d} ${m+o}`,R+=" Z ",G.corners.push({path:R,color:s,id:a,type:l}),f[i]+=1}function ba(e){let n=e.x-4,t=e.x+e.pixelWidth+4;return[n,t]}function Mo(){switch(M.forEach(e=>{e.sequenceLength===void 0&&(e.sequenceLength=e.seq.length)}),_.nodeWidthOption){case"compressed":M.forEach(e=>{e.width=1+Math.log(e.sequenceLength)/Math.log(2),e.pixelWidth=Math.round((e.width-1)*8.401)});break;case"small":M.forEach(e=>{e.width=e.sequenceLength/100,e.pixelWidth=Math.round((e.width-1)*8.401)});break;case"fixed":M.forEach(e=>{e.width=10,e.pixelWidth=Math.round(e.width*8.401)});break;case"normal":{let e=_.charWidth;M.forEach(n=>{n.width=n.sequenceLength;let t=n.seq?.length??1;n.pixelWidth=Math.round(e*t)});break}default:throw new Error(`${_.nodeWidthOption} not implemented`)}}function ga(){let e,n,t=Array.from(M,()=>new Set),r=Array.from(M,()=>new Set),o;_.showReads&&A.length>0?o=L.concat(A):o=L,o.forEach(i=>{for(let l=0;l<i.sequence.length;l+=1)X(i.sequence[l])?(e=O(i.sequence[l]),l>0?(n=i.sequence[l-1],X(n)?r[I.get(e)].add(O(n)):(r[I.get(e)].add(n),r[I.get(e)].add(fe(n)))):i.type==="haplotype"&&r[I.get(e)].add("None"),l<i.sequence.length-1?(n=i.sequence[l+1],X(n)?t[I.get(e)].add(O(n)):(t[I.get(e)].add(n),t[I.get(e)].add(fe(n)))):i.type==="haplotype"&&t[I.get(e)].add("None")):(l>0?(e=i.sequence[l-1],t[I.get(i.sequence[l])].add(e),X(e)&&t[I.get(i.sequence[l])].add(O(e))):i.type==="haplotype"&&t[I.get(i.sequence[l])].add("None"),l<i.sequence.length-1?(e=i.sequence[l+1],r[I.get(i.sequence[l])].add(e),X(e)&&r[I.get(i.sequence[l])].add(O(e))):i.type==="haplotype"&&r[I.get(i.sequence[l])].add("None"))});let s=t.map(i=>Array.from(i)),a=r.map(i=>Array.from(i));if(_.showReads&&A.length>0){let i=M.slice();i.sort(un);let l=new Map,c=new Map,f=d=>{let h=l.get(d);if(h===void 0)throw new Error(`No merge offset recorded for node ${d}`);return h},u=d=>{let h=c.get(d);if(h===void 0)throw new Error(`No merge origin recorded for node ${d}`);return h};i.forEach(d=>{let h=qe(I.get(d.name),s,a);if(h){let p=f(h)+oe(h).sequenceLength;l.set(d.name,p),l.set(fe(d.name),p),c.set(d.name,u(h)),c.set(fe(d.name),u(h))}else l.set(d.name,0),l.set(fe(d.name),0),c.set(d.name,d.name),c.set(fe(d.name),d.name)}),A.forEach(d=>{let h=d.sequenceNew??[];d.firstNodeOffset=(d.firstNodeOffset??0)+f(d.sequence[0]),d.finalNodeCoverLength=(d.finalNodeCoverLength??0)+f(d.sequence[d.sequence.length-1]);for(let p=d.sequence.length-1;p>=0;p-=1){let m=O(d.sequence[p]),b=qe(I.get(m),s,a);if(b&&Dn(I.get(b),s,a))if(p>0){d.sequence.splice(p,1);let g=oe(b).sequenceLength;h[p].mismatches.forEach(y=>{y.pos+=g}),h[p-1].mismatches=h[p-1].mismatches.concat(h[p].mismatches),h.splice(p,1)}else{d.sequence[0]=u(d.sequence[0]);let g=h[0],y=f(g.nodeName);g.mismatches.forEach(w=>{w.pos+=y}),g.nodeName=u(g.nodeName)}}})}for(let i=0;i<M.length;i+=1)if(Dn(i,s,a)&&!qe(i,s,a)){let l=i;for(;Dn(l,s,a);)l=I.get(O(a[l][0])),M[i].sequenceLength+=M[l].sequenceLength,M[i].seq+=M[l].seq}L.forEach(i=>{for(let l=i.sequence.length-1;l>=0;l-=1){e=O(i.sequence[l]);let c=I.get(e);qe(c,s,a)&&i.sequence.splice(l,1)}});for(let i=M.length-1;i>=0;i-=1)qe(i,s,a)&&M.splice(i,1)}function qe(e,n,t){if(n[e].length!==1||n[e][0]==="None")return!1;let r=O(n[e][0]),o=I.get(r);return t[o].length!==1||t[o][0]==="None"?!1:r}function Dn(e,n,t){if(t[e].length!==1||t[e][0]==="None")return!1;let r=O(t[e][0]),o=I.get(r);return!(n[o].length!==1||n[o][0]==="None")}function ya(e){let n=_.focusReadNames?new Set(_.focusReadNames):null;return e.filter(t=>t.is_secondary!==!0&&(t.mapping_quality??0)>=_.mappingQualityCutoff&&(n===null||t.name!==void 0&&n.has(t.name)))}function xa(e,n){let t=new Map;for(let r of e){let o=n(r),s=t.get(o);s===void 0?t.set(o,[r]):s.push(r)}return t}function Ma(e,n){return e.xStart<n.xStart?1:e.xStart>n.xStart?-1:e.yStart>n.yStart?1:e.yStart<n.yStart?-1:0}function Eo(e,n){let t=xa(e.filter(s=>s.type===n),s=>`${s.nodeStart},${s.nodeEnd}`);t.forEach(s=>{let a=.3,i=.4/s.length;s.length<=5&&(a=.5,i=0),s.sort(Ma),s.forEach(l=>{let c,f;l.yStart<l.yEnd?(c=l.xStart+(l.xEnd-l.xStart)*(1-a),a+=i,f=l.xStart+(l.xEnd-l.xStart)*(1-a)):(c=l.xStart+(l.xEnd-l.xStart)*a,a+=i,f=l.xStart+(l.xEnd-l.xStart)*a);let u=`M ${l.xStart} ${l.yStart}`;u+=` C ${c} ${l.yStart} ${c} ${l.yEnd} ${l.xEnd} ${l.yEnd}`,u+=` V ${l.yEnd+l.width}`,u+=` C ${f} ${l.yEnd+l.width} ${f} ${l.yStart+l.width} ${l.xStart} ${l.yStart+l.width}`,u+=" Z",l.path=u})});let r=Array.from(t.keys());r.sort(function(s,a){let i=s.split(",").map(Number),l=a.split(",").map(Number),c=i[0]??0,f=i[1]??0,u=l[0]??0,d=l[1]??0;return c<u?-1:c>u?1:f<d?-1:f>d?1:0});let o=[];for(let s of r){let a=t.get(s);a!==void 0&&o.push(...a)}return o}function Ao(e){let n=`M ${e.x-9} ${e.y} Q ${e.x-9} ${e.y-9} ${e.x} ${e.y-9}`,t=e.x,r=e.y-9;return e.width>1&&(t+=e.pixelWidth,n+=` L ${t} ${r}`),n+=` Q ${t+9} ${r} ${t+9} ${r+9}`,t+=9,r+=9,e.contentHeight>0&&(r+=e.contentHeight-0,n+=` L ${t} ${r}`),n+=` Q ${t} ${r+9} ${t-9} ${r+9}`,t-=9,r+=9,e.width>1&&(t-=e.pixelWidth,n+=` L ${t} ${r}`),n+=` Q ${t-9} ${r} ${t-9} ${r-9}`,t-=9,r-=9,e.contentHeight>0&&(r-=e.contentHeight-0,n+=` L ${t} ${r}`),n}function Yn(e){return e.id.endsWith("-")?"-":"+"}function kn(e,n){return n===Yn(e)?e.id:`-${e.id}`}function wa(e,n){let t=e.map(()=>{}),r=0,o=0;for(;o<e.length&&e[o]!==void 0;o++)t[o]=r,r+=e[o];let s=n;for(let a=e.length-1;a>o&&e[a]!==void 0;a--)s-=e[a],t[a]=s;return t}function La(e,n){let t=e.path.map(()=>[]);if(e.cs===void 0)return t;let r=wa(n,e.pathLength),o=(i,l=!1)=>{for(let c=0;c<r.length;c++){let f=r[c],u=n[c];if(f!==void 0&&u!==void 0&&f<=i&&(i<f+u||l&&i===f+u))return{s:c,local:i-f,room:f+u-i}}},s=(i,l)=>{let c=t[i],f=c.at(-1);l.type==="substitution"&&f?.type==="substitution"&&f.pos+f.seq.length===l.pos?f.seq+=l.seq:c.push(l)},a=e.pathStart;for(let i of st(e.cs))if(i.op==="match")a+=i.length;else if(i.op==="substitution"){let l=o(a);l&&s(l.s,{type:"substitution",pos:l.local,seq:i.seq}),a+=1}else if(i.op==="insertion"){let l=o(a,a===e.pathEnd);l&&s(l.s,{type:"insertion",pos:l.local,seq:i.seq})}else{let l=i.length;for(;l>0;){let c=o(a),f=c?Math.min(l,c.room):l;c&&s(c.s,{type:"deletion",pos:c.local,length:f}),a+=f,l-=f}}return t}function To(e,n,t){let r=new Map(e.nodes.map(s=>[s.name,s])),o=[];for(let s of n){let a=s.path.map(f=>r.get(f.name)),i=a.flatMap((f,u)=>f?[u]:[]),l=i[0],c=i.at(-1);if(l!==void 0&&c!==void 0){let f=La(s,a.map(h=>h?.length)),u=i.map(h=>kn(a[h],s.path[h].strand)),d=a[c].length;o.push({id:t+o.length,name:s.name,type:"read",sourceTrackID:1,sequence:u,sequenceNew:i.map((h,p)=>({nodeName:u[p],mismatches:f[h]})),firstNodeOffset:l===0?s.pathStart:0,finalNodeCoverLength:c===s.path.length-1?d-(s.pathLength-s.pathEnd):d,mapping_quality:s.mappingQuality===255?0:s.mappingQuality,is_secondary:s.secondary,is_reverse:s.strand==="-"})}}return o}var Na=["#6baed6","#4292c6","#2171b5","#08519c"],Sa=["#fb6a4a","#ef3b2c","#cb181d","#a50f15"];function Co(e){let n=e.is_reverse?Sa:Na;return n[e.id%n.length]}function Ra(e){let n=new Map;for(let[t,r]of e.pathVisits??[])for(let o of r){let s=`${o.path} ${t}`,a=n.get(s);a?a.push(o.strand):n.set(s,[o.strand])}return n}function Ea(e){let n=new Map(e.nodes.map(s=>[s.id,s])),t=Ra(e),r=(e.paths??[]).map((s,a)=>({path:s,index:a})),o=r.findIndex(s=>Le(s.path.name).name===e.referencePath);return o>0&&r.unshift(...r.splice(o,1)),r.flatMap(({path:s,index:a})=>{let i=Le(s.name).name,l=new Map,c=s.nodeIds.flatMap(f=>{let u=n.get(f);if(!u)return[];let d=l.get(u.name)??0;l.set(u.name,d+1);let h=t.get(`${i} ${u.name}`)?.[d]??Yn(u);return[kn(u,h)]});return c.length>0?[{id:a,name:s.name,sequence:c,sourceTrackID:0,type:"haplotype"}]:[]})}function Aa(e){return e.nodes.map(n=>({name:n.id,seq:"",sequenceLength:Math.max(1,n.length)}))}function Ae(e){return(e.paths?.length??0)>0}var Ta=600,Ca=3,Ia=15;function _a(e){return Math.max(Ca,Math.min(Ia,Math.floor(Ta/Math.max(1,e))))}function Io(e){let n=e.paths??[],t=Ea(e),r=e.reads?To(e,e.reads,n.length):[];return Lo(Aa(e),t,r,{nodeWidthOption:"compressed",trackWidth:_a(t.length),trackColor:o=>o.type==="read"?Co(o):ct(o.id,n.length)})}function zn(e){let n=[];return e.nodes.forEach(t=>{t.order>=0&&n.push(t)}),n}function _o(e,n,t,r){let o=e.y+e.contentHeight/2-n;return[{x:t,y:o},{x:r,y:o}]}function vo(e,n){return{minY:e.bounds.minY-n,maxY:e.bounds.maxY-n}}function Bo(e){let n=Ae(e)?Io(e):void 0;if(!n)return;let t=n.bounds.minY,r={};for(let a of zn(n))r[a.name]=_o(a,t,a.x,a.x+a.pixelWidth);let{minY:o,maxY:s}=vo(n,t);return{nodePositions:r,tubeMap:{layout:n,yOffset:t},extent:{minX:n.bounds.minX,maxX:n.bounds.maxX,minY:o,maxY:s}}}function va(e,n){let t=new Map(e.nodes.map(i=>[i.id,i])),r=new Map;for(let i of zn(n)){let l=r.get(i.order);l?l.push(i):r.set(i.order,[i])}let o=[],s=-1/0;for(let i of[...r.keys()].sort((l,c)=>l-c)){let l=r.get(i),c=1/0,f=-1/0;for(let u of l){let d=t.get(u.name);d&&B(d)&&(c=Math.min(c,d.stable.start),f=Math.max(f,d.stable.start+u.sequenceLength))}c===1/0&&(c=f=s),c<s&&(c=s,f=Math.max(s,f)),s=Math.max(s,f),o.push({order:i,x0:Math.min(...l.map(u=>u.x)),x1:Math.max(...l.map(u=>u.x+u.pixelWidth)),bp0:c,bp1:f})}let a=o.find(i=>i.bp0!==-1/0);for(let i of o)i.bp0===-1/0&&(i.bp0=i.bp1=a?.bp0??0);return o}function Ba(e){return e.nodes.some(B)&&Ae(e)}function Oo(e){let n=Ba(e)?Io(e):void 0;if(!n)return;let t=va(e,n),r=new Map(t.map(a=>[a.order,a])),o=n.bounds.minY,s={};for(let a of zn(n)){let i=r.get(a.order);s[a.name]=_o(a,o,i.bp0,i.bp1)}return{nodePositions:s,tubeMap:{layout:n,yOffset:o,columns:t},referenceAxis:!0,pixelRows:!0,extent:vo(n,o)}}function Po(e){let n=le(e);if(n.length!==0)return{nodePositions:ce(n),referenceAxis:!0,pixelRows:!0}}function Go(e){return e.sample??Ue(e.name)}function Oa(e){return e.haplotype!==void 0&&e.sample!==void 0?`${e.sample}#${e.haplotype}`:Go(e)}function Pa(e,n,t,r=!0){if(!t||!r)return{ids:e,complete:!0};let o=-1,s=-1,a=-1/0,i=1/0;if(e.forEach((c,f)=>{let u=n.get(c);u&&(u.end<=t.start&&u.end>a&&(a=u.end,o=f),u.start>=t.end&&u.start<i&&(i=u.start,s=f))}),o<0||s<0)return{ids:e,complete:!1};let l=e.slice(Math.min(o,s)+1,Math.max(o,s));return{ids:o<s?l:l.reverse(),complete:!0}}function Do(e,n,t){let r=e.paths??[],o=r.find(h=>Le(h.name).name===e.referencePath)??r[0];if(!o||r.length<2)return;let s=new Map(e.nodes.map(h=>[h.id,h.length])),a=e.anchorPaths?.find(h=>h.name===Le(o.name).name)?.start??0,i=n&&n.end>n.start?n:void 0,l=new Map,c=a;for(let h of o.nodeIds){let p=s.get(h)??0;l.has(h)||l.set(h,{start:c,end:c+p}),c+=p}let f=i===void 0||[...l.values()].some(h=>h.end<=i.start)&&[...l.values()].some(h=>h.start>=i.end),u=h=>{let{ids:p,complete:m}=Pa(h.nodeIds,l,i,f),b=[],g=0,y=0,w=0;for(let N of p){let S=s.get(N)??0,R=l.get(N),x=b.at(-1),E=x?.referenceStart,C=R&&E!==void 0&&w>=0&&E+x.bp===R.start,P=R&&E!==void 0&&w<=0&&R.end===E;!R&&x&&!x.onReference?x.bp+=S:C||P?(x.bp+=S,C||(x.referenceStart=R.start,x.reversed=!0),w=C?1:-1):(b.push({start:g,bp:S,onReference:R!==void 0,referenceStart:R?.start}),w=0),g+=S,R||(y+=S)}return{name:h.name,label:Oa(h),sample:Go(h),haplotype:h.haplotype,bp:g,offReferenceBp:y,complete:m,runs:b}};return{origin:i?i.start:a,unit:t,reference:u(o),rows:r.filter(h=>h!==o).map(u).sort((h,p)=>Number(p.complete)-Number(h.complete)||p.bp-h.bp||h.label.localeCompare(p.label))}}var Ga=1.3;function Da(e){let n=e.reference.bp;for(let t of e.rows)n=Math.max(n,t.bp);return{maxX:e.origin+n*Ga,maxY:e.rows.length*20}}function $o(e,n){let t=le(e),r=Do(e,n);if(t.length===0||!r)return;let o=ce(t),s=[{label:r.reference.label,y:0},...r.rows.map((a,i)=>({label:a.label,y:(i+1)*20}))];return{nodePositions:o,rowLabels:s,referenceAxis:!0,pixelRows:!0,extent:Da(r)}}var $a="Force-directed layout",re=e=>e.nodes.some(B),qo=e=>re(e)&&(e.paths?.length??0)>1,Fo=e=>re(e)&&Ae(e),Ho=e=>re(e)&&e.nodes.some(Ke),jn=[{value:"auto",label:"Anchored",description:"x is reference bp, one row per stable rank. Needs rGFA tags or a reference path.",run:Zt,cutMargins:!0,available:re,drawsLocally:re},{value:"samplerows",label:"Sample rows",description:"x is reference bp, one row per contributing assembly. Needs rGFA tags or a reference path.",run:oo,cutMargins:!0,available:Ho,drawsLocally:Ho},{value:"walkrows",label:"Walk rows",description:"x is each walk's own bp: one bar per haplotype, sequence the reference also carries in blue and sequence it does not in purple, so a repeat expansion reads as bar length. Needs W or P lines.",run:$o,cutMargins:!1,available:qo,drawsLocally:qo},{value:"ordered",label:"Ordered",description:"x is reference order, not bp: every node gets room, bubbles read as lenses. Needs rGFA tags or a reference path.",run:to,cutMargins:!1,available:re,drawsLocally:re},{value:"variants",label:"Variant map",description:"The reference as a line with one typed glyph per bubble, from the bubble index or from the graph itself: SNP, indel, deletion, inversion, repeat array. Click a glyph to open the graph inside it.",run:Po,cutMargins:!0,available:re,drawsLocally:re},{value:"tubemap",label:"Tube map",description:"sequenceTubeMap: every path a coloured tube through boxed nodes, columns in node order and node widths log-scaled. Needs P or W lines.",run:Bo,cutMargins:!1,available:Ae,drawsLocally:Ae},{value:"tubemapref",label:"Tube map on reference",description:"The tube map with each column at the reference bp it covers, so the tubes line up with the tracks around them. Needs P or W lines and a reference path.",run:Oo,cutMargins:!0,available:Fo,drawsLocally:Fo},{value:"force",label:$a,description:"OGDF FMMM, via the external Bandage engine.",run:()=>{},cutMargins:!1,available:()=>!0,drawsLocally:()=>!1}],Yc=jn.map(e=>e.value);function kc(e,n){return!qa(e).drawsLocally(n)}function qa(e){return jn.find(n=>n.value===e)??jn[0]}var Y=be(Vn(),1);var $=be(Vn(),1);function He(e,n){return(0,$.packAbgr)((0,$.abgrRed)(e),(0,$.abgrGreen)(e),(0,$.abgrBlue)(e),Math.round((0,$.abgrAlpha)(e)*n))}function Vc(e,n){return(0,$.packAbgr)(Math.min(255,Math.round((0,$.abgrRed)(e)*n)),Math.min(255,Math.round((0,$.abgrGreen)(e)*n)),Math.min(255,Math.round((0,$.abgrBlue)(e)*n)),(0,$.abgrAlpha)(e))}var Xo=new WeakMap;function Yo(e,n,t,r,o){let{scaleX:s,scaleY:a}=t,i=Xo.get(e);if(i?.graph===n&&i.scaleX===s&&i.scaleY===a&&i.deletions===r&&i.version===o)return i.curves;let l=new Map;for(let c=0;c<n.edges.length;c++){let f=n.edges[c],u=e[f.from],d=e[f.to];if(u?.length&&d?.length){let h=r?.get(c);l.set(c,Oe(u,d,St(f),0,0,t,h?Nn(e,h):[]))}}return Xo.set(e,{graph:n,scaleX:s,scaleY:a,deletions:r,version:o,curves:l}),l}var Fa=(0,Y.packAbgr)(119,119,119,217),ko=(0,Y.packAbgr)(136,136,136,217),Ha=(0,Y.packAbgr)(24,24,28,240),Wa=2.2,Xa=(0,Y.packAbgr)(30,30,36,245),Ya=1.8,dn=.18,ka=11,za=1.2,ja=1e-6,Va=7,Ua=3,Ka=3,Qa=1.5,Za=.5,Ja=.45,Un=12,ei=1e-6,pe=new Float64Array(64),xe=new Float64Array(64),Me=new Float64Array(64);function ni(e,n,t,r){let o=e.length*Un+1;pe.length<o&&(pe=new Float64Array(o),xe=new Float64Array(o),Me=new Float64Array(o));let s=e[e.length-1];pe[0]=s.x1,xe[0]=s.y1,Me[0]=0;let a=1,i=0;for(let l=e.length-1;l>=0&&i<r;l--){let c=e[l];for(let f=1;f<=Un&&i<r;f++){let u=1-(f/Un)**2,d=1-u,h=d*d*d,p=3*d*d*u,m=3*d*u*u,b=u*u*u,g=h*c.x0+p*c.cx0+m*c.cx1+b*c.x1,y=h*c.y0+p*c.cy0+m*c.cy1+b*c.y1;i+=Math.hypot(g-pe[a-1],(y-xe[a-1])*t)*n,pe[a]=g,xe[a]=y,Me[a]=i,a++}}return a}function zo(e,n){let t=1;for(;t<e-1&&Me[t]<n;)t++;let r=Me[t-1],o=Me[t],s=o>r?Math.min(1,Math.max(0,(n-r)/(o-r))):0;return{x:pe[t-1]+(pe[t]-pe[t-1])*s,y:xe[t-1]+(xe[t]-xe[t-1])*s}}function ti({curves:e,edgeHalfWidth:n,nodeHalfWidth:t,scale:r,yToX:o,color:s,fromSegments:a,toSegments:i}){let l=Va+Ua*n,c=ni(e,r,o,t+l),f=Me[c-1],u=Math.min(t,f),d=f<ei?oi(a,r,o):f-u,h=Math.min(1,d/l);if(h<Za)return;let p=zo(c,u),m=zo(c,u+l*h),b=p.x-m.x,g=(p.y-m.y)*o,y=e[e.length-1];return{x:p.x,y:p.y,angle:Math.hypot(b,g)>0?Math.atan2(g,b):gi(y,o,ri(y,i)),length:l*h,halfWidth:(Ka+Qa*n)*h,color:s}}function oi(e,n,t){let r=0;for(let o=1;o<e.length;o++)r+=Math.hypot(e[o].x-e[o-1].x,(e[o].y-e[o-1].y)*t);return r*n}function ri(e,n){if(n.length<2)return;let t=n[0],r=n[n.length-1];return Math.hypot(e.x1-t.x,e.y1-t.y)<=Math.hypot(e.x1-r.x,e.y1-r.y)?{from:t,to:n[1]}:{from:r,to:n[n.length-2]}}function si(e,n=1){let t=n===1?e:e.map(o=>({x:o.x,y:o.y*n})),r=[];for(let o=0;o<t.length;o++){let s=0,a=0;if(o===0){let i=t[1].x-t[0].x,l=t[1].y-t[0].y,c=Math.hypot(i,l);c>0&&(s=-l/c,a=i/c)}else if(o===t.length-1){let i=t[o].x-t[o-1].x,l=t[o].y-t[o-1].y,c=Math.hypot(i,l);c>0&&(s=-l/c,a=i/c)}else{let i=t[o].x-t[o-1].x,l=t[o].y-t[o-1].y,c=Math.hypot(i,l),f=t[o+1].x-t[o].x,u=t[o+1].y-t[o].y,d=Math.hypot(f,u);if(c>0&&d>0){let h=-l/c,p=i/c,m=-u/d,b=f/d;s=(h+m)/2,a=(p+b)/2;let g=h*s+p*a;g>.1&&(s/=g,a/=g)}else c>0?(s=-l/c,a=i/c):d>0&&(s=-u/d,a=f/d)}r.push({nx:s,ny:a})}return r}function ai(e,n,t,r=1){return e.map((o,s)=>({x:o.x+n[s].nx*t,y:o.y+n[s].ny*t/r}))}function fn(e,n,t,r){return(0,Y.packAbgr)(Math.round(e*255),Math.round(n*255),Math.round(t*255),Math.round(r*255))}function pn(e,n,t){let r=(1-Math.abs(2*t-1))*n,o=r*(1-Math.abs(e/60%2-1)),s=t-r/2,a=0,i=0,l=0;return e<60?(a=r,i=o):e<120?(a=o,i=r):e<180?(i=r,l=o):e<240?(i=o,l=r):e<300?(a=o,l=r):(a=r,l=o),[a+s,i+s,l+s]}var ii=[[68,1,84],[59,82,139],[33,145,140],[94,201,98],[253,231,37]],li=[[237,137,44],[158,42,122]],ci=[[220,50,50],[50,120,220]];function Kn(e,n){let t=Math.max(0,Math.min(1,n))*(e.length-1),r=Math.min(e.length-2,Math.floor(t)),o=t-r,s=e[r],a=e[r+1];return(0,Y.packAbgr)(Math.round(s[0]+(a[0]-s[0])*o),Math.round(s[1]+(a[1]-s[1])*o),Math.round(s[2]+(a[2]-s[2])*o),255)}function ui(e,n){let[t,r,o]=pn(it(e),bn,gn);return fn(t,r,o,n)}var di=300,fi=.7,pi=.5,Uo=[60,65,72],hi=(0,Y.packAbgr)(...Uo,255),su=`rgb(${Uo.join(", ")})`;function au(e,n){let t=Ut(e);if(n&&n.end>n.start)return{start:n.start,span:n.end-n.start,midpoints:t};let r=1/0,o=-1/0;for(let s of t.values())r=Math.min(r,s),o=Math.max(o,s);return{start:r===1/0?0:r,span:o>r?o-r:1,midpoints:t}}function mi(e){let n=1/0,t=-1/0,r=1/0,o=-1/0,s=0;for(let a of e.nodes)a.stable!==void 0&&a.stable.rank>s&&(s=a.stable.rank),a.depth<n&&(n=a.depth),a.depth>t&&(t=a.depth),a.length<r&&(r=a.length),a.length>o&&(o=a.length);return{minDepth:n,maxDepth:t,minLength:r,maxLength:o,maxRank:s,nodeCount:e.nodes.length}}function bi(e,n,t,r){switch(t){case"random":return ui(e.id,1);case"depth":return Kn(ii,r.maxDepth>r.minDepth?(e.depth-r.minDepth)/(r.maxDepth-r.minDepth):.5);case"node-length":return Kn(ci,r.maxLength>r.minLength?(e.length-r.minLength)/(r.maxLength-r.minLength):.5);case"stable-rank":return e.stable===void 0?(0,Y.packAbgr)(160,160,160,255):e.stable.rank===0?(0,Y.packAbgr)(52,152,219,255):Kn(li,r.maxRank>1?(e.stable.rank-1)/(r.maxRank-1):0);case"reference-position":{let o=r.referenceRamp,s=o?.midpoints.get(e.id);if(o===void 0||s===void 0)return(0,Y.packAbgr)(160,160,160,255);if(e.stable!==void 0&&e.stable.rank>0)return hi;let a=Math.max(0,Math.min(1,(s-o.start)/o.span)),[i,l,c]=pn(a*di,fi,pi);return fn(i,l,c,1)}case"grey":return(0,Y.packAbgr)(160,160,160,255);case"rainbow":{let o=r.nodeCount>1?n/r.nodeCount*360:0,[s,a,i]=pn(o,.75,.5);return fn(s,a,i,1)}default:return(0,Y.packAbgr)(52,152,219,255)}}function gi(e,n=1,t){let r=[[e.cx1,e.cy1],[e.cx0,e.cy0],[e.x0,e.y0]];for(let[o,s]of r){let a=e.x1-o,i=(e.y1-s)*n;if(Math.hypot(a,i)>0)return Math.atan2(i,a)}return t?Math.atan2((t.to.y-t.from.y)*n,t.to.x-t.from.x):0}function yi(e,n){let t=!1;for(let r=0;r<e.length-1&&!t;r++){let o=e[r],s=e[r+1];t=Math.max(o.x,s.x)>=n.minX&&Math.min(o.x,s.x)<=n.maxX&&Math.max(o.y,s.y)>=n.minY&&Math.min(o.y,s.y)<=n.maxY}return t}function xi(e,n){for(let t of e){let r=Math.min(t.x0,t.cx0,t.cx1,t.x1),o=Math.max(t.x0,t.cx0,t.cx1,t.x1),s=Math.min(t.y0,t.cy0,t.cy1,t.y1),a=Math.max(t.y0,t.cy0,t.cy1,t.y1);if(o>=n.minX&&r<=n.maxX&&a>=n.minY&&s<=n.maxY)return!0}return!1}var jo=new WeakMap;function Mi(e){let n=jo.get(e);if(!n){let t=[],r=new Map,o=e.paths??[];for(let s=0;s<o.length;s++){let[a,i,l]=pn(lt(s,o.length),bn,gn);t.push(fn(a,i,l,.85)),r.has(o[s].name)||r.set(o[s].name,s)}n={pathColorByIndex:t,pathIndexByName:r},jo.set(e,n)}return n}var Vo=new WeakMap,wi=new Map;function Li(e){let n=Vo.get(e);if(!n){n=new Map;for(let[t,r]of(e.paths??[]).entries())for(let o of new Set(r.nodeIds)){let s=n.get(o);s?s.push(t):n.set(o,[t])}Vo.set(e,n)}return n}function iu(e){let{nodePositions:n,graph:t,nodeById:r,colorScheme:o,contigThickness:s,connectorThickness:a,drawPaths:i,nodeWidth:l="uniform",highlight:c,axis:f,linearLayout:u,viewportBounds:d,referenceRamp:h,deletions:p,hiddenEdges:m,version:b=0}=e,g=l==="depth"?ut(t):0,y=f.scaleX,w=Ze(f),N=Yo(n,t,f,p,b),S=[],R=new Map,x=[],E=new Map,C=[],P=new Map,z={...mi(t),referenceRamp:h},W=new Map;if(o==="rainbow")for(let v=0;v<t.nodes.length;v++)W.set(t.nodes[v].id,v);let q=t.paths?.length??0,{pathColorByIndex:F,pathIndexByName:U}=Mi(t),j=v=>F[U.get(v)??-1]??ko,V=i&&q>1?Li(t):wi,We=y>(u?1:Ja);for(let v=0;v<t.edges.length;v++){let D=t.edges[v],K=n[D.from],Z=n[D.to],J=N.get(v);if(!K?.length||!Z?.length||!J||m?.has(v))continue;let se=D.pathIds?.length??0,ae=p?.get(v)!==void 0,ie=c?.edgeIndexes.has(v)??!1,ee=a/2*(ae?Wa:1)*(ie?Ya:1),he=i&&se>0,Ce=ae?Ha:Fa,we=c?ie?Xa:He(Ce,dn):Ce,Xe=r.get(D.to),mn=(Xe?yn(Xe,s,l,g):s)/2,Ie=(ke,ze,ne,ve)=>{let me=ke===0&&ze===0?J:Lt(J,ke,ze);if(d&&!xi(me,d))return;if(ae)for(let pr of wt(me,ka/y))C.push({curves:pr,thickness:ee,color:ne});else C.push({curves:me,thickness:ee,color:ne});let nt=We&&ve!==void 0?ti({curves:me,edgeHalfWidth:ee,nodeHalfWidth:mn,scale:y,yToX:w,color:ve,fromSegments:K,toSegments:Z}):void 0;nt&&x.push(nt)},Ye=C.length,_e=x.length;if(!he)Ie(0,0,we,we);else{let ke=Nt(K,Z,se,f),ze=Math.floor((se-1)/2);for(let ne=0;ne<se;ne++){let ve=ke[ne],me=j(D.pathIds[ne]);Ie(ve.x,ve.y,c&&D.pathIds[ne]!==c.name?He(me,dn):me,ne===ze?we:void 0)}}let Jn=C.length-Ye;Jn>0&&P.set(v,{start:Ye,count:Jn});let et=x.length-_e;et>0&&E.set(v,{start:_e,count:et})}for(let[v,D]of Object.entries(n)){let K=r.get(v);if(!K||d&&!yi(D,d))continue;let Z=bi(K,W.get(v)??0,o,z),J=c!==void 0&&!c.nodeIds.has(v),se=J?He(Z,dn):Z,Te=yn(K,s,l,g),ae=Te/2,ie=S.length,ee=V.get(v),he=Te/q,Ce=D.length>=2;if(Ce&&ee?.length&&he>=za){let Xe=si(D,w),mn=1/Math.max(y,ja);for(let Ie of ee){let Ye=(Ie-(q-1)/2)*he*mn,_e=F[Ie]??ko;S.push({points:ai(D,Xe,Ye,w),thickness:he/2,color:J?He(_e,dn):_e})}}else Ce&&S.push({points:D,thickness:ae,color:se});let we=S.length-ie;we>0&&R.set(v,{start:ie,count:we})}return{nodeStrokes:S,nodeStrokeRuns:R,arrows:x,arrowRuns:E,edgeCurves:C,edgeCurveRuns:P}}function du(e,n){let t=new Map(e.nodes.map(o=>[o.id,o])),r=new Map;n.nodes.forEach(o=>{let s=t.get(o.name);if(o.order>=0&&s&&B(s)){let{refName:a,start:i}=s.stable;(r.get(a)??r.set(a,[]).get(a)).push({bp0:i,bp1:i+o.sequenceLength,x0:o.x,x1:o.x+o.pixelWidth})}});for(let o of r.values())o.sort((s,a)=>s.bp0-a.bp0);return r}function Qn(e,n,t=!1){let r=0,o=e.length-1;for(;r<o;){let i=r+o>>1,l=e[i].bp1;(t?l<n:l<=n)?r=i+1:o=i}let s=e[r];if(n<=s.bp0)return s.x0;let a=s.bp1-s.bp0;return a>0?s.x0+(Math.min(n,s.bp1)-s.bp0)/a*(s.x1-s.x0):s.x0}function Zn(e,n,t){let r=Qn(e,n),o=Qn(e,t,!0);return{x0:Math.min(r,o),x1:Math.max(r,o)}}function fu(e){let n;for(let t of e.values())(!n||t.length>n.length)&&(n=t);return n}var Ko=5,Ni=10,Qo=110,Si=4,Ri=2.5;function Ei(e){return e?"#b0b0b8":"#55555c"}function Ai(e){let n=10**Math.floor(Math.log10(e)),t=e/n;return(t<=1?1:t<=2?2:t<=5?5:10)*n}function Ti(e,n,t,r){let o=e[0],s=e.at(-1);if(!o||!s)return;let a=n(o.x0),i=n(s.x1),l=s.bp1-o.bp0;if(i<=a||l<=0)return;let c=Ai(l/(i-a)*Qo),f=e.filter(y=>{let w=y.bp1-y.bp0;return w>=c&&(n(y.x1)-n(y.x0))*c/w<Qo/2}),u=[],d=[];for(let y of f){let w=n(y.x0),N=n(y.x1);if(N>=0&&w<=t){u.push({x0:w,x1:N});let S=on(y.bp1-y.bp0);d.push({text:S,at:(w+N)/2,width:r(S)})}}let h=[],p=[],m=0;for(let y=Math.ceil(o.bp0/c)*c;y<=s.bp1;y+=c){for(;m<f.length&&f[m].bp1<=y;)m++;if(m<f.length&&f[m].bp0<y)continue;let w=Math.round(n(Qn(e,y)))+.5;if(w>=0&&w<=t){h.push(w);let N=y.toLocaleString("en-US");p.push({text:N,at:w,width:r(N)})}}let b=[],g=y=>b.every(w=>Math.abs(y.at-w.at)>=(y.width+w.width)/2+Ni);for(let y of[...p,...d])g(y)&&b.push(y);return{from:a,to:i,ticks:h,squeezed:u,labels:b.map(({text:y,at:w})=>({text:y,at:w}))}}function Ci(e,n,t,r){let o=Math.max(1,Math.round((t-n)/Si)),s=(t-n)/o;for(let a=0;a<o;a++)e.lineTo(n+(a+.5)*s,r+(a%2?1:-1)*Ri);e.lineTo(t,r)}function pu(e,n,t,r){let{x:o,width:s,darkMode:a}=t;e.font="10px sans-serif";let i=Ti(n,o,s,f=>e.measureText(f).width);if(!i)return;let l=Ei(a),c=r+.5;e.strokeStyle=l,e.fillStyle=l,e.lineWidth=1,e.textAlign="center",e.textBaseline="top",e.beginPath(),e.moveTo(Math.max(0,i.from),c);for(let{x0:f,x1:u}of i.squeezed)e.lineTo(f,c),Ci(e,f,u,c);e.lineTo(Math.min(s,i.to),c);for(let f of i.ticks)e.moveTo(f,r),e.lineTo(f,r+Ko);e.stroke();for(let{text:f,at:u}of i.labels)e.fillText(f,u,r+Ko+2)}function bu(e,n){let t=new Map(e.nodes.map(o=>[o.id,o])),r=[];return n.nodes.forEach(o=>{let s=t.get(o.name);o.order>=0&&s&&B(s)&&r.push({node:o.name,bp0:s.stable.start,bp1:s.stable.start+o.sequenceLength,x0:o.x,x1:o.x+o.pixelWidth})}),r}function gu(e,n,t,r){let o=[];for(let s of e){let a=t(s.x0),i=t(s.x1);i>=0&&a<=r&&o.push({node:s.node,top0:n(s.bp0),top1:n(s.bp1),bottom0:a,bottom1:i})}return o}var Ii=3;function yu(e,n,t,r){if(n<=0||r<0||r>n)return;let o=r/n,s,a=Ii;for(let i of e){let l=i.top0+(i.bottom0-i.top0)*o,c=i.top1+(i.bottom1-i.top1)*o,f=Math.max(0,Math.min(l,c)-t,t-Math.max(l,c));f<a&&(a=f,s=i.node)}return s}function Zo(e,n,t){e.moveTo(n.top0,0),e.lineTo(n.top1,0),e.lineTo(n.bottom1,t),e.lineTo(n.bottom0,t),e.closePath()}function Jo(e,n,t){e.moveTo(n.top0,0),e.lineTo(n.bottom0,t),e.moveTo(n.top1,0),e.lineTo(n.bottom1,t)}function xu(e,n,t,{highlightNode:r,darkMode:o}){if(t<=0||n.length===0)return;let s=o?"255,255,255":"0,0,0";e.beginPath();for(let i of n)Zo(e,i,t);e.fillStyle=`rgba(${s},0.07)`,e.fill(),e.beginPath();for(let i of n)Jo(e,i,t);e.strokeStyle=`rgba(${s},0.35)`,e.lineWidth=.5,e.stroke();let a=n.find(i=>i.node===r);a&&(e.beginPath(),Zo(e,a,t),e.fillStyle="rgba(255,192,203,0.5)",e.fill(),e.beginPath(),Jo(e,a,t),e.strokeStyle="#ff0000",e.lineWidth=1,e.stroke())}function _i(e,n){let t=new Map(e.nodes.map(o=>[o.id,o])),r=[];return n.nodes.forEach((o,s)=>{let a=t.get(o.name);if(o.order>=0&&a&&B(a)){let i=a.stable.start;r.push({bp0:i,bp1:i+o.sequenceLength,index:s,node:o})}}),r.sort((o,s)=>o.bp0-s.bp0)}function vi(e,n,t){let r=0,o=e.length-1;for(;r<o;){let s=r+o+1>>1;e[s].bp0<=n?r=s:o=s-1}return[e[r],e[r-1]].find(s=>s&&t.has(s.index)&&s.bp0<=n&&n<=s.bp1)}function Lu(e,n,t){let r=_i(e,n),o=[];for(let s of n.tracks){let a=s.name?t.get(s.name):void 0;if(a?.length){let i=new Map;for(let l of s.path)l.node!==null&&l.y!==void 0&&!i.has(l.node)&&i.set(l.node,l.y);for(let l of a){let c=vi(r,l.start,i);if(c){let{node:f,bp0:u,bp1:d}=c,h=p=>f.x+(Math.min(p,d)-u)/(d-u)*f.pixelWidth;o.push({x0:h(l.start),x1:h(l.end),y:i.get(c.index),height:s.width})}}}}return o}function Bi(e){return e?"rgba(255,255,255,0.9)":"rgba(0,0,0,0.8)"}function Nu(e,n,{x:t,y:r,width:o,darkMode:s}){if(n.length!==0){e.fillStyle=Bi(s),e.beginPath();for(let a of n){let i=t(a.x0),l=Math.max(t(a.x1),i+1);if(l>=0&&i<=o){let c=r(a.y);e.rect(i,c,l-i,r(a.y+a.height)-c)}}e.fill()}}function Oi(e,n){let t=[],r=e.sequenceNew??[];return r.forEach((o,s)=>{let a=n.nodeMap.get(O(o.nodeName)),i=a===void 0?void 0:n.nodes[a],l=s;for(;l<e.path.length&&e.path[l].node!==a;)l+=1;let c=e.path[l]?.y;if(i&&c!==void 0){let f={readId:e.id,y:c,height:e.width,nodeY:i.y},u=d=>Ro(i,d);for(let d of o.mismatches){let h=u(d.pos);if(h!==null){if(d.type==="insertion"){let p=s===0&&d.pos===e.firstNodeOffset||s===r.length-1&&d.pos===e.finalNodeCoverLength;t.push({...f,kind:"insertion",x:h,seq:d.seq,softClip:p})}else if(d.type==="deletion"&&d.length!==void 0){let p=u(d.pos+d.length);p!==null&&t.push({...f,kind:"deletion",x0:h,x1:p})}else if(d.type==="substitution"&&d.seq!==void 0){let p=u(d.pos+d.seq.length);p!==null&&t.push({...f,kind:"substitution",x0:h,x1:p,seq:d.seq})}}}}}),t}function er(e){return e.reads.flatMap(n=>Oi(n,e))}function sr(e){let n=e.trim().split(/[\s,]+/),t=[],r=0,o=()=>Number(n[r++]);for(;r<n.length;){let s=n[r++];s==="M"||s==="L"?t.push({op:s,x:o(),y:o()}):s==="H"?t.push({op:s,x:o()}):s==="V"?t.push({op:s,y:o()}):s==="Q"?t.push({op:s,x1:o(),y1:o(),x:o(),y:o()}):s==="C"?t.push({op:s,x1:o(),y1:o(),x2:o(),y2:o(),x:o(),y:o()}):s==="Z"&&t.push({op:s})}return t}function ar(e){let n=1/0,t=-1/0;for(let r of e)"x"in r&&(n=Math.min(n,r.x),t=Math.max(t,r.x)),"x1"in r&&(n=Math.min(n,r.x1),t=Math.max(t,r.x1));return{x0:n,x1:t}}function nr(e,n,t){let r=sr(e);return{commands:r,color:n,alpha:t,...ar(r)}}function tr(e,n){let{shapes:t}=e,r=[...t.rectangles,...t.verticalRectangles].filter(a=>a.type===n).map(a=>({color:a.color,alpha:a.alpha??1,x0:a.xStart,x1:a.xEnd+1,y0:a.yStart,y1:a.yEnd+1})),o=Eo(t.curves,n).map(a=>nr(a.path,a.color,a.alpha??1)),s=t.corners.filter(a=>a.type===n).map(a=>nr(a.path,a.color,1));return{rects:r,shapes:[...o,...s]}}function Cu(e){let n=[];return e.nodes.forEach(t=>{if(t.order>=0){let r=sr(Ao(t));n.push({name:t.name,commands:r,...ar(r)})}}),{bounds:e.bounds,layers:[tr(e,"haplotype"),tr(e,"read")],nodes:n,mismatches:er(e).filter(t=>t.kind!=="insertion"||!t.softClip)}}function or(e,n,t,r){let o=0,s=0;for(let a of n)switch(a.op){case"M":o=a.x,s=a.y,e.moveTo(t(o),r(s));break;case"L":o=a.x,s=a.y,e.lineTo(t(o),r(s));break;case"H":o=a.x,e.lineTo(t(o),r(s));break;case"V":s=a.y,e.lineTo(t(o),r(s));break;case"Q":o=a.x,s=a.y,e.quadraticCurveTo(t(a.x1),r(a.y1),t(o),r(s));break;case"C":o=a.x,s=a.y,e.bezierCurveTo(t(a.x1),r(a.y1),t(a.x2),r(a.y2),t(o),r(s));break;case"Z":e.closePath();break}}function rr(e,n,t,r){let o=new Map;for(let s of n)if(t(s)){let a=`${s.color}|${s.alpha}`,i=o.get(a);i?i.push(s):o.set(a,[s])}for(let s of o.values()){e.fillStyle=s[0].color,e.globalAlpha=s[0].alpha,e.beginPath();for(let a of s)r(a);e.fill()}e.globalAlpha=1}var Pi=12,Gi=.15;function Di(e){return Math.max(Gi,Math.min(1,e/Pi))}function Iu(e,n,t){let{x:r,y:o,width:s}=t,a=c=>r(c.x1)>=0&&r(c.x0)<=s;for(let c of n.layers)rr(e,c.rects,a,f=>{let u=r(f.x0),d=o(f.y0);e.rect(u,d,r(f.x1)-u,o(f.y1)-d)}),rr(e,c.shapes,a,f=>{or(e,f.commands,r,o)});let i=t.darkMode?"#d0d0d0":"#000000",l=t.darkMode?"rgba(40,40,40,0.4)":"rgba(255,255,255,0.4)";e.lineWidth=2*Math.max(.25,Math.min(1,t.yScale));for(let c of n.nodes)if(a(c)){let f=c.name===t.highlightNode;e.beginPath(),or(e,c.commands,r,o),e.fillStyle=f?"rgba(255,192,203,0.5)":l,e.strokeStyle=f?"#ff0000":i,e.fill(),e.globalAlpha=f?1:Di(r(c.x1)-r(c.x0)),e.stroke(),e.globalAlpha=1}Fi(e,n.mismatches,t)}var $i=12,qi=6;function Fi(e,n,{x:t,y:r,yScale:o,width:s,darkMode:a}){let i=$i*o;if(i<qi||n.length===0)return;let l=(c,f)=>t(f)>=0&&t(c)<=s;e.fillStyle="grey",e.beginPath();for(let c of n)if(c.kind==="deletion"&&l(c.x0,c.x1)){let f=t(c.x0),u=r(c.y);e.rect(f,u,t(c.x1)-f,r(c.y+c.height)-u)}e.fill(),e.font=`${i}px monospace`,e.textBaseline="alphabetic",e.fillStyle=a?"#ffffff":"#000000";for(let c of n)c.kind==="substitution"&&l(c.x0,c.x1)?e.fillText(c.seq,t(c.x0)+1,r(c.y+c.height)):c.kind==="insertion"&&l(c.x,c.x)&&e.fillText("*",t(c.x)-3,r(c.y+c.height))}function Bu(e,n){let t=[];for(let r of n){let o=e.get(r.refName),s=o?.[0],a=o?.at(-1);if(!o||!s||!a)continue;let i=Math.max(r.start,s.bp0),l=Math.min(r.end,a.bp1);l<=i||t.push({gene:r,...Zn(o,i,l),exons:r.exons.filter(c=>c.end>i&&c.start<l).map(c=>Zn(o,Math.max(c.start,i),Math.min(c.end,l)))})}return t}var ir=22,Hi=4,hn=8,Wi="11px sans-serif",Xi=8;function Ou(e){let n=e.flatMap(o=>[{x:o.x0,step:1},{x:o.x1,step:-1}]).sort((o,s)=>o.x-s.x||o.step-s.step),t=0,r=0;for(let{step:o}of n)t+=o,r=Math.max(r,t);return Math.min(Hi,r)}function Pu(e,n,t,r,o=0){let{x:s,width:a,darkMode:i}=t,l=Math.max(1,Math.floor((r-o)/ir)),c=[],f=i?"#e0e0e6":"#1c1c22";e.font=Wi,e.textAlign="center",e.textBaseline="alphabetic",e.fillStyle=f,e.strokeStyle=f,e.lineWidth=1;let u=n.map(d=>({g:d,s0:s(d.x0),s1:s(d.x1)})).filter(({s0:d,s1:h})=>h>=0&&d<=a).sort((d,h)=>d.s0-h.s0);for(let{g:d,s0:h,s1:p}of u){let m=d.gene.strand>0?" \u2192":d.gene.strand<0?"\u2190 ":"",b=d.gene.strand<0?`${m}${d.gene.name}`:`${d.gene.name}${m}`,g=(Math.max(h,0)+Math.min(p,a))/2,y=e.measureText(b).width/2,w=Math.min(h,g-y),N=Math.max(p,g+y),S=c.findIndex(x=>x+Xi<=w);S===-1&&(S=Math.min(c.length,l-1)),c[S]=Math.max(c[S]??-1/0,N);let R=r-S*ir-hn/2;e.beginPath(),e.moveTo(h,R+.5),e.lineTo(p,R+.5),e.stroke();for(let x of d.exons){let E=s(x.x0);e.fillRect(E,R-hn/2,Math.max(1,s(x.x1)-E),hn)}e.fillText(b,g,R-hn/2-2)}}function ki(e,n){return Math.abs(n-e)<=.1*Math.max(e,n)}function zi(e,n){let t=e.length,r=n.length,o=Array.from({length:t+1},()=>new Array(r+1).fill(0)),s=Array.from({length:t+1},()=>new Array(r+1).fill(!1));for(let i=t-1;i>=0;i--)for(let l=r-1;l>=0;l--){let c=Math.abs(e[i]-n[l])+o[i+1][l+1],f=t-i>r-l?o[i+1][l]:1/0,u=r-l>t-i?o[i][l+1]:1/0;o[i][l]=Math.min(c,f,u),s[i][l]=o[i][l]===c}let a=new Array(t).fill(void 0);for(let i=0,l=0;i<t&&l<r;)s[i][l]?a[i++]=l++:t-i>r-l?i++:l++;return a}function cr(e,n){return e.map((t,r)=>({item:t,i:r})).sort((t,r)=>n(t.item)-n(r.item))}var dr=e=>e.spanningReads!==0;function ur(e,n){return{...n,agrees:e.complete&&dr(n)?ki(e.bp,n.bp):void 0}}function ji(e,n){let t=new Map,r=new Set;e.forEach((i,l)=>{let c=n.find(f=>f.haplotype!==void 0&&f.haplotype===i.haplotype);c&&(r.add(c),t.set(l,ur(i,c)))});let o=n.filter(i=>i.haplotype===void 0),s=cr(e,i=>i.bp),a=[[s.filter(i=>i.item.complete),o.filter(dr)],[s,o]];for(let[i,l]of a){let c=i.filter(u=>!t.has(u.i)),f=cr(l.filter(u=>!r.has(u)),u=>u.bp);zi(c.map(u=>u.item.bp),f.map(u=>u.item.bp)).forEach((u,d)=>{if(u!==void 0){let h=c[d],p=f[u].item;r.add(p),t.set(h.i,ur(h.item,p))}})}return t}function $u(e,n){if(!n)return e;let t=new Map,r=new Map;for(let o of e)r.set(o.sample,[...r.get(o.sample)??[],o]);for(let[o,s]of r){let a=n[o];if(a)for(let[i,l]of ji(s,a))t.set(s[i],l)}return e.map(o=>({...o,call:t.get(o)}))}var fr=be(Ve(),1),Hu=(0,te.createSvgIcon)((0,fr.jsx)("path",{d:"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6"}),"Settings");export{te as a,cs as b,Vn as c,ge as d,Hl as e,Wl as f,Xl as g,Yl as h,Zi as i,Mt as j,Lt as k,Ze as l,Nt as m,Es as n,tl as o,sl as p,al as q,il as r,Bt as s,on as t,Qr as u,Gt as v,gl as w,Do as x,Da as y,De as z,gs as A,Yn as B,Ra as C,jn as D,Yc as E,kc as F,qa as G,Vc as H,Yo as I,di as J,su as K,au as L,iu as M,du as N,fu as O,Si as P,Ri as Q,Ei as R,Ti as S,pu as T,bu as U,gu as V,yu as W,xu as X,Lu as Y,Bi as Z,Nu as _,Cu as $,Iu as aa,Bu as ba,ir as ca,Ou as da,Pu as ea,Yi as fa,$u as ga,wl as ha,Ll as ia,ss as ja,Nl as ka,Sl as la,In as ma,Gl as na,Dl as oa,Hu as pa};
2
- //# sourceMappingURL=chunk-CJ56O2VG.js.map