jbrowse-plugin-graphgenomeviewer 4.0.1 → 4.0.2
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.
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{a as ro}from"./chunks/chunk-KWAXLUPQ.js";import{a as D}from"./chunks/chunk-FCWXYIFC.js";import{a as lt}from"./chunks/chunk-D7XFR2IV.js";import{a as oe}from"./chunks/chunk-J4OLMLS5.js";import{A as ge,B as vt,C as Bt,G as Dt,H as Ot,I as $t,J as le,K as _t,L as jt,M as Wt,N as he,O as K,P as zt,R as Yt,a as gt,c as so,d as xt,e as U,g as St,h as se,i as de,o as Lt,q as Mt,r as Gt,s as Nt,t as ve,v as pe,w as me,x as Be,y as Pt,z as Ct}from"./chunks/chunk-A4ZWFDQY.js";import{c as kt}from"./chunks/chunk-ZNGDWZ6Z.js";import{D as Fe,E as Ve,F as co,b as N,d as ht,f as bt,g as ft,i as ie,j as Ce,l as yt,m as wt,n as Rt,o as ce,p as ue,q as Tt,r as At,s as It,u as Ft,v as Vt,w as Et,x as Ht}from"./chunks/chunk-OP7IRVG6.js";import"./chunks/chunk-F4C3BEPV.js";import{a as X,b as oo,c as ao,d as io,e as ae}from"./chunks/chunk-XEJ47DLD.js";import{a as v,b as y}from"./chunks/chunk-FY3BTKY4.js";var Ut=v((ka,Xt)=>{Xt.exports=JBrowseExports["@jbrowse/core/Plugin"]});var fe=v((La,qt)=>{qt.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/AdapterType"]});var B=v((Ra,Jt)=>{Jt.exports=JBrowseExports["@jbrowse/core/configuration"]});var rn=v((Ta,nn)=>{nn.exports=JBrowseExports["@jbrowse/core/data_adapters/dataAdapterCache"]});var q=v((Aa,on)=>{on.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes"]});var gn=v((Fa,mn)=>{mn.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/ViewType"]});var hn=v((Va,ln)=>{ln.exports=JBrowseExports["@jbrowse/core/util/withLaunchInput"]});var fn=v((Ea,bn)=>{bn.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/models"]});var wn=v((Ha,yn)=>{yn.exports=JBrowseExports["@jbrowse/render-core/RenderLifecycleMixin"]});var $e=v((Da,kn)=>{kn.exports=JBrowseExports.mobx});var Mr=v((ls,Rr)=>{Rr.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/DisplayType"]});var Nr=v((hs,Gr)=>{Gr.exports=JBrowseExports["@jbrowse/display-kit/trackHeightConfigSchemaFields"]});var Cr=v((ws,Pr)=>{Pr.exports=JBrowseExports["@jbrowse/display-kit/TrackHeightMixin"]});var to=y(Ut(),1),no=y(oe(),1);var be=y(X(),1),Kt=(0,gt.createSvgIcon)([(0,be.jsx)("circle",{cx:"7.2",cy:"14.4",r:"3.2"},"0"),(0,be.jsx)("circle",{cx:"14.8",cy:"18",r:"2"},"1"),(0,be.jsx)("circle",{cx:"15.2",cy:"8.8",r:"4.8"},"2")],"BubbleChart");var tn=y(fe(),1);var Zt=y(B(),1),Qt=y(D(),1),uo=(0,Zt.ConfigurationSchema)("GbzBaseSyntenyAdapter",{assemblyNames:{type:"stringArray",defaultValue:[]},gbzDbLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.gbz.db",locationType:"UriLocation"}},haplotypeIndexLocation:{type:"fileLocation",defaultValue:{uri:"",locationType:"UriLocation"}},subgraphSnarls:{type:"stringEnum",model:Qt.types.enumeration("SnarlOutput",["none","contained","overlapping"]),defaultValue:"contained"},referenceSample:{type:"string",defaultValue:""},assemblyNameToPanSN:{type:"frozen",defaultValue:{}},context:{type:"number",defaultValue:1e3,advanced:!0},nodeLimit:{type:"number",defaultValue:1e5,advanced:!0}},{explicitlyTyped:!0,preProcessSnapshot:e=>e.uri?{...e,gbzDbLocation:{uri:e.uri,baseUri:e.baseUri}}:e}),en=uo;function Ee(e){e.addAdapterType(()=>new tn.default({name:"GbzBaseSyntenyAdapter",displayName:"gbz-base pangenome adapter",configSchema:en,adapterCapabilities:["getSubgraph","headerLanes","lanePairsOnAnchor"],adapterMetadata:{category:"Synteny adapters"},getAdapterClass:()=>import("./chunks/GbzBaseSyntenyAdapter-BLSUE5LT.js").then(t=>t.default)}))}var an=y(rn(),1),sn=y(q(),1);function po(e){return"getSubgraph"in e&&typeof e.getSubgraph=="function"}var J=class extends sn.RpcMethodTypeWithRenameRegion{constructor(){super(...arguments);this.name="GetSubgraph"}async execute(n){let{adapterConfig:r,region:o,sessionId:a,opts:i,signal:c}=n,{dataAdapter:g}=await(0,an.getAdapter)(this.pluginManager,a,r);return po(g)?g.getSubgraph(o,{...i,signal:c}):(console.warn(`[GetSubgraph] ${g.constructor.name} does not implement getSubgraph`),"")}};var dn=y(ae(),1),cn=y(q(),1),un=y(D(),1),mo=(0,dn.lazy)(()=>import("./chunks/AddTrackWorkflow-TPCKXM2H.js"));function He(e){e.addAddTrackWorkflowType(()=>new cn.AddTrackWorkflowType({name:"Pangenome graph track",displayName:"Add pangenome graph track",ReactComponent:mo,stateModel:un.types.model({})}))}var pn=y(q(),1);var De;function Oe(){return De??=import("./chunks/bandage-layout-FIOZ7B3E.js").then(e=>e.default()).catch(e=>{throw De=void 0,e}),De}var Z=class extends pn.RpcMethodType{constructor(){super(...arguments);this.name="GraphComputeLayout"}async execute(n){let{graph:r,options:o,statusCallback:a}=n;a?.("Loading layout engine");let i=await Oe();a?.("Computing layout");let c=performance.now(),g=i.computeLayout(r,o),l=performance.now()-c;return{result:g,duration:l}}};var xr=y(ae(),1),Sr=y(gn(),1),Lr=y(hn(),1);var $=y(B(),1),br=y(fn(),1),fr=y(io(),1),G=y(oe(),1),yr=y(ro(),1),s=y(D(),1),wr=y(wn(),1),kr=y(so(),1),T=y($e(),1);var go=.9,_e=2,lo=1e3;function xn(e,t,n,r=o=>o){let o=new Map(e.nodes.map(i=>[i.name,i])),a=[];for(let i of t){let c=[],g,l=[],x=[];for(let b of se(i)){let f=o.get(b),h=f&&n[f.id];if(!(!f||!h?.length)){if(N(f)&&(f.stable.start<i.start||f.stable.start>=i.end)){x.push(h[Math.floor(h.length/2)]);continue}l.push(f.id),c.push(de(h.length===1?[h[0],h[0]]:h));for(let w of h)(!g||w.y<g.y)&&(g=w)}}if(!g)continue;let M=x.length?{x:x.reduce((b,f)=>b+f.x,0)/x.length,y:x.reduce((b,f)=>b+f.y,0)/x.length}:g,p=new Map;for(let b of i.routes??[])for(let f of new Set(b.steps))p.set(f,(p.get(f)??0)+1);let u=[];for(let b of i.routes??[]){if(i.longestAlleleLength<lo)break;if(b.steps.length===0)continue;let f=Math.min(...b.steps.map(d=>p.get(d))),h,w=-1;for(let d of b.steps)if(p.get(d)===f)for(let m of n[d]??[]){let k=Math.hypot(m.x-M.x,m.y-M.y);k>w&&(w=k,h=m)}h&&u.push({route:b,at:h,text:ho(b,r)})}a.push({bubble:i,...U(i),path:c.join(""),top:g,members:l.length,nodeIds:l,whole:l.length>=go*e.nodes.length,routes:u})}return a}function ho(e,t){let n=[...new Set(e.walks.map(t))].sort(),r=n.slice(0,_e).join(", "),o=n.length>_e?` +${n.length-_e}`:"";return`${r}${o} \xB7 ${xt(e.bp)}`}function Sn(e){if(!e.nodes.some(N))return[];let t=new Map(e.nodes.map(p=>[p.id,p])),n=Lt(e),r=new Map(n.map((p,u)=>[p,u])),o=new Int32Array(n.length+1),a=new Map,i=new Set;for(let p of e.edges){let u=r.get(p.from),b=r.get(p.to);if(u===void 0||b===void 0||u===b)continue;i.add(`${p.from}>${p.to}`).add(`${p.to}>${p.from}`);let[f,h]=u<b?[u,b]:[b,u];o[f+1]++,o[h]--;let[w,d]=u<b?[p.from,p.to]:[p.to,p.from];(a.get(w)??a.set(w,new Set).get(w)).add(d)}for(let p=1;p<o.length;p++)o[p]+=o[p-1];let c=e.nodes.filter(N).sort((p,u)=>p.stable.start-u.stable.start),g=new Set([c[0].id,c.at(-1).id]),l=c.map(p=>[p,r.get(p.id)]).filter(([p,u])=>g.has(p.id)||o[u]===0).sort(([p,u],[b,f])=>u-f||p.stable.start-b.stable.start),x=e.paths?.map(p=>{let u=new Map;return p.nodeIds.forEach((b,f)=>{u.has(b)||u.set(b,f)}),u}),M=[];for(let p=0;p+1<l.length;p++){let[u,b]=l[p],[f,h]=l[p+1],w=n.slice(b+1,h);if(w.length===0)continue;let d=new Map([[u.id,{min:0,max:0,n:1}]]);for(let P of[u.id,...w]){let C=d.get(P);if(C)for(let E of a.get(P)??[]){if(r.get(E)>h)continue;let mt=E===f.id?0:t.get(E).length,Pe=d.get(E);d.set(E,{min:Math.min(Pe?.min??1/0,C.min+mt),max:Math.max(Pe?.max??-1/0,C.max+mt),n:Math.min(kt,C.n+(Pe?.n??0))})}}let m=x&&bo(e,t,x,u.id,f.id),k=m?.n?m:void 0,L=k??d.get(f.id)??{min:0,max:0,n:0},R=m!==void 0&&m.left>0,S=u.stable.start+u.length,A=f.stable.start,I=[u.id,...w.filter(P=>N(t.get(P))),f.id],V=I.some((P,C)=>C>0&&!i.has(`${I[C-1]}>${P}`)),z=V||R,O=V&&!k;M.push({refName:u.stable.refName,start:S,end:A,segmentCount:w.length+2,pathCount:L.n,inversion:!1,shortestAlleleLength:O?A-S:L.min,longestAlleleLength:O?A-S:L.max,segments:[u,...w.map(P=>t.get(P)),f].map(P=>P.name).join(","),shortestAllele:void 0,longestAllele:void 0,partial:z,routes:k?.routes})}return M}function bo(e,t,n,r,o){let a=new Map,i=1/0,c=-1/0,g=0;return e.paths.forEach((l,x)=>{let M=n[x].get(r),p=n[x].get(o);if(M===void 0||p===void 0){(M!==void 0||p!==void 0)&&g++;return}let u=l.nodeIds.slice(Math.min(M,p)+1,Math.max(M,p));p<M&&u.reverse();let b=0;for(let w of u)b+=t.get(w)?.length??0;let f=u.join(","),h=a.get(f)??{steps:u,bp:b,walks:[]};h.walks.push(l.name),a.set(f,h),i=Math.min(i,b),c=Math.max(c,b)}),a.size||g?{min:i,max:c,n:a.size,left:g,routes:[...a.values()]}:void 0}function Ln(e,t){let n=new Set(t),r=e.nodes.filter(i=>n.has(i.name)),o=new Set(r.map(i=>i.id)),a=e.paths?.map(i=>({...i,nodeIds:i.nodeIds.filter(c=>o.has(c))})).filter(i=>i.nodeIds.length>0);return{name:e.name,nodes:r,edges:e.edges.filter(i=>o.has(i.from)&&o.has(i.to)),...a?.length?{paths:a}:{},anchorPaths:e.anchorPaths,pathVisits:e.pathVisits,anchoredBy:e.anchoredBy,referencePath:e.referencePath}}var je=new Set(["Gff3TabixAdapter","Gff3Adapter","GtfTabixAdapter","GtfAdapter","BigBedAdapter","NCListAdapter"]),fo=/gene|refseq|gencode|ensembl|annotation/i;function Rn(e,t){if(t)return e.find(r=>r.trackId===t);let n=e.filter(r=>je.has(r.adapterType));return n.find(r=>fo.test(`${r.trackId} ${r.name??""}`))??n[0]}function F(e,t){return typeof e.get=="function"?e.get(t):e[t]}function Mn(e,t){F(e,"type")==="exon"&&t.push({start:F(e,"start"),end:F(e,"end")});let r=F(e,"subfeatures");for(let o of r??[])Mn(o,t)}function yo(e){let t=[...e].sort((r,o)=>r.start-o.start),n=[];for(let r of t){let o=n.at(-1);o&&r.start<=o.end?o.end=Math.max(o.end,r.end):n.push({...r})}return n}function Gn(e){let t=[];for(let n of e){let r=F(n,"gene_name")??F(n,"name")??F(n,"id"),o=F(n,"start"),a=F(n,"end");if(!r||!(a>o))continue;let i=[];Mn(n,i),t.push({name:r,refName:F(n,"refName"),start:o,end:a,strand:F(n,"strand")??0,exons:i.length?yo(i):[{start:o,end:a}]})}return t}function Nn(e){return e.split("#").at(-1)}function Tn(e,t,n){let r=new Map,o=new Map;for(let i of e.nodes)if(N(i)&&n[i.id]?.length){let{refName:c}=i.stable,g=o.get(c)??o.set(c,Nn(c)).get(c),l=r.get(g)??r.set(g,{nodes:[],reach:0}).get(g);l.nodes.push(i),l.reach=Math.max(l.reach,i.length)}for(let{nodes:i}of r.values())i.sort((c,g)=>c.stable.start-g.stable.start);let a=[];for(let i of t){let c=r.get(Nn(i.refName));if(!c)continue;let g=[],l,x=1/0,M=0,p=(i.start+i.end)/2,{nodes:u,reach:b}=c;for(let f=bt(u,i.start-b);f<u.length&&u[f].stable.start<i.end;f++){let h=u[f],w=h.stable.start,d=w+h.length;if(d<=i.start)continue;let m=n[h.id];M+=Math.min(d,i.end)-Math.max(w,i.start);for(let R of i.exons){let S=Math.max(R.start,w),A=Math.min(R.end,d);if(A<=S)continue;let I=ve(m,(S-w)/h.length,(A-w)/h.length);I.length===1&&I.push({...I[0]}),g.push(de(I))}let k=Math.min(Math.max(p,w),d),L=Math.abs(k-p);if(L<x){x=L;let[R]=ve(m,(k-w)/h.length,(k-w)/h.length);l=R}}l&&a.push({gene:i,exons:g.join(""),at:l,covered:M/(i.end-i.start)})}return a}function wo(e,t){let n=e.indexOf(":"),r=e.indexOf(":",n+1);if(n!==-1&&r!==-1){let o=e.slice(0,n),a=e.slice(n+1,r),i=e.slice(r+1);a==="i"||a==="f"?t[o]=+i:a==="Z"&&(t[o]=i)}}function Q(e){let t={};for(let n of e)wo(n,t);return t}function We(e){let{SN:t,SO:n,SR:r}=e.tags;return typeof t=="string"&&typeof n=="number"&&typeof r=="number"?{refName:t,start:n,rank:r}:void 0}var An=62,ko=60;function xo(e){let t=[],n="+",r=0;function o(a){a>r&&t.push({id:e.slice(r,a),strand:n})}for(let a=0;a<e.length;a++){let i=e.charCodeAt(a);(i===An||i===ko)&&(o(a),n=i===An?"+":"-",r=a+1)}return o(e.length),t}function ze(e){let t={nodes:[],links:[],paths:[],walks:[],header:[],id:""};for(let n of e.split(`
|
|
2
|
-
`)){let r=n.endsWith("\r")?n.slice(0,-1):n;if(r.startsWith("H")){let[,...o]=r.split(" ");t.header.push(Q(o))}else if(r.startsWith("S")){let[,o,...a]=r.split(" "),i,c,g,l=!1,x=a[0]??"*";/^\d+$/.test(x)?(i=+x,c=a[1]??"*",g=a.slice(2)):(l=!0,c=x,i=c==="*"?0:c.length,g=a.slice(1));let M=Q(g);l&&"LN"in M&&(i=+M.LN),t.nodes.push({id:o,length:i,sequence:c,tags:M})}else if(r.startsWith("E")){let[,,o,a,,,,,i,...c]=r.split(" ");o&&a&&t.links.push({source:o.slice(0,-1),target:a.slice(0,-1),strand1:o.at(-1),strand2:a.at(-1),cigar:i??"*",tags:Q(c)})}else if(r.startsWith("L")){let[,o,a,i,c,g,...l]=r.split(" ");o&&i&&c&&t.links.push({source:o,target:i,strand1:a,strand2:c,cigar:g??"*",tags:Q(l)})}else if(r.startsWith("W")){let[,o,a,i,c,g,l,...x]=r.split(" ");o&&a&&i&&c&&g&&l&&t.walks.push({sample:o,haplotype:+a,contig:i,start:c==="*"?-1:+c,end:g==="*"?-1:+g,segments:xo(l),tags:Q(x)})}else if(r.startsWith("P")){let[,o,a,...i]=r.split(" ");o&&a&&t.paths.push({name:o,path:a,rest:i})}}return t}function So(e){let t=new Map,n=new Map;function r(a,i){t.has(a)||t.set(a,i)}function o(a,i){r(a,i),n.set(a,(n.get(a)??0)+1)}for(let a of e.links)r(a.source,a.strand1==="-"?"-":"+"),r(a.target,a.strand2==="-"?"-":"+");for(let a of e.paths)for(let i of a.path.split(","))o(i.slice(0,-1),i.endsWith("-")?"-":"+");for(let a of e.walks)for(let i of a.segments)o(i.id,i.strand==="-"?"-":"+");return{canonical:t,traversals:n}}function Lo(e){return[...e.paths.map(t=>({...ue(t.name),steps:t.path.split(",").map(n=>({id:n.slice(0,-1),strand:n.endsWith("-")?"-":"+"}))})),...e.walks.map(t=>({name:`${t.sample}#${t.haplotype}#${t.contig}`,start:t.start===-1?0:t.start,steps:t.segments.map(n=>({id:n.id,strand:n.strand==="-"?"-":"+"}))}))]}function Ro(e){let t=e.tags.SM;if(typeof t!="string")return;let n=t.split(",").map(r=>r.trim()).filter(Boolean);return n.length>0?n:void 0}var ee=e=>typeof e=="number"&&e>0?e:void 0;function Mo({tags:e,length:t}){let n=ee(e.RC)??ee(e.FC)??ee(e.KC);return ee(e.dp)??ee(e.DP)??(n!==void 0&&t>0?n/t:void 0)}function Go(e,t,n){return{id:`${e.id}${t}`,name:e.id,length:e.length,depth:n,stable:We(e),samples:Ro(e)}}function In(e,t="Imported GFA"){let n=[],r=[],{canonical:o,traversals:a}=So(e),i=u=>`${u}${o.get(u)??"+"}`;for(let u of e.nodes){let b=Mo(u)??Math.max(a.get(u.id)??1,1);n.push(Go(u,o.get(u.id)??"+",b))}for(let u of e.links)r.push({from:i(u.source),to:i(u.target),fromStrand:u.strand1==="-"?"-":"+",toStrand:u.strand2==="-"?"-":"+"});let c=[],g=new Map,l=(u,b)=>[u,b].sort().join("--");function x(u,b){for(let f=0;f<u.length-1;f++){let h=l(u[f],u[f+1]);g.has(h)||g.set(h,new Set),g.get(h).add(b)}}for(let u of e.paths){let b=u.path.split(",").map(f=>i(f.slice(0,-1)));c.push({name:u.name,nodeIds:b}),x(b,u.name)}for(let u of e.walks){let b=u.segments.map(h=>i(h.id)),f=`${u.sample}#${u.haplotype}#${u.contig}`;c.push({name:f,nodeIds:b,sample:u.sample,haplotype:u.haplotype,contig:u.contig}),x(b,f)}for(let u of r){let b=g.get(l(u.from,u.to));b&&b.size>0&&(u.pathIds=[...b])}let M=new Map(e.nodes.map(u=>[u.id,u.length])),p=e.paths.length>0||e.walks.length>0?Tt(Lo(e),u=>M.get(u)??0):void 0;return{name:t,nodes:n,edges:r,paths:c.length>0?c:void 0,anchorPaths:p?.anchorPaths,pathVisits:p?.pathVisits,anchoredBy:n.some(u=>u.stable)?"tags":void 0}}function ye(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.horizontalScroll=="function"&&typeof t.zoomTo=="function"&&"coarseDynamicBlocks"in t&&"dynamicBlocks"in t}function Pn(e){return e.reduce((t,n)=>t&&t.end-t.start>=n.end-n.start?t:n,void 0)}function Cn(e,t){let n=Pn(e.dynamicBlocks.contentBlocks.filter(o=>o.refName===t.refName&&o.assemblyName===t.assemblyName)),{bpPerPx:r}=e;return n&&r>0?{scale:1/r,translateX:n.offsetPx-e.offsetPx-n.start/r}:void 0}function vn(e){let t=Pn(e.dynamicBlocks.contentBlocks),n=t?.displayedRegionIndex===void 0?void 0:e.displayedRegions[t.displayedRegionIndex];return t&&e.bpPerPx>0?{refName:t.refName,assemblyName:t.assemblyName,start:t.start,end:t.end,bpPerPx:e.bpPerPx,span:e.bpPerPx*e.width,regionStart:n?.start??t.start,regionEnd:n?.end??t.end}:void 0}function Bn(e,t){let n=e.end-e.start,r=Math.max(0,Math.min(e.span,(t-n)/2));return{refName:e.refName,assemblyName:e.assemblyName,start:Math.max(e.regionStart,Math.floor(e.start-r)),end:Math.min(e.regionEnd,Math.ceil(e.end+r))}}function Fn(e,t){return e?.refName===t.refName&&e.assemblyName===t.assemblyName&&e.start<=t.start&&t.end<=e.end}var Vn=y(B(),1),En=y(D(),1),No="rgb(60,65,72)";function Hn({start:e,end:t}){let r=`min(300, max(0, ((get(feature,'start')+get(feature,'end'))/2 - ${e}) / ${t-e} * 300))`;return`jexl:get(feature,'rank')>0 ? '${No}' : 'hsl(' + ${r} + ',70%,50%)'`}function To(e){return typeof e=="object"&&e!==null&&"id"in e&&Array.isArray(e.tracks)}function Dn(e,t,n){for(let r of e)if(To(r)&&(t===void 0||r.id===t)){let a=r.tracks?.find(i=>i.configuration.trackId===n)?.displays[0];if(a?.type==="LinearBasicDisplay")return a}}function On(e,t){let{color:n}=(0,En.getSnapshot)(e.configuration);(typeof n=="object"&&n!==null&&"value"in n?n.value:n)!==t&&(0,Vn.setConf)(e,"color",t)}function $n(e,t){let n=e.nodes.filter(h=>N(h)&&(t[h.id]?.length??0)>0);if(n.length<2)return t;let r=n.map(h=>{let w=t[h.id],d=w[Math.floor(w.length/2)];return{x:d.x,y:d.y,r:h.stable.start+h.length/2,w:h.length}}),o=r.reduce((h,w)=>h+w.w,0),a=r.reduce((h,w)=>h+w.x*w.w,0)/o,i=r.reduce((h,w)=>h+w.y*w.w,0)/o,c=r.reduce((h,w)=>h+w.r*w.w,0)/o,g=0,l=0;for(let h of r)g+=h.w*(h.x-a)*(h.r-c),l+=h.w*(h.y-i)*(h.r-c);let x=-Math.atan2(l,g),M=Math.cos(x),p=Math.sin(x),u={};for(let[h,w]of Object.entries(t))u[h]=w.map(d=>{let m=d.x-a,k=d.y-i;return{x:a+M*m-p*k,y:i+p*m+M*k}});let b=0,f=0;for(let h of e.nodes)if(!N(h))for(let w of u[h.id]??[])w.y>i?b++:f++;if(f>b)for(let h of Object.values(u))for(let w of h)w.y=2*i-w.y;return u}var _n=30;function Ao(e,t){let{opts:n}=t,r=new Map(t.nodes.map(p=>[p.id,ie(n,p.length)])),o=p=>r.get(p)??n.minimumNodeLength,a=e.nodes.filter(N).sort((p,u)=>p.stable.start-u.stable.start),i=new Map,c=0;for(let p of a)i.set(p.id,{x:c,y:0}),c+=o(p.id)+n.edgeLength;let g=pe(e),l=new Map(a.map(p=>[p.id,0])),x=a.map(p=>p.id);for(let p of x){let u=i.get(p),b=l.get(p)+1;for(let f of g.get(p)??[])l.has(f)||(l.set(f,b),i.set(f,{x:u.x+o(p)/2,y:_n*b}),x.push(f))}let M=0;for(let p of e.nodes)i.has(p.id)||i.set(p.id,{x:M++*c/e.nodes.length,y:_n*3});return i}function jn(e,t){let n=Ao(e,t);return t.nodes.map(r=>({...r,...n.get(r.id)}))}var Ye=new Set(["BedAdapter","BedTabixAdapter","BigBedAdapter","VcfAdapter","VcfTabixAdapter"]),Io=/repeat|tandem|\bstr\b|vntr|trf|trgt|vamos|expansion|microsat/i;function zn(e,t){return t?e.find(r=>r.trackId===t):e.filter(r=>Ye.has(r.adapterType)).find(r=>Io.test(`${r.trackId} ${r.name??""}`))}function ke(e,t){return typeof e.get=="function"?e.get(t):e[t]}var Yn=/^\w+=[^;]*(;\w+=[^;]*)*$/;function Po(e){let t=ke(e,"name");if(!(typeof t!="string"||!Yn.test(t)))return Object.fromEntries(t.split(";").map(n=>{let r=n.indexOf("=");return[n.slice(0,r),n.slice(r+1)]}))}function we(e,t){let n=ke(e,t);return n!==void 0?n:ke(e,"INFO")?.[t]??Po(e)?.[t]}var Xn=["RUS","MOTIFS","RU","motifs","motif","sequence","consensus"],Co=["RUL","period","PERIOD","consensusSize","unit","unitLength"],vo=["TRID","REPID","VARID","ID","name","id"];function xe(e,t){for(let n of t){let r=we(e,n),o=String((Array.isArray(r)?r[0]:r)??"").split(",")[0].trim();if(o!==""&&o!==".")return o}}var Bo=/^[ACGTURYSWKMBDHVN]+$/i;function Fo(e){let t=Number(xe(e,Co));if(Number.isFinite(t)&&t>0)return Math.round(t);let n=xe(e,Xn);return n&&Bo.test(n)?n.length:void 0}function Wn(e){return(Array.isArray(e)?e:String(e??"").split(",")).map(n=>{let r=n===""||n===null||n===void 0?NaN:Number(n);return Number.isFinite(r)?r:void 0})}function Vo(e){let t=ke(e,"samples"),n={};for(let[r,o]of Object.entries(t??{})){let a=Wn(o.SD),i=Wn(o.AL).flatMap((c,g)=>c!==void 0&&c>0?[a[g]===void 0?{bp:c}:{bp:c,spanningReads:a[g]}]:[]);i.length>0&&(n[r]=i)}return Object.keys(n).length>0?n:void 0}function Un(e){let t=[];for(let n of e){let r=we(n,"start"),o=we(n,"end"),a=Fo(n);if(!(o>r)||a===void 0)continue;let i=we(n,"refName"),c=xe(n,Xn),g=xe(n,vo);t.push({key:`${i}:${r}-${o}`,name:(g&&!Yn.test(g)?g:void 0)??(c&&c.length<=12?`(${c})n`:`${i}:${(r+1).toLocaleString()}-${o.toLocaleString()}`),refName:i,start:r,end:o,unit:a,motif:c,calls:Vo(n)})}return t.sort((n,r)=>n.start-r.start)}function Kn(e,t){let n=e.paths?.find(l=>l.name===t);if(!n)return;let r=new Map(e.nodes.map(l=>[l.id,l])),o=new Map;e.edges.forEach((l,x)=>{o.set(`${l.from}>${l.to}`,x)});let a=new Set(n.nodeIds),i=new Set;for(let l=1;l<n.nodeIds.length;l++){let x=n.nodeIds[l-1],M=n.nodeIds[l],p=o.get(`${x}>${M}`)??o.get(`${M}>${x}`);p!==void 0&&i.add(p)}let c=l=>l.reduce((x,M)=>x+(r.get(M)?.length??0),0),g=e.referencePath?e.paths.find(l=>ue(l.name).name===e.referencePath):void 0;return{name:t,nodeIds:a,edgeIndexes:i,steps:n.nodeIds.length,bp:c(n.nodeIds),referenceBp:g&&g!==n?c(g.nodeIds):void 0}}function Se(e){return typeof e=="object"&&e!==null}function Eo(e){return Se(e)&&typeof e.get=="function"}function Ho(e){let t=Eo(e)?e.get("name"):Se(e)?e.name:void 0;return typeof t=="string"?t:void 0}function qn(e){let t;if(Se(e)&&Se(e.hoverPosition)){let{refName:n,coord:r,coord0:o,assemblyName:a}=e.hoverPosition;typeof n=="string"&&typeof r=="number"&&(t={refName:n,coord:typeof o=="number"?o:r-1,assemblyName:typeof a=="string"?a:void 0,featureName:Ho(e.hoverFeature)})}return t}function Jn(e,t){return(e.assemblyName===void 0||e.assemblyName===t.assemblyName)&&e.refName===t.refName&&e.coord>=t.start&&e.coord<t.end}function Zn({hover:e,nodes:t}){let n,r;for(let o of t)o.name===e.featureName?n=o.id:r===void 0&&N(o)&&e.coord>=o.stable.start&&e.coord<o.stable.start+o.length&&(r=o.id);return n??r??null}var Xe=y(B(),1);function Qn(e){return typeof e=="object"&&e!==null}function Do(e){return Qn(e)&&e.type==="LinearGenomeView"&&typeof e.id=="string"&&typeof e.navToLocString=="function"&&Array.isArray(e.assemblyNames)}function te(e){return e.flatMap(t=>Qn(t)&&Array.isArray(t.views)?[t,...t.views]:[t])}function ne({views:e,connectedViewId:t,assemblyName:n}){let r=te(e).filter(a=>Do(a)).filter(a=>a.assemblyNames.includes(n));return r.find(a=>a.id===t)??(r.length===1?r[0]:void 0)}function tr(e,t,n){n.catch(r=>{console.error(`[GraphGenomeView] ${t}`,r),e.notifyError?.(`${t}: ${r}`,r)})}var Oo=1e3;function Ue(e,t=Oo){let n=Math.max(0,Math.ceil((t-(e.end-e.start))/2));return{...e,start:Math.max(0,e.start-n),end:e.end+n}}function nr(e,t){return t?e.map(n=>n.rank===0?{...n,sample:t.assemblyName,haplotype:void 0,refName:t.refName,start:t.start,end:t.end}:n):e}function rr({session:e,location:t,assembly:n,connectedViewId:r,tracks:o=[]}){let a=ne({views:e.views,connectedViewId:r,assemblyName:n}),i;return a?(tr(e,`Could not show ${n} ${K(t)}`,Promise.resolve(a.navToLocString(he(t),n))),i=a.id):i=e.addView("LinearGenomeView",{displayName:`${n} \u2014 ${K(t)}`,init:{assembly:n,loc:he(t),tracks:o}}).id,i}function or({session:e,location:t,assembly:n,connectedViewId:r}){let o=ne({views:e.views,connectedViewId:r,assemblyName:n});return o?.addToHighlights?.({refName:t.refName,start:t.start,end:t.end,assemblyName:n}),o!==void 0}function er(e,t){if(t===void 0)return[];let n=e.tracks.find(o=>(0,Xe.readConfObject)(o,"trackId")===t),r=n?(0,Xe.readConfObject)(n,"assemblyNames"):[];return Array.isArray(r)?r.filter(o=>typeof o=="string"):[]}function ar({session:e,contributors:t,trackId:n,graphTrackId:r}){let o=er(e,r),a=er(e,n),i=t.filter(l=>a.includes(l.sample)),c=i.length>=2?i:t,g={init:{views:c.map(l=>({assembly:l.sample,loc:he(l),...r!==void 0&&o.includes(l.sample)?{tracks:[r]}:{}})),tracks:n?c.slice(1).map(()=>[n]):[],collapseEmptyRows:!0}};e.launchView?tr(e,"Could not open the synteny view",e.launchView("LinearSyntenyView",g)):e.addView("LinearSyntenyView",g)}var Le=y(B(),1),$o="FeatureTrack";function ir({session:e,assemblyName:t,first:n}){let r=[];for(let o of e.tracks){let a=(0,Le.readConfObject)(o,"type"),i=(0,Le.readConfObject)(o,"assemblyNames"),c=(0,Le.readConfObject)(o,"trackId");a===$o&&Array.isArray(i)&&i.includes(t)&&typeof c=="string"&&c!==n&&r.push(c)}return n?[n,...r]:r}var Re=y(B(),1),sr=y(lt(),1),_o="SyntenyTrack";function dr(e,t){let n=new Set(t),r=[];for(let o of e.tracks){let a=(0,Re.readConfObject)(o,"type"),i=(0,Re.readConfObject)(o,"assemblyNames"),c=(0,Re.readConfObject)(o,"trackId");if(a===_o&&typeof c=="string"&&Array.isArray(i)){let g=i.filter(l=>n.has(l)).length;g>=2&&r.push({trackId:c,name:(0,sr.getTrackName)(o,e),coverage:g})}}return r.sort((o,a)=>a.coverage-o.coverage)}var cr=y(B(),1),jo=y(lt(),1);function Wo(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}function ur(e){let t=(0,cr.readConfObject)(e,"assemblyNames");return Wo(t)?t[0]:void 0}function pr(e,t){return e===void 0||e===t?void 0:`The graph is cut on its reference, ${e}: open it from a view of ${e}`}var Yo=600,Ke=160,Xo=340,mr=".segs.bed.gz";function Uo(e){if(typeof e.uri=="string")return e.uri;let n=e.segmentsLocation?.uri;return typeof n=="string"&&n.endsWith(mr)?n.slice(0,-mr.length):void 0}var _=40,gr=1.4,Ko=1.6,qo=150,Jo=1;function Me(...e){}var Zo=5e6;function Ge(e){return e>=1e6?`${+(e/1e6).toFixed(1)} Mb`:`${Math.round(e/1e3)} kb`}var Qo=2e4,ea=1e-6,ta=100;function qe(e){return Math.max(ea,Math.min(ta,e))}function Je(e,t){return{scaleX:e,scaleY:t?1:e,pixelRows:t}}function lr(e){return{minX:-e.translateX/e.scaleX,minY:-e.translateY/e.scaleY,maxX:(e.width-e.translateX)/e.scaleX,maxY:(e.canvasHeight-e.translateY)/e.scaleY}}function na(e,t){let n=(e.maxX-e.minX)*t,r=(e.maxY-e.minY)*t;return{minX:e.minX-n,minY:e.minY-r,maxX:e.maxX+n,maxY:e.maxY+r}}function hr(e,t,n){let r=t-e.h*n;return _-e.minY*n+Math.max(0,r)/2}function ra(e,t){return t.minX>=e.minX&&t.maxX<=e.maxX&&t.minY>=e.minY&&t.maxY<=e.maxY}var Ne=new WeakMap,oa=4;function aa(e){let t=Ne.get(e);return t||(t=new Map,Ne.set(e,t)),t}function ia(e,t){let n=Ne.get(e);n&&e!==t&&Ne.set(t,n)}function sa(e,t,n){e.size>=oa&&e.delete(e.keys().next().value),e.set(t,n)}function re(){return s.types.compose("GraphGenomeView",br.BaseViewModel,(0,wr.RenderLifecycleMixin)(),s.types.model({type:s.types.literal("GraphGenomeView"),layoutQuality:s.types.optional(s.types.number,2),linearLayout:s.types.optional(s.types.boolean,!1),layoutMode:s.types.optional(s.types.enumeration(ge),"force"),colorScheme:s.types.optional(s.types.enumeration(ce),"auto"),bubbleSpread:s.types.optional(s.types.enumeration(yt),"auto"),nodeWidth:s.types.optional(s.types.enumeration(Ft),"depth"),showBubbles:s.types.optional(s.types.boolean,!0),showDeletionEdges:s.types.optional(s.types.boolean,!1),showGenes:s.types.optional(s.types.boolean,!0),geneTrackId:s.types.optional(s.types.string,""),repeatTrackId:s.types.optional(s.types.string,""),repeatKey:s.types.optional(s.types.string,""),walkRowSamples:s.types.maybe(s.types.frozen()),highlightedPath:s.types.optional(s.types.string,""),referencePath:s.types.optional(s.types.string,""),showPerf:s.types.optional(s.types.boolean,!1),contigThickness:s.types.optional(s.types.number,6),connectorThickness:s.types.optional(s.types.number,2),darkMode:s.types.optional(s.types.boolean,!1),scale:s.types.optional(s.types.number,1),translateX:s.types.optional(s.types.number,0),translateY:s.types.optional(s.types.number,0),drawPaths:s.types.optional(s.types.boolean,!1),paneHeight:s.types.maybe(s.types.number),maxGraphNodes:s.types.optional(s.types.number,Qo),maxRegionBp:s.types.optional(s.types.number,Zo),loadedTrackId:s.types.optional(s.types.string,""),loadedRegion:s.types.maybe(s.types.frozen()),subgraphHaplotypes:s.types.maybe(s.types.frozen()),subgraphContext:s.types.optional(s.types.number,1),gfaLocation:s.types.maybe(s.types.frozen()),colorDomain:s.types.maybe(s.types.frozen()),connectedViewId:s.types.maybe(s.types.string),coarseCut:s.types.optional(s.types.boolean,!1)})).volatile(()=>({graph:void 0,layoutResult:void 0,indexBubbles:void 0,geneFeatures:void 0,repeatArrays:void 0,popStack:[],error:void 0,isLoading:!1,loadCanceled:!1,statusMessage:"",hoveredNode:null,hoveredEdge:null,selectedNode:null,viewportDirty:0,positionsVersion:0,geometryVersion:0,builtViewport:void 0,draggingNode:null,isPanning:!1,viewportOwner:"fit",hostPaneHeight:void 0,cutNote:void 0,recuts:0,viewportDirtyTimer:void 0,positionsDirtyFrame:0,lastFetchMs:void 0,lastLayoutMs:void 0,lastGeometryMs:void 0,lastGeometryStrokeCount:void 0})).views(e=>({get nodeById(){if(e.graph){let t=new Map;for(let n of e.graph.nodes)t.set(n.id,n);return t}},get nodeLengths(){let t=new Map;for(let n of e.graph?.nodes??[])t.set(n.id,n.length);return t},get nodeCount(){return e.graph?.nodes.length??0},get edgeCount(){return e.graph?.edges.length??0},get pathCount(){return e.graph?.paths?.length??0},get hasGraph(){return e.graph!==void 0},get showLoading(){return e.error===void 0&&(e.isLoading||(e.graph!==void 0||!!(e.loadedTrackId&&e.loadedRegion)||!!e.gfaLocation)&&e.lastGeometryStrokeCount===void 0)},get canRetryLoad(){return!!(e.loadedTrackId&&e.loadedRegion)||!!e.gfaLocation},get canCancelLoad(){return e.isLoading&&!e.layoutResult},get usesLayoutEngine(){return e.graph?vt(e.layoutMode,e.graph):!1},get canAnchorLayout(){return e.graph?.nodes.some(t=>t.stable?.rank===0)??!1},get anchorPaths(){return e.graph?.anchorPaths??[]},get pathLegend(){let t=e.graph?.paths;return e.drawPaths&&t&&Fe(t.length)?Ve(t):[]},get walkChoices(){let t=e.graph?.paths;return t?.length?Ve(t):[]},get walkHighlight(){return e.graph&&e.highlightedPath?Kn(e.graph,e.highlightedPath):void 0},get effectiveDrawPaths(){return e.drawPaths&&Fe(e.graph?.paths?.length??0)},get activeReferencePath(){return e.graph?.referencePath},get preferredReferencePath(){return e.referencePath===""?e.loadedRegion?.assemblyName:e.referencePath},get rampDomain(){return e.colorDomain??e.loadedRegion},get effectiveColorScheme(){return e.colorScheme!=="auto"?e.colorScheme:e.graph?.anchoredBy?"reference-position":"uniform"},get nodePositions(){return e.layoutResult?.nodePositions},get rowLabels(){return e.layoutResult?.rowLabels??[]},get alleleDeletions(){return e.layoutResult?.alleleDeletions??[]},get pixelRows(){return e.layoutResult?.pixelRows??!1},get zoomPercent(){return`${(e.scale*100).toFixed(1)}%`},get isDefaultViewport(){return e.scale===1&&e.translateX===0&&e.translateY===0}})).views(e=>({get poppedFrom(){return e.popStack.at(-1)},get derivedBubbles(){return e.graph?Sn(e.graph):[]}})).views(e=>({get bubbles(){return e.indexBubbles?.length?e.indexBubbles:e.derivedBubbles}})).views(e=>({get sourceAdapter(){let t=(0,G.getSession)(e).tracks.find(n=>n.trackId===e.loadedTrackId);return t?(0,$.readConfObject)(t,"adapter"):void 0},get assemblyTrackChoices(){let t=e.loadedRegion;return t?(0,G.getSession)(e).tracks.filter(n=>(0,$.readConfObject)(n,"assemblyNames").includes(t.assemblyName)).map(n=>({trackId:n.trackId,name:(0,$.readConfObject)(n,"name"),adapterType:(0,$.readConfObject)(n,"adapter").type})):[]}})).views(e=>({get geneTrackChoices(){return e.assemblyTrackChoices.filter(t=>je.has(t.adapterType))},get repeatTrackChoices(){return e.assemblyTrackChoices.filter(t=>Ye.has(t.adapterType))},get repeatChoices(){return e.repeatArrays??[]}})).views(e=>({get repeatTrack(){return zn(e.repeatTrackChoices,e.repeatTrackId)},get selectedRepeat(){return e.repeatChoices.find(t=>t.key===e.repeatKey)}})).views(e=>({get nodeNeighbors(){return e.graph?pe(e.graph):void 0},get nodeInk(){let{contigThickness:t,nodeWidth:n,nodeById:r}=e,o=e.graph?Vt(e.graph):0;return{maxHalfWidthPx:Ht(t,n)/2,halfWidthPx:a=>{let i=r?.get(a);return i?Et(i,t,n,o)/2:t/2}}},get deletions(){return e.graph&&e.layoutMode!=="walkrows"?Mt(e.graph):[]},get walkRowBars(){if(e.layoutMode!=="walkrows"||!e.graph)return;let t=e.selectedRepeat,n=t?Be(e.graph,t,t.unit):Be(e.graph,e.loadedRegion);if(!n)return;let r=e.walkRowSamples,o=r?n.rows.filter(a=>r.includes(a.sample)).sort((a,i)=>r.indexOf(a.sample)-r.indexOf(i.sample)||a.label.localeCompare(i.label)):n.rows;return{...n,rows:$t(o,t?.calls)}},get drawnRowLabels(){let t=this.walkRowBars;return t?[t.reference,...t.rows].map((n,r)=>({label:n.label,y:r*20})):e.rowLabels},get bubbleGlyphs(){return(e.layoutMode==="variants"?e.bubbles:[]).map(n=>({bubble:n,...U(n)}))},get genePins(){Me(e.positionsVersion);let t=e.layoutResult?.nodePositions;return e.showGenes&&e.layoutMode!=="variants"&&e.layoutMode!=="walkrows"&&e.graph&&e.geneFeatures&&t?Tn(e.graph,e.geneFeatures,t):[]},get bubbleHalos(){Me(e.positionsVersion);let t=e.layoutResult?.nodePositions;if(!e.showBubbles||e.layoutMode==="variants"||e.layoutMode==="walkrows"||!e.graph||!t)return[];let n=new Map(e.walkChoices.map(r=>[r.name,r.label]));return xn(e.graph,e.bubbles,t,r=>n.get(r)??r)},get referenceRamp(){return e.effectiveColorScheme==="reference-position"&&e.graph?Dt(e.graph,e.rampDomain):void 0},get assemblyNames(){let t=e.loadedRegion;return t?[t.assemblyName]:[]},get scaleX(){return Je(e.scale,e.pixelRows).scaleX},get scaleY(){return Je(e.scale,e.pixelRows).scaleY},get axisScale(){return Je(e.scale,e.pixelRows)},get layoutBounds(){let t;if(e.layoutResult){let n=1/0,r=1/0,o=-1/0,a=-1/0;for(let l of Object.values(e.layoutResult.nodePositions))for(let x of l)n=Math.min(n,x.x),r=Math.min(r,x.y),o=Math.max(o,x.x),a=Math.max(a,x.y);let i=e.layoutResult.referenceAxis&&e.popStack.length===0?e.loadedRegion:void 0;i&&i.end>i.start&&(n=i.start,o=i.end);let c=this.walkRowBars,g=c&&e.layoutResult.extent?Pt(c):e.layoutResult.extent;g&&(o=Math.max(o,g.maxX),a=Math.max(a,g.maxY)),t={minX:n,minY:r,w:o-n,h:a-r}}return t},get canvasHeight(){if(e.viewportOwner==="host"&&e.hostPaneHeight!==void 0)return e.hostPaneHeight;let t=this.layoutBounds,n=e.width-_*2,r=Math.max(Ke,e.paneHeight??Yo);if(!t)return r;if(e.pixelRows){let o=e.layoutMode==="variants"?Xo:Ke;return Math.min(r,Math.max(o,t.h+_*2))}return t.w>0&&n>0?Math.min(r,Math.max(Ke,t.h*n/t.w+_*2)):r}})).views(e=>({get geneTrack(){return Rn(e.geneTrackChoices,e.geneTrackId)},get deletionEdgeIndexes(){return new Map(e.deletions.map(t=>[t.edgeIndex,t.bypassed]))},get hiddenEdgeIndexes(){return new Set(e.showDeletionEdges?[]:e.deletions.map(t=>t.edgeIndex))},get referenceRampDomain(){let t=e.referenceRamp;return t?{start:t.start,end:t.start+t.span}:void 0},get hoverHighlight(){let t,n=e.loadedRegion,r=e.hoveredNode,o=e.nodeById,a=e.nodeNeighbors;if(n&&r!==null&&o&&a){let i=me({nodeId:r,nodeById:o,neighbors:a});i&&(t={refName:n.refName,assemblyName:n.assemblyName,...i})}return t}})).views(e=>({get contributingAssemblies(){let t=e.graph,n=t?ht(t):[];return t?_t(t,{maxGap:n.length>0?ft(n):1/0}):[]}})).views(e=>({get assemblyResolver(){let{assemblyManager:t}=(0,G.getSession)(e),n=e.sourceAdapter?.assemblyNameToPanSN,r=new Map(Object.entries(n??{}).map(([a,i])=>[i,a])),o=a=>a!==void 0&&t.has(a)?t.get(a)?.name??a:void 0;return a=>o(r.get(a))??o(a)}})).views(e=>({get launchableAssemblies(){return Wt(nr(e.contributingAssemblies,e.loadedRegion),e.assemblyResolver)},get canHighlightInLinearView(){let t=e.loadedRegion;return t!==void 0&&ne({views:[...(0,G.getSession)(e).views],connectedViewId:e.connectedViewId,assemblyName:t.assemblyName})!==void 0},nodeLaunchTargets(t){let n=e.nodeById?.get(t),r=n?le(n):void 0,o=r?jt(e.assemblyResolver,r):void 0,a=e.loadedRegion,i=e.nodeById,c=e.nodeNeighbors,g=a&&i&&c?me({nodeId:t,nodeById:i,neighbors:c}):void 0,l=a&&g?{sample:a.assemblyName,haplotype:void 0,refName:a.refName,...g}:void 0;return{own:r&&o?{location:Ue(r),assembly:o}:void 0,reference:a&&l?{location:Ue(l),assembly:a.assemblyName}:void 0,highlight:a&&l?{location:l,assembly:a.assemblyName}:void 0}}})).views(e=>({get coarseAboveBpPerPx(){let n=e.sourceAdapter?.coarse?.aboveBpPerPx;return typeof n=="number"?n:void 0}})).views(e=>({get cutTier(){return e.coarseCut&&e.coarseAboveBpPerPx!==void 0?"coarse":"fine"}})).views(e=>({get regionCapBp(){return e.cutTier==="coarse"?1/0:e.maxRegionBp}})).views(e=>({get host(){let t;try{t=(0,G.getContainingView)(e)}catch{return}return t!==e&&ye(t)?t:void 0}})).views(e=>({get hostPlacesX(){let{host:t,loadedRegion:n,layoutResult:r}=e;return t!==void 0&&t.initialized&&n!==void 0&&r?.referenceAxis===!0&&e.popStack.length===0&&!t.dynamicBlocks.contentBlocks.some(o=>o.refName===n.refName&&o.reversed)}})).views(e=>({get hostFrame(){let{host:t,loadedRegion:n}=e;return e.hostPlacesX&&t&&n?Cn(t,n):void 0}})).actions(e=>({setError(t){e.error=t,e.isLoading=!1},setStatusMessage(t){e.statusMessage=t},setFetchMs(t){e.lastFetchMs=t},setLayoutMs(t){e.lastLayoutMs=t},setGeometryMetrics(t,n,r){e.lastGeometryMs=t,e.lastGeometryStrokeCount=n,e.builtViewport=r,e.geometryVersion++},setLayoutQuality(t){e.layoutQuality=t},setLinearLayout(t){e.linearLayout=t},setLayoutMode(t){e.layoutMode=t},setReferencePath(t){e.referencePath=t;let n=e.graph;if(n?.anchoredBy==="paths"){let r=At(n,t);ia(n,r),e.graph=r}},setDrawPaths(t){e.drawPaths=t},setShowPerf(t){e.showPerf=t},setColorScheme(t){e.colorScheme=t},setBubbleSpread(t){e.bubbleSpread=t},setNodeWidth(t){e.nodeWidth=t},setShowBubbles(t){e.showBubbles=t},setShowDeletionEdges(t){e.showDeletionEdges=t},setShowGenes(t){e.showGenes=t},setGeneTrackId(t){e.geneTrackId=t},setRepeatTrackId(t){e.repeatTrackId=t},setRepeatKey(t){e.repeatKey=t},setHighlightedPath(t){e.highlightedPath=t},setPaneHeight(t){e.paneHeight=t,e.viewportOwner==="host"&&(e.hostPaneHeight=t)},adoptTrack(t){e.loadedTrackId!==t&&(e.loadedTrackId=t,e.loadedRegion=void 0,e.coarseCut=!1,e.graph=void 0,e.layoutResult=void 0)},setSubgraphContext(t){e.subgraphContext=t},setWalkRowSamples(t){e.walkRowSamples=t},setSubgraphHaplotypes(t){e.subgraphHaplotypes=t},setMaxRegionBp(t){e.maxRegionBp=t},pairWithLinearView(t){let n=e.connectedViewId;n!==void 0&&te([...(0,G.getSession)(e).views]).some(o=>o.id===n)||(e.connectedViewId=t)},setHoveredNode(t){e.hoveredNode=t},setHoveredEdge(t){e.hoveredEdge=t},setSelectedNode(t){e.selectedNode=t},setDraggingNode(t){e.draggingNode=t},setPanning(t){e.isPanning=t},stopDragging(){e.draggingNode=null,e.isPanning=!1},clearInteractionState(){e.hoveredNode=null,e.hoveredEdge=null,e.selectedNode=null,e.draggingNode=null,e.isPanning=!1},showNodeDetails(t){let n=e.nodeById?.get(t),r=e.nodeById,o=e.nodeNeighbors;if(n&&r&&o){let a=(0,G.getSession)(e),i=e.loadedRegion,c=i?me({nodeId:t,nodeById:r,neighbors:o}):void 0;(0,G.isSessionModelWithWidgets)(a)&&a.showWidget(a.addWidget("BaseFeatureWidget","baseFeature",{featureData:{id:n.id,name:n.name,length:n.length,depth:n.depth,rank:n.stable?.rank,stableName:n.stable?.refName,contributingAssembly:le(n)?.sample,contributingHaplotype:le(n)?.haplotype,carriedBy:n.samples?.join(", "),...i&&c?{refName:i.refName,assemblyName:i.assemblyName,start:c.start,end:c.end}:{}}}))}},setTransform(t,n,r){let{host:o}=e;e.viewportOwner==="host"&&o?o.horizontalScroll(e.translateX-n):(e.viewportOwner="user",e.scale=qe(t),e.translateX=n),e.translateY=r},zoom(t,n,r){let{host:o}=e;if(e.viewportOwner==="host"&&o){o.zoomTo(o.bpPerPx/t,n);return}e.viewportOwner="user";let a=qe(e.scale*t),i=a/e.scale;e.scale=a,e.translateX=n-(n-e.translateX)*i,e.pixelRows||(e.translateY=r-(r-e.translateY)*i)},setViewportDirty(){e.viewportDirty++},setPositionsDirty(){e.positionsVersion++},zoomToFit(){let t=e.layoutBounds,n=e.width-_*2,r=e.canvasHeight-_*2;if(e.viewportOwner==="host"){t&&r>0&&(e.translateY=hr(t,r,e.scaleY));return}if(t&&n>0&&r>0&&(t.w>0||!e.pixelRows&&t.h>0)){let o=t.w>0?n/t.w:1/0,a=t.h>0?r/t.h:1/0,i=qe(e.pixelRows?o:Math.min(o,a));e.scale=i,e.translateX=_-t.minX*i+(n-t.w*i)/2,e.translateY=hr(t,r,e.pixelRows?1:i)}},clearPerfMetrics(){e.lastFetchMs=void 0,e.lastLayoutMs=void 0,e.lastGeometryMs=void 0,e.lastGeometryStrokeCount=void 0,e.builtViewport=void 0}})).actions(e=>({hostTransform(t,n){let r=e.viewportOwner!=="host";r&&(e.hostPaneHeight=e.canvasHeight,e.viewportOwner="host"),e.scale=t,e.translateX=n,r&&e.zoomToFit()},releaseHost(){e.viewportOwner==="host"&&(e.hostPaneHeight=void 0,e.layoutResult?.referenceAxis?e.viewportOwner="user":(e.viewportOwner="fit",e.zoomToFit()))}})).actions(e=>{function t(){clearTimeout(e.viewportDirtyTimer),e.viewportDirtyTimer=setTimeout(()=>{(0,s.isAlive)(e)&&e.setViewportDirty()},qo)}function n(){cancelAnimationFrame(e.positionsDirtyFrame),e.positionsDirtyFrame=requestAnimationFrame(()=>{(0,s.isAlive)(e)&&e.setPositionsDirty()})}return{moveNode(r,o,a){let i=e.layoutResult?.nodePositions;if(i?.[r]){for(let c of i[r])c.x+=o,c.y+=a;n()}},scheduleViewportDirty:t}}).actions(e=>{let t;function n(d,m){let k=(0,G.getSession)(e),{rpcManager:L}=k,R="graph",S=d.nodes.some(N);return L.call(R,"GraphComputeLayout",{graph:{nodes:S?jn(d,m):m.nodes,edges:d.edges},options:{quality:e.layoutQuality,linearLayout:e.linearLayout,...m.opts,...S?{rotateComponents:!1}:{}},signal:t?.signal,statusCallback:A=>{e.setStatusMessage((0,G.statusMessageText)(A)??"")}})}function r(d){let m=d.nodes.some(N);return`${e.layoutQuality}|${e.linearLayout}|${e.bubbleSpread}|${m}|${d.referencePath??""}`}function*o(d){let m=performance.now(),k=Bt(e.layoutMode).run(d,e.loadedRegion,e.host?e.layoutResult?.sampleRows:void 0);if(k)return{result:k,duration:performance.now()-m};let L=aa(d),R=r(d),S=L.get(R);if(S)return{result:S,duration:performance.now()-m};let A=wt(e.bubbleSpread),I=Gt(d),{result:V,duration:z}=yield n(I.graph,Ce(I.graph,A)),O=Ce(d,A),P=new Map(O.nodes.map(Y=>[Y.id,ie(O.opts,Y.length)])),C=Nt(V.nodePositions,I.runs,Y=>P.get(Y)??0),E={...V,nodePositions:d.nodes.some(N)?$n(d,C):C};return sa(L,R,E),{result:E,duration:z}}let a=0;function*i(d){let m=++a,k=()=>e.graph===d&&m===a,L=t?.signal,R;try{R=yield*o(d)}catch(A){if(!k()||L?.aborted)return!1;throw A}let S=k();return S&&(e.layoutResult=R.result,e.setLayoutMs(R.duration)),S}function*c(d,m,k=!1){e.setStatusMessage("Parsing GFA");let L=ze(d),R=It(In(L,m),e.preferredReferencePath);if(R.nodes.length===0)throw new Error(`No graph segments in ${m}`);if(R.nodes.length>e.maxGraphNodes)throw new Error(`Graph too large to draw: ${R.nodes.length.toLocaleString()} nodes (limit ${e.maxGraphNodes.toLocaleString()}). Zoom in to a smaller region, or raise maxGraphNodes on this view.`);let S=k?e.selectedNode:null;e.graph=R,e.indexBubbles=void 0,e.geneFeatures=void 0,e.repeatArrays=void 0,e.popStack=[],e.clearInteractionState(),S!==null&&e.nodeById?.has(S)&&(e.selectedNode=S),e.setStatusMessage("Computing layout"),yield*i(R)}let g=0;function l(){let d=++g;return t?.abort(),t=new AbortController,e.loadCanceled=!1,{isLive:()=>d===g,signal:t.signal}}function x(){return e.loadedTrackId?(0,G.getSession)(e).tracks.find(d=>d.trackId===e.loadedTrackId):void 0}function*M(d,m,k){let L=Uo(d);if(!(d.type!=="RgfaTabixAdapter"||L===void 0||e.cutTier==="coarse"))try{let R=yield(0,G.getSession)(e).rpcManager.call("graph","CoreGetFeatures",{adapterConfig:{type:"MinigraphBubbleAdapter",uri:`${L}.bubbles.bed.gz`,baseUri:d.baseUri,assemblyNameToPanSN:d.assemblyNameToPanSN},regions:[m]});k()&&(e.indexBubbles=R.map(S=>({refName:m.refName,start:S.get("start"),end:S.get("end"),segmentCount:S.get("segmentCount"),pathCount:S.get("pathCount")??0,inversion:S.get("inversion"),shortestAlleleLength:S.get("shortestAlleleLength"),longestAlleleLength:S.get("longestAlleleLength"),segments:S.get("segments"),shortestAllele:void 0,longestAllele:void 0})))}catch(R){console.warn("[GraphGenomeView] no bubble index for this graph",R)}}function*p(d,m,k){let L=(0,G.getSession)(e),R=d?L.tracks.find(S=>S.trackId===d):void 0;if(R)try{return yield L.rpcManager.call("graph","CoreGetFeatures",{adapterConfig:(0,$.readConfObject)(R,"adapter"),regions:[m]})}catch(S){console.warn(`[GraphGenomeView] no ${k} for this graph`,S);return}}function*u(d,m){let k=yield*p(e.geneTrack?.trackId,d,"genes");k&&m()&&(e.geneFeatures=Gn(k))}function*b(d,m){let k=yield*p(e.repeatTrack?.trackId,d,"repeats");k&&m()&&(e.repeatArrays=Un(k))}function*f(d,m,k={}){let{isLive:L,signal:R}=l(),S=x(),A=m.end-m.start,I=(S&&pr(ur(S),m.assemblyName))??(A>e.regionCapBp?`Region too large (${Ge(A)}) \u2014 zoom in to view graph (max ${Ge(e.regionCapBp)})`:void 0);if(I!==void 0){e.graph=void 0,e.layoutResult=void 0,e.isLoading=!1,e.error=new Error(I);return}e.isLoading=!0,e.error=void 0,e.setStatusMessage("Fetching subgraph");try{let V=(0,G.getSession)(e),{rpcManager:z}=V,O="graph",P=performance.now(),C=yield z.call(O,"GetSubgraph",{adapterConfig:d,region:m,opts:k,signal:R});if(!L())return;if(e.setFetchMs(performance.now()-P),!C)throw new Error("Adapter returned no GFA \u2014 region may be outside indexed data or the adapter does not implement getSubgraph");let E=K(m);if(yield*c(C,E,!0),!L())return;e.setStatusMessage("Reading annotations"),yield Promise.all([(0,s.flow)(M)(d,m,L),(0,s.flow)(u)(m,L),(0,s.flow)(b)(m,L)])}catch(V){L()&&(console.error("[GraphGenomeView.loadFromTabixSubgraph]",V),e.error=V)}finally{L()&&(e.isLoading=!1)}}function*h(){let d=e.loadedRegion,m=x();if(d&&e.loadedTrackId&&!m)e.error=new Error(`The track this graph was cut from, "${e.loadedTrackId}", is not in this session`);else if(m&&d){let k=e.cutTier==="coarse";yield*f((0,$.readConfObject)(m,"adapter"),d,{hops:k?0:e.subgraphContext,haplotypes:e.subgraphHaplotypes,tier:k?"coarse":void 0})}}function*w(d,m,k){let{isLive:L,signal:R}=l();e.loadedTrackId="",e.loadedRegion=k,e.coarseCut=!1,e.isLoading=!0,e.error=void 0;try{let S=typeof m=="string"?m:yield m(R);L()&&(yield*c(S,d))}catch(S){L()&&(console.error("[GraphGenomeView.loadWholeGFA]",S),e.error=S)}finally{L()&&(e.isLoading=!1)}return L()}return{clearGraph(){t?.abort(),t=void 0,g++,a++,e.graph=void 0,e.layoutResult=void 0,e.loadedTrackId="",e.loadedRegion=void 0,e.coarseCut=!1,e.cutNote=void 0,e.gfaLocation=void 0,e.indexBubbles=void 0,e.geneFeatures=void 0,e.repeatArrays=void 0,e.popStack=[],e.error=void 0,e.isLoading=!1,e.loadCanceled=!1,e.statusMessage="",e.clearInteractionState(),e.clearPerfMetrics()},cancelLoad(){e.canCancelLoad&&(t?.abort(),t=void 0,g++,a++,e.graph=void 0,e.isLoading=!1,e.statusMessage="",e.loadCanceled=!0)},loadGFA:(0,s.flow)(function*(d,m="Imported GFA"){yield*w(m,d)}),loadGFAFromLocation:(0,s.flow)(function*(d){e.setStatusMessage("Fetching GFA");let m=e.loadedRegion,k=yield*w("uri"in d?d.uri.split("/").pop()??"GFA":"GFA",L=>(0,yr.openLocation)(d).readFile({encoding:"utf8",signal:L}),m);m&&k&&e.graph&&(yield*b(m,()=>e.loadedRegion===m))}),loadFromTabixSubgraph:(0,s.flow)(function*(d,m,k={}){e.loadedTrackId=k.trackId??"",e.loadedRegion=k.trackId?m:void 0,e.coarseCut=!1,yield*f(d,m,{hops:e.subgraphContext,haplotypes:e.subgraphHaplotypes})}),refetchIfNeeded:(0,s.flow)(function*(){e.graph||(yield*h())}),reloadSubgraph:(0,s.flow)(function*(){yield*h()}),reloadRepeats:(0,s.flow)(function*(){let d=e.loadedRegion,m=e.repeatTrack?.trackId;d&&(yield*b(d,()=>e.loadedRegion===d&&e.repeatTrack?.trackId===m))}),reloadGenes:(0,s.flow)(function*(){let d=e.loadedRegion,m=e.geneTrack?.trackId;d&&(yield*u(d,()=>e.loadedRegion===d&&e.geneTrack?.trackId===m))}),popBubble:(0,s.flow)(function*(d){let m=e.graph;if(!m)return;let k=Ln(m,se(d));if(k.nodes.length===0){(0,G.getSession)(e).notify("None of the segments of this bubble are in the cut; widen the graph context to open it","info");return}let{isLive:L}=l();e.popStack=[...e.popStack,{graph:m,layoutMode:e.layoutMode,label:m.name,indexBubbles:e.indexBubbles}],e.indexBubbles=void 0;let R=`${St[U(d).kind]} at ${d.refName}:${d.start.toLocaleString()}`;e.graph={...k,name:R},e.layoutMode==="variants"&&(e.layoutMode="force"),e.clearInteractionState(),e.viewportOwner="fit",e.isLoading=!0;try{(yield*i(e.graph))&&(e.isLoading=!1)}catch(S){L()&&(e.error=S,e.isLoading=!1)}}),unpopBubble:(0,s.flow)(function*(){let d=e.poppedFrom;if(d){e.popStack=e.popStack.slice(0,-1),e.graph=d.graph,e.layoutMode=d.layoutMode,e.indexBubbles=d.indexBubbles,e.clearInteractionState(),e.viewportOwner="fit",e.isLoading=!0;try{(yield*i(d.graph))&&(e.isLoading=!1)}catch(m){e.error=m,e.isLoading=!1}}}),recomputeLayout:(0,s.flow)(function*(){let d=e.graph;if(d){e.isLoading=!0,e.setStatusMessage("Computing layout");try{(yield*i(d))&&(e.isLoading=!1)}catch(m){console.error("[GraphGenomeView.recomputeLayout]",m),e.error=m,e.isLoading=!1}}})}}).actions(e=>({settleOn(t){let n=e.coarseAboveBpPerPx,r=n!==void 0&&t.bpPerPx>n?"coarse":"fine",o=r==="coarse"?1/0:e.maxRegionBp,a=t.end-t.start;e.cutNote=a>o?`Holding the last cut: ${Ge(a)} is past the ${Ge(o)} a cut may span`:void 0,!(e.cutNote!==void 0||r===e.cutTier&&Fn(e.loadedRegion,t))&&(e.coarseCut=r==="coarse",e.loadedRegion=Bn(t,o),e.recuts++,e.reloadSubgraph())}})).actions(e=>({startHosting(){(0,s.addDisposer)(e,(0,T.reaction)(()=>e.hostPlacesX,t=>{t||e.releaseHost()},{name:"GraphHostPlacesX"})),(0,s.addDisposer)(e,(0,T.reaction)(()=>e.hostFrame,t=>{t&&e.hostTransform(t.scale,t.translateX)},{equals:(t,n)=>t?.scale===n?.scale&&t?.translateX===n?.translateX,fireImmediately:!0,name:"GraphHostFrame"})),(0,s.addDisposer)(e,(0,T.reaction)(()=>e.host?.coarseDynamicBlocks,t=>{let{host:n}=e,r=t&&n?vn(n):void 0;r&&e.settleOn(r)},{fireImmediately:!0,name:"GraphHostSettle"}))}})).actions(e=>({startRenderingBackend(t){if(!e.autorunsInstalled){(0,s.addDisposer)(e,(0,T.autorun)(()=>{let r=e.rampDomain,o=e.loadedTrackId;if(r&&o&&e.effectiveColorScheme==="reference-position"){let a=(0,T.untracked)(()=>Dn((0,G.getSession)(e).views,e.connectedViewId,o));a&&On(a,Hn(r))}})),(0,s.addDisposer)(e,(0,T.autorun)(()=>{e.layoutResult&&(0,T.untracked)(()=>e.viewportOwner==="fit")&&e.zoomToFit()})),(0,s.addDisposer)(e,(0,T.autorun)(()=>{let r=qn((0,G.getSession)(e).hovered);(0,T.untracked)(()=>{let o=e.loadedRegion,a=e.graph;o&&a&&e.setHoveredNode(r&&Jn(r,o)?Zn({hover:r,nodes:a.nodes}):null)})})),(0,s.addDisposer)(e,(0,T.reaction)(()=>`${e.scale}-${e.translateX}-${e.translateY}`,()=>{e.setHoveredNode(null),e.setHoveredEdge(null)},{name:"GraphClearHoverOnViewportChange"}));let n=!0;(0,s.addDisposer)(e,(0,T.autorun)(()=>{let{scale:r}=e,o=lr(e);if(n){n=!1;return}let a=(0,T.untracked)(()=>e.builtViewport);a?.scale===r&&ra(a.bounds,o)||e.scheduleViewportDirty()})),(0,s.addDisposer)(e,(0,T.autorun)(()=>{let r=e.currentRenderingBackend,o=e.hoveredNode,a=e.hoveredEdge,i=e.selectedNode;if(Me(e.geometryVersion),r){let c=new Map;i!==null&&c.set(i,Ko),o!==null&&o!==i&&c.set(o,gr),r.setNodeHighlights(c),r.setEdgeHighlight(a,gr),e.renderNow()}}))}e.attachRenderingBackend(t,()=>({upload:n=>{n.resize(e.width,e.canvasHeight);let r=e.nodeById;if(e.nodePositions&&e.graph&&r){Me(e.viewportDirty,e.positionsVersion);let o=performance.now(),a=(0,T.untracked)(()=>na(lr(e),Jo)),i=Ot({nodePositions:e.nodePositions,graph:e.graph,nodeById:r,colorScheme:e.effectiveColorScheme,contigThickness:e.contigThickness,connectorThickness:e.connectorThickness,drawPaths:e.effectiveDrawPaths,nodeWidth:e.nodeWidth,highlight:e.walkHighlight,axis:(0,T.untracked)(()=>e.axisScale),linearLayout:e.linearLayout,viewportBounds:a,referenceRamp:e.referenceRamp,deletions:e.deletionEdgeIndexes,hiddenEdges:e.hiddenEdgeIndexes,version:e.positionsVersion});return n.uploadGeometry(i),e.setGeometryMetrics(performance.now()-o,i.nodeStrokes.length,{scale:(0,T.untracked)(()=>e.scale),bounds:a}),!0}return!1},render:n=>{if(!e.nodePositions)return!1;let r=(0,kr.getDpr)();return n.updateTransform({scaleX:e.scaleX*r,scaleY:e.scaleY*r,translateX:e.translateX*r,translateY:e.translateY*r,dpr:r}),n.render(e.darkMode?[.12,.12,.12,1]:[1,1,1,1]),!0}}))}})).actions(e=>({switchLayout(t){return e.setLayoutMode(t),e.recomputeLayout()},retryLoad(){e.loadedTrackId&&e.loadedRegion?e.reloadSubgraph():e.gfaLocation&&e.loadGFAFromLocation(e.gfaLocation)},afterAttach(){e.isDefaultViewport||(e.viewportOwner="user"),e.gfaLocation&&!e.graph&&e.loadGFAFromLocation(e.gfaLocation),e.refetchIfNeeded()}})).actions(e=>({showInLinearView(t){let n=(0,G.getSession)(e),r=t.assembly===e.loadedRegion?.assemblyName,o=rr({session:n,location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId,tracks:ir({session:n,assemblyName:t.assembly,first:e.loadedTrackId&&r?e.loadedTrackId:void 0})});r&&e.pairWithLinearView(o)},highlightInLinearView(t){or({session:(0,G.getSession)(e),location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId})},showSyntenyView(t){ar({session:(0,G.getSession)(e),contributors:e.launchableAssemblies,trackId:t,graphTrackId:e.loadedTrackId||void 0})}})).views(e=>({get syntenyLaunchTracks(){let t=e.launchableAssemblies.map(n=>n.sample);return t.length>=2?dr((0,G.getSession)(e),t):[]}})).views(e=>({menuItems(){let t=[];for(let n of zt({contributors:e.launchableAssemblies,syntenyTracks:e.syntenyLaunchTracks,onShowLinear:r=>{e.showInLinearView(r)},onShowSynteny:r=>{e.showSyntenyView(r)}}))(0,fr.pushLaunchViewMenuItem)(t,n);return t}}))}var da=(0,Lr.defineLaunchKeys)()({});function Ze(e){e.addViewType(()=>new Sr.default({name:"GraphGenomeView",displayName:"Graph genome view",stateModel:re(),launchKeys:da,ReactComponent:(0,xr.lazy)(()=>import("./chunks/GraphGenomeView-WPKSNN4I.js"))}))}function Qe(e){e.addToExtensionPoint("LaunchView-GraphGenomeView",t=>{let{session:n,...r}=t;return n.addView("GraphGenomeView",r),t})}var Er=y(ae(),1),Hr=y(Mr(),1);var Tr=y(B(),1),Ar=y(Nr(),1),et=y(D(),1);function Ir(){return(0,Tr.ConfigurationSchema)("LinearGraphDisplay",{layoutMode:{type:"stringEnum",model:et.types.enumeration("LayoutMode",ge),defaultValue:"auto"},colorScheme:{type:"stringEnum",model:et.types.enumeration("ColorScheme",ce),defaultValue:"auto"},...(0,Ar.trackHeightConfigSchemaFields)({defaultHeight:300,height:"the most the track takes; a layout shorter than it takes only what it needs"})},{explicitlyTyped:!0,explicitIdentifier:"displayId"})}var vr=y(ae(),1),j=y(B(),1),Br=y(q(),1),Te=y(oe(),1),Fr=y(Cr(),1),H=y(D(),1);var tt=y($e(),1);var ca=(0,vr.lazy)(()=>import("./chunks/GraphSettingsDialog-KQK4YZN5.js"));function Vr(e){let t=re();return H.types.compose("LinearGraphDisplay",Br.BaseDisplay,(0,Fr.default)(),H.types.model({type:H.types.literal("LinearGraphDisplay"),configuration:(0,j.ConfigurationReference)(e),pane:H.types.optional(t,()=>({type:"GraphGenomeView"})),configured:H.types.optional(H.types.boolean,!1)})).preProcessSnapshot(n=>{let r=n.pane;return r?{configured:!0,...n,pane:r.type===void 0?{type:"GraphGenomeView",...r}:r}:n}).views(n=>({get host(){let r;try{r=(0,Te.getContainingView)(n)}catch{return}return ye(r)?r:void 0},get trackId(){return(0,j.getConf)(n.parentTrack,"trackId")}})).views(n=>({trackMenuItems(){let{pane:r}=n,{graph:o}=r,a=r.walkChoices;return[{label:"Layout",subMenu:Ct.map(i=>({type:"radio",label:i.label,checked:r.layoutMode===i.value,disabled:o?!i.available(o):!1,onClick:()=>{r.switchLayout(i.value)}}))},{label:"Color",subMenu:Rt.map(i=>({type:"radio",label:i.label,checked:r.colorScheme===i.value,onClick:()=>{r.setColorScheme(i.value)}}))},...a.length>0?[{label:"Walk",subMenu:[{type:"radio",label:"None",checked:r.highlightedPath==="",onClick:()=>{r.setHighlightedPath("")}},...a.map(i=>({type:"radio",label:i.label,checked:r.highlightedPath===i.name,onClick:()=>{r.setHighlightedPath(i.name)}}))]}]:[],...r.hostPlacesX?[]:[{label:"Zoom in",onClick:()=>{r.zoom(1.5,r.width/2,r.canvasHeight/2)}},{label:"Zoom out",onClick:()=>{r.zoom(1/1.5,r.width/2,r.canvasHeight/2)}},{label:"Zoom to fit",onClick:()=>{r.zoomToFit()}}],{type:"checkbox",label:"Mark bubbles",checked:r.showBubbles,onClick:()=>{r.setShowBubbles(!r.showBubbles)}},{type:"checkbox",label:"Show deletion edges",checked:r.showDeletionEdges,onClick:()=>{r.setShowDeletionEdges(!r.showDeletionEdges)}},{type:"checkbox",label:"Genes on the backbone",checked:r.showGenes,onClick:()=>{r.setShowGenes(!r.showGenes)}},{label:"Settings",icon:Yt,onClick:()=>{(0,Te.getSession)(n).queueDialog(i=>[ca,{model:r,open:!0,onClose:i}])}}]}})).actions(n=>({setConfigured(){n.configured=!0},resizeHeight(r){let o=n.height,a=Math.max(o+r,40);return n.pane.setPaneHeight(a),a-o}})).actions(n=>({afterAttach(){let{pane:r}=n;n.configured||(r.setLayoutMode((0,j.getConf)(n,"layoutMode")),r.setColorScheme((0,j.getConf)(n,"colorScheme")),r.setPaneHeight((0,j.getConf)(n,"height")),n.setConfigured()),r.adoptTrack(n.trackId),r.startHosting(),(0,H.addDisposer)(n,(0,tt.autorun)(()=>{let{host:o}=n;o&&(r.setWidth(o.width),r.pairWithLinearView(o.id))},{name:"LinearGraphDisplayHost"})),(0,H.addDisposer)(n,(0,tt.autorun)(()=>{let o=r.canvasHeight;n.height!==o&&n.setHeight(o)},{name:"LinearGraphDisplayHeight"}))}}))}function nt(e){e.addDisplayType(()=>{let t=Ir();return new Hr.default({name:"LinearGraphDisplay",displayName:"Graph",configSchema:t,stateModel:Vr(t),trackType:["FeatureTrack","SyntenyTrack"],viewType:"LinearGenomeView",ReactComponent:(0,Er.lazy)(()=>import("./chunks/LinearGraphDisplay-7POYIRIB.js"))})})}var $r=y(fe(),1);var rt=y(B(),1),Dr=y(D(),1);function ot(e){let{uri:t,baseUri:n,csi:r}=e;return typeof t=="string"?{...e,bubblesLocation:{uri:t,baseUri:n},index:{indexType:r?"CSI":"TBI",location:{uri:`${t}.${r?"csi":"tbi"}`,baseUri:n}}}:e}var ua=(0,rt.ConfigurationSchema)("MinigraphBubbleAdapter",{bubblesLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.bb.bed.gz",locationType:"UriLocation"}},index:(0,rt.ConfigurationSchema)("MinigraphBubbleIndex",{indexType:{model:Dr.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.bb.bed.gz.tbi",locationType:"UriLocation"}}}),assemblyNameToPanSN:{type:"frozen",defaultValue:{}}},{explicitlyTyped:!0,preProcessSnapshot:ot}),Or=ua;function at(e){e.addAdapterType(()=>new $r.default({name:"MinigraphBubbleAdapter",displayName:"Minigraph bubble BED adapter",normalizeSnapshot:ot,configSchema:Or,adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/MinigraphBubbleAdapter-FJIBTKQY.js").then(t=>t.default)}))}var Yr=y(fe(),1);var Ie=y(B(),1),Wr=y(D(),1);function _r(e,t,n){return{indexType:n?"CSI":"TBI",location:{uri:`${e}.${n?"csi":"tbi"}`,baseUri:t}}}function jr(e){let{uri:t,baseUri:n,csi:r}=e;return typeof t=="string"?{...e,segmentsLocation:{uri:`${t}.segs.bed.gz`,baseUri:n},segmentsIndex:_r(`${t}.segs.bed.gz`,n,r),linksLocation:{uri:`${t}.links.bed.gz`,baseUri:n},linksIndex:_r(`${t}.links.bed.gz`,n,r)}:e}function it(e){let{coarse:t,baseUri:n}=e;return jr(typeof t=="object"&&t!==null?{...e,coarse:jr({baseUri:n,...t})}:e)}var Ae=(e,t)=>(0,Ie.ConfigurationSchema)(e,{indexType:{model:Wr.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:t,locationType:"UriLocation"}}}),pa=(0,Ie.ConfigurationSchema)("RgfaTabixCoarseTier",{aboveBpPerPx:{type:"maybeNumber"},segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.tier.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:Ae("RgfaCoarseSegmentsIndex","/path/to/graph.tier.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.tier.links.bed.gz",locationType:"UriLocation"}},linksIndex:Ae("RgfaCoarseLinksIndex","/path/to/graph.tier.links.bed.gz.tbi")}),ma=(0,Ie.ConfigurationSchema)("RgfaTabixAdapter",{segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:Ae("RgfaSegmentsIndex","/path/to/graph.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.links.bed.gz",locationType:"UriLocation"}},linksIndex:Ae("RgfaLinksIndex","/path/to/graph.links.bed.gz.tbi"),assemblyNameToPanSN:{type:"frozen",defaultValue:{}},coarse:pa},{explicitlyTyped:!0,preProcessSnapshot:it}),zr=ma;function st(e){e.addAdapterType(()=>new Yr.default({name:"RgfaTabixAdapter",displayName:"Indexed rGFA adapter",normalizeSnapshot:it,configSchema:zr,adapterCapabilities:["getSubgraph"],adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/RgfaTabixAdapter-7ZGKJJYW.js").then(t=>t.default)}))}var Ur=y(oe(),1),Kr=y(ao(),1),ct=y(oo(),1),qr=y(co(),1);function dt(e){return typeof e=="object"&&e!==null}function ga(e){let t;if(dt(e)){let{refName:n,start:r,end:o,assemblyName:a}=e;typeof n=="string"&&typeof r=="number"&&typeof o=="number"&&(t={refName:n,start:r,end:o,assemblyName:typeof a=="string"?a:void 0})}return t}function la(e,t,n){let r=e.connectedViewId;return r===void 0||r===t||!n.has(r)}function ha(e,t){return e.assemblyName===void 0||t===void 0||t.includes(e.assemblyName)}function Xr(e,t,n){let r=[],o=new Set(te(e).map(a=>dt(a)?a.id:void 0));for(let a of e)if(dt(a)&&a.type==="GraphGenomeView"&&la(a,t,o)){let i=ga(a.hoverHighlight);i&&ha(i,n)&&r.push({key:typeof a.id=="string"?a.id:"graph",region:i})}return r}var W=y(X(),1),ba=(0,qr.makeStyles)()(e=>({highlight:{height:"100%",position:"absolute",background:(0,Kr.alpha)(e.palette.primary.main,.25),borderLeft:`2px solid ${e.palette.primary.main}`,borderRight:`2px solid ${e.palette.primary.main}`,pointerEvents:"none",zIndex:10}})),fa=(0,ct.observer)(function({model:t,region:n}){let{classes:r}=ba(),o=t.getHighlightCoords(n);return o?(0,W.jsx)("div",{"data-testid":"graph-node-highlight",className:r.highlight,style:{left:o.left,width:o.width}}):null}),ya=(0,ct.observer)(function({model:t}){let{views:n}=(0,Ur.getSession)(t);return(0,W.jsx)(W.Fragment,{children:Xr([...n],t.id,t.assemblyNames).map(({key:r,region:o})=>(0,W.jsx)(fa,{model:t,region:o},`graph-hover-${r}`))})}),Jr=ya;var Zr=y(X(),1),wa="LinearGenomeView-TracksContainerComponent";function ut(e){e.contributeToExtensionPoint(wa,({model:t})=>(0,Zr.jsx)(Jr,{model:t},"graphgenomeview-hover-highlight"))}var Qr="GraphGenomeView";var eo="4.0.1";var pt=class extends to.default{constructor(){super(...arguments);this.name=Qr;this.version=eo}install(n){Ze(n),nt(n),Qe(n),ut(n),st(n),at(n),Ee(n),He(n),n.addRpcMethod(()=>new Z(n)),n.addRpcMethod(()=>new J(n))}configure(n){try{(0,no.isAbstractMenuManager)(n.rootModel)&&n.rootModel.appendToSubMenu(["Add"],{label:"Graph genome view",icon:Kt,onClick:r=>{r.addView("GraphGenomeView",{})}})}catch(r){console.warn("[GraphGenomeView] could not add the Add menu entry",r)}}};export{pt as default};
|
|
1
|
+
import{a as rr}from"./chunks/chunk-KWAXLUPQ.js";import{a as D}from"./chunks/chunk-FCWXYIFC.js";import{a as lt}from"./chunks/chunk-D7XFR2IV.js";import{a as re}from"./chunks/chunk-J4OLMLS5.js";import{A as ge,B as vt,C as Bt,G as Dt,H as Ot,I as $t,J as le,K as _t,L as jt,M as zt,N as he,O as K,P as Wt,R as Yt,a as gt,c as dr,d as xt,e as U,g as St,h as se,i as de,o as Lt,q as Mt,r as Gt,s as Nt,t as ve,v as pe,w as me,x as Be,y as Pt,z as Ct}from"./chunks/chunk-A4ZWFDQY.js";import{c as kt}from"./chunks/chunk-ZNGDWZ6Z.js";import{D as Fe,E as Ve,F as cr,b as N,d as ht,f as bt,g as ft,i as ie,j as Ce,l as yt,m as wt,n as Rt,o as ce,p as ue,q as Tt,r as At,s as It,u as Ft,v as Vt,w as Et,x as Ht}from"./chunks/chunk-OP7IRVG6.js";import"./chunks/chunk-F4C3BEPV.js";import{a as X,b as ar,c as ir,d as sr,e as ae}from"./chunks/chunk-XEJ47DLD.js";import{a as v,b as y}from"./chunks/chunk-FY3BTKY4.js";var Ut=v((ka,Xt)=>{Xt.exports=JBrowseExports["@jbrowse/core/Plugin"]});var fe=v((La,qt)=>{qt.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/AdapterType"]});var B=v((Ra,Jt)=>{Jt.exports=JBrowseExports["@jbrowse/core/configuration"]});var on=v((Ta,nn)=>{nn.exports=JBrowseExports["@jbrowse/core/data_adapters/dataAdapterCache"]});var q=v((Aa,rn)=>{rn.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes"]});var gn=v((Fa,mn)=>{mn.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/ViewType"]});var hn=v((Va,ln)=>{ln.exports=JBrowseExports["@jbrowse/core/util/withLaunchInput"]});var fn=v((Ea,bn)=>{bn.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/models"]});var wn=v((Ha,yn)=>{yn.exports=JBrowseExports["@jbrowse/render-core/RenderLifecycleMixin"]});var $e=v((Da,kn)=>{kn.exports=JBrowseExports.mobx});var Go=v((ls,Mo)=>{Mo.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/DisplayType"]});var To=v((hs,No)=>{No.exports=JBrowseExports["@jbrowse/display-kit/trackHeightConfigSchemaFields"]});var vo=v((ws,Co)=>{Co.exports=JBrowseExports["@jbrowse/display-kit/TrackHeightMixin"]});var nr=y(Ut(),1),or=y(re(),1);var be=y(X(),1),Kt=(0,gt.createSvgIcon)([(0,be.jsx)("circle",{cx:"7.2",cy:"14.4",r:"3.2"},"0"),(0,be.jsx)("circle",{cx:"14.8",cy:"18",r:"2"},"1"),(0,be.jsx)("circle",{cx:"15.2",cy:"8.8",r:"4.8"},"2")],"BubbleChart");var tn=y(fe(),1);var Zt=y(B(),1),Qt=y(D(),1),ur=(0,Zt.ConfigurationSchema)("GbzBaseSyntenyAdapter",{assemblyNames:{type:"stringArray",defaultValue:[]},gbzDbLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.gbz.db",locationType:"UriLocation"}},haplotypeIndexLocation:{type:"fileLocation",defaultValue:{uri:"",locationType:"UriLocation"}},subgraphSnarls:{type:"stringEnum",model:Qt.types.enumeration("SnarlOutput",["none","contained","overlapping"]),defaultValue:"contained"},referenceSample:{type:"string",defaultValue:""},assemblyNameToPanSN:{type:"frozen",defaultValue:{}},context:{type:"number",defaultValue:1e3,advanced:!0},nodeLimit:{type:"number",defaultValue:1e5,advanced:!0}},{explicitlyTyped:!0,preProcessSnapshot:e=>e.uri?{...e,gbzDbLocation:{uri:e.uri,baseUri:e.baseUri}}:e}),en=ur;function Ee(e){e.addAdapterType(()=>new tn.default({name:"GbzBaseSyntenyAdapter",displayName:"gbz-base pangenome adapter",configSchema:en,adapterCapabilities:["getSubgraph","headerLanes","lanePairsOnAnchor"],adapterMetadata:{category:"Synteny adapters"},getAdapterClass:()=>import("./chunks/GbzBaseSyntenyAdapter-BLSUE5LT.js").then(t=>t.default)}))}var an=y(on(),1),sn=y(q(),1);function pr(e){return"getSubgraph"in e&&typeof e.getSubgraph=="function"}var J=class extends sn.RpcMethodTypeWithRenameRegion{constructor(){super(...arguments);this.name="GetSubgraph"}async execute(n){let{adapterConfig:o,region:r,sessionId:a,opts:i,signal:c}=n,{dataAdapter:g}=await(0,an.getAdapter)(this.pluginManager,a,o);return pr(g)?g.getSubgraph(r,{...i,signal:c}):(console.warn(`[GetSubgraph] ${g.constructor.name} does not implement getSubgraph`),"")}};var dn=y(ae(),1),cn=y(q(),1),un=y(D(),1),mr=(0,dn.lazy)(()=>import("./chunks/AddTrackWorkflow-TPCKXM2H.js"));function He(e){e.addAddTrackWorkflowType(()=>new cn.AddTrackWorkflowType({name:"Pangenome graph track",displayName:"Add pangenome graph track",ReactComponent:mr,stateModel:un.types.model({})}))}var pn=y(q(),1);var De;function Oe(){return De??=import("./chunks/bandage-layout-FIOZ7B3E.js").then(e=>e.default()).catch(e=>{throw De=void 0,e}),De}var Z=class extends pn.RpcMethodType{constructor(){super(...arguments);this.name="GraphComputeLayout"}async execute(n){let{graph:o,options:r,statusCallback:a}=n;a?.("Loading layout engine");let i=await Oe();a?.("Computing layout");let c=performance.now(),g=i.computeLayout(o,r),l=performance.now()-c;return{result:g,duration:l}}};var So=y(ae(),1),Lo=y(gn(),1),Ro=y(hn(),1);var $=y(B(),1),fo=y(fn(),1),yo=y(sr(),1),G=y(re(),1),wo=y(rr(),1),s=y(D(),1),ko=y(wn(),1),xo=y(dr(),1),T=y($e(),1);var gr=.9,_e=2,lr=1e3;function xn(e,t,n,o=r=>r){let r=new Map(e.nodes.map(i=>[i.name,i])),a=[];for(let i of t){let c=[],g,l=[],x=[];for(let b of se(i)){let f=r.get(b),h=f&&n[f.id];if(!(!f||!h?.length)){if(N(f)&&(f.stable.start<i.start||f.stable.start>=i.end)){x.push(h[Math.floor(h.length/2)]);continue}l.push(f.id),c.push(de(h.length===1?[h[0],h[0]]:h));for(let w of h)(!g||w.y<g.y)&&(g=w)}}if(!g)continue;let M=x.length?{x:x.reduce((b,f)=>b+f.x,0)/x.length,y:x.reduce((b,f)=>b+f.y,0)/x.length}:g,p=new Map;for(let b of i.routes??[])for(let f of new Set(b.steps))p.set(f,(p.get(f)??0)+1);let u=[];for(let b of i.routes??[]){if(i.longestAlleleLength<lr)break;if(b.steps.length===0)continue;let f=Math.min(...b.steps.map(d=>p.get(d))),h,w=-1;for(let d of b.steps)if(p.get(d)===f)for(let m of n[d]??[]){let k=Math.hypot(m.x-M.x,m.y-M.y);k>w&&(w=k,h=m)}h&&u.push({route:b,at:h,text:hr(b,o)})}a.push({bubble:i,...U(i),path:c.join(""),top:g,members:l.length,nodeIds:l,whole:l.length>=gr*e.nodes.length,routes:u})}return a}function hr(e,t){let n=[...new Set(e.walks.map(t))].sort(),o=n.slice(0,_e).join(", "),r=n.length>_e?` +${n.length-_e}`:"";return`${o}${r} \xB7 ${xt(e.bp)}`}function Sn(e){if(!e.nodes.some(N))return[];let t=new Map(e.nodes.map(p=>[p.id,p])),n=Lt(e),o=new Map(n.map((p,u)=>[p,u])),r=new Int32Array(n.length+1),a=new Map,i=new Set;for(let p of e.edges){let u=o.get(p.from),b=o.get(p.to);if(u===void 0||b===void 0||u===b)continue;i.add(`${p.from}>${p.to}`).add(`${p.to}>${p.from}`);let[f,h]=u<b?[u,b]:[b,u];r[f+1]++,r[h]--;let[w,d]=u<b?[p.from,p.to]:[p.to,p.from];(a.get(w)??a.set(w,new Set).get(w)).add(d)}for(let p=1;p<r.length;p++)r[p]+=r[p-1];let c=e.nodes.filter(N).sort((p,u)=>p.stable.start-u.stable.start),g=new Set([c[0].id,c.at(-1).id]),l=c.map(p=>[p,o.get(p.id)]).filter(([p,u])=>g.has(p.id)||r[u]===0).sort(([p,u],[b,f])=>u-f||p.stable.start-b.stable.start),x=e.paths?.map(p=>{let u=new Map;return p.nodeIds.forEach((b,f)=>{u.has(b)||u.set(b,f)}),u}),M=[];for(let p=0;p+1<l.length;p++){let[u,b]=l[p],[f,h]=l[p+1],w=n.slice(b+1,h);if(w.length===0)continue;let d=new Map([[u.id,{min:0,max:0,n:1}]]);for(let P of[u.id,...w]){let C=d.get(P);if(C)for(let E of a.get(P)??[]){if(o.get(E)>h)continue;let mt=E===f.id?0:t.get(E).length,Pe=d.get(E);d.set(E,{min:Math.min(Pe?.min??1/0,C.min+mt),max:Math.max(Pe?.max??-1/0,C.max+mt),n:Math.min(kt,C.n+(Pe?.n??0))})}}let m=x&&br(e,t,x,u.id,f.id),k=m?.n?m:void 0,L=k??d.get(f.id)??{min:0,max:0,n:0},R=m!==void 0&&m.left>0,S=u.stable.start+u.length,A=f.stable.start,I=[u.id,...w.filter(P=>N(t.get(P))),f.id],V=I.some((P,C)=>C>0&&!i.has(`${I[C-1]}>${P}`)),W=V||R,O=V&&!k;M.push({refName:u.stable.refName,start:S,end:A,segmentCount:w.length+2,pathCount:L.n,inversion:!1,shortestAlleleLength:O?A-S:L.min,longestAlleleLength:O?A-S:L.max,segments:[u,...w.map(P=>t.get(P)),f].map(P=>P.name).join(","),shortestAllele:void 0,longestAllele:void 0,partial:W,routes:k?.routes})}return M}function br(e,t,n,o,r){let a=new Map,i=1/0,c=-1/0,g=0;return e.paths.forEach((l,x)=>{let M=n[x].get(o),p=n[x].get(r);if(M===void 0||p===void 0){(M!==void 0||p!==void 0)&&g++;return}let u=l.nodeIds.slice(Math.min(M,p)+1,Math.max(M,p));p<M&&u.reverse();let b=0;for(let w of u)b+=t.get(w)?.length??0;let f=u.join(","),h=a.get(f)??{steps:u,bp:b,walks:[]};h.walks.push(l.name),a.set(f,h),i=Math.min(i,b),c=Math.max(c,b)}),a.size||g?{min:i,max:c,n:a.size,left:g,routes:[...a.values()]}:void 0}function Ln(e,t){let n=new Set(t),o=e.nodes.filter(i=>n.has(i.name)),r=new Set(o.map(i=>i.id)),a=e.paths?.map(i=>({...i,nodeIds:i.nodeIds.filter(c=>r.has(c))})).filter(i=>i.nodeIds.length>0);return{name:e.name,nodes:o,edges:e.edges.filter(i=>r.has(i.from)&&r.has(i.to)),...a?.length?{paths:a}:{},anchorPaths:e.anchorPaths,pathVisits:e.pathVisits,anchoredBy:e.anchoredBy,referencePath:e.referencePath}}var je=new Set(["Gff3TabixAdapter","Gff3Adapter","GtfTabixAdapter","GtfAdapter","BigBedAdapter","NCListAdapter"]),fr=/gene|refseq|gencode|ensembl|annotation/i;function Rn(e,t){if(t)return e.find(o=>o.trackId===t);let n=e.filter(o=>je.has(o.adapterType));return n.find(o=>fr.test(`${o.trackId} ${o.name??""}`))??n[0]}function F(e,t){return typeof e.get=="function"?e.get(t):e[t]}function Mn(e,t){F(e,"type")==="exon"&&t.push({start:F(e,"start"),end:F(e,"end")});let o=F(e,"subfeatures");for(let r of o??[])Mn(r,t)}function yr(e){let t=[...e].sort((o,r)=>o.start-r.start),n=[];for(let o of t){let r=n.at(-1);r&&o.start<=r.end?r.end=Math.max(r.end,o.end):n.push({...o})}return n}function Gn(e){let t=[];for(let n of e){let o=F(n,"gene_name")??F(n,"name")??F(n,"id"),r=F(n,"start"),a=F(n,"end");if(!o||!(a>r))continue;let i=[];Mn(n,i),t.push({name:o,refName:F(n,"refName"),start:r,end:a,strand:F(n,"strand")??0,exons:i.length?yr(i):[{start:r,end:a}]})}return t}function Nn(e){return e.split("#").at(-1)}function Tn(e,t,n){let o=new Map,r=new Map;for(let i of e.nodes)if(N(i)&&n[i.id]?.length){let{refName:c}=i.stable,g=r.get(c)??r.set(c,Nn(c)).get(c),l=o.get(g)??o.set(g,{nodes:[],reach:0}).get(g);l.nodes.push(i),l.reach=Math.max(l.reach,i.length)}for(let{nodes:i}of o.values())i.sort((c,g)=>c.stable.start-g.stable.start);let a=[];for(let i of t){let c=o.get(Nn(i.refName));if(!c)continue;let g=[],l,x=1/0,M=0,p=(i.start+i.end)/2,{nodes:u,reach:b}=c;for(let f=bt(u,i.start-b);f<u.length&&u[f].stable.start<i.end;f++){let h=u[f],w=h.stable.start,d=w+h.length;if(d<=i.start)continue;let m=n[h.id];M+=Math.min(d,i.end)-Math.max(w,i.start);for(let R of i.exons){let S=Math.max(R.start,w),A=Math.min(R.end,d);if(A<=S)continue;let I=ve(m,(S-w)/h.length,(A-w)/h.length);I.length===1&&I.push({...I[0]}),g.push(de(I))}let k=Math.min(Math.max(p,w),d),L=Math.abs(k-p);if(L<x){x=L;let[R]=ve(m,(k-w)/h.length,(k-w)/h.length);l=R}}l&&a.push({gene:i,exons:g.join(""),at:l,covered:M/(i.end-i.start)})}return a}function wr(e,t){let n=e.indexOf(":"),o=e.indexOf(":",n+1);if(n!==-1&&o!==-1){let r=e.slice(0,n),a=e.slice(n+1,o),i=e.slice(o+1);a==="i"||a==="f"?t[r]=+i:a==="Z"&&(t[r]=i)}}function Q(e){let t={};for(let n of e)wr(n,t);return t}function ze(e){let{SN:t,SO:n,SR:o}=e.tags;return typeof t=="string"&&typeof n=="number"&&typeof o=="number"?{refName:t,start:n,rank:o}:void 0}var An=62,kr=60;function xr(e){let t=[],n="+",o=0;function r(a){a>o&&t.push({id:e.slice(o,a),strand:n})}for(let a=0;a<e.length;a++){let i=e.charCodeAt(a);(i===An||i===kr)&&(r(a),n=i===An?"+":"-",o=a+1)}return r(e.length),t}function We(e){let t={nodes:[],links:[],paths:[],walks:[],header:[],id:""};for(let n of e.split(`
|
|
2
|
+
`)){let o=n.endsWith("\r")?n.slice(0,-1):n;if(o.startsWith("H")){let[,...r]=o.split(" ");t.header.push(Q(r))}else if(o.startsWith("S")){let[,r,...a]=o.split(" "),i,c,g,l=!1,x=a[0]??"*";/^\d+$/.test(x)?(i=+x,c=a[1]??"*",g=a.slice(2)):(l=!0,c=x,i=c==="*"?0:c.length,g=a.slice(1));let M=Q(g);l&&"LN"in M&&(i=+M.LN),t.nodes.push({id:r,length:i,sequence:c,tags:M})}else if(o.startsWith("E")){let[,,r,a,,,,,i,...c]=o.split(" ");r&&a&&t.links.push({source:r.slice(0,-1),target:a.slice(0,-1),strand1:r.at(-1),strand2:a.at(-1),cigar:i??"*",tags:Q(c)})}else if(o.startsWith("L")){let[,r,a,i,c,g,...l]=o.split(" ");r&&i&&c&&t.links.push({source:r,target:i,strand1:a,strand2:c,cigar:g??"*",tags:Q(l)})}else if(o.startsWith("W")){let[,r,a,i,c,g,l,...x]=o.split(" ");r&&a&&i&&c&&g&&l&&t.walks.push({sample:r,haplotype:+a,contig:i,start:c==="*"?-1:+c,end:g==="*"?-1:+g,segments:xr(l),tags:Q(x)})}else if(o.startsWith("P")){let[,r,a,...i]=o.split(" ");r&&a&&t.paths.push({name:r,path:a,rest:i})}}return t}function Sr(e){let t=new Map,n=new Map;function o(a,i){t.has(a)||t.set(a,i)}function r(a,i){o(a,i),n.set(a,(n.get(a)??0)+1)}for(let a of e.links)o(a.source,a.strand1==="-"?"-":"+"),o(a.target,a.strand2==="-"?"-":"+");for(let a of e.paths)for(let i of a.path.split(","))r(i.slice(0,-1),i.endsWith("-")?"-":"+");for(let a of e.walks)for(let i of a.segments)r(i.id,i.strand==="-"?"-":"+");return{canonical:t,traversals:n}}function Lr(e){return[...e.paths.map(t=>({...ue(t.name),steps:t.path.split(",").map(n=>({id:n.slice(0,-1),strand:n.endsWith("-")?"-":"+"}))})),...e.walks.map(t=>({name:`${t.sample}#${t.haplotype}#${t.contig}`,start:t.start===-1?0:t.start,steps:t.segments.map(n=>({id:n.id,strand:n.strand==="-"?"-":"+"}))}))]}function Rr(e){let t=e.tags.SM;if(typeof t!="string")return;let n=t.split(",").map(o=>o.trim()).filter(Boolean);return n.length>0?n:void 0}var ee=e=>typeof e=="number"&&e>0?e:void 0;function Mr({tags:e,length:t}){let n=ee(e.RC)??ee(e.FC)??ee(e.KC);return ee(e.dp)??ee(e.DP)??(n!==void 0&&t>0?n/t:void 0)}function Gr(e,t,n){return{id:`${e.id}${t}`,name:e.id,length:e.length,depth:n,stable:ze(e),samples:Rr(e)}}function In(e,t="Imported GFA"){let n=[],o=[],{canonical:r,traversals:a}=Sr(e),i=u=>`${u}${r.get(u)??"+"}`;for(let u of e.nodes){let b=Mr(u)??Math.max(a.get(u.id)??1,1);n.push(Gr(u,r.get(u.id)??"+",b))}for(let u of e.links)o.push({from:i(u.source),to:i(u.target),fromStrand:u.strand1==="-"?"-":"+",toStrand:u.strand2==="-"?"-":"+"});let c=[],g=new Map,l=(u,b)=>[u,b].sort().join("--");function x(u,b){for(let f=0;f<u.length-1;f++){let h=l(u[f],u[f+1]);g.has(h)||g.set(h,new Set),g.get(h).add(b)}}for(let u of e.paths){let b=u.path.split(",").map(f=>i(f.slice(0,-1)));c.push({name:u.name,nodeIds:b}),x(b,u.name)}for(let u of e.walks){let b=u.segments.map(h=>i(h.id)),f=`${u.sample}#${u.haplotype}#${u.contig}`;c.push({name:f,nodeIds:b,sample:u.sample,haplotype:u.haplotype,contig:u.contig}),x(b,f)}for(let u of o){let b=g.get(l(u.from,u.to));b&&b.size>0&&(u.pathIds=[...b])}let M=new Map(e.nodes.map(u=>[u.id,u.length])),p=e.paths.length>0||e.walks.length>0?Tt(Lr(e),u=>M.get(u)??0):void 0;return{name:t,nodes:n,edges:o,paths:c.length>0?c:void 0,anchorPaths:p?.anchorPaths,pathVisits:p?.pathVisits,anchoredBy:n.some(u=>u.stable)?"tags":void 0}}function ye(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.horizontalScroll=="function"&&typeof t.zoomTo=="function"&&"coarseDynamicBlocks"in t&&"dynamicBlocks"in t}function Pn(e){return e.reduce((t,n)=>t&&t.end-t.start>=n.end-n.start?t:n,void 0)}function Cn(e,t){let n=Pn(e.dynamicBlocks.contentBlocks.filter(r=>r.refName===t.refName&&r.assemblyName===t.assemblyName)),{bpPerPx:o}=e;return n&&o>0?{scale:1/o,translateX:n.offsetPx-e.offsetPx-n.start/o}:void 0}function vn(e){let t=Pn(e.dynamicBlocks.contentBlocks),n=t?.displayedRegionIndex===void 0?void 0:e.displayedRegions[t.displayedRegionIndex];return t&&e.bpPerPx>0?{refName:t.refName,assemblyName:t.assemblyName,start:t.start,end:t.end,bpPerPx:e.bpPerPx,span:e.bpPerPx*e.width,regionStart:n?.start??t.start,regionEnd:n?.end??t.end}:void 0}function Bn(e,t){let n=e.end-e.start,o=Math.max(0,Math.min(e.span,(t-n)/2));return{refName:e.refName,assemblyName:e.assemblyName,start:Math.max(e.regionStart,Math.floor(e.start-o)),end:Math.min(e.regionEnd,Math.ceil(e.end+o))}}function Fn(e,t){return e?.refName===t.refName&&e.assemblyName===t.assemblyName&&e.start<=t.start&&t.end<=e.end}var Vn=y(B(),1),En=y(D(),1),Nr="rgb(60,65,72)";function Hn({start:e,end:t}){let o=`min(300, max(0, ((get(feature,'start')+get(feature,'end'))/2 - ${e}) / ${t-e} * 300))`;return`jexl:get(feature,'rank')>0 ? '${Nr}' : 'hsl(' + ${o} + ',70%,50%)'`}function Tr(e){return typeof e=="object"&&e!==null&&"id"in e&&Array.isArray(e.tracks)}function Dn(e,t,n){for(let o of e)if(Tr(o)&&(t===void 0||o.id===t)){let a=o.tracks?.find(i=>i.configuration.trackId===n)?.displays[0];if(a?.type==="LinearBasicDisplay")return a}}function On(e,t){let{color:n}=(0,En.getSnapshot)(e.configuration);(typeof n=="object"&&n!==null&&"value"in n?n.value:n)!==t&&(0,Vn.setConf)(e,"color",t)}function $n(e,t){let n=e.nodes.filter(h=>N(h)&&(t[h.id]?.length??0)>0);if(n.length<2)return t;let o=n.map(h=>{let w=t[h.id],d=w[Math.floor(w.length/2)];return{x:d.x,y:d.y,r:h.stable.start+h.length/2,w:h.length}}),r=o.reduce((h,w)=>h+w.w,0),a=o.reduce((h,w)=>h+w.x*w.w,0)/r,i=o.reduce((h,w)=>h+w.y*w.w,0)/r,c=o.reduce((h,w)=>h+w.r*w.w,0)/r,g=0,l=0;for(let h of o)g+=h.w*(h.x-a)*(h.r-c),l+=h.w*(h.y-i)*(h.r-c);let x=-Math.atan2(l,g),M=Math.cos(x),p=Math.sin(x),u={};for(let[h,w]of Object.entries(t))u[h]=w.map(d=>{let m=d.x-a,k=d.y-i;return{x:a+M*m-p*k,y:i+p*m+M*k}});let b=0,f=0;for(let h of e.nodes)if(!N(h))for(let w of u[h.id]??[])w.y>i?b++:f++;if(f>b)for(let h of Object.values(u))for(let w of h)w.y=2*i-w.y;return u}var _n=30;function Ar(e,t){let{opts:n}=t,o=new Map(t.nodes.map(p=>[p.id,ie(n,p.length)])),r=p=>o.get(p)??n.minimumNodeLength,a=e.nodes.filter(N).sort((p,u)=>p.stable.start-u.stable.start),i=new Map,c=0;for(let p of a)i.set(p.id,{x:c,y:0}),c+=r(p.id)+n.edgeLength;let g=pe(e),l=new Map(a.map(p=>[p.id,0])),x=a.map(p=>p.id);for(let p of x){let u=i.get(p),b=l.get(p)+1;for(let f of g.get(p)??[])l.has(f)||(l.set(f,b),i.set(f,{x:u.x+r(p)/2,y:_n*b}),x.push(f))}let M=0;for(let p of e.nodes)i.has(p.id)||i.set(p.id,{x:M++*c/e.nodes.length,y:_n*3});return i}function jn(e,t){let n=Ar(e,t);return t.nodes.map(o=>({...o,...n.get(o.id)}))}var Ye=new Set(["BedAdapter","BedTabixAdapter","BigBedAdapter","VcfAdapter","VcfTabixAdapter"]),Ir=/repeat|tandem|\bstr\b|vntr|trf|trgt|vamos|expansion|microsat/i;function Wn(e,t){return t?e.find(o=>o.trackId===t):e.filter(o=>Ye.has(o.adapterType)).find(o=>Ir.test(`${o.trackId} ${o.name??""}`))}function ke(e,t){return typeof e.get=="function"?e.get(t):e[t]}var Yn=/^\w+=[^;]*(;\w+=[^;]*)*$/;function Pr(e){let t=ke(e,"name");if(!(typeof t!="string"||!Yn.test(t)))return Object.fromEntries(t.split(";").map(n=>{let o=n.indexOf("=");return[n.slice(0,o),n.slice(o+1)]}))}function we(e,t){let n=ke(e,t);return n!==void 0?n:ke(e,"INFO")?.[t]??Pr(e)?.[t]}var Xn=["RUS","MOTIFS","RU","motifs","motif","sequence","consensus"],Cr=["RUL","period","PERIOD","consensusSize","unit","unitLength"],vr=["TRID","REPID","VARID","ID","name","id"];function xe(e,t){for(let n of t){let o=we(e,n),r=String((Array.isArray(o)?o[0]:o)??"").split(",")[0].trim();if(r!==""&&r!==".")return r}}var Br=/^[ACGTURYSWKMBDHVN]+$/i;function Fr(e){let t=Number(xe(e,Cr));if(Number.isFinite(t)&&t>0)return Math.round(t);let n=xe(e,Xn);return n&&Br.test(n)?n.length:void 0}function zn(e){return(Array.isArray(e)?e:String(e??"").split(",")).map(n=>{let o=n===""||n===null||n===void 0?NaN:Number(n);return Number.isFinite(o)?o:void 0})}function Vr(e){let t=ke(e,"samples"),n={};for(let[o,r]of Object.entries(t??{})){let a=zn(r.SD),i=zn(r.AL).flatMap((c,g)=>c!==void 0&&c>0?[a[g]===void 0?{bp:c}:{bp:c,spanningReads:a[g]}]:[]);i.length>0&&(n[o]=i)}return Object.keys(n).length>0?n:void 0}function Un(e){let t=[];for(let n of e){let o=we(n,"start"),r=we(n,"end"),a=Fr(n);if(!(r>o)||a===void 0)continue;let i=we(n,"refName"),c=xe(n,Xn),g=xe(n,vr);t.push({key:`${i}:${o}-${r}`,name:(g&&!Yn.test(g)?g:void 0)??(c&&c.length<=12?`(${c})n`:`${i}:${(o+1).toLocaleString()}-${r.toLocaleString()}`),refName:i,start:o,end:r,unit:a,motif:c,calls:Vr(n)})}return t.sort((n,o)=>n.start-o.start)}function Kn(e,t){let n=e.paths?.find(l=>l.name===t);if(!n)return;let o=new Map(e.nodes.map(l=>[l.id,l])),r=new Map;e.edges.forEach((l,x)=>{r.set(`${l.from}>${l.to}`,x)});let a=new Set(n.nodeIds),i=new Set;for(let l=1;l<n.nodeIds.length;l++){let x=n.nodeIds[l-1],M=n.nodeIds[l],p=r.get(`${x}>${M}`)??r.get(`${M}>${x}`);p!==void 0&&i.add(p)}let c=l=>l.reduce((x,M)=>x+(o.get(M)?.length??0),0),g=e.referencePath?e.paths.find(l=>ue(l.name).name===e.referencePath):void 0;return{name:t,nodeIds:a,edgeIndexes:i,steps:n.nodeIds.length,bp:c(n.nodeIds),referenceBp:g&&g!==n?c(g.nodeIds):void 0}}function Se(e){return typeof e=="object"&&e!==null}function Er(e){return Se(e)&&typeof e.get=="function"}function Hr(e){let t=Er(e)?e.get("name"):Se(e)?e.name:void 0;return typeof t=="string"?t:void 0}function qn(e){let t;if(Se(e)&&Se(e.hoverPosition)){let{refName:n,coord:o,coord0:r,assemblyName:a}=e.hoverPosition;typeof n=="string"&&typeof o=="number"&&(t={refName:n,coord:typeof r=="number"?r:o-1,assemblyName:typeof a=="string"?a:void 0,featureName:Hr(e.hoverFeature)})}return t}function Jn(e,t){return(e.assemblyName===void 0||e.assemblyName===t.assemblyName)&&e.refName===t.refName&&e.coord>=t.start&&e.coord<t.end}function Zn({hover:e,nodes:t}){let n,o;for(let r of t)r.name===e.featureName?n=r.id:o===void 0&&N(r)&&e.coord>=r.stable.start&&e.coord<r.stable.start+r.length&&(o=r.id);return n??o??null}var Xe=y(B(),1);function Qn(e){return typeof e=="object"&&e!==null}function Dr(e){return Qn(e)&&e.type==="LinearGenomeView"&&typeof e.id=="string"&&typeof e.navToLocString=="function"&&Array.isArray(e.assemblyNames)}function te(e){return e.flatMap(t=>Qn(t)&&Array.isArray(t.views)?[t,...t.views]:[t])}function ne({views:e,connectedViewId:t,assemblyName:n}){let o=te(e).filter(a=>Dr(a)).filter(a=>a.assemblyNames.includes(n));return o.find(a=>a.id===t)??(o.length===1?o[0]:void 0)}function to(e,t,n){n.catch(o=>{console.error(`[GraphGenomeView] ${t}`,o),e.notifyError?.(`${t}: ${o}`,o)})}var Or=1e3;function Ue(e,t=Or){let n=Math.max(0,Math.ceil((t-(e.end-e.start))/2));return{...e,start:Math.max(0,e.start-n),end:e.end+n}}function no(e,t){return t?e.map(n=>n.rank===0?{...n,sample:t.assemblyName,haplotype:void 0,refName:t.refName,start:t.start,end:t.end}:n):e}function oo({session:e,location:t,assembly:n,connectedViewId:o,tracks:r=[]}){let a=ne({views:e.views,connectedViewId:o,assemblyName:n}),i;return a?(to(e,`Could not show ${n} ${K(t)}`,Promise.resolve(a.navToLocString(he(t),n))),i=a.id):i=e.addView("LinearGenomeView",{displayName:`${n} \u2014 ${K(t)}`,init:{assembly:n,loc:he(t),tracks:r}}).id,i}function ro({session:e,location:t,assembly:n,connectedViewId:o}){let r=ne({views:e.views,connectedViewId:o,assemblyName:n});return r?.addToHighlights?.({refName:t.refName,start:t.start,end:t.end,assemblyName:n}),r!==void 0}function eo(e,t){if(t===void 0)return[];let n=e.tracks.find(r=>(0,Xe.readConfObject)(r,"trackId")===t),o=n?(0,Xe.readConfObject)(n,"assemblyNames"):[];return Array.isArray(o)?o.filter(r=>typeof r=="string"):[]}function ao({session:e,contributors:t,trackId:n,graphTrackId:o}){let r=eo(e,o),a=eo(e,n),i=t.filter(l=>a.includes(l.sample)),c=i.length>=2?i:t,g={init:{views:c.map(l=>({assembly:l.sample,loc:he(l),...o!==void 0&&r.includes(l.sample)?{tracks:[o]}:{}})),tracks:n?c.slice(1).map(()=>[n]):[],collapseEmptyRows:!0}};e.launchView?to(e,"Could not open the synteny view",e.launchView("LinearSyntenyView",g)):e.addView("LinearSyntenyView",g)}var Le=y(B(),1),$r="FeatureTrack";function io({session:e,assemblyName:t,first:n}){let o=[];for(let r of e.tracks){let a=(0,Le.readConfObject)(r,"type"),i=(0,Le.readConfObject)(r,"assemblyNames"),c=(0,Le.readConfObject)(r,"trackId");a===$r&&Array.isArray(i)&&i.includes(t)&&typeof c=="string"&&c!==n&&o.push(c)}return n?[n,...o]:o}var Re=y(B(),1),so=y(lt(),1),_r="SyntenyTrack";function co(e,t){let n=new Set(t),o=[];for(let r of e.tracks){let a=(0,Re.readConfObject)(r,"type"),i=(0,Re.readConfObject)(r,"assemblyNames"),c=(0,Re.readConfObject)(r,"trackId");if(a===_r&&typeof c=="string"&&Array.isArray(i)){let g=i.filter(l=>n.has(l)).length;g>=2&&o.push({trackId:c,name:(0,so.getTrackName)(r,e),coverage:g})}}return o.sort((r,a)=>a.coverage-r.coverage)}var uo=y(B(),1),jr=y(lt(),1);function zr(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}function po(e){let t=(0,uo.readConfObject)(e,"assemblyNames");return zr(t)?t[0]:void 0}function mo(e,t){return e===void 0||e===t?void 0:`The graph is cut on its reference, ${e}: open it from a view of ${e}`}var Yr=600,Ke=160,Xr=340,go=".segs.bed.gz";function Ur(e){if(typeof e.uri=="string")return e.uri;let n=e.segmentsLocation?.uri;return typeof n=="string"&&n.endsWith(go)?n.slice(0,-go.length):void 0}var _=40,lo=1.4,Kr=1.6,qr=150,Jr=1;function Me(...e){}var Zr=5e6;function Ge(e){return e>=1e6?`${+(e/1e6).toFixed(1)} Mb`:`${Math.round(e/1e3)} kb`}var Qr=2e4,ea=1e-6,ta=100;function qe(e){return Math.max(ea,Math.min(ta,e))}function Je(e,t){return{scaleX:e,scaleY:t?1:e,pixelRows:t}}function ho(e){return{minX:-e.translateX/e.scaleX,minY:-e.translateY/e.scaleY,maxX:(e.width-e.translateX)/e.scaleX,maxY:(e.canvasHeight-e.translateY)/e.scaleY}}function na(e,t){let n=(e.maxX-e.minX)*t,o=(e.maxY-e.minY)*t;return{minX:e.minX-n,minY:e.minY-o,maxX:e.maxX+n,maxY:e.maxY+o}}function bo(e,t,n){let o=t-e.h*n;return _-e.minY*n+Math.max(0,o)/2}function oa(e,t){return t.minX>=e.minX&&t.maxX<=e.maxX&&t.minY>=e.minY&&t.maxY<=e.maxY}var Ne=new WeakMap,ra=4;function aa(e){let t=Ne.get(e);return t||(t=new Map,Ne.set(e,t)),t}function ia(e,t){let n=Ne.get(e);n&&e!==t&&Ne.set(t,n)}function sa(e,t,n){e.size>=ra&&e.delete(e.keys().next().value),e.set(t,n)}function oe(){return s.types.compose("GraphGenomeView",fo.BaseViewModel,(0,ko.RenderLifecycleMixin)(),s.types.model({type:s.types.literal("GraphGenomeView"),layoutQuality:s.types.optional(s.types.number,2),linearLayout:s.types.optional(s.types.boolean,!1),layoutMode:s.types.optional(s.types.enumeration(ge),"force"),colorScheme:s.types.optional(s.types.enumeration(ce),"auto"),bubbleSpread:s.types.optional(s.types.enumeration(yt),"auto"),nodeWidth:s.types.optional(s.types.enumeration(Ft),"depth"),showBubbles:s.types.optional(s.types.boolean,!0),showDeletionEdges:s.types.optional(s.types.boolean,!1),showGenes:s.types.optional(s.types.boolean,!0),geneTrackId:s.types.optional(s.types.string,""),repeatTrackId:s.types.optional(s.types.string,""),repeatKey:s.types.optional(s.types.string,""),walkRowSamples:s.types.maybe(s.types.frozen()),highlightedPath:s.types.optional(s.types.string,""),referencePath:s.types.optional(s.types.string,""),showPerf:s.types.optional(s.types.boolean,!1),contigThickness:s.types.optional(s.types.number,6),connectorThickness:s.types.optional(s.types.number,2),darkMode:s.types.optional(s.types.boolean,!1),scale:s.types.optional(s.types.number,1),translateX:s.types.optional(s.types.number,0),translateY:s.types.optional(s.types.number,0),drawPaths:s.types.optional(s.types.boolean,!1),paneHeight:s.types.maybe(s.types.number),maxGraphNodes:s.types.optional(s.types.number,Qr),maxRegionBp:s.types.optional(s.types.number,Zr),loadedTrackId:s.types.optional(s.types.string,""),loadedRegion:s.types.maybe(s.types.frozen()),subgraphHaplotypes:s.types.maybe(s.types.frozen()),subgraphContext:s.types.optional(s.types.number,1),gfaLocation:s.types.maybe(s.types.frozen()),colorDomain:s.types.maybe(s.types.frozen()),connectedViewId:s.types.maybe(s.types.string),coarseCut:s.types.optional(s.types.boolean,!1)})).volatile(()=>({graph:void 0,layoutResult:void 0,indexBubbles:void 0,geneFeatures:void 0,repeatArrays:void 0,popStack:[],error:void 0,isLoading:!1,loadCanceled:!1,statusMessage:"",hoveredNode:null,hoveredEdge:null,selectedNode:null,viewportDirty:0,positionsVersion:0,geometryVersion:0,builtViewport:void 0,draggingNode:null,isPanning:!1,viewportOwner:"fit",hostPaneHeight:void 0,cutNote:void 0,recuts:0,viewportDirtyTimer:void 0,positionsDirtyFrame:0,lastFetchMs:void 0,lastLayoutMs:void 0,lastGeometryMs:void 0,lastGeometryStrokeCount:void 0})).views(e=>({get nodeById(){if(e.graph){let t=new Map;for(let n of e.graph.nodes)t.set(n.id,n);return t}},get nodeLengths(){let t=new Map;for(let n of e.graph?.nodes??[])t.set(n.id,n.length);return t},get nodeCount(){return e.graph?.nodes.length??0},get edgeCount(){return e.graph?.edges.length??0},get pathCount(){return e.graph?.paths?.length??0},get hasGraph(){return e.graph!==void 0},get showLoading(){return e.error===void 0&&(e.isLoading||(e.graph!==void 0||!!(e.loadedTrackId&&e.loadedRegion)||!!e.gfaLocation)&&e.lastGeometryStrokeCount===void 0)},get canRetryLoad(){return!!(e.loadedTrackId&&e.loadedRegion)||!!e.gfaLocation},get canCancelLoad(){return e.isLoading&&!e.layoutResult},get usesLayoutEngine(){return e.graph?vt(e.layoutMode,e.graph):!1},get canAnchorLayout(){return e.graph?.nodes.some(t=>t.stable?.rank===0)??!1},get anchorPaths(){return e.graph?.anchorPaths??[]},get pathLegend(){let t=e.graph?.paths;return e.drawPaths&&t&&Fe(t.length)?Ve(t):[]},get walkChoices(){let t=e.graph?.paths;return t?.length?Ve(t):[]},get walkHighlight(){return e.graph&&e.highlightedPath?Kn(e.graph,e.highlightedPath):void 0},get effectiveDrawPaths(){return e.drawPaths&&Fe(e.graph?.paths?.length??0)},get activeReferencePath(){return e.graph?.referencePath},get preferredReferencePath(){return e.referencePath===""?e.loadedRegion?.assemblyName:e.referencePath},get rampDomain(){return e.colorDomain??e.loadedRegion},get effectiveColorScheme(){return e.colorScheme!=="auto"?e.colorScheme:e.graph?.anchoredBy?"reference-position":"uniform"},get nodePositions(){return e.layoutResult?.nodePositions},get rowLabels(){return e.layoutResult?.rowLabels??[]},get alleleDeletions(){return e.layoutResult?.alleleDeletions??[]},get pixelRows(){return e.layoutResult?.pixelRows??!1},get zoomPercent(){return`${(e.scale*100).toFixed(1)}%`},get isDefaultViewport(){return e.scale===1&&e.translateX===0&&e.translateY===0}})).views(e=>({get poppedFrom(){return e.popStack.at(-1)},get derivedBubbles(){return e.graph?Sn(e.graph):[]}})).views(e=>({get bubbles(){return e.indexBubbles?.length?e.indexBubbles:e.derivedBubbles}})).views(e=>({get sourceAdapter(){let t=(0,G.getSession)(e).tracks.find(n=>n.trackId===e.loadedTrackId);return t?(0,$.readConfObject)(t,"adapter"):void 0},get assemblyTrackChoices(){let t=e.loadedRegion;return t?(0,G.getSession)(e).tracks.filter(n=>(0,$.readConfObject)(n,"assemblyNames").includes(t.assemblyName)).map(n=>({trackId:n.trackId,name:(0,$.readConfObject)(n,"name"),adapterType:(0,$.readConfObject)(n,"adapter").type})):[]}})).views(e=>({get geneTrackChoices(){return e.assemblyTrackChoices.filter(t=>je.has(t.adapterType))},get repeatTrackChoices(){return e.assemblyTrackChoices.filter(t=>Ye.has(t.adapterType))},get repeatChoices(){return e.repeatArrays??[]}})).views(e=>({get repeatTrack(){return Wn(e.repeatTrackChoices,e.repeatTrackId)},get selectedRepeat(){return e.repeatChoices.find(t=>t.key===e.repeatKey)}})).views(e=>({get nodeNeighbors(){return e.graph?pe(e.graph):void 0},get nodeInk(){let{contigThickness:t,nodeWidth:n,nodeById:o}=e,r=e.graph?Vt(e.graph):0;return{maxHalfWidthPx:Ht(t,n)/2,halfWidthPx:a=>{let i=o?.get(a);return i?Et(i,t,n,r)/2:t/2}}},get deletions(){return e.graph&&e.layoutMode!=="walkrows"?Mt(e.graph):[]},get walkRowBars(){if(e.layoutMode!=="walkrows"||!e.graph)return;let t=e.selectedRepeat,n=t?Be(e.graph,t,t.unit):Be(e.graph,e.loadedRegion);if(!n)return;let o=e.walkRowSamples,r=o?n.rows.filter(a=>o.includes(a.sample)).sort((a,i)=>o.indexOf(a.sample)-o.indexOf(i.sample)||a.label.localeCompare(i.label)):n.rows;return{...n,rows:$t(r,t?.calls)}},get drawnRowLabels(){let t=this.walkRowBars;return t?[t.reference,...t.rows].map((n,o)=>({label:n.label,y:o*20})):e.rowLabels},get bubbleGlyphs(){return(e.layoutMode==="variants"?e.bubbles:[]).map(n=>({bubble:n,...U(n)}))},get genePins(){Me(e.positionsVersion);let t=e.layoutResult?.nodePositions;return e.showGenes&&e.layoutMode!=="variants"&&e.layoutMode!=="walkrows"&&e.graph&&e.geneFeatures&&t?Tn(e.graph,e.geneFeatures,t):[]},get bubbleHalos(){Me(e.positionsVersion);let t=e.layoutResult?.nodePositions;if(!e.showBubbles||e.layoutMode==="variants"||e.layoutMode==="walkrows"||!e.graph||!t)return[];let n=new Map(e.walkChoices.map(o=>[o.name,o.label]));return xn(e.graph,e.bubbles,t,o=>n.get(o)??o)},get referenceRamp(){return e.effectiveColorScheme==="reference-position"&&e.graph?Dt(e.graph,e.rampDomain):void 0},get assemblyNames(){let t=e.loadedRegion;return t?[t.assemblyName]:[]},get scaleX(){return Je(e.scale,e.pixelRows).scaleX},get scaleY(){return Je(e.scale,e.pixelRows).scaleY},get axisScale(){return Je(e.scale,e.pixelRows)},get layoutBounds(){let t;if(e.layoutResult){let n=1/0,o=1/0,r=-1/0,a=-1/0;for(let l of Object.values(e.layoutResult.nodePositions))for(let x of l)n=Math.min(n,x.x),o=Math.min(o,x.y),r=Math.max(r,x.x),a=Math.max(a,x.y);let i=e.layoutResult.referenceAxis&&e.popStack.length===0?e.loadedRegion:void 0;i&&i.end>i.start&&(n=i.start,r=i.end);let c=this.walkRowBars,g=c&&e.layoutResult.extent?Pt(c):e.layoutResult.extent;g&&(r=Math.max(r,g.maxX),a=Math.max(a,g.maxY)),t={minX:n,minY:o,w:r-n,h:a-o}}return t},get canvasHeight(){if(e.viewportOwner==="host"&&e.hostPaneHeight!==void 0)return e.hostPaneHeight;let t=this.layoutBounds,n=e.width-_*2,o=Math.max(Ke,e.paneHeight??Yr);if(!t)return o;if(e.pixelRows){let r=e.layoutMode==="variants"?Xr:Ke;return Math.min(o,Math.max(r,t.h+_*2))}return t.w>0&&n>0?Math.min(o,Math.max(Ke,t.h*n/t.w+_*2)):o}})).views(e=>({get geneTrack(){return Rn(e.geneTrackChoices,e.geneTrackId)},get deletionEdgeIndexes(){return new Map(e.deletions.map(t=>[t.edgeIndex,t.bypassed]))},get hiddenEdgeIndexes(){return new Set(e.showDeletionEdges?[]:e.deletions.map(t=>t.edgeIndex))},get referenceRampDomain(){let t=e.referenceRamp;return t?{start:t.start,end:t.start+t.span}:void 0},get hoverHighlight(){let t,n=e.loadedRegion,o=e.hoveredNode,r=e.nodeById,a=e.nodeNeighbors;if(n&&o!==null&&r&&a){let i=me({nodeId:o,nodeById:r,neighbors:a});i&&(t={refName:n.refName,assemblyName:n.assemblyName,...i})}return t}})).views(e=>({get contributingAssemblies(){let t=e.graph,n=t?ht(t):[];return t?_t(t,{maxGap:n.length>0?ft(n):1/0}):[]}})).views(e=>({get assemblyResolver(){let{assemblyManager:t}=(0,G.getSession)(e),n=e.sourceAdapter?.assemblyNameToPanSN,o=new Map(Object.entries(n??{}).map(([a,i])=>[i,a])),r=a=>a!==void 0&&t.has(a)?t.get(a)?.name??a:void 0;return a=>r(o.get(a))??r(a)}})).views(e=>({get launchableAssemblies(){return zt(no(e.contributingAssemblies,e.loadedRegion),e.assemblyResolver)},get canHighlightInLinearView(){let t=e.loadedRegion;return t!==void 0&&ne({views:[...(0,G.getSession)(e).views],connectedViewId:e.connectedViewId,assemblyName:t.assemblyName})!==void 0},nodeLaunchTargets(t){let n=e.nodeById?.get(t),o=n?le(n):void 0,r=o?jt(e.assemblyResolver,o):void 0,a=e.loadedRegion,i=e.nodeById,c=e.nodeNeighbors,g=a&&i&&c?me({nodeId:t,nodeById:i,neighbors:c}):void 0,l=a&&g?{sample:a.assemblyName,haplotype:void 0,refName:a.refName,...g}:void 0;return{own:o&&r?{location:Ue(o),assembly:r}:void 0,reference:a&&l?{location:Ue(l),assembly:a.assemblyName}:void 0,highlight:a&&l?{location:l,assembly:a.assemblyName}:void 0}}})).views(e=>({get coarseAboveBpPerPx(){let n=e.sourceAdapter?.coarse?.aboveBpPerPx;return typeof n=="number"?n:void 0}})).views(e=>({get cutTier(){return e.coarseCut&&e.coarseAboveBpPerPx!==void 0?"coarse":"fine"}})).views(e=>({get regionCapBp(){return e.cutTier==="coarse"?1/0:e.maxRegionBp}})).views(e=>({get host(){let t;try{t=(0,G.getContainingView)(e)}catch{return}return t!==e&&ye(t)?t:void 0}})).views(e=>({get hostPlacesX(){let{host:t,loadedRegion:n,layoutResult:o}=e;return t!==void 0&&t.initialized&&n!==void 0&&o?.referenceAxis===!0&&e.popStack.length===0&&!t.dynamicBlocks.contentBlocks.some(r=>r.refName===n.refName&&r.reversed)}})).views(e=>({get hostFrame(){let{host:t,loadedRegion:n}=e;return e.hostPlacesX&&t&&n?Cn(t,n):void 0}})).actions(e=>({setError(t){e.error=t,e.isLoading=!1},setStatusMessage(t){e.statusMessage=t},setFetchMs(t){e.lastFetchMs=t},setLayoutMs(t){e.lastLayoutMs=t},setGeometryMetrics(t,n,o){e.lastGeometryMs=t,e.lastGeometryStrokeCount=n,e.builtViewport=o,e.geometryVersion++},setLayoutQuality(t){e.layoutQuality=t},setLinearLayout(t){e.linearLayout=t},setLayoutMode(t){e.layoutMode=t},setReferencePath(t){e.referencePath=t;let n=e.graph;if(n?.anchoredBy==="paths"){let o=At(n,t);ia(n,o),e.graph=o}},setDrawPaths(t){e.drawPaths=t},setShowPerf(t){e.showPerf=t},setColorScheme(t){e.colorScheme=t},setBubbleSpread(t){e.bubbleSpread=t},setNodeWidth(t){e.nodeWidth=t},setShowBubbles(t){e.showBubbles=t},setShowDeletionEdges(t){e.showDeletionEdges=t},setShowGenes(t){e.showGenes=t},setGeneTrackId(t){e.geneTrackId=t},setRepeatTrackId(t){e.repeatTrackId=t},setRepeatKey(t){e.repeatKey=t},setHighlightedPath(t){e.highlightedPath=t},setPaneHeight(t){e.paneHeight=t,e.viewportOwner==="host"&&(e.hostPaneHeight=t)},adoptTrack(t){e.loadedTrackId!==t&&(e.loadedTrackId=t,e.loadedRegion=void 0,e.coarseCut=!1,e.graph=void 0,e.layoutResult=void 0)},setSubgraphContext(t){e.subgraphContext=t},setWalkRowSamples(t){e.walkRowSamples=t},setSubgraphHaplotypes(t){e.subgraphHaplotypes=t},setMaxRegionBp(t){e.maxRegionBp=t},pairWithLinearView(t){let n=e.connectedViewId;n!==void 0&&te([...(0,G.getSession)(e).views]).some(r=>r.id===n)||(e.connectedViewId=t)},setHoveredNode(t){e.hoveredNode=t},setHoveredEdge(t){e.hoveredEdge=t},setSelectedNode(t){e.selectedNode=t},setDraggingNode(t){e.draggingNode=t},setPanning(t){e.isPanning=t},stopDragging(){e.draggingNode=null,e.isPanning=!1},clearInteractionState(){e.hoveredNode=null,e.hoveredEdge=null,e.selectedNode=null,e.draggingNode=null,e.isPanning=!1},showNodeDetails(t){let n=e.nodeById?.get(t),o=e.nodeById,r=e.nodeNeighbors;if(n&&o&&r){let a=(0,G.getSession)(e),i=e.loadedRegion,c=i?me({nodeId:t,nodeById:o,neighbors:r}):void 0;(0,G.isSessionModelWithWidgets)(a)&&a.showWidget(a.addWidget("BaseFeatureWidget","baseFeature",{featureData:{id:n.id,name:n.name,length:n.length,depth:n.depth,rank:n.stable?.rank,stableName:n.stable?.refName,contributingAssembly:le(n)?.sample,contributingHaplotype:le(n)?.haplotype,carriedBy:n.samples?.join(", "),...i&&c?{refName:i.refName,assemblyName:i.assemblyName,start:c.start,end:c.end}:{}}}))}},setTransform(t,n,o){let{host:r}=e;e.viewportOwner==="host"&&r?r.horizontalScroll(e.translateX-n):(e.viewportOwner="user",e.scale=qe(t),e.translateX=n),e.translateY=o},zoom(t,n,o){let{host:r}=e;if(e.viewportOwner==="host"&&r){r.zoomTo(r.bpPerPx/t,n);return}e.viewportOwner="user";let a=qe(e.scale*t),i=a/e.scale;e.scale=a,e.translateX=n-(n-e.translateX)*i,e.pixelRows||(e.translateY=o-(o-e.translateY)*i)},setViewportDirty(){e.viewportDirty++},setPositionsDirty(){e.positionsVersion++},zoomToFit(){let t=e.layoutBounds,n=e.width-_*2,o=e.canvasHeight-_*2;if(e.viewportOwner==="host"){t&&o>0&&(e.translateY=bo(t,o,e.scaleY));return}if(t&&n>0&&o>0&&(t.w>0||!e.pixelRows&&t.h>0)){let r=t.w>0?n/t.w:1/0,a=t.h>0?o/t.h:1/0,i=qe(e.pixelRows?r:Math.min(r,a));e.scale=i,e.translateX=_-t.minX*i+(n-t.w*i)/2,e.translateY=bo(t,o,e.pixelRows?1:i)}},clearPerfMetrics(){e.lastFetchMs=void 0,e.lastLayoutMs=void 0,e.lastGeometryMs=void 0,e.lastGeometryStrokeCount=void 0,e.builtViewport=void 0}})).actions(e=>({hostTransform(t,n){let o=e.viewportOwner!=="host";o&&(e.hostPaneHeight=e.canvasHeight,e.viewportOwner="host"),e.scale=t,e.translateX=n,o&&e.zoomToFit()},releaseHost(){e.viewportOwner==="host"&&(e.hostPaneHeight=void 0,e.layoutResult?.referenceAxis?e.viewportOwner="user":(e.viewportOwner="fit",e.zoomToFit()))}})).actions(e=>{function t(){clearTimeout(e.viewportDirtyTimer),e.viewportDirtyTimer=setTimeout(()=>{(0,s.isAlive)(e)&&e.setViewportDirty()},qr)}function n(){cancelAnimationFrame(e.positionsDirtyFrame),e.positionsDirtyFrame=requestAnimationFrame(()=>{(0,s.isAlive)(e)&&e.setPositionsDirty()})}return{moveNode(o,r,a){let i=e.layoutResult?.nodePositions;if(i?.[o]){for(let c of i[o])c.x+=r,c.y+=a;n()}},scheduleViewportDirty:t}}).actions(e=>{let t;function n(d,m){let k=(0,G.getSession)(e),{rpcManager:L}=k,R="graph",S=d.nodes.some(N);return L.call(R,"GraphComputeLayout",{graph:{nodes:S?jn(d,m):m.nodes,edges:d.edges},options:{quality:e.layoutQuality,linearLayout:e.linearLayout,...m.opts,...S?{rotateComponents:!1}:{}},signal:t?.signal,statusCallback:A=>{e.setStatusMessage((0,G.statusMessageText)(A)??"")}})}function o(d){let m=d.nodes.some(N);return`${e.layoutQuality}|${e.linearLayout}|${e.bubbleSpread}|${m}|${d.referencePath??""}`}function*r(d){let m=performance.now(),k=Bt(e.layoutMode).run(d,e.loadedRegion,e.host?e.layoutResult?.sampleRows:void 0);if(k)return{result:k,duration:performance.now()-m};let L=aa(d),R=o(d),S=L.get(R);if(S)return{result:S,duration:performance.now()-m};let A=wt(e.bubbleSpread),I=Gt(d),{result:V,duration:W}=yield n(I.graph,Ce(I.graph,A)),O=Ce(d,A),P=new Map(O.nodes.map(Y=>[Y.id,ie(O.opts,Y.length)])),C=Nt(V.nodePositions,I.runs,Y=>P.get(Y)??0),E={...V,nodePositions:d.nodes.some(N)?$n(d,C):C};return sa(L,R,E),{result:E,duration:W}}let a=0;function*i(d){let m=++a,k=()=>e.graph===d&&m===a,L=t?.signal,R;try{R=yield*r(d)}catch(A){if(!k()||L?.aborted)return!1;throw A}let S=k();return S&&(e.layoutResult=R.result,e.setLayoutMs(R.duration)),S}function*c(d,m,k=!1){e.setStatusMessage("Parsing GFA");let L=We(d),R=It(In(L,m),e.preferredReferencePath);if(R.nodes.length===0)throw new Error(`No graph segments in ${m}`);if(R.nodes.length>e.maxGraphNodes)throw new Error(`Graph too large to draw: ${R.nodes.length.toLocaleString()} nodes (limit ${e.maxGraphNodes.toLocaleString()}). Zoom in to a smaller region, or raise maxGraphNodes on this view.`);let S=k?e.selectedNode:null;e.graph=R,e.indexBubbles=void 0,e.geneFeatures=void 0,e.repeatArrays=void 0,e.popStack=[],e.clearInteractionState(),S!==null&&e.nodeById?.has(S)&&(e.selectedNode=S),e.setStatusMessage("Computing layout"),yield*i(R)}let g=0;function l(){let d=++g;return t?.abort(),t=new AbortController,e.loadCanceled=!1,{isLive:()=>d===g,signal:t.signal}}function x(){return e.loadedTrackId?(0,G.getSession)(e).tracks.find(d=>d.trackId===e.loadedTrackId):void 0}function*M(d,m,k){let L=Ur(d);if(!(d.type!=="RgfaTabixAdapter"||L===void 0||e.cutTier==="coarse"))try{let R=yield(0,G.getSession)(e).rpcManager.call("graph","CoreGetFeatures",{adapterConfig:{type:"MinigraphBubbleAdapter",uri:`${L}.bubbles.bed.gz`,baseUri:d.baseUri,assemblyNameToPanSN:d.assemblyNameToPanSN},regions:[m]});k()&&(e.indexBubbles=R.map(S=>({refName:m.refName,start:S.get("start"),end:S.get("end"),segmentCount:S.get("segmentCount"),pathCount:S.get("pathCount")??0,inversion:S.get("inversion"),shortestAlleleLength:S.get("shortestAlleleLength"),longestAlleleLength:S.get("longestAlleleLength"),segments:S.get("segments"),shortestAllele:void 0,longestAllele:void 0})))}catch(R){console.warn("[GraphGenomeView] no bubble index for this graph",R)}}function*p(d,m,k){let L=(0,G.getSession)(e),R=d?L.tracks.find(S=>S.trackId===d):void 0;if(R)try{return yield L.rpcManager.call("graph","CoreGetFeatures",{adapterConfig:(0,$.readConfObject)(R,"adapter"),regions:[m]})}catch(S){console.warn(`[GraphGenomeView] no ${k} for this graph`,S);return}}function*u(d,m){let k=yield*p(e.geneTrack?.trackId,d,"genes");k&&m()&&(e.geneFeatures=Gn(k))}function*b(d,m){let k=yield*p(e.repeatTrack?.trackId,d,"repeats");k&&m()&&(e.repeatArrays=Un(k))}function*f(d,m,k={}){let{isLive:L,signal:R}=l(),S=x(),A=m.end-m.start,I=(S&&mo(po(S),m.assemblyName))??(A>e.regionCapBp?`Region too large (${Ge(A)}) \u2014 zoom in to view graph (max ${Ge(e.regionCapBp)})`:void 0);if(I!==void 0){e.graph=void 0,e.layoutResult=void 0,e.isLoading=!1,e.error=new Error(I);return}e.isLoading=!0,e.error=void 0,e.setStatusMessage("Fetching subgraph");try{let V=(0,G.getSession)(e),{rpcManager:W}=V,O="graph",P=performance.now(),C=yield W.call(O,"GetSubgraph",{adapterConfig:d,region:m,opts:k,signal:R});if(!L())return;if(e.setFetchMs(performance.now()-P),!C)throw new Error("Adapter returned no GFA \u2014 region may be outside indexed data or the adapter does not implement getSubgraph");let E=K(m);if(yield*c(C,E,!0),!L())return;e.setStatusMessage("Reading annotations"),yield Promise.all([(0,s.flow)(M)(d,m,L),(0,s.flow)(u)(m,L),(0,s.flow)(b)(m,L)])}catch(V){L()&&(console.error("[GraphGenomeView.loadFromTabixSubgraph]",V),e.error=V)}finally{L()&&(e.isLoading=!1)}}function*h(){let d=e.loadedRegion,m=x();if(d&&e.loadedTrackId&&!m)e.error=new Error(`The track this graph was cut from, "${e.loadedTrackId}", is not in this session`);else if(m&&d){let k=e.cutTier==="coarse";yield*f((0,$.readConfObject)(m,"adapter"),d,{hops:k?0:e.subgraphContext,haplotypes:e.subgraphHaplotypes,tier:k?"coarse":void 0})}}function*w(d,m,k){let{isLive:L,signal:R}=l();e.loadedTrackId="",e.loadedRegion=k,e.coarseCut=!1,e.isLoading=!0,e.error=void 0;try{let S=typeof m=="string"?m:yield m(R);L()&&(yield*c(S,d))}catch(S){L()&&(console.error("[GraphGenomeView.loadWholeGFA]",S),e.error=S)}finally{L()&&(e.isLoading=!1)}return L()}return{clearGraph(){t?.abort(),t=void 0,g++,a++,e.graph=void 0,e.layoutResult=void 0,e.loadedTrackId="",e.loadedRegion=void 0,e.coarseCut=!1,e.cutNote=void 0,e.gfaLocation=void 0,e.indexBubbles=void 0,e.geneFeatures=void 0,e.repeatArrays=void 0,e.popStack=[],e.error=void 0,e.isLoading=!1,e.loadCanceled=!1,e.statusMessage="",e.clearInteractionState(),e.clearPerfMetrics()},cancelLoad(){e.canCancelLoad&&(t?.abort(),t=void 0,g++,a++,e.graph=void 0,e.isLoading=!1,e.statusMessage="",e.loadCanceled=!0)},loadGFA:(0,s.flow)(function*(d,m="Imported GFA"){yield*w(m,d)}),loadGFAFromLocation:(0,s.flow)(function*(d){e.setStatusMessage("Fetching GFA");let m=e.loadedRegion,k=yield*w("uri"in d?d.uri.split("/").pop()??"GFA":"GFA",L=>(0,wo.openLocation)(d).readFile({encoding:"utf8",signal:L}),m);m&&k&&e.graph&&(yield*b(m,()=>e.loadedRegion===m))}),loadFromTabixSubgraph:(0,s.flow)(function*(d,m,k={}){e.loadedTrackId=k.trackId??"",e.loadedRegion=k.trackId?m:void 0,e.coarseCut=!1,yield*f(d,m,{hops:e.subgraphContext,haplotypes:e.subgraphHaplotypes})}),refetchIfNeeded:(0,s.flow)(function*(){e.graph||(yield*h())}),reloadSubgraph:(0,s.flow)(function*(){yield*h()}),reloadRepeats:(0,s.flow)(function*(){let d=e.loadedRegion,m=e.repeatTrack?.trackId;d&&(yield*b(d,()=>e.loadedRegion===d&&e.repeatTrack?.trackId===m))}),reloadGenes:(0,s.flow)(function*(){let d=e.loadedRegion,m=e.geneTrack?.trackId;d&&(yield*u(d,()=>e.loadedRegion===d&&e.geneTrack?.trackId===m))}),popBubble:(0,s.flow)(function*(d){let m=e.graph;if(!m)return;let k=Ln(m,se(d));if(k.nodes.length===0){(0,G.getSession)(e).notify("None of the segments of this bubble are in the cut; widen the graph context to open it","info");return}let{isLive:L}=l();e.popStack=[...e.popStack,{graph:m,layoutMode:e.layoutMode,label:m.name,indexBubbles:e.indexBubbles}],e.indexBubbles=void 0;let R=`${St[U(d).kind]} at ${d.refName}:${d.start.toLocaleString()}`;e.graph={...k,name:R},e.layoutMode==="variants"&&(e.layoutMode="force"),e.clearInteractionState(),e.viewportOwner="fit",e.isLoading=!0;try{(yield*i(e.graph))&&(e.isLoading=!1)}catch(S){L()&&(e.error=S,e.isLoading=!1)}}),unpopBubble:(0,s.flow)(function*(){let d=e.poppedFrom;if(d){e.popStack=e.popStack.slice(0,-1),e.graph=d.graph,e.layoutMode=d.layoutMode,e.indexBubbles=d.indexBubbles,e.clearInteractionState(),e.viewportOwner="fit",e.isLoading=!0;try{(yield*i(d.graph))&&(e.isLoading=!1)}catch(m){e.error=m,e.isLoading=!1}}}),recomputeLayout:(0,s.flow)(function*(){let d=e.graph;if(d){e.isLoading=!0,e.setStatusMessage("Computing layout");try{(yield*i(d))&&(e.isLoading=!1)}catch(m){console.error("[GraphGenomeView.recomputeLayout]",m),e.error=m,e.isLoading=!1}}})}}).actions(e=>({settleOn(t){let n=e.coarseAboveBpPerPx,o=n!==void 0&&t.bpPerPx>n?"coarse":"fine",r=o==="coarse"?1/0:e.maxRegionBp,a=t.end-t.start;e.cutNote=a>r?`Holding the last cut: ${Ge(a)} is past the ${Ge(r)} a cut may span`:void 0,!(e.cutNote!==void 0||o===e.cutTier&&Fn(e.loadedRegion,t))&&(e.coarseCut=o==="coarse",e.loadedRegion=Bn(t,r),e.recuts++,e.reloadSubgraph())}})).actions(e=>({startHosting(){(0,s.addDisposer)(e,(0,T.reaction)(()=>e.hostPlacesX,t=>{t||e.releaseHost()},{name:"GraphHostPlacesX"})),(0,s.addDisposer)(e,(0,T.reaction)(()=>e.hostFrame,t=>{t&&e.hostTransform(t.scale,t.translateX)},{equals:(t,n)=>t?.scale===n?.scale&&t?.translateX===n?.translateX,fireImmediately:!0,name:"GraphHostFrame"})),(0,s.addDisposer)(e,(0,T.reaction)(()=>e.host?.coarseDynamicBlocks,t=>{let{host:n}=e,o=t&&n?vn(n):void 0;o&&e.settleOn(o)},{fireImmediately:!0,name:"GraphHostSettle"}))}})).actions(e=>({startRenderingBackend(t){if(!e.autorunsInstalled){(0,s.addDisposer)(e,(0,T.autorun)(()=>{let o=e.rampDomain,r=e.loadedTrackId;if(o&&r&&e.effectiveColorScheme==="reference-position"){let a=(0,T.untracked)(()=>Dn((0,G.getSession)(e).views,e.connectedViewId,r));a&&On(a,Hn(o))}})),(0,s.addDisposer)(e,(0,T.autorun)(()=>{e.layoutResult&&(0,T.untracked)(()=>e.viewportOwner==="fit")&&e.zoomToFit()})),(0,s.addDisposer)(e,(0,T.autorun)(()=>{let o=qn((0,G.getSession)(e).hovered);(0,T.untracked)(()=>{let r=e.loadedRegion,a=e.graph;r&&a&&e.setHoveredNode(o&&Jn(o,r)?Zn({hover:o,nodes:a.nodes}):null)})})),(0,s.addDisposer)(e,(0,T.reaction)(()=>`${e.scale}-${e.translateX}-${e.translateY}`,()=>{e.setHoveredNode(null),e.setHoveredEdge(null)},{name:"GraphClearHoverOnViewportChange"}));let n=!0;(0,s.addDisposer)(e,(0,T.autorun)(()=>{let{scale:o}=e,r=ho(e);if(n){n=!1;return}let a=(0,T.untracked)(()=>e.builtViewport);a?.scale===o&&oa(a.bounds,r)||e.scheduleViewportDirty()})),(0,s.addDisposer)(e,(0,T.autorun)(()=>{let o=e.currentRenderingBackend,r=e.hoveredNode,a=e.hoveredEdge,i=e.selectedNode;if(Me(e.geometryVersion),o){let c=new Map;i!==null&&c.set(i,Kr),r!==null&&r!==i&&c.set(r,lo),o.setNodeHighlights(c),o.setEdgeHighlight(a,lo),e.renderNow()}}))}e.attachRenderingBackend(t,()=>({upload:n=>{n.resize(e.width,e.canvasHeight);let o=e.nodeById;if(e.nodePositions&&e.graph&&o){Me(e.viewportDirty,e.positionsVersion);let r=performance.now(),a=(0,T.untracked)(()=>na(ho(e),Jr)),i=Ot({nodePositions:e.nodePositions,graph:e.graph,nodeById:o,colorScheme:e.effectiveColorScheme,contigThickness:e.contigThickness,connectorThickness:e.connectorThickness,drawPaths:e.effectiveDrawPaths,nodeWidth:e.nodeWidth,highlight:e.walkHighlight,axis:(0,T.untracked)(()=>e.axisScale),linearLayout:e.linearLayout,viewportBounds:a,referenceRamp:e.referenceRamp,deletions:e.deletionEdgeIndexes,hiddenEdges:e.hiddenEdgeIndexes,version:e.positionsVersion});return n.uploadGeometry(i),e.setGeometryMetrics(performance.now()-r,i.nodeStrokes.length,{scale:(0,T.untracked)(()=>e.scale),bounds:a}),!0}return!1},render:n=>{if(!e.nodePositions)return!1;let o=(0,xo.getDpr)();return n.updateTransform({scaleX:e.scaleX*o,scaleY:e.scaleY*o,translateX:e.translateX*o,translateY:e.translateY*o,dpr:o}),n.render(e.darkMode?[.12,.12,.12,1]:[1,1,1,1]),!0}}))}})).actions(e=>({switchLayout(t){return e.setLayoutMode(t),e.recomputeLayout()},retryLoad(){e.loadedTrackId&&e.loadedRegion?e.reloadSubgraph():e.gfaLocation&&e.loadGFAFromLocation(e.gfaLocation)},afterAttach(){e.isDefaultViewport||(e.viewportOwner="user"),e.gfaLocation&&!e.graph&&e.loadGFAFromLocation(e.gfaLocation),e.refetchIfNeeded()}})).actions(e=>({showInLinearView(t){let n=(0,G.getSession)(e),o=t.assembly===e.loadedRegion?.assemblyName,r=oo({session:n,location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId,tracks:io({session:n,assemblyName:t.assembly,first:e.loadedTrackId&&o?e.loadedTrackId:void 0})});o&&e.pairWithLinearView(r)},highlightInLinearView(t){ro({session:(0,G.getSession)(e),location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId})},showSyntenyView(t){ao({session:(0,G.getSession)(e),contributors:e.launchableAssemblies,trackId:t,graphTrackId:e.loadedTrackId||void 0})}})).views(e=>({get syntenyLaunchTracks(){let t=e.launchableAssemblies.map(n=>n.sample);return t.length>=2?co((0,G.getSession)(e),t):[]}})).views(e=>({menuItems(){let t=[];for(let n of Wt({contributors:e.launchableAssemblies,syntenyTracks:e.syntenyLaunchTracks,onShowLinear:o=>{e.showInLinearView(o)},onShowSynteny:o=>{e.showSyntenyView(o)}}))(0,yo.pushLaunchViewMenuItem)(t,n);return t}}))}var da=(0,Ro.defineLaunchKeys)()({});function Ze(e){e.addViewType(()=>new Lo.default({name:"GraphGenomeView",displayName:"Graph genome view",stateModel:oe(),launchKeys:da,ReactComponent:(0,So.lazy)(()=>import("./chunks/GraphGenomeView-WPKSNN4I.js"))}))}function Qe(e){e.addToExtensionPoint("LaunchView-GraphGenomeView",t=>{let{session:n,...o}=t;return n.addView("GraphGenomeView",o),t})}var Ho=y(ae(),1),Do=y(Go(),1);var Ao=y(B(),1),Io=y(To(),1),et=y(D(),1);function Po(){return(0,Ao.ConfigurationSchema)("LinearGraphDisplay",{layoutMode:{type:"stringEnum",model:et.types.enumeration("LayoutMode",ge),defaultValue:"auto"},colorScheme:{type:"stringEnum",model:et.types.enumeration("ColorScheme",ce),defaultValue:"auto"},...(0,Io.trackHeightConfigSchemaFields)({defaultHeight:300,height:"the most the track takes; a layout shorter than it takes only what it needs"})},{explicitlyTyped:!0,explicitIdentifier:"displayId"})}var Bo=y(ae(),1),j=y(B(),1),Fo=y(q(),1),Te=y(re(),1),Vo=y(vo(),1),H=y(D(),1);var tt=y($e(),1);var ca=(0,Bo.lazy)(()=>import("./chunks/GraphSettingsDialog-KQK4YZN5.js"));function Eo(e){let t=oe();return H.types.compose("LinearGraphDisplay",Fo.BaseDisplay,(0,Vo.default)(),H.types.model({type:H.types.literal("LinearGraphDisplay"),configuration:(0,j.ConfigurationReference)(e),pane:H.types.optional(t,()=>({type:"GraphGenomeView"})),configured:H.types.optional(H.types.frozen(),{})})).preProcessSnapshot(n=>{let{pane:o,configured:r}=n;return o?{...n,configured:{layoutMode:o.layoutMode!==void 0,colorScheme:o.colorScheme!==void 0,height:o.paneHeight!==void 0,...r},pane:o.type===void 0?{type:"GraphGenomeView",...o}:o}:n}).views(n=>({get host(){let o;try{o=(0,Te.getContainingView)(n)}catch{return}return ye(o)?o:void 0},get trackId(){return(0,j.getConf)(n.parentTrack,"trackId")}})).views(n=>({trackMenuItems(){let{pane:o}=n,{graph:r}=o,a=o.walkChoices;return[{label:"Layout",subMenu:Ct.map(i=>({type:"radio",label:i.label,checked:o.layoutMode===i.value,disabled:r?!i.available(r):!1,onClick:()=>{o.switchLayout(i.value)}}))},{label:"Color",subMenu:Rt.map(i=>({type:"radio",label:i.label,checked:o.colorScheme===i.value,onClick:()=>{o.setColorScheme(i.value)}}))},...a.length>0?[{label:"Walk",subMenu:[{type:"radio",label:"None",checked:o.highlightedPath==="",onClick:()=>{o.setHighlightedPath("")}},...a.map(i=>({type:"radio",label:i.label,checked:o.highlightedPath===i.name,onClick:()=>{o.setHighlightedPath(i.name)}}))]}]:[],...o.hostPlacesX?[]:[{label:"Zoom in",onClick:()=>{o.zoom(1.5,o.width/2,o.canvasHeight/2)}},{label:"Zoom out",onClick:()=>{o.zoom(1/1.5,o.width/2,o.canvasHeight/2)}},{label:"Zoom to fit",onClick:()=>{o.zoomToFit()}}],{type:"checkbox",label:"Mark bubbles",checked:o.showBubbles,onClick:()=>{o.setShowBubbles(!o.showBubbles)}},{type:"checkbox",label:"Show deletion edges",checked:o.showDeletionEdges,onClick:()=>{o.setShowDeletionEdges(!o.showDeletionEdges)}},{type:"checkbox",label:"Genes on the backbone",checked:o.showGenes,onClick:()=>{o.setShowGenes(!o.showGenes)}},{label:"Settings",icon:Yt,onClick:()=>{(0,Te.getSession)(n).queueDialog(i=>[ca,{model:o,open:!0,onClose:i}])}}]}})).actions(n=>({applyConfig(){let{pane:o,configured:r}=n;r.layoutMode||o.setLayoutMode((0,j.getConf)(n,"layoutMode")),r.colorScheme||o.setColorScheme((0,j.getConf)(n,"colorScheme")),r.height||o.setPaneHeight((0,j.getConf)(n,"height")),n.configured={layoutMode:!0,colorScheme:!0,height:!0}},resizeHeight(o){let r=n.height,a=Math.max(r+o,40);return n.pane.setPaneHeight(a),a-r}})).actions(n=>({afterAttach(){let{pane:o}=n;n.applyConfig(),o.adoptTrack(n.trackId),o.startHosting(),(0,H.addDisposer)(n,(0,tt.autorun)(()=>{let{host:r}=n;r&&(o.setWidth(r.width),o.pairWithLinearView(r.id))},{name:"LinearGraphDisplayHost"})),(0,H.addDisposer)(n,(0,tt.autorun)(()=>{let r=o.canvasHeight;n.height!==r&&n.setHeight(r)},{name:"LinearGraphDisplayHeight"}))}}))}function nt(e){e.addDisplayType(()=>{let t=Po();return new Do.default({name:"LinearGraphDisplay",displayName:"Graph",configSchema:t,stateModel:Eo(t),trackType:["FeatureTrack","SyntenyTrack"],viewType:"LinearGenomeView",ReactComponent:(0,Ho.lazy)(()=>import("./chunks/LinearGraphDisplay-7POYIRIB.js"))})})}var _o=y(fe(),1);var ot=y(B(),1),Oo=y(D(),1);function rt(e){let{uri:t,baseUri:n,csi:o}=e;return typeof t=="string"?{...e,bubblesLocation:{uri:t,baseUri:n},index:{indexType:o?"CSI":"TBI",location:{uri:`${t}.${o?"csi":"tbi"}`,baseUri:n}}}:e}var ua=(0,ot.ConfigurationSchema)("MinigraphBubbleAdapter",{bubblesLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.bb.bed.gz",locationType:"UriLocation"}},index:(0,ot.ConfigurationSchema)("MinigraphBubbleIndex",{indexType:{model:Oo.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.bb.bed.gz.tbi",locationType:"UriLocation"}}}),assemblyNameToPanSN:{type:"frozen",defaultValue:{}}},{explicitlyTyped:!0,preProcessSnapshot:rt}),$o=ua;function at(e){e.addAdapterType(()=>new _o.default({name:"MinigraphBubbleAdapter",displayName:"Minigraph bubble BED adapter",normalizeSnapshot:rt,configSchema:$o,adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/MinigraphBubbleAdapter-FJIBTKQY.js").then(t=>t.default)}))}var Xo=y(fe(),1);var Ie=y(B(),1),Wo=y(D(),1);function jo(e,t,n){return{indexType:n?"CSI":"TBI",location:{uri:`${e}.${n?"csi":"tbi"}`,baseUri:t}}}function zo(e){let{uri:t,baseUri:n,csi:o}=e;return typeof t=="string"?{...e,segmentsLocation:{uri:`${t}.segs.bed.gz`,baseUri:n},segmentsIndex:jo(`${t}.segs.bed.gz`,n,o),linksLocation:{uri:`${t}.links.bed.gz`,baseUri:n},linksIndex:jo(`${t}.links.bed.gz`,n,o)}:e}function it(e){let{coarse:t,baseUri:n}=e;return zo(typeof t=="object"&&t!==null?{...e,coarse:zo({baseUri:n,...t})}:e)}var Ae=(e,t)=>(0,Ie.ConfigurationSchema)(e,{indexType:{model:Wo.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:t,locationType:"UriLocation"}}}),pa=(0,Ie.ConfigurationSchema)("RgfaTabixCoarseTier",{aboveBpPerPx:{type:"maybeNumber"},segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.tier.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:Ae("RgfaCoarseSegmentsIndex","/path/to/graph.tier.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.tier.links.bed.gz",locationType:"UriLocation"}},linksIndex:Ae("RgfaCoarseLinksIndex","/path/to/graph.tier.links.bed.gz.tbi")}),ma=(0,Ie.ConfigurationSchema)("RgfaTabixAdapter",{segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:Ae("RgfaSegmentsIndex","/path/to/graph.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.links.bed.gz",locationType:"UriLocation"}},linksIndex:Ae("RgfaLinksIndex","/path/to/graph.links.bed.gz.tbi"),assemblyNameToPanSN:{type:"frozen",defaultValue:{}},coarse:pa},{explicitlyTyped:!0,preProcessSnapshot:it}),Yo=ma;function st(e){e.addAdapterType(()=>new Xo.default({name:"RgfaTabixAdapter",displayName:"Indexed rGFA adapter",normalizeSnapshot:it,configSchema:Yo,adapterCapabilities:["getSubgraph"],adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/RgfaTabixAdapter-7ZGKJJYW.js").then(t=>t.default)}))}var Ko=y(re(),1),qo=y(ir(),1),ct=y(ar(),1),Jo=y(cr(),1);function dt(e){return typeof e=="object"&&e!==null}function ga(e){let t;if(dt(e)){let{refName:n,start:o,end:r,assemblyName:a}=e;typeof n=="string"&&typeof o=="number"&&typeof r=="number"&&(t={refName:n,start:o,end:r,assemblyName:typeof a=="string"?a:void 0})}return t}function la(e,t,n){let o=e.connectedViewId;return o===void 0||o===t||!n.has(o)}function ha(e,t){return e.assemblyName===void 0||t===void 0||t.includes(e.assemblyName)}function Uo(e,t,n){let o=[],r=new Set(te(e).map(a=>dt(a)?a.id:void 0));for(let a of e)if(dt(a)&&a.type==="GraphGenomeView"&&la(a,t,r)){let i=ga(a.hoverHighlight);i&&ha(i,n)&&o.push({key:typeof a.id=="string"?a.id:"graph",region:i})}return o}var z=y(X(),1),ba=(0,Jo.makeStyles)()(e=>({highlight:{height:"100%",position:"absolute",background:(0,qo.alpha)(e.palette.primary.main,.25),borderLeft:`2px solid ${e.palette.primary.main}`,borderRight:`2px solid ${e.palette.primary.main}`,pointerEvents:"none",zIndex:10}})),fa=(0,ct.observer)(function({model:t,region:n}){let{classes:o}=ba(),r=t.getHighlightCoords(n);return r?(0,z.jsx)("div",{"data-testid":"graph-node-highlight",className:o.highlight,style:{left:r.left,width:r.width}}):null}),ya=(0,ct.observer)(function({model:t}){let{views:n}=(0,Ko.getSession)(t);return(0,z.jsx)(z.Fragment,{children:Uo([...n],t.id,t.assemblyNames).map(({key:o,region:r})=>(0,z.jsx)(fa,{model:t,region:r},`graph-hover-${o}`))})}),Zo=ya;var Qo=y(X(),1),wa="LinearGenomeView-TracksContainerComponent";function ut(e){e.contributeToExtensionPoint(wa,({model:t})=>(0,Qo.jsx)(Zo,{model:t},"graphgenomeview-hover-highlight"))}var er="GraphGenomeView";var tr="4.0.2";var pt=class extends nr.default{constructor(){super(...arguments);this.name=er;this.version=tr}install(n){Ze(n),nt(n),Qe(n),ut(n),st(n),at(n),Ee(n),He(n),n.addRpcMethod(()=>new Z(n)),n.addRpcMethod(()=>new J(n))}configure(n){try{(0,or.isAbstractMenuManager)(n.rootModel)&&n.rootModel.appendToSubMenu(["Add"],{label:"Graph genome view",icon:Kt,onClick:o=>{o.addView("GraphGenomeView",{})}})}catch(o){console.warn("[GraphGenomeView] could not add the Add menu entry",o)}}};export{pt as default};
|
|
3
3
|
//# sourceMappingURL=jbrowse-plugin-graphgenomeviewer.esm.js.map
|