loom-browser 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +287 -0
- package/dist/igv.d.ts +667 -0
- package/dist/igv.esm.js +76708 -0
- package/dist/igv.esm.min.js +26 -0
- package/dist/igv.esm.min.js.map +1 -0
- package/dist/igv.js +76716 -0
- package/dist/igv.min.js +26 -0
- package/dist/igv.min.js.map +1 -0
- package/dist/loom.d.ts +667 -0
- package/dist/loom.esm.js +14927 -0
- package/dist/loom.esm.min.js +2 -0
- package/dist/loom.esm.min.js.map +1 -0
- package/dist/loom.js +15114 -0
- package/dist/loom.min.js +2 -0
- package/dist/loom.min.js.map +1 -0
- package/dist/types/agent/index.d.ts +4 -0
- package/dist/types/agent/stateProjection.d.ts +115 -0
- package/dist/types/agent/trackSelector.d.ts +31 -0
- package/dist/types/baseTrackCanvas.d.ts +62 -0
- package/dist/types/bigwig/binaryParser.d.ts +25 -0
- package/dist/types/bigwig/bpTree.d.ts +40 -0
- package/dist/types/bigwig/bwReader.d.ts +69 -0
- package/dist/types/bigwig/chromTree.d.ts +28 -0
- package/dist/types/bigwig/index.d.ts +66 -0
- package/dist/types/bigwig/inflate.d.ts +9 -0
- package/dist/types/bigwig/rangeReader.d.ts +48 -0
- package/dist/types/bigwig/rpTree.d.ts +27 -0
- package/dist/types/canvasProvider.d.ts +36 -0
- package/dist/types/commandDispatcher.d.ts +199 -0
- package/dist/types/contextMenu.d.ts +64 -0
- package/dist/types/contextMenuProvider.d.ts +25 -0
- package/dist/types/data/cachedSequence.d.ts +19 -0
- package/dist/types/data/ucscApi.d.ts +21 -0
- package/dist/types/data/ucscSequence.d.ts +19 -0
- package/dist/types/dataLifecycle.d.ts +16 -0
- package/dist/types/dataSources/bigWigDataSource.d.ts +24 -0
- package/dist/types/dataSources/dataSourceCacheKey.d.ts +9 -0
- package/dist/types/dataSources/dynseqDataSource.d.ts +20 -0
- package/dist/types/dataSources/featureSourceFactory.d.ts +46 -0
- package/dist/types/dataSources/geneDataSource.d.ts +16 -0
- package/dist/types/dataSources/gtxDataSource.d.ts +42 -0
- package/dist/types/dataSources/sequenceDataSource.d.ts +15 -0
- package/dist/types/dataSources/textFeatureSource.d.ts +63 -0
- package/dist/types/decode/bed.d.ts +64 -0
- package/dist/types/decode/bedpe.d.ts +36 -0
- package/dist/types/decode/exonUtils.d.ts +29 -0
- package/dist/types/decode/gff.d.ts +58 -0
- package/dist/types/decode/interact.d.ts +19 -0
- package/dist/types/decode/ucsc.d.ts +56 -0
- package/dist/types/dynseqRenderer.d.ts +37 -0
- package/dist/types/events.d.ts +23 -0
- package/dist/types/export/canvas2svg.d.ts +166 -0
- package/dist/types/export/index.d.ts +2 -0
- package/dist/types/featureCache.d.ts +69 -0
- package/dist/types/formats/featureParser.d.ts +72 -0
- package/dist/types/formats/formatDetection.d.ts +46 -0
- package/dist/types/geneRenderer.d.ts +17 -0
- package/dist/types/geneThemes.d.ts +11 -0
- package/dist/types/geneTrackCanvas.d.ts +46 -0
- package/dist/types/genome/chromAlias.d.ts +46 -0
- package/dist/types/genome/chromSizes.d.ts +53 -0
- package/dist/types/genome/genome.d.ts +51 -0
- package/dist/types/genomeBrowser.d.ts +189 -0
- package/dist/types/gtx/fetchCoordinator.d.ts +34 -0
- package/dist/types/gtx/gtxReader.d.ts +144 -0
- package/dist/types/gtx/index.d.ts +40 -0
- package/dist/types/gtx/zstdWasm.d.ts +22 -0
- package/dist/types/headlessGenomeBrowser.d.ts +450 -0
- package/dist/types/index.d.ts +123 -0
- package/dist/types/intervalTree.d.ts +56 -0
- package/dist/types/io/binaryParser.d.ts +25 -0
- package/dist/types/io/index.d.ts +7 -0
- package/dist/types/io/rangeReader.d.ts +48 -0
- package/dist/types/locusUtils.d.ts +37 -0
- package/dist/types/pack.d.ts +41 -0
- package/dist/types/popupProvider.d.ts +22 -0
- package/dist/types/remoteProtocol.d.ts +79 -0
- package/dist/types/renderTheme.d.ts +72 -0
- package/dist/types/renderThemePresets.d.ts +16 -0
- package/dist/types/roi/index.d.ts +3 -0
- package/dist/types/roi/roiRenderer.d.ts +24 -0
- package/dist/types/roi/roiSet.d.ts +41 -0
- package/dist/types/rulerRenderer.d.ts +14 -0
- package/dist/types/rulerTrackCanvas.d.ts +32 -0
- package/dist/types/sequence/sequenceUtils.d.ts +44 -0
- package/dist/types/session.d.ts +55 -0
- package/dist/types/src/bigwig/index.d.ts +66 -0
- package/dist/types/src/canvasProvider.d.ts +36 -0
- package/dist/types/src/commandDispatcher.d.ts +220 -0
- package/dist/types/src/contextMenu.d.ts +64 -0
- package/dist/types/src/contextMenuProvider.d.ts +25 -0
- package/dist/types/src/data/cachedSequence.d.ts +19 -0
- package/dist/types/src/data/ucscApi.d.ts +21 -0
- package/dist/types/src/data/ucscSequence.d.ts +19 -0
- package/dist/types/src/dataLifecycle.d.ts +16 -0
- package/dist/types/src/dataSources/bigWigDataSource.d.ts +24 -0
- package/dist/types/src/dataSources/dataSourceCacheKey.d.ts +9 -0
- package/dist/types/src/dataSources/featureSourceFactory.d.ts +46 -0
- package/dist/types/src/dataSources/geneDataSource.d.ts +16 -0
- package/dist/types/src/dataSources/gtxDataSource.d.ts +42 -0
- package/dist/types/src/dataSources/sequenceDataSource.d.ts +15 -0
- package/dist/types/src/dataSources/textFeatureSource.d.ts +63 -0
- package/dist/types/src/decode/bed.d.ts +64 -0
- package/dist/types/src/decode/bedpe.d.ts +36 -0
- package/dist/types/src/decode/exonUtils.d.ts +29 -0
- package/dist/types/src/decode/gff.d.ts +58 -0
- package/dist/types/src/decode/interact.d.ts +19 -0
- package/dist/types/src/decode/ucsc.d.ts +56 -0
- package/dist/types/src/events.d.ts +23 -0
- package/dist/types/src/export/canvas2svg.d.ts +166 -0
- package/dist/types/src/export/index.d.ts +2 -0
- package/dist/types/src/featureCache.d.ts +69 -0
- package/dist/types/src/formats/featureParser.d.ts +72 -0
- package/dist/types/src/formats/formatDetection.d.ts +46 -0
- package/dist/types/src/genome/chromAlias.d.ts +46 -0
- package/dist/types/src/genome/chromSizes.d.ts +53 -0
- package/dist/types/src/genome/genome.d.ts +51 -0
- package/dist/types/src/genomeBrowser.d.ts +189 -0
- package/dist/types/src/gtx/fetchCoordinator.d.ts +34 -0
- package/dist/types/src/gtx/gtxReader.d.ts +144 -0
- package/dist/types/src/gtx/index.d.ts +40 -0
- package/dist/types/src/gtx/zstdWasm.d.ts +22 -0
- package/dist/types/src/headlessGenomeBrowser.d.ts +450 -0
- package/dist/types/src/index.d.ts +123 -0
- package/dist/types/src/intervalTree.d.ts +56 -0
- package/dist/types/src/io/binaryParser.d.ts +25 -0
- package/dist/types/src/io/index.d.ts +7 -0
- package/dist/types/src/io/rangeReader.d.ts +48 -0
- package/dist/types/src/locusUtils.d.ts +37 -0
- package/dist/types/src/pack.d.ts +41 -0
- package/dist/types/src/popupProvider.d.ts +22 -0
- package/dist/types/src/remoteProtocol.d.ts +81 -0
- package/dist/types/src/roi/index.d.ts +3 -0
- package/dist/types/src/roi/roiRenderer.d.ts +24 -0
- package/dist/types/src/roi/roiSet.d.ts +41 -0
- package/dist/types/src/sequence/sequenceUtils.d.ts +44 -0
- package/dist/types/src/session.d.ts +55 -0
- package/dist/types/src/stateProjection.d.ts +115 -0
- package/dist/types/src/tabix/index.d.ts +48 -0
- package/dist/types/src/themes/index.d.ts +3 -0
- package/dist/types/src/themes/renderTheme.d.ts +86 -0
- package/dist/types/src/themes/renderThemePresets.d.ts +16 -0
- package/dist/types/src/trackRegistry.d.ts +81 -0
- package/dist/types/src/trackSelector.d.ts +31 -0
- package/dist/types/src/tracks/annotation/annotationRenderer.d.ts +17 -0
- package/dist/types/src/tracks/annotation/annotationThemes.d.ts +11 -0
- package/dist/types/src/tracks/annotation/annotationTrackCanvas.d.ts +58 -0
- package/dist/types/src/tracks/annotation/index.d.ts +4 -0
- package/dist/types/src/tracks/axis/axisRenderer.d.ts +19 -0
- package/dist/types/src/tracks/axis/index.d.ts +1 -0
- package/dist/types/src/tracks/baseTrackCanvas.d.ts +113 -0
- package/dist/types/src/tracks/dynseq/dynseqRenderer.d.ts +38 -0
- package/dist/types/src/tracks/dynseq/index.d.ts +1 -0
- package/dist/types/src/tracks/index.d.ts +7 -0
- package/dist/types/src/tracks/interaction/index.d.ts +4 -0
- package/dist/types/src/tracks/interaction/interactionRenderer.d.ts +52 -0
- package/dist/types/src/tracks/interaction/interactionTrackCanvas.d.ts +54 -0
- package/dist/types/src/tracks/ruler/index.d.ts +3 -0
- package/dist/types/src/tracks/ruler/rulerRenderer.d.ts +25 -0
- package/dist/types/src/tracks/ruler/rulerTrackCanvas.d.ts +43 -0
- package/dist/types/src/tracks/sequence/index.d.ts +5 -0
- package/dist/types/src/tracks/sequence/sequenceRenderer.d.ts +34 -0
- package/dist/types/src/tracks/sequence/sequenceThemes.d.ts +11 -0
- package/dist/types/src/tracks/sequence/sequenceTrackCanvas.d.ts +67 -0
- package/dist/types/src/tracks/wig/index.d.ts +5 -0
- package/dist/types/src/tracks/wig/wigRenderer.d.ts +15 -0
- package/dist/types/src/tracks/wig/wigSummary.d.ts +31 -0
- package/dist/types/src/tracks/wig/wigThemes.d.ts +15 -0
- package/dist/types/src/tracks/wig/wigTrackCanvas.d.ts +82 -0
- package/dist/types/src/types.d.ts +885 -0
- package/dist/types/src/ui/components/LoomBrowserShell.d.ts +52 -0
- package/dist/types/src/ui/components/LoomChromosomeSelect.d.ts +18 -0
- package/dist/types/src/ui/components/LoomContextMenu.d.ts +39 -0
- package/dist/types/src/ui/components/LoomExportControls.d.ts +13 -0
- package/dist/types/src/ui/components/LoomInputDialog.d.ts +27 -0
- package/dist/types/src/ui/components/LoomLocusInput.d.ts +18 -0
- package/dist/types/src/ui/components/LoomNavbar.d.ts +15 -0
- package/dist/types/src/ui/components/LoomPopup.d.ts +32 -0
- package/dist/types/src/ui/components/LoomWindowSize.d.ts +14 -0
- package/dist/types/src/ui/components/LoomZoomControls.d.ts +10 -0
- package/dist/types/src/ui/index.d.ts +21 -0
- package/dist/types/src/ui/themes.d.ts +14 -0
- package/dist/types/src/worker/nodeWorkerProvider.d.ts +28 -0
- package/dist/types/src/worker/taskHandler.d.ts +15 -0
- package/dist/types/src/worker/webWorkerProvider.d.ts +51 -0
- package/dist/types/src/worker/workerScript.d.ts +11 -0
- package/dist/types/src/workerProvider.d.ts +76 -0
- package/dist/types/stateProjection.d.ts +115 -0
- package/dist/types/tabix/bgzBlockLoader.d.ts +60 -0
- package/dist/types/tabix/bgzf.d.ts +43 -0
- package/dist/types/tabix/index.d.ts +48 -0
- package/dist/types/tabix/tabixIndex.d.ts +85 -0
- package/dist/types/tabix/tabixReader.d.ts +60 -0
- package/dist/types/tabix/virtualOffset.d.ts +41 -0
- package/dist/types/test/src/mockCanvasProvider.d.ts +67 -0
- package/dist/types/test/src/testBedDecode.d.ts +1 -0
- package/dist/types/test/src/testCanvas2SVG.d.ts +7 -0
- package/dist/types/test/src/testChromAlias.d.ts +1 -0
- package/dist/types/test/src/testCommandDispatcher.d.ts +1 -0
- package/dist/types/test/src/testData.d.ts +7 -0
- package/dist/types/test/src/testDataLifecycle.d.ts +1 -0
- package/dist/types/test/src/testDataSourceCacheKey.d.ts +1 -0
- package/dist/types/test/src/testDataSources.d.ts +5 -0
- package/dist/types/test/src/testDecodeUcsc.d.ts +1 -0
- package/dist/types/test/src/testEvents.d.ts +1 -0
- package/dist/types/test/src/testFeatureCache.d.ts +1 -0
- package/dist/types/test/src/testFeatureParser.d.ts +1 -0
- package/dist/types/test/src/testFormatDetection.d.ts +1 -0
- package/dist/types/test/src/testGffDecode.d.ts +1 -0
- package/dist/types/test/src/testHeadlessBrowser.d.ts +1 -0
- package/dist/types/test/src/testInteractionDecoder.d.ts +1 -0
- package/dist/types/test/src/testIntervalTree.d.ts +1 -0
- package/dist/types/test/src/testLocusUtils.d.ts +1 -0
- package/dist/types/test/src/testPack.d.ts +1 -0
- package/dist/types/test/src/testROI.d.ts +1 -0
- package/dist/types/test/src/testRemoteProtocol.d.ts +1 -0
- package/dist/types/test/src/testRenderTheme.d.ts +1 -0
- package/dist/types/test/src/testSVGExport.d.ts +5 -0
- package/dist/types/test/src/testSequence.d.ts +1 -0
- package/dist/types/test/src/testSession.d.ts +1 -0
- package/dist/types/test/src/testTrackSelector.d.ts +1 -0
- package/dist/types/test/src/testTrackSerialize.d.ts +1 -0
- package/dist/types/test/src/testWigSummary.d.ts +1 -0
- package/dist/types/test/src/testWorkerDispatch.d.ts +9 -0
- package/dist/types/themes/index.d.ts +3 -0
- package/dist/types/themes/renderTheme.d.ts +86 -0
- package/dist/types/themes/renderThemePresets.d.ts +16 -0
- package/dist/types/trackRegistry.d.ts +81 -0
- package/dist/types/trackSelector.d.ts +31 -0
- package/dist/types/tracks/annotation/annotationRenderer.d.ts +17 -0
- package/dist/types/tracks/annotation/annotationThemes.d.ts +11 -0
- package/dist/types/tracks/annotation/annotationTrackCanvas.d.ts +58 -0
- package/dist/types/tracks/annotation/index.d.ts +4 -0
- package/dist/types/tracks/axis/axisRenderer.d.ts +19 -0
- package/dist/types/tracks/axis/index.d.ts +1 -0
- package/dist/types/tracks/baseTrackCanvas.d.ts +113 -0
- package/dist/types/tracks/dynseq/dynseqRenderer.d.ts +38 -0
- package/dist/types/tracks/dynseq/index.d.ts +1 -0
- package/dist/types/tracks/gene/geneRenderer.d.ts +17 -0
- package/dist/types/tracks/gene/geneThemes.d.ts +11 -0
- package/dist/types/tracks/gene/geneTrackCanvas.d.ts +58 -0
- package/dist/types/tracks/gene/index.d.ts +4 -0
- package/dist/types/tracks/index.d.ts +7 -0
- package/dist/types/tracks/interaction/index.d.ts +4 -0
- package/dist/types/tracks/interaction/interactionRenderer.d.ts +52 -0
- package/dist/types/tracks/interaction/interactionTrackCanvas.d.ts +54 -0
- package/dist/types/tracks/ruler/index.d.ts +3 -0
- package/dist/types/tracks/ruler/rulerRenderer.d.ts +25 -0
- package/dist/types/tracks/ruler/rulerTrackCanvas.d.ts +43 -0
- package/dist/types/tracks/sequence/index.d.ts +5 -0
- package/dist/types/tracks/sequence/sequenceRenderer.d.ts +34 -0
- package/dist/types/tracks/sequence/sequenceThemes.d.ts +11 -0
- package/dist/types/tracks/sequence/sequenceTrackCanvas.d.ts +67 -0
- package/dist/types/tracks/wig/index.d.ts +5 -0
- package/dist/types/tracks/wig/wigRenderer.d.ts +15 -0
- package/dist/types/tracks/wig/wigSummary.d.ts +31 -0
- package/dist/types/tracks/wig/wigThemes.d.ts +15 -0
- package/dist/types/tracks/wig/wigTrackCanvas.d.ts +82 -0
- package/dist/types/types.d.ts +885 -0
- package/dist/types/ui/components/IgvBrowserShell.d.ts +52 -0
- package/dist/types/ui/components/IgvChromosomeSelect.d.ts +18 -0
- package/dist/types/ui/components/IgvExportControls.d.ts +13 -0
- package/dist/types/ui/components/IgvLocusInput.d.ts +18 -0
- package/dist/types/ui/components/IgvNavbar.d.ts +15 -0
- package/dist/types/ui/components/IgvWindowSize.d.ts +14 -0
- package/dist/types/ui/components/IgvZoomControls.d.ts +10 -0
- package/dist/types/ui/components/LoomBrowserShell.d.ts +52 -0
- package/dist/types/ui/components/LoomChromosomeSelect.d.ts +18 -0
- package/dist/types/ui/components/LoomContextMenu.d.ts +39 -0
- package/dist/types/ui/components/LoomExportControls.d.ts +13 -0
- package/dist/types/ui/components/LoomInputDialog.d.ts +27 -0
- package/dist/types/ui/components/LoomLocusInput.d.ts +18 -0
- package/dist/types/ui/components/LoomNavbar.d.ts +15 -0
- package/dist/types/ui/components/LoomPopup.d.ts +32 -0
- package/dist/types/ui/components/LoomWindowSize.d.ts +14 -0
- package/dist/types/ui/components/LoomZoomControls.d.ts +10 -0
- package/dist/types/ui/index.d.ts +21 -0
- package/dist/types/ui/themes.d.ts +14 -0
- package/dist/types/wigRenderer.d.ts +15 -0
- package/dist/types/wigSummary.d.ts +31 -0
- package/dist/types/wigThemes.d.ts +15 -0
- package/dist/types/wigTrackCanvas.d.ts +46 -0
- package/dist/types/worker/decodeWig.d.ts +20 -0
- package/dist/types/worker/nodeWorkerProvider.d.ts +28 -0
- package/dist/types/worker/taskHandler.d.ts +15 -0
- package/dist/types/worker/webWorkerProvider.d.ts +51 -0
- package/dist/types/worker/workerScript.d.ts +11 -0
- package/dist/types/workerProvider.d.ts +76 -0
- package/package.json +102 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{BigWig as t}from"@gmod/bbi";import{RemoteFile as e}from"generic-filehandle2";import{TabixIndexedFile as n}from"@gmod/tabix";class r{createCanvas(t,e){const n=document.createElement("canvas");n.width=t,n.height=e;const r=n.getContext("2d");return{canvas:n,ctx:r}}get devicePixelRatio(){return"undefined"!=typeof window&&window.devicePixelRatio||1}}const o=new r;function s(t,e){return[{label:"Set track height",action:async()=>{const n=await e.promptInput("Track height (px)",t.height);if(null!==n){const r=parseInt(n,10);r>0&&!isNaN(r)&&e.setTrackHeight(t,r)}}},{label:"Remove track",action:()=>e.removeTrack(t)}]}function i(t,e){const n=[];return n.push({label:"Set data range",action:async()=>{const n=await e("Minimum",t.dataRange.min);if(null===n)return;const r=await e("Maximum",t.dataRange.max);if(null===r)return;const o=parseFloat(n),s=parseFloat(r);!isNaN(o)&&!isNaN(s)&&o<s&&t.setDataRange(o,s)}}),void 0!==t.logScale&&t.setLogScale&&n.push({label:"Log scale",type:"checkbox",checked:t.logScale,action:()=>t.setLogScale(!t.logScale)}),n.push({label:"Autoscale",type:"checkbox",checked:t.autoscale,action:()=>t.setAutoscale(!t.autoscale)}),n}function a(t,e){return[{label:"Edit name...",action:async()=>{var n;const r=await e.promptInput("ROI name",null!==(n=t.name)&&void 0!==n?n:"");null!==r&&e.updateROI(t.id,{name:r})}},{label:"Edit description...",action:async()=>{var n;const r=await e.promptInput("Description",null!==(n=t.description)&&void 0!==n?n:"");null!==r&&e.updateROI(t.id,{description:r})}},{label:"Set color...",action:async()=>{var n;const r=await e.promptInput("Color (CSS)",null!==(n=t.color)&&void 0!==n?n:"rgba(68, 134, 247, 0.15)");null!==r&&e.updateROI(t.id,{color:r})}},{label:"",type:"separator"},{label:"Go to region",action:()=>e.goToRegion({chr:t.chr,start:t.start,end:t.end})},{label:"Remove",action:()=>e.removeROI(t.id)}]}class l{async execute(t){return this.dispatch(t)}async dispatch(t){switch(t.task){case"pack":{const{packFeatures:e}=await Promise.resolve().then(function(){return b}),n=[...t.features];return e(n,t.maxRows),n}case"summarize":{const{summarizeWigData:e}=await Promise.resolve().then(function(){return st});return e(t.features,t.startBP,t.bpPerPixel,t.windowFunction)}case"computeWigRange":{const{computeWigDataRange:e}=await Promise.resolve().then(function(){return st});return e(t.features)}case"parseFeatures":{const{parseFeatures:e}=await Promise.resolve().then(function(){return ir});return e(t.lines,t.format,{header:t.header,assembleGFF:t.assembleGFF})}default:throw new Error(`Unknown worker task: ${t.task}`)}}dispose(){}}const c=new l;class h{constructor(t){var e;let n,r;if(this.nextId=0,this.nextWorker=0,this.pending=new Map,"string"==typeof t||t instanceof URL){r=1;const e=t;n=()=>new Worker(e,{type:"module"})}else if(r=Math.max(1,null!==(e=t.poolSize)&&void 0!==e?e:1),t.workerFactory)n=t.workerFactory;else{if(!t.workerUrl)throw new Error("WebWorkerProviderOptions requires either workerUrl or workerFactory");{const e=t.workerUrl;n=()=>new Worker(e,{type:"module"})}}this.workers=[];for(let t=0;t<r;t++){const t=n();t.onmessage=t=>{const{id:e,result:n,error:r}=t.data,o=this.pending.get(e);o&&(this.pending.delete(e),r?o.reject(new Error(r)):o.resolve(n))},t.onerror=t=>{const e=new Error(`Worker error: ${t.message}`);for(const{reject:t}of this.pending.values())t(e);this.pending.clear()},this.workers.push(t)}}get poolSize(){return this.workers.length}execute(t,e){const n=this.nextId++,r=this.workers[this.nextWorker%this.workers.length];return this.nextWorker++,new Promise((o,s)=>{this.pending.set(n,{resolve:o,reject:s}),r.postMessage({id:n,task:t},null!=e?e:[])})}dispose(){for(const t of this.workers)t.terminate();for(const{reject:t}of this.pending.values())t(new Error("Worker terminated"));this.pending.clear(),this.workers=[]}}class d{constructor(t){this.nextId=0,this.pending=new Map,this.initPromise=this.init(t)}async init(t){const e=await import("worker_threads");this.worker=new e.Worker(t),this.worker.on("message",t=>{const e=this.pending.get(t.id);e&&(this.pending.delete(t.id),t.error?e.reject(new Error(t.error)):e.resolve(t.result))}),this.worker.on("error",t=>{for(const{reject:e}of this.pending.values())e(t);this.pending.clear()})}async execute(t,e){await this.initPromise;const n=this.nextId++;return new Promise((r,o)=>{this.pending.set(n,{resolve:r,reject:o}),this.worker.postMessage({id:n,task:t},null!=e?e:[])})}dispose(){var t;null===(t=this.worker)||void 0===t||t.terminate();for(const{reject:t}of this.pending.values())t(new Error("Worker terminated"));this.pending.clear()}}class u{get canvas(){return this._canvas}get locus(){return this._locus}get height(){return this._height}get config(){return this._config}constructor(t,e,n,r){this._height=0,this.resizeObserver=null,this.container=null,this._renderSuspended=!1,this._renderPending=!1,this._error=null,this._zoomedOut=!1,this._canvas=t,this._locus=e,this._config=n,this.canvasProvider=null!=r?r:o}setLocus(t){this._locus=t,this.render()}setConfig(t){this._config={...this._config,...t},this.render()}suspendRendering(){this._renderSuspended=!0}resumeRendering(){this._renderSuspended=!1,this._renderPending&&(this._renderPending=!1,this.render())}setError(t){this._error=t,this.render()}setZoomedOut(t){this._zoomedOut!==t&&(this._zoomedOut=t,this.render())}hitTest(t,e){return[]}getContextMenuItems(t,e){}attachTo(t){this.detach(),this.container=t,t.appendChild(this._canvas),this._canvas.style.display="block",this.resizeObserver=new ResizeObserver(()=>this.render()),this.resizeObserver.observe(t),this.render()}detach(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.container&&this._canvas.parentNode===this.container&&this.container.removeChild(this._canvas),this.container=null}render(){var t,e;if(this._renderSuspended)return void(this._renderPending=!0);const n=null!==(e=null===(t=this.container)||void 0===t?void 0:t.clientWidth)&&void 0!==e?e:this._canvas.clientWidth;if(0===n)return;const r=this.computeHeight(n);this._height=r;const o=this.canvasProvider.devicePixelRatio;this._canvas.width=n*o,this._canvas.height=r*o,this._canvas.style.width=`${n}px`,this._canvas.style.height=`${r}px`;const s=this._canvas.getContext("2d");if(s.scale(o,o),s.fillStyle=this.getBackground(),s.fillRect(0,0,n,r),this._error)return void this.renderError(s,n,r);if(this._zoomedOut)return void this.renderZoomInNotice(s,n,r);const i=(this._locus.end-this._locus.start)/n,a={pixelWidth:n,bpStart:this._locus.start,bpPerPixel:i,viewportWidth:n};this.doRender(s,n,r,a)}renderError(t,e,n){t.font="12px sans-serif",t.fillStyle="rgb(180, 0, 0)",t.textAlign="center",t.textBaseline="middle",t.fillText("Error loading track data",e/2,n/2)}renderZoomInNotice(t,e,n){t.font="12px sans-serif",t.fillStyle="rgb(120, 120, 120)",t.textAlign="center",t.textBaseline="middle",t.fillText("Zoom in to see features",e/2,n/2)}renderToContext(t,e,n){if(t.fillStyle=this.getBackground(),t.fillRect(0,0,e,n),this._error)return void this.renderError(t,e,n);if(this._zoomedOut)return void this.renderZoomInNotice(t,e,n);const r=(this._locus.end-this._locus.start)/e,o={pixelWidth:e,bpStart:this._locus.start,bpPerPixel:r,viewportWidth:e};this.doRender(t,e,n,o)}}function f(){return{displayMode:"EXPANDED",featureHeight:14,margin:10,expandedRowHeight:30,squishedRowHeight:15,arrowSpacing:30,color:"rgb(0,0,150)",labelField:"name",font:"bold 10px sans-serif",drawLabels:!0}}function m(){return{sequenceType:"dna",reversed:!1,frameTranslate:!1,background:"#ffffff",nucleotideColors:{A:"#00C000",C:"#0000FF",G:"#FFB300",T:"#FF0000",N:"#808080"},nonDnaColor:"rgb(0, 0, 150)",defaultHeight:25,translatedHeight:115,sequenceHeight:15,frameHeight:25,frameBorder:5,frameColor1:"rgb(160,160,160)",frameColor2:"rgb(224,224,224)",stopCodonColor:"rgb(255, 0, 0)",startCodonColor:"rgb(0, 153, 0)",useFillText:!1,frameLabelColor:"#000000",frameFont:"bold 10px sans-serif",codonBorderRadius:0}}function p(){return{height:50,graphType:"bar",windowFunction:"mean",dataRange:{min:0,max:100},autoscale:!0,color:"rgb(150, 150, 150)",flipAxis:!1,logScale:!1,baselineColor:"lightGray",overflowColor:"rgb(255, 32, 255)",pointSize:3,background:"#ffffff",showDataRange:!0,labelColor:"#333333",labelFont:"bold 9px sans-serif"}}function g(){return{height:250,arcOrientation:"UP",displayMode:"nested",showBlocks:!0,blockHeight:3,thickness:1,color:"rgb(180,25,137)",alpha:.02,logScale:!0,background:"#ffffff",font:"8px sans-serif",useScore:!1}}function v(){return{height:40,font:"bold 10px sans-serif",tickColor:"rgb(150, 150, 150)",labelColor:"rgb(0, 0, 0)",baselineColor:"rgb(150, 150, 150)",background:"white"}}function _(t,e){const n=null!=e?e:Number.MAX_SAFE_INTEGER,r=[-1e3];t.sort((t,e)=>t.start-e.start);for(const e of t){const t=Math.min(r.length,n);let o=!1;for(let n=0;n<t;n++)if(e.start>=r[n]){e.row=n,r[n]=e.end,o=!0;break}o||(e.row=r.length,r.push(e.end))}}var b=Object.freeze({__proto__:null,packFeatures:_});function w(t,e,n,r,o,s){var i,a,l;const c=null!==(i=s.borderRadius)&&void 0!==i?i:0;c>0&&r>2*c&&o>2*c?(t.beginPath(),t.roundRect(e,n,r,o,c),t.fill(),s.borderColor&&(null!==(a=s.borderWidth)&&void 0!==a?a:0)>0&&(t.strokeStyle=s.borderColor,t.lineWidth=s.borderWidth,t.stroke())):(t.fillRect(e,n,r,o),s.borderColor&&(null!==(l=s.borderWidth)&&void 0!==l?l:0)>0&&(t.strokeStyle=s.borderColor,t.lineWidth=s.borderWidth,t.strokeRect(e,n,r,o)))}function x(t,e,n,r,o){var s,i,a,l;t.save();try{const c=k(e,n),h=function(t,e){var n,r,o;if("-"===t.strand)return null!==(r=null!==(n=e.altUtrColor)&&void 0!==n?n:e.utrColor)&&void 0!==r?r:k(t,e);return null!==(o=e.utrColor)&&void 0!==o?o:e.color}(e,n);let d,u;t.fillStyle=c,t.strokeStyle=c,"SQUISHED"===n.displayMode&&void 0!==e.row?(d=n.featureHeight/2,u=n.margin+n.squishedRowHeight*e.row):"EXPANDED"===n.displayMode&&void 0!==e.row?(d=n.featureHeight,u=n.margin+n.expandedRowHeight*e.row):(d=n.featureHeight,u=n.margin);const f=u+d/2,m=d/2,p=f-m/2,g=e.exons?e.exons.length:0,v=function(t,e,n){let r=(t.start-e)/n,o=(t.end-e)/n,s=o-r;return s<3&&(s=3,r-=1.5),{px:r,px1:o,pw:s}}(e,r.bpStart,r.bpPerPixel),_=n.arrowSpacing,b="+"===e.strand?1:"-"===e.strand?-1:0,x=null!==(s=n.arrowColor)&&void 0!==s?s:c,C=null!==(i=n.arrowInExonColor)&&void 0!==i?i:"white";if(0===g){const e=Math.max(0,v.px),o=Math.min(r.pixelWidth,v.px1),s=o-e;if(t.fillStyle=c,w(t,e,u,s,d,n),0!==b){t.strokeStyle=C;for(let n=e+_/2;n<o;n+=_)y(t,n,f,b)}}else{t.save(),t.strokeStyle=null!==(a=n.intronColor)&&void 0!==a?a:c,t.lineWidth=null!==(l=n.intronLineWidth)&&void 0!==l?l:1,n.intronDash&&n.intronDash.length>0&&t.setLineDash(n.intronDash),t.beginPath(),t.moveTo(v.px+1,f),t.lineTo(v.px1-1,f),t.stroke(),t.restore(),t.strokeStyle=x;const o=Math.max(0,v.px)+_/2,s=Math.min(r.pixelWidth,v.px1);for(let e=o;e<s;e+=_)y(t,e,f,b);for(const o of e.exons){let e=Math.round((o.start-r.bpStart)/r.bpPerPixel),s=Math.round((o.end-r.bpStart)/r.bpPerPixel),i=Math.max(1,s-e);if(!(e+i<0)){if(e>r.pixelWidth)break;if(o.utr)t.fillStyle=h,w(t,e,p,i,m,n);else{if(o.cdStart){const s=Math.round((o.cdStart-r.bpStart)/r.bpPerPixel);t.fillStyle=h,w(t,e,p,s-e,m,n),i-=s-e,e=s}if(o.cdEnd){const e=Math.round((o.cdEnd-r.bpStart)/r.bpPerPixel);t.fillStyle=h,w(t,e,p,s-e,m,n),i-=s-e,s=e}if(i=Math.max(i,1),t.fillStyle=c,w(t,e,u,i,d,n),i>_+5&&0!==b){t.strokeStyle=C;for(let n=e+_/2;n<s;n+=_)y(t,n,f,b)}}}}}n.drawLabels&&"SQUISHED"!==n.displayMode&&function(t,e,n,r,o,s,i,a){var l,c,h,d;const u=function(t,e){var n;const r={name:t.name,id:t.id,chr:t.chr};return null!==(n=r[e])&&void 0!==n?n:t.name}(e,s.labelField);if(!u||"."===u)return;t.save();try{t.font=null!==(l=s.labelFont)&&void 0!==l?l:s.font;const f=Math.max(n,0),m=(f+Math.min(r,i.viewportWidth))/2,p="COLLAPSED"===s.displayMode&&"SLANT"===s.labelDisplayMode,g=p?o+20:o+25;t.fillStyle=null!==(c=s.labelColor)&&void 0!==c?c:k(e,s);const v=t.measureText(u),_=m-v.width/2,b=m+v.width/2;if(_>(null!==(h=a[e.row])&&void 0!==h?h:-Number.MAX_SAFE_INTEGER)){a[e.row]=b;const n=m-v.width/2-1,r=g-v.actualBoundingBoxAscent-1,o=v.width+2,i=v.actualBoundingBoxAscent+v.actualBoundingBoxDescent+2;s.labelBackground?(t.fillStyle=s.labelBackground,t.fillRect(n,r,o,i),t.fillStyle=null!==(d=s.labelColor)&&void 0!==d?d:k(e,s)):t.clearRect(n,r,o,i),p?(t.save(),t.translate(m,g),t.rotate(Math.PI/4),t.fillText(u,0,0),t.restore()):(t.textAlign="center",t.fillText(u,m,g))}}finally{t.restore()}}(t,e,v.px,v.px1,u,n,r,o)}finally{t.restore()}}function y(t,e,n,r){t.beginPath(),t.moveTo(e-2*r,n-2),t.lineTo(e,n),t.stroke(),t.beginPath(),t.moveTo(e-2*r,n+2),t.lineTo(e,n),t.stroke()}function k(t,e){return t.color?t.color:e.altColor&&"-"===t.strand?e.altColor:e.color}function C(t,e,n,r){const o={};for(const s of e){if(void 0===s.row)continue;const e=(s.end-r.bpStart)/r.bpPerPixel,i=(s.start-r.bpStart)/r.bpPerPixel;e<0||i>r.pixelWidth||x(t,s,n,r,o)}}function I(){return{palette:{primary:"rgb(0,0,150)",secondary:"rgb(0,0,150)",accent:"#4A90D9",background:"#ffffff",foreground:"#333333",muted:"rgb(150, 150, 150)"},fontFamily:"sans-serif",fontSize:10,nucleotideColors:{A:"#00C000",C:"#0000FF",G:"#FFB300",T:"#FF0000",N:"#808080"}}}function S(t){var e,n;const r={palette:{primary:"rgb(0,0,150)",secondary:"rgb(0,0,150)",accent:"#4A90D9",background:"#ffffff",foreground:"#333333",muted:"rgb(150, 150, 150)"},fontFamily:"sans-serif",fontSize:10,nucleotideColors:{A:"#00C000",C:"#0000FF",G:"#FFB300",T:"#FF0000",N:"#808080"}};return t?{palette:{...r.palette,...t.palette},fontFamily:null!==(e=t.fontFamily)&&void 0!==e?e:r.fontFamily,fontSize:null!==(n=t.fontSize)&&void 0!==n?n:r.fontSize,nucleotideColors:{...r.nucleotideColors,...t.nucleotideColors},annotation:t.annotation,wig:t.wig,ruler:t.ruler,sequence:t.sequence,interaction:t.interaction}:r}function T(t,e){const n={displayMode:"EXPANDED",featureHeight:14,margin:10,expandedRowHeight:30,squishedRowHeight:15,arrowSpacing:30,color:t.palette.primary,altColor:t.palette.secondary,labelField:"name",font:`bold ${t.fontSize}px ${t.fontFamily}`,drawLabels:!0,intronColor:t.palette.muted,labelColor:t.palette.foreground},r=t.annotation?{...n,...t.annotation}:n;return e?{...r,...e}:r}function M(t,e){const n={height:50,graphType:"bar",windowFunction:"mean",dataRange:{min:0,max:100},autoscale:!0,color:t.palette.primary,altColor:t.palette.secondary,flipAxis:!1,logScale:!1,baselineColor:t.palette.muted,overflowColor:"rgb(255, 32, 255)",pointSize:3,background:t.palette.background,nucleotideColors:t.nucleotideColors,showDataRange:!0,labelColor:t.palette.foreground,labelFont:`bold ${Math.max(9,t.fontSize-1)}px ${t.fontFamily}`},r=t.wig?{...n,...t.wig}:n;return e?{...r,...e}:r}function E(t,e){const n={height:40,font:`bold ${t.fontSize}px ${t.fontFamily}`,tickColor:t.palette.muted,labelColor:t.palette.foreground,baselineColor:t.palette.muted,background:t.palette.background},r=t.ruler?{...n,...t.ruler}:n;return e?{...r,...e}:r}function P(t,e){const n={sequenceType:"dna",reversed:!1,frameTranslate:!1,background:t.palette.background,nucleotideColors:{...t.nucleotideColors},nonDnaColor:"rgb(0, 0, 150)",defaultHeight:25,translatedHeight:115,sequenceHeight:15,frameHeight:25,frameBorder:5,frameColor1:"rgb(160,160,160)",frameColor2:"rgb(224,224,224)",stopCodonColor:"rgb(255, 0, 0)",startCodonColor:"rgb(0, 153, 0)",useFillText:!1,frameLabelColor:"#000000",frameFont:`bold ${t.fontSize}px ${t.fontFamily}`,codonBorderRadius:0},r=t.sequence?{...n,...t.sequence}:n;return e?{...r,...e}:r}function R(t,e){const n={height:250,arcOrientation:"UP",displayMode:"nested",showBlocks:!0,blockHeight:3,thickness:1,color:"rgb(180,25,137)",alpha:.02,logScale:!0,background:t.palette.background,font:`${Math.max(8,t.fontSize-2)}px ${t.fontFamily}`,useScore:!1},r=t.interaction?{...n,...t.interaction}:n;return e?{...r,...e}:r}class L extends u{constructor(t,e){var n;const r=S(e.theme),o=T(r,e.config);super(t,e.locus,o,e.canvasProvider),this.packedFeatures=[],this.packedReady=!1,this.type="annotation",this.features=e.features,this.fixedHeight=e.height,this.background=null!==(n=e.background)&&void 0!==n?n:r.palette.background,this._name=e.name,this.workerProvider=e.workerProvider}setFeatures(t){if(this.features=t,this.workerProvider){const e=t.map(t=>({...t}));this.workerProvider.execute({task:"pack",features:e}).then(t=>{this.packedFeatures=t,this.packedReady=!0,this.render()}).catch(()=>{this.packedReady=!1,this.render()})}else this.packedReady=!1,this.render()}computeHeight(t){var e;this.packedReady||(this.packedFeatures=this.features.map(t=>({...t})),_(this.packedFeatures));const n=this.packedFeatures.reduce((t,e)=>{var n;return Math.max(t,null!==(n=e.row)&&void 0!==n?n:0)},0),r="SQUISHED"===this.config.displayMode?this.config.squishedRowHeight:this.config.expandedRowHeight;return null!==(e=this.fixedHeight)&&void 0!==e?e:2*this.config.margin+(n+1)*r+10}getBackground(){return this.background}doRender(t,e,n,r){C(t,this.packedFeatures,this.config,r)}getAxisInfo(){return this._name?{label:this._name}:void 0}getContextMenuItems(t,e){return[{label:"Display mode",children:["EXPANDED","SQUISHED","COLLAPSED"].map(t=>({label:t.charAt(0)+t.slice(1).toLowerCase(),type:"checkbox",checked:this._config.displayMode===t,action:()=>this.setConfig({displayMode:t})}))}]}hitTest(t,e){if(0===this.packedFeatures.length)return[];const n=this._canvas.clientWidth;if(0===n)return[];const r=(this._locus.end-this._locus.start)/n,o=this._locus.start+t*r,s="SQUISHED"===this._config.displayMode?this._config.squishedRowHeight:this._config.expandedRowHeight,i=Math.floor((e-this._config.margin)/s);if(i<0)return[];const a=[];for(const t of this.packedFeatures)t.row===i&&(o<t.start||o>t.end||a.push({feature:t,popupData:A(t)}));return a}serializeConfig(t){const e=T(t),n={};let r=!1;const o=Object.keys(this.config);for(const t of o){const o=this.config[t];o!==e[t]&&void 0!==o&&(n[t]=o,r=!0)}return{type:"annotation",config:r?n:void 0}}}function A(t){const e=[];return t.name&&e.push({name:"Name",value:t.name}),t.id&&e.push({name:"ID",value:t.id}),t.chr&&e.push({name:"Chr",value:t.chr}),e.push({name:"Start",value:t.start.toLocaleString()}),e.push({name:"End",value:t.end.toLocaleString()}),t.strand&&e.push({name:"Strand",value:t.strand}),null!=t.cdStart&&null!=t.cdEnd&&t.cdStart!==t.cdEnd&&e.push({name:"CDS",value:`${t.cdStart.toLocaleString()}-${t.cdEnd.toLocaleString()}`}),t.exons&&e.push({name:"Exons",value:t.exons.length}),e}function O(t){return Math.floor(t).toLocaleString("en-US")}function F(t,e,n){const r=e.height,o=function(t){if(t<10)return{majorTick:1,majorUnit:"bp",unitMultiplier:1};const e=Math.floor(Math.log10(t));let n="bp",r=1;return e>9?(n="gb",r=1e9):e>6?(n="mb",r=1e6):e>3&&(n="kb",r=1e3),{majorTick:t/Math.pow(10,e-1)<75?Math.pow(10,e-1):Math.pow(10,e)/2,majorUnit:n,unitMultiplier:r}}(Math.floor(n.pixelWidth*n.bpPerPixel));let s=Math.floor(n.bpStart/o.majorTick)-1;const i=t=>Math.floor(t*o.majorTick),a=t=>Math.round((t-1-n.bpStart+.5)/n.bpPerPixel),l=a(i(1+s))-a(i(s)),c=`${O(i(s)/o.unitMultiplier)} ${o.majorUnit}`,h=Math.floor(t.measureText(c).width),d=.25*h;t.font=e.font,t.fillStyle=e.labelColor,t.strokeStyle=e.tickColor,t.lineWidth=1;let u,f=l;do{const c=i(s),m=`${O(c/o.unitMultiplier)} ${o.majorUnit}`;u=a(c);const p=t.measureText(m).width,g=Math.round(u-p/2);g>0&&d+h<=f&&(t.fillStyle=e.labelColor,t.fillText(m,g,r-8),f=0),u>0&&(t.beginPath(),t.moveTo(u,r-6),t.lineTo(u,r-2),t.stroke());const v=u+(a(i(1+s))-u)/2;v>0&&v<n.pixelWidth&&(t.beginPath(),t.moveTo(v,r-6),t.lineTo(v,r-2),t.stroke()),++s,f+=l}while(u<n.pixelWidth);t.strokeStyle=e.baselineColor,t.beginPath(),t.moveTo(0,r-2),t.lineTo(n.pixelWidth,r-2),t.stroke()}function N(t,e,n,r){var o;const s=e.height,{cumulativeOffsets:i,chromSizes:a}=r;t.fillStyle=null!==(o=e.background)&&void 0!==o?o:"white",t.fillRect(0,0,n.pixelWidth,s),t.textAlign="center",t.textBaseline="middle",t.font=e.font;for(const e of i.chromosomeNames){const r=i.offsets[e],o=a[e];if(void 0===r||void 0===o)continue;const l=Math.round((r-n.bpStart)/n.bpPerPixel),c=Math.round(o/n.bpPerPixel);t.strokeStyle="#bfbfbf",t.lineWidth=1,t.beginPath(),t.moveTo(l+c,0),t.lineTo(l+c,s),t.stroke();const h=e.startsWith("chr")?e.substring(3):e;c>t.measureText(h).width&&(t.fillStyle="#444444",t.fillText(h,l+c/2,s/2))}}function K(t){return"all"===t.chr.toLowerCase()}function D(t,e){const n=t.trim();if("all"===n.toLowerCase()||"*"===n)return e?{chr:"all",start:0,end:e.totalLength}:null;const r=n.replace(/,/g,"").match(/^(\S+):(\d+)-(\d+)$/);if(!r)return null;const o=r[1],s=parseInt(r[2],10),i=parseInt(r[3],10);return isNaN(s)||isNaN(i)||i<=s?null:{chr:o,start:s,end:i}}function U(t){return K(t)?"All Chromosomes":`${t.chr}:${Math.round(t.start).toLocaleString()}-${Math.round(t.end).toLocaleString()}`}function z(t){if((t=Math.abs(t))>=1e9){const e=t/1e9;return`${e%1==0?e.toFixed(0):e.toFixed(1)} Gb`}if(t>=1e6){const e=t/1e6;return`${e%1==0?e.toFixed(0):e.toFixed(1)} Mb`}if(t>=1e3){const e=t/1e3;return`${e%1==0?e.toFixed(0):e.toFixed(1)} kb`}return`${Math.round(t)} bp`}function G(t,e,n){if(K(t)&&n)return{chr:"all",start:Math.max(0,t.start),end:Math.min(n.totalLength,t.end)};let{chr:r,start:o,end:s}=t;const i=null==e?void 0:e[r];if(null!=i&&s-o>i&&(o=0,s=i),o<0){const t=-o;o=0,s+=t}if(null!=i&&s>i){const t=s-i;s=i,o=Math.max(0,o-t)}return{chr:r,start:o,end:s}}class W extends u{constructor(t,e){const n=E(S(e.theme),e.config);super(t,e.locus,n,e.canvasProvider),this.type="ruler",this._cumulativeOffsets=e.cumulativeOffsets,this._chromSizes=e.chromSizes}setCumulativeOffsets(t){this._cumulativeOffsets=t}setChromSizes(t){this._chromSizes=t}computeHeight(t){return this.config.height}getBackground(){return this.config.background}doRender(t,e,n,r){K(this._locus)&&this._cumulativeOffsets&&this._chromSizes?N(t,this.config,r,{cumulativeOffsets:this._cumulativeOffsets,chromSizes:this._chromSizes}):F(t,this.config,r)}serializeConfig(t){const e=E(t),n={};let r=!1;const o=Object.keys(this.config);for(const t of o){const o=this.config[t];o!==e[t]&&void 0!==o&&(n[t]=o,r=!0)}return{type:"ruler",config:r?n:void 0}}}function q(t){return Number.isInteger(t)||t%1==0?t.toString():Math.abs(t)>=10?t.toFixed():Math.abs(t)>=1?t.toFixed(1):Math.abs(t)>=.1?t.toFixed(2):t.toExponential(1)}function $(t){return t<0?-Math.log10(Math.abs(t)+1):Math.log10(Math.abs(t)+1)}function H(t,e,n,r){var o,s,i,a;if(!e.dataRange||0===r)return;const{min:l,max:c}=e.dataRange,h=null!==(o=e.flipAxis)&&void 0!==o&&o,d=null!==(s=e.logScale)&&void 0!==s&&s,u=.01*r,f=.99*r,m=h?l:c,p=h?c:l,g=null!==(i=e.backgroundColor)&&void 0!==i?i:"white",v=null!==(a=e.labelColor)&&void 0!==a?a:"black";t.fillStyle=g,t.fillRect(0,0,n,r),e.color&&(t.fillStyle=e.color,t.fillRect(n-4-1,0,4,r));const _=n-4-3,b=_-6;if(t.strokeStyle=v,t.fillStyle=v,t.font="normal 9px Arial",t.textAlign="right",t.lineWidth=1,t.beginPath(),t.moveTo(_,u),t.lineTo(_,f),t.stroke(),t.beginPath(),t.moveTo(b,u),t.lineTo(_,u),t.stroke(),t.textBaseline="top",t.fillText(q(m),b-2,u+1),t.beginPath(),t.moveTo(b,f),t.lineTo(_,f),t.stroke(),t.textBaseline="bottom",t.fillText(q(p),b-2,f-1),r>60){const e=d?(()=>{const t=($(l)+$(c))/2;return t>=0?Math.pow(10,t)-1:-(Math.pow(10,-t)-1)})():(l+c)/2,n=function(t,e,n,r,o,s,i){const a=i?$(e):e,l=i?$(n):n,c=i?$(t):t,h=l-a;if(0===h)return(r+o)/2;const d=(c-a)/h;return s?r+d*(o-r):o-d*(o-r)}(e,l,c,u,f,h,d);t.beginPath(),t.moveTo(b+3,n),t.lineTo(_,n),t.stroke(),t.textBaseline="middle",t.fillText(q(e),b+1,n)}}function B(t,e,n,r){var o,s;if(!e.label||0===r)return;const i=null!==(o=e.backgroundColor)&&void 0!==o?o:"white",a=null!==(s=e.labelColor)&&void 0!==s?s:"#333";t.fillStyle=i,t.fillRect(0,0,n,r),t.font="10px sans-serif",t.fillStyle=a,t.textAlign="center",t.textBaseline="middle",t.save(),t.translate(n/2,r/2),t.rotate(-Math.PI/2);const l=r-10;t.fillText(e.label,0,0,l),t.restore()}const j={A:"#00C000",C:"#0000FF",G:"#FFB300",T:"#FF0000",N:"#808080"},X={A:{main:"M 0 100 L 33 0 L 66 0 L 100 100 L 75 100 L 66 75 L 33 75 L 25 100 L 0 100",overlay:"M 41 55 L 50 25 L 58 55 L 41 55"},C:{main:"M 100 28 C 100 -13 0 -13 0 50 C 0 113 100 113 100 72 L 75 72 C 75 90 30 90 30 50 C 30 10 75 10 75 28 L 100 28"},G:{main:"M 100 28 C 100 -13 0 -13 0 50 C 0 113 100 113 100 72 L 100 48 L 55 48 L 55 72 L 75 72 C 75 90 30 90 30 50 C 30 10 75 5 75 28 L 100 28"},T:{main:"M 0 0 L 0 20 L 35 20 L 35 100 L 65 100 L 65 20 L 100 20 L 100 0 L 0 0"},N:{main:"M 0 100 L 0 0 L 20 0 L 80 75 L 80 0 L 100 0 L 100 100 L 80 100 L 20 25 L 20 100 L 0 100"}};function V(t,e,n,r,o,s){const i=o/100,a=s/100;t.beginPath();const l=e.match(/[MLC][^MLC]*/g);if(l){for(const e of l){const o=e[0],s=e.slice(1).trim().split(/[\s,]+/).map(Number);"M"===o?t.moveTo(n+s[0]*i,r+s[1]*a):"L"===o?t.lineTo(n+s[0]*i,r+s[1]*a):"C"===o&&s.length>=6&&t.bezierCurveTo(n+s[0]*i,r+s[1]*a,n+s[2]*i,r+s[3]*a,n+s[4]*i,r+s[5]*a)}t.closePath(),t.fill()}}function Y(t,e,n,r,o,s,i,a=!1,l="#ffffff"){var c;const h=null!==(c=X[e])&&void 0!==c?c:X.N;t.save(),t.fillStyle=i,a&&(t.translate(n+o/2,r+s/2),t.scale(1,-1),t.translate(-(n+o/2),-(r+s/2))),V(t,h.main,n,r,o,s),h.overlay&&(t.fillStyle=l,V(t,h.overlay,n,r,o,s)),t.restore()}function Z(t,e,n,r,o,s,i,a=j,l="#ffffff"){var c;const h=Math.min(o,s),d=Math.max(1,Math.abs(o-s)),u=r/e.length,f=i<0;for(let r=0;r<e.length;r++){const o=n+r*u,s=e[r].toUpperCase();Y(t,s,o,h,u,d,null!==(c=a[s])&&void 0!==c?c:a.N,f,l)}}function J(t,e){const n=function(t){const e=t.match(/^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);if(e)return[Number(e[1]),Number(e[2]),Number(e[3])];const n=t.match(/^#([0-9a-f]{3,8})$/i);if(n){const t=n[1];if(3===t.length||4===t.length)return[parseInt(t[0]+t[0],16),parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16)];if(t.length>=6)return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]}}(t);return n?`rgba(${n[0]},${n[1]},${n[2]},${e})`:t}function Q(t,e,n){return n?t<0&&n.neg?n.neg:n.pos:function(t,e){const n=function(t,e){return"function"==typeof t?t(e):t}(t<0&&e.altColor?e.altColor:e.color,t);return null!=e.alpha?J(n,e.alpha):n}(t,e)}function tt(t){return Number.isInteger(t)?t.toString():Math.abs(t)>=10?t.toFixed():Math.abs(t)>=1?t.toFixed(1):Math.abs(t)>=.1?t.toFixed(2):t.toExponential(1)}function et(t,e,n,r){if(!e||0===e.length)return;if(n.dataRange.max<=n.dataRange.min)return;const o=n.height-1,s=r.bpStart+r.pixelWidth*r.bpPerPixel+1,i=function(t,e,n,r){const o=r?t<0?-Math.log10(Math.abs(t)+1):Math.log10(Math.abs(t)+1):t;return n/((r?Math.log10(Math.abs(e)+1):e)-o)}(n.dataRange.min,n.dataRange.max,o,n.logScale),a=t=>function(t,e,n,r,o){if(o){let o=e.min,s=e.max;o=o<0?-Math.log10(Math.abs(o)+1):Math.log10(Math.abs(o)+1),s=s<0?-Math.log10(Math.abs(s)+1):Math.log10(Math.abs(s)+1);const i=t<0?-Math.log10(Math.abs(t)+1):Math.log10(t+1);return(r?i-o:s-i)*n}return(r?t-e.min:e.max-t)*n}(t,n.dataRange,i,n.flipAxis,n.logScale),l=a(0);console.log("[renderWigTrack]",{logScale:n.logScale,scaleFactor:i,y0:l,pixelHeight:o,dataRange:n.dataRange});const c=function(t){if("string"!=typeof t.color)return;if(void 0!==t.altColor&&"string"!=typeof t.altColor)return;return{pos:null!=t.alpha?J(t.color,t.alpha):t.color,neg:void 0!==t.altColor?null!=t.alpha?J(t.altColor,t.alpha):t.altColor:void 0}}(n);switch(n.graphType){case"bar":!function(t,e,n,r,o,s,i,a,l){for(const c of e){if(c.end<r.bpStart)continue;if(c.start>a)break;const e=(c.start-r.bpStart)/r.bpPerPixel;if(Number.isNaN(e))continue;const h=s(c.value),d=(c.end-r.bpStart)/r.bpPerPixel,u=Math.max(1,d-e),f=Math.min(o,h-i);t.fillStyle=Q(c.value,n,l),t.fillRect(e,i,u,f),c.value>n.dataRange.max?(t.fillStyle=n.overflowColor,t.fillRect(e,0,u,3)):c.value<n.dataRange.min&&(t.fillStyle=n.overflowColor,t.fillRect(e,o-2,u,3))}}(t,e,n,r,o,a,l,s,c);break;case"line":!function(t,e,n,r,o,s,i){let a,l=-1;for(const c of e){if(c.end<r.bpStart)continue;if(c.start>s)break;const e=(c.start-r.bpStart)/r.bpPerPixel;if(Number.isNaN(e))continue;const h=o(c.value),d=(c.end-r.bpStart)/r.bpPerPixel-e,u=Q(c.value,n,i);t.strokeStyle=u,t.lineWidth=1.5,void 0!==a&&(t.beginPath(),t.moveTo(l,a),t.lineTo(e,h),t.stroke()),t.beginPath(),t.moveTo(e,h),t.lineTo(e+d,h),t.stroke(),l=e+d,a=h}}(t,e,n,r,a,s,c);break;case"points":!function(t,e,n,r,o,s,i,a){const l=n.pointSize/2;for(const c of e){if(c.end<r.bpStart)continue;if(c.start>i)break;const e=(c.start-r.bpStart)/r.bpPerPixel;if(Number.isNaN(e))continue;const h=s(c.value),d=e+((c.end-r.bpStart)/r.bpPerPixel-e)/2,u=Q(c.value,n,a);t.fillStyle=u,t.beginPath(),t.arc(d,h,l,0,2*Math.PI),t.fill(),c.value>n.dataRange.max?(t.fillStyle=n.overflowColor,t.beginPath(),t.arc(d,l,l,0,2*Math.PI),t.fill()):c.value<n.dataRange.min&&(t.fillStyle=n.overflowColor,t.beginPath(),t.arc(d,o-l,l,0,2*Math.PI),t.fill())}}(t,e,n,r,o,a,s,c);break;case"dynseq":!function(t,e,n,r,o,s,i,a,l){var c;const h=null!==(c=n.nucleotideColors)&&void 0!==c?c:j;for(const c of e){if(c.end<r.bpStart)continue;if(c.start>a)break;const e=(c.start-r.bpStart)/r.bpPerPixel;if(Number.isNaN(e))continue;const d=s(c.value),u=(c.end-r.bpStart)/r.bpPerPixel,f=Math.max(1,u-e);if(c.sequence&&r.bpPerPixel<2)Z(t,c.sequence,e,f,d,i,c.value,h,n.background);else{const r=Math.min(o,d-i);t.fillStyle=Q(c.value,n,l),t.fillRect(e,i,f,r)}c.value>n.dataRange.max?(t.fillStyle=n.overflowColor,t.fillRect(e,0,f,3)):c.value<n.dataRange.min&&(t.fillStyle=n.overflowColor,t.fillRect(e,o-2,f,3))}}(t,e,n,r,o,a,l,s,c)}!function(t,e,n,r){if(e.dataRange.min>=0)return;let{min:o,max:s}=e.dataRange;e.logScale&&(o=o<0?-Math.log10(Math.abs(o)+1):Math.log10(Math.abs(o)+1),s=s<0?-Math.log10(Math.abs(s)+1):Math.log10(Math.abs(s)+1));const i=s/(s-o),a=e.flipAxis?(1-i)*r:i*r;t.strokeStyle=e.baselineColor,t.lineWidth=1,t.beginPath(),t.moveTo(0,a),t.lineTo(n,a),t.stroke()}(t,n,r.pixelWidth,o),function(t,e,n,r){if(e.guideLines){for(const o of e.guideLines){const e=r(o.y);t.strokeStyle=o.color,t.lineWidth=2,o.dotted?t.setLineDash([5,5]):t.setLineDash([]),t.beginPath(),t.moveTo(0,e),t.lineTo(n,e),t.stroke()}t.setLineDash([])}}(t,n,r.pixelWidth,a),function(t,e,n){var r,o;if(!e.showDataRange)return;const{min:s,max:i}=e.dataRange,a=tt(e.flipAxis?s:i),l=tt(e.flipAxis?i:s);t.font=e.labelFont,t.textBaseline="top",t.textAlign="left";const c=t.measureText(a),h=c.width+6,d=(null!==(r=c.actualBoundingBoxDescent)&&void 0!==r?r:10)+4;t.fillStyle=e.background,t.globalAlpha=.7,t.fillRect(4,4,h,d),t.globalAlpha=1,t.fillStyle=e.labelColor,t.fillText(a,7,6),t.textBaseline="bottom";const u=t.measureText(l),f=u.width+6,m=(null!==(o=u.actualBoundingBoxAscent)&&void 0!==o?o:10)+4,p=n-4;t.fillStyle=e.background,t.globalAlpha=.7,t.fillRect(4,p-m,f,m),t.globalAlpha=1,t.fillStyle=e.labelColor,t.fillText(l,7,p-2)}(t,n,o),function(t,e,n){var r,o;if(!e.trackName)return;if(n<12)return;t.font="normal 10px sans-serif",t.textBaseline="top",t.textAlign="left";let s=4;if(e.showDataRange){t.save(),t.font=e.labelFont;const n=tt(e.flipAxis?e.dataRange.min:e.dataRange.max),o=(null!==(r=t.measureText(n).actualBoundingBoxDescent)&&void 0!==r?r:10)+4;t.restore(),t.font="normal 10px sans-serif",s=4+o+2}const i=t.measureText(e.trackName),a=i.width+8,l=(null!==(o=i.actualBoundingBoxDescent)&&void 0!==o?o:10)+4;t.fillStyle=e.background,t.globalAlpha=.75,t.fillRect(4,s,a,l),t.globalAlpha=1,t.strokeStyle=e.labelColor,t.globalAlpha=.3,t.lineWidth=.5,t.strokeRect(4,s,a,l),t.globalAlpha=1,t.fillStyle=e.labelColor,t.fillText(e.trackName,8,s+2)}(t,n,o)}class nt{constructor(t,e){this.bin=t,this.sumData=e.value,this.count=1,this.min=e.value,this.max=e.value}add(t){this.sumData+=t.value,this.max=Math.max(t.value,this.max),this.min=Math.min(t.value,this.min),this.count++}}function rt(t,e,n,r="mean"){if(n<=1||!t||0===t.length||"none"===r)return t;const o=t[0].chr,s=n,i=[],a=t=>{const n=e+t.bin*s,a=n+s;let l;switch(r){case"mean":l=t.sumData/t.count;break;case"max":l=t.max;break;case"min":l=t.min;break;default:throw Error(`Unknown window function: ${r}`)}const c=`${r} of ${t.count} values`;i.push({chr:o,start:n,end:a,value:l,description:c})};let l;for(const n of t){let t=Math.floor((n.start-e)/s);const r=Math.floor((n.end-e)/s);if(l&&t===l.bin&&(l.add(n),t++),!l||r>l.bin){if(l&&a(l),r>t){const t=e+r*s;i.push({chr:o,start:n.start,end:t,value:n.value})}l=new nt(r,n)}}if(l&&a(l),0===i.length)return i;const c=[];let h=i[0];for(const t of i)h.value===t.value&&t.start<=h.end?h={...h,end:t.end}:(c.push(h),h=t);return c.push(h),c}function ot(t){if(!t||0===t.length)return{min:0,max:100};let e=Number.MAX_VALUE,n=-Number.MAX_VALUE;for(const r of t)Number.isNaN(r.value)||(r.value<e&&(e=r.value),r.value>n&&(n=r.value));return e===Number.MAX_VALUE?{min:0,max:100}:(n>0&&(e=Math.min(0,e)),n<0&&(n=0),{min:e,max:n})}var st=Object.freeze({__proto__:null,summarizeWigData:rt,computeWigDataRange:ot});class it extends u{constructor(t,e){const n=M(S(e.theme),e.config);void 0!==e.background&&(n.background=e.background),super(t,e.locus,n,e.canvasProvider),this._lastDataRange=null,this._seqAbort=null,this.type="wig",this.features=e.features,this.fixedHeight=e.height,this._name=e.name,this._sequenceProvider=e.sequenceProvider}set onWindowFunctionChange(t){this._onWindowFunctionChange=t}setFeatures(t){this.features=t,"dynseq"===this._config.graphType?this.augmentWithSequence():this.render()}setLocus(t){this._locus=t,"dynseq"===this._config.graphType?this.augmentWithSequence():this.render()}setConfig(t){const e="dynseq"===this._config.graphType;super.setConfig(t),e||"dynseq"!==this._config.graphType||this.augmentWithSequence()}augmentWithSequence(){if(!this._sequenceProvider||0===this.features.length)return void this.render();const t=this._canvas.clientWidth;if(0===t)return void this.render();if((this._locus.end-this._locus.start)/t>=2)return void this.render();this._seqAbort&&this._seqAbort.abort();const e=new AbortController;this._seqAbort=e;const n={chr:this._locus.chr,start:Math.floor(this._locus.start),end:Math.ceil(this._locus.end)};this._sequenceProvider(n,e.signal).then(t=>{e.signal.aborted||(this._seqAbort=null,this.features=this.features.map(e=>{const r=Math.max(0,Math.floor(e.start)-n.start),o=Math.min(t.length,Math.floor(e.end)-n.start);return r>=o||r>=t.length?e:{...e,sequence:t.slice(r,o)}}),this.render())}).catch(()=>{e.signal.aborted||(this._seqAbort=null,this.render())}),this.render()}computeHeight(t){var e;return null!==(e=this.fixedHeight)&&void 0!==e?e:this.config.height}getBackground(){return this.config.background}doRender(t,e,n,r){if(0===this.features.length)return;const o=null!=this.config.normalizationFactor&&1!==this.config.normalizationFactor||null!=this.config.scaleFactor&&1!==this.config.scaleFactor?this.features.map(t=>{var e,n;return{...t,value:t.value*(null!==(e=this.config.normalizationFactor)&&void 0!==e?e:1)*(null!==(n=this.config.scaleFactor)&&void 0!==n?n:1)}}):this.features,s={...this.config,height:n,trackName:this._name};if(this.config.autoscale){const t=r.bpStart+r.pixelWidth*r.bpPerPixel,e=ot(o.filter(e=>e.end>=r.bpStart&&e.start<=t));s.dataRange=e,this._config={...this._config,dataRange:e}}this._lastDataRange=s.dataRange,console.log("[wig doRender]",{logScale:s.logScale,autoscale:s.autoscale,flipAxis:s.flipAxis,dataRange:s.dataRange,featureCount:o.length}),et(t,o,s,r)}getAxisInfo(){if(this._lastDataRange)return{dataRange:this._lastDataRange,color:"string"==typeof this.config.color?this.config.color:void 0,label:this._name,flipAxis:this.config.flipAxis||void 0,logScale:this.config.logScale||void 0}}getContextMenuItems(t,e){const n=this._sequenceProvider?["bar","line","points","dynseq"]:["bar","line","points"];return[{label:"Flip y-axis",type:"checkbox",checked:this._config.flipAxis,action:()=>this.setConfig({flipAxis:!this._config.flipAxis})},{label:"Graph type",children:n.map(t=>({label:t.charAt(0).toUpperCase()+t.slice(1),type:"checkbox",checked:this._config.graphType===t,action:()=>this.setConfig({graphType:t})}))},{label:"Windowing function",children:["mean","min","max"].map(t=>({label:t.charAt(0).toUpperCase()+t.slice(1),type:"checkbox",checked:this._config.windowFunction===t,action:()=>{this.setConfig({windowFunction:t}),this._onWindowFunctionChange&&this._onWindowFunctionChange(t)}}))}]}getNumericState(){return{autoscale:this._config.autoscale,logScale:this._config.logScale,dataRange:this._config.dataRange,setAutoscale:t=>this.setConfig({autoscale:t}),setLogScale:t=>this.setConfig({logScale:t}),setDataRange:(t,e)=>this.setConfig({dataRange:{min:t,max:e},autoscale:!1})}}hitTest(t,e){if(0===this.features.length)return[];const n=this._canvas.clientWidth;if(0===n)return[];const r=(this._locus.end-this._locus.start)/n,o=this._locus.start+t*r;for(const t of this.features)if(o>=t.start&&o<t.end)return[{feature:t,popupData:at(t)}];return[]}serializeConfig(t){const e=M(t),n={};let r=!1;const o=this.config;return o.height!==e.height&&(n.height=o.height,r=!0),o.graphType!==e.graphType&&(n.graphType=o.graphType,r=!0),o.windowFunction!==e.windowFunction&&(n.windowFunction=o.windowFunction,r=!0),!o.autoscale&&o.dataRange&&(n.dataRange=o.dataRange,n.autoscale=!1,r=!0),o.autoscale!==e.autoscale&&(n.autoscale=o.autoscale,r=!0),"string"==typeof o.color&&o.color!==e.color&&(n.color=o.color,r=!0),"string"==typeof o.altColor&&o.altColor!==e.altColor&&(n.altColor=o.altColor,r=!0),null!=o.alpha&&o.alpha!==e.alpha&&(n.alpha=o.alpha,r=!0),o.flipAxis!==e.flipAxis&&(n.flipAxis=o.flipAxis,r=!0),o.logScale!==e.logScale&&(n.logScale=o.logScale,r=!0),o.baselineColor!==e.baselineColor&&(n.baselineColor=o.baselineColor,r=!0),o.overflowColor!==e.overflowColor&&(n.overflowColor=o.overflowColor,r=!0),o.pointSize!==e.pointSize&&(n.pointSize=o.pointSize,r=!0),o.background!==e.background&&(n.background=o.background,r=!0),null!=o.scaleFactor&&1!==o.scaleFactor&&(n.scaleFactor=o.scaleFactor,r=!0),null!=o.normalizationFactor&&1!==o.normalizationFactor&&(n.normalizationFactor=o.normalizationFactor,r=!0),o.showDataRange!==e.showDataRange&&(n.showDataRange=o.showDataRange,r=!0),o.labelColor!==e.labelColor&&(n.labelColor=o.labelColor,r=!0),o.labelFont!==e.labelFont&&(n.labelFont=o.labelFont,r=!0),{type:"wig",config:r?n:void 0}}}function at(t){const e=[];return t.chr&&e.push({name:"Chr",value:t.chr}),e.push({name:"Start",value:Math.floor(t.start).toLocaleString()}),e.push({name:"End",value:Math.ceil(t.end).toLocaleString()}),e.push({name:"Value",value:Number.isInteger(t.value)?t.value:t.value.toPrecision(6)}),t.description&&e.push({name:"Description",value:t.description}),e}const lt="rgba(68, 134, 247, 0.15)",ct="rgba(155, 185, 129, 0.2)";let ht=0;function dt(){return`roi_${Date.now().toString(36)}_${(++ht).toString(36)}`}class ut{constructor(t){var e,n;this._features=[],this.name=t.name,this.color=null!==(e=t.color)&&void 0!==e?e:t.isUserDefined?ct:lt,this.isUserDefined=null!==(n=t.isUserDefined)&&void 0!==n&&n,t.features&&(this._features=t.features.map(t=>({...t})))}get features(){return this._features}addFeature(t){var e;const n={...t,id:t.id||dt(),color:null!==(e=t.color)&&void 0!==e?e:this.color};return this._features.push(n),this._features.sort((t,e)=>t.start-e.start),n}removeFeature(t){const e=this._features.findIndex(e=>e.id===t);if(!(e<0))return this._features.splice(e,1)[0]}updateFeature(t,e){const n=this._features.find(e=>e.id===t);if(n)return Object.assign(n,e),("start"in e||"end"in e)&&this._features.sort((t,e)=>t.start-e.start),n}findById(t){return this._features.find(e=>e.id===t)}getFeatures(t,e,n){return this._features.filter(r=>r.chr===t&&r.end>e&&r.start<n)}toJSON(){return{name:this.name,color:this.color,isUserDefined:this.isUserDefined||void 0,features:this._features.map(t=>({...t}))}}}function ft(t,e,n,r){var o;const{totalHeight:s,headerHeight:i=4,font:a="9px sans-serif",labelColor:l="rgba(0,0,0,0.7)"}=r;for(const r of e){const e=Math.round((r.start-n.bpStart)/n.bpPerPixel),c=Math.max(3,Math.round((r.end-r.start)/n.bpPerPixel));if(e+c<0||e>n.pixelWidth)continue;const h=null!==(o=r.color)&&void 0!==o?o:"rgba(68, 134, 247, 0.15)";if(t.fillStyle=h,t.fillRect(e,0,c,s),t.strokeStyle=h.replace(/[\d.]+\)$/,t=>`${Math.min(1,3*parseFloat(t))})`),t.lineWidth=1,t.beginPath(),t.moveTo(e+.5,0),t.lineTo(e+.5,s),t.moveTo(e+c-.5,0),t.lineTo(e+c-.5,s),t.stroke(),i>0&&(t.fillStyle=h.replace(/[\d.]+\)$/,t=>`${Math.min(1,4*parseFloat(t))})`),t.fillRect(e,0,c,i)),r.name&&c>20){t.font=a,t.fillStyle=l,t.textBaseline="top",t.textAlign="left";const n=e+3,o=i+1;t.fillText(r.name,n,o,c-6)}}}function mt(t,e){let n=t;for(const t of Object.keys(e))n=n.replace(new RegExp("\\{"+t+"\\}","gi"),String(e[t]));return n}function pt(t){const e="ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";let n;do{n="";for(let t=0;t<12;t++)n+=e[Math.floor(51*Math.random())]}while(t[n]);return n}function gt(t){const e={left:"start",right:"end",center:"middle",start:"start",end:"end"};return e[t]||e.start}function vt(t){const e={alphabetic:"alphabetic",hanging:"hanging",top:"text-before-edge",bottom:"text-after-edge",middle:"central"};return e[t]||e.alphabetic}function _t(t){const e=Math.sqrt(t[0]*t[0]+t[1]*t[1]);return[t[0]/e,t[1]/e]}const bt=function(t,e=10){const n={},r=t.split(",");for(let t=0;t<r.length;t+=2){const o="&"+r[t+1]+";",s=parseInt(r[t],e);n[o]="&#"+s+";"}return n["\\xa0"]=" ",n}("50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,t9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro",32),wt={strokeStyle:{svgAttr:"stroke",canvas:"#000000",svg:"none",apply:"stroke"},fillStyle:{svgAttr:"fill",canvas:"#000000",svg:null,apply:"fill"},lineCap:{svgAttr:"stroke-linecap",canvas:"butt",svg:"butt",apply:"stroke"},lineJoin:{svgAttr:"stroke-linejoin",canvas:"miter",svg:"miter",apply:"stroke"},miterLimit:{svgAttr:"stroke-miterlimit",canvas:10,svg:4,apply:"stroke"},lineWidth:{svgAttr:"stroke-width",canvas:1,svg:1,apply:"stroke"},globalAlpha:{svgAttr:"opacity",canvas:1,svg:1,apply:"fill stroke"},font:{canvas:"10px sans-serif"},shadowColor:{canvas:"#000000"},shadowOffsetX:{canvas:0},shadowOffsetY:{canvas:0},shadowBlur:{canvas:0},textAlign:{canvas:"start"},textBaseline:{canvas:"alphabetic"},lineDash:{svgAttr:"stroke-dasharray",canvas:null,svg:null,apply:"stroke"}};class xt{constructor(t,e){this.__root=t,this.__ctx=e}addColorStop(t,e){const n=this.__ctx.__createElement("stop");if(n.setAttribute("offset",String(t)),e&&-1!==e.indexOf("rgba")){const t=/rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?\.?\d*)\s*\)/gi.exec(e);t&&(n.setAttribute("stop-color",mt("rgb({r},{g},{b})",{r:t[1],g:t[2],b:t[3]})),n.setAttribute("stop-opacity",t[4]))}else n.setAttribute("stop-color",e);this.__root.appendChild(n)}}class yt{constructor(t,e){this.__root=t,this.__ctx=e}}class kt{constructor(t={}){var e,n,r;if(this.isSVG=!0,this.__currentElementsToStyle=null,this.__ids={},this.__stack=[],this.__groupStack=[],this.__currentDefaultPath="",this.__currentPosition={x:0,y:0},this.strokeStyle="#000000",this.fillStyle="#000000",this.lineCap="butt",this.lineJoin="miter",this.miterLimit=10,this.lineWidth=1,this.globalAlpha=1,this.font="10px sans-serif",this.shadowColor="#000000",this.shadowOffsetX=0,this.shadowOffsetY=0,this.shadowBlur=0,this.textAlign="start",this.textBaseline="alphabetic",this.lineDash=null,this.globalCompositeOperation="source-over",this.config=t,this.width=null!==(e=t.width)&&void 0!==e?e:500,this.height=null!==(n=t.height)&&void 0!==n?n:500,this.enableMirroring=null!==(r=t.enableMirroring)&&void 0!==r&&r,this.canvas=this,this.__document=document,t.ctx?(this.__ctx=t.ctx,this.__canvas=t.ctx.canvas):(this.__canvas=this.__document.createElement("canvas"),this.__ctx=this.__canvas.getContext("2d")),this.__setDefaultStyles(),this.__stack=[this.__getStyleState()],this.__groupStack=[],this.__root=this.__createElement("svg"),this.__root.setAttribute("width",String(this.width)),this.__root.setAttribute("height",String(this.height)),this.__root.setAttribute("overflow","visible"),t.viewbox){const e=t.viewbox;this.__root.setAttribute("viewBox",`${e.x} ${e.y} ${e.width} ${e.height}`),this.viewbox=t.viewbox}this.__ids={},this.__defs=this.__createElement("defs"),this.__root.appendChild(this.__defs);const o=this.__createElement("rect",{id:"svg_output_backdrop",width:"100%",height:"100%",fill:t.backdropColor||"white"});this.__root.appendChild(o),this.__rootGroup=this.__createElement("g",{id:"root-group"}),this.__root.appendChild(this.__rootGroup),this.__currentElement=this.__rootGroup}setWidth(t){this.width=t,this.__root.setAttribute("width",String(t)),this.config.viewbox&&this.__root.setAttribute("viewBox",`${this.config.viewbox.x} ${this.config.viewbox.y} ${t} ${this.config.viewbox.height}`)}setHeight(t){this.height=t,this.__root.setAttribute("height",String(t)),this.config.viewbox&&this.__root.setAttribute("viewBox",`${this.config.viewbox.x} ${this.config.viewbox.y} ${this.config.viewbox.width} ${t}`)}__createElement(t,e,n){const r=this.__document.createElementNS("http://www.w3.org/2000/svg",t);if(n&&(r.setAttribute("fill","none"),r.setAttribute("stroke","none")),e)for(const t of Object.keys(e))r.setAttribute(t,String(e[t]));return r}__setDefaultStyles(){for(const t of Object.keys(wt))this[t]=wt[t].canvas}__applyStyleState(t){for(const e of Object.keys(t))this[e]=t[e]}__getStyleState(){const t={};for(const e of Object.keys(wt))t[e]=this[e];return t}__applyStyleToCurrentElement(t){let e=this.__currentElement;const n=this.__currentElementsToStyle;n&&(e.setAttribute(t,""),e=n.element,n.children.forEach(e=>e.setAttribute(t,"")));for(const n of Object.keys(wt)){const r=wt[n],o=this[n];if(r.apply)if(o instanceof yt){if(o.__ctx)for(;o.__ctx.__defs.childNodes.length;){const t=o.__ctx.__defs.childNodes[0],e=t.getAttribute("id");this.__ids[e]=e,this.__defs.appendChild(t)}e.setAttribute(r.apply,mt("url(#{id})",{id:o.__root.getAttribute("id")}))}else if(o instanceof xt)e.setAttribute(r.apply,mt("url(#{id})",{id:o.__root.getAttribute("id")}));else if(-1!==r.apply.indexOf(t)&&r.svg!==o)if("stroke"!==r.svgAttr&&"fill"!==r.svgAttr||"string"!=typeof o||-1===o.indexOf("rgba")){let s=r.svgAttr;if("globalAlpha"===n&&(s=t+"-"+r.svgAttr,e.getAttribute(s)))continue;e.setAttribute(s,String(o))}else{const t=/rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d?\.?\d*)\s*\)/gi.exec(o);if(t){e.setAttribute(r.svgAttr,mt("rgb({r},{g},{b})",{r:t[1],g:t[2],b:t[3]}));let n=parseFloat(t[4]);null!=this.globalAlpha&&(n*=this.globalAlpha),e.setAttribute(r.svgAttr+"-opacity",String(n))}}}}__closestGroupOrSvg(t){const e=t||this.__currentElement;return"g"===e.nodeName||"svg"===e.nodeName?e:this.__closestGroupOrSvg(e.parentNode)}getSerializedSvg(t){let e=(new XMLSerializer).serializeToString(this.__root);if(t)for(const t of Object.keys(bt)){const n=new RegExp(t,"gi");n.test(e)&&(e=e.replace(n,bt[t]))}return e}getSvg(){return this.__root}saveWithTranslationAndClipRect(t,e,n,r,o,s){const i=`${t}_clip_rect`,a=this.__createElement("clipPath",{id:i});this.__defs.appendChild(a),a.appendChild(this.__createElement("rect",{x:"0",y:String(s),width:String(r),height:String(o)}));const l=this.__createElement("g");l.setAttribute("transform",mt("translate({x},{y})",{x:e,y:n})),l.setAttribute("clip-path",mt("url(#{id})",{id:i}));const c=this.__closestGroupOrSvg();c.appendChild(l),this.__groupStack.push(c),this.__currentElement=l,this.__stack.push(this.__getStyleState())}save(){const t=this.__createElement("g"),e=this.__closestGroupOrSvg();this.__groupStack.push(e),e.appendChild(t),this.__currentElement=t,this.__stack.push(this.__getStyleState())}restore(){this.__currentElement=this.__groupStack.pop(),this.__currentElementsToStyle=null,this.__currentElement||(this.__currentElement=this.__root.childNodes[2]);const t=this.__stack.pop();t&&this.__applyStyleState(t)}__addTransform(t){const e=this.__closestGroupOrSvg();if(e.childNodes.length>0){"path"===this.__currentElement.nodeName&&(this.__currentElementsToStyle||(this.__currentElementsToStyle={element:e,children:[]}),this.__currentElementsToStyle.children.push(this.__currentElement),this.__applyCurrentDefaultPath());const t=this.__createElement("g");e.appendChild(t),this.__currentElement=t}let n=this.__currentElement.getAttribute("transform");n?n+=" ":n="",n+=t,this.__currentElement.setAttribute("transform",n)}scale(t,e){void 0===e&&(e=t),this.__addTransform(mt("scale({x},{y})",{x:t,y:e}))}rotate(t){const e=180*t/Math.PI;this.__addTransform(mt("rotate({angle},{cx},{cy})",{angle:e,cx:0,cy:0}))}translate(t,e){this.__addTransform(mt("translate({x},{y})",{x:t,y:e}))}transform(t,e,n,r,o,s){this.__addTransform(mt("matrix({a},{b},{c},{d},{e},{f})",{a:t,b:e,c:n,d:r,e:o,f:s}))}beginPath(){this.__currentDefaultPath="",this.__currentPosition={x:0,y:0};const t=this.__createElement("path",{},!0);this.__closestGroupOrSvg().appendChild(t),this.__currentElement=t}__applyCurrentDefaultPath(){"path"===this.__currentElement.nodeName&&this.__currentElement.setAttribute("d",this.__currentDefaultPath)}__addPathCommand(t){this.__currentDefaultPath+=" "+t}moveTo(t,e){"path"!==this.__currentElement.nodeName&&this.beginPath(),this.__currentPosition={x:t,y:e},this.__addPathCommand(mt("M {x} {y}",{x:t,y:e}))}closePath(){this.__currentDefaultPath&&this.__addPathCommand("Z")}lineTo(t,e){this.__currentPosition={x:t,y:e},this.__currentDefaultPath&&this.__currentDefaultPath.indexOf("M")>-1?this.__addPathCommand(mt("L {x} {y}",{x:t,y:e})):this.__addPathCommand(mt("M {x} {y}",{x:t,y:e}))}bezierCurveTo(t,e,n,r,o,s){this.__currentPosition={x:o,y:s},this.__addPathCommand(mt("C {cp1x} {cp1y} {cp2x} {cp2y} {x} {y}",{cp1x:t,cp1y:e,cp2x:n,cp2y:r,x:o,y:s}))}quadraticCurveTo(t,e,n,r){this.__currentPosition={x:n,y:r},this.__addPathCommand(mt("Q {cpx} {cpy} {x} {y}",{cpx:t,cpy:e,x:n,y:r}))}roundRect(t,e,n,r,o){let s;s=null==o?[0,0,0,0]:"number"==typeof o?[o,o,o,o]:1===o.length?[o[0],o[0],o[0],o[0]]:2===o.length?[o[0],o[1],o[0],o[1]]:3===o.length?[o[0],o[1],o[2],o[1]]:[o[0],o[1],o[2],o[3]];const i=Math.min(Math.abs(n)/2,Math.abs(r)/2);for(let t=0;t<4;t++)s[t]=Math.min(s[t],i);this.moveTo(t+s[0],e),this.lineTo(t+n-s[1],e),s[1]&&this.arcTo(t+n,e,t+n,e+s[1],s[1]),this.lineTo(t+n,e+r-s[2]),s[2]&&this.arcTo(t+n,e+r,t+n-s[2],e+r,s[2]),this.lineTo(t+s[3],e+r),s[3]&&this.arcTo(t,e+r,t,e+r-s[3],s[3]),this.lineTo(t,e+s[0]),s[0]&&this.arcTo(t,e,t+s[0],e,s[0]),this.closePath()}arcTo(t,e,n,r,o){var s,i;const a=null===(s=this.__currentPosition)||void 0===s?void 0:s.x,l=null===(i=this.__currentPosition)||void 0===i?void 0:i.y;if(void 0===a||void 0===l)return;if(o<0)throw new Error("IndexSizeError: The radius provided ("+o+") is negative.");if(a===t&&l===e||t===n&&e===r||0===o)return void this.lineTo(t,e);const c=_t([a-t,l-e]),h=_t([n-t,r-e]);if(c[0]*h[1]===c[1]*h[0])return void this.lineTo(t,e);const d=c[0]*h[0]+c[1]*h[1],u=Math.acos(Math.abs(d)),f=_t([c[0]+h[0],c[1]+h[1]]),m=o/Math.sin(u/2),p=t+m*f[0],g=e+m*f[1],v=[-c[1],c[0]],_=[h[1],-h[0]],b=t=>t[1]>=0?Math.acos(t[0]):-Math.acos(t[0]),w=b(v),x=b(_);this.lineTo(p+v[0]*o,g+v[1]*o),this.arc(p,g,o,w,x)}stroke(){"path"===this.__currentElement.nodeName&&this.__currentElement.setAttribute("paint-order","fill stroke markers"),this.__applyCurrentDefaultPath(),this.__applyStyleToCurrentElement("stroke")}fill(){"path"===this.__currentElement.nodeName&&this.__currentElement.setAttribute("paint-order","stroke fill markers"),this.__applyCurrentDefaultPath(),this.__applyStyleToCurrentElement("fill")}rect(t,e,n,r){"path"!==this.__currentElement.nodeName&&this.beginPath(),this.moveTo(t,e),this.lineTo(t+n,e),this.lineTo(t+n,e+r),this.lineTo(t,e+r),this.lineTo(t,e),this.closePath()}fillRect(t,e,n,r){r<0&&(e+=r,r=-r),n<0&&(t+=n,n=-n);const o={x:t,y:e,width:n,height:r};if(this.viewbox&&(s=this.viewbox,i=o,!(s.x<i.x+i.width&&s.x+s.width>i.x&&s.y<i.y+i.height&&s.y+s.height>i.y)))return;var s,i;const a=this.__createElement("rect",o,!0);this.__closestGroupOrSvg().appendChild(a),this.__currentElement=a,this.__applyStyleToCurrentElement("fill")}strokeRect(t,e,n,r){const o=this.__createElement("rect",{x:t,y:e,width:n,height:r},!0);this.__closestGroupOrSvg().appendChild(o),this.__currentElement=o,this.__applyStyleToCurrentElement("stroke")}strokeEllipse(t,e,n,r,o,s,i,a){this.__ellipse(t,e,n,r,"stroke")}fillEllipse(t,e,n,r,o,s,i,a){this.__ellipse(t,e,n,r,"fill")}__ellipse(t,e,n,r,o){const s=this.__createElement("ellipse",{cx:t,cy:e,rx:n,ry:r},!0);this.__closestGroupOrSvg().appendChild(s),this.__currentElement=s,this.__applyStyleToCurrentElement(o)}__clearCanvas(){const t=this.__closestGroupOrSvg().getAttribute("transform"),e=this.__root.childNodes[2],n=e.childNodes;for(let t=n.length-1;t>=0;t--)n[t]&&e.removeChild(n[t]);this.__currentElement=e,this.__groupStack=[],t&&this.__addTransform(t)}clearRect(t,e,n,r){if(0===t&&0===e&&n===this.width&&r===this.height)return void this.__clearCanvas();const o=this.__closestGroupOrSvg(),s=this.__createElement("rect",{x:t,y:e,width:n,height:r,fill:"#FFFFFF"},!0);o.appendChild(s)}createLinearGradient(t,e,n,r){const o=this.__createElement("linearGradient",{id:pt(this.__ids),x1:t+"px",x2:n+"px",y1:e+"px",y2:r+"px",gradientUnits:"userSpaceOnUse"});return this.__defs.appendChild(o),new xt(o,this)}createRadialGradient(t,e,n,r,o,s){const i=this.__createElement("radialGradient",{id:pt(this.__ids),cx:r+"px",cy:o+"px",r:s+"px",fx:t+"px",fy:e+"px",gradientUnits:"userSpaceOnUse"});return this.__defs.appendChild(i),new xt(i,this)}__parseFont(){const t=/^\s*(?=(?:(?:[-a-z]+\s*){0,2}(italic|oblique))?)(?=(?:(?:[-a-z]+\s*){0,2}(small-caps))?)(?=(?:(?:[-a-z]+\s*){0,2}(bold(?:er)?|lighter|[1-9]00))?)(?:(?:normal|\1|\2|\3)\s*){0,3}((?:xx?-)?(?:small|large)|medium|smaller|larger|[.\d]+(?:%|in|[cem]m|ex|p[ctx]))(?:\s*\/\s*(normal|[.\d]+(?:%|in|[cem]m|ex|p[ctx])))?\s*([-,'"\sa-z0-9]+?)\s*$/i.exec(this.font),e={style:(null==t?void 0:t[1])||"normal",size:(null==t?void 0:t[4])||"10px",family:(null==t?void 0:t[6])||"sans-serif",weight:(null==t?void 0:t[3])||"normal",decoration:(null==t?void 0:t[2])||"normal",href:null};return"underline"===this.__fontUnderline&&(e.decoration="underline"),this.__fontHref&&(e.href=this.__fontHref),e}__wrapTextLink(t,e){if(t.href){const n=this.__createElement("a");return n.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",t.href),n.appendChild(e),n}return e}__applyText(t,e,n,r){const o=this.__parseFont(),s=this.__closestGroupOrSvg(),i=this.__createElement("text",{"font-family":o.family,"font-size":o.size,"font-style":o.style,"font-weight":o.weight,"text-decoration":o.decoration,x:e,y:n,"text-anchor":gt(this.textAlign),"dominant-baseline":vt(this.textBaseline)},!0);i.appendChild(this.__document.createTextNode(t)),this.__currentElement=i,this.__applyStyleToCurrentElement(r),s.appendChild(this.__wrapTextLink(o,i))}fillText(t,e,n){this.__applyText(t,e,n,"fill")}strokeText(t,e,n){this.__applyText(t,e,n,"stroke")}measureText(t){return this.__ctx.font=this.font,this.__ctx.measureText(t)}arc(t,e,n,r,o,s){if(r===o)return;(r%=2*Math.PI)===(o%=2*Math.PI)&&(o=(o+2*Math.PI-.001*(s?-1:1))%(2*Math.PI));const i=t+n*Math.cos(o),a=e+n*Math.sin(o),l=t+n*Math.cos(r),c=e+n*Math.sin(r),h=s?0:1;let d=o-r;d<0&&(d+=2*Math.PI);const u=s?d>Math.PI?0:1:d>Math.PI?1:0;this.lineTo(l,c),this.__addPathCommand(mt("A {rx} {ry} {xAxisRotation} {largeArcFlag} {sweepFlag} {endX} {endY}",{rx:n,ry:n,xAxisRotation:0,largeArcFlag:u,sweepFlag:h,endX:i,endY:a})),this.__currentPosition={x:i,y:a}}clip(){const t=this.__closestGroupOrSvg(),e=this.__createElement("clipPath"),n=pt(this.__ids),r=this.__createElement("g");this.__applyCurrentDefaultPath(),t.removeChild(this.__currentElement),e.setAttribute("id",n),e.appendChild(this.__currentElement),this.__defs.appendChild(e),t.setAttribute("clip-path",mt("url(#{id})",{id:n})),t.appendChild(r),this.__currentElement=r}drawImage(t,...e){let n,r,o,s,i,a,l=0,c=0;if(2===e.length)n=e[0],r=e[1],i=t.width,a=t.height,o=i,s=a;else if(4===e.length)n=e[0],r=e[1],o=e[2],s=e[3],i=t.width,a=t.height;else{if(8!==e.length)throw new Error("Invalid number of arguments passed to drawImage: "+(e.length+1));l=e[0],c=e[1],i=e[2],a=e[3],n=e[4],r=e[5],o=e[6],s=e[7]}const h=this.__closestGroupOrSvg(),d=`translate(${n}, ${r})`;if(t instanceof kt){const e=t.getSvg().cloneNode(!0);if(e.childNodes&&e.childNodes.length>1){const t=e.childNodes[0];for(;t.childNodes.length;){const e=t.childNodes[0],n=e.getAttribute("id");n&&(this.__ids[n]=n),this.__defs.appendChild(e)}const n=e.childNodes[1];if(n){const t=n.getAttribute("transform");n.setAttribute("transform",t?t+" "+d:d),h.appendChild(n)}}}else{const e=t,n=this.__createElement("image");n.setAttribute("width",String(o)),n.setAttribute("height",String(s)),n.setAttribute("preserveAspectRatio","none");let r=e;if(l||c||i!==e.width||a!==e.height){const t=this.__document.createElement("canvas");t.width=o,t.height=s;t.getContext("2d").drawImage(e,l,c,i,a,0,0,o,s),r=t}n.setAttribute("transform",d),"toDataURL"in r?n.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",r.toDataURL()):n.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",r.getAttribute("src")||""),h.appendChild(n)}}createPattern(t,e){const n=this.__createElement("pattern"),r=pt(this.__ids);if(n.setAttribute("id",r),n.setAttribute("width",String(t.width)),n.setAttribute("height",String(t.height)),t instanceof kt)n.appendChild(t.__root.childNodes[1]),this.__defs.appendChild(n);else{const e=this.__createElement("image");e.setAttribute("width",String(t.width)),e.setAttribute("height",String(t.height)),"toDataURL"in t?e.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",t.toDataURL()):e.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",t.getAttribute("src")||""),n.appendChild(e),this.__defs.appendChild(n)}return new yt(n,this)}setLineDash(t){t&&t.length>0?this.lineDash=t.join(","):this.lineDash=null}getLineDash(){return this.lineDash?this.lineDash.split(",").map(Number):[]}drawFocusIfNeeded(){}createImageData(){return new ImageData(1,1)}getImageData(){return new ImageData(1,1)}putImageData(){}setTransform(){}}class Ct{constructor(){this.listeners=new Map}on(t,e){let n=this.listeners.get(t);return n||(n=new Set,this.listeners.set(t,n)),n.add(e),()=>{n.delete(e)}}off(t,e){var n;e?null===(n=this.listeners.get(t))||void 0===n||n.delete(e):this.listeners.delete(t)}emit(t,e){const n=this.listeners.get(t);if(n)for(const t of n)t(e)}removeAllListeners(){this.listeners.clear()}}function It(t,e,n){if(t.locus.chr!==e.chr)return!1;if(t.locus.start>e.start||t.locus.end<e.end)return!1;const r=n/t.bpPerPixel;return r>=.7&&r<=1.3}function St(t){if(K(t))return t;const e=t.end-t.start,n=Math.floor(1*e);return{chr:t.chr,start:Math.max(0,Math.floor(t.start-n)),end:Math.ceil(t.end+n)}}function Tt(t){const e=t.chr,n=e.toUpperCase(),r=e.toLowerCase(),o=e.charAt(0).toUpperCase()+e.slice(1);e!==n&&(t._uppercase=n),e!==r&&(t._lowercase=r),e!==o&&(t._cap=o),t._chrprefix_=e.startsWith("chr")?e.substring(3):"chr"+e}function Mt(t){const e=t.split("|").filter(t=>t.length>0);return e[e.length-1]}function Et(t){return t.startsWith("hg")||t.startsWith("GRCh")||"1kg_ref"===t||"b37"===t}function Pt(t){return t.startsWith("mm")||t.startsWith("GRCm")||t.startsWith("rheMac")}class Rt{constructor(t,e){this.cache=new Map,this.buildAliases(t,null!=e?e:"")}getChromosomeName(t){const e=this.cache.get(t);return null==e?void 0:e.chr}getAliasRecord(t){return this.cache.get(t)}buildAliases(t,e){const n=[];for(const r of t){if(this.cache.has(r))continue;const t={chr:r};if(n.push(t),r.startsWith("gi|")){const e=Mt(r);t["ncbi-gi-versioned"]=e;const n=e.lastIndexOf(".");n>0&&(t["ncbi-gi"]=e.substring(0,n))}else"chrM"===r?t.ncbi="MT":"MT"===r?t.ucsc="chrM":r.toLowerCase().startsWith("chr")&&Number.isInteger(Number(r.substring(3)))?t.ncbi=r.substring(3):Number.isInteger(Number(r))&&(t.ucsc="chr"+r),Et(e)?this.addHumanSexAliases(r,t):Pt(e)&&this.addMouseSexAliases(r,t)}for(const t of n){Tt(t);for(const e of Object.values(t))this.cache.set(e,t)}}addHumanSexAliases(t,e){switch(t){case"23":e.ucsc="chrX",e.assembly="X";break;case"24":e.ucsc="chrY",e.assembly="Y";break;case"chrX":e.ncbi="23",e.assembly="X";break;case"chrY":e.ncbi="24",e.assembly="Y";break;case"X":e.ucsc="chrX",e.ncbi="23";break;case"Y":e.ucsc="chrY",e.ncbi="24"}}addMouseSexAliases(t,e){switch(t){case"21":e.ucsc="chrX",e.assembly="X";break;case"22":e.ucsc="chrY",e.assembly="Y";break;case"chrX":e.ncbi="21",e.assembly="X";break;case"chrY":e.ncbi="22",e.assembly="Y";break;case"X":e.ucsc="chrX",e.ncbi="21";break;case"Y":e.ucsc="chrY",e.ncbi="22"}}}function Lt(t,e){return null==e?void 0:e[t]}const At=/^chr(\d+|X|Y|M)$/i;function Ot(t){return At.test(t)}function Ft(t){return Object.keys(t).filter(Ot).sort((t,e)=>Nt(t)-Nt(e))}function Nt(t){const e=t.replace(/^chr/i,"");if("X"===e||"x"===e)return 23;if("Y"===e||"y"===e)return 24;if("M"===e||"m"===e)return 25;const n=parseInt(e,10);return isNaN(n)?100:n}function Kt(t){const e=Ft(t),n={};let r=0;for(const o of e)n[o]=Math.floor(r),r+=t[o];return{offsets:n,totalLength:Math.floor(r),chromosomeNames:e}}function Dt(t,e){for(let n=e.chromosomeNames.length-1;n>=0;n--){const r=e.chromosomeNames[n],o=e.offsets[r];if(t>=o)return{chr:r,position:t-o}}return{chr:e.chromosomeNames[0],position:Math.max(0,t)}}function Ut(t){const e={};for(const n of t.split("\n")){const t=n.trim();if(!t||t.startsWith("#"))continue;const r=t.split("\t");if(r.length>=2){const t=r[0],n=parseInt(r[1],10);t&&!isNaN(n)&&n>0&&(e[t]=n)}}return e}const zt={chr1:248956422,chr2:242193529,chr3:198295559,chr4:190214555,chr5:181538259,chr6:170805979,chr7:159345973,chr8:145138636,chr9:138394717,chr10:133797422,chr11:135086622,chr12:133275309,chr13:114364328,chr14:107043718,chr15:101991189,chr16:90338345,chr17:83257441,chr18:80373285,chr19:58617616,chr20:64444167,chr21:46709983,chr22:50818468,chrX:156040895,chrY:57227415,chrM:16569,chr11_KI270721v1_random:100316,chr14_GL000009v2_random:201709,chr14_GL000225v1_random:211173,chr14_KI270722v1_random:194050,chr14_GL000194v1_random:191469,chr14_KI270723v1_random:38115,chr14_KI270724v1_random:39555,chr14_KI270725v1_random:172810,chr14_KI270726v1_random:43739,chr15_KI270727v1_random:448248,chr16_KI270728v1_random:1872759,chr17_GL000205v2_random:185591,chr17_KI270729v1_random:280839,chr17_KI270730v1_random:112551,chr1_KI270706v1_random:175055,chr1_KI270707v1_random:32032,chr1_KI270708v1_random:127682,chr1_KI270709v1_random:66860,chr1_KI270710v1_random:40176,chr1_KI270711v1_random:42210,chr1_KI270712v1_random:176043,chr1_KI270713v1_random:40745,chr1_KI270714v1_random:41717,chr22_KI270731v1_random:150754,chr22_KI270732v1_random:41543,chr22_KI270733v1_random:179772,chr22_KI270734v1_random:165050,chr22_KI270735v1_random:42811,chr22_KI270736v1_random:181920,chr22_KI270737v1_random:103838,chr22_KI270738v1_random:99375,chr22_KI270739v1_random:73985,chr2_KI270715v1_random:161471,chr2_KI270716v1_random:153799,chr3_GL000221v1_random:155397,chr4_GL000008v2_random:209709,chr5_GL000208v1_random:92689,chr9_KI270717v1_random:40062,chr9_KI270718v1_random:38054,chr9_KI270719v1_random:176845,chr9_KI270720v1_random:39050,chr1_KI270762v1_alt:354444,chr1_KI270766v1_alt:256271,chr1_KI270760v1_alt:109528,chr1_KI270765v1_alt:185285,chr1_GL383518v1_alt:182439,chr1_GL383519v1_alt:110268,chr1_GL383520v2_alt:366580,chr1_KI270764v1_alt:50258,chr1_KI270763v1_alt:911658,chr1_KI270759v1_alt:425601,chr1_KI270761v1_alt:165834,chr2_KI270770v1_alt:136240,chr2_KI270773v1_alt:70887,chr2_KI270774v1_alt:223625,chr2_KI270769v1_alt:120616,chr2_GL383521v1_alt:143390,chr2_KI270772v1_alt:133041,chr2_KI270775v1_alt:138019,chr2_KI270771v1_alt:110395,chr2_KI270768v1_alt:110099,chr2_GL582966v2_alt:96131,chr2_GL383522v1_alt:123821,chr2_KI270776v1_alt:174166,chr2_KI270767v1_alt:161578,chr3_JH636055v2_alt:173151,chr3_KI270783v1_alt:109187,chr3_KI270780v1_alt:224108,chr3_GL383526v1_alt:180671,chr3_KI270777v1_alt:173649,chr3_KI270778v1_alt:248252,chr3_KI270781v1_alt:113034,chr3_KI270779v1_alt:205312,chr3_KI270782v1_alt:162429,chr3_KI270784v1_alt:184404,chr4_KI270790v1_alt:220246,chr4_GL383528v1_alt:376187,chr4_KI270787v1_alt:111943,chr4_GL000257v2_alt:586476,chr4_KI270788v1_alt:158965,chr4_GL383527v1_alt:164536,chr4_KI270785v1_alt:119912,chr4_KI270789v1_alt:205944,chr4_KI270786v1_alt:244096,chr5_KI270793v1_alt:126136,chr5_KI270792v1_alt:179043,chr5_KI270791v1_alt:195710,chr5_GL383532v1_alt:82728,chr5_GL949742v1_alt:226852,chr5_KI270794v1_alt:164558,chr5_GL339449v2_alt:1612928,chr5_GL383530v1_alt:101241,chr5_KI270796v1_alt:172708,chr5_GL383531v1_alt:173459,chr5_KI270795v1_alt:131892,chr6_GL000250v2_alt:4672374,chr6_KI270800v1_alt:175808,chr6_KI270799v1_alt:152148,chr6_GL383533v1_alt:124736,chr6_KI270801v1_alt:870480,chr6_KI270802v1_alt:75005,chr6_KB021644v2_alt:185823,chr6_KI270797v1_alt:197536,chr6_KI270798v1_alt:271782,chr7_KI270804v1_alt:157952,chr7_KI270809v1_alt:209586,chr7_KI270806v1_alt:158166,chr7_GL383534v2_alt:119183,chr7_KI270803v1_alt:1111570,chr7_KI270808v1_alt:271455,chr7_KI270807v1_alt:126434,chr7_KI270805v1_alt:209988,chr8_KI270818v1_alt:145606,chr8_KI270812v1_alt:282736,chr8_KI270811v1_alt:292436,chr8_KI270821v1_alt:985506,chr8_KI270813v1_alt:300230,chr8_KI270822v1_alt:624492,chr8_KI270814v1_alt:141812,chr8_KI270810v1_alt:374415,chr8_KI270819v1_alt:133535,chr8_KI270820v1_alt:36640,chr8_KI270817v1_alt:158983,chr8_KI270816v1_alt:305841,chr8_KI270815v1_alt:132244,chr9_GL383539v1_alt:162988,chr9_GL383540v1_alt:71551,chr9_GL383541v1_alt:171286,chr9_GL383542v1_alt:60032,chr9_KI270823v1_alt:439082,chr10_GL383545v1_alt:179254,chr10_KI270824v1_alt:181496,chr10_GL383546v1_alt:309802,chr10_KI270825v1_alt:188315,chr11_KI270832v1_alt:210133,chr11_KI270830v1_alt:177092,chr11_KI270831v1_alt:296895,chr11_KI270829v1_alt:204059,chr11_GL383547v1_alt:154407,chr11_JH159136v1_alt:200998,chr11_JH159137v1_alt:191409,chr11_KI270827v1_alt:67707,chr11_KI270826v1_alt:186169,chr12_GL877875v1_alt:167313,chr12_GL877876v1_alt:408271,chr12_KI270837v1_alt:40090,chr12_GL383549v1_alt:120804,chr12_KI270835v1_alt:238139,chr12_GL383550v2_alt:153178,chr12_GL383552v1_alt:138655,chr12_GL383553v2_alt:152874,chr12_KI270834v1_alt:119498,chr12_GL383551v1_alt:184319,chr12_KI270833v1_alt:76061,chr12_KI270836v1_alt:56134,chr13_KI270840v1_alt:191684,chr13_KI270839v1_alt:180306,chr13_KI270843v1_alt:103832,chr13_KI270841v1_alt:169134,chr13_KI270838v1_alt:306913,chr13_KI270842v1_alt:37287,chr14_KI270844v1_alt:322166,chr14_KI270847v1_alt:1511111,chr14_KI270845v1_alt:180703,chr14_KI270846v1_alt:1351393,chr15_KI270852v1_alt:478999,chr15_KI270851v1_alt:263054,chr15_KI270848v1_alt:327382,chr15_GL383554v1_alt:296527,chr15_KI270849v1_alt:244917,chr15_GL383555v2_alt:388773,chr15_KI270850v1_alt:430880,chr16_KI270854v1_alt:134193,chr16_KI270856v1_alt:63982,chr16_KI270855v1_alt:232857,chr16_KI270853v1_alt:2659700,chr16_GL383556v1_alt:192462,chr16_GL383557v1_alt:89672,chr17_GL383563v3_alt:375691,chr17_KI270862v1_alt:391357,chr17_KI270861v1_alt:196688,chr17_KI270857v1_alt:2877074,chr17_JH159146v1_alt:278131,chr17_JH159147v1_alt:70345,chr17_GL383564v2_alt:133151,chr17_GL000258v2_alt:1821992,chr17_GL383565v1_alt:223995,chr17_KI270858v1_alt:235827,chr17_KI270859v1_alt:108763,chr17_GL383566v1_alt:90219,chr17_KI270860v1_alt:178921,chr18_KI270864v1_alt:111737,chr18_GL383567v1_alt:289831,chr18_GL383570v1_alt:164789,chr18_GL383571v1_alt:198278,chr18_GL383568v1_alt:104552,chr18_GL383569v1_alt:167950,chr18_GL383572v1_alt:159547,chr18_KI270863v1_alt:167999,chr19_KI270868v1_alt:61734,chr19_KI270865v1_alt:52969,chr19_GL383573v1_alt:385657,chr19_GL383575v2_alt:170222,chr19_GL383576v1_alt:188024,chr19_GL383574v1_alt:155864,chr19_KI270866v1_alt:43156,chr19_KI270867v1_alt:233762,chr19_GL949746v1_alt:987716,chr20_GL383577v2_alt:128386,chr20_KI270869v1_alt:118774,chr20_KI270871v1_alt:58661,chr20_KI270870v1_alt:183433,chr21_GL383578v2_alt:63917,chr21_KI270874v1_alt:166743,chr21_KI270873v1_alt:143900,chr21_GL383579v2_alt:201197,chr21_GL383580v2_alt:74653,chr21_GL383581v2_alt:116689,chr21_KI270872v1_alt:82692,chr22_KI270875v1_alt:259914,chr22_KI270878v1_alt:186262,chr22_KI270879v1_alt:304135,chr22_KI270876v1_alt:263666,chr22_KI270877v1_alt:101331,chr22_GL383583v2_alt:96924,chr22_GL383582v2_alt:162811,chrX_KI270880v1_alt:284869,chrX_KI270881v1_alt:144206,chr19_KI270882v1_alt:248807,chr19_KI270883v1_alt:170399,chr19_KI270884v1_alt:157053,chr19_KI270885v1_alt:171027,chr19_KI270886v1_alt:204239,chr19_KI270887v1_alt:209512,chr19_KI270888v1_alt:155532,chr19_KI270889v1_alt:170698,chr19_KI270890v1_alt:184499,chr19_KI270891v1_alt:170680,chr1_KI270892v1_alt:162212,chr2_KI270894v1_alt:214158,chr2_KI270893v1_alt:161218,chr3_KI270895v1_alt:162896,chr4_KI270896v1_alt:378547,chr5_KI270897v1_alt:1144418,chr5_KI270898v1_alt:130957,chr6_GL000251v2_alt:4795265,chr7_KI270899v1_alt:190869,chr8_KI270901v1_alt:136959,chr8_KI270900v1_alt:318687,chr11_KI270902v1_alt:106711,chr11_KI270903v1_alt:214625,chr12_KI270904v1_alt:572349,chr15_KI270906v1_alt:196384,chr15_KI270905v1_alt:5161414,chr17_KI270907v1_alt:137721,chr17_KI270910v1_alt:157099,chr17_KI270909v1_alt:325800,chr17_JH159148v1_alt:88070,chr17_KI270908v1_alt:1423190,chr18_KI270912v1_alt:174061,chr18_KI270911v1_alt:157710,chr19_GL949747v2_alt:729520,chr22_KB663609v1_alt:74013,chrX_KI270913v1_alt:274009,chr19_KI270914v1_alt:205194,chr19_KI270915v1_alt:170665,chr19_KI270916v1_alt:184516,chr19_KI270917v1_alt:190932,chr19_KI270918v1_alt:123111,chr19_KI270919v1_alt:170701,chr19_KI270920v1_alt:198005,chr19_KI270921v1_alt:282224,chr19_KI270922v1_alt:187935,chr19_KI270923v1_alt:189352,chr3_KI270924v1_alt:166540,chr4_KI270925v1_alt:555799,chr6_GL000252v2_alt:4604811,chr8_KI270926v1_alt:229282,chr11_KI270927v1_alt:218612,chr19_GL949748v2_alt:1064304,chr22_KI270928v1_alt:176103,chr19_KI270929v1_alt:186203,chr19_KI270930v1_alt:200773,chr19_KI270931v1_alt:170148,chr19_KI270932v1_alt:215732,chr19_KI270933v1_alt:170537,chr19_GL000209v2_alt:177381,chr3_KI270934v1_alt:163458,chr6_GL000253v2_alt:4677643,chr19_GL949749v2_alt:1091841,chr3_KI270935v1_alt:197351,chr6_GL000254v2_alt:4827813,chr19_GL949750v2_alt:1066390,chr3_KI270936v1_alt:164170,chr6_GL000255v2_alt:4606388,chr19_GL949751v2_alt:1002683,chr3_KI270937v1_alt:165607,chr6_GL000256v2_alt:4929269,chr19_GL949752v1_alt:987100,chr6_KI270758v1_alt:76752,chr19_GL949753v2_alt:796479,chr19_KI270938v1_alt:1066800,chrUn_KI270302v1:2274,chrUn_KI270304v1:2165,chrUn_KI270303v1:1942,chrUn_KI270305v1:1472,chrUn_KI270322v1:21476,chrUn_KI270320v1:4416,chrUn_KI270310v1:1201,chrUn_KI270316v1:1444,chrUn_KI270315v1:2276,chrUn_KI270312v1:998,chrUn_KI270311v1:12399,chrUn_KI270317v1:37690,chrUn_KI270412v1:1179,chrUn_KI270411v1:2646,chrUn_KI270414v1:2489,chrUn_KI270419v1:1029,chrUn_KI270418v1:2145,chrUn_KI270420v1:2321,chrUn_KI270424v1:2140,chrUn_KI270417v1:2043,chrUn_KI270422v1:1445,chrUn_KI270423v1:981,chrUn_KI270425v1:1884,chrUn_KI270429v1:1361,chrUn_KI270442v1:392061,chrUn_KI270466v1:1233,chrUn_KI270465v1:1774,chrUn_KI270467v1:3920,chrUn_KI270435v1:92983,chrUn_KI270438v1:112505,chrUn_KI270468v1:4055,chrUn_KI270510v1:2415,chrUn_KI270509v1:2318,chrUn_KI270518v1:2186,chrUn_KI270508v1:1951,chrUn_KI270516v1:1300,chrUn_KI270512v1:22689,chrUn_KI270519v1:138126,chrUn_KI270522v1:5674,chrUn_KI270511v1:8127,chrUn_KI270515v1:6361,chrUn_KI270507v1:5353,chrUn_KI270517v1:3253,chrUn_KI270529v1:1899,chrUn_KI270528v1:2983,chrUn_KI270530v1:2168,chrUn_KI270539v1:993,chrUn_KI270538v1:91309,chrUn_KI270544v1:1202,chrUn_KI270548v1:1599,chrUn_KI270583v1:1400,chrUn_KI270587v1:2969,chrUn_KI270580v1:1553,chrUn_KI270581v1:7046,chrUn_KI270579v1:31033,chrUn_KI270589v1:44474,chrUn_KI270590v1:4685,chrUn_KI270584v1:4513,chrUn_KI270582v1:6504,chrUn_KI270588v1:6158,chrUn_KI270593v1:3041,chrUn_KI270591v1:5796,chrUn_KI270330v1:1652,chrUn_KI270329v1:1040,chrUn_KI270334v1:1368,chrUn_KI270333v1:2699,chrUn_KI270335v1:1048,chrUn_KI270338v1:1428,chrUn_KI270340v1:1428,chrUn_KI270336v1:1026,chrUn_KI270337v1:1121,chrUn_KI270363v1:1803,chrUn_KI270364v1:2855,chrUn_KI270362v1:3530,chrUn_KI270366v1:8320,chrUn_KI270378v1:1048,chrUn_KI270379v1:1045,chrUn_KI270389v1:1298,chrUn_KI270390v1:2387,chrUn_KI270387v1:1537,chrUn_KI270395v1:1143,chrUn_KI270396v1:1880,chrUn_KI270388v1:1216,chrUn_KI270394v1:970,chrUn_KI270386v1:1788,chrUn_KI270391v1:1484,chrUn_KI270383v1:1750,chrUn_KI270393v1:1308,chrUn_KI270384v1:1658,chrUn_KI270392v1:971,chrUn_KI270381v1:1930,chrUn_KI270385v1:990,chrUn_KI270382v1:4215,chrUn_KI270376v1:1136,chrUn_KI270374v1:2656,chrUn_KI270372v1:1650,chrUn_KI270373v1:1451,chrUn_KI270375v1:2378,chrUn_KI270371v1:2805,chrUn_KI270448v1:7992,chrUn_KI270521v1:7642,chrUn_GL000195v1:182896,chrUn_GL000219v1:179198,chrUn_GL000220v1:161802,chrUn_GL000224v1:179693,chrUn_KI270741v1:157432,chrUn_GL000226v1:15008,chrUn_GL000213v1:164239,chrUn_KI270743v1:210658,chrUn_KI270744v1:168472,chrUn_KI270745v1:41891,chrUn_KI270746v1:66486,chrUn_KI270747v1:198735,chrUn_KI270748v1:93321,chrUn_KI270749v1:158759,chrUn_KI270750v1:148850,chrUn_KI270751v1:150742,chrUn_KI270752v1:27745,chrUn_KI270753v1:62944,chrUn_KI270754v1:40191,chrUn_KI270755v1:36723,chrUn_KI270756v1:79590,chrUn_KI270757v1:71251,chrUn_GL000214v1:137718,chrUn_KI270742v1:186739,chrUn_GL000216v2:176608,chrUn_GL000218v1:161147,chrY_KI270740v1_random:37240},Gt=1e5;function Wt(t){let e=[],n=null;return async function(r,o){const{chr:s,start:i,end:a}=r;let l=e.find(t=>function(t,e,n,r){return t.chr===e&&t.start<=n&&t.end>=r}(t,s,i,a));var c;l||(l=await async function(e,r,o,s){let i=r,a=o;if(o-r<Gt){const t=Math.round(r+(o-r)/2);i=Math.max(0,t-5e4),a=i+Gt}i=Math.floor(i),a=Math.ceil(a);const l={chr:e,start:i,end:a};if(n&&n.interval.chr===e&&n.interval.start<=r&&n.interval.end>=o)return n.promise;const c=t(l,s).then(t=>(n=null,{chr:e,start:i,end:a,sequence:t}));return n={interval:l,promise:c},c}(s,i,a,o),c=l,e=e.filter(t=>{return n=t,!((e=c).chr===n.chr&&e.start<=n.start&&e.end>=n.end);var e,n}),e.length>=10&&e.shift(),e.push(l));const h=i-l.start,d=a-i;return l.sequence.substring(h,h+d)}}async function qt(t,e={},n){var r;const o=`https://api.genome.ucsc.edu/getData/sequence?genome=${null!==(r=e.genome)&&void 0!==r?r:"hg38"}&chrom=${t.chr}&start=${t.start}&end=${t.end}`,s=await fetch(o,n?{signal:n}:void 0);if(!s.ok)throw new Error(`UCSC sequence API error: ${s.status} ${s.statusText}`);return(await s.json()).dna}const $t={hg38:zt},Ht={hg38:"Human (GRCh38/hg38)"};class Bt{constructor(t,e,n){this.id=t,this.name=null==n?void 0:n.name,this.chromSizes=e,this.chromosomeNames=Ft(e),this.cumulativeOffsets=Kt(e),this.sequence=null==n?void 0:n.sequence,this._chromosomes=new Map;const r=Object.keys(e),o=new Set(this.chromosomeNames);let s=0;for(const t of this.chromosomeNames)this._chromosomes.set(t,{name:t,bpLength:e[t],order:s++});for(const t of r)o.has(t)||this._chromosomes.set(t,{name:t,bpLength:e[t],order:s++});this._chromAlias=new Rt(r,t)}getChromosome(t){return this._chromosomes.get(t)}getChromosomeLength(t){return this.chromSizes[t]}getChromosomeName(t){var e;return null!==(e=this._chromAlias.getChromosomeName(t))&&void 0!==e?e:t}getAliasRecord(t){return this._chromAlias.getAliasRecord(t)}}function jt(t){var e,n;const r=null!==(e=t.id)&&void 0!==e?e:"custom",o=null!==(n=t.name)&&void 0!==n?n:Ht[r],s=Vt(t);return new Bt(r,t.chromSizes,{name:o,sequence:s})}async function Xt(t){var e,n;let r;if(t.chromSizes)r=t.chromSizes;else if(t.chromSizesURL){const e=await fetch(t.chromSizesURL);if(!e.ok)throw new Error(`Failed to fetch chrom.sizes: ${e.status} ${e.statusText}`);r=Ut(await e.text())}else{if(!t.id||!$t[t.id])throw new Error(`GenomeConfig must provide chromSizes, chromSizesURL, or a known genome id. Known IDs: ${Object.keys($t).join(", ")}`);r=$t[t.id]}const o=null!==(e=t.id)&&void 0!==e?e:"custom",s=null!==(n=t.name)&&void 0!==n?n:Ht[o],i=Vt(t);return new Bt(o,r,{name:s,sequence:i})}function Vt(t){var e;if(t.sequenceProvider)return t.sequenceProvider;const n=null!==(e=t.ucscGenome)&&void 0!==e?e:t.id;return n?Wt((t,e)=>qt(t,{genome:n},e)):void 0}const Yt=jt({id:"hg38",chromSizes:zt}),Zt=(()=>{const t=new Map,e=["A","G","C","T","Y","R","W","S","K","M","D","V","H","B","N","X"],n=["T","C","G","A","R","Y","W","S","M","K","H","B","D","V","N","X"];for(let r=0;r<e.length;r++)t.set(e[r],n[r]),t.set(e[r].toLowerCase(),n[r].toLowerCase());return t})();function Jt(t){var e;return null!==(e=Zt.get(t))&&void 0!==e?e:t}function Qt(t){var e;let n="";for(const r of t)n+=null!==(e=Zt.get(r))&&void 0!==e?e:r;return n}function te(t){var e;let n="",r=t.length;for(;r-- >0;){const o=t[r];n+=null!==(e=Zt.get(o))&&void 0!==e?e:o}return n}const ee={TTT:"F",TTC:"F",TTA:"L",TTG:"L",CTT:"L",CTC:"L",CTA:"L",CTG:"L",ATT:"I",ATC:"I",ATA:"I",ATG:"M",GTT:"V",GTC:"V",GTA:"V",GTG:"V",TCT:"S",TCC:"S",TCA:"S",TCG:"S",AGT:"S",AGC:"S",CCT:"P",CCC:"P",CCA:"P",CCG:"P",ACT:"T",ACC:"T",ACA:"T",ACG:"T",GCT:"A",GCC:"A",GCA:"A",GCG:"A",TAT:"Y",TAC:"Y",TAA:"STOP",TAG:"STOP",TGA:"STOP",CAT:"H",CAC:"H",CAA:"Q",CAG:"Q",AAT:"N",AAC:"N",AAA:"K",AAG:"K",GAT:"D",GAC:"D",GAA:"E",GAG:"E",TGT:"C",TGC:"C",TGG:"W",CGT:"R",CGC:"R",CGA:"R",CGG:"R",AGA:"R",AGG:"R",GGT:"G",GGC:"G",GGA:"G",GGG:"G"};function ne(t,e=!1){var n;const r=[[],[],[]];for(let o=0;o<3;o++){let s=o;for(;t.length-s>=3;){let i=t.slice(s,s+3);e&&(i=i.split("").reverse().join(""));const a=null!==(n=ee[i.toUpperCase()])&&void 0!==n?n:"";r[o].push({codons:i,aminoA:a}),s+=3}}return r}function re(t,e){var n;return e.color?e.color:"dna"===e.sequenceType?null!==(n=e.nucleotideColors[t.toUpperCase()])&&void 0!==n?n:"#808080":e.nonDnaColor}function oe(t,e,n,r){if(!e||!e.sequence)return;let o=e.sequence;n.reversed&&(o=o.split("").map(t=>Jt(t)).join(""));const s=e.bpStart,i=1+r.bpStart+r.pixelWidth*r.bpPerPixel,{sequenceHeight:a,frameBorder:l}=n;for(let e=Math.floor(r.bpStart);e<=i;e++){const i=Math.floor(e-s);if(i<0||i>=o.length)continue;const c=(e-r.bpStart)/r.bpPerPixel,h=1/r.bpPerPixel,d=o[i],u=re(d,n);if(r.bpPerPixel>.1)t.fillStyle=u,t.fillRect(c,l,h,a-l);else{const e=c+.5*(h-t.measureText(d).width);t.strokeStyle=u,t.strokeText(d,e,a)}}if(n.frameTranslate){let e=a+2*l;const i=ne(o,n.reversed),c=n.codonBorderRadius;for(let o=0;o<i.length;o++){const a=i[o];for(let i=0;i<a.length;i++){let l=i%2==0?n.frameColor1:n.frameColor2;const h=a[i],d=s+o+3*i-r.bpStart,u=Math.floor(d/r.bpPerPixel),f=Math.floor((d+3)/r.bpPerPixel),m=Math.round((u+f)/2);if(f<0)continue;if(u>r.pixelWidth)break;let p=h.aminoA,g=!1;if(h.aminoA.indexOf("STOP")>-1?(l=n.stopCodonColor,p="STOP",g=!0):"M"===h.aminoA&&(l=n.startCodonColor,p="START",g=!0),t.fillStyle=l,g&&c>0?(t.beginPath(),t.roundRect(u,e,f-u,n.frameHeight,c),t.fill()):t.fillRect(u,e,f-u,n.frameHeight),r.bpPerPixel<=.1){t.font=n.frameFont;const r=t.measureText(p).width,o=g&&n.codonLabelColor?n.codonLabelColor:n.frameLabelColor;t.fillStyle=o,t.fillText(p,m-r/2,e+15)}}e+=n.frameHeight+l}}}class se extends u{constructor(t,e){const n=S(e.theme),r=P(n,e.config);super(t,e.locus,r,e.canvasProvider),this.type="sequence",this._sequence=null,this._theme=n}shouldFetchSequence(t){return t<=10}setFeatures(t){this._sequence=t.length>0?t[0]:null,this.render()}setSequence(t){this._sequence=t,this.render()}getSequence(){return this._sequence}toggleReversed(){this.setConfig({reversed:!this._config.reversed})}toggleFrameTranslate(){this.setConfig({frameTranslate:!this._config.frameTranslate})}getContextMenuItems(t,e){return[{label:this._config.reversed?"Forward":"Reverse",action:()=>this.toggleReversed()},{label:this._config.frameTranslate?"Close Translation":"Three-frame Translate",action:()=>this.toggleFrameTranslate()}]}computeHeight(t){return this._config.frameTranslate?this._config.translatedHeight:this._config.defaultHeight}getBackground(){return this._config.background}doRender(t,e,n,r){oe(t,this._sequence,this._config,r)}serializeConfig(t){const e=P(t),n={};this._config.sequenceType!==e.sequenceType&&(n.sequenceType=this._config.sequenceType),this._config.reversed!==e.reversed&&(n.reversed=this._config.reversed),this._config.frameTranslate!==e.frameTranslate&&(n.frameTranslate=this._config.frameTranslate),this._config.color!==e.color&&(n.color=this._config.color),this._config.background!==e.background&&(n.background=this._config.background);const r={type:"sequence"};return Object.keys(n).length>0&&(r.config=n),r}}class ie{constructor(t,e=!0){this.littleEndian=e,this.position=0,this.view=t,this.length=t.byteLength}setPosition(t){this.position=t}available(){return this.length-this.position}remLength(){return this.length-this.position}getByte(){const t=this.view.getUint8(this.position);return this.position++,t}getShort(){const t=this.view.getInt16(this.position,this.littleEndian);return this.position+=2,t}getUShort(){const t=this.view.getUint16(this.position,this.littleEndian);return this.position+=2,t}getInt(){const t=this.view.getInt32(this.position,this.littleEndian);return this.position+=4,t}getUInt(){const t=this.view.getUint32(this.position,this.littleEndian);return this.position+=4,t}getLong(){const t=[];for(let e=0;e<8;e++)t[e]=this.view.getUint8(this.position+e);let e=0;if(this.littleEndian)for(let n=7;n>=0;n--)e=256*e+t[n];else for(let n=0;n<8;n++)e=256*e+t[n];return this.position+=8,e}getString(t){let e,n="";for(;0!==(e=this.view.getUint8(this.position++))&&(n+=String.fromCharCode(e),!t||n.length!==t););return n}getFixedLengthString(t){let e="";for(let n=0;n<t;n++){const t=this.view.getUint8(this.position++);t>0&&(e+=String.fromCharCode(t))}return e}getFloat(){const t=this.view.getFloat32(this.position,this.littleEndian);return this.position+=4,t}getDouble(){const t=this.view.getFloat64(this.position,this.littleEndian);return this.position+=8,t}skip(t){return this.position+=t,this.position}}const ae=new Map;function le(t,e,n){var r,o,s,i,a,l;if(void 0===t.score&&!t.summary)return;let c;if(t.summary)switch(n){case"min":c=null!==(o=null!==(r=t.minScore)&&void 0!==r?r:t.score)&&void 0!==o?o:0;break;case"max":c=null!==(i=null!==(s=t.maxScore)&&void 0!==s?s:t.score)&&void 0!==i?i:0;break;default:c=null!==(a=t.score)&&void 0!==a?a:0}else c=null!==(l=t.score)&&void 0!==l?l:0;return{chr:e,start:t.start,end:t.end,value:c}}class ce{constructor(n,r){this.bw=function(n){let r=ae.get(n);return r||(r=new t({filehandle:new e(n)}),ae.set(n,r)),r}(n)}async loadHeader(t){const e=await this.bw.getHeader({signal:t});return{bwVersion:e.version,nZoomLevels:e.numZoomLevels,chromTreeOffset:e.chromosomeTreeOffset,fullDataOffset:e.unzoomedDataOffset,fullIndexOffset:e.unzoomedIndexOffset,fieldCount:e.fieldCount,definedFieldCount:e.definedFieldCount,autoSqlOffset:e.asOffset,totalSummaryOffset:e.totalSummaryOffset,uncompressBuffSize:e.uncompressBufSize,extensionOffset:e.extHeaderOffset}}async getTotalSummary(t){const e=(await this.bw.getHeader({signal:t})).totalSummary;if(!e)return;const n=e.basesCovered>0?e.scoreSum/e.basesCovered:0,r=e.basesCovered>0?e.scoreSumSquares/e.basesCovered-n*n:0;return{basesCovered:e.basesCovered,minVal:e.scoreMin,maxVal:e.scoreMax,sumData:e.scoreSum,sumSquares:e.scoreSumSquares,mean:n,stddev:Math.sqrt(Math.max(0,r))}}async readFeatures(t,e,n,r,o="mean",s){const i={signal:s};r&&"none"!==o&&(i.basesPerSpan=r);const a=await this.bw.getFeatures(t,e,n,i),l=[];for(const e of a){const n=le(e,t,o);n&&l.push(n)}return l}async readWGFeatures(t,e,n="mean",r){const o=[];for(const s of t)try{const t=await this.readFeatures(s,0,Number.MAX_SAFE_INTEGER,e,n,r);o.push(...t)}catch(t){}return o}}async function he(t,e,n={}){var r;return new ce(t,n.workerProvider).readFeatures(e.chr,e.start,e.end,n.bpPerPixel,null!==(r=n.windowFunction)&&void 0!==r?r:"mean",n.signal)}async function de(t,e,n,r={}){var o;return new ce(t,r.workerProvider).readWGFeatures(e,n,null!==(o=r.windowFunction)&&void 0!==o?o:"mean",r.signal)}function ue(){ae.clear()}class fe{constructor(t,e="mean",n){this.url=t,this._windowFunction=e,this.workerProvider=n}get windowFunction(){return this._windowFunction}setWindowFunction(t){this._windowFunction=t}setCumulativeOffsets(t){this._cumulativeOffsets=t}setChromNameResolver(t){this._resolveChromName=t}async fetch(t,e,n){if(K(t)&&this._cumulativeOffsets)return this.fetchWG(e,n);const r=this._resolveChromName?{...t,chr:this._resolveChromName(t.chr)}:t,o=await he(this.url,r,{bpPerPixel:e,windowFunction:this._windowFunction,workerProvider:this.workerProvider,signal:n});return e>1&&"none"!==this._windowFunction&&o.length>0?this.workerProvider?this.workerProvider.execute({task:"summarize",features:o,startBP:t.start,bpPerPixel:e,windowFunction:this._windowFunction}):rt(o,t.start,e,this._windowFunction):o}async fetchWG(t,e){const n=this._cumulativeOffsets,r=await de(this.url,n.chromosomeNames,t,{windowFunction:this._windowFunction,workerProvider:this.workerProvider,signal:e}),o=[];for(const t of r){const e=n.offsets[t.chr];void 0!==e&&o.push({...t,chr:"all",start:e+t.start,end:e+t.end})}return o.sort((t,e)=>t.start-e.start),t>1&&"none"!==this._windowFunction&&o.length>0?this.workerProvider?this.workerProvider.execute({task:"summarize",features:o,startBP:0,bpPerPixel:t,windowFunction:this._windowFunction}):rt(o,0,t,this._windowFunction):o}}async function me(t,e,n){const r=e.start+e.size-1,o={Range:`bytes=${e.start}-${r}`};let s=await fetch(t,{headers:o,signal:n});if(200===s.status&&s.redirected&&s.url&&s.url!==t&&(s=await fetch(s.url,{headers:o,signal:n})),416===s.status){const r=await pe(t,n),o=Math.min(e.size,r-e.start);if(o<=0)throw new Error(`HTTP range request failed: 416 Range Not Satisfiable (file size: ${r})`);return me(t,{start:e.start,size:o},n)}if(!s.ok&&206!==s.status)throw new Error(`HTTP range request failed: ${s.status} ${s.statusText}`);if(200===s.status){return(await s.arrayBuffer()).slice(e.start,e.start+e.size)}return s.arrayBuffer()}async function pe(t,e){let n=await fetch(t,{method:"HEAD",signal:e});if(n.redirected&&n.url&&n.url!==t){n.headers.get("Content-Length")||(n=await fetch(n.url,{method:"HEAD",signal:e}))}if(!n.ok)throw new Error(`HEAD request failed: ${n.status} ${n.statusText}`);const r=n.headers.get("Content-Length");if(!r)throw new Error("No Content-Length header in HEAD response");return parseInt(r,10)}class ge{constructor(t,e=512e3){this.url=t,this.bufferSize=e,this.cachedRange={start:-1,size:-1}}async dataViewForRange(t,e,n=0){try{if(!(void 0!==this.cachedData&&this.cachedRange.start<=t.start&&this.cachedRange.start+this.cachedRange.size>=t.start+t.size)){let n=t.size?Math.max(this.bufferSize,t.size):this.bufferSize;this.contentLength&&(n=Math.min(n,this.contentLength-t.start));const r={start:t.start,size:n};this.cachedData=await me(this.url,r,e),this.cachedRange=r}const n=t.start-this.cachedRange.start,r=this.cachedData.byteLength;return new DataView(this.cachedData,n,r-n)}catch(r){if(0===n&&r instanceof Error&&r.message.includes("416"))try{return this.contentLength=await pe(this.url,e),this.dataViewForRange(t,e,n+1)}catch(t){console.error(t)}throw r}}async loadArrayBuffer(t,e){return me(this.url,t,e)}}let ve,_e,be,we,xe,ye=!1;function ke(){const t=ve.buffer;_e=new Int8Array(t),be=new Uint8Array(t)}const Ce={};let Ie;function Se(t,e){return Math.ceil(t/e)*e}const Te={a:function(t){},b:function(){},c:function(){!function(t){const e="Aborted("+(null!=t?t:"")+")";throw new WebAssembly.RuntimeError(e)}("")},d:function(t,e){if(Ce[t]&&(clearTimeout(Ce[t].id),delete Ce[t]),!e)return 0;const n=setTimeout(()=>{delete Ce[t],Ie(t,performance.now())},e);return Ce[t]={id:n,timeout_ms:e},0},e:function(t){const e=be.length,n=2147483648;if((t>>>=0)>n)return!1;for(let r=1;r<=4;r*=2){let o=e*(1+.2/r);o=Math.min(o,t+100663296);const s=(Math.min(n,Se(Math.max(t,o),65536))-ve.buffer.byteLength+65535)/65536|0;try{return ve.grow(s),ke(),!0}catch(t){}}return!1}};async function Me(){if(!ye)return xe||(xe=async function(){const t=new URL("./zstd.wasm",import.meta.url),e={a:Te};let n;if("function"==typeof WebAssembly.instantiateStreaming)try{const r=fetch(t.href,{credentials:"same-origin"});n=await WebAssembly.instantiateStreaming(r,e)}catch(r){const o=await fetch(t.href,{credentials:"same-origin"}),s=await o.arrayBuffer();n=await WebAssembly.instantiate(s,e)}else{const r=await fetch(t.href,{credentials:"same-origin"}),o=await r.arrayBuffer();n=await WebAssembly.instantiate(o,e)}const r=n.instance.exports;ve=r.f,ke(),r.g(),Ie=r.v,we=r,ye=!0}(),xe)}const Ee=5788743,Pe=[5e4,1e5,2e5,5e5,1e6];function Re(t,e){for(const n of Pe)if(Math.ceil(t/n)===e)return n;return Math.ceil(t/e)}class Le{constructor(t){this.experiments=[],this.experimentIdToIndex=new Map,this.chromosomes=new Map,this.chromOrder=[],this.tileIndexCache=new Map,this.zoomLevels=[],this.zoomTileIndexCache=new Map,this.initialized=!1,this.url=t}async init(t){if(!this.initialized)return this.initPromise||(this.initPromise=this._doInit().catch(t=>{throw this.initPromise=void 0,t})),this.initPromise}async _doInit(){await Me();const t=await me(this.url,{start:0,size:256});this.header=this.parseHeader(new ie(new DataView(t),!0));const e=this.header,n=e.dictionaryOffset-e.experimentMetadataOffset,r=e.experimentMetadataOffset,o=n+e.dictionarySize,s=e.chromDirectoryOffset,i=e.nZoomLevels>0&&e.zoomDirectoryOffset>0,a=this.computeDirFetchSize(e),[l,c]=await Promise.all([me(this.url,{start:r,size:o}),me(this.url,{start:s,size:a})]);this.parseExperimentMetadata(new ie(new DataView(l,0,n),!0)),this.dictionary=new Uint8Array(l,n,e.dictionarySize),this.dctx=function(){if(!ye)throw new Error("zstd WASM not initialized — call initZstd() first");return we.n()}();const h=i?Math.min(e.zoomDirectoryOffset-e.chromDirectoryOffset,c.byteLength):c.byteLength;if(this.parseChromDirectory(new ie(new DataView(c,0,h),!0)),i){const t=e.zoomDirectoryOffset-s,n=c.byteLength-t-8;t>=0&&n>0&&this.parseZoomDirectory(new ie(new DataView(c,t,n),!0))}this.initialized=!0}parseHeader(t){const e=t.getUInt();if(e!==Ee)throw new Error(`Not a GTX file (magic: 0x${e.toString(16)}, expected 0x${Ee.toString(16)})`);const n=t.getUShort(),r=t.getUShort();return{version:n,genome:t.getFixedLengthString(r),nExperiments:t.getUInt(),resolution:t.getUInt(),payloadEncoding:t.getByte(),nZoomLevels:t.getByte(),chromDirectoryOffset:this.readU64(t),experimentMetadataOffset:this.readU64(t),dictionaryOffset:this.readU64(t),dictionarySize:t.getUInt(),zoomDirectoryOffset:this.readU64(t),groupStatsDirectoryOffset:this.readU64(t)}}parseExperimentMetadata(t){const e=t.getUInt();for(let n=0;n<e;n++){const e=t.getUShort(),n=t.getFixedLengthString(e),r=t.getUInt(),o=t.getUShort(),s=new Map;for(let e=0;e<o;e++){const e=t.getUShort(),n=t.getFixedLengthString(e),r=t.getUShort(),o=t.getFixedLengthString(r);s.set(n,o)}const i={id:n,experimentIndex:r,metadata:s};this.experiments.push(i),this.experimentIdToIndex.set(n,r)}}parseChromDirectory(t){const e=t.getUShort();for(let n=0;n<e;n++){const e=t.getUShort(),n=t.getFixedLengthString(e),r=t.getUInt(),o=this.readU64(t),s=t.getUInt(),i=t.getUInt();this.chromosomes.set(n,{name:n,length:r,tileIndexOffset:o,tileIndexLength:s,nTiles:i}),this.chromOrder.push(n)}}parseZoomDirectory(t){var e;const n=t.getByte();for(let r=0;r<n;r++){const n=t.getUInt(),r=t.getUShort(),o=new Map;for(let n=0;n<r;n++){const r=this.readU64(t),s=t.getUInt(),i=t.getUInt(),a=null!==(e=this.chromOrder[n])&&void 0!==e?e:`chrom_${n}`;o.set(a,{tileIndexOffset:r,tileIndexLength:s,nTiles:i})}this.zoomLevels.push({reductionLevel:n,chromTileIndexes:o})}}async loadTileIndex(t,e){await this.init(e);const n=this.tileIndexCache.get(t);if(n)return n;const r=this.chromosomes.get(t);if(!r)throw new Error(`Unknown chromosome: ${t}`);const o=await me(this.url,{start:r.tileIndexOffset,size:r.tileIndexLength},e),s=this.parseTileIndex(new ie(new DataView(o),!0),r.nTiles);return this.tileIndexCache.set(t,s),s}async loadZoomTileIndex(t,e,n){const r=`${t}:${e}`,o=this.zoomTileIndexCache.get(r);if(o)return o;const s=this.zoomLevels[t];if(!s)throw new Error(`Unknown zoom level: ${t}`);const i=s.chromTileIndexes.get(e);if(!i)throw new Error(`Unknown chromosome in zoom: ${e}`);const a=await me(this.url,{start:i.tileIndexOffset,size:i.tileIndexLength},n),l=this.parseTileIndex(new ie(new DataView(a),!0),i.nTiles);return this.zoomTileIndexCache.set(r,l),l}parseTileIndex(t,e){const n=t.getUInt(),r=t.getUInt();if(n!==e)throw new Error(`Tile count mismatch: expected ${e}, got ${n}`);const o=[];for(let n=0;n<e;n++){const e=this.readU64(t),n=t.getUInt(),s=[];for(let e=0;e<r;e++){const e=this.readU64(t),n=t.getUInt();s.push({offset:e,size:n})}o.push({positionsOffset:e,positionsSize:n,experimentPointers:s})}return o}async readFeatures(t,e,n,r,o,s){await this.init(s);const i=this.header;if(void 0!==o&&o>1){const i=this.selectZoomLevel(o);if(void 0!==i)return this.readZoomFeatures(t,e,n,r,i,s)}const a=this.chromosomes.get(t);if(!a)return new Map;const l=await this.loadTileIndex(t,s),c=Re(a.length,a.nTiles),h=Math.max(0,Math.floor(e/c)),d=Math.min(a.nTiles-1,Math.floor(Math.max(0,n-1)/c)),u=[];for(let t=h;t<=d;t++){const e=l[t];for(const n of r){const r=e.experimentPointers[n];r&&r.size>0&&u.push({tileIdx:t,expIdx:n,pointer:r})}}if(0===u.length)return new Map;const f=await this.fetchMergedRanges(u,s),m=new Map;for(const t of r)m.set(t,[]);for(const{tileIdx:r,expIdx:o,data:s}of f){const l=this.decompress(s),h=new Float32Array(l.buffer,l.byteOffset,l.byteLength/4),d=r*c,u=Math.min((r+1)*c,a.length),f=Math.max(e,d),p=Math.min(n,u),g=Math.floor((f-d)/i.resolution),v=Math.ceil((p-d)/i.resolution),_=m.get(o);for(let e=g;e<v&&e<h.length;e++){const n=h[e];if(0===n)continue;const r=d+e*i.resolution,o=Math.min(r+i.resolution,a.length);_.push({chr:t,start:r,end:o,value:n})}}return m}async readZoomFeatures(t,e,n,r,o,s){const i=this.zoomLevels[o];if(!i)return new Map;const a=i.chromTileIndexes.get(t);if(!a)return new Map;const l=this.chromosomes.get(t);if(!l)return new Map;const c=await this.loadZoomTileIndex(o,t,s),h=Re(l.length,a.nTiles),d=i.reductionLevel,u=Math.max(0,Math.floor(e/h)),f=Math.min(a.nTiles-1,Math.floor(Math.max(0,n-1)/h)),m=[];for(let t=u;t<=f;t++){const e=c[t];for(const n of r){const r=e.experimentPointers[n];r&&r.size>0&&m.push({tileIdx:t,expIdx:n,pointer:r})}}if(0===m.length)return new Map;const p=await this.fetchMergedRanges(m,s),g=new Map;for(const t of r)g.set(t,[]);for(const{tileIdx:r,expIdx:o,data:s}of p){const i=this.decompress(s),a=new Float32Array(i.buffer,i.byteOffset,i.byteLength/4),c=a.length/2,u=a.subarray(0,c),f=r*h,m=Math.min((r+1)*h,l.length),p=Math.max(e,f),v=Math.min(n,m),_=Math.floor((p-f)/d),b=Math.ceil((v-f)/d),w=g.get(o);for(let e=_;e<b&&e<u.length;e++){const n=u[e];if(0===n)continue;const r=f+e*d,o=Math.min(r+d,l.length);w.push({chr:t,start:r,end:o,value:n})}}return g}getExperimentIds(){return this.experiments.map(t=>t.id)}getExperimentMetadata(t){const e=this.experiments.find(e=>e.id===t);return null==e?void 0:e.metadata}resolveExperimentIndex(t){return this.experimentIdToIndex.get(t)}getHeader(){return this.header}getChromosomes(){return this.chromosomes}computeDirFetchSize(t){return t.groupStatsDirectoryOffset>0&&t.groupStatsDirectoryOffset>t.chromDirectoryOffset?t.groupStatsDirectoryOffset-t.chromDirectoryOffset+8:t.nZoomLevels>0&&t.zoomDirectoryOffset>0?t.zoomDirectoryOffset-t.chromDirectoryOffset+262144:262144}selectZoomLevel(t){let e;for(let n=0;n<this.zoomLevels.length;n++)this.zoomLevels[n].reductionLevel<2*t&&(e=n);return e}async fetchMergedRanges(t,e){const n=[...t].sort((t,e)=>t.pointer.offset-e.pointer.offset),r=[];for(const t of n){const e=t.pointer.offset+t.pointer.size,n=r[r.length-1];n&&t.pointer.offset-n.end<=1024?(n.end=Math.max(n.end,e),n.items.push(t)):r.push({start:t.pointer.offset,end:e,items:[t]})}const o=r.map(async t=>({range:t,buf:await me(this.url,{start:t.start,size:t.end-t.start},e)})),s=await Promise.all(o),i=[];for(const{range:t,buf:e}of s)for(const n of t.items){const r=n.pointer.offset-t.start,o=new Uint8Array(e,r,n.pointer.size);i.push({tileIdx:n.tileIdx,expIdx:n.expIdx,data:o})}return i}decompress(t){if(!this.dictionary||void 0===this.dctx)throw new Error("GTX reader not initialized — call init() first");return function(t,e,n){if(!ye)throw new Error("zstd WASM not initialized — call initZstd() first");const r=we.s,o=we.t,s=we.p,i=we.q,a=we.h,l=r(e.byteLength);_e.set(e,l);const c=r(n.byteLength);_e.set(n,c);const h=s(l,e.byteLength),d=-1===h?1048576:h,u=r(d);try{const r=i(t,u,d,l,e.byteLength,c,n.byteLength);if(a(r))throw new Error(`zstd decompression failed with code ${r}`);return new Uint8Array(be.buffer,u,r).slice()}finally{o(u),o(l),o(c)}}(this.dctx,t,this.dictionary)}readU64(t){return t.getLong()}dispose(){var t;void 0!==this.dctx&&(t=this.dctx,ye&&we.o(t),this.dctx=void 0)}}const Ae=new Map;class Oe{constructor(t,e){this.url=t,this.reader=e,this.pending=new Map}request(t,e,n,r){const o=`${e.chr}:${e.start}-${e.end}|${n}`,s=this.pending.get(o);return new Promise(s?(e,n)=>{s.experiments.push({experimentId:t,resolve:e,reject:n})}:(s,i)=>{const a={locus:e,bpPerPixel:n,signal:r,experiments:[{experimentId:t,resolve:s,reject:i}]};this.pending.set(o,a),queueMicrotask(()=>this.flush(o))})}async flush(t){var e;const n=this.pending.get(t);if(!n)return;this.pending.delete(t);const{locus:r,bpPerPixel:o,signal:s,experiments:i}=n;try{await this.reader.init();const t=[],n=new Map;for(const e of i){const r=this.reader.resolveExperimentIndex(e.experimentId);void 0!==r?(n.set(e.experimentId,r),t.push(r)):e.reject(new Error(`Unknown experiment: ${e.experimentId}`))}if(0===t.length)return;const a=await this.reader.readFeatures(r.chr,r.start,r.end,t,o,s);for(const t of i){const r=n.get(t.experimentId);void 0!==r&&t.resolve(null!==(e=a.get(r))&&void 0!==e?e:[])}}catch(t){for(const e of i)e.reject(t)}}}const Fe=new Map;function Ne(t){let e=Fe.get(t);return e||(e=new Le(t),Fe.set(t,e)),e}async function Ke(t,e,n,r={}){var o;const s=Ne(t);await s.init(r.signal);const i=s.resolveExperimentIndex(e);if(void 0===i)throw new Error(`Unknown experiment: ${e}`);return null!==(o=(await s.readFeatures(n.chr,n.start,n.end,[i],r.bpPerPixel,r.signal)).get(i))&&void 0!==o?o:[]}async function De(t,e,n,r,o={}){const s=Ne(t);await s.init(o.signal);const i=s.resolveExperimentIndex(e);if(void 0===i)throw new Error(`Unknown experiment: ${e}`);const a=[];for(const t of n)try{const e=(await s.readFeatures(t,0,Number.MAX_SAFE_INTEGER,[i],r,o.signal)).get(i);e&&a.push(...e)}catch(t){}return a}async function Ue(t,e,n,r={}){var o;const s=Ne(t);await s.init(r.signal);const i=new Map,a=[];for(const t of e){const e=s.resolveExperimentIndex(t);if(void 0===e)throw new Error(`Unknown experiment: ${t}`);i.set(t,e),a.push(e)}const l=await s.readFeatures(n.chr,n.start,n.end,a,r.bpPerPixel,r.signal),c=new Map;for(const[t,e]of i)c.set(t,null!==(o=l.get(e))&&void 0!==o?o:[]);return c}function ze(){for(const t of Fe.values())t.dispose();Fe.clear(),Ae.clear()}const Ge=new Map;class We{constructor(t,e,n="mean",r){this.url=t,this.experimentId=e,this._windowFunction=n,this.workerProvider=r,this.reader=function(t){let e=Ge.get(t);return e||(e=new Le(t),Ge.set(t,e)),e}(t)}get windowFunction(){return this._windowFunction}setWindowFunction(t){this._windowFunction=t}setCumulativeOffsets(t){this._cumulativeOffsets=t}setChromNameResolver(t){this._resolveChromName=t}async fetch(t,e,n){if(K(t)&&this._cumulativeOffsets)return this.fetchWG(e,n);const r=this._resolveChromName?{...t,chr:this._resolveChromName(t.chr)}:t,o=function(t,e){let n=Ae.get(t);return n||(n=new Oe(t,e),Ae.set(t,n)),n}(this.url,this.reader),s=await o.request(this.experimentId,r,e,n);return e>1&&"none"!==this._windowFunction&&s.length>0?this.workerProvider?this.workerProvider.execute({task:"summarize",features:s,startBP:t.start,bpPerPixel:e,windowFunction:this._windowFunction}):rt(s,t.start,e,this._windowFunction):s}async fetchWG(t,e){const n=this._cumulativeOffsets,r=await De(this.url,this.experimentId,n.chromosomeNames,t,{windowFunction:this._windowFunction,signal:e}),o=[];for(const t of r){const e=n.offsets[t.chr];void 0!==e&&o.push({...t,chr:"all",start:e+t.start,end:e+t.end})}return o.sort((t,e)=>t.start-e.start),t>1&&"none"!==this._windowFunction&&o.length>0?this.workerProvider?this.workerProvider.execute({task:"summarize",features:o,startBP:0,bpPerPixel:t,windowFunction:this._windowFunction}):rt(o,0,t,this._windowFunction):o}}function qe(t,e,n){if(e!==n)for(const r of t)r.end<e||r.start>n?r.utr=!0:(e>=r.start&&e<=r.end&&(r.cdStart=e),n>=r.start&&n<=r.end&&(r.cdEnd=n));else for(const e of t)e.utr=!0}function $e(t){if(!t||"."===t||"0"===t)return;if(t.startsWith("#"))return t;const e=t.split(",");if(e.length>=3){const t=parseInt(e[0].trim()),n=parseInt(e[1].trim()),r=parseInt(e[2].trim());if(!isNaN(t)&&!isNaN(n)&&!isNaN(r))return`rgb(${t},${n},${r})`}}function He(t){return"+"===t?"+":"-"===t?"-":void 0}function Be(t,e=0){if(t.length<=10+e)return;const n=parseInt(t[5+e]),r=parseInt(t[6+e]),o={id:t[0+e],chr:t[1+e],strand:He(t[2+e]),start:parseInt(t[3+e]),end:parseInt(t[4+e]),cdStart:n,cdEnd:r,name:t.length>11+e?t[11+e]:t[0+e]},s=Ve(parseInt(t[7+e]),t[8+e],t[9+e]);return qe(s,n,r),o.exons=s,o}function je(t,e=0){if(t.length<=11+e)return;const n=parseInt(t[5+e]),r=parseInt(t[6+e]),o={name:t[11+e],chr:t[1+e],strand:He(t[2+e]),start:parseInt(t[3+e]),end:parseInt(t[4+e]),cdStart:n,cdEnd:r,id:t[0+e]};if(t.length>10+e){const n=parseInt(t[10+e]);isNaN(n)||(o.score=n)}t.length>13+e&&(o.cdsStartStat=t[12+e],o.cdsEndStat=t[13+e]);const s=Ve(parseInt(t[7+e]),t[8+e],t[9+e],t[14+e]);return qe(s,n,r),o.exons=s,o}function Xe(t){const e=t.cdsStart,n=t.cdsEnd,r={name:t.name2,chr:t.chrom,strand:He(t.strand),start:t.txStart,end:t.txEnd,cdStart:e,cdEnd:n,id:t.name};void 0!==t.score&&(r.score=t.score),t.cdsStartStat&&(r.cdsStartStat=t.cdsStartStat),t.cdsEndStat&&(r.cdsEndStat=t.cdsEndStat);const o=t.exonStarts.replace(/,$/,"").split(","),s=t.exonEnds.replace(/,$/,"").split(","),i=t.exonFrames?t.exonFrames.replace(/,$/,"").split(","):void 0,a=[];for(let e=0;e<t.exonCount;e++){const t={start:parseInt(o[e]),end:parseInt(s[e])};if(i){const n=parseInt(i[e]);-1!==n&&(t.readingFrame=n)}a.push(t)}return qe(a,e,n),r.exons=a,r}function Ve(t,e,n,r){const o=e.replace(/,$/,"").split(","),s=n.replace(/,$/,"").split(","),i=r?r.replace(/,$/,"").split(","):void 0,a=[];for(let e=0;e<t;e++){const t={start:parseInt(o[e]),end:parseInt(s[e])};if(i){const n=parseInt(i[e]);-1!==n&&(t.readingFrame=n)}a.push(t)}return a}async function Ye(t,e={},n){var r,o,s;const i=null!==(r=e.genome)&&void 0!==r?r:"hg38",a=null!==(o=e.track)&&void 0!==o?o:"ncbiRefSeq",l=`https://api.genome.ucsc.edu/getData/track?genome=${i}&track=${a}&chrom=${t.chr}&start=${t.start}&end=${t.end}`,c=await fetch(l,n?{signal:n}:void 0);if(!c.ok)throw new Error(`UCSC API error: ${c.status} ${c.statusText}`);return(null!==(s=(await c.json())[a])&&void 0!==s?s:[]).map(Xe)}class Ze{constructor(t={}){this.options=t}setCumulativeOffsets(t){this._cumulativeOffsets=t}async fetch(t,e,n){return K(t)&&this._cumulativeOffsets?this.fetchWG(n):Ye(t,this.options,n)}async fetchWG(t){const e=this._cumulativeOffsets,n=e.chromosomeNames.map(e=>Ye({chr:e,start:0,end:Number.MAX_SAFE_INTEGER},this.options,t).catch(()=>[])),r=await Promise.all(n),o=[];for(let t=0;t<e.chromosomeNames.length;t++){const n=e.chromosomeNames[t],s=e.offsets[n];if(void 0!==s)for(const e of r[t])o.push({...e,chr:"all",start:s+e.start,end:s+e.end,exons:void 0,cdStart:void 0,cdEnd:void 0})}return o.length>1e4?function(t,e){const n=t.slice(0,e);for(let r=e;r<t.length;r++){const o=Math.floor(Math.random()*(r+1));o<e&&(n[o]=t[r])}return n}(o,1e4):o}}function Je(t,e,n,r){if("a"===n&&!r)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof e?t!==e||!r:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?r:"a"===n?r.call(t):r?r.value:e.get(t)}var Qe,tn,en,nn,rn,on,sn;"function"==typeof SuppressedError&&SuppressedError;const an={color:1};an.parent=an,an.left=an,an.right=an,an.min=1/0,an.max=-1/0;class ln{constructor(){Qe.add(this),this.root=an}insert(t,e,n){const r={low:t,high:e,value:n},o=Je(this,Qe,"m",tn).call(this,r);Je(this,Qe,"m",sn).call(this,o),o.color=2;let s=o;for(;s!==this.root&&2===s.parent.color;)if(s.parent===s.parent.parent.left){const t=s.parent.parent.right;2===t.color?(s.parent.color=1,t.color=1,s.parent.parent.color=2,s=s.parent.parent):(s===s.parent.right&&(s=s.parent,Je(this,Qe,"m",nn).call(this,s)),s.parent.color=1,s.parent.parent.color=2,Je(this,Qe,"m",rn).call(this,s.parent.parent))}else{const t=s.parent.parent.left;2===t.color?(s.parent.color=1,t.color=1,s.parent.parent.color=2,s=s.parent.parent):(s===s.parent.left&&(s=s.parent,Je(this,Qe,"m",rn).call(this,s)),s.parent.color=1,s.parent.parent.color=2,Je(this,Qe,"m",nn).call(this,s.parent.parent))}this.root.color=1}findOverlapping(t,e){if(this.root===an)return[];const n=Je(this,Qe,"m",en).call(this,t,e,this.root,[]);return n.length>1&&n.sort((t,e)=>t.low-e.low),n}mapIntervals(t){const e=n=>{t(n.interval),n.left!==an&&e(n.left),n.right!==an&&e(n.right)};this.root!==an&&e(this.root)}}Qe=new WeakSet,tn=function(t){return{parent:an,left:an,right:an,interval:t,color:2,max:t.high,min:t.low}},en=function t(e,n,r,o){return r.interval.low<=n&&e<=r.interval.high&&o.push(r.interval),r.left!==an&&r.left.max>=e&&Je(this,Qe,"m",t).call(this,e,n,r.left,o),r.right!==an&&r.right.min<=n&&Je(this,Qe,"m",t).call(this,e,n,r.right,o),o},nn=function(t){const e=t.right;t.right=e.left,e.left!==an&&(e.left.parent=t),e.parent=t.parent,t.parent===an?this.root=e:t.parent.left===t?t.parent.left=e:t.parent.right=e,e.left=t,t.parent=e,Je(this,Qe,"m",on).call(this,t)},rn=function(t){const e=t.left;t.left=e.right,e.right!==an&&(e.right.parent=t),e.parent=t.parent,t.parent===an?this.root=e:t.parent.right===t?t.parent.right=e:t.parent.left=e,e.right=t,t.parent=e,Je(this,Qe,"m",on).call(this,t)},on=function(t){for(;t!==an;){const e=t.left.max>t.right.max?t.left.max:t.right.max,n=t.interval.high;t.max=e>n?e:n;const r=t.left.min<t.right.min?t.left.min:t.right.min,o=t.interval.low;t.min=r<o?r:o,t=t.parent}},sn=function(t){let e=this.root,n=an;for(;e!==an;)n=e,e=t.interval.low<=e.interval.low?e.left:e.right;t.parent=n,n===an?(this.root=t,t.left=t.right=an):t.interval.low<=n.interval.low?n.left=t:n.right=t,Je(this,Qe,"m",on).call(this,t)};class cn{constructor(t,e){const n=null!=t?t:[];this.range=e,this.count=n.length;const{treeMap:r,allFeatures:o}=function(t){const e={},n={},r=[];for(const e of t){const t=e.chr;let o=n[t];o||(r.push(t),o=[],n[t]=o),o.push(e)}for(const t of r){const r=n[t];r.sort((t,e)=>t.start===e.start?0:t.start>e.start?1:-1),e[t]=hn(r)}return{treeMap:e,allFeatures:n}}(n);this.treeMap=r,this.allFeatures=o}containsRange(t,e,n){return void 0===this.range||this.range.contains(t,e,n)}queryFeatures(t,e,n){const r=this.treeMap[t];if(!r)return[];const o=r.findOverlapping(e,n);if(0===o.length)return[];const s=[],i=this.allFeatures[t];if(i){for(const t of o){const r=t.value;for(let t=r.start;t<r.end;t++){const r=i[t];if(r.start>n)break;r.end>=e&&s.push(r)}}s.sort((t,e)=>t.start-e.start)}return s}findFeatures(t){const e=[];for(const n of Object.values(this.allFeatures))for(const r of n)t(r)&&e.push(r);return e}getAllFeatures(){return this.allFeatures}}function hn(t){const e=new ln,n=t.length,r=Math.max(10,Math.round(n/10));for(let o=0;o<n;o+=r){const s=Math.min(n,o+r),i={start:o,end:s},a=t[o].start;let l=a;for(let e=o;e<s;e++)l=Math.max(l,t[e].end);e.insert(a,l,i)}return e}class dn{constructor(t,r){var o;const s=null!==(o=null==r?void 0:r.indexUrl)&&void 0!==o?o:t+".tbi";this.tabix=new n({filehandle:new e(t),tbiFilehandle:new e(s)})}async getHeader(t){var e,n;const r=await this.tabix.getMetadata({signal:t}),o=Object.keys(r.refNameToId);return{nref:o.length,format:"VCF"===r.format?2:"SAM"===r.format?1:0,colSeq:r.columnNumbers.ref,colBeg:r.columnNumbers.start,colEnd:r.columnNumbers.end,meta:null!==(n=null===(e=r.metaChar)||void 0===e?void 0:e.charCodeAt(0))&&void 0!==n?n:0,skip:0,sequenceNames:o}}async getSequenceNames(t){const e=await this.tabix.getMetadata({signal:t});return Object.keys(e.refNameToId)}async readHeaderLines(t){const e=await this.tabix.getHeader({signal:t});return e?e.split("\n").filter(t=>t.length>0):[]}async readLines(t,e,n,r){const o=[];return await this.tabix.getLines(t,e,n,{lineCallback:t=>{o.push(t)},signal:r}),o}}function un(t,e,n=Number.MAX_SAFE_INTEGER){var r,o;if(t.length<3)return;const s=null==e?void 0:e.gffTags,i=t[0],a=parseInt(t[1]),l=t.length>2?parseInt(t[2]):a+1;if(isNaN(a)||isNaN(l))return;const c={chr:i,start:a,end:l,score:1e3};let h=3;if(t.length>3&&h++<n){if(t[3].indexOf(";")>0&&t[3].indexOf("=")>0){const n=function(t){const e={},n=t.split(";");for(const t of n){const n=t.indexOf("=");if(n>0){const r=t.substring(0,n).trim(),o=t.substring(n+1).trim();e[r]=o}}return e}(t[3]);if(c.attributes=n,s)if(null!=(null==e?void 0:e.nameField)&&n[e.nameField])c.name=n[e.nameField];else if(!c.name)for(const t of _n)if(n[t]){c.name=n[t];break}}c.name||s||(c.name="."===t[3]?"":t[3])}if(t.length>4&&h++<n&&(c.score="."===t[4]?0:Number(t[4]),isNaN(c.score)))return c;if(t.length>5&&h++<n){const e=t[5];if("."!==e&&"+"!==e&&"-"!==e)return c;c.strand=e}if(t.length>6&&h++<n&&(c.cdStart=parseInt(t[6]),isNaN(c.cdStart)))return c;if(t.length>7&&h++<n&&(c.cdEnd=parseInt(t[7]),isNaN(c.cdEnd)))return c;if(t.length>8&&h++<n&&"."!==t[8]&&"0"!==t[8]&&(c.color=$e(t[8])),t.length>11&&h++<n){const e=parseInt(t[9]);if(e>1e3)return c;const n=t[10].replace(/,$/,"").split(","),s=t[11].replace(/,$/,"").split(",");if(n.length!==s.length||e!==n.length)return c;const i=[];for(let t=0;t<e;t++){const e=a+parseInt(s[t]),r=e+parseInt(n[t]);i.push({start:e,end:r})}i.length>0&&(qe(i,null!==(r=c.cdStart)&&void 0!==r?r:a,null!==(o=c.cdEnd)&&void 0!==o?o:l),c.exons=i)}if(e&&(void 0!==e.thicknessColumn&&t.length>e.thicknessColumn&&(c.thickness=parseFloat(t[e.thicknessColumn])),void 0!==e.colorColumn&&t.length>e.colorColumn)){const n=$e(t[e.colorColumn]);n&&(c.color=n)}return c}function fn(t,e){const n=un(t,e,6);if(n)return t.length>6&&(n.signal=parseFloat(t[6])),t.length>7&&(n.pValue=parseFloat(t[7])),t.length>8&&(n.qValue=parseFloat(t[8])),n}function mn(t,e){const n=un(t,e,6);if(n)return t.length>6&&(n.signal=parseFloat(t[6])),t.length>7&&(n.pValue=parseFloat(t[7])),t.length>8&&(n.qValue=parseFloat(t[8])),t.length>9&&(n.peak=parseInt(t[9])),n}function pn(t,e){const n=un(t,e);if(n)return t.length>12&&(n.signal=parseFloat(t[12])),t.length>13&&(n.pValue=parseFloat(t[13])),t.length>14&&(n.qValue=parseFloat(t[14])),n}function gn(t){if(t.length<4)return;const e=t[0],n=parseInt(t[1]),r=parseInt(t[2]),o=parseFloat(t[3]);return isNaN(n)||isNaN(r)||isNaN(o)?void 0:{chr:e,start:n,end:r,value:o}}function vn(t){if(t.length<11)return;const e=t[2],n=parseInt(t[4]),r=parseInt(t[5]),o=parseInt(t[6]),s=parseInt(t[7]),i=He(t[3]);if(isNaN(n)||isNaN(r))return;const a={chr:e,start:n,end:r,name:t[0],strand:i,cdStart:o,cdEnd:s},l=parseInt(t[8]),c=t[9].replace(/,$/,"").split(","),h=t[10].replace(/,$/,"").split(",");if(l>0&&c.length===l&&h.length===l){const t=[];for(let e=0;e<l;e++)t.push({start:parseInt(c[e]),end:parseInt(h[e])});qe(t,o,s),a.exons=t}return a}const _n=["Name","transcript_id","gene_name","gene","gene_id","alias","locus","name"];const bn=new Set(["transcript","primary_transcript","processed_transcript","mRNA","mrna","lnc_RNA","miRNA","ncRNA","rRNA","scRNA","snRNA","snoRNA","tRNA"]),wn=new Set(["CDS","cds","start_codon","stop_codon"]),xn=new Set(["5UTR","3UTR","UTR","five_prime_UTR","three_prime_UTR","3'-UTR","5'-UTR"]),yn=new Set(["exon","coding-exon"]),kn=new Set;for(const t of[wn,xn,yn])for(const e of t)kn.add(e);function Cn(t){return bn.has(t)||t.endsWith("RNA")||t.endsWith("transcript")}function In(t){return kn.has(t)||t.endsWith("RNA")||Tn(t)}function Sn(t){return yn.has(t)}function Tn(t){return t.includes("intron")}function Mn(t){return wn.has(t)}function En(t){return xn.has(t)}const Pn=new Map([["%09","\t"],["%0A","\n"],["%0D","\r"],["%25","%"],["%3B",";"],["%3D","="],["%26","&"],["%2C",","]]);function Rn(t){if(!t.includes("%"))return t;let e="";for(let n=0;n<t.length;n++)if(37===t.charCodeAt(n)&&n<t.length-2){const r=t.substring(n,n+3);Pn.has(r)?e+=Pn.get(r):e+=r,n+=2}else e+=t.charAt(n);return e}function Ln(t,e="="){const n="="===e,r=[];for(let o of t.split(";")){o=o.trim();const t=o.indexOf(e);if(t>0&&t<o.length-1){let e=Rn(o.substring(0,t).trim()),s=Rn(o.substring(t+1).trim());n||(e=An(e),s=An(s)),r.push([e,s])}}return r}function An(t){return t.startsWith('"')&&t.endsWith('"')?t.substring(1,t.length-1):t}function On(t,e){if(t.length<9)return;const n=parseInt(t[3])-1,r=parseInt(t[4]);if(isNaN(n)||isNaN(r))return;const o="."===t[5]?void 0:Number(t[5]),s="+"===t[6]||"-"===t[6]||"."===t[6]?t[6]:void 0,i="."===t[7]?void 0:parseInt(t[7]);return{chr:t[0],source:Rn(t[1]),type:t[2],start:n,end:r,score:void 0===o||isNaN(o)?void 0:o,strand:s,phase:void 0===i||isNaN(i)?void 0:i,attributeString:t[8],attributes:{}}}function Fn(t){const e=On(t);if(!e)return;const n=Ln(e.attributeString,"="),r={};for(const[t,o]of n){r[t]=o;const n=t.toLowerCase();"color"===n||"colour"===n?e.color=o:"ID"===t?e.id=o:"Parent"===t&&(e.parent=o)}return e.attributes=r,e}function Nn(t){const e=On(t);if(!e)return;const n=Ln(e.attributeString," "),r={};let o,s;switch(e.type){case"gene":o="gene_id";break;case"transcript":o="transcript_id",s="gene_id";break;default:s="transcript_id"}for(const[t,i]of n){r[t]=i;const n=t.toLowerCase();"color"===n||"colour"===n?e.color=i:t===o?e.id=i:t===s&&(e.parent=i)}return e.attributes=r,e}const Kn=["Name","transcript_id","gene_name","gene","gene_id","alias","locus","name"];function Dn(t,e){if(void 0!==t.attributes[e])return t.attributes[e];const n=t.attributeString.includes("=")?"=":" ",r=Ln(t.attributeString,n);for(const[t,n]of r)if(t===e)return n}function Un(t,e,n){var r;const o=new Set(null!==(r=null==n?void 0:n.filterTypes)&&void 0!==r?r:["chromosome"]);let s=t.filter(t=>!o.has(t.type));"gff3"!==e&&"gff"!==e||(s=function(t){const e=new Map,n=[];for(const r of t)if(In(r.type)||Cn(r.type)||!r.id)n.push(r);else{let t=e.get(r.chr);t||(t=new Map,e.set(r.chr,t));let n=t.get(r.id);n?n.push(r):t.set(r.id,[r])}for(const t of e.values())for(const e of t.values())if(e.length>1){const t={...e[0]},r=[];for(const n of e)t.start=Math.min(t.start,n.start),t.end=Math.max(t.end,n.end),r.push({start:n.start,end:n.end});t._mergedExons=r,n.push(t)}else n.push(e[0]);return n}(s));const i=function(t,e,n){const r=Object.create(null);for(const e of t)("gene"===e.type||e.type.endsWith("_gene"))&&e.id&&(r[e.id]=e);const o=Object.create(null),s=[],i=new Set;for(const e of t)if(Cn(e.type)&&void 0!==e.id){const t={record:e,exons:[],parts:[]};o[e.id]=t,i.add(e),e.parent&&r[e.parent]&&(t.geneRecord=r[e.parent],i.add(r[e.parent]))}for(const n of t)if(In(n.type)){const t=$n(n);if(t)for(const r of t){let t=o[r];if(!t&&"gtf"===e){t={record:{...n,type:"transcript"},exons:[],parts:[]},o[r]=t}t&&(Sn(n.type)?t.exons.push({start:n.start,end:n.end}):t.parts.push(n),t.record.start=Math.min(t.record.start,n.start),t.record.end=Math.max(t.record.end,n.end),i.add(n))}}for(const t of Object.keys(o)){const e=o[t];zn(e),s.push(Hn(e,n))}for(const e of t)i.has(e)||s.push(Bn(e,n));return function(t){for(const e of t)if(e.exons)for(let t=0;t<e.exons.length;t++)e.exons[t].number="-"===e.strand?e.exons.length-t:t+1}(s),s}(s,e,null==n?void 0:n.nameField);return i}function zn(t){if(t.parts.sort((t,e)=>t.start-e.start),t.parts.length>0){let e=t.parts[0].start,n=t.parts[0].end;for(let r=1;r<t.parts.length;r++){const o=t.parts[r];Tn(o.type)||(o.start<=n?n=Math.max(n,o.end):(Gn(t.exons,e,n)||t.exons.push({start:e,end:n}),e=o.start,n=o.end))}Gn(t.exons,e,n)||(t.exons.push({start:e,end:n}),t.record.start=Math.min(t.record.start,e),t.record.end=Math.max(t.record.end,n))}for(const e of t.parts)Mn(e.type)?Wn(t,e):En(e.type)&&qn(t,e);if(t.exons.sort((t,e)=>t.start-e.start),void 0!==t.cdStart&&void 0!==t.cdEnd)for(const e of t.exons)(e.end<t.cdStart||e.start>t.cdEnd)&&(e.utr=!0)}function Gn(t,e,n){for(const r of t)if(r.end>=n&&r.start<=e)return r}function Wn(t,e){const n=Gn(t.exons,e.start,e.end);if(n&&(n.cdStart=void 0!==n.cdStart?Math.min(e.start,n.cdStart):e.start,n.cdEnd=void 0!==n.cdEnd?Math.max(e.end,n.cdEnd):e.end,void 0!==e.phase)){const t=(3-e.phase)%3;void 0===n.readingFrame&&(n.readingFrame=t)}t.cdStart=void 0!==t.cdStart?Math.min(e.start,t.cdStart):e.start,t.cdEnd=void 0!==t.cdEnd?Math.max(e.end,t.cdEnd):e.end}function qn(t,e){const n=Gn(t.exons,e.start,e.end);n&&(e.start===n.start&&e.end===n.end?n.utr=!0:(e.end<n.end&&(n.cdStart=e.end),(void 0===n.cdEnd||e.start>n.cdEnd)&&(n.cdEnd=e.start)))}function $n(t){return t.parent&&""!==t.parent.trim()?t.parent.trim().split(","):null}function Hn(t,e){const n=t.record,r=jn(n,e);return{chr:n.chr,start:n.start,end:n.end,name:r,id:n.id,strand:"+"===n.strand||"-"===n.strand?n.strand:void 0,type:n.type,source:n.source,score:n.score,cdStart:t.cdStart,cdEnd:t.cdEnd,exons:t.exons.length>0?t.exons:void 0,attributes:n.attributes,color:n.color}}function Bn(t,e){const n=jn(t,e),r=t._mergedExons;return{chr:t.chr,start:t.start,end:t.end,name:n,id:t.id,strand:"+"===t.strand||"-"===t.strand?t.strand:void 0,type:t.type,source:t.source,score:t.score,exons:r,attributes:t.attributes,color:t.color}}function jn(t,e){if(e)return Dn(t,e);for(const e of Kn){const n=Dn(t,e);if(n)return n}}function Xn(t,e){var n;if(t.length<6)return;const r=t[0],o=parseInt(t[1]),s=parseInt(t[2]),i=t[3],a=parseInt(t[4]),l=parseInt(t[5]);if(isNaN(o)||isNaN(s)||isNaN(a)||isNaN(l))return;e&&void 0===e.hiccups&&(e.hiccups=!!e.columnNames&&Yn(e.columnNames));const c=null!==(n=null==e?void 0:e.hiccups)&&void 0!==n&&n,h=c?6:10,d={chr:r,start:0,end:0,chr1:r,start1:o,end1:s,chr2:i,start2:a,end2:l,dup:!1};return c||(t.length>6&&"."!==t[6]&&(d.name=t[6]),t.length>7&&"."!==t[7]&&(d.score=Number(t[7])),t.length>8&&"."!==t[8]&&(d.strand1=t[8]),t.length>9&&"."!==t[9]&&(d.strand2=t[9])),e&&(void 0!==e.colorColumn&&e.colorColumn<t.length&&(d.color=t[e.colorColumn]),void 0!==e.thicknessColumn&&e.thicknessColumn<t.length&&(d.thickness=Number(t[e.thicknessColumn])),t.length>h&&e.columnNames&&e.columnNames.length===t.length&&(d.extras=t.slice(h))),r===i&&(d.chr=r,d.start=Math.min(o,a),d.end=Math.max(s,l)),d}function Vn(t){if(0===t.length)return;const e=t[0];if(void 0===e.score&&void 0!==e.name){if(t.every(t=>{return void 0===t.name||"."===t.name||(e=t.name,!isNaN(Number(e))&&""!==e.trim());var e}))for(const e of t)e.score=Number(e.name),e.name=void 0}const n=t.filter(t=>t.chr1!==t.chr2);for(const e of n){const n={...e,dup:!0};t.push(n),e.chr=e.chr1,e.start=e.start1,e.end=e.end1,n.chr=n.chr2,n.start=n.start2,n.end=n.end2}}function Yn(t){return t.includes("fdrDonut")||t.includes("fdr_donut")}function Zn(t){if(t.length<6)return;const e=t[0],n=parseInt(t[1]),r=parseInt(t[2]),o=t[8],s=parseInt(t[9]),i=parseInt(t[10]),a=t[13],l=parseInt(t[14]),c=parseInt(t[15]),h=t[7],d="."===h?void 0:"0"===h?"rgb(0,0,0)":h;return{chr:e,start:n,end:r,chr1:o,start1:s,end1:i,chr2:a,start2:l,end2:c,name:t[3],score:Number(t[4]),value:Number(t[5]),color:d,dup:!1}}function Jn(t,e){switch(t){case"broadpeak":case"peaks":return{decode:(t,e)=>fn(t,Qn(e)),delimiter:/\s+/,requiresAssembly:!1};case"narrowpeak":return{decode:(t,e)=>mn(t,Qn(e)),delimiter:/\s+/,requiresAssembly:!1};case"bedgraph":return{decode:t=>gn(t),delimiter:/\s+/,requiresAssembly:!1};case"gff3":case"gff":return{decode:t=>Fn(t),delimiter:"\t",requiresAssembly:!0};case"gtf":return{decode:t=>Nn(t),delimiter:"\t",requiresAssembly:!0};case"refflat":return{decode:t=>vn(t),delimiter:/\s+/,requiresAssembly:!1};case"genepred":return{decode:t=>Be(t,0),delimiter:/\s+/,requiresAssembly:!1};case"genepredext":return{decode:t=>je(t,0),delimiter:/\s+/,requiresAssembly:!1};case"ensgene":return{decode:t=>Be(t,1),delimiter:/\s+/,requiresAssembly:!1};case"refgene":return{decode:t=>je(t,1),delimiter:/\s+/,requiresAssembly:!1};case"gappedpeak":return{decode:(t,e)=>pn(t,Qn(e)),delimiter:/\s+/,requiresAssembly:!1};case"bedpe":return{decode:(t,e)=>Xn(t,function(t){return t?{columnNames:t.columnNames,colorColumn:t.colorColumn,thicknessColumn:t.thicknessColumn}:void 0}(e)),delimiter:/\s+/,requiresAssembly:!1,postProcess:Vn};case"interact":case"longrange":return{decode:t=>Zn(t),delimiter:/\s+/,requiresAssembly:!1};default:return{decode:(t,e)=>un(t,Qn(e)),delimiter:/\s+/,requiresAssembly:!1}}}function Qn(t){if(t)return{nameField:t.nameField,gffTags:t.gffTags,colorColumn:t.colorColumn,thicknessColumn:t.thicknessColumn}}function tr(t,e){const n={format:e};let r;for(const e of t)if(e.startsWith("track")||e.startsWith("#track")){const t=nr(e);Object.assign(n,{properties:t}),"interact"===t.type&&(n.format="interact"),"gcnv"===t.type&&(n.format="gcnv")}else if(e.startsWith("browser"));else if(e.startsWith("#columns")){const t=rr(e);void 0!==t.colorColumn&&(n.colorColumn=t.colorColumn),void 0!==t.thicknessColumn&&(n.thicknessColumn=t.thicknessColumn)}else if(e.startsWith("##gff-version 3"))n.format="gff3";else if(e.startsWith("#gffTags"))n.gffTags=!0;else{if(e.startsWith("fixedStep")||e.startsWith("variableStep"))break;if(!e.startsWith("#"))break;{const t=e.split("\t");t.length>1&&(r=t)}}if(r){n.columnNames=r;for(let t=0;t<r.length;t++)"color"===r[t]||"colour"===r[t]?n.colorColumn=t:"thickness"===r[t]&&(n.thicknessColumn=t)}return n}function er(t,e,n){var r,o;const s=null!==(r=null==n?void 0:n.header)&&void 0!==r?r:tr(t,e),i=null!==(o=s.format)&&void 0!==o?o:e,a=Jn(i),l=a.delimiter,c=[],h={};for(const e of t){if(!e||e.startsWith("track")||e.startsWith("#")||e.startsWith("browser"))continue;if("wig"===i){if(e.startsWith("fixedStep")){h.wig=or(e);continue}if(e.startsWith("variableStep")){h.wig=sr(e);continue}}const t=e.split(l);if(t.length<1)continue;const n="wig"===i?{...s,wig:h.wig}:s,r=a.decode(t,n);r&&c.push(r)}if(a.postProcess&&a.postProcess(c),a.requiresAssembly&&!1!==(null==n?void 0:n.assembleGFF)){return Un(c,"gff"===i?"gff":"gff3"===i?"gff3":"gtf",{nameField:s.nameField})}return c}function nr(t){const e={},n=t.split(/(?:")([^"]+)(?:")|([^\s"]+)(?=\s+|$)/g);let r;const o=[];for(const t of n)t&&0!==t.trim().length&&(t.endsWith("=")?r=t:r?(o.push(r+t),r=void 0):o.push(t));for(const t of o){if(!t)break;const n=t.split("=",2);2===n.length&&(e[n[0].trim()]=n[1].trim())}return e}function rr(t){const e={},n=t.split(/\s+/);if(2===n.length){const t=n[1].split(";");for(const n of t){const t=n.split("=");"color"===t[0]?e.colorColumn=parseInt(t[1])-1:"thickness"===t[0]&&(e.thicknessColumn=parseInt(t[1])-1)}}return e}function or(t){const e=t.split(/\s+/);return{format:"fixedStep",chrom:e[1].split("=")[1],start:parseInt(e[2].split("=")[1],10)-1,step:parseInt(e[3].split("=")[1],10),span:e.length>4?parseInt(e[4].split("=")[1],10):1,index:0}}function sr(t){const e=t.split(/\s+/);return{format:"variableStep",chrom:e[1].split("=")[1],span:e.length>2?parseInt(e[2].split("=")[1],10):1}}var ir=Object.freeze({__proto__:null,getDecoder:Jn,parseHeader:tr,parseFeatures:er});const ar=new Set(["narrowpeak","broadpeak","regionpeak","peaks","bedgraph","wig","gff3","gff","gtf","fusionjuncspan","refflat","seg","aed","bed","bedmethyl","vcf","bb","bigbed","biginteract","biggenepred","bignarrowpeak","bw","bigwig","bam","tdf","refgene","genepred","genepredext","bedpe","bp","snp","rmsk","cram","gwas","maf","mut","hiccups","fasta","fa","fna","pytor","hic","qtl","gtx"]);function lr(t){if(!t)return;let e=t.toLowerCase();const n=e.indexOf("?");n>0&&(e=e.substring(0,n));const r=e.lastIndexOf("/");if(r>=0&&(e=e.substring(r+1)),e.endsWith("refgene.txt.gz")||e.endsWith("refgene.txt.bgz")||e.endsWith("refgene.txt")||e.endsWith("refgene.sorted.txt.gz")||e.endsWith("refgene.sorted.txt.bgz"))return"refgene";e.endsWith(".gz")&&(e=e.substring(0,e.length-3)),e.endsWith(".bgz")&&(e=e.substring(0,e.length-4)),(e.endsWith(".txt")||e.endsWith(".tab")||e.endsWith(".tsv"))&&(e=e.substring(0,e.length-4));const o=e.lastIndexOf("."),s=o<0?e:e.substring(o+1);switch(s){case"bw":return"bigwig";case"bb":return"bigbed";case"fasta":case"fa":case"fna":return"fasta";case"gtx":return"gtx";default:return ar.has(s)?s:void 0}}const cr=new Set(["bigwig","bw","bigbed","bb","biginteract","biggenepred","bignarrowpeak","tdf","bam","cram","gtx"]);function hr(t){return cr.has(t.toLowerCase())}function dr(t){const e=t.toLowerCase(),n=e.indexOf("?");return(n>0?e.substring(0,n):e).endsWith(".bgz")}function ur(t){if(t.includes("?")){const e=t.indexOf("?");return t.substring(0,e)+".tbi"+t.substring(e)}return t+".tbi"}function fr(t){if(t)switch(t.toLowerCase()){case"bw":case"bigwig":case"wig":case"bedgraph":case"tdf":case"gtx":return"wig";case"vcf":case"vcftabix":return"variant";case"seg":return"seg";case"mut":case"maf":return"mut";case"bam":case"cram":return"alignment";case"hiccups":case"bedpe":case"bedpe-loop":case"biginteract":case"longrange":case"hic":return"interact";case"bp":return"arc";case"gwas":return"gwas";case"bed":case"bigbed":case"bb":case"biggenepred":case"bignarrowpeak":return"bedtype";case"fasta":return"sequence";case"pytor":return"cnvpytor";case"qtl":return"qtl";default:return"annotation"}}class mr{constructor(t){var e,n;this.allFeaturesLoaded=!1,this.url=t.url,this.workerProvider=t.workerProvider;const r=null!==(e=t.format)&&void 0!==e?e:lr(t.url);if(this.format=null!=r?r:"bed",this.assembleGFF=!1!==t.assembleGFF,void 0!==t.indexed?this._indexed=t.indexed:t.indexURL?this._indexed=!0:this._indexed=dr(t.url),this._indexed){const e=null!==(n=t.indexURL)&&void 0!==n?n:ur(t.url);this.tabixReader=new dn(t.url,{indexUrl:e,workerProvider:this.workerProvider})}}get indexed(){return this._indexed}setChromNameResolver(t){this._resolveChromName=t}setCumulativeOffsets(t){this._cumulativeOffsets=t}async getSequenceNames(t){return this.tabixReader?this.tabixReader.getSequenceNames(t):this.featureCache?Object.keys(this.featureCache.getAllFeatures()):[]}async fetch(t,e,n){if(K(t)&&this._cumulativeOffsets)return this.fetchWG(n);const r=this._resolveChromName?this._resolveChromName(t.chr):t.chr;return this._indexed&&this.tabixReader?this.fetchIndexed(r,t.start,t.end,n):this.fetchNonIndexed(r,t.start,t.end,n)}async fetchIndexed(t,e,n,r){const o=this.tabixReader;if(!this.header){const t=await o.readHeaderLines(r);this.header=tr(t,this.format)}const s=er(await o.readLines(t,e,n,r),this.format,{header:this.header,assembleGFF:this.assembleGFF});return s.sort((t,e)=>t.start-e.start),s}async fetchNonIndexed(t,e,n,r){var o,s;return this.allFeaturesLoaded||await this.loadAllFeatures(r),null!==(s=null===(o=this.featureCache)||void 0===o?void 0:o.queryFeatures(t,e,n))&&void 0!==s?s:[]}async loadAllFeatures(t){const e=await globalThis.fetch(this.url,{signal:t});if(!e.ok)throw new Error(`Failed to fetch ${this.url}: ${e.status} ${e.statusText}`);let n;const r=this.url.toLowerCase(),o=r.endsWith(".gz")||r.endsWith(".bgz")||r.includes(".gz?")||r.includes(".bgz?"),s=e.headers.get("Content-Encoding");if(o&&!("gzip"===s||"deflate"===s)){const t=await e.arrayBuffer(),r=new DecompressionStream("gzip"),o=new Response(new Response(t).body.pipeThrough(r));n=await o.text()}else n=await e.text();const i=n.split(/\r?\n/);this.header=tr(i,this.format);const a=this.workerProvider?await this.workerProvider.execute({task:"parseFeatures",lines:i,format:this.format,header:this.header,assembleGFF:this.assembleGFF}):er(i,this.format,{header:this.header,assembleGFF:this.assembleGFF});a.sort((t,e)=>t.chr===e.chr?t.start-e.start:t.chr.localeCompare(e.chr)),this.featureCache=new cn(a),this.allFeaturesLoaded=!0}async fetchWG(t){var e,n;const r=this._cumulativeOffsets;if(this._indexed){const e=Ft(Object.fromEntries(r.chromosomeNames.map(t=>{var e;return[t,null!==(e=r.offsets[t])&&void 0!==e?e:0]}))),n=[];for(const o of e)try{const e=await this.fetchIndexed(o,0,Number.MAX_SAFE_INTEGER,t),s=r.offsets[o];if(void 0===s)continue;for(const t of e)n.push({...t,chr:"all",start:s+t.start,end:s+t.end})}catch(t){}return n.sort((t,e)=>t.start-e.start),n}{this.allFeaturesLoaded||await this.loadAllFeatures(t);const o=null!==(n=null===(e=this.featureCache)||void 0===e?void 0:e.getAllFeatures())&&void 0!==n?n:{},s=[];for(const[t,e]of Object.entries(o)){const n=r.offsets[t];if(void 0!==n)for(const t of e)s.push({...t,chr:"all",start:n+t.start,end:n+t.end})}return s.sort((t,e)=>t.start-e.start),s}}}class pr{constructor(t){this.sequenceProvider=t}async fetch(t,e,n){if(e>10)return[];const r=Math.floor(t.start),o=Math.floor(t.end),s=await this.sequenceProvider({chr:t.chr,start:r,end:o},n);return n.aborted?[]:[{bpStart:r,sequence:s}]}}function gr(t,e,n,r){t.fillStyle=n.background,t.fillRect(0,0,r.pixelWidth,n.height),e&&0!==e.length&&("proportional"===n.displayMode?function(t,e,n,r){var o,s,i,a,l;const{bpStart:c,bpPerPixel:h,pixelWidth:d}=r,u="UP"===n.arcOrientation,f=u?n.height:0,m=function(t){var e,n;let r=0;for(const o of t){const t=null!==(n=null!==(e=o.value)&&void 0!==e?e:o.score)&&void 0!==n?n:0;isNaN(t)||(r=Math.max(r,t))}return{min:0,max:r}}(e),p=n.logScale?(n.height-1)/Math.log10(m.max+1):(n.height-1)/(m.max||1);for(const m of e){m.drawState=void 0;const e=null!==(s=null!==(o=m.value)&&void 0!==o?o:m.score)&&void 0!==s?s:0;if(void 0===e||isNaN(e))continue;const g=Math.round((n.logScale?Math.log10(e+1):e)*p);if(m.chr1===m.chr2||"all"===m.chr){const e=(m.start1+m.end1)/2,r=(m.start2+m.end2)/2,o=Math.min(e,r),s=Math.max(e,r);let l=Math.round((o-c)/h),d=Math.round((s-c)/h)-l;d<3&&(d=3,l--);const p=d/2,v=l+d/2,_=u,b=null!==(i=m.color)&&void 0!==i?i:n.color;if(t.strokeStyle=b,t.lineWidth=null!==(a=m.thickness)&&void 0!==a?a:n.thickness,t.beginPath(),t.ellipse(v,f,p,g,0,0,Math.PI,_),t.stroke(),n.alpha>0&&(t.fillStyle=br(b,n.alpha),t.fill()),n.showBlocks&&"all"!==m.chr){t.fillStyle=b;const e=(m.start1-c)/h,r=(m.end1-c)/h,o=(m.start2-c)/h,s=(m.end2-c)/h,i=u?-n.blockHeight:n.blockHeight;t.fillRect(e,f,r-e,i),t.fillRect(o,f,s-o,i)}m.drawState={type:"proportional",xc:v,yc:f,radiusX:p,radiusY:g}}else{if(d<=0)continue;const e=Math.round((m.start-c)/h);if(Math.round((m.end-c)/h)<0||e>d)continue;const o=Math.min(g,n.height-13);vr(t,m,n,r,null!==(l=m.color)&&void 0!==l?l:n.color,u,o)}}}(t,e,n,r):function(t,e,n,r){var o,s;const{bpStart:i,bpPerPixel:a,pixelWidth:l,viewportWidth:c}=r,h="UP"===n.arcOrientation,d=h?n.height:0,{sinTheta:u,cosTheta:f,theta:m}=function(t,e,n){const{bpStart:r,bpPerPixel:o,pixelWidth:s,viewportWidth:i}=n;let a=0;for(const e of t){const t=(e.start-r)/o,n=(e.end-r)/o;t>=0&&n<=s&&(a=Math.max(a,n-t))}const l=Math.min(i,a)/2;let c=Math.PI/4;if(a>0){c=function(t){const e=[.01570925532366355,.15838444032453644,.3249196962329063,.5095254494944288,.7265425280053609,.9999999999999999],n=[.031415926535897934,.3141592653589793,.6283185307179586,.9424777960769379,1.2566370614359172,1.5707963267948966];let r=0;for(;r<e.length&&!(e[r]>t);r++);const o=0===r?0:e[r-1],s=r<e.length?e[r]:1,i=(t-o)/(s-o),a=0===r?0:n[r-1],l=r<n.length?n[r]:Math.PI/2;return Math.min(Math.PI/2,a+i*(l-a))}((e.height-10)/l)}return{sinTheta:Math.sin(c),cosTheta:Math.cos(c),theta:c}}(e,n,r);t.font=n.font,t.textAlign="center";for(const p of e){p.drawState=void 0;let e=null!==(o=p.color)&&void 0!==o?o:n.color;if(t.lineWidth=null!==(s=p.thickness)&&void 0!==s?s:n.thickness,p.chr1===p.chr2||"all"===p.chr){const r=(p.start1+p.end1)/2,o=(p.start2+p.end2)/2,s=Math.min(r,o),g=Math.max(r,o);let v=Math.round((s-i)/a),_=Math.round((g-i)/a);if(_<0||v>l)continue;let b=_-v;b<3&&(b=3,v--);const w=b/2,x=w/u,y=f*x,k=v+w;let C,I,S;if(h?(C=n.height+y,I=Math.PI+Math.PI/2-m,S=Math.PI+Math.PI/2+m):(C=-y,I=Math.PI/2-m,S=Math.PI/2+m),n.showBlocks&&"all"!==p.chr){t.fillStyle=e;const r=(p.start1-i)/a,o=(p.end1-i)/a,s=(p.start2-i)/a,l=(p.end2-i)/a,c=h?-n.blockHeight:n.blockHeight;t.fillRect(r,d,o-r,c),t.fillRect(s,d,l-s,c)}!n.useScore&&b>c&&(e=br(e,n.alpha)),t.strokeStyle=e,t.fillStyle=e,t.beginPath(),t.arc(k,C,x,I,S,!1),t.stroke(),p.drawState={type:"nested",xc:k,yc:C,r:x}}else vr(t,p,n,r,e,h)}}(t,e,n,r))}function vr(t,e,n,r,o,s,i){const{bpStart:a,bpPerPixel:l,pixelWidth:c}=r;let h=Math.round((e.start-a)/l),d=Math.round((e.end-a)/l);if(d<0||h>c)return;let u=d-h;u<3&&(u=3,h--);const f=e.chr===e.chr1?e.chr2:e.chr1,m=null!=i?i:n.height/2;if(t.fillStyle=br(o,.5),t.font=n.font,t.textAlign="center",s){const r=n.height-m;t.fillRect(h,r,u,m),t.fillStyle=o,t.fillText(f,h+u/2,r-5),e.drawState={type:"rect",x:h,y:r,w:u,h:m}}else t.fillRect(h,0,u,m),t.fillStyle=o,t.fillText(f,h+u/2,m+13),e.drawState={type:"rect",x:h,y:0,w:u,h:m}}const _r=new Map;function br(t,e){const n=`${t}_${e}`;let r=_r.get(n);if(r)return r;const o=function(t){const e=t.match(/^rgba?\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);if(e)return{r:parseInt(e[1]),g:parseInt(e[2]),b:parseInt(e[3])};const n=t.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);if(n)return{r:parseInt(n[1],16),g:parseInt(n[2],16),b:parseInt(n[3],16)};return}(t);return r=o?`rgba(${o.r},${o.g},${o.b},${e})`:t,_r.set(n,r),r}function wr(t,e,n,r){const o=(e+1).toLocaleString(),s=n.toLocaleString();return r&&"."!==r?`${t}:${o}-${s} (${r})`:`${t}:${o}-${s}`}class xr extends u{constructor(t,e){const n=R(S(e.theme),e.config);void 0!==e.background&&(n.background=e.background),super(t,e.locus,n,e.canvasProvider),this.type="interact",this.features=e.features,this._name=e.name}setFeatures(t){this.features=t,this.render()}computeHeight(t){return this.config.height}getBackground(){return this.config.background}doRender(t,e,n,r){gr(t,this.features,this._config,r)}hitTest(t,e){const n=[];this._config.displayMode;for(const r of this.features){if(!r.drawState)continue;const o=r.drawState;if("nested"===o.type){const s=t-o.xc,i=e-o.yc,a=Math.abs(Math.sqrt(s*s+i*i)-o.r);a<5&&n.push({score:a,feature:r})}else if("proportional"===o.type){const s=t-o.xc,i=e-o.yc,a=s/o.radiusX*(s/o.radiusX)+i/o.radiusY*(i/o.radiusY);a<=1&&n.push({score:1/a,feature:r})}else if("rect"===o.type){const s=5;if(t>=o.x-s&&t<=o.x+o.w+s&&e>=o.y&&e<=o.y+o.h){n.push({score:-Math.abs(t-(o.x+o.w/2)),feature:r});break}}}return n.length>1&&n.sort((t,e)=>t.score-e.score),n.map(t=>({feature:t.feature,popupData:this.buildPopupData(t.feature)}))}buildPopupData(t){const e=[];return e.push({name:"Region 1",value:wr(t.chr1,t.start1,t.end1,t.strand1)}),e.push({name:"Region 2",value:wr(t.chr2,t.start2,t.end2,t.strand2)}),t.name&&e.push({name:"Name",value:t.name}),void 0!==t.value&&e.push({name:"Value",value:t.value}),void 0!==t.score&&e.push({name:"Score",value:t.score}),void 0!==t.type&&e.push({name:"Type",value:t.type}),e}serializeConfig(t){const e=R(S(t)),n={},r=Object.keys(this._config);for(const t of r){const r=this._config[t];r!==e[t]&&(n[t]=r)}return{type:"interact",name:this._name,config:Object.keys(n).length>0?n:void 0}}getAxisInfo(){if("proportional"!==this._config.displayMode)return;const t=yr(this.features);return{label:this._name,dataRange:t,flipAxis:"DOWN"===this._config.arcOrientation,logScale:this._config.logScale}}getContextMenuItems(t,e){const n=[];return n.push({label:"Nested Arcs",type:"checkbox",checked:"nested"===this._config.displayMode,action:()=>this.setConfig({displayMode:"nested"})}),n.push({label:"Proportional Arcs",type:"checkbox",checked:"proportional"===this._config.displayMode,action:()=>this.setConfig({displayMode:"proportional"})}),n.push({label:"",type:"separator"}),n.push({label:"Toggle Arc Direction",action:()=>this.setConfig({arcOrientation:"UP"===this._config.arcOrientation?"DOWN":"UP"})}),n.push({label:this._config.showBlocks?"Hide Blocks":"Show Blocks",action:()=>this.setConfig({showBlocks:!this._config.showBlocks})}),n}getNumericState(){if("proportional"!==this._config.displayMode)return;const t=yr(this.features);return{autoscale:!0,logScale:this._config.logScale,dataRange:t,setAutoscale:()=>{},setLogScale:t=>this.setConfig({logScale:t}),setDataRange:()=>{}}}renderToContext(t,e,n){const r={pixelWidth:e,bpStart:this._locus.start,bpPerPixel:(this._locus.end-this._locus.start)/e,viewportWidth:e},o={...this._config,height:n};gr(t,this.features,o,r)}}function yr(t){var e,n;let r=0;for(const o of t){const t=null!==(n=null!==(e=o.value)&&void 0!==e?e:o.score)&&void 0!==n?n:0;isNaN(t)||(r=Math.max(r,t))}return{min:0,max:r}}const kr=new Map,Cr=new Map;function Ir(t,e){kr.set(t,e)}function Sr(t,e){Cr.set(t,e)}function Tr(t){return kr.get(function(t){var e;return null!==(e=Cr.get(t))&&void 0!==e?e:t}(t))}function Mr(){const t=new Set(kr.keys());for(const e of Cr.keys())t.add(e);return t}function Er(t,e){switch(t.type){case"bigwig":return new fe(t.url,t.windowFunction,e);case"gtx":return new We(t.url,t.experimentId,t.windowFunction,e);case"ucsc":return new Ze({genome:t.genome,track:t.track});case"text":return new mr({url:t.url,format:t.format,indexURL:t.indexURL,indexed:t.indexed,workerProvider:e})}}function Pr(t,e,n={}){var r;const s=Tr(t.type);if(!s)throw new Error(`Unknown track type: "${t.type}". Known types: ${[...Mr()].join(", ")}`);return s(t,{locus:e,canvasProvider:null!==(r=n.canvasProvider)&&void 0!==r?r:o,workerProvider:n.workerProvider,theme:n.theme,sequenceProvider:n.sequenceProvider})}Ir("wig",function(t,e){const n=t,{canvas:r}=e.canvasProvider.createCanvas(0,0),o=new it(r,{locus:e.locus,features:[],config:n.config,theme:e.theme,canvasProvider:e.canvasProvider});let s=null,i=null;return n.dataSource&&(i=n.dataSource,s=Er(n.dataSource,e.workerProvider)),{track:o,dataSource:s,dataSourceConfig:i,name:n.name,order:n.order}}),Ir("annotation",function(t,e){const n=t,{canvas:r}=e.canvasProvider.createCanvas(0,0),o=new L(r,{locus:e.locus,features:[],config:n.config,theme:e.theme,canvasProvider:e.canvasProvider,workerProvider:e.workerProvider});let s=null,i=null;return n.dataSource&&(i=n.dataSource,s=Er(n.dataSource,e.workerProvider)),{track:o,dataSource:s,dataSourceConfig:i,name:n.name,order:n.order}}),Ir("ruler",function(t,e){const n=t,{canvas:r}=e.canvasProvider.createCanvas(0,0);return{track:new W(r,{locus:e.locus,config:n.config,theme:e.theme,canvasProvider:e.canvasProvider}),dataSource:null,dataSourceConfig:null,name:n.name,order:n.order}}),Ir("sequence",function(t,e){const n=t,{canvas:r}=e.canvasProvider.createCanvas(0,0);return{track:new se(r,{locus:e.locus,config:n.config,theme:e.theme,canvasProvider:e.canvasProvider}),dataSource:e.sequenceProvider?new pr(e.sequenceProvider):null,dataSourceConfig:null,name:n.name,order:n.order}}),Ir("interact",function(t,e){const n=t,{canvas:r}=e.canvasProvider.createCanvas(0,0),o=new xr(r,{locus:e.locus,features:[],config:n.config,theme:e.theme,canvasProvider:e.canvasProvider,name:n.name});let s=null,i=null;return n.dataSource&&(i=n.dataSource,s=Er(n.dataSource,e.workerProvider)),{track:o,dataSource:s,dataSourceConfig:i,name:n.name,order:n.order}}),Sr("gene","annotation"),Sr("refgene","annotation"),Sr("bigwig","wig"),Sr("bedgraph","wig"),Sr("bed","annotation"),Sr("gff3","annotation"),Sr("gtf","annotation"),Sr("gff","annotation"),Sr("narrowpeak","annotation"),Sr("broadpeak","annotation"),Sr("genepred","annotation"),Sr("genepredext","annotation"),Sr("refflat","annotation"),Sr("bedpe","interact"),Sr("arc","interact"),Sr("longrange","interact");const Rr="1.0";function Lr(t,e,n={}){return Pr(t,e,n)}const Ar={wig:"wig",bigwig:"wig",bedgraph:"wig",annotation:"annotation",gene:"annotation",refgene:"annotation",bed:"annotation",gff3:"annotation",gtf:"annotation",narrowpeak:"annotation",broadpeak:"annotation",sequence:"sequence",interact:"interact",bedpe:"interact",arc:"interact"};function Or(t){const e=Array.isArray(t.locus)?t.locus[0]:t.locus,n=e?D(e):null;if(!n)throw new Error(`Cannot parse locus from igv session: ${e}`);const r=[];if(t.tracks)for(const e of t.tracks){const t=Fr(e);t&&r.push(t)}return{version:Rr,locus:n,tracks:r}}function Fr(t){var e;const n=Ar[null!==(e=t.type)&&void 0!==e?e:""];if(!n){if("sequence"!==t.type&&"ruler"!==t.type&&console.warn(`Skipping unsupported igv.js track type: ${t.type}`),"ruler"===t.type){const e={type:"ruler"};return t.height&&(e.config={height:t.height}),e}return null}switch(n){case"wig":return function(t){const e={type:"wig"};t.name&&(e.name=t.name);null!=t.order&&(e.order=t.order);if(t.url){const n={type:"bigwig",url:t.url};t.windowFunction&&(n.windowFunction=t.windowFunction),e.dataSource=n}const n={};let r=!1;t.color&&(n.color=t.color,r=!0);t.altColor&&(n.altColor=t.altColor,r=!0);null!=t.height&&(n.height=t.height,r=!0);null!=t.autoscale&&(n.autoscale=t.autoscale,r=!0);null!=t.min&&null!=t.max&&(n.dataRange={min:t.min,max:t.max},r=!0);r&&(e.config=n);return e}(t);case"annotation":return function(t){const e={type:"annotation"};t.name&&(e.name=t.name);null!=t.order&&(e.order=t.order);if(t.url){const n={type:"text",url:t.url};t.indexURL&&(n.indexURL=t.indexURL),t.format&&(n.format=t.format),e.dataSource=n}const n={};let r=!1;t.color&&(n.color=t.color,r=!0);null!=t.height&&(n.featureHeight=t.height,r=!0);t.displayMode&&(n.displayMode=t.displayMode.toUpperCase(),r=!0);r&&(e.config=n);return e}(t);case"interact":return function(t){const e={type:"interact"};t.name&&(e.name=t.name);null!=t.order&&(e.order=t.order);if(t.url){const n={type:"text",url:t.url};t.indexURL&&(n.indexURL=t.indexURL),t.format&&(n.format=t.format),e.dataSource=n}const n={};let r=!1;t.color&&(n.color=t.color,r=!0);null!=t.height&&(n.height=t.height,r=!0);r&&(e.config=n);return e}(t);case"ruler":return{type:"ruler"};case"sequence":return{type:"sequence"}}}function Nr(t){const e={locus:U(t.locus),tracks:[]};for(const n of t.tracks){const t=Kr(n);t&&e.tracks.push(t)}return e}function Kr(t){var e;switch(t.type){case"wig":return function(t){const e={type:"wig"};t.name&&(e.name=t.name);null!=t.order&&(e.order=t.order);t.dataSource&&"bigwig"===t.dataSource.type&&(e.url=t.dataSource.url,t.dataSource.windowFunction&&(e.windowFunction=t.dataSource.windowFunction));t.config&&(t.config.color&&(e.color=t.config.color),t.config.altColor&&(e.altColor=t.config.altColor),null!=t.config.height&&(e.height=t.config.height),null!=t.config.autoscale&&(e.autoscale=t.config.autoscale),t.config.dataRange&&(e.min=t.config.dataRange.min,e.max=t.config.dataRange.max));return e}(t);case"annotation":return function(t){const e={type:"annotation"};t.name&&(e.name=t.name);null!=t.order&&(e.order=t.order);t.config&&(t.config.color&&(e.color=t.config.color),t.config.displayMode&&(e.displayMode=t.config.displayMode));return e}(t);case"interact":return function(t){var e;const n={type:"interact"};t.name&&(n.name=t.name);null!=t.order&&(n.order=t.order);"text"===(null===(e=t.dataSource)||void 0===e?void 0:e.type)&&(n.url=t.dataSource.url,t.dataSource.indexURL&&(n.indexURL=t.dataSource.indexURL),t.dataSource.format&&(n.format=t.dataSource.format));t.config&&(t.config.color&&(n.color=t.config.color),null!=t.config.height&&(n.height=t.config.height));return n}(t);case"ruler":return{type:"ruler",height:null===(e=t.config)||void 0===e?void 0:e.height};case"sequence":return{type:"sequence"}}}function Dr(t){var e,n,r,o,s;switch(t.type){case"bigwig":return`bigwig:${t.url}:${null!==(e=t.windowFunction)&&void 0!==e?e:"mean"}`;case"gtx":return`gtx:${t.url}:${t.experimentId}`;case"ucsc":return`ucsc:${null!==(n=t.genome)&&void 0!==n?n:""}:${null!==(r=t.track)&&void 0!==r?r:""}`;case"text":return`text:${t.url}:${null!==(o=t.format)&&void 0!==o?o:""}:${null!==(s=t.indexURL)&&void 0!==s?s:""}`}}class Ur{constructor(t){this.snapshots=new Map,this.browser=t}getState(t){const e=this.project();return(null==t?void 0:t.record)&&this.snapshots.set(t.record,structuredClone(e)),e}diff(t){const e=this.snapshots.get(t);if(!e)throw new Error(`No snapshot recorded under key "${t}"`);const n=this.project(),r={unchanged:!0};e.locus.chr===n.locus.chr&&e.locus.start===n.locus.start&&e.locus.end===n.locus.end||(r.locus=[e.locus,n.locus],r.unchanged=!1),e.zoomLevel!==n.zoomLevel&&(r.zoomLevel=[e.zoomLevel,n.zoomLevel],r.unchanged=!1);const o=new Set(e.tracks.map(t=>t.id)),s=new Set(n.tracks.map(t=>t.id)),i=n.tracks.filter(t=>!o.has(t.id)),a=e.tracks.filter(t=>!s.has(t.id)).map(t=>t.id);i.length>0&&(r.tracksAdded=i,r.unchanged=!1),a.length>0&&(r.tracksRemoved=a,r.unchanged=!1);const l=[];for(const t of n.tracks){if(!o.has(t.id))continue;const n=e.tracks.find(e=>e.id===t.id);if(!$r(n.featureSummary,t.featureSummary)){const e=qr(t.id,t.type,n.featureSummary,t.featureSummary);e&&l.push(e)}}return l.length>0&&(r.tracksChanged=l,r.unchanged=!1),JSON.stringify(e.rois)!==JSON.stringify(n.rois)&&(r.roisChanged=!0,r.unchanged=!1),r}record(t){this.snapshots.set(t,structuredClone(this.project()))}deleteSnapshot(t){return this.snapshots.delete(t)}getSnapshot(t){return this.snapshots.get(t)}snapshotKeys(){return[...this.snapshots.keys()]}clearSnapshots(){this.snapshots.clear()}project(){var t,e;const n=this.browser.locus,r={chr:n.chr,start:Math.round(n.start),end:Math.round(n.end)},o=r.end-r.start,s=this.browser.getManagedTracks();return{locus:r,locusString:Gr(r),span:o,zoomLevel:zr(o),genome:null===(t=this.browser.genome)||void 0===t?void 0:t.id,tracks:s.filter(t=>"ruler"!==t.track.type).map(t=>this.projectTrack(t,r)),rois:null!==(e=this.browser.toJSON().rois)&&void 0!==e?e:[]}}projectTrack(t,e){const n=this.summarizeFeatures(t,e),r=null!=t.dataSource,o=null!=t.cache;return{id:t.id,type:t.track.type,name:t.name,metadata:t.metadata,loading:!(!r||o)||void 0,featureSummary:n}}summarizeFeatures(t,e){switch(t.track.type){case"wig":return this.summarizeWig(t,e);case"annotation":return this.summarizeAnnotation(t,e);case"interact":return this.summarizeInteraction(t,e);default:return}}summarizeWig(t,e){const n=this.browser.getCachedFeatures(t.track);if(!n)return;const r=Wr(n,e);return{featureCount:r.length,signalRange:r.length>0?ot(r):{min:0,max:0}}}summarizeAnnotation(t,e){const n=this.browser.getCachedFeatures(t.track);if(!n)return;const r=Wr(n,e),o=new Set;for(const t of r)t.name&&o.size<20&&o.add(t.name);const s=r.reduce((t,e)=>{var n;return Math.max(t,null!==(n=e.row)&&void 0!==n?n:0)},0);return{featureCount:r.length,featureNames:[...o],packingDepth:s}}summarizeInteraction(t,e){var n,r;const o=this.browser.getCachedFeatures(t.track);if(!o)return;const s=Wr(o,e);let i=0;for(const t of s){const e=null!==(r=null!==(n=t.value)&&void 0!==n?n:t.score)&&void 0!==r?r:0;isNaN(e)||(i=Math.max(i,e))}return{featureCount:s.length,valueRange:{min:0,max:i}}}}function zr(t){return t<=100?"base":t<=1e4?"element":t<=5e5?"gene":t<=1e7?"region":t<=25e7?"chromosome":"genome"}function Gr(t){return`${t.chr}:${t.start.toLocaleString()}-${t.end.toLocaleString()}`}function Wr(t,e){return t.filter(t=>t.end>e.start&&t.start<e.end)}function qr(t,e,n,r){var o,s;const i={id:t,type:e};let a=!1;const l=null!==(o=n)&&void 0!==o?o:{},c=null!==(s=r)&&void 0!==s?s:{};for(const t of["featureCount","signalRange","featureNames","packingDepth","valueRange"]){const e=l[t],n=c[t];JSON.stringify(e)!==JSON.stringify(n)&&(i[t]=[null!=e?e:null,null!=n?n:null],a=!0)}return a?i:void 0}function $r(t,e){return t===e||!(!t||!e)&&JSON.stringify(t)===JSON.stringify(e)}function Hr(t,e){var n;if(void 0!==e.id&&t.id!==e.id)return!1;if(void 0!==e.name){const r=null!==(n=t.name)&&void 0!==n?n:"";if("string"==typeof e.name){if(!r.toLowerCase().includes(e.name.toLowerCase()))return!1}else if(!e.name.test(r))return!1}if(void 0!==e.type&&t.track.type!==e.type)return!1;if(void 0!==e.where){const n=t.metadata;if(!n)return!1;for(const[t,r]of Object.entries(e.where))if(n[t]!==r)return!1}return!0}function Br(t,e){return t.filter(t=>Hr(t,e))}const jr={LocusChange:"locuschange",TrackAdded:"trackadded",TrackRemoved:"trackremoved",TrackOrderChanged:"trackorderchanged",DataLoaded:"dataloaded",DataError:"dataerror",RenderError:"rendererror",TrackClick:"trackclick",TrackHover:"trackhover",TrackContextMenu:"trackcontextmenu",ROIAdded:"roiadded",ROIRemoved:"roiremoved",ROIChanged:"roichanged",ROIClick:"roiclick",ROIContextMenu:"roicontextmenu"};let Xr=0;class Vr{get locus(){return this._locus}get viewportWidth(){return this._viewportWidth}get state(){return this._state||(this._state=new Ur(this)),this._state}constructor(t){var e,n,r,s,i,a,l,c;this.managedTracks=[],this.roiSets=[],this.inflightFetches=new Map,this.events=new Ct,this.genome=null===t.genome?void 0:null!==(e=t.genome)&&void 0!==e?e:Yt,this.chromSizes=null===(n=this.genome)||void 0===n?void 0:n.chromSizes,this.cumulativeOffsets=null===(r=this.genome)||void 0===r?void 0:r.cumulativeOffsets,this.sequenceProvider=null===(s=this.genome)||void 0===s?void 0:s.sequence,this._locus=this.clamp({...t.locus}),this._viewportWidth=null!==(i=t.viewportWidth)&&void 0!==i?i:0,this.canvasProvider=null!==(a=t.canvasProvider)&&void 0!==a?a:o,this.workerProvider=t.workerProvider,this.popupProvider=null!==(l=t.popupProvider)&&void 0!==l?l:void 0,this.contextMenuProvider=null!==(c=t.contextMenuProvider)&&void 0!==c?c:void 0,this.theme=S(t.theme),t.stateProjection&&(this._state=t.stateProjection)}clamp(t){return this.chromSizes?G(t,this.chromSizes,this.cumulativeOffsets):t}on(t,e){return this.events.on(t,e)}off(t,e){this.events.off(t,e)}setViewportWidth(t){this._viewportWidth=t,this.render(),this.loadAllTracksIfNeeded()}addTrack(t,e,n,r){var o;const s=`${null!=(i=t.type)?i:"track"}-${Xr++}`;var i;const a={id:s,track:t,dataSource:null!==(o=e)&&void 0!==o?o:null,dataSourceConfig:null!=n?n:null,cache:null,abortController:null,maxTrackHeight:r};return this.managedTracks.push(a),t.setLocus(this._locus),this.events.emit(jr.TrackAdded,{track:t}),e&&this.loadTrackWithDedup(a),s}removeTrack(t){const e="string"==typeof t?this.managedTracks.findIndex(e=>e.id===t):this.managedTracks.findIndex(e=>e.track===t);if(e>=0){const t=this.managedTracks[e];t.abortController&&t.abortController.abort(),this.managedTracks.splice(e,1),this.events.emit(jr.TrackRemoved,{track:t.track})}}moveTrack(t,e){const n=this.managedTracks.findIndex(e=>e.track===t);if(n<0)return;const r=Math.max(0,Math.min(e,this.managedTracks.length-1));if(n===r)return;const[o]=this.managedTracks.splice(n,1);this.managedTracks.splice(r,0,o),this.events.emit(jr.TrackOrderChanged,{tracks:this.managedTracks.map(t=>t.track)})}getTrackOrder(){return this.managedTracks.map(t=>t.track)}getManagedTrack(t){return this.managedTracks.find(e=>e.id===t)}getTrack(t){var e;return null===(e=this.managedTracks.find(e=>e.id===t))||void 0===e?void 0:e.track}getManagedTracks(){return this.managedTracks}findTracks(t){return Br(this.managedTracks,t)}removeTracks(t){const e=Br(this.managedTracks,t);for(const t of e)this.removeTrack(t.id);return e.length}updateTrackMetadata(t,e){const n=Br(this.managedTracks,t);for(const t of n)t.metadata={...t.metadata,...e};return n.length}setLocus(t){this._locus=this.clamp({...t});for(const t of this.managedTracks)t.track.setLocus(this._locus);this.loadAllTracksIfNeeded(),this.events.emit(jr.LocusChange,{locus:this._locus})}search(t){const e=D(t,this.cumulativeOffsets);return!!e&&(this.setLocus(e),!0)}zoomIn(t=2){this.zoomByFactor(1/t)}zoomOut(t=2){this.zoomByFactor(t)}zoomByFactor(t){this.zoomAroundCenter(t)}zoomAroundCenter(t,e){if(K(this._locus))return;const n=null!=e?e:(this._locus.start+this._locus.end)/2,r=this._locus.end-this._locus.start;let o=r*t;if(t>1&&this.chromSizes&&this._viewportWidth>0){const t=this.chromSizes[this._locus.chr];if(null!=t){if(o>=t&&this.cumulativeOffsets)return void this.setLocus({chr:"all",start:0,end:this.cumulativeOffsets.totalLength});o=Math.min(o,t)}}if(null!=e){const t=(e-this._locus.start)/r;this.setLocus({chr:this._locus.chr,start:e-t*o,end:e-t*o+o})}else{const t=o/2;this.setLocus({chr:this._locus.chr,start:n-t,end:n+t})}}reloadData(){for(const t of this.managedTracks)t.dataSource&&(t.cache=null);this.loadAllTracksIfNeeded()}getCachedFeatures(t){var e;const n=this.managedTracks.find(e=>e.track===t);return null===(e=null==n?void 0:n.cache)||void 0===e?void 0:e.features}render(){if(0!==this._viewportWidth)for(const t of this.managedTracks)try{t.track.render()}catch(e){const n=e instanceof Error?e:new Error(String(e));console.error("[loom] Render error:",n),t.track.setError(n),this.events.emit(jr.RenderError,{track:t.track,error:n})}}addROI(t,e="User-defined"){let n=this.roiSets.find(t=>t.name===e);n||(n=new ut({name:e,isUserDefined:!0,features:[]}),this.roiSets.push(n));const r=n.addFeature(t);return this.events.emit(jr.ROIAdded,{roi:r,set:n}),r}addROISet(t){const e=new ut(t);this.roiSets.push(e);for(const t of e.features)this.events.emit(jr.ROIAdded,{roi:t,set:e});return e}removeROI(t){for(const e of this.roiSets){const n=e.removeFeature(t);if(n)return this.events.emit(jr.ROIRemoved,{roi:n,set:e}),!0}return!1}updateROI(t,e){for(const n of this.roiSets){const r=n.updateFeature(t,e);if(r)return this.events.emit(jr.ROIChanged,{roi:r,changes:e,set:n}),r}}clearROIs(){this.roiSets=[]}getROIs(){return this.roiSets.flatMap(t=>[...t.features])}getROISets(){return this.roiSets}findROIsAtLocus(t,e,n){return this.roiSets.flatMap(r=>r.getFeatures(t,e,n))}getVisibleROIs(){return this.findROIsAtLocus(this._locus.chr,this._locus.start,this._locus.end)}toSVG(t){var e,n;const r=null!==(e=null==t?void 0:t.width)&&void 0!==e?e:this._viewportWidth;if(0===r)throw new Error("Cannot export SVG with zero viewport width");let o=0;const s=[];for(const t of this.managedTracks){const e=t.track.height||50;s.push(e),o+=e}const i=new kt({width:r,height:o,viewbox:{x:0,y:0,width:r,height:o},backdropColor:null!==(n=null==t?void 0:t.backdropColor)&&void 0!==n?n:"white"});let a=0;for(let t=0;t<this.managedTracks.length;t++){const e=this.managedTracks[t].track,n=s[t],o=`track_${t}_${e.type}`;i.saveWithTranslationAndClipRect(o,0,a,r,n,0),e.renderToContext&&e.renderToContext(i,r,n),i.restore(),a+=n}const l=this.getVisibleROIs();if(l.length>0){const t=(this._locus.end-this._locus.start)/r;ft(i,l,{pixelWidth:r,bpStart:this._locus.start,bpPerPixel:t,viewportWidth:r},{totalHeight:o})}return i.setHeight(o),i.getSerializedSvg(!0)}toJSON(){const t=[];for(const e of this.managedTracks){const n=e.track.serializeConfig(this.theme);n.id=e.id,e.name&&(n.name=e.name),null!=e.order&&(n.order=e.order),e.metadata&&(n.metadata=e.metadata),e.dataSourceConfig&&"dataSource"in n&&(n.dataSource=e.dataSourceConfig),t.push(n)}const e=this.genome?{id:this.genome.id,name:this.genome.name}:void 0,n=this.roiSets.length>0?this.roiSets.map(t=>t.toJSON()):void 0;return{version:Rr,locus:{...this._locus},viewportWidth:this._viewportWidth||void 0,genome:e,tracks:t,rois:n}}loadSession(t,e){var n,r;for(const t of this.managedTracks)t.abortController&&t.abortController.abort();this.managedTracks=[],this.roiSets=[],this._locus={...t.locus},t.viewportWidth&&(this._viewportWidth=t.viewportWidth);const o={canvasProvider:this.canvasProvider,workerProvider:this.workerProvider,theme:null==e?void 0:e.theme,sequenceProvider:this.sequenceProvider};for(const e of t.tracks){const t=Lr(e,this._locus,o);this.genome&&t.dataSource&&(t.dataSource instanceof fe||t.dataSource instanceof We?t.dataSource.setChromNameResolver(t=>this.genome.getChromosomeName(t)):t.dataSource instanceof mr&&(t.dataSource.setChromNameResolver(t=>this.genome.getChromosomeName(t)),this.cumulativeOffsets&&t.dataSource.setCumulativeOffsets(this.cumulativeOffsets))),this.addTrack(t.track,null!==(n=t.dataSource)&&void 0!==n?n:void 0,null!==(r=t.dataSourceConfig)&&void 0!==r?r:void 0);const s=this.managedTracks[this.managedTracks.length-1];e.id&&(s.id=e.id),t.name&&(s.name=t.name),null!=t.order&&(s.order=t.order),e.metadata&&(s.metadata=e.metadata)}if(t.rois)for(const e of t.rois)this.addROISet(e);this.events.emit(jr.LocusChange,{locus:this._locus})}static fromSession(t,e){var n,r;const o=new Vr({locus:t.locus,viewportWidth:null!==(n=t.viewportWidth)&&void 0!==n?n:null==e?void 0:e.viewportWidth,canvasProvider:null==e?void 0:e.canvasProvider,workerProvider:null==e?void 0:e.workerProvider,theme:null!==(r=t.theme)&&void 0!==r?r:null==e?void 0:e.theme});return o.loadSession(t,e),o}addTrackFromConfig(t){var e,n;const r=Pr(t,this._locus,{canvasProvider:this.canvasProvider,workerProvider:this.workerProvider,theme:this.theme,sequenceProvider:this.sequenceProvider});this.genome&&r.dataSource&&(r.dataSource instanceof fe?r.dataSource.setChromNameResolver(t=>this.genome.getChromosomeName(t)):r.dataSource instanceof mr&&(r.dataSource.setChromNameResolver(t=>this.genome.getChromosomeName(t)),this.cumulativeOffsets&&r.dataSource.setCumulativeOffsets(this.cumulativeOffsets))),this.addTrack(r.track,null!==(e=r.dataSource)&&void 0!==e?e:void 0,null!==(n=r.dataSourceConfig)&&void 0!==n?n:void 0);const o=this.managedTracks[this.managedTracks.length-1];return t.id&&(o.id=t.id),r.name&&(o.name=r.name),null!=r.order&&(o.order=r.order),t.metadata&&(o.metadata=t.metadata),r.track}addRuler(t){const{canvas:e}=this.canvasProvider.createCanvas(0,0),n=new W(e,{locus:this._locus,config:null==t?void 0:t.config,theme:this.theme,canvasProvider:this.canvasProvider,cumulativeOffsets:this.cumulativeOffsets,chromSizes:this.chromSizes});return this.addTrack(n,void 0,void 0,null==t?void 0:t.maxTrackHeight),n}addWigTrack(t,e){var n;const{canvas:r}=this.canvasProvider.createCanvas(0,0),o=null!==(n=null==e?void 0:e.windowFunction)&&void 0!==n?n:"mean",s=new it(r,{locus:this._locus,features:[],config:null==e?void 0:e.config,height:null==e?void 0:e.height,background:null==e?void 0:e.background,theme:this.theme,canvasProvider:this.canvasProvider,name:null==e?void 0:e.name,sequenceProvider:this.sequenceProvider}),i=new fe(t,o,this.workerProvider);this.cumulativeOffsets&&i.setCumulativeOffsets(this.cumulativeOffsets),this.genome&&i.setChromNameResolver(t=>this.genome.getChromosomeName(t));const a={type:"bigwig",url:t,windowFunction:o};return this.addTrack(s,i,a,null==e?void 0:e.maxTrackHeight),(null==e?void 0:e.metadata)&&(this.managedTracks[this.managedTracks.length-1].metadata=e.metadata),s.onWindowFunctionChange=t=>{i.setWindowFunction(t);const e=this.managedTracks.find(t=>t.track===s);e&&(e.cache=null,e.dataSourceConfig&&"bigwig"===e.dataSourceConfig.type&&(e.dataSourceConfig.windowFunction=t)),this.loadAllTracksIfNeeded()},s}addGtxTrack(t,e){var n;const{canvas:r}=this.canvasProvider.createCanvas(0,0),o=null!==(n=e.windowFunction)&&void 0!==n?n:"mean",s=new it(r,{locus:this._locus,features:[],config:e.config,height:e.height,background:e.background,theme:this.theme,canvasProvider:this.canvasProvider,name:e.name,sequenceProvider:this.sequenceProvider}),i=new We(t,e.experimentId,o,this.workerProvider);this.cumulativeOffsets&&i.setCumulativeOffsets(this.cumulativeOffsets),this.genome&&i.setChromNameResolver(t=>this.genome.getChromosomeName(t));const a={type:"gtx",url:t,experimentId:e.experimentId,windowFunction:o};return this.addTrack(s,i,a,e.maxTrackHeight),e.metadata&&(this.managedTracks[this.managedTracks.length-1].metadata=e.metadata),s.onWindowFunctionChange=t=>{i.setWindowFunction(t);const e=this.managedTracks.find(t=>t.track===s);e&&(e.cache=null,e.dataSourceConfig&&"gtx"===e.dataSourceConfig.type&&(e.dataSourceConfig.windowFunction=t)),this.loadAllTracksIfNeeded()},s}addGeneTrack(t){var e;const{canvas:n}=this.canvasProvider.createCanvas(0,0),r=new L(n,{locus:this._locus,features:[],config:null==t?void 0:t.config,height:null==t?void 0:t.height,background:null==t?void 0:t.background,theme:this.theme,canvasProvider:this.canvasProvider,workerProvider:this.workerProvider,name:null!==(e=null==t?void 0:t.name)&&void 0!==e?e:"Genes"}),o=null==t?void 0:t.genome,s=null==t?void 0:t.track,i=new Ze({genome:o,track:s});this.cumulativeOffsets&&i.setCumulativeOffsets(this.cumulativeOffsets);const a={type:"ucsc",genome:o,track:s};return this.addTrack(r,i,a,null==t?void 0:t.maxTrackHeight),(null==t?void 0:t.metadata)&&(this.managedTracks[this.managedTracks.length-1].metadata=t.metadata),r}addBedTrack(t,e){const{canvas:n}=this.canvasProvider.createCanvas(0,0),r=null==e?void 0:e.format,o=new L(n,{locus:this._locus,features:[],config:null==e?void 0:e.config,height:null==e?void 0:e.height,background:null==e?void 0:e.background,theme:this.theme,canvasProvider:this.canvasProvider,workerProvider:this.workerProvider,name:null==e?void 0:e.name}),s=new mr({url:t,format:r,indexURL:null==e?void 0:e.indexURL,indexed:null==e?void 0:e.indexed,workerProvider:this.workerProvider});this.genome&&s.setChromNameResolver(t=>this.genome.getChromosomeName(t)),this.cumulativeOffsets&&s.setCumulativeOffsets(this.cumulativeOffsets);const i={type:"text",url:t,format:r,indexURL:null==e?void 0:e.indexURL,indexed:null==e?void 0:e.indexed};return this.addTrack(o,s,i,null==e?void 0:e.maxTrackHeight),(null==e?void 0:e.metadata)&&(this.managedTracks[this.managedTracks.length-1].metadata=e.metadata),o}addInteractionTrack(t,e){const{canvas:n}=this.canvasProvider.createCanvas(0,0),r=null==e?void 0:e.format,o=new xr(n,{locus:this._locus,features:[],config:null==e?void 0:e.config,background:null==e?void 0:e.background,theme:this.theme,canvasProvider:this.canvasProvider,name:null==e?void 0:e.name}),s=new mr({url:t,format:r,indexURL:null==e?void 0:e.indexURL,indexed:null==e?void 0:e.indexed,workerProvider:this.workerProvider});this.genome&&s.setChromNameResolver(t=>this.genome.getChromosomeName(t)),this.cumulativeOffsets&&s.setCumulativeOffsets(this.cumulativeOffsets);const i={type:"text",url:t,format:r,indexURL:null==e?void 0:e.indexURL,indexed:null==e?void 0:e.indexed};return this.addTrack(o,s,i),(null==e?void 0:e.metadata)&&(this.managedTracks[this.managedTracks.length-1].metadata=e.metadata),o}addSequenceTrack(t){const e={type:"sequence",config:null==t?void 0:t.config},n=this.addTrackFromConfig(e);if(null!=(null==t?void 0:t.maxTrackHeight)){const e=this.managedTracks.find(t=>t.track===n);e&&(e.maxTrackHeight=t.maxTrackHeight)}return n}dispose(){this.events.removeAllListeners(),this.popupProvider&&this.popupProvider.dispose(),this.contextMenuProvider&&this.contextMenuProvider.dispose();for(const t of this.managedTracks)t.abortController&&t.abortController.abort();this.managedTracks=[],this.roiSets=[]}resolveInteraction(t,e,n){const r=t.hitTest(e,n);if(0===r.length)return null;const o=t.canvas.clientWidth,s=o>0?(this._locus.end-this._locus.start)/o:0;return{track:t,genomicLocation:this._locus.start+e*s,features:r.map(t=>t.feature),popupData:r.flatMap(t=>t.popupData),x:e,y:n}}loadAllTracksIfNeeded(){this.inflightFetches.clear();for(const t of this.managedTracks)t.dataSource&&this.loadTrackWithDedup(t)}loadTrackWithDedup(t){const e=this._viewportWidth;if(0===e)return;const n=(this._locus.end-this._locus.start)/e,r=t.track.visibilityWindow,o=null!=r&&r>0&&n*e>r;if("setZoomedOut"in t.track&&"function"==typeof t.track.setZoomedOut&&t.track.setZoomedOut(o),o)return void(t.abortController&&(t.abortController.abort(),t.abortController=null));if(t.cache&&It(t.cache,this._locus,n))return;t.abortController&&t.abortController.abort();const s=St(this._locus),i=t.dataSourceConfig?Dr(t.dataSourceConfig):null;if(i)for(const e of this.managedTracks)if(e!==t&&e.dataSourceConfig&&e.cache&&Dr(e.dataSourceConfig)===i&&It(e.cache,this._locus,n)){t.cache=e.cache,t.abortController=null,t.track.setError(null);const n=t.track;return"function"==typeof n.setFeatures&&n.setFeatures(e.cache.features),void this.events.emit(jr.DataLoaded,{track:t.track})}const a=i?`${i}|${s.chr}:${s.start}-${s.end}|${n}`:null,l=a?this.inflightFetches.get(a):null;if(l)return t.abortController=null,void l.promise.then(e=>{t.cache={locus:l.fetchRegion,bpPerPixel:l.bpPerPixel,features:e},t.track.setError(null);const n=t.track;"function"==typeof n.setFeatures&&n.setFeatures(e),this.events.emit(jr.DataLoaded,{track:t.track})}).catch(e=>{if(e instanceof DOMException&&"AbortError"===e.name)return;const n=e instanceof Error?e:new Error(String(e));console.error("[loom] Data fetch error (dedup):",n),t.track.setError(n),this.events.emit(jr.DataError,{track:t.track,error:n})});const c=new AbortController;t.abortController=c;const h=t.dataSource.fetch(s,n,c.signal);a&&this.inflightFetches.set(a,{promise:h,fetchRegion:s,bpPerPixel:n}),h.then(e=>{if(c.signal.aborted)return;t.cache={locus:s,bpPerPixel:n,features:e},t.abortController=null,t.track.setError(null);const r=t.track;"function"==typeof r.setFeatures&&r.setFeatures(e),this.events.emit(jr.DataLoaded,{track:t.track})}).catch(e=>{if(!c.signal.aborted){const n=e instanceof Error?e:new Error(String(e));console.error("[loom] Data fetch error:",n),t.track.setError(n),this.events.emit(jr.DataError,{track:t.track,error:n})}}).finally(()=>{var t;a&&(null===(t=this.inflightFetches.get(a))||void 0===t?void 0:t.promise)===h&&this.inflightFetches.delete(a)})}}class Yr extends Error{constructor(t,e){super(e),this.code=t,this.name="CommandError"}}function Zr(t){const e={};return void 0!==t.id&&(e.id=t.id),void 0!==t.nameRegex?e.name=new RegExp(t.nameRegex,"i"):void 0!==t.name&&(e.name=t.name),void 0!==t.type&&(e.type=t.type),void 0!==t.where&&(e.where=t.where),e}class Jr{constructor(t,e){this.browser=t,this.options=null!=e?e:{}}async dispatch(t){switch(t.command){case"get_browser_state":return this.handleGetState(t);case"navigate":return this.handleNavigate(t);case"modify_tracks":return this.handleModifyTracks(t);case"query_features":return this.handleQueryFeatures(t);case"annotate":return this.handleAnnotate();case"set_layout":return this.handleSetLayout(t);case"export_view":return this.handleExportView(t);case"manage_rois":return this.handleManageROIs(t);case"subscribe_events":return this.handleSubscribeEvents(t);default:throw new Yr("UNKNOWN_COMMAND",`Unknown command: ${t.command}`)}}handleGetState(t){return this.browser.state.getState(t.record?{record:t.record}:void 0)}handleNavigate(t){if(!t.locus&&!t.zoom)throw new Yr("INVALID_ARGS","navigate requires at least one of: locus, zoom");let e=!0;if(t.locus){const n=this.browser.search(t.locus);if(!n)throw new Yr("NAVIGATION_FAILED",`Could not parse locus: "${t.locus}"`);e=n}return"in"===t.zoom?this.browser.zoomIn(t.factor):"out"===t.zoom&&this.browser.zoomOut(t.factor),e}handleModifyTracks(t){if(!t.actions||0===t.actions.length)throw new Yr("INVALID_ARGS","modify_tracks requires at least one action");const e=[];for(const n of t.actions)switch(n.action){case"add":{const t=this.browser.addTrackFromConfig(n.config),r=this.browser.getManagedTracks().find(e=>e.track===t);e.push({action:"add",success:!0,trackId:null==r?void 0:r.id});break}case"remove":{const t=this.browser.removeTracks(Zr(n.selector));e.push({action:"remove",success:t>0,count:t});break}case"find":{const t=this.browser.findTracks(Zr(n.selector)).map(t=>Qr(t));e.push({action:"find",success:!0,tracks:t});break}case"update_metadata":{const t=this.browser.updateTrackMetadata(Zr(n.selector),n.metadata);e.push({action:"update_metadata",success:t>0,count:t});break}default:e.push({action:n.action,success:!1,error:`Unknown action: ${n.action}`})}return{results:e}}handleQueryFeatures(t){var e;const n=this.browser.getTrack(t.trackId);if(!n)throw new Yr("TRACK_NOT_FOUND",`No track with id '${t.trackId}'`);const r=null!==(e=this.browser.getCachedFeatures(n))&&void 0!==e?e:[];if(t.summarize){const e=this.browser.state.getState().tracks.find(e=>e.id===t.trackId);return{trackId:t.trackId,featureCount:r.length,summary:null==e?void 0:e.featureSummary}}return{trackId:t.trackId,featureCount:r.length,features:r}}handleAnnotate(){throw new Yr("NOT_IMPLEMENTED","Annotations are not yet supported (Phase 3)")}handleSetLayout(t){if(!t.tracks)throw new Yr("INVALID_ARGS","set_layout requires a tracks array");const e=[...this.browser.getManagedTracks()],n=new Set,r=[],o=[];for(const s of t.tracks){const t=this.findMatchingTrack(s,e,n);t?(n.add(t.id),o.push(t.id)):r.push(s)}const s=[];for(const t of e)n.has(t.id)||(this.browser.removeTrack(t.id),s.push(t.id));const i=[];for(const t of r){const e=this.browser.addTrackFromConfig(t),n=this.browser.getManagedTracks().find(t=>t.track===e);n&&i.push(n.id)}return t.locus&&this.browser.search(t.locus),{added:i,removed:s,unchanged:o}}findMatchingTrack(t,e,n){if(t.id)return e.find(e=>e.id===t.id&&!n.has(e.id));const r=this.layoutMatchKey(t);return e.find(e=>!n.has(e.id)&&(e.track.type===t.type&&(e.dataSourceConfig?r===Dr(e.dataSourceConfig):!r)))}layoutMatchKey(t){if("dataSource"in t&&t.dataSource)return Dr(t.dataSource)}async handleExportView(t){switch(t.format){case"svg":return this.browser.toSVG(t.width?{width:t.width}:void 0);case"png":if(!this.options.supportsPNG||!this.options.exportPNG)throw new Yr("EXPORT_UNAVAILABLE","PNG export requires a DOM-attached GenomeBrowser");return this.options.exportPNG();case"session":return this.browser.toJSON();default:throw new Yr("INVALID_ARGS",`Unknown export format: ${t.format}`)}}handleManageROIs(t){const{action:e}=t;switch(e.action){case"add":return{action:"add",roi:this.browser.addROI(e.roi,e.setName)};case"remove":return{action:"remove",success:this.browser.removeROI(e.roiId)};case"update":return{action:"update",roi:this.browser.updateROI(e.roiId,e.changes)};case"clear":return this.browser.clearROIs(),{action:"clear"};case"list":return{action:"list",rois:this.browser.getROIs()};case"list_sets":return{action:"list_sets",sets:this.browser.getROISets().map(t=>t.toJSON())};case"find_at_locus":return{action:"find_at_locus",rois:this.browser.findROIsAtLocus(e.chr,e.start,e.end)};case"get_visible":return{action:"get_visible",rois:this.browser.getVisibleROIs()};default:throw new Yr("INVALID_ARGS",`Unknown ROI action: ${e.action}`)}}handleSubscribeEvents(t){var e,n;if(!Array.isArray(t.events))throw new Yr("INVALID_ARGS","subscribe_events requires an events array");const r=new Set(Object.values(jr)),o=[];for(const e of t.events)if("*"===e)o.push("*");else{if(!r.has(e))throw new Yr("INVALID_ARGS",`Unknown event name: "${e}". Valid events: ${[...r].join(", ")}`);o.push(e)}return null===(n=(e=this.options).onSubscribeEvents)||void 0===n||n.call(e,o),{subscribed:o}}}function Qr(t){return{id:t.id,type:t.track.type,name:t.name,metadata:t.metadata,loading:null!=t.dataSource&&null==t.cache}}const to=1;class eo{constructor(t,e,n){this.unsubscribers=[],this.detached=!1,this.subscribedEvents=null,this.browser=t,this.socket=e,this.dispatcher=new Jr(t,{...n,onSubscribeEvents:t=>{this.subscribedEvents=new Set(t)}}),this.messageHandler=t=>{this.handleMessage(t.data)},this.closeHandler=()=>this.detach(),e.addEventListener("message",this.messageHandler),e.addEventListener("close",this.closeHandler),this.subscribeToEvents()}detach(){if(!this.detached){this.detached=!0;for(const t of this.unsubscribers)t();this.unsubscribers=[],this.socket.removeEventListener("message",this.messageHandler),this.socket.removeEventListener("close",this.closeHandler)}}get isDetached(){return this.detached}async handleMessage(t){var e;let n;try{n=JSON.parse(t)}catch(t){return}if(n.id&&n.command)try{const t={command:n.command,...n.args},e=await this.dispatcher.dispatch(t);this.send({id:n.id,result:e})}catch(t){t instanceof Yr?this.send({id:n.id,error:{code:t.code,message:t.message}}):this.send({id:n.id,error:{code:"INTERNAL_ERROR",message:null!==(e=t.message)&&void 0!==e?e:"Unknown error"}})}}send(t){1!==this.socket.readyState||this.detached||this.socket.send(JSON.stringify(t))}subscribeToEvents(){const t=Object.values(jr);for(const e of t){const t=this.browser.on(e,t=>{this.subscribedEvents&&(this.subscribedEvents.has("*")||this.subscribedEvents.has(e))&&this.send({event:e,data:this.sanitizeEventData(e,t)})});this.unsubscribers.push(t)}}sanitizeEventData(t,e){if(t===jr.LocusChange)return e;if(t===jr.ROIClick||t===jr.ROIContextMenu)return e;if(t===jr.ROIAdded||t===jr.ROIRemoved||t===jr.ROIChanged){const t=e;return{roi:t.roi,setName:t.set.name,...t.changes?{changes:t.changes}:{}}}if(t===jr.TrackOrderChanged){return{trackIds:e.tracks.map(t=>this.findTrackId(t))}}if(t===jr.DataError||t===jr.RenderError){const t=e,n=this.findManagedTrack(t.track);return{trackId:null==n?void 0:n.id,trackType:t.track.type,trackName:null==n?void 0:n.name,error:t.error.message}}if(t===jr.TrackClick||t===jr.TrackHover||t===jr.TrackContextMenu){const t=e,n=this.findManagedTrack(t.track);return{trackId:null==n?void 0:n.id,trackType:t.track.type,trackName:null==n?void 0:n.name,genomicLocation:t.genomicLocation,featureCount:t.features.length}}const n=e;if("track"in n){const t=this.findManagedTrack(n.track);return{trackId:null==t?void 0:t.id,trackType:n.track.type,trackName:null==t?void 0:t.name}}return e}findManagedTrack(t){return this.browser.getManagedTracks().find(e=>e.track===t)}findTrackId(t){var e;return null===(e=this.findManagedTrack(t))||void 0===e?void 0:e.id}}const no=50,ro=new WeakSet;class oo extends Vr{constructor(t,e){var n,r,o;const s=null===e.contextMenuProvider?void 0:null!==(n=e.contextMenuProvider)&&void 0!==n?n:function(){customElements.get("loom-context-menu")||Promise.resolve().then(function(){return Po});let t=null;return{show(e,n,r){t||(t=document.createElement("loom-context-menu"),"static"===getComputedStyle(r).position&&(r.style.position="relative"),r.appendChild(t)),t.setItems(e),t.showAt(n.x,n.y)},hide(){t&&t.hide()},dispose(){t&&(t.remove(),t=null)}}}(),i=null===e.popupProvider?void 0:null!==(r=e.popupProvider)&&void 0!==r?r:function(){customElements.get("loom-popup")||Promise.resolve().then(function(){return To});let t=null;return{show(e,n,r){t||(t=document.createElement("loom-popup"),"static"===getComputedStyle(r).position&&(r.style.position="relative"),r.appendChild(t)),t.setData(e),t.showAt(n.x,n.y)},hide(){t&&t.hide()},dispose(){t&&(t.remove(),t=null)}}}();super({...e,contextMenuProvider:s,popupProvider:i,viewportWidth:t.clientWidth}),this.isDragging=!1,this.lastPointerX=0,this.isSweeping=!1,this.sweepStartX=0,this.sweepOverlay=null,this.sweepRulerCanvas=null,this.pointerDownX=0,this.pointerDownY=0,this.pointerDownTarget=null,this.lastClickTime=0,this.lastClickX=0,this.lastClickY=0,this.singleClickTimer=null,this.hoverThrottleId=null,this._rafId=null,this.resizeObserver=null,this.trackRows=new Map,this.handleContextMenu=null,this.inputDialog=null,this.remoteConnection=null,this.reorderDragTrack=null,this.reorderDragRow=null,this.reorderHandlers=new Map,this.handlePointerDown=null,this.handlePointerMove=null,this.handlePointerUp=null,this.handleMouseMove=null,this.handleMouseLeave=null,this.handleDocMouseDown=null,this.handleWheel=null,this.wheelRafId=null,this.roiOverlayContainer=null,this.roiElements=new Map,this.container=t,this.interactive=null===(o=e.interactive)||void 0===o||o,function(t){const e=t.getRootNode();if(ro.has(e))return;ro.add(e);const n=document.createElement("style");n.textContent="\n .loom-track-scroll { scrollbar-width: none; }\n .loom-track-scroll::-webkit-scrollbar { display: none; }\n ",e instanceof Document?e.head.appendChild(n):e.appendChild(n)}(t),t.style.userSelect="none",t.style.touchAction="none",this.interactive&&(t.style.cursor=K(e.locus)?"default":"grab",this.setupDragHandlers(),this.setupHoverHandlers(),this.setupContextMenuHandler(),!1!==e.wheelZoom&&this.setupWheelHandler(),(this.popupProvider||this.contextMenuProvider)&&(this.handleDocMouseDown=t=>{var e,n;this.container.contains(t.target)||(null===(e=this.popupProvider)||void 0===e||e.hide(),null===(n=this.contextMenuProvider)||void 0===n||n.hide())},document.addEventListener("mousedown",this.handleDocMouseDown))),this.resizeObserver=new ResizeObserver(()=>this.render()),this.resizeObserver.observe(t),this.events.on(jr.DataLoaded,({track:t})=>{this.updateAxisContent(t)}),this.events.on(jr.ROIAdded,()=>this.renderROIOverlays()),this.events.on(jr.ROIRemoved,()=>this.renderROIOverlays()),this.events.on(jr.ROIChanged,()=>this.renderROIOverlays()),this.events.on(jr.LocusChange,()=>this.renderROIOverlays())}addTrack(t,e,n,r){const o=super.addTrack(t,e,n,r),s=t.canvas;s.style.display="block",s.style.width="100%";const i=document.createElement("div");i.style.display="flex",i.style.width="100%",i.style.alignItems="stretch";const a=document.createElement("div");a.style.width="50px",a.style.flexShrink="0",a.style.overflow="hidden",a.style.position="relative",a.style.borderRight="1px solid #ddd",a.style.boxSizing="border-box";const l=document.createElement("div");l.style.flex="1",l.style.minWidth="0";const c=this.managedTracks[this.managedTracks.length-1];return null!=c.maxTrackHeight&&(l.style.maxHeight=`${c.maxTrackHeight}px`,l.style.overflowY="auto",l.style.overscrollBehaviorY="none",l.style.backgroundColor=t.canvas.style.backgroundColor||"#ffffff",l.classList.add("loom-track-scroll")),l.appendChild(s),i.appendChild(a),i.appendChild(l),this.container.appendChild(i),this.trackRows.set(t,{row:i,axisDiv:a,axisCanvas:null,viewportWrapper:l}),"wig"===t.type&&t.setConfig({showDataRange:!1}),this.updateAxisContent(t),this.interactive&&"ruler"===t.type&&(s.style.cursor=K(this._locus)?"pointer":"crosshair"),this.interactive&&"ruler"!==t.type&&this.setupReorderHandlers(t,a),o}removeTrack(t){const e="string"==typeof t?this.getTrack(t):t;if(!e)return;this.teardownReorderHandlers(e);const n=this.trackRows.get(e);n&&n.row.parentNode===this.container&&this.container.removeChild(n.row),this.trackRows.delete(e),super.removeTrack(t)}moveTrack(t,e){super.moveTrack(t,e),this.syncDOMOrder()}loadSession(t,e){for(const t of this.managedTracks){const e=this.trackRows.get(t.track);e&&e.row.parentNode===this.container&&this.container.removeChild(e.row)}this.trackRows.clear(),this.clearROIOverlay(),super.loadSession(t,e)}render(){const t=this.container.clientWidth;if(0===t)return;const e=t-no;this._viewportWidth=e;for(const t of this.managedTracks)t.track.canvas.style.width=`${e}px`;super.render();const n=K(this._locus);this.interactive&&(this.container.style.cursor=n?"default":"grab");for(const t of this.managedTracks)this.updateAxisContent(t.track),this.interactive&&"ruler"===t.track.type&&(t.track.canvas.style.cursor=n?"pointer":"crosshair");this.renderROIOverlays()}attachRemote(t){this.remoteConnection&&this.remoteConnection.detach(),this.remoteConnection=new eo(this,t,{supportsPNG:!0,exportPNG:()=>this.toPNG()})}detachRemote(){this.remoteConnection&&(this.remoteConnection.detach(),this.remoteConnection=null)}dispose(){this.detachRemote(),null!==this._rafId&&(cancelAnimationFrame(this._rafId),this._rafId=null),this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),null!==this.singleClickTimer&&(clearTimeout(this.singleClickTimer),this.singleClickTimer=null),this.teardownDragHandlers(),this.teardownHoverHandlers(),this.teardownContextMenuHandler(),this.teardownWheelHandler(),this.handleDocMouseDown&&(document.removeEventListener("mousedown",this.handleDocMouseDown),this.handleDocMouseDown=null),this.removeSweepOverlay(),this.clearROIOverlay();for(const t of this.managedTracks){this.teardownReorderHandlers(t.track);const e=this.trackRows.get(t.track);e&&e.row.parentNode===this.container&&this.container.removeChild(e.row)}this.reorderHandlers.clear(),this.trackRows.clear(),super.dispose()}updateAxisContent(t){var e,n,r;const o=this.trackRows.get(t);if(!o)return;const{axisDiv:s}=o,i=null===(e=t.getAxisInfo)||void 0===e?void 0:e.call(t);if(!i)return s.innerHTML="",s.style.borderRight="none",void(o.axisCanvas=null);const a={...i,backgroundColor:null!==(n=i.backgroundColor)&&void 0!==n?n:this.theme.palette.background,labelColor:null!==(r=i.labelColor)&&void 0!==r?r:this.theme.palette.foreground},l=this.theme.palette.muted;s.style.borderRight=`1px solid ${l}`;const c=this.managedTracks.find(e=>e.track===t),h=null!=(null==c?void 0:c.maxTrackHeight)?Math.min(t.height,c.maxTrackHeight):t.height;a.dataRange?this.paintAxisCanvas(o,a,h,H):a.label&&this.paintAxisCanvas(o,a,h,B)}paintAxisCanvas(t,e,n,r){const{axisDiv:o}=t,s=n;if(0===s)return;o.style.height=`${s}px`;let i=t.axisCanvas;i||(o.innerHTML="",i=document.createElement("canvas"),i.style.display="block",o.appendChild(i),t.axisCanvas=i);const a=this.canvasProvider.devicePixelRatio;i.width=50*a,i.height=s*a,i.style.width="50px",i.style.height=`${s}px`;const l=i.getContext("2d");l.scale(a,a),r(l,e,50,s)}isRulerCanvas(t){return t instanceof HTMLCanvasElement&&this.managedTracks.some(e=>"ruler"===e.track.type&&e.track.canvas===t)}createSweepOverlay(t){const e=document.createElement("div");return e.style.cssText="\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 0;\n pointer-events: none;\n background: rgba(68, 134, 247, 0.25);\n z-index: 99999;\n transition: none;\n ",t.style.position="relative",t.parentElement.style.position="relative",t.parentElement.appendChild(e),e}removeSweepOverlay(){this.sweepOverlay&&(this.sweepOverlay.remove(),this.sweepOverlay=null),this.sweepRulerCanvas=null}setupDragHandlers(){this.handlePointerDown=t=>{var e;if(0===t.button&&!this.isOverlayTarget(t)){if(null===(e=this.contextMenuProvider)||void 0===e||e.hide(),!(t.target instanceof HTMLCanvasElement))return this.popupProvider&&this.popupProvider.hide(),void(this.pointerDownTarget=null);if(this.pointerDownX=t.clientX,this.pointerDownY=t.clientY,this.pointerDownTarget=t.target,!K(this._locus)){if(this.isRulerCanvas(t.target)){const e=t.target;this.isSweeping=!0,this.isDragging=!1,this.sweepRulerCanvas=e;const n=e.getBoundingClientRect();return this.sweepStartX=t.clientX-n.left,this.sweepOverlay=this.createSweepOverlay(e),this.sweepOverlay.style.left=`${this.sweepStartX}px`,this.sweepOverlay.style.width="0px",this.sweepOverlay.style.display="block",void this.container.setPointerCapture(t.pointerId)}this.isDragging=!0,this.isSweeping=!1,this.lastPointerX=t.clientX,this.container.setPointerCapture(t.pointerId),this.container.style.cursor="grabbing"}}},this.handlePointerMove=t=>{if(this.isSweeping&&this.sweepOverlay&&this.sweepRulerCanvas){const e=this.sweepRulerCanvas.getBoundingClientRect(),n=Math.max(0,Math.min(t.clientX-e.left,e.width)),r=Math.min(this.sweepStartX,n),o=Math.abs(n-this.sweepStartX);return this.sweepOverlay.style.left=`${r}px`,void(this.sweepOverlay.style.width=`${o}px`)}if(!this.isDragging)return;const e=this.lastPointerX-t.clientX;this.lastPointerX=t.clientX;const n=this.container.clientWidth;if(0===n)return;const r=e*((this._locus.end-this._locus.start)/n);this._locus=this.clamp({chr:this._locus.chr,start:this._locus.start+r,end:this._locus.end+r});for(const t of this.managedTracks)t.track.suspendRendering(),t.track.setLocus(this._locus);null===this._rafId&&(this._rafId=requestAnimationFrame(()=>{this._rafId=null;for(const t of this.managedTracks)t.track.resumeRendering();this.loadAllTracksIfNeeded()})),this.events.emit(jr.LocusChange,{locus:this._locus})},this.handlePointerUp=t=>{if(this.isOverlayTarget(t))return;if(this.isSweeping&&this.sweepOverlay&&this.sweepRulerCanvas){const t=parseFloat(this.sweepOverlay.style.left),e=parseFloat(this.sweepOverlay.style.width);if(this.removeSweepOverlay(),this.isSweeping=!1,e>3){const n=this.container.clientWidth;if(n>0){const r=(this._locus.end-this._locus.start)/n,o=this._locus.start+t*r,s=this._locus.start+(t+e)*r;this.setLocus({chr:this._locus.chr,start:Math.round(o),end:Math.round(s)})}}return}const e=this.isDragging;this.isDragging=!1,this.container.style.cursor="grab";const n=t.clientX-this.pointerDownX,r=t.clientY-this.pointerDownY;(!e||n*n+r*r<9)&&this.handleClick(t)},this.container.addEventListener("pointerdown",this.handlePointerDown),this.container.addEventListener("pointermove",this.handlePointerMove),this.container.addEventListener("pointerup",this.handlePointerUp),this.container.addEventListener("pointercancel",this.handlePointerUp)}isOverlayTarget(t){return t.composedPath().some(t=>t instanceof HTMLElement&&("LOOM-CONTEXT-MENU"===t.tagName||"LOOM-INPUT-DIALOG"===t.tagName||"LOOM-POPUP"===t.tagName||t.classList.contains("loom-roi-region")))}findTrackForTarget(t){var e;if(!(t instanceof HTMLCanvasElement))return null;const n=this.managedTracks.find(e=>e.track.canvas===t);return null!==(e=null==n?void 0:n.track)&&void 0!==e?e:null}canvasCoords(t){if(!(t.target instanceof HTMLCanvasElement))return null;const e=t.target.getBoundingClientRect();return{x:t.clientX-e.left,y:t.clientY-e.top}}handleClick(t){const e=this.findTrackForTarget(this.pointerDownTarget);if(!e)return;const n=this.pointerDownTarget,r=n.getBoundingClientRect(),o={x:t.clientX-r.left,y:t.clientY-r.top};if(K(this._locus)&&"ruler"===e.type&&this.cumulativeOffsets&&this.chromSizes){const t=n.clientWidth;if(t>0){const e=(this._locus.end-this._locus.start)/t,n=this._locus.start+o.x*e,{chr:r}=Dt(n,this.cumulativeOffsets),s=this.chromSizes[r];null!=s&&this.setLocus({chr:r,start:0,end:s})}return}const s=Date.now(),i=s-this.lastClickTime<500&&Math.abs(t.clientX-this.lastClickX)<6&&Math.abs(t.clientY-this.lastClickY)<6;if(this.lastClickTime=s,this.lastClickX=t.clientX,this.lastClickY=t.clientY,i){if(null!==this.singleClickTimer&&(clearTimeout(this.singleClickTimer),this.singleClickTimer=null),this.lastClickTime=0,!K(this._locus)){const e=n.clientWidth;if(e>0){const n=(this._locus.end-this._locus.start)/e,r=this._locus.start+o.x*n,s=t.shiftKey?2:.5;this.zoomAroundCenter(s,r)}}return}this.singleClickTimer=setTimeout(()=>{this.singleClickTimer=null;const t=this.resolveInteraction(e,o.x,o.y);if(t){if(this.events.emit(jr.TrackClick,t),this.popupProvider&&t.popupData.length>0){const n=this.container.getBoundingClientRect(),r=e.canvas.getBoundingClientRect();this.popupProvider.show(t.popupData,{x:r.left-n.left+o.x,y:r.top-n.top+o.y},this.container)}}else this.popupProvider&&this.popupProvider.hide()},500)}setupHoverHandlers(){this.handleMouseMove=t=>{if(this.isDragging||this.isSweeping)return;if(null!==this.hoverThrottleId)return;this.hoverThrottleId=setTimeout(()=>{this.hoverThrottleId=null},100);const e=this.findTrackForTarget(t.target);if(!e)return;const n=this.canvasCoords(t);if(!n)return;const r=this.resolveInteraction(e,n.x,n.y);r&&this.events.emit(jr.TrackHover,r)},this.handleMouseLeave=t=>{null!==this.hoverThrottleId&&(clearTimeout(this.hoverThrottleId),this.hoverThrottleId=null)},this.container.addEventListener("mousemove",this.handleMouseMove),this.container.addEventListener("mouseleave",this.handleMouseLeave)}teardownHoverHandlers(){this.handleMouseMove&&this.container.removeEventListener("mousemove",this.handleMouseMove),this.handleMouseLeave&&this.container.removeEventListener("mouseleave",this.handleMouseLeave),null!==this.hoverThrottleId&&(clearTimeout(this.hoverThrottleId),this.hoverThrottleId=null)}setupContextMenuHandler(){this.handleContextMenu=t=>{var e,n,r,o;t.preventDefault();const a=this.findTrackForTarget(t.target);if(!a)return;const l=t.target.getBoundingClientRect(),c=t.clientX-l.left,h=t.clientY-l.top,d=null!==(n=null===(e=a.getContextMenuItems)||void 0===e?void 0:e.call(a,c,h))&&void 0!==n?n:[],f={setTrackHeight:(t,e)=>{t instanceof u&&t.setConfig({height:e})},removeTrack:t=>this.removeTrack(t),promptInput:async(t,e)=>{if(!this.inputDialog){customElements.get("loom-input-dialog")||await Promise.resolve().then(function(){return Lo});const t=document.createElement("loom-input-dialog");"static"===getComputedStyle(this.container).position&&(this.container.style.position="relative"),this.container.appendChild(t),this.inputDialog=t}return this.inputDialog.prompt(t,e)}},m=s(a,f),p=t=>{const e=t.action?{...t,action:()=>{t.action(),this.updateAxisContent(a)}}:{...t};return e.children&&(e.children=e.children.map(p)),e},g=null===(r=a.getNumericState)||void 0===r?void 0:r.call(a),v=g?i(g,f.promptInput):[],_=[];(d.length>0||v.length>0)&&(_.push(...d.map(p)),v.length>0&&(d.length>0&&_.push({label:"",type:"separator"}),_.push(...v.map(p))),_.push({label:"",type:"separator"})),_.push(...m.map(p));const b=a.canvas.clientWidth,w=b>0?(this._locus.end-this._locus.start)/b:0,x=this._locus.start+c*w,y=a.hitTest(c,h),k={track:a,genomicLocation:x,features:y.map(t=>t.feature),trackItems:d,commonItems:m,x:c,y:h};if(this.events.emit(jr.TrackContextMenu,k),this.contextMenuProvider){null===(o=this.popupProvider)||void 0===o||o.hide();const t=this.container.getBoundingClientRect(),e=a.canvas.getBoundingClientRect();this.contextMenuProvider.show(_,{x:e.left-t.left+c,y:e.top-t.top+h},this.container)}},this.container.addEventListener("contextmenu",this.handleContextMenu)}teardownContextMenuHandler(){this.handleContextMenu&&(this.container.removeEventListener("contextmenu",this.handleContextMenu),this.handleContextMenu=null),this.inputDialog&&(this.inputDialog.remove(),this.inputDialog=null)}syncDOMOrder(){for(const t of this.managedTracks){const e=this.trackRows.get(t.track);e&&this.container.appendChild(e.row)}}setupReorderHandlers(t,e){e.style.cursor="grab";const n=n=>{if(0!==n.button)return;n.preventDefault(),n.stopPropagation();const s=this.trackRows.get(t);s&&(this.reorderDragTrack=t,this.reorderDragRow=s.row,s.row.style.opacity="0.5",e.style.cursor="grabbing",document.addEventListener("pointermove",r),document.addEventListener("pointerup",o))},r=t=>{if(!this.reorderDragTrack)return;const e=this.managedTracks.findIndex(t=>t.track===this.reorderDragTrack);if(e<0)return;const n=t.clientY;if(e>0){const t=this.trackRows.get(this.managedTracks[e-1].track);if(t){const r=t.row.getBoundingClientRect();if(n<r.bottom-.25*r.height){const[t]=this.managedTracks.splice(e,1);return this.managedTracks.splice(e-1,0,t),void this.syncDOMOrder()}}}if(e<this.managedTracks.length-1){const t=this.trackRows.get(this.managedTracks[e+1].track);if(t){const r=t.row.getBoundingClientRect();if(n>r.top+.15*r.height){const[t]=this.managedTracks.splice(e,1);return this.managedTracks.splice(e+1,0,t),void this.syncDOMOrder()}}}},o=t=>{if(document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",o),this.reorderDragTrack&&this.reorderDragRow){this.reorderDragRow.style.opacity="";const t=this.trackRows.get(this.reorderDragTrack);t&&(t.axisDiv.style.cursor="grab"),this.events.emit(jr.TrackOrderChanged,{tracks:this.managedTracks.map(t=>t.track)})}this.reorderDragTrack=null,this.reorderDragRow=null};this.reorderHandlers.set(t,{down:n,docMove:r,docUp:o}),e.addEventListener("pointerdown",n)}teardownReorderHandlers(t){const e=this.reorderHandlers.get(t);if(!e)return;const n=this.trackRows.get(t);n&&n.axisDiv.removeEventListener("pointerdown",e.down),document.removeEventListener("pointermove",e.docMove),document.removeEventListener("pointerup",e.docUp),this.reorderHandlers.delete(t)}teardownDragHandlers(){this.handlePointerDown&&this.container.removeEventListener("pointerdown",this.handlePointerDown),this.handlePointerMove&&this.container.removeEventListener("pointermove",this.handlePointerMove),this.handlePointerUp&&(this.container.removeEventListener("pointerup",this.handlePointerUp),this.container.removeEventListener("pointercancel",this.handlePointerUp))}setupWheelHandler(){this.handleWheel=t=>{if(!t.ctrlKey)return;if(t.preventDefault(),K(this._locus))return;if(null!==this.wheelRafId)return;const e=1+.01*Math.max(-50,Math.min(50,t.deltaY)),n=this.container.getBoundingClientRect(),r=t.clientX-n.left-no,o=this.container.clientWidth-no;if(o<=0)return;const s=(this._locus.end-this._locus.start)/o,i=this._locus.start+r*s;this.wheelRafId=requestAnimationFrame(()=>{this.wheelRafId=null,this.zoomAroundCenter(e,i)})},this.container.addEventListener("wheel",this.handleWheel,{passive:!1})}teardownWheelHandler(){null!==this.wheelRafId&&(cancelAnimationFrame(this.wheelRafId),this.wheelRafId=null),this.handleWheel&&(this.container.removeEventListener("wheel",this.handleWheel),this.handleWheel=null)}ensureROIOverlayContainer(){if(!this.roiOverlayContainer){const t=document.createElement("div");t.style.cssText="\n position: absolute;\n top: 0;\n left: 50px;\n right: 0;\n bottom: 0;\n pointer-events: none;\n z-index: 10;\n overflow: hidden;\n ";"static"===getComputedStyle(this.container).position&&(this.container.style.position="relative"),this.container.appendChild(t),this.roiOverlayContainer=t}return this.roiOverlayContainer}renderROIOverlays(){var t,e;const n=this.getVisibleROIs();if(0===n.length&&0===this.roiElements.size)return;const r=this.ensureROIOverlayContainer(),o=this._viewportWidth;if(o<=0)return;const s=(this._locus.end-this._locus.start)/o,i=new Set;for(const o of n){i.add(o.id);const n=Math.round((o.start-this._locus.start)/s),a=Math.max(3,Math.round((o.end-o.start)/s));let l=this.roiElements.get(o.id);l||(l=this.createROIElement(o),r.appendChild(l),this.roiElements.set(o.id,l)),l.style.left=`${n}px`,l.style.width=`${a}px`;const c=null!==(t=o.color)&&void 0!==t?t:"rgba(68, 134, 247, 0.15)";l.style.backgroundColor=c;const h=c.replace(/[\d.]+\)$/,t=>`${Math.min(1,3*parseFloat(t))})`);l.style.borderLeftColor=h,l.style.borderRightColor=h;const d=l.firstElementChild;if(d){const t=c.replace(/[\d.]+\)$/,t=>`${Math.min(1,4*parseFloat(t))})`);d.style.backgroundColor=t}const u=l.querySelector(".loom-roi-label");u&&(u.textContent=null!==(e=o.name)&&void 0!==e?e:"",u.style.display=o.name&&a>20?"block":"none"),l._roiId=o.id}for(const[t,e]of this.roiElements)i.has(t)||(e.remove(),this.roiElements.delete(t))}createROIElement(t){var e;const n=document.createElement("div");n.className="loom-roi-region",n.style.cssText="\n position: absolute;\n top: 0;\n bottom: 0;\n border-left: 1px solid transparent;\n border-right: 1px solid transparent;\n box-sizing: border-box;\n pointer-events: auto;\n cursor: pointer;\n transition: opacity 0.15s ease;\n ";const r=document.createElement("div");r.className="loom-roi-header",r.style.cssText="\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 4px;\n border-radius: 2px 2px 0 0;\n ",n.appendChild(r);const o=document.createElement("div");return o.className="loom-roi-label",o.style.cssText="\n position: absolute;\n top: 5px;\n left: 3px;\n right: 3px;\n font: 9px sans-serif;\n color: rgba(0, 0, 0, 0.7);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n pointer-events: none;\n ",o.textContent=null!==(e=t.name)&&void 0!==e?e:"",n.appendChild(o),n.addEventListener("mouseenter",()=>{n.style.opacity="1.3"}),n.addEventListener("mouseleave",()=>{n.style.opacity=""}),n.addEventListener("click",t=>{t.stopPropagation();const e=n._roiId,r=this.getROIs().find(t=>t.id===e);if(r){const e=this.container.getBoundingClientRect(),n=this._viewportWidth>0?(this._locus.end-this._locus.start)/this._viewportWidth:0,o=t.clientX-e.left-no,s=this._locus.start+o*n;this.events.emit(jr.ROIClick,{roi:r,genomicLocation:s,x:t.clientX-e.left,y:t.clientY-e.top})}}),n.addEventListener("contextmenu",t=>{t.preventDefault(),t.stopPropagation();const e=n._roiId,r=this.getROIs().find(t=>t.id===e);r&&this.showROIContextMenu(r,t)}),n}showROIContextMenu(t,e){var n;if(!this.contextMenuProvider)return;const r=this.container.getBoundingClientRect(),o=this._viewportWidth>0?(this._locus.end-this._locus.start)/this._viewportWidth:0,s=e.clientX-r.left-no,i=this._locus.start+s*o;this.events.emit(jr.ROIContextMenu,{roi:t,genomicLocation:i,x:e.clientX-r.left,y:e.clientY-r.top});const l=a(t,{goToRegion:t=>this.setLocus(t),updateROI:(t,e)=>this.updateROI(t,e),removeROI:t=>this.removeROI(t),promptInput:async(t,e)=>{if(!this.inputDialog){customElements.get("loom-input-dialog")||await Promise.resolve().then(function(){return Lo});const t=document.createElement("loom-input-dialog");"static"===getComputedStyle(this.container).position&&(this.container.style.position="relative"),this.container.appendChild(t),this.inputDialog=t}return this.inputDialog.prompt(t,e)}});null===(n=this.popupProvider)||void 0===n||n.hide(),this.contextMenuProvider.show(l,{x:e.clientX-r.left,y:e.clientY-r.top},this.container)}clearROIOverlay(){for(const t of this.roiElements.values())t.remove();this.roiElements.clear(),this.roiOverlayContainer&&(this.roiOverlayContainer.remove(),this.roiOverlayContainer=null)}toSVG(t){var e,n,r,o,s;const i=null!==(e=null==t?void 0:t.width)&&void 0!==e?e:this.container.clientWidth,a=no,l=i-a;if(l<=0)throw new Error("Cannot export SVG: container too narrow for axis");let c=0;const h=[];for(const t of this.managedTracks){const e=t.track.height||50;h.push(e),c+=e}const d=new kt({width:i,height:c,viewbox:{x:0,y:0,width:i,height:c},backdropColor:null!==(n=null==t?void 0:t.backdropColor)&&void 0!==n?n:"white"});let u=0;for(let t=0;t<this.managedTracks.length;t++){const e=this.managedTracks[t].track,n=h[t],i=null===(r=e.getAxisInfo)||void 0===r?void 0:r.call(e);if(i){const r={...i,backgroundColor:null!==(o=i.backgroundColor)&&void 0!==o?o:this.theme.palette.background,labelColor:null!==(s=i.labelColor)&&void 0!==s?s:this.theme.palette.foreground},l=`track_${t}_${e.type}_axis`;d.saveWithTranslationAndClipRect(l,0,u,a,n,0),r.dataRange?H(d,r,a,n):r.label&&B(d,r,a,n),d.restore()}const c=`track_${t}_${e.type}`;d.saveWithTranslationAndClipRect(c,a,u,l,n,0),e.renderToContext&&e.renderToContext(d,l,n),d.restore(),u+=n}const f=this.getVisibleROIs();if(f.length>0){const t=(this._locus.end-this._locus.start)/l,e={pixelWidth:l,bpStart:this._locus.start,bpPerPixel:t,viewportWidth:l};d.saveWithTranslationAndClipRect("roi_overlays",a,0,l,c,0),ft(d,f,e,{totalHeight:c}),d.restore()}return d.setHeight(c),d.getSerializedSvg(!0)}async toPNG(){const t=this.toSVG(),e=new Blob([t],{type:"image/svg+xml"}),n=URL.createObjectURL(e);try{return await new Promise((t,e)=>{const r=new Image;r.onload=()=>{try{const e=this.canvasProvider.devicePixelRatio,n=document.createElement("canvas"),o=this.container.getBoundingClientRect(),s=o.width,i=o.height;n.width=s*e,n.height=i*e;const a=n.getContext("2d");a.scale(e,e),a.drawImage(r,0,0),t(n.toDataURL("image/png"))}catch(t){e(t)}},r.onerror=()=>e(new Error("Failed to load SVG for PNG conversion")),r.src=n})}finally{URL.revokeObjectURL(n)}}saveSVGtoFile(t){const e=this.toSVG(),n=new Blob([e],{type:"application/octet-stream"}),r=URL.createObjectURL(n);this.downloadURL(t||"igv.svg",r),URL.revokeObjectURL(r)}async savePNGtoFile(t){const e=await this.toPNG();this.downloadURL(t||"igv.png",e)}downloadURL(t,e){const n=document.createElement("a");n.download=t,n.href=e,document.body.appendChild(n),n.click(),document.body.removeChild(n)}}const so="\n:host {\n --loom-navbar-bg: #f3f3f3;\n --loom-navbar-height: 32px;\n --loom-navbar-padding: 0 8px;\n --loom-font: 12px Arial, sans-serif;\n --loom-font-small: 11px Arial, sans-serif;\n --loom-text-color: #333;\n --loom-text-muted: #737373;\n --loom-border: 1px solid #ccc;\n --loom-border-radius: 4px;\n --loom-button-bg: white;\n --loom-button-hover: #e8e8e8;\n --loom-button-border: 1px solid #b0b0b0;\n --loom-button-size: 24px;\n --loom-input-bg: white;\n --loom-input-border: 1px solid #b0b0b0;\n --loom-input-focus-border: 1px solid #4A90D9;\n --loom-input-width: 220px;\n --loom-input-height: 22px;\n --loom-accent: #4A90D9;\n --loom-icon-color: #555;\n --loom-icon-size: 14px;\n --loom-gap: 8px;\n}\n",io="\n:host {\n --loom-navbar-bg: #fafbfc;\n --loom-navbar-height: 40px;\n --loom-navbar-padding: 0 12px;\n --loom-font: 13px Inter, system-ui, -apple-system, sans-serif;\n --loom-font-small: 11px Inter, system-ui, -apple-system, sans-serif;\n --loom-text-color: #1a1a1a;\n --loom-text-muted: #6b7280;\n --loom-border: 1px solid rgba(0, 0, 0, 0.08);\n --loom-border-radius: 8px;\n --loom-button-bg: white;\n --loom-button-hover: #f0f4ff;\n --loom-button-border: 1px solid rgba(0, 0, 0, 0.1);\n --loom-button-size: 28px;\n --loom-input-bg: white;\n --loom-input-border: 1px solid rgba(0, 0, 0, 0.12);\n --loom-input-focus-border: 1px solid #4A90D9;\n --loom-input-width: 260px;\n --loom-input-height: 28px;\n --loom-accent: #4A90D9;\n --loom-icon-color: #6b7280;\n --loom-icon-size: 16px;\n --loom-gap: 10px;\n}\n";function ao(t){return"modern"===t?io:"dark"===t?"\n:host {\n --loom-shell-bg: #16162a;\n --loom-navbar-bg: #1a1a2e;\n --loom-navbar-height: 36px;\n --loom-navbar-padding: 0 10px;\n --loom-font: 12px Arial, sans-serif;\n --loom-font-small: 11px Arial, sans-serif;\n --loom-text-color: #e0e0e0;\n --loom-text-muted: #888;\n --loom-border: 1px solid #333;\n --loom-border-radius: 4px;\n --loom-button-bg: #2a2a3e;\n --loom-button-hover: #3a3a50;\n --loom-button-border: 1px solid #444;\n --loom-button-size: 24px;\n --loom-input-bg: #2a2a3e;\n --loom-input-border: 1px solid #444;\n --loom-input-focus-border: 1px solid #6a9fd9;\n --loom-input-width: 220px;\n --loom-input-height: 22px;\n --loom-accent: #6a9fd9;\n --loom-icon-color: #b0b0b0;\n --loom-icon-size: 14px;\n --loom-gap: 8px;\n}\n":so}const lo=document.createElement("template");lo.innerHTML="\n<style>\n:host {\n display: inline-flex;\n align-items: center;\n}\nselect {\n font: var(--loom-font, 12px Arial, sans-serif);\n color: var(--loom-text-color, #333);\n background: var(--loom-input-bg, white);\n border: var(--loom-input-border, 1px solid #b0b0b0);\n border-radius: var(--loom-border-radius, 4px);\n height: var(--loom-input-height, 22px);\n padding: 0 4px;\n box-sizing: border-box;\n outline: none;\n cursor: pointer;\n transition: border-color 0.15s;\n}\nselect:focus {\n border: var(--loom-input-focus-border, 1px solid #4A90D9);\n}\n</style>\n<select></select>\n";class co extends HTMLElement{constructor(){super(),this.unsubscribe=null,this._browser=null,this.attachShadow({mode:"open"}),this.shadowRoot.appendChild(lo.content.cloneNode(!0)),this.select=this.shadowRoot.querySelector("select"),this.select.addEventListener("change",()=>{if(!this._browser)return;const t=this.select.value;if("all"===t)this._browser.search("all");else{const e=this._browser.chromSizes;e&&null!=e[t]&&this._browser.setLocus({chr:t,start:0,end:e[t]})}})}set browser(t){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null),this._browser=t,t&&(this.populate(t),this.updateSelection(t.locus.chr),this.unsubscribe=t.on(jr.LocusChange,({locus:t})=>{this.updateSelection(t.chr)}))}get browser(){return this._browser}populate(t){this.select.innerHTML="";const e=t.chromSizes;if(!e)return;if(t.cumulativeOffsets){const t=document.createElement("option");t.value="all",t.textContent="All",this.select.appendChild(t)}const n=Ft(e);for(const t of n){const e=document.createElement("option");e.value=t,e.textContent=t,this.select.appendChild(e)}}updateSelection(t){K({chr:t,start:0,end:0})?this.select.value="all":this.select.value=t}disconnectedCallback(){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null)}}const ho=document.createElement("template");ho.innerHTML='\n<style>\n:host {\n display: inline-flex;\n align-items: center;\n}\n.container {\n display: flex;\n align-items: center;\n gap: 4px;\n}\ninput {\n font: var(--loom-font, 12px Arial, sans-serif);\n color: var(--loom-text-color, #333);\n background: var(--loom-input-bg, white);\n border: var(--loom-input-border, 1px solid #b0b0b0);\n border-radius: var(--loom-border-radius, 4px);\n width: var(--loom-input-width, 220px);\n height: var(--loom-input-height, 22px);\n padding: 0 8px;\n box-sizing: border-box;\n outline: none;\n transition: border-color 0.15s;\n}\ninput:focus {\n border: var(--loom-input-focus-border, 1px solid #4A90D9);\n}\ninput::placeholder {\n color: var(--loom-text-muted, #737373);\n}\n.search-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--loom-button-size, 24px);\n height: var(--loom-button-size, 24px);\n background: var(--loom-button-bg, white);\n border: var(--loom-button-border, 1px solid #b0b0b0);\n border-radius: var(--loom-border-radius, 4px);\n cursor: pointer;\n color: var(--loom-icon-color, #555);\n transition: background 0.15s;\n padding: 0;\n line-height: 1;\n}\n.search-btn:hover {\n background: var(--loom-button-hover, #e8e8e8);\n}\n.search-btn svg {\n width: var(--loom-icon-size, 14px);\n height: var(--loom-icon-size, 14px);\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n</style>\n<div class="container">\n <input type="text" placeholder="Locus Search" spellcheck="false" />\n <button class="search-btn" title="Go to locus">\n <svg viewBox="0 0 24 24"><circle cx="11" cy="11" r="7"/><line x1="16.5" y1="16.5" x2="21" y2="21"/></svg>\n </button>\n</div>\n';class uo extends HTMLElement{constructor(){super(),this.unsubscribe=null,this._browser=null,this.attachShadow({mode:"open"}),this.shadowRoot.appendChild(ho.content.cloneNode(!0)),this.input=this.shadowRoot.querySelector("input"),this.input.addEventListener("keydown",t=>{"Enter"===t.key&&this.doSearch()}),this.shadowRoot.querySelector(".search-btn").addEventListener("click",()=>{this.doSearch()})}set browser(t){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null),this._browser=t,t&&(this.updateDisplay(t.locus),this.unsubscribe=t.on(jr.LocusChange,({locus:t})=>{this.updateDisplay(t)}))}get browser(){return this._browser}updateDisplay(t){document.activeElement!==this.input&&this.shadowRoot.activeElement!==this.input&&(this.input.value=U(t))}doSearch(){if(!this._browser)return;const t=this.input.value.trim();t&&this._browser.search(t),this.input.blur()}disconnectedCallback(){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null)}}const fo=document.createElement("template");fo.innerHTML='\n<style>\n:host {\n display: inline-flex;\n align-items: center;\n}\n.container {\n display: flex;\n align-items: center;\n gap: 2px;\n}\nbutton {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--loom-button-size, 24px);\n height: var(--loom-button-size, 24px);\n background: var(--loom-button-bg, white);\n border: var(--loom-button-border, 1px solid #b0b0b0);\n border-radius: var(--loom-border-radius, 4px);\n cursor: pointer;\n color: var(--loom-icon-color, #555);\n transition: background 0.15s;\n padding: 0;\n line-height: 1;\n}\nbutton:hover {\n background: var(--loom-button-hover, #e8e8e8);\n}\nbutton:active {\n transform: scale(0.95);\n}\nbutton svg {\n width: var(--loom-icon-size, 14px);\n height: var(--loom-icon-size, 14px);\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n}\n</style>\n<div class="container">\n <button class="zoom-out" title="Zoom out">\n <svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"/><line x1="8" y1="12" x2="16" y2="12"/></svg>\n </button>\n <button class="zoom-in" title="Zoom in">\n <svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"/><line x1="12" y1="8" x2="12" y2="16"/><line x1="8" y1="12" x2="16" y2="12"/></svg>\n </button>\n</div>\n';class mo extends HTMLElement{constructor(){super(),this._browser=null,this.attachShadow({mode:"open"}),this.shadowRoot.appendChild(fo.content.cloneNode(!0)),this.shadowRoot.querySelector(".zoom-out").addEventListener("click",()=>{var t;null===(t=this._browser)||void 0===t||t.zoomOut()}),this.shadowRoot.querySelector(".zoom-in").addEventListener("click",()=>{var t;null===(t=this._browser)||void 0===t||t.zoomIn()})}set browser(t){this._browser=t}get browser(){return this._browser}}const po=document.createElement("template");po.innerHTML='\n<style>\n:host {\n display: inline-flex;\n align-items: center;\n}\n.label {\n font: var(--loom-font-small, 11px Arial, sans-serif);\n color: var(--loom-text-muted, #737373);\n white-space: nowrap;\n user-select: none;\n}\n</style>\n<span class="label"></span>\n';class go extends HTMLElement{constructor(){super(),this.unsubscribe=null,this._browser=null,this.attachShadow({mode:"open"}),this.shadowRoot.appendChild(po.content.cloneNode(!0)),this.label=this.shadowRoot.querySelector(".label")}set browser(t){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null),this._browser=t,t&&(this.update(t.locus),this.unsubscribe=t.on(jr.LocusChange,({locus:t})=>{this.update(t)}))}get browser(){return this._browser}update(t){this.label.textContent=z(t.end-t.start)}disconnectedCallback(){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null)}}const vo=document.createElement("template");vo.innerHTML='\n<style>\n:host {\n display: inline-flex;\n align-items: center;\n}\n.container {\n display: flex;\n align-items: center;\n gap: 2px;\n}\nbutton {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--loom-button-size, 24px);\n height: var(--loom-button-size, 24px);\n background: var(--loom-button-bg, white);\n border: var(--loom-button-border, 1px solid #b0b0b0);\n border-radius: var(--loom-border-radius, 4px);\n cursor: pointer;\n color: var(--loom-icon-color, #555);\n transition: background 0.15s;\n padding: 0;\n line-height: 1;\n}\nbutton:hover {\n background: var(--loom-button-hover, #e8e8e8);\n}\nbutton:active {\n transform: scale(0.95);\n}\nbutton svg {\n width: var(--loom-icon-size, 14px);\n height: var(--loom-icon-size, 14px);\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n</style>\n<div class="container">\n <button class="save-svg" title="Save as SVG">\n <svg viewBox="0 0 24 24">\n <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/>\n <polyline points="7 10 12 15 17 10"/>\n <line x1="12" y1="15" x2="12" y2="3"/>\n </svg>\n </button>\n <button class="save-png" title="Save as PNG">\n <svg viewBox="0 0 24 24">\n <rect x="3" y="3" width="18" height="18" rx="2" ry="2"/>\n <circle cx="8.5" cy="8.5" r="1.5"/>\n <polyline points="21 15 16 10 5 21"/>\n </svg>\n </button>\n</div>\n';class _o extends HTMLElement{constructor(){super(),this._browser=null,this.attachShadow({mode:"open"}),this.shadowRoot.appendChild(vo.content.cloneNode(!0)),this.shadowRoot.querySelector(".save-svg").addEventListener("click",()=>{var t;null===(t=this._browser)||void 0===t||t.saveSVGtoFile()}),this.shadowRoot.querySelector(".save-png").addEventListener("click",()=>{var t;null===(t=this._browser)||void 0===t||t.savePNGtoFile()})}set browser(t){this._browser=t}get browser(){return this._browser}}customElements.get("loom-chromosome-select")||customElements.define("loom-chromosome-select",co),customElements.get("loom-locus-input")||customElements.define("loom-locus-input",uo),customElements.get("loom-zoom-controls")||customElements.define("loom-zoom-controls",mo),customElements.get("loom-window-size")||customElements.define("loom-window-size",go),customElements.get("loom-export-controls")||customElements.define("loom-export-controls",_o);const bo=document.createElement("template");bo.innerHTML='\n<style>\n:host {\n display: block;\n}\n.navbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: var(--loom-navbar-height, 32px);\n padding: var(--loom-navbar-padding, 0 8px);\n background: var(--loom-navbar-bg, #f3f3f3);\n border-bottom: var(--loom-border, 1px solid #ccc);\n box-sizing: border-box;\n gap: var(--loom-gap, 8px);\n}\n.left {\n display: flex;\n align-items: center;\n gap: var(--loom-gap, 8px);\n flex: 1;\n min-width: 0;\n}\n.right {\n display: flex;\n align-items: center;\n gap: var(--loom-gap, 8px);\n flex-shrink: 0;\n}\n</style>\n<div class="navbar">\n <div class="left">\n <loom-chromosome-select></loom-chromosome-select>\n <loom-locus-input></loom-locus-input>\n <loom-window-size></loom-window-size>\n </div>\n <div class="right">\n <loom-export-controls></loom-export-controls>\n <loom-zoom-controls></loom-zoom-controls>\n </div>\n</div>\n';class wo extends HTMLElement{constructor(){super(),this._browser=null,this.attachShadow({mode:"open"}),this.shadowRoot.appendChild(bo.content.cloneNode(!0)),this.chromSelect=this.shadowRoot.querySelector("loom-chromosome-select"),this.locusInput=this.shadowRoot.querySelector("loom-locus-input"),this.zoomControls=this.shadowRoot.querySelector("loom-zoom-controls"),this.windowSize=this.shadowRoot.querySelector("loom-window-size"),this.exportControls=this.shadowRoot.querySelector("loom-export-controls")}set browser(t){this._browser=t,this.chromSelect.browser=t,this.locusInput.browser=t,this.zoomControls.browser=t,this.windowSize.browser=t,this.exportControls.browser=t}get browser(){return this._browser}}customElements.get("loom-navbar")||customElements.define("loom-navbar",wo);const xo=document.createElement("template");xo.innerHTML='\n<style>\n:host {\n display: block;\n}\n.shell {\n border: var(--loom-border, 1px solid #ccc);\n border-radius: var(--loom-border-radius, 4px);\n overflow: hidden;\n background: var(--loom-shell-bg, white);\n}\n.track-container {\n position: relative;\n}\n</style>\n<div class="shell">\n <loom-navbar></loom-navbar>\n <div class="track-container"></div>\n</div>\n';class yo extends HTMLElement{static get observedAttributes(){return["theme"]}constructor(){super(),this._browser=null,this.attachShadow({mode:"open"}),this.themeStyle=document.createElement("style"),this.shadowRoot.appendChild(this.themeStyle),this.shadowRoot.appendChild(xo.content.cloneNode(!0)),this.navbar=this.shadowRoot.querySelector("loom-navbar"),this.trackContainer=this.shadowRoot.querySelector(".track-container"),this.applyTheme(this.getAttribute("theme")||"classic")}attributeChangedCallback(t,e,n){"theme"===t&&this.applyTheme(n||"classic")}applyTheme(t){this.themeStyle.textContent=ao(t)}connectedCallback(){customElements.upgrade(this.shadowRoot),this._browser&&(this.navbar.browser=this._browser)}initialize(t){return this._browser&&this._browser.dispose(),this._browser=new oo(this.trackContainer,t),this.isConnected&&(this.navbar.browser=this._browser),this._browser}get browser(){return this._browser}addTrack(t){var e;null===(e=this._browser)||void 0===e||e.addTrack(t)}removeTrack(t){var e;null===(e=this._browser)||void 0===e||e.removeTrack(t)}setLocus(t){var e;null===(e=this._browser)||void 0===e||e.setLocus(t)}on(t,e){var n;return null===(n=this._browser)||void 0===n?void 0:n.on(t,e)}disconnectedCallback(){this._browser&&(this._browser.dispose(),this._browser=null)}}function ko(t,e){customElements.get("loom-browser")||customElements.define("loom-browser",yo);const n=document.createElement("loom-browser");return e.shellTheme&&n.setAttribute("theme",e.shellTheme),t.appendChild(n),n.initialize(e),n}let Co=null;class Io extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"}),this.shadowRoot.appendChild((Co||(Co=document.createElement("template"),Co.innerHTML='\n<style>\n:host {\n position: absolute;\n z-index: 100000;\n pointer-events: auto;\n display: none;\n user-select: text;\n -webkit-user-select: text;\n cursor: auto;\n}\n.popup {\n background: var(--loom-popup-bg, var(--loom-input-bg, white));\n border: var(--loom-popup-border, var(--loom-border, 1px solid #ccc));\n border-radius: var(--loom-popup-radius, var(--loom-border-radius, 6px));\n box-shadow: var(--loom-popup-shadow, 0 2px 8px rgba(0,0,0,0.15));\n padding: 8px 12px;\n font: var(--loom-popup-font, var(--loom-font-small, 12px/1.4 sans-serif));\n color: var(--loom-popup-color, var(--loom-text-color, #333));\n max-width: 320px;\n min-width: 120px;\n}\ntable {\n border-collapse: collapse;\n width: 100%;\n}\ntd {\n padding: 2px 0;\n vertical-align: top;\n}\ntd.name {\n font-weight: 600;\n padding-right: 8px;\n white-space: nowrap;\n color: var(--loom-popup-name-color, var(--loom-text-muted, #555));\n}\ntd.value {\n word-break: break-word;\n}\ntr.border-top td {\n border-top: 1px solid var(--loom-popup-divider, var(--loom-button-hover, #e0e0e0));\n padding-top: 4px;\n}\n.close {\n position: absolute;\n top: 4px;\n right: 6px;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 14px;\n color: var(--loom-popup-close-color, var(--loom-text-muted, #999));\n line-height: 1;\n padding: 0 2px;\n}\n.close:hover {\n color: var(--loom-popup-color, var(--loom-text-color, #333));\n}\n</style>\n<div class="popup">\n <button class="close" title="Close">×</button>\n <table><tbody></tbody></table>\n</div>\n'),Co).content.cloneNode(!0)),this.shadowRoot.querySelector(".close").addEventListener("click",()=>{this.hide()});const t=this.shadowRoot.querySelector(".popup");t.addEventListener("pointerdown",t=>{t.stopPropagation()}),t.addEventListener("pointerup",t=>{t.stopPropagation()}),t.addEventListener("mousedown",t=>{t.stopPropagation()}),t.addEventListener("mouseup",t=>{t.stopPropagation()})}setData(t){const e=this.shadowRoot.querySelector("tbody");e.innerHTML="";for(const n of t){const t=document.createElement("tr");n.borderTop&&(t.className="border-top");const r=document.createElement("td");r.className="name",r.textContent=n.name;const o=document.createElement("td");o.className="value",o.textContent=String(n.value),t.appendChild(r),t.appendChild(o),e.appendChild(t)}}showAt(t,e){this.style.display="block";this.style.left=`${t+12}px`,this.style.top=`${e+12}px`,requestAnimationFrame(()=>{const n=this.offsetParent;if(!n)return;const r=n.getBoundingClientRect(),o=this.getBoundingClientRect();let s=t+12,i=e+12;s+o.width>r.width&&(s=t-o.width-12),i+o.height>r.height&&(i=e-o.height-12),s<0&&(s=0),i<0&&(i=0),this.style.left=`${s}px`,this.style.top=`${i}px`})}hide(){this.style.display="none"}}"undefined"==typeof customElements||customElements.get("loom-popup")||customElements.define("loom-popup",Io);class So{constructor(){this.element=null}show(t,e,n){if(!this.element){this.element=document.createElement("loom-popup");"static"===getComputedStyle(n).position&&(n.style.position="relative"),n.appendChild(this.element)}this.element.setData(t),this.element.showAt(e.x,e.y)}hide(){this.element&&this.element.hide()}dispose(){this.element&&(this.element.remove(),this.element=null)}}var To=Object.freeze({__proto__:null,LoomPopup:Io,DefaultPopupProvider:So});class Mo extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"})}connectedCallback(){const t=document.createElement("template");t.innerHTML='\n<style>\n:host {\n position: absolute;\n z-index: 100001;\n pointer-events: auto;\n display: none;\n user-select: text;\n -webkit-user-select: text;\n cursor: auto;\n}\n.menu {\n background: var(--loom-menu-bg, var(--loom-input-bg, white));\n border: var(--loom-menu-border, var(--loom-border, 1px solid #ccc));\n border-radius: var(--loom-menu-radius, var(--loom-border-radius, 4px));\n box-shadow: var(--loom-menu-shadow, 0 2px 8px rgba(0,0,0,0.18));\n padding: 4px 0;\n font: var(--loom-menu-font, var(--loom-font-small, 12px/1.4 sans-serif));\n color: var(--loom-menu-color, var(--loom-text-color, #333));\n min-width: 160px;\n}\n.item {\n padding: 6px 12px;\n cursor: pointer;\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 6px;\n position: relative;\n}\n.item:hover {\n background: var(--loom-menu-hover, var(--loom-button-hover, #f0f0f0));\n}\n.item.disabled {\n opacity: 0.45;\n pointer-events: none;\n}\n.separator {\n height: 1px;\n background: var(--loom-menu-divider, var(--loom-button-hover, #e0e0e0));\n margin: 4px 0;\n}\n.check {\n width: 14px;\n text-align: center;\n flex-shrink: 0;\n font-size: 11px;\n}\n.label {\n flex: 1;\n}\n.arrow {\n font-size: 9px;\n color: #999;\n margin-left: 8px;\n}\n.submenu {\n position: absolute;\n left: 100%;\n top: -4px;\n display: none;\n}\n.item:hover > .submenu {\n display: block;\n}\n</style>\n<div class="menu"></div>\n',this.shadowRoot.appendChild(t.content.cloneNode(!0)),this.menuDiv=this.shadowRoot.querySelector(".menu")}setItems(t){this.menuDiv&&(this.menuDiv.innerHTML="",this.buildItems(t,this.menuDiv))}buildItems(t,e){for(const n of t){if("separator"===n.type){const t=document.createElement("div");t.className="separator",e.appendChild(t);continue}const t=document.createElement("div");t.className="item"+(n.disabled?" disabled":"");const r=document.createElement("span");r.className="check",r.textContent="checkbox"===n.type&&n.checked?"✓":"",t.appendChild(r);const o=document.createElement("span");if(o.className="label",o.textContent=n.label,t.appendChild(o),n.children&&n.children.length>0){const e=document.createElement("span");e.className="arrow",e.textContent="▶",t.appendChild(e);const r=document.createElement("div");r.className="submenu menu",this.buildItems(n.children,r),t.appendChild(r)}if(n.action&&!n.disabled){const e=n.action;t.addEventListener("pointerdown",t=>{t.stopPropagation()}),t.addEventListener("pointerup",t=>{t.stopPropagation()}),t.addEventListener("click",t=>{t.stopPropagation(),e(),this.hide()}),t.addEventListener("mousedown",t=>{t.stopPropagation()}),t.addEventListener("mouseup",t=>{t.stopPropagation()})}e.appendChild(t)}}showAt(t,e){this.style.display="block",this.style.left=`${t}px`,this.style.top=`${e}px`,requestAnimationFrame(()=>{const n=this.offsetParent;if(!n)return;const r=n.getBoundingClientRect(),o=this.getBoundingClientRect();let s=t,i=e;s+o.width>r.width&&(s=Math.max(0,t-o.width)),i+o.height>r.height&&(i=Math.max(0,e-o.height)),this.style.left=`${s}px`,this.style.top=`${i}px`})}hide(){this.style.display="none"}}"undefined"==typeof customElements||customElements.get("loom-context-menu")||customElements.define("loom-context-menu",Mo);class Eo{constructor(){this.element=null}show(t,e,n){if(!this.element){this.element=document.createElement("loom-context-menu");"static"===getComputedStyle(n).position&&(n.style.position="relative"),n.appendChild(this.element)}this.element.setItems(t),this.element.showAt(e.x,e.y)}hide(){this.element&&this.element.hide()}dispose(){this.element&&(this.element.remove(),this.element=null)}}var Po=Object.freeze({__proto__:null,LoomContextMenu:Mo,DefaultContextMenuProvider:Eo});class Ro extends HTMLElement{constructor(){super(),this.resolve=null,this.attachShadow({mode:"open"})}connectedCallback(){const t=document.createElement("template");t.innerHTML='\n<style>\n:host {\n position: absolute;\n z-index: 100002;\n top: 0; left: 0; right: 0; bottom: 0;\n display: none;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.15);\n}\n.dialog {\n background: var(--loom-dialog-bg, var(--loom-input-bg, white));\n border: var(--loom-dialog-border, var(--loom-border, 1px solid #ccc));\n border-radius: var(--loom-dialog-radius, var(--loom-border-radius, 6px));\n box-shadow: var(--loom-dialog-shadow, 0 4px 16px rgba(0,0,0,0.2));\n padding: 16px 20px;\n font: var(--loom-dialog-font, var(--loom-font, 13px/1.4 sans-serif));\n color: var(--loom-dialog-color, var(--loom-text-color, #333));\n min-width: 220px;\n}\n.dialog label {\n display: block;\n margin-bottom: 8px;\n font-weight: 600;\n font-size: 12px;\n}\n.dialog input {\n width: 100%;\n box-sizing: border-box;\n padding: 6px 8px;\n background: var(--loom-input-bg, white);\n border: var(--loom-input-border, 1px solid #ccc);\n border-radius: 4px;\n font: inherit;\n color: inherit;\n margin-bottom: 12px;\n}\n.dialog input:focus {\n outline: none;\n border-color: var(--loom-accent, #4A90D9);\n box-shadow: 0 0 0 2px rgba(74, 144, 217, 0.2);\n}\n.buttons {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n}\n.buttons button {\n padding: 5px 14px;\n border: var(--loom-button-border, 1px solid #ccc);\n border-radius: 4px;\n font: inherit;\n font-size: 12px;\n cursor: pointer;\n background: var(--loom-dialog-btn-bg, var(--loom-button-bg, #f5f5f5));\n color: var(--loom-dialog-btn-color, var(--loom-text-color, #333));\n}\n.buttons button:hover {\n background: var(--loom-button-hover, #e8e8e8);\n}\n.buttons button.primary {\n background: var(--loom-accent, #4A90D9);\n color: white;\n border-color: transparent;\n}\n.buttons button.primary:hover {\n filter: brightness(0.9);\n}\n</style>\n<div class="dialog">\n <label></label>\n <input type="text" />\n <div class="buttons">\n <button class="cancel">Cancel</button>\n <button class="primary ok">OK</button>\n </div>\n</div>\n',this.shadowRoot.appendChild(t.content.cloneNode(!0)),this.labelEl=this.shadowRoot.querySelector("label"),this.inputEl=this.shadowRoot.querySelector("input"),this.okBtn=this.shadowRoot.querySelector(".ok"),this.cancelBtn=this.shadowRoot.querySelector(".cancel"),this.okBtn.addEventListener("click",()=>this.confirm()),this.cancelBtn.addEventListener("click",()=>this.cancel()),this.inputEl.addEventListener("keydown",t=>{"Enter"===t.key&&this.confirm(),"Escape"===t.key&&this.cancel()})}prompt(t,e){return this.labelEl.textContent=t,this.inputEl.value=String(e),this.style.display="flex",requestAnimationFrame(()=>{this.inputEl.focus(),this.inputEl.select()}),new Promise(t=>{this.resolve=t})}confirm(){const t=this.inputEl.value;this.style.display="none",this.resolve&&(this.resolve(t),this.resolve=null)}cancel(){this.style.display="none",this.resolve&&(this.resolve(null),this.resolve=null)}}"undefined"==typeof customElements||customElements.get("loom-input-dialog")||customElements.define("loom-input-dialog",Ro);var Lo=Object.freeze({__proto__:null,LoomInputDialog:Ro});"undefined"!=typeof customElements&&(customElements.get("loom-chromosome-select")||customElements.define("loom-chromosome-select",co),customElements.get("loom-locus-input")||customElements.define("loom-locus-input",uo),customElements.get("loom-zoom-controls")||customElements.define("loom-zoom-controls",mo),customElements.get("loom-window-size")||customElements.define("loom-window-size",go),customElements.get("loom-export-controls")||customElements.define("loom-export-controls",_o),customElements.get("loom-navbar")||customElements.define("loom-navbar",wo),customElements.get("loom-browser")||customElements.define("loom-browser",yo));const Ao={palette:{primary:"#4A90D9",secondary:"#D94A7A",accent:"#4A90D9",background:"#ffffff",foreground:"#333333",muted:"#B0B0B0"},fontFamily:"Inter, system-ui, sans-serif",annotation:{utrColor:"#A8C8E8",altUtrColor:"#E8A8BE",borderColor:"rgba(0, 0, 0, 0.15)",borderWidth:.5,borderRadius:3,arrowInExonColor:"rgba(255, 255, 255, 0.7)",labelFont:"italic 10px Inter, system-ui, sans-serif",featureHeight:12,expandedRowHeight:28,margin:8},wig:{overflowColor:"#FF6B6B"},sequence:{frameColor1:"hsl(220, 15%, 90%)",frameColor2:"hsl(220, 15%, 95%)",startCodonColor:"hsl(160, 55%, 42%)",stopCodonColor:"hsl(0, 60%, 55%)",useFillText:!0,frameLabelColor:"#444444",codonLabelColor:"#ffffff",frameFont:"600 10px Inter, system-ui, sans-serif",codonBorderRadius:3}},Oo={palette:{primary:"#6CB4EE",secondary:"#EE6C9E",accent:"#6a9fd9",background:"#1a1a2e",foreground:"#e0e0e0",muted:"#555555"},nucleotideColors:{A:"#4ade80",C:"#60a5fa",G:"#facc15",T:"#f87171",N:"#666666"},annotation:{utrColor:"#3D6B8E",altUtrColor:"#8E3D5E",borderColor:"rgba(255, 255, 255, 0.12)",borderWidth:.5,borderRadius:3,arrowInExonColor:"rgba(0, 0, 0, 0.4)",labelBackground:"#1a1a2e",labelFont:"italic 10px sans-serif",featureHeight:12,expandedRowHeight:28,margin:8},wig:{overflowColor:"#FF6B6B"},sequence:{background:"#1a1a2e",frameColor1:"hsl(230, 15%, 28%)",frameColor2:"hsl(230, 15%, 22%)",startCodonColor:"hsl(160, 50%, 35%)",stopCodonColor:"hsl(0, 55%, 45%)",useFillText:!0,frameLabelColor:"#c8c8c8",codonLabelColor:"#ffffff",frameFont:"600 10px sans-serif",codonBorderRadius:3}},Fo={color:"#4A90D9",altColor:"#D94A7A",utrColor:"#A8C8E8",altUtrColor:"#E8A8BE",borderColor:"rgba(0, 0, 0, 0.15)",borderWidth:.5,borderRadius:3,intronColor:"#B0B0B0",intronLineWidth:1,arrowColor:"#999999",arrowInExonColor:"rgba(255, 255, 255, 0.7)",labelColor:"#333333",labelFont:"italic 10px sans-serif",featureHeight:12,expandedRowHeight:28,margin:8},No={color:"#6CB4EE",altColor:"#EE6C9E",utrColor:"#3D6B8E",altUtrColor:"#8E3D5E",borderColor:"rgba(255, 255, 255, 0.12)",borderWidth:.5,borderRadius:3,intronColor:"#555555",intronLineWidth:1,arrowColor:"#666666",arrowInExonColor:"rgba(0, 0, 0, 0.4)",labelColor:"#C8C8C8",labelBackground:"#1a1a2e",labelFont:"italic 10px sans-serif",featureHeight:12,expandedRowHeight:28,margin:8},Ko={color:"#4A90D9",altColor:"#D94A7A",baselineColor:"#D0D0D0",overflowColor:"#FF6B6B",background:"#ffffff"},Do={color:"#5EC4B6",altColor:"#E87461",baselineColor:"#444444",overflowColor:"#FF6B6B",background:"#1a1a2e",labelColor:"#e0e0e0",nucleotideColors:{A:"#4ade80",C:"#60a5fa",G:"#facc15",T:"#f87171",N:"#666666"}},Uo={color:"#E8615D",altColor:"#5D8DE8",baselineColor:"#D0D0D0",overflowColor:"#9B59B6",background:"#ffffff"},zo={graphType:"line",color:"#4A90D9",altColor:"#D94A7A",baselineColor:"#D0D0D0",background:"#ffffff"},Go={frameColor1:"hsl(220, 15%, 90%)",frameColor2:"hsl(220, 15%, 95%)",startCodonColor:"hsl(160, 55%, 42%)",stopCodonColor:"hsl(0, 60%, 55%)",useFillText:!0,frameLabelColor:"#444444",codonLabelColor:"#ffffff",frameFont:"600 10px Inter, system-ui, sans-serif",codonBorderRadius:3},Wo={background:"#1a1a2e",nucleotideColors:{A:"#4ade80",C:"#60a5fa",G:"#facc15",T:"#f87171",N:"#666666"},frameColor1:"hsl(230, 15%, 28%)",frameColor2:"hsl(230, 15%, 22%)",startCodonColor:"hsl(160, 50%, 35%)",stopCodonColor:"hsl(0, 55%, 45%)",useFillText:!0,frameLabelColor:"#c8c8c8",codonLabelColor:"#ffffff",frameFont:"600 10px sans-serif",codonBorderRadius:3};function qo(t,e){var n,r,o,s,i,a;const l=null!==(r=null!==(n=t.format)&&void 0!==n?n:lr(t.url))&&void 0!==r?r:"bed",c=null!==(o=fr(l))&&void 0!==o?o:"annotation";let h;if("gtx"===l){const n=null!==(s=t.windowFunction)&&void 0!==s?s:"mean";h=new We(t.url,null!==(i=t.experimentId)&&void 0!==i?i:"",n,e)}else if(hr(l)){const n=null!==(a=t.windowFunction)&&void 0!==a?a:"mean";h=new fe(t.url,n,e)}else{const n={url:t.url,format:l,indexURL:t.indexURL,indexed:t.indexed,assembleGFF:t.assembleGFF,workerProvider:e};h=new mr(n)}return{dataSource:h,trackType:c,format:l}}export{L as AnnotationTrackCanvas,u as BaseTrackCanvas,fe as BigWigDataSource,ce as BigWigReader,ie as BinaryParser,jr as BrowserEvent,ge as BufferedRangeReader,kt as C2S,Rt as ChromAliasDefaults,Jr as CommandDispatcher,Yr as CommandError,r as DOMCanvasProvider,Eo as DefaultContextMenuProvider,So as DefaultPopupProvider,Ct as EventEmitter,cn as FeatureCache,Ze as GeneDataSource,oo as GenomeBrowser,We as GtxDataSource,Le as GtxReader,Vr as HeadlessGenomeBrowser,xr as InteractionTrackCanvas,ln as IntervalTree,yo as LoomBrowserShell,co as LoomChromosomeSelect,Mo as LoomContextMenu,_o as LoomExportControls,Ro as LoomInputDialog,uo as LoomLocusInput,wo as LoomNavbar,Io as LoomPopup,go as LoomWindowSize,mo as LoomZoomControls,l as MainThreadProvider,d as NodeWorkerProvider,to as READY_STATE_OPEN,ut as ROISet,lt as ROI_DEFAULT_COLOR,ct as ROI_USER_DEFINED_COLOR,eo as RemoteConnection,W as RulerTrackCanvas,Rr as SESSION_VERSION,pr as SequenceDataSource,se as SequenceTrackCanvas,Ur as StateProjection,dn as TabixReader,mr as TextFeatureSource,h as WebWorkerProvider,it as WigTrackCanvas,Tt as addCaseAliases,Un as assembleGFFTranscripts,St as bufferLocus,It as cacheCoversViewport,G as clampLocus,so as classicThemeCSS,ue as clearBigWigCache,ze as clearGtxCache,s as commonContextMenuItems,Jt as complementBase,Qt as complementSequence,Kt as computeCumulativeOffsets,ot as computeWigDataRange,Wt as createCachedSequence,Er as createDataSource,qo as createFeatureSource,Xt as createGenome,jt as createGenomeSync,ko as createShell,Pr as createTrackFromConfig,Lr as createTrackFromSession,Oo as darkRenderTheme,Wo as darkSequenceTheme,No as darkTheme,Do as darkWigTheme,Dr as dataSourceCacheKey,un as decodeBed,gn as decodeBedGraph,Xn as decodeBedpe,fn as decodeBroadPeak,Fn as decodeGFF3,Rn as decodeGFFAttribute,Nn as decodeGTF,pn as decodeGappedPeak,Be as decodeGenePred,je as decodeGenePredExt,Zn as decodeInteract,mn as decodeNarrowPeak,Xe as decodeRefGeneJson,vn as decodeRefflat,f as defaultAnnotationRenderConfig,o as defaultCanvasProvider,g as defaultInteractionRenderConfig,j as defaultNucleotideColors,I as defaultRenderTheme,v as defaultRulerRenderConfig,m as defaultSequenceRenderConfig,p as defaultWigRenderConfig,Y as drawLetterGlyph,he as fetchBigWigFeatures,de as fetchBigWigWGFeatures,Ye as fetchGeneFeatures,Ke as fetchGtxFeatures,Ue as fetchGtxMultiFeatures,De as fetchGtxWGFeatures,me as fetchRange,qt as fetchSequence,qe as findUTRs,Vn as fixBedPE,z as formatBpLength,U as formatLocus,Or as fromIgvSession,dt as generateROIId,Dt as genomeToChromCoord,Lt as getChromLength,Jn as getDecoder,ao as getThemeCSS,Tr as getTrackCreator,zt as hg38ChromSizes,Yt as hg38Genome,lr as inferFormatFromPath,ur as inferIndexURL,fr as inferTrackType,hr as isBinaryFormat,Mn as isCoding,Sn as isExon,Yn as isHiccups,Tn as isIntron,dr as isLikelyIndexed,Ot as isMainChromosome,Cn as isTranscript,In as isTranscriptPart,En as isUTR,K as isWholeGenomeView,ar as knownFileExtensions,Mr as knownTrackTypes,zo as lineWigTheme,Ft as mainChromosomeNames,c as mainThreadProvider,Hr as matchesSelector,Ao as modernRenderTheme,Go as modernSequenceTheme,Fo as modernTheme,io as modernThemeCSS,Ko as modernWigTheme,i as numericDataMenuItems,_ as packFeatures,Ut as parseChromSizes,$e as parseColorString,er as parseFeatures,Ln as parseGFFAttributes,tr as parseHeader,D as parseLocus,He as parseStrand,wr as positionString,q as prettyPrintNumber,Ir as registerTrackCreator,Sr as registerTypeAlias,C as renderAnnotationTrack,Z as renderDynSeqFeature,gr as renderInteractionTrack,B as renderLabelAxis,H as renderQuantitativeAxis,ft as renderROIOverlays,F as renderRulerTrack,oe as renderSequenceTrack,N as renderWholeGenomeRuler,et as renderWigTrack,T as resolveAnnotationConfig,R as resolveInteractionConfig,E as resolveRulerConfig,P as resolveSequenceConfig,S as resolveTheme,M as resolveWigConfig,te as reverseComplementSequence,a as roiContextMenuItems,Br as selectTracks,rt as summarizeWigData,Nr as toIgvSession,Zr as toTrackSelector,ne as translateSequence,ee as translationDict,Uo as warmWigTheme};
|
|
2
|
+
//# sourceMappingURL=loom.esm.min.js.map
|