jbrowse-plugin-graphgenomeviewer 4.0.19 → 4.0.21

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 (38) hide show
  1. package/README.md +2 -1
  2. package/dist/chunks/{GbzBaseSyntenyAdapter-KKSNCZXY.js → GbzBaseSyntenyAdapter-7ZKFAEJG.js} +2 -2
  3. package/dist/chunks/{GbzBaseSyntenyAdapter-KKSNCZXY.js.map → GbzBaseSyntenyAdapter-7ZKFAEJG.js.map} +2 -2
  4. package/dist/chunks/{GraphGenomeView-37F7MLFQ.js → GraphGenomeView-CLUMXH4K.js} +2 -2
  5. package/dist/chunks/{GraphTrackSettingsDialog-2QV6TPX7.js → GraphTrackSettingsDialog-QF5OMTCH.js} +2 -2
  6. package/dist/chunks/{LinearGraphDisplay-CJHA56RB.js → LinearGraphDisplay-4CMVCEM5.js} +2 -2
  7. package/dist/chunks/chunk-3FGJLRG2.js +2 -0
  8. package/dist/chunks/chunk-3FGJLRG2.js.map +7 -0
  9. package/dist/chunks/chunk-3SZJ4AFI.js +3 -0
  10. package/dist/chunks/chunk-3SZJ4AFI.js.map +7 -0
  11. package/dist/chunks/{chunk-5E7TVPCI.js → chunk-CLRXQ6BM.js} +2 -2
  12. package/dist/chunks/chunk-VIFXYTIS.js +2 -0
  13. package/dist/chunks/chunk-VIFXYTIS.js.map +7 -0
  14. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +2 -2
  15. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +3 -3
  16. package/package.json +2 -2
  17. package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.ts +1 -1
  18. package/src/GetSubgraph.ts +3 -0
  19. package/src/GraphGenomeView/components/BubbleHalos.tsx +3 -4
  20. package/src/GraphGenomeView/components/GraphCanvas.tsx +51 -15
  21. package/src/GraphGenomeView/components/LabelLayer.tsx +5 -6
  22. package/src/GraphGenomeView/components/WalkSelect.tsx +26 -13
  23. package/src/GraphGenomeView/model.test.ts +48 -0
  24. package/src/GraphGenomeView/model.ts +75 -21
  25. package/src/GraphGenomeView/viewModel.ts +15 -0
  26. package/src/LinearGraphDisplay/LinearGraphDisplay.test.ts +23 -2
  27. package/src/LinearGraphDisplay/model.ts +7 -2
  28. package/src/version.ts +1 -1
  29. package/dist/chunks/chunk-BI3M6FZD.js +0 -2
  30. package/dist/chunks/chunk-BI3M6FZD.js.map +0 -7
  31. package/dist/chunks/chunk-IUIIYSGF.js +0 -2
  32. package/dist/chunks/chunk-IUIIYSGF.js.map +0 -7
  33. package/dist/chunks/chunk-MNOQXDMY.js +0 -3
  34. package/dist/chunks/chunk-MNOQXDMY.js.map +0 -7
  35. /package/dist/chunks/{GraphGenomeView-37F7MLFQ.js.map → GraphGenomeView-CLUMXH4K.js.map} +0 -0
  36. /package/dist/chunks/{GraphTrackSettingsDialog-2QV6TPX7.js.map → GraphTrackSettingsDialog-QF5OMTCH.js.map} +0 -0
  37. /package/dist/chunks/{LinearGraphDisplay-CJHA56RB.js.map → LinearGraphDisplay-4CMVCEM5.js.map} +0 -0
  38. /package/dist/chunks/{chunk-5E7TVPCI.js.map → chunk-CLRXQ6BM.js.map} +0 -0
@@ -0,0 +1,2 @@
1
+ import{a as c,b as u}from"./chunk-KULNKXPT.js";import{a as L}from"./chunk-FY3BTKY4.js";var j=L((Ne,N)=>{N.exports=JBrowseExports["tss-react/mui"]});var E=/:(\d+)-\d+$/;function l(e){let t=E.exec(e);return t?{name:e.slice(0,t.index),start:+t[1]}:{name:e,start:0}}function z(e,t){let n=[],r=new Map;for(let o of e){let s=c(o.name),a=o.start;for(let i of o.steps){let p={path:o.name,sample:s,start:a,strand:i.strand},h=r.get(i.id);h?h.push(p):r.set(i.id,[p]),a+=t(i.id)}n.push({name:o.name,sample:s,start:o.start,length:a-o.start})}return{anchorPaths:n,pathVisits:r}}function _(e,t){return e.find(r=>r.sample===t||r.name===t)??e[0]}var x=1;function G(e,t,n){let r=e;if(t&&t.length>0){let o=t.find(s=>s.path===n)??t[0];r={...e,stable:{refName:o.path,start:o.start,rank:o.path===n?0:x,strand:o.strand},samples:[...new Set(t.map(s=>s.sample))].sort()}}return r}function S(e,t){let{anchorPaths:n,pathVisits:r}=e,o=n&&r?_(n,t):void 0;return o&&r?{...e,nodes:e.nodes.map(s=>G(s,r.get(s.name),o.name)),anchoredBy:"paths",referencePath:o.name}:e}function K(e,t){return e.anchoredBy==="tags"?e:S(e,t)}function Z(e){let t=0;for(let n=0;n<e.length;n++)t=e.charCodeAt(n)+((t<<5)-t);return Math.abs(t%360)}function A(e,t){return e*360/t}var O=.7,M=.5,w=16;function ee(e){return e>0&&e<=w}function P(e,t){return`hsl(${A(e,t)}, ${O*100}%, ${M*100}%)`}function te(e,t){return`hsl(0, 0%, ${t>1?25+45*e/(t-1):45}%)`}function y(e){let t=l(e).name.split("#"),n=t.join("#");if(t.length>=3&&u(t[0])){let r=t.slice(2).join("#");return[r,r,n]}return[t[0],t.slice(0,2).join("#"),n]}function T(e){return String(e).replace(/\B(?=(\d{3})+$)/g,",")}function D(e,t){let{start:n}=l(e);return t.map(r=>`${r} @${T(n)}`)}function ne(e,t){let n=e.map(a=>y(a.name)),r=[0,1,2].flatMap(a=>[e.map((i,p)=>n[p][a]),e.map((i,p)=>D(i.name,n[p])[a])]),s=r.find(a=>new Set(a).size===e.length)??r.at(-1);return e.map((a,i)=>({name:a.name,label:s[i],color:t?.[i]??P(i,e.length)}))}function oe(e,t){return Math.max(e.nodeLengthPerMegabase*t/1e6,e.minimumNodeLength)}function R(e,t=5){let r=e.nodes.reduce((s,a)=>s+a.length,0)/1e6,o=Math.max(e.nodes.length*40,500);return{nodeLengthPerMegabase:r>0?o/r:1e4,minimumNodeLength:Math.max(5,t),edgeLength:5,nodeSegmentLength:20}}var d={power:1,effect:1};function H(e){return e.power===1&&e.effect===1}function I(e,t){let n=e.nodes.length,r=e.nodes.reduce((a,i)=>a+i.length,0),o=n>0?r/n:0,s=n>0?Math.max(n*40,500)/n:40;return a=>{if(o<=0)return s;let i=(a/o)**t.power;return Math.max(s*((i-1)*t.effect+1),5)}}var m=1e3,v={law:d,minNodeLength:0};function ae(e,t=v){let{law:n,minNodeLength:r}=t,o=R(e,r);if(H(n))return{nodes:e.nodes,opts:o};let s=I(e,n);return{nodes:e.nodes.map(a=>({...a,length:Math.round(s(a.length)*m)})),opts:{...o,nodeLengthPerMegabase:1e6/m,minimumNodeLength:5}}}var f=[{value:"auto",label:"Proportional",description:"Bandage's own scale: a node draws proportional to its length, so a 1 bp allele is a speck.",law:d,minNodeFactor:0},{value:"open",label:"Open bubbles",description:"Give every allele a drawn length, so a bubble reads as two arms rather than a knot.",law:d,minNodeFactor:2.5},{value:"wide",label:"Wide bubbles",description:"As open, spread further. Best on a window of a dozen bubbles.",law:d,minNodeFactor:10},{value:"compress",label:"Compress lengths",description:"Pull the longest and shortest nodes towards the graph\u2019s mean, so a cut spanning kb and bp fits one pane.",law:{power:.5,effect:.5},minNodeFactor:0}],pe=f.map(e=>e.value);function de(e){let t=f.find(n=>n.value===e);return{law:t?.law??d,minNodeLength:(t?.minNodeFactor??0)*40}}var C=[{value:"auto",label:"Auto"},{value:"uniform",label:"Uniform"},{value:"random",label:"Random"},{value:"rainbow",label:"Rainbow"},{value:"depth",label:"Depth"},{value:"node-length",label:"Node Length"},{value:"stable-rank",label:"Stable rank"},{value:"reference-position",label:"Reference position"},{value:"grey",label:"Grey"}],he=C.map(e=>e.value);function ce(e,t){return e!=="auto"?e:t?.anchoredBy?"reference-position":"uniform"}var F=[{value:"depth",label:"By depth",description:"Thicker the more paths carry a node, on the square root of its depth against the mean. A graph with one depth everywhere draws uniform."},{value:"uniform",label:"Uniform",description:"Every node the same thickness."}],me=F.map(e=>e.value),U=.3,g=3;function W(e){let t=0,n=0;for(let r of e.nodes)t+=r.depth*r.length,n+=r.length;return n>0?t/n:0}function k(e,t){return!(t>0)||!(e.depth>0)?1:Math.min(g,Math.max(U,Math.sqrt(e.depth/t)))}function V(e,t,n,r){return t*(n==="depth"?k(e,r):1)}function $(e,t){return e*(t==="depth"?g:1)}function fe(e,t,n,r){let o=e?W(e):0;return{maxHalfWidthPx:$(n,r)/2,halfWidthPx:s=>{let a=t?.get(s);return a?V(a,n,r,o)/2:n/2}}}export{l as a,z as b,_ as c,S as d,K as e,Z as f,A as g,O as h,M as i,w as j,ee as k,P as l,te as m,ne as n,oe as o,ae as p,f as q,pe as r,de as s,C as t,he as u,ce as v,F as w,me as x,W as y,V as z,fe as A,j as B};
2
+ //# sourceMappingURL=chunk-VIFXYTIS.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["global-externals:tss-react/mui", "../../packages/core/src/pathAnchoring.ts", "../../packages/core/src/pathColors.ts", "../../packages/core/src/layout/drawnScale.ts", "../../packages/core/src/bubbleSpreads.ts", "../../packages/core/src/colorSchemes.ts", "../../packages/core/src/nodeWidths.ts"],
4
+ "sourcesContent": ["module.exports = JBrowseExports[\"tss-react/mui\"];", "import { REFERENCE_RANK } from './anchoredNodes'\nimport { panSNSample } from './pansn'\n\nimport type { Graph, GraphNode, PathOrigin, PathVisit } from './types'\n\n// Reference coordinates for a GFA that tags none of its segments with one.\n//\n// rGFA writes the fact per segment (SN/SO/SR). A pggb / odgi / Minigraph-Cactus\n// graph writes the same fact once per path and leaves the arithmetic to the\n// reader: walking a path's steps in order, accumulating segment lengths,\n// assigns every segment that path visits an interval on the path's own\n// sequence. Same information, different encoding \u2014 so a general GFA is not a\n// degraded rGFA, and the anchored layouts work on it once the walk is done.\n//\n// It carries one thing rGFA cannot: a segment's *carriage*, the set of\n// assemblies that actually traverse it. rGFA's SR is build order, so there the\n// most a segment can say is which assembly first contributed it.\n\n// `odgi extract` names an extracted path for the interval it covers on its own\n// sequence: `K12#1#chr:1004500-1004961`. That suffix is the only place a cut\n// subgraph states where in the genome it sits, so it is split off here rather\n// than carried around as part of the name \u2014 no assembly has a sequence called\n// `K12#1#chr:1004500-1004961`, and PanSN parsing of it yields a contig no\n// linear view can open.\n//\n// Anchored on the digits rather than on a trailing colon, because a stable name\n// may legitimately contain one (the same hazard gfaParser's tag splitting has).\nconst RANGE_SUFFIX = /:(\\d+)-\\d+$/\n\nexport function pathOrigin(pathName: string) {\n const match = RANGE_SUFFIX.exec(pathName)\n return match\n ? { name: pathName.slice(0, match.index), start: +match[1]! }\n : { name: pathName, start: 0 }\n}\n\nexport interface PathSteps {\n name: string\n start: number\n steps: { id: string; strand: '+' | '-' }[]\n}\n\n// The single walk. Every segment visit lands in `pathVisits` at the bp its own\n// path reaches it at; `anchorPaths` is what the walk learned about the paths\n// themselves, which is what a reference-path picker lists.\nexport function surveyPaths(\n paths: PathSteps[],\n lengthOf: (segmentId: string) => number,\n) {\n const anchorPaths: PathOrigin[] = []\n const pathVisits = new Map<string, PathVisit[]>()\n for (const path of paths) {\n const sample = panSNSample(path.name)\n let pos = path.start\n for (const step of path.steps) {\n const visit = {\n path: path.name,\n sample,\n start: pos,\n strand: step.strand,\n }\n const existing = pathVisits.get(step.id)\n if (existing) {\n existing.push(visit)\n } else {\n pathVisits.set(step.id, [visit])\n }\n pos += lengthOf(step.id)\n }\n anchorPaths.push({\n name: path.name,\n sample,\n start: path.start,\n length: pos - path.start,\n })\n }\n return { anchorPaths, pathVisits }\n}\n\n// Which path x is drawn on. This is a choice, not a fact: a general GFA's path\n// names are arbitrary and nothing in the file marks one of them as the\n// reference, so a preference is matched against a path's PanSN sample name (the\n// assembly a subgraph was cut against, which is how the launch path knows) and\n// then against its full name. With no preference the first path in the file\n// wins, which is where pggb and odgi leave the reference.\nexport function chooseReferencePath(\n anchorPaths: PathOrigin[],\n preferred: string | undefined,\n) {\n const named = anchorPaths.find(\n p => p.sample === preferred || p.name === preferred,\n )\n return named ?? anchorPaths[0]\n}\n\n// Rank on a path-derived graph is the one distinction the paths support: on the\n// reference path or off it. rGFA's higher ranks are minigraph's build order,\n// which a path GFA has no equivalent of, so drawing more rows than this would\n// be drawing structure the file does not state.\nconst OFF_REFERENCE_RANK = 1\n\n// A segment the reference path visits sits on the backbone at the offset that\n// visit reaches it. One it never visits is an alternate allele, placed on the\n// coordinates of the first path that does carry it \u2014 the same asymmetry rGFA\n// has, where a rank>0 segment's SO is an offset on the assembly that\n// contributed the sequence rather than on the reference.\n//\n// **First visit wins** when a path reaches the same segment more than once, and\n// collapsed repeats make that real rather than hypothetical: pggb folds the\n// E. coli rRNA operons into shared segments, so every strain's path walks them\n// twice (`odgi depth` reaches 10 over a five-strain graph at chr:4,167,000 and\n// chr:3,942,000). A node draws as one tube at one x, so the alternative to\n// picking a copy is one tube spanning both, claiming reference the segment does\n// not occupy. The repeat stays visible as depth: such a node's traversal count\n// is a multiple of the path count.\nfunction anchorNode(\n node: GraphNode,\n visits: PathVisit[] | undefined,\n reference: string,\n): GraphNode {\n let anchored = node\n if (visits && visits.length > 0) {\n const anchor = visits.find(v => v.path === reference) ?? visits[0]!\n anchored = {\n ...node,\n stable: {\n refName: anchor.path,\n start: anchor.start,\n rank: anchor.path === reference ? REFERENCE_RANK : OFF_REFERENCE_RANK,\n strand: anchor.strand,\n },\n samples: [...new Set(visits.map(v => v.sample))].sort(),\n }\n }\n return anchored\n}\n\n// Re-runnable against a different reference path at no parsing cost, which is\n// what the picker needs: the walk is already recorded in `pathVisits`, and only\n// which path counts as rank 0 changes.\nexport function anchorFromPaths(graph: Graph, preferred: string | undefined) {\n const { anchorPaths, pathVisits } = graph\n const reference =\n anchorPaths && pathVisits\n ? chooseReferencePath(anchorPaths, preferred)\n : undefined\n return reference && pathVisits\n ? ({\n ...graph,\n nodes: graph.nodes.map(node =>\n anchorNode(node, pathVisits.get(node.name), reference.name),\n ),\n anchoredBy: 'paths',\n referencePath: reference.name,\n } satisfies Graph)\n : graph\n}\n\n// rGFA states coordinates on every segment, so only a graph that states none\n// has to derive them. A GFA with neither tags nor paths comes back untouched\n// and falls through to the force layout, which is the honest answer for it.\nexport function anchorGraph(graph: Graph, preferred: string | undefined) {\n return graph.anchoredBy === 'tags' ? graph : anchorFromPaths(graph, preferred)\n}\n", "import { isGenericSample } from './pansn'\nimport { pathOrigin } from './pathAnchoring'\n\nimport type { GraphPath } from './types'\n\n// Deterministic colour from a string (djb2-style hash to an HSL hue). Fine for\n// the `random` node scheme, where a collision between two of thousands of nodes\n// means nothing. NOT what the path ribbons use: see pathHueAt.\nexport function nameHue(name: string) {\n let hash = 0\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash)\n }\n return Math.abs(hash % 360)\n}\n\n// Ribbon hues are spread evenly over the wheel by position in the path list,\n// not hashed from the path name. A hash draws from the wheel at random, and at\n// five paths two of them landing on the same hue is common rather than\n// unlucky: `Sakai#1#chr:1983339-1983535` and `NCTC86#1#chr:1709109-1710286`\n// hash 26 degrees apart, which is two purples and a legend that cannot be read\n// off the drawing. Evenly spaced, the worst case is the best available.\n//\n// The cost is that a path's colour depends on how many paths there are, so it\n// moves when the cut changes. That is what the legend is for, and it is the\n// same trade the Bandage demo this was ported from made.\nexport function pathHueAt(index: number, count: number) {\n return (index * 360) / count\n}\n\nexport const PATH_SATURATION = 0.7\nexport const PATH_LIGHTNESS = 0.5\n\n// Past this many paths a graph cannot be drawn per path at all, and the WHOLE\n// of `drawPaths` goes off with it: the node stripes, the edge ribbons and the\n// key naming them.\n//\n// One number for all three because they are one statement, and they used to\n// disagree. Only the stripes were capped. So a Minigraph-Cactus cut, which\n// writes one W record per haplotype and walks every backbone link with all of\n// them, drew: no stripes at all, a key hundreds of rows tall, and one bezier\n// stroke per path per edge \u2014 measured at 99,800 strokes and 64 ms of geometry\n// for 200 paths over 499 links, against 2,495 strokes for the five-path pggb\n// cut the figures use. Every one of those is its own `beginPath`/`stroke` on\n// the Canvas2D backend, every frame.\n//\n// 16 is where the drawing stops SAYING anything, not where it stops being fast.\n// `pathHueAt` spreads the wheel evenly, so 16 hues are 22 degrees apart and\n// still tellable and 200 are one degree; the ribbon fan is PATH_RIBBON_SPACING\n// per path, so 16 of them is a legible fan and 200 is a band wider than the\n// nodes; and a key past about 16 rows is taller than the drawing beside it.\n// Above the cap the honest picture is the plain one \u2014 which is exactly what a\n// graph carrying no paths at all already draws.\nexport const MAX_PATH_COLORS = 16\n\n// Whether this graph's paths can be drawn as colours. Resolve it once and hand\n// the answer down: the geometry, the hit index and the key each used to decide\n// for themselves, which is how they came to disagree.\nexport function pathColorsLegible(pathCount: number) {\n return pathCount > 0 && pathCount <= MAX_PATH_COLORS\n}\n\nexport function pathCssColor(index: number, count: number) {\n return `hsl(${pathHueAt(index, count)}, ${PATH_SATURATION * 100}%, ${\n PATH_LIGHTNESS * 100\n }%)`\n}\n\n// Beside reads, which take the blues and the reds, a tube map's paths step\n// from dark grey to light, as sequenceTubeMap draws them under reads, so no\n// tube shares a read's colour\nexport function pathGreyCssColor(index: number, count: number) {\n const lightness = count > 1 ? 25 + (45 * index) / (count - 1) : 45\n return `hsl(0, 0%, ${lightness}%)`\n}\n\n// A path is named the way its file names it \u2014 `K12#1#chr:1004500-1004961` for a\n// P record `odgi extract` wrote, `HG00738#1` for a W record \u2014 and neither is a\n// legend entry. The label is the least of that name which still tells the paths\n// apart: the sample where samples are unique, the haplotype too where they are\n// not, the whole stable name where even that repeats. Widening it for every row\n// rather than only for the colliding ones, because a legend where one entry is\n// `HG00738#1` and its neighbour is `HG01071` reads as two kinds of thing.\n// A generic path, which vg files under a placeholder sample\n// (`_gbwt_ref#0#GI262359905`), is named by its contig alone.\nfunction labelTiers(name: string) {\n const parts = pathOrigin(name).name.split('#')\n const full = parts.join('#')\n if (parts.length >= 3 && isGenericSample(parts[0]!)) {\n const contig = parts.slice(2).join('#')\n return [contig, contig, full]\n }\n return [parts[0]!, parts.slice(0, 2).join('#'), full]\n}\n\n// Locale-independent, unlike toLocaleString: a figure regenerated on a machine\n// with a different locale would otherwise differ from the committed one.\nfunction groupDigits(n: number) {\n return String(n).replace(/\\B(?=(\\d{3})+$)/g, ',')\n}\n\n// A collapsed repeat puts one sequence through the same segments more than\n// once, and `odgi extract` emits one path per visit \u2014 nine visits over five\n// E. coli chromosomes at the rRNA operons, where every name tier above collides\n// because the sequence really is the same one. What separates those is the\n// offset each name carried, which is the one thing pathOrigin strips off.\nfunction offsetTiers(name: string, tiers: string[]) {\n const { start } = pathOrigin(name)\n return tiers.map(t => `${t} @${groupDigits(start)}`)\n}\n\nexport interface PathLegendEntry {\n name: string\n label: string\n color: string\n}\n\n// `colors` is what each path was actually drawn in, where that is not\n// pathCssColor's hue\nexport function pathLegend(\n paths: GraphPath[],\n colors?: readonly string[],\n): PathLegendEntry[] {\n const named = paths.map(p => labelTiers(p.name))\n // narrowest first, and the offset is tried before the next name tier: two\n // copies of one operon are told apart by where they are, not by widening a\n // name that is genuinely identical\n const candidates = [0, 1, 2].flatMap(t => [\n paths.map((_, i) => named[i]![t]!),\n paths.map((p, i) => offsetTiers(p.name, named[i]!)[t]!),\n ])\n const distinct = candidates.find(\n labels => new Set(labels).size === paths.length,\n )\n // Nothing separates two paths with the same name and the same offset, so the\n // widest labelling is as close as any can get.\n const labels = distinct ?? candidates.at(-1)!\n return paths.map((path, i) => ({\n name: path.name,\n label: labels[i]!,\n color: colors?.[i] ?? pathCssColor(i, paths.length),\n }))\n}\n", "import type { Graph, GraphNode } from '../types'\n\nexport interface BandageScaleOpts {\n nodeLengthPerMegabase: number\n minimumNodeLength: number\n nodeSegmentLength: number\n edgeLength: number\n}\n\n// Node drawn length, in FMMM units, as a function of bp. Used both by the layouts\n// that run here and by the options handed to the WASM engine, so a graph is drawn\n// at the same scale whichever one draws it. Bandage's own auto rule\n// (`AssemblyGraph::determineGraphInfo`):\n// pick units-per-megabase so the *mean* drawn node length lands on 40, with a\n// floor on total drawn length so a small graph doesn't collapse to a speck.\n//\n// This has to be derived per graph, not fixed. The scale that suits a bacterial\n// assembly's 10-100 kb contigs is wrong by orders of magnitude for a minigraph\n// pangenome window, whose nodes run 300 bp to a few kb: a fixed 1000 units/Mbp\n// makes every node shorter than the edges between them and the graph reads as\n// beads on a string, while 1 unit/bp makes each node a long sweeping curve and\n// the graph sprawls. For the 53-node E. coli window this lands near 35,000.\n//\n// It matters most at the small end. The WASM wrapper's own default of 1000\n// units/Mbp puts *every* node in a 400 bp pggb window below minimumNodeLength,\n// so all 31 clamp to the floor and a 1 bp SNP allele draws the same size as the\n// 164 bp backbone segment beside it \u2014 which is what made that figure read as a\n// chain of same-sized two-node bubbles. Bandage draws the same file with a 75:1\n// length ratio, the SNP alleles as specks.\n//\n// The remaining three are upstream Bandage's shipped defaults\n// (`program/settings.cpp`), which the WASM wrapper's own header does not match \u2014\n// it defaults all of them to 1.0, so they have to be passed explicitly.\nconst MEAN_NODE_LENGTH = 40\nconst MIN_TOTAL_GRAPH_LENGTH = 500\n\n// Bandage's own floor on a node's drawn length. Right for an assembly graph,\n// whose nodes are kb to Mb, and the reason a variation graph draws as a rope:\n// see BUBBLE_SPREADS, which is how a view asks for more.\nconst BANDAGE_MINIMUM_NODE_LENGTH = 5\n\n// The engine's own rule (`settings.h`, `getDrawnNodeLength`), so a seed computed\n// here spans exactly the chain the engine builds from the same numbers.\nexport function drawnNodeLength(opts: BandageScaleOpts, length: number) {\n return Math.max(\n (opts.nodeLengthPerMegabase * length) / 1_000_000,\n opts.minimumNodeLength,\n )\n}\n\nexport function bandageAutoScale(\n graph: Graph,\n // Floor on a node's drawn length, in the same FMMM units as the scale below.\n // Anything at or under Bandage's own floor leaves the drawing exactly as it\n // was, which is what keeps `'auto'` byte-identical to the shipped behaviour.\n minNodeLength = BANDAGE_MINIMUM_NODE_LENGTH,\n): BandageScaleOpts {\n const totalLength = graph.nodes.reduce((sum, n) => sum + n.length, 0)\n const megabases = totalLength / 1_000_000\n const target = Math.max(\n graph.nodes.length * MEAN_NODE_LENGTH,\n MIN_TOTAL_GRAPH_LENGTH,\n )\n return {\n nodeLengthPerMegabase: megabases > 0 ? target / megabases : 10_000,\n minimumNodeLength: Math.max(BANDAGE_MINIMUM_NODE_LENGTH, minNodeLength),\n edgeLength: 5,\n nodeSegmentLength: 20,\n }\n}\n\n// How a node's bp becomes its drawn length, as a power law against the graph's\n// own mean. The idiom is Bandage's, moved onto the axis a pangenome needs it on:\n// upstream derives a node's *width* from its depth exactly this way\n// (`graph/graphicsitemnode.cpp`, `getNodeWidth`), at a `depthPower` of 0.5 and a\n// `depthEffectOnWidth` of 0.5, because depth in an assembly graph spans orders\n// of magnitude and drawing it linearly is unreadable.\n//\n// drawn = meanDrawn * (((bp / meanBp) ^ power - 1) * effect + 1)\n//\n// Length in a *variation* graph spans those same orders of magnitude \u2014 a 1 bp\n// allele beside a 16 kb backbone segment \u2014 and upstream still maps it linearly,\n// because its own nodes are assembled contigs where that range does not arise.\n// That linear map is what draws a pggb window as one rope: past the small end\n// every allele falls under `minimumNodeLength` and clamps, so both arms of a\n// bubble land inside one node thickness of each other.\n//\n// power 1 with effect 1 is exactly proportional, so Bandage's shipped behaviour\n// is a point in this family rather than a mechanism sitting beside it. See\n// BUBBLE_SPREADS for the points a view can ask for.\nexport interface DrawnLengthLaw {\n // exponent applied to a node's length relative to the graph's mean\n power: number\n // how much of that relative length survives. 0 draws every node at the mean,\n // 1 applies the power law undamped.\n effect: number\n}\n\nexport const PROPORTIONAL_LENGTH: DrawnLengthLaw = { power: 1, effect: 1 }\n\nexport function isProportional(law: DrawnLengthLaw) {\n return law.power === 1 && law.effect === 1\n}\n\n// Drawn length in FMMM units for one node of `graph`, under `law`.\nexport function drawnLengthFor(graph: Graph, law: DrawnLengthLaw) {\n const count = graph.nodes.length\n const totalLength = graph.nodes.reduce((sum, n) => sum + n.length, 0)\n const meanBp = count > 0 ? totalLength / count : 0\n // The mean drawn length `bandageAutoScale` already targets, small-graph floor\n // included, so a compressed drawing comes out the same overall size as the\n // proportional one it replaces. That is the property a per-node floor does\n // not have, and the reason raising one is unusable at scale: it lifts the\n // hundreds of non-branching chain nodes along with the alleles, which on a\n // 521-node cut inflates the drawing past what zoom-to-fit can frame.\n const meanDrawn =\n count > 0\n ? Math.max(count * MEAN_NODE_LENGTH, MIN_TOTAL_GRAPH_LENGTH) / count\n : MEAN_NODE_LENGTH\n return (bp: number) => {\n if (meanBp <= 0) {\n return meanDrawn\n }\n const relative = (bp / meanBp) ** law.power\n return Math.max(\n meanDrawn * ((relative - 1) * law.effect + 1),\n BANDAGE_MINIMUM_NODE_LENGTH,\n )\n }\n}\n\n// The engine's own length rule is linear with a floor and takes two numbers\n// (`settings.h`, `getDrawnNodeLength`), so a non-linear law cannot be expressed\n// through them. It can be expressed in the lengths themselves: node length\n// crosses the RPC boundary only to become a drawn length \u2014 `getLength()` has\n// exactly two call sites upstream, both inside that rule \u2014 so handing the engine\n// pre-transformed lengths and a 1:1 scale draws the law without touching the\n// WASM build. Scaled by this factor first because the binding reads a node's\n// length as an `unsigned`, and rounding drawn units straight to integers would\n// quantise the small end where the whole point is legibility.\nconst LAYOUT_LENGTH_PRECISION = 1000\n\n// How a view asks for its node lengths: a law, plus Bandage's own per-node\n// floor. Orthogonal on purpose \u2014 see BUBBLE_SPREADS for which does what.\nexport interface NodeLengthSpread {\n law: DrawnLengthLaw\n // in the same FMMM units as the drawn lengths. At or under Bandage's own\n // floor this leaves the drawing exactly as it was.\n minNodeLength: number\n}\n\nexport const PROPORTIONAL_SPREAD: NodeLengthSpread = {\n law: PROPORTIONAL_LENGTH,\n minNodeLength: 0,\n}\n\nexport interface LayoutScaling {\n // the nodes to hand the engine. Under any law but the proportional one their\n // `length` is a scaled drawn length rather than a bp count, which is why this\n // is a separate array and never the graph's own nodes.\n nodes: GraphNode[]\n opts: BandageScaleOpts\n}\n\nexport function layoutScaling(\n graph: Graph,\n spread: NodeLengthSpread = PROPORTIONAL_SPREAD,\n): LayoutScaling {\n const { law, minNodeLength } = spread\n const opts = bandageAutoScale(graph, minNodeLength)\n // The proportional law is what every committed force figure was drawn\n // against, and it is already exactly what `bandageAutoScale` expresses, so it\n // keeps the untransformed path rather than round-tripping through a rounding\n // step FMMM would be free to amplify. Every floor-based spread comes through\n // here too, unchanged.\n if (isProportional(law)) {\n return { nodes: graph.nodes, opts }\n }\n const drawn = drawnLengthFor(graph, law)\n return {\n nodes: graph.nodes.map(node => ({\n ...node,\n length: Math.round(drawn(node.length) * LAYOUT_LENGTH_PRECISION),\n })),\n opts: {\n ...opts,\n nodeLengthPerMegabase: 1_000_000 / LAYOUT_LENGTH_PRECISION,\n // Bandage's own floor only. A law and a raised floor are alternatives\n // rather than a stack: the law has already lifted the small end, and a\n // floor on top of it would flatten exactly what it just spread.\n minimumNodeLength: BANDAGE_MINIMUM_NODE_LENGTH,\n },\n }\n}\n\n// The mean drawn node length `bandageAutoScale` targets, exported so\n// BUBBLE_SPREADS can state its laws against it rather than against unanchored\n// constants.\nexport { MEAN_NODE_LENGTH }\n", "import { MEAN_NODE_LENGTH, PROPORTIONAL_LENGTH } from './layout/drawnScale'\n\nimport type { NodeLengthSpread } from './layout/drawnScale'\n\n// How far apart the force layout draws the two arms of a bubble, as the law\n// turning a node's bp into its drawn length. One table drives the persisted\n// enum, the dropdown and the value handed to the engine, the same way\n// LAYOUT_MODES and COLOR_SCHEMES do.\n//\n// Why this needs to be a control rather than a better default: the drawn-length\n// law is the one thing standing between a variation graph and a legible force\n// layout, and compressing it costs the property that node length is proportional\n// to bp. Bandage maps length linearly, which suits an assembly graph whose nodes\n// are kb to Mb. In a pangenome an allele is 1-50 bp against a backbone segment\n// of several kb, so on that map every alt clamps to the engine's 5-unit floor,\n// both arms of a bubble land inside one node thickness of each other, and FMMM\n// has nothing to spread \u2014 zoom-to-fit then delivers a single rope with the\n// variation invisible inside it. Compressing the law opens the bubbles and\n// flattens the length ratio, and which of those a reader wants depends on the\n// figure, so the view asks rather than assumes.\n//\n// The compression is Bandage's own, taken off the axis upstream uses it on: it\n// draws node *width* from depth as a power law against the mean, at power 0.5\n// and effect 0.5, for the same reason. 'open' is those two numbers. See\n// DrawnLengthLaw.\n//\n// Measured on an odgi extract of GRCh38#0#chrM:8,200-8,400 from HPRC release 2's\n// chrM pggb graph (61 nodes, 84 edges, 234 haplotype paths), fitted to a 900x560\n// pane: proportional is one squiggle with a single knot in it, and the bubbles\n// come apart into legible lenses once the law compresses.\n//\n// The floor and the law are different instruments and both are kept, because\n// neither does the other's job:\n//\n// - a FLOOR lifts the small end and leaves everything above it proportional. It\n// is what a figure wants when one long node has to stay long \u2014 the ribbons in\n// `pangenome/pggb_haplotype_paths` separate along a 1.2 kb deletion arc, and\n// shortening that arc towards the mean piles them up. Its cost is that it is a\n// per-node minimum, so it lifts a graph's non-branching chain nodes along with\n// its alleles and the drawing inflates with node count: on the 521-node pggb\n// cut in `pangenome/graph_resolution` it reached ~52,000 units and a 1.4% fit,\n// which is why that figure could once afford a spread on its 7-node half only.\n// - the LAW compresses both ends towards the mean, so the drawing stays the size\n// it already was whatever the node count, and a cut spanning 6 bp to 16 kb\n// fits one pane. Its cost is the top end: a node that has to read as long no\n// longer does.\n//\n// So a figure about bubble shape at scale takes 'compress', and a figure about\n// what is drawn along one long edge takes 'open'.\n//\n// 'auto' is the proportional map, unchanged, so every existing figure and the\n// `bandageAutoScale` length-proportionality test are untouched by this existing.\nexport const BUBBLE_SPREADS = [\n {\n value: 'auto',\n label: 'Proportional',\n description:\n \"Bandage's own scale: a node draws proportional to its length, so a 1 bp allele is a speck.\",\n law: PROPORTIONAL_LENGTH,\n minNodeFactor: 0,\n },\n {\n value: 'open',\n label: 'Open bubbles',\n description:\n 'Give every allele a drawn length, so a bubble reads as two arms rather than a knot.',\n law: PROPORTIONAL_LENGTH,\n minNodeFactor: 2.5,\n },\n {\n value: 'wide',\n label: 'Wide bubbles',\n description:\n 'As open, spread further. Best on a window of a dozen bubbles.',\n law: PROPORTIONAL_LENGTH,\n minNodeFactor: 10,\n },\n {\n value: 'compress',\n label: 'Compress lengths',\n description:\n 'Pull the longest and shortest nodes towards the graph\\u2019s mean, so a cut spanning kb and bp fits one pane.',\n law: { power: 0.5, effect: 0.5 },\n minNodeFactor: 0,\n },\n] as const\n\nexport type BubbleSpread = (typeof BUBBLE_SPREADS)[number]['value']\n\nexport const BUBBLE_SPREAD_VALUES = BUBBLE_SPREADS.map(s => s.value)\n\n// The law and floor behind a spread, resolved so the model has one place that\n// knows how a spread becomes numbers. An unknown value draws proportionally\n// rather than throwing, which is what a session persisted by a newer build\n// degrades to.\nexport function spreadFor(spread: string): NodeLengthSpread {\n const entry = BUBBLE_SPREADS.find(s => s.value === spread)\n return {\n law: entry?.law ?? PROPORTIONAL_LENGTH,\n minNodeLength: (entry?.minNodeFactor ?? 0) * MEAN_NODE_LENGTH,\n }\n}\n", "import type { Graph } from './types'\n\n// One table drives the persisted enum and both colour dropdowns, the same way\n// LAYOUT_MODES drives the layout enum and its menu. The values and their labels\n// used to live in two lists in two directories, so adding a scheme meant editing\n// both and a mismatch showed up as a dropdown entry that selected nothing.\n//\n// Kept out of the components directory because the model needs it too.\nexport const COLOR_SCHEMES = [\n // Mirrors `layoutModes`' 'auto': a value the model resolves rather than a\n // colour of its own. It exists because 'uniform' was the default, so a\n // launched graph opened flat grey and both tutorials spent a step saying \"now\n // pick a colour\" \u2014 one figure literally drives that click. A graph with\n // reference coordinates resolves to 'reference-position', which is the one\n // ramp a linear track beside it can be painted with too; a graph with none\n // keeps 'uniform', because there the ramp would be a hue nothing earned.\n //\n // Resolve through `effectiveColorScheme`; the dropdown reads the raw prop, so\n // \"Auto\" stays selectable and visible as what it is.\n { value: 'auto', label: 'Auto' },\n { value: 'uniform', label: 'Uniform' },\n { value: 'random', label: 'Random' },\n { value: 'rainbow', label: 'Rainbow' },\n { value: 'depth', label: 'Depth' },\n { value: 'node-length', label: 'Node Length' },\n { value: 'stable-rank', label: 'Stable rank' },\n { value: 'reference-position', label: 'Reference position' },\n { value: 'grey', label: 'Grey' },\n] as const\n\nexport type ColorScheme = (typeof COLOR_SCHEMES)[number]['value']\n\n// What the renderer can actually paint with: every scheme except the one that\n// stands for \"work it out\". Stated as its own type so `getNodeColor`'s switch\n// has no 'auto' arm to forget.\nexport type ResolvedColorScheme = Exclude<ColorScheme, 'auto'>\n\nexport const COLOR_SCHEME_VALUES = COLOR_SCHEMES.map(s => s.value)\n\n// 'auto' asks the GRAPH, not the layout: a hue along the reference means\n// something whenever the segments have reference coordinates, force-directed\n// drawings included.\nexport function resolveColorScheme(\n scheme: ColorScheme,\n graph: Graph | undefined,\n): ResolvedColorScheme {\n return scheme !== 'auto'\n ? scheme\n : graph?.anchoredBy\n ? 'reference-position'\n : 'uniform'\n}\n", "import type { Graph, GraphNode } from './types'\nimport type { NodeInk } from './util/hitDetection'\n\n// How thick a node draws. Bandage widens a node by its depth, the square root\n// of its depth against the graph's mean, so a contig every read covers is fat\n// and a spurious one is a hair. In a pangenome cut depth is carriage, how many\n// walks go through the node, and the same rule makes the reference thick and a\n// private allele thin. One table drives the persisted enum and the dropdown,\n// the way BUBBLE_SPREADS does.\nexport const NODE_WIDTHS = [\n {\n value: 'depth',\n label: 'By depth',\n description:\n 'Thicker the more paths carry a node, on the square root of its depth against the mean. A graph with one depth everywhere draws uniform.',\n },\n {\n value: 'uniform',\n label: 'Uniform',\n description: 'Every node the same thickness.',\n },\n] as const\n\nexport type NodeWidth = (typeof NODE_WIDTHS)[number]['value']\n\nexport const NODE_WIDTH_VALUES = NODE_WIDTHS.map(w => w.value)\n\nconst MIN_FACTOR = 0.3\nconst MAX_FACTOR = 3\n\n// Length-weighted, as Bandage's mean depth is, so a cut's long reference nodes\n// set the norm and the alleles read against it.\nexport function meanDepth(graph: Graph) {\n let weighted = 0\n let length = 0\n for (const node of graph.nodes) {\n weighted += node.depth * node.length\n length += node.length\n }\n return length > 0 ? weighted / length : 0\n}\n\nexport function depthWidthFactor(node: GraphNode, mean: number) {\n if (!(mean > 0) || !(node.depth > 0)) {\n return 1\n }\n return Math.min(\n MAX_FACTOR,\n Math.max(MIN_FACTOR, Math.sqrt(node.depth / mean)),\n )\n}\n\n// How wide a node is drawn, in screen px. One function for the geometry and\n// for the hit test, so the pointer finds a node exactly where its ink is.\nexport function nodeWidthPx(\n node: GraphNode,\n contigThickness: number,\n nodeWidth: NodeWidth,\n mean: number,\n) {\n return (\n contigThickness * (nodeWidth === 'depth' ? depthWidthFactor(node, mean) : 1)\n )\n}\n\nexport function maxNodeWidthPx(contigThickness: number, nodeWidth: NodeWidth) {\n return contigThickness * (nodeWidth === 'depth' ? MAX_FACTOR : 1)\n}\n\n// How far each node's ink reaches from its centreline, for the hit test: the\n// widths the geometry draws with, from the same function.\nexport function nodeInk(\n graph: Graph | undefined,\n nodeById: ReadonlyMap<string, GraphNode> | undefined,\n contigThickness: number,\n nodeWidth: NodeWidth,\n): NodeInk {\n const mean = graph ? meanDepth(graph) : 0\n return {\n maxHalfWidthPx: maxNodeWidthPx(contigThickness, nodeWidth) / 2,\n halfWidthPx: id => {\n const node = nodeById?.get(id)\n return node\n ? nodeWidthPx(node, contigThickness, nodeWidth, mean) / 2\n : contigThickness / 2\n },\n }\n}\n"],
5
+ "mappings": "uFAAA,IAAAA,EAAAC,EAAA,CAAAC,GAAAC,IAAA,CAAAA,EAAO,QAAU,eAAe,eAAe,IC2B/C,IAAMC,EAAe,cAEd,SAASC,EAAWC,EAAkB,CAC3C,IAAMC,EAAQH,EAAa,KAAKE,CAAQ,EACxC,OAAOC,EACH,CAAE,KAAMD,EAAS,MAAM,EAAGC,EAAM,KAAK,EAAG,MAAO,CAACA,EAAM,CAAC,CAAG,EAC1D,CAAE,KAAMD,EAAU,MAAO,CAAE,CACjC,CAWO,SAASE,EACdC,EACAC,EACA,CACA,IAAMC,EAA4B,CAAC,EAC7BC,EAAa,IAAI,IACvB,QAAWC,KAAQJ,EAAO,CACxB,IAAMK,EAASC,EAAYF,EAAK,IAAI,EAChCG,EAAMH,EAAK,MACf,QAAWI,KAAQJ,EAAK,MAAO,CAC7B,IAAMK,EAAQ,CACZ,KAAML,EAAK,KACX,OAAAC,EACA,MAAOE,EACP,OAAQC,EAAK,MACf,EACME,EAAWP,EAAW,IAAIK,EAAK,EAAE,EACnCE,EACFA,EAAS,KAAKD,CAAK,EAEnBN,EAAW,IAAIK,EAAK,GAAI,CAACC,CAAK,CAAC,EAEjCF,GAAON,EAASO,EAAK,EAAE,CACzB,CACAN,EAAY,KAAK,CACf,KAAME,EAAK,KACX,OAAAC,EACA,MAAOD,EAAK,MACZ,OAAQG,EAAMH,EAAK,KACrB,CAAC,CACH,CACA,MAAO,CAAE,YAAAF,EAAa,WAAAC,CAAW,CACnC,CAQO,SAASQ,EACdT,EACAU,EACA,CAIA,OAHcV,EAAY,KACxBW,GAAKA,EAAE,SAAWD,GAAaC,EAAE,OAASD,CAC5C,GACgBV,EAAY,CAAC,CAC/B,CAMA,IAAMY,EAAqB,EAgB3B,SAASC,EACPC,EACAC,EACAC,EACW,CACX,IAAIC,EAAWH,EACf,GAAIC,GAAUA,EAAO,OAAS,EAAG,CAC/B,IAAMG,EAASH,EAAO,KAAKI,GAAKA,EAAE,OAASH,CAAS,GAAKD,EAAO,CAAC,EACjEE,EAAW,CACT,GAAGH,EACH,OAAQ,CACN,QAASI,EAAO,KAChB,MAAOA,EAAO,MACd,KAAMA,EAAO,OAASF,EAAY,EAAiBJ,EACnD,OAAQM,EAAO,MACjB,EACA,QAAS,CAAC,GAAG,IAAI,IAAIH,EAAO,IAAII,GAAKA,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,CACxD,CACF,CACA,OAAOF,CACT,CAKO,SAASG,EAAgBC,EAAcX,EAA+B,CAC3E,GAAM,CAAE,YAAAV,EAAa,WAAAC,CAAW,EAAIoB,EAC9BL,EACJhB,GAAeC,EACXQ,EAAoBT,EAAaU,CAAS,EAC1C,OACN,OAAOM,GAAaf,EACf,CACC,GAAGoB,EACH,MAAOA,EAAM,MAAM,IAAIP,GACrBD,EAAWC,EAAMb,EAAW,IAAIa,EAAK,IAAI,EAAGE,EAAU,IAAI,CAC5D,EACA,WAAY,QACZ,cAAeA,EAAU,IAC3B,EACAK,CACN,CAKO,SAASC,EAAYD,EAAcX,EAA+B,CACvE,OAAOW,EAAM,aAAe,OAASA,EAAQD,EAAgBC,EAAOX,CAAS,CAC/E,CC3JO,SAASa,EAAQC,EAAc,CACpC,IAAIC,EAAO,EACX,QAASC,EAAI,EAAGA,EAAIF,EAAK,OAAQE,IAC/BD,EAAOD,EAAK,WAAWE,CAAC,IAAMD,GAAQ,GAAKA,GAE7C,OAAO,KAAK,IAAIA,EAAO,GAAG,CAC5B,CAYO,SAASE,EAAUC,EAAeC,EAAe,CACtD,OAAQD,EAAQ,IAAOC,CACzB,CAEO,IAAMC,EAAkB,GAClBC,EAAiB,GAsBjBC,EAAkB,GAKxB,SAASC,GAAkBC,EAAmB,CACnD,OAAOA,EAAY,GAAKA,GAAaF,CACvC,CAEO,SAASG,EAAaP,EAAeC,EAAe,CACzD,MAAO,OAAOF,EAAUC,EAAOC,CAAK,CAAC,KAAKC,EAAkB,GAAG,MAC7DC,EAAiB,GACnB,IACF,CAKO,SAASK,GAAiBR,EAAeC,EAAe,CAE7D,MAAO,cADWA,EAAQ,EAAI,GAAM,GAAKD,GAAUC,EAAQ,GAAK,EAClC,IAChC,CAWA,SAASQ,EAAWb,EAAc,CAChC,IAAMc,EAAQC,EAAWf,CAAI,EAAE,KAAK,MAAM,GAAG,EACvCgB,EAAOF,EAAM,KAAK,GAAG,EAC3B,GAAIA,EAAM,QAAU,GAAKG,EAAgBH,EAAM,CAAC,CAAE,EAAG,CACnD,IAAMI,EAASJ,EAAM,MAAM,CAAC,EAAE,KAAK,GAAG,EACtC,MAAO,CAACI,EAAQA,EAAQF,CAAI,CAC9B,CACA,MAAO,CAACF,EAAM,CAAC,EAAIA,EAAM,MAAM,EAAG,CAAC,EAAE,KAAK,GAAG,EAAGE,CAAI,CACtD,CAIA,SAASG,EAAYC,EAAW,CAC9B,OAAO,OAAOA,CAAC,EAAE,QAAQ,mBAAoB,GAAG,CAClD,CAOA,SAASC,EAAYrB,EAAcsB,EAAiB,CAClD,GAAM,CAAE,MAAAC,CAAM,EAAIR,EAAWf,CAAI,EACjC,OAAOsB,EAAM,IAAIE,GAAK,GAAGA,CAAC,KAAKL,EAAYI,CAAK,CAAC,EAAE,CACrD,CAUO,SAASE,GACdC,EACAC,EACmB,CACnB,IAAMC,EAAQF,EAAM,IAAIG,GAAKhB,EAAWgB,EAAE,IAAI,CAAC,EAIzCC,EAAa,CAAC,EAAG,EAAG,CAAC,EAAE,QAAQN,GAAK,CACxCE,EAAM,IAAI,CAACK,EAAG7B,IAAM0B,EAAM1B,CAAC,EAAGsB,CAAC,CAAE,EACjCE,EAAM,IAAI,CAACG,EAAG3B,IAAMmB,EAAYQ,EAAE,KAAMD,EAAM1B,CAAC,CAAE,EAAEsB,CAAC,CAAE,CACxD,CAAC,EAMKQ,EALWF,EAAW,KAC1BE,GAAU,IAAI,IAAIA,CAAM,EAAE,OAASN,EAAM,MAC3C,GAG2BI,EAAW,GAAG,EAAE,EAC3C,OAAOJ,EAAM,IAAI,CAACO,EAAM,KAAO,CAC7B,KAAMA,EAAK,KACX,MAAOD,EAAO,CAAC,EACf,MAAOL,IAAS,CAAC,GAAKhB,EAAa,EAAGe,EAAM,MAAM,CACpD,EAAE,CACJ,CCnGO,SAASQ,GAAgBC,EAAwBC,EAAgB,CACtE,OAAO,KAAK,IACTD,EAAK,sBAAwBC,EAAU,IACxCD,EAAK,iBACP,CACF,CAEO,SAASE,EACdC,EAIAC,EAAgB,EACE,CAElB,IAAMC,EADcF,EAAM,MAAM,OAAO,CAACG,EAAKC,IAAMD,EAAMC,EAAE,OAAQ,CAAC,EACpC,IAC1BC,EAAS,KAAK,IAClBL,EAAM,MAAM,OAAS,GACrB,GACF,EACA,MAAO,CACL,sBAAuBE,EAAY,EAAIG,EAASH,EAAY,IAC5D,kBAAmB,KAAK,IAAI,EAA6BD,CAAa,EACtE,WAAY,EACZ,kBAAmB,EACrB,CACF,CA6BO,IAAMK,EAAsC,CAAE,MAAO,EAAG,OAAQ,CAAE,EAElE,SAASC,EAAeC,EAAqB,CAClD,OAAOA,EAAI,QAAU,GAAKA,EAAI,SAAW,CAC3C,CAGO,SAASC,EAAeT,EAAcQ,EAAqB,CAChE,IAAME,EAAQV,EAAM,MAAM,OACpBW,EAAcX,EAAM,MAAM,OAAO,CAACG,EAAKC,IAAMD,EAAMC,EAAE,OAAQ,CAAC,EAC9DQ,EAASF,EAAQ,EAAIC,EAAcD,EAAQ,EAO3CG,EACJH,EAAQ,EACJ,KAAK,IAAIA,EAAQ,GAAkB,GAAsB,EAAIA,EAC7D,GACN,OAAQI,GAAe,CACrB,GAAIF,GAAU,EACZ,OAAOC,EAET,IAAME,GAAYD,EAAKF,IAAWJ,EAAI,MACtC,OAAO,KAAK,IACVK,IAAcE,EAAW,GAAKP,EAAI,OAAS,GAC3C,CACF,CACF,CACF,CAWA,IAAMQ,EAA0B,IAWnBC,EAAwC,CACnD,IAAKX,EACL,cAAe,CACjB,EAUO,SAASY,GACdlB,EACAmB,EAA2BF,EACZ,CACf,GAAM,CAAE,IAAAT,EAAK,cAAAP,CAAc,EAAIkB,EACzBtB,EAAOE,EAAiBC,EAAOC,CAAa,EAMlD,GAAIM,EAAeC,CAAG,EACpB,MAAO,CAAE,MAAOR,EAAM,MAAO,KAAAH,CAAK,EAEpC,IAAMuB,EAAQX,EAAeT,EAAOQ,CAAG,EACvC,MAAO,CACL,MAAOR,EAAM,MAAM,IAAIqB,IAAS,CAC9B,GAAGA,EACH,OAAQ,KAAK,MAAMD,EAAMC,EAAK,MAAM,EAAIL,CAAuB,CACjE,EAAE,EACF,KAAM,CACJ,GAAGnB,EACH,sBAAuB,IAAYmB,EAInC,kBAAmB,CACrB,CACF,CACF,CC7IO,IAAMM,EAAiB,CAC5B,CACE,MAAO,OACP,MAAO,eACP,YACE,6FACF,IAAKC,EACL,cAAe,CACjB,EACA,CACE,MAAO,OACP,MAAO,eACP,YACE,sFACF,IAAKA,EACL,cAAe,GACjB,EACA,CACE,MAAO,OACP,MAAO,eACP,YACE,gEACF,IAAKA,EACL,cAAe,EACjB,EACA,CACE,MAAO,WACP,MAAO,mBACP,YACE,gHACF,IAAK,CAAE,MAAO,GAAK,OAAQ,EAAI,EAC/B,cAAe,CACjB,CACF,EAIaC,GAAuBF,EAAe,IAAIG,GAAKA,EAAE,KAAK,EAM5D,SAASC,GAAUC,EAAkC,CAC1D,IAAMC,EAAQN,EAAe,KAAKG,GAAKA,EAAE,QAAUE,CAAM,EACzD,MAAO,CACL,IAAKC,GAAO,KAAOL,EACnB,eAAgBK,GAAO,eAAiB,GAAK,EAC/C,CACF,CC7FO,IAAMC,EAAgB,CAW3B,CAAE,MAAO,OAAQ,MAAO,MAAO,EAC/B,CAAE,MAAO,UAAW,MAAO,SAAU,EACrC,CAAE,MAAO,SAAU,MAAO,QAAS,EACnC,CAAE,MAAO,UAAW,MAAO,SAAU,EACrC,CAAE,MAAO,QAAS,MAAO,OAAQ,EACjC,CAAE,MAAO,cAAe,MAAO,aAAc,EAC7C,CAAE,MAAO,cAAe,MAAO,aAAc,EAC7C,CAAE,MAAO,qBAAsB,MAAO,oBAAqB,EAC3D,CAAE,MAAO,OAAQ,MAAO,MAAO,CACjC,EASaC,GAAsBD,EAAc,IAAIE,GAAKA,EAAE,KAAK,EAK1D,SAASC,GACdC,EACAC,EACqB,CACrB,OAAOD,IAAW,OACdA,EACAC,GAAO,WACL,qBACA,SACR,CC1CO,IAAMC,EAAc,CACzB,CACE,MAAO,QACP,MAAO,WACP,YACE,yIACJ,EACA,CACE,MAAO,UACP,MAAO,UACP,YAAa,gCACf,CACF,EAIaC,GAAoBD,EAAY,IAAIE,GAAKA,EAAE,KAAK,EAEvDC,EAAa,GACbC,EAAa,EAIZ,SAASC,EAAUC,EAAc,CACtC,IAAIC,EAAW,EACXC,EAAS,EACb,QAAWC,KAAQH,EAAM,MACvBC,GAAYE,EAAK,MAAQA,EAAK,OAC9BD,GAAUC,EAAK,OAEjB,OAAOD,EAAS,EAAID,EAAWC,EAAS,CAC1C,CAEO,SAASE,EAAiBD,EAAiBE,EAAc,CAC9D,MAAI,EAAEA,EAAO,IAAM,EAAEF,EAAK,MAAQ,GACzB,EAEF,KAAK,IACVL,EACA,KAAK,IAAID,EAAY,KAAK,KAAKM,EAAK,MAAQE,CAAI,CAAC,CACnD,CACF,CAIO,SAASC,EACdH,EACAI,EACAC,EACAH,EACA,CACA,OACEE,GAAmBC,IAAc,QAAUJ,EAAiBD,EAAME,CAAI,EAAI,EAE9E,CAEO,SAASI,EAAeF,EAAyBC,EAAsB,CAC5E,OAAOD,GAAmBC,IAAc,QAAUV,EAAa,EACjE,CAIO,SAASY,GACdV,EACAW,EACAJ,EACAC,EACS,CACT,IAAMH,EAAOL,EAAQD,EAAUC,CAAK,EAAI,EACxC,MAAO,CACL,eAAgBS,EAAeF,EAAiBC,CAAS,EAAI,EAC7D,YAAaI,GAAM,CACjB,IAAMT,EAAOQ,GAAU,IAAIC,CAAE,EAC7B,OAAOT,EACHG,EAAYH,EAAMI,EAAiBC,EAAWH,CAAI,EAAI,EACtDE,EAAkB,CACxB,CACF,CACF",
6
+ "names": ["require_mui", "__commonJSMin", "exports", "module", "RANGE_SUFFIX", "pathOrigin", "pathName", "match", "surveyPaths", "paths", "lengthOf", "anchorPaths", "pathVisits", "path", "sample", "panSNSample", "pos", "step", "visit", "existing", "chooseReferencePath", "preferred", "p", "OFF_REFERENCE_RANK", "anchorNode", "node", "visits", "reference", "anchored", "anchor", "v", "anchorFromPaths", "graph", "anchorGraph", "nameHue", "name", "hash", "i", "pathHueAt", "index", "count", "PATH_SATURATION", "PATH_LIGHTNESS", "MAX_PATH_COLORS", "pathColorsLegible", "pathCount", "pathCssColor", "pathGreyCssColor", "labelTiers", "parts", "pathOrigin", "full", "isGenericSample", "contig", "groupDigits", "n", "offsetTiers", "tiers", "start", "t", "pathLegend", "paths", "colors", "named", "p", "candidates", "_", "labels", "path", "drawnNodeLength", "opts", "length", "bandageAutoScale", "graph", "minNodeLength", "megabases", "sum", "n", "target", "PROPORTIONAL_LENGTH", "isProportional", "law", "drawnLengthFor", "count", "totalLength", "meanBp", "meanDrawn", "bp", "relative", "LAYOUT_LENGTH_PRECISION", "PROPORTIONAL_SPREAD", "layoutScaling", "spread", "drawn", "node", "BUBBLE_SPREADS", "PROPORTIONAL_LENGTH", "BUBBLE_SPREAD_VALUES", "s", "spreadFor", "spread", "entry", "COLOR_SCHEMES", "COLOR_SCHEME_VALUES", "s", "resolveColorScheme", "scheme", "graph", "NODE_WIDTHS", "NODE_WIDTH_VALUES", "w", "MIN_FACTOR", "MAX_FACTOR", "meanDepth", "graph", "weighted", "length", "node", "depthWidthFactor", "mean", "nodeWidthPx", "contigThickness", "nodeWidth", "maxNodeWidthPx", "nodeInk", "nodeById", "id"]
7
+ }
@@ -1,3 +1,3 @@
1
- import{b as Zt,c as Jt,d as Qt,e as en}from"./chunks/chunk-QSH263Y6.js";import{a as Ga}from"./chunks/chunk-KWAXLUPQ.js";import{a as Ta,d as tn,g as nn,h as rn}from"./chunks/chunk-XK7OPCRQ.js";import{a as se}from"./chunks/chunk-J4OLMLS5.js";import{$ as jn,A as Ne,B as Ln,E as Gn,F as Tn,G as Pe,H as An,I as Z,N as In,O as vn,P as Bn,Q as Cn,R as En,S as Fn,T as Vn,V as Dn,W as Hn,Z as On,_ as _n,a as Yt,b as on,ba as $n,d as pn,e as Re,ea as Wn,g as mn,ga as zn,h as Le,ha as Xn,i as Ge,ia as Yn,ja as Un,ka as Kn,ma as Pa,n as gn,na as qn,o as bn,oa as Ie,p as fn,pa as Zn,q as yn,qa as Jn,r as nt,ra as Qn,s as wn,sa as ve,ta as ce,ua as er,w as xn,wa as tr,x as ot,y as Rn,z as Ae}from"./chunks/chunk-BI3M6FZD.js";import{b as cn,d as un}from"./chunks/chunk-UQEPPJEO.js";import"./chunks/chunk-SCMIJAAX.js";import{a as z}from"./chunks/chunk-FCWXYIFC.js";import{A as Pn,B as Ia,a as Me,b as tt,d as sn,e as dn,f as ln,g as Te,h as hn,i as j,j as Sn,k as kn,l as rt,m as Mn,s as at,v as it,x as Nn}from"./chunks/chunk-IUIIYSGF.js";import{b as P,d as Ut,f as Kt,g as qt}from"./chunks/chunk-EFVAQ2KM.js";import"./chunks/chunk-KULNKXPT.js";import{a as de,b as Aa,c as Na,d as an,e as ke}from"./chunks/chunk-XEJ47DLD.js";import{a as O,b as x}from"./chunks/chunk-FY3BTKY4.js";var rr=O((is,nr)=>{nr.exports=JBrowseExports["@jbrowse/core/Plugin"]});var Ee=O((cs,or)=>{or.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/AdapterType"]});var _=O((us,ar)=>{ar.exports=JBrowseExports["@jbrowse/core/configuration"]});var ut=O((ls,dr)=>{dr.exports=JBrowseExports["@jbrowse/core/data_adapters/dataAdapterCache"]});var J=O((hs,cr)=>{cr.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes"]});var xr=O((ks,wr)=>{wr.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/ViewType"]});var kr=O((Ms,Sr)=>{Sr.exports=JBrowseExports["@jbrowse/core/util/withLaunchInput"]});var Rr=O((Rs,Mr)=>{Mr.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/models"]});var Jr=O((Sd,Zr)=>{Zr.exports=JBrowseExports["@jbrowse/render-core/RenderLifecycleMixin"]});var $o=O((Fc,jo)=>{jo.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/DisplayType"]});var zo=O((Vc,Wo)=>{Wo.exports=JBrowseExports["@jbrowse/display-kit/trackHeightConfigSchemaFields"]});var qo=O((_c,Ko)=>{Ko.exports=JBrowseExports["@jbrowse/display-kit/TrackHeightMixin"]});var Jo=O((jc,Zo)=>{Zo.exports=JBrowseExports["@jbrowse/render-core/displayPhase"]});var Ra=x(rr(),1),La=x(se(),1);var Be=x(de(),1),Ce=(0,Yt.createSvgIcon)([(0,Be.jsx)("circle",{cx:"7.2",cy:"14.4",r:"3.2"},"0"),(0,Be.jsx)("circle",{cx:"14.8",cy:"18",r:"2"},"1"),(0,Be.jsx)("circle",{cx:"15.2",cy:"8.8",r:"4.8"},"2")],"BubbleChart");var sr=x(Ee(),1);var st=x(_(),1),dt=x(z(),1),va=(0,st.ConfigurationSchema)("GbzBaseSyntenyAdapter",{assemblyNames:{type:"stringArray",defaultValue:[]},gbzDbLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.gbz.db",locationType:"UriLocation"}},haplotypeIndexLocation:{type:"fileLocation",defaultValue:{uri:"",locationType:"UriLocation"}},readsLocation:{type:"fileLocation",defaultValue:{uri:"",locationType:"UriLocation"}},readsIndex:(0,st.ConfigurationSchema)("GbzBaseReadsIndex",{indexType:{model:dt.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:"",locationType:"UriLocation"}}}),subgraphSnarls:{type:"stringEnum",model:dt.types.enumeration("SnarlOutput",["none","contained","overlapping"]),defaultValue:"contained"},referenceSample:{type:"string",defaultValue:""},assemblyNameToPanSN:{type:"frozen",defaultValue:{}},context:{type:"number",defaultValue:1e3,advanced:!0},nodeLimit:{type:"number",defaultValue:1e5,advanced:!0}},{explicitlyTyped:!0,preProcessSnapshot:e=>{let{uri:t,baseUri:n,reads:r}=e;return{...e,...t?{gbzDbLocation:{uri:t,baseUri:n}}:{},...typeof r=="string"?{readsLocation:{uri:r,baseUri:n},...r.endsWith(".gz")?{readsIndex:{location:{uri:`${r}.tbi`,baseUri:n}}}:{}}:{}}}}),ir=va;function ct(e){e.addAdapterType(()=>new sr.default({name:"GbzBaseSyntenyAdapter",displayName:"gbz-base pangenome adapter",configSchema:ir,adapterCapabilities:["getSubgraph","headerLanes","lanePairsOnAnchor"],adapterMetadata:{category:"Synteny adapters"},getAdapterClass:()=>import("./chunks/GbzBaseSyntenyAdapter-KKSNCZXY.js").then(t=>t.default)}))}var ur=x(ut(),1),pr=x(J(),1);function Ba(e){return"getReads"in e&&typeof e.getReads=="function"}var Ca=e=>typeof e=="object"&&e!==null&&Object.entries(e).some(([t,n])=>["uri","localPath","blobId"].includes(t)&&typeof n=="string"&&n!=="");function mr(e){return typeof e.reads=="string"&&e.reads!==""||Ca(e.readsLocation)}var ue=class extends pr.RpcMethodType{constructor(){super(...arguments);this.name="GetGraphReads"}async execute(n){let{adapterConfig:r,nodeNames:a,sessionId:o,signal:i}=n,{dataAdapter:s}=await(0,ur.getAdapter)(this.pluginManager,o,r);return Ba(s)?s.getReads(a,{signal:i}):{records:[],total:0}}};var gr=x(ut(),1),lr=x(J(),1);function Ea(e){return"getSubgraph"in e&&typeof e.getSubgraph=="function"}var pe=class extends lr.RpcMethodTypeWithRenameRegion{constructor(){super(...arguments);this.name="GetSubgraph"}async execute(n){let{adapterConfig:r,region:a,sessionId:o,opts:i,signal:s}=n,{dataAdapter:u}=await(0,gr.getAdapter)(this.pluginManager,o,r);return Ea(u)?u.getSubgraph(a,{...i,signal:s}):(console.warn(`[GetSubgraph] ${u.constructor.name} does not implement getSubgraph`),"")}};var hr=x(ke(),1),br=x(J(),1),fr=x(z(),1),Fa=(0,hr.lazy)(()=>import("./chunks/AddTrackWorkflow-WYRVQYH2.js"));function pt(e){e.addAddTrackWorkflowType(()=>new br.AddTrackWorkflowType({name:"Pangenome graph track",displayName:"Add pangenome graph track",ReactComponent:Fa,stateModel:fr.types.model({})}))}var mt;function gt(){return mt??=import("./chunks/bandage-layout-UCRW4G4J.js").then(e=>e.default()).catch(e=>{throw mt=void 0,e}),mt}var yr=x(J(),1),me=class extends yr.RpcMethodType{constructor(){super(...arguments);this.name="GraphComputeLayout"}async execute(n){let{graph:r,options:a,statusCallback:o}=n;o?.("Loading layout engine");let i=await gt();o?.("Computing layout");let s=performance.now(),u=i.computeLayout(r,a),d=performance.now()-s;return{result:u,duration:d}}};var Do=x(ke(),1),Ho=x(xr(),1),Oo=x(kr(),1);var Eo=x(_(),1),Fo=x(Rr(),1),Vo=x(se(),1),E=x(z(),1);var Va=.9,lt=2,Da=1e3;function Lr(e,t,n,r=o=>o,a=[]){let o=new Map(e.nodes.map(s=>[s.name,s])),i=[];for(let s of t){let u=[],d=1/0,h=-1/0,S=1/0,m=[],c=[];for(let g of Le(s)){let w=o.get(g),M=w&&n[w.id];if(!(!w||!M?.length)){if(P(w)&&(w.stable.start<s.start||w.stable.start>=s.end)){c.push(M[Math.floor(M.length/2)]);continue}m.push(w.id),u.push(Ge(M.length===1?[M[0],M[0]]:M));for(let L of M)d=Math.min(d,L.x),h=Math.max(h,L.x),S=Math.min(S,L.y)}}if(m.length===0)continue;let y={x:(d+h)/2,y:S},k=c.length?{x:c.reduce((g,w)=>g+w.x,0)/c.length,y:c.reduce((g,w)=>g+w.y,0)/c.length}:y,b=new Map;for(let g of s.routes??[])for(let w of new Set(g.steps))b.set(w,(b.get(w)??0)+1);let p=[];for(let g of s.routes??[]){if(s.longestAlleleLength<Da)break;if(g.steps.length===0)continue;let w=Math.min(...g.steps.map(l=>b.get(l))),M,L=-1;for(let l of g.steps)if(b.get(l)===w)for(let R of n[l]??[]){let T=Math.hypot(R.x-k.x,R.y-k.y);T>L&&(L=T,M=R)}M&&p.push({route:g,at:M,text:Ha(g,r)})}i.push({bubble:s,...Re(s,a),path:u.join(""),labelAt:y,members:m.length,nodeIds:m,whole:m.length>=Va*e.nodes.length,routes:p})}return i}function Ha(e,t){let n=[...new Set(e.walks.map(t))].sort(),r=n.slice(0,lt).join(", "),a=n.length>lt?` +${n.length-lt}`:"";return`${r}${a} \xB7 ${pn(e.bp)}`}function Gr(e){if(!e.nodes.some(P))return[];let t=new Map(e.nodes.map(m=>[m.id,m])),n=gn(e),r=new Map(n.map((m,c)=>[m,c])),a=new Int32Array(n.length+1),o=new Map,i=new Set;for(let m of e.edges){let c=r.get(m.from),y=r.get(m.to);if(c===void 0||y===void 0||c===y)continue;i.add(`${m.from}>${m.to}`).add(`${m.to}>${m.from}`);let[k,b]=c<y?[c,y]:[y,c];a[k+1]++,a[b]--;let[p,g]=c<y?[m.from,m.to]:[m.to,m.from];(o.get(p)??o.set(p,new Set).get(p)).add(g)}for(let m=1;m<a.length;m++)a[m]+=a[m-1];let s=e.nodes.filter(P).sort((m,c)=>m.stable.start-c.stable.start),u=new Set([s[0].id,s.at(-1).id]),d=s.map(m=>[m,r.get(m.id)]).filter(([m,c])=>u.has(m.id)||a[c]===0).sort(([m,c],[y,k])=>c-k||m.stable.start-y.stable.start),h=e.paths?.map(m=>{let c=new Map;return m.nodeIds.forEach((y,k)=>{c.has(y)||c.set(y,k)}),c}),S=[];for(let m=0;m+1<d.length;m++){let[c,y]=d[m],[k,b]=d[m+1],p=n.slice(y+1,b);if(p.length===0)continue;let g=new Map([[c.id,{min:0,max:0,n:1}]]);for(let H of[c.id,...p]){let U=g.get(H);if(U)for(let K of o.get(H)??[]){if(r.get(K)>b)continue;let G=K===k.id?0:t.get(K).length,F=g.get(K);g.set(K,{min:Math.min(F?.min??1/0,U.min+G),max:Math.max(F?.max??-1/0,U.max+G),n:Math.min(un,U.n+(F?.n??0))})}}let w=h&&Oa(e,t,h,c.id,k.id),M=w?.n?w:void 0,L=M??g.get(k.id)??{min:0,max:0,n:0},l=w!==void 0&&w.left>0,R=c.stable.start+c.length,T=k.stable.start,N=[c.id,...p.filter(H=>P(t.get(H))),k.id],v=N.some((H,U)=>U>0&&!i.has(`${N[U-1]}>${H}`)),B=v||l,Y=v&&!M;S.push({refName:c.stable.refName,start:R,end:T,segmentCount:p.length+2,pathCount:L.n,inversion:!1,shortestAlleleLength:Y?T-R:L.min,longestAlleleLength:Y?T-R:L.max,segments:[c,...p.map(H=>t.get(H)),k].map(H=>H.name).join(","),shortestAllele:void 0,longestAllele:void 0,partial:B,routes:M?.routes})}return S}function Oa(e,t,n,r,a){let o=new Map,i=1/0,s=-1/0,u=0;return e.paths.forEach((d,h)=>{let S=n[h].get(r),m=n[h].get(a);if(S===void 0||m===void 0){(S!==void 0||m!==void 0)&&u++;return}let c=d.nodeIds.slice(Math.min(S,m)+1,Math.max(S,m));m<S&&c.reverse();let y=0;for(let p of c)y+=t.get(p)?.length??0;let k=c.join(","),b=o.get(k)??{steps:c,bp:y,walks:[]};b.walks.push(d.name),o.set(k,b),i=Math.min(i,y),s=Math.max(s,y)}),o.size||u?{min:i,max:s,n:o.size,left:u,routes:[...o.values()]}:void 0}function Tr(e,t){let n=new Set(t),r=e.nodes.filter(i=>n.has(i.name)),a=new Set(r.map(i=>i.id)),o=e.paths?.map(i=>({...i,nodeIds:i.nodeIds.filter(s=>a.has(s))})).filter(i=>i.nodeIds.length>0);return{name:e.name,nodes:r,edges:e.edges.filter(i=>a.has(i.from)&&a.has(i.to)),...o?.length?{paths:o}:{},anchorPaths:e.anchorPaths,pathVisits:e.pathVisits,anchoredBy:e.anchoredBy,referencePath:e.referencePath}}function Ar(e,t,n){let r=new Map;for(let o of e.nodes)if(P(o)){let{refName:i}=o.stable;if(n[o.id]?.length){let s=r.get(i)??r.set(i,{nodes:[],reach:0}).get(i);s.nodes.push(o),s.reach=Math.max(s.reach,o.length)}}for(let{nodes:o}of r.values())o.sort((i,s)=>i.stable.start-s.stable.start);let a=[];for(let o of t){let i=r.get(o.refName);if(!i)continue;let s=[],u,d=1/0,h=0,S=(o.start+o.end)/2,{nodes:m,reach:c}=i;for(let y=Kt(m,o.start-c);y<m.length&&m[y].stable.start<o.end;y++){let k=m[y],b=k.stable.start,p=b+k.length;if(p<=o.start)continue;let g=n[k.id];h+=Math.min(p,o.end)-Math.max(b,o.start);for(let L of o.exons){let l=Math.max(L.start,b),R=Math.min(L.end,p);if(R<=l)continue;let T=nt(g,(l-b)/k.length,(R-b)/k.length);T.length===1&&T.push({...T[0]}),s.push(Ge(T))}let w=Math.min(Math.max(S,b),p),M=Math.abs(w-S);if(M<d){d=M;let[L]=nt(g,(w-b)/k.length,(w-b)/k.length);u=L}}u&&a.push({gene:o,exons:s.join(""),at:u,covered:h/(o.end-o.start)})}return a}function Nr(e,t){let n=new Set(e.nodes.filter(d=>P(d)&&d.stable.start<t.end&&d.stable.start+d.length>t.start).map(d=>d.id)),r=e.paths??[];if(n.size===0||r.length===0)return e;let a=new Map(e.nodes.map(d=>[d.id,d.length])),o=r.map(d=>{let h=-1,S=-1;return d.nodeIds.forEach((m,c)=>{n.has(m)&&(h<0&&(h=c),S=c)}),h<0?void 0:{first:h,last:S}});if(o.every((d,h)=>d?.first===0&&d.last===r[h].nodeIds.length-1))return e;let i=new Set,s=[],u=new Map;return r.forEach((d,h)=>{let S=o[h];if(S){let m=d.nodeIds.slice(S.first,S.last+1);for(let c of m)i.add(c);s.push({...d,nodeIds:m}),u.set(d.name,d.nodeIds.slice(0,S.first).reduce((c,y)=>c+(a.get(y)??0),0))}}),{...e,nodes:e.nodes.filter(d=>i.has(d.id)),edges:e.edges.filter(d=>i.has(d.from)&&i.has(d.to)),paths:s,pathVisits:e.pathVisits&&_a(e.pathVisits,r,o,new Map(e.nodes.map(d=>[d.id,d.name]))),anchorPaths:e.anchorPaths&&ja(e.anchorPaths,r,u)}}function _a(e,t,n,r){let a=new Map,o=new Map;return t.forEach((i,s)=>{let u=j(i.name).name,d=n[s];i.nodeIds.forEach((h,S)=>{let m=r.get(h)??h,c=e.get(m);if(!c)return;let y=`${u} ${m}`,k=a.get(y)??0;for(;k<c.length&&c[k].path!==u;)k++;let b=c[k];if(a.set(y,k+1),b&&d&&S>=d.first&&S<=d.last){let p=o.get(m);p?p.push(b):o.set(m,[b])}})}),o}function ja(e,t,n){let r=new Map;for(let a of t){let o=j(a.name).name;r.set(o,(r.get(o)??0)+1)}return e.map(a=>{let o=t.find(s=>j(s.name).name===a.name),i=o?n.get(o.name):void 0;return i&&r.get(a.name)===1?{...a,start:a.start+i}:a})}function $a(e,t){let n=e.indexOf(":"),r=e.indexOf(":",n+1);if(n!==-1&&r!==-1){let a=e.slice(0,n),o=e.slice(n+1,r),i=e.slice(r+1);o==="i"||o==="f"?t[a]=+i:o==="Z"&&(t[a]=i)}}function ge(e){let t={};for(let n of e)$a(n,t);return t}function ht(e){let{SN:t,SO:n,SR:r}=e.tags;return typeof t=="string"&&typeof n=="number"&&typeof r=="number"?{refName:t,start:n,rank:r}:void 0}var Pr=62,Wa=60;function za(e){let t=[],n="+",r=0;function a(o){o>r&&t.push({id:e.slice(r,o),strand:n})}for(let o=0;o<e.length;o++){let i=e.charCodeAt(o);(i===Pr||i===Wa)&&(a(o),n=i===Pr?"+":"-",r=o+1)}return a(e.length),t}function bt(e){let t={nodes:[],links:[],paths:[],walks:[],header:[],id:""};for(let n of e.split(`
2
- `)){let r=n.endsWith("\r")?n.slice(0,-1):n;if(r.startsWith("H")){let[,...a]=r.split(" ");t.header.push(ge(a))}else if(r.startsWith("S")){let[,a,...o]=r.split(" "),i,s,u,d=!1,h=o[0]??"*";/^\d+$/.test(h)?(i=+h,s=o[1]??"*",u=o.slice(2)):(d=!0,s=h,i=s==="*"?0:s.length,u=o.slice(1));let S=ge(u);d&&"LN"in S&&(i=+S.LN),t.nodes.push({id:a,length:i,sequence:s,tags:S})}else if(r.startsWith("E")){let[,,a,o,,,,,i,...s]=r.split(" ");a&&o&&t.links.push({source:a.slice(0,-1),target:o.slice(0,-1),strand1:a.at(-1),strand2:o.at(-1),cigar:i??"*",tags:ge(s)})}else if(r.startsWith("L")){let[,a,o,i,s,u,...d]=r.split(" ");a&&i&&s&&t.links.push({source:a,target:i,strand1:o,strand2:s,cigar:u??"*",tags:ge(d)})}else if(r.startsWith("W")){let[,a,o,i,s,u,d,...h]=r.split(" ");a&&o&&i&&s&&u&&d&&t.walks.push({sample:a,haplotype:+o,contig:i,start:s==="*"?-1:+s,end:u==="*"?-1:+u,segments:za(d),tags:ge(h)})}else if(r.startsWith("P")){let[,a,o,...i]=r.split(" ");a&&o&&t.paths.push({name:a,path:o,rest:i})}}return t}function Xa(e){let t=new Map,n=new Map;function r(o,i){t.has(o)||t.set(o,i)}function a(o,i){r(o,i),n.set(o,(n.get(o)??0)+1)}for(let o of e.links)r(o.source,o.strand1==="-"?"-":"+"),r(o.target,o.strand2==="-"?"-":"+");for(let o of e.paths)for(let i of o.path.split(","))a(i.slice(0,-1),i.endsWith("-")?"-":"+");for(let o of e.walks)for(let i of o.segments)a(i.id,i.strand==="-"?"-":"+");return{canonical:t,traversals:n}}function Ya(e){return[...e.paths.map(t=>({...j(t.name),steps:t.path.split(",").map(n=>({id:n.slice(0,-1),strand:n.endsWith("-")?"-":"+"}))})),...e.walks.map(t=>({name:`${t.sample}#${t.haplotype}#${t.contig}`,start:t.start===-1?0:t.start,steps:t.segments.map(n=>({id:n.id,strand:n.strand==="-"?"-":"+"}))}))]}function Ua(e){let t=e.tags.SM;if(typeof t!="string")return;let n=t.split(",").map(r=>r.trim()).filter(Boolean);return n.length>0?n:void 0}var le=e=>typeof e=="number"&&e>0?e:void 0;function Ka({tags:e,length:t}){let n=le(e.RC)??le(e.FC)??le(e.KC);return le(e.dp)??le(e.DP)??(n!==void 0&&t>0?n/t:void 0)}function qa(e,t,n){return{id:`${e.id}${t}`,name:e.id,length:e.length,depth:n,stable:ht(e),samples:Ua(e)}}function Ir(e,t="Imported GFA"){let n=[],r=[],{canonical:a,traversals:o}=Xa(e),i=c=>`${c}${a.get(c)??"+"}`;for(let c of e.nodes){let y=Ka(c)??Math.max(o.get(c.id)??1,1);n.push(qa(c,a.get(c.id)??"+",y))}for(let c of e.links)r.push({from:i(c.source),to:i(c.target),fromStrand:c.strand1==="-"?"-":"+",toStrand:c.strand2==="-"?"-":"+"});let s=[],u=new Map,d=(c,y)=>[c,y].sort().join("--");function h(c,y){for(let k=0;k<c.length-1;k++){let b=d(c[k],c[k+1]);u.has(b)||u.set(b,new Set),u.get(b).add(y)}}for(let c of e.paths){let y=c.path.split(",").map(k=>i(k.slice(0,-1)));s.push({name:c.name,nodeIds:y}),h(y,c.name)}for(let c of e.walks){let y=c.segments.map(b=>i(b.id)),k=`${c.sample}#${c.haplotype}#${c.contig}`;s.push({name:k,nodeIds:y,sample:c.sample,haplotype:c.haplotype,contig:c.contig}),h(y,k)}for(let c of r){let y=u.get(d(c.from,c.to));y&&y.size>0&&(c.pathIds=[...y])}let S=new Map(e.nodes.map(c=>[c.id,c.length])),m=e.paths.length>0||e.walks.length>0?Sn(Ya(e),c=>S.get(c)??0):void 0;return{name:t,nodes:n,edges:r,paths:s.length>0?s:void 0,anchorPaths:m?.anchorPaths,pathVisits:m?.pathVisits,anchoredBy:n.some(c=>c.stable)?"tags":void 0}}function vr(e,t){let n=e.nodes.filter(b=>P(b)&&(t[b.id]?.length??0)>0);if(n.length<2)return t;let r=n.map(b=>{let p=t[b.id],g=p[Math.floor(p.length/2)];return{x:g.x,y:g.y,r:b.stable.start+b.length/2,w:b.length}}),a=r.reduce((b,p)=>b+p.w,0),o=r.reduce((b,p)=>b+p.x*p.w,0)/a,i=r.reduce((b,p)=>b+p.y*p.w,0)/a,s=r.reduce((b,p)=>b+p.r*p.w,0)/a,u=0,d=0;for(let b of r)u+=b.w*(b.x-o)*(b.r-s),d+=b.w*(b.y-i)*(b.r-s);let h=-Math.atan2(d,u),S=Math.cos(h),m=Math.sin(h),c={};for(let[b,p]of Object.entries(t))c[b]=p.map(g=>{let w=g.x-o,M=g.y-i;return{x:o+S*w-m*M,y:i+m*w+S*M}});let y=0,k=0;for(let b of e.nodes)if(!P(b))for(let p of c[b.id]??[])p.y>i?y++:k++;if(k>y)for(let b of Object.values(c))for(let p of b)p.y=2*i-p.y;return c}var Br=30;function Za(e,t){let{opts:n}=t,r=new Map(t.nodes.map(m=>[m.id,Me(n,m.length)])),a=m=>r.get(m)??n.minimumNodeLength,o=e.nodes.filter(P).sort((m,c)=>m.stable.start-c.stable.start),i=new Map,s=0;for(let m of o)i.set(m.id,{x:s,y:0}),s+=a(m.id)+n.edgeLength;let u=Ae(e),d=new Map(o.map(m=>[m.id,0])),h=o.map(m=>m.id);for(let m of h){let c=i.get(m),y=d.get(m)+1;for(let k of u.get(m)??[])d.has(k)||(d.set(k,y),i.set(k,{x:c.x+a(m)/2,y:Br*y}),h.push(k))}let S=0;for(let m of e.nodes)i.has(m.id)||i.set(m.id,{x:S++*s/e.nodes.length,y:Br*3});return i}function Cr(e,t){let n=Za(e,t);return t.nodes.map(r=>({...r,...n.get(r.id)}))}function Er(e,t,n={}){let r=Mn(Ir(bt(e),t),n.referencePath);if(r.nodes.length===0)throw new Error(`No graph segments in ${t}`);if(n.maxNodes!==void 0&&r.nodes.length>n.maxNodes)throw new Error(`Graph too large to draw: ${r.nodes.length.toLocaleString()} nodes (limit ${n.maxNodes.toLocaleString()}). Zoom in to a smaller region, or raise maxGraphNodes on this view.`);return r}function Ja(e,t,n){let r=e.nodes.some(P);return{graph:{nodes:r?Cr(e,t):t.nodes,edges:e.edges},options:{quality:n.quality,linearLayout:n.linearLayout,...t.opts,...r?{rotateComponents:!1}:{}}}}function Fr(e,t){let n=e.nodes.some(P);return`${t.quality}|${t.linearLayout}|${t.bubbleSpread}|${n}|${e.referencePath??""}`}async function Vr(e,t,n){let r=dn(t.bubbleSpread),a=fn(e),{result:o,duration:i}=await n(Ja(a.graph,tt(a.graph,r),t)),s=tt(e,r),u=new Map(s.nodes.map(h=>[h.id,Me(s.opts,h.length)])),d=yn(o.nodePositions,a.runs,h=>u.get(h)??0);return{result:{...o,nodePositions:e.nodes.some(P)?vr(e,d):d},duration:i}}function Qa(e){let t=1/0,n=1/0,r=-1/0,a=-1/0;for(let o of Object.values(e))for(let i of o)t=Math.min(t,i.x),n=Math.min(n,i.y),r=Math.max(r,i.x),a=Math.max(a,i.y);return{minX:t,minY:n,maxX:r,maxY:a}}var D=40,ei=1e-6,ti=100;function he(e){return Math.max(ei,Math.min(ti,e))}function ft(e,t,n,r=D){let a=t-e.h*n;return r-e.minY*n+Math.max(0,a)/2}function Dr(e,t,n,r,{minScale:a=0,padLeft:o=D,padTop:i=D}={}){let s=t-o-D,u=n-i-D;if(s<=0||u<=0||!(e.w>0||!r&&e.h>0))return;let d=e.w>0?s/e.w:1/0,h=e.h>0?u/e.h:1/0,S=he(Math.max(a,r?d:Math.min(d,h))),m=s-e.w*S;return{scale:S,translateX:o-e.minX*S+Math.max(0,m)/2,translateY:ft(e,u,r?1:S,i)}}function Hr(e,t={}){let{minX:n,minY:r,maxX:a,maxY:o}=Qa(e.nodePositions),{region:i}=t;e.referenceAxis&&i&&i.end>i.start&&(n=i.start,a=i.end);let s=t.extent??e.extent;return s&&(n=Math.min(n,s.minX??n),r=Math.min(r,s.minY??r),a=Math.max(a,s.maxX??a),o=Math.max(o,s.maxY??o)),{minX:n,minY:r,w:a-n,h:o-r}}function ni(e,t,n){let r=j(e.name).name,a=new Map,o=[],i=()=>({a:-1/0,b:1/0,detour:[],bp:0}),s=[i()];for(let u of e.nodeIds){let d=t.get(u);if(!d)continue;let h=a.get(d.name)??0;a.set(d.name,h+1);let S=n.get(`${r} ${d.name}`)?.[h]??Ln(d),m=s.at(-1),c=o.at(-1);if(P(d)){let y=d.stable.start,k=y+d.length,b=S!==(d.stable.strand??"+"),p=c!==void 0&&m.detour.length===0;p&&!c.inverted&&!b&&c.end===y?c.end=k:p&&c.inverted&&b&&c.start===k?c.start=y:(o.push({start:y,end:k,inverted:b}),s.push(i()))}else m.detour.push({node:d,strand:S}),m.bp+=d.length}return o.forEach((u,d)=>{s[d].b=u.start,s[d+1].a=u.end}),{path:e,runs:o,gaps:s}}function yt(e,t){return Number.isFinite(e.a)&&Number.isFinite(e.b)&&e.b>=e.a&&Math.max(e.b-e.a,e.bp)<t}function Or(e,t,n){let r=0,a=e.length;for(;r<a;){let o=r+a>>1;e[o]<=t?r=o+1:a=o}return r<e.length&&e[r]<n}function ri(e){let t=new Map;for(let n=1;n<e.length;n++){let r=e[n-1],a=e[n],o=r.stable.start+r.length;o!==a.stable.start&&(t.set(o,"reference-gap"),t.set(a.stable.start,"reference-gap"))}return t}function oi(e,t,n){let r=(a,o)=>{Number.isFinite(a)&&!n.has(a)&&n.set(a,o)};for(let{runs:a,gaps:o}of e){let i=a[0],s=a.at(-1);i&&s&&(r(i.start,"walk-end"),r(s.end,"walk-end"));for(let u of a)u.inverted&&u.end-u.start>=t&&(r(u.start,"inversion"),r(u.end,"inversion"));for(let u of o)u.b<u.a?(r(u.a,"backward"),r(u.b,"backward")):yt(u,t)||(r(u.a,"variant"),r(u.b,"variant"))}for(let a=!0;a;){a=!1;let o=[...n.keys()].sort((s,u)=>s-u),i=e.flatMap(({runs:s,gaps:u})=>[...u.filter(d=>yt(d,t)).map(d=>[d.a,d.b]),...s.filter(d=>d.inverted&&d.end-d.start<t).map(d=>[d.start,d.end])]);for(let[s,u]of i)Or(o,s,u)&&(a||=!n.has(s)||!n.has(u),r(s,"overlap"),r(u,"overlap"))}return n}function ai(e,t){let n=[],r=[],a=()=>{let o=r[0],i=r.at(-1);if(o&&i){let s=o.stable.start,u=i.stable.start+i.length,d=`${s}-${u}`;n.push({node:{id:`${d}+`,name:d,length:u-s,depth:0,stable:{refName:o.stable.refName,start:s,rank:0,strand:"+"}},members:r})}r=[]};for(let o of e)t.has(o.stable.start)&&a(),r.push(o);return a(),n}function _r(e,t){let n=e.nodes.filter(P).sort((l,R)=>l.stable.start-R.stable.start),r=e.paths??[];if(n.length===0||r.length===0)return;let a=new Map(e.nodes.map(l=>[l.id,l])),o=Gn(e),i=r.map(l=>ni(l,a,o)),s=oi(i,t,ri(n)),u=[...s.keys()].sort((l,R)=>l-R),d=ai(n,s),h=d.map(l=>l.node.stable.start),S=l=>{let R=0,T=h.length-1;for(;R<T;){let N=R+T+1>>1;h[N]<=l?R=N:T=N-1}return R},m=new Map,c=new Map;for(let l of d){m.set(l.node.id,l.members.map(R=>R.id));for(let R of l.members)c.set(R.id,l.node.id)}let y=new Map,k=l=>{let R=`${l.a} ${l.b} ${l.detour.map(N=>N.node.id+N.strand).join(",")}`,T=y.get(R);if(!T){let N=`r${y.size}`;T={id:`${N}+`,name:N,length:l.bp,depth:0,stable:{refName:n[0].stable.refName,start:Number.isFinite(l.a)?l.a:l.b,rank:1,strand:"+"}},y.set(R,T),m.set(T.id,l.detour.map(v=>v.node.id));for(let v of l.detour)c.has(v.node.id)||c.set(v.node.id,T.id)}return T},b=new Map,p=[],g=new Map,w=new Map,M=new Map;for(let{path:l,runs:R,gaps:T}of i){let N=[],v=[],B=!1,Y=(G,F)=>{let V=N.at(-1);B&&V?.node===G&&V.strand===F||N.push({node:G,strand:F}),B=!0},H=G=>{B=!1,G.detour.length>0&&(Y(k(G),"+"),B=!1)},U=G=>{(G.bp>0||G.b>G.a)&&v.push({start:G.a,end:G.b,bp:G.bp});let F=d[S(G.b>G.a?G.a:G.a-1)];for(let V of G.detour)c.has(V.node.id)||(c.set(V.node.id,F.node.id),m.get(F.node.id).push(V.node.id))};R.forEach((G,F)=>{let V=T[F];yt(V,t)&&!Or(u,V.a,V.b)?U(V):H(V);let ie=S(G.start),q=S(G.end-1),Se=G.end-G.start<t;if(G.inverted&&!Se){B=!1;for(let W=q;W>=ie;W--)Y(d[W].node,"-");B=!1}else{G.inverted&&v.push({start:G.start,end:G.end,bp:G.end-G.start,inverted:!0});for(let W=ie;W<=q;W++)Y(d[W].node,"+")}}),H(T.at(-1));let K=j(l.name).name,et=0;N.forEach(({node:G,strand:F},V)=>{M.set(G.id,(M.get(G.id)??0)+1);let ie=g.get(G.name)??[];ie.push({path:K,sample:l.sample??K,start:et,strand:F}),g.set(G.name,ie),et+=G.length;let q=N[V+1];if(q){let Se=`${G.id}${F} ${q.node.id}${q.strand}`,W=w.get(Se);W?W.pathIds.push(l.name):w.set(Se,{from:G.id,to:q.node.id,fromStrand:F,toStrand:q.strand,pathIds:[l.name]})}}),p.push({...l,nodeIds:N.map(G=>G.node.id)}),b.set(l.name,v)}let L=[...d.map(l=>l.node),...y.values()].filter(l=>M.has(l.id)).map(l=>({...l,depth:M.get(l.id)}));return{graph:{...e,nodes:L,edges:[...w.values()],paths:p,pathVisits:g,reads:void 0},members:m,coarseOf:c,deviations:b,cuts:s}}var ii=e=>e.bp1>e.bp0;function jr(e,t){let n=e.filter(ii);if(n.length===0){let o=e[0];return o?[{tx:o.x0,sx:t(o.bp0)}]:[]}let r=n.map(o=>({c:o,s0:t(o.bp0),s1:t(o.bp1),trimLeft:0,trimRight:0}));for(let o=0;o+1<r.length;o++){let i=r[o],s=r[o+1],d=Math.min(s.c.x0-i.c.x1,24)-(s.s0-i.s1);if(d>0){let h=(i.s1-i.s0)/2,S=(s.s1-s.s0)/2,m=Math.min(d/2,h),c=Math.min(d-m,S);m=Math.min(d-c,h),i.trimRight=m,s.trimLeft=c}}let a=[];for(let{c:o,s0:i,s1:s,trimLeft:u,trimRight:d}of r)a.push({tx:o.x0,sx:i+u},{tx:o.x1,sx:s-d});return a}function $r(e,t){let n=e.length;if(n===0)return t;let r=e[0],a=e[n-1];if(t<=r.tx)return r.sx+(t-r.tx);if(t>=a.tx)return a.sx+(t-a.tx);let o=0,i=n-1;for(;i-o>1;){let h=o+i>>1;e[h].tx<=t?o=h:i=h}let s=e[o],u=e[i],d=u.tx-s.tx;return d>0?s.sx+(t-s.tx)/d*(u.sx-s.sx):s.sx}var si=.05,Fe=9;function di(e,t){let{minY:n,maxY:r}=e.layout.bounds,a=r-n;return e.columns&&a>0?Math.max(si,Math.min(1,t/a)):1}function Wr(e,t){let{scaleX:n,translateX:r,translateY:a}=t,o=t.scaleY*di(e,t.usableHeight),i=u=>(u-e.yOffset)*o+a,{columns:s}=e;if(s){let u=jr(s,d=>d*n+r);return{x:d=>$r(u,d),y:i,yScale:o}}return{x:u=>u*n+r,y:i,yScale:o}}function zr(e,{x:t,y:n},r,a){let o=null;return e.layout.nodes.forEach(i=>{i.order>=0&&t(i.x-Fe)<=r&&r<=t(i.x+i.pixelWidth+Fe)&&n(i.y-Fe)<=a&&a<=n(i.y+i.contentHeight+Fe)&&(o=i.name)}),o}function Ve(e,t){return{scaleX:e,scaleY:t?1:e,pixelRows:t}}function Xr(e,t,n,r){return{minX:-e.translateX/t.scaleX,minY:-e.translateY/t.scaleY,maxX:(n-e.translateX)/t.scaleX,maxY:(r-e.translateY)/t.scaleY}}function Yr(e,t){let n=(e.maxX-e.minX)*t,r=(e.maxY-e.minY)*t;return{minX:e.minX-n,minY:e.minY-r,maxX:e.maxX+n,maxY:e.maxY+r}}function Ur(e,t){return t.minX>=e.minX&&t.maxX<=e.maxX&&t.minY>=e.minY&&t.maxY<=e.maxY}function Kr(e,t,n,r,a){let o=he(e.scale*t),i=o/e.scale;return{scale:o,translateX:n-(n-e.translateX)*i,translateY:a?e.translateY:r-(r-e.translateY)*i}}function qr(e,t){let n=e.paths?.find(d=>d.name===t);if(!n)return;let r=new Map(e.nodes.map(d=>[d.id,d])),a=new Map;e.edges.forEach((d,h)=>{a.set(`${d.from}>${d.to}`,h)});let o=new Set(n.nodeIds),i=new Set;for(let d=1;d<n.nodeIds.length;d++){let h=n.nodeIds[d-1],S=n.nodeIds[d],m=a.get(`${h}>${S}`)??a.get(`${S}>${h}`);m!==void 0&&i.add(m)}let s=d=>d.reduce((h,S)=>h+(r.get(S)?.length??0),0),u=e.referencePath?e.paths.find(d=>j(d.name).name===e.referencePath):void 0;return{name:t,nodeIds:o,edgeIndexes:i,steps:n.nodeIds.length,bp:s(n.nodeIds),referenceBp:u&&u!==n?s(u.nodeIds):void 0}}var te=x(_(),1),No=x(an(),1),A=x(se(),1),Po=x(Ga(),1),f=x(z(),1),Io=x(Jr(),1),vo=x(Pa(),1),C=x(on(),1);var wt=new Set(["Gff3TabixAdapter","Gff3Adapter","GtfTabixAdapter","GtfAdapter","BigBedAdapter","NCListAdapter"]),ci=/gene|refseq|gencode|ensembl|annotation/i;function Qr(e,t){if(t)return e.find(r=>r.trackId===t);let n=e.filter(r=>wt.has(r.adapterType));return n.find(r=>ci.test(`${r.trackId} ${r.name??""}`))??n[0]}function $(e,t){return typeof e.get=="function"?e.get(t):e[t]}function eo(e,t){$(e,"type")==="exon"&&t.push({start:$(e,"start"),end:$(e,"end")});let r=$(e,"subfeatures");for(let a of r??[])eo(a,t)}function ui(e){let t=[...e].sort((r,a)=>r.start-a.start),n=[];for(let r of t){let a=n.at(-1);a&&r.start<=a.end?a.end=Math.max(a.end,r.end):n.push({...r})}return n}function to(e){let t=[];for(let n of e){let r=$(n,"gene_name")??$(n,"name")??$(n,"id"),a=$(n,"start"),o=$(n,"end");if(!r||!(o>a))continue;let i=[];eo(n,i),t.push({name:r,refName:$(n,"refName"),start:a,end:o,strand:$(n,"strand")??0,exons:i.length?ui(i):[{start:a,end:o}]})}return t}function no(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.horizontalScroll=="function"&&typeof t.zoomTo=="function"&&"coarseDynamicBlocks"in t&&"dynamicBlocks"in t}function ro(e){return e.reduce((t,n)=>t&&t.end-t.start>=n.end-n.start?t:n,void 0)}function De(e,t){let n=ro(e.dynamicBlocks.contentBlocks.filter(o=>o.refName===t.refName&&o.assemblyName===t.assemblyName)),{bpPerPx:r}=e;if(!n||!(r>0))return;let a=n.offsetPx-e.offsetPx;return n.reversed?{scale:-1/r,translateX:a+n.end/r}:{scale:1/r,translateX:a-n.start/r}}function He(e){let t=ro(e.dynamicBlocks.contentBlocks),n=t?.displayedRegionIndex===void 0?void 0:e.displayedRegions[t.displayedRegionIndex];return t&&e.bpPerPx>0?{refName:t.refName,assemblyName:t.assemblyName,start:t.start,end:t.end,bpPerPx:e.bpPerPx,span:e.bpPerPx*e.width,regionStart:n?.start??t.start,regionEnd:n?.end??t.end}:void 0}function xt(e,t,n=!0){let r=e.end-e.start,a=n?Math.max(0,Math.min(e.span,(t-r)/2)):0,o=Math.max(e.regionStart,Math.floor(e.start-a)),i=Math.min(e.regionEnd,Math.ceil(e.end+a)),s=i-o-t;return s>0&&(o+=Math.floor(s/2),i-=Math.ceil(s/2)),{refName:e.refName,assemblyName:e.assemblyName,start:o,end:i}}function oo(e,t,n=!0){if(e?.refName!==t.refName||e.assemblyName!==t.assemblyName)return!1;if(n)return e.start<=t.start+1&&t.end<=e.end+1;let r=xt(t,1/0,!1);return Math.abs(e.start-r.start)<1&&Math.abs(e.end-r.end)<1}var Q=x(z(),1);function ao(e){return t=>e.includes(t)?t:void 0}function St(e){return Q.types.snapshotProcessor(Q.types.maybe(Q.types.enumeration(e)),{preProcessor:ao(e)})}function kt(e,t){return Q.types.snapshotProcessor(Q.types.optional(Q.types.enumeration(e),t),{preProcessor:ao(e)})}var Lt=new Set(["BedAdapter","BedTabixAdapter","BigBedAdapter","VcfAdapter","VcfTabixAdapter"]),pi=/repeat|tandem|\bstr\b|vntr|trf|trgt|vamos|expansion|microsat/i;function io(e,t){return t?e.find(r=>r.trackId===t):e.filter(r=>Lt.has(r.adapterType)).find(r=>pi.test(`${r.trackId} ${r.name??""}`))}function be(e,t){return typeof e.get=="function"?e.get(t):e[t]}var so=/^\w+=[^;]*(;\w+=[^;]*)*$/;function mi(e){let t=be(e,"name");if(!(typeof t!="string"||!so.test(t)))return Object.fromEntries(t.split(";").map(n=>{let r=n.indexOf("=");return[n.slice(0,r),n.slice(r+1)]}))}function X(e,t){let n=be(e,t);return n!==void 0?n:be(e,"INFO")?.[t]??mi(e)?.[t]}var co=["RUS","MOTIFS","RU","motifs","motif","sequence","consensus"],gi=["RUL","period","PERIOD","consensusSize","unit","unitLength"],li=["TRID","REPID","VARID","ID","name","id"];function Oe(e,t){for(let n of t){let r=X(e,n),a=String((Array.isArray(r)?r[0]:r)??"").split(",")[0].trim();if(a!==""&&a!==".")return a}}var uo=/^[ACGTURYSWKMBDHVN]+$/i;function hi(e){let t=Number(Oe(e,gi));if(Number.isFinite(t)&&t>0)return Math.round(t);let n=Oe(e,co);return n&&uo.test(n)?n.length:void 0}function ee(e){return(Array.isArray(e)?e:String(e??"").split(",")).map(n=>{let r=n===""||n===null||n===void 0?NaN:Number(n);return Number.isFinite(r)?r:void 0})}function Rt(e){return(Array.isArray(e)?e:String(e??"").split(",")).map(n=>{let r=String(n??"").trim();return r===""||r==="."?void 0:r})}var Mt="<CNV:TR>";function bi(e){let t=Rt(be(e,"ALT"));if(!t.includes(Mt))return;let n=ee(X(e,"RN")),r=Rt(X(e,"RUS")),a=ee(X(e,"RUL")),o=ee(X(e,"RUC")),i=ee(X(e,"RB")),s=0;return t.map((u,d)=>{let h=n[d]??(u===Mt?1:0),S=0,m=0;for(let c=0;c<h;c++,s++){let y=r[s],k=a[s]??(y&&uo.test(y)?y.length:void 0),b=o[s],p=i[s]??(k&&b!==void 0?Math.round(k*b):void 0);p!==void 0&&(S+=p,m++)}return u===Mt&&h>0&&m===h?S:void 0})}function fi(e,t,n){let r=e?.includes("|");return(e??"").split(/[/|]/).flatMap((a,o)=>{let i=Number(a),s=i>0?t[i-1]:n;return!Number.isInteger(i)||s===void 0?[]:[{bp:s,...r?{haplotype:o+1}:{}}]})}function yi(e,t,n){let r=be(e,"samples"),a={};for(let[o,i]of Object.entries(r??{})){let s=ee(i.SD),u=ee(i.AL).flatMap((h,S)=>h!==void 0&&h>0?[s[S]===void 0?{bp:h}:{bp:h,spanningReads:s[S]}]:[]),d=u.length>0||!t?u:fi(Rt(i.GT)[0],t,n);d.length>0&&(a[o]=d)}return Object.keys(a).length>0?a:void 0}function wi(e,t){let n=X(e,"start"),r=X(e,"end"),a=ee(X(e,"SVLEN"))[0];return t&&a!==void 0?{start:n+1,end:n+1+a}:{start:n,end:r}}function po(e){let t=[];for(let n of e){let r=bi(n),{start:a,end:o}=wi(n,r!==void 0),i=hi(n);if(!(o>a)||i===void 0)continue;let s=X(n,"refName"),u=Oe(n,co),d=Oe(n,li);t.push({key:`${s}:${a}-${o}`,name:(d&&!so.test(d)?d:void 0)??(u&&u.length<=12?`(${u})n`:`${s}:${(a+1).toLocaleString()}-${o.toLocaleString()}`),refName:s,start:a,end:o,unit:i,motif:u,calls:yi(n,r,o-a)})}return t.sort((n,r)=>n.start-r.start)}function _e(e){return typeof e=="object"&&e!==null}function xi(e){return _e(e)&&typeof e.get=="function"}function Si(e){let t=xi(e)?e.get("name"):_e(e)?e.name:void 0;return typeof t=="string"?t:void 0}function mo(e){let t;if(_e(e)&&_e(e.hoverPosition)){let{refName:n,coord:r,coord0:a,assemblyName:o}=e.hoverPosition;typeof n=="string"&&typeof r=="number"&&(t={refName:n,coord:typeof a=="number"?a:r-1,assemblyName:typeof o=="string"?o:void 0,featureName:Si(e.hoverFeature)})}return t}function go(e,t){return(e.assemblyName===void 0||e.assemblyName===t.assemblyName)&&e.refName===t.refName&&e.coord>=t.start&&e.coord<t.end}function lo({hover:e,nodes:t}){let n,r;for(let a of t)a.name===e.featureName?n=a.id:r===void 0&&P(a)&&e.coord>=a.stable.start&&e.coord<a.stable.start+a.length&&(r=a.id);return n??r??null}var Gt=x(_(),1);function ho(e){return typeof e=="object"&&e!==null}function ki(e){return ho(e)&&e.type==="LinearGenomeView"&&typeof e.id=="string"&&typeof e.navToLocString=="function"&&Array.isArray(e.assemblyNames)}function fe(e){return e.flatMap(t=>ho(t)&&Array.isArray(t.views)?[t,...t.views]:[t])}function ye({views:e,connectedViewId:t,assemblyName:n}){let r=fe(e).filter(o=>ki(o)).filter(o=>o.assemblyNames.includes(n));return r.find(o=>o.id===t)??(r.length===1?r[0]:void 0)}function fo(e,t,n){n.catch(r=>{console.error(`[GraphGenomeView] ${t}`,r),e.notifyError?.(`${t}: ${r}`,r)})}var Mi=1e3;function Tt(e,t=Mi){let n=Math.max(0,Math.ceil((t-(e.end-e.start))/2));return{...e,start:Math.max(0,e.start-n),end:e.end+n}}function yo(e,t){return t?e.map(n=>n.rank===0?{...n,sample:t.assemblyName,haplotype:void 0,refName:t.refName,start:t.start,end:t.end}:n):e}function wo({session:e,location:t,assembly:n,connectedViewId:r,tracks:a=[]}){let o=ye({views:e.views,connectedViewId:r,assemblyName:n}),i;return o?(fo(e,`Could not show ${n} ${ce(t)}`,Promise.resolve(o.navToLocString(ve(t),n))),i=o.id):i=e.addView("LinearGenomeView",{displayName:`${n} \u2014 ${ce(t)}`,init:{assembly:n,loc:ve(t),tracks:a}}).id,i}function xo({session:e,location:t,assembly:n,connectedViewId:r}){let a=ye({views:e.views,connectedViewId:r,assemblyName:n});return a?.addToHighlights?.({refName:t.refName,start:t.start,end:t.end,assemblyName:n}),a!==void 0}function bo(e,t){if(t===void 0)return[];let n=e.tracks.find(a=>(0,Gt.readConfObject)(a,"trackId")===t),r=n?(0,Gt.readConfObject)(n,"assemblyNames"):[];return Array.isArray(r)?r.filter(a=>typeof a=="string"):[]}function So({session:e,contributors:t,trackId:n,graphTrackId:r}){let a=bo(e,r),o=bo(e,n),i=t.filter(d=>o.includes(d.sample)),s=i.length>=2?i:t,u={init:{views:s.map(d=>({assembly:d.sample,loc:ve(d),...r!==void 0&&a.includes(d.sample)?{tracks:[r]}:{}})),tracks:n?s.slice(1).map(()=>[n]):[],collapseEmptyRows:!0}};e.launchView?fo(e,"Could not open the synteny view",e.launchView("LinearSyntenyView",u)):e.addView("LinearSyntenyView",u)}var je=x(_(),1),Ri="FeatureTrack";function ko({session:e,assemblyName:t,first:n}){let r=[];for(let a of e.tracks){let o=(0,je.readConfObject)(a,"type"),i=(0,je.readConfObject)(a,"assemblyNames"),s=(0,je.readConfObject)(a,"trackId");o===Ri&&Array.isArray(i)&&i.includes(t)&&typeof s=="string"&&s!==n&&r.push(s)}return n?[n,...r]:r}var $e=x(_(),1),Mo=x(Ta(),1),We=x(z(),1),Li="SyntenyTrack",Gi="Synteny adapters";function Ti(e){if((0,$e.readConfObject)(e,"type")===Li)return!0;let t=e.adapter?.type;if(typeof t!="string"||!(0,We.isStateTreeNode)(e))return!1;let{pluginManager:n}=(0,We.getEnv)(e);return!!n?.hasAdapterType(t)&&n.getAdapterType(t).adapterMetadata?.category===Gi}function Ro(e,t){let n=new Set(t),r=[];for(let a of e.tracks){let o=(0,$e.readConfObject)(a,"assemblyNames"),i=(0,$e.readConfObject)(a,"trackId");if(Ti(a)&&typeof i=="string"&&Array.isArray(o)){let s=o.filter(u=>n.has(u)).length;s>=2&&r.push({trackId:i,name:(0,Mo.getTrackName)(a,e),coverage:s})}}return r.sort((a,o)=>o.coverage-a.coverage)}var Ni=600,At=160,Pi=5,Lo=new Set(["tubemap","tubemapref"]),Ii=[{bp:0,label:"None"},{bp:3,label:"Under 3 bp"},{bp:10,label:"Under 10 bp"},{bp:50,label:"Under 50 bp, leaving structural variants"},{bp:1e3,label:"Under 1 kb"}],Go=".segs.bed.gz";function vi(e){if(typeof e.uri=="string")return e.uri;let n=e.segmentsLocation?.uri;return typeof n=="string"&&n.endsWith(Go)?n.slice(0,-Go.length):void 0}var To=1.4,Bi=1.6,Ci=150,Ei=1,Fi={nodeStrokes:[],nodeStrokeRuns:new Map,arrows:[],arrowRuns:new Map,edgeCurves:[],edgeCurveRuns:new Map};function we(...e){}var Xe=5e6;function ne(e){return e>=1e6?`${+(e/1e6).toFixed(1)} Mb`:`${Math.round(e/1e3)} kb`}var Vi=2e4;function Ao(e){return e.builtViewport!==void 0&&e.paintedViewport===e.builtViewport&&e.builtViewport.viewportDirty===e.viewportDirty&&!e.viewportRebuildPending}function Nt(e){return Xr(e,e.axisScale,e.paneWidth,e.canvasHeight)}var ze=new WeakMap,Di=4;function Hi(e){let t=ze.get(e);return t||(t=new Map,ze.set(e,t)),t}function Oi(e,t){let n=ze.get(e);n&&e!==t&&ze.set(t,n)}function _i(e,t,n){e.size>=Di&&e.delete(e.keys().next().value),e.set(t,n)}function Ye(){return f.types.compose("GraphPane",(0,Io.RenderLifecycleMixin)(),f.types.model({layoutQuality:f.types.optional(f.types.number,2),linearLayout:f.types.optional(f.types.boolean,!1),layoutMode:St(Pe),colorScheme:St(Te),bubbleSpread:kt(sn,"auto"),nodeWidth:kt(Nn,"depth"),showBubbles:f.types.optional(f.types.boolean,!1),showDeletionEdges:f.types.optional(f.types.boolean,!1),showGenes:f.types.optional(f.types.boolean,!0),showReferenceStrip:f.types.optional(f.types.boolean,!0),tubeMapFold:f.types.optional(f.types.number,0),geneTrackId:f.types.optional(f.types.string,""),repeatTrackId:f.types.optional(f.types.string,""),repeatKey:f.types.optional(f.types.string,""),walkRowSamples:f.types.maybe(f.types.frozen()),highlightedPath:f.types.optional(f.types.string,""),referencePath:f.types.optional(f.types.string,""),showPerf:f.types.optional(f.types.boolean,!1),contigThickness:f.types.optional(f.types.number,6),connectorThickness:f.types.optional(f.types.number,2),darkMode:f.types.optional(f.types.boolean,!1),scale:f.types.optional(f.types.number,1),translateX:f.types.optional(f.types.number,0),translateY:f.types.optional(f.types.number,0),drawPaths:f.types.optional(f.types.boolean,!1),paneHeight:f.types.maybe(f.types.number),maxGraphNodes:f.types.optional(f.types.number,Vi),colorDomain:f.types.maybe(f.types.frozen()),connectedViewId:f.types.maybe(f.types.string)})).volatile(()=>({graph:void 0,graphRegion:void 0,loadedReferencePath:void 0,layoutResult:void 0,legendSize:{width:0,height:0},indexBubbles:void 0,geneFeatures:void 0,repeatArrays:void 0,popStack:[],error:void 0,isLoading:!1,loadCanceled:!1,statusMessage:"",hoveredNode:null,hoveredBubble:null,pointerInPane:!1,hoveredEdge:null,selectedNode:null,viewportDirty:0,positionsVersion:0,geometryVersion:0,builtViewport:void 0,paintedViewport:void 0,draggingNode:null,isPanning:!1,viewportOwner:"fit",viewportDirtyTimer:void 0,positionsDirtyFrame:0,lastFetchMs:void 0,readsShown:void 0,lastLayoutMs:void 0,lastGeometryMs:void 0,lastGeometryStrokeCount:void 0,viewportRebuildPending:!1})).views(e=>({get defaultLayoutMode(){return"force"},get defaultColorScheme(){return"auto"},get hasPendingSource(){return!1},get canRetryLoad(){return!1},get sourceTrack(){try{return(0,A.getContainingTrack)(e).configuration}catch{return}}})).views(e=>({get chosenLayoutMode(){return e.layoutMode??e.defaultLayoutMode},get chosenColorScheme(){return e.colorScheme??e.defaultColorScheme}})).views(e=>({get paneWidth(){return(0,A.getContainingView)(e).width},get drawnGraph(){return e.layoutResult?.tubeMap?.coarse?.graph??e.graph}})).views(e=>({get nodeById(){if(e.drawnGraph){let t=new Map;for(let n of e.drawnGraph.nodes)t.set(n.id,n);return t}},get nodeLengths(){let t=new Map;for(let n of e.drawnGraph?.nodes??[])t.set(n.id,n.length);return t},get nodeCount(){return e.graph?.nodes.length??0},get edgeCount(){return e.graph?.edges.length??0},get pathCount(){return e.graph?.paths?.length??0},get hasGraph(){return e.graph!==void 0},get geometryPainted(){return Ao(e)},get showLoading(){return e.error===void 0&&(e.isLoading||e.hasPendingSource||e.graph!==void 0&&!Ao(e))},get canCancelLoad(){return e.isLoading&&!e.layoutResult},get usesLayoutEngine(){return e.graph?An(e.chosenLayoutMode,e.graph):!1},get canAnchorLayout(){return e.graph?.nodes.some(t=>t.stable?.rank===0)??!1},get anchorPaths(){return e.graph?.anchorPaths??[]},get pathLegend(){let t=e.graph?.paths,n=e.layoutResult?.tubeMap;return(e.drawPaths||n)&&t&&at(t.length)?it(t,n?.pathColors):[]},get walkChoices(){let t=e.graph?.paths;return t?.length?it(t):[]},get walkHighlight(){return e.graph&&e.highlightedPath?qr(e.graph,e.highlightedPath):void 0},get effectiveDrawPaths(){return e.drawPaths&&at(e.graph?.paths?.length??0)},get activeReferencePath(){return e.graph?.referencePath},get rampDomain(){return e.colorDomain??e.graphRegion},get effectiveColorScheme(){return hn(e.chosenColorScheme,e.graph)},get nodePositions(){return e.layoutResult?.nodePositions},get labelsNodeSizes(){return!e.layoutResult?.tubeMap},get rowLabels(){return e.layoutResult?.rowLabels??[]},get alleleDeletions(){return e.layoutResult?.alleleDeletions??[]},get pixelRows(){return e.layoutResult?.pixelRows??!1},get zoomPercent(){return`${(e.scale*100).toFixed(1)}%`},get isDefaultViewport(){return e.scale===1&&e.translateX===0&&e.translateY===0}})).views(e=>({get poppedFrom(){return e.popStack.at(-1)},get derivedBubbles(){return e.graph?Gr(e.graph):[]}})).views(e=>({get bubbles(){return e.indexBubbles?.length?e.indexBubbles:e.derivedBubbles}})).views(e=>({get sourceAdapter(){let t=e.sourceTrack;return t?(0,te.readConfObject)(t,"adapter"):void 0},get sourceTrackId(){let t=e.sourceTrack;return t?(0,te.readConfObject)(t,"trackId"):void 0},get assemblyTrackChoices(){let t=e.graphRegion;return t?(0,A.getSession)(e).tracks.filter(n=>(0,te.readConfObject)(n,"assemblyNames").includes(t.assemblyName)).map(n=>({trackId:n.trackId,name:(0,te.readConfObject)(n,"name"),adapterType:(0,te.readConfObject)(n,"adapter").type})):[]}})).views(e=>({get geneTrackChoices(){return e.assemblyTrackChoices.filter(t=>wt.has(t.adapterType))},get repeatTrackChoices(){return e.assemblyTrackChoices.filter(t=>Lt.has(t.adapterType))},get repeatChoices(){return e.repeatArrays??[]}})).views(e=>({get repeatTrack(){return io(e.repeatTrackChoices,e.repeatTrackId)},get selectedRepeat(){return e.repeatChoices.find(t=>t.key===e.repeatKey)},get backbone(){return e.graph?Zt(e.graph):void 0},assemblySpellings(t){let{assemblyManager:n}=(0,A.getSession)(e),r=n.has(t)?n.get(t):void 0,a=e.sourceAdapter?.assemblyNameToPanSN??{},o=[t,...r?[r.name,...r.aliases]:[]];return{name:t,aliases:[...o,...o.flatMap(i=>a[i]??[])]}},get drawsLoadedReference(){let t=e.graph;return t?.anchoredBy==="tags"||t?.referencePath!==void 0&&t.referencePath===e.loadedReferencePath}})).views(e=>({get geneAssembly(){let t=e.graphRegion;return t?e.assemblySpellings(t.assemblyName):void 0}})).views(e=>({get backboneGenes(){let{backbone:t,geneAssembly:n,geneFeatures:r}=e,a=e.drawsLoadedReference||n!==void 0&&Jt(t,[n])!==void 0;return t&&r&&a?en(r,t):void 0}})).views(e=>({get nodeNeighbors(){return e.drawnGraph?Ae(e.drawnGraph):void 0},get nodeInk(){return Pn(e.drawnGraph,e.nodeById,e.contigThickness,e.nodeWidth)},get deletions(){return e.graph&&e.chosenLayoutMode!=="walkrows"&&!e.layoutResult?.tubeMap?bn(e.graph):[]},get walkRowBars(){if(e.chosenLayoutMode!=="walkrows"||!e.graph)return;let t=e.selectedRepeat,n=t?ot(e.graph,t,t.unit):ot(e.graph,e.graphRegion);if(!n)return;let r=e.walkRowSamples,a=r?n.rows.filter(s=>r.includes(s.sample)).sort((s,u)=>r.indexOf(s.sample)-r.indexOf(u.sample)||s.label.localeCompare(u.label)):n.rows,[o,...i]=qn([n.reference,...a],t?.calls);return{...n,reference:o,rows:i}},get drawnRowLabels(){let t=this.walkRowBars;return t?[t.reference,...t.rows].map((n,r)=>({label:n.label,y:r*20})):e.rowLabels},get fitPadLeft(){return Math.max(D,...this.drawnRowLabels.map(t=>wn(t.label,0).x1+6))},get genePins(){we(e.positionsVersion);let t=e.layoutResult?.nodePositions;return e.showGenes&&e.chosenLayoutMode!=="walkrows"&&!e.layoutResult?.tubeMap&&e.graph&&e.backboneGenes&&t?Ar(e.graph,e.backboneGenes,t):[]},get bubbleHalos(){we(e.positionsVersion);let t=e.layoutResult?.nodePositions;if(!e.showBubbles||e.chosenLayoutMode==="walkrows"||e.layoutResult?.tubeMap||!e.graph||!t)return[];let n=new Map(e.walkChoices.map(r=>[r.name,r.label]));return Lr(e.graph,e.bubbles,t,r=>n.get(r)??r,e.repeatArrays)},get referenceRamp(){return e.effectiveColorScheme==="reference-position"&&e.graph&&!e.layoutResult?.tubeMap?In(e.graph,e.rampDomain):void 0},get assemblyNames(){let t=e.graphRegion;return t?[t.assemblyName]:[]},get scaleX(){return Ve(e.scale,e.pixelRows).scaleX},get scaleY(){return Ve(e.scale,e.pixelRows).scaleY},get axisScale(){return Ve(e.scale,e.pixelRows)},get layoutBounds(){let t=e.layoutResult,n=this.walkRowBars;return t?Hr(t,{region:e.popStack.length===0?e.graphRegion:void 0,extent:n&&t.extent?Rn(n):void 0}):void 0}})).views(e=>({get geneTrack(){return Qr(e.geneTrackChoices,e.geneTrackId)},get deletionEdgeIndexes(){return new Map(e.deletions.map(t=>[t.edgeIndex,t.bypassed]))},get hiddenEdgeIndexes(){return new Set(e.showDeletionEdges?[]:e.deletions.map(t=>t.edgeIndex))},get referenceRampDomain(){let t=e.referenceRamp;return t?{start:t.start,end:t.start+t.span}:void 0},nodeSpan(t){let{nodeById:n,nodeNeighbors:r}=e;return n&&r?Ne({nodeId:t,nodeById:n,neighbors:r}):void 0}})).views(e=>({get hoveredSpan(){let t=e.hoveredNode,n=e.hoveredBubble;return t!==null?e.nodeSpan(t):n?{start:n.start,end:n.end}:void 0}})).views(e=>({get hoverHighlight(){let t=e.graphRegion,n=e.hoveredSpan;return t&&n?{refName:t.refName,assemblyName:t.assemblyName,...n}:void 0}})).views(e=>({get contributingAssemblies(){let t=e.graph,n=t?Ut(t):[];return t?Zn(t,{maxGap:n.length>0?qt(n):1/0}):[]}})).views(e=>({get assemblyResolver(){let{assemblyManager:t}=(0,A.getSession)(e),n=e.sourceAdapter?.assemblyNameToPanSN,r=new Map(Object.entries(n??{}).map(([o,i])=>[i,o])),a=o=>o!==void 0&&t.has(o)?t.get(o)?.name??o:void 0;return o=>a(r.get(o))??a(o)}})).views(e=>({get launchableAssemblies(){return Qn(yo(e.contributingAssemblies,e.graphRegion),e.assemblyResolver)},get canHighlightInLinearView(){let t=e.graphRegion;return t!==void 0&&ye({views:[...(0,A.getSession)(e).views],connectedViewId:e.connectedViewId,assemblyName:t.assemblyName})!==void 0},nodeLaunchTargets(t){let n=e.nodeById?.get(t),r=n?Ie(n):void 0,a=r?Jn(e.assemblyResolver,r):void 0,o=e.graphRegion,i=e.nodeById,s=e.nodeNeighbors,u=o&&i&&s?Ne({nodeId:t,nodeById:i,neighbors:s}):void 0,d=o&&u?{sample:o.assemblyName,haplotype:void 0,refName:o.refName,...u}:void 0;return{own:r&&a?{location:Tt(r),assembly:a}:void 0,reference:o&&d?{location:Tt(d),assembly:o.assemblyName}:void 0,highlight:o&&d?{location:d,assembly:o.assemblyName}:void 0}}})).views(e=>({get host(){let t;try{t=(0,A.getContainingView)(e)}catch{return}return no(t)?t:void 0}})).views(e=>({get xIsReferenceBp(){return e.layoutResult?.referenceAxis===!0&&Z(e.chosenLayoutMode).cutMargins}})).views(e=>({get hostPlacesX(){let{host:t,graphRegion:n}=e;return t!==void 0&&t.initialized&&n!==void 0&&e.xIsReferenceBp&&e.popStack.length===0&&!t.dynamicBlocks.contentBlocks.some(r=>r.refName===n.refName&&r.reversed)}})).views(e=>({get hostFrame(){let{host:t,graphRegion:n}=e;return e.hostPlacesX&&t&&n?De(t,n):void 0},get tubeMapPicture(){let t=e.layoutResult?.tubeMap;return t?Wn(t.layout):void 0},get tubeMapReference(){let t=e.layoutResult?.tubeMap;return t&&e.drawnGraph?Dn(e.drawnGraph,t.layout):void 0},get tubeMapDeviations(){let t=e.layoutResult?.tubeMap?.coarse,n=e.layoutResult?.tubeMap?.layout;return t&&n?$n(t.graph,n,t.deviations):[]},get tubeMapReferenceNodes(){let t=e.layoutResult;return t?.tubeMap&&!t.referenceAxis&&e.drawnGraph?On(e.drawnGraph,t.tubeMap.layout):void 0}})).views(e=>({get tubeMapGenes(){let t=e.tubeMapReference;return e.showGenes&&!e.host&&t&&e.backboneGenes?Yn(t,e.backboneGenes):[]},get referenceStripApplies(){let{host:t,layoutResult:n}=e;return!!t?.initialized&&!!n&&!n.tubeMap&&!e.hostPlacesX&&e.chosenLayoutMode!=="walkrows"}})).views(e=>({get referenceStripBlocks(){let{graph:t}=e;return e.showReferenceStrip&&e.referenceStripApplies&&t?Cn(t,{colorScheme:e.effectiveColorScheme,referenceRamp:e.referenceRamp,walkNodes:e.walkHighlight?.nodeIds}):[]},get referenceStripFrame(){let{host:t,graphRegion:n}=e;return t?.initialized&&n?De(t,n):void 0}})).views(e=>({get referenceStripShown(){return e.referenceStripBlocks.length>0&&e.referenceStripFrame!==void 0},get referenceStripOverhangs(){let t=e.referenceStripFrame;if(!t||e.referenceStripBlocks.length===0)return!1;let{left:n,right:r}=En(e.referenceStripBlocks,t,e.paneWidth);return n>0||r>0}})).views(e=>({get referenceStripLit(){if(!e.referenceStripShown)return;let t=o=>({x:o.x*e.scaleX+e.translateX,y:o.y*e.scaleY+e.translateY}),n=e.hoveredNode===null?e.hoveredBubble:null;if(n){let o=e.bubbleHalos.find(i=>cn(i.bubble,n));return{start:n.start,end:n.end,anchor:o?t(o.labelAt):void 0}}let r=e.hoveredNode??e.selectedNode,a=r===null?void 0:e.nodeSpan(r);return a&&r!==null?{...a,anchor:Vn(e.nodePositions?.[r],t)}:void 0},referenceStripNodeAt(t,n){let r=e.referenceStripFrame;return e.referenceStripShown&&r?Fn(e.referenceStripBlocks,r,t,n):void 0},get referenceStripZonePx(){return e.referenceStripShown?Bn:0}})).views(e=>({get paneCeiling(){return Math.max(At,e.paneHeight??Ni)},get fitPadTop(){let t=Kn(e.tubeMapGenes);return D+Math.max(0,t-1)*Un+e.referenceStripZonePx},get minFitScale(){let t=e.layoutBounds,n=e.layoutResult,r=n?.tubeMap?.layout.tracks[0]?.width;return t&&t.h>0&&r&&!n.referenceAxis?Math.min(Pi/r,(this.paneCeiling-this.fitPadTop-D)/t.h):0},get canvasHeight(){let t=e.layoutBounds,n=e.paneWidth-D*2,r=this.paneCeiling;return t?e.pixelRows?Math.min(r,Math.max(At,t.h+this.fitPadTop+D)):t.w>0&&n>0?Math.min(r,Math.max(At,t.h*Math.max(n/t.w,this.minFitScale)+this.fitPadTop+D)):r:r},get fittedTransform(){let t=e.layoutBounds;return t?Dr(t,e.paneWidth,this.canvasHeight,e.pixelRows,{minScale:this.minFitScale,padLeft:e.fitPadLeft,padTop:this.fitPadTop}):void 0}})).views(e=>({get overlayLabels(){return xn(e)},get tubeMapFrame(){let t=e.layoutResult?.tubeMap;return t?Wr(t,{scaleX:e.scaleX,translateX:e.translateX,scaleY:e.scaleY,translateY:e.translateY,usableHeight:e.canvasHeight-e.fitPadTop-D}):void 0}})).views(e=>({get tubeMapRulerBoxes(){let t=e.tubeMapReference;return t&&!e.hostPlacesX?Hn(t):void 0},get connectorZoneBottom(){let t=e.tubeMapPicture,n=e.tubeMapFrame;return t&&n?n.y(t.bounds.minY)-2:0},get tubeMapConnectors(){let t=e.tubeMapReferenceNodes,n=e.tubeMapFrame,{host:r,graphRegion:a}=e,o=t&&n&&r?.initialized&&a?De(r,a):void 0;return t&&n&&o?_n(t,i=>i*o.scale+o.translateX,n.x,e.paneWidth):[]}})).views(e=>({get tubeMapKeys(){let t=e.layoutResult,n=t?.tubeMap?.layout.reads??[],r=e.tubeMapPicture,a=e.tubeMapFrame,o=r&&a&&zn(a.yScale)?r.mismatches.filter(i=>Xn(i,{x:a.x,width:e.paneWidth})):[];return{logWidths:t?.tubeMap!==void 0&&!t.referenceAxis,foldBp:e.tubeMapDeviations.length>0?e.tubeMapFold:void 0,forwardReads:n.some(i=>!i.is_reverse),reverseReads:n.some(i=>i.is_reverse),mismatches:new Set(o.map(i=>i.kind))}},tubeMapNodeAt(t,n){let r=e.layoutResult?.tubeMap,a=e.tubeMapFrame;return(r&&a?zr(r,a,t,n):null)??jn(e.tubeMapConnectors,e.connectorZoneBottom,t,n)??null}})).actions(e=>({setError(t){e.error=t,e.isLoading=!1,e.statusMessage=""},finishLoading(){e.isLoading=!1,e.statusMessage=""},setStatusMessage(t){e.statusMessage=t},setFetchMs(t){e.lastFetchMs=t},setLayoutMs(t){e.lastLayoutMs=t},setGeometryMetrics(t,n,r){e.lastGeometryMs=t,e.lastGeometryStrokeCount=n,e.builtViewport={...r,viewportDirty:e.viewportDirty},e.geometryVersion++},markPainted(){e.paintedViewport=e.builtViewport},setLayoutQuality(t){e.layoutQuality=t},setLinearLayout(t){e.linearLayout=t},setLayoutMode(t){e.layoutMode=t},setReferencePath(t){e.referencePath=t;let n=e.graph;if(n?.anchoredBy==="paths"){let r=rt(n,t);Oi(n,r),e.graph=r}},setDrawPaths(t){e.drawPaths=t},setShowPerf(t){e.showPerf=t},setColorScheme(t){e.colorScheme=t},setBubbleSpread(t){e.bubbleSpread=t},setNodeWidth(t){e.nodeWidth=t},setShowBubbles(t){e.showBubbles=t},setShowDeletionEdges(t){e.showDeletionEdges=t},setShowGenes(t){e.showGenes=t},setShowReferenceStrip(t){e.showReferenceStrip=t},setTubeMapFold(t){e.tubeMapFold=t},setGeneTrackId(t){e.geneTrackId=t},setRepeatTrackId(t){e.repeatTrackId=t},setRepeatKey(t){e.repeatKey=t},setHighlightedPath(t){e.highlightedPath=t},setPaneHeight(t){e.paneHeight=t},setWalkRowSamples(t){e.walkRowSamples=t},pairWithLinearView(t){let n=e.connectedViewId;n!==void 0&&fe([...(0,A.getSession)(e).views]).some(a=>a.id===n)||(e.connectedViewId=t)},setHoveredNode(t){e.hoveredNode=t},setHoveredBubble(t){e.hoveredBubble=t},setPointerInPane(t){e.pointerInPane=t},setLegendSize(t){e.legendSize=t},setHoveredEdge(t){e.hoveredEdge=t},setSelectedNode(t){e.selectedNode=t},setDraggingNode(t){e.draggingNode=t},setPanning(t){e.isPanning=t},stopDragging(){e.draggingNode=null,e.isPanning=!1},clearInteractionState(){e.hoveredNode=null,e.hoveredBubble=null,e.hoveredEdge=null,e.selectedNode=null,e.draggingNode=null,e.isPanning=!1},showNodeDetails(t){let n=e.nodeById?.get(t),r=e.nodeById,a=e.nodeNeighbors;if(n&&r&&a){let o=(0,A.getSession)(e),i=e.graphRegion,s=i?Ne({nodeId:t,nodeById:r,neighbors:a}):void 0;(0,A.isSessionModelWithWidgets)(o)&&o.showWidget(o.addWidget("BaseFeatureWidget","baseFeature",{featureData:{id:n.id,name:n.name,length:n.length,depth:n.depth,rank:n.stable?.rank,stableName:n.stable?.refName,contributingAssembly:Ie(n)?.sample,contributingHaplotype:Ie(n)?.haplotype,carriedBy:n.samples?.join(", "),...i&&s?{refName:i.refName,assemblyName:i.assemblyName,start:s.start,end:s.end}:{}}}))}},setTransform(t,n,r){let{host:a}=e;e.viewportOwner==="host"&&a?a.horizontalScroll(e.translateX-n):(e.viewportOwner="user",e.scale=he(t),e.translateX=n),e.translateY=r},zoom(t,n,r){let{host:a}=e;if(e.viewportOwner==="host"&&a){a.zoomTo(a.bpPerPx/t,n);return}e.viewportOwner="user";let o=Kr(e,t,n,r,e.pixelRows);e.scale=o.scale,e.translateX=o.translateX,e.translateY=o.translateY},setViewportDirty(){e.viewportRebuildPending=!1,e.viewportDirty++},setPositionsDirty(){e.positionsVersion++},zoomToFit(){if(e.viewportOwner==="host"){let n=e.layoutBounds,r=e.canvasHeight-D*2;n&&r>0&&(e.translateY=ft(n,r,e.scaleY));return}let t=e.fittedTransform;t&&(e.scale=t.scale,e.translateX=t.translateX,e.translateY=t.translateY)},clearPerfMetrics(){e.lastFetchMs=void 0,e.lastLayoutMs=void 0,e.lastGeometryMs=void 0,e.lastGeometryStrokeCount=void 0,e.builtViewport=void 0}})).actions(e=>({hostTransform(t,n){let r=e.viewportOwner!=="host";r&&(e.viewportOwner="host"),e.scale=t,e.translateX=n,r&&e.zoomToFit()},releaseHost(){e.viewportOwner==="host"&&(e.xIsReferenceBp?e.viewportOwner="user":(e.viewportOwner="fit",e.zoomToFit()))}})).actions(e=>{function t(){clearTimeout(e.viewportDirtyTimer),e.viewportRebuildPending=!0,e.viewportDirtyTimer=setTimeout(()=>{(0,f.isAlive)(e)&&e.setViewportDirty()},Ci)}function n(){cancelAnimationFrame(e.positionsDirtyFrame),e.positionsDirtyFrame=requestAnimationFrame(()=>{(0,f.isAlive)(e)&&e.setPositionsDirty()})}return{moveNode(r,a,o){let i=e.layoutResult?.nodePositions;if(i?.[r]){for(let s of i[r])s.x+=a,s.y+=o;n()}},scheduleViewportDirty:t}}).actions(e=>{let t;function n(p){let{rpcManager:g}=(0,A.getSession)(e);return g.call((0,A.getRpcSessionId)(e),"GraphComputeLayout",{...p,signal:t?.signal,statusCallback:w=>{e.setStatusMessage((0,A.statusMessageText)(w)??"")}})}function r(p){return Fr(p,{quality:e.layoutQuality,linearLayout:e.linearLayout,bubbleSpread:e.bubbleSpread})}function*a(p){let g=performance.now(),w=Lo.has(e.chosenLayoutMode),M=e.graphRegion,L=w&&M?Nr(p,M):p,l=w&&e.tubeMapFold>0&&!L.reads?_r(L,e.tubeMapFold):void 0,R=Z(e.chosenLayoutMode).run(l?.graph??L,e.graphRegion,e.host?e.layoutResult?.sampleRows:void 0);if(R)return{result:l&&R.tubeMap?{...R,tubeMap:{...R.tubeMap,coarse:l}}:R,duration:performance.now()-g};let T=Hi(p),N=r(p),v=T.get(N);if(v)return{result:v,duration:performance.now()-g};let B=yield Vr(p,{quality:e.layoutQuality,linearLayout:e.linearLayout,bubbleSpread:e.bubbleSpread},n);return _i(T,N,B.result),B}let o=0;function*i(p){let g=++o,w=()=>e.graph===p&&g===o,M=t?.signal,L;try{L=yield*a(p)}catch(R){if(!w()||M?.aborted)return!1;throw R}let l=w();return l&&(e.layoutResult=L.result,e.setLayoutMs(L.duration)),l}function s(p,g){let w=p.anchorPaths;return p.anchoredBy==="paths"&&w?(Qt(p,e.assemblySpellings(g.assemblyName))??kn(w,g.assemblyName))?.name:void 0}function*u(p,g,w,M=!1,L){let l=t?.signal;e.setStatusMessage("Parsing GFA");let R=Er(p,g,{referencePath:e.referencePath||w?.assemblyName,maxNodes:e.maxGraphNodes}),T=w?s(R,w):void 0,N=!e.referencePath&&T!==void 0&&T!==R.referencePath?rt(R,T):R;if(L){e.setStatusMessage("Reading alignments");try{let{records:B,total:Y}=yield L(N);N.reads=B,e.readsShown={shown:B.length,total:Y}}catch(B){if(l?.aborted)return;console.warn("[GraphGenomeView] no reads for this graph",B),e.readsShown=void 0}if(l?.aborted)return}else e.readsShown=void 0;let v=M?e.selectedNode:null;e.graph=N,e.graphRegion=w,e.loadedReferencePath=T,e.indexBubbles=void 0,e.geneFeatures=void 0,e.repeatArrays=void 0,e.popStack=[],e.clearInteractionState(),v!==null&&e.nodeById?.has(v)&&(e.selectedNode=v),e.setStatusMessage("Computing layout"),yield*i(N)}let d=0;function h(){let p=++d;return t?.abort(),t=new AbortController,e.loadCanceled=!1,{isLive:()=>p===d,signal:t.signal}}function*S(p,g,w){let M=vi(p);if(!(p.type!=="RgfaTabixAdapter"||M===void 0))try{let L=yield(0,A.getSession)(e).rpcManager.call((0,A.getRpcSessionId)(e),"CoreGetFeatures",{adapterConfig:{type:"MinigraphBubbleAdapter",uri:`${M}.bubbles.bed.gz`,baseUri:p.baseUri,assemblyNameToPanSN:p.assemblyNameToPanSN},regions:[g]});w()&&(e.indexBubbles=L.map(l=>({refName:g.refName,start:l.get("start"),end:l.get("end"),segmentCount:l.get("segmentCount"),pathCount:l.get("pathCount")??0,inversion:l.get("inversion"),shortestAlleleLength:l.get("shortestAlleleLength"),longestAlleleLength:l.get("longestAlleleLength"),segments:l.get("segments"),shortestAllele:void 0,longestAllele:void 0})))}catch(L){console.warn("[GraphGenomeView] no bubble index for this graph",L)}}function*m(p,g,w){let M=(0,A.getSession)(e),L=p?M.tracks.find(l=>l.trackId===p):void 0;if(L)try{return yield M.rpcManager.call((0,A.getRpcSessionId)(e),"CoreGetFeatures",{adapterConfig:(0,te.readConfObject)(L,"adapter"),regions:[g]})}catch(l){console.warn(`[GraphGenomeView] no ${w} for this graph`,l);return}}function*c(p,g){let w=yield*m(e.geneTrack?.trackId,p,"genes");w&&g()&&(e.geneFeatures=to(w))}function*y(p,g){let w=yield*m(e.repeatTrack?.trackId,p,"repeats");w&&g()&&(e.repeatArrays=po(w))}function*k(p,g,w){let{isLive:M,signal:L}=h();e.isLoading=!0,e.error=void 0;try{let l=typeof g=="string"?g:yield g(L);M()&&(yield*u(l,p,w))}catch(l){M()&&(console.error("[GraphGenomeView.loadWholeGFA]",l),e.error=l)}finally{M()&&e.finishLoading()}return M()}function b(){t?.abort(),t=void 0,d++,o++}return{clearGraph(){b(),e.graph=void 0,e.graphRegion=void 0,e.loadedReferencePath=void 0,e.layoutResult=void 0,e.indexBubbles=void 0,e.geneFeatures=void 0,e.repeatArrays=void 0,e.popStack=[],e.error=void 0,e.isLoading=!1,e.loadCanceled=!1,e.statusMessage="",e.clearInteractionState(),e.clearPerfMetrics()},stopLoad(){b(),e.isLoading=!1,e.statusMessage="",e.loadCanceled=!0},beforeDestroy(){b()},loadGFA:(0,f.flow)(function*(p,g="Imported GFA"){yield*k(g,p)}),loadGFAFromLocation:(0,f.flow)(function*(p,g){e.setStatusMessage("Fetching GFA");let w=yield*k("uri"in p?p.uri.split("/").pop()??"GFA":"GFA",M=>(0,Po.openLocation)(p).readFile({encoding:"utf8",signal:M}),g);g&&w&&e.graph&&(yield*y(g,()=>e.graphRegion===g))}),cutSubgraph:(0,f.flow)(function*(p,g,w={}){let{isLive:M,signal:L}=h();e.isLoading=!0,e.error=void 0,e.setStatusMessage("Fetching subgraph");try{let l=performance.now(),R=yield(0,A.getSession)(e).rpcManager.call((0,A.getRpcSessionId)(e),"GetSubgraph",{adapterConfig:p,region:g,opts:w,signal:L});if(!M())return;if(e.setFetchMs(performance.now()-l),!R)throw new Error("Adapter returned no GFA \u2014 region may be outside indexed data or the adapter does not implement getSubgraph");if(yield*u(R,ce(g),g,!0,mr(p)?T=>(0,A.getSession)(e).rpcManager.call((0,A.getRpcSessionId)(e),"GetGraphReads",{adapterConfig:p,nodeNames:T.nodes.map(N=>N.name),signal:L}):void 0),!M())return;e.setStatusMessage("Reading annotations"),yield Promise.all([w.tier==="coarse"?void 0:(0,f.flow)(S)(p,g,M),(0,f.flow)(c)(g,M),(0,f.flow)(y)(g,M)])}catch(l){M()&&(console.error("[GraphGenomeView.cutSubgraph]",l),e.error=l)}finally{M()&&e.finishLoading()}}),reloadRepeats:(0,f.flow)(function*(){let p=e.graphRegion,g=e.repeatTrack?.trackId;p&&(yield*y(p,()=>e.graphRegion===p&&e.repeatTrack?.trackId===g))}),reloadGenes:(0,f.flow)(function*(){let p=e.graphRegion,g=e.geneTrack?.trackId;p&&(yield*c(p,()=>e.graphRegion===p&&e.geneTrack?.trackId===g))}),popBubble:(0,f.flow)(function*(p){let g=e.graph;if(!g)return;let w=Tr(g,Le(p));if(w.nodes.length===0){(0,A.getSession)(e).notify("None of the segments of this bubble are in the cut; widen the graph context to open it","info");return}let{isLive:M}=h();e.popStack=[...e.popStack,{graph:g,layoutMode:e.chosenLayoutMode,label:g.name,indexBubbles:e.indexBubbles}],e.indexBubbles=void 0;let L=`${mn[Re(p,e.repeatArrays).kind]} at ${p.refName}:${p.start.toLocaleString()}`;e.graph={...w,name:L},e.clearInteractionState(),e.viewportOwner="fit",e.isLoading=!0;try{(yield*i(e.graph))&&e.finishLoading()}catch(l){M()&&(e.error=l,e.finishLoading())}}),unpopBubble:(0,f.flow)(function*(){let p=e.poppedFrom;if(p){e.popStack=e.popStack.slice(0,-1),e.graph=p.graph,e.layoutMode=p.layoutMode,e.indexBubbles=p.indexBubbles,e.clearInteractionState(),e.viewportOwner="fit",e.isLoading=!0;try{(yield*i(p.graph))&&e.finishLoading()}catch(g){e.error=g,e.finishLoading()}}}),recomputeLayout:(0,f.flow)(function*(){let p=e.graph;if(p){e.isLoading=!0,e.setStatusMessage("Computing layout");try{(yield*i(p))&&e.finishLoading()}catch(g){console.error("[GraphGenomeView.recomputeLayout]",g),e.error=g,e.finishLoading()}}})}}).actions(e=>({startRenderingBackend(t){if(!e.autorunsInstalled){(0,f.addDisposer)(e,(0,C.autorun)(()=>{e.fittedTransform&&(0,C.untracked)(()=>e.viewportOwner==="fit")&&e.zoomToFit()})),(0,f.addDisposer)(e,(0,C.autorun)(()=>{let r=mo((0,A.getSession)(e).hovered);(0,C.untracked)(()=>{let a=e.graphRegion,o=e.graph;a&&o&&!e.pointerInPane&&e.setHoveredNode(r&&go(r,a)?lo({hover:r,nodes:o.nodes}):null)})})),(0,f.addDisposer)(e,(0,C.reaction)(()=>`${e.scale}-${e.translateX}-${e.translateY}`,()=>{e.setHoveredNode(null),e.setHoveredBubble(null),e.setHoveredEdge(null)},{name:"GraphClearHoverOnViewportChange"}));let n=!0;(0,f.addDisposer)(e,(0,C.autorun)(()=>{let{scale:r}=e,a=Nt(e);if(n){n=!1;return}let o=(0,C.untracked)(()=>e.builtViewport);o?.scale===r&&Ur(o.bounds,a)||e.scheduleViewportDirty()})),(0,f.addDisposer)(e,(0,C.autorun)(()=>{let r=e.currentRenderingBackend,a=e.hoveredNode,o=e.hoveredEdge,i=e.selectedNode;if(we(e.geometryVersion),r){let s=new Map;i!==null&&s.set(i,Bi),a!==null&&a!==i&&s.set(a,To),r.setNodeHighlights(s),r.setEdgeHighlight(o,To),e.renderNow()}}))}e.attachRenderingBackend(t,()=>({upload:n=>{n.resize(e.paneWidth,e.canvasHeight);let r=e.nodeById;if(e.layoutResult?.tubeMap)return we(e.viewportDirty),n.uploadGeometry(Fi),e.setGeometryMetrics(0,0,{scale:(0,C.untracked)(()=>e.scale),bounds:(0,C.untracked)(()=>Nt(e))}),!0;if(e.nodePositions&&e.graph&&r){we(e.viewportDirty,e.positionsVersion);let a=performance.now(),o=(0,C.untracked)(()=>Yr(Nt(e),Ei)),i=vn({nodePositions:e.nodePositions,graph:e.graph,nodeById:r,colorScheme:e.effectiveColorScheme,contigThickness:e.contigThickness,connectorThickness:e.connectorThickness,drawPaths:e.effectiveDrawPaths,nodeWidth:e.nodeWidth,highlight:e.walkHighlight,axis:(0,C.untracked)(()=>e.axisScale),linearLayout:e.linearLayout,viewportBounds:o,referenceRamp:e.referenceRamp,deletions:e.deletionEdgeIndexes,hiddenEdges:e.hiddenEdgeIndexes,version:e.positionsVersion});return n.uploadGeometry(i),e.setGeometryMetrics(performance.now()-a,i.nodeStrokes.length,{scale:(0,C.untracked)(()=>e.scale),bounds:o}),!0}return!1},render:n=>{if(!e.nodePositions)return!1;let r=(0,vo.getDpr)();return n.updateTransform({scaleX:e.scaleX*r,scaleY:e.scaleY*r,translateX:e.translateX*r,translateY:e.translateY*r,dpr:r}),n.render(e.darkMode?[.12,.12,.12,1]:[1,1,1,1]),e.markPainted(),!0}}))}})).actions(e=>({switchLayout(t){return e.setLayoutMode(t),e.recomputeLayout()},cancelLoad(){e.canCancelLoad&&(e.stopLoad(),e.graph=void 0)},retryLoad(){},afterAttach(){e.isDefaultViewport||(e.viewportOwner="user")}})).actions(e=>({showInLinearView(t){let n=(0,A.getSession)(e),r=t.assembly===e.graphRegion?.assemblyName,a=wo({session:n,location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId,tracks:ko({session:n,assemblyName:t.assembly,first:r?e.sourceTrackId:void 0})});r&&e.pairWithLinearView(a)},highlightInLinearView(t){xo({session:(0,A.getSession)(e),location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId})},showSyntenyView(t){So({session:(0,A.getSession)(e),contributors:e.launchableAssemblies,trackId:t,graphTrackId:e.sourceTrackId})}})).views(e=>({get syntenyLaunchTracks(){let t=e.launchableAssemblies.map(n=>n.sample);return t.length>=2?Ro((0,A.getSession)(e),t):[]}})).views(e=>({graphMenuItems(){let t=e.walkChoices;return[{label:"Layout",subMenu:Tn.map(n=>({type:"radio",label:n.label,checked:e.chosenLayoutMode===n.value,disabled:e.graph?!n.available(e.graph):!1,onClick:()=>{e.switchLayout(n.value)}}))},{label:"Color",subMenu:ln.map(n=>({type:"radio",label:n.label,checked:e.chosenColorScheme===n.value,onClick:()=>{e.setColorScheme(n.value)}}))},...t.length>0?[{label:"Walk",subMenu:[{type:"radio",label:"None",checked:e.highlightedPath==="",onClick:()=>{e.setHighlightedPath("")}},...t.map(n=>({type:"radio",label:n.label,checked:e.highlightedPath===n.name,onClick:()=>{e.setHighlightedPath(n.name)}}))]}]:[],...Lo.has(e.chosenLayoutMode)?[{label:"Fold variants",subMenu:Ii.map(({bp:n,label:r})=>({type:"radio",label:r,checked:e.tubeMapFold===n,disabled:n>0&&e.graph?.reads!==void 0,onClick:()=>{e.setTubeMapFold(n),e.recomputeLayout()}}))}]:[],...e.chosenLayoutMode==="walkrows"&&e.repeatChoices.length>0?[{label:"Repeat",subMenu:[{type:"radio",label:"Whole window",checked:e.repeatKey==="",onClick:()=>{e.setRepeatKey("")}},...e.repeatChoices.map(({key:n,name:r,unit:a})=>({type:"radio",label:`${r} \xB7 ${a.toLocaleString()} bp unit`,checked:e.repeatKey===n,onClick:()=>{e.setRepeatKey(n)}}))]}]:[],...e.hostPlacesX?[]:[{label:"Zoom in",onClick:()=>{e.zoom(1.5,e.paneWidth/2,e.canvasHeight/2)}},{label:"Zoom out",onClick:()=>{e.zoom(1/1.5,e.paneWidth/2,e.canvasHeight/2)}},{label:"Zoom to fit",onClick:()=>{e.zoomToFit()}}],{type:"checkbox",label:"Mark bubbles",checked:e.showBubbles,onClick:()=>{e.setShowBubbles(!e.showBubbles)}},{type:"checkbox",label:"Show deletion edges",checked:e.showDeletionEdges,onClick:()=>{e.setShowDeletionEdges(!e.showDeletionEdges)}},{type:"checkbox",label:"Genes on the backbone",checked:e.showGenes,onClick:()=>{e.setShowGenes(!e.showGenes)}},...e.referenceStripApplies?[{type:"checkbox",label:"Reference strip at bp",checked:e.showReferenceStrip,onClick:()=>{e.setShowReferenceStrip(!e.showReferenceStrip)}}]:[]]},launchMenuItems(){let t=[];for(let n of er({contributors:e.launchableAssemblies,syntenyTracks:e.syntenyLaunchTracks,onShowLinear:r=>{e.showInLinearView(r)},onShowSynteny:r=>{e.showSyntenyView(r)}}))(0,No.pushLaunchViewMenuItem)(t,n);return t}}))}var Pt=x(_(),1);function Bo(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}function Co(e){let t=(0,Pt.readConfObject)(e,"assemblyNames"),n=Bo(t)?t.slice(1):[];return n.length>0?n:void 0}function Ue(e){let t=(0,Pt.readConfObject)(e,"assemblyNames");return Bo(t)?t[0]:void 0}function Ke(e,t){return e===void 0||e===t?void 0:`The graph is cut on its reference, ${e}: open it from a view of ${e}`}function It(){return E.types.compose("GraphGenomeView",Fo.BaseViewModel,Ye(),E.types.model({type:E.types.literal("GraphGenomeView"),gfaLocation:E.types.maybe(E.types.frozen()),loadedRegion:E.types.maybe(E.types.frozen()),loadedTrackId:E.types.optional(E.types.string,""),subgraphContext:E.types.optional(E.types.number,1),subgraphHaplotypes:E.types.maybe(E.types.frozen()),maxRegionBp:E.types.optional(E.types.number,Xe)})).views(e=>({get rpcSessionId(){return e.id},get paneWidth(){return e.width},get sourceTrack(){return e.loadedTrackId?(0,Vo.getSession)(e).tracks.find(t=>t.trackId===e.loadedTrackId):void 0},get canRetryLoad(){return e.gfaLocation!==void 0||e.loadedTrackId!==""&&e.loadedRegion!==void 0}})).views(e=>({get hasPendingSource(){return e.canRetryLoad&&!e.graph&&!e.loadCanceled},menuItems(){return e.launchMenuItems()}})).actions(e=>{let t=e.clearGraph;return{clearGraph(){t(),e.gfaLocation=void 0,e.loadedRegion=void 0,e.loadedTrackId=""},load(){let n=e.loadedRegion;if(e.gfaLocation)return e.loadGFAFromLocation(e.gfaLocation,n);if(!e.loadedTrackId||!n)return;let r=e.sourceTrack,a=n.end-n.start,o=r?Ke(Ue(r),n.assemblyName):void 0;if(!r)e.setError(new Error(`The track this graph was cut from, "${e.loadedTrackId}", is not in this session`));else if(o)e.setError(new Error(o));else if(a>e.maxRegionBp)e.setError(new Error(`Region too large (${ne(a)}) \u2014 zoom in to view graph (max ${ne(e.maxRegionBp)})`));else return e.cutSubgraph((0,Eo.readConfObject)(r,"adapter"),n,{hops:e.subgraphContext,haplotypes:e.subgraphHaplotypes})}}}).actions(e=>({retryLoad(){e.load()},afterAttach(){e.graph||e.load()}}))}var ji=(0,Oo.defineLaunchKeys)()({});function vt(e){e.addViewType(()=>new Ho.default({name:"GraphGenomeView",displayName:"Graph genome view",stateModel:It(),launchKeys:ji,ReactComponent:(0,Do.lazy)(()=>import("./chunks/GraphGenomeView-37F7MLFQ.js"))}))}var _o=x(_(),1),re=x(J(),1),$i=["MultiWaySyntenyDisplay","LinearSyntenyDisplay","DotplotDisplay","ChordSyntenyDisplay"];function Wi(e){let t=e.getElementTypesInGroup("display"),n=a=>t.find(o=>o.name===a),r=a=>a&&Object.assign(Object.create(a),{adapterCapabilities:["headerLanes"]});return[n("LinearGraphDisplay"),n("LinearBasicDisplay"),...$i.map(a=>r(n(a)))].filter(a=>a!==void 0)}function Bt(e){e.addTrackType(()=>{let t=(0,_o.ConfigurationSchema)("GraphTrack",{},{baseConfiguration:(0,re.createBaseTrackConfig)(e),explicitIdentifier:"trackId"}),n=new re.TrackType({name:"GraphTrack",displayName:"Pangenome graph track",configSchema:t,stateModel:(0,re.createBaseTrackModel)(e,"GraphTrack",t)});for(let r of Wi(e))n.addDisplayType(r);return n})}function Ct(e){e.addToExtensionPoint("LaunchView-GraphGenomeView",t=>{let{session:n,...r}=t;return n.addView("GraphGenomeView",r),t})}var oa=x(ke(),1),aa=x($o(),1);var Xo=x(_(),1),Yo=x(zo(),1),Et=x(z(),1);function Uo(){return(0,Xo.ConfigurationSchema)("LinearGraphDisplay",{layoutMode:{type:"stringEnum",model:Et.types.enumeration("LayoutMode",Pe),defaultValue:"auto"},colorScheme:{type:"stringEnum",model:Et.types.enumeration("ColorScheme",Te),defaultValue:"auto"},...(0,Yo.trackHeightConfigSchemaFields)({defaultHeight:300,height:"the height of the track the graph is drawn in"})},{explicitlyTyped:!0,explicitIdentifier:"displayId"})}var Qo=x(ke(),1);var xe=x(_(),1),ea=x(J(),1),ta=x(an(),1),Ft=x(se(),1),na=x(qo(),1),I=x(z(),1),Ze=x(Jo(),1);var qe=x(on(),1);var zi=(0,Qo.lazy)(()=>import("./chunks/GraphTrackSettingsDialog-2QV6TPX7.js"));function ra(e){return I.types.compose("LinearGraphDisplay",ea.BaseDisplay,(0,na.default)(),Ye(),I.types.model({type:I.types.literal("LinearGraphDisplay"),configuration:(0,xe.ConfigurationReference)(e),pane:I.types.maybe(I.types.frozen()),cutRegion:I.types.maybe(I.types.frozen()),coarseCut:I.types.optional(I.types.boolean,!1),maxRegionBp:I.types.optional(I.types.number,Xe),subgraphContext:I.types.optional(I.types.number,1),subgraphHaplotypes:I.types.maybe(I.types.frozen())})).preProcessSnapshot(t=>{let{pane:n,...r}=t;if(!n)return t;let{type:a,...o}=n;return{...o,...r}}).volatile(()=>({recuts:0,settledWindow:void 0})).views(t=>({get defaultLayoutMode(){return(0,xe.getConf)(t,"layoutMode")},get defaultColorScheme(){return(0,xe.getConf)(t,"colorScheme")},get canvasHeight(){return t.height},get canRetryLoad(){return t.cutRegion!==void 0},get chosenHaplotypes(){return t.subgraphHaplotypes??Co(t.parentTrack.configuration)},get coarseAboveBpPerPx(){let r=t.adapterConfig.coarse?.aboveBpPerPx;return typeof r=="number"?r:void 0}})).views(t=>({tierAt(n){let r=t.coarseAboveBpPerPx;return r!==void 0&&n>r?"coarse":"fine"},capFor(n){return n==="coarse"?1/0:t.maxRegionBp},get cutTier(){return t.coarseCut&&t.coarseAboveBpPerPx!==void 0?"coarse":"fine"}})).views(t=>({get settledCapBp(){let n=t.settledWindow;return n?t.capFor(t.tierAt(n.bpPerPx)):1/0}})).views(t=>({get regionTooLarge(){let n=t.settledWindow;return n!==void 0&&n.end-n.start>t.settledCapBp},get regionTooLargeReason(){let n=t.settledWindow;return n?`Region too large for a graph cut (${ne(n.end-n.start)}, max ${ne(t.settledCapBp)})`:""},get zoomCanReleaseGate(){return!0},get fetchCanceled(){return t.loadCanceled}})).views(t=>({get displayPhase(){return(0,Ze.computeDisplayStatusPhase)({regionTooLarge:t.regionTooLarge,error:t.error??t.renderError},()=>(0,Ze.computeActivityPhase)({isMinimized:t.isMinimized,fetchInert:!1,viewportEmpty:t.host?.initialized===!0&&t.host.hasVisibleContent===!1,isLoading:t.isLoading||!t.hasGraph,fetchCanceled:t.loadCanceled,awaitingDependentData:!1,rendersCanvas:!0,canvasDrawn:t.painted&&t.geometryPainted},()=>!0,()=>t.host?.effectiveBodyMounted??!0))}})).actions(t=>({setSubgraphContext(n){t.subgraphContext=n},setSubgraphHaplotypes(n){t.subgraphHaplotypes=n},setMaxRegionBp(n){t.maxRegionBp=n},cut(){let n=t.cutRegion;if(!n)return;let r=Ke(Ue(t.parentTrack.configuration),n.assemblyName);if(r){t.clearGraph(),t.setError(new Error(r));return}let a=t.cutTier==="coarse";return t.cutSubgraph(t.adapterConfig,n,{hops:a?0:t.subgraphContext,haplotypes:t.chosenHaplotypes,tier:a?"coarse":void 0})}})).actions(t=>({recutAt(n){let r=t.tierAt(n.bpPerPx);return t.coarseCut=r==="coarse",t.cutRegion=xt(n,t.capFor(r),Z(t.chosenLayoutMode).cutMargins),t.recuts++,t.cut()}})).actions(t=>({settleOn(n){t.settledWindow=n;let r=Z(t.chosenLayoutMode).cutMargins;return t.regionTooLarge||!t.loadCanceled&&t.tierAt(n.bpPerPx)===t.cutTier&&oo(t.cutRegion,n,r)?!1:(t.recutAt(n),!0)},switchLayout(n){let r=Z(t.chosenLayoutMode).cutMargins;t.setLayoutMode(n);let a=t.host?He(t.host):void 0;return a&&!t.regionTooLarge&&Z(n).cutMargins!==r?t.recutAt(a):t.recomputeLayout()},retryLoad(){t.cut()},reload(){t.cut()},cancelFetchByUser(){t.stopLoad()}})).actions(t=>({forceLoad(){let n=t.settledWindow;n&&(t.setMaxRegionBp(Math.ceil(n.end-n.start)),t.settleOn(n))},afterAttach(){t.cutRegion&&!t.graph&&t.cut(),(0,I.addDisposer)(t,(0,qe.reaction)(()=>t.hostPlacesX,n=>{n||t.releaseHost()},{name:"GraphHostPlacesX"})),(0,I.addDisposer)(t,(0,qe.reaction)(()=>t.hostFrame,n=>{n&&t.hostTransform(n.scale,n.translateX)},{equals:(n,r)=>n?.scale===r?.scale&&n?.translateX===r?.translateX,fireImmediately:!0,name:"GraphHostFrame"})),(0,I.addDisposer)(t,(0,qe.reaction)(()=>t.host?.coarseDynamicBlocks,n=>{let{host:r}=t,a=n&&r?He(r):void 0;a&&t.settleOn(a)},{fireImmediately:!0,name:"GraphHostSettle"}))}})).views(t=>({get graphViewSpec(){let n=t.host?He(t.host):void 0,r=t.sourceTrackId;if(!n||!r||!t.hasGraph||t.coarseCut||t.regionTooLarge)return;let a=Math.floor(n.start),o=Math.ceil(n.end);return{loadedTrackId:r,loadedRegion:{refName:n.refName,assemblyName:n.assemblyName,start:a,end:o},subgraphContext:t.subgraphContext,subgraphHaplotypes:t.chosenHaplotypes,maxRegionBp:Math.max(t.maxRegionBp,o-a),layoutMode:t.chosenLayoutMode,colorScheme:t.chosenColorScheme,referencePath:t.referencePath,geneTrackId:t.geneTrackId,showGenes:t.showGenes,showBubbles:t.showBubbles,showDeletionEdges:t.showDeletionEdges}}})).actions(t=>({openGraphView(){let n=t.graphViewSpec;n&&(0,Ft.getSession)(t).addView("GraphGenomeView",n)}})).views(t=>({trackMenuItems(){let n=t.launchMenuItems();return(0,ta.pushLaunchViewMenuItem)(n,{label:"Graph genome view",icon:Ce,disabled:!t.graphViewSpec,disabledHelpText:"Zoom in until the track cuts a graph",onClick:()=>{t.openGraphView()}}),[...t.graphMenuItems(),{label:"Settings",icon:tr,onClick:()=>{(0,Ft.getSession)(t).queueDialog(r=>[zi,{model:t,open:!0,onClose:r}])}},...n]}}))}function Vt(e){e.addDisplayType(()=>{let t=Uo();return Object.assign(new aa.default({name:"LinearGraphDisplay",displayName:"Graph",configSchema:t,stateModel:ra(t),trackType:["GraphTrack","FeatureTrack","SyntenyTrack"],viewType:"LinearGenomeView",ReactComponent:(0,oa.lazy)(()=>import("./chunks/LinearGraphDisplay-CJHA56RB.js"))}),{adapterCapabilities:["getSubgraph"]})})}var da=x(Ee(),1);var Dt=x(_(),1),ia=x(z(),1);function Ht(e){let{uri:t,baseUri:n,csi:r}=e;return typeof t=="string"?{...e,bubblesLocation:{uri:t,baseUri:n},index:{indexType:r?"CSI":"TBI",location:{uri:`${t}.${r?"csi":"tbi"}`,baseUri:n}}}:e}var Xi=(0,Dt.ConfigurationSchema)("MinigraphBubbleAdapter",{bubblesLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.bb.bed.gz",locationType:"UriLocation"}},index:(0,Dt.ConfigurationSchema)("MinigraphBubbleIndex",{indexType:{model:ia.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.bb.bed.gz.tbi",locationType:"UriLocation"}}}),assemblyNameToPanSN:{type:"frozen",defaultValue:{}}},{explicitlyTyped:!0,preProcessSnapshot:Ht}),sa=Xi;function Ot(e){e.addAdapterType(()=>new da.default({name:"MinigraphBubbleAdapter",displayName:"Minigraph bubble BED adapter",normalizeSnapshot:Ht,configSchema:sa,adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/MinigraphBubbleAdapter-NRDD66AK.js").then(t=>t.default)}))}var ga=x(Ee(),1);var Qe=x(_(),1),pa=x(z(),1);function ca(e,t,n){return{indexType:n?"CSI":"TBI",location:{uri:`${e}.${n?"csi":"tbi"}`,baseUri:t}}}function ua(e){let{uri:t,baseUri:n,csi:r}=e;return typeof t=="string"?{...e,segmentsLocation:{uri:`${t}.segs.bed.gz`,baseUri:n},segmentsIndex:ca(`${t}.segs.bed.gz`,n,r),linksLocation:{uri:`${t}.links.bed.gz`,baseUri:n},linksIndex:ca(`${t}.links.bed.gz`,n,r)}:e}function _t(e){let{coarse:t,baseUri:n}=e;return ua(typeof t=="object"&&t!==null?{...e,coarse:ua({baseUri:n,...t})}:e)}var Je=(e,t)=>(0,Qe.ConfigurationSchema)(e,{indexType:{model:pa.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:t,locationType:"UriLocation"}}}),Yi=(0,Qe.ConfigurationSchema)("RgfaTabixCoarseTier",{aboveBpPerPx:{type:"maybeNumber"},segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.tier.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:Je("RgfaCoarseSegmentsIndex","/path/to/graph.tier.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.tier.links.bed.gz",locationType:"UriLocation"}},linksIndex:Je("RgfaCoarseLinksIndex","/path/to/graph.tier.links.bed.gz.tbi")}),Ui=(0,Qe.ConfigurationSchema)("RgfaTabixAdapter",{segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:Je("RgfaSegmentsIndex","/path/to/graph.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.links.bed.gz",locationType:"UriLocation"}},linksIndex:Je("RgfaLinksIndex","/path/to/graph.links.bed.gz.tbi"),assemblyNameToPanSN:{type:"frozen",defaultValue:{}},coarse:Yi},{explicitlyTyped:!0,preProcessSnapshot:_t}),ma=Ui;function jt(e){e.addAdapterType(()=>new ga.default({name:"RgfaTabixAdapter",displayName:"Indexed rGFA adapter",normalizeSnapshot:_t,configSchema:ma,adapterCapabilities:["getSubgraph"],adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/RgfaTabixAdapter-NQEERXXI.js").then(t=>t.default)}))}var Ki=new Set(["RgfaTabixAdapter","GbzBaseSyntenyAdapter"]);function qi(e){return"uri"in e?tn(e.uri).name:"localPath"in e?e.localPath:e.name}function Zi(e){return qi(e).toLowerCase().endsWith(".gbz.db")}function Ji(e){let t=e.adapter;return t?.type==="GbzBaseSyntenyAdapter"&&!t.assemblyNames?.length&&Array.isArray(e.assemblyNames)&&e.assemblyNames.length>0?{...e,adapter:{...t,assemblyNames:e.assemblyNames}}:e}function Qi(e,t,n){if((!n||n==="GbzBaseSyntenyAdapter")&&Zi(e))return{type:"GbzBaseSyntenyAdapter",gbzDbLocation:e,...t?{haplotypeIndexLocation:t}:{}};if((!n||n==="RgfaTabixAdapter")&&nn(e))return rn({choice:"RgfaTabixAdapter",loc:e,indexLoc:t,assembly:"",sample:""})}function $t(e){e.addToExtensionPoint("Core-preProcessTrackConfig",Ji),e.addToExtensionPoint("Core-guessAdapterForLocation",t=>(n,r,a)=>Qi(n,r,a)??t(n,r,a)),e.addToExtensionPoint("Core-guessTrackTypeForLocation",t=>(n,r)=>Ki.has(n)?"GraphTrack":t(n,r))}var fa=x(se(),1),ya=x(Na(),1),Wt=x(Aa(),1),wa=x(Ia(),1);function oe(e){return typeof e=="object"&&e!==null}function la(e){let t;if(oe(e)){let{refName:n,start:r,end:a,assemblyName:o}=e;typeof n=="string"&&typeof r=="number"&&typeof a=="number"&&(t={refName:n,start:r,end:a,assemblyName:typeof o=="string"?o:void 0})}return t}function es(e,t,n){let r=e.connectedViewId;return r===void 0||r===t||!n.has(r)}function ha(e,t){return e.assemblyName===void 0||t===void 0||t.includes(e.assemblyName)}function ts(e){return(Array.isArray(e.tracks)?e.tracks:[]).flatMap(n=>oe(n)&&Array.isArray(n.displays)?n.displays.filter(r=>oe(r)&&r.type==="LinearGraphDisplay"):[])}function ba(e,t,n){let r=[],a=new Set(fe(e).map(o=>oe(o)?o.id:void 0));for(let o of e){if(oe(o)&&o.id===t)for(let i of ts(o)){let s=la(i.hoverHighlight);s&&ha(s,n)&&r.push({key:typeof i.id=="string"?i.id:"graph-track",region:s})}if(oe(o)&&o.type==="GraphGenomeView"&&es(o,t,a)){let i=la(o.hoverHighlight);i&&ha(i,n)&&r.push({key:typeof o.id=="string"?o.id:"graph",region:i})}}return r}var ae=x(de(),1),ns=(0,wa.makeStyles)()(e=>({highlight:{height:"100%",position:"absolute",background:(0,ya.alpha)(e.palette.primary.main,.25),borderLeft:`2px solid ${e.palette.primary.main}`,borderRight:`2px solid ${e.palette.primary.main}`,pointerEvents:"none",zIndex:10}})),rs=(0,Wt.observer)(function({model:t,region:n}){let{classes:r}=ns(),a=t.getHighlightCoords(n);return a?(0,ae.jsx)("div",{"data-testid":"graph-node-highlight",className:r.highlight,style:{left:a.left,width:a.width}}):null}),os=(0,Wt.observer)(function({model:t}){let{views:n}=(0,fa.getSession)(t);return(0,ae.jsx)(ae.Fragment,{children:ba([...n],t.id,t.assemblyNames).map(({key:r,region:a})=>(0,ae.jsx)(rs,{model:t,region:a},`graph-hover-${r}`))})}),xa=os;var Sa=x(de(),1),as="LinearGenomeView-TracksContainerComponent";function zt(e){e.contributeToExtensionPoint(as,({model:t})=>(0,Sa.jsx)(xa,{model:t},"graphgenomeview-hover-highlight"))}var ka="GraphGenomeView";var Ma="4.0.19";var Xt=class extends Ra.default{constructor(){super(...arguments);this.name=ka;this.version=Ma}install(n){vt(n),Vt(n),Bt(n),Ct(n),zt(n),jt(n),Ot(n),ct(n),pt(n),$t(n),n.addRpcMethod(()=>new me(n)),n.addRpcMethod(()=>new pe(n)),n.addRpcMethod(()=>new ue(n))}configure(n){try{(0,La.isAbstractMenuManager)(n.rootModel)&&n.rootModel.appendToSubMenu(["Add"],{label:"Graph genome view",icon:Ce,onClick:r=>{r.addView("GraphGenomeView",{})}})}catch(r){console.warn("[GraphGenomeView] could not add the Add menu entry",r)}}};export{Xt as default};
1
+ import{b as Qt,c as en,d as tn,e as nn}from"./chunks/chunk-QSH263Y6.js";import{a as Ca}from"./chunks/chunk-KWAXLUPQ.js";import{a as Ba,d as rn,g as on,h as an}from"./chunks/chunk-XK7OPCRQ.js";import{a as se}from"./chunks/chunk-J4OLMLS5.js";import{$ as jn,A as Gn,Aa as ve,B as Tn,Ba as ce,C as An,Ca as ir,D as it,E as Nn,Ea as sr,I as Pn,N as st,O as Cn,P as Bn,Q as En,R as Fn,S as Vn,T as Dn,V as Hn,W as On,Z as Wn,_ as _n,a as Kt,b as sn,ba as $n,d as Me,e as Re,ea as zn,f as cn,g as ln,ga as Xn,ha as Yn,ia as Un,j as gn,ja as Kn,k as ot,ka as qn,l as hn,m as bn,ma as Zn,n as Le,na as Jn,o as fn,oa as Qn,p as _,pa as er,q as Sn,qa as tr,r as Te,ra as dt,t as Mn,u as Ae,ua as Va,v as Ne,va as nr,wa as Ie,xa as rr,ya as or,za as ar}from"./chunks/chunk-3FGJLRG2.js";import{b as kn,d as xn}from"./chunks/chunk-UQEPPJEO.js";import"./chunks/chunk-SCMIJAAX.js";import{a as X}from"./chunks/chunk-FCWXYIFC.js";import{A as vn,B as Da,a as W,b as un,c as pn,d as tt,e as mn,k as nt,n as rt,o as Ge,p as at,r as yn,s as wn,t as Rn,u as Pe,v as Ln,x as In}from"./chunks/chunk-VIFXYTIS.js";import{b as P,d as qt,f as Zt,g as Jt}from"./chunks/chunk-EFVAQ2KM.js";import"./chunks/chunk-KULNKXPT.js";import{a as de,b as Ea,c as Fa,d as dn,e as Se}from"./chunks/chunk-XEJ47DLD.js";import{a as O,b as S}from"./chunks/chunk-FY3BTKY4.js";var cr=O((hs,dr)=>{dr.exports=JBrowseExports["@jbrowse/core/Plugin"]});var Ee=O((ys,ur)=>{ur.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/AdapterType"]});var j=O((ws,pr)=>{pr.exports=JBrowseExports["@jbrowse/core/configuration"]});var mt=O((Ms,gr)=>{gr.exports=JBrowseExports["@jbrowse/core/data_adapters/dataAdapterCache"]});var J=O((Rs,hr)=>{hr.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes"]});var Gr=O((Is,Lr)=>{Lr.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/ViewType"]});var Ar=O((vs,Tr)=>{Tr.exports=JBrowseExports["@jbrowse/core/util/withLaunchInput"]});var Pr=O((Cs,Nr)=>{Nr.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/models"]});var ao=O((Id,oo)=>{oo.exports=JBrowseExports["@jbrowse/render-core/RenderLifecycleMixin"]});var qo=O((Uc,Ko)=>{Ko.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/DisplayType"]});var Jo=O((Kc,Zo)=>{Zo.exports=JBrowseExports["@jbrowse/display-kit/trackHeightConfigSchemaFields"]});var ra=O((Qc,na)=>{na.exports=JBrowseExports["@jbrowse/display-kit/TrackHeightMixin"]});var aa=O((eu,oa)=>{oa.exports=JBrowseExports["@jbrowse/render-core/displayPhase"]});var Ia=S(cr(),1),va=S(se(),1);var Ce=S(de(),1),Be=(0,Kt.createSvgIcon)([(0,Ce.jsx)("circle",{cx:"7.2",cy:"14.4",r:"3.2"},"0"),(0,Ce.jsx)("circle",{cx:"14.8",cy:"18",r:"2"},"1"),(0,Ce.jsx)("circle",{cx:"15.2",cy:"8.8",r:"4.8"},"2")],"BubbleChart");var lr=S(Ee(),1);var ct=S(j(),1),ut=S(X(),1),Ha=(0,ct.ConfigurationSchema)("GbzBaseSyntenyAdapter",{assemblyNames:{type:"stringArray",defaultValue:[]},gbzDbLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.gbz.db",locationType:"UriLocation"}},haplotypeIndexLocation:{type:"fileLocation",defaultValue:{uri:"",locationType:"UriLocation"}},readsLocation:{type:"fileLocation",defaultValue:{uri:"",locationType:"UriLocation"}},readsIndex:(0,ct.ConfigurationSchema)("GbzBaseReadsIndex",{indexType:{model:ut.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:"",locationType:"UriLocation"}}}),subgraphSnarls:{type:"stringEnum",model:ut.types.enumeration("SnarlOutput",["none","contained","overlapping"]),defaultValue:"contained"},referenceSample:{type:"string",defaultValue:""},assemblyNameToPanSN:{type:"frozen",defaultValue:{}},context:{type:"number",defaultValue:1e3,advanced:!0},nodeLimit:{type:"number",defaultValue:1e5,advanced:!0}},{explicitlyTyped:!0,preProcessSnapshot:e=>{let{uri:t,baseUri:n,reads:r}=e;return{...e,...t?{gbzDbLocation:{uri:t,baseUri:n}}:{},...typeof r=="string"?{readsLocation:{uri:r,baseUri:n},...r.endsWith(".gz")?{readsIndex:{location:{uri:`${r}.tbi`,baseUri:n}}}:{}}:{}}}}),mr=Ha;function pt(e){e.addAdapterType(()=>new lr.default({name:"GbzBaseSyntenyAdapter",displayName:"gbz-base pangenome adapter",configSchema:mr,adapterCapabilities:["getSubgraph","headerLanes","lanePairsOnAnchor"],adapterMetadata:{category:"Synteny adapters"},getAdapterClass:()=>import("./chunks/GbzBaseSyntenyAdapter-7ZKFAEJG.js").then(t=>t.default)}))}var br=S(mt(),1),fr=S(J(),1);function Oa(e){return"getReads"in e&&typeof e.getReads=="function"}var Wa=e=>typeof e=="object"&&e!==null&&Object.entries(e).some(([t,n])=>["uri","localPath","blobId"].includes(t)&&typeof n=="string"&&n!=="");function yr(e){return typeof e.reads=="string"&&e.reads!==""||Wa(e.readsLocation)}var ue=class extends fr.RpcMethodType{constructor(){super(...arguments);this.name="GetGraphReads"}async execute(n){let{adapterConfig:r,nodeNames:a,sessionId:o,signal:i}=n,{dataAdapter:s}=await(0,br.getAdapter)(this.pluginManager,o,r);return Oa(s)?s.getReads(a,{signal:i}):{records:[],total:0}}};var wr=S(mt(),1),kr=S(J(),1);function _a(e){return"getSubgraph"in e&&typeof e.getSubgraph=="function"}var pe=class extends kr.RpcMethodTypeWithRenameRegion{constructor(){super(...arguments);this.name="GetSubgraph"}async execute(n){let{adapterConfig:r,region:a,sessionId:o,opts:i,signal:s}=n,{dataAdapter:u}=await(0,wr.getAdapter)(this.pluginManager,o,r);return _a(u)?u.getSubgraph(a,{...i,signal:s}):(console.warn(`[GetSubgraph] ${u.constructor.name} does not implement getSubgraph`),"")}};var xr=S(Se(),1),Sr=S(J(),1),Mr=S(X(),1),ja=(0,xr.lazy)(()=>import("./chunks/AddTrackWorkflow-WYRVQYH2.js"));function lt(e){e.addAddTrackWorkflowType(()=>new Sr.AddTrackWorkflowType({name:"Pangenome graph track",displayName:"Add pangenome graph track",ReactComponent:ja,stateModel:Mr.types.model({})}))}var gt;function ht(){return gt??=import("./chunks/bandage-layout-UCRW4G4J.js").then(e=>e.default()).catch(e=>{throw gt=void 0,e}),gt}var Rr=S(J(),1),me=class extends Rr.RpcMethodType{constructor(){super(...arguments);this.name="GraphComputeLayout"}async execute(n){let{graph:r,options:a,statusCallback:o}=n;o?.("Loading layout engine");let i=await ht();o?.("Computing layout");let s=performance.now(),u=i.computeLayout(r,a),d=performance.now()-s;return{result:u,duration:d}}};var zo=S(Se(),1),Xo=S(Gr(),1),Yo=S(Ar(),1);var _o=S(j(),1),jo=S(Pr(),1),$o=S(se(),1),E=S(X(),1);var $a=.9,bt=2,za=1e3;function Ir(e,t,n,r=o=>o,a=[]){let o=new Map(e.nodes.map(s=>[s.name,s])),i=[];for(let s of t){let u=[],d=1/0,f=-1/0,g=1/0,p=[],c=[];for(let l of Ae(s)){let x=o.get(l),M=x&&n[x.id];if(!(!x||!M?.length)){if(P(x)&&(x.stable.start<s.start||x.stable.start>=s.end)){c.push(M[Math.floor(M.length/2)]);continue}p.push(x.id),u.push(Ne(M.length===1?[M[0],M[0]]:M));for(let L of M)d=Math.min(d,L.x),f=Math.max(f,L.x),g=Math.min(g,L.y)}}if(p.length===0)continue;let y={x:(d+f)/2,y:g},k=c.length?{x:c.reduce((l,x)=>l+x.x,0)/c.length,y:c.reduce((l,x)=>l+x.y,0)/c.length}:y,b=new Map;for(let l of s.routes??[])for(let x of new Set(l.steps))b.set(x,(b.get(x)??0)+1);let m=[];for(let l of s.routes??[]){if(s.longestAlleleLength<za)break;if(l.steps.length===0)continue;let x=Math.min(...l.steps.map(h=>b.get(h))),M,L=-1;for(let h of l.steps)if(b.get(h)===x)for(let R of n[h]??[]){let T=Math.hypot(R.x-k.x,R.y-k.y);T>L&&(L=T,M=R)}M&&m.push({route:l,at:M,text:Xa(l,r)})}i.push({bubble:s,...Te(s,a),path:u.join(""),labelAt:y,members:p.length,nodeIds:p,whole:p.length>=$a*e.nodes.length,routes:m})}return i}function Xa(e,t){let n=[...new Set(e.walks.map(t))].sort(),r=n.slice(0,bt).join(", "),a=n.length>bt?` +${n.length-bt}`:"";return`${r}${a} \xB7 ${Sn(e.bp)}`}function vr(e){if(!e.nodes.some(P))return[];let t=new Map(e.nodes.map(p=>[p.id,p])),n=cn(e),r=new Map(n.map((p,c)=>[p,c])),a=new Int32Array(n.length+1),o=new Map,i=new Set;for(let p of e.edges){let c=r.get(p.from),y=r.get(p.to);if(c===void 0||y===void 0||c===y)continue;i.add(`${p.from}>${p.to}`).add(`${p.to}>${p.from}`);let[k,b]=c<y?[c,y]:[y,c];a[k+1]++,a[b]--;let[m,l]=c<y?[p.from,p.to]:[p.to,p.from];(o.get(m)??o.set(m,new Set).get(m)).add(l)}for(let p=1;p<a.length;p++)a[p]+=a[p-1];let s=e.nodes.filter(P).sort((p,c)=>p.stable.start-c.stable.start),u=new Set([s[0].id,s.at(-1).id]),d=s.map(p=>[p,r.get(p.id)]).filter(([p,c])=>u.has(p.id)||a[c]===0).sort(([p,c],[y,k])=>c-k||p.stable.start-y.stable.start),f=e.paths?.map(p=>{let c=new Map;return p.nodeIds.forEach((y,k)=>{c.has(y)||c.set(y,k)}),c}),g=[];for(let p=0;p+1<d.length;p++){let[c,y]=d[p],[k,b]=d[p+1],m=n.slice(y+1,b);if(m.length===0)continue;let l=new Map([[c.id,{min:0,max:0,n:1}]]);for(let H of[c.id,...m]){let K=l.get(H);if(K)for(let q of o.get(H)??[]){if(r.get(q)>b)continue;let G=q===k.id?0:t.get(q).length,F=l.get(q);l.set(q,{min:Math.min(F?.min??1/0,K.min+G),max:Math.max(F?.max??-1/0,K.max+G),n:Math.min(xn,K.n+(F?.n??0))})}}let x=f&&Ya(e,t,f,c.id,k.id),M=x?.n?x:void 0,L=M??l.get(k.id)??{min:0,max:0,n:0},h=x!==void 0&&x.left>0,R=c.stable.start+c.length,T=k.stable.start,N=[c.id,...m.filter(H=>P(t.get(H))),k.id],v=N.some((H,K)=>K>0&&!i.has(`${N[K-1]}>${H}`)),C=v||h,U=v&&!M;g.push({refName:c.stable.refName,start:R,end:T,segmentCount:m.length+2,pathCount:L.n,inversion:!1,shortestAlleleLength:U?T-R:L.min,longestAlleleLength:U?T-R:L.max,segments:[c,...m.map(H=>t.get(H)),k].map(H=>H.name).join(","),shortestAllele:void 0,longestAllele:void 0,partial:C,routes:M?.routes})}return g}function Ya(e,t,n,r,a){let o=new Map,i=1/0,s=-1/0,u=0;return e.paths.forEach((d,f)=>{let g=n[f].get(r),p=n[f].get(a);if(g===void 0||p===void 0){(g!==void 0||p!==void 0)&&u++;return}let c=d.nodeIds.slice(Math.min(g,p)+1,Math.max(g,p));p<g&&c.reverse();let y=0;for(let m of c)y+=t.get(m)?.length??0;let k=c.join(","),b=o.get(k)??{steps:c,bp:y,walks:[]};b.walks.push(d.name),o.set(k,b),i=Math.min(i,y),s=Math.max(s,y)}),o.size||u?{min:i,max:s,n:o.size,left:u,routes:[...o.values()]}:void 0}function Cr(e,t){let n=new Set(t),r=e.nodes.filter(i=>n.has(i.name)),a=new Set(r.map(i=>i.id)),o=e.paths?.map(i=>({...i,nodeIds:i.nodeIds.filter(s=>a.has(s))})).filter(i=>i.nodeIds.length>0);return{name:e.name,nodes:r,edges:e.edges.filter(i=>a.has(i.from)&&a.has(i.to)),...o?.length?{paths:o}:{},anchorPaths:e.anchorPaths,pathVisits:e.pathVisits,anchoredBy:e.anchoredBy,referencePath:e.referencePath}}function Br(e,t,n){let r=new Map;for(let o of e.nodes)if(P(o)){let{refName:i}=o.stable;if(n[o.id]?.length){let s=r.get(i)??r.set(i,{nodes:[],reach:0}).get(i);s.nodes.push(o),s.reach=Math.max(s.reach,o.length)}}for(let{nodes:o}of r.values())o.sort((i,s)=>i.stable.start-s.stable.start);let a=[];for(let o of t){let i=r.get(o.refName);if(!i)continue;let s=[],u,d=1/0,f=0,g=(o.start+o.end)/2,{nodes:p,reach:c}=i;for(let y=Zt(p,o.start-c);y<p.length&&p[y].stable.start<o.end;y++){let k=p[y],b=k.stable.start,m=b+k.length;if(m<=o.start)continue;let l=n[k.id];f+=Math.min(m,o.end)-Math.max(b,o.start);for(let L of o.exons){let h=Math.max(L.start,b),R=Math.min(L.end,m);if(R<=h)continue;let T=it(l,(h-b)/k.length,(R-b)/k.length);T.length===1&&T.push({...T[0]}),s.push(Ne(T))}let x=Math.min(Math.max(g,b),m),M=Math.abs(x-g);if(M<d){d=M;let[L]=it(l,(x-b)/k.length,(x-b)/k.length);u=L}}u&&a.push({gene:o,exons:s.join(""),at:u,covered:f/(o.end-o.start)})}return a}function Er(e,t){let n=new Set(e.nodes.filter(d=>P(d)&&d.stable.start<t.end&&d.stable.start+d.length>t.start).map(d=>d.id)),r=e.paths??[];if(n.size===0||r.length===0)return e;let a=new Map(e.nodes.map(d=>[d.id,d.length])),o=r.map(d=>{let f=-1,g=-1;return d.nodeIds.forEach((p,c)=>{n.has(p)&&(f<0&&(f=c),g=c)}),f<0?void 0:{first:f,last:g}});if(o.every((d,f)=>d?.first===0&&d.last===r[f].nodeIds.length-1))return e;let i=new Set,s=[],u=new Map;return r.forEach((d,f)=>{let g=o[f];if(g){let p=d.nodeIds.slice(g.first,g.last+1);for(let c of p)i.add(c);s.push({...d,nodeIds:p}),u.set(d.name,d.nodeIds.slice(0,g.first).reduce((c,y)=>c+(a.get(y)??0),0))}}),{...e,nodes:e.nodes.filter(d=>i.has(d.id)),edges:e.edges.filter(d=>i.has(d.from)&&i.has(d.to)),paths:s,pathVisits:e.pathVisits&&Ua(e.pathVisits,r,o,new Map(e.nodes.map(d=>[d.id,d.name]))),anchorPaths:e.anchorPaths&&Ka(e.anchorPaths,r,u)}}function Ua(e,t,n,r){let a=new Map,o=new Map;return t.forEach((i,s)=>{let u=W(i.name).name,d=n[s];i.nodeIds.forEach((f,g)=>{let p=r.get(f)??f,c=e.get(p);if(!c)return;let y=`${u} ${p}`,k=a.get(y)??0;for(;k<c.length&&c[k].path!==u;)k++;let b=c[k];if(a.set(y,k+1),b&&d&&g>=d.first&&g<=d.last){let m=o.get(p);m?m.push(b):o.set(p,[b])}})}),o}function Ka(e,t,n){let r=new Map;for(let a of t){let o=W(a.name).name;r.set(o,(r.get(o)??0)+1)}return e.map(a=>{let o=t.find(s=>W(s.name).name===a.name),i=o?n.get(o.name):void 0;return i&&r.get(a.name)===1?{...a,start:a.start+i}:a})}function qa(e,t){let n=e.indexOf(":"),r=e.indexOf(":",n+1);if(n!==-1&&r!==-1){let a=e.slice(0,n),o=e.slice(n+1,r),i=e.slice(r+1);o==="i"||o==="f"?t[a]=+i:o==="Z"&&(t[a]=i)}}function le(e){let t={};for(let n of e)qa(n,t);return t}function ft(e){let{SN:t,SO:n,SR:r}=e.tags;return typeof t=="string"&&typeof n=="number"&&typeof r=="number"?{refName:t,start:n,rank:r}:void 0}var Fr=62,Za=60;function Ja(e){let t=[],n="+",r=0;function a(o){o>r&&t.push({id:e.slice(r,o),strand:n})}for(let o=0;o<e.length;o++){let i=e.charCodeAt(o);(i===Fr||i===Za)&&(a(o),n=i===Fr?"+":"-",r=o+1)}return a(e.length),t}function yt(e){let t={nodes:[],links:[],paths:[],walks:[],header:[],id:""};for(let n of e.split(`
2
+ `)){let r=n.endsWith("\r")?n.slice(0,-1):n;if(r.startsWith("H")){let[,...a]=r.split(" ");t.header.push(le(a))}else if(r.startsWith("S")){let[,a,...o]=r.split(" "),i,s,u,d=!1,f=o[0]??"*";/^\d+$/.test(f)?(i=+f,s=o[1]??"*",u=o.slice(2)):(d=!0,s=f,i=s==="*"?0:s.length,u=o.slice(1));let g=le(u);d&&"LN"in g&&(i=+g.LN),t.nodes.push({id:a,length:i,sequence:s,tags:g})}else if(r.startsWith("E")){let[,,a,o,,,,,i,...s]=r.split(" ");a&&o&&t.links.push({source:a.slice(0,-1),target:o.slice(0,-1),strand1:a.at(-1),strand2:o.at(-1),cigar:i??"*",tags:le(s)})}else if(r.startsWith("L")){let[,a,o,i,s,u,...d]=r.split(" ");a&&i&&s&&t.links.push({source:a,target:i,strand1:o,strand2:s,cigar:u??"*",tags:le(d)})}else if(r.startsWith("W")){let[,a,o,i,s,u,d,...f]=r.split(" ");a&&o&&i&&s&&u&&d&&t.walks.push({sample:a,haplotype:+o,contig:i,start:s==="*"?-1:+s,end:u==="*"?-1:+u,segments:Ja(d),tags:le(f)})}else if(r.startsWith("P")){let[,a,o,...i]=r.split(" ");a&&o&&t.paths.push({name:a,path:o,rest:i})}}return t}function Qa(e){let t=new Map,n=new Map;function r(o,i){t.has(o)||t.set(o,i)}function a(o,i){r(o,i),n.set(o,(n.get(o)??0)+1)}for(let o of e.links)r(o.source,o.strand1==="-"?"-":"+"),r(o.target,o.strand2==="-"?"-":"+");for(let o of e.paths)for(let i of o.path.split(","))a(i.slice(0,-1),i.endsWith("-")?"-":"+");for(let o of e.walks)for(let i of o.segments)a(i.id,i.strand==="-"?"-":"+");return{canonical:t,traversals:n}}function ei(e){return[...e.paths.map(t=>({...W(t.name),steps:t.path.split(",").map(n=>({id:n.slice(0,-1),strand:n.endsWith("-")?"-":"+"}))})),...e.walks.map(t=>({name:`${t.sample}#${t.haplotype}#${t.contig}`,start:t.start===-1?0:t.start,steps:t.segments.map(n=>({id:n.id,strand:n.strand==="-"?"-":"+"}))}))]}function ti(e){let t=e.tags.SM;if(typeof t!="string")return;let n=t.split(",").map(r=>r.trim()).filter(Boolean);return n.length>0?n:void 0}var ge=e=>typeof e=="number"&&e>0?e:void 0;function ni({tags:e,length:t}){let n=ge(e.RC)??ge(e.FC)??ge(e.KC);return ge(e.dp)??ge(e.DP)??(n!==void 0&&t>0?n/t:void 0)}function ri(e,t,n){return{id:`${e.id}${t}`,name:e.id,length:e.length,depth:n,stable:ft(e),samples:ti(e)}}function Vr(e,t="Imported GFA"){let n=[],r=[],{canonical:a,traversals:o}=Qa(e),i=c=>`${c}${a.get(c)??"+"}`;for(let c of e.nodes){let y=ni(c)??Math.max(o.get(c.id)??1,1);n.push(ri(c,a.get(c.id)??"+",y))}for(let c of e.links)r.push({from:i(c.source),to:i(c.target),fromStrand:c.strand1==="-"?"-":"+",toStrand:c.strand2==="-"?"-":"+"});let s=[],u=new Map,d=(c,y)=>[c,y].sort().join("--");function f(c,y){for(let k=0;k<c.length-1;k++){let b=d(c[k],c[k+1]);u.has(b)||u.set(b,new Set),u.get(b).add(y)}}for(let c of e.paths){let y=c.path.split(",").map(k=>i(k.slice(0,-1)));s.push({name:c.name,nodeIds:y}),f(y,c.name)}for(let c of e.walks){let y=c.segments.map(b=>i(b.id)),k=`${c.sample}#${c.haplotype}#${c.contig}`;s.push({name:k,nodeIds:y,sample:c.sample,haplotype:c.haplotype,contig:c.contig}),f(y,k)}for(let c of r){let y=u.get(d(c.from,c.to));y&&y.size>0&&(c.pathIds=[...y])}let g=new Map(e.nodes.map(c=>[c.id,c.length])),p=e.paths.length>0||e.walks.length>0?un(ei(e),c=>g.get(c)??0):void 0;return{name:t,nodes:n,edges:r,paths:s.length>0?s:void 0,anchorPaths:p?.anchorPaths,pathVisits:p?.pathVisits,anchoredBy:n.some(c=>c.stable)?"tags":void 0}}function Dr(e,t){let n=e.nodes.filter(b=>P(b)&&(t[b.id]?.length??0)>0);if(n.length<2)return t;let r=n.map(b=>{let m=t[b.id],l=m[Math.floor(m.length/2)];return{x:l.x,y:l.y,r:b.stable.start+b.length/2,w:b.length}}),a=r.reduce((b,m)=>b+m.w,0),o=r.reduce((b,m)=>b+m.x*m.w,0)/a,i=r.reduce((b,m)=>b+m.y*m.w,0)/a,s=r.reduce((b,m)=>b+m.r*m.w,0)/a,u=0,d=0;for(let b of r)u+=b.w*(b.x-o)*(b.r-s),d+=b.w*(b.y-i)*(b.r-s);let f=-Math.atan2(d,u),g=Math.cos(f),p=Math.sin(f),c={};for(let[b,m]of Object.entries(t))c[b]=m.map(l=>{let x=l.x-o,M=l.y-i;return{x:o+g*x-p*M,y:i+p*x+g*M}});let y=0,k=0;for(let b of e.nodes)if(!P(b))for(let m of c[b.id]??[])m.y>i?y++:k++;if(k>y)for(let b of Object.values(c))for(let m of b)m.y=2*i-m.y;return c}var Hr=30;function oi(e,t){let{opts:n}=t,r=new Map(t.nodes.map(p=>[p.id,Ge(n,p.length)])),a=p=>r.get(p)??n.minimumNodeLength,o=e.nodes.filter(P).sort((p,c)=>p.stable.start-c.stable.start),i=new Map,s=0;for(let p of o)i.set(p.id,{x:s,y:0}),s+=a(p.id)+n.edgeLength;let u=Me(e),d=new Map(o.map(p=>[p.id,0])),f=o.map(p=>p.id);for(let p of f){let c=i.get(p),y=d.get(p)+1;for(let k of u.get(p)??[])d.has(k)||(d.set(k,y),i.set(k,{x:c.x+a(p)/2,y:Hr*y}),f.push(k))}let g=0;for(let p of e.nodes)i.has(p.id)||i.set(p.id,{x:g++*s/e.nodes.length,y:Hr*3});return i}function Or(e,t){let n=oi(e,t);return t.nodes.map(r=>({...r,...n.get(r.id)}))}function Wr(e,t,n={}){let r=mn(Vr(yt(e),t),n.referencePath);if(r.nodes.length===0)throw new Error(`No graph segments in ${t}`);if(n.maxNodes!==void 0&&r.nodes.length>n.maxNodes)throw new Error(`Graph too large to draw: ${r.nodes.length.toLocaleString()} nodes (limit ${n.maxNodes.toLocaleString()}). Zoom in to a smaller region, or raise maxGraphNodes on this view.`);return r}function ai(e,t,n){let r=e.nodes.some(P);return{graph:{nodes:r?Or(e,t):t.nodes,edges:e.edges},options:{quality:n.quality,linearLayout:n.linearLayout,...t.opts,...r?{rotateComponents:!1}:{}}}}function _r(e,t){let n=e.nodes.some(P);return`${t.quality}|${t.linearLayout}|${t.bubbleSpread}|${n}|${e.referencePath??""}`}async function jr(e,t,n){let r=wn(t.bubbleSpread),a=Tn(e),{result:o,duration:i}=await n(ai(a.graph,at(a.graph,r),t)),s=at(e,r),u=new Map(s.nodes.map(f=>[f.id,Ge(s.opts,f.length)])),d=An(o.nodePositions,a.runs,f=>u.get(f)??0);return{result:{...o,nodePositions:e.nodes.some(P)?Dr(e,d):d},duration:i}}function ii(e){let t=1/0,n=1/0,r=-1/0,a=-1/0;for(let o of Object.values(e))for(let i of o)t=Math.min(t,i.x),n=Math.min(n,i.y),r=Math.max(r,i.x),a=Math.max(a,i.y);return{minX:t,minY:n,maxX:r,maxY:a}}var D=40,si=1e-6,di=100;function he(e){return Math.max(si,Math.min(di,e))}function wt(e,t,n,r=D){let a=t-e.h*n;return r-e.minY*n+Math.max(0,a)/2}function $r(e,t,n,r,{minScale:a=0,padLeft:o=D,padTop:i=D}={}){let s=t-o-D,u=n-i-D;if(s<=0||u<=0||!(e.w>0||!r&&e.h>0))return;let d=e.w>0?s/e.w:1/0,f=e.h>0?u/e.h:1/0,g=he(Math.max(a,r?d:Math.min(d,f))),p=s-e.w*g;return{scale:g,translateX:o-e.minX*g+Math.max(0,p)/2,translateY:wt(e,u,r?1:g,i)}}function zr(e,t={}){let{minX:n,minY:r,maxX:a,maxY:o}=ii(e.nodePositions),{region:i}=t;e.referenceAxis&&i&&i.end>i.start&&(n=i.start,a=i.end);let s=t.extent??e.extent;return s&&(n=Math.min(n,s.minX??n),r=Math.min(r,s.minY??r),a=Math.max(a,s.maxX??a),o=Math.max(o,s.maxY??o)),{minX:n,minY:r,w:a-n,h:o-r}}function ci(e,t,n){let r=W(e.name).name,a=new Map,o=[],i=()=>({a:-1/0,b:1/0,detour:[],bp:0}),s=[i()];for(let u of e.nodeIds){let d=t.get(u);if(!d)continue;let f=a.get(d.name)??0;a.set(d.name,f+1);let g=n.get(`${r} ${d.name}`)?.[f]??ln(d),p=s.at(-1),c=o.at(-1);if(P(d)){let y=d.stable.start,k=y+d.length,b=g!==(d.stable.strand??"+"),m=c!==void 0&&p.detour.length===0;m&&!c.inverted&&!b&&c.end===y?c.end=k:m&&c.inverted&&b&&c.start===k?c.start=y:(o.push({start:y,end:k,inverted:b}),s.push(i()))}else p.detour.push({node:d,strand:g}),p.bp+=d.length}return o.forEach((u,d)=>{s[d].b=u.start,s[d+1].a=u.end}),{path:e,runs:o,gaps:s}}function kt(e,t){return Number.isFinite(e.a)&&Number.isFinite(e.b)&&e.b>=e.a&&Math.max(e.b-e.a,e.bp)<t}function Xr(e,t,n){let r=0,a=e.length;for(;r<a;){let o=r+a>>1;e[o]<=t?r=o+1:a=o}return r<e.length&&e[r]<n}function ui(e){let t=new Map;for(let n=1;n<e.length;n++){let r=e[n-1],a=e[n],o=r.stable.start+r.length;o!==a.stable.start&&(t.set(o,"reference-gap"),t.set(a.stable.start,"reference-gap"))}return t}function pi(e,t,n){let r=(a,o)=>{Number.isFinite(a)&&!n.has(a)&&n.set(a,o)};for(let{runs:a,gaps:o}of e){let i=a[0],s=a.at(-1);i&&s&&(r(i.start,"walk-end"),r(s.end,"walk-end"));for(let u of a)u.inverted&&u.end-u.start>=t&&(r(u.start,"inversion"),r(u.end,"inversion"));for(let u of o)u.b<u.a?(r(u.a,"backward"),r(u.b,"backward")):kt(u,t)||(r(u.a,"variant"),r(u.b,"variant"))}for(let a=!0;a;){a=!1;let o=[...n.keys()].sort((s,u)=>s-u),i=e.flatMap(({runs:s,gaps:u})=>[...u.filter(d=>kt(d,t)).map(d=>[d.a,d.b]),...s.filter(d=>d.inverted&&d.end-d.start<t).map(d=>[d.start,d.end])]);for(let[s,u]of i)Xr(o,s,u)&&(a||=!n.has(s)||!n.has(u),r(s,"overlap"),r(u,"overlap"))}return n}function mi(e,t){let n=[],r=[],a=()=>{let o=r[0],i=r.at(-1);if(o&&i){let s=o.stable.start,u=i.stable.start+i.length,d=`${s}-${u}`;n.push({node:{id:`${d}+`,name:d,length:u-s,depth:0,stable:{refName:o.stable.refName,start:s,rank:0,strand:"+"}},members:r})}r=[]};for(let o of e)t.has(o.stable.start)&&a(),r.push(o);return a(),n}function Yr(e,t){let n=e.nodes.filter(P).sort((h,R)=>h.stable.start-R.stable.start),r=e.paths??[];if(n.length===0||r.length===0)return;let a=new Map(e.nodes.map(h=>[h.id,h])),o=gn(e),i=r.map(h=>ci(h,a,o)),s=pi(i,t,ui(n)),u=[...s.keys()].sort((h,R)=>h-R),d=mi(n,s),f=d.map(h=>h.node.stable.start),g=h=>{let R=0,T=f.length-1;for(;R<T;){let N=R+T+1>>1;f[N]<=h?R=N:T=N-1}return R},p=new Map,c=new Map;for(let h of d){p.set(h.node.id,h.members.map(R=>R.id));for(let R of h.members)c.set(R.id,h.node.id)}let y=new Map,k=h=>{let R=`${h.a} ${h.b} ${h.detour.map(N=>N.node.id+N.strand).join(",")}`,T=y.get(R);if(!T){let N=`r${y.size}`;T={id:`${N}+`,name:N,length:h.bp,depth:0,stable:{refName:n[0].stable.refName,start:Number.isFinite(h.a)?h.a:h.b,rank:1,strand:"+"}},y.set(R,T),p.set(T.id,h.detour.map(v=>v.node.id));for(let v of h.detour)c.has(v.node.id)||c.set(v.node.id,T.id)}return T},b=new Map,m=[],l=new Map,x=new Map,M=new Map;for(let{path:h,runs:R,gaps:T}of i){let N=[],v=[],C=!1,U=(G,F)=>{let V=N.at(-1);C&&V?.node===G&&V.strand===F||N.push({node:G,strand:F}),C=!0},H=G=>{C=!1,G.detour.length>0&&(U(k(G),"+"),C=!1)},K=G=>{(G.bp>0||G.b>G.a)&&v.push({start:G.a,end:G.b,bp:G.bp});let F=d[g(G.b>G.a?G.a:G.a-1)];for(let V of G.detour)c.has(V.node.id)||(c.set(V.node.id,F.node.id),p.get(F.node.id).push(V.node.id))};R.forEach((G,F)=>{let V=T[F];kt(V,t)&&!Xr(u,V.a,V.b)?K(V):H(V);let ie=g(G.start),Z=g(G.end-1),xe=G.end-G.start<t;if(G.inverted&&!xe){C=!1;for(let z=Z;z>=ie;z--)U(d[z].node,"-");C=!1}else{G.inverted&&v.push({start:G.start,end:G.end,bp:G.end-G.start,inverted:!0});for(let z=ie;z<=Z;z++)U(d[z].node,"+")}}),H(T.at(-1));let q=W(h.name).name,et=0;N.forEach(({node:G,strand:F},V)=>{M.set(G.id,(M.get(G.id)??0)+1);let ie=l.get(G.name)??[];ie.push({path:q,sample:h.sample??q,start:et,strand:F}),l.set(G.name,ie),et+=G.length;let Z=N[V+1];if(Z){let xe=`${G.id}${F} ${Z.node.id}${Z.strand}`,z=x.get(xe);z?z.pathIds.push(h.name):x.set(xe,{from:G.id,to:Z.node.id,fromStrand:F,toStrand:Z.strand,pathIds:[h.name]})}}),m.push({...h,nodeIds:N.map(G=>G.node.id)}),b.set(h.name,v)}let L=[...d.map(h=>h.node),...y.values()].filter(h=>M.has(h.id)).map(h=>({...h,depth:M.get(h.id)}));return{graph:{...e,nodes:L,edges:[...x.values()],paths:m,pathVisits:l,reads:void 0},members:p,coarseOf:c,deviations:b,cuts:s}}var li=e=>e.bp1>e.bp0;function Ur(e,t){let n=e.filter(li);if(n.length===0){let o=e[0];return o?[{tx:o.x0,sx:t(o.bp0)}]:[]}let r=n.map(o=>({c:o,s0:t(o.bp0),s1:t(o.bp1),trimLeft:0,trimRight:0}));for(let o=0;o+1<r.length;o++){let i=r[o],s=r[o+1],d=Math.min(s.c.x0-i.c.x1,24)-(s.s0-i.s1);if(d>0){let f=(i.s1-i.s0)/2,g=(s.s1-s.s0)/2,p=Math.min(d/2,f),c=Math.min(d-p,g);p=Math.min(d-c,f),i.trimRight=p,s.trimLeft=c}}let a=[];for(let{c:o,s0:i,s1:s,trimLeft:u,trimRight:d}of r)a.push({tx:o.x0,sx:i+u},{tx:o.x1,sx:s-d});return a}function Kr(e,t){let n=e.length;if(n===0)return t;let r=e[0],a=e[n-1];if(t<=r.tx)return r.sx+(t-r.tx);if(t>=a.tx)return a.sx+(t-a.tx);let o=0,i=n-1;for(;i-o>1;){let f=o+i>>1;e[f].tx<=t?o=f:i=f}let s=e[o],u=e[i],d=u.tx-s.tx;return d>0?s.sx+(t-s.tx)/d*(u.sx-s.sx):s.sx}var gi=.05,Fe=9;function hi(e,t){let{minY:n,maxY:r}=e.layout.bounds,a=r-n;return e.columns&&a>0?Math.max(gi,Math.min(1,t/a)):1}function qr(e,t){let{scaleX:n,translateX:r,translateY:a}=t,o=t.scaleY*hi(e,t.usableHeight),i=u=>(u-e.yOffset)*o+a,{columns:s}=e;if(s){let u=Ur(s,d=>d*n+r);return{x:d=>Kr(u,d),y:i,yScale:o}}return{x:u=>u*n+r,y:i,yScale:o}}function Zr(e,{x:t,y:n},r,a){let o=null;return e.layout.nodes.forEach(i=>{i.order>=0&&t(i.x-Fe)<=r&&r<=t(i.x+i.pixelWidth+Fe)&&n(i.y-Fe)<=a&&a<=n(i.y+i.contentHeight+Fe)&&(o=i.name)}),o}function Ve(e,t){return{scaleX:e,scaleY:t?1:e,pixelRows:t}}function Jr(e,t,n,r){return{minX:-e.translateX/t.scaleX,minY:-e.translateY/t.scaleY,maxX:(n-e.translateX)/t.scaleX,maxY:(r-e.translateY)/t.scaleY}}function Qr(e,t){let n=(e.maxX-e.minX)*t,r=(e.maxY-e.minY)*t;return{minX:e.minX-n,minY:e.minY-r,maxX:e.maxX+n,maxY:e.maxY+r}}function eo(e,t){return t.minX>=e.minX&&t.maxX<=e.maxX&&t.minY>=e.minY&&t.maxY<=e.maxY}function to(e,t,n,r,a){let o=he(e.scale*t),i=o/e.scale;return{scale:o,translateX:n-(n-e.translateX)*i,translateY:a?e.translateY:r-(r-e.translateY)*i}}function no(e){return e.referencePath?e.paths?.find(t=>W(t.name).name===e.referencePath):void 0}function bi(e,t){let n=e.paths?.find(g=>g.name===t);if(!n)return;let r=new Map(e.nodes.map(g=>[g.id,g])),a=new Map;e.edges.forEach((g,p)=>{a.set(`${g.from}>${g.to}`,p)});let o=new Set;for(let g=1;g<n.nodeIds.length;g++){let p=n.nodeIds[g-1],c=n.nodeIds[g],y=a.get(`${p}>${c}`)??a.get(`${c}>${p}`);y!==void 0&&o.add(y)}let i=g=>r.get(g)?.length??0,s=n.nodeIds.reduce((g,p)=>g+i(p),0),u=new Map,d=0;for(let g of n.nodeIds){let p=i(g);u.has(g)||u.set(g,s>0?(d+p/2)/s:0),d+=p}let f=no(e);return{name:t,reference:f===n,nodeIds:new Set(n.nodeIds),edgeIndexes:o,progress:u,steps:n.nodeIds.length,bp:s,referenceBp:f&&f!==n?f.nodeIds.reduce((g,p)=>g+i(p),0):void 0}}function fi(e,t,{field:n,scheme:r},a){let o=new Map,i=new Map(e.nodes.map(c=>[c.id,c])),s=W(t.name).name,u=no(e),d=u?W(u.name).name:void 0,f=e.paths.find(c=>c.name===t.name),g=new Map;for(let c of f.nodeIds)g.set(c,(g.get(c)??0)+1);let p=(c,y)=>e.pathVisits?.get(c)?.find(k=>k.path===y)?.strand;for(let[c,y]of t.progress){let k=i.get(c),b;if(n==="progress")b=y;else if(n==="visits")b=(Math.min(g.get(c)??1,4)-1)/3;else if(n==="reference"){let m=a?.midpoints.get(c);b=a&&m!==void 0&&!(k?.stable&&k.stable.rank>0)?(m-a.start)/a.span:void 0}else if(k){let m=p(k.name,s),l=p(k.name,d);b=m&&l?m===l?dt.same:dt.reversed:void 0}o.set(c,b===void 0?tr:er(r,b))}return o}function ro(e,t,n){let r=new Set,a=t.filter(s=>!r.has(s.walk)&&r.add(s.walk)).flatMap(s=>{let u=bi(e,s.walk);return u?[{walk:u,layer:s}]:[]}).sort((s,u)=>Number(u.walk.reference)-Number(s.walk.reference));if(a.length===0)return;let o=0,i=a.map(({walk:s,layer:u})=>{let d=Qn(u,s.reference,s.reference?0:o++);return{...s,encoding:d,colors:fi(e,s,d,n)}});return{walks:i,nodeIds:new Set(i.flatMap(s=>[...s.nodeIds])),edgeIndexes:new Set(i.flatMap(s=>[...s.edgeIndexes])),names:new Set(i.map(s=>s.name))}}var te=S(j(),1),Fo=S(dn(),1),A=S(se(),1),Vo=S(Ca(),1),w=S(X(),1),Do=S(ao(),1),Ho=S(Va(),1),B=S(sn(),1);var xt=new Set(["Gff3TabixAdapter","Gff3Adapter","GtfTabixAdapter","GtfAdapter","BigBedAdapter","NCListAdapter"]),yi=/gene|refseq|gencode|ensembl|annotation/i;function io(e,t){if(t)return e.find(r=>r.trackId===t);let n=e.filter(r=>xt.has(r.adapterType));return n.find(r=>yi.test(`${r.trackId} ${r.name??""}`))??n[0]}function $(e,t){return typeof e.get=="function"?e.get(t):e[t]}function so(e,t){$(e,"type")==="exon"&&t.push({start:$(e,"start"),end:$(e,"end")});let r=$(e,"subfeatures");for(let a of r??[])so(a,t)}function wi(e){let t=[...e].sort((r,a)=>r.start-a.start),n=[];for(let r of t){let a=n.at(-1);a&&r.start<=a.end?a.end=Math.max(a.end,r.end):n.push({...r})}return n}function co(e){let t=[];for(let n of e){let r=$(n,"gene_name")??$(n,"name")??$(n,"id"),a=$(n,"start"),o=$(n,"end");if(!r||!(o>a))continue;let i=[];so(n,i),t.push({name:r,refName:$(n,"refName"),start:a,end:o,strand:$(n,"strand")??0,exons:i.length?wi(i):[{start:a,end:o}]})}return t}function uo(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.horizontalScroll=="function"&&typeof t.zoomTo=="function"&&"coarseDynamicBlocks"in t&&"dynamicBlocks"in t}function po(e){return e.reduce((t,n)=>t&&t.end-t.start>=n.end-n.start?t:n,void 0)}function De(e,t){let n=po(e.dynamicBlocks.contentBlocks.filter(o=>o.refName===t.refName&&o.assemblyName===t.assemblyName)),{bpPerPx:r}=e;if(!n||!(r>0))return;let a=n.offsetPx-e.offsetPx;return n.reversed?{scale:-1/r,translateX:a+n.end/r}:{scale:1/r,translateX:a-n.start/r}}function He(e){let t=po(e.dynamicBlocks.contentBlocks),n=t?.displayedRegionIndex===void 0?void 0:e.displayedRegions[t.displayedRegionIndex];return t&&e.bpPerPx>0?{refName:t.refName,assemblyName:t.assemblyName,start:t.start,end:t.end,bpPerPx:e.bpPerPx,span:e.bpPerPx*e.width,regionStart:n?.start??t.start,regionEnd:n?.end??t.end}:void 0}function St(e,t,n=!0){let r=e.end-e.start,a=n?Math.max(0,Math.min(e.span,(t-r)/2)):0,o=Math.max(e.regionStart,Math.floor(e.start-a)),i=Math.min(e.regionEnd,Math.ceil(e.end+a)),s=i-o-t;return s>0&&(o+=Math.floor(s/2),i-=Math.ceil(s/2)),{refName:e.refName,assemblyName:e.assemblyName,start:o,end:i}}function mo(e,t,n=!0){if(e?.refName!==t.refName||e.assemblyName!==t.assemblyName)return!1;if(n)return e.start<=t.start+1&&t.end<=e.end+1;let r=St(t,1/0,!1);return Math.abs(e.start-r.start)<1&&Math.abs(e.end-r.end)<1}var Q=S(X(),1);function lo(e){return t=>e.includes(t)?t:void 0}function Mt(e){return Q.types.snapshotProcessor(Q.types.maybe(Q.types.enumeration(e)),{preProcessor:lo(e)})}function Rt(e,t){return Q.types.snapshotProcessor(Q.types.optional(Q.types.enumeration(e),t),{preProcessor:lo(e)})}var Tt=new Set(["BedAdapter","BedTabixAdapter","BigBedAdapter","VcfAdapter","VcfTabixAdapter"]),ki=/repeat|tandem|\bstr\b|vntr|trf|trgt|vamos|expansion|microsat/i;function go(e,t){return t?e.find(r=>r.trackId===t):e.filter(r=>Tt.has(r.adapterType)).find(r=>ki.test(`${r.trackId} ${r.name??""}`))}function be(e,t){return typeof e.get=="function"?e.get(t):e[t]}var ho=/^\w+=[^;]*(;\w+=[^;]*)*$/;function xi(e){let t=be(e,"name");if(!(typeof t!="string"||!ho.test(t)))return Object.fromEntries(t.split(";").map(n=>{let r=n.indexOf("=");return[n.slice(0,r),n.slice(r+1)]}))}function Y(e,t){let n=be(e,t);return n!==void 0?n:be(e,"INFO")?.[t]??xi(e)?.[t]}var bo=["RUS","MOTIFS","RU","motifs","motif","sequence","consensus"],Si=["RUL","period","PERIOD","consensusSize","unit","unitLength"],Mi=["TRID","REPID","VARID","ID","name","id"];function Oe(e,t){for(let n of t){let r=Y(e,n),a=String((Array.isArray(r)?r[0]:r)??"").split(",")[0].trim();if(a!==""&&a!==".")return a}}var fo=/^[ACGTURYSWKMBDHVN]+$/i;function Ri(e){let t=Number(Oe(e,Si));if(Number.isFinite(t)&&t>0)return Math.round(t);let n=Oe(e,bo);return n&&fo.test(n)?n.length:void 0}function ee(e){return(Array.isArray(e)?e:String(e??"").split(",")).map(n=>{let r=n===""||n===null||n===void 0?NaN:Number(n);return Number.isFinite(r)?r:void 0})}function Gt(e){return(Array.isArray(e)?e:String(e??"").split(",")).map(n=>{let r=String(n??"").trim();return r===""||r==="."?void 0:r})}var Lt="<CNV:TR>";function Li(e){let t=Gt(be(e,"ALT"));if(!t.includes(Lt))return;let n=ee(Y(e,"RN")),r=Gt(Y(e,"RUS")),a=ee(Y(e,"RUL")),o=ee(Y(e,"RUC")),i=ee(Y(e,"RB")),s=0;return t.map((u,d)=>{let f=n[d]??(u===Lt?1:0),g=0,p=0;for(let c=0;c<f;c++,s++){let y=r[s],k=a[s]??(y&&fo.test(y)?y.length:void 0),b=o[s],m=i[s]??(k&&b!==void 0?Math.round(k*b):void 0);m!==void 0&&(g+=m,p++)}return u===Lt&&f>0&&p===f?g:void 0})}function Gi(e,t,n){let r=e?.includes("|");return(e??"").split(/[/|]/).flatMap((a,o)=>{let i=Number(a),s=i>0?t[i-1]:n;return!Number.isInteger(i)||s===void 0?[]:[{bp:s,...r?{haplotype:o+1}:{}}]})}function Ti(e,t,n){let r=be(e,"samples"),a={};for(let[o,i]of Object.entries(r??{})){let s=ee(i.SD),u=ee(i.AL).flatMap((f,g)=>f!==void 0&&f>0?[s[g]===void 0?{bp:f}:{bp:f,spanningReads:s[g]}]:[]),d=u.length>0||!t?u:Gi(Gt(i.GT)[0],t,n);d.length>0&&(a[o]=d)}return Object.keys(a).length>0?a:void 0}function Ai(e,t){let n=Y(e,"start"),r=Y(e,"end"),a=ee(Y(e,"SVLEN"))[0];return t&&a!==void 0?{start:n+1,end:n+1+a}:{start:n,end:r}}function yo(e){let t=[];for(let n of e){let r=Li(n),{start:a,end:o}=Ai(n,r!==void 0),i=Ri(n);if(!(o>a)||i===void 0)continue;let s=Y(n,"refName"),u=Oe(n,bo),d=Oe(n,Mi);t.push({key:`${s}:${a}-${o}`,name:(d&&!ho.test(d)?d:void 0)??(u&&u.length<=12?`(${u})n`:`${s}:${(a+1).toLocaleString()}-${o.toLocaleString()}`),refName:s,start:a,end:o,unit:i,motif:u,calls:Ti(n,r,o-a)})}return t.sort((n,r)=>n.start-r.start)}function We(e){return typeof e=="object"&&e!==null}function Ni(e){return We(e)&&typeof e.get=="function"}function Pi(e){let t=Ni(e)?e.get("name"):We(e)?e.name:void 0;return typeof t=="string"?t:void 0}function wo(e){let t;if(We(e)&&We(e.hoverPosition)){let{refName:n,coord:r,coord0:a,assemblyName:o}=e.hoverPosition;typeof n=="string"&&typeof r=="number"&&(t={refName:n,coord:typeof a=="number"?a:r-1,assemblyName:typeof o=="string"?o:void 0,featureName:Pi(e.hoverFeature)})}return t}function ko(e,t){return(e.assemblyName===void 0||e.assemblyName===t.assemblyName)&&e.refName===t.refName&&e.coord>=t.start&&e.coord<t.end}function xo({hover:e,nodes:t}){let n,r;for(let a of t)a.name===e.featureName?n=a.id:r===void 0&&P(a)&&e.coord>=a.stable.start&&e.coord<a.stable.start+a.length&&(r=a.id);return n??r??null}var At=S(j(),1);function So(e){return typeof e=="object"&&e!==null}function Ii(e){return So(e)&&e.type==="LinearGenomeView"&&typeof e.id=="string"&&typeof e.navToLocString=="function"&&Array.isArray(e.assemblyNames)}function fe(e){return e.flatMap(t=>So(t)&&Array.isArray(t.views)?[t,...t.views]:[t])}function ye({views:e,connectedViewId:t,assemblyName:n}){let r=fe(e).filter(o=>Ii(o)).filter(o=>o.assemblyNames.includes(n));return r.find(o=>o.id===t)??(r.length===1?r[0]:void 0)}function Ro(e,t,n){n.catch(r=>{console.error(`[GraphGenomeView] ${t}`,r),e.notifyError?.(`${t}: ${r}`,r)})}var vi=1e3;function Nt(e,t=vi){let n=Math.max(0,Math.ceil((t-(e.end-e.start))/2));return{...e,start:Math.max(0,e.start-n),end:e.end+n}}function Lo(e,t){return t?e.map(n=>n.rank===0?{...n,sample:t.assemblyName,haplotype:void 0,refName:t.refName,start:t.start,end:t.end}:n):e}function Go({session:e,location:t,assembly:n,connectedViewId:r,tracks:a=[]}){let o=ye({views:e.views,connectedViewId:r,assemblyName:n}),i;return o?(Ro(e,`Could not show ${n} ${ce(t)}`,Promise.resolve(o.navToLocString(ve(t),n))),i=o.id):i=e.addView("LinearGenomeView",{displayName:`${n} \u2014 ${ce(t)}`,init:{assembly:n,loc:ve(t),tracks:a}}).id,i}function To({session:e,location:t,assembly:n,connectedViewId:r}){let a=ye({views:e.views,connectedViewId:r,assemblyName:n});return a?.addToHighlights?.({refName:t.refName,start:t.start,end:t.end,assemblyName:n}),a!==void 0}function Mo(e,t){if(t===void 0)return[];let n=e.tracks.find(a=>(0,At.readConfObject)(a,"trackId")===t),r=n?(0,At.readConfObject)(n,"assemblyNames"):[];return Array.isArray(r)?r.filter(a=>typeof a=="string"):[]}function Ao({session:e,contributors:t,trackId:n,graphTrackId:r}){let a=Mo(e,r),o=Mo(e,n),i=t.filter(d=>o.includes(d.sample)),s=i.length>=2?i:t,u={init:{views:s.map(d=>({assembly:d.sample,loc:ve(d),...r!==void 0&&a.includes(d.sample)?{tracks:[r]}:{}})),tracks:n?s.slice(1).map(()=>[n]):[],collapseEmptyRows:!0}};e.launchView?Ro(e,"Could not open the synteny view",e.launchView("LinearSyntenyView",u)):e.addView("LinearSyntenyView",u)}var _e=S(j(),1),Ci="FeatureTrack";function No({session:e,assemblyName:t,first:n}){let r=[];for(let a of e.tracks){let o=(0,_e.readConfObject)(a,"type"),i=(0,_e.readConfObject)(a,"assemblyNames"),s=(0,_e.readConfObject)(a,"trackId");o===Ci&&Array.isArray(i)&&i.includes(t)&&typeof s=="string"&&s!==n&&r.push(s)}return n?[n,...r]:r}var je=S(j(),1),Po=S(Ba(),1),$e=S(X(),1),Bi="SyntenyTrack",Ei="Synteny adapters";function Fi(e){if((0,je.readConfObject)(e,"type")===Bi)return!0;let t=e.adapter?.type;if(typeof t!="string"||!(0,$e.isStateTreeNode)(e))return!1;let{pluginManager:n}=(0,$e.getEnv)(e);return!!n?.hasAdapterType(t)&&n.getAdapterType(t).adapterMetadata?.category===Ei}function Io(e,t){let n=new Set(t),r=[];for(let a of e.tracks){let o=(0,je.readConfObject)(a,"assemblyNames"),i=(0,je.readConfObject)(a,"trackId");if(Fi(a)&&typeof i=="string"&&Array.isArray(o)){let s=o.filter(u=>n.has(u)).length;s>=2&&r.push({trackId:i,name:(0,Po.getTrackName)(a,e),coverage:s})}}return r.sort((a,o)=>o.coverage-a.coverage)}var Di=600,Pt=160,Hi=5,vo=new Set(["tubemap","tubemapref"]),Oi=[{bp:0,label:"None"},{bp:3,label:"Under 3 bp"},{bp:10,label:"Under 10 bp"},{bp:50,label:"Under 50 bp, leaving structural variants"},{bp:1e3,label:"Under 1 kb"}],Co=".segs.bed.gz";function Wi(e){if(typeof e.uri=="string")return e.uri;let n=e.segmentsLocation?.uri;return typeof n=="string"&&n.endsWith(Co)?n.slice(0,-Co.length):void 0}var Bo=1.4,_i=1.6,ji=150,$i=1,zi={nodeStrokes:[],nodeStrokeRuns:new Map,arrows:[],arrowRuns:new Map,edgeCurves:[],edgeCurveRuns:new Map};function we(...e){}var Xe=5e6;function ne(e){return e>=1e6?`${+(e/1e6).toFixed(1)} Mb`:`${Math.round(e/1e3)} kb`}var Xi=2e4;function Eo(e){return e.builtViewport!==void 0&&e.paintedViewport===e.builtViewport&&e.builtViewport.viewportDirty===e.viewportDirty&&!e.viewportRebuildPending}function It(e){return Jr(e,e.axisScale,e.paneWidth,e.canvasHeight)}var ze=new WeakMap,Yi=4;function Ui(e){let t=ze.get(e);return t||(t=new Map,ze.set(e,t)),t}function Ki(e,t){let n=ze.get(e);n&&e!==t&&ze.set(t,n)}function qi(e,t,n){e.size>=Yi&&e.delete(e.keys().next().value),e.set(t,n)}function Ye(){return w.types.compose("GraphPane",(0,Do.RenderLifecycleMixin)(),w.types.model({layoutQuality:w.types.optional(w.types.number,2),linearLayout:w.types.optional(w.types.boolean,!1),layoutMode:Mt(Le),colorScheme:Mt(Pe),bubbleSpread:Rt(yn,"auto"),nodeWidth:Rt(In,"depth"),showBubbles:w.types.optional(w.types.boolean,!1),showDeletionEdges:w.types.optional(w.types.boolean,!1),showGenes:w.types.optional(w.types.boolean,!0),showReferenceStrip:w.types.optional(w.types.boolean,!0),tubeMapFold:w.types.optional(w.types.number,0),geneTrackId:w.types.optional(w.types.string,""),repeatTrackId:w.types.optional(w.types.string,""),repeatKey:w.types.optional(w.types.string,""),walkRowSamples:w.types.maybe(w.types.frozen()),walkLayers:w.types.optional(w.types.frozen(),[]),referencePath:w.types.optional(w.types.string,""),showPerf:w.types.optional(w.types.boolean,!1),contigThickness:w.types.optional(w.types.number,6),connectorThickness:w.types.optional(w.types.number,2),darkMode:w.types.optional(w.types.boolean,!1),scale:w.types.optional(w.types.number,1),translateX:w.types.optional(w.types.number,0),translateY:w.types.optional(w.types.number,0),drawPaths:w.types.optional(w.types.boolean,!1),paneHeight:w.types.maybe(w.types.number),maxGraphNodes:w.types.optional(w.types.number,Xi),colorDomain:w.types.maybe(w.types.frozen()),connectedViewId:w.types.maybe(w.types.string)})).volatile(()=>({graph:void 0,graphRegion:void 0,loadedReferencePath:void 0,layoutResult:void 0,legendSize:{width:0,height:0},indexBubbles:void 0,geneFeatures:void 0,repeatArrays:void 0,popStack:[],error:void 0,isLoading:!1,loadCanceled:!1,statusMessage:"",hoveredNode:null,hoveredBubble:null,pointerInPane:!1,hoveredEdge:null,selectedNode:null,viewportDirty:0,positionsVersion:0,geometryVersion:0,builtViewport:void 0,paintedViewport:void 0,draggingNode:null,isPanning:!1,viewportOwner:"fit",viewportDirtyTimer:void 0,positionsDirtyFrame:0,lastFetchMs:void 0,readsShown:void 0,lastLayoutMs:void 0,lastGeometryMs:void 0,lastGeometryStrokeCount:void 0,viewportRebuildPending:!1})).views(e=>({get defaultLayoutMode(){return"force"},get defaultColorScheme(){return"auto"},get hasPendingSource(){return!1},get canRetryLoad(){return!1},get sourceTrack(){try{return(0,A.getContainingTrack)(e).configuration}catch{return}}})).views(e=>({get chosenLayoutMode(){return e.layoutMode??e.defaultLayoutMode},get chosenColorScheme(){return e.colorScheme??e.defaultColorScheme}})).views(e=>({get paneWidth(){return(0,A.getContainingView)(e).width},get drawnGraph(){return e.layoutResult?.tubeMap?.coarse?.graph??e.graph}})).views(e=>({get nodeById(){if(e.drawnGraph){let t=new Map;for(let n of e.drawnGraph.nodes)t.set(n.id,n);return t}},get nodeLengths(){let t=new Map;for(let n of e.drawnGraph?.nodes??[])t.set(n.id,n.length);return t},get nodeCount(){return e.graph?.nodes.length??0},get edgeCount(){return e.graph?.edges.length??0},get pathCount(){return e.graph?.paths?.length??0},get hasGraph(){return e.graph!==void 0},get geometryPainted(){return Eo(e)},get showLoading(){return e.error===void 0&&(e.isLoading||e.hasPendingSource||e.graph!==void 0&&!Eo(e))},get canCancelLoad(){return e.isLoading&&!e.layoutResult},get usesLayoutEngine(){return e.graph?fn(e.chosenLayoutMode,e.graph):!1},get canAnchorLayout(){return e.graph?.nodes.some(t=>t.stable?.rank===0)??!1},get anchorPaths(){return e.graph?.anchorPaths??[]},get pathLegend(){let t=e.graph?.paths,n=e.layoutResult?.tubeMap;return(e.drawPaths||n)&&t&&nt(t.length)?rt(t,n?.pathColors):[]},get walkChoices(){let t=e.graph?.paths;return t?.length?rt(t):[]},get effectiveDrawPaths(){return e.drawPaths&&nt(e.graph?.paths?.length??0)},get activeReferencePath(){return e.graph?.referencePath},get rampDomain(){return e.colorDomain??e.graphRegion},get walkLift(){let{graph:t}=e;return t&&e.walkLayers.length>0?ro(t,e.walkLayers,st(t,this.rampDomain)):void 0},get effectiveColorScheme(){return Ln(e.chosenColorScheme,e.graph)},get nodePositions(){return e.layoutResult?.nodePositions},get labelsNodeSizes(){return!e.layoutResult?.tubeMap},get rowLabels(){return e.layoutResult?.rowLabels??[]},get alleleDeletions(){return e.layoutResult?.alleleDeletions??[]},get pixelRows(){return e.layoutResult?.pixelRows??!1},get zoomPercent(){return`${(e.scale*100).toFixed(1)}%`},get isDefaultViewport(){return e.scale===1&&e.translateX===0&&e.translateY===0}})).views(e=>({get poppedFrom(){return e.popStack.at(-1)},get derivedBubbles(){return e.graph?vr(e.graph):[]}})).views(e=>({get bubbles(){return e.indexBubbles?.length?e.indexBubbles:e.derivedBubbles}})).views(e=>({get sourceAdapter(){let t=e.sourceTrack;return t?(0,te.readConfObject)(t,"adapter"):void 0},get sourceTrackId(){let t=e.sourceTrack;return t?(0,te.readConfObject)(t,"trackId"):void 0},get assemblyTrackChoices(){let t=e.graphRegion;return t?(0,A.getSession)(e).tracks.filter(n=>(0,te.readConfObject)(n,"assemblyNames").includes(t.assemblyName)).map(n=>({trackId:n.trackId,name:(0,te.readConfObject)(n,"name"),adapterType:(0,te.readConfObject)(n,"adapter").type})):[]}})).views(e=>({get geneTrackChoices(){return e.assemblyTrackChoices.filter(t=>xt.has(t.adapterType))},get repeatTrackChoices(){return e.assemblyTrackChoices.filter(t=>Tt.has(t.adapterType))},get repeatChoices(){return e.repeatArrays??[]}})).views(e=>({get repeatTrack(){return go(e.repeatTrackChoices,e.repeatTrackId)},get selectedRepeat(){return e.repeatChoices.find(t=>t.key===e.repeatKey)},get backbone(){return e.graph?Qt(e.graph):void 0},assemblySpellings(t){let{assemblyManager:n}=(0,A.getSession)(e),r=n.has(t)?n.get(t):void 0,a=e.sourceAdapter?.assemblyNameToPanSN??{},o=[t,...r?[r.name,...r.aliases]:[]];return{name:t,aliases:[...o,...o.flatMap(i=>a[i]??[])]}},get drawsLoadedReference(){let t=e.graph;return t?.anchoredBy==="tags"||t?.referencePath!==void 0&&t.referencePath===e.loadedReferencePath}})).views(e=>({get geneAssembly(){let t=e.graphRegion;return t?e.assemblySpellings(t.assemblyName):void 0}})).views(e=>({get backboneGenes(){let{backbone:t,geneAssembly:n,geneFeatures:r}=e,a=e.drawsLoadedReference||n!==void 0&&en(t,[n])!==void 0;return t&&r&&a?nn(r,t):void 0}})).views(e=>({get nodeNeighbors(){return e.drawnGraph?Me(e.drawnGraph):void 0},get nodeInk(){return vn(e.drawnGraph,e.nodeById,e.contigThickness,e.nodeWidth)},get deletions(){return e.graph&&e.chosenLayoutMode!=="walkrows"&&!e.layoutResult?.tubeMap?Gn(e.graph):[]},get walkRowBars(){if(e.chosenLayoutMode!=="walkrows"||!e.graph)return;let t=e.selectedRepeat,n=t?ot(e.graph,t,t.unit):ot(e.graph,e.graphRegion);if(!n)return;let r=e.walkRowSamples,a=r?n.rows.filter(s=>r.includes(s.sample)).sort((s,u)=>r.indexOf(s.sample)-r.indexOf(u.sample)||s.label.localeCompare(u.label)):n.rows,[o,...i]=nr([n.reference,...a],t?.calls);return{...n,reference:o,rows:i}},get drawnRowLabels(){let t=this.walkRowBars;return t?[t.reference,...t.rows].map((n,r)=>({label:n.label,y:r*20})):e.rowLabels},get fitPadLeft(){return Math.max(D,...this.drawnRowLabels.map(t=>Nn(t.label,0).x1+6))},get genePins(){we(e.positionsVersion);let t=e.layoutResult?.nodePositions;return e.showGenes&&e.chosenLayoutMode!=="walkrows"&&!e.layoutResult?.tubeMap&&e.graph&&e.backboneGenes&&t?Br(e.graph,e.backboneGenes,t):[]},get bubbleHalos(){we(e.positionsVersion);let t=e.layoutResult?.nodePositions;if(!e.showBubbles||e.chosenLayoutMode==="walkrows"||e.layoutResult?.tubeMap||!e.graph||!t)return[];let n=new Map(e.walkChoices.map(r=>[r.name,r.label]));return Ir(e.graph,e.bubbles,t,r=>n.get(r)??r,e.repeatArrays)},get referenceRamp(){return e.effectiveColorScheme==="reference-position"&&e.graph&&!e.layoutResult?.tubeMap?st(e.graph,e.rampDomain):void 0},get assemblyNames(){let t=e.graphRegion;return t?[t.assemblyName]:[]},get scaleX(){return Ve(e.scale,e.pixelRows).scaleX},get scaleY(){return Ve(e.scale,e.pixelRows).scaleY},get axisScale(){return Ve(e.scale,e.pixelRows)},get layoutBounds(){let t=e.layoutResult,n=this.walkRowBars;return t?zr(t,{region:e.popStack.length===0?e.graphRegion:void 0,extent:n&&t.extent?hn(n):void 0}):void 0}})).views(e=>({get geneTrack(){return io(e.geneTrackChoices,e.geneTrackId)},get deletionEdgeIndexes(){return new Map(e.deletions.map(t=>[t.edgeIndex,t.bypassed]))},get hiddenEdgeIndexes(){return new Set(e.showDeletionEdges?[]:e.deletions.map(t=>t.edgeIndex))},get referenceRampDomain(){let t=e.referenceRamp;return t?{start:t.start,end:t.start+t.span}:void 0},nodeSpan(t){let{nodeById:n,nodeNeighbors:r}=e;return n&&r?Re({nodeId:t,nodeById:n,neighbors:r}):void 0}})).views(e=>({get hoveredSpan(){let t=e.hoveredNode,n=e.hoveredBubble;return t!==null?e.nodeSpan(t):n?{start:n.start,end:n.end}:void 0}})).views(e=>({get hoverHighlight(){let t=e.graphRegion,n=e.hoveredSpan;return t&&n?{refName:t.refName,assemblyName:t.assemblyName,...n}:void 0}})).views(e=>({get contributingAssemblies(){let t=e.graph,n=t?qt(t):[];return t?rr(t,{maxGap:n.length>0?Jt(n):1/0}):[]}})).views(e=>({get assemblyResolver(){let{assemblyManager:t}=(0,A.getSession)(e),n=e.sourceAdapter?.assemblyNameToPanSN,r=new Map(Object.entries(n??{}).map(([o,i])=>[i,o])),a=o=>o!==void 0&&t.has(o)?t.get(o)?.name??o:void 0;return o=>a(r.get(o))??a(o)}})).views(e=>({get launchableAssemblies(){return ar(Lo(e.contributingAssemblies,e.graphRegion),e.assemblyResolver)},get canHighlightInLinearView(){let t=e.graphRegion;return t!==void 0&&ye({views:[...(0,A.getSession)(e).views],connectedViewId:e.connectedViewId,assemblyName:t.assemblyName})!==void 0},nodeLaunchTargets(t){let n=e.nodeById?.get(t),r=n?Ie(n):void 0,a=r?or(e.assemblyResolver,r):void 0,o=e.graphRegion,i=e.nodeById,s=e.nodeNeighbors,u=o&&i&&s?Re({nodeId:t,nodeById:i,neighbors:s}):void 0,d=o&&u?{sample:o.assemblyName,haplotype:void 0,refName:o.refName,...u}:void 0;return{own:r&&a?{location:Nt(r),assembly:a}:void 0,reference:o&&d?{location:Nt(d),assembly:o.assemblyName}:void 0,highlight:o&&d?{location:d,assembly:o.assemblyName}:void 0}}})).views(e=>({get host(){let t;try{t=(0,A.getContainingView)(e)}catch{return}return uo(t)?t:void 0}})).views(e=>({get xIsReferenceBp(){return e.layoutResult?.referenceAxis===!0&&_(e.chosenLayoutMode).cutMargins}})).views(e=>({get hostPlacesX(){let{host:t,graphRegion:n}=e;return t!==void 0&&t.initialized&&n!==void 0&&e.xIsReferenceBp&&e.popStack.length===0&&!t.dynamicBlocks.contentBlocks.some(r=>r.refName===n.refName&&r.reversed)}})).views(e=>({get hostFrame(){let{host:t,graphRegion:n}=e;return e.hostPlacesX&&t&&n?De(t,n):void 0},get tubeMapPicture(){let t=e.layoutResult?.tubeMap;return t?zn(t.layout):void 0},get tubeMapReference(){let t=e.layoutResult?.tubeMap;return t&&e.drawnGraph?Hn(e.drawnGraph,t.layout):void 0},get tubeMapDeviations(){let t=e.layoutResult?.tubeMap?.coarse,n=e.layoutResult?.tubeMap?.layout;return t&&n?$n(t.graph,n,t.deviations):[]},get tubeMapReferenceNodes(){let t=e.layoutResult;return t?.tubeMap&&!t.referenceAxis&&e.drawnGraph?Wn(e.drawnGraph,t.tubeMap.layout):void 0}})).views(e=>({get tubeMapGenes(){let t=e.tubeMapReference;return e.showGenes&&!e.host&&t&&e.backboneGenes?Un(t,e.backboneGenes):[]},get referenceStripApplies(){let{host:t,layoutResult:n}=e;return!!t?.initialized&&!!n&&!n.tubeMap&&!e.hostPlacesX&&e.chosenLayoutMode!=="walkrows"}})).views(e=>({get referenceStripBlocks(){let{graph:t}=e;return e.showReferenceStrip&&e.referenceStripApplies&&t?En(t,{colorScheme:e.effectiveColorScheme,referenceRamp:e.referenceRamp,walkNodes:e.walkLift?.nodeIds}):[]},get referenceStripFrame(){let{host:t,graphRegion:n}=e;return t?.initialized&&n?De(t,n):void 0}})).views(e=>({get referenceStripShown(){return e.referenceStripBlocks.length>0&&e.referenceStripFrame!==void 0},get referenceStripOverhangs(){let t=e.referenceStripFrame;if(!t||e.referenceStripBlocks.length===0)return!1;let{left:n,right:r}=Fn(e.referenceStripBlocks,t,e.paneWidth);return n>0||r>0}})).views(e=>({get referenceStripLit(){if(!e.referenceStripShown)return;let t=o=>({x:o.x*e.scaleX+e.translateX,y:o.y*e.scaleY+e.translateY}),n=e.hoveredNode===null?e.hoveredBubble:null;if(n){let o=e.bubbleHalos.find(i=>kn(i.bubble,n));return{start:n.start,end:n.end,anchor:o?t(o.labelAt):void 0}}let r=e.hoveredNode??e.selectedNode,a=r===null?void 0:e.nodeSpan(r);return a&&r!==null?{...a,anchor:Dn(e.nodePositions?.[r],t)}:void 0},referenceStripNodeAt(t,n){let r=e.referenceStripFrame;return e.referenceStripShown&&r?Vn(e.referenceStripBlocks,r,t,n):void 0},get referenceStripZonePx(){return e.referenceStripShown?Bn:0}})).views(e=>({get paneCeiling(){return Math.max(Pt,e.paneHeight??Di)},get fitPadTop(){let t=qn(e.tubeMapGenes);return D+Math.max(0,t-1)*Kn+e.referenceStripZonePx},get minFitScale(){let t=e.layoutBounds,n=e.layoutResult,r=n?.tubeMap?.layout.tracks[0]?.width;return t&&t.h>0&&r&&!n.referenceAxis?Math.min(Hi/r,(this.paneCeiling-this.fitPadTop-D)/t.h):0},get canvasHeight(){let t=e.layoutBounds,n=e.paneWidth-D*2,r=this.paneCeiling;return t?e.pixelRows?Math.min(r,Math.max(Pt,t.h+this.fitPadTop+D)):t.w>0&&n>0?Math.min(r,Math.max(Pt,t.h*Math.max(n/t.w,this.minFitScale)+this.fitPadTop+D)):r:r},get fittedTransform(){let t=e.layoutBounds;return t?$r(t,e.paneWidth,this.canvasHeight,e.pixelRows,{minScale:this.minFitScale,padLeft:e.fitPadLeft,padTop:this.fitPadTop}):void 0}})).views(e=>({get overlayLabels(){return Pn(e)},get tubeMapFrame(){let t=e.layoutResult?.tubeMap;return t?qr(t,{scaleX:e.scaleX,translateX:e.translateX,scaleY:e.scaleY,translateY:e.translateY,usableHeight:e.canvasHeight-e.fitPadTop-D}):void 0}})).views(e=>({get tubeMapRulerBoxes(){let t=e.tubeMapReference;return t&&!e.hostPlacesX?On(t):void 0},get connectorZoneBottom(){let t=e.tubeMapPicture,n=e.tubeMapFrame;return t&&n?n.y(t.bounds.minY)-2:0},get tubeMapConnectors(){let t=e.tubeMapReferenceNodes,n=e.tubeMapFrame,{host:r,graphRegion:a}=e,o=t&&n&&r?.initialized&&a?De(r,a):void 0;return t&&n&&o?_n(t,i=>i*o.scale+o.translateX,n.x,e.paneWidth):[]}})).views(e=>({get tubeMapKeys(){let t=e.layoutResult,n=t?.tubeMap?.layout.reads??[],r=e.tubeMapPicture,a=e.tubeMapFrame,o=r&&a&&Xn(a.yScale)?r.mismatches.filter(i=>Yn(i,{x:a.x,width:e.paneWidth})):[];return{logWidths:t?.tubeMap!==void 0&&!t.referenceAxis,foldBp:e.tubeMapDeviations.length>0?e.tubeMapFold:void 0,forwardReads:n.some(i=>!i.is_reverse),reverseReads:n.some(i=>i.is_reverse),mismatches:new Set(o.map(i=>i.kind))}},tubeMapNodeAt(t,n){let r=e.layoutResult?.tubeMap,a=e.tubeMapFrame;return(r&&a?Zr(r,a,t,n):null)??jn(e.tubeMapConnectors,e.connectorZoneBottom,t,n)??null}})).actions(e=>({setError(t){e.error=t,e.isLoading=!1,e.statusMessage=""},finishLoading(){e.isLoading=!1,e.statusMessage=""},setStatusMessage(t){e.statusMessage=t},setFetchMs(t){e.lastFetchMs=t},setLayoutMs(t){e.lastLayoutMs=t},setGeometryMetrics(t,n,r){e.lastGeometryMs=t,e.lastGeometryStrokeCount=n,e.builtViewport={...r,viewportDirty:e.viewportDirty},e.geometryVersion++},markPainted(){e.paintedViewport=e.builtViewport},setLayoutQuality(t){e.layoutQuality=t},setLinearLayout(t){e.linearLayout=t},setLayoutMode(t){e.layoutMode=t},setReferencePath(t){e.referencePath=t;let n=e.graph;if(n?.anchoredBy==="paths"){let r=tt(n,t);Ki(n,r),e.graph=r}},setDrawPaths(t){e.drawPaths=t},setShowPerf(t){e.showPerf=t},setColorScheme(t){e.colorScheme=t},setBubbleSpread(t){e.bubbleSpread=t},setNodeWidth(t){e.nodeWidth=t},setShowBubbles(t){e.showBubbles=t},setShowDeletionEdges(t){e.showDeletionEdges=t},setShowGenes(t){e.showGenes=t},setShowReferenceStrip(t){e.showReferenceStrip=t},setTubeMapFold(t){e.tubeMapFold=t},setGeneTrackId(t){e.geneTrackId=t},setRepeatTrackId(t){e.repeatTrackId=t},setRepeatKey(t){e.repeatKey=t},setWalkLayers(t){e.walkLayers=t},liftWalks(t){let n=new Map(e.walkLayers.map(r=>[r.walk,r]));e.walkLayers=t.map(r=>n.get(r)??{walk:r})},toggleWalk(t){let n=e.walkLayers;e.walkLayers=n.some(r=>r.walk===t)?n.filter(r=>r.walk!==t):[...n,{walk:t}]},setWalkColor(t,n){e.walkLayers=e.walkLayers.map(r=>r.walk===t?{...r,color:{...r.color,...n}}:r)},setPaneHeight(t){e.paneHeight=t},setWalkRowSamples(t){e.walkRowSamples=t},pairWithLinearView(t){let n=e.connectedViewId;n!==void 0&&fe([...(0,A.getSession)(e).views]).some(a=>a.id===n)||(e.connectedViewId=t)},setHoveredNode(t){e.hoveredNode=t},setHoveredBubble(t){e.hoveredBubble=t},setPointerInPane(t){e.pointerInPane=t},setLegendSize(t){e.legendSize=t},setHoveredEdge(t){e.hoveredEdge=t},setSelectedNode(t){e.selectedNode=t},setDraggingNode(t){e.draggingNode=t},setPanning(t){e.isPanning=t},stopDragging(){e.draggingNode=null,e.isPanning=!1},clearInteractionState(){e.hoveredNode=null,e.hoveredBubble=null,e.hoveredEdge=null,e.selectedNode=null,e.draggingNode=null,e.isPanning=!1},showNodeDetails(t){let n=e.nodeById?.get(t),r=e.nodeById,a=e.nodeNeighbors;if(n&&r&&a){let o=(0,A.getSession)(e),i=e.graphRegion,s=i?Re({nodeId:t,nodeById:r,neighbors:a}):void 0;(0,A.isSessionModelWithWidgets)(o)&&o.showWidget(o.addWidget("BaseFeatureWidget","baseFeature",{featureData:{id:n.id,name:n.name,length:n.length,depth:n.depth,rank:n.stable?.rank,stableName:n.stable?.refName,contributingAssembly:Ie(n)?.sample,contributingHaplotype:Ie(n)?.haplotype,carriedBy:n.samples?.join(", "),...i&&s?{refName:i.refName,assemblyName:i.assemblyName,start:s.start,end:s.end}:{}}}))}},setTransform(t,n,r){let{host:a}=e;e.viewportOwner==="host"&&a?a.horizontalScroll(e.translateX-n):(e.viewportOwner="user",e.scale=he(t),e.translateX=n),e.translateY=r},zoom(t,n,r){let{host:a}=e;if(e.viewportOwner==="host"&&a){a.zoomTo(a.bpPerPx/t,n);return}e.viewportOwner="user";let o=to(e,t,n,r,e.pixelRows);e.scale=o.scale,e.translateX=o.translateX,e.translateY=o.translateY},setViewportDirty(){e.viewportRebuildPending=!1,e.viewportDirty++},setPositionsDirty(){e.positionsVersion++},zoomToFit(){if(e.viewportOwner==="host"){let n=e.layoutBounds,r=e.canvasHeight-D*2;n&&r>0&&(e.translateY=wt(n,r,e.scaleY));return}let t=e.fittedTransform;t&&(e.scale=t.scale,e.translateX=t.translateX,e.translateY=t.translateY)},clearPerfMetrics(){e.lastFetchMs=void 0,e.lastLayoutMs=void 0,e.lastGeometryMs=void 0,e.lastGeometryStrokeCount=void 0,e.builtViewport=void 0}})).actions(e=>({hostTransform(t,n){let r=e.viewportOwner!=="host";r&&(e.viewportOwner="host"),e.scale=t,e.translateX=n,r&&e.zoomToFit()},releaseHost(){e.viewportOwner==="host"&&(e.xIsReferenceBp?e.viewportOwner="user":(e.viewportOwner="fit",e.zoomToFit()))}})).actions(e=>{function t(){clearTimeout(e.viewportDirtyTimer),e.viewportRebuildPending=!0,e.viewportDirtyTimer=setTimeout(()=>{(0,w.isAlive)(e)&&e.setViewportDirty()},ji)}function n(){cancelAnimationFrame(e.positionsDirtyFrame),e.positionsDirtyFrame=requestAnimationFrame(()=>{(0,w.isAlive)(e)&&e.setPositionsDirty()})}return{moveNode(r,a,o){let i=e.layoutResult?.nodePositions;if(i?.[r]){for(let s of i[r])s.x+=a,s.y+=o;n()}},scheduleViewportDirty:t}}).actions(e=>{let t;function n(m){let{rpcManager:l}=(0,A.getSession)(e);return l.call((0,A.getRpcSessionId)(e),"GraphComputeLayout",{...m,signal:t?.signal,statusCallback:x=>{e.setStatusMessage((0,A.statusMessageText)(x)??"")}})}function r(m){return _r(m,{quality:e.layoutQuality,linearLayout:e.linearLayout,bubbleSpread:e.bubbleSpread})}function*a(m){let l=performance.now(),x=vo.has(e.chosenLayoutMode),M=e.graphRegion,L=x&&M?Er(m,M):m,h=x&&e.tubeMapFold>0&&!L.reads?Yr(L,e.tubeMapFold):void 0,R=_(e.chosenLayoutMode).run(h?.graph??L,e.graphRegion,e.host?e.layoutResult?.sampleRows:void 0);if(R)return{result:h&&R.tubeMap?{...R,tubeMap:{...R.tubeMap,coarse:h}}:R,duration:performance.now()-l};let T=Ui(m),N=r(m),v=T.get(N);if(v)return{result:v,duration:performance.now()-l};let C=yield jr(m,{quality:e.layoutQuality,linearLayout:e.linearLayout,bubbleSpread:e.bubbleSpread},n);return qi(T,N,C.result),C}let o=0;function*i(m){let l=++o,x=()=>e.graph===m&&l===o,M=t?.signal,L;try{L=yield*a(m)}catch(R){if(!x()||M?.aborted)return!1;throw R}let h=x();return h&&(e.layoutResult=L.result,e.setLayoutMs(L.duration)),h}function s(m,l){let x=m.anchorPaths;return m.anchoredBy==="paths"&&x?(tn(m,e.assemblySpellings(l.assemblyName))??pn(x,l.assemblyName))?.name:void 0}function*u(m,l,x,M=!1,L){let h=t?.signal;e.setStatusMessage("Parsing GFA");let R=Wr(m,l,{referencePath:e.referencePath||x?.assemblyName,maxNodes:e.maxGraphNodes}),T=x?s(R,x):void 0,N=!e.referencePath&&T!==void 0&&T!==R.referencePath?tt(R,T):R;if(L){e.setStatusMessage("Reading alignments");try{let{records:C,total:U}=yield L(N);N.reads=C,e.readsShown={shown:C.length,total:U}}catch(C){if(h?.aborted)return;console.warn("[GraphGenomeView] no reads for this graph",C),e.readsShown=void 0}if(h?.aborted)return}else e.readsShown=void 0;let v=M?e.selectedNode:null;e.graph=N,e.graphRegion=x,e.loadedReferencePath=T,e.indexBubbles=void 0,e.geneFeatures=void 0,e.repeatArrays=void 0,e.popStack=[],e.clearInteractionState(),v!==null&&e.nodeById?.has(v)&&(e.selectedNode=v),e.setStatusMessage("Computing layout"),yield*i(N)}let d=0;function f(){let m=++d;return t?.abort(),t=new AbortController,e.loadCanceled=!1,{isLive:()=>m===d,signal:t.signal}}function*g(m,l,x){let M=Wi(m);if(!(m.type!=="RgfaTabixAdapter"||M===void 0))try{let L=yield(0,A.getSession)(e).rpcManager.call((0,A.getRpcSessionId)(e),"CoreGetFeatures",{adapterConfig:{type:"MinigraphBubbleAdapter",uri:`${M}.bubbles.bed.gz`,baseUri:m.baseUri,assemblyNameToPanSN:m.assemblyNameToPanSN},regions:[l]});x()&&(e.indexBubbles=L.map(h=>({refName:l.refName,start:h.get("start"),end:h.get("end"),segmentCount:h.get("segmentCount"),pathCount:h.get("pathCount")??0,inversion:h.get("inversion"),shortestAlleleLength:h.get("shortestAlleleLength"),longestAlleleLength:h.get("longestAlleleLength"),segments:h.get("segments"),shortestAllele:void 0,longestAllele:void 0})))}catch(L){console.warn("[GraphGenomeView] no bubble index for this graph",L)}}function*p(m,l,x){let M=(0,A.getSession)(e),L=m?M.tracks.find(h=>h.trackId===m):void 0;if(L)try{return yield M.rpcManager.call((0,A.getRpcSessionId)(e),"CoreGetFeatures",{adapterConfig:(0,te.readConfObject)(L,"adapter"),regions:[l]})}catch(h){console.warn(`[GraphGenomeView] no ${x} for this graph`,h);return}}function*c(m,l){let x=yield*p(e.geneTrack?.trackId,m,"genes");x&&l()&&(e.geneFeatures=co(x))}function*y(m,l){let x=yield*p(e.repeatTrack?.trackId,m,"repeats");x&&l()&&(e.repeatArrays=yo(x))}function*k(m,l,x){let{isLive:M,signal:L}=f();e.isLoading=!0,e.error=void 0;try{let h=typeof l=="string"?l:yield l(L);M()&&(yield*u(h,m,x))}catch(h){M()&&(console.error("[GraphGenomeView.loadWholeGFA]",h),e.error=h)}finally{M()&&e.finishLoading()}return M()}function b(){t?.abort(),t=void 0,d++,o++}return{clearGraph(){b(),e.graph=void 0,e.graphRegion=void 0,e.loadedReferencePath=void 0,e.layoutResult=void 0,e.indexBubbles=void 0,e.geneFeatures=void 0,e.repeatArrays=void 0,e.popStack=[],e.error=void 0,e.isLoading=!1,e.loadCanceled=!1,e.statusMessage="",e.clearInteractionState(),e.clearPerfMetrics()},stopLoad(){b(),e.isLoading=!1,e.statusMessage="",e.loadCanceled=!0},beforeDestroy(){b()},loadGFA:(0,w.flow)(function*(m,l="Imported GFA"){yield*k(l,m)}),loadGFAFromLocation:(0,w.flow)(function*(m,l){e.setStatusMessage("Fetching GFA");let x=yield*k("uri"in m?m.uri.split("/").pop()??"GFA":"GFA",M=>(0,Vo.openLocation)(m).readFile({encoding:"utf8",signal:M}),l);l&&x&&e.graph&&(yield*y(l,()=>e.graphRegion===l))}),cutSubgraph:(0,w.flow)(function*(m,l,x={}){let{isLive:M,signal:L}=f();e.isLoading=!0,e.error=void 0,e.setStatusMessage("Fetching subgraph");try{let h=performance.now(),R=yield(0,A.getSession)(e).rpcManager.call((0,A.getRpcSessionId)(e),"GetSubgraph",{adapterConfig:m,region:l,opts:x,signal:L});if(!M())return;if(e.setFetchMs(performance.now()-h),!R)throw new Error("Adapter returned no GFA \u2014 region may be outside indexed data or the adapter does not implement getSubgraph");if(yield*u(R,ce(l),l,!0,yr(m)?T=>(0,A.getSession)(e).rpcManager.call((0,A.getRpcSessionId)(e),"GetGraphReads",{adapterConfig:m,nodeNames:T.nodes.map(N=>N.name),signal:L}):void 0),!M())return;e.setStatusMessage("Reading annotations"),yield Promise.all([x.tier==="coarse"?void 0:(0,w.flow)(g)(m,l,M),(0,w.flow)(c)(l,M),(0,w.flow)(y)(l,M)])}catch(h){M()&&(console.error("[GraphGenomeView.cutSubgraph]",h),e.error=h)}finally{M()&&e.finishLoading()}}),reloadRepeats:(0,w.flow)(function*(){let m=e.graphRegion,l=e.repeatTrack?.trackId;m&&(yield*y(m,()=>e.graphRegion===m&&e.repeatTrack?.trackId===l))}),reloadGenes:(0,w.flow)(function*(){let m=e.graphRegion,l=e.geneTrack?.trackId;m&&(yield*c(m,()=>e.graphRegion===m&&e.geneTrack?.trackId===l))}),popBubble:(0,w.flow)(function*(m){let l=e.graph;if(!l)return;let x=Cr(l,Ae(m));if(x.nodes.length===0){(0,A.getSession)(e).notify("None of the segments of this bubble are in the cut; widen the graph context to open it","info");return}let{isLive:M}=f();e.popStack=[...e.popStack,{graph:l,layoutMode:e.chosenLayoutMode,label:l.name,indexBubbles:e.indexBubbles}],e.indexBubbles=void 0;let L=`${Mn[Te(m,e.repeatArrays).kind]} at ${m.refName}:${m.start.toLocaleString()}`;e.graph={...x,name:L},e.clearInteractionState(),e.viewportOwner="fit",e.isLoading=!0;try{(yield*i(e.graph))&&e.finishLoading()}catch(h){M()&&(e.error=h,e.finishLoading())}}),unpopBubble:(0,w.flow)(function*(){let m=e.poppedFrom;if(m){e.popStack=e.popStack.slice(0,-1),e.graph=m.graph,e.layoutMode=m.layoutMode,e.indexBubbles=m.indexBubbles,e.clearInteractionState(),e.viewportOwner="fit",e.isLoading=!0;try{(yield*i(m.graph))&&e.finishLoading()}catch(l){e.error=l,e.finishLoading()}}}),recomputeLayout:(0,w.flow)(function*(){let m=e.graph;if(m){e.isLoading=!0,e.setStatusMessage("Computing layout");try{(yield*i(m))&&e.finishLoading()}catch(l){console.error("[GraphGenomeView.recomputeLayout]",l),e.error=l,e.finishLoading()}}})}}).actions(e=>({startRenderingBackend(t){if(!e.autorunsInstalled){(0,w.addDisposer)(e,(0,B.autorun)(()=>{e.fittedTransform&&(0,B.untracked)(()=>e.viewportOwner==="fit")&&e.zoomToFit()})),(0,w.addDisposer)(e,(0,B.autorun)(()=>{let r=wo((0,A.getSession)(e).hovered);(0,B.untracked)(()=>{let a=e.graphRegion,o=e.graph;a&&o&&!e.pointerInPane&&e.setHoveredNode(r&&ko(r,a)?xo({hover:r,nodes:o.nodes}):null)})})),(0,w.addDisposer)(e,(0,B.reaction)(()=>`${e.scale}-${e.translateX}-${e.translateY}`,()=>{e.setHoveredNode(null),e.setHoveredBubble(null),e.setHoveredEdge(null)},{name:"GraphClearHoverOnViewportChange"}));let n=!0;(0,w.addDisposer)(e,(0,B.autorun)(()=>{let{scale:r}=e,a=It(e);if(n){n=!1;return}let o=(0,B.untracked)(()=>e.builtViewport);o?.scale===r&&eo(o.bounds,a)||e.scheduleViewportDirty()})),(0,w.addDisposer)(e,(0,B.autorun)(()=>{let r=e.currentRenderingBackend,a=e.hoveredNode,o=e.hoveredEdge,i=e.selectedNode;if(we(e.geometryVersion),r){let s=new Map;i!==null&&s.set(i,_i),a!==null&&a!==i&&s.set(a,Bo),r.setNodeHighlights(s),r.setEdgeHighlight(o,Bo),e.renderNow()}}))}e.attachRenderingBackend(t,()=>({upload:n=>{n.resize(e.paneWidth,e.canvasHeight);let r=e.nodeById;if(e.layoutResult?.tubeMap)return we(e.viewportDirty),n.uploadGeometry(zi),e.setGeometryMetrics(0,0,{scale:(0,B.untracked)(()=>e.scale),bounds:(0,B.untracked)(()=>It(e))}),!0;if(e.nodePositions&&e.graph&&r){we(e.viewportDirty,e.positionsVersion);let a=performance.now(),o=(0,B.untracked)(()=>Qr(It(e),$i)),i=Cn({nodePositions:e.nodePositions,graph:e.graph,nodeById:r,colorScheme:e.effectiveColorScheme,contigThickness:e.contigThickness,connectorThickness:e.connectorThickness,drawPaths:e.effectiveDrawPaths,nodeWidth:e.nodeWidth,highlight:e.walkLift,axis:(0,B.untracked)(()=>e.axisScale),linearLayout:e.linearLayout,viewportBounds:o,referenceRamp:e.referenceRamp,deletions:e.deletionEdgeIndexes,hiddenEdges:e.hiddenEdgeIndexes,version:e.positionsVersion});return n.uploadGeometry(i),e.setGeometryMetrics(performance.now()-a,i.nodeStrokes.length,{scale:(0,B.untracked)(()=>e.scale),bounds:o}),!0}return!1},render:n=>{if(!e.nodePositions)return!1;let r=(0,Ho.getDpr)();return n.updateTransform({scaleX:e.scaleX*r,scaleY:e.scaleY*r,translateX:e.translateX*r,translateY:e.translateY*r,dpr:r}),n.render(e.darkMode?[.12,.12,.12,1]:[1,1,1,1]),e.markPainted(),!0}}))}})).actions(e=>({switchLayout(t){return e.setLayoutMode(t),e.recomputeLayout()},cancelLoad(){e.canCancelLoad&&(e.stopLoad(),e.graph=void 0)},retryLoad(){},afterAttach(){e.isDefaultViewport||(e.viewportOwner="user")}})).actions(e=>({showInLinearView(t){let n=(0,A.getSession)(e),r=t.assembly===e.graphRegion?.assemblyName,a=Go({session:n,location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId,tracks:No({session:n,assemblyName:t.assembly,first:r?e.sourceTrackId:void 0})});r&&e.pairWithLinearView(a)},highlightInLinearView(t){To({session:(0,A.getSession)(e),location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId})},showSyntenyView(t){Ao({session:(0,A.getSession)(e),contributors:e.launchableAssemblies,trackId:t,graphTrackId:e.sourceTrackId})}})).views(e=>({get syntenyLaunchTracks(){let t=e.launchableAssemblies.map(n=>n.sample);return t.length>=2?Io((0,A.getSession)(e),t):[]}})).views(e=>({graphMenuItems(){let t=e.walkChoices;return[{label:"Layout",subMenu:bn.map(n=>({type:"radio",label:n.label,checked:e.chosenLayoutMode===n.value,disabled:e.graph?!n.available(e.graph):!1,onClick:()=>{e.switchLayout(n.value)}}))},{label:"Color",subMenu:Rn.map(n=>({type:"radio",label:n.label,checked:e.chosenColorScheme===n.value,onClick:()=>{e.setColorScheme(n.value)}}))},...t.length>0?[{label:"Walk",subMenu:[{label:"None",onClick:()=>{e.setWalkLayers([])}},...t.map(n=>({type:"checkbox",label:n.label,checked:e.walkLayers.some(r=>r.walk===n.name),onClick:()=>{e.toggleWalk(n.name)}})),...(e.walkLift?.walks??[]).map(n=>({label:`Colour ${t.find(r=>r.name===n.name)?.label??n.name}`,subMenu:[{type:"subHeader",label:"Colour by"},...Zn.map(r=>({type:"radio",label:r.label,checked:n.encoding.field===r.value,onClick:()=>{e.setWalkColor(n.name,{field:r.value})}})),{type:"subHeader",label:"Palette"},...Jn.map(r=>({type:"radio",label:r.label,checked:n.encoding.scheme===r.value,onClick:()=>{e.setWalkColor(n.name,{scheme:r.value})}}))]}))]}]:[],...vo.has(e.chosenLayoutMode)?[{label:"Fold variants",subMenu:Oi.map(({bp:n,label:r})=>({type:"radio",label:r,checked:e.tubeMapFold===n,disabled:n>0&&e.graph?.reads!==void 0,onClick:()=>{e.setTubeMapFold(n),e.recomputeLayout()}}))}]:[],...e.chosenLayoutMode==="walkrows"&&e.repeatChoices.length>0?[{label:"Repeat",subMenu:[{type:"radio",label:"Whole window",checked:e.repeatKey==="",onClick:()=>{e.setRepeatKey("")}},...e.repeatChoices.map(({key:n,name:r,unit:a})=>({type:"radio",label:`${r} \xB7 ${a.toLocaleString()} bp unit`,checked:e.repeatKey===n,onClick:()=>{e.setRepeatKey(n)}}))]}]:[],...e.hostPlacesX?[]:[{label:"Zoom in",onClick:()=>{e.zoom(1.5,e.paneWidth/2,e.canvasHeight/2)}},{label:"Zoom out",onClick:()=>{e.zoom(1/1.5,e.paneWidth/2,e.canvasHeight/2)}},{label:"Zoom to fit",onClick:()=>{e.zoomToFit()}}],{type:"checkbox",label:"Mark bubbles",checked:e.showBubbles,onClick:()=>{e.setShowBubbles(!e.showBubbles)}},{type:"checkbox",label:"Show deletion edges",checked:e.showDeletionEdges,onClick:()=>{e.setShowDeletionEdges(!e.showDeletionEdges)}},{type:"checkbox",label:"Genes on the backbone",checked:e.showGenes,onClick:()=>{e.setShowGenes(!e.showGenes)}},...e.referenceStripApplies?[{type:"checkbox",label:"Reference strip at bp",checked:e.showReferenceStrip,onClick:()=>{e.setShowReferenceStrip(!e.showReferenceStrip)}}]:[]]},launchMenuItems(){let t=[];for(let n of ir({contributors:e.launchableAssemblies,syntenyTracks:e.syntenyLaunchTracks,onShowLinear:r=>{e.showInLinearView(r)},onShowSynteny:r=>{e.showSyntenyView(r)}}))(0,Fo.pushLaunchViewMenuItem)(t,n);return t}}))}var vt=S(j(),1);function Oo(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}function Wo(e){let t=(0,vt.readConfObject)(e,"assemblyNames"),n=Oo(t)?t.slice(1):[];return n.length>0?n:void 0}function Ue(e){let t=(0,vt.readConfObject)(e,"assemblyNames");return Oo(t)?t[0]:void 0}function Ke(e,t){return e===void 0||e===t?void 0:`The graph is cut on its reference, ${e}: open it from a view of ${e}`}function Ct(){return E.types.compose("GraphGenomeView",jo.BaseViewModel,Ye(),E.types.model({type:E.types.literal("GraphGenomeView"),gfaLocation:E.types.maybe(E.types.frozen()),loadedRegion:E.types.maybe(E.types.frozen()),loadedTrackId:E.types.optional(E.types.string,""),subgraphContext:E.types.optional(E.types.number,1),subgraphHaplotypes:E.types.maybe(E.types.frozen()),maxRegionBp:E.types.optional(E.types.number,Xe)})).views(e=>({get rpcSessionId(){return e.id},get paneWidth(){return e.width},get sourceTrack(){return e.loadedTrackId?(0,$o.getSession)(e).tracks.find(t=>t.trackId===e.loadedTrackId):void 0},get canRetryLoad(){return e.gfaLocation!==void 0||e.loadedTrackId!==""&&e.loadedRegion!==void 0}})).views(e=>({get hasPendingSource(){return e.canRetryLoad&&!e.graph&&!e.loadCanceled},menuItems(){return e.launchMenuItems()}})).actions(e=>{let t=e.clearGraph;return{clearGraph(){t(),e.gfaLocation=void 0,e.loadedRegion=void 0,e.loadedTrackId=""},load(){let n=e.loadedRegion;if(e.gfaLocation)return e.loadGFAFromLocation(e.gfaLocation,n);if(!e.loadedTrackId||!n)return;let r=e.sourceTrack,a=n.end-n.start,o=r?Ke(Ue(r),n.assemblyName):void 0;if(!r)e.setError(new Error(`The track this graph was cut from, "${e.loadedTrackId}", is not in this session`));else if(o)e.setError(new Error(o));else if(a>e.maxRegionBp)e.setError(new Error(`Region too large (${ne(a)}) \u2014 zoom in to view graph (max ${ne(e.maxRegionBp)})`));else return e.cutSubgraph((0,_o.readConfObject)(r,"adapter"),n,{hops:e.subgraphContext,haplotypes:e.subgraphHaplotypes,..._(e.chosenLayoutMode).wholeWalks?{snarls:"overlapping"}:{}})}}}).actions(e=>({retryLoad(){e.load()},switchLayout(t){let n=_(e.chosenLayoutMode);return e.setLayoutMode(t),e.loadedTrackId&&_(t).wholeWalks!==n.wholeWalks?e.load():e.recomputeLayout()},afterAttach(){e.graph||e.load()}}))}var Zi=(0,Yo.defineLaunchKeys)()({});function Bt(e){e.addViewType(()=>new Xo.default({name:"GraphGenomeView",displayName:"Graph genome view",stateModel:Ct(),launchKeys:Zi,ReactComponent:(0,zo.lazy)(()=>import("./chunks/GraphGenomeView-CLUMXH4K.js"))}))}var Uo=S(j(),1),re=S(J(),1),Ji=["MultiWaySyntenyDisplay","LinearSyntenyDisplay","DotplotDisplay","ChordSyntenyDisplay"];function Qi(e){let t=e.getElementTypesInGroup("display"),n=a=>t.find(o=>o.name===a),r=a=>a&&Object.assign(Object.create(a),{adapterCapabilities:["headerLanes"]});return[n("LinearGraphDisplay"),n("LinearBasicDisplay"),...Ji.map(a=>r(n(a)))].filter(a=>a!==void 0)}function Et(e){e.addTrackType(()=>{let t=(0,Uo.ConfigurationSchema)("GraphTrack",{},{baseConfiguration:(0,re.createBaseTrackConfig)(e),explicitIdentifier:"trackId"}),n=new re.TrackType({name:"GraphTrack",displayName:"Pangenome graph track",configSchema:t,stateModel:(0,re.createBaseTrackModel)(e,"GraphTrack",t)});for(let r of Qi(e))n.addDisplayType(r);return n})}function Ft(e){e.addToExtensionPoint("LaunchView-GraphGenomeView",t=>{let{session:n,...r}=t;return n.addView("GraphGenomeView",r),t})}var pa=S(Se(),1),ma=S(qo(),1);var Qo=S(j(),1),ea=S(Jo(),1),Vt=S(X(),1);function ta(){return(0,Qo.ConfigurationSchema)("LinearGraphDisplay",{layoutMode:{type:"stringEnum",model:Vt.types.enumeration("LayoutMode",Le),defaultValue:"auto"},colorScheme:{type:"stringEnum",model:Vt.types.enumeration("ColorScheme",Pe),defaultValue:"auto"},...(0,ea.trackHeightConfigSchemaFields)({defaultHeight:300,height:"the height of the track the graph is drawn in"})},{explicitlyTyped:!0,explicitIdentifier:"displayId"})}var ia=S(Se(),1);var ke=S(j(),1),sa=S(J(),1),da=S(dn(),1),Dt=S(se(),1),ca=S(ra(),1),I=S(X(),1),Ze=S(aa(),1);var qe=S(sn(),1);var es=(0,ia.lazy)(()=>import("./chunks/GraphTrackSettingsDialog-QF5OMTCH.js"));function ua(e){return I.types.compose("LinearGraphDisplay",sa.BaseDisplay,(0,ca.default)(),Ye(),I.types.model({type:I.types.literal("LinearGraphDisplay"),configuration:(0,ke.ConfigurationReference)(e),pane:I.types.maybe(I.types.frozen()),cutRegion:I.types.maybe(I.types.frozen()),coarseCut:I.types.optional(I.types.boolean,!1),maxRegionBp:I.types.optional(I.types.number,Xe),subgraphContext:I.types.optional(I.types.number,1),subgraphHaplotypes:I.types.maybe(I.types.frozen())})).preProcessSnapshot(t=>{let{pane:n,...r}=t;if(!n)return t;let{type:a,...o}=n;return{...o,...r}}).volatile(()=>({recuts:0,settledWindow:void 0})).views(t=>({get defaultLayoutMode(){return(0,ke.getConf)(t,"layoutMode")},get defaultColorScheme(){return(0,ke.getConf)(t,"colorScheme")},get canvasHeight(){return t.height},get canRetryLoad(){return t.cutRegion!==void 0},get chosenHaplotypes(){return t.subgraphHaplotypes??Wo(t.parentTrack.configuration)},get coarseAboveBpPerPx(){let r=t.adapterConfig.coarse?.aboveBpPerPx;return typeof r=="number"?r:void 0}})).views(t=>({tierAt(n){let r=t.coarseAboveBpPerPx;return r!==void 0&&n>r?"coarse":"fine"},capFor(n){return n==="coarse"?1/0:t.maxRegionBp},get cutTier(){return t.coarseCut&&t.coarseAboveBpPerPx!==void 0?"coarse":"fine"}})).views(t=>({get settledCapBp(){let n=t.settledWindow;return n?t.capFor(t.tierAt(n.bpPerPx)):1/0}})).views(t=>({get regionTooLarge(){let n=t.settledWindow;return n!==void 0&&n.end-n.start>t.settledCapBp},get regionTooLargeReason(){let n=t.settledWindow;return n?`Region too large for a graph cut (${ne(n.end-n.start)}, max ${ne(t.settledCapBp)})`:""},get zoomCanReleaseGate(){return!0},get fetchCanceled(){return t.loadCanceled}})).views(t=>({get displayPhase(){return(0,Ze.computeDisplayStatusPhase)({regionTooLarge:t.regionTooLarge,error:t.error??t.renderError},()=>(0,Ze.computeActivityPhase)({isMinimized:t.isMinimized,fetchInert:!1,viewportEmpty:t.host?.initialized===!0&&t.host.hasVisibleContent===!1,isLoading:t.isLoading||!t.hasGraph,fetchCanceled:t.loadCanceled,awaitingDependentData:!1,rendersCanvas:!0,canvasDrawn:t.painted&&t.geometryPainted},()=>!0,()=>t.host?.effectiveBodyMounted??!0))}})).actions(t=>({setSubgraphContext(n){t.subgraphContext=n},setSubgraphHaplotypes(n){t.subgraphHaplotypes=n},setMaxRegionBp(n){t.maxRegionBp=n},cut(){let n=t.cutRegion;if(!n)return;let r=Ke(Ue(t.parentTrack.configuration),n.assemblyName);if(r){t.clearGraph(),t.setError(new Error(r));return}let a=t.cutTier==="coarse";return t.cutSubgraph(t.adapterConfig,n,{hops:a?0:t.subgraphContext,haplotypes:t.chosenHaplotypes,tier:a?"coarse":void 0,..._(t.chosenLayoutMode).wholeWalks?{snarls:"overlapping"}:{}})}})).actions(t=>({recutAt(n){let r=t.tierAt(n.bpPerPx);return t.coarseCut=r==="coarse",t.cutRegion=St(n,t.capFor(r),_(t.chosenLayoutMode).cutMargins),t.recuts++,t.cut()}})).actions(t=>({settleOn(n){t.settledWindow=n;let r=_(t.chosenLayoutMode).cutMargins;return t.regionTooLarge||!t.loadCanceled&&t.tierAt(n.bpPerPx)===t.cutTier&&mo(t.cutRegion,n,r)?!1:(t.recutAt(n),!0)},switchLayout(n){let r=_(t.chosenLayoutMode);t.setLayoutMode(n);let a=_(n),o=t.host?He(t.host):void 0;return o&&!t.regionTooLarge&&(a.cutMargins!==r.cutMargins||a.wholeWalks!==r.wholeWalks)?t.recutAt(o):t.recomputeLayout()},retryLoad(){t.cut()},reload(){t.cut()},cancelFetchByUser(){t.stopLoad()}})).actions(t=>({forceLoad(){let n=t.settledWindow;n&&(t.setMaxRegionBp(Math.ceil(n.end-n.start)),t.settleOn(n))},afterAttach(){t.cutRegion&&!t.graph&&t.cut(),(0,I.addDisposer)(t,(0,qe.reaction)(()=>t.hostPlacesX,n=>{n||t.releaseHost()},{name:"GraphHostPlacesX"})),(0,I.addDisposer)(t,(0,qe.reaction)(()=>t.hostFrame,n=>{n&&t.hostTransform(n.scale,n.translateX)},{equals:(n,r)=>n?.scale===r?.scale&&n?.translateX===r?.translateX,fireImmediately:!0,name:"GraphHostFrame"})),(0,I.addDisposer)(t,(0,qe.reaction)(()=>t.host?.coarseDynamicBlocks,n=>{let{host:r}=t,a=n&&r?He(r):void 0;a&&t.settleOn(a)},{fireImmediately:!0,name:"GraphHostSettle"}))}})).views(t=>({get graphViewSpec(){let n=t.host?He(t.host):void 0,r=t.sourceTrackId;if(!n||!r||!t.hasGraph||t.coarseCut||t.regionTooLarge)return;let a=Math.floor(n.start),o=Math.ceil(n.end);return{loadedTrackId:r,loadedRegion:{refName:n.refName,assemblyName:n.assemblyName,start:a,end:o},subgraphContext:t.subgraphContext,subgraphHaplotypes:t.chosenHaplotypes,maxRegionBp:Math.max(t.maxRegionBp,o-a),layoutMode:t.chosenLayoutMode,colorScheme:t.chosenColorScheme,referencePath:t.referencePath,geneTrackId:t.geneTrackId,showGenes:t.showGenes,showBubbles:t.showBubbles,showDeletionEdges:t.showDeletionEdges}}})).actions(t=>({openGraphView(){let n=t.graphViewSpec;n&&(0,Dt.getSession)(t).addView("GraphGenomeView",n)}})).views(t=>({trackMenuItems(){let n=t.launchMenuItems();return(0,da.pushLaunchViewMenuItem)(n,{label:"Graph genome view",icon:Be,disabled:!t.graphViewSpec,disabledHelpText:"Zoom in until the track cuts a graph",onClick:()=>{t.openGraphView()}}),[...t.graphMenuItems(),{label:"Settings",icon:sr,onClick:()=>{(0,Dt.getSession)(t).queueDialog(r=>[es,{model:t,open:!0,onClose:r}])}},...n]}}))}function Ht(e){e.addDisplayType(()=>{let t=ta();return Object.assign(new ma.default({name:"LinearGraphDisplay",displayName:"Graph",configSchema:t,stateModel:ua(t),trackType:["GraphTrack","FeatureTrack","SyntenyTrack"],viewType:"LinearGenomeView",ReactComponent:(0,pa.lazy)(()=>import("./chunks/LinearGraphDisplay-4CMVCEM5.js"))}),{adapterCapabilities:["getSubgraph"]})})}var ha=S(Ee(),1);var Ot=S(j(),1),la=S(X(),1);function Wt(e){let{uri:t,baseUri:n,csi:r}=e;return typeof t=="string"?{...e,bubblesLocation:{uri:t,baseUri:n},index:{indexType:r?"CSI":"TBI",location:{uri:`${t}.${r?"csi":"tbi"}`,baseUri:n}}}:e}var ts=(0,Ot.ConfigurationSchema)("MinigraphBubbleAdapter",{bubblesLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.bb.bed.gz",locationType:"UriLocation"}},index:(0,Ot.ConfigurationSchema)("MinigraphBubbleIndex",{indexType:{model:la.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.bb.bed.gz.tbi",locationType:"UriLocation"}}}),assemblyNameToPanSN:{type:"frozen",defaultValue:{}}},{explicitlyTyped:!0,preProcessSnapshot:Wt}),ga=ts;function _t(e){e.addAdapterType(()=>new ha.default({name:"MinigraphBubbleAdapter",displayName:"Minigraph bubble BED adapter",normalizeSnapshot:Wt,configSchema:ga,adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/MinigraphBubbleAdapter-NRDD66AK.js").then(t=>t.default)}))}var ka=S(Ee(),1);var Qe=S(j(),1),ya=S(X(),1);function ba(e,t,n){return{indexType:n?"CSI":"TBI",location:{uri:`${e}.${n?"csi":"tbi"}`,baseUri:t}}}function fa(e){let{uri:t,baseUri:n,csi:r}=e;return typeof t=="string"?{...e,segmentsLocation:{uri:`${t}.segs.bed.gz`,baseUri:n},segmentsIndex:ba(`${t}.segs.bed.gz`,n,r),linksLocation:{uri:`${t}.links.bed.gz`,baseUri:n},linksIndex:ba(`${t}.links.bed.gz`,n,r)}:e}function jt(e){let{coarse:t,baseUri:n}=e;return fa(typeof t=="object"&&t!==null?{...e,coarse:fa({baseUri:n,...t})}:e)}var Je=(e,t)=>(0,Qe.ConfigurationSchema)(e,{indexType:{model:ya.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:t,locationType:"UriLocation"}}}),ns=(0,Qe.ConfigurationSchema)("RgfaTabixCoarseTier",{aboveBpPerPx:{type:"maybeNumber"},segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.tier.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:Je("RgfaCoarseSegmentsIndex","/path/to/graph.tier.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.tier.links.bed.gz",locationType:"UriLocation"}},linksIndex:Je("RgfaCoarseLinksIndex","/path/to/graph.tier.links.bed.gz.tbi")}),rs=(0,Qe.ConfigurationSchema)("RgfaTabixAdapter",{segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:Je("RgfaSegmentsIndex","/path/to/graph.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.links.bed.gz",locationType:"UriLocation"}},linksIndex:Je("RgfaLinksIndex","/path/to/graph.links.bed.gz.tbi"),assemblyNameToPanSN:{type:"frozen",defaultValue:{}},coarse:ns},{explicitlyTyped:!0,preProcessSnapshot:jt}),wa=rs;function $t(e){e.addAdapterType(()=>new ka.default({name:"RgfaTabixAdapter",displayName:"Indexed rGFA adapter",normalizeSnapshot:jt,configSchema:wa,adapterCapabilities:["getSubgraph"],adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/RgfaTabixAdapter-NQEERXXI.js").then(t=>t.default)}))}var os=new Set(["RgfaTabixAdapter","GbzBaseSyntenyAdapter"]);function as(e){return"uri"in e?rn(e.uri).name:"localPath"in e?e.localPath:e.name}function is(e){return as(e).toLowerCase().endsWith(".gbz.db")}function ss(e){let t=e.adapter;return t?.type==="GbzBaseSyntenyAdapter"&&!t.assemblyNames?.length&&Array.isArray(e.assemblyNames)&&e.assemblyNames.length>0?{...e,adapter:{...t,assemblyNames:e.assemblyNames}}:e}function ds(e,t,n){if((!n||n==="GbzBaseSyntenyAdapter")&&is(e))return{type:"GbzBaseSyntenyAdapter",gbzDbLocation:e,...t?{haplotypeIndexLocation:t}:{}};if((!n||n==="RgfaTabixAdapter")&&on(e))return an({choice:"RgfaTabixAdapter",loc:e,indexLoc:t,assembly:"",sample:""})}function zt(e){e.addToExtensionPoint("Core-preProcessTrackConfig",ss),e.addToExtensionPoint("Core-guessAdapterForLocation",t=>(n,r,a)=>ds(n,r,a)??t(n,r,a)),e.addToExtensionPoint("Core-guessTrackTypeForLocation",t=>(n,r)=>os.has(n)?"GraphTrack":t(n,r))}var Ra=S(se(),1),La=S(Fa(),1),Xt=S(Ea(),1),Ga=S(Da(),1);function oe(e){return typeof e=="object"&&e!==null}function xa(e){let t;if(oe(e)){let{refName:n,start:r,end:a,assemblyName:o}=e;typeof n=="string"&&typeof r=="number"&&typeof a=="number"&&(t={refName:n,start:r,end:a,assemblyName:typeof o=="string"?o:void 0})}return t}function cs(e,t,n){let r=e.connectedViewId;return r===void 0||r===t||!n.has(r)}function Sa(e,t){return e.assemblyName===void 0||t===void 0||t.includes(e.assemblyName)}function us(e){return(Array.isArray(e.tracks)?e.tracks:[]).flatMap(n=>oe(n)&&Array.isArray(n.displays)?n.displays.filter(r=>oe(r)&&r.type==="LinearGraphDisplay"):[])}function Ma(e,t,n){let r=[],a=new Set(fe(e).map(o=>oe(o)?o.id:void 0));for(let o of e){if(oe(o)&&o.id===t)for(let i of us(o)){let s=xa(i.hoverHighlight);s&&Sa(s,n)&&r.push({key:typeof i.id=="string"?i.id:"graph-track",region:s})}if(oe(o)&&o.type==="GraphGenomeView"&&cs(o,t,a)){let i=xa(o.hoverHighlight);i&&Sa(i,n)&&r.push({key:typeof o.id=="string"?o.id:"graph",region:i})}}return r}var ae=S(de(),1),ps=(0,Ga.makeStyles)()(e=>({highlight:{height:"100%",position:"absolute",background:(0,La.alpha)(e.palette.primary.main,.25),borderLeft:`2px solid ${e.palette.primary.main}`,borderRight:`2px solid ${e.palette.primary.main}`,pointerEvents:"none",zIndex:10}})),ms=(0,Xt.observer)(function({model:t,region:n}){let{classes:r}=ps(),a=t.getHighlightCoords(n);return a?(0,ae.jsx)("div",{"data-testid":"graph-node-highlight",className:r.highlight,style:{left:a.left,width:a.width}}):null}),ls=(0,Xt.observer)(function({model:t}){let{views:n}=(0,Ra.getSession)(t);return(0,ae.jsx)(ae.Fragment,{children:Ma([...n],t.id,t.assemblyNames).map(({key:r,region:a})=>(0,ae.jsx)(ms,{model:t,region:a},`graph-hover-${r}`))})}),Ta=ls;var Aa=S(de(),1),gs="LinearGenomeView-TracksContainerComponent";function Yt(e){e.contributeToExtensionPoint(gs,({model:t})=>(0,Aa.jsx)(Ta,{model:t},"graphgenomeview-hover-highlight"))}var Na="GraphGenomeView";var Pa="4.0.21";var Ut=class extends Ia.default{constructor(){super(...arguments);this.name=Na;this.version=Pa}install(n){Bt(n),Ht(n),Et(n),Ft(n),Yt(n),$t(n),_t(n),pt(n),lt(n),zt(n),n.addRpcMethod(()=>new me(n)),n.addRpcMethod(()=>new pe(n)),n.addRpcMethod(()=>new ue(n))}configure(n){try{(0,va.isAbstractMenuManager)(n.rootModel)&&n.rootModel.appendToSubMenu(["Add"],{label:"Graph genome view",icon:Be,onClick:r=>{r.addView("GraphGenomeView",{})}})}catch(r){console.warn("[GraphGenomeView] could not add the Add menu entry",r)}}};export{Ut as default};
3
3
  //# sourceMappingURL=jbrowse-plugin-graphgenomeviewer.esm.js.map