@apollo-annotation/jbrowse-plugin-apollo 0.3.8 → 0.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/index.esm.js +10932 -10932
  2. package/dist/index.esm.js.map +1 -1
  3. package/dist/jbrowse-plugin-apollo.cjs.development.js +10845 -10846
  4. package/dist/jbrowse-plugin-apollo.cjs.development.js.map +1 -1
  5. package/dist/jbrowse-plugin-apollo.cjs.production.min.js +1 -1
  6. package/dist/jbrowse-plugin-apollo.cjs.production.min.js.map +1 -1
  7. package/dist/jbrowse-plugin-apollo.umd.development.js +18619 -21342
  8. package/dist/jbrowse-plugin-apollo.umd.development.js.map +1 -1
  9. package/dist/jbrowse-plugin-apollo.umd.production.min.js +1 -1
  10. package/dist/jbrowse-plugin-apollo.umd.production.min.js.map +1 -1
  11. package/package.json +7 -7
  12. package/src/ApolloInternetAccount/model.ts +81 -63
  13. package/src/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.ts +4 -4
  14. package/src/ApolloSequenceAdapter/ApolloSequenceAdapter.ts +9 -7
  15. package/src/BackendDrivers/CollaborationServerDriver.ts +49 -18
  16. package/src/BackendDrivers/DesktopFileDriver.ts +2 -2
  17. package/src/ChangeManager.ts +3 -1
  18. package/src/FeatureDetailsWidget/BasicInformation.tsx +6 -4
  19. package/src/FeatureDetailsWidget/NumberTextField.tsx +5 -2
  20. package/src/FeatureDetailsWidget/TranscriptWidgetEditLocation.tsx +39 -203
  21. package/src/LinearApolloDisplay/components/CheckResultWarnings.tsx +92 -0
  22. package/src/LinearApolloDisplay/components/LinearApolloDisplay.tsx +6 -102
  23. package/src/LinearApolloDisplay/glyphs/GeneGlyph.ts +31 -230
  24. package/src/LinearApolloDisplay/glyphs/util.ts +19 -0
  25. package/src/LinearApolloReferenceSequenceDisplay/drawSequenceOverlay.ts +181 -0
  26. package/src/LinearApolloReferenceSequenceDisplay/drawSequenceTrack.ts +218 -0
  27. package/src/LinearApolloReferenceSequenceDisplay/stateModel/rendering.ts +62 -386
  28. package/src/LinearApolloSixFrameDisplay/components/LinearApolloSixFrameDisplay.tsx +6 -0
  29. package/src/LinearApolloSixFrameDisplay/glyphs/GeneGlyph.ts +122 -70
  30. package/src/components/AddAssembly.tsx +33 -37
  31. package/src/components/AddFeature.tsx +21 -18
  32. package/src/components/AddRefSeqAliases.tsx +56 -42
  33. package/src/components/CopyFeature.tsx +1 -1
  34. package/src/components/CreateApolloAnnotation.tsx +22 -10
  35. package/src/components/DeleteAssembly.tsx +2 -9
  36. package/src/components/DownloadGFF3.tsx +2 -2
  37. package/src/components/ManageChecks.tsx +2 -9
  38. package/src/components/ManageUsers.tsx +23 -22
  39. package/src/components/OntologyTermAutocomplete.tsx +1 -8
  40. package/src/components/ViewChangeLog.tsx +25 -50
  41. package/src/components/ViewCheckResults.tsx +1 -7
  42. package/src/config.ts +3 -3
  43. package/src/index.ts +17 -16
  44. package/src/makeDisplayComponent.tsx +9 -13
  45. package/src/session/ClientDataStore.ts +32 -14
  46. package/src/session/session.ts +19 -27
  47. package/src/util/glyphUtils.ts +178 -1
  48. package/src/util/loadAssemblyIntoClient.ts +3 -2
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@apollo-annotation/common"),t=require("@apollo-annotation/shared"),n=require("@jbrowse/core/Plugin"),a=require("@jbrowse/core/configuration"),o=require("@jbrowse/core/pluggableElementTypes"),r=require("@jbrowse/core/util"),l=require("@mui/icons-material/Add"),s=require("@mui/material"),i=require("mobx"),c=require("mobx-state-tree"),u=require("socket.io-client"),d=require("@mui/icons-material/AdminPanelSettings"),f=require("@mui/icons-material/Delete"),m=require("@mui/icons-material/Input"),g=require("@mui/icons-material/Person"),p=require("@mui/icons-material/Rule"),h=require("@mui/icons-material/Info"),y=require("@mui/icons-material/Link"),b=require("@mui/icons-material/RadioButtonChecked"),S=require("@mui/icons-material/RadioButtonUnchecked"),w=require("bson-objectid"),E=require("react"),C=require("tss-react/mui"),v=require("@gmod/gff"),x=require("@mui/x-data-grid"),T=require("@jbrowse/core/ui"),A=require("@mui/icons-material/Close"),F=require("mobx-react"),k=require("@jbrowse/core/util/types/mst"),D=require("idb/with-async-ittr"),N=require("@jbrowse/core/util/aborting"),R=require("jsonpath"),I=require("@jbrowse/core/util/io"),M=require("fast-deep-equal/es6"),L=require("file-saver"),q=require("@mui/material/Checkbox"),P=require("@mui/material/FormControlLabel"),O=require("@mui/material/LinearProgress"),_=require("nanoid"),B=require("@mui/icons-material/AccountCircle"),U=require("@jbrowse/core/pluggableElementTypes/AdapterType"),$=require("@jbrowse/core/data_adapters/BaseAdapter"),j=require("@jbrowse/core/util/rxjs"),G=require("@jbrowse/core/util/simpleFeature"),W=require("@jbrowse/core/TextSearch/BaseResults"),z=require("@mui/icons-material/ExpandMore"),H=require("@mui/icons-material/Edit"),V=require("@mui/icons-material/MoreHoriz"),J=require("@mui/icons-material/AddBox"),X=require("@apollo-annotation/mst"),K=require("@emotion/styled"),Z=require("@mui/icons-material/ContentCopy"),Y=require("@mui/icons-material/ContentCut"),Q=require("@mui/icons-material/Remove"),ee=require("@mui/icons-material/Clear"),te=require("@mui/icons-material/UnfoldLess"),ne=require("@mui/icons-material/SkipNextRounded"),ae=require("@mui/icons-material/SkipPreviousRounded"),oe=require("@jbrowse/core/util/tracks"),re=require("@mui/icons-material/ExpandLess"),le=require("@mui/icons-material/Error"),se=require("@mui/icons-material/Lock"),ie=require("@mui/icons-material/Download"),ce=require("@mui/icons-material/FactCheck"),ue=require("@mui/icons-material/FileOpen"),de=require("@mui/icons-material/Logout"),fe=require("@mui/icons-material/Redo"),me=require("@mui/icons-material/TrackChanges"),ge=require("@mui/icons-material/Undo"),pe=require("@mui/icons-material/Save");function he(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var ye=he(n),be=he(l),Se=he(d),we=he(f),Ee=he(m),Ce=he(g),ve=he(p),xe=he(h),Te=he(y),Ae=he(b),Fe=he(S),ke=he(w),De=he(E),Ne=he(v),Re=he(A),Ie=he(R),Me=he(M),Le=he(q),qe=he(P),Pe=he(O),Oe=he(B),_e=he(U),Be=he(G),Ue=he(W),$e=he(z),je=he(H),Ge=he(V),We=he(J),ze=he(K),He=he(Z),Ve=he(Y),Je=he(Q),Xe=he(ee),Ke=he(te),Ze=he(ne),Ye=he(ae),Qe=he(re),et=he(le),tt=he(se),nt=he(ie),at=he(ce),ot=he(ue),rt=he(de),lt=he(fe),st=he(me),it=he(ge),ct=he(pe);const ut=a.ConfigurationSchema("ApolloInternetAccount",{baseURL:{description:"Location of Apollo server",type:"string",defaultValue:""},tokenType:{description:"A custom name for a token to include in the header",type:"string",defaultValue:"Bearer"}},{baseConfiguration:o.BaseInternetAccountConfig,explicitlyTyped:!0});async function dt(e,n,a){const o=Ne.default.parseStringSync(n,{parseSequences:!0,parseComments:!0,parseDirectives:!1,parseFeatures:!0});if(0===o.length)throw new Error("No features found in GFF3 file");let r=0,l=a.assemblies.get(e);l||(l=a.addAssembly(e,"InMemoryFileDriver"));for(const e of o)if(Array.isArray(e)){const n=t.gff3ToAnnotationFeature(e),a=l.refSeqs.get(n.refSeq)??l.addRefSeq(n.refSeq,n.refSeq);a.features.has(n._id)||a.addFeature(n)}else if("comment"in e)l.addComment(e.comment);else{r++;let t=l.refSeqs.get(e.id);t||(t=l.addRefSeq(e.id,e.id,e.description)),e.description&&!t.description&&t.setDescription(e.description),t.addSequence({start:0,stop:e.sequence.length,sequence:e.sequence})}if(0===r)throw new Error("No embedded FASTA section found in GFF3");const s=await ft(l);return a.addCheckResults(s),l}async function ft(t){const n=[];for(const a of t.refSeqs.values())for(const t of a.features.values())for(const o of e.checkRegistry.getChecks().values()){const e=await o.checkFeature(c.getSnapshot(t),((e,t)=>Promise.resolve(a.getSequence(e,t))));n.push(...e)}return n}function mt(e){const{attributes:t}=e,n=t.get("gff_name");return n?n[0]:""}function gt(e){const{attributes:t}=e,n=t.get("gff_id"),a=t.get("transcript_id"),o=t.get("exon_id"),r=t.get("protein_id");return n?n[0]:a?a[0]:o?o[0]:r?r[0]:""}function pt(e){const t=mt(e),n=gt(e);return t?`: ${t}`:n?`: ${n}`:""}function ht(e,t,n=!1){const a=[];a.push(e);for(const t of function(e){const t=[];let{parent:n}=e;for(;n;)t.push(n),({parent:n}=n);return t}(e))a.push(t);const o=function(e){const t=[];if(e.children)for(const[,n]of e.children)t.push(n);return t}(e);for(const e of o)e.min<t&&e.max>=t&&a.push(e);if(!n)return a;if(e.parent){const n=e.parent.children;if(n)for(const[,o]of n)o._id!=e._id&&o.min<t&&o.max>=t&&a.push(o)}return a}function yt(e,t,n,a){const o=a.bpToPx({refName:t,coord:e.min,regionNumber:n}),r=a.bpToPx({refName:t,coord:e.max,regionNumber:n});if(void 0===o||void 0===r)return;const{offsetPx:l}=a;return[o.offsetPx-l,r.offsetPx-l]}function bt(e,t,n){const[a,o]=n;if(!(Math.abs(o-a)<8))return Math.abs(a-t)<4?{feature:e,edge:"min"}:Math.abs(o-t)<4?{feature:e,edge:"max"}:void 0}function St(e,t){return Boolean(t&&e._id===t._id)}function wt(e,t){return!!t&&(e._id===t._id||e.hasDescendant(t._id))}function Et(e){let t;t=e.attributes.get("gff_name")?e.attributes.get("gff_name")?.join(","):e.attributes.get("gff_id")?e.attributes.get("gff_id")?.join(","):e._id;const n=`(${(e.min+1).toLocaleString("en")}..${e.max.toLocaleString("en")})`;if(t&&t.length+n.length>65){const e=60-n.length;t=e>0?t.slice(0,e):"",t=`${t}[...]`}return`${t} ${n}`}function Ct(e,t){const{apolloInternetAccount:n,changeManager:a,regions:o,selectedFeature:r,session:l}=e,s=[],i=n?n.role:"admin",c="admin"===i,u=!(i&&["admin","user"].includes(i)),[d]=o,f=e.getAssemblyId(d.assemblyName),m=e.getAssemblyId(d.assemblyName);return s.push({label:Et(t),type:"subHeader"},{label:"Add child feature",disabled:u,onClick:()=>{l.queueDialog((e=>[fn,{session:l,handleClose:()=>{e()},changeManager:a,sourceFeature:t,sourceAssemblyId:f,internetAccount:n}]))}},{label:"Copy features and annotations",disabled:u,onClick:()=>{l.queueDialog((e=>[yn,{session:l,handleClose:()=>{e()},changeManager:a,sourceFeature:t,sourceAssemblyId:m}]))}},{label:"Delete feature",disabled:!c,onClick:()=>{l.queueDialog((n=>[Sn,{session:l,handleClose:()=>{n()},changeManager:a,sourceFeature:t,sourceAssemblyId:m,selectedFeature:r,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}}),s}function vt(e,t,n){const a=(e.max-e.min)*t,o=Math.max(e.min-a,1),r=Math.min(e.max+a,n);return{refName:e.refSeq,start:o,end:r}}function xt(e,t,n){const a=[{featureId:e._id,oldLocation:e[n],newLocation:t}],{parent:o}=e;return o&&("min"===n&&o[n]>t||"max"===n&&o[n]<t)&&a.push(...xt(o,t,n)),a}function Tt(e,t,n,a,o){const r=e._id,l=[{featureId:r,oldLocation:e[n],newLocation:t}],{parent:s,children:i}=e;if(i)for(const[,e]of i)e._id!==o&&("min"===n&&e[n]<t||"max"===n&&e[n]>t)&&l.push(...Tt(e,t,n,a));if(s&&a){const e=[];if(s.children)for(const[,t]of s.children)t._id!==r&&e.push(t);if(0===e.length)l.push(...Tt(s,t,n,a,r));else{const o=s[n],i=Math[n](...e.map((e=>e[n])),t);i!==o&&l.push(...Tt(s,i,n,a,r))}}return l}function At(e,t,n,a=!1){const o=e[n];if(t===o)throw new Error(`New and existing locations are the same: "${t}"`);return"min"===n?t>o?Tt(e,t,n,a):xt(e,t,n):t<o?Tt(e,t,n,a):xt(e,t,n)}function Ft(e){return"feature"in e}function kt(e,t){const n=e.currentTarget,{clientX:a,clientY:o}=e,{left:r,top:l}=n.getBoundingClientRect(),s=a-r,i=o-l,{coord:c,index:u,refName:d}=t.pxToBp(s);return{x:s,y:i,refName:d,bp:c,regionNumber:u}}async function Dt(e,t){let n;try{n=await e.text()}catch{n=""}return`${t?`${t} — `:""}${e.status} ${e.statusText}${n?` (${n})`:""}`}const Nt=C.makeStyles()((e=>({dialogTitle:{background:e.palette.primary.main,color:e.palette.primary.contrastText,padding:e.spacing(2)},closeButton:{position:"absolute",right:e.spacing(1),top:e.spacing(1.5),color:e.palette.primary.contrastText}}))),Rt=F.observer((function(e){const{classes:t}=Nt(),{handleClose:n,title:a,...o}=e;return De.default.createElement(T.Dialog,{...o,header:De.default.createElement(De.default.Fragment,null,De.default.createElement(s.DialogTitle,{className:t.dialogTitle},a),De.default.createElement(s.IconButton,{"aria-label":"close",onClick:n,className:t.closeButton},De.default.createElement(Re.default,null)))})}));var It;!function(e){e.GFF3="text/x-gff3",e.FASTA="text/x-fasta",e.BGZIP_FASTA="application/x-bgzip-fasta",e.FAI="text/x-fai",e.GZI="application/x-gzi",e.EXTERNAL="text/x-external"}(It||(It={}));const Mt=C.makeStyles()((e=>({accordion:{border:`1px solid ${e.palette.divider}`,"&:not(:last-child)":{borderBottom:0}},accordionSummary:{flexDirection:"row-reverse"},accordionDetails:{padding:e.spacing(2),borderTop:"1px solid rgba(0, 0, 0, .125)"},radioIcon:{color:e.palette.tertiary.contrastText},dialog:{minWidth:550,maxWidth:800}})));function Lt(e,t,n,a,o,r,l,s,i){return!(!e||!(t&&a||n===It.GFF3&&a||a&&o&&r||l&&s&&i))}function qt({changeManager:e,handleClose:n,session:o}){const{classes:r}=Mt(),{internetAccounts:l}=c.getRoot(o),{notify:i}=o,u=l.filter((e=>"ApolloInternetAccount"===e.type));if(0===u.length)throw new Error("No Apollo internet account found");const[d,f]=E.useState(""),[m,g]=E.useState(""),[p,h]=E.useState(!1),[y,b]=E.useState(It.BGZIP_FASTA),[S,w]=E.useState(!0),[C,v]=E.useState(!1),[x,T]=E.useState(!1),[A,F]=E.useState(null),[k,D]=E.useState(null),[N,R]=E.useState(null),[I,M]=E.useState(""),[L,q]=E.useState(""),[P,O]=E.useState(""),[_,B]=E.useState(!1),[U,$]=E.useState(!1);async function j(e,t){const{jobsManager:n}=o,a=new AbortController,[{baseURL:r,getFetcher:l}]=u,s=new URL("files",r);s.searchParams.set("type",t);const i=s.href,c=new FormData;let f=e.name;t===It.FAI||t===It.GZI?f=`${f}.txt`:U&&!e.name.toLocaleLowerCase().endsWith(".gz")?f=`${f}.gz`:!U&&e.name.toLocaleLowerCase().endsWith(".gz")&&(f=`${f}.txt`),c.append("file",e,f),c.append("type",t);const m=l({locationType:"UriLocation",uri:i});if(m){const t={name:`UploadAssemblyFile for ${d}`,statusMessage:"Pre-validating",progressPct:0,cancelCallback:()=>{a.abort(),n.abortJob(t.name)}};n.runJob(t),n.update(t.name,`Uploading ${e.name}, this may take awhile`);const{signal:o}=a,r=await m(i,{method:"POST",body:c,signal:o});if(!r.ok){const e=await Dt(r,"Error when inserting new assembly (while uploading file)");return n.abortJob(t.name,e),g(e),""}const l=(await r.json())._id;return n.done(t),l}throw new Error("Failed to fetch")}E.useEffect((()=>{q(I?`${I}.fai`:"")}),[I]),E.useEffect((()=>{O(I?`${I}.gzi`:"")}),[I]),E.useEffect((()=>{$(!C&&y!==It.GFF3||!!A?.name.toLocaleLowerCase().endsWith(".gz"))}),[A,C,y]);let G=!1;try{const e=new URL(I);"http:"!==e.protocol&&"https:"!==e.protocol||(G=!0)}catch{}let W=!1;try{const e=new URL(L);"http:"!==e.protocol&&"https:"!==e.protocol||(W=!0)}catch{}let z=!1;try{const e=new URL(P);"http:"!==e.protocol&&"https:"!==e.protocol||(z=!0)}catch{}const[H,V]=De.default.useState("panelFastaInput"),J=e=>(t,n)=>{n&&V(e),$("panelGffInput"!==e)};return De.default.createElement(Rt,{open:!0,handleClose:n,"data-testid":"add-assembly-dialog",title:"Add new assembly",maxWidth:!1},De.default.createElement("form",{onSubmit:async function(a){let o;if(a.preventDefault(),g(""),T(!0),B(!0),i(`Assembly "${d}" is being added`,"info"),n(),a.preventDefault(),y===It.EXTERNAL)o=new t.AddAssemblyFromExternalChange({typeName:"AddAssemblyFromExternalChange",assembly:(new ke.default).toHexString(),assemblyName:d,externalLocation:{fa:I,fai:L,gzi:P}});else{if(!A)throw new Error("Missing fasta file");if(y===It.GFF3&&S){const e=await j(A,It.GFF3);o=new t.AddAssemblyAndFeaturesFromFileChange({typeName:"AddAssemblyAndFeaturesFromFileChange",assembly:(new ke.default).toHexString(),assemblyName:d,fileIds:{fa:e}})}else if(y===It.GFF3){const e=await j(A,It.GFF3);o=new t.AddAssemblyFromFileChange({typeName:"AddAssemblyFromFileChange",assembly:(new ke.default).toHexString(),assemblyName:d,fileIds:{fa:e}})}else if(C){const e=await j(A,It.FASTA);o=new t.AddAssemblyFromFileChange({typeName:"AddAssemblyFromFileChange",assembly:(new ke.default).toHexString(),assemblyName:d,fileIds:{fa:e}})}else{if(!k||!N)throw new Error("Missing fasta index files");const e=await j(A,It.BGZIP_FASTA),n=await j(k,It.FAI),a=await j(N,It.GZI);o=new t.AddAssemblyFromFileChange({typeName:"AddAssemblyFromFileChange",assembly:(new ke.default).toHexString(),assemblyName:d,fileIds:{fa:e,fai:n,gzi:a}})}}const[{internetAccountId:r}]=u;await e.submit(o,{internetAccountId:r,updateJobsManager:!0}),T(!1),B(!1)},"data-testid":"submit-form"},De.default.createElement(s.DialogContent,{className:r.dialog},_?De.default.createElement(s.LinearProgress,null):null,De.default.createElement(s.TextField,{margin:"dense",id:"name",label:"Assembly name",type:"TextField",fullWidth:!0,variant:"outlined",onChange:e=>{T(!1),f(e.target.value),function(e){const{assemblies:t}=o;t.find((t=>a.readConfObject(t,"displayName")===e))?(h(!1),g(`Assembly ${e} already exists.`)):(h(!0),g(""))}(e.target.value)},disabled:x&&!m}),De.default.createElement(s.Accordion,{disableGutters:!0,elevation:0,square:!0,className:r.accordion,expanded:"panelFastaInput"===H,onChange:J("panelFastaInput")},De.default.createElement(s.AccordionSummary,{className:r.accordionSummary,expandIcon:"panelFastaInput"===H?De.default.createElement(Ae.default,{className:r.radioIcon,sx:{fontSize:"1.2rem",ml:5}}):De.default.createElement(Fe.default,{className:r.radioIcon,sx:{fontSize:"1.2rem",mr:5}}),"aria-controls":"panelFastaInputd-content",id:"panelFastaInputd-header"},De.default.createElement(s.Typography,{component:"span"},"FASTA input")),De.default.createElement(s.AccordionDetails,{className:r.accordionDetails},De.default.createElement(s.FormGroup,null,De.default.createElement(s.FormControlLabel,{"data-testid":"files-on-url-checkbox",control:De.default.createElement(s.Checkbox,{onChange:()=>{b(y===It.EXTERNAL?It.BGZIP_FASTA:It.EXTERNAL),y===It.EXTERNAL&&v(!1)},checked:y===It.EXTERNAL,disabled:C&&y!==It.GFF3}),label:De.default.createElement(s.Box,{display:"flex",alignItems:"center"},"Use external URLs",De.default.createElement(s.Tooltip,{title:"Use external URLs to provide FASTA and index files. Does not copy the files to the Apollo collaboration server, so ensure the URLs are stable.",placement:"top-start"},De.default.createElement(s.IconButton,{size:"small"},De.default.createElement(xe.default,{sx:{fontSize:18}}))))}),De.default.createElement(s.FormControlLabel,{"data-testid":"sequence-is-editable-checkbox",control:De.default.createElement(s.Checkbox,{onChange:()=>{v(!C)}}),checked:C,disabled:y===It.EXTERNAL,label:De.default.createElement(s.Box,{display:"flex",alignItems:"center"},"Store sequence in database",De.default.createElement(s.Tooltip,{title:"Enables users to edit the genomic sequence, but comes with performance impacts. Use with care.",placement:"top-start"},De.default.createElement(s.IconButton,{size:"small"},De.default.createElement(xe.default,{sx:{fontSize:18}}))))}),De.default.createElement(s.FormControlLabel,{"data-testid":"fasta-is-gzip-checkbox",control:De.default.createElement(s.Checkbox,{checked:U,onChange:()=>{$(!C||!U)},disabled:!C}),label:"FASTA is gzip compressed"}),De.default.createElement(s.Table,{size:"small",sx:{mt:2}},y===It.BGZIP_FASTA||y===It.GFF3?De.default.createElement(s.TableBody,null,De.default.createElement(s.TableRow,null,De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},De.default.createElement(s.Box,{display:"flex",alignItems:"center"},De.default.createElement("span",null,"FASTA"),De.default.createElement(s.Tooltip,{title:'Unless "Store sequence in database" enabled, FASTA input must be compressed with bgzip and indexed with samtools faidx (or equivalent). Compression is optional for sequences stored in the database.'},De.default.createElement(s.IconButton,{size:"small"},De.default.createElement(xe.default,{sx:{fontSize:18}}))))),De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},De.default.createElement("input",{"data-testid":"fasta-input-file",type:"file",onChange:e=>{F(e.target.files?.item(0)??null)},disabled:x&&!m}))),De.default.createElement(s.TableRow,null,De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},"FASTA index (.fai)"),De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},De.default.createElement("input",{"data-testid":"fai-input-file",type:"file",onChange:e=>{D(e.target.files?.item(0)??null)},disabled:x&&!m||C}))),De.default.createElement(s.TableRow,null,De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},"FASTA binary index (.gzi)"),De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},De.default.createElement("input",{"data-testid":"gzi-input-file",type:"file",onChange:e=>{R(e.target.files?.item(0)??null)},disabled:x&&!m||C})))):De.default.createElement(s.TableBody,null,De.default.createElement(s.TableRow,null,De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},De.default.createElement(s.Box,{display:"flex",alignItems:"center"},De.default.createElement("span",null,"FASTA"),De.default.createElement(s.Tooltip,{title:"Remote FASTA input must be compressed with bgzip and indexed with samtools faidx (or equivalent)"},De.default.createElement(s.IconButton,{size:"small"},De.default.createElement(xe.default,{sx:{fontSize:18}}))))),De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},De.default.createElement(s.TextField,{"data-testid":"fasta-input-url",variant:"outlined",value:I,error:!G,onChange:e=>{M(e.target.value)},disabled:x&&!m,slotProps:{input:{startAdornment:De.default.createElement(s.InputAdornment,{position:"start"},De.default.createElement(Te.default,null))}}}))),De.default.createElement(s.TableRow,null,De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},"FASTA index (.fai)"),De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},De.default.createElement(s.TextField,{"data-testid":"fai-input-url",variant:"outlined",value:L,error:!W,onChange:e=>{q(e.target.value)},disabled:x&&!m,slotProps:{input:{startAdornment:De.default.createElement(s.InputAdornment,{position:"start"},De.default.createElement(Te.default,null))}}}))),De.default.createElement(s.TableRow,null,De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},"FASTA binary index (.gzi)"),De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},De.default.createElement(s.TextField,{"data-testid":"gzi-input-url",variant:"outlined",value:P,error:!z,onChange:e=>{O(e.target.value)},disabled:x&&!m,slotProps:{input:{startAdornment:De.default.createElement(s.InputAdornment,{position:"start"},De.default.createElement(Te.default,null))}}})))))))),De.default.createElement(s.Accordion,{disableGutters:!0,elevation:0,square:!0,className:r.accordion,expanded:"panelGffInput"===H,onChange:J("panelGffInput")},De.default.createElement(s.AccordionSummary,{className:r.accordionSummary,expandIcon:"panelGffInput"===H?De.default.createElement(Ae.default,{className:r.radioIcon,sx:{fontSize:"1.2rem",ml:5}}):De.default.createElement(Fe.default,{className:r.radioIcon,sx:{fontSize:"1.2rem",mr:5}}),"aria-controls":"panelGffInputd-content"},De.default.createElement(s.Typography,{component:"span"},"GFF3 input",De.default.createElement(s.Tooltip,{title:"GFF3 must includes FASTA sequences. File can be gzip compressed."},De.default.createElement(xe.default,{className:r.radioIcon,sx:{fontSize:18}})))),De.default.createElement(s.AccordionDetails,{className:r.accordionDetails},De.default.createElement(s.Box,{style:{marginTop:20}},De.default.createElement("input",{"data-testid":"gff3-input-file",type:"file",disabled:x&&!m,onChange:e=>{F(e.target.files?.item(0)??null),b(It.GFF3)}}),De.default.createElement(s.FormGroup,{style:{display:"grid"}},De.default.createElement(s.FormControlLabel,{control:De.default.createElement(s.Checkbox,{checked:S,onChange:()=>{w(!S)},disabled:x&&!m}),label:"Load features from GFF3 file"}),De.default.createElement(s.FormControlLabel,{"data-testid":"gff3-is-gzip-checkbox",control:De.default.createElement(s.Checkbox,{checked:U,onChange:()=>{$(!U)},disabled:x&&!m}),label:"GFF3 is gzip compressed"})))))),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{disabled:!Lt(p,C,y,A,k,N,G,W,z)||x,variant:"contained",type:"submit","data-testid":"submit-button"},x?"Submitting...":"Submit"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Cancel"))),m?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},m)):null)}const Pt=[{field:"name",headerName:"Assembly Name",width:150,editable:!1},{field:"aliases",headerName:"Aliases",width:300,editable:!0}];function Ot({changeManager:e,handleClose:n,session:a}){const{apolloDataStore:o}=a,{collaborationServerDriver:r}=o,l=r.getAssemblies().map((e=>({id:e.name,name:e.displayName,aliases:e.aliases.join(", ")}))),[i,c]=De.default.useState("");return De.default.createElement(Rt,{open:!0,title:"Add assembly aliases",handleClose:n,maxWidth:"sm","data-testid":"add-assembly-alias",fullWidth:!0},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.Box,{sx:{height:400,width:"100%"}},De.default.createElement(x.DataGrid,{rows:l,columns:Pt,initialState:{pagination:{paginationModel:{pageSize:5}}},pageSizeOptions:[5],processRowUpdate:(a,o)=>{const r=new t.AddAssemblyAliasesChange({typeName:"AddAssemblyAliasesChange",assembly:a.id,aliases:a.aliases.split(",")});return e.submit(r).catch((()=>{c("Error submitting change")})),n(),a},disableRowSelectionOnClick:!0}))),i?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},i)):null)}const _t=new Set(["i","me","my","myself","we","our","ours","ourselves","you","your","yours","yourself","yourselves","he","him","his","himself","she","her","hers","herself","it","its","itself","they","them","their","theirs","themselves","what","which","who","whom","this","that","these","those","am","is","are","was","were","be","been","being","have","has","had","having","do","does","did","doing","a","an","the","and","but","if","or","because","as","until","while","of","at","by","for","with","about","against","between","into","through","during","before","after","above","below","to","from","up","down","in","out","on","off","over","under","again","further","then","once","here","there","when","where","why","how","all","any","both","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","s","t","can","will","just","don","should","now","0","1","2","3","4","5","6","7","8","9"]);function Bt(e,t){for(const[n,a]of t.entries())if(e.startsWith(a))return e.replace(a,String(n));return e}const Ut="$PREFIXED_ID";function $t(e,t,n){return t===Ut?[Bt(e.id,n)]:Ie.default.query(e,t)}function jt(e){return e.toLowerCase().split(/[^\d:A-Za-z]+/).filter((e=>e&&!_t.has(e)))}function*Gt(e){for(const t of e)yield*jt(t)}function*Wt(e){for(const t of e)if("string"==typeof t)yield t;else if("object"==typeof t){const e=Ie.default.query(t,"$..*");yield*Wt(e)}}function*zt(e,t,n){for(const a of t){const t=$t(e,a,n);if(t.length>0)for(const e of Gt(Wt(t)))yield[a,e]}}async function Ht(e,t,n){const a=await this.db,o=t??a.transaction(["nodes"]);N.checkAbortSignal(n);const r=[...jt(e)],l=[],s=new Map;l.push(...r.map((async(e,t)=>{N.checkAbortSignal(n);const a=o.objectStore("nodes").index("full-text-words");for await(const o of a.iterate(IDBKeyRange.bound(e,`${e}￿`,!1,!1))){N.checkAbortSignal(n);const e=o.value,a=s.get(e.id)??[e,new Set];a[1].add(t),s.set(e.id,a)}}))),await Promise.all(l),N.checkAbortSignal(n);const i=[];for(const[,[e,t]]of s)N.checkAbortSignal(n),i.push(...Vt(this.textIndexFields,e,t,r,this.prefixes));return i.sort(((e,t)=>t.score-e.score)),i.slice(0,this.options.maxSearchResults??this.DEFAULT_MAX_SEARCH_RESULTS)}function Vt(e,t,n,a,o){const r=[...n].sort().map((e=>a[e])),l=r.map((e=>{const t=e.replaceAll(/[$()*+./?[\\\]^{|}-]/g,String.raw`\$&`);return new RegExp(`\\b${t}`,"gi")}));let s=[],i=0;for(const[n,r]of e.entries()){const c=new Set,u=e.length-n-1,d=[...Wt($t(t,r.jsonPath,o))];for(const e of d){let n=0;const o=[];for(const[t,r]of l.entries())for(const l of e.matchAll(r)){n+=1+1*u,c.add(t);const r=l.index,s=a[t];void 0!==r&&(n+=.01*s.length,n+=s.length/e.length*100*.05,o.push({wordIndex:t,position:r}))}n+=100*c.size,i<n&&(i=n),o.sort(((e,t)=>e.position-t.position)),o.length>0&&s.push({term:t,field:r,str:e,score:n,wordMatches:o})}}s=s.filter((e=>e.score===i));for(const e of s){const{wordMatches:t}=e;for(let n=0;n<t.length-1;n++){const a=t[n],o=t[n+1],l=o.wordIndex-a.wordIndex;if(1===l||-1===l){e.score+=1,1===l&&(e.score+=1);const t=Math.abs(o.position-(a.position+r[a.wordIndex].length))-1;e.score-=.05*t}}}return s}function Jt(e){return"string"==typeof e.id}function Xt(e){return"string"==typeof e.sub&&"string"==typeof e.pred&&"string"==typeof e.obj}function Kt(e){return Boolean(e.meta?.deprecated)}async function Zt(e){return D.openDB(e,2,{upgrade(e,t,n,a,o){if(t<2&&(e.objectStoreNames.contains("meta")&&e.deleteObjectStore("meta"),e.objectStoreNames.contains("nodes")&&e.deleteObjectStore("nodes"),e.objectStoreNames.contains("edges")&&e.deleteObjectStore("edges")),e.objectStoreNames.contains("meta")||e.createObjectStore("meta"),!e.objectStoreNames.contains("nodes")){e.createObjectStore("nodes",{keyPath:"id"});const t=a.objectStore("nodes");t.createIndex("by-label","lbl"),t.createIndex("by-type","type"),t.createIndex("by-synonym",["meta","synonyms","val"]),t.createIndex("full-text-words","fullTextWords",{multiEntry:!0})}if(!e.objectStoreNames.contains("edges")){e.createObjectStore("edges",{autoIncrement:!0});const t=a.objectStore("edges");t.createIndex("by-subject","sub"),t.createIndex("by-object","obj"),t.createIndex("by-predicate","pred")}}})}function Yt(e){const t=new Set;for(const[,n]of e)t.add(n);return[...t]}async function Qt(e){const t=Date.now();let n,a=1;this.options.update?.("Parsing JSON",a);try{n=JSON.parse(await I.openLocation(this.sourceLocation).readFile("utf8"))}catch{throw new Error("Error in loading ontology")}a+=5,this.options.update?.("Parsing JSON complete",a);const o=Date.now(),[r,...l]=n.graphs??[];if(r){if(l.length>0)throw new Error("multiple graphs not supported");try{const n=e.transaction(["meta","nodes","edges"],"readwrite");await n.objectStore("meta").clear(),await n.objectStore("nodes").clear(),await n.objectStore("edges").clear();const l=n.objectStore("nodes"),s=en.call(this).map((e=>e.jsonPath));if(r.nodes){let e=Math.round(a);for(const[,t]of r.nodes.entries())a+=1/r.nodes.length*64,Math.round(a)!=e&&a<100&&(this.options.update?.("Processing nodes",a),e=Math.round(a)),Jt(t)&&await l.add({...t,fullTextWords:Yt(zt(t,s,this.prefixes))})}const i=n.objectStore("edges");if(r.edges){let e=Math.round(a);for(const[,t]of r.edges.entries())a+=1/r.edges.length*30,Math.round(a)!=e&&a<100&&(this.options.update?.("Processing edges",a),e=Math.round(a)),Xt(t)&&await i.add(t)}await n.done;const c=e.transaction("meta","readwrite"),{update:u,...d}=this.options;await c.objectStore("meta").add({ontologyRecord:{name:this.ontologyName,version:this.ontologyVersion,sourceLocation:this.sourceLocation},storeOptions:d,graphMeta:r.meta,timestamp:String(new Date),schemaVersion:2,timings:{overall:Date.now()-t,load:Date.now()-o}},"meta"),await c.done}catch(t){throw await e.transaction("meta","readwrite").objectStore("meta").clear(),t}}}function en(){return[{displayName:"ID",jsonPath:Ut},...this.options.textIndexing?.indexFields??rn]}async function tn(e){const[t]=await e.transaction("meta").objectStore("meta").getAll();return!!t&&Me.default(this.options.prefixes,t.storeOptions.prefixes)&&Me.default(this.options.textIndexing,t.storeOptions.textIndexing)}class nn{ontologyName;ontologyVersion;sourceLocation;db;options;loadOboGraphJson=Qt;getTermsByFulltext=Ht;openDatabase=Zt;isDatabaseCurrent=tn;get textIndexFields(){return en.call(this)}get prefixes(){return this.options.prefixes??new Map}DEFAULT_MAX_SEARCH_RESULTS=100;constructor(e,t,n,a){this.ontologyName=e,this.ontologyVersion=t,this.sourceLocation=n,this.options=a??{},this.db=this.prepareDatabase()}validate(){const e=[],{sourceLocation:t,sourceType:n}=this;return n?"obo-graph-json"!==n&&e.push(new Error(`ontology source file ${JSON.stringify(t)} has type ${n}, which is not yet supported`)):e.push(new Error(`unable to determine format of ontology source file ${JSON.stringify(t)}, file name must end with ".json", ".obo", or ".owl"`)),e}get sourceType(){if(r.isUriLocation(this.sourceLocation)){if(this.sourceLocation.uri.endsWith(".json"))return"obo-graph-json"}else if(r.isLocalPathLocation(this.sourceLocation)&&this.sourceLocation.localPath.endsWith(".json"))return"obo-graph-json"}get dbName(){return`Apollo Ontology "${this.ontologyName}" "${this.ontologyVersion}"`}async prepareDatabase(){const e=this.validate();if(e.length>0)throw e;const t=await this.openDatabase(this.dbName);if(await this.isDatabaseCurrent(t))return t;try{const{options:e,sourceLocation:n,sourceType:a}=this;if("obo-graph-json"!==a)throw new Error(`ontology source file ${JSON.stringify(n)} has type ${a}, which is not yet supported`);return e.update?.("",0),await this.loadOboGraphJson(t),e.update?.("",100),t}catch(e){throw t.close(),await D.deleteDB(this.dbName),e}}async termCount(e){const t=await this.db;return(e??t.transaction("nodes")).objectStore("nodes").count()}unique(e){const t=new Map,n=[];for(const a of e)t.has(a.id)||(t.set(a.id,!0),n.push(a));return n}async getTermsWithLabelOrSynonym(e,t,n){const a=t?.includeSubclasses??!0,o=await this.db,r=n??o.transaction(["nodes","edges"]),l=r.objectStore("nodes"),s=[...await l.index("by-label").getAll(e),...await l.index("by-synonym").getAll(e)];if(a){const e=await this.recurseEdges("by-object",s.map((e=>e.id)),(e=>"is_a"===e.pred),"sub",r);for(const t of e){const e=await l.get(t);e&&s.push(e)}}return s}async getPropertiesByLabel(e,t,n){const a=t?.includeSubProperties??!0,o=await this.db,r=n??o.transaction(["nodes","edges"]),l=(await this.getTermsWithLabelOrSynonym(e,{includeSubclasses:!1},r)).filter((e=>cn(e)));if(a){const e=await this.recurseEdges("by-object",l.map((e=>e.id)),(e=>"subPropertyOf"===e.pred),"sub",r),t=r.objectStore("nodes");for(const n of e){const e=await t.get(n);e&&cn(e)&&l.push(e)}}return l}async recurseEdges(e,t,n,a,o){const r=new Set;return await async function t(l){await Promise.all([...l].map((async l=>{const s=(await o.objectStore("edges").index(e).getAll(l)).filter((e=>n(e))).map((e=>e[a]));if(s.length>0){for(const e of s)r.add(e);await t(s)}})))}(t),r.values()}async*expandNodeSet(e,t="is_a",n,a){const o=await this.db,r=a??o.transaction(["edges"]),l=[...e],s=await this.recurseEdges("subclasses"===n?"by-object":"by-subject",l,(e=>e.pred===t),"subclasses"===n?"sub":"obj",r);for(const e of l)yield e;for(const e of s)yield e}expandSubclasses(e,t="is_a",n){return this.expandNodeSet(e,t,"subclasses",n)}expandSuperclasses(e,t="is_a",n){return this.expandNodeSet(e,t,"superclasses",n)}async getClassesThat(e,t,n){const a=await this.db,o=n??a.transaction(["nodes","edges"]),r=await this.getPropertiesByLabel(e,{includeSubProperties:!0},o),l=new Set(r.map((e=>e.id))),s=await async function(e){const t=[];for await(const n of e)t.push(n);return t}(this.expandSuperclasses(t.map((e=>e.id)),"is_a",o)),i=await this.recurseEdges("by-object",s,(e=>l.has(e.pred)),"sub",o),c=this.expandSubclasses(i,"is_a",o),u=[];for await(const e of c){const t=await o.objectStore("nodes").get(e);t&&sn(t)&&!Kt(t)&&u.push(t)}return u}async getClassesWithoutPropertyLabeled(e,t,n){const a=await this.db,o=n??a.transaction(["nodes","edges"]),r=o.objectStore("nodes"),l=o.objectStore("edges"),s=(await this.getPropertiesByLabel(e,t,o)).map((e=>e.id)),i=await(async()=>{const e=new Set;for(const t of s)for await(const n of l.index("by-predicate").iterate(t))e.add(n.value.sub);const t=new Set;for await(const n of this.expandSubclasses(e,"is_a",o))t.add(n);return t})(),c=[];for await(const e of r){const t=e.value;sn(t)&&!i.has(t.id)&&c.push(t.id)}const u=[];for(const e of c){const t=await o.objectStore("nodes").get(e);t&&sn(t)&&!Kt(t)&&u.push(t)}return u}async getAllClasses(e){const t=await this.db,n=e??t.transaction(["nodes"]);return(await n.objectStore("nodes").index("by-type").getAll("CLASS")).filter((e=>!Kt(e)))}async getAllTerms(e){const t=await this.db,n=e??t.transaction(["nodes"]);return(await n.objectStore("nodes").getAll()).filter((e=>!Kt(e)))}}const an=c.types.model("OntologyRecord",{name:c.types.string,version:"unversioned",source:c.types.union(k.LocalPathLocation,k.UriLocation,k.BlobLocation),options:c.types.frozen(),equivalentTypes:c.types.map(c.types.array(c.types.string))}).volatile((e=>({dataStore:void 0,startedEquivalentTypeRequests:new Set}))).actions((e=>({ping(){},initDataStore(){e.dataStore=new nn(e.name,e.version,c.getSnapshot(e.source),e.options)},afterCreate(){c.addDisposer(e,i.autorun((()=>{this.initDataStore()})))},setEquivalentTypes(t,n){e.equivalentTypes.set(t,n)}}))).actions((e=>({loadEquivalentTypes:c.flow((function*(t){if(!e.dataStore)return;if(e.startedEquivalentTypeRequests.has(t))return;e.startedEquivalentTypeRequests.add(t);const n=(yield e.dataStore.getTermsWithLabelOrSynonym(t)).map((e=>e.lbl)).filter((e=>null!=e));c.isAlive(e)&&e.setEquivalentTypes(t,n)}))}))).actions((e=>({afterCreate(){i.autorun((t=>{e.dataStore&&(e.loadEquivalentTypes("gene"),e.loadEquivalentTypes("pseudogene"),e.loadEquivalentTypes("transcript"),e.loadEquivalentTypes("pseudogenic_transcript"),e.loadEquivalentTypes("CDS"),e.loadEquivalentTypes("mRNA"),t.dispose())}))},setEquivalentTypes(t,n){e.equivalentTypes.set(t,n)}}))).views((e=>({isTypeOf(t,n){if(t===n)return!0;if(!e.dataStore)return!1;const a=e.equivalentTypes.get(n);return a?a.includes(t):(e.loadEquivalentTypes(n),!1)}}))),on=c.types.model("OntologyManager",{ontologies:c.types.array(an),prefixes:c.types.optional(c.types.map(c.types.string),{"GO:":"http://purl.obolibrary.org/obo/GO_","SO:":"http://purl.obolibrary.org/obo/SO_"})}).views((e=>({get featureTypeOntologyName(){const t=c.getRoot(e).jbrowse.configuration;return a.readConfObject(t.ApolloPlugin,"featureTypeOntologyName")}}))).views((e=>({get featureTypeOntology(){return this.findOntology(e.featureTypeOntologyName)},findOntology:(t,n)=>e.ontologies.find((e=>e.name===t&&(void 0===n||e.version===n))),openOntology(e,t){return this.findOntology(e,t)?.dataStore},applyPrefixes:t=>Bt(t,e.prefixes),expandPrefixes:t=>function(e,t){for(const[n,a]of t.entries())if(e.startsWith(String(n)))return e.replace(String(n),a);return e}(t,e.prefixes)}))).actions((e=>({addOntology(t,n,a,o){const r=e.ontologies.push({name:t,version:n,source:a,options:{prefixes:new Map(e.prefixes.entries()),...o}});e.ontologies[r-1].ping()}}))),rn=[{displayName:"Label",jsonPath:"$.lbl"},{displayName:"Synonym",jsonPath:"$.meta.synonyms[*].val"},{displayName:"Definition",jsonPath:"$.meta.definition.val"}],ln=a.ConfigurationSchema("OntologyRecord",{name:{type:"string",description:'the full name of the ontology, e.g. "Gene Ontology"',defaultValue:"My Ontology"},version:{type:"string",description:"the ontology's version string",defaultValue:"unversioned"},source:{type:"fileLocation",description:"the download location for the ontology's source file",defaultValue:{locationType:"UriLocation",uri:"http://example.com/myontology.json"}},textIndexFields:{type:"frozen",description:"JSON paths for text fields that will be indexed for text searching",defaultValue:rn}});function sn(e){return"CLASS"===e.type}function cn(e){return"PROPERTY"===e.type}async function un(e,t,n){if(!e)return;const a=await t.getTermsWithLabelOrSynonym(e.type,{includeSubclasses:!1}),o=a.filter(sn);if(0===a.length)return;const r=await t.getClassesThat("part_of",o);return 0!==r.length?r:void 0}function dn({fetchValidTerms:e,filterTerms:t,includeDeprecated:n,onChange:a,ontologyName:o,ontologyVersion:r,renderInput:l,session:i,style:c,value:u}){const[d,f]=E.useState(!1),[m,g]=E.useState(),[p,h]=E.useState(""),[y,b]=E.useState(),{ontologyManager:S}=i.apolloDataStore,w=S.findOntology(o,r)?.dataStore,C=w&&d&&!m,v=w&&!y,x=E.useCallback((e=>(n||!Kt(e))&&(!t||t(e))),[t,n]);E.useEffect((()=>{d||g(void 0)}),[d]),E.useEffect((()=>{const e=new AbortController,{signal:t}=e;return v&&(h(""),async function(e,t,n,a){if(!t)return;const o=(await e.getTermsWithLabelOrSynonym(t,{includeSubclasses:!1})).find((e=>(n??(()=>!0))(e)));if(!o)throw new Error(`not a valid ${e.ontologyName} term`);return o}(w,u,x).then((e=>{t.aborted||b(e)}),(e=>{t.aborted||N.isAbortException(e)||h(String(e))}))),()=>{e.abort()}}),[i,u,x,w,v]),E.useEffect((()=>{const t=new AbortController,{signal:n}=t;return C&&async function(e,t,n,a){let o;if(t){const n=await t(e,a);n&&(o=n)}return o||(o=await e.getAllTerms()),n?o.filter((e=>n(e))):o}(w,e,x,n).then((e=>{e&&!n.aborted&&g(e)}),(e=>{n.aborted||N.isAbortException(e)||i.notify(e instanceof Error?e.message:String(e),"error")})),()=>{t.abort()}}),[C,x,w,i,e]);const T={};return p&&(T.error=!0,T.helperText=p),De.default.createElement(s.Autocomplete,{style:c,autoComplete:!0,filterSelectedOptions:!0,disableClearable:!0,selectOnFocus:!0,clearOnBlur:!0,handleHomeEndKeys:!0,freeSolo:!0,value:u,options:m??[],onOpen:()=>{f(!0)},onClose:()=>{f(!1)},loading:C,renderInput:l??(e=>De.default.createElement(s.TextField,{...e,...T})),getOptionLabel:e=>"string"==typeof e?e:e.lbl??"",isOptionEqualToValue:(e,t)=>e.lbl===t.lbl,onChange:(e,t)=>{t&&("string"==typeof t?(b(void 0),a(u,t)):t.lbl!==u&&(h(""),b(t),a(u,t.lbl)))}})}function fn({changeManager:e,handleClose:n,session:a,sourceAssemblyId:o,sourceFeature:r}){const[l,i]=E.useState(String(r.max)),[c,u]=E.useState(String(r.min+1)),[d,f]=E.useState(""),[m,g]=E.useState(""),[p,h]=E.useState(""),y=Number(l)<=Number(c);return De.default.createElement(Rt,{open:!0,title:"Add new child feature",handleClose:n,maxWidth:!1,"data-testid":"add-feature-dialog"},De.default.createElement("form",{onSubmit:function(s){s.preventDefault(),g("");const i=(new ke.default).toHexString(),u=new t.AddFeatureChange({changedIds:[r._id],typeName:"AddFeatureChange",assembly:o,addedFeature:{_id:i,refSeq:r.refSeq,min:Number(c)-1,max:Number(l),type:d},parentFeatureId:r._id});e.submit(u).then((()=>{a.apolloSetSelectedFeature(i)})),n(),s.preventDefault()}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.TextField,{margin:"dense",id:"start",label:"Start",type:"number",fullWidth:!0,variant:"outlined",value:c,onChange:e=>{u(e.target.value)}}),De.default.createElement(s.TextField,{margin:"dense",id:"end",label:"End",type:"number",fullWidth:!0,variant:"outlined",value:l,onChange:e=>{i(e.target.value)},error:y,helperText:y?'"End" must be greater than "Start"':null}),De.default.createElement(dn,{session:a,ontologyName:"Sequence Ontology",style:{width:170},value:d,filterTerms:sn,fetchValidTerms:async function(e,t,n){const a=await un(e,t);if(a)return a;h(`Type "${e?.type}" does not have any children in the ontology`)}.bind(null,r),renderInput:e=>De.default.createElement(s.TextField,{...e,label:"Type",variant:"outlined",fullWidth:!0,error:Boolean(p),helperText:p}),onChange:(e,t)=>{var n;t&&(n=t,g(""),f(n))}})),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",type:"submit",disabled:y||!(c&&l&&d)},"Submit"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Cancel"))),m?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},m)):null)}var mn;function gn(e,t,n,a){const o={_id:(new ke.default).toHexString(),refSeq:e,type:"CDS",min:n,max:a,strand:t},r={_id:(new ke.default).toHexString(),refSeq:e,type:"exon",min:n,max:a,strand:t},l={};return l[o._id]=o,l[r._id]=r,{_id:(new ke.default).toHexString(),refSeq:e,type:"mRNA",min:n,max:a,strand:t,children:l}}function pn({changeManager:e,handleClose:n,region:a,session:o}){const[r,l]=E.useState(String(a.end)),[i,c]=E.useState(String(a.start+1)),[u,d]=E.useState(mn.GENE_AND_SUBFEATURES),[f,m]=E.useState(),[g,p]=E.useState(),[h,y]=E.useState(""),b=Number(r)<=Number(i);let S=Boolean(b)||!(i&&r&&u);return(u===mn.CUSTOM&&!f||!g&&u===mn.GENE_AND_SUBFEATURES||!g&&u===mn.TRANSCRIPT_AND_SUBFEATURES)&&(S=!0),De.default.createElement(Rt,{open:!0,title:"Add new feature",handleClose:n,maxWidth:!1,"data-testid":"add-feature-dialog"},De.default.createElement("form",{onSubmit:function(l){let s;l.preventDefault(),y("");for(const[,e]of o.apolloDataStore.assemblies??new Map)if(e._id===a.assemblyName)for(const[,t]of e.refSeqs??new Map)t.name===a.refName&&(s=t._id);if(!s)return void y("Invalid refseq id. Make sure you have the Apollo annotation track open");if(u===mn.GENE_AND_SUBFEATURES){const l=gn(s,g,Number(i)-1,Number(r)),c={};c[l._id]=l;const u=(new ke.default).toHexString(),d=new t.AddFeatureChange({changedIds:[u],typeName:"AddFeatureChange",assembly:a.assemblyName,addedFeature:{_id:u,refSeq:s,min:Number(i)-1,max:Number(r),type:"gene",strand:g,children:c}});return e.submit(d).then((()=>{o.apolloSetSelectedFeature(u)})),void n()}if(u===mn.TRANSCRIPT_AND_SUBFEATURES){const l=gn(s,g,Number(i)-1,Number(r)),c=new t.AddFeatureChange({changedIds:[l._id],typeName:"AddFeatureChange",assembly:a.assemblyName,addedFeature:l});return e.submit(c).then((()=>{o.apolloSetSelectedFeature(l._id)})),void n()}if(!f)return void y("No type selected");const c=(new ke.default).toHexString(),d=new t.AddFeatureChange({changedIds:[c],typeName:"AddFeatureChange",assembly:a.assemblyName,addedFeature:{_id:c,refSeq:s,min:Number(i)-1,max:Number(r),type:f,strand:g}});e.submit(d).then((()=>{o.apolloSetSelectedFeature(c)})),n()},"data-testid":"submit-form"},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.TextField,{margin:"dense",id:"start",label:"Start",type:"number",fullWidth:!0,variant:"outlined",value:Number(i),onChange:e=>{c(e.target.value)}}),De.default.createElement(s.TextField,{margin:"dense",id:"end",label:"End",type:"number",fullWidth:!0,variant:"outlined",value:r,onChange:e=>{l(e.target.value)},error:b,helperText:b?'"End" must be greater than "Start"':null}),De.default.createElement(s.FormControl,null,De.default.createElement(s.InputLabel,{id:"demo-simple-select-label"},"Strand"),De.default.createElement(s.Select,{labelId:"demo-simple-select-label",id:"demo-simple-select",label:"Strand",value:g?.toString(),onChange:function(e){switch(y(""),Number(e.target.value)){case 1:p(1);break;case-1:p(-1);break;default:p(void 0)}}},De.default.createElement(s.MenuItem,{value:void 0}),De.default.createElement(s.MenuItem,{value:1},"+"),De.default.createElement(s.MenuItem,{value:-1},"-"))),De.default.createElement(s.FormControl,{style:{marginTop:20}},De.default.createElement(s.RadioGroup,{"aria-labelledby":"demo-radio-buttons-group-label",defaultValue:mn.GENE_AND_SUBFEATURES,name:"radio-buttons-group",value:u,onChange:e=>{y("");const{value:t}=e.target;Object.keys(mn).includes(t)&&d(mn[t])}},De.default.createElement(s.FormControlLabel,{value:mn.GENE_AND_SUBFEATURES,control:De.default.createElement(s.Radio,null),label:De.default.createElement(s.Box,{display:"flex",alignItems:"center"},"Add gene and sub-features",De.default.createElement(s.Tooltip,{title:"This is a shortcut to create a gene with a single mRNA, exon, and CDS"},De.default.createElement(s.IconButton,{size:"small"},De.default.createElement(xe.default,{sx:{fontSize:18}}))))}),De.default.createElement(s.FormControlLabel,{value:mn.TRANSCRIPT_AND_SUBFEATURES,control:De.default.createElement(s.Radio,null),label:De.default.createElement(s.Box,{display:"flex",alignItems:"center"},"Add transcript and sub-features",De.default.createElement(s.Tooltip,{title:"This is a shortcut to create a single mRNA with exon and CDS, but without a parent gene"},De.default.createElement(s.IconButton,{size:"small"},De.default.createElement(xe.default,{sx:{fontSize:18}}))))}),De.default.createElement(s.FormControlLabel,{value:mn.CUSTOM,checked:u!==mn.GENE_AND_SUBFEATURES&&u!==mn.TRANSCRIPT_AND_SUBFEATURES,control:De.default.createElement(s.Radio,null),label:"Add feature with a sequence ontology type"}))),u===mn.CUSTOM?De.default.createElement(dn,{session:o,ontologyName:"Sequence Ontology",style:{width:170},value:"",filterTerms:sn,renderInput:e=>De.default.createElement(s.TextField,{...e,label:"Type",variant:"outlined",fullWidth:!0}),onChange:(e,t)=>{var n;t&&(n=t,y(""),m(n))}}):null),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",type:"submit",disabled:S},"Submit"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Cancel"))),h?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},h)):null)}function hn(e,t){const n=(new ke.default).toHexString();t.push(n);const a={};if(e.children)for(const n of Object.values(e.children)){const e=hn(n,t);a[e._id]=e}const o="string"==typeof e.refSeq?e.refSeq:e.refSeq.toHexString();return{...e,refSeq:o,children:e.children&&a,_id:n}}function yn({changeManager:e,handleClose:n,session:o,sourceAssemblyId:r,sourceFeature:l}){const{assemblyManager:i}=o,u=i.assemblyList,[d,f]=E.useState(u.find((e=>e.name!==r))?.name),[m,g]=E.useState([]),[p,h]=E.useState(""),[y,b]=E.useState(l.min),[S,w]=E.useState("");function C(e,t){const n={};if(e.children)for(const a of Object.values(e.children)){const e=C(a,t);e.refSeq=p,e.min=e.min+t,e.max=e.max+t,n[e._id]=e}const a="string"==typeof e.refSeq?e.refSeq:e.refSeq.toHexString(),o="string"==typeof e._id?e._id:e._id.toHexString();return{...e,refSeq:a,children:e.children&&n,_id:o}}return E.useEffect((()=>{h(""),async function(){if(!d)return void w("No assemblies to copy to");const e=await i.waitForAssembly(d);if(!e)return;const{refNameAliases:t}=e;if(!t)return;const n=[...Object.entries(t)].filter((([e,t])=>e!==t)).map((([e,t])=>({_id:e,name:t})));g(n),h(n[0]?._id||"")}().catch((e=>{w(String(e))}))}),[d,i]),De.default.createElement(Rt,{open:!0,title:"Copy features and annotations",handleClose:n,maxWidth:!1,"data-testid":"copy-feature"},De.default.createElement("form",{onSubmit:async function(a){if(!d)return;a.preventDefault(),w("");const r=l.length,s=await i.waitForAssembly(d);if(!s)return void w(`Assembly not found: ${d}.`);const u=s.getCanonicalRefName(p),f=s.regions?.find((e=>e.refName===u));if(!f)return void w(`RefSeq not found: ${p}.`);const m=y+r;if(m>f.end)return void w(`Feature would extend beyond the bounds of the selected reference sequence. (Feature would end at ${m}, but reference sequence ends at ${f.end})`);if(y<f.start)return void w(`Reference sequence starts at ${f.start}, feature cannot start before that.`);const g=[],h=hn(c.getSnapshot(l),g),b={...h.attributes};"Parent"in b&&delete b.Parent,h.refSeq=p;const S=y-h.min;h.min=y,h.max=y+r;const E=C(h,S),v=new t.AddFeatureChange({changedIds:[h._id],typeName:"AddFeatureChange",assembly:d,addedFeature:{_id:h._id,refSeq:h.refSeq,min:h.min,max:h.max,type:h.type,children:E.children,attributes:b,strand:h.strand},copyFeature:!0,allIds:g});e.submit(v).then((()=>{o.apolloSetSelectedFeature(h._id)})),n(),a.preventDefault()}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.DialogContentText,null,"Target assembly"),De.default.createElement(s.Select,{labelId:"label",value:d,onChange:function(e){f(e.target.value)}},u.filter((e=>e.name!==r)).map((e=>De.default.createElement(s.MenuItem,{key:e.name,value:e.name},a.readConfObject(e,"displayName"))))),De.default.createElement(s.DialogContentText,null,"Target reference sequence"),De.default.createElement(s.Select,{labelId:"label",value:p,onChange:function(e){h(e.target.value)}},m.map((e=>De.default.createElement(s.MenuItem,{key:e._id,value:e._id},e.name)))),De.default.createElement(s.DialogContentText,null,"Start position in target reference sequence"),De.default.createElement(s.TextField,{margin:"dense",type:"number",fullWidth:!0,variant:"outlined",value:y,onChange:e=>{b(Number(e.target.value))}})),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{disabled:!d||!p||!y,variant:"contained",type:"submit"},"Submit"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Cancel"))),S?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},S)):null)}function bn({changeManager:e,handleClose:n,session:a}){const{internetAccounts:o}=c.getRoot(a),[r,l]=E.useState(),[i,u]=E.useState(""),[d,f]=E.useState(!1),[m,g]=E.useState(!1),p=o.filter((e=>"ApolloInternetAccount"===e.type));if(0===p.length)throw new Error("No Apollo internet account found");const[h,y]=E.useState(p[0]),{collaborationServerDriver:b}=a.apolloDataStore,S=b.getAssemblies();return E.useEffect((()=>{S.length>0&&void 0===r&&l(S[0])}),[S,r]),De.default.createElement(Rt,{open:!0,title:"Delete Assembly",handleClose:n,maxWidth:!1,"data-testid":"delete-assembly"},De.default.createElement("form",{onSubmit:async function(a){if(a.preventDefault(),g(!0),u(""),!r)return void u("Must select assembly!");const o=new t.DeleteAssemblyChange({typeName:"DeleteAssemblyChange",assembly:r.name});await e.submit(o,{internetAccountId:h.internetAccountId}),n(),a.preventDefault()}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},p.length>1?De.default.createElement(De.default.Fragment,null,De.default.createElement(s.DialogContentText,null,"Select account"),De.default.createElement(s.Select,{value:h.internetAccountId,onChange:function(e){g(!1);const t=p.find((t=>t.internetAccountId===e.target.value));if(!t)throw new Error(`Could not find internetAccount with ID "${e.target.value}"`);y(t)},disabled:m&&!i},o.map((e=>De.default.createElement(s.MenuItem,{key:e.id,value:e.internetAccountId},e.name))))):null,De.default.createElement(s.DialogContentText,null,"Select assembly"),De.default.createElement(s.Select,{labelId:"label",value:r?.name??"",onChange:function(e){const t=S.find((t=>t.name===e.target.value));l(t)},disabled:0===S.length},S.map((e=>De.default.createElement(s.MenuItem,{key:e.name,value:e.name},e.displayName)))),De.default.createElement(s.DialogContentText,null,De.default.createElement("strong",{style:{color:"red"}},"NOTE: All assembly data will be deleted and this operation cannot be undone!")),De.default.createElement(s.FormGroup,null,De.default.createElement(s.FormControlLabel,{control:De.default.createElement(s.Checkbox,{checked:d,onChange:()=>{f(!d)}}),label:"I understand that all assembly data will be deleted"}))),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{disabled:!r||!d,variant:"contained",type:"submit"},"Delete"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Cancel"))),i?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},i)):null)}function Sn({changeManager:e,handleClose:n,selectedFeature:a,session:o,setSelectedFeature:r,sourceAssemblyId:l,sourceFeature:i}){const[u,d]=E.useState(""),{ontologyManager:f}=o.apolloDataStore,{featureTypeOntology:m}=f;function g(e){if(!e.parent?.children||1===e.parent.children.size)return;const t=[];for(const n of e.parent.children.values())m?.isTypeOf(n.type,"CDS")||t.push(n);t.sort(((e,t)=>e.min-t.min));const n=[];for(const t of e.parent.children.values())m?.isTypeOf(t.type,"CDS")||n.push(t);if(n.sort(((e,t)=>t.max-e.max)),e.min===t[0].min){let n;for(const a of t)if(a._id!==e._id&&a.min>=e.min){n=a.min;break}if(n&&n!=e.parent.min)return{typeName:"LocationStartChange",changedId:e.parent._id,featureId:e.parent._id,oldLocation:e.parent.min,newLocation:n}}if(e.max===n[0].max){let t;for(const a of n)if(a._id!=e._id&&a.max<=e.max){t=a.max;break}if(t&&t!=e.parent.max)return{typeName:"LocationEndChange",changedId:e.parent._id,featureId:e.parent._id,oldLocation:e.parent.max,newLocation:t}}}return De.default.createElement(Rt,{open:!0,title:"Delete feature",handleClose:n,maxWidth:!1,"data-testid":"delete-feature"},De.default.createElement("form",{onSubmit:o=>{!async function(o){o.preventDefault(),d(""),a?._id===i._id&&r();const s=[],u=new t.DeleteFeatureChange({changedIds:[i._id],typeName:"DeleteFeatureChange",assembly:l,changes:[{deletedFeature:c.getSnapshot(i),parentFeatureId:i.parent?._id}]});if(m&&(m.isTypeOf(i.type,"transcript")||m.isTypeOf(i.type,"pseudogenic_transcript"))){const e=g(i);e&&s.push(e)}if(m&&m.isTypeOf(i.type,"exon")){const e=function(e){if(!m)return;if(!m.isTypeOf(e.type,"exon"))return;if(!e.parent?.cdsLocations||0===e.parent.cdsLocations.length||0===e.parent.cdsLocations[0].length)return;if(!e.parent.children)throw new Error("Unable to find parent of CDS");if(1!=e.parent.cdsLocations.length)throw new Error("Unable to handle a transcript with multiple CDSs");const n=(e.parent.cdsLocations.at(0)??[]).sort((({min:e},{min:t})=>e-t));let a;for(const t of e.parent.children.values())if(t.type===n[0].type){a=t;break}if(!a)throw new Error("Unable to find CDS");const o=n[0].min,r=n[n.length-1].max;if(!(e.min>o&&e.max<r||e.max<o||e.min>r)){if(e.min<=o&&e.max>=r)return new t.DeleteFeatureChange({changedIds:[a._id],typeName:"DeleteFeatureChange",assembly:l,changes:[{deletedFeature:c.getSnapshot(a),parentFeatureId:a.parent?._id}]});if(e.min<=o&&e.max>o){let t;for(const a of n)if(a.min>e.max){t=a.min;break}if(!t)throw new Error("Error setting new CDS start");return{typeName:"LocationStartChange",changedId:a._id,featureId:a._id,oldLocation:a.min,newLocation:t}}if(e.min<r&&e.max>=r){let t;for(const a of n.reverse())if(a.max<e.min){t=a.max;break}if(!t)throw new Error("Error setting new CDS end");return{typeName:"LocationEndChange",changedId:a._id,featureId:a._id,oldLocation:a.max,newLocation:t}}throw new Error("Unexpected relationship between exon and CDS")}}(i);e&&("DeleteFeatureChange"===e.typeName?(u.changedIds.push(...e.changedIds),u.changes.push(...e.changes)):s.push(e));const n=g(i);if(n){s.push(n);const e=i.parent?.parent;if(e?.children)if("LocationStartChange"===n.typeName){let t=n.newLocation;for(const[,a]of e.children)a._id!=n.featureId&&a.min<t&&(t=a.min);t!=e.min&&s.push({typeName:n.typeName,changedId:e._id,featureId:e._id,oldLocation:e.min,newLocation:t})}else{let t=n.newLocation;for(const[,a]of e.children)a._id!=n.featureId&&a.max>t&&(t=a.max);t!=e.max&&s.push({typeName:n.typeName,changedId:e._id,featureId:e._id,oldLocation:e.max,newLocation:t})}}}const f=function(e,n){if(0===e.length)return;const a=new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[],changes:[],assembly:n}),o=new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[],changes:[],assembly:n});for(const t of e)"LocationStartChange"===t.typeName&&(a.changedIds.push(t.changedId),a.changes.push({featureId:t.featureId,oldStart:t.oldLocation,newStart:t.newLocation})),"LocationEndChange"===t.typeName&&(o.changedIds.push(t.changedId),o.changes.push({featureId:t.featureId,oldEnd:t.oldLocation,newEnd:t.newLocation}));if(a.changedIds.length>0&&0===o.changedIds.length)return a;if(o.changedIds.length>0&&0===a.changedIds.length)return o;throw new Error("Unexpected list of changes")}(s,l);await e.submit(u),f&&await e.submit(f),n(),o.preventDefault()}(o)}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.DialogContentText,null,"Are you sure you want to delete the selected feature?")),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",type:"submit"},"Yes"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Cancel"))),u?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},u)):null)}function wn({handleClose:e,session:n}){const[o,r]=E.useState(!1),[l,i]=E.useState(),[u,d]=E.useState(""),{collaborationServerDriver:f,getInternetAccount:m,inMemoryFileDriver:g}=n.apolloDataStore,p=[...f.getAssemblies(),...g.getAssemblies()];return De.default.createElement(Rt,{open:!0,title:"Export GFF3",handleClose:e,maxWidth:!1,"data-testid":"download-gff3"},De.default.createElement("form",{onSubmit:async function(r){if(r.preventDefault(),d(""),!l)return void d("Must select assembly to download");const{internetAccountConfigId:s}=a.getConf(l,["sequence","metadata"]);s?await async function(e){if(!l)return void d("Must select assembly to download");const t=m(l.configuration.name,e),n=new URL("export/getID",t.baseURL),a=new URLSearchParams({assembly:l.name});n.search=a.toString();const r=n.toString(),s=t.getFetcher({locationType:"UriLocation",uri:r}),i=await s(r,{method:"GET"});if(!i.ok){const e=await Dt(i,"Error when exporting ID");return void d(e)}const{exportID:c}=await i.json(),u=new URL("export",t.baseURL),f=new URLSearchParams({exportID:c,includeFASTA:o?"true":"false"});u.search=f.toString();const g=u.toString();window.open(g,"_blank")}(s):function(e){if(!l)return void d("Must select assembly to download");const{assemblies:n}=e.apolloDataStore,o=n.get(l.name),r=o?.refSeqs;if(!r)return void d(`No refSeqs found for assembly "${l.name}"`);const s=[{directive:"gff-version",value:"3"}],i=a.getConf(l,["sequence","adapter","features"]);for(const e of i){const{end:t,refName:n,start:a}=e;s.push({directive:"sequence-region",value:`${n} ${a+1} ${t}`})}for(const[,e]of r){const{features:n}=e;if(n)for(const[,e]of n)s.push(t.annotationFeatureToGFF3(c.getSnapshot(e)))}for(const e of i){const{refName:t,seq:n}=e;s.push({id:t,description:"",sequence:n})}const u=Ne.default.formatSync(s),f=new Blob([u],{type:"text/plain;charset=utf-8"});L.saveAs(f,`${l.displayName??l.name}.gff3`)}(n),e()}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.DialogContentText,null,"Select assembly"),De.default.createElement(s.Select,{labelId:"label",value:l?.name??"",onChange:function(e){const t=p.find((t=>t.name===e.target.value));i(t)},disabled:0===p.length},p.map((e=>De.default.createElement(s.MenuItem,{key:e.name,value:e.name},e.displayName??e.name)))),De.default.createElement(s.DialogContentText,null,"Select assembly to export to GFF3"),De.default.createElement(s.FormGroup,null,De.default.createElement(s.FormControlLabel,{"data-testid":"include-fasta-checkbox",control:De.default.createElement(s.Checkbox,{checked:o,onChange:()=>{r(!o)}}),label:"Include fasta sequence in GFF output"}))),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{disabled:!l,variant:"contained",type:"submit"},"Download"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:e},"Cancel"))),u?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},u)):null)}function En({changeManager:e,handleClose:n,session:o}){const{apolloDataStore:r}=o,[l,i]=E.useState(),[c,u]=E.useState(),[d,f]=E.useState(""),[m,g]=E.useState(!1),[p,h]=E.useState(),[y,b]=E.useState(!1),[S,w]=E.useState(!1),{collaborationServerDriver:C,getInternetAccount:v}=r,x=C.getAssemblies();return E.useEffect((()=>{c&&(async()=>{const{internetAccountConfigId:e}=a.getConf(c,["sequence","metadata"]),t=v(c.name,e);if(!t)throw new Error("No Apollo internet account found");const{baseURL:n}=t,o=new URL("features/count",n),r=new URLSearchParams({assemblyId:c.name});o.search=r.toString();const l=t.getFetcher({locationType:"UriLocation",uri:o.toString()});w(!0);const s=await l(o.toString(),{method:"GET"});if(!s.ok)throw new Error(await Dt(s));{const e=await s.json();h(e.count)}w(!1)})().catch((e=>{console.error(e),f(e.message??e)}))}),[v,o,c]),De.default.createElement(Rt,{open:!0,title:"Import Features from GFF3 file",handleClose:n,maxWidth:!1,"data-testid":"import-features-dialog"},S?De.default.createElement(Pe.default,null):null,De.default.createElement("form",{onSubmit:async function(r){r.preventDefault(),f(""),w(!0),g(!0);let s="";if(!l)return void f("must select a file");if(!c)return void f("Must select assembly to download");const{internetAccountConfigId:i}=a.getConf(c,["sequence","metadata"]),u=v(c.name,i),{baseURL:d}=u,m=new URL("files",d);m.searchParams.set("type","text/x-gff3");const p=m.href,h=new FormData;h.append("file",l),h.append("fileName",l.name),h.append("type","text/x-gff3");const b=u.getFetcher({locationType:"UriLocation",uri:p});n();const{jobsManager:S}=o,E=new AbortController,C={name:`Importing features for ${c.displayName}`,statusMessage:"Uploading file, this may take awhile",progressPct:0,cancelCallback:()=>{E.abort(),S.abortJob(C.name)}};if(S.runJob(C),b){const{signal:e}=E,t=await b(p,{method:"POST",body:h,signal:e});if(!t.ok){const e=await Dt(t,"Error when inserting new features (while uploading file)");return S.abortJob(C.name,e),void f(e)}s=(await t.json())._id}const x=new t.AddFeaturesFromFileChange({typeName:"AddFeaturesFromFileChange",assembly:c.name,fileId:s,deleteExistingFeatures:y});S.done(C),await e.submit(x,{updateJobsManager:!0})}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.DialogContentText,null,"Select assembly"),De.default.createElement(s.Select,{labelId:"label",value:c?.name??"",onChange:function(e){const t=x.find((t=>t.name===e.target.value));u(t),g(!1)},disabled:m&&!d},x.map((e=>De.default.createElement(s.MenuItem,{key:e.name,value:e.name},e.displayName??e.name))))),De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.DialogContentText,null,"Upload GFF3 to load features"),De.default.createElement("input",{type:"file",onChange:function(e){g(!1),e.target.files&&i(e.target.files[0])},disabled:m&&!d})),p&&p>0?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,null,"This assembly already has ",p," features, would you like to delete the existing features before importing new ones?"),De.default.createElement(qe.default,{label:"Yes, delete existing features",disabled:m&&!d,control:De.default.createElement(Le.default,{checked:y,onChange:function(e){b(e.target.checked)},slotProps:{input:{"aria-label":"controlled"}},color:"warning"})})):null,De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{disabled:!(c&&l&&void 0!==p)||m,variant:"contained",type:"submit"},m?"Submitting...":"Submit"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Close"))),d?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},d)):null)}function Cn({handleClose:e,session:t}){const{internetAccounts:n}=c.getRoot(t),[a,o]=E.useState(""),r=n.filter((e=>"ApolloInternetAccount"===e.type));if(0===r.length)throw new Error("No Apollo internet account found");const[l,i]=E.useState(r[0]);return De.default.createElement(Rt,{open:!0,title:"Log out",handleClose:e,maxWidth:!1,"data-testid":"log-out"},De.default.createElement("form",{onSubmit:function(e){e.preventDefault(),o(""),l.removeToken(),globalThis.location.reload()}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},r.length>1?De.default.createElement(De.default.Fragment,null,De.default.createElement(s.DialogContentText,null,"Select account"),De.default.createElement(s.Select,{value:l.internetAccountId,onChange:function(e){const t=r.find((t=>t.internetAccountId===e.target.value));if(!t)throw new Error(`Could not find internetAccount with ID "${e.target.value}"`);i(t)}},n.map((e=>De.default.createElement(s.MenuItem,{key:e.id,value:e.internetAccountId},e.name))))):null,De.default.createElement(s.DialogContentText,null,"Are you sure you want to log out?")),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{disabled:!l,variant:"contained",type:"submit"},"Log Out"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:e},"Cancel"))),a?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},a)):null)}function vn({handleClose:e,session:t}){const{internetAccounts:n}=c.getRoot(t),[a,o]=E.useState(),[r,l]=E.useState(""),[i,u]=E.useState(!1),d=n.filter((e=>"ApolloInternetAccount"===e.type));if(0===d.length)throw new Error("No Apollo internet account found");const[f,m]=E.useState(d[0]),[g,p]=E.useState([]),[h,y]=E.useState([]),{collaborationServerDriver:b}=t.apolloDataStore,S=b.getAssemblies();function w(e,t){const n=[...h],a=e.target.value;if(t)n.includes(a)||(n.push(a),y(n));else{const e=n.indexOf(a,0);-1!==e&&n.splice(e,1),y(n)}}return E.useEffect((()=>{(async function(){const{baseURL:e,getFetcher:t}=f,n=new URL("checks/types",e).href,a=t({locationType:"UriLocation",uri:n}),o=await a(n,{method:"GET"});if(!o.ok){const e=await Dt(o,"Error when retrieving checks from server");return void l(e)}const r=await o.json();p(r)})().catch((e=>{l(String(e))}))}),[f]),E.useEffect((()=>{S.length>0&&void 0===a&&o(S[0])}),[S,a]),E.useEffect((()=>{(async function(){if(!a)return;const{baseURL:e,getFetcher:t}=f,n=new URL(`/assemblies/${a.name}`,e).href,o=t({locationType:"UriLocation",uri:n}),r=await o(n,{method:"GET"});if(!r.ok){const e=await Dt(r,"Error when retrieving assembly from server");return void l(e)}const s=await r.json();y(s.checks)})().catch((e=>{l(String(e))}))}),[a,f]),De.default.createElement(Rt,{open:!0,title:"Manage Checks",handleClose:e,"data-testid":"manage-checks"},De.default.createElement("form",{onSubmit:async function(n){if(n.preventDefault(),!a)return void l("Must select assembly!");const{notify:o}=t,{baseURL:r,getFetcher:s}=f,i=new URL("assemblies/checks",r).href,c=s({locationType:"UriLocation",uri:i}),u=await c(i,{method:"POST",body:JSON.stringify({_id:a.name,checks:h,name:""}),headers:{"Content-Type":"application/json"}});if(u.ok)o("Assembly checks updated successfully","success"),e();else{const e=await Dt(u,"Error when updating assembly checks");l(e)}}},De.default.createElement(s.DialogContent,null,d.length>1?De.default.createElement(De.default.Fragment,null,De.default.createElement(s.DialogContentText,null,"Select account"),De.default.createElement(s.Select,{value:f.internetAccountId,onChange:function(e){u(!1);const t=d.find((t=>t.internetAccountId===e.target.value));if(!t)throw new Error(`Could not find internetAccount with ID "${e.target.value}"`);m(t)},disabled:i&&!r},n.map((e=>De.default.createElement(s.MenuItem,{key:e.id,value:e.internetAccountId},e.name))))):null,De.default.createElement(s.DialogContentText,null,"Select assembly"),De.default.createElement(s.Select,{style:{width:300},labelId:"label",value:a?.name??"",onChange:function(e){const t=S.find((t=>t.name===e.target.value));o(t)},disabled:0===S.length},S.map((e=>De.default.createElement(s.MenuItem,{key:e.name,value:e.name},e.displayName)))),De.default.createElement("br",null),De.default.createElement("br",null),De.default.createElement(s.TableContainer,{component:s.Paper},De.default.createElement(s.Table,null,De.default.createElement(s.TableHead,null,De.default.createElement(s.TableRow,null,De.default.createElement(s.TableCell,null,"Check name"),De.default.createElement(s.TableCell,null,"Use check"))),De.default.createElement(s.TableBody,null,g.map((e=>De.default.createElement(s.TableRow,{key:e._id},De.default.createElement(s.TableCell,null,e.name),De.default.createElement(s.TableCell,null,De.default.createElement(s.Checkbox,{value:e._id,checked:h.includes(e._id),onChange:w}))))))))),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",type:"submit"},"Submit"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:e},"Cancel"))),r?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},r)):null)}function xn({changeManager:e,handleClose:n,session:a}){const{internetAccounts:o}=c.getRoot(a),r=o.filter((e=>"ApolloInternetAccount"===e.type&&e.role?.includes("admin")));if(0===r.length)throw new Error("No Apollo internet account found");const[l,i]=E.useState(""),[u,d]=E.useState(r[0]),[f,m]=E.useState([]),g=E.useCallback((async()=>{const{baseURL:e}=u,t=new URL("users",e).href,n=u.getFetcher({locationType:"UriLocation",uri:t});if(n){const e=await n(t,{method:"GET"});if(!e.ok){const t=await Dt(e,"Error when getting user data from db");return void i(t)}const a=await e.json();m(a.map((e=>void 0===e.role?{...e,role:""}:e)))}}),[u]);function p(e){return e===u.getUserId()}E.useEffect((()=>{g().catch((e=>{i(String(e))}))}),[g]);const h=[{field:"username",headerName:"User",width:140},{field:"email",headerName:"Email",width:160},{field:"role",headerName:"Role",width:140,type:"singleSelect",valueOptions:["readOnly","user","admin","none"],getOptionLabel(e){switch(e){case"readOnly":return"Read-only";case"user":return"User";case"admin":return"Admin";case"none":return"None";default:return"unknown"}},editable:!0},{field:"actions",type:"actions",getActions:n=>[De.default.createElement(x.GridActionsCellItem,{key:`delete-${n.id}`,icon:De.default.createElement(we.default,null),onClick:async()=>{globalThis.confirm("Delete this user?")&&await async function(n){const a=new t.DeleteUserChange({typeName:"DeleteUserChange",userId:n});await e.submit(a,{internetAccountId:u.internetAccountId}),m((e=>e.filter((e=>e._id!==n))))}(n.id)},disabled:p(n.id),label:"Delete"})]}];return De.default.createElement(Rt,{open:!0,fullScreen:!0,title:"Manage users",handleClose:n,"data-testid":"manage-users"},De.default.createElement(s.DialogContent,null,r.length>1?De.default.createElement(De.default.Fragment,null,De.default.createElement(s.DialogContentText,null,"Select account"),De.default.createElement(s.Select,{value:u.internetAccountId,onChange:function(e){const t=r.find((t=>t.internetAccountId===e.target.value));if(!t)throw new Error(`Could not find internetAccount with ID "${e.target.value}"`);d(t)},disabled:!l},o.map((e=>De.default.createElement(s.MenuItem,{key:e.id,value:e.internetAccountId},e.name))))):null,De.default.createElement("div",{style:{height:"100%",width:"100%"}},De.default.createElement(x.DataGrid,{pagination:!0,rows:f,columns:h,getRowId:e=>e._id,slots:{toolbar:x.GridToolbar},getRowHeight:()=>"auto",isCellEditable:e=>!p(e.id),processRowUpdate:async function(n){const a=new t.UserChange({typeName:"UserChange",role:n.role,userId:n._id});return await e.submit(a,{internetAccountId:u.internetAccountId}),n},onProcessRowUpdateError:e=>{i(String(e))}}))),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Close")),l?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},l)):null)}function Tn(e,t){const n=t[e];let a;if("three_prime"===e)a=`3'end (coords: ${n.min+1}-${n.max})`;else{if("five_prime"!==e)throw new Error(`Unexpected direction: "${e}"`);a=`5'end (coords: ${n.min+1}-${n.max})`}return a}function An({changeManager:e,handleClose:n,selectedFeature:a,setSelectedFeature:o,sourceAssemblyId:r,sourceFeature:l}){const[i,u]=E.useState(""),[d,f]=E.useState(),m=function(e){const t={},n=e.parent;if(!n)throw new Error("Unable to find parent of reference exon");let a=[];if(n.children)for(const[,e]of n.children)"exon"===e.type&&a.push(e);a=a.sort(((e,t)=>e.min===t.min?e.max-t.max:e.min-t.min)),n.strand&&-1===n.strand&&(a=a.reverse());let o=0;for(const n of a){if(n._id===e._id){a.length>o+1&&(t.three_prime=a[o+1]),o>0&&(t.five_prime=a[o-1]);break}o++}return t}(l);return De.default.createElement(Rt,{open:!0,title:"Merge exons",handleClose:n,maxWidth:!1,"data-testid":"merge-exons"},De.default.createElement("form",{onSubmit:function(s){s.preventDefault(),u("");const{parent:i}=l;if(!d||!i)return;a?._id===l._id&&o();const f=new t.MergeExonsChange({changedIds:[l._id],typeName:"MergeExonsChange",assembly:r,firstExon:c.getSnapshot(l),secondExon:c.getSnapshot(d),parentFeatureId:i._id});e.submit(f),n(),s.preventDefault()}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},0===Object.keys(m).length?"There are no neighbouring exons to merge with":"Merge with exon on:",De.default.createElement(s.FormControl,{style:{marginTop:5}},De.default.createElement(s.RadioGroup,{"aria-labelledby":"demo-radio-buttons-group-label",name:"radio-buttons-group",value:d,onChange:e=>{u("");const{value:t}=e.target;f(m[t])}},Object.keys(m).map((e=>De.default.createElement(s.FormControlLabel,{value:e,key:e,control:De.default.createElement(s.Radio,null),label:De.default.createElement(s.Box,{display:"flex",alignItems:"center"},Tn(e,m))})))))),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",type:"submit",disabled:0===Object.keys(m).length||void 0===d},"Submit"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Cancel"))),i?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},i)):null)}function Fn(e){let t;return t=e.attributes.get("gff_name")?e.attributes.get("gff_name")?.join(","):e.attributes.get("gff_id")?e.attributes.get("gff_id")?.join(","):e._id,`${t} [${e.min+1}-${e.max}]`}function kn({changeManager:e,handleClose:n,selectedFeature:a,session:o,setSelectedFeature:r,sourceAssemblyId:l,sourceFeature:i}){const[u,d]=E.useState(""),f=function(e,t){const n=e.parent;if(!n)throw new Error("Unable to find parent of reference transcript");const{featureTypeOntology:a}=t.apolloDataStore.ontologyManager;if(!a)throw new Error("featureTypeOntology is undefined");const o={};if(n.children)for(const[,t]of n.children)a.isTypeOf(t.type,"transcript")&&t._id!==e._id&&(o[t._id]=t);return o}(i,o),m=Object.keys(f).at(0),[g,p]=E.useState(m);return De.default.createElement(Rt,{open:!0,title:"Merge transcripts",handleClose:n,maxWidth:!1,"data-testid":"merge-transcripts"},De.default.createElement("form",{onSubmit:function(o){if(o.preventDefault(),d(""),!g)return;const s=f[g];if(a?._id===i._id&&r(),!i.parent)throw new Error("Cannot find parent");const u=new t.MergeTranscriptsChange({changedIds:[i._id],typeName:"MergeTranscriptsChange",assembly:l,firstTranscript:c.getSnapshot(i),secondTranscript:c.getSnapshot(s),parentFeatureId:i.parent._id});e.submit(u),n()}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},0===Object.keys(f).length?"There are no transcripts to merge with":"Merge with transcript:",De.default.createElement(s.FormControl,{style:{marginTop:5}},De.default.createElement(s.RadioGroup,{"aria-labelledby":"demo-radio-buttons-group-label",name:"radio-buttons-group",value:g,onChange:e=>{d("");const{value:t}=e.target;p(t)}},Object.keys(f).map((e=>De.default.createElement(s.FormControlLabel,{value:e,key:e,control:De.default.createElement(s.Radio,null),label:De.default.createElement(s.Box,{display:"flex",alignItems:"center"},Fn(f[e]))})))))),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",type:"submit",disabled:0===Object.keys(f).length||void 0===g},"Submit"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Cancel"))),u?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},u)):null)}function Dn({handleClose:e,session:t}){const{apolloDataStore:n}=t,{addAssembly:a,addSessionAssembly:o,assemblyManager:l,notify:i}=t,[c,u]=E.useState(null),[d,f]=E.useState(""),[m,g]=E.useState(""),[p,h]=E.useState(!1),y=s.useTheme();return De.default.createElement(Rt,{open:!0,title:"Open local GFF3 file",handleClose:e,maxWidth:!1,"data-testid":"open-local-file"},De.default.createElement("form",{onSubmit:async function(s){if(s.preventDefault(),g(""),h(!0),!c)throw new Error("No file selected");const u=await new Response(c).text(),f=`${d}-${c.name}-${_.nanoid(8)}`;try{await dt(f,u,n)}catch(t){return console.error(t),i(`Error loading GFF3 ${c.name}, ${String(t)}`,"error"),void e()}const m={};if(r.isElectron){const{webUtils:e}=globalThis.require("electron");m.file=e.getPathForFile(c)}const p={name:f,aliases:[d],displayName:d,sequence:{trackId:`sequenceConfigId-${d}`,type:"ReferenceSequenceTrack",adapter:{type:"ApolloSequenceAdapter",assemblyId:f},metadata:{apollo:!0,...m}}};await(r.isElectron?a?.(p):(o||a)(p));const y=await l.waitForAssembly(p.name);y?(t.addApolloTrackConfig(y),i(`Loaded GFF3 ${c.name}`,"success")):i(`Error loading GFF3 ${c.name}`,"error"),e()}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.FormControl,null,De.default.createElement("div",{style:{flexDirection:"row"}},De.default.createElement(s.Button,{variant:"contained",component:"label",style:{marginRight:y.spacing()}},"Choose File",De.default.createElement("input",{type:"file",required:!0,hidden:!0,onChange:function(e){const t=e.target.files?.item(0);if(t&&(g(""),u(t),!d)){const e=t.name,n=e.lastIndexOf(".");f(-1===n?e:e.slice(0,n))}}})),c?c.name:"No file chosen"),De.default.createElement(s.FormHelperText,null,"Make sure your GFF3 has an embedded FASTA section")),De.default.createElement(s.TextField,{required:!0,label:"Assembly name",value:d,onChange:function(e){f(e.target.value)}})),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{disabled:!1,variant:"contained",type:"submit"},p?"Submitting...":"Submit"),De.default.createElement(s.Button,{disabled:p,variant:"outlined",type:"submit",onClick:e},"Cancel"))),m?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},m)):null)}!function(e){e.GENE_AND_SUBFEATURES="GENE_AND_SUBFEATURES",e.TRANSCRIPT_AND_SUBFEATURES="TRANSCRIPT_AND_SUBFEATURES",e.CUSTOM="CUSTOM"}(mn||(mn={}));const Nn=C.makeStyles()((e=>({changeTextarea:{fontFamily:"monospace",width:600,resize:"none",border:`1px solid ${e.palette.divider}`,borderRadius:e.shape.borderRadius}})));function Rn({handleClose:t,session:n}){const{internetAccounts:a}=c.getRoot(n),o=a.find((e=>"ApolloInternetAccount"===e.type));if(!o)throw new Error("No Apollo internet account found");const{baseURL:r}=o,{classes:l}=Nn(),[i,u]=E.useState(),[d,f]=E.useState([]),[m,g]=E.useState(""),[p,h]=E.useState([]),y=[{field:"sequence"},{field:"typeName",headerName:"Change type",width:200,type:"singleSelect",valueOptions:[...e.changeRegistry.changes.keys()]},{field:"changes",headerName:"Change JSON",width:600,renderCell:({value:e})=>De.default.createElement("textarea",{className:l.changeTextarea,value:JSON.stringify(e),readOnly:!0}),valueFormatter:({value:e})=>JSON.stringify(e)},{field:"user",headerName:"User",width:140},{field:"createdAt",headerName:"Time",width:160,type:"dateTime",valueGetter:e=>e&&new Date(e)}];return E.useEffect((()=>{(async function(){const e=new URL("assemblies",r).href,t=o?.getFetcher({locationType:"UriLocation",uri:e});if(t){const n=await t(e,{method:"GET"});if(!n.ok){const e=await Dt(n,"Error when retrieving assemblies from server");return void u(e)}const a=await n.json();f(a)}})().catch((e=>{u(String(e))}))}),[o,r]),E.useEffect((()=>{!m&&d.length>0&&g(d[0]._id)}),[m,d]),E.useEffect((()=>{(async function(){if(!m)return;const e=new URL("changes",r),t=new URLSearchParams({assembly:m});e.search=t.toString();const n=e.toString(),a=o?.getFetcher({locationType:"UriLocation",uri:n});if(a){const e=await a(n,{headers:new Headers({"Content-Type":"application/json"})});if(!e.ok){const t=await Dt(e,"Error when retrieving changes");return void u(t)}const t=await e.json();h(t)}})().catch((e=>{u(String(e))}))}),[m,o,r]),De.default.createElement(Rt,{open:!0,fullScreen:!0,title:"View change log",handleClose:t,"data-testid":"view-changelog"},De.default.createElement(s.Select,{style:{width:200,marginLeft:40},value:m,onChange:function(e){g(e.target.value)}},d.map((e=>De.default.createElement(s.MenuItem,{key:e._id,value:e._id},e.name)))),De.default.createElement(s.DialogContent,null,De.default.createElement(x.DataGrid,{pagination:!0,rows:p,columns:y,getRowId:e=>e._id,slots:{toolbar:x.GridToolbar},initialState:{sorting:{sortModel:[{field:"sequence",sort:"desc"}]},columns:{columnVisibilityModel:{sequence:!1}}}})),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:t},"Close")),i?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},i)):null)}const In=[{field:"refName",headerName:"Ref Name"},{field:"aliases",headerName:"Aliases",editable:!0}],Mn=e=>/^[\da-f]{24}$/i.test(e);function Ln({changeManager:e,handleClose:n,session:a}){const o=E.useRef(null),[r,l]=E.useState(""),[i,c]=E.useState(!1),[u,d]=E.useState(),[f,m]=E.useState([]),[g,p]=E.useState(new Map),{apolloDataStore:h}=a,{collaborationServerDriver:y}=h,b=y.getAssemblies();E.useEffect((()=>{let e=0;const t=()=>{if(!u)return;const n=new Map;if(e<2&&!u.refNames&&(e++,setTimeout(t,50)),!u.refNames)return;const a=u.refNameAliases;for(const e in a){const t=a[e];if(t&&!Mn(e))if(n.has(t)){const a=n.get(t)??[];n.set(t,[...a,e])}else n.set(t,[e])}p(n)};t()}),[u]);const S=()=>[...g].map(((e,t)=>({id:t,refName:e[0],aliases:e[1].filter((t=>t!==e[0])).join(", ")})));return De.default.createElement(Rt,{open:!0,title:"Add reference sequence aliases",handleClose:n,maxWidth:"sm","data-testid":"add-refseq-alias",fullWidth:!0},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.Grid,{container:!0,spacing:2},De.default.createElement(s.Grid,null,De.default.createElement(s.FormControl,{disabled:i&&!r,fullWidth:!0},De.default.createElement(s.InputLabel,{id:"demo-simple-select-label"},"Assembly"),De.default.createElement(s.Select,{labelId:"demo-simple-select-label",id:"demo-simple-select",label:"Assembly",value:u?.name??"",onChange:e=>{const t=b.find((t=>t.name===e.target.value));d(t),c(!1),l(""),o.current&&(o.current.value="")}},b.map((e=>De.default.createElement(s.MenuItem,{key:e.name,value:e.name},e.displayName)))))),De.default.createElement(s.Grid,null,De.default.createElement(s.InputLabel,null,"Load RefName alias"),De.default.createElement("input",{type:"file",onChange:e=>{(async e=>{if(!e.target.files)return;const t=e.target.files[0],n=(await t.text()).split("\n"),a=new Map(g);l("");for(const e of n){const t=e.split("\t");for(const e of t)a.has(e)&&a.set(e,[...a.get(e)??[],...t])}p(a)})(e).catch((()=>{l("Error reading file")}))},ref:o,disabled:i&&!r||!u}))),u&&g.size>0?De.default.createElement("div",{style:{height:200,width:"100%",marginTop:20}},De.default.createElement(s.InputLabel,null,"Refname aliases found for selected assembly."),De.default.createElement(x.DataGrid,{rows:S(),columns:In,initialState:{pagination:{paginationModel:{page:0,pageSize:5}}},pageSizeOptions:[5,10],onRowSelectionModelChange:e=>{(e=>{if(e.length>0){c(!0);const t=e.flatMap((e=>S().filter((t=>t.id===e))));m(t)}else c(!1),m([])})(e)},processRowUpdate:(e,t)=>{const n=new Map(g);return n.set(e.refName,e.aliases.split(",")),p(n),e},checkboxSelection:!0})):null),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",type:"submit",disabled:!i,onClick:()=>{const a=[];for(const e of f){const{refName:t}=e,n=e.aliases.split(",").map((e=>e.trim())).filter((e=>e.length>0));a.push({refName:t,aliases:n})}if(l(""),!u)return void l("No assembly selected");const o=new t.AddRefSeqAliasesChange({typeName:"AddRefSeqAliasesChange",assembly:u.name,refSeqAliases:a});e.submit(o).catch((()=>{l("Error submitting change")})),n()}},"Submit"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Close")),r?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},r)):null)}function qn({handleClose:e,session:t}){const{internetAccounts:n}=c.getRoot(t),{collaborationServerDriver:a}=t.apolloDataStore,o=n.find((e=>"ApolloInternetAccount"===e.type));if(!o)throw new Error("No Apollo internet account found");const{baseURL:r}=o,[l,i]=E.useState(),[u,d]=E.useState(),[f,m]=E.useState([]),g=a.getAssemblies();return E.useEffect((()=>{!u&&g.length>0&&d(g[0])}),[g,u]),E.useEffect((()=>{(async function(){const e=u?.name;if(!e)return;const t=new URL("checks",r),n=new URLSearchParams({assembly:e});t.search=n.toString();const a=t.toString(),l=o?.getFetcher({locationType:"UriLocation",uri:a});if(l){const e=await l(a,{headers:new Headers({"Content-Type":"application/json"})});if(!e.ok){const t=await Dt(e,"Error when retrieving checks");return void i(t)}const t=await e.json();m(t)}})().catch((e=>{i(String(e))}))}),[u,o,r]),De.default.createElement(Rt,{open:!0,fullScreen:!0,title:"View check results",handleClose:e,"data-testid":"view-check-results"},De.default.createElement(s.Select,{style:{width:200,marginLeft:40},value:u?.name??"",onChange:function(e){const t=g.find((t=>t.name===e.target.value));d(t)},disabled:0===g.length},g.map((e=>De.default.createElement(s.MenuItem,{key:e.name,value:e.name},e.displayName)))),De.default.createElement(s.DialogContent,null,De.default.createElement(x.DataGrid,{pagination:!0,rows:f,columns:[{field:"_id",headerName:"id",width:50},{field:"name",headerName:"Check name",width:200},{field:"refSeq",headerName:"Reference sequence ID",width:200},{field:"ids",headerName:"Feature IDs",width:200},{field:"message",headerName:"Message",flex:1}],getRowId:e=>e._id,slots:{toolbar:x.GridToolbar},initialState:{sorting:{sortModel:[{field:"name",sort:"asc"}]},columns:{columnVisibilityModel:{name:!0}}}})),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:e},"Close")),l?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},l)):null)}function Pn(e){return e.max-e.min<2?{isSplittable:!1,comment:"This exon is too short to be split"}:{isSplittable:!0,comment:""}}function On({changeManager:e,handleClose:n,selectedFeature:a,setSelectedFeature:o,sourceAssemblyId:r,sourceFeature:l}){const[i,u]=E.useState(""),d=c.getSnapshot(l);return De.default.createElement(Rt,{open:!0,title:"Split exon",handleClose:n,maxWidth:!1,"data-testid":"split-exon"},De.default.createElement("form",{onSubmit:function(s){s.preventDefault(),u(""),a?._id===l._id&&o();const i=d.min+(d.max-d.min)/2,c=Math.floor(i),f=Math.ceil(i);if(!l.parent?._id)throw new Error("Splitting an exon without parent is not possible yet");const m=new t.SplitExonChange({changedIds:[l._id],typeName:"SplitExonChange",assembly:r,exonToBeSplit:d,parentFeatureId:l.parent._id,upstreamCut:c,downstreamCut:f,leftExonId:(new ke.default).toHexString(),rightExonId:(new ke.default).toHexString()});e.submit(m),n(),s.preventDefault()}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.DialogContentText,null,function(e){const t=Pn(e);return t.isSplittable?"Are you sure you want to split the selected exon?":t.comment}(d))),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",type:"submit",disabled:!Pn(d).isSplittable},"Yes"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Cancel"))),i?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},i)):null)}function _n(e){const{color:t}=e;return De.default.createElement(s.SvgIcon,{viewBox:"0 0 18 18",style:{fontSize:18,marginRight:4},...e},"disabled"===t?De.default.createElement("path",{d:"M9.001,10.71 l0,-3.348 l8.424,0 c0.126,0.567,0.225,1.098,0.225,1.845 c0,5.139,-3.447,8.793,-8.64,8.793 c-4.968,0,-9,-4.032,-9,-9 c0,-4.968,4.032,-9,9,-9 c2.43,0,4.464,0.891,6.021,2.349 l-2.556,2.484 c-0.648,-0.612,-1.782,-1.332,-3.465,-1.332 c-2.979,0,-5.409,2.475,-5.409,5.508 c0,3.033,2.43,5.508,5.409,5.508 c3.447,0,4.716,-2.385,4.95,-3.798 l-4.959,0 l0,-0.009 z"}):De.default.createElement(De.default.Fragment,null,De.default.createElement("path",{d:"M17.64,9.20454545 c0,-0.638,-0.057,-1.252,-0.164,-1.841 l-8.476,0 l0,3.481 l4.844,0 c-0.209,1.125,-0.843,2.079,-1.796,2.717 l0,2.258 l2.908,0 c1.702,-1.567,2.684,-3.874,2.684,-6.615 l0,0 z",fill:"#4285F4"}),De.default.createElement("path",{d:"M9,18 c2.43,0,4.467,-0.806,5.956,-2.18 l-2.908,-2.259 c-0.806,0.54,-1.837,0.859,-3.048,0.859 c-2.344,0,-4.328,-1.583,-5.036,-3.71 l-3.007,0 l0,2.332 c1.481,2.941,4.525,4.958,8.043,4.958 l0,0 z",fill:"#34A853"}),De.default.createElement("path",{d:"M3.96409091,10.71 c-0.18,-0.54,-0.282,-1.117,-0.282,-1.71 c0,-0.593,0.102,-1.17,0.282,-1.71 l0,-2.332 l-3.007,0 c-0.609,1.215,-0.957,2.59,-0.957,4.042 c0,1.452,0.348,2.827,0.957,4.042 l3.007,-2.332 l0,0 z",fill:"#FBBC05"}),De.default.createElement("path",{d:"M9,3.57954545 c1.321,0,2.508,0.454,3.44,1.346 l2.582,-2.581 c-1.559,-1.453,-3.596,-2.345,-6.022,-2.345 c-3.518,0,-6.562,2.017,-8.043,4.959 l3.007,2.331 c0.708,-2.127,2.692,-3.71,5.036,-3.71 l0,0 z",fill:"#EA4335"})))}function Bn(e){const{color:t}=e;return De.default.createElement(s.SvgIcon,{viewBox:"0 0 21 21",style:{fontSize:21},...e},De.default.createElement("rect",{x:"1",y:"1",width:"9",height:"9",fill:"disabled"===t?"#7B7B7B":"#F25022"}),De.default.createElement("rect",{x:"1",y:"11",width:"9",height:"9",fill:"disabled"===t?"#7B7B7B":"#00A4EF"}),De.default.createElement("rect",{x:"11",y:"1",width:"9",height:"9",fill:"disabled"===t?"#939393":"#7FBA00"}),De.default.createElement("rect",{x:"11",y:"11",width:"9",height:"9",fill:"disabled"===t?"#B9B9B9":"#FFB900"}))}const Un=C.makeStyles()((e=>({loginButton:{marginBottom:e.spacing(1),width:"220px",height:"40px",fontSize:"16px",textTransform:"none",justifyContent:"left",padding:"3px 12px"}})));function $n(e){const{classes:t}=Un(),{disabled:n}=e;return De.default.createElement(s.Button,{className:t.loginButton,variant:"outlined",startIcon:De.default.createElement(_n,{color:n?"disabled":void 0}),...e},"Sign in with Google")}function jn(e){const{classes:t}=Un(),{disabled:n}=e;return De.default.createElement(s.Button,{className:t.loginButton,variant:"outlined",startIcon:De.default.createElement(Bn,{color:n?"disabled":void 0}),...e},"Sign in with Microsoft")}function Gn(e){const{classes:t}=Un();return De.default.createElement(s.Button,{className:t.loginButton,variant:"outlined",startIcon:De.default.createElement(Oe.default,{fontSize:"small"}),...e},"Continue as Guest")}const Wn=C.makeStyles()((e=>({divider:{marginTop:e.spacing(4),marginBottom:e.spacing(5)}}))),zn=({baseURL:e,handleClose:t,name:n})=>{const{classes:a}=Wn(),[o,r]=E.useState(""),[l,i]=E.useState([]);function c(e){t("google"===e?"google":"microsoft"===e?"microsoft":"guest")}E.useEffect((()=>{const t=new AbortController,{signal:n}=t;return async function(){const t=new URL("auth/types",e).href,a=await fetch(t,{method:"GET",signal:n});if(!a.ok){const e=await Dt(a,"Error when retrieving auth types from server");return void r(e)}const o=await a.json();i(o)}().catch((e=>{N.isAbortException(e)||r(String(e))})),()=>{t.abort()}}),[e]);const u=l.includes("google"),d=l.includes("microsoft"),f=l.includes("guest");return De.default.createElement(Rt,{open:!0,title:`Log in to ${n}`,handleClose:t,maxWidth:!1,"data-testid":"login-apollo"},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column",paddingTop:8}},u?De.default.createElement($n,{disabled:!u,onClick:()=>{c("google")}}):null,d?De.default.createElement(jn,{disabled:!d,onClick:()=>{c("microsoft")}}):null,f?De.default.createElement(De.default.Fragment,null,De.default.createElement(s.Divider,{className:a.divider}),De.default.createElement(Gn,{onClick:()=>{c("guest")}})):null),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:()=>{t()}},"Cancel")),o?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},o)):null)},Hn="undefined"==typeof sessionStorage,Vn=n=>o.InternetAccount.named("ApolloInternetAccount").props({type:c.types.literal("ApolloInternetAccount"),configuration:a.ConfigurationReference(n)}).views((e=>({get baseURL(){return a.getConf(e,"baseURL")},getUserId(){const n=e.retrieveToken();if(n)return t.getDecodedToken(n).id}}))).volatile((()=>({role:void 0,controller:new AbortController}))).actions((e=>{let n=!1;return{setRole(){const a=e.retrieveToken();if(!a)return void(e.role=void 0);const o=t.getDecodedToken(a),{role:r}=o;if(!r&&!n){const{session:t}=c.getRoot(e);t.notify("You have registered as a user but have not been given access. Ask your administrator to enable access for your account.","warning"),n=!0}e.role!==r&&(e.role=r)}}})).actions((e=>{let t;return{addMessageChannel(e,n){t=t=>{this.finishOAuthWindow(t,e,n)},window.addEventListener("message",t)},deleteMessageChannel(){window.removeEventListener("message",t)},finishOAuthWindow(t,n,a){if(t.data.name!==`JBrowseAuthWindow-${e.internetAccountId}`)return void this.deleteMessageChannel();const o=t.data.redirectUri.replace("#","?"),r=new URL(o),l=new URLSearchParams(r.search).get("access_token");this.deleteMessageChannel(),l?(e.storeToken(l),e.setRole(),n(l)):a(new Error("Error with token endpoint"))},async openAuthWindow(t,n,a){const o=r.isElectron?"http://localhost/auth":globalThis.location.origin+globalThis.location.pathname,l=new URL("auth/login",e.baseURL),s=new URLSearchParams({type:t,redirect_uri:o});l.search=s.toString();const i=`JBrowseAuthWindow-${e.internetAccountId}`;if(r.isElectron){const{ipcRenderer:t}=globalThis.require("electron"),r=await t.invoke("openAuthWindow",{internetAccountId:e.internetAccountId,data:{redirect_uri:o},url:l.toString()}),s=new MessageEvent("message",{data:{name:i,redirectUri:r}});this.finishOAuthWindow(s,n,a)}else this.addMessageChannel(n,a),window.open(l,i,"width=500,height=600")}}})).actions((e=>({async getTokenFromUser(t,n){const{baseURL:a}=e,o=await new Promise(((t,n)=>{const{session:a}=c.getRoot(e),{baseURL:o,name:r}=e;a.queueDialog((e=>[zn,{name:r,handleClose:a=>{a?a instanceof Error?n(a):t(a):n(new Error("user cancelled entry")),e()},baseURL:o}]))}));if("guest"!==o)return void e.openAuthWindow(o,t,n);const r=new URL("auth/login",a),l=new URLSearchParams({type:o});r.search=l.toString();const s=r.toString(),i=await fetch(s,{signal:e.controller.signal});if(!i.ok){const e=await Dt(i,"Error when logging in");return void n(new Error(e))}const{token:u}=await i.json();t(u)}}))).volatile((()=>({lastChangeSequenceNumber:void 0}))).actions((e=>({setLastChangeSequenceNumber(t){e.lastChangeSequenceNumber=t}}))).actions((t=>({updateLastChangeSequenceNumber:c.flow((function*(){const{baseURL:e}=t,n=new URL("changes",e),a=new URLSearchParams({limit:"1"});n.search=a.toString();const o=n.toString(),r=t.getFetcher({locationType:"UriLocation",uri:o});let l;try{l=yield r(o,{method:"GET",signal:t.controller.signal})}catch(e){return void(t.controller.signal.aborted||console.error(e))}if(!l.ok){const e=yield Dt(l,"Error when fetching server LastChangeSequence");throw new Error(e)}const s=yield l.json();t.setLastChangeSequenceNumber(s.length>0?s[0].sequence:0)})),getMissingChanges:c.flow((function*(){const{session:n}=c.getRoot(t),{changeManager:a}=n.apolloDataStore;if(!t.lastChangeSequenceNumber)throw new Error("No LastChangeSequence stored in session. Please, refresh you browser to get last updates from server");const{baseURL:o,lastChangeSequenceNumber:r}=t,l=new URL("changes",o),s=new URLSearchParams({since:String(r),sort:"1"});l.search=s.toString();const i=l.toString(),u=t.getFetcher({locationType:"UriLocation",uri:i});let d;try{d=yield u(i,{method:"GET",signal:t.controller.signal})}catch(e){return void(t.controller.signal.aborted||console.error(e))}if(!d.ok)return void console.error(`Error when fetching the last updates to recover socket connection — ${d.status}`);const f=yield d.json();for(const t of f){const n=e.Change.fromJSON(t);a.submit(n,{submitToBackend:!1})}}))}))).volatile((e=>{const{origin:t,pathname:n}=new URL("socket.io/",e.baseURL);return{socket:u.io(t,{path:n})}})).actions((n=>({addSocketListeners(){const{session:a}=c.getRoot(n),{notify:o}=a,r=n.retrieveToken();if(!r)throw new Error("No Token found");const l=t.getDecodedToken(r),s=t.makeUserSessionId(l),{socket:i}=n,{addCheckResult:u,changeManager:d,deleteCheckResult:f}=a.apolloDataStore;i.on("connect",(()=>{n.getMissingChanges()})),i.on("connect_error",(e=>{console.error(e),o("Could not connect to the Apollo server.","error")})),i.on("COMMON",(t=>{if("checkResult"in t)return void(t.deleted?f(t.checkResult._id.toString()):u(t.checkResult));if(sessionStorage.setItem("LastChangeSequence",String(t.changeSequence)),t.userSessionId===s)return;const n=e.Change.fromJSON(t.changeInfo);d.submit(n,{submitToBackend:!1})})),i.on("USER_LOCATION",(e=>{const{channel:t,locations:n,userName:o,userSessionId:r}=e;"USER_LOCATION"===t&&r!==s&&a.addOrUpdateCollaborator({name:o,id:r,locations:n})})),i.on("REQUEST_INFORMATION",(e=>{const{channel:t,userSessionId:n}=e;"REQUEST_INFORMATION"===t&&n!==r&&a.broadcastLocations()}))}}))).actions((e=>({postUserLocation:(t=>{let n;return t=>{clearTimeout(n),n=setTimeout((()=>{!async function(t){if(!c.isAlive(e))return;const{baseURL:n,controller:a}=e,o=new URL("users/userLocation",n).href,r=new URLSearchParams(JSON.stringify(t)),l=e.getFetcher({locationType:"UriLocation",uri:o});try{if(!(await l(o,{method:"POST",body:r,signal:a.signal})).ok)throw new Error("ignore")}catch{console.error("Broadcasting user location failed")}}(t)}),300)}})()}))).actions((e=>({initialize:c.flow((function*(t){if("admin"===t){const t=c.getRoot(e);r.isAbstractMenuManager(t)&&function(e){e.appendToMenu("Apollo",{label:"Admin",type:"subMenu",icon:Se.default,subMenu:[{label:"Add Assembly",icon:be.default,onClick:e=>{e.queueDialog((t=>[qt,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Delete Assembly",icon:we.default,onClick:e=>{e.queueDialog((t=>[bn,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Import Features",icon:Ee.default,onClick:e=>{e.queueDialog((t=>[En,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Add reference sequence aliases",onClick:e=>{e.queueDialog((t=>[Ln,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Add Assembly aliases",onClick:e=>{e.queueDialog((t=>[Ot,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Manage Users",icon:Ce.default,onClick:e=>{e.queueDialog((t=>[xn,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Manage Checks",icon:ve.default,onClick:e=>{e.queueDialog((t=>[vn,{session:e,handleClose:()=>{t()}}]))}}]})}(t)}yield e.updateLastChangeSequenceNumber(),e.addSocketListeners();const{baseURL:n}=e,a=new URL("users/locations",n).href,o=e.getFetcher({locationType:"UriLocation",uri:a});yield o(a,{method:"GET",signal:e.controller.signal}),window.addEventListener("beforeunload",(()=>{e.postUserLocation([])})),document.addEventListener("visibilitychange",(()=>{if("hidden"===document.visibilityState&&e.postUserLocation([]),"visible"===document.visibilityState){const{session:t}=c.getRoot(e);t.broadcastLocations()}}))}))}))).actions((e=>({afterAttach(){e.setRole(),i.autorun((async t=>{if(Hn)return;const{session:n}=c.getRoot(e);n&&e.role&&(await e.initialize(e.role),t.dispose())}),{name:"ApolloInternetAccount"})},beforeDestroy(){e.controller.abort("internet account beforeDestroy"),e.socket.close()}}))),Jn="undefined"==typeof sessionStorage;class Xn extends $.BaseAdapter{refNameAliases;async getRefNameAliases(){const e=a.readConfObject(this.config,"assemblyId");if(!Jn){const t=this.pluginManager?.rootModel?.session?.apolloDataStore;if(!t)throw new Error("No Apollo data store found");const n=t.getBackendDriver(e);return await n.getRefNameAliases(e)}const t=await new Promise(((t,n)=>{const a=setTimeout((()=>{n(new Error("timeout"))}),2e4),o=_.nanoid(),r=e=>{const n=e.data;(function(e){return"object"==typeof e&&null!==e&&"apollo"in e&&!0===e.apollo&&"refNameAliases"in e})(n)&&n.messageId===o&&(clearTimeout(a),removeEventListener("message",r),t(n.refNameAliases))};addEventListener("message",r),rpcServer.emit("apollo",{apollo:!0,method:"getRefNameAliases",assembly:e,messageId:o})}));return this.refNameAliases=t,t}freeResources(){}}var Kn=a.ConfigurationSchema("ApolloRefNameAliasAdapter",{assemblyId:{type:"string",defaultValue:""}},{explicitlyTyped:!0});function Zn(e){return"object"==typeof e&&null!==e&&"apollo"in e&&!0===e.apollo}const Yn="undefined"==typeof sessionStorage;class Qn extends $.BaseSequenceAdapter{regions;async getRefNames(){return(await this.getRegions()).map((e=>e.refName))}async getRegions(){if(this.regions)return this.regions;const e=a.readConfObject(this.config,"assemblyId");if(!Yn){const t=this.pluginManager?.rootModel?.session?.apolloDataStore;if(!t)throw new Error("No Apollo data store found");const n=t.getBackendDriver(e),a=await n.getRegions(e);return this.regions=a,a}const t=await new Promise(((t,n)=>{const a=setTimeout((()=>{n("timeout")}),2e4),o=_.nanoid(),r=e=>{const{data:n}=e;Zn(n)&&n.messageId===o&&(clearTimeout(a),removeEventListener("message",r),t(n.regions))};addEventListener("message",r),globalThis.rpcServer.emit("apollo",{apollo:!0,method:"getRegions",assembly:e,messageId:o})}));return this.regions=t,t}getFeatures(e){const{end:t,refName:n,start:o}=e,r=a.readConfObject(this.config,"assemblyId"),l={...e,assemblyName:r};return j.ObservableCreate((async e=>{if(!Yn){const a=this.pluginManager?.rootModel?.session?.apolloDataStore;if(!a)return void e.error("No Apollo data store found");const s=a.getBackendDriver(r),i=(await s.getRegions(l.assemblyName)).find((e=>e.refName===l.refName));if(!i)return void e.error("Cannot get region");l.end>i.end&&(l.end=i.end);const{seq:c}=await s.getSequence(l);return e.next(new Be.default({id:`${n} ${o}-${t}`,data:{refName:n,start:o,end:t,seq:c}})),void e.complete()}const a=await new Promise(((e,t)=>{const n=setTimeout((()=>{t("timeout")}),2e4),a=_.nanoid(),o=t=>{const{data:r}=t;Zn(r)&&r.messageId===a&&(clearTimeout(n),removeEventListener("message",o),e(r.sequence))};addEventListener("message",o),globalThis.rpcServer.emit("apollo",{apollo:!0,method:"getSequence",region:l,messageId:a})}));e.next(new Be.default({id:`${n} ${o}-${t}`,data:{refName:n,start:o,end:t,seq:a}})),e.complete()}))}freeResources(){}}var ea=a.ConfigurationSchema("ApolloSequenceAdapter",{assemblyId:{type:"string",defaultValue:""}},{explicitlyTyped:!0});class ta extends $.BaseAdapter{get baseURL(){return a.readConfObject(this.config,"baseURL").uri}get trackId(){return a.readConfObject(this.config,"trackId")}get assemblyNames(){return a.readConfObject(this.config,"assemblyNames")}mapBaseResult(e,t,n){return e.map((e=>{const a=t.getCanonicalRefName(e.refSeq);return new Ue.default({label:n,trackId:this.trackId,locString:`${a}:${e.min+1}..${e.max}`})}))}async searchIndex(e){const t=e.queryString,n=[],a=this.pluginManager?.rootModel?.session;if(!a)return n;const{apolloDataStore:o}=a,{assemblyManager:r}=a;for(const a of this.assemblyNames){const l=o.getBackendDriver(a),s=r.get(a);if(!l||!s)continue;const i=await l.searchFeatures(e.queryString,[a]);n.push(...this.mapBaseResult(i,s,t))}return n}freeResources(){}}var na=a.ConfigurationSchema("ApolloTextSearchAdapter",{assemblyNames:{type:"stringArray",defaultValue:[],description:"List of assemblies covered by text search adapter"},trackId:{type:"string",defaultValue:""},baseURL:{type:"fileLocation",defaultValue:{uri:"",locationType:"UriLocation"}}},{explicitlyTyped:!0,explicitIdentifier:"textSearchAdapterId"});const aa=C.makeStyles()((e=>({attributeKey:{fontWeight:"bold",marginRight:e.spacing(2)}})));function oa({attributeKey:e}){const{classes:n}=aa(),a=/^[A-Z]/.test(e);let o,r=e;return t.isGFFInternalAttribute(e)?(r=t.internalToGFF[e],o=`On GFF3 export, this will be assigned to the GFF3's reserved "${r}" attribute`):t.isGFFColumnInternal(e)?(r=t.gffInternalToColumn[e],o=`On GFF3 export, this will be placed in the GFF3's "${r}" column`):a&&(o="On GFF3 export, this attribute will be changed to start with a lower-case letter because attributes starting with an upper-case letter are reserved in GFF3"),De.default.createElement("div",{style:{display:"flex"}},De.default.createElement(s.Typography,{className:n.attributeKey},r),o?De.default.createElement(s.Tooltip,{title:o},De.default.createElement(s.Chip,{icon:De.default.createElement(xe.default,null),label:"GFF3",size:"small",variant:"outlined"})):null)}const ra="Custom",la={[ra]:"custom"};for(const[e,n]of Object.entries(t.gffToInternal))la[`GFF ${n}`]=e;for(const[e,n]of Object.entries(t.gffColumnToInternal))la[`GFF ${n}`]=e;const sa=F.observer((function({setKey:e,session:t}){const{pluginManager:n}=r.getEnv(t),a=n.evaluateExtensionPoint("Apollo-ReservedAttributeKeys",la),o=Object.keys(a).at(0)??ra,[l,i]=E.useState(o),[c,u]=E.useState(),d=l===ra;return De.default.createElement("form",{onSubmit:function(t){t.preventDefault(),e(d?c:a[l])}},De.default.createElement("div",{style:{display:"flex",flexDirection:"column",margin:8}},De.default.createElement(s.FormControl,{variant:"outlined"},De.default.createElement(s.InputLabel,{id:"attribute-key-select-label"},"Key"),De.default.createElement(s.Select,{labelId:"attribute-key-select-label",value:l,label:"Key",onChange:e=>{i(e.target.value)}},Object.keys(a).map((e=>De.default.createElement(s.MenuItem,{key:e,value:e},e))))),d?De.default.createElement(s.TextField,{label:"Attribute key",variant:"outlined",id:"attributeKey",onChange:e=>{u(e.target.value)}}):null),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{color:"primary",variant:"contained",type:"submit",disabled:d&&!c},"Add"),De.default.createElement(s.Button,{variant:"outlined",onClick:function(){e()}},"Cancel")))})),ia=F.observer((function({onChangeCommitted:e,value:t,...n}){const[a,o]=E.useState(String(t)),[r,l]=E.useState(!1),[i,c]=E.useState(null);return E.useEffect((()=>{o(String(t))}),[t]),E.useEffect((()=>{r&&(i?.blur(),l(!1))}),[r,i]),De.default.createElement(s.TextField,{...n,type:"text",onChange:function(e){o(e.target.value)},value:a,onKeyDown:e=>{"Enter"===e.key?i?.blur():"Escape"===e.key&&(o(String(t)),l(!0))},onBlur:()=>{a!==String(t)&&e(a)},inputRef:e=>{c(e)}})})),ca=F.observer((function({attributeValues:e,setAttribute:t,isNew:n=!1}){const[a,o]=E.useState(e&&e.length>0?e:[""]);return De.default.createElement(De.default.Fragment,null,a.map(((e,t)=>De.default.createElement("div",{key:`${t}-${e}`,style:{display:"flex"}},De.default.createElement(ia,{value:e,onChangeCommitted:e=>{!function(e,t){o((n=>{const a=[...n];return a[e]=t,a}))}(t,e)},variant:"outlined",fullWidth:!0}),De.default.createElement(s.IconButton,{"aria-label":"delete",size:"medium",edge:"end",onClick:()=>{!function(e){o((t=>{const n=[...t];return n.splice(e,1),n}))}(t)}},De.default.createElement(we.default,{fontSize:"inherit"}))))),De.default.createElement(s.IconButton,{"aria-label":"add",size:"medium",color:"secondary",edge:"start",onClick:function(){o((e=>{const t=[...e];return t.push(""),t}))}},De.default.createElement(We.default,{fontSize:"inherit"})),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{color:"primary",variant:"contained",onClick:()=>{t(a.filter(Boolean))}},n?"Add":"Update"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:()=>{t()}},"Cancel")))}));function ua({values:e}){return De.default.createElement(De.default.Fragment,null,e?.map(((e,t)=>De.default.createElement(s.Typography,{key:`${t}.${e}`,variant:"body2",color:"textSecondary"},e))))}const da=C.makeStyles()((e=>({list:{"li:nth-of-type(odd)":{backgroundColor:e.palette.action.focus},"li:nth-of-type(even)":{backgroundColor:e.palette.action.hover}}}))),fa=F.observer((function({assembly:e,editable:n,feature:a,session:o}){const{pluginManager:l}=r.getEnv(o),{classes:u}=da(),[d,f]=E.useState(null),[m,g]=E.useState(null),[p,h]=E.useState(null),[y,b]=E.useState(!1),[S,w]=E.useState(),C=Boolean(d),{changeManager:v}=o.apolloDataStore,{notify:x}=o;function T(){f(null),g(null)}const{_id:A,attributes:F}=a,k=l.evaluateExtensionPoint("Apollo-AttributeEditorComponent",ca,{key:S});return De.default.createElement(De.default.Fragment,null,De.default.createElement(s.List,{className:u.list},i.entries(F).map((([r,i])=>{const u=l.evaluateExtensionPoint("Apollo-AttributeEditorComponent",ca,{key:r}),d=l.evaluateExtensionPoint("Apollo-AttributeViewerComponent",ua,{key:r});return De.default.createElement(s.ListItem,{key:r,secondaryAction:n&&!p?De.default.createElement(s.IconButton,{edge:"end",onClick:e=>{!function(e,t){f(e.currentTarget),g(t)}(e,r)}},De.default.createElement(Ge.default,null)):null},De.default.createElement(s.ListItemText,{disableTypography:!0,primary:De.default.createElement(oa,{attributeKey:r}),secondary:p===r?De.default.createElement(u,{session:o,attributeValues:i,setAttribute:n=>{h(null),n&&function(n,o){const r={...c.getSnapshot(F)},l=structuredClone(r);if(!(n in r))return void x(`"${n}" not found in feature attributes`,"error");if(r[n].toString()===o.toString())return;r[n]=o;const s=new t.FeatureAttributeChange({changedIds:[a._id],typeName:"FeatureAttributeChange",assembly:e,featureId:a._id,oldAttributes:l,newAttributes:r});v.submit(s)}(r,n)}}):De.default.createElement(d,{values:i})}))})),S?De.default.createElement(s.ListItem,null,De.default.createElement(s.ListItemText,{disableTypography:!0,primary:De.default.createElement(oa,{attributeKey:S}),secondary:De.default.createElement(k,{session:o,attributeValues:[],setAttribute:n=>{n&&function(n,o){const r={...c.getSnapshot(F)},l=structuredClone(r);if(n in r)return void x(`Feature already has attribute "${n}"`,"error");r[n]=o;const s=new t.FeatureAttributeChange({changedIds:[a._id],typeName:"FeatureAttributeChange",assembly:e,featureId:a._id,oldAttributes:l,newAttributes:r});v.submit(s)}(S,n),w(void 0)},isNew:!0})})):null),n?De.default.createElement(s.Button,{color:"primary",variant:"contained",disabled:y||Boolean(S),onClick:()=>{b(!0)}},"Add new"):null,y?De.default.createElement(s.Paper,{variant:"outlined",style:{marginTop:8}},De.default.createElement(sa,{session:o,setKey:e=>{w(e),b(!1)}})):null,De.default.createElement(s.Menu,{anchorEl:d,open:C,onClose:T},De.default.createElement(s.MenuItem,{onClick:function(){m&&function(n){const a=c.getSnapshot(F),{[n]:o,...r}=a,l=new t.FeatureAttributeChange({changedIds:[A],typeName:"FeatureAttributeChange",assembly:e,featureId:A,oldAttributes:a,newAttributes:r});v.submit(l)}(m),T()}},De.default.createElement(s.ListItemIcon,null,De.default.createElement(we.default,{fontSize:"small"})),De.default.createElement(s.Typography,{variant:"inherit"},"Delete")),De.default.createElement(s.MenuItem,{onClick:function(){m&&h(m),T()}},De.default.createElement(s.ListItemIcon,null,De.default.createElement(je.default,{fontSize:"small"})),De.default.createElement(s.Typography,{variant:"inherit"},"Edit"))))})),ma=F.observer((function({onChangeCommitted:e,value:t,...n}){const[a,o]=E.useState(String(t)),[r,l]=E.useState(!1),[i,c]=E.useState(null);E.useEffect((()=>{o(String(t))}),[t]),E.useEffect((()=>{r&&(i?.blur(),l(!1))}),[r,i]);const u=Number.isNaN(Number(a));return De.default.createElement(s.TextField,{...n,type:"text",onChange:function(e){o(e.target.value)},value:a,onKeyDown:e=>{"Enter"===e.key?i?.blur():"Escape"===e.key&&(o(String(t)),l(!0))},onBlur:()=>{const n=Number(a);a!==String(t)&&(Number.isNaN(n)?o(String(t)):e(n))},inputRef:e=>{c(e)},error:u,helperText:u?"Not a valid number":void 0})})),ga=F.observer((function({assembly:e,feature:n,session:a}){const[o,r]=E.useState(""),[l,i]=E.useState(""),{_id:c,assemblyId:u,max:d,min:f,strand:m,type:g}=n,p=e=>{a.notify(e.message,"error")},{changeManager:h}=a.apolloDataStore;function y(n){const{value:a}=n.target,o=a?Number(a):void 0,r=new t.StrandChange({typeName:"StrandChange",changedIds:[c],featureId:c,oldStrand:m,newStrand:o,assembly:e});return h.submit(r)}return De.default.createElement("div",{"data-testid":"basic_information"},De.default.createElement(ma,{margin:"dense",id:"start",label:"Start",fullWidth:!0,variant:"outlined",value:f+1,onChangeCommitted:function(n){n--;const a=new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[c],featureId:c,oldStart:f,newStart:n,assembly:e});return h.submit(a)}}),De.default.createElement(ma,{margin:"dense",id:"end",label:"End",fullWidth:!0,variant:"outlined",value:d,onChangeCommitted:function(n){const a=new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[c],featureId:c,oldEnd:d,newEnd:n,assembly:e});return h.submit(a)}}),De.default.createElement(dn,{session:a,ontologyName:"Sequence Ontology",value:g,filterTerms:sn,fetchValidTerms:async function(e,t,n){const a=await un(e,t);if(a)return a;i(`Type "${e?.type}" does not have any children in the ontology`)}.bind(null,n),renderInput:e=>De.default.createElement(s.TextField,{...e,label:"Type",variant:"outlined",fullWidth:!0,error:Boolean(l),helperText:l}),onChange:(e,n)=>{n&&function(e){r("");const n=new t.TypeChange({typeName:"TypeChange",changedIds:[c],featureId:c,oldType:g,newType:e,assembly:u});return h.submit(n)}(n).catch(p)}}),De.default.createElement("label",null,De.default.createElement("input",{type:"radio",value:"1",checked:1===m,onChange:y}),"Positive Strand (+)"),De.default.createElement("label",null,De.default.createElement("input",{type:"radio",value:"-1",checked:-1===m,onChange:y}),"Negative Strand (-)"),De.default.createElement("label",null,De.default.createElement("input",{type:"radio",value:"",checked:void 0===m,onChange:y}),"No Strand Information"),o?De.default.createElement(s.Typography,{color:"error"},o):null)})),pa=F.observer((function(e){const{feature:t,model:n}=e,{children:a,parent:o}=t,r=[];if(a)for(const[,e]of a)r.push(e);return o??r.length>0?De.default.createElement("div",{style:{marginTop:10}},o&&De.default.createElement("div",null,De.default.createElement(s.Typography,{variant:"h6"},"Parent:"),De.default.createElement(s.Button,{variant:"contained",onClick:()=>{n.setFeature(o)}},o.type,pt(o)," (",o.min,"..",o.max,")")),r.length>0&&De.default.createElement("div",null,De.default.createElement(s.Typography,{variant:"h6"},1===r.length?"Child":"Children",":"),r.map((e=>De.default.createElement("div",{key:e._id,style:{marginBottom:5}},De.default.createElement(s.Button,{variant:"contained",onClick:()=>{n.setFeature(e)}},e.type,pt(e)," (",e.min,"..",e.max,")")))))):null})),ha=C.makeStyles()({sequence:{width:"100%",resize:"vertical"}}),ya=F.observer((function({assembly:e,feature:t,refName:n,session:a}){const o=a.apolloDataStore.assemblies.get(e),{classes:r}=ha();if(!t||!o)return null;const l=o.getByRefName(n);if(!l)return null;const{max:s,min:i}=t;let c=l.getSequence(i,s);return c?c=function(e,t,n,a,o){return`>${t}:${n+1}–${a}\n${e}`}(c,n,i,s):a.apolloDataStore.loadRefSeq([{assemblyName:e,refName:n,start:i,end:s}]),De.default.createElement("div",null,De.default.createElement("textarea",{readOnly:!0,rows:20,className:r.sequence,value:c}))})),ba=C.makeStyles()((e=>({root:{padding:e.spacing(2)}}))),Sa=F.observer((function(e){const{model:t}=e,{assembly:n,feature:a,refName:o}=t,l=r.getSession(t),i=l.apolloDataStore.assemblies.get(n),{classes:c}=ba(),[u,d]=E.useState(["attributes"]);if(E.useEffect((()=>{d(["attributes"])}),[a]),!a||!i)return null;const f=i.getByRefName(o);if(!f)return null;const{max:m,min:g}=a;function p(e,t){d(e?[...u,t]:u.filter((e=>e!==t)))}return f.getSequence(g,m)||l.apolloDataStore.loadRefSeq([{assemblyName:n,refName:o,start:g,end:m}]),De.default.createElement("div",{className:c.root},De.default.createElement(ga,{feature:a,session:l,assembly:i._id}),De.default.createElement(s.Accordion,{style:{marginTop:10},expanded:u.includes("attributes"),onChange:(e,t)=>{p(t,"attributes")}},De.default.createElement(s.AccordionSummary,{expandIcon:De.default.createElement($e.default,{style:{color:"white"}}),"aria-controls":"panel1-content",id:"panel1-header"},De.default.createElement(s.Typography,{component:"span"},"Attributes")),De.default.createElement(s.AccordionDetails,null,De.default.createElement(fa,{feature:a,session:l,assembly:i._id,editable:!0}))),De.default.createElement(s.Accordion,{style:{marginTop:10},expanded:u.includes("sequence"),onChange:(e,t)=>{p(t,"sequence")}},De.default.createElement(s.AccordionSummary,{expandIcon:De.default.createElement($e.default,{style:{color:"white"}}),"aria-controls":"panel2-content",id:"panel2-header"},De.default.createElement(s.Typography,{component:"span"},"Sequence")),De.default.createElement(s.AccordionDetails,null,u.includes("sequence")&&De.default.createElement(ya,{feature:a,session:l,assembly:i._id,refName:o}))),De.default.createElement(s.Accordion,{style:{marginTop:10},expanded:u.includes("related_features"),onChange:(e,t)=>{p(t,"related_features")}},De.default.createElement(s.AccordionSummary,{expandIcon:De.default.createElement($e.default,{style:{color:"white"}}),"aria-controls":"panel3-content",id:"panel3-header"},De.default.createElement(s.Typography,{component:"span"},"Related features")),De.default.createElement(s.AccordionDetails,null,De.default.createElement(pa,{model:t,feature:a}))))})),wa=c.types.model("ApolloFeatureDetailsWidget",{id:k.ElementId,type:c.types.literal("ApolloFeatureDetailsWidget"),feature:c.types.maybe(c.types.reference(X.AnnotationFeatureModel,{onInvalidated(e){e.parent.setTryReload(e.invalidId),e.removeRef()}})),assembly:c.types.string,refName:c.types.string}).volatile((()=>({tryReload:void 0}))).actions((e=>({setFeature(t){e.feature=t},setTryReload(t){e.tryReload=t}}))).actions((e=>({afterAttach(){c.addDisposer(e,i.autorun((t=>{if(!e.tryReload)return;const n=r.getSession(e),{apolloDataStore:a}=n;if(!a)return;const o=a.getFeature(e.tryReload);o&&(e.setFeature(o),e.setTryReload(),t.dispose())})))}}))),Ea=c.types.model("ApolloTranscriptDetails",{id:k.ElementId,type:c.types.literal("ApolloTranscriptDetails"),feature:c.types.maybe(c.types.reference(X.AnnotationFeatureModel,{onInvalidated(e){e.parent.setTryReload(e.invalidId),e.removeRef()}})),assembly:c.types.string,refName:c.types.string}).volatile((()=>({tryReload:void 0}))).actions((e=>({setFeature(t){e.feature=t},setTryReload(t){e.tryReload=t}}))).actions((e=>({afterAttach(){c.addDisposer(e,i.autorun((t=>{if(!e.tryReload)return;const n=r.getSession(e),{apolloDataStore:a}=n;if(!a)return;const o=a.getFeature(e.tryReload);o&&(e.setFeature(o),e.setTryReload(),t.dispose())})))}})));async function Ca(e){if(isSecureContext){const t=new Blob([e.outerText],{type:"text/plain"}),n=new Blob([e.outerHTML],{type:"text/html"}),a=new ClipboardItem({[t.type]:t,[n.type]:n});return navigator.clipboard.write([a])}const t=t=>{t.clipboardData?.setData("text/plain",e.outerText),t.clipboardData?.setData("text/html",e.outerHTML),t.preventDefault()};document.addEventListener("copy",t),document.execCommand("copy"),document.removeEventListener("copy",t)}function va(e,t,n){const a=[],{cdsLocations:o,strand:l,transcriptParts:s}=t;switch(e){case"genomic":case"cDNA":{const[t]=s;for(const o of t){if("cDNA"===e&&"intron"===o.type)continue;let t=n(o.min,o.max);-1===l&&(t=r.revcom(t));const s="fivePrimeUTR"===o.type||"threePrimeUTR"===o.type?"UTR":o.type,i=a.at(-1);i&&i.type===s?(i.sequence+=t,i.locs.push({min:o.min,max:o.max})):a.push({type:s,sequence:t,locs:[{min:o.min,max:o.max}]})}return a}case"CDS":{let e="";const[t]=o,s=[];for(const a of t){let t=n(a.min,a.max);-1===l&&(t=r.revcom(t)),e+=t,s.push({min:a.min,max:a.max})}return a.push({type:"CDS",sequence:e,locs:s}),a}case"protein":{let e="";const[t]=o,s=[];for(const a of t){let t=n(a.min,a.max);-1===l&&(t=r.revcom(t)),e+=t,s.push({min:a.min,max:a.max})}let i="";for(let t=0;t<e.length;t+=3){const n=e.slice(t,t+3).toUpperCase();i+=r.defaultCodonTable[n]||"&"}return a.push({type:"protein",sequence:i,locs:s}),a}}}function xa(e){switch(e){case"upOrDownstream":return"rgb(255,255,255)";case"exon":case"UTR":return"rgb(194,106,119)";case"CDS":return"rgb(93,168,153)";case"intron":return"rgb(187,187,187)";case"protein":return"rgb(148,203,236)"}}function Ta(e){const t=[],n=e.flatMap((e=>e.locs));let[a]=n;for(let e=1;e<n.length;e++)a.min===n[e].max||a.max===n[e].min?a={min:Math.min(a.min,n[e].min),max:Math.max(a.max,n[e].max)}:(t.push(a),a=n[e]);return t.push(a),t}const Aa=F.observer((function({assembly:e,feature:n,refName:a,session:o}){const r=o.apolloDataStore.assemblies.get(e),l=r?.getByRefName(a),{featureTypeOntology:i}=o.apolloDataStore.ontologyManager,c="genomic",u=["genomic","cDNA"],[d,f]=E.useState(u),[m,g]=E.useState(c),[p,h]=E.useState((()=>l?va(c,n,((e,t)=>l.getSequence(e,t))):[])),[y,b]=E.useState((()=>Ta(p))),S=s.useTheme(),w=E.useRef(null);if(E.useEffect((()=>{const{cdsLocations:e}=n,[t]=e;f(t.length>0?[...u,"CDS","protein"]:u)}),[n]),!r||!l)return null;const C=r.getByRefName(a);if(!C)return null;if(!i)throw new Error("featureTypeOntology is undefined");return i.isTypeOf(n.type,"transcript")?De.default.createElement(De.default.Fragment,null,De.default.createElement(s.Select,{defaultValue:"genomic",value:m,onChange:function(e){const t=e.target.value;g(t);const a=l?va(t,n,((e,t)=>l.getSequence(e,t))):[],o=Ta(a);h(a),b(o)},size:"small","data-testid":"sequenceOptionSelector"},d.map((e=>De.default.createElement(s.MenuItem,{key:e,value:e,"data-testid":`sequenceOption-${e}`},e)))),De.default.createElement(s.Button,{variant:"contained",onClick:()=>{const e=w.current;e&&Ca(e)},style:{marginLeft:10},size:"medium"},"Copy sequence"),De.default.createElement(s.Paper,{style:{fontFamily:"monospace",padding:S.spacing(),overflowX:"auto"},ref:w},">",C.name,":",y.map((e=>1===n.strand?`${e.min+1}-${e.max}`:`${e.max}-${e.min+1}`)).join(";"),"(strand=",1===n.strand?"+":"-",";length=",function(e){let t=0;for(const n of e)t+=n.sequence.length;return t}(p),")",De.default.createElement("br",null),function(e,n){const a=[];let o=0;for(const[n,r]of e.entries()){const e=o%60,l=o>0&&0===e?"\n":"";o+=r.sequence.length;const s=l+r.sequence.slice(0,60-e),i=[s,...t.splitStringIntoChunks(r.sequence.slice(s.length),60)],c=De.default.createElement("span",{key:`${r.type}-${n}`,style:{background:xa(r.type),color:S.palette.getContrastText(xa(r.type)),whiteSpace:"pre-line"}},i.join("\n"));a.push(c)}return a}(p))):null})),Fa=ze.default(ma)((()=>({"&.MuiFormControl-root":{marginTop:0,marginBottom:0,width:"100%"},"& .MuiInputBase-input":{fontSize:12,height:20,padding:1,paddingLeft:10}}))),ka=ze.default("div")({display:"flex",justifyContent:"center",alignItems:"center",textAlign:"left",width:"100%",overflowWrap:"break-word",wordWrap:"break-word",wordBreak:"break-all","& span":{fontSize:12}}),Da=e=>{const{strand:t}=e;return De.default.createElement("div",null,1===t?De.default.createElement(be.default,null):-1===t?De.default.createElement(Je.default,null):De.default.createElement(s.Typography,{component:"span"},"N/A"))},Na=F.observer((function({assembly:e,feature:n,refName:a,session:o}){const{notify:l}=o,i=o.apolloDataStore.assemblies.get(e),c=i?.getByRefName(a),{changeManager:u}=o.apolloDataStore,d=E.useRef(null);if(!c)return null;const{apolloDataStore:f}=o,{featureTypeOntology:m}=f.ontologyManager;if(!m.isTypeOf(n.type,"transcript")&&!m.isTypeOf(n.type,"pseudogenic_transcript"))throw new Error("Feature is not a transcript or equivalent");const{cdsLocations:g,transcriptExonParts:p,strand:h}=n,[y]=g,[b,S]=((e,t)=>{const{transcriptExonParts:n}=e,a=n.filter((e=>t.isTypeOf(e.type,"exon"))).sort((({min:e},{min:t})=>e-t)),o=a[0]?.min,r=a[a.length-1]?.max;return[o,r]})(n,m);let w=b,C=S;const v=y.length>0;if(v){const e=y.toSorted((({min:e},{min:t})=>e-t));w=e[0].min,C=e[e.length-1].max}function x(n,a,o,r){if(!o.children)throw new Error("Transcript should have child features");const s=M(o,m,n,r);if(!s)return void l("No matching exon found","error");const i=r?s.min:s.max,{prevExon:c,nextExon:d}=L(o,m,i,r);if(r&&a>=s.max)return void l("Start location should be less than overlapping exon end location","error");if(!r&&a<=s.min)return void l("End location should be greater than overlapping exon start location","error");if(c&&c.max+2>a)return void l("Start location should be greater than previous exon end location","error");if(d&&d.min-2<a)return void l("End location should be less than next exon start location","error");const f=D(o,m,n,r);if(!f)return void l("No matching CDS feature found","error");if(!r&&a<=f.min)return void l("End location should be greater than CDS start location","error");if(r&&a>=f.max)return void l("Start location should be less than CDS end location","error");const g=R(o,s.min,s.max,m);if(g){if(r&&a!==f.min){const n=new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[],changes:[],assembly:e});if(a<s.min)if(c)k(g,n,a),k(f,n,a);else{const e=o.parent;a<o.min&&(e&&a<e.min&&k(e,n,a),k(o,n,a),k(g,n,a),k(f,n,a))}else k(f,n,a);u.submit(n).catch((()=>{l("Error updating feature CDS start position","error")}))}if(!r&&a!==f.max){const n=new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[],changes:[],assembly:e});if(a>s.max)if(d)F(g,n,a),F(f,n,a);else{const e=o.parent;a>o.max&&(e&&a>e.max&&F(e,n,a),F(o,n,a),F(g,n,a),F(f,n,a))}else F(f,n,a);u.submit(n).catch((()=>{l("Error updating feature CDS end position","error")}))}}else l("No matching exon feature found","error")}const T=(n,a,o,r,s)=>{if(!o.children)throw new Error("Transcript should have child features");if(n===a)return;const i=D(o,m,n,r);if(!i)return void l("No matching CDS feature found","error");const c=r?new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[i._id],featureId:i._id,oldStart:i.min,newStart:a,assembly:e}):new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[i._id],featureId:i._id,oldEnd:i.max,newEnd:a,assembly:e});u.submit(c).then((()=>{s&&s()})).catch((()=>{l("Error updating feature CDS position","error")}))};function A(n,a,o,r){if(!o.children)throw new Error("Transcript should have child features");const{matchingExon:s,prevExon:i,nextExon:c}=L(o,m,n,r);if(!s)return void l("No matching exon found","error");if(r&&a>=s.max)return void l("Start location should be less than end location","error");if(!r&&a<=s.min)return void l("End location should be greater than start location","error");if(i&&i.max+2>a)return void l("Error while changing start location","error");if(c&&c.min-2<a)return void l("Error while changing end location","error");const d=R(o,s.min,s.max,m);if(!d)return void l("No matching exon feature found","error");const f=N(o,m);if(r&&a!==s.min){const n=new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[],changes:[],assembly:e});if(i)k(d,n,a);else{const e=o.min,t=o.parent;if(a<e)t&&a<t.min&&k(t,n,a),k(o,n,a),k(d,n,a);else if(a>e&&(k(d,n,a),k(o,n,a),t)){const[e]=I(t,o,a,m,r);t.min!=e&&k(t,n,e)}}f&&f.min>=s.min&&f.min<=s.max&&a>f.min&&k(f,n,a),u.submit(n).catch((()=>{l("Error updating feature exon start position","error")}))}if(!r&&a!==s.max){const n=new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[],changes:[],assembly:e});if(c)F(d,n,a);else{const e=o.max,t=o.parent;if(a>e)t&&a>t.max&&F(t,n,a),F(o,n,a),F(d,n,a);else if(a<e&&(F(d,n,a),F(o,n,a),t)){const[,e]=I(t,o,a,m,r);t.max!=e&&F(t,n,e)}}f&&f.max>=s.min&&f.max<=s.max&&a<f.max&&F(f,n,a),u.submit(n).catch((()=>{l("Error updating feature exon end position","error")}))}}const F=(e,t,n)=>{t.changedIds.push(e._id),t.changes.push({featureId:e._id,oldEnd:e.max,newEnd:n})},k=(e,t,n)=>{t.changedIds.push(e._id),t.changes.push({featureId:e._id,oldStart:e.min,newStart:n})},D=(e,t,n,a)=>{let o;for(const[,r]of e.children??[])if(t.isTypeOf(r.type,"CDS")){if(a&&n===r.min){o=r;break}if(!a&&n===r.max){o=r;break}}return o},N=(e,t)=>{let n;for(const[,a]of e.children??[])if(t.isTypeOf(a.type,"CDS")){n=a;break}return n},R=(e,t,n,a)=>{let o;for(const[,r]of e.children??[])if(a.isTypeOf(r.type,"exon")&&t===r.min&&n===r.max){o=r;break}return o},I=(e,t,n,a,o)=>{const r=[],l=[];for(const[,s]of e.children?.entries()??[])a.isTypeOf(s.type,"transcript")&&(s._id===t._id?o?(r.push(n),l.push(s.max)):(l.push(n),r.push(s.min)):(r.push(s.min),l.push(s.max)));return[Math.min(...r),Math.max(...l)]},M=(e,t,n,a)=>{const{transcriptExonParts:o}=e;let r;for(const[,e]of o.entries())if(t.isTypeOf(e.type,"exon")){if(!a&&n>=e.min&&n<=e.max){r=e;break}if(a&&n>=e.min&&n<=e.max){r=e;break}}return r},L=(e,t,n,a)=>{const{transcriptExonParts:o,strand:r}=e;let l,s,i,c;for(const[e,r]of o.entries())if(t.isTypeOf(r.type,"exon")){if(a&&r.min===n){l=r,s=e;break}if(!a&&r.max===n){l=r,s=e;break}}if(l&&void 0!==s){if(1===r&&s>0)for(let e=s-1;e>=0;e--){const n=o[e];if(t.isTypeOf(n.type,"exon")){i=n;break}}if(-1===r&&s<o.length-1)for(let e=s+1;e<o.length;e++){const n=o[e];if(t.isTypeOf(n.type,"exon")){i=n;break}}if(1===r&&s<o.length-1)for(let e=s+1;e<o.length;e++){const n=o[e];if(t.isTypeOf(n.type,"exon")){c=n;break}}if(-1===r&&s>0)for(let e=s-1;e>=0;e--){const n=o[e];if(t.isTypeOf(n.type,"exon")){c=n;break}}}return{matchingExon:l,prevExon:i,nextExon:c}},q=()=>{let e="";const[t]=g,a=t.toSorted((({min:e},{min:t})=>e-t));for(const t of a)e+=c.getSequence(t.min,t.max);-1===h&&(e=r.revcom(e));const o=[];for(let t=0;t<e.length;t+=3){const a=e.slice(t,t+3).toUpperCase(),l=r.defaultCodonTable[a]||"&";"ATG"===a?o.push(De.default.createElement(s.Typography,{component:"span",style:{backgroundColor:"yellow",cursor:"pointer",border:"1px solid black"},key:t,onClick:()=>{const e=P(t);e!==w&&1===h&&T(w,e,n,!0),e!==C&&-1===h&&T(C,e,n,!1)}},l)):["TAA","TAG","TGA"].includes(a)?o.push(De.default.createElement(s.Typography,{style:{backgroundColor:"red",color:"white"},component:"span",key:t},l)):o.push(De.default.createElement(s.Typography,{component:"span",key:t},l))}return o},P=e=>{const[t]=g;let n=0;const a=t.toSorted((({min:e},{min:t})=>e-t));if(1===h)for(const t of a){const a=t.max-t.min;if(n+a>e)return t.min+(e-n);n+=a}else if(-1===h)for(let t=a.length-1;t>=0;t--){const o=a[t],r=o.max-o.min;if(n+r>e)return o.max-(e-n);n+=r}return 1===h?w:C};return De.default.createElement("div",null,v&&De.default.createElement("div",null,De.default.createElement(s.Accordion,null,De.default.createElement(La,{expandIcon:De.default.createElement($e.default,{style:{color:"white"}}),"aria-controls":"panel1-content",id:"panel1-header"},De.default.createElement(s.Typography,{component:"span",fontWeight:"bold"},"Translation")),De.default.createElement(s.AccordionDetails,null,De.default.createElement(ka,null,De.default.createElement(s.Typography,{component:"span",ref:d,style:{maxHeight:120,overflowY:"scroll"}},q())),De.default.createElement("div",{style:{marginTop:10,display:"flex",flexDirection:"row",alignItems:"center",gap:10}},De.default.createElement(s.Tooltip,{title:"Copy"},De.default.createElement(He.default,{style:{fontSize:15,cursor:"pointer"},onClick:()=>{const e=d.current;e&&Ca(e)}})),De.default.createElement(s.Tooltip,{title:"Trim"},De.default.createElement(Ve.default,{style:{fontSize:15,cursor:"pointer"},onClick:()=>{const e=q(),t=e.map((e=>e.props.children)).join("");if(t.startsWith("M")&&t.endsWith("*"))return;const a=[];for(const t of e)a.push({codonGenomicPos:t.key,sequenceLetter:t.props.children});if(0===a.length)return;const o=t.indexOf("M"),r=t.indexOf("*")+1,s=a[o].codonGenomicPos,i=a[r].codonGenomicPos;if(!s||!i)return;const c=P(s),u=P(i);if(1===h){if(c>u)return void l("Start codon genomic location should be less than stop codon genomic location","error");let e;c!==w&&(e=new Promise((e=>{T(w,c,n,!0,(()=>{e(!0)}))}))),u!==C&&(e?e.then((()=>{T(C,u,n,!1)})):T(C,u,n,!1))}if(-1===h){if(c<u)return void l("Start codon genomic location should be less than stop codon genomic location","error");let e;c!==C&&(e=new Promise((e=>{T(C,c,n,!1,(()=>{e(!0)}))}))),u!==w&&(e?e.then((()=>{T(w,u,n,!0)})):T(w,u,n,!0))}l("Translation sequence trimmed to start and stop codons","success")}}))))),De.default.createElement(s.Grid,{container:!0,justifyContent:"center",alignItems:"center",style:{textAlign:"center",marginTop:10}},De.default.createElement(s.Grid,{size:1}),De.default.createElement(s.Grid,{size:4},De.default.createElement(Fa,1===h?{margin:"dense",variant:"outlined",value:w+1,onChangeCommitted:e=>{x(w,e-1,n,!0)},style:{border:"1px solid black",borderRadius:5}}:{margin:"dense",variant:"outlined",value:C,onChangeCommitted:e=>{x(C,e,n,!1)},style:{border:"1px solid black",borderRadius:5}})),De.default.createElement(s.Grid,{size:2},De.default.createElement(s.Typography,{component:"span"},"CDS")),De.default.createElement(s.Grid,{size:4},De.default.createElement(Fa,1===h?{margin:"dense",variant:"outlined",value:C,onChangeCommitted:e=>{x(C,e,n,!1)},style:{border:"1px solid black",borderRadius:5}}:{margin:"dense",variant:"outlined",value:w+1,onChangeCommitted:e=>{x(w,e-1,n,!0)},style:{border:"1px solid black",borderRadius:5}})),De.default.createElement(s.Grid,{size:1}))),De.default.createElement("div",{style:{marginTop:5}},p.map(((e,t)=>De.default.createElement("div",{key:t},"exon"===e.type&&De.default.createElement(s.Grid,{container:!0,justifyContent:"center",alignItems:"center",style:{textAlign:"center"}},De.default.createElement(s.Grid,{size:1},0!==t&&((e,t)=>{let n="";if(t>0){const a=p[t-1];1===h?"intron"===a.type&&(n=c.getSequence(e.min-2,e.min)):"intron"===a.type&&(n=r.revcom(c.getSequence(e.max,e.max+2)))}return n=n.toUpperCase(),[{spliceSite:n,color:"AG"===n?"green":"red"}]})(e,t).map(((e,t)=>De.default.createElement(s.Typography,{key:t,component:"span",color:e.color},e.spliceSite)))),De.default.createElement(s.Grid,{size:4,style:{padding:0}},De.default.createElement(Fa,1===h?{margin:"dense",variant:"outlined",value:e.min+1,onChangeCommitted:t=>{A(e.min,t-1,n,!0)}}:{margin:"dense",variant:"outlined",value:e.max,onChangeCommitted:t=>{A(e.max,t,n,!1)}})),De.default.createElement(s.Grid,{size:2},De.default.createElement(Da,{strand:n.strand})),De.default.createElement(s.Grid,{size:4,style:{padding:0}},De.default.createElement(Fa,1===h?{margin:"dense",variant:"outlined",value:e.max,onChangeCommitted:t=>{A(e.max,t,n,!1)}}:{margin:"dense",variant:"outlined",value:e.min+1,onChangeCommitted:t=>{A(e.min,t-1,n,!0)}})),De.default.createElement(s.Grid,{size:1},t!==p.length-1&&((e,t)=>{let n="";if(t<p.length-1){const a=p[t+1];1===h?"intron"===a.type&&(n=c.getSequence(e.max,e.max+2)):"intron"===a.type&&(n=r.revcom(c.getSequence(e.min-2,e.min)))}return n=n.toUpperCase(),[{spliceSite:n,color:"GT"===n?"green":"red"}]})(e,t).map(((e,t)=>De.default.createElement(s.Typography,{key:t,component:"span",color:e.color},e.spliceSite))))))))))})),Ra=ze.default(s.TableCell)((()=>({fontWeight:"bold"}))),Ia=F.observer((function(e){const{feature:t}=e,n=mt(t),a=gt(t);return De.default.createElement(s.Table,{size:"small",sx:{fontSize:"0.75rem","& .MuiTableCell-root":{padding:"4px"}}},De.default.createElement(s.TableBody,null,""!==n&&De.default.createElement(s.TableRow,null,De.default.createElement(Ra,null,"Name"),De.default.createElement(s.TableCell,null,mt(t))),""!==a&&De.default.createElement(s.TableRow,null,De.default.createElement(Ra,null,"ID"),De.default.createElement(s.TableCell,null,gt(t))),De.default.createElement(s.TableRow,null,De.default.createElement(Ra,null,"Type"),De.default.createElement(s.TableCell,null,t.type)),De.default.createElement(s.TableRow,null,De.default.createElement(Ra,null,"Location"),De.default.createElement(s.TableCell,null,e.refName,":",t.min,"..",t.max)),De.default.createElement(s.TableRow,null,De.default.createElement(Ra,null,"Strand"),De.default.createElement(s.TableCell,null,1===(o=t.strand)?"Forward":-1===o?"Reverse":""))));var o})),Ma=C.makeStyles()((e=>({root:{padding:e.spacing(2)}}))),La=ze.default(s.AccordionSummary)((()=>({minHeight:30,maxHeight:30,"&.Mui-expanded":{minHeight:30,maxHeight:30}})));function qa(e){return null}const Pa=F.observer((function(e){const{classes:t}=Ma(),n=["summary","location"],[a,o]=E.useState(n),{model:l}=e,{assembly:i,feature:u,refName:d}=l;E.useEffect((()=>{o(n)}),[u]);const f=r.getSession(l),{pluginManager:m}=r.getEnv(f),g=r.getSession(l),p=g.apolloDataStore.assemblies.get(i),{internetAccounts:h}=c.getRoot(f),y=h.find((e=>"ApolloInternetAccount"===e.type)),b=["admin","user"].includes((y?y.role:"admin")??"");if(!u||!p)return null;const S=p.getByRefName(d);if(!S)return null;const{max:w,min:C}=u;function v(e,t){o(e?[...a,t]:a.filter((e=>e!==t)))}S.getSequence(C,w)||g.apolloDataStore.loadRefSeq([{assemblyName:i,refName:d,start:C,end:w}]);const x=m.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-InsideSummary",qa,{feature:u,session:f}),T=m.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-AfterSummary",qa,{feature:u,session:f}),A=m.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-InsideLocation",qa,{feature:u,session:f}),F=m.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-AfterLocation",qa,{feature:u,session:f}),k=m.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-InsideAttributes",qa,{feature:u,session:f}),D=m.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-AfterAttributes",qa,{feature:u,session:f}),N=m.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-InsideSequence",qa,{feature:u,session:f}),R=m.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-AfterSequence",qa,{feature:u,session:f});return De.default.createElement("div",{className:t.root},De.default.createElement(s.Accordion,{expanded:a.includes("summary"),onChange:(e,t)=>{v(t,"summary")}},De.default.createElement(La,{expandIcon:De.default.createElement($e.default,{style:{color:"white"}}),"aria-controls":"panel1-content",id:"panel1-header"},De.default.createElement(s.Typography,{component:"span",fontWeight:"bold"},"Summary")),De.default.createElement(s.AccordionDetails,null,De.default.createElement(Ia,{feature:u,refName:d}),De.default.createElement(x,{session:f,feature:u}))),De.default.createElement(T,{session:f,feature:u}),De.default.createElement(s.Accordion,{style:{marginTop:5},expanded:a.includes("location"),onChange:(e,t)=>{v(t,"location")}},De.default.createElement(La,{expandIcon:De.default.createElement($e.default,{style:{color:"white"}}),"aria-controls":"panel2-content",id:"panel2-header"},De.default.createElement(s.Typography,{component:"span",fontWeight:"bold"},"Location")),De.default.createElement(s.AccordionDetails,null,De.default.createElement(Na,{feature:u,refName:d,session:g,assembly:p._id||""}),De.default.createElement(A,{session:f,feature:u}))),De.default.createElement(F,{session:f,feature:u}),De.default.createElement(s.Accordion,{style:{marginTop:5},expanded:a.includes("attrs"),onChange:(e,t)=>{v(t,"attrs")}},De.default.createElement(La,{expandIcon:De.default.createElement($e.default,{style:{color:"white"}}),"aria-controls":"panel3-content",id:"panel3-header"},De.default.createElement("div",{style:{display:"flex",alignItems:"center"}},De.default.createElement(s.Typography,{component:"span",fontWeight:"bold"},"Attributes"," "),De.default.createElement(s.Tooltip,{title:"Separate multiple values for the attribute with commas"},De.default.createElement(xe.default,{style:{color:"white",fontSize:15,marginLeft:10}})))),De.default.createElement(s.AccordionDetails,null,De.default.createElement(fa,{feature:u,session:g,assembly:p._id||"",editable:b}),De.default.createElement(k,{session:f,feature:u}))),De.default.createElement(D,{session:f,feature:u}),De.default.createElement(s.Accordion,{style:{marginTop:5},expanded:a.includes("sequence"),onChange:(e,t)=>{v(t,"sequence")}},De.default.createElement(La,{expandIcon:De.default.createElement($e.default,{style:{color:"white"}}),"aria-controls":"panel4-content",id:"panel4-header"},De.default.createElement(s.Typography,{component:"span",fontWeight:"bold"},"Sequence")),De.default.createElement(s.AccordionDetails,null,a.includes("sequence")&&De.default.createElement(Aa,{feature:u,session:g,assembly:p._id||"",refName:d}),De.default.createElement(N,{session:f,feature:u}))),De.default.createElement(R,{feature:u,session:f}))})),Oa=a.ConfigurationSchema("LinearApolloDisplay",{},{explicitIdentifier:"displayId",explicitlyTyped:!0}),_a=C.makeStyles()({highlighted:{background:"orange"}}),Ba=({highlight:e,text:t})=>{const{classes:n}=_a();if(!e)return De.default.createElement(De.default.Fragment,null,t);const a=t.split(e);if(1===a.length)return De.default.createElement(De.default.Fragment,null,t);const o=[];for(let t=0;t<a.length-1;t++)o.push(a[t],De.default.createElement("span",{className:n.highlighted},e));return De.default.createElement(De.default.Fragment,null,o,a.at(-1))},Ua=F.observer((function({feature:e,filterText:t}){const n=[...e.attributes.entries()].map((([e,t])=>{if(e.startsWith("gff_")){const n=e.slice(4);return[n.charAt(0).toUpperCase()+n.slice(1),c.getSnapshot(t)]}return"_id"===e?["ID",c.getSnapshot(t)]:[e,c.getSnapshot(t)]})).filter((([e])=>e)).map((([e,t])=>`${e}=${Array.isArray(t)?t.join(", "):t}`)).join(", ");return De.default.createElement(Ba,{text:n,highlight:t})})),$a=C.makeStyles()((e=>({inputWrapper:{position:"relative"},hiddenWidthSpan:{padding:e.spacing(.5),color:"transparent"},numberTextInput:{border:"none",background:"inherit",font:"inherit",position:"absolute",width:"100%",left:0}}))),ja=F.observer((function({initialValue:e,notifyError:t,onChangeCommitted:n}){const[a,o]=E.useState(e),[r,l]=E.useState(!1),[s,i]=E.useState(null),{classes:c}=$a();return E.useEffect((()=>{e!==a&&o(e)}),[e]),E.useEffect((()=>{r&&(s?.blur(),l(!1))}),[r,s]),De.default.createElement("span",{className:c.inputWrapper},De.default.createElement("span",{className:c.hiddenWidthSpan,"aria-hidden":!0},a),De.default.createElement("input",{type:"text",value:a,className:c.numberTextInput,onChange:function(e){const t=Number(e.target.value);Number.isNaN(t)||o(t)},onKeyDown:t=>{"Enter"===t.key?s?.blur():"Escape"===t.key&&(o(e),l(!0))},onBlur:()=>{a!==e&&n(a).catch(t)},ref:e=>{i(e)}}))})),Ga=C.makeStyles()((e=>({typeContent:{display:"inline-block",width:"174px",height:"100%",cursor:"text"},feature:{td:{position:"relative",verticalAlign:"top",paddingLeft:"0.5em"}},arrow:{display:"inline-block",width:"1.6em",textAlign:"center",cursor:"pointer"},arrowExpanded:{transform:"rotate(90deg)"},hoveredFeature:{backgroundColor:e.palette.action.hover},typeInputElement:{border:"none",background:"none"},typeErrorMessage:{color:"red"}})));function Wa(e,t){const{changeManager:n,getAssemblyId:a,regions:o,selectedFeature:l,session:s,setSelectedFeature:i,filteredTranscripts:u,updateFilteredTranscripts:d}=e;return function(e,t,n,a,o,l,s,i,u){const d=function(e){const{internetAccounts:t}=c.getParent(e);return t.find((e=>"ApolloInternetAccount"===e.type))}(l),f=d?d.role:"admin",m="admin"===f,g=!(f&&["admin","user"].includes(f)),p=[];if(e){const c=e.attributes.get("gff_id")?.toString(),f=n(t.assemblyName),h=n(t.assemblyName);p.push({label:"Edit feature details",onClick:()=>{const n=l.addWidget("ApolloFeatureDetailsWidget","apolloFeatureDetailsWidget",{feature:e,assembly:h,refName:t.refName});l.showWidget(n)}},{label:"Add child feature",disabled:g,onClick:()=>{l.queueDialog((t=>[fn,{session:l,handleClose:()=>{t()},changeManager:s,sourceFeature:e,sourceAssemblyId:f,internetAccount:d}]))}},{label:"Copy features and annotations",disabled:g,onClick:()=>{l.queueDialog((t=>[yn,{session:l,handleClose:()=>{t()},changeManager:s,sourceFeature:e,sourceAssemblyId:h}]))}},{label:"Delete feature",disabled:!m,onClick:()=>{l.queueDialog((t=>[Sn,{session:l,handleClose:()=>{t()},changeManager:s,sourceFeature:e,sourceAssemblyId:h,selectedFeature:a,setSelectedFeature:o}]))}},{label:"Merge transcripts",disabled:!m,onClick:()=>{l.queueDialog((t=>[kn,{session:l,handleClose:()=>{t()},changeManager:s,sourceFeature:e,sourceAssemblyId:h,selectedFeature:a,setSelectedFeature:o}]))}},{label:"Merge exons",disabled:!m,onClick:()=>{l.queueDialog((t=>[An,{session:l,handleClose:()=>{t()},changeManager:s,sourceFeature:e,sourceAssemblyId:h,selectedFeature:a,setSelectedFeature:o}]))}},{label:"Split exon",disabled:!m,onClick:()=>{l.queueDialog((t=>[On,{session:l,handleClose:()=>{t()},changeManager:s,sourceFeature:e,sourceAssemblyId:h,selectedFeature:a,setSelectedFeature:o}]))}});const{featureTypeOntology:y}=l.apolloDataStore.ontologyManager;if(!y)throw new Error("featureTypeOntology is undefined");(y.isTypeOf(e.type,"transcript")||y.isTypeOf(e.type,"pseudogenic_transcript"))&&r.isSessionModelWithWidgets(l)&&p.push({label:"Edit transcript details",onClick:()=>{const n=l.addWidget("ApolloTranscriptDetails","apolloTranscriptDetails",{feature:e,assembly:h,changeManager:s,refName:t.refName});l.showWidget(n)}},{label:"Visible",type:"checkbox",checked:!c||!i.includes(c),onClick:()=>{if(c){const e=i.includes(c)?i.filter((e=>e!==c)):[...i,c];u(e)}}})}return p}(t,o[0],a,l,i,s,n,u,d)}const za=F.observer((function e({depth:n,feature:a,isHovered:o,isSelected:r,model:l,selectedFeatureClass:s,setContextMenu:i}){const{classes:c}=Ga(),{changeManager:u,hoveredFeature:d,selectedFeature:f,session:m,tabularEditor:g}=l,{featureCollapsed:p,filterText:h}=g,{_id:y,children:b,max:S,min:w,strand:E,type:C}=a,v=!p.get(y),x=e=>{m.notify(e.message,"error")};return De.default.createElement(De.default.Fragment,null,De.default.createElement("tr",{onMouseEnter:e=>{l.setHoveredFeature({feature:a,bp:w})},className:c.feature+(r?` ${s}`:o?` ${c.hoveredFeature}`:""),onClick:e=>{e.stopPropagation(),l.setSelectedFeature(a)},onDoubleClick:()=>{l.setSelectedFeature(a),function(e,t){e.lgv.navTo(vt(t,.1,e.lgv.totalBp))}(l,a)},onContextMenu:e=>(e.preventDefault(),i({position:{left:e.clientX+2,top:e.clientY-6},items:Wa(l,a)}),!1)},De.default.createElement("td",{style:{whiteSpace:"nowrap",borderLeft:2*n+"em solid transparent"}},b?.size?De.default.createElement("div",{onClick:e=>{e.stopPropagation(),g.setFeatureCollapsed(y,v)},className:c.arrow+(v?` ${c.arrowExpanded}`:"")},"❯"):null,De.default.createElement("div",{className:c.typeContent},De.default.createElement(dn,{session:m,ontologyName:"Sequence Ontology",style:{width:170},value:C,filterTerms:sn,fetchValidTerms:Ha.bind(null,a),renderInput:e=>De.default.createElement("div",{ref:e.InputProps.ref},De.default.createElement("input",{type:"text",...e.inputProps,className:c.typeInputElement,style:{width:170}}),e.error?De.default.createElement("div",{className:c.typeErrorMessage},e.errorMessage??"unknown error"):null),onChange:(e,n)=>{n&&function(e,n,a,o){const r=n._id,l=new t.TypeChange({typeName:"TypeChange",changedIds:[r],featureId:r,oldType:String(a),newType:String(o),assembly:n.assemblyId});return e.submit(l)}(u,a,e,n).catch(x)}}))),De.default.createElement("td",null,De.default.createElement(ja,{initialValue:w+1,notifyError:x,onChangeCommitted:e=>function(e,n,a,o){const r=n._id,l=new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[r],featureId:r,oldStart:a,newStart:o,assembly:n.assemblyId});return e.submit(l)}(u,a,w,e-1)})),De.default.createElement("td",null,De.default.createElement(ja,{initialValue:S,notifyError:x,onChangeCommitted:e=>function(e,n,a,o){const r=n._id,l=new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[r],featureId:r,oldEnd:a,newEnd:o,assembly:n.assemblyId});return e.submit(l)}(u,a,S,e)})),De.default.createElement("td",null,1===E?"+":-1===E?"-":void 0),De.default.createElement("td",null,De.default.createElement(Ua,{filterText:h,feature:a}))),v&&b?[...b.entries()].filter((e=>{if(!h)return!0;const[,t]=e;return JSON.stringify(t).includes(h)})).map((([t,a])=>De.default.createElement(e,{isHovered:d?.feature._id===a._id,isSelected:f?._id===a._id,selectedFeatureClass:s,key:t,depth:(n||0)+1,feature:a,model:l,setContextMenu:i}))):null)}));async function Ha(e,t,n){const{parent:a}=e;if(a){const e=(await t.getTermsWithLabelOrSynonym(a.type,{includeSubclasses:!1})).filter(sn);if(e.length>0)return await t.getClassesThat("part_of",e)}}const Va=C.makeStyles()((e=>({scrollableTable:{width:"100%",height:"100%",th:{position:"sticky",top:0,zIndex:2,textAlign:"left",background:e.palette.background.paper,paddingTop:"3.2em"},td:{whiteSpace:"normal"}},selectedFeature:{backgroundColor:e.palette.action.selected}}))),Ja=F.observer((function({model:e}){const{hoveredFeature:t,seenFeatures:n,selectedFeature:a,tabularEditor:o}=e,r=s.useTheme(),{classes:l}=Va(),i=E.useRef(null),[c,u]=E.useState(null),{filterText:d}=o;return E.useEffect((()=>{const e=i.current;if(e&&a){const t=e.querySelector(`.${l.selectedFeature}`);if(t){const n=e.scrollTop,a=t.offsetTop-25;a>n&&a<n+e.offsetHeight||e.scroll({top:a-40,behavior:"smooth"})}}}),[a,n,l.selectedFeature]),De.default.createElement("div",{ref:i,style:{width:"100%",overflowY:"auto",height:"100%"}},De.default.createElement("table",{className:l.scrollableTable},De.default.createElement("thead",null,De.default.createElement("tr",null,De.default.createElement("th",null,"Type"),De.default.createElement("th",null,"Start"),De.default.createElement("th",null,"End"),De.default.createElement("th",null,"Strand"),De.default.createElement("th",null,"Attributes"))),De.default.createElement("tbody",null,[...n.entries()].filter((e=>{if(!d)return!0;const[,t]=e;return JSON.stringify(t).includes(d)})).sort(((e,t)=>e[1].min-t[1].min)).map((([n,o])=>De.default.createElement(za,{key:n,isSelected:a?._id===n,isHovered:t?.feature._id===n,selectedFeatureClass:l.selectedFeature,feature:o,model:e,depth:0,setContextMenu:u}))))),De.default.createElement(T.Menu,{open:Boolean(c),onMenuItemClick:(e,t)=>{t(),u(null)},onClose:()=>{u(null)},slotProps:{transition:{onExit:()=>{u(null)}}},style:{zIndex:r.zIndex.tooltip},menuItems:c?.items??[],anchorReference:"anchorPosition",anchorPosition:c?.position}))})),Xa=C.makeStyles()({toolbar:{width:"100%",display:"flex",paddingRight:"2em",flexDirection:"row",justifyContent:"space-between",position:"absolute",zIndex:4},filterText:{}}),Ka=F.observer((function({model:e}){const t=e.tabularEditor,{classes:n}=Xa();return De.default.createElement("div",{className:n.toolbar},De.default.createElement(s.Tooltip,{title:"Collapse all"},De.default.createElement(s.IconButton,{"aria-label":"collapse",sx:{marginTop:0},onClick:t.collapseAllFeatures},De.default.createElement(Ke.default,null))),De.default.createElement(s.TextField,{className:n.filterText,label:"Filter features",value:t.filterText,sx:{marginTop:0},variant:"outlined",onChange:e=>{t.setFilterText(e.target.value)},slotProps:{input:{endAdornment:De.default.createElement(s.InputAdornment,{position:"end"},De.default.createElement(s.IconButton,{onClick:()=>{t.clearFilterText()}},De.default.createElement(Xe.default,null)))}}}))}));function Za(e){e.stopPropagation()}const Ya=F.observer((function({model:e}){return e.tabularEditor.isShown?De.default.createElement("div",{onMouseDown:Za,onClick:Za,style:{width:"100%",height:"100%",position:"relative"}},De.default.createElement(Ka,{model:e}),De.default.createElement(Ja,{model:e})):null})),Qa=c.types.model("TabularEditor",{isShown:!0,featureCollapsed:c.types.map(c.types.boolean),filterText:""}).actions((e=>({setFeatureCollapsed(t,n){e.featureCollapsed.set(t,n)},setFilterText(t){e.filterText=t},clearFilterText(){e.filterText=""},collapseAllFeatures(){const t=c.getParent(e);for(const[n]of t.seenFeatures.entries())e.featureCollapsed.set(n,!0)},togglePane(){e.isShown=!e.isShown},hidePane(){e.isShown=!1},showPane(){e.isShown=!0}})));function eo(e,t,n,a=!1){const{apolloRowHeight:o,lgv:r,theme:l}=e,s=e.getFeatureLayoutPosition(n);if(!s)return;const{bpPerPx:i,displayedRegions:c,offsetPx:u}=r,{layoutIndex:d,layoutRow:f}=s,m=c[d],{refName:g,reversed:p}=m,{length:h,max:y,min:b}=n,S=(r.bpToPx({refName:g,coord:p?y:b,regionNumber:d})?.offsetPx??0)-u,w=f*o,E=h/i;t.fillStyle=a?l.palette.action.disabled:l.palette.action.focus,t.fillRect(S,w,E,o)}function to(e,t,n,a,o,r){e.fillStyle=r,e.fillRect(t,n,a,o)}function no(e,t,n){const{refName:a,regionNumber:o,x:r}=e,{lgv:l}=n,{offsetPx:s}=l,i=l.bpToPx({refName:a,coord:t.min,regionNumber:o}),c=l.bpToPx({refName:a,coord:t.max,regionNumber:o});if(void 0!==i&&void 0!==c){const e=i.offsetPx-s,t=c.offsetPx-s;if(Math.abs(t-e)<8)return;if(Math.abs(e-r)<4)return"min";if(Math.abs(t-r)<4)return"max"}}const ao={draw:function(e,t,n,a,o){const{apolloRowHeight:r,lgv:l,selectedFeature:s,theme:i}=a,{bpPerPx:c,displayedRegions:u,offsetPx:d}=l,f=u[o],m=(l.bpToPx({refName:f.refName,coord:t.min,regionNumber:o})?.offsetPx??0)-d,{reversed:g}=f,p=t.length/c,h=g?m-p:m,y=n*r,b=i.palette.background.default;!function(e,t,n,a,o,r){to(e,t,n,a,o,r),a<=2||e.clearRect(t+1,n+1,a-2,o-2)}(e,h,y,p,r,i.palette.text.primary),p<=2||(function(e,t,n,a,o,r){to(e,t+1,n+1,a-2,o-2,r)}(e,h,y,p,r,b),St(t,s)&&eo(a,e,t,!0))},drawDragPreview:function(e,t){const{apolloDragging:n,apolloRowHeight:a,lgv:o,theme:r}=e,{bpPerPx:l,displayedRegions:i,offsetPx:c}=o;if(!n)return;const{current:u,edge:d,feature:f,start:m}=n,g=Math.floor(m.y/a),p=i[m.regionNumber],h=(p.reversed?p.end-f[d]:f[d]-p.start)/l-c,y=Math.min(u.x,h),b=g*a,S=Math.abs(u.x-h),w=1*a;t.strokeStyle=r.palette.info.main,t.setLineDash([6]),t.strokeRect(y,b,S,w),t.fillStyle=s.alpha(r.palette.info.main,.2),t.fillRect(y,b,S,w)},drawHover:function(e,t){const{hoveredFeature:n}=e;n&&eo(e,t,n.feature)},drawTooltip:function(e,t){const{hoveredFeature:n,apolloRowHeight:a,lgv:o,theme:r}=e;if(!n)return;const{feature:l}=n,i=e.getFeatureLayoutPosition(l);if(!i)return;const{featureRow:c,layoutIndex:u,layoutRow:d}=i,{bpPerPx:f,displayedRegions:m,offsetPx:g}=o,p=m[u],{refName:h,reversed:y}=p;let b="Loc: ";const{length:S,max:w,min:E}=l;b+=`${E+1}–${w}`;let C=(o.bpToPx({refName:h,coord:y?w:E,regionNumber:u})?.offsetPx??0)-g;const v=(d+c)*a,x=S/f,T=`Type: ${l.type}`,{attributes:A}=l,F=A.get("gff_name")?.find((e=>""!==e)),k=[t.measureText(T).width,t.measureText(b).width];F&&k.push(t.measureText(`Name: ${F}`).width);const D=Math.max(...k);C=C+x+5,t.fillStyle=s.alpha(r.palette.text.primary,.7),t.fillRect(C,v,D+4,3===k.length?45:35),t.beginPath(),t.moveTo(C,v),t.lineTo(C-5,v+5),t.lineTo(C,v+10),t.fill(),t.fillStyle=r.palette.background.default;let N=v+12;t.fillText(T,C+2,N),F&&(N+=12,t.fillText(`Name: ${F}`,C+2,N)),N+=12,t.fillText(b,C+2,N)},getContextMenuItemsForFeature:Ct,getContextMenuItems:function(e){const{hoveredFeature:t}=e;return t?Ct(e,t.feature):[]},getFeatureFromLayout:function(e,t,n){return e},getRowCount:function(e){return 1},getRowForFeature:function(e,t){return 0},onMouseDown:function(e,t,n){const{feature:a}=t,o=no(t,a,e);o&&(n.stopPropagation(),e.startDrag(t,a,o))},onMouseLeave:function(){},onMouseMove:function(e,t){if(Ft(t)){const{feature:n,bp:a}=t;if(e.setHoveredFeature({feature:n,bp:a}),no(t,n,e))return void e.setCursor("col-resize")}e.setCursor()},onMouseUp:function(e,t){if(e.apolloDragging)return;const{feature:n}=t;n&&(e.setSelectedFeature(n),e.showFeatureDetailsWidget(n))}};let oo=null,ro=null,lo=null,so=null;const io=globalThis.document.createElement("canvas");if(io?.getContext)for(const e of["forward","backward"])for(const t of["light","dark"]){const n=document.createElement("canvas"),a=10;n.width=n.height=a;const o=n.getContext("2d");if(o){const r="light"===t?"rgba(0,0,0,0)":"rgba(0,0,0,0.75)",l="light"===t?"rgba(255,255,255,0.25)":"rgba(0,0,0,0.50)",s="forward"===e?o.createLinearGradient(0,a,a,0):o.createLinearGradient(0,0,a,a);s.addColorStop(0,r),s.addColorStop(.25,r),s.addColorStop(.25,l),s.addColorStop(.5,l),s.addColorStop(.5,r),s.addColorStop(.75,r),s.addColorStop(.75,l),s.addColorStop(1,l),o.fillStyle=s,o.fillRect(0,0,10,10),"forward"===e?"light"===t?oo=o.createPattern(n,"repeat"):lo=o.createPattern(n,"repeat"):"light"===t?ro=o.createPattern(n,"repeat"):so=o.createPattern(n,"repeat")}}function co(e,t,n,a,o,r){const{apolloRowHeight:l,lgv:s,session:i}=n,{bpPerPx:c,displayedRegions:u,offsetPx:d}=s,f=u[a],{refName:m,reversed:g}=f,{apolloDataStore:p}=i,{featureTypeOntology:h}=p.ontologyManager;if(!h)throw new Error("featureTypeOntology is undefined");const y=(s.bpToPx({refName:m,coord:t.min,regionNumber:a})?.offsetPx??0)-d,b=t.length/c,S=g?y-b:y,w=o*l,E=yo(t,h)*l;e.fillStyle=r,e.fillRect(S,w,b,E)}function uo(e,t){return a.readConfObject(e.getPluginConfiguration(),"backgroundColorForFeature",{featureType:t})}function fo(e,t,n,a,o,r,l,s,i){const{apolloRowHeight:c,lgv:u,theme:d}=t,{bpPerPx:f,displayedRegions:m,offsetPx:g}=u,p=m[n],{refName:h,reversed:y}=p,b=(u.bpToPx({refName:h,coord:o.min,regionNumber:n})?.offsetPx??0)-g,S=o.length/f,w=y?b-S:b,E=(a+r)*c,C=Math.round(.6*c),v=E+(c-C)/2;if(e.fillStyle=d.palette.text.primary,e.fillRect(w,v,S,C),S>2&&(e.clearRect(w+1,v+1,S-2,C-2),e.fillStyle="rgb(211,211,211)",e.fillRect(w+1,v+1,S-2,C-2),s&&i&&l)){const t=y?-1:1,[n,a]=l*t==1?[s,i]:[i,s];e.fillStyle=n,e.fillRect(w+1,v+1,S-2,(C-2)/2),e.fillStyle=a,e.fillRect(w+1,v+1+(C-2)/2,S-2,(C-2)/2)}}function*mo(e,t,n=1){if(e!==t)if(e<t)for(let a=e;a<t;a+=n)yield a;else for(let a=e;a>t;a-=n)yield a}function go(e,t,n,a,o,r){const{apolloRowHeight:l,lgv:s,theme:i}=t,{bpPerPx:c,displayedRegions:u,offsetPx:d}=s,f=u[n],{refName:m,reversed:g}=f,p=(s.bpToPx({refName:m,coord:o.min,regionNumber:n})?.offsetPx??0)-d,h=Math.round(o.length/c),y=g?p-h:p,b=Math.round((r+.5)*l)+a*l;e.strokeStyle=i.palette.text.primary;const{strand:S=1}=o;e.beginPath();const w=y-(-1===S?5:0),E=y+h+(-1===S?0:5);e.moveTo(w,b),e.lineTo(E,b);const C=w+(-1===S?0:3),v=E-(-1===S?3:0),x=-1===S?3:-3,T=-1===S?mo(C,v,20):mo(v,C,20);for(const t of T)e.moveTo(t+x,b+x),e.lineTo(t,b),e.lineTo(t+x,b-x);e.stroke()}function po(e,t,n,a=!1){const{apolloRowHeight:o,lgv:r,session:l,theme:s}=e,{featureTypeOntology:i}=l.apolloDataStore.ontologyManager,c=e.getFeatureLayoutPosition(n);if(!c)return;const{bpPerPx:u,displayedRegions:d,offsetPx:f}=r,{featureRow:m,layoutIndex:g,layoutRow:p}=c,h=d[g],{refName:y,reversed:b}=h,{length:S,max:w,min:E}=n,C=(r.bpToPx({refName:y,coord:b?w:E,regionNumber:g})?.offsetPx??0)-f,v=(p+m)*o,x=S/u;if(t.fillStyle=a?s.palette.action.disabled:s.palette.action.focus,!i)throw new Error("featureTypeOntology is undefined");t.fillRect(C,v,x,o*yo(n,i))}function ho(e,t){const{children:n,type:a}=e;if(!n)return 0;let o=0;if(t.isTypeOf(a,"transcript"))for(const[,e]of n)t.isTypeOf(e.type,"CDS")&&(o+=1);return o}function yo(e,t,n){const{children:a,type:o}=e;if(!a)return 1;let r=0;if(t.isTypeOf(o,"transcript")||t.isTypeOf(o,"pseudogenic_transcript")){for(const[,e]of a)t.isTypeOf(e.type,"CDS")&&(r+=1);return 0===r?1:r}for(const[,e]of a)r+=yo(e,t);return r}function bo(e,t){if(!t.isTypeOf(e.type,"gene")&&!t.isTypeOf(e.type,"pseudogene"))throw new Error('Top level feature for GeneGlyph must have type "gene"');const{children:n}=e;if(!n)return[[e]];const a=[];for(const[,o]of n){if(!t.isTypeOf(o.type,"transcript")&&!t.isTypeOf(o.type,"pseudogenic_transcript")){a.push([o,e]);continue}if(!o.children)continue;const n=[],r=[];for(const[,e]of o.children)t.isTypeOf(e.type,"CDS")?n.push(e):t.isTypeOf(e.type,"exon")&&r.push(e);for(const t of n)a.push([t,...r,o,e]);0===n.length&&a.push([...r,o,e])}return a}function So(e,t){if(e.apolloDragging)return;e.setSelectedFeature(t);const{session:n}=e,{apolloDataStore:a}=n,{featureTypeOntology:o}=a.ontologyManager;if(!o)throw new Error("featureTypeOntology is undefined");let r=!1;for(const[,e]of t.children??[])if(o.isTypeOf(e.type,"CDS")||o.isTypeOf(e.type,"exon")){r=!0;break}(o.isTypeOf(t.type,"transcript")||o.isTypeOf(t.type,"pseudogenic_transcript"))&&r?e.showFeatureDetailsWidget(t,["ApolloTranscriptDetails","apolloTranscriptDetails"]):e.showFeatureDetailsWidget(t)}function wo(e,t,n){const{session:a}=n,{apolloDataStore:o}=a,{featureTypeOntology:l}=o.ontologyManager;if(!l)throw new Error("featureTypeOntology is undefined");const s=l.isTypeOf(t.type,"gene")||l.isTypeOf(t.type,"pseudogene"),i=l.isTypeOf(t.type,"transcript")||l.isTypeOf(t.type,"pseudogenic_transcript"),c=l.isTypeOf(t.type,"CDS");if(s||i)return;const{bp:u,refName:d,regionNumber:f,x:m}=e,{lgv:g}=n;if(c){const e=t.parent;if(!e?.children)return;const n=[];for(const t of e.children.values())l.isTypeOf(t.type,"exon")&&n.push(t);const a=n.find((e=>{const[t,n]=r.intersection2(u-1,u,e.min,e.max);return void 0!==t&&void 0!==n}));if(a){const e=yt(a,d,f,g);if(e){const t=bt(a,m,e);if(t)return t}}}const p=yt(t,d,f,g);if(p){const e=bt(t,m,p);if(e)return e}}function Eo(e,t){const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"transcript")||n.isTypeOf(e.type,"pseudogenic_transcript")}function Co(e,t){const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"exon")}function vo(e,t,n,a){const o=r.getContainingView(t),l=n.bp-o.bpPerPx*n.x,s=l+o.coarseTotalBp;if(!e.parent)return{upstream:void 0,downstream:void 0};const i=e.parent;if(!i.children)throw new Error(`Error getting children of ${i._id}`);const{featureTypeOntology:c}=a.apolloDataStore.ontologyManager;if(!c)throw new Error("featureTypeOntology is undefined");let u=[];for(const[,e]of i.children)c.isTypeOf(e.type,"exon")&&u.push(e);const d={upstream:void 0,downstream:void 0};u=u.sort(((e,t)=>e.min<t.min?-1:1));for(const e of u)if(e.min>s){d.downstream=e;break}u=u.sort(((e,t)=>e.min>t.min?-1:1));for(const e of u)if(e.max<l){d.upstream=e;break}if(-1===i.strand){const e=d.downstream;d.downstream=d.upstream,d.upstream=e}return d}function xo(e,t,n){let a=Ze.default;return-1===e&&(a=Ye.default),t&&(a=a===Ye.default?Ze.default:Ye.default),n&&(a=a===Ye.default?Ze.default:Ye.default),a}const{drawTooltip:To,getContextMenuItemsForFeature:Ao,onMouseLeave:Fo}=ao,ko={draw:function(e,t,n,a,o){const{apolloRowHeight:l,lgv:i,selectedFeature:c,session:u,theme:d}=a,{bpPerPx:f,displayedRegions:m,offsetPx:g}=i,p=m[o],{refName:h,reversed:y}=p,b=l,S=Math.round(.9*b),{children:w,strand:E}=t;if(!w)return;const{apolloDataStore:C}=u,{featureTypeOntology:v}=C.ontologyManager;if(!v)throw new Error("featureTypeOntology is undefined");co(e,t,a,o,n,s.alpha(d.palette.background.paper,.6)),v.isTypeOf(t.type,"pseudogene")&&co(e,t,a,o,n,uo(u,"pseudogenic_transcript"));let x=0;for(const[,t]of w){if(!v.isTypeOf(t.type,"transcript")&&!v.isTypeOf(t.type,"pseudogenic_transcript")){x+=1;continue}const{children:r}=t;if(!r)continue;const l=ho(t,v);0===l&&co(e,t,a,o,x,uo(u,"nonCodingTranscript")),v.isTypeOf(t.type,"pseudogenic_transcript")&&co(e,t,a,o,x,uo(u,"pseudogenic_transcript"));for(const[,l]of r)v.isTypeOf(l.type,"CDS")&&(go(e,a,o,n,t,x),x+=1);0===l&&(go(e,a,o,n,t,x),x+=1)}const T="dark"===d.palette.mode?lo:oo,A="dark"===d.palette.mode?so:ro;x=0;for(const[,t]of w){if(!v.isTypeOf(t.type,"transcript")&&!v.isTypeOf(t.type,"pseudogenic_transcript")){ao.draw(e,t,n,a,o),x+=1;continue}const l=ho(t,v);if(0!=l)for(const l of t.cdsLocations){const{children:s}=t;if(s){for(const[,t]of s)v.isTypeOf(t.type,"exon")&&fo(e,a,o,n,t,x,E,T,A);for(const a of l){const l=(a.max-a.min)/f,s=(i.bpToPx({refName:h,coord:a.min,regionNumber:o})?.offsetPx??0)-g,c=y?s-l:s;e.fillStyle=d.palette.text.primary;const u=(n+x)*b+(b-S)/2;if(e.fillRect(c,u,l,S),l>2){e.clearRect(c+1,u+1,l-2,S-2);const n=r.getFrame(a.min,a.max,t.strand??1,a.phase),o=d.palette.framesCDS.at(n)?.main;if(e.fillStyle=o??"black",e.fillRect(c+1,u+1,l-2,S-2),T&&A&&E){const t=y?-1:1,[n,a]=E*t==1?[T,A]:[A,T];e.fillStyle=n,e.fillRect(c+1,u+1,l-2,(S-2)/2),e.fillStyle=a,e.fillRect(c+1,u+(S-2)/2,l-2,(S-2)/2)}}}x+=1}}const{children:s}=t;if(0===l&&s){for(const[,t]of s)v.isTypeOf(t.type,"exon")&&fo(e,a,o,n,t,x,E,T,A);x+=1}}c&&wt(t,c)&&po(a,e,c,!0)},drawDragPreview:function(e,t){const{apolloDragging:n,apolloRowHeight:a,lgv:o,theme:r}=e,{bpPerPx:l,displayedRegions:i,offsetPx:c}=o;if(!n)return;const{current:u,edge:d,feature:f,start:m}=n,g=Math.floor(m.y/a),p=i[m.regionNumber],h=(p.reversed?p.end-f[d]:f[d]-p.start)/l-c,y=Math.min(u.x,h),b=g*a,S=Math.abs(u.x-h),w=1*a;t.strokeStyle=r.palette.info.main,t.setLineDash([6]),t.strokeRect(y,b,S,w),t.fillStyle=s.alpha(r.palette.info.main,.2),t.fillRect(y,b,S,w)},drawHover:function(e,t){const{hoveredFeature:n}=e;n&&po(e,t,n.feature)},drawTooltip:To,getContextMenuItems:function(e,t){const{apolloInternetAccount:n,hoveredFeature:a,changeManager:o,regions:l,selectedFeature:s,session:i}=e,[c]=l,u=e.getAssemblyId(c.assemblyName),d=[],f="admin"===(n?n.role:"admin");if(!a)return d;if(Ft(t)){const{bp:n,feature:a}=t;let l=ht(a,n);(function(e,t){const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"CDS")})(a,i)&&(l=ht(a,n,!0));for(const n of l){const a=ao.getContextMenuItemsForFeature(e,n);if(Co(n,i)){const l=vo(n,e,t,i),c=r.getContainingView(e);if(l.upstream){const t=l.upstream;a.push({label:"Go to upstream exon",icon:xo(n.strand,!0,c.displayedRegions.at(0)?.reversed),onClick:()=>{c.navTo(vt(t,.1,c.totalBp)),So(e,t)}})}if(l.downstream){const t=l.downstream;a.push({label:"Go to downstream exon",icon:xo(n.strand,!1,c.displayedRegions.at(0)?.reversed),onClick:()=>{c.navTo(vt(t,.1,c.totalBp)),So(e,t)}})}a.push({label:"Merge exons",disabled:!f,onClick:()=>{i.queueDialog((t=>[An,{session:i,handleClose:()=>{t()},changeManager:o,sourceFeature:n,sourceAssemblyId:u,selectedFeature:s,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}},{label:"Split exon",disabled:!f,onClick:()=>{i.queueDialog((t=>[On,{session:i,handleClose:()=>{t()},changeManager:o,sourceFeature:n,sourceAssemblyId:u,selectedFeature:s,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}})}Eo(n,i)&&(a.push({label:"Merge transcript",onClick:()=>{i.queueDialog((t=>[kn,{session:i,handleClose:()=>{t()},changeManager:o,sourceFeature:n,sourceAssemblyId:u,selectedFeature:s,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}}),r.isSessionModelWithWidgets(i)&&a.push({label:"Open transcript details",onClick:()=>{const e=i.addWidget("ApolloTranscriptDetails","apolloTranscriptDetails",{feature:n,assembly:u,changeManager:o,refName:c.refName});i.showWidget(e)}})),d.push({label:n.type,subMenu:a})}}return d},getContextMenuItemsForFeature:Ao,getFeatureFromLayout:function(e,t,n,a){const o=bo(e,a)[n]||[];for(const e of o){let n;if(t>=e.min&&t<=e.max&&e.parent&&(n=e),n){if(a.isTypeOf(n.type,"CDS")&&n.parent&&(a.isTypeOf(n.parent.type,"transcript")||a.isTypeOf(n.parent.type,"pseudogenic_transcript"))){const{cdsLocations:e}=n.parent;for(const a of e)for(const e of a)if(t>=e.min&&t<=e.max)return n;return n.parent}return n}}return e},getRowCount:yo,getRowForFeature:function(e,t,n){const a=bo(e,n);for(const[e,n]of a.entries())if(n.some((e=>e._id===t._id)))return e},onMouseDown:function(e,t,n){const{feature:a}=t,o=wo(t,a,e);o&&(n.stopPropagation(),e.startDrag(t,o.feature,o.edge,!0))},onMouseLeave:Fo,onMouseMove:function(e,t){if(Ft(t)){const{feature:n,bp:a}=t;if(e.setHoveredFeature({feature:n,bp:a}),wo(t,n,e))return void e.setCursor("col-resize")}e.setCursor()},onMouseUp:function(e,t){if(e.apolloDragging)return;const{feature:n}=t;n&&So(e,n)}};function Do(e){const t=[[e]];if(e.children)for(const[,n]of e.children)t.push(...Do(n));return t}function No(e){return Do(e).length}function Ro(e,t,n,a,o,r){const l=Do(t)[n-a];for(const t of l)Io(e,t,n,o,r)}function Io(e,t,n,a,o){const{apolloRowHeight:r,lgv:l,theme:i}=a,{bpPerPx:c,displayedRegions:u,offsetPx:d}=l,f=u[o],m=(l.bpToPx({refName:f.refName,coord:t.min,regionNumber:o})?.offsetPx??0)-d,{reversed:g}=f,p=t.length/c,h=g?m-p:m,y=n*r,b=No(t),S=s.alpha(i.palette.background.paper,.6);b>1&&to(e,h,y,p,b*r,S),ao.draw(e,t,n,a,o)}function Mo(e,t,n,a=!1){const{apolloRowHeight:o,lgv:r,theme:l}=e,s=e.getFeatureLayoutPosition(n);if(!s)return;const{featureRow:i,layoutIndex:c,layoutRow:u}=s,{bpPerPx:d,displayedRegions:f,offsetPx:m}=r,g=f[c],{refName:p,reversed:h}=g,{length:y,max:b,min:S}=n,w=(r.bpToPx({refName:p,coord:h?b:S,regionNumber:c})?.offsetPx??0)-m,E=(u+i)*o,C=y/d;t.fillStyle=a?l.palette.action.disabled:l.palette.action.focus,t.fillRect(w,E,C,o*No(n))}const{drawDragPreview:Lo,drawTooltip:qo,getContextMenuItemsForFeature:Po,onMouseDown:Oo,onMouseLeave:_o,onMouseMove:Bo,onMouseUp:Uo}=ao,$o={draw:function(e,t,n,a,o){const{selectedFeature:r}=a;for(let r=0;r<No(t);r++)Ro(e,t,n+r,n,a,o);r&&wt(t,r)&&Mo(a,e,r)},drawDragPreview:Lo,drawHover:function(e,t){const{hoveredFeature:n}=e;n&&Mo(e,t,n.feature)},drawTooltip:qo,getContextMenuItemsForFeature:Po,getContextMenuItems:function(e,t){const{hoveredFeature:n,session:a}=e,o=[];if(!n)return o;const{featureTypeOntology:r}=a.apolloDataStore.ontologyManager;if(!r)throw new Error("featureTypeOntology is undefined");const l=ao.getContextMenuItems(e,t);if(o.push({label:n.feature.type,subMenu:l}),Ft(t)){const{bp:a,feature:r}=t;for(const t of ht(r,a)){if(t._id===n.feature._id)continue;const a=ao.getContextMenuItemsForFeature(e,t);o.push({label:t.type,subMenu:a})}}return o},getFeatureFromLayout:function(e,t,n){return Do(e)[n].find((e=>t>=e.min&&t<=e.max))},getRowCount:No,getRowForFeature:function(e,t){const n=Do(e);for(const[e,a]of n.entries())if(a.some((e=>e._id===t._id)))return e},onMouseDown:Oo,onMouseLeave:_o,onMouseMove:Bo,onMouseUp:Uo},jo=F.observer((function({featureTypes:e,handleClose:t,onUpdate:n,session:a}){const[o,r]=E.useState(""),[l,i]=E.useState(e);return De.default.createElement(Rt,{open:!0,maxWidth:!1,"data-testid":"filter-features-dialog",title:"Filter features by type",handleClose:t},De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,null,"Select the feature types you want to display in the apollo track"),De.default.createElement(s.Grid,{container:!0,spacing:2},De.default.createElement(s.Grid,{size:8},De.default.createElement(dn,{session:a,ontologyName:"Sequence Ontology",style:{width:"100%"},value:o,filterTerms:sn,renderInput:e=>De.default.createElement(s.TextField,{...e,label:"Feature type",variant:"outlined",fullWidth:!0}),onChange:(e,t)=>{t&&r(t)}})),De.default.createElement(s.Grid,{size:4},De.default.createElement(s.Button,{variant:"contained",onClick:()=>{if(o){if(l.includes(o))return;n([...l,o]),i([...l,o])}},disabled:!o,style:{marginTop:9},size:"medium"},"Add"))),l.length>0&&De.default.createElement("div",null,De.default.createElement("hr",null),De.default.createElement("div",{style:{width:300}},De.default.createElement(s.DialogContentText,null,"Selected feature types:"),De.default.createElement(s.Box,{sx:{display:"flex",flexWrap:"wrap",gap:.5}},l.map((e=>De.default.createElement(s.Chip,{key:e,label:e,onDelete:()=>{(e=>{const t=l.filter((t=>t!==e));n(t),i(t)})(e)}}))))))))})),Go=F.observer((function({model:e,handleClose:t}){const[n,a]=E.useState(`${e.zoomThresholdSetting}`);return De.default.createElement(T.Dialog,{open:!0,onClose:t,title:"Edit zoom threshold setting"},De.default.createElement(s.DialogContent,null,De.default.createElement(s.Typography,null,"The zoom level in base pairs (bp) per pixel at which features are rendered in this Annotations track. Increasing the value will allow features to render when zooming out, but might impact performance."),De.default.createElement(s.TextField,{label:"Threshold value (bpPerPx)",value:n,onChange:e=>{a(e.target.value)}}),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",onClick:()=>{e.setZoomThresholdSetting({zoomThreshold:+n}),t()}},"Submit"),De.default.createElement(s.Button,{variant:"contained",color:"secondary",onClick:()=>{t()}},"Cancel"))))})),Wo=C.makeStyles()((e=>({canvasContainer:{position:"relative",left:0},canvas:{position:"absolute",left:0},center:{display:"flex",justifyContent:"center"},ellipses:{textOverflow:"ellipsis",overflow:"hidden"},avatar:{position:"static",height:"100%",width:"100%",overflow:"visible",color:e.palette.warning.light,backgroundColor:e.palette.warning.contrastText},box:{position:"absolute",overflow:"visible"},badge:{display:"inline-block"},loading:{position:"absolute",right:e.spacing(3),zIndex:10,pointerEvents:"none",textAlign:"right"},locked:{position:"absolute",right:e.spacing(3),top:e.spacing(6),zIndex:1,pointerEvents:"none",textAlign:"right"}})));function zo(e,t,n){const a=new Map;for(const t of e)(a.get(t.message)??a.set(t.message,[]).get(t.message)).push(t);const o=[];for(const[e,s]of a.entries()){if(0===s.length)continue;s.sort(((e,t)=>e.start-t.start));let a=[s[0]],i=s[0].start,c=s[0].start+t;const u=()=>{const t=a.map((e=>e.start)).sort(((e,t)=>e-t)),n=Math.floor(t.length/2),r=a[0].ids;o.push({_id:a[0]._id,message:e,start:t.length%2?t[n]:(t[n-1]+t[n])/2,count:a.length,members:[...a],range:{min:i,max:c},featureIds:r})};for(let e=1;e<s.length;e++){const o=s[e],d=o.start,f=d+t;r=c,l=d,(n?l<=r:l<r)?(a.push(o),d<i&&(i=d),f>c&&(c=f)):(u(),a=[o],i=d,c=f)}u()}var r,l;return o.sort(((e,t)=>e.message.localeCompare(t.message)||e.start-t.start)),o}function Ho(e,t,n){const a=[];for(let o=e;o<e+t;o++){const e=n.get(o);e&&a.push(e)}return a}function Vo(e,t){for(const n of e)for(const[e,a]of n)if(r.doesIntersect2(t.min,t.max,e,a)||r.doesIntersect2(e,a,t.min,t.max))return!1;return!0}function Jo(e,n){return function(e,n){return function(e,t){const n=function(e,t){return function(e,t){const n=function(e,t){return o.BaseDisplay.named("BaseLinearApolloDisplay").props({type:c.types.literal("LinearApolloDisplay"),configuration:a.ConfigurationReference(t),graphical:!0,table:!1,showCheckResults:!0,zoomThreshold:200,heightPreConfig:c.types.maybe(c.types.refinement("displayHeight",c.types.number,(e=>e>=20))),filteredFeatureTypes:c.types.array(c.types.string),loadingState:!1}).views((e=>{const{configuration:t,renderProps:n}=e;return{renderProps:()=>({...n(),...oe.getParentRenderProps(e),config:t.renderer})}})).volatile((()=>({scrollTop:0}))).views((e=>({get lgv(){return r.getContainingView(e)},get height(){return e.heightPreConfig?e.heightPreConfig:e.graphical&&e.table?400:e.graphical?100:200},get loading(){return e.loadingState},get zoomThresholdSetting(){return e.zoomThreshold??a.getConf(e,"zoomThreshold")}}))).views((e=>({get rendererTypeName(){return e.configuration.renderer.type},get session(){return r.getSession(e)},get regions(){return e.lgv.dynamicBlocks.contentBlocks.map((({assemblyName:e,end:t,refName:n,start:a})=>({assemblyName:e,refName:n,start:Math.round(a),end:Math.round(t)})))},regionCannotBeRendered(){if(e.lgv&&e.lgv.bpPerPx>=e.zoomThreshold)return"Zoom in to see annotations"}}))).views((e=>({get apolloInternetAccount(){const[t]=e.regions,{internetAccounts:n}=c.getRoot(e),{assemblyName:o}=t,{assemblyManager:r}=e.session,l=r.get(o);if(!l)throw new Error(`No assembly found with name ${o}`);const{internetAccountConfigId:s}=a.getConf(l,["sequence","metadata"]);return n.find((e=>a.getConf(e,"internetAccountId")===s))},get changeManager(){return e.session.apolloDataStore.changeManager},getAssemblyId(t){const{assemblyManager:n}=e.session,a=n.get(t);if(!a)throw new Error(`Could not find assembly named ${t}`);return a.name},get selectedFeature(){return e.session.apolloSelectedFeature},get hoveredFeature(){return e.session.apolloHoveredFeature}}))).actions((e=>({setScrollTop(t){e.scrollTop=t},setHeight:t=>(e.heightPreConfig=Math.max(t,20),e.height),resizeHeight(t){const n=e.height;return this.setHeight(e.height+t)-n},showGraphicalOnly(){e.graphical=!0,e.table=!1},showTableOnly(){e.graphical=!1,e.table=!0},showGraphicalAndTable(){e.graphical=!0,e.table=!0},toggleShowCheckResults(){e.showCheckResults=!e.showCheckResults},updateFilteredFeatureTypes(t){e.filteredFeatureTypes=c.cast(t)},setLoading(t){e.loadingState=t},setZoomThresholdSetting({zoomThreshold:t}){e.zoomThreshold=t}}))).views((e=>{const{filteredFeatureTypes:t,trackMenuItems:n}=e;return{trackMenuItems(){const{graphical:a,table:o,showCheckResults:l}=e;return[...n(),{type:"subMenu",label:"Appearance",subMenu:[{label:"Show graphical display",type:"radio",checked:a&&!o,onClick:()=>{e.showGraphicalOnly()}},{label:"Show table display",type:"radio",checked:o&&!a,onClick:()=>{e.showTableOnly()}},{label:"Show both graphical and table display",type:"radio",checked:o&&a,onClick:()=>{e.showGraphicalAndTable()}},{label:"Check Results",type:"checkbox",checked:l,onClick:()=>{e.toggleShowCheckResults()}},{label:"Change zoom threshold",onClick:()=>{r.getSession(e).queueDialog((t=>[Go,{model:e,handleClose:t}]))}}]},{label:"Filter features by type",onClick:()=>{const n=e.session;e.session.queueDialog((a=>[jo,{session:n,handleClose:()=>{a()},featureTypes:c.getSnapshot(t),onUpdate:t=>{e.updateFilteredFeatureTypes(t)}}]))}}]}}})).actions((e=>({setSelectedFeature(t){e.session.apolloSetSelectedFeature(t)},setHoveredFeature(t){e.session.apolloSetHoveredFeature(t)},showFeatureDetailsWidget(t,n){const[a]=e.regions,{assemblyName:o,refName:r}=a,l=e.getAssemblyId(o);if(!l)return;const{session:s}=e,{changeManager:i}=s.apolloDataStore,[c,u]=n??["ApolloFeatureDetailsWidget","apolloFeatureDetailsWidget"],d=s.addWidget(c,u,{feature:t,assembly:l,refName:r,changeManager:i});s.showWidget(d)},afterAttach(){c.addDisposer(e,i.autorun((()=>{e.lgv.initialized&&!e.regionCannotBeRendered()&&(e.setLoading(!0),e.session.apolloDataStore.loadFeatures(e.regions).then((()=>{setTimeout((()=>{e.setLoading(!1)}),1e3)})))}),{name:"LinearApolloDisplayLoadFeatures",delay:1e3}))}})))}(0,t);return n.named("LinearApolloDisplayLayouts").props({cleanupBoundary:2e5}).volatile((()=>({seenFeatures:i.observable.map()}))).views((e=>({getAnnotationFeatureById:t=>e.seenFeatures.get(t),getGlyph(e){const{topLevelFeature:t}=e;return t.looksLikeGene?ko:t.children?.size?$o:ao}}))).actions((e=>({addSeenFeature(t){e.seenFeatures.set(t._id,t)},deleteSeenFeature(t){e.seenFeatures.delete(t)}}))).views((e=>({get featureLayouts(){const{assemblyManager:t}=e.session;return e.lgv.displayedRegions.map((n=>{const a=t.get(n.assemblyName),o=new Map,l=new Map,{end:s,refName:i,start:u}=n;for(const[t,n]of e.seenFeatures.entries()){if(!c.isAlive(n)){e.deleteSeenFeature(t);continue}if(i!==a?.getCanonicalRefName(n.refSeq)||!r.doesIntersect2(u,s,n.min,n.max)||e.filteredFeatureTypes.length>0&&!e.filteredFeatureTypes.includes(n.type))continue;const{featureTypeOntology:d}=e.session.apolloDataStore.ontologyManager;if(!d)throw new Error("featureTypeOntology is undefined");const f=e.getGlyph(n).getRowCount(n,d,e.lgv.bpPerPx);let m=0,g=!1;for(;!g;){let e=Ho(m,f,l);if(e.length<f){for(let t=0;t<f-e.length;t++){const e=l.size;l.set(e,[]),o.set(e,[])}e=Ho(m,f,l)}if(Vo(e,n)){for(let e=m;e<m+f;e++){l.get(e)?.push([n.min,n.max]);const t=o.get(e);t?.push([e-m,n._id])}g=!0}else m+=1}}return o}))},getFeatureLayoutPosition(t){const{featureLayouts:n}=this,{featureTypeOntology:a}=e.session.apolloDataStore.ontologyManager;for(const[o,r]of n.entries())for(const[n,l]of r)for(const[r,s]of l){if(0!==r)continue;const l=e.getAnnotationFeatureById(s);if(l){if(t._id===l._id)return{layoutIndex:o,layoutRow:n,featureRow:r};if(l.hasDescendant(t._id)){if(!a)throw new Error("featureTypeOntology is undefined");const r=e.getGlyph(l).getRowForFeature(l,t,a);if(void 0!==r)return{layoutIndex:o,layoutRow:n,featureRow:r}}}}}}))).views((e=>({get highestRow(){return Math.max(0,...e.featureLayouts.map((e=>Math.max(...e.keys()))))}}))).actions((e=>({afterAttach(){c.addDisposer(e,i.autorun((()=>{if(e.lgv.initialized&&!e.regionCannotBeRendered()){for(const[t,n]of e.seenFeatures.entries()){let a=!1;for(const t of e.regions)if(r.doesIntersect2(t.start-e.cleanupBoundary,t.end+e.cleanupBoundary,n.min,n.max)){a=!0;break}a||e.deleteSeenFeature(t)}for(const t of e.regions){const n=e.session.apolloDataStore.assemblies.get(t.assemblyName),a=n?.getByRefName(t.refName),o=a?.features;if(o)for(const[,n]of o)r.doesIntersect2(t.start,t.end,n.min,n.max)&&!e.seenFeatures.has(n._id)&&e.addSeenFeature(n)}}}),{name:"LinearApolloDisplaySetSeenFeatures",delay:1e3}))}})))}(0,t).named("LinearApolloDisplayRendering").props({apolloRowHeight:20,detailsMinHeight:200,detailsHeight:200,lastRowTooltipBufferHeight:40,isShown:!0,filteredTranscripts:c.types.array(c.types.string)}).volatile((()=>({canvas:null,overlayCanvas:null,collaboratorCanvas:null,theme:s.createTheme()}))).views((e=>({get featuresHeight(){return(e.highestRow+1)*e.apolloRowHeight+e.lastRowTooltipBufferHeight}}))).actions((e=>({toggleShown(){e.isShown=!e.isShown},setDetailsHeight(t){e.detailsHeight=e.isShown?Math.max(Math.min(t,e.height-100),Math.min(e.height,e.detailsMinHeight)):t},setCanvas(t){e.canvas=t},setOverlayCanvas(t){e.overlayCanvas=t},setCollaboratorCanvas(t){e.collaboratorCanvas=t},setTheme(t){e.theme=t}}))).actions((e=>({afterAttach(){c.addDisposer(e,i.autorun((()=>{if(!e.lgv.initialized||e.regionCannotBeRendered())return;const t=e.collaboratorCanvas?.getContext("2d");if(t){t.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.featuresHeight);for(const n of e.session.collaborators){const{locations:a}=n;if(0===a.length)continue;let o=0;for(const r of e.lgv.displayedRegions){for(const l of a){if(l.refSeq!==r.refName)continue;const{end:a,refSeq:s,start:i}=l,c=e.lgv.bpToPx({refName:s,coord:i,regionNumber:o});if(!c)continue;const u=c.offsetPx-e.lgv.offsetPx,d=(a-i)/e.lgv.bpPerPx;t.fillStyle="rgba(0,255,0,.2)",t.fillRect(u,1,d,100),t.fillStyle="black",t.fillText(n.name,u+1,11,d-2)}o++}}}}),{name:"LinearApolloDisplayRenderCollaborators"})),c.addDisposer(e,i.autorun((()=>{const{canvas:t,featureLayouts:n,featuresHeight:a,lgv:o}=e;if(!o.initialized||e.regionCannotBeRendered())return;const{displayedRegions:l,dynamicBlocks:s}=o,i=t?.getContext("2d");if(i){i.clearRect(0,0,s.totalWidthPx,a);for(const[t,a]of n.entries()){const n=l[t];for(const[o,l]of a.entries())for(const[a,s]of l){const l=e.getAnnotationFeatureById(s);a>0||!l||r.doesIntersect2(n.start,n.end,l.min,l.max)&&e.getGlyph(l).draw(i,l,o,e,t)}}}}),{name:"LinearApolloDisplayRenderFeatures"}))}})))}(0,t);return n.named("LinearApolloDisplayMouseEvents").volatile((()=>({apolloDragging:null,cursor:void 0}))).views((e=>({getMousePosition(t){const n=kt(t,e.lgv),{bp:a,regionNumber:o,y:r}=n,l=Math.floor(r/e.apolloRowHeight),s=e.featureLayouts[o].get(l);if(!s)return n;const i=s.find((t=>{const n=e.getAnnotationFeatureById(t[1]);return n&&a>=n.min&&a<=n.max}));if(!i)return n;const[c,u]=i,d=e.getAnnotationFeatureById(u);if(!d)return n;const f=e.getGlyph(d),{featureTypeOntology:m}=e.session.apolloDataStore.ontologyManager;if(!m)throw new Error("featureTypeOntology is undefined");const g=f.getFeatureFromLayout(d,a,c,m);return g?{...n,feature:g}:n}}))).actions((e=>({continueDrag(t,n){if(!e.apolloDragging)throw new Error("continueDrag() called with no current drag in progress");n.stopPropagation(),e.apolloDragging={...e.apolloDragging,current:t}},setDragging(t){e.apolloDragging=t??null}}))).actions((e=>({setCursor(t){e.cursor!==t&&(e.cursor=t)},updateFilteredTranscripts(e){}}))).actions((()=>({onClick(){}})))}(0,n).views((e=>({contextMenuItems(t){const{hoveredFeature:n}=e;if(!n)return[];const a=e.getMousePosition(t),{topLevelFeature:o}=n.feature,r=e.getGlyph(o);return Ft(a)?r.getContextMenuItems(e,a):[]}}))).actions((e=>({startDrag(t,n,a,o=!1){e.apolloDragging={start:t,current:t,feature:n,edge:a,shrinkParent:o}},endDrag(){if(!e.apolloDragging)throw new Error("endDrag() called with no current drag in progress");const{current:n,edge:a,feature:o,start:r,shrinkParent:l}=e.apolloDragging;if(Math.abs(n.x-r.x)<=4)return e.setDragging(),void e.setCursor();const{displayedRegions:s}=e.lgv,i=e.getAssemblyId(s[r.regionNumber].assemblyName),c=At(o,n.bp,a,l),u="max"===a?new t.LocationEndChange({typeName:"LocationEndChange",changedIds:c.map((e=>e.featureId)),changes:c.map((e=>({featureId:e.featureId,oldEnd:e.oldLocation,newEnd:e.newLocation}))),assembly:i}):new t.LocationStartChange({typeName:"LocationStartChange",changedIds:c.map((e=>e.featureId)),changes:c.map((e=>({featureId:e.featureId,oldStart:e.oldLocation,newStart:e.newLocation}))),assembly:i});e.changeManager.submit(u),e.setDragging(),e.setCursor()}}))).actions((e=>({onMouseDown(t){const n=e.getMousePosition(t);Ft(n)&&e.getGlyph(n.feature).onMouseDown(e,n,t)},onMouseMove(t){const n=e.getMousePosition(t);if(e.apolloDragging)return e.setCursor("col-resize"),void e.continueDrag(n,t);Ft(n)?e.getGlyph(n.feature).onMouseMove(e,n,t):(e.setHoveredFeature(),e.setCursor())},onMouseLeave(t){e.setDragging(),e.setHoveredFeature();const n=e.getMousePosition(t);Ft(n)&&e.getGlyph(n.feature).onMouseLeave(e,n,t)},onMouseUp(t){const n=e.getMousePosition(t);Ft(n)?e.getGlyph(n.feature).onMouseUp(e,n,t):e.setSelectedFeature(),e.apolloDragging&&e.endDrag()}}))).actions((e=>({afterAttach(){c.addDisposer(e,i.autorun((()=>{if(!e.lgv.initialized||e.regionCannotBeRendered())return;const t=e.overlayCanvas?.getContext("2d");if(!t)return;t.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.featuresHeight);const{apolloDragging:n,hoveredFeature:a}=e;if(!a)return;const o=e.getGlyph(a.feature);o.drawHover(e,t),o.drawTooltip(e,t),n&&e.getGlyph(n.feature.topLevelFeature).drawDragPreview(e,t)}),{name:"LinearApolloDisplayRenderMouseoverAndDrag"}))}})))}(0,n).props({tabularEditor:c.types.optional(Qa,{})}).named("LinearApolloDisplay")}const Xo=a.ConfigurationSchema("LinearApolloReferenceSequenceDisplay",{},{explicitIdentifier:"displayId",explicitlyTyped:!0});function Ko(e,t){return t.palette.bases[e.toUpperCase()].main.toString()??"lightgray"}function Zo(e,t,n,a,o){const r=Math.min(n,10);e.fillStyle="#000",e.font=`${r}px`;const l=e.measureText(a).width;e.fillText(a,t+(n-l)/2,o+10)}function Yo(e,t,n,a,o,l,s,i,c,u,d,f){let m=s.slice(i,i+3).toUpperCase();c&&(m=function(e){return[...e].map((e=>r.revcom(e))).reverse().join("")}(m));const g=r.defaultCodonTable[m];if(!g)return;const p=function(e,t){return{M:"#33ee33","*":t?"#000000":"#f44336"}[e.toUpperCase()]}(g,f);p&&(d&&"*"==g||u&&"*"!=g)&&(e.fillStyle=p,e.fillRect(n,a,o,l)),t<=.1&&(e.rect(n,a,o,l),e.stroke(),Zo(e,n,o,g,a))}function Qo(e,t){const n=t<=1?2:0;switch(e){case 3:return 0;case 2:return 1;case 1:return 2;case-1:return 3+n;case-2:return 4+n;case-3:return 5+n}}function er(e,t){if(!(t>1||void 0===e))return 1===e?3:4}function tr(e,t,n,a,o,r){void 0!==o&&(e.fillStyle=t.palette.action.focus,e.fillRect(n,a*o,r,a))}function nr(e,t){return function(e,t){const n=function(e,t){return o.BaseDisplay.named("BaseLinearApolloReferenceSequenceDisplay").props({type:c.types.literal("LinearApolloReferenceSequenceDisplay"),configuration:a.ConfigurationReference(t),showStartCodons:!1,showStopCodons:!0,highContrast:!1,heightPreConfig:c.types.maybe(c.types.refinement("displayHeight",c.types.number,(e=>e>=20))),sequenceRowHeight:15}).views((e=>{const{configuration:t,renderProps:n}=e;return{renderProps:()=>({...n(),...oe.getParentRenderProps(e),config:t.renderer})}})).views((e=>({get lgv(){return r.getContainingView(e)}}))).views((e=>({get rendererTypeName(){return e.configuration.renderer.type},get session(){return r.getSession(e)},get regions(){return e.lgv.dynamicBlocks.contentBlocks.map((({assemblyName:e,end:t,refName:n,start:a})=>({assemblyName:e,refName:n,start:Math.round(a),end:Math.round(t)})))},regionCannotBeRendered(){if(e.lgv&&e.lgv.bpPerPx>=3)return"Zoom in to see sequence"}}))).views((e=>({get apolloInternetAccount(){const[t]=e.regions,{internetAccounts:n}=c.getRoot(e),{assemblyName:o}=t,{assemblyManager:r}=e.session,l=r.get(o);if(!l)throw new Error(`No assembly found with name ${o}`);const{internetAccountConfigId:s}=a.getConf(l,["sequence","metadata"]);return n.find((e=>a.getConf(e,"internetAccountId")===s))},get changeManager(){return e.session.apolloDataStore.changeManager},getAssemblyId(t){const{assemblyManager:n}=e.session,a=n.get(t);if(!a)throw new Error(`Could not find assembly named ${t}`);return a.name},get selectedFeature(){return e.session.apolloSelectedFeature},get hoveredFeature(){return e.session.apolloHoveredFeature},get height(){const{sequenceRowHeight:t}=e;return e.lgv.bpPerPx<=1?8*t:6*t}}))).volatile((()=>({scrollTop:0}))).actions((e=>({setScrollTop(t){e.scrollTop=t},setHeight:t=>(e.heightPreConfig=Math.max(t,20),e.height),resizeHeight(t){const n=e.height;return this.setHeight(e.height+t)-n},toggleShowStartCodons(){e.showStartCodons=!e.showStartCodons},toggleShowStopCodons(){e.showStopCodons=!e.showStopCodons},toggleHighContrast(){e.highContrast=!e.highContrast}}))).views((e=>{const{trackMenuItems:t}=e;return{trackMenuItems(){const{showStartCodons:n,showStopCodons:a,highContrast:o}=e;return[...t(),{type:"subMenu",label:"Appearance",subMenu:[{label:"Show start codons",type:"checkbox",checked:n,onClick:()=>{e.toggleShowStartCodons()}},{label:"Show stop codons",type:"checkbox",checked:a,onClick:()=>{e.toggleShowStopCodons()}},{label:"Use high contrast colors",type:"checkbox",checked:o,onClick:()=>{e.toggleHighContrast()}}]}]}}})).actions((e=>({afterAttach(){c.addDisposer(e,i.autorun((()=>{e.lgv.initialized&&!e.regionCannotBeRendered()&&e.lgv.bpPerPx<=3&&e.session.apolloDataStore.loadRefSeq(e.regions)}),{name:"LinearApolloReferenceSequenceDisplayLoadFeatures",delay:1e3}))}})))}(0,t);return n.named("LinearApolloReferenceSequenceDisplayRendering").volatile((()=>({seqTrackCanvas:null,seqTrackOverlayCanvas:null,theme:s.createTheme()}))).actions((e=>({setSeqTrackCanvas(t){e.seqTrackCanvas=t},setSeqTrackOverlayCanvas(t){e.seqTrackOverlayCanvas=t},setTheme(t){e.theme=t},afterAttach(){c.addDisposer(e,i.autorun((()=>{const{theme:t}=e;if(!e.lgv.initialized||e.regionCannotBeRendered())return;const n=3/e.lgv.bpPerPx;if(n<1)return;const a=e.seqTrackCanvas?.getContext("2d");if(!a)return;a.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.height);const o=e.lgv.bpPerPx<=1?[3,2,1,0,0,-1,-2,-3]:[3,2,1,-1,-2,-3];let l=0;if(t)for(const n of o){let o=t.palette.framesCDS.at(n)?.main;if(o){let n=0;e.highContrast&&(o="white",n=1,a.fillStyle=t.palette.grey[200],a.fillRect(0,l,e.lgv.dynamicBlocks.totalWidthPx,e.sequenceRowHeight)),a.fillStyle=o,a.fillRect(0+n,l+n,e.lgv.dynamicBlocks.totalWidthPx-2*n,e.sequenceRowHeight-2*n)}l+=e.sequenceRowHeight}for(const[t,o]of e.regions.entries()){const{apolloDataStore:l}=e.session,s=l.assemblies.get(o.assemblyName),i=s?.getByRefName(o.refName),c=i?.getSequence(o.start,o.end);if(!c)return;for(const[l,s]of[...c].entries()){const i=(e.lgv.bpToPx({refName:o.refName,coord:o.start+l,regionNumber:t})?.offsetPx??0)-e.lgv.offsetPx,u=e.lgv.displayedRegions[t].reversed?i-n:i;for(let t=2;t>=0;t--)(o.start+l)%3===t&&Yo(a,e.lgv.bpPerPx,u,e.sequenceRowHeight*(2-t),n,e.sequenceRowHeight,c,l,!1,e.showStartCodons,e.showStopCodons,e.highContrast);if(e.lgv.bpPerPx<=1){const n=(e.lgv.bpToPx({refName:o.refName,coord:o.start+l,regionNumber:t})?.offsetPx??0)-e.lgv.offsetPx,i=1/e.lgv.bpPerPx,c=e.lgv.displayedRegions[t].reversed?n-i:n;a.beginPath(),a.fillStyle=Ko(s,e.theme),a.rect(c,3*e.sequenceRowHeight,i,e.sequenceRowHeight),a.fill(),e.lgv.bpPerPx<=.1&&(a.stroke(),Zo(a,c,i,s,3*e.sequenceRowHeight));const u=r.revcom(s);a.beginPath(),a.fillStyle=Ko(u,e.theme),a.rect(c,4*e.sequenceRowHeight,i,e.sequenceRowHeight),a.fill(),e.lgv.bpPerPx<=.1&&(a.stroke(),Zo(a,c,i,u,4*e.sequenceRowHeight))}for(let t=0;t<=2;t++)(o.start+l)%3===t&&Yo(a,e.lgv.bpPerPx,u,e.sequenceRowHeight*((e.lgv.bpPerPx<=1?5:3)+t),n,e.sequenceRowHeight,c,l,!0,e.showStartCodons,e.showStopCodons,e.highContrast)}}}),{name:"LinearApolloReferenceSequenceDisplayRenderSequence"})),c.addDisposer(e,i.autorun((()=>{if(!e.lgv.initialized||e.regionCannotBeRendered())return;const t=e.seqTrackOverlayCanvas?.getContext("2d");if(!t)return;t.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.height);const{hoveredFeature:n,lgv:a,regions:o,sequenceRowHeight:l,session:s,theme:i}=e;if(!n)return;const{feature:c}=n,{featureTypeOntology:u}=s.apolloDataStore.ontologyManager;if(!u)throw new Error("featureTypeOntology is undefined");for(const[e,n]of o.entries())if(u.isTypeOf(c.type,"CDS")){const o=c.parent;if(!o)continue;const s=o.cdsLocations.find((e=>c.min===e.at(0)?.min&&c.max===e.at(-1)?.max));if(!s)continue;for(const o of s){const s=Qo(r.getFrame(o.min,o.max,c.strand??1,o.phase),a.bpPerPx),u=(a.bpToPx({refName:n.refName,coord:o.min,regionNumber:e})?.offsetPx??0)-a.offsetPx,d=(o.max-o.min)/a.bpPerPx;tr(t,i,a.displayedRegions[e].reversed?u-d:u,l,s,d)}}else{const o=er(c.strand,a.bpPerPx),r=(a.bpToPx({refName:n.refName,coord:c.min,regionNumber:e})?.offsetPx??0)-a.offsetPx,s=c.length/a.bpPerPx;tr(t,i,a.displayedRegions[e].reversed?r-s:r,l,o,s)}}),{name:"LinearApolloDisplayRenderSeqHighlight"}))}})))}(0,t).named("LinearApolloReferenceSequenceDisplay")}const ar=F.observer((function(e){const t=s.useTheme(),{model:n}=e,{height:a,regionCannotBeRendered:o,setSeqTrackCanvas:l,setSeqTrackOverlayCanvas:i,setTheme:c}=n,{classes:u}=Wo();E.useEffect((()=>{c(t)}),[t,c]);const d=r.getContainingView(n),f=o();return f?De.default.createElement(s.Alert,{severity:"warning",classes:{message:u.ellipses},slotProps:{root:{className:u.center}}},De.default.createElement(s.Tooltip,{title:f},De.default.createElement("div",null,f))):De.default.createElement(De.default.Fragment,null,3/d.bpPerPx>=1?De.default.createElement("div",{className:u.canvasContainer,style:{width:d.dynamicBlocks.totalWidthPx,height:a}},De.default.createElement("canvas",{ref:async e=>{await Promise.resolve(),l(e)},width:d.dynamicBlocks.totalWidthPx,height:a,className:u.canvas,"data-testid":"seqTrackCanvas"}),De.default.createElement("canvas",{ref:async e=>{await Promise.resolve(),i(e)},width:d.dynamicBlocks.totalWidthPx,height:a,className:u.canvas,"data-testid":"seqTrackOverlayCanvas"})):null)})),or=a.ConfigurationSchema("LinearApolloSixFrameDisplay",{},{explicitIdentifier:"displayId",explicitlyTyped:!0}),rr=F.observer((function({sourceFeature:e,filteredTranscripts:t,handleClose:n,onUpdate:a}){const o=[];if(e.children)for(const[,t]of e.children){const e=t.attributes.get("gff_id")?.toString();e&&o.push(e)}const[r,l]=E.useState(t);return De.default.createElement(Rt,{open:!0,maxWidth:!1,"data-testid":"filter-transcripts-dialog",title:"Filter transcripts by ID",handleClose:n},De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,null,"Select the alternate transcripts you want to display in the apollo track"),De.default.createElement(s.Grid,{container:!0,spacing:2},De.default.createElement(s.Grid,{size:8},De.default.createElement(s.FormGroup,null,o.map((e=>De.default.createElement(s.FormControlLabel,{control:De.default.createElement(s.Checkbox,{checked:!r.includes(e),onChange:()=>{(e=>{const t=r.includes(e)?r.filter((t=>t!==e)):[...r,e];a(t),l(t)})(e)},slotProps:{input:{"aria-label":"controlled"}}}),label:e}))))))))}));let lr=null,sr=null,ir=null,cr=null;const ur=globalThis.document.createElement("canvas");if(ur?.getContext)for(const e of["forward","backward"])for(const t of["light","dark"]){const n=document.createElement("canvas"),a=10;n.width=n.height=a;const o=n.getContext("2d");if(o){const r="light"===t?"rgba(0,0,0,0)":"rgba(0,0,0,0.75)",l="light"===t?"rgba(255,255,255,0.25)":"rgba(0,0,0,0.50)",s="forward"===e?o.createLinearGradient(0,a,a,0):o.createLinearGradient(0,0,a,a);s.addColorStop(0,r),s.addColorStop(.25,r),s.addColorStop(.25,l),s.addColorStop(.5,l),s.addColorStop(.5,r),s.addColorStop(.75,r),s.addColorStop(.75,l),s.addColorStop(1,l),o.fillStyle=s,o.fillRect(0,0,10,10),"forward"===e?"light"===t?lr=o.createPattern(n,"repeat"):ir=o.createPattern(n,"repeat"):"light"===t?sr=o.createPattern(n,"repeat"):cr=o.createPattern(n,"repeat")}}function dr(e,t){for(const n of e)if(Me.default(n,t))return!0;return!1}function fr(e,t,n){const{filteredTranscripts:a,session:o}=n,{apolloDataStore:l}=o,{featureTypeOntology:s}=l.ontologyManager;if(!s)throw new Error("featureTypeOntology is undefined");const i=s.isTypeOf(t.type,"transcript"),c=t.attributes.get("gff_id")?.toString();if(c&&a.includes(c))return;const{bp:u,refName:d,regionNumber:f,x:m}=e,{lgv:g}=n;if(i){const e=t;if(!e.children)return;const n=[],a=[];for(const t of e.children.values()){const e=s.isTypeOf(t.type,"exon"),o=s.isTypeOf(t.type,"CDS");e?n.push(t):o&&a.push(t)}const o=n.find((e=>{const[t,n]=r.intersection2(u,u+1,e.min,e.max);return void 0!==t&&void 0!==n}));if(o){const e=yt(o,d,f,g);if(e){const t=bt(o,m,e);if(t)return t}}for(const t of e.cdsLocations)for(const e of t){const t=yt(e,d,f,g);if(t){const e=a.find((e=>{const[t,n]=r.intersection2(u,u+1,e.min,e.max);return void 0!==t&&void 0!==n}));if(e){const n=bt(e,m,t);if(n)return n}}}}}const mr={draw:function(e,t,n,a,o){const{apolloRowHeight:l,lgv:i,session:c,theme:u,highestRow:d,filteredTranscripts:f,selectedFeature:m,showFeatureLabels:g}=a,{bpPerPx:p,displayedRegions:h,offsetPx:y}=i,b=h[o],{refName:S,reversed:w}=b,E=l,C=E,v=E,x=E,T=g?2:1,A=u.palette.text.primary,{attributes:F,children:k,min:D,strand:N}=t;if(!k)return;const{apolloDataStore:R}=c,{featureTypeOntology:I}=R.ontologyManager;if(!I)throw new Error("featureTypeOntology is undefined");const M=[],L=(i.bpToPx({refName:S,coord:D,regionNumber:o})?.offsetPx??0)-y,q=t.length/p,P=w?L-q:L,O=(1==N?3:4)*T*E;e.fillStyle=u.palette.text.primary,e.fillRect(P,O,q,x),e.fillStyle=St(t,m)?s.alpha("rgb(0,0,0)",.7):s.alpha(u.palette.background.paper,.7),e.fillRect(P+1,O+1,q-2,x-2);const _=St(t,m),B={x:P,y:O,h:x,text:F.get("gff_id")?.toString(),color:A,isSelected:_};_?M.unshift(B):M.push(B);const U="dark"===u.palette.mode?ir:lr,$="dark"===u.palette.mode?cr:sr,j=w?-1:1;let G=null,W=null;N&&([G,W]=N*j==1?[U,$]:[$,U]),G&&W&&(e.fillStyle=G,e.fillRect(P+1,O+1,q-2,(x-2)/2),e.fillStyle=W,e.fillRect(P+1,O+(x-2)/2,q-2,(x-2)/2));const z=new Set;for(const[,t]of k){if(!I.isTypeOf(t.type,"transcript")&&!I.isTypeOf(t.type,"pseudogenic_transcript"))continue;const{children:n,cdsLocations:a}=t;if(!n)continue;const l=t.attributes.get("gff_id")?.toString();if(l&&f.includes(l))continue;for(const[,t]of n){if(!I.isTypeOf(t.type,"exon"))continue;const n=(i.bpToPx({refName:S,coord:t.min,regionNumber:o})?.offsetPx??0)-y,a=t.length/p,r=w?n-a:n,l=O+(x-C)/2,c=St(t,m);if(e.fillStyle=u.palette.text.primary,e.fillRect(r,l,a,C),a>2){e.clearRect(r+1,l+1,a-2,C-2),e.fillStyle=c?"rgb(0,0,0)":s.alpha("#f5f500",.6),e.fillRect(r+1,l+1,a-2,C-2),G&&W&&(e.fillStyle=G,e.fillRect(r+1,l+1,a-2,(C-2)/2),e.fillStyle=W,e.fillRect(r+1,l+1+(C-2)/2,a-2,(C-2)/2));const n={x:r,y:l,h:C,text:t.attributes.get("gff_id")?.toString(),color:A,isSelected:c};c?M.unshift(n):M.push(n)}}const c=St(t,m?.parent);let g=0,h=0;for(const n of a){let a=0,l=0,s=1;for(const f of n.sort(((e,t)=>e.max-t.max)))if(m&&c&&I.isTypeOf(m.type,"CDS")||!dr(z,f)){const n=(f.max-f.min)/p,b=(i.bpToPx({refName:S,coord:f.min,regionNumber:o})?.offsetPx??0)-y;g=w?b-n:b,e.fillStyle=u.palette.text.primary;const C=r.getFrame(f.min,f.max,t.strand??1,f.phase);if(h=((C<0?-1*C+5:C)*T-T)*E,e.fillRect(g,h,n,v),n>2){e.clearRect(g+1,h+1,n-2,v-2);const t=u.palette.framesCDS.at(C)?.main,o=t??"rgb(171,71,188)";if(e.fillStyle=o,e.fillStyle=m&&c&&I.isTypeOf(m.type,"CDS")?"rgb(0,0,0)":o,e.fillRect(g+1,h+1,n-2,v-2),s>1){const t=[(g-l)/2+l,Math.max(C<0?E*T*d+1:1,Math.min(a,h)-E/2)];e.strokeStyle="rgb(0, 128, 128)",e.beginPath(),e.moveTo(l,a),e.lineTo(...t),e.stroke(),e.moveTo(...t),e.lineTo(g,h+E/2),e.stroke()}l=g+n,a=h+E/2,s+=1,G&&W&&(e.fillStyle=G,e.fillRect(g+1,h+1,n-2,(v-2)/2),e.fillStyle=W,e.fillRect(g+1,h+(v-2)/2,n-2,(v-2)/2))}z.add(f)}}const b={x:g,y:h,h:v,text:t.attributes.get("gff_id")?.toString(),color:A,isSelected:c};c?M.unshift(b):M.push(b)}g&&function(e,t,n="10px sans-serif"){for(let a=t.length-1;a>=0;--a){const o=t[a];e.fillStyle=o.color;const l=Math.max(o.x+1,0),s=o.y+o.h,i=r.measureText(o.text,10);o.isSelected&&(e.clearRect(l-5,s,i+10,o.h),e.font="bold ".concat(n)),o.text&&(e.fillText(o.text,l,s+11,i),e.font=n)}}(e,M)},drawDragPreview:function(e,t){const{apolloDragging:n,apolloRowHeight:a,lgv:o,theme:r}=e,{bpPerPx:l,displayedRegions:i,offsetPx:c}=o;if(!n)return;const{current:u,edge:d,feature:f,start:m}=n,g=Math.floor(m.y/a),p=i[m.regionNumber],h=(p.reversed?p.end-f[d]:f[d]-p.start)/l-c,y=Math.min(u.x,h),b=g*a,S=Math.abs(u.x-h),w=1*a;t.strokeStyle=r.palette.info.main,t.setLineDash([6]),t.strokeRect(y,b,S,w),t.fillStyle=s.alpha(r.palette.info.main,.2),t.fillRect(y,b,S,w)},drawHover:function(e,t){const{hoveredFeature:n,apolloRowHeight:a,filteredTranscripts:o,lgv:l,highestRow:s,session:i,showFeatureLabels:c}=e;if(!n)return;const{feature:u}=n,{apolloDataStore:d}=i,{featureTypeOntology:f}=d.ontologyManager;if(!f)throw new Error("featureTypeOntology is undefined");if(!f.isTypeOf(u.type,"transcript"))return;const m=u.attributes.get("gff_id")?.toString();if(m&&o.includes(m))return;const g=e.getFeatureLayoutPosition(u);if(!g)return;const{bpPerPx:p,displayedRegions:h,offsetPx:y}=l,{layoutIndex:b}=g,S=h[b],{refName:w,reversed:E}=S,C=a,v=C,x=c?2:1,{cdsLocations:T,strand:A}=u;for(const e of T){let n=0,a=0,o=1;for(const i of e.sort(((e,t)=>e.max-t.max))){const e=(i.max-i.min)/p;if(e>2){const c=(l.bpToPx({refName:w,coord:i.min,regionNumber:b})?.offsetPx??0)-y,u=E?c-e:c,d=r.getFrame(i.min,i.max,A??1,i.phase),f=((d<0?-1*d+5:d)*x-x)*C;if(t.fillStyle="rgba(255,0,0,0.6)",t.fillRect(u,f,e,v),o>1){const e=[(u-a)/2+a,Math.max(d<0?C*x*s+1:1,Math.min(n,f)-C/2)];t.strokeStyle="rgb(0, 0, 0)",t.lineWidth=2,t.beginPath(),t.moveTo(a,n),t.lineTo(...e),t.stroke(),t.moveTo(...e),t.lineTo(u,f+C/2),t.stroke()}a=u+e,n=f+C/2,o+=1}}}},drawTooltip:function(e,t){const{hoveredFeature:n,apolloRowHeight:a,filteredTranscripts:o,lgv:l,session:i,showFeatureLabels:c,theme:u}=e;if(!n)return;const{feature:d,bp:f}=n,{featureTypeOntology:m}=i.apolloDataStore.ontologyManager;if(!m)throw new Error("featureTypeOntology is undefined");if(!m.isTypeOf(d.type,"transcript"))return;const{attributes:g,strand:p,type:h}=d,y=e.getFeatureLayoutPosition(d);if(!y)return;const b=g.get("gff_id")?.toString();if(b&&o.includes(b))return;const{layoutIndex:S}=y,{bpPerPx:w,displayedRegions:E,offsetPx:C}=l,v=E[S],{refName:x,reversed:T}=v,A=a,F=Math.round(.7*A),k=c?2:1;let D,N="Loc: ";for(const e of d.cdsLocations)for(const t of e)if(f>=t.min&&f<=t.max){D=t;break}if(!D)return;const{max:R,min:I,phase:M}=D;N+=`${I+1}–${R}`;let L=(l.bpToPx({refName:x,coord:T?R:I,regionNumber:S})?.offsetPx??0)-C;const q=r.getFrame(I,R,p??1,M),P=((q<0?-1*q+5:q)*k-k)*A+(A-F)/2,O=(R-I)/w,_=`Type: ${D.type}`,B=g.get("gff_name")?.find((e=>""!==e)),U=[t.measureText(_).width,t.measureText(N).width];B&&U.push(t.measureText(`Parent Type: ${h}`).width,t.measureText(`Parent Name: ${B}`).width);const $=Math.max(...U);L=L+O+5,t.fillStyle=s.alpha(u.palette.text.primary,.7),t.fillRect(L,P,$+4,4===U.length?55:35),t.beginPath(),t.moveTo(L,P),t.lineTo(L-5,P+5),t.lineTo(L,P+10),t.fill(),t.fillStyle=u.palette.background.default;let j=P+12;t.fillText(_,L+2,j),B&&(j+=12,t.fillText(`Parent Type: ${h}`,L+2,j),j+=12,t.fillText(`Parent Name: ${B}`,L+2,j)),j+=12,t.fillText(N,L+2,j)},getContextMenuItems:function(e,t){const{apolloInternetAccount:n,hoveredFeature:a,changeManager:o,filteredTranscripts:r,regions:l,selectedFeature:s,session:i}=e,[u]=l,d=e.getAssemblyId(u.assemblyName),f=[],m="admin"===(n?n.role:"admin");if(!a)return f;const{featureTypeOntology:g}=i.apolloDataStore.ontologyManager;if(!g)throw new Error("featureTypeOntology is undefined");if(Ft(t)){const{bp:n,feature:a}=t;for(const t of ht(a,n)){const n=t.attributes.get("gff_id")?.toString();if(n&&r.includes(n))continue;const a=Ct(e,t);g.isTypeOf(t.type,"exon")&&a.push({label:"Merge exons",disabled:!m,onClick:()=>{i.queueDialog((n=>[An,{session:i,handleClose:()=>{n()},changeManager:o,sourceFeature:t,sourceAssemblyId:d,selectedFeature:s,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}},{label:"Split exon",disabled:!m,onClick:()=>{i.queueDialog((n=>[On,{session:i,handleClose:()=>{n()},changeManager:o,sourceFeature:t,sourceAssemblyId:d,selectedFeature:s,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}}),g.isTypeOf(t.type,"gene")&&a.push({label:"Filter alternate transcripts",onClick:()=>{i.queueDialog((n=>[rr,{handleClose:()=>{n()},sourceFeature:t,filteredTranscripts:c.getSnapshot(r),onUpdate:t=>{e.updateFilteredTranscripts(t)}}]))}}),f.push({label:t.type,subMenu:a})}}return f},getContextMenuItemsForFeature:Ct,onMouseDown:function(e,t,n){const{feature:a}=t,o=fr(t,a,e);o&&(n.stopPropagation(),e.startDrag(t,o.feature,o.edge,!0))},onMouseLeave:function(){},onMouseMove:function(e,t){if(Ft(t)){const{feature:n,bp:a}=t;if(e.setHoveredFeature({feature:n,bp:a}),fr(t,n,e))return void e.setCursor("col-resize")}e.setCursor()},onMouseUp:function(e,t){if(!e.apolloDragging&&Ft(t)){const{feature:n}=t,{session:a}=e,{apolloDataStore:o}=a,{featureTypeOntology:r}=o.ontologyManager;if(e.setSelectedFeature(n),!r)throw new Error("featureTypeOntology is undefined");let l=!1;for(const[,e]of n.children??[])if(r.isTypeOf(e.type,"CDS")||r.isTypeOf(e.type,"exon")){l=!0;break}(r.isTypeOf(n.type,"transcript")||r.isTypeOf(n.type,"pseudogenic_transcript"))&&l?e.showFeatureDetailsWidget(n,["ApolloTranscriptDetails","apolloTranscriptDetails"]):e.showFeatureDetailsWidget(n)}}};function gr(e,n){return function(e,n){return function(e,t){const n=function(e,t){return function(e,t){const n=function(e,t){return o.BaseDisplay.named("BaseLinearApolloSixFrameDisplay").props({type:c.types.literal("LinearApolloSixFrameDisplay"),configuration:a.ConfigurationReference(t),graphical:!0,table:!1,showFeatureLabels:!0,showCheckResults:!0,zoomThreshold:200,heightPreConfig:c.types.maybe(c.types.refinement("displayHeight",c.types.number,(e=>e>=20))),filteredFeatureTypes:c.types.array(c.types.string)}).views((e=>{const{configuration:t,renderProps:n}=e;return{renderProps:()=>({...n(),...oe.getParentRenderProps(e),config:t.renderer})}})).volatile((()=>({scrollTop:0}))).views((e=>({get lgv(){return r.getContainingView(e)},get height(){return e.heightPreConfig?e.heightPreConfig:e.graphical&&e.table?500:e.graphical?e.showFeatureLabels?400:200:300},get zoomThresholdSetting(){return e.zoomThreshold??a.getConf(e,"zoomThreshold")}}))).views((e=>({get rendererTypeName(){return e.configuration.renderer.type},get session(){return r.getSession(e)},get regions(){return e.lgv.dynamicBlocks.contentBlocks.map((({assemblyName:e,end:t,refName:n,start:a})=>({assemblyName:e,refName:n,start:Math.round(a),end:Math.round(t)})))},regionCannotBeRendered(){if(e.lgv&&e.lgv.bpPerPx>=e.zoomThreshold)return"Zoom in to see annotations"}}))).views((e=>({get apolloInternetAccount(){const[t]=e.regions,{internetAccounts:n}=c.getRoot(e),{assemblyName:o}=t,{assemblyManager:r}=e.session,l=r.get(o);if(!l)throw new Error(`No assembly found with name ${o}`);const{internetAccountConfigId:s}=a.getConf(l,["sequence","metadata"]);return n.find((e=>a.getConf(e,"internetAccountId")===s))},get changeManager(){return e.session.apolloDataStore.changeManager},getAssemblyId(t){const{assemblyManager:n}=e.session,a=n.get(t);if(!a)throw new Error(`Could not find assembly named ${t}`);return a.name},get selectedFeature(){return e.session.apolloSelectedFeature},get hoveredFeature(){return e.session.apolloHoveredFeature}}))).actions((e=>({setScrollTop(t){e.scrollTop=t},setHeight:t=>(e.heightPreConfig=Math.max(t,20),e.height),resizeHeight(t){const n=e.height;return this.setHeight(e.height+t)-n},showGraphicalOnly(){e.graphical=!0,e.table=!1},showTableOnly(){e.graphical=!1,e.table=!0},showGraphicalAndTable(){e.graphical=!0,e.table=!0},toggleShowFeatureLabels(){e.showFeatureLabels=!e.showFeatureLabels},toggleShowCheckResults(){e.showCheckResults=!e.showCheckResults},updateFilteredFeatureTypes(t){e.filteredFeatureTypes=c.cast(t)},setZoomThresholdSetting({zoomThreshold:t}){e.zoomThreshold=t}}))).views((e=>{const{filteredFeatureTypes:t,trackMenuItems:n}=e;return{trackMenuItems(){const{graphical:a,table:o,showFeatureLabels:l,showCheckResults:s}=e;return[...n(),{type:"subMenu",label:"Appearance",subMenu:[{label:"Show graphical display",type:"radio",checked:a&&!o,onClick:()=>{e.showGraphicalOnly()}},{label:"Show table display",type:"radio",checked:o&&!a,onClick:()=>{e.showTableOnly()}},{label:"Show both graphical and table display",type:"radio",checked:o&&a,onClick:()=>{e.showGraphicalAndTable()}},{label:"Feature Labels",type:"checkbox",checked:l,onClick:()=>{e.toggleShowFeatureLabels()}},{label:"Check Results",type:"checkbox",checked:s,onClick:()=>{e.toggleShowCheckResults()}},{label:"Change zoom threshold",onClick:()=>{r.getSession(e).queueDialog((t=>[Go,{model:e,handleClose:t}]))}}]},{label:"Filter features by type",onClick:()=>{const n=e.session;e.session.queueDialog((a=>[jo,{session:n,handleClose:()=>{a()},featureTypes:c.getSnapshot(t),onUpdate:t=>{e.updateFilteredFeatureTypes(t)}}]))}}]}}})).actions((e=>({setSelectedFeature(t){e.session.apolloSetSelectedFeature(t)},setHoveredFeature(t){e.session.apolloSetHoveredFeature(t)},showFeatureDetailsWidget(t,n){const[a]=e.regions,{assemblyName:o,refName:r}=a,l=e.getAssemblyId(o);if(!l)return;const{session:s}=e,{changeManager:i}=s.apolloDataStore,[c,u]=n??["ApolloFeatureDetailsWidget","apolloFeatureDetailsWidget"],d=s.addWidget(c,u,{feature:t,assembly:l,refName:r,changeManager:i});s.showWidget(d)},afterAttach(){c.addDisposer(e,i.autorun((()=>{e.lgv.initialized&&!e.regionCannotBeRendered()&&(e.session.apolloDataStore.loadFeatures(e.regions),e.lgv.bpPerPx<=3&&e.session.apolloDataStore.loadRefSeq(e.regions))}),{name:"LinearApolloSixFrameDisplayLoadFeatures",delay:1e3}))}})))}(0,t);return n.named("LinearApolloSixFrameDisplayLayouts").props({featuresMinMaxLimit:5e5}).volatile((()=>({seenFeatures:i.observable.map()}))).views((e=>({get featuresMinMax(){const{assemblyManager:t}=e.session;return e.lgv.displayedRegions.map((n=>{const a=t.get(n.assemblyName);let o,l;const{end:s,refName:i,start:c}=n;for(const[,t]of e.seenFeatures)i!==a?.getCanonicalRefName(t.refSeq)||!r.doesIntersect2(c,s,t.min,t.max)||t.length>e.featuresMinMaxLimit||(void 0===o&&({min:o}=t),void 0===l&&({max:l}=t),t.minWithChildren<o&&({min:o}=t),t.maxWithChildren>l&&({max:l}=t));if(void 0!==o&&void 0!==l)return[o,l]}))},getGlyph:e=>mr,featureLabelSpacer:t=>e.showFeatureLabels?2*t-1:t}))).actions((e=>({addSeenFeature(t){e.seenFeatures.set(t._id,t)},deleteSeenFeature(t){e.seenFeatures.delete(t)}}))).views((e=>({get geneTrackRowNums(){return[4,5].map((t=>e.featureLabelSpacer(t)))}}))).views((e=>({get featureLayouts(){const{assemblyManager:t}=e.session;return e.lgv.displayedRegions.map(((n,a)=>{const o=t.get(n.assemblyName),l=new Map;if(!e.featuresMinMax[a])return l;const{end:s,refName:i,start:u}=n;for(const[t,n]of e.seenFeatures.entries()){if(!c.isAlive(n)){e.deleteSeenFeature(t);continue}if(i!==o?.getCanonicalRefName(n.refSeq)||!r.doesIntersect2(u,s,n.min,n.max))continue;const{featureTypeOntology:a}=e.session.apolloDataStore.ontologyManager;if(!a)throw new Error("featureTypeOntology is undefined");if(n.looksLikeGene){const t=1==n.strand?e.geneTrackRowNums[0]:e.geneTrackRowNums[1];l.get(t)||l.set(t,[]);const o=l.get(t);o?.push({rowNum:t,feature:n});const{children:s}=n;if(!s)continue;for(const[,t]of s)if(a.isTypeOf(t.type,"transcript")){const{cdsLocations:n,strand:o,children:s}=t;if(s)for(const[,t]of s){if(!a.isTypeOf(t.type,"exon"))continue;const n=1==t.strand?e.geneTrackRowNums[0]:e.geneTrackRowNums[1],o=l.get(n);o?.push({rowNum:n,feature:t})}for(const a of n)for(const n of a){let a=r.getFrame(n.min,n.max,o??1,n.phase);a=e.featureLabelSpacer(a<0?-1*a+5:a),l.get(a)||l.set(a,[]);const s=l.get(a);s?.push({rowNum:a,feature:t})}}}}return l}))},getFeatureLayoutPosition(e){const{featureLayouts:t}=this;for(const[n,a]of t.entries())for(const[,t]of a)for(const{feature:a}of t)if(e._id===a._id)return{layoutIndex:n,layoutRow:0,featureRow:0}}}))).views((e=>({get highestRow(){return 5}}))).actions((e=>({afterAttach(){c.addDisposer(e,i.autorun((()=>{if(e.lgv.initialized&&!e.regionCannotBeRendered())for(const t of e.regions){const n=e.session.apolloDataStore.assemblies.get(t.assemblyName),a=n?.getByRefName(t.refName),o=a?.features;if(o)for(const[,n]of o)r.doesIntersect2(t.start,t.end,n.min,n.max)&&!e.seenFeatures.has(n._id)&&e.addSeenFeature(n)}}),{name:"LinearApolloSixFrameDisplaySetSeenFeatures",delay:1e3}))}})))}(0,t).named("LinearApolloSixFrameDisplayRendering").props({apolloRowHeight:20,detailsMinHeight:200,detailsHeight:200,lastRowTooltipBufferHeight:120,isShown:!0,filteredTranscripts:c.types.array(c.types.string)}).volatile((()=>({canvas:null,overlayCanvas:null,collaboratorCanvas:null,theme:s.createTheme()}))).views((e=>({get featuresHeight(){return(e.highestRow+1)*e.apolloRowHeight*(e.showFeatureLabels?2:1)+e.lastRowTooltipBufferHeight}}))).actions((e=>({toggleShown(){e.isShown=!e.isShown},setDetailsHeight(t){e.detailsHeight=e.isShown?Math.max(Math.min(t,e.height-100),Math.min(e.height,e.detailsMinHeight)):t},setCanvas(t){e.canvas=t},setOverlayCanvas(t){e.overlayCanvas=t},setCollaboratorCanvas(t){e.collaboratorCanvas=t},setTheme(t){e.theme=t}}))).actions((e=>({afterAttach(){c.addDisposer(e,i.autorun((()=>{if(!e.lgv.initialized||e.regionCannotBeRendered())return;const t=e.collaboratorCanvas?.getContext("2d");if(t){t.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.featuresHeight);for(const n of e.session.collaborators){const{locations:a}=n;if(0===a.length)continue;let o=0;for(const r of e.lgv.displayedRegions){for(const l of a){if(l.refSeq!==r.refName)continue;const{end:a,refSeq:s,start:i}=l,c=e.lgv.bpToPx({refName:s,coord:i,regionNumber:o});if(!c)continue;const u=c.offsetPx-e.lgv.offsetPx,d=(a-i)/e.lgv.bpPerPx;t.fillStyle="rgba(0,255,0,.2)",t.fillRect(u,1,d,100),t.fillStyle="black",t.fillText(n.name,u+1,11,d-2)}o++}}}}),{name:"LinearApolloSixFrameDisplayRenderCollaborators"})),c.addDisposer(e,i.autorun((()=>{const{canvas:t,featureLayouts:n,featuresHeight:a,lgv:o}=e;if(!o.initialized||e.regionCannotBeRendered())return;const{displayedRegions:l,dynamicBlocks:s}=o,i=t?.getContext("2d");if(i){i.clearRect(0,0,s.totalWidthPx,a);for(const[t,a]of n.entries()){const n=l[t];for(const[o,l]of a.entries())for(const{feature:a}of l){if(!a.looksLikeGene)continue;if(!r.doesIntersect2(n.start,n.end,a.min,a.max))continue;const{topLevelFeature:l}=a,s=e.getGlyph(l);void 0!==s&&s.draw(i,l,o,e,t)}}}}),{name:"LinearApolloSixFrameDisplayRenderFeatures"}))}})))}(0,t);return n.named("LinearApolloSixFrameDisplayMouseEvents").volatile((()=>({apolloDragging:null,cursor:void 0}))).views((e=>({getMousePosition(t){const n=kt(t,e.lgv),{bp:a,regionNumber:o,y:l}=n,s=Math.floor(l/e.apolloRowHeight)+1,i=e.featureLayouts[o].get(s);if(!i)return n;const{featureTypeOntology:c}=e.session.apolloDataStore.ontologyManager;if(!c)throw new Error("featureTypeOntology is undefined");let u;if(e.geneTrackRowNums.includes(s)?(u=i.find((e=>"exon"==e.feature.type&&a>=e.feature.min&&a<=e.feature.max)),u||(u=i.find((e=>a>=e.feature.min&&a<=e.feature.max)))):u=i.find((t=>{const{feature:n}=t,o=n.attributes.get("gff_id")?.toString();if(!c.isTypeOf(n.type,"transcript"))return!1;for(const t of n.cdsLocations)for(const l of t){let t=r.getFrame(l.min,l.max,n.strand??1,l.phase);if(t=e.featureLabelSpacer(t<0?-1*t+5:t),s===t&&a>=l.min&&a<=l.max)return void 0===o||!e.filteredTranscripts.includes(o)}return!1})),!u)return n;const{feature:d}=u;return{...n,feature:d}}}))).actions((e=>({continueDrag(t,n){if(!e.apolloDragging)throw new Error("continueDrag() called with no current drag in progress");n.stopPropagation(),e.apolloDragging={...e.apolloDragging,current:t}},setDragging(t){e.apolloDragging=t??null}}))).actions((e=>({setCursor(t){e.cursor!==t&&(e.cursor=t)},updateFilteredTranscripts(t){e.filteredTranscripts=c.cast(t)}}))).actions((()=>({onClick(){}})))}(0,n).views((e=>({contextMenuItems(t){const{hoveredFeature:n}=e;if(!n)return[];const a=e.getMousePosition(t),{topLevelFeature:o}=n.feature,r=e.getGlyph(o);return Ft(a)?r.getContextMenuItems(e,a):[]}}))).actions((e=>({startDrag(t,n,a,o=!1){e.apolloDragging={start:t,current:t,feature:n,edge:a,shrinkParent:o}},endDrag(){if(!e.apolloDragging)throw new Error("endDrag() called with no current drag in progress");const{current:n,edge:a,feature:o,start:r,shrinkParent:l}=e.apolloDragging;if(Math.abs(n.x-r.x)<=4)return e.setDragging(),void e.setCursor();const{displayedRegions:s}=e.lgv,i=e.getAssemblyId(s[r.regionNumber].assemblyName),c=At(o,n.bp,a,l),u="max"===a?new t.LocationEndChange({typeName:"LocationEndChange",changedIds:c.map((e=>e.featureId)),changes:c.map((e=>({featureId:e.featureId,oldEnd:e.oldLocation,newEnd:e.newLocation}))),assembly:i}):new t.LocationStartChange({typeName:"LocationStartChange",changedIds:c.map((e=>e.featureId)),changes:c.map((e=>({featureId:e.featureId,oldStart:e.oldLocation,newStart:e.newLocation}))),assembly:i});e.changeManager.submit(u),e.setDragging(),e.setCursor()}}))).actions((e=>({onMouseDown(t){const n=e.getMousePosition(t);Ft(n)&&e.getGlyph(n.feature).onMouseDown(e,n,t)},onMouseMove(t){const n=e.getMousePosition(t);if(e.apolloDragging)return e.setCursor("col-resize"),void e.continueDrag(n,t);Ft(n)?e.getGlyph(n.feature).onMouseMove(e,n,t):(e.setHoveredFeature(),e.setCursor())},onMouseLeave(t){e.setDragging(),e.setHoveredFeature();const n=e.getMousePosition(t);Ft(n)&&e.getGlyph(n.feature).onMouseLeave(e,n,t)},onMouseUp(t){const n=e.getMousePosition(t);Ft(n)?e.getGlyph(n.feature).onMouseUp(e,n,t):e.setSelectedFeature(),e.apolloDragging&&e.endDrag()}}))).actions((e=>({afterAttach(){c.addDisposer(e,i.autorun((()=>{if(!e.lgv.initialized||e.regionCannotBeRendered())return;const t=e.overlayCanvas?.getContext("2d");if(!t)return;t.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.featuresHeight);const{apolloDragging:n,hoveredFeature:a}=e;if(!a)return;const o=e.getGlyph(a.feature);o.drawHover(e,t),o.drawTooltip(e,t),n&&e.getGlyph(n.feature.topLevelFeature).drawDragPreview(e,t)}),{name:"LinearApolloSixFrameDisplayRenderMouseoverAndDrag"}))}})))}(0,n).props({tabularEditor:c.types.optional(Qa,{})}).named("LinearApolloSixFrameDisplay")}const pr=a.ConfigurationSchema("ApolloPlugin",{ontologies:c.types.array(ln),featureTypeOntologyName:{description:"Name of the feature type ontology",type:"string",defaultValue:"Sequence Ontology"},hasRole:{description:"Flag used internally by jbrowse-plugin-apollo",type:"boolean",defaultValue:!1},backgroundColorForFeature:{description:"Color ",type:"string",defaultValue:"jexl:colorFeature(featureType)",contextVariable:["featureType"]}}),hr=(e,t)=>{const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"gene")||n.isTypeOf(e.type,"transcript")||n.isTypeOf(e.type,"pseudogene")||n.isTypeOf(e.type,"pseudogenic_transcript")},yr=(e,t)=>{const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"gene")||n.isTypeOf(e.type,"pseudogene")},br=(e,t)=>{const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"transcript")||n.isTypeOf(e.type,"pseudogenic_transcript")};function Sr(e){const{attributes:t}=e,n=["gene_name","gene_id","gene_stable_id"];for(const e of n){const n=t?.[e];if(n?.[0])return n[0]}return""}const wr=e=>{const t=function(e){const{attributes:t}=e,n=["name","gff_name","transcript_name","gene_name"];for(const e of n){const n=t?.[e];if(n?.[0])return n[0]}return""}(e),n=function(e){const{attributes:t}=e,n=["id","gff_id","transcript_id","gene_id","gene_stable_id","stable_id"];for(const e of n){const n=t?.[e];if(n?.[0])return n[0]}return""}(e);return t?`${e.type} - ${t}`:n?`${e.type} - ${n}`:e.type};function Er({annotationFeature:e,assembly:n,handleClose:a,refSeqId:o,session:r,region:l}){const i=r,{featureTypeOntology:u}=i.apolloDataStore.ontologyManager,d=E.useMemo((()=>Object.keys(e.children??{})),[e]),[f,m]=E.useState(!0),[g,p]=E.useState(d),[h,y]=E.useState(""),[b,S]=E.useState([]),[w,C]=E.useState(!1),[v,x]=E.useState(),T=i.apolloDataStore.assemblies.get(n.name),A=T?.refSeqs.get(o),F=A?.getFeatures(l.start,l.end),k=()=>{const t=[];for(const n of F??[])if(!(n.min>l.end||n.max<l.start)&&u?.isTypeOf(n.type,"gene")&&n.strand===e.strand){const e=c.getSnapshot(n);t.push(e)}return t};E.useEffect((()=>{y("");const e=k();S(e),x(e[0])}),[g,f,l]);const D=async e=>{if(v)for(const a of Object.keys(e)){const o=new t.AddFeatureChange({parentFeatureId:v._id,changedIds:[v._id],typeName:"AddFeatureChange",assembly:n.name,addedFeature:e[a]});await I(o)}},N=async a=>{const r=(new ke.default).toHexString(),l=Math.min(...Object.values(a).map((e=>e.min))),s=Math.max(...Object.values(a).map((e=>e.max))),c=new t.AddFeatureChange({changedIds:[r],typeName:"AddFeatureChange",assembly:n.name,addedFeature:{_id:r,refSeq:o,min:l,max:s,strand:e.strand,type:"gene",children:a,attributes:{name:[Sr(e)],gene_name:[Sr(e)]}}});await I(c),i.apolloSetSelectedFeature(r)},R=async(e,a)=>{if(!v)return;const o=[];e!==v.min&&o.push(new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[v._id],featureId:v._id,assembly:n.name,oldStart:v.min,newStart:e})),a!==v.max&&o.push(new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[v._id],featureId:v._id,assembly:n.name,oldEnd:v.max,newEnd:a}));for(const e of o)await I(e)},I=async e=>{await i.apolloDataStore.changeManager.submit(e)};return De.default.createElement(Rt,{open:!0,title:"Create Apollo Annotation",handleClose:a,fullWidth:!0,maxWidth:"sm"},De.default.createElement(s.DialogTitle,{fontSize:15},"Select the feature to be copied to apollo track"),De.default.createElement(s.DialogContent,null,De.default.createElement(s.Box,{sx:{ml:3}},hr(e,i)&&De.default.createElement(s.FormControlLabel,{control:De.default.createElement(s.Checkbox,{size:"small",checked:f,onChange:e=>{const t=e.target.checked;m(t),p(t?d:[])}}),label:`${wr(e)} (${e.min+1}..${e.max})`}),e.children&&De.default.createElement(s.Box,{sx:{display:"flex",flexDirection:"column",ml:3}},Object.values(e.children).filter((e=>br(e,i))).map((e=>De.default.createElement(s.FormControlLabel,{key:e._id,control:De.default.createElement(s.Checkbox,{size:"small",checked:g.includes(e._id),onChange:t=>{((e,t)=>{p((n=>e.target.checked?[...n,t._id]:n.filter((e=>e!==t._id))))})(t,e)}}),label:`${wr(e)} (${e.min+1}..${e.max})`}))))),b.length>0&&(!f&&g.length>0||f&&br(e,i))&&De.default.createElement("div",{style:{border:"1px solid #ccc",marginTop:20,padding:10,borderRadius:5}},De.default.createElement(s.Box,{sx:{ml:3}},De.default.createElement(s.Typography,{variant:"caption",fontSize:12},"Select the destination feature to copy the selected features"),De.default.createElement(s.Box,{sx:{mt:1}},De.default.createElement(s.Select,{labelId:"label",style:{width:"100%"},value:v?._id??"",onChange:e=>{const t=b.find((t=>t._id===e.target.value));x(t)},disabled:w},b.map((e=>De.default.createElement(s.MenuItem,{key:e._id,value:e._id},`${wr(e)} (${e.min+1}..${e.max})`)))))),De.default.createElement(s.Box,{sx:{ml:3}},De.default.createElement(s.FormGroup,null,De.default.createElement(s.FormControlLabel,{control:De.default.createElement(s.Checkbox,{checked:w,onChange:e=>{C(e.target.checked)}}),label:"Create new gene"}))))),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",type:"submit",disabled:0===g.length||!f&&g.length>0&&!v,onClick:async()=>{if(f){if(yr(e,i)&&(await(async()=>{let a;if(e.children&&g.length!==Object.values(e.children).length){const o={};for(const t of g)o[t]=e.children[t];a=new t.AddFeatureChange({changedIds:[e._id],typeName:"AddFeatureChange",assembly:n.name,addedFeature:{...e,children:o}})}else a=new t.AddFeatureChange({changedIds:[e._id],typeName:"AddFeatureChange",assembly:n.name,addedFeature:e});await I(a)})(),r.notify("Successfully copied selected gene and transcript(s)","success")),br(e,i))if(v&&!w){const t={};if(t[e._id]=e,v.max<e.max||v.min>e.min){const n=Math.min(v.min,e.min),a=Math.max(v.max,e.max);await R(n,a),await D(t)}else await D(t);r.notify("Successfully copied selected transcripts to destination gene","success")}else{const t={};t[e._id]=e,await N(t),r.notify("Successfully created a new gene with selected transcripts","success")}}else{if(!e.children)return;if(v&&!w){const t={};for(const n of g)t[n]=e.children[n];const n=Math.min(...Object.values(t).map((e=>e.min))),a=Math.max(...Object.values(t).map((e=>e.max)));if(v.min>n||v.max<a){const e=Math.min(v.min,n),o=Math.max(v.max,a);await R(e,o),await D(t)}else await D(t);r.notify("Successfully copied transcript to destination gene","success")}else{const t={};for(const n of g)t[n]=e.children[n];await N(t),r.notify("Successfully created a new gene with selected transcript","success")}}a()}},"Create"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:a},"Cancel")),h?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},h)):null)}function Cr(e){if("LinearPileupDisplay"!==e.name)return e;const{stateModel:t}=e,n=t.views((e=>({getFirstRegion:()=>r.getContainingView(e).dynamicBlocks.contentBlocks[0],getAssembly(){const t=e.getFirstRegion(),n=r.getSession(e),{assemblyManager:a}=n,{assemblyName:o}=t,l=a.get(o);if(!l)throw new Error(`Could not find assembly named ${o}`);return l},getRefSeqId(t){const n=e.getFirstRegion(),{refName:a}=n,{refNameAliases:o}=t;if(!o)throw new Error(`Could not find aliases for ${t.name}`);const r=[...Object.entries(o)].filter((([e,t])=>e!==t)).map((([e,t])=>({_id:e,name:t}))),l=r.find((e=>e.name===a))?._id;if(!l)throw new Error(`Could not find refSeqId named ${a}`);return l},getAnnotationFeature(){const t=e.contextMenuFeature,n=e.getAssembly(),a=e.getRefSeqId(n),o=t.get("start"),r=t.get("end"),l=t.get("strand"),s=t.get("name"),i=function(e){const t=/(\d+)([MIDNSHPX=])/g,n=[];let a;for(;null!==(a=t.exec(e));)n.push([a[2],Number.parseInt(a[1],10)]);return n}(t.get("CIGAR"));let c,u=o;const d=[];for(const[e,t]of i)switch(e){case"M":case"=":case"X":void 0===c&&(c=u),u+=t;break;case"N":void 0!==c&&(d.push({start:c,end:u}),c=void 0),u+=t;break;case"D":u+=t;break;case"I":case"S":case"H":case"P":break;default:throw new Error(`Unknown CIGAR operation: ${e}`)}void 0!==c&&d.push({start:c,end:u});const f={_id:ke.default().toHexString(),refSeq:a,min:o,max:r,type:"mRNA",strand:l,attributes:{name:[s]}};if(0===d.length)return f;f.children={};for(const e of d){const t={_id:ke.default().toHexString(),refSeq:a,min:e.start,max:e.end,type:"exon",strand:l};f.children[t._id]=t}return f}}))).views((e=>{const t=e.contextMenuItems;return{contextMenuItems(){const n=r.getSession(e),a=e.getAssembly(),o=e.getFirstRegion();return e.contextMenuFeature?[...t(),{label:"Create Apollo annotation",icon:be.default,onClick:()=>{n.queueDialog((t=>[Er,{session:n,handleClose:()=>{t()},annotationFeature:e.getAnnotationFeature(a),assembly:a,refSeqId:e.getRefSeqId(a),region:o}]))}}]:t()}}}));return e.stateModel=n,e}function vr(e,t){const n=JSON.parse(JSON.stringify(e)),a=n.subfeatures;return[{start:n.start+1,end:n.end,seq_id:t,source:n.source??null,type:n.type??null,score:n.score??null,strand:n.strand?1===n.strand?"+":"-":null,phase:null!==n.phase||void 0!==n.phase?n.phase:null,attributes:Tr(n),derived_features:[],child_features:a?a.map((e=>vr(e,t))):[]}]}function xr(e,n){return t.gff3ToAnnotationFeature(vr(e,n))}function Tr(e){const t={},n=new Set(["start","end","type","strand","refName","subfeatures","derived_features","phase","source","score"]);for(const[a,o]of Object.entries(e))n.has(a)||(t[a]=Array.isArray(o)?o.map(String):[String(o)]);return t}function Ar(e){if("LinearBasicDisplay"!==e.name)return e;const{stateModel:t}=e,n=t.views((e=>({getFirstRegion:()=>r.getContainingView(e).dynamicBlocks.contentBlocks[0],getAssembly(){const t=e.getFirstRegion(),n=r.getSession(e),{assemblyManager:a}=n,{assemblyName:o}=t,l=a.get(o);if(!l)throw new Error(`Could not find assembly named ${o}`);return l},getRefSeqId(t){const n=e.getFirstRegion(),{refName:a}=n,{refNameAliases:o}=t;if(!o)throw new Error(`Could not find aliases for ${t.name}`);const r=[...Object.entries(o)].filter((([e,t])=>e!==t)).map((([e,t])=>({_id:e,name:t}))),l=r.find((e=>e.name===a))?._id;if(!l)throw new Error(`Could not find refSeqId named ${a}`);return l},getAnnotationFeature(t){const n=e.getRefSeqId(t);return xr(e.contextMenuFeature.data,n)}}))).views((e=>{const t=e.contextMenuItems;return{contextMenuItems(){const n=r.getSession(e),a=e.getAssembly(),o=e.getFirstRegion();return e.contextMenuFeature?[...t(),{label:"Create Apollo annotation",icon:be.default,onClick:()=>{n.queueDialog((t=>[Er,{session:n,handleClose:()=>{t()},annotationFeature:e.getAnnotationFeature(a),assembly:a,refSeqId:e.getRefSeqId(a),region:o}]))}}]:t()}}}));return e.stateModel=n,e}const Fr=F.observer((function(e){const t=s.useTheme(),{model:n}=e,{loading:a,apolloDragging:o,apolloRowHeight:l,contextMenuItems:i,cursor:c,featuresHeight:u,isShown:d,onMouseDown:f,onMouseLeave:m,onMouseMove:g,onMouseUp:p,regionCannotBeRendered:h,session:y,setCanvas:b,setCollaboratorCanvas:S,setOverlayCanvas:w,setTheme:C,showCheckResults:v}=n,{classes:x}=Wo(),A=r.getContainingView(n);E.useEffect((()=>{C(t)}),[t,C]);const[F,k]=E.useState(),[D,N]=E.useState([]),R=h();if(!d)return null;const{assemblyManager:I}=y;return De.default.createElement(De.default.Fragment,null,De.default.createElement("div",{className:x.canvasContainer,style:{width:A.dynamicBlocks.totalWidthPx,height:u},onContextMenu:e=>{e.preventDefault(),D.length>0?N([]):(k([e.clientX,e.clientY]),N(i(e)))}},y.isLocked?De.default.createElement("div",{className:x.locked,"data-testid":"lock-icon"},De.default.createElement(tt.default,null)):null,a?De.default.createElement("div",{className:x.loading},De.default.createElement(s.CircularProgress,{size:"18px"})):null,R?De.default.createElement(s.Alert,{severity:"warning",classes:{message:x.ellipses},slotProps:{root:{className:x.center}}},De.default.createElement(s.Tooltip,{title:R},De.default.createElement("div",null,R))):De.default.createElement(De.default.Fragment,null,De.default.createElement("canvas",{ref:async e=>{await Promise.resolve(),S(e)},width:A.dynamicBlocks.totalWidthPx,height:u,className:x.canvas,"data-testid":"collaboratorCanvas"}),De.default.createElement("canvas",{ref:async e=>{await Promise.resolve(),b(e)},width:A.dynamicBlocks.totalWidthPx,height:u,className:x.canvas,"data-testid":"canvas"}),De.default.createElement("canvas",{ref:async e=>{await Promise.resolve(),w(e)},width:A.dynamicBlocks.totalWidthPx,height:u,onMouseMove:g,onMouseLeave:m,onMouseDown:f,onMouseUp:p,className:x.canvas,style:{cursor:c??"default"},"data-testid":"overlayCanvas"}),A.displayedRegions.flatMap(((e,t)=>{const a=A.bpPerPx*l,i=I.get(e.assemblyName);return v?zo([...y.apolloDataStore.checkResults.values()].filter((t=>i?.isValidRefName(t.refSeq)&&i.getCanonicalRefName(t.refSeq)===e.refName&&r.doesIntersect2(e.start,e.end,t.start,t.end))),a,!0).map((a=>{const r=(A.bpToPx({refName:e.refName,coord:a.start,regionNumber:t})?.offsetPx??0)-A.offsetPx,[i]=a.featureIds;if(!i)return null;let c=0;const u=n.getFeatureLayoutPosition(i);return u&&(c=u.layoutRow+u.featureRow),De.default.createElement(s.Tooltip,{key:a._id,title:a.message},De.default.createElement(s.Box,{className:x.box,style:{top:c*l,left:r,height:l,width:l,pointerEvents:o?"none":"auto"}},De.default.createElement(s.Badge,{className:x.badge,badgeContent:a.count,color:"primary",overlap:"circular",anchorOrigin:{vertical:"bottom",horizontal:"right"},invisible:a.count<=1},De.default.createElement(s.Avatar,{className:x.avatar},De.default.createElement(et.default,{"data-testid":`ErrorIcon-${a.start}`})))))})):null})),De.default.createElement(T.Menu,{open:D.length>0,onMenuItemClick:(e,t)=>{t(),N([])},onClose:()=>{N([])},slotProps:{transition:{onExit:()=>{N([])}}},anchorReference:"anchorPosition",anchorPosition:F?{top:F[1],left:F[0]}:void 0,style:{zIndex:t.zIndex.tooltip},menuItems:D}))))})),kr=F.observer((function({model:e,hrStyle:t={margin:0,top:0,color:"black"},idx:n=0}){const{apolloRowHeight:a,highestRow:o,showFeatureLabels:r}=e,l=r?2:1;return De.default.createElement("div",{style:{position:"absolute",left:0,top:a*l*(o+1)/2+n*l*a,width:"100%"}},De.default.createElement("hr",{style:t}))})),Dr=F.observer((function(e,t){const n=s.useTheme(),{model:a}=e,{apolloRowHeight:o,contextMenuItems:l,cursor:i,featuresHeight:c,featureLabelSpacer:u,geneTrackRowNums:d,isShown:f,onMouseDown:m,onMouseLeave:g,onMouseMove:p,onMouseUp:h,regionCannotBeRendered:y,session:b,setCanvas:S,setCollaboratorCanvas:w,setOverlayCanvas:C,setTheme:v,showCheckResults:x}=a,{classes:A}=Wo(),F=r.getContainingView(a);E.useEffect((()=>{v(n)}),[n,v]);const[k,D]=E.useState(),[N,R]=E.useState([]),I=y();if(!f)return null;const{assemblyManager:M}=b;return De.default.createElement(De.default.Fragment,null,De.default.createElement("div",{className:A.canvasContainer,style:{width:F.dynamicBlocks.totalWidthPx,height:c},onContextMenu:e=>{e.preventDefault(),N.length>0?R([]):(D([e.clientX,e.clientY]),R(l(e)))}},I?De.default.createElement(s.Alert,{severity:"warning",classes:{message:A.ellipses},slotProps:{root:{className:A.center}}},De.default.createElement(s.Tooltip,{title:I},De.default.createElement("div",null,I))):De.default.createElement(De.default.Fragment,null,De.default.createElement(kr,{model:a,idx:0}),De.default.createElement(kr,{model:a,hrStyle:{margin:0,top:0,color:"grey",opacity:.4},idx:1}),De.default.createElement(kr,{model:a,idx:2}),De.default.createElement("canvas",{ref:async e=>{await Promise.resolve(),w(e)},width:F.dynamicBlocks.totalWidthPx,height:c,className:A.canvas,"data-testid":"collaboratorCanvas"}),De.default.createElement("canvas",{ref:async e=>{await Promise.resolve(),S(e)},width:F.dynamicBlocks.totalWidthPx,height:c,className:A.canvas,"data-testid":"canvas"}),De.default.createElement("canvas",{ref:async e=>{await Promise.resolve(),C(e)},width:F.dynamicBlocks.totalWidthPx,height:c,onMouseMove:p,onMouseLeave:g,onMouseDown:m,onMouseUp:h,className:A.canvas,style:{cursor:i??"default"},"data-testid":"overlayCanvas"}),F.displayedRegions.flatMap(((e,n)=>{const a=F.bpPerPx*o,l=M.get(e.assemblyName);return x?zo([...b.apolloDataStore.checkResults.values()].filter((t=>l?.isValidRefName(t.refSeq)&&l.getCanonicalRefName(t.refSeq)===e.refName&&r.doesIntersect2(e.start,e.end,t.start,t.end))),a,!0).map((a=>{const l=(F.bpToPx({refName:e.refName,coord:a.start,regionNumber:n})?.offsetPx??0)-F.offsetPx,[i]=a.featureIds;if(!i||!i.parent?.looksLikeGene)return null;let c;for(const e of i.cdsLocations)for(const t of e){let e=r.getFrame(t.min,t.max,i.strand??1,t.phase);if(e=u(e<0?-1*e+5:e),a.start>=t.min&&a.start<=t.max){c=e-1;break}}return void 0===c&&(c=(1==i.strand?d[0]:d[1])-1),De.default.createElement(s.Tooltip,{key:a._id,title:a.message},De.default.createElement(s.Box,{className:A.box,style:{top:c*o,left:l,height:o,width:o,pointerEvents:t?"none":"auto"}},De.default.createElement(s.Badge,{className:A.badge,badgeContent:a.count,color:"primary",overlap:"circular",anchorOrigin:{vertical:"bottom",horizontal:"right"},invisible:a.count<=1},De.default.createElement(s.Avatar,{className:A.avatar},De.default.createElement(et.default,{"data-testid":`ErrorIcon-${a.start}`})))))})):null})),De.default.createElement(T.Menu,{open:N.length>0,onMenuItemClick:(e,t)=>{t(),R([])},onClose:()=>{R([])},slotProps:{transition:{onExit:()=>{R([])}}},anchorReference:"anchorPosition",anchorPosition:k?{top:k[1],left:k[0]}:void 0,style:{zIndex:n.zIndex.tooltip},menuItems:N}))))})),Nr=C.makeStyles()((e=>({shading:{background:s.alpha(e.palette.primary.main,.2),overflowX:"hidden"},details:{background:e.palette.background.paper},accordionControl:{height:12,width:"100%","&:hover":{background:e.palette.action.hover},display:"flex",alignItems:"center",justifyContent:"center"},accordionRoot:{background:e.palette.divider},resizeHandle:{width:"100%",height:4,position:"absolute",cursor:"row-resize",zIndex:100},expandIcon:{},title:{userSelect:"none"},alertContainer:{display:"flex",alignItems:"center",justifyContent:"center"}})));function Rr(e,t){const{apolloRowHeight:n,selectedFeature:a}=e;if(t.current&&a){const o=e.getFeatureLayoutPosition(a);o&&t.current.scroll({top:(o.layoutRow+o.featureRow)*n,behavior:"smooth"})}}const Ir=({onResize:e})=>{const{classes:t}=Nr(),n=E.useCallback((t=>{t.stopPropagation(),t.preventDefault(),e(t.movementY)}),[e]),a=E.useCallback((e=>{e.stopPropagation(),e.preventDefault(),globalThis.removeEventListener("mousemove",n),globalThis.removeEventListener("mouseup",a),globalThis.removeEventListener("mouseleave",a)}),[n]);return De.default.createElement("div",{onMouseDown:e=>{e.stopPropagation(),globalThis.addEventListener("mousemove",n),globalThis.addEventListener("mouseup",a),globalThis.addEventListener("mouseleave",a)},onClick:e=>{e.stopPropagation(),e.preventDefault()},className:t.resizeHandle})},Mr=F.observer((function({onClick:e,onResize:t,open:n,title:a}){const{classes:o}=Nr();return De.default.createElement("div",{className:o.accordionRoot},n&&t?De.default.createElement(Ir,{onResize:t}):null,De.default.createElement("div",{className:o.accordionControl,onClick:e},De.default.createElement(n?Qe.default:$e.default,{className:o.expandIcon}),a?De.default.createElement(s.Typography,{className:o.title,variant:"caption",component:"span"},a):null))})),Lr=F.observer((function({model:e,...t}){const n=r.getSession(e),{ontologyManager:a}=n.apolloDataStore,{featureTypeOntology:o}=a,l=o?.dataStore,{classes:i}=Nr(),{graphical:c,height:u,isShown:d,selectedFeature:f,table:m,tabularEditor:g,toggleShown:p}=e,h=E.useRef(null);E.useEffect((()=>{Rr(e,h)}),[e,f]);const y=t=>{e.setDetailsHeight(e.detailsHeight-t)};if(!l)return De.default.createElement("div",{className:i.alertContainer},De.default.createElement(s.Alert,{severity:"error"},"Could not load feature type ontology."));if(c&&m){const n=g.isShown?e.detailsHeight:0,a=d?u-e.detailsHeight-24:0;return De.default.createElement("div",{style:{height:u}},De.default.createElement(Mr,{open:d,title:"Graphical",onClick:p}),De.default.createElement("div",{className:i.shading,ref:h,style:{height:a}},De.default.createElement(Fr,{model:e,...t})),De.default.createElement(Mr,{title:"Table",open:g.isShown,onClick:g.togglePane,onResize:y}),De.default.createElement("div",{className:i.details,style:{height:n}},De.default.createElement(Ya,{model:e})))}return c?De.default.createElement("div",{className:i.shading,ref:h,style:{height:u}},De.default.createElement(Fr,{model:e,...t})):De.default.createElement("div",{className:i.details,style:{height:u}},De.default.createElement(Ya,{model:e}))})),qr=F.observer((function({model:e,...t}){const n=r.getSession(e),{ontologyManager:a}=n.apolloDataStore,{featureTypeOntology:o}=a,l=o?.dataStore,{classes:i}=Nr(),{detailsHeight:c,graphical:u,height:d,isShown:f,selectedFeature:m,table:g,tabularEditor:p,toggleShown:h}=e,y=E.useRef(null);E.useEffect((()=>{Rr(e,y)}),[e,m]);const b=t=>{e.setDetailsHeight(c-t)};if(!l)return De.default.createElement("div",{className:i.alertContainer},De.default.createElement(s.Alert,{severity:"error"},"Could not load feature type ontology."));if(u&&g){const n=p.isShown?c:0,a=f?d-c-24:0;return De.default.createElement("div",{style:{height:d}},De.default.createElement(Mr,{open:f,title:"Graphical",onClick:h}),De.default.createElement("div",{className:i.shading,ref:y,style:{height:a}},De.default.createElement(Dr,{model:e,...t})),De.default.createElement(Mr,{title:"Table",open:p.isShown,onClick:p.togglePane,onResize:b}),De.default.createElement("div",{className:i.details,style:{height:n}},De.default.createElement(Ya,{model:e})))}return u?De.default.createElement("div",{className:i.shading,ref:y,style:{height:d}},De.default.createElement(Dr,{model:e,...t})):De.default.createElement("div",{className:i.details,style:{height:d}},De.default.createElement(Ya,{model:e}))})),Pr=c.types.model("JobsManager",{}).views((e=>({get jobStatusWidget(){const{widgets:t}=r.getSession(e);let n=t.get("JobsList");return n||(n=r.getSession(e).addWidget("JobsListWidget","JobsList")),n}}))).actions((e=>({update(t,n,a){e.jobStatusWidget.updateJobStatusMessage(t,n),a&&e.jobStatusWidget.updateJobProgressPct(t,a)},abortJob(t,n){const a=r.getSession(e);if(r.isSessionModelWithWidgets(a)){a.showWidget(e.jobStatusWidget),e.jobStatusWidget.updateJobStatusMessage(t,n??"Aborted unexpectedly");const o=e.jobStatusWidget.jobs.findIndex((e=>e.name===t));e.jobStatusWidget.addAbortedJob({...e.jobStatusWidget.jobs[o]}),e.jobStatusWidget.removeJob(t),a.notify("Job aborted","info")}},runJob(t){const n=r.getSession(e);r.isSessionModelWithWidgets(n)&&(n.showWidget(e.jobStatusWidget),e.jobStatusWidget.addJob(t))},done(t){const n=r.getSession(e);r.isSessionModelWithWidgets(n)&&(n.showWidget(e.jobStatusWidget),e.jobStatusWidget.removeJob(t.name),e.jobStatusWidget.addFinishedJob({name:t.name,statusMessage:"All operations successful",progressPct:100,cancelCallback:t.cancelCallback}))}})));class Or{clientStore;constructor(e){this.clientStore=e}}class _r{dataStore;constructor(e){this.dataStore=e}recentChanges=[];undoneChanges=[];async submit(n,a={}){const{addToRecents:o=!0,submitToBackend:l=!0,updateJobsManager:s=!1}=a,i=r.getSession(this.dataStore),c=new AbortController,{jobsManager:u,isLocked:d}=r.getSession(this.dataStore);if(d)return void i.notify("Cannot submit changes in locked mode");const f={name:n.typeName,statusMessage:"Pre-validating",progressPct:0,cancelCallback:()=>{c.abort()}};s&&u.runJob(f);const m=await t.validationRegistry.frontendPreValidate(n);if(!m.ok){const e=`Pre-validation failed: "${m.resultsMessages}"`;return s&&u.abortJob(f.name,e),void i.notify(e,"error")}try{await n.execute(this.dataStore)}catch(e){return s&&u.abortJob(f.name,String(e)),console.error(e),void i.notify(`Error encountered in client: ${String(e)}. Data may be out of sync, please refresh the page`,"error")}if((await t.validationRegistry.frontendPostValidate(n,this.dataStore)).ok||await this.undo(n),l){s&&u.update(f.name,"Submitting to driver");const{collaborationServerDriver:t,getBackendDriver:r}=this.dataStore,l=e.isAssemblySpecificChange(n)?r(n.assembly):t;let c;try{c=await l.submitChange(n,a)}catch(e){return s&&u.abortJob(f.name,String(e)),console.error(e),i.notify(String(e),"error"),void await this.undo(n,!1)}if(!c.ok){const e=`Post-validation failed: "${m.resultsMessages}"`;return s&&u.abortJob(f.name,e),i.notify(e,"error"),void await this.undo(n,!1)}n.notification&&i.notify(n.notification,"success"),o&&(this.recentChanges.push(n),this.undoneChanges=[])}s&&u.done(f)}async undo(e,t=!0){const n=e.getInverse();return this.submit(n,{submitToBackend:t,addToRecents:!1})}async redo(e,t=!0){return this.submit(e,{submitToBackend:t,addToRecents:!1})}async undoLastChange(){const e=r.getSession(this.dataStore),t=this.recentChanges.pop();if(t)return this.undoneChanges.push(t),this.undo(t);e.notify("No changes to undo!","info")}async redoLastChange(){const e=r.getSession(this.dataStore),t=this.undoneChanges.pop();if(t)return this.recentChanges.push(t),this.redo(t);e.notify("No changes to redo!","info")}}class Br extends Or{inFlight=new Map;async fetch(e,t,n){return e.getFetcher({locationType:"UriLocation",uri:t.toString()})(t,n)}async searchFeatures(e,t){const n=this.clientStore.getInternetAccount(t[0]),{baseURL:a}=n,o=new URL("features/searchFeatures",a),r=new URLSearchParams({assemblies:t.join(","),term:e});o.search=r.toString();const l=o.toString(),s=await this.fetch(n,l);if(!s.ok){const e=await Dt(s,"searchFeatures failed");throw new Error(e)}return s.json()}async getFeatures(e){const{assemblyName:t,end:n,refName:o,start:l}=e,{assemblyManager:s}=r.getSession(this.clientStore),i=s.get(t);if(!i)throw new Error(`Could not find assembly with name "${t}"`);const{ids:c}=a.getConf(i,["sequence","metadata"]),u=c[o];if(!u)throw new Error(`Could not find refSeq "${o}"`);const d=this.clientStore.getInternetAccount(t),{baseURL:f}=d,m=new URL("features/getFeatures",f),g=new URLSearchParams({refSeq:u,start:String(l),end:String(n)});m.search=g.toString();const p=m.toString(),h=await this.fetch(d,p);if(!h.ok){const e=await Dt(h,"getFeatures failed");throw new Error(e)}return this.checkSocket(t,o,d),h.json()}checkSocket(t,n,a){const{socket:o}=a,r=a.retrieveToken(),l=`${t}-${n}`,s=new _r(this.clientStore);o.hasListeners(l)||o.on(l,(async t=>{if(a.setLastChangeSequenceNumber(Number(t.changeSequence)),t.userSessionId!==r&&t.channel===l){const n=e.Change.fromJSON(t.changeInfo);e.isFeatureChange(n)&&this.haveDataForChange(n)&&await s.submit(n,{submitToBackend:!1})}}))}haveDataForChange(e){const{assembly:t,changedIds:n}=e;if(!this.clientStore.assemblies.get(t))return!1;for(const e of n)if(this.clientStore.getFeature(e))return!0;return!1}async getSequence(e){const t=`${e.refName}:${e.start}-${e.end}`,n=this.inFlight.get(t),{assemblyName:o,end:l,refName:s,start:i}=e,{assemblyManager:c}=r.getSession(this.clientStore),u=c.get(o);if(!u)throw new Error(`Could not find assembly with name "${o}"`);const{ids:d}=a.getConf(u,["sequence","metadata"]),f=d[s];if(!f)throw new Error(`Could not find refSeq "${s}"`);if(n)return{seq:await n,refSeq:f};let m=this.clientStore.assemblies.get(o);m||(m=this.clientStore.addAssembly(o));let g=m.refSeqs.get(f);g||(g=m.addRefSeq(f,s));const p=g.getSequence(i,l);if(p.length===l-i)return{seq:p,refSeq:f};const h=this.clientStore.getInternetAccount(o),{baseURL:y}=h,b=new URL("sequence",y),S=new URLSearchParams({refSeq:f,start:String(i),end:String(l)});b.search=S.toString();const w=b.toString(),E=this.getSeqFromServer(h,w,g,i,l);this.inFlight.set(t,E);const C=await E;return this.checkSocket(o,s,h),this.inFlight.delete(t),{seq:C,refSeq:f}}async getSeqFromServer(e,t,n,a,o){const r=await this.fetch(e,t);if(!r.ok){let e;try{e=await r.text()}catch{e=""}throw new Error(`getSequence failed: ${r.status} (${r.statusText})${e?` (${e})`:""}`)}const l=await r.text();return n.addSequence({sequence:l,start:a,stop:o}),l}async getRefNameAliases(e){const{assemblyManager:t}=r.getSession(this.clientStore);if(!t.get(e))throw new Error(`Could not find assembly with name "${e}"`);const n=this.clientStore.getInternetAccount(e),{baseURL:a}=n,o=new URL("refSeqs",a),l=new URLSearchParams({assembly:e});o.search=l.toString();const s=o.toString(),i=await this.fetch(n,s);if(!i.ok){let e;try{e=await i.text()}catch{e=""}throw new Error(`getRefNameAliases failed: ${i.status} (${i.statusText})${e?` (${e})`:""}`)}return(await i.json()).map((e=>({refName:e.name,aliases:[e._id,...e.aliases],uniqueId:`alias-${e._id}`})))}async getRegions(e){const{assemblyManager:t}=r.getSession(this.clientStore);if(!t.get(e))throw new Error(`Could not find assembly with name "${e}"`);const n=this.clientStore.getInternetAccount(e),{baseURL:a}=n,o=new URL("refSeqs",a),l=new URLSearchParams({assembly:e});o.search=l.toString();const s=o.toString(),i=await this.fetch(n,s);if(!i.ok){let e;try{e=await i.text()}catch{e=""}throw new Error(`getRegions failed: ${i.status} (${i.statusText})${e?` (${e})`:""}`)}return(await i.json()).map((e=>({refName:e.name,start:0,end:e.length})))}getAssemblies(e){const{assemblyManager:t}=r.getSession(this.clientStore);return t.assemblies.filter((t=>{const n=a.getConf(t,["sequence","metadata"]);return!(!(n&&n.apollo&&n.internetAccountConfigId)||e&&n.internetAccountConfigId!==e)}))}async submitChange(e,n={}){const{internetAccountId:a}=n,o=this.clientStore.getInternetAccount("assembly"in e?e.assembly:void 0,a),{baseURL:r}=o,l=new URL("changes",r).href,s=await this.fetch(o,l,{method:"POST",body:JSON.stringify(e.toJSON()),headers:{"Content-Type":"application/json"}});if(!s.ok){const e=await Dt(s,"submitChange failed");throw new Error(e)}const i=new t.ValidationResultSet;return s.ok||(i.ok=!1),i}}class Ur extends Or{async getFeatures(){return[[],[]]}async getSequence(e){const{assemblyName:t,end:n,refName:a,start:o}=e,r=this.clientStore.assemblies.get(t);if(!r)return{seq:"",refSeq:a};const l=r.refSeqs.get(a);return l?{seq:l.getSequence(o,n),refSeq:a}:{seq:"",refSeq:a}}async getRefNameAliases(e){const t=this.clientStore.assemblies.get(e),n=[];if(!t)return n;for(const[,e]of t.refSeqs)n.push({refName:e.name,aliases:[e._id],uniqueId:`alias-${e._id}`});return n}async getRegions(e){const t=this.clientStore.assemblies.get(e);if(!t)return[];const n=[];for(const[,a]of t.refSeqs)n.push({assemblyName:e,refName:a.name,start:a.sequence[0].start,end:a.sequence[0].stop});return n}getAssemblies(){const{assemblyManager:e}=r.getSession(this.clientStore);return e.assemblies.filter((e=>{const t=a.getConf(e,["sequence","metadata"]);return Boolean(t&&t.apollo&&!t.file&&!t.internetAccountConfigId)}))}async submitChange(e,n={}){const{clientStore:a}=this,{assemblies:o}=a;a.clearCheckResults();for(const[,e]of o)if("InMemoryFileDriver"===e.backendDriverType){const t=await ft(e);a.addCheckResults(t)}return new t.ValidationResultSet}async searchFeatures(e,t){return[]}}class $r extends Or{async loadAssembly(e){const{assemblyManager:t}=r.getSession(this.clientStore),n=t.get(e);if(!n)throw new Error(`Assembly ${e} not found`);const{file:o}=a.getConf(n,["sequence","metadata"]),l=require("node:fs");return dt(e,await l.promises.readFile(o,"utf8"),this.clientStore)}async getAssembly(e){let t=this.clientStore.assemblies.get(e);return t||(t=await this.loadAssembly(e)),t}async getRefNameAliases(e){const t=await this.getAssembly(e),n=[];for(const[,e]of t.refSeqs)n.push({refName:e.name,aliases:[e._id],uniqueId:`alias-${e._id}`});return n}async getFeatures(e){return await this.getAssembly(e.assemblyName),[[],[]]}async getSequence(e){const{assemblyName:t,end:n,refName:a,start:o}=e,r=(await this.getAssembly(t)).refSeqs.get(a);if(!r)throw new Error(`refSeq ${a} not found in client data store`);return{seq:r.getSequence(o,n),refSeq:a}}async getRegions(e){const t=await this.getAssembly(e),n=[];for(const[,a]of t.refSeqs)n.push({assemblyName:e,refName:a.name,start:a.sequence[0].start,end:a.sequence[0].stop});return n}getAssemblies(){const{assemblyManager:e}=r.getSession(this.clientStore);return e.assemblies.filter((e=>{const t=a.getConf(e,["sequence","metadata"]);return Boolean(t&&t.apollo&&!t.internetAccountConfigId&&t.file)}))}async submitChange(n){if(!e.isAssemblySpecificChange(n))throw new Error(`Cannot use this type of change with local file: "${n.typeName}"`);const{assemblyManager:o}=r.getSession(this.clientStore),l=o.get(n.assembly);if(!l)throw new Error(`Could not find assembly with name "${n.assembly}"`);const{file:s}=a.getConf(l,["sequence","metadata"]),i=this.clientStore.assemblies.get(n.assembly);if(!i)throw new Error(`Could not find assembly in client with name "${n.assembly}"`);const u=new Set(...i.refSeqs.keys()),{checkResults:d}=this.clientStore;for(const e of d.values())u.has(e.refSeq)&&d.delete(e._id);const f=await ft(i);this.clientStore.addCheckResults(f);const m=[{directive:"gff-version",value:"3"}];for(const[,e]of i.refSeqs)m.push({directive:"sequence-region",value:`${e.name} 1 ${e.sequence[0].stop}`});for(const e of i.comments)m.push({comment:e});for(const[,e]of i.refSeqs){const{features:n}=e;for(const[,e]of n)m.push(t.annotationFeatureToGFF3(c.getSnapshot(e)))}for(const[,e]of i.refSeqs){const[n]=e.sequence,a=t.splitStringIntoChunks(n.sequence,80).join("\n");m.push({id:e.name,description:e.description,sequence:a})}const g=Ne.default.formatSync(m),p=require("node:fs");return await p.promises.writeFile(s,g,"utf8"),new t.ValidationResultSet}async searchFeatures(e,t){return[]}}function jr(e,n){const o=e.evaluateExtensionPoint("Apollo-extendAnnotationFeature",X.AnnotationFeatureModel),l=function(e){return c.types.model("ClientDataStore",{typeName:c.types.optional(c.types.literal("Client"),"Client"),assemblies:c.types.map(X.ApolloAssembly),checkResults:c.types.map(X.CheckResult),ontologyManager:c.types.optional(on,{})}).views((t=>({get internetAccounts(){return c.getRoot(t).internetAccounts},get pluginConfiguration(){return c.getRoot(t).jbrowse.configuration.ApolloPlugin},getFeature:n=>c.resolveIdentifier(e,t.assemblies,n)}))).actions((e=>({addAssembly(t,n){const a={_id:t,refSeqs:{}};return n&&(a.backendDriverType=n),e.assemblies.put(a)},addFeature(t,n){const a=e.assemblies.get(t);if(!a)throw new Error(`Could not find assembly "${t}" to add feature "${n._id}"`);const o=a.refSeqs.get(n.refSeq);if(!o)throw new Error(`Could not find refSeq "${n.refSeq}" to add feature "${n._id}"`);o.features.put(n)},deleteFeature(t){const n=e.getFeature(t);if(!n)throw new Error(`Could not find feature "${t}" to delete`);const{_id:a,parent:o}=n;o?o.deleteChild(t):c.getParentOfType(n,X.ApolloRefSeq).deleteFeature(a)},deleteAssembly(t){e.assemblies.delete(t)},addCheckResult(t){e.checkResults.put(t)},addCheckResults(t){for(const n of t)e.checkResults.has(n._id)||e.checkResults.put(n)},deleteCheckResult(t){e.checkResults.delete(t)},clearCheckResults(){e.checkResults.clear()}}))).volatile((e=>({changeManager:new _r(e),collaborationServerDriver:new Br(e),inMemoryFileDriver:new Ur(e),desktopFileDriver:r.isElectron?new $r(e):void 0}))).actions((e=>({afterCreate(){c.addDisposer(e,i.autorun((()=>{const{ontologyManager:t,pluginConfiguration:n}=e,o=n.ontologies;for(const n of o||[]){const[o,l,s,i]=[a.readConfObject(n,"name"),a.readConfObject(n,"version"),a.readConfObject(n,"source"),a.readConfObject(n,"textIndexFields")];if(!t.findOntology(o)){const n=r.getSession(e),{jobsManager:a}=n,c=new AbortController,u=`Loading ontology "${o}"`,d={name:u,statusMessage:`Loading ontology "${o}", version "${l}", this may take a while`,progressPct:0,cancelCallback:()=>{c.abort(),a.abortJob(d.name)}};t.addOntology(o,l,s,{textIndexing:{indexFields:i},update:(e,t)=>{0!==t?100!==t?a.update(u,e,t):a.done(d):a.runJob(d)}})}}})))}}))).views((e=>({getBackendDriver(t){if(!t)return e.collaborationServerDriver;const n=r.getSession(e),{assemblyManager:o}=n,l=o.get(t);if(!l)return e.collaborationServerDriver;const{file:s,internetAccountConfigId:i}=a.getConf(l,["sequence","metadata"]);return r.isElectron&&s?e.desktopFileDriver:i?e.collaborationServerDriver:e.inMemoryFileDriver},getInternetAccount(t,n){if(!(t??n))throw new Error("Must provide either assemblyName or internetAccountId");let o=n;if(t&&!o){const{assemblyManager:n}=r.getSession(e),l=n.get(t);if(!l)throw new Error(`No assembly found with name ${t}`);({internetAccountConfigId:o}=a.getConf(l,["sequence","metadata"]))}const{internetAccounts:l}=e,s=l.find((e=>e.internetAccountId===o));if(!s)throw new Error(`No InternetAccount found with config id ${n}`);return s}}))).actions((e=>({loadFeatures:c.flow((function*(t){for(const n of t){const t=e.getBackendDriver(n.assemblyName);if(!t)return;const[a,o]=yield t.getFeatures(n);if(0===a.length)continue;const{assemblyName:r,refName:l}=n;let s=e.assemblies.get(r);s||(s=e.assemblies.put({_id:r,refSeqs:{}}));const[i]=a;let c=s.refSeqs.get(i.refSeq);c||(c=s.refSeqs.put({_id:i.refSeq,name:l,features:{}}));for(const e of a)c.features.has(e._id)||c.features.put(e);e.addCheckResults(o)}})),loadRefSeq:c.flow((function*(t){for(const n of t){const t=e.getBackendDriver(n.assemblyName);if(!t)return;const{refSeq:a,seq:o}=yield t.getSequence(n),{assemblyName:r,end:l,refName:s,start:i}=n;let c=e.assemblies.get(r);c||(c=e.assemblies.put({_id:r,refSeqs:{}}));let u=c.refSeqs.get(a);u||(u=c.refSeqs.put({_id:a,name:s,sequence:[]})),u.addSequence({start:i,stop:l,sequence:o})}}))})))}(o),s=n.props({apolloDataStore:c.types.optional(l,{typeName:"Client"}),apolloSelectedFeature:c.types.safeReference(o),jobsManager:c.types.optional(Pr,{}),isLocked:c.types.optional(c.types.boolean,!1)}).volatile((()=>({apolloHoveredFeature:void 0,abortController:new AbortController}))).extend((()=>{const e=i.observable.array([]);return{views:{get collaborators(){return e}},actions:{addOrUpdateCollaborator(t){const n=e.find((e=>e.id===t.id));n?n.locations=t.locations:e.push(t)}}}})).actions((e=>({apolloSetSelectedFeature(t){e.apolloSelectedFeature=t},apolloSetHoveredFeature(t){e.apolloHoveredFeature=t},addApolloTrackConfig(t,n){const o=`apollo_track_${t.name}`;e.tracks.some((e=>e.trackId===o))||e.addTrackConf({type:"ApolloTrack",trackId:o,name:`Annotations (${a.getConf(t,"displayName")||t.name})`,assemblyNames:[t.name],textSearching:{textSearchAdapter:{type:"ApolloTextSearchAdapter",trackId:o,assemblyNames:[t.name],textSearchAdapterId:`apollo_search_${t.name}`,...n?{baseURL:{uri:n,locationType:"UriLocation"}}:{}}}})},toggleLocked(){e.isLocked=!e.isLocked},getPluginConfiguration(){const{jbrowse:t}=c.getRoot(e);return t.configuration.ApolloPlugin},broadcastLocations(){const{internetAccounts:t}=c.getRoot(e),n=[];for(const t of e.views){if("LinearGenomeView"!==t.type)return;const a=t;if(a.initialized){const{dynamicBlocks:t}=a;t.forEach((t=>{if(void 0!==t.regionNumber){const{assemblyName:a,end:o,refName:r,start:l}=t,s=e.apolloDataStore.assemblies.get(a);s&&"CollaborationServerDriver"===s.backendDriverType&&n.push({assemblyName:a,refName:r,start:l,end:o})}}))}}if(0===n.length){for(const e of t)"baseURL"in e&&e.postUserLocation([]);return}const a=[];for(const e of t)if("baseURL"in e){for(const e of n)a.push({assemblyId:e.assemblyName,refSeq:e.refName,start:e.start,end:e.end});e.postUserLocation(a)}}}))).volatile((e=>({previousSnapshot:c.getSnapshot(e)}))).actions((e=>({afterCreate(){c.applySnapshot(e,{name:e.name,id:e.id});const{internetAccounts:t,jbrowse:n,reloadPluginManagerCallback:o}=c.getRoot(e);c.addDisposer(e,i.autorun((()=>{const n=[];for(const t of e.views){if("LinearGenomeView"!==t.type)return;const a=t;if(a.initialized){const{dynamicBlocks:t}=a;t.forEach((t=>{if(void 0!==t.regionNumber){const{assemblyName:a,end:o,refName:r,start:l}=t,s=e.apolloDataStore.assemblies.get(a);s&&"CollaborationServerDriver"===s.backendDriverType&&n.push({assemblyName:a,refName:r,start:l,end:o})}}))}}if(0===n.length){for(const e of t)"baseURL"in e&&e.postUserLocation([]);return}const a=[];for(const e of t)if("baseURL"in e){for(const e of n)a.push({assemblyId:e.assemblyName,refSeq:e.refName,start:e.start,end:e.end});e.postUserLocation(a)}}),{name:"ApolloSessionBroadcastLocations"})),c.addDisposer(e,i.autorun((async r=>{if(a.readConfObject(n.configuration.ApolloPlugin,"hasRole"))return c.applySnapshot(e,e.previousSnapshot),void r.dispose();const{signal:l}=e.abortController;for(const n of t){if("ApolloInternetAccount"!==n.type)continue;const{baseURL:t}=n,a=new URL("jbrowse/config.json",t).href,s=n.getFetcher({locationType:"UriLocation",uri:a});let i,c;try{i=await s(a,{signal:l})}catch(t){e.abortController.signal.aborted||console.error(t);continue}if(i.ok){try{c=await i.json()}catch(e){console.error(e);continue}o(c,e.previousSnapshot),r.dispose()}else{const e=await Dt(i,"Failed to fetch assemblies");console.error(e)}}}),{name:"ApolloSessionLoadConfig"}))},beforeDestroy(){e.abortController.abort("destroying session model")}}))).views((e=>{const n=e.getTrackActionMenuItems;return{getTrackActionMenuItems(o){if("ApolloTrack"===o.type||"ReferenceSequenceTrack"===o.type)return n?.(o);const r=a.readConfObject(o,"trackId");return r.endsWith("-sessionTrack")?[...n?.(o)??[],{label:"Save track to Apollo",onClick:async()=>{const{internetAccounts:n,jbrowse:a}=c.getRoot(e),l=c.getSnapshot(a);let s;s=t.filterJBrowseConfig(l),0===Object.keys(s).length&&(s=void 0);const i={...c.getSnapshot(o),trackId:r.slice(0,r.length-13)};for(const a of n){if("ApolloInternetAccount"!==a.type)continue;const n=new t.ImportJBrowseConfigChange({typeName:"ImportJBrowseConfigChange",oldJBrowseConfig:s,newJBrowseConfig:{...s,tracks:s?.tracks&&[...s.tracks,i]}}),{internetAccountId:o}=a;await e.apolloDataStore.changeManager.submit(n,{internetAccountId:o});const{notify:r}=e;r("Track added","success")}e.deleteTrackConf(o),a.addTrackConf(i)},icon:ct.default}]:[...n?.(o)??[],{label:"Remove track from Apollo",onClick:async()=>{const{internetAccounts:n,jbrowse:a}=c.getRoot(e),l=c.getSnapshot(a);let s;s=t.filterJBrowseConfig(l),0===Object.keys(s).length&&(s=void 0);const i=s?.tracks?.filter((e=>e.trackId!==r));for(const a of n){if("ApolloInternetAccount"!==a.type)continue;const n=new t.ImportJBrowseConfigChange({typeName:"ImportJBrowseConfigChange",oldJBrowseConfig:s,newJBrowseConfig:{...s,tracks:i}}),{internetAccountId:o}=a;await e.apolloDataStore.changeManager.submit(n,{internetAccountId:o});const{notify:r}=e;r("Track removed","success")}e.deleteTrackConf(o),a.deleteTrackConf(o)},icon:ct.default}]}}}));return c.types.snapshotProcessor(s,{postProcessor(e,t){e.apolloSelectedFeature=void 0;const n=Object.fromEntries(Object.entries(e.apolloDataStore.assemblies).filter((([,e])=>"InMemoryFileDriver"===e.backendDriverType)));if(e.apolloDataStore={typeName:"Client",assemblies:n,checkResults:{}},!t)return e;const{apolloDataStore:a}=t,{checkResults:o}=a;for(const[,t]of o){const[n]=t.ids;if(!n)continue;const o=a.assemblies.get(n.assemblyId);o&&"InMemoryFileDriver"===o.backendDriverType&&(e.apolloDataStore.checkResults[t._id]=c.getSnapshot(t))}return e}})}const Gr="WorkerGlobalScope"in globalThis;for(const[n,a]of Object.entries(t.changes))e.changeRegistry.registerChange(n,a);const Wr=new t.CDSCheck;e.checkRegistry.registerCheck(Wr.name,Wr);const zr=new t.TranscriptCheck;e.checkRegistry.registerCheck(zr.name,zr),t.validationRegistry.registerValidation(new t.CoreValidation),t.validationRegistry.registerValidation(new t.ParentChildValidation),exports.default=class extends ye.default{name="ApolloPlugin";version="0.3.8";configurationSchema=pr;install(e){!function(e){e.addAdapterType((()=>new _e.default({name:"ApolloSequenceAdapter",configSchema:ea,adapterMetadata:{category:void 0,hiddenFromGUI:!0,description:void 0},AdapterClass:Qn})))}(e),function(e){e.addAdapterType((()=>new _e.default({name:"ApolloRefNameAliasAdapter",configSchema:Kn,adapterMetadata:{category:void 0,hiddenFromGUI:!0,description:void 0},AdapterClass:Xn})))}(e),function(e){e.addTextSearchAdapterType((()=>new o.TextSearchAdapterType({name:"ApolloTextSearchAdapter",displayName:"Apollo text search adapter",configSchema:na,AdapterClass:ta,description:"Apollo Text Search adapter"})))}(e),e.addWidgetType((()=>{const e=a.ConfigurationSchema("ApolloFeatureDetailsWidget",{});return new o.WidgetType({name:"ApolloFeatureDetailsWidget",heading:"Apollo feature details",configSchema:e,stateModel:wa,ReactComponent:Sa})})),e.addWidgetType((()=>{const e=a.ConfigurationSchema("ApolloTranscriptDetails",{});return new o.WidgetType({name:"ApolloTranscriptDetails",heading:"Apollo transcript details",configSchema:e,stateModel:Ea,ReactComponent:Pa})})),e.addTrackType((()=>{const t=a.ConfigurationSchema("ApolloTrack",{adapter:""},{baseConfiguration:o.createBaseTrackConfig(e),explicitIdentifier:"trackId"});return new o.TrackType({name:"ApolloTrack",configSchema:t,stateModel:o.createBaseTrackModel(e,"ApolloTrack",t)})})),e.addInternetAccountType((()=>new o.InternetAccountType({name:"ApolloInternetAccount",configSchema:ut,stateModel:Vn(ut)}))),e.addDisplayType((()=>new o.DisplayType({name:"LinearApolloDisplay",configSchema:Oa,stateModel:Jo(0,Oa),trackType:"ApolloTrack",viewType:"LinearGenomeView",ReactComponent:Lr}))),e.addDisplayType((()=>new o.DisplayType({name:"LinearApolloSixFrameDisplay",configSchema:or,stateModel:gr(0,or),trackType:"ApolloTrack",viewType:"LinearGenomeView",ReactComponent:qr}))),e.addDisplayType((()=>new o.DisplayType({name:"LinearApolloReferenceSequenceDisplay",configSchema:Xo,stateModel:nr(0,Xo),displayName:"Apollo reference sequence display",trackType:"ReferenceSequenceTrack",viewType:"LinearGenomeView",ReactComponent:ar}))),e.addToExtensionPoint("Core-extendSession",jr.bind(this,e)),e.addToExtensionPoint("Core-extendPluggableElement",(e=>{if("LinearGenomeView"===e.name){const{stateModel:t}=e,n=t.views((e=>{const t=e.rubberBandMenuItems;return{rubberBandMenuItems:()=>[...t(),{label:"Add new feature",icon:be.default,onClick:()=>{const t=r.getSession(e),{leftOffset:n,rightOffset:a}=e,o=e.getSelectedRegions(n,a);t.queueDialog((e=>[pn,{session:t,handleClose:()=>{e()},region:o[0],changeManager:t.apolloDataStore.changeManager}]))}}]}}));e.stateModel=n}return e})),e.addToExtensionPoint("Core-extendPluggableElement",Cr),e.addToExtensionPoint("Core-extendPluggableElement",Ar),Gr||e.addToExtensionPoint("Core-extendWorker",(t=>"on"in t&&t.on?(t.on("apollo",(async n=>{if("object"!=typeof(a=n)||null===a||!("apollo"in a)||!0!==a.apollo)return;var a;const{apollo:o,messageId:r,method:l}=n;switch(l){case"getSequence":{const{region:a}=n,{assemblyName:l}=a,s=e.rootModel?.session?.apolloDataStore;if(!s)break;const i=s.getBackendDriver(l),{seq:c}=await i.getSequence(a);t.workers[0].postMessage({apollo:o,messageId:r,sequence:c});break}case"getRegions":{const{assembly:a}=n,l=e.rootModel?.session?.apolloDataStore;if(!l)break;const s=l.getBackendDriver(a),i=await s.getRegions(a);t.workers[0].postMessage({apollo:o,messageId:r,regions:i});break}case"getRefNameAliases":{const{assembly:a}=n,l=e.rootModel?.session?.apolloDataStore;if(!l)break;const s=l.getBackendDriver(a),i=await s.getRefNameAliases(a);t.workers[0].postMessage({apollo:o,messageId:r,refNameAliases:i});break}}})),t):t))}configure(e){var t;r.isAbstractMenuManager(e.rootModel)&&(e.jexl.addFunction("colorFeature",(e=>{if("pseudogenic_transcript"===e)return s.alpha("rgb(148, 203, 236)",.6);if("nonCodingTranscript"===e)return s.alpha("rgb(194, 106, 119)",.6);throw new Error("Invalid type")})),(t=e.rootModel).insertInMenu("Apollo",{label:"Redo",icon:lt.default,onClick(e){const{apolloDataStore:t}=e;t.changeManager.redoLastChange()}},0),t.insertInMenu("Apollo",{label:"Undo",icon:it.default,onClick(e){const{apolloDataStore:t}=e;t.changeManager.undoLastChange()}},0),t.appendToMenu("Apollo",{label:"Download GFF3",icon:nt.default,onClick:e=>{e.queueDialog((t=>[wn,{session:e,handleClose:()=>{t()}}]))}}),t.appendToMenu("Apollo",{label:"View Change Log",icon:st.default,onClick:e=>{e.queueDialog((t=>[Rn,{session:e,handleClose:()=>{t()}}]))}}),t.appendToMenu("Apollo",{label:"Open local GFF3 file",icon:ot.default,onClick:e=>{e.queueDialog((t=>[Dn,{session:e,handleClose:()=>{t()},inMemoryFileDriver:e.apolloDataStore.inMemoryFileDriver}]))}}),t.appendToMenu("Apollo",{label:"View check results",icon:at.default,onClick:e=>{e.queueDialog((t=>[qn,{session:e,handleClose:()=>{t()}}]))}}),t.appendToMenu("Apollo",{label:"Lock/Unlock session",onClick:e=>{e.toggleLocked()}}),t.appendToMenu("Apollo",{label:"Log out",icon:rt.default,onClick:e=>{e.queueDialog((t=>[Cn,{session:e,handleClose:()=>{t()}}]))}}))}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@apollo-annotation/common"),t=require("@apollo-annotation/shared"),n=require("@jbrowse/core/Plugin"),a=require("@jbrowse/core/configuration"),o=require("@jbrowse/core/pluggableElementTypes"),r=require("@jbrowse/core/util"),l=require("@mui/icons-material/Add"),s=require("@mui/material"),i=require("mobx"),c=require("mobx-state-tree"),u=require("socket.io-client"),d=require("@mui/icons-material/AdminPanelSettings"),f=require("@mui/icons-material/Delete"),m=require("@mui/icons-material/Input"),g=require("@mui/icons-material/Person"),p=require("@mui/icons-material/Rule"),h=require("@mui/icons-material/Info"),y=require("@mui/icons-material/Link"),b=require("@mui/icons-material/RadioButtonChecked"),S=require("@mui/icons-material/RadioButtonUnchecked"),w=require("bson-objectid"),C=require("react"),E=require("tss-react/mui"),v=require("@gmod/gff"),x=require("@mui/icons-material/SkipNextRounded"),T=require("@mui/icons-material/SkipPreviousRounded"),A=require("@mui/x-data-grid"),F=require("@jbrowse/core/ui"),k=require("@mui/icons-material/Close"),D=require("mobx-react"),N=require("@jbrowse/core/util/types/mst"),R=require("idb/with-async-ittr"),I=require("@jbrowse/core/util/aborting"),M=require("jsonpath"),L=require("@jbrowse/core/util/io"),q=require("fast-deep-equal/es6"),P=require("file-saver"),O=require("@mui/material/Checkbox"),_=require("@mui/material/FormControlLabel"),B=require("@mui/material/LinearProgress"),U=require("nanoid"),$=require("@mui/icons-material/AccountCircle"),j=require("@jbrowse/core/pluggableElementTypes/AdapterType"),G=require("@jbrowse/core/data_adapters/BaseAdapter"),W=require("@jbrowse/core/util/rxjs"),z=require("@jbrowse/core/util/simpleFeature"),H=require("@jbrowse/core/TextSearch/BaseResults"),V=require("@mui/icons-material/ExpandMore"),J=require("@mui/icons-material/Edit"),X=require("@mui/icons-material/MoreHoriz"),K=require("@mui/icons-material/AddBox"),Z=require("@apollo-annotation/mst"),Y=require("@emotion/styled"),Q=require("@mui/icons-material/ContentCopy"),ee=require("@mui/icons-material/ContentCut"),te=require("@mui/icons-material/Remove"),ne=require("@mui/icons-material/Clear"),ae=require("@mui/icons-material/UnfoldLess"),oe=require("@jbrowse/core/util/tracks"),re=require("@mui/icons-material/ExpandLess"),le=require("@mui/icons-material/Lock"),se=require("@mui/icons-material/Error"),ie=require("@mui/icons-material/Download"),ce=require("@mui/icons-material/FactCheck"),ue=require("@mui/icons-material/FileOpen"),de=require("@mui/icons-material/Logout"),fe=require("@mui/icons-material/Redo"),me=require("@mui/icons-material/TrackChanges"),ge=require("@mui/icons-material/Undo"),pe=require("@mui/icons-material/Save");function he(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var ye=he(n),be=he(l),Se=he(d),we=he(f),Ce=he(m),Ee=he(g),ve=he(p),xe=he(h),Te=he(y),Ae=he(b),Fe=he(S),ke=he(w),De=he(C),Ne=he(x),Re=he(T),Ie=he(k),Me=he(M),Le=he(q),qe=he(O),Pe=he(_),Oe=he(B),_e=he($),Be=he(j),Ue=he(z),$e=he(H),je=he(V),Ge=he(J),We=he(X),ze=he(K),He=he(Y),Ve=he(Q),Je=he(ee),Xe=he(te),Ke=he(ne),Ze=he(ae),Ye=he(re),Qe=he(le),et=he(se),tt=he(ie),nt=he(ce),at=he(ue),ot=he(de),rt=he(fe),lt=he(me),st=he(ge),it=he(pe);const ct=a.ConfigurationSchema("ApolloInternetAccount",{baseURL:{description:"Location of Apollo server",type:"string",defaultValue:""},tokenType:{description:"A custom name for a token to include in the header",type:"string",defaultValue:"Bearer"}},{baseConfiguration:o.BaseInternetAccountConfig,explicitlyTyped:!0});async function ut(e,n,a){const o=v.parseStringSync(n,{parseSequences:!0,parseComments:!0,parseDirectives:!1,parseFeatures:!0});if(0===o.length)throw new Error("No features found in GFF3 file");let r=0,l=a.assemblies.get(e);l||(l=a.addAssembly(e,"InMemoryFileDriver"));for(const e of o)if(Array.isArray(e)){const n=t.gff3ToAnnotationFeature(e),a=l.refSeqs.get(n.refSeq)??l.addRefSeq(n.refSeq,n.refSeq);a.features.has(n._id)||a.addFeature(n)}else if("comment"in e)l.addComment(e.comment);else{r++;let t=l.refSeqs.get(e.id);t||(t=l.addRefSeq(e.id,e.id,e.description)),e.description&&!t.description&&t.setDescription(e.description),t.addSequence({start:0,stop:e.sequence.length,sequence:e.sequence})}if(0===r)throw new Error("No embedded FASTA section found in GFF3");const s=await dt(l);return a.addCheckResults(s),l}async function dt(t){const n=[];for(const a of t.refSeqs.values())for(const t of a.features.values())for(const o of e.checkRegistry.getChecks().values()){const e=await o.checkFeature(c.getSnapshot(t),((e,t)=>Promise.resolve(a.getSequence(e,t))));n.push(...e)}return n}function ft(e){const{attributes:t}=e,n=t.get("gff_name");return n?n[0]:""}function mt(e){const{attributes:t}=e,n=t.get("gff_id"),a=t.get("transcript_id"),o=t.get("exon_id"),r=t.get("protein_id");return n?n[0]:a?a[0]:o?o[0]:r?r[0]:""}function gt(e){const t=ft(e),n=mt(e);return t?`: ${t}`:n?`: ${n}`:""}function pt(e,t,n=!1){const a=[];a.push(e);for(const t of function(e){const t=[];let{parent:n}=e;for(;n;)t.push(n),({parent:n}=n);return t}(e))a.push(t);const o=function(e){const t=[];if(e.children)for(const[,n]of e.children)t.push(n);return t}(e);for(const e of o)e.min<t&&e.max>=t&&a.push(e);if(!n)return a;if(e.parent){const n=e.parent.children;if(n)for(const[,o]of n)o._id!=e._id&&o.min<t&&o.max>=t&&a.push(o)}return a}function ht(e,t){if(e.apolloDragging)return;e.setSelectedFeature(t);const{session:n}=e,{apolloDataStore:a}=n,{featureTypeOntology:o}=a.ontologyManager;if(!o)throw new Error("featureTypeOntology is undefined");let r=!1;for(const[,e]of t.children??[])if(o.isTypeOf(e.type,"CDS")||o.isTypeOf(e.type,"exon")){r=!0;break}(o.isTypeOf(t.type,"transcript")||o.isTypeOf(t.type,"pseudogenic_transcript"))&&r?e.showFeatureDetailsWidget(t,["ApolloTranscriptDetails","apolloTranscriptDetails"]):e.showFeatureDetailsWidget(t)}function yt(e,t){const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"transcript")||n.isTypeOf(e.type,"pseudogenic_transcript")}function bt(e,t){const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"exon")}function St(e,t){const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"CDS")}function wt(e,t,n,a){const o=r.getContainingView(t),l=n.bp-o.bpPerPx*n.x,s=l+o.coarseTotalBp;if(!e.parent)return{upstream:void 0,downstream:void 0};const i=e.parent;if(!i.children)throw new Error(`Error getting children of ${i._id}`);const{featureTypeOntology:c}=a.apolloDataStore.ontologyManager;if(!c)throw new Error("featureTypeOntology is undefined");let u=[];for(const[,e]of i.children)c.isTypeOf(e.type,"exon")&&u.push(e);const d={upstream:void 0,downstream:void 0};u=u.sort(((e,t)=>e.min<t.min?-1:1));for(const e of u)if(e.min>s){d.downstream=e;break}u=u.sort(((e,t)=>e.min>t.min?-1:1));for(const e of u)if(e.max<l){d.upstream=e;break}if(-1===i.strand){const e=d.downstream;d.downstream=d.upstream,d.upstream=e}return d}function Ct(e,t,n){let a=Ne.default;return-1===e&&(a=Re.default),t&&(a=a===Re.default?Ne.default:Re.default),n&&(a=a===Re.default?Ne.default:Re.default),a}function Et(e,t,n,a){const o=a.bpToPx({refName:t,coord:e.min,regionNumber:n}),r=a.bpToPx({refName:t,coord:e.max,regionNumber:n});if(void 0===o||void 0===r)return;const{offsetPx:l}=a;return[o.offsetPx-l,r.offsetPx-l]}function vt(e,t,n){const[a,o]=n;if(!(Math.abs(o-a)<8))return Math.abs(a-t)<4?{feature:e,edge:"min"}:Math.abs(o-t)<4?{feature:e,edge:"max"}:void 0}function xt(e,t){return Boolean(t&&e._id===t._id)}function Tt(e,t){return!!t&&(e._id===t._id||e.hasDescendant(t._id))}function At(e){let t;t=e.attributes.get("gff_name")?e.attributes.get("gff_name")?.join(","):e.attributes.get("gff_id")?e.attributes.get("gff_id")?.join(","):e._id;const n=`(${(e.min+1).toLocaleString("en")}..${e.max.toLocaleString("en")})`;if(t&&t.length+n.length>65){const e=60-n.length;t=e>0?t.slice(0,e):"",t=`${t}[...]`}return`${t} ${n}`}function Ft(e,t){const{apolloInternetAccount:n,changeManager:a,regions:o,selectedFeature:r,session:l}=e,s=[],i=n?n.role:"admin",c="admin"===i,u=!(i&&["admin","user"].includes(i)),[d]=o,f=e.getAssemblyId(d.assemblyName),m=e.getAssemblyId(d.assemblyName);return s.push({label:At(t),type:"subHeader"},{label:"Add child feature",disabled:u,onClick:()=>{l.queueDialog((e=>[yn,{session:l,handleClose:()=>{e()},changeManager:a,sourceFeature:t,sourceAssemblyId:f,internetAccount:n}]))}},{label:"Copy features and annotations",disabled:u,onClick:()=>{l.queueDialog((e=>[Fn,{session:l,handleClose:()=>{e()},changeManager:a,sourceFeature:t,sourceAssemblyId:m}]))}},{label:"Delete feature",disabled:!c,onClick:()=>{l.queueDialog((n=>[Dn,{session:l,handleClose:()=>{n()},changeManager:a,sourceFeature:t,sourceAssemblyId:m,selectedFeature:r,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}}),s}function kt(e,t,n){const a=(e.max-e.min)*t,o=Math.max(e.min-a,1),r=Math.min(e.max+a,n);return{refName:e.refSeq,start:o,end:r}}function Dt(e,t,n){const a=[{featureId:e._id,oldLocation:e[n],newLocation:t}],{parent:o}=e;return o&&("min"===n&&o[n]>t||"max"===n&&o[n]<t)&&a.push(...Dt(o,t,n)),a}function Nt(e,t,n,a,o){const r=e._id,l=[{featureId:r,oldLocation:e[n],newLocation:t}],{parent:s,children:i}=e;if(i)for(const[,e]of i)e._id!==o&&("min"===n&&e[n]<t||"max"===n&&e[n]>t)&&l.push(...Nt(e,t,n,a));if(s&&a){const e=[];if(s.children)for(const[,t]of s.children)t._id!==r&&e.push(t);if(0===e.length)l.push(...Nt(s,t,n,a,r));else{const o=s[n],i=Math[n](...e.map((e=>e[n])),t);i!==o&&l.push(...Nt(s,i,n,a,r))}}return l}function Rt(e,t,n,a=!1){const o=e[n];if(t===o)throw new Error(`New and existing locations are the same: "${t}"`);return"min"===n?t>o?Nt(e,t,n,a):Dt(e,t,n):t<o?Nt(e,t,n,a):Dt(e,t,n)}function It(e){return"feature"in e}function Mt(e,t){const n=e.currentTarget,{clientX:a,clientY:o}=e,{left:r,top:l}=n.getBoundingClientRect(),s=a-r,i=o-l,{coord:c,index:u,refName:d}=t.pxToBp(s);return{x:s,y:i,refName:d,bp:c,regionNumber:u}}async function Lt(e,t){let n;try{n=await e.text()}catch{n=""}return`${t?`${t} — `:""}${e.status} ${e.statusText}${n?` (${n})`:""}`}const qt=E.makeStyles()((e=>({dialogTitle:{background:e.palette.primary.main,color:e.palette.primary.contrastText,padding:e.spacing(2)},closeButton:{position:"absolute",right:e.spacing(1),top:e.spacing(1.5),color:e.palette.primary.contrastText}}))),Pt=D.observer((function(e){const{classes:t}=qt(),{handleClose:n,title:a,...o}=e;return De.default.createElement(F.Dialog,{...o,header:De.default.createElement(De.default.Fragment,null,De.default.createElement(s.DialogTitle,{className:t.dialogTitle},a),De.default.createElement(s.IconButton,{"aria-label":"close",onClick:n,className:t.closeButton},De.default.createElement(Ie.default,null)))})}));var Ot;!function(e){e.GFF3="text/x-gff3",e.FASTA="text/x-fasta",e.BGZIP_FASTA="application/x-bgzip-fasta",e.FAI="text/x-fai",e.GZI="application/x-gzi",e.EXTERNAL="text/x-external"}(Ot||(Ot={}));const _t=E.makeStyles()((e=>({accordion:{border:`1px solid ${e.palette.divider}`,"&:not(:last-child)":{borderBottom:0}},accordionSummary:{flexDirection:"row-reverse"},accordionDetails:{padding:e.spacing(2),borderTop:"1px solid rgba(0, 0, 0, .125)"},radioIcon:{color:e.palette.tertiary.contrastText},dialog:{minWidth:550,maxWidth:800}})));function Bt(e,t,n,a,o,r,l,s,i){return!(!e||!(t&&a||n===Ot.GFF3&&a||a&&o&&r||l&&s&&i))}function Ut({changeManager:e,handleClose:n,session:o}){const{classes:r}=_t(),{internetAccounts:l}=c.getRoot(o),{notify:i}=o,u=l.filter((e=>"ApolloInternetAccount"===e.type));if(0===u.length)throw new Error("No Apollo internet account found");const[d,f]=C.useState(""),[m,g]=C.useState(""),[p,h]=C.useState(!1),[y,b]=C.useState(Ot.BGZIP_FASTA),[S,w]=C.useState(!0),[E,v]=C.useState(!1),[x,T]=C.useState(!1),[A,F]=C.useState(null),[k,D]=C.useState(null),[N,R]=C.useState(null),[I,M]=C.useState(""),[L,q]=C.useState(""),[P,O]=C.useState(""),[_,B]=C.useState(!1),[U,$]=C.useState(!1),[j,G]=C.useState(!1);async function W(e,t){const{jobsManager:n}=o,a=new AbortController,[{baseURL:r,getFetcher:l}]=u,s=new URL("files",r);s.searchParams.set("type",t);const i=s.href,c=new FormData;let f=e.name;const m=t===Ot.BGZIP_FASTA||t===Ot.FASTA&&(!E||U)||t===Ot.GFF3&&j;m&&!e.name.toLocaleLowerCase().endsWith(".gz")?f=`${f}.gz`:!m&&e.name.toLocaleLowerCase().endsWith(".gz")&&(f=`${f}.txt`),c.append("file",e,f),c.append("type",t);const p=l({locationType:"UriLocation",uri:i});if(p){const t={name:`UploadAssemblyFile for ${d}`,statusMessage:"Pre-validating",progressPct:0,cancelCallback:()=>{a.abort(),n.abortJob(t.name)}};n.runJob(t),n.update(t.name,`Uploading ${e.name}, this may take awhile`);const{signal:o}=a,r=await p(i,{method:"POST",body:c,signal:o});if(!r.ok){const e=await Lt(r,"Error when inserting new assembly (while uploading file)");return n.abortJob(t.name,e),g(e),""}const l=(await r.json())._id;return n.done(t),l}throw new Error("Failed to fetch")}let z=!1;try{const e=new URL(I);"http:"!==e.protocol&&"https:"!==e.protocol||(z=!0)}catch{}let H=!1;try{const e=new URL(L);"http:"!==e.protocol&&"https:"!==e.protocol||(H=!0)}catch{}let V=!1;try{const e=new URL(P);"http:"!==e.protocol&&"https:"!==e.protocol||(V=!0)}catch{}const[J,X]=De.default.useState("panelFastaInput"),K=e=>(t,n)=>{n&&X(e)};return De.default.createElement(Pt,{open:!0,handleClose:n,"data-testid":"add-assembly-dialog",title:"Add new assembly",maxWidth:!1},De.default.createElement("form",{onSubmit:async function(a){let o;if(a.preventDefault(),g(""),T(!0),B(!0),i(`Assembly "${d}" is being added`,"info"),n(),a.preventDefault(),y===Ot.EXTERNAL)o=new t.AddAssemblyFromExternalChange({typeName:"AddAssemblyFromExternalChange",assembly:(new ke.default).toHexString(),assemblyName:d,externalLocation:{fa:I,fai:L,gzi:P}});else{if(!A)throw new Error("Missing fasta file");if(y===Ot.GFF3&&S){const e=await W(A,Ot.GFF3);o=new t.AddAssemblyAndFeaturesFromFileChange({typeName:"AddAssemblyAndFeaturesFromFileChange",assembly:(new ke.default).toHexString(),assemblyName:d,fileIds:{fa:e}})}else if(y===Ot.GFF3){const e=await W(A,Ot.GFF3);o=new t.AddAssemblyFromFileChange({typeName:"AddAssemblyFromFileChange",assembly:(new ke.default).toHexString(),assemblyName:d,fileIds:{fa:e}})}else if(E){const e=await W(A,Ot.FASTA);o=new t.AddAssemblyFromFileChange({typeName:"AddAssemblyFromFileChange",assembly:(new ke.default).toHexString(),assemblyName:d,fileIds:{fa:e}})}else{if(!k||!N)throw new Error("Missing fasta index files");const e=await W(A,Ot.BGZIP_FASTA),n=await W(k,Ot.FAI),a=await W(N,Ot.GZI);o=new t.AddAssemblyFromFileChange({typeName:"AddAssemblyFromFileChange",assembly:(new ke.default).toHexString(),assemblyName:d,fileIds:{fa:e,fai:n,gzi:a}})}}const[{internetAccountId:r}]=u;await e.submit(o,{internetAccountId:r,updateJobsManager:!0}),T(!1),B(!1)},"data-testid":"submit-form"},De.default.createElement(s.DialogContent,{className:r.dialog},_?De.default.createElement(s.LinearProgress,null):null,De.default.createElement(s.TextField,{margin:"dense",id:"name",label:"Assembly name",type:"TextField",fullWidth:!0,variant:"outlined",onChange:e=>{T(!1),f(e.target.value),function(e){const{assemblies:t}=o;t.find((t=>a.readConfObject(t,"displayName")===e))?(h(!1),g(`Assembly ${e} already exists.`)):(h(!0),g(""))}(e.target.value)},disabled:x&&!m}),De.default.createElement(s.Accordion,{disableGutters:!0,elevation:0,square:!0,className:r.accordion,expanded:"panelFastaInput"===J,onChange:K("panelFastaInput")},De.default.createElement(s.AccordionSummary,{className:r.accordionSummary,expandIcon:"panelFastaInput"===J?De.default.createElement(Ae.default,{className:r.radioIcon,sx:{fontSize:"1.2rem",ml:5}}):De.default.createElement(Fe.default,{className:r.radioIcon,sx:{fontSize:"1.2rem",mr:5}}),"aria-controls":"panelFastaInputd-content",id:"panelFastaInputd-header"},De.default.createElement(s.Typography,{component:"span"},"FASTA input")),De.default.createElement(s.AccordionDetails,{className:r.accordionDetails},De.default.createElement(s.FormGroup,null,De.default.createElement(s.FormControlLabel,{"data-testid":"files-on-url-checkbox",control:De.default.createElement(s.Checkbox,{onChange:()=>{b(y===Ot.EXTERNAL?Ot.BGZIP_FASTA:Ot.EXTERNAL),y===Ot.EXTERNAL&&v(!1)},checked:y===Ot.EXTERNAL,disabled:E&&y!==Ot.GFF3}),label:De.default.createElement(s.Box,{display:"flex",alignItems:"center"},"Use external URLs",De.default.createElement(s.Tooltip,{title:"Use external URLs to provide FASTA and index files. Does not copy the files to the Apollo collaboration server, so ensure the URLs are stable.",placement:"top-start"},De.default.createElement(s.IconButton,{size:"small"},De.default.createElement(xe.default,{sx:{fontSize:18}}))))}),De.default.createElement(s.FormControlLabel,{"data-testid":"sequence-is-editable-checkbox",control:De.default.createElement(s.Checkbox,{onChange:()=>{v(!E)}}),checked:E,disabled:y===Ot.EXTERNAL,label:De.default.createElement(s.Box,{display:"flex",alignItems:"center"},"Store sequence in database",De.default.createElement(s.Tooltip,{title:"Enables users to edit the genomic sequence, but comes with performance impacts. Use with care.",placement:"top-start"},De.default.createElement(s.IconButton,{size:"small"},De.default.createElement(xe.default,{sx:{fontSize:18}}))))}),De.default.createElement(s.FormControlLabel,{"data-testid":"fasta-is-gzip-checkbox",control:De.default.createElement(s.Checkbox,{checked:!E||U,onChange:()=>{$(!E||!U)},disabled:!E}),label:"FASTA is gzip compressed"}),De.default.createElement(s.Table,{size:"small",sx:{mt:2}},y===Ot.BGZIP_FASTA||y===Ot.GFF3?De.default.createElement(s.TableBody,null,De.default.createElement(s.TableRow,null,De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},De.default.createElement(s.Box,{display:"flex",alignItems:"center"},De.default.createElement("span",null,"FASTA"),De.default.createElement(s.Tooltip,{title:'Unless "Store sequence in database" enabled, FASTA input must be compressed with bgzip and indexed with samtools faidx (or equivalent). Compression is optional for sequences stored in the database.'},De.default.createElement(s.IconButton,{size:"small"},De.default.createElement(xe.default,{sx:{fontSize:18}}))))),De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},De.default.createElement("input",{"data-testid":"fasta-input-file",type:"file",onChange:e=>{const t=e.target.files?.item(0);t&&(F(t),t.name.endsWith(".gz")&&$(!0))},disabled:x&&!m}))),De.default.createElement(s.TableRow,null,De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},"FASTA index (.fai)"),De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},De.default.createElement("input",{"data-testid":"fai-input-file",type:"file",onChange:e=>{D(e.target.files?.item(0)??null)},disabled:x&&!m||E}))),De.default.createElement(s.TableRow,null,De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},"FASTA binary index (.gzi)"),De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},De.default.createElement("input",{"data-testid":"gzi-input-file",type:"file",onChange:e=>{R(e.target.files?.item(0)??null)},disabled:x&&!m||E})))):De.default.createElement(s.TableBody,null,De.default.createElement(s.TableRow,null,De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},De.default.createElement(s.Box,{display:"flex",alignItems:"center"},De.default.createElement("span",null,"FASTA"),De.default.createElement(s.Tooltip,{title:"Remote FASTA input must be compressed with bgzip and indexed with samtools faidx (or equivalent)"},De.default.createElement(s.IconButton,{size:"small"},De.default.createElement(xe.default,{sx:{fontSize:18}}))))),De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},De.default.createElement(s.TextField,{"data-testid":"fasta-input-url",variant:"outlined",value:I,error:!z,onChange:e=>{const{value:t}=e.target;M(t),q(t?`${t}.fai`:""),O(t?`${t}.gzi`:"")},disabled:x&&!m,slotProps:{input:{startAdornment:De.default.createElement(s.InputAdornment,{position:"start"},De.default.createElement(Te.default,null))}}}))),De.default.createElement(s.TableRow,null,De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},"FASTA index (.fai)"),De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},De.default.createElement(s.TextField,{"data-testid":"fai-input-url",variant:"outlined",value:L,error:!H,onChange:e=>{q(e.target.value)},disabled:x&&!m,slotProps:{input:{startAdornment:De.default.createElement(s.InputAdornment,{position:"start"},De.default.createElement(Te.default,null))}}}))),De.default.createElement(s.TableRow,null,De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},"FASTA binary index (.gzi)"),De.default.createElement(s.TableCell,{style:{borderBottomWidth:0}},De.default.createElement(s.TextField,{"data-testid":"gzi-input-url",variant:"outlined",value:P,error:!V,onChange:e=>{O(e.target.value)},disabled:x&&!m,slotProps:{input:{startAdornment:De.default.createElement(s.InputAdornment,{position:"start"},De.default.createElement(Te.default,null))}}})))))))),De.default.createElement(s.Accordion,{disableGutters:!0,elevation:0,square:!0,className:r.accordion,expanded:"panelGffInput"===J,onChange:K("panelGffInput")},De.default.createElement(s.AccordionSummary,{className:r.accordionSummary,expandIcon:"panelGffInput"===J?De.default.createElement(Ae.default,{className:r.radioIcon,sx:{fontSize:"1.2rem",ml:5}}):De.default.createElement(Fe.default,{className:r.radioIcon,sx:{fontSize:"1.2rem",mr:5}}),"aria-controls":"panelGffInputd-content"},De.default.createElement(s.Typography,{component:"span"},"GFF3 input",De.default.createElement(s.Tooltip,{title:"GFF3 must includes FASTA sequences. File can be gzip compressed."},De.default.createElement(xe.default,{className:r.radioIcon,sx:{fontSize:18}})))),De.default.createElement(s.AccordionDetails,{className:r.accordionDetails},De.default.createElement(s.Box,{style:{marginTop:20}},De.default.createElement("input",{"data-testid":"gff3-input-file",type:"file",disabled:x&&!m,onChange:e=>{const t=e.target.files?.item(0);t&&(F(t),b(Ot.GFF3),t.name.endsWith(".gz")&&G(!0))}}),De.default.createElement(s.FormGroup,{style:{display:"grid"}},De.default.createElement(s.FormControlLabel,{control:De.default.createElement(s.Checkbox,{checked:S,onChange:()=>{w(!S)},disabled:x&&!m}),label:"Load features from GFF3 file"}),De.default.createElement(s.FormControlLabel,{"data-testid":"gff3-is-gzip-checkbox",control:De.default.createElement(s.Checkbox,{checked:j,onChange:()=>{G(!j)},disabled:x&&!m}),label:"GFF3 is gzip compressed"})))))),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{disabled:!Bt(p,E,y,A,k,N,z,H,V)||x,variant:"contained",type:"submit","data-testid":"submit-button"},x?"Submitting...":"Submit"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Cancel"))),m?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},m)):null)}const $t=[{field:"name",headerName:"Assembly Name",width:150,editable:!1},{field:"aliases",headerName:"Aliases",width:300,editable:!0}];function jt({changeManager:e,handleClose:n,session:a}){const{apolloDataStore:o}=a,{collaborationServerDriver:r}=o,l=r.getAssemblies().map((e=>({id:e.name,name:e.displayName,aliases:e.aliases.join(", ")}))),[i,c]=De.default.useState("");return De.default.createElement(Pt,{open:!0,title:"Add assembly aliases",handleClose:n,maxWidth:"sm","data-testid":"add-assembly-alias",fullWidth:!0},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.Box,{sx:{height:400,width:"100%"}},De.default.createElement(A.DataGrid,{rows:l,columns:$t,initialState:{pagination:{paginationModel:{pageSize:5}}},pageSizeOptions:[5],processRowUpdate:(a,o)=>{const r=new t.AddAssemblyAliasesChange({typeName:"AddAssemblyAliasesChange",assembly:a.id,aliases:a.aliases.split(",")});return e.submit(r).catch((()=>{c("Error submitting change")})),n(),a},disableRowSelectionOnClick:!0}))),i?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},i)):null)}const Gt=new Set(["i","me","my","myself","we","our","ours","ourselves","you","your","yours","yourself","yourselves","he","him","his","himself","she","her","hers","herself","it","its","itself","they","them","their","theirs","themselves","what","which","who","whom","this","that","these","those","am","is","are","was","were","be","been","being","have","has","had","having","do","does","did","doing","a","an","the","and","but","if","or","because","as","until","while","of","at","by","for","with","about","against","between","into","through","during","before","after","above","below","to","from","up","down","in","out","on","off","over","under","again","further","then","once","here","there","when","where","why","how","all","any","both","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","s","t","can","will","just","don","should","now","0","1","2","3","4","5","6","7","8","9"]);function Wt(e,t){for(const[n,a]of t.entries())if(e.startsWith(a))return e.replace(a,String(n));return e}const zt="$PREFIXED_ID";function Ht(e,t,n){return t===zt?[Wt(e.id,n)]:Me.default.query(e,t)}function Vt(e){return e.toLowerCase().split(/[^\d:A-Za-z]+/).filter((e=>e&&!Gt.has(e)))}function*Jt(e){for(const t of e)yield*Vt(t)}function*Xt(e){for(const t of e)if("string"==typeof t)yield t;else if("object"==typeof t){const e=Me.default.query(t,"$..*");yield*Xt(e)}}function*Kt(e,t,n){for(const a of t){const t=Ht(e,a,n);if(t.length>0)for(const e of Jt(Xt(t)))yield[a,e]}}async function Zt(e,t,n){const a=await this.db,o=t??a.transaction(["nodes"]);I.checkAbortSignal(n);const r=[...Vt(e)],l=[],s=new Map;l.push(...r.map((async(e,t)=>{I.checkAbortSignal(n);const a=o.objectStore("nodes").index("full-text-words");for await(const o of a.iterate(IDBKeyRange.bound(e,`${e}￿`,!1,!1))){I.checkAbortSignal(n);const e=o.value,a=s.get(e.id)??[e,new Set];a[1].add(t),s.set(e.id,a)}}))),await Promise.all(l),I.checkAbortSignal(n);const i=[];for(const[,[e,t]]of s)I.checkAbortSignal(n),i.push(...Yt(this.textIndexFields,e,t,r,this.prefixes));return i.sort(((e,t)=>t.score-e.score)),i.slice(0,this.options.maxSearchResults??this.DEFAULT_MAX_SEARCH_RESULTS)}function Yt(e,t,n,a,o){const r=[...n].sort().map((e=>a[e])),l=r.map((e=>{const t=e.replaceAll(/[$()*+./?[\\\]^{|}-]/g,String.raw`\$&`);return new RegExp(`\\b${t}`,"gi")}));let s=[],i=0;for(const[n,r]of e.entries()){const c=new Set,u=e.length-n-1,d=[...Xt(Ht(t,r.jsonPath,o))];for(const e of d){let n=0;const o=[];for(const[t,r]of l.entries())for(const l of e.matchAll(r)){n+=1+1*u,c.add(t);const r=l.index,s=a[t];void 0!==r&&(n+=.01*s.length,n+=s.length/e.length*100*.05,o.push({wordIndex:t,position:r}))}n+=100*c.size,i<n&&(i=n),o.sort(((e,t)=>e.position-t.position)),o.length>0&&s.push({term:t,field:r,str:e,score:n,wordMatches:o})}}s=s.filter((e=>e.score===i));for(const e of s){const{wordMatches:t}=e;for(let n=0;n<t.length-1;n++){const a=t[n],o=t[n+1],l=o.wordIndex-a.wordIndex;if(1===l||-1===l){e.score+=1,1===l&&(e.score+=1);const t=Math.abs(o.position-(a.position+r[a.wordIndex].length))-1;e.score-=.05*t}}}return s}function Qt(e){return"string"==typeof e.id}function en(e){return"string"==typeof e.sub&&"string"==typeof e.pred&&"string"==typeof e.obj}function tn(e){return Boolean(e.meta?.deprecated)}async function nn(e){return R.openDB(e,2,{upgrade(e,t,n,a,o){if(t<2&&(e.objectStoreNames.contains("meta")&&e.deleteObjectStore("meta"),e.objectStoreNames.contains("nodes")&&e.deleteObjectStore("nodes"),e.objectStoreNames.contains("edges")&&e.deleteObjectStore("edges")),e.objectStoreNames.contains("meta")||e.createObjectStore("meta"),!e.objectStoreNames.contains("nodes")){e.createObjectStore("nodes",{keyPath:"id"});const t=a.objectStore("nodes");t.createIndex("by-label","lbl"),t.createIndex("by-type","type"),t.createIndex("by-synonym",["meta","synonyms","val"]),t.createIndex("full-text-words","fullTextWords",{multiEntry:!0})}if(!e.objectStoreNames.contains("edges")){e.createObjectStore("edges",{autoIncrement:!0});const t=a.objectStore("edges");t.createIndex("by-subject","sub"),t.createIndex("by-object","obj"),t.createIndex("by-predicate","pred")}}})}function an(e){const t=new Set;for(const[,n]of e)t.add(n);return[...t]}async function on(e){const t=Date.now();let n,a=1;this.options.update?.("Parsing JSON",a);try{n=JSON.parse(await L.openLocation(this.sourceLocation).readFile("utf8"))}catch{throw new Error("Error in loading ontology")}a+=5,this.options.update?.("Parsing JSON complete",a);const o=Date.now(),[r,...l]=n.graphs??[];if(r){if(l.length>0)throw new Error("multiple graphs not supported");try{const n=e.transaction(["meta","nodes","edges"],"readwrite");await n.objectStore("meta").clear(),await n.objectStore("nodes").clear(),await n.objectStore("edges").clear();const l=n.objectStore("nodes"),s=rn.call(this).map((e=>e.jsonPath));if(r.nodes){let e=Math.round(a);for(const[,t]of r.nodes.entries())a+=1/r.nodes.length*64,Math.round(a)!=e&&a<100&&(this.options.update?.("Processing nodes",a),e=Math.round(a)),Qt(t)&&await l.add({...t,fullTextWords:an(Kt(t,s,this.prefixes))})}const i=n.objectStore("edges");if(r.edges){let e=Math.round(a);for(const[,t]of r.edges.entries())a+=1/r.edges.length*30,Math.round(a)!=e&&a<100&&(this.options.update?.("Processing edges",a),e=Math.round(a)),en(t)&&await i.add(t)}await n.done;const c=e.transaction("meta","readwrite"),{update:u,...d}=this.options;await c.objectStore("meta").add({ontologyRecord:{name:this.ontologyName,version:this.ontologyVersion,sourceLocation:this.sourceLocation},storeOptions:d,graphMeta:r.meta,timestamp:String(new Date),schemaVersion:2,timings:{overall:Date.now()-t,load:Date.now()-o}},"meta"),await c.done}catch(t){throw await e.transaction("meta","readwrite").objectStore("meta").clear(),t}}}function rn(){return[{displayName:"ID",jsonPath:zt},...this.options.textIndexing?.indexFields??dn]}async function ln(e){const[t]=await e.transaction("meta").objectStore("meta").getAll();return!!t&&Le.default(this.options.prefixes,t.storeOptions.prefixes)&&Le.default(this.options.textIndexing,t.storeOptions.textIndexing)}class sn{ontologyName;ontologyVersion;sourceLocation;db;options;loadOboGraphJson=on;getTermsByFulltext=Zt;openDatabase=nn;isDatabaseCurrent=ln;get textIndexFields(){return rn.call(this)}get prefixes(){return this.options.prefixes??new Map}DEFAULT_MAX_SEARCH_RESULTS=100;constructor(e,t,n,a){this.ontologyName=e,this.ontologyVersion=t,this.sourceLocation=n,this.options=a??{},this.db=this.prepareDatabase()}validate(){const e=[],{sourceLocation:t,sourceType:n}=this;return n?"obo-graph-json"!==n&&e.push(new Error(`ontology source file ${JSON.stringify(t)} has type ${n}, which is not yet supported`)):e.push(new Error(`unable to determine format of ontology source file ${JSON.stringify(t)}, file name must end with ".json", ".obo", or ".owl"`)),e}get sourceType(){if(r.isUriLocation(this.sourceLocation)){if(this.sourceLocation.uri.endsWith(".json"))return"obo-graph-json"}else if(r.isLocalPathLocation(this.sourceLocation)&&this.sourceLocation.localPath.endsWith(".json"))return"obo-graph-json"}get dbName(){return`Apollo Ontology "${this.ontologyName}" "${this.ontologyVersion}"`}async prepareDatabase(){const e=this.validate();if(e.length>0)throw e;const t=await this.openDatabase(this.dbName);if(await this.isDatabaseCurrent(t))return t;try{const{options:e,sourceLocation:n,sourceType:a}=this;if("obo-graph-json"!==a)throw new Error(`ontology source file ${JSON.stringify(n)} has type ${a}, which is not yet supported`);return e.update?.("",0),await this.loadOboGraphJson(t),e.update?.("",100),t}catch(e){throw t.close(),await R.deleteDB(this.dbName),e}}async termCount(e){const t=await this.db;return(e??t.transaction("nodes")).objectStore("nodes").count()}unique(e){const t=new Map,n=[];for(const a of e)t.has(a.id)||(t.set(a.id,!0),n.push(a));return n}async getTermsWithLabelOrSynonym(e,t,n){const a=t?.includeSubclasses??!0,o=await this.db,r=n??o.transaction(["nodes","edges"]),l=r.objectStore("nodes"),s=[...await l.index("by-label").getAll(e),...await l.index("by-synonym").getAll(e)];if(a){const e=await this.recurseEdges("by-object",s.map((e=>e.id)),(e=>"is_a"===e.pred),"sub",r);for(const t of e){const e=await l.get(t);e&&s.push(e)}}return s}async getPropertiesByLabel(e,t,n){const a=t?.includeSubProperties??!0,o=await this.db,r=n??o.transaction(["nodes","edges"]),l=(await this.getTermsWithLabelOrSynonym(e,{includeSubclasses:!1},r)).filter((e=>gn(e)));if(a){const e=await this.recurseEdges("by-object",l.map((e=>e.id)),(e=>"subPropertyOf"===e.pred),"sub",r),t=r.objectStore("nodes");for(const n of e){const e=await t.get(n);e&&gn(e)&&l.push(e)}}return l}async recurseEdges(e,t,n,a,o){const r=new Set;return await async function t(l){await Promise.all([...l].map((async l=>{const s=(await o.objectStore("edges").index(e).getAll(l)).filter((e=>n(e))).map((e=>e[a]));if(s.length>0){for(const e of s)r.add(e);await t(s)}})))}(t),r.values()}async*expandNodeSet(e,t="is_a",n,a){const o=await this.db,r=a??o.transaction(["edges"]),l=[...e],s=await this.recurseEdges("subclasses"===n?"by-object":"by-subject",l,(e=>e.pred===t),"subclasses"===n?"sub":"obj",r);for(const e of l)yield e;for(const e of s)yield e}expandSubclasses(e,t="is_a",n){return this.expandNodeSet(e,t,"subclasses",n)}expandSuperclasses(e,t="is_a",n){return this.expandNodeSet(e,t,"superclasses",n)}async getClassesThat(e,t,n){const a=await this.db,o=n??a.transaction(["nodes","edges"]),r=await this.getPropertiesByLabel(e,{includeSubProperties:!0},o),l=new Set(r.map((e=>e.id))),s=await async function(e){const t=[];for await(const n of e)t.push(n);return t}(this.expandSuperclasses(t.map((e=>e.id)),"is_a",o)),i=await this.recurseEdges("by-object",s,(e=>l.has(e.pred)),"sub",o),c=this.expandSubclasses(i,"is_a",o),u=[];for await(const e of c){const t=await o.objectStore("nodes").get(e);t&&mn(t)&&!tn(t)&&u.push(t)}return u}async getClassesWithoutPropertyLabeled(e,t,n){const a=await this.db,o=n??a.transaction(["nodes","edges"]),r=o.objectStore("nodes"),l=o.objectStore("edges"),s=(await this.getPropertiesByLabel(e,t,o)).map((e=>e.id)),i=await(async()=>{const e=new Set;for(const t of s)for await(const n of l.index("by-predicate").iterate(t))e.add(n.value.sub);const t=new Set;for await(const n of this.expandSubclasses(e,"is_a",o))t.add(n);return t})(),c=[];for await(const e of r){const t=e.value;mn(t)&&!i.has(t.id)&&c.push(t.id)}const u=[];for(const e of c){const t=await o.objectStore("nodes").get(e);t&&mn(t)&&!tn(t)&&u.push(t)}return u}async getAllClasses(e){const t=await this.db,n=e??t.transaction(["nodes"]);return(await n.objectStore("nodes").index("by-type").getAll("CLASS")).filter((e=>!tn(e)))}async getAllTerms(e){const t=await this.db,n=e??t.transaction(["nodes"]);return(await n.objectStore("nodes").getAll()).filter((e=>!tn(e)))}}const cn=c.types.model("OntologyRecord",{name:c.types.string,version:"unversioned",source:c.types.union(N.LocalPathLocation,N.UriLocation,N.BlobLocation),options:c.types.frozen(),equivalentTypes:c.types.map(c.types.array(c.types.string))}).volatile((e=>({dataStore:void 0,startedEquivalentTypeRequests:new Set}))).actions((e=>({ping(){},initDataStore(){e.dataStore=new sn(e.name,e.version,c.getSnapshot(e.source),e.options)},afterCreate(){c.addDisposer(e,i.autorun((()=>{this.initDataStore()})))},setEquivalentTypes(t,n){e.equivalentTypes.set(t,n)}}))).actions((e=>({loadEquivalentTypes:c.flow((function*(t){if(!e.dataStore)return;if(e.startedEquivalentTypeRequests.has(t))return;e.startedEquivalentTypeRequests.add(t);const n=(yield e.dataStore.getTermsWithLabelOrSynonym(t)).map((e=>e.lbl)).filter((e=>null!=e));c.isAlive(e)&&e.setEquivalentTypes(t,n)}))}))).actions((e=>({afterCreate(){i.autorun((t=>{e.dataStore&&(e.loadEquivalentTypes("gene"),e.loadEquivalentTypes("pseudogene"),e.loadEquivalentTypes("transcript"),e.loadEquivalentTypes("pseudogenic_transcript"),e.loadEquivalentTypes("CDS"),e.loadEquivalentTypes("mRNA"),t.dispose())}))},setEquivalentTypes(t,n){e.equivalentTypes.set(t,n)}}))).views((e=>({isTypeOf(t,n){if(t===n)return!0;if(!e.dataStore)return!1;const a=e.equivalentTypes.get(n);return a?a.includes(t):(e.loadEquivalentTypes(n),!1)}}))),un=c.types.model("OntologyManager",{ontologies:c.types.array(cn),prefixes:c.types.optional(c.types.map(c.types.string),{"GO:":"http://purl.obolibrary.org/obo/GO_","SO:":"http://purl.obolibrary.org/obo/SO_"})}).views((e=>({get featureTypeOntologyName(){const t=c.getRoot(e).jbrowse.configuration;return a.readConfObject(t.ApolloPlugin,"featureTypeOntologyName")}}))).views((e=>({get featureTypeOntology(){return this.findOntology(e.featureTypeOntologyName)},findOntology:(t,n)=>e.ontologies.find((e=>e.name===t&&(void 0===n||e.version===n))),openOntology(e,t){return this.findOntology(e,t)?.dataStore},applyPrefixes:t=>Wt(t,e.prefixes),expandPrefixes:t=>function(e,t){for(const[n,a]of t.entries())if(e.startsWith(String(n)))return e.replace(String(n),a);return e}(t,e.prefixes)}))).actions((e=>({addOntology(t,n,a,o){const r=e.ontologies.push({name:t,version:n,source:a,options:{prefixes:new Map(e.prefixes.entries()),...o}});e.ontologies[r-1].ping()}}))),dn=[{displayName:"Label",jsonPath:"$.lbl"},{displayName:"Synonym",jsonPath:"$.meta.synonyms[*].val"},{displayName:"Definition",jsonPath:"$.meta.definition.val"}],fn=a.ConfigurationSchema("OntologyRecord",{name:{type:"string",description:'the full name of the ontology, e.g. "Gene Ontology"',defaultValue:"My Ontology"},version:{type:"string",description:"the ontology's version string",defaultValue:"unversioned"},source:{type:"fileLocation",description:"the download location for the ontology's source file",defaultValue:{locationType:"UriLocation",uri:"http://example.com/myontology.json"}},textIndexFields:{type:"frozen",description:"JSON paths for text fields that will be indexed for text searching",defaultValue:dn}});function mn(e){return"CLASS"===e.type}function gn(e){return"PROPERTY"===e.type}async function pn(e,t,n){if(!e)return;const a=await t.getTermsWithLabelOrSynonym(e.type,{includeSubclasses:!1}),o=a.filter(mn);if(0===a.length)return;const r=await t.getClassesThat("part_of",o);return 0!==r.length?r:void 0}function hn({fetchValidTerms:e,filterTerms:t,includeDeprecated:n,onChange:a,ontologyName:o,ontologyVersion:r,renderInput:l,session:i,style:c,value:u}){const[d,f]=C.useState(!1),[m,g]=C.useState(),[p,h]=C.useState(""),[y,b]=C.useState(),{ontologyManager:S}=i.apolloDataStore,w=S.findOntology(o,r)?.dataStore,E=w&&d&&!m,v=w&&!y,x=C.useCallback((e=>(n||!tn(e))&&(!t||t(e))),[t,n]);C.useEffect((()=>{const e=new AbortController,{signal:t}=e;return v&&async function(e,t,n,a){if(!t)return;const o=(await e.getTermsWithLabelOrSynonym(t,{includeSubclasses:!1})).find((e=>(n??(()=>!0))(e)));if(!o)throw new Error(`not a valid ${e.ontologyName} term`);return o}(w,u,x).then((e=>{h(""),t.aborted||b(e)}),(e=>{t.aborted||I.isAbortException(e)||h(String(e))})),()=>{e.abort()}}),[i,u,x,w,v]),C.useEffect((()=>{const t=new AbortController,{signal:n}=t;return E&&async function(e,t,n,a){let o;if(t){const n=await t(e,a);n&&(o=n)}return o||(o=await e.getAllTerms()),n?o.filter((e=>n(e))):o}(w,e,x,n).then((e=>{e&&!n.aborted&&g(e)}),(e=>{n.aborted||I.isAbortException(e)||i.notify(e instanceof Error?e.message:String(e),"error")})),()=>{t.abort()}}),[E,x,w,i,e]);const T={};return p&&(T.error=!0,T.helperText=p),De.default.createElement(s.Autocomplete,{style:c,autoComplete:!0,filterSelectedOptions:!0,disableClearable:!0,selectOnFocus:!0,clearOnBlur:!0,handleHomeEndKeys:!0,freeSolo:!0,value:u,options:m??[],onOpen:()=>{f(!0)},onClose:()=>{f(!1)},loading:E,renderInput:l??(e=>De.default.createElement(s.TextField,{...e,...T})),getOptionLabel:e=>"string"==typeof e?e:e.lbl??"",isOptionEqualToValue:(e,t)=>e.lbl===t.lbl,onChange:(e,t)=>{t&&("string"==typeof t?(b(void 0),a(u,t)):t.lbl!==u&&(h(""),b(t),a(u,t.lbl)))}})}function yn({changeManager:e,handleClose:n,session:a,sourceAssemblyId:o,sourceFeature:r}){const[l,i]=C.useState(String(r.max)),[c,u]=C.useState(String(r.min+1)),[d,f]=C.useState(""),[m,g]=C.useState(""),[p,h]=C.useState(""),y=Number(l)<=Number(c);return De.default.createElement(Pt,{open:!0,title:"Add new child feature",handleClose:n,maxWidth:!1,"data-testid":"add-feature-dialog"},De.default.createElement("form",{onSubmit:function(s){s.preventDefault(),g("");const i=(new ke.default).toHexString(),u=new t.AddFeatureChange({changedIds:[r._id],typeName:"AddFeatureChange",assembly:o,addedFeature:{_id:i,refSeq:r.refSeq,min:Number(c)-1,max:Number(l),type:d},parentFeatureId:r._id});e.submit(u).then((()=>{a.apolloSetSelectedFeature(i)})),n(),s.preventDefault()}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.TextField,{margin:"dense",id:"start",label:"Start",type:"number",fullWidth:!0,variant:"outlined",value:c,onChange:e=>{u(e.target.value)}}),De.default.createElement(s.TextField,{margin:"dense",id:"end",label:"End",type:"number",fullWidth:!0,variant:"outlined",value:l,onChange:e=>{i(e.target.value)},error:y,helperText:y?'"End" must be greater than "Start"':null}),De.default.createElement(hn,{session:a,ontologyName:"Sequence Ontology",style:{width:170},value:d,filterTerms:mn,fetchValidTerms:async function(e,t,n){const a=await pn(e,t);if(a)return a;h(`Type "${e?.type}" does not have any children in the ontology`)}.bind(null,r),renderInput:e=>De.default.createElement(s.TextField,{...e,label:"Type",variant:"outlined",fullWidth:!0,error:Boolean(p),helperText:p}),onChange:(e,t)=>{var n;t&&(n=t,g(""),f(n))}})),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",type:"submit",disabled:y||!(c&&l&&d)},"Submit"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Cancel"))),m?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},m)):null)}class bn{clientStore;constructor(e){this.clientStore=e}}class Sn{dataStore;constructor(e){this.dataStore=e}recentChanges=[];undoneChanges=[];async submit(n,a={}){const{addToRecents:o=!0,submitToBackend:l=!0,updateJobsManager:s=!1}=a,i=r.getSession(this.dataStore),c=new AbortController,{jobsManager:u,isLocked:d}=r.getSession(this.dataStore);if(d)return void i.notify("Cannot submit changes in locked mode");const f={name:n.typeName,statusMessage:"Pre-validating",progressPct:0,cancelCallback:()=>{c.abort()}};s&&u.runJob(f);const m=await t.validationRegistry.frontendPreValidate(n);if(!m.ok){const e=`Pre-validation failed: "${m.resultsMessages}"`;return s&&u.abortJob(f.name,e),void i.notify(e,"error")}try{await n.execute(this.dataStore)}catch(e){return s&&u.abortJob(f.name,String(e)),console.error(e),void i.notify(`Error encountered in client: ${String(e)}. Data may be out of sync, please refresh the page`,"error")}if((await t.validationRegistry.frontendPostValidate(n,this.dataStore)).ok||await this.undo(n),l){s&&u.update(f.name,"Submitting to driver");const{collaborationServerDriver:t,getBackendDriver:r}=this.dataStore,l=e.isAssemblySpecificChange(n)?r(n.assembly)??t:t;let c;try{c=await l.submitChange(n,a)}catch(e){return s&&u.abortJob(f.name,String(e)),console.error(e),i.notify(String(e),"error"),void await this.undo(n,!1)}if(!c.ok){const e=`Post-validation failed: "${m.resultsMessages}"`;return s&&u.abortJob(f.name,e),i.notify(e,"error"),void await this.undo(n,!1)}n.notification&&i.notify(n.notification,"success"),o&&(this.recentChanges.push(n),this.undoneChanges=[])}s&&u.done(f)}async undo(e,t=!0){const n=e.getInverse();return this.submit(n,{submitToBackend:t,addToRecents:!1})}async redo(e,t=!0){return this.submit(e,{submitToBackend:t,addToRecents:!1})}async undoLastChange(){const e=r.getSession(this.dataStore),t=this.recentChanges.pop();if(t)return this.undoneChanges.push(t),this.undo(t);e.notify("No changes to undo!","info")}async redoLastChange(){const e=r.getSession(this.dataStore),t=this.undoneChanges.pop();if(t)return this.recentChanges.push(t),this.redo(t);e.notify("No changes to redo!","info")}}class wn extends bn{inFlight=new Map;refSeqMaps=new Map;async fetch(e,t,n){return e.getFetcher({locationType:"UriLocation",uri:t.toString()})(t,n)}async searchFeatures(e,t){const n=this.clientStore.getInternetAccount(t[0]),{baseURL:a}=n,o=new URL("features/searchFeatures",a),r=new URLSearchParams({assemblies:t.join(","),term:e});o.search=r.toString();const l=o.toString(),s=await this.fetch(n,l);if(!s.ok){const e=await Lt(s,"searchFeatures failed");throw new Error(e)}return s.json()}async getFeatures(e){const{assemblyName:t,end:n,refName:a,start:o}=e,{assemblyManager:l}=r.getSession(this.clientStore);if(!l.get(t))throw new Error(`Could not find assembly with name "${t}"`);const s=(await this.getRefSeqMapping(t)).get(a);if(!s)throw new Error(`Could not find refSeq "${a}"`);const i=s.id,c=this.clientStore.getInternetAccount(t),{baseURL:u}=c,d=new URL("features/getFeatures",u),f=new URLSearchParams({refSeq:i,start:String(o),end:String(n)});d.search=f.toString();const m=d.toString(),g=await this.fetch(c,m);if(!g.ok){const e=await Lt(g,"getFeatures failed");throw new Error(e)}return this.checkSocket(t,a,c),g.json()}checkSocket(t,n,a){const{socket:o}=a,r=a.retrieveToken(),l=`${t}-${n}`,s=new Sn(this.clientStore);o.hasListeners(l)||o.on(l,(async t=>{if(a.setLastChangeSequenceNumber(Number(t.changeSequence)),t.userSessionId!==r&&t.channel===l){const n=e.Change.fromJSON(t.changeInfo);e.isFeatureChange(n)&&this.haveDataForChange(n)&&await s.submit(n,{submitToBackend:!1})}}))}haveDataForChange(e){const{assembly:t,changedIds:n}=e;if(!this.clientStore.assemblies.get(t))return!1;for(const e of n)if(this.clientStore.getFeature(e))return!0;return!1}async getSequence(e){const t=`${e.refName}:${e.start}-${e.end}`,n=this.inFlight.get(t),{assemblyName:a,end:o,refName:l,start:s}=e,{assemblyManager:i}=r.getSession(this.clientStore);if(!i.get(a))throw new Error(`Could not find assembly with name "${a}"`);const c=(await this.getRefSeqMapping(a)).get(l);if(!c)throw new Error(`Could not find refSeq "${l}"`);const u=c.id;if(n)return{seq:await n,refSeq:u};let d=this.clientStore.assemblies.get(a);d||(d=this.clientStore.addAssembly(a));let f=d.refSeqs.get(u);f||(f=d.addRefSeq(u,l));const m=f.getSequence(s,o);if(m.length===o-s)return{seq:m,refSeq:u};const g=this.clientStore.getInternetAccount(a),{baseURL:p}=g,h=new URL("sequence",p),y=new URLSearchParams({refSeq:u,start:String(s),end:String(o)});h.search=y.toString();const b=h.toString(),S=this.getSeqFromServer(g,b,f,s,o);this.inFlight.set(t,S);const w=await S;return this.checkSocket(a,l,g),this.inFlight.delete(t),{seq:w,refSeq:u}}async getSeqFromServer(e,t,n,a,o){const r=await this.fetch(e,t);if(!r.ok){let e;try{e=await r.text()}catch{e=""}throw new Error(`getSequence failed: ${r.status} (${r.statusText})${e?` (${e})`:""}`)}const l=await r.text();return n.addSequence({sequence:l,start:a,stop:o}),l}async getRefSeqMapping(e){const t=this.refSeqMaps.get(e);if(t)return t;const{assemblyManager:n}=r.getSession(this.clientStore);if(!n.get(e))throw new Error(`Could not find assembly with name "${e}"`);const a=this.clientStore.getInternetAccount(e),{baseURL:o}=a,l=new URL("refSeqs",o),s=new URLSearchParams({assembly:e});l.search=s.toString();const i=l.toString(),c=await this.fetch(a,i);if(!c.ok){let e;try{e=await c.text()}catch{e=""}throw new Error(`getRefNameAliases failed: ${c.status} (${c.statusText})${e?` (${e})`:""}`)}const u=await c.json(),d=new Map(u.map((e=>[e.name,{refName:e.name,id:e._id,aliases:e.aliases}])));return this.refSeqMaps.set(e,d),d}async getRefNameAliases(e){return[...(await this.getRefSeqMapping(e)).values()].map((e=>({refName:e.refName,aliases:[...new Set([e.id,...e.aliases])],uniqueId:`alias-${e.id}`})))}async getRefSeqId(e,t){const n=await this.getRefSeqMapping(e);if(!n)return;const a=n.get(t);return a?.id}async getRegions(e){const{assemblyManager:t}=r.getSession(this.clientStore);if(!t.get(e))throw new Error(`Could not find assembly with name "${e}"`);const n=this.clientStore.getInternetAccount(e),{baseURL:a}=n,o=new URL("refSeqs",a),l=new URLSearchParams({assembly:e});o.search=l.toString();const s=o.toString(),i=await this.fetch(n,s);if(!i.ok){let e;try{e=await i.text()}catch{e=""}throw new Error(`getRegions failed: ${i.status} (${i.statusText})${e?` (${e})`:""}`)}return(await i.json()).map((e=>({refName:e.name,start:0,end:e.length})))}getAssemblies(e){const{assemblyManager:t}=r.getSession(this.clientStore);return t.assemblies.filter((t=>{const n=a.getConf(t,["sequence","metadata"]);return!(!(n&&n.apollo&&n.internetAccountConfigId)||e&&n.internetAccountConfigId!==e)}))}async submitChange(e,n={}){const{internetAccountId:a}=n,o=this.clientStore.getInternetAccount("assembly"in e?e.assembly:void 0,a),{baseURL:r}=o,l=new URL("changes",r).href,s=await this.fetch(o,l,{method:"POST",body:JSON.stringify(e.toJSON()),headers:{"Content-Type":"application/json"}});if(!s.ok){const e=await Lt(s,"submitChange failed");throw new Error(e)}const i=new t.ValidationResultSet;return s.ok||(i.ok=!1),i}}class Cn extends bn{async getFeatures(){return[[],[]]}async getSequence(e){const{assemblyName:t,end:n,refName:a,start:o}=e,r=this.clientStore.assemblies.get(t);if(!r)return{seq:"",refSeq:a};const l=r.refSeqs.get(a);return l?{seq:l.getSequence(o,n),refSeq:a}:{seq:"",refSeq:a}}async getRefNameAliases(e){const t=this.clientStore.assemblies.get(e),n=[];if(!t)return n;for(const[,e]of t.refSeqs)n.push({refName:e.name,aliases:[e._id],uniqueId:`alias-${e._id}`});return n}async getRegions(e){const t=this.clientStore.assemblies.get(e);if(!t)return[];const n=[];for(const[,a]of t.refSeqs)n.push({assemblyName:e,refName:a.name,start:a.sequence[0].start,end:a.sequence[0].stop});return n}getAssemblies(){const{assemblyManager:e}=r.getSession(this.clientStore);return e.assemblies.filter((e=>{const t=a.getConf(e,["sequence","metadata"]);return Boolean(t&&t.apollo&&!t.file&&!t.internetAccountConfigId)}))}async submitChange(e,n={}){const{clientStore:a}=this,{assemblies:o}=a;a.clearCheckResults();for(const[,e]of o)if("InMemoryFileDriver"===e.backendDriverType){const t=await dt(e);a.addCheckResults(t)}return new t.ValidationResultSet}async searchFeatures(e,t){return[]}}class En extends bn{async loadAssembly(e){const{assemblyManager:t}=r.getSession(this.clientStore),n=t.get(e);if(!n)throw new Error(`Assembly ${e} not found`);const{file:o}=a.getConf(n,["sequence","metadata"]),l=require("node:fs");return ut(e,await l.promises.readFile(o,"utf8"),this.clientStore)}async getAssembly(e){let t=this.clientStore.assemblies.get(e);return t||(t=await this.loadAssembly(e)),t}async getRefNameAliases(e){const t=await this.getAssembly(e),n=[];for(const[,e]of t.refSeqs)n.push({refName:e.name,aliases:[e._id],uniqueId:`alias-${e._id}`});return n}async getFeatures(e){return await this.getAssembly(e.assemblyName),[[],[]]}async getSequence(e){const{assemblyName:t,end:n,refName:a,start:o}=e,r=(await this.getAssembly(t)).refSeqs.get(a);if(!r)throw new Error(`refSeq ${a} not found in client data store`);return{seq:r.getSequence(o,n),refSeq:a}}async getRegions(e){const t=await this.getAssembly(e),n=[];for(const[,a]of t.refSeqs)n.push({assemblyName:e,refName:a.name,start:a.sequence[0].start,end:a.sequence[0].stop});return n}getAssemblies(){const{assemblyManager:e}=r.getSession(this.clientStore);return e.assemblies.filter((e=>{const t=a.getConf(e,["sequence","metadata"]);return Boolean(t&&t.apollo&&!t.internetAccountConfigId&&t.file)}))}async submitChange(n){if(!e.isAssemblySpecificChange(n))throw new Error(`Cannot use this type of change with local file: "${n.typeName}"`);const{assemblyManager:o}=r.getSession(this.clientStore),l=o.get(n.assembly);if(!l)throw new Error(`Could not find assembly with name "${n.assembly}"`);const{file:s}=a.getConf(l,["sequence","metadata"]),i=this.clientStore.assemblies.get(n.assembly);if(!i)throw new Error(`Could not find assembly in client with name "${n.assembly}"`);const u=new Set(...i.refSeqs.keys()),{checkResults:d}=this.clientStore;for(const e of d.values())u.has(e.refSeq)&&d.delete(e._id);const f=await dt(i);this.clientStore.addCheckResults(f);const m=[{directive:"gff-version",value:"3"}];for(const[,e]of i.refSeqs)m.push({directive:"sequence-region",value:`${e.name} 1 ${e.sequence[0].stop}`});for(const e of i.comments)m.push({comment:e});for(const[,e]of i.refSeqs){const{features:n}=e;for(const[,e]of n)m.push(t.annotationFeatureToGFF3(c.getSnapshot(e)))}for(const[,e]of i.refSeqs){const[n]=e.sequence,a=t.splitStringIntoChunks(n.sequence,80).join("\n");m.push({id:e.name,description:e.description,sequence:a})}const g=v.formatSync(m),p=require("node:fs");return await p.promises.writeFile(s,g,"utf8"),new t.ValidationResultSet}async searchFeatures(e,t){return[]}}var vn;function xn(e,t,n,a){const o={_id:(new ke.default).toHexString(),refSeq:e,type:"CDS",min:n,max:a,strand:t},r={_id:(new ke.default).toHexString(),refSeq:e,type:"exon",min:n,max:a,strand:t},l={};return l[o._id]=o,l[r._id]=r,{_id:(new ke.default).toHexString(),refSeq:e,type:"mRNA",min:n,max:a,strand:t,children:l}}function Tn({changeManager:e,handleClose:n,region:a,session:o}){const[r,l]=C.useState(String(a.end)),[i,c]=C.useState(String(a.start+1)),[u,d]=C.useState(vn.GENE_AND_SUBFEATURES),[f,m]=C.useState(""),[g,p]=C.useState(),[h,y]=C.useState(""),b=Number(r)<=Number(i);let S=Boolean(b)||!(i&&r&&u);return(u===vn.CUSTOM&&!f||!g&&u===vn.GENE_AND_SUBFEATURES||!g&&u===vn.TRANSCRIPT_AND_SUBFEATURES)&&(S=!0),De.default.createElement(Pt,{open:!0,title:"Add new feature",handleClose:n,maxWidth:!1,"data-testid":"add-feature-dialog"},De.default.createElement("form",{onSubmit:async function(l){l.preventDefault(),y("");const s=o.apolloDataStore.getBackendDriver(a.assemblyName);if(!s)return void y("No backend driver found");let c=a.refName;if(s instanceof wn){const e=await s.getRefSeqId(a.assemblyName,a.refName);if(!e)return void y(`Could not find refSeq for "${a.refName}"`);c=e}if(u===vn.GENE_AND_SUBFEATURES){const l=xn(c,g,Number(i)-1,Number(r)),s={};s[l._id]=l;const u=(new ke.default).toHexString(),d=new t.AddFeatureChange({changedIds:[u],typeName:"AddFeatureChange",assembly:a.assemblyName,addedFeature:{_id:u,refSeq:c,min:Number(i)-1,max:Number(r),type:"gene",strand:g,children:s}});return e.submit(d).then((()=>{o.apolloSetSelectedFeature(u)})),void n()}if(u===vn.TRANSCRIPT_AND_SUBFEATURES){const l=xn(c,g,Number(i)-1,Number(r)),s=new t.AddFeatureChange({changedIds:[l._id],typeName:"AddFeatureChange",assembly:a.assemblyName,addedFeature:l});return e.submit(s).then((()=>{o.apolloSetSelectedFeature(l._id)})),void n()}if(!f)return void y("No type selected");const d=(new ke.default).toHexString(),m=new t.AddFeatureChange({changedIds:[d],typeName:"AddFeatureChange",assembly:a.assemblyName,addedFeature:{_id:d,refSeq:c,min:Number(i)-1,max:Number(r),type:f,strand:g}});e.submit(m).then((()=>{o.apolloSetSelectedFeature(d)})),n()},"data-testid":"submit-form"},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.TextField,{margin:"dense",id:"start",label:"Start",type:"number",fullWidth:!0,variant:"outlined",value:Number(i),onChange:e=>{c(e.target.value)}}),De.default.createElement(s.TextField,{margin:"dense",id:"end",label:"End",type:"number",fullWidth:!0,variant:"outlined",value:r,onChange:e=>{l(e.target.value)},error:b,helperText:b?'"End" must be greater than "Start"':null}),De.default.createElement(s.FormControl,null,De.default.createElement(s.InputLabel,{id:"demo-simple-select-label"},"Strand"),De.default.createElement(s.Select,{labelId:"demo-simple-select-label",id:"demo-simple-select",label:"Strand",value:g?.toString(),onChange:function(e){switch(y(""),Number(e.target.value)){case 1:p(1);break;case-1:p(-1);break;default:p(void 0)}}},De.default.createElement(s.MenuItem,{value:void 0}),De.default.createElement(s.MenuItem,{value:1},"+"),De.default.createElement(s.MenuItem,{value:-1},"-"))),De.default.createElement(s.FormControl,{style:{marginTop:20}},De.default.createElement(s.RadioGroup,{"aria-labelledby":"demo-radio-buttons-group-label",defaultValue:vn.GENE_AND_SUBFEATURES,name:"radio-buttons-group",value:u,onChange:e=>{y("");const{value:t}=e.target;Object.keys(vn).includes(t)&&d(vn[t])}},De.default.createElement(s.FormControlLabel,{value:vn.GENE_AND_SUBFEATURES,control:De.default.createElement(s.Radio,null),label:De.default.createElement(s.Box,{display:"flex",alignItems:"center"},"Add gene and sub-features",De.default.createElement(s.Tooltip,{title:"This is a shortcut to create a gene with a single mRNA, exon, and CDS"},De.default.createElement(s.IconButton,{size:"small"},De.default.createElement(xe.default,{sx:{fontSize:18}}))))}),De.default.createElement(s.FormControlLabel,{value:vn.TRANSCRIPT_AND_SUBFEATURES,control:De.default.createElement(s.Radio,null),label:De.default.createElement(s.Box,{display:"flex",alignItems:"center"},"Add transcript and sub-features",De.default.createElement(s.Tooltip,{title:"This is a shortcut to create a single mRNA with exon and CDS, but without a parent gene"},De.default.createElement(s.IconButton,{size:"small"},De.default.createElement(xe.default,{sx:{fontSize:18}}))))}),De.default.createElement(s.FormControlLabel,{value:vn.CUSTOM,checked:u!==vn.GENE_AND_SUBFEATURES&&u!==vn.TRANSCRIPT_AND_SUBFEATURES,control:De.default.createElement(s.Radio,null),label:"Add feature with a sequence ontology type"}))),u===vn.CUSTOM?De.default.createElement(hn,{session:o,ontologyName:"Sequence Ontology",style:{width:170},value:f,filterTerms:mn,renderInput:e=>De.default.createElement(s.TextField,{...e,label:"Type",variant:"outlined",fullWidth:!0}),onChange:(e,t)=>{var n;t&&(n=t,y(""),m(n))}}):null),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",type:"submit",disabled:S},"Submit"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Cancel"))),h?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},h)):null)}function An(e,t){const n=(new ke.default).toHexString();t.push(n);const a={};if(e.children)for(const n of Object.values(e.children)){const e=An(n,t);a[e._id]=e}const o="string"==typeof e.refSeq?e.refSeq:e.refSeq.toHexString();return{...e,refSeq:o,children:e.children&&a,_id:n}}function Fn({changeManager:e,handleClose:n,session:o,sourceAssemblyId:r,sourceFeature:l}){const{assemblyManager:i}=o,u=i.assemblyList,[d,f]=C.useState(u.find((e=>e.name!==r))?.name),[m,g]=C.useState([]),[p,h]=C.useState(""),[y,b]=C.useState(l.min),[S,w]=C.useState("");function E(e,t){const n={};if(e.children)for(const a of Object.values(e.children)){const e=E(a,t);e.refSeq=p,e.min=e.min+t,e.max=e.max+t,n[e._id]=e}const a="string"==typeof e.refSeq?e.refSeq:e.refSeq.toHexString(),o="string"==typeof e._id?e._id:e._id.toHexString();return{...e,refSeq:a,children:e.children&&n,_id:o}}return C.useEffect((()=>{(async function(){if(h(""),!d)return void w("No assemblies to copy to");const e=await i.waitForAssembly(d);if(!e)return;const{refNameAliases:t}=e;if(!t)return;const n=[...Object.entries(t)].filter((([e,t])=>e!==t)).map((([e,t])=>({_id:e,name:t})));g(n),h(n[0]?._id||"")})().catch((e=>{w(String(e))}))}),[d,i]),De.default.createElement(Pt,{open:!0,title:"Copy features and annotations",handleClose:n,maxWidth:!1,"data-testid":"copy-feature"},De.default.createElement("form",{onSubmit:async function(a){if(!d)return;a.preventDefault(),w("");const r=l.length,s=await i.waitForAssembly(d);if(!s)return void w(`Assembly not found: ${d}.`);const u=s.getCanonicalRefName(p),f=s.regions?.find((e=>e.refName===u));if(!f)return void w(`RefSeq not found: ${p}.`);const m=y+r;if(m>f.end)return void w(`Feature would extend beyond the bounds of the selected reference sequence. (Feature would end at ${m}, but reference sequence ends at ${f.end})`);if(y<f.start)return void w(`Reference sequence starts at ${f.start}, feature cannot start before that.`);const g=[],h=An(c.getSnapshot(l),g),b={...h.attributes};"Parent"in b&&delete b.Parent,h.refSeq=p;const S=y-h.min;h.min=y,h.max=y+r;const C=E(h,S),v=new t.AddFeatureChange({changedIds:[h._id],typeName:"AddFeatureChange",assembly:d,addedFeature:{_id:h._id,refSeq:h.refSeq,min:h.min,max:h.max,type:h.type,children:C.children,attributes:b,strand:h.strand},copyFeature:!0,allIds:g});e.submit(v).then((()=>{o.apolloSetSelectedFeature(h._id)})),n(),a.preventDefault()}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.DialogContentText,null,"Target assembly"),De.default.createElement(s.Select,{labelId:"label",value:d,onChange:function(e){f(e.target.value)}},u.filter((e=>e.name!==r)).map((e=>De.default.createElement(s.MenuItem,{key:e.name,value:e.name},a.readConfObject(e,"displayName"))))),De.default.createElement(s.DialogContentText,null,"Target reference sequence"),De.default.createElement(s.Select,{labelId:"label",value:p,onChange:function(e){h(e.target.value)}},m.map((e=>De.default.createElement(s.MenuItem,{key:e._id,value:e._id},e.name)))),De.default.createElement(s.DialogContentText,null,"Start position in target reference sequence"),De.default.createElement(s.TextField,{margin:"dense",type:"number",fullWidth:!0,variant:"outlined",value:y,onChange:e=>{b(Number(e.target.value))}})),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{disabled:!d||!p||!y,variant:"contained",type:"submit"},"Submit"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Cancel"))),S?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},S)):null)}function kn({changeManager:e,handleClose:n,session:a}){const{internetAccounts:o}=c.getRoot(a),[r,l]=C.useState(""),[i,u]=C.useState(!1),[d,f]=C.useState(!1),m=o.filter((e=>"ApolloInternetAccount"===e.type));if(0===m.length)throw new Error("No Apollo internet account found");const[g,p]=C.useState(m[0]),{collaborationServerDriver:h}=a.apolloDataStore,y=h.getAssemblies(),[b,S]=C.useState(y.at(0));return De.default.createElement(Pt,{open:!0,title:"Delete Assembly",handleClose:n,maxWidth:!1,"data-testid":"delete-assembly"},De.default.createElement("form",{onSubmit:async function(a){if(a.preventDefault(),f(!0),l(""),!b)return void l("Must select assembly!");const o=new t.DeleteAssemblyChange({typeName:"DeleteAssemblyChange",assembly:b.name});await e.submit(o,{internetAccountId:g.internetAccountId}),n(),a.preventDefault()}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},m.length>1?De.default.createElement(De.default.Fragment,null,De.default.createElement(s.DialogContentText,null,"Select account"),De.default.createElement(s.Select,{value:g.internetAccountId,onChange:function(e){f(!1);const t=m.find((t=>t.internetAccountId===e.target.value));if(!t)throw new Error(`Could not find internetAccount with ID "${e.target.value}"`);p(t)},disabled:d&&!r},o.map((e=>De.default.createElement(s.MenuItem,{key:e.id,value:e.internetAccountId},e.name))))):null,De.default.createElement(s.DialogContentText,null,"Select assembly"),De.default.createElement(s.Select,{labelId:"label",value:b?.name??"",onChange:function(e){const t=y.find((t=>t.name===e.target.value));S(t)},disabled:0===y.length},y.map((e=>De.default.createElement(s.MenuItem,{key:e.name,value:e.name},e.displayName)))),De.default.createElement(s.DialogContentText,null,De.default.createElement("strong",{style:{color:"red"}},"NOTE: All assembly data will be deleted and this operation cannot be undone!")),De.default.createElement(s.FormGroup,null,De.default.createElement(s.FormControlLabel,{control:De.default.createElement(s.Checkbox,{checked:i,onChange:()=>{u(!i)}}),label:"I understand that all assembly data will be deleted"}))),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{disabled:!b||!i,variant:"contained",type:"submit"},"Delete"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Cancel"))),r?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},r)):null)}function Dn({changeManager:e,handleClose:n,selectedFeature:a,session:o,setSelectedFeature:r,sourceAssemblyId:l,sourceFeature:i}){const[u,d]=C.useState(""),{ontologyManager:f}=o.apolloDataStore,{featureTypeOntology:m}=f;function g(e){if(!e.parent?.children||1===e.parent.children.size)return;const t=[];for(const n of e.parent.children.values())m?.isTypeOf(n.type,"CDS")||t.push(n);t.sort(((e,t)=>e.min-t.min));const n=[];for(const t of e.parent.children.values())m?.isTypeOf(t.type,"CDS")||n.push(t);if(n.sort(((e,t)=>t.max-e.max)),e.min===t[0].min){let n;for(const a of t)if(a._id!==e._id&&a.min>=e.min){n=a.min;break}if(n&&n!=e.parent.min)return{typeName:"LocationStartChange",changedId:e.parent._id,featureId:e.parent._id,oldLocation:e.parent.min,newLocation:n}}if(e.max===n[0].max){let t;for(const a of n)if(a._id!=e._id&&a.max<=e.max){t=a.max;break}if(t&&t!=e.parent.max)return{typeName:"LocationEndChange",changedId:e.parent._id,featureId:e.parent._id,oldLocation:e.parent.max,newLocation:t}}}return De.default.createElement(Pt,{open:!0,title:"Delete feature",handleClose:n,maxWidth:!1,"data-testid":"delete-feature"},De.default.createElement("form",{onSubmit:o=>{!async function(o){o.preventDefault(),d(""),a?._id===i._id&&r();const s=[],u=new t.DeleteFeatureChange({changedIds:[i._id],typeName:"DeleteFeatureChange",assembly:l,changes:[{deletedFeature:c.getSnapshot(i),parentFeatureId:i.parent?._id}]});if(m&&(m.isTypeOf(i.type,"transcript")||m.isTypeOf(i.type,"pseudogenic_transcript"))){const e=g(i);e&&s.push(e)}if(m&&m.isTypeOf(i.type,"exon")){const e=function(e){if(!m)return;if(!m.isTypeOf(e.type,"exon"))return;if(!e.parent?.cdsLocations||0===e.parent.cdsLocations.length||0===e.parent.cdsLocations[0].length)return;if(!e.parent.children)throw new Error("Unable to find parent of CDS");if(1!=e.parent.cdsLocations.length)throw new Error("Unable to handle a transcript with multiple CDSs");const n=(e.parent.cdsLocations.at(0)??[]).sort((({min:e},{min:t})=>e-t));let a;for(const t of e.parent.children.values())if(t.type===n[0].type){a=t;break}if(!a)throw new Error("Unable to find CDS");const o=n[0].min,r=n[n.length-1].max;if(!(e.min>o&&e.max<r||e.max<o||e.min>r)){if(e.min<=o&&e.max>=r)return new t.DeleteFeatureChange({changedIds:[a._id],typeName:"DeleteFeatureChange",assembly:l,changes:[{deletedFeature:c.getSnapshot(a),parentFeatureId:a.parent?._id}]});if(e.min<=o&&e.max>o){let t;for(const a of n)if(a.min>e.max){t=a.min;break}if(!t)throw new Error("Error setting new CDS start");return{typeName:"LocationStartChange",changedId:a._id,featureId:a._id,oldLocation:a.min,newLocation:t}}if(e.min<r&&e.max>=r){let t;for(const a of n.reverse())if(a.max<e.min){t=a.max;break}if(!t)throw new Error("Error setting new CDS end");return{typeName:"LocationEndChange",changedId:a._id,featureId:a._id,oldLocation:a.max,newLocation:t}}throw new Error("Unexpected relationship between exon and CDS")}}(i);e&&("DeleteFeatureChange"===e.typeName?(u.changedIds.push(...e.changedIds),u.changes.push(...e.changes)):s.push(e));const n=g(i);if(n){s.push(n);const e=i.parent?.parent;if(e?.children)if("LocationStartChange"===n.typeName){let t=n.newLocation;for(const[,a]of e.children)a._id!=n.featureId&&a.min<t&&(t=a.min);t!=e.min&&s.push({typeName:n.typeName,changedId:e._id,featureId:e._id,oldLocation:e.min,newLocation:t})}else{let t=n.newLocation;for(const[,a]of e.children)a._id!=n.featureId&&a.max>t&&(t=a.max);t!=e.max&&s.push({typeName:n.typeName,changedId:e._id,featureId:e._id,oldLocation:e.max,newLocation:t})}}}const f=function(e,n){if(0===e.length)return;const a=new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[],changes:[],assembly:n}),o=new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[],changes:[],assembly:n});for(const t of e)"LocationStartChange"===t.typeName&&(a.changedIds.push(t.changedId),a.changes.push({featureId:t.featureId,oldStart:t.oldLocation,newStart:t.newLocation})),"LocationEndChange"===t.typeName&&(o.changedIds.push(t.changedId),o.changes.push({featureId:t.featureId,oldEnd:t.oldLocation,newEnd:t.newLocation}));if(a.changedIds.length>0&&0===o.changedIds.length)return a;if(o.changedIds.length>0&&0===a.changedIds.length)return o;throw new Error("Unexpected list of changes")}(s,l);await e.submit(u),f&&await e.submit(f),n(),o.preventDefault()}(o)}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.DialogContentText,null,"Are you sure you want to delete the selected feature?")),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",type:"submit"},"Yes"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Cancel"))),u?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},u)):null)}function Nn({handleClose:e,session:n}){const[o,r]=C.useState(!1),[l,i]=C.useState(),[u,d]=C.useState(""),{collaborationServerDriver:f,getInternetAccount:m,inMemoryFileDriver:g}=n.apolloDataStore,p=[...f.getAssemblies(),...g.getAssemblies()];return De.default.createElement(Pt,{open:!0,title:"Export GFF3",handleClose:e,maxWidth:!1,"data-testid":"download-gff3"},De.default.createElement("form",{onSubmit:async function(r){if(r.preventDefault(),d(""),!l)return void d("Must select assembly to download");const{internetAccountConfigId:s}=a.getConf(l,["sequence","metadata"]);s?await async function(e){if(!l)return void d("Must select assembly to download");const t=m(l.configuration.name,e),n=new URL("export/getID",t.baseURL),a=new URLSearchParams({assembly:l.name});n.search=a.toString();const r=n.toString(),s=t.getFetcher({locationType:"UriLocation",uri:r}),i=await s(r,{method:"GET"});if(!i.ok){const e=await Lt(i,"Error when exporting ID");return void d(e)}const{exportID:c}=await i.json(),u=new URL("export",t.baseURL),f=new URLSearchParams({exportID:c,includeFASTA:o?"true":"false"});u.search=f.toString();const g=u.toString();window.open(g,"_blank")}(s):function(e){if(!l)return void d("Must select assembly to download");const{assemblies:n}=e.apolloDataStore,o=n.get(l.name),r=o?.refSeqs;if(!r)return void d(`No refSeqs found for assembly "${l.name}"`);const s=[{directive:"gff-version",value:"3"}],i=a.getConf(l,["sequence","adapter","features"]);for(const e of i){const{end:t,refName:n,start:a}=e;s.push({directive:"sequence-region",value:`${n} ${a+1} ${t}`})}for(const[,e]of r){const{features:n}=e;if(n)for(const[,e]of n)s.push(t.annotationFeatureToGFF3(c.getSnapshot(e)))}for(const e of i){const{refName:t,seq:n}=e;s.push({id:t,description:"",sequence:n})}const u=v.formatSync(s),f=new Blob([u],{type:"text/plain;charset=utf-8"});P.saveAs(f,`${l.displayName??l.name}.gff3`)}(n),e()}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.DialogContentText,null,"Select assembly"),De.default.createElement(s.Select,{labelId:"label",value:l?.name??"",onChange:function(e){const t=p.find((t=>t.name===e.target.value));i(t)},disabled:0===p.length},p.map((e=>De.default.createElement(s.MenuItem,{key:e.name,value:e.name},e.displayName??e.name)))),De.default.createElement(s.DialogContentText,null,"Select assembly to export to GFF3"),De.default.createElement(s.FormGroup,null,De.default.createElement(s.FormControlLabel,{"data-testid":"include-fasta-checkbox",control:De.default.createElement(s.Checkbox,{checked:o,onChange:()=>{r(!o)}}),label:"Include fasta sequence in GFF output"}))),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{disabled:!l,variant:"contained",type:"submit"},"Download"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:e},"Cancel"))),u?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},u)):null)}function Rn({changeManager:e,handleClose:n,session:o}){const{apolloDataStore:r}=o,[l,i]=C.useState(),[c,u]=C.useState(),[d,f]=C.useState(""),[m,g]=C.useState(!1),[p,h]=C.useState(),[y,b]=C.useState(!1),[S,w]=C.useState(!1),{collaborationServerDriver:E,getInternetAccount:v}=r,x=E.getAssemblies();return C.useEffect((()=>{c&&(async()=>{const{internetAccountConfigId:e}=a.getConf(c,["sequence","metadata"]),t=v(c.name,e);if(!t)throw new Error("No Apollo internet account found");const{baseURL:n}=t,o=new URL("features/count",n),r=new URLSearchParams({assemblyId:c.name});o.search=r.toString();const l=t.getFetcher({locationType:"UriLocation",uri:o.toString()});w(!0);const s=await l(o.toString(),{method:"GET"});if(!s.ok)throw new Error(await Lt(s));{const e=await s.json();h(e.count)}w(!1)})().catch((e=>{console.error(e),f(e.message??e)}))}),[v,o,c]),De.default.createElement(Pt,{open:!0,title:"Import Features from GFF3 file",handleClose:n,maxWidth:!1,"data-testid":"import-features-dialog"},S?De.default.createElement(Oe.default,null):null,De.default.createElement("form",{onSubmit:async function(r){r.preventDefault(),f(""),w(!0),g(!0);let s="";if(!l)return void f("must select a file");if(!c)return void f("Must select assembly to download");const{internetAccountConfigId:i}=a.getConf(c,["sequence","metadata"]),u=v(c.name,i),{baseURL:d}=u,m=new URL("files",d);m.searchParams.set("type","text/x-gff3");const p=m.href,h=new FormData;h.append("file",l),h.append("fileName",l.name),h.append("type","text/x-gff3");const b=u.getFetcher({locationType:"UriLocation",uri:p});n();const{jobsManager:S}=o,C=new AbortController,E={name:`Importing features for ${c.displayName}`,statusMessage:"Uploading file, this may take awhile",progressPct:0,cancelCallback:()=>{C.abort(),S.abortJob(E.name)}};if(S.runJob(E),b){const{signal:e}=C,t=await b(p,{method:"POST",body:h,signal:e});if(!t.ok){const e=await Lt(t,"Error when inserting new features (while uploading file)");return S.abortJob(E.name,e),void f(e)}s=(await t.json())._id}const x=new t.AddFeaturesFromFileChange({typeName:"AddFeaturesFromFileChange",assembly:c.name,fileId:s,deleteExistingFeatures:y});S.done(E),await e.submit(x,{updateJobsManager:!0})}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.DialogContentText,null,"Select assembly"),De.default.createElement(s.Select,{labelId:"label",value:c?.name??"",onChange:function(e){const t=x.find((t=>t.name===e.target.value));u(t),g(!1)},disabled:m&&!d},x.map((e=>De.default.createElement(s.MenuItem,{key:e.name,value:e.name},e.displayName??e.name))))),De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.DialogContentText,null,"Upload GFF3 to load features"),De.default.createElement("input",{type:"file",onChange:function(e){g(!1),e.target.files&&i(e.target.files[0])},disabled:m&&!d})),p&&p>0?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,null,"This assembly already has ",p," features, would you like to delete the existing features before importing new ones?"),De.default.createElement(Pe.default,{label:"Yes, delete existing features",disabled:m&&!d,control:De.default.createElement(qe.default,{checked:y,onChange:function(e){b(e.target.checked)},slotProps:{input:{"aria-label":"controlled"}},color:"warning"})})):null,De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{disabled:!(c&&l&&void 0!==p)||m,variant:"contained",type:"submit"},m?"Submitting...":"Submit"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Close"))),d?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},d)):null)}function In({handleClose:e,session:t}){const{internetAccounts:n}=c.getRoot(t),[a,o]=C.useState(""),r=n.filter((e=>"ApolloInternetAccount"===e.type));if(0===r.length)throw new Error("No Apollo internet account found");const[l,i]=C.useState(r[0]);return De.default.createElement(Pt,{open:!0,title:"Log out",handleClose:e,maxWidth:!1,"data-testid":"log-out"},De.default.createElement("form",{onSubmit:function(e){e.preventDefault(),o(""),l.removeToken(),globalThis.location.reload()}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},r.length>1?De.default.createElement(De.default.Fragment,null,De.default.createElement(s.DialogContentText,null,"Select account"),De.default.createElement(s.Select,{value:l.internetAccountId,onChange:function(e){const t=r.find((t=>t.internetAccountId===e.target.value));if(!t)throw new Error(`Could not find internetAccount with ID "${e.target.value}"`);i(t)}},n.map((e=>De.default.createElement(s.MenuItem,{key:e.id,value:e.internetAccountId},e.name))))):null,De.default.createElement(s.DialogContentText,null,"Are you sure you want to log out?")),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{disabled:!l,variant:"contained",type:"submit"},"Log Out"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:e},"Cancel"))),a?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},a)):null)}function Mn({handleClose:e,session:t}){const{internetAccounts:n}=c.getRoot(t),[a,o]=C.useState(""),[r,l]=C.useState(!1),i=n.filter((e=>"ApolloInternetAccount"===e.type));if(0===i.length)throw new Error("No Apollo internet account found");const[u,d]=C.useState(i[0]),[f,m]=C.useState([]),[g,p]=C.useState([]),{collaborationServerDriver:h}=t.apolloDataStore,y=h.getAssemblies(),[b,S]=C.useState(y.at(0));function w(e,t){const n=[...g],a=e.target.value;if(t)n.includes(a)||(n.push(a),p(n));else{const e=n.indexOf(a,0);-1!==e&&n.splice(e,1),p(n)}}return C.useEffect((()=>{(async function(){const{baseURL:e,getFetcher:t}=u,n=new URL("checks/types",e).href,a=t({locationType:"UriLocation",uri:n}),r=await a(n,{method:"GET"});if(!r.ok){const e=await Lt(r,"Error when retrieving checks from server");return void o(e)}const l=await r.json();m(l)})().catch((e=>{o(String(e))}))}),[u]),C.useEffect((()=>{(async function(){if(!b)return;const{baseURL:e,getFetcher:t}=u,n=new URL(`assemblies/${b.name}`,e).href,a=t({locationType:"UriLocation",uri:n}),r=await a(n,{method:"GET"});if(!r.ok){const e=await Lt(r,"Error when retrieving assembly from server");return void o(e)}const l=await r.json();p(l.checks)})().catch((e=>{o(String(e))}))}),[b,u]),De.default.createElement(Pt,{open:!0,title:"Manage Checks",handleClose:e,"data-testid":"manage-checks"},De.default.createElement("form",{onSubmit:async function(n){if(n.preventDefault(),!b)return void o("Must select assembly!");const{notify:a}=t,{baseURL:r,getFetcher:l}=u,s=new URL("assemblies/checks",r).href,i=l({locationType:"UriLocation",uri:s}),c=await i(s,{method:"POST",body:JSON.stringify({_id:b.name,checks:g,name:""}),headers:{"Content-Type":"application/json"}});if(c.ok)a("Assembly checks updated successfully","success"),e();else{const e=await Lt(c,"Error when updating assembly checks");o(e)}}},De.default.createElement(s.DialogContent,null,i.length>1?De.default.createElement(De.default.Fragment,null,De.default.createElement(s.DialogContentText,null,"Select account"),De.default.createElement(s.Select,{value:u.internetAccountId,onChange:function(e){l(!1);const t=i.find((t=>t.internetAccountId===e.target.value));if(!t)throw new Error(`Could not find internetAccount with ID "${e.target.value}"`);d(t)},disabled:r&&!a},n.map((e=>De.default.createElement(s.MenuItem,{key:e.id,value:e.internetAccountId},e.name))))):null,De.default.createElement(s.DialogContentText,null,"Select assembly"),De.default.createElement(s.Select,{style:{width:300},labelId:"label",value:b?.name??"",onChange:function(e){const t=y.find((t=>t.name===e.target.value));S(t)},disabled:0===y.length},y.map((e=>De.default.createElement(s.MenuItem,{key:e.name,value:e.name},e.displayName)))),De.default.createElement("br",null),De.default.createElement("br",null),De.default.createElement(s.TableContainer,{component:s.Paper},De.default.createElement(s.Table,null,De.default.createElement(s.TableHead,null,De.default.createElement(s.TableRow,null,De.default.createElement(s.TableCell,null,"Check name"),De.default.createElement(s.TableCell,null,"Use check"))),De.default.createElement(s.TableBody,null,f.map((e=>De.default.createElement(s.TableRow,{key:e._id},De.default.createElement(s.TableCell,null,e.name),De.default.createElement(s.TableCell,null,De.default.createElement(s.Checkbox,{value:e._id,checked:g.includes(e._id),onChange:w}))))))))),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",type:"submit"},"Submit"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:e},"Cancel"))),a?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},a)):null)}function Ln({changeManager:e,handleClose:n,session:a}){const{internetAccounts:o}=c.getRoot(a),r=o.filter((e=>"ApolloInternetAccount"===e.type&&e.role?.includes("admin")));if(0===r.length)throw new Error("No Apollo internet account found");const[l,i]=C.useState(""),[u,d]=C.useState(r[0]),[f,m]=C.useState([]);function g(e){return e===u.getUserId()}C.useEffect((()=>{(async function(){const{baseURL:e}=u,t=new URL("users",e).href,n=u.getFetcher({locationType:"UriLocation",uri:t});if(n){const e=await n(t,{method:"GET"});if(!e.ok){const t=await Lt(e,"Error when getting user data from db");return void i(t)}const a=await e.json();m(a.map((e=>void 0===e.role?{...e,role:""}:e)))}})().catch((e=>{i(String(e))}))}),[u]);const p=[{field:"username",headerName:"User",width:140},{field:"email",headerName:"Email",width:160},{field:"role",headerName:"Role",width:140,type:"singleSelect",valueOptions:["readOnly","user","admin","none"],getOptionLabel(e){switch(e){case"readOnly":return"Read-only";case"user":return"User";case"admin":return"Admin";case"none":return"None";default:return"unknown"}},editable:!0},{field:"actions",type:"actions",getActions:n=>[De.default.createElement(A.GridActionsCellItem,{key:`delete-${n.id}`,icon:De.default.createElement(we.default,null),onClick:async()=>{globalThis.confirm("Delete this user?")&&await async function(n){const a=new t.DeleteUserChange({typeName:"DeleteUserChange",userId:n});await e.submit(a,{internetAccountId:u.internetAccountId}),m((e=>e.filter((e=>e._id!==n))))}(n.id)},disabled:g(n.id),label:"Delete"})]}];return De.default.createElement(Pt,{open:!0,fullScreen:!0,title:"Manage users",handleClose:n,"data-testid":"manage-users"},De.default.createElement(s.DialogContent,null,r.length>1?De.default.createElement(De.default.Fragment,null,De.default.createElement(s.DialogContentText,null,"Select account"),De.default.createElement(s.Select,{value:u.internetAccountId,onChange:function(e){const t=r.find((t=>t.internetAccountId===e.target.value));if(!t)throw new Error(`Could not find internetAccount with ID "${e.target.value}"`);d(t)},disabled:!l},o.map((e=>De.default.createElement(s.MenuItem,{key:e.id,value:e.internetAccountId},e.name))))):null,De.default.createElement("div",{style:{height:"100%",width:"100%"}},De.default.createElement(A.DataGrid,{pagination:!0,rows:f,columns:p,getRowId:e=>e._id,slots:{toolbar:A.GridToolbar},getRowHeight:()=>"auto",isCellEditable:e=>!g(e.id),processRowUpdate:async function(n){const a=new t.UserChange({typeName:"UserChange",role:n.role,userId:n._id});return await e.submit(a,{internetAccountId:u.internetAccountId}),n},onProcessRowUpdateError:e=>{i(String(e))}}))),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Close")),l?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},l)):null)}function qn(e,t){const n=t[e];let a;if("three_prime"===e)a=`3'end (coords: ${n.min+1}-${n.max})`;else{if("five_prime"!==e)throw new Error(`Unexpected direction: "${e}"`);a=`5'end (coords: ${n.min+1}-${n.max})`}return a}function Pn({changeManager:e,handleClose:n,selectedFeature:a,setSelectedFeature:o,sourceAssemblyId:r,sourceFeature:l}){const[i,u]=C.useState(""),[d,f]=C.useState(),m=function(e){const t={},n=e.parent;if(!n)throw new Error("Unable to find parent of reference exon");let a=[];if(n.children)for(const[,e]of n.children)"exon"===e.type&&a.push(e);a=a.sort(((e,t)=>e.min===t.min?e.max-t.max:e.min-t.min)),n.strand&&-1===n.strand&&(a=a.reverse());let o=0;for(const n of a){if(n._id===e._id){a.length>o+1&&(t.three_prime=a[o+1]),o>0&&(t.five_prime=a[o-1]);break}o++}return t}(l);return De.default.createElement(Pt,{open:!0,title:"Merge exons",handleClose:n,maxWidth:!1,"data-testid":"merge-exons"},De.default.createElement("form",{onSubmit:function(s){s.preventDefault(),u("");const{parent:i}=l;if(!d||!i)return;a?._id===l._id&&o();const f=new t.MergeExonsChange({changedIds:[l._id],typeName:"MergeExonsChange",assembly:r,firstExon:c.getSnapshot(l),secondExon:c.getSnapshot(d),parentFeatureId:i._id});e.submit(f),n(),s.preventDefault()}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},0===Object.keys(m).length?"There are no neighbouring exons to merge with":"Merge with exon on:",De.default.createElement(s.FormControl,{style:{marginTop:5}},De.default.createElement(s.RadioGroup,{"aria-labelledby":"demo-radio-buttons-group-label",name:"radio-buttons-group",value:d,onChange:e=>{u("");const{value:t}=e.target;f(m[t])}},Object.keys(m).map((e=>De.default.createElement(s.FormControlLabel,{value:e,key:e,control:De.default.createElement(s.Radio,null),label:De.default.createElement(s.Box,{display:"flex",alignItems:"center"},qn(e,m))})))))),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",type:"submit",disabled:0===Object.keys(m).length||void 0===d},"Submit"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Cancel"))),i?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},i)):null)}function On(e){let t;return t=e.attributes.get("gff_name")?e.attributes.get("gff_name")?.join(","):e.attributes.get("gff_id")?e.attributes.get("gff_id")?.join(","):e._id,`${t} [${e.min+1}-${e.max}]`}function _n({changeManager:e,handleClose:n,selectedFeature:a,session:o,setSelectedFeature:r,sourceAssemblyId:l,sourceFeature:i}){const[u,d]=C.useState(""),f=function(e,t){const n=e.parent;if(!n)throw new Error("Unable to find parent of reference transcript");const{featureTypeOntology:a}=t.apolloDataStore.ontologyManager;if(!a)throw new Error("featureTypeOntology is undefined");const o={};if(n.children)for(const[,t]of n.children)a.isTypeOf(t.type,"transcript")&&t._id!==e._id&&(o[t._id]=t);return o}(i,o),m=Object.keys(f).at(0),[g,p]=C.useState(m);return De.default.createElement(Pt,{open:!0,title:"Merge transcripts",handleClose:n,maxWidth:!1,"data-testid":"merge-transcripts"},De.default.createElement("form",{onSubmit:function(o){if(o.preventDefault(),d(""),!g)return;const s=f[g];if(a?._id===i._id&&r(),!i.parent)throw new Error("Cannot find parent");const u=new t.MergeTranscriptsChange({changedIds:[i._id],typeName:"MergeTranscriptsChange",assembly:l,firstTranscript:c.getSnapshot(i),secondTranscript:c.getSnapshot(s),parentFeatureId:i.parent._id});e.submit(u),n()}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},0===Object.keys(f).length?"There are no transcripts to merge with":"Merge with transcript:",De.default.createElement(s.FormControl,{style:{marginTop:5}},De.default.createElement(s.RadioGroup,{"aria-labelledby":"demo-radio-buttons-group-label",name:"radio-buttons-group",value:g,onChange:e=>{d("");const{value:t}=e.target;p(t)}},Object.keys(f).map((e=>De.default.createElement(s.FormControlLabel,{value:e,key:e,control:De.default.createElement(s.Radio,null),label:De.default.createElement(s.Box,{display:"flex",alignItems:"center"},On(f[e]))})))))),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",type:"submit",disabled:0===Object.keys(f).length||void 0===g},"Submit"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Cancel"))),u?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},u)):null)}function Bn({handleClose:e,session:t}){const{apolloDataStore:n}=t,{addAssembly:a,addSessionAssembly:o,assemblyManager:l,notify:i}=t,[c,u]=C.useState(null),[d,f]=C.useState(""),[m,g]=C.useState(""),[p,h]=C.useState(!1),y=s.useTheme();return De.default.createElement(Pt,{open:!0,title:"Open local GFF3 file",handleClose:e,maxWidth:!1,"data-testid":"open-local-file"},De.default.createElement("form",{onSubmit:async function(s){if(s.preventDefault(),g(""),h(!0),!c)throw new Error("No file selected");const u=await new Response(c).text(),f=`${d}-${c.name}-${U.nanoid(8)}`;try{await ut(f,u,n)}catch(t){return console.error(t),i(`Error loading GFF3 ${c.name}, ${String(t)}`,"error"),void e()}const m={};if(r.isElectron){const{webUtils:e}=globalThis.require("electron");m.file=e.getPathForFile(c)}const p={name:f,aliases:[d],displayName:d,sequence:{trackId:`sequenceConfigId-${d}`,type:"ReferenceSequenceTrack",adapter:{type:"ApolloSequenceAdapter",assemblyId:f},metadata:{apollo:!0,...m}}};await(r.isElectron?a?.(p):(o||a)(p));const y=await l.waitForAssembly(p.name);y?(t.addApolloTrackConfig(y),i(`Loaded GFF3 ${c.name}`,"success")):i(`Error loading GFF3 ${c.name}`,"error"),e()}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.FormControl,null,De.default.createElement("div",{style:{flexDirection:"row"}},De.default.createElement(s.Button,{variant:"contained",component:"label",style:{marginRight:y.spacing()}},"Choose File",De.default.createElement("input",{type:"file",required:!0,hidden:!0,onChange:function(e){const t=e.target.files?.item(0);if(t&&(g(""),u(t),!d)){const e=t.name,n=e.lastIndexOf(".");f(-1===n?e:e.slice(0,n))}}})),c?c.name:"No file chosen"),De.default.createElement(s.FormHelperText,null,"Make sure your GFF3 has an embedded FASTA section")),De.default.createElement(s.TextField,{required:!0,label:"Assembly name",value:d,onChange:function(e){f(e.target.value)}})),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{disabled:!1,variant:"contained",type:"submit"},p?"Submitting...":"Submit"),De.default.createElement(s.Button,{disabled:p,variant:"outlined",type:"submit",onClick:e},"Cancel"))),m?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},m)):null)}!function(e){e.GENE_AND_SUBFEATURES="GENE_AND_SUBFEATURES",e.TRANSCRIPT_AND_SUBFEATURES="TRANSCRIPT_AND_SUBFEATURES",e.CUSTOM="CUSTOM"}(vn||(vn={}));const Un=E.makeStyles()((e=>({changeTextarea:{fontFamily:"monospace",width:600,resize:"none",border:`1px solid ${e.palette.divider}`,borderRadius:e.shape.borderRadius}})));function $n({handleClose:t,session:n}){const{internetAccounts:a}=c.getRoot(n),o=a.find((e=>"ApolloInternetAccount"===e.type));if(!o)throw new Error("No Apollo internet account found");const{baseURL:r}=o,{classes:l}=Un(),[i,u]=C.useState(),[d,f]=C.useState([]),{collaborationServerDriver:m}=n.apolloDataStore,g=m.getAssemblies(),[p,h]=C.useState(g.at(0)),y=[{field:"sequence"},{field:"typeName",headerName:"Change type",width:200,type:"singleSelect",valueOptions:[...e.changeRegistry.changes.keys()]},{field:"changes",headerName:"Change JSON",width:600,renderCell:({value:e})=>De.default.createElement("textarea",{className:l.changeTextarea,value:JSON.stringify(e),readOnly:!0})},{field:"user",headerName:"User",width:140},{field:"createdAt",headerName:"Time",width:160,type:"dateTime",valueGetter:e=>e&&new Date(e)}];return C.useEffect((()=>{(async function(){if(!p)return;const e=new URL("changes",r),t=new URLSearchParams({assembly:p.name});e.search=t.toString();const n=e.toString(),a=o?.getFetcher({locationType:"UriLocation",uri:n});if(a){const e=await a(n,{headers:new Headers({"Content-Type":"application/json"})});if(!e.ok){const t=await Lt(e,"Error when retrieving changes");return void u(t)}const t=await e.json();f(t)}})().catch((e=>{u(String(e))}))}),[o,r,p]),De.default.createElement(Pt,{open:!0,fullScreen:!0,title:"View change log",handleClose:t,"data-testid":"view-changelog"},De.default.createElement(s.Select,{style:{width:200,marginLeft:40},value:p?.name??"",onChange:function(e){const t=g.find((t=>t.name===e.target.value));h(t)}},g.map((e=>De.default.createElement(s.MenuItem,{key:e.name,value:e.name},e.displayName||e.name)))),De.default.createElement(s.DialogContent,null,De.default.createElement(A.DataGrid,{pagination:!0,rows:d,columns:y,getRowId:e=>e._id,slots:{toolbar:A.GridToolbar},initialState:{sorting:{sortModel:[{field:"sequence",sort:"desc"}]},columns:{columnVisibilityModel:{sequence:!1}}}})),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:t},"Close")),i?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},i)):null)}const jn=[{field:"refName",headerName:"Ref Name"},{field:"aliases",headerName:"Aliases",editable:!0,flex:1}],Gn=e=>/^[\da-f]{24}$/i.test(e),Wn=D.observer((function({changeManager:e,handleClose:n,session:a}){const o=C.useRef(null),[r,l]=C.useState(""),[i,c]=C.useState(!1),[u,d]=C.useState(),[f,m]=C.useState([]),[g,p]=C.useState(new Map),{apolloDataStore:h}=a,{collaborationServerDriver:y}=h,b=y.getAssemblies();C.useEffect((()=>{b.length>0&&(d(b[0]),y.getRefNameAliases(b[0].name).then((e=>{S(e)})).catch((()=>{p(new Map),l("Error fetching refName aliases for assembly")})))}),[]);const S=e=>{const t=new Map;for(const n of e){const e=n.refName;Gn(e)||t.set(e,n.aliases)}p(t)},w=()=>[...g].map(((e,t)=>({id:t,refName:e[0],aliases:e[1].filter((t=>t!==e[0])).join(", ")})));return De.default.createElement(Pt,{open:!0,title:"Add reference sequence aliases",handleClose:n,maxWidth:"sm","data-testid":"add-refseq-alias",fullWidth:!0},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.Grid,{container:!0,spacing:2},De.default.createElement(s.Grid,null,De.default.createElement(s.FormControl,{disabled:i&&!r,fullWidth:!0},De.default.createElement(s.InputLabel,{id:"demo-simple-select-label"},"Assembly"),De.default.createElement(s.Select,{labelId:"demo-simple-select-label",id:"demo-simple-select",label:"Assembly",value:u?.name??"",onChange:e=>{const t=b.find((t=>t.name===e.target.value));d(t),t?.name&&(y.getRefNameAliases(t.name).then((e=>{S(e),l("")})).catch((()=>{p(new Map),l("Error fetching refName aliases for assembly")})),c(!1),o.current&&(o.current.value=""))},style:{minWidth:150}},b.map((e=>De.default.createElement(s.MenuItem,{key:e.name,value:e.name},e.displayName)))))),De.default.createElement(s.Grid,null,De.default.createElement(s.InputLabel,null,"Load RefName alias"),De.default.createElement("input",{type:"file",onChange:e=>{(async e=>{if(!e.target.files)return;const t=e.target.files[0],n=(await t.text()).split("\n"),a=new Map(g);l("");for(const e of n){const t=e.split("\t");for(const e of t)a.has(e)&&a.set(e,[...a.get(e)??[],...t])}p(a)})(e).catch((()=>{l("Error reading file")}))},ref:o,disabled:i&&!r||!u}))),u&&g.size>0?De.default.createElement("div",{style:{height:200,width:"100%",marginTop:20}},De.default.createElement(s.InputLabel,null,"Refname aliases found for selected assembly."),De.default.createElement(A.DataGrid,{rows:w(),columns:jn,initialState:{pagination:{paginationModel:{page:0,pageSize:5}}},pageSizeOptions:[5,10],onRowSelectionModelChange:e=>{const{ids:t}=e;if(t.size>0){c(!0);const e=[...t.values()].flatMap((e=>w().filter((t=>String(t.id)===String(e)))));m(e)}else c(!1),m([])},processRowUpdate:(e,t)=>{const n=new Map(g);return n.set(e.refName,e.aliases.split(",")),p(n),e},checkboxSelection:!0,disableRowSelectionExcludeModel:!0})):null),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",type:"submit",disabled:!i,onClick:()=>{const a=[];for(const e of f){const{refName:t}=e,n=e.aliases.split(",").map((e=>e.trim())).filter((e=>e.length>0));a.push({refName:t,aliases:n})}if(l(""),!u)return void l("No assembly selected");const o=new t.AddRefSeqAliasesChange({typeName:"AddRefSeqAliasesChange",assembly:u.name,refSeqAliases:a});e.submit(o).catch((()=>{l("Error submitting change")})),n()}},"Submit"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Close")),r?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},r)):null)}));function zn({handleClose:e,session:t}){const{internetAccounts:n}=c.getRoot(t),{collaborationServerDriver:a}=t.apolloDataStore,o=n.find((e=>"ApolloInternetAccount"===e.type));if(!o)throw new Error("No Apollo internet account found");const{baseURL:r}=o,[l,i]=C.useState(),[u,d]=C.useState([]),f=a.getAssemblies(),[m,g]=C.useState(f.at(0));return C.useEffect((()=>{(async function(){const e=m?.name;if(!e)return;const t=new URL("checks",r),n=new URLSearchParams({assembly:e});t.search=n.toString();const a=t.toString(),l=o?.getFetcher({locationType:"UriLocation",uri:a});if(l){const e=await l(a,{headers:new Headers({"Content-Type":"application/json"})});if(!e.ok){const t=await Lt(e,"Error when retrieving checks");return void i(t)}const t=await e.json();d(t)}})().catch((e=>{i(String(e))}))}),[m,o,r]),De.default.createElement(Pt,{open:!0,fullScreen:!0,title:"View check results",handleClose:e,"data-testid":"view-check-results"},De.default.createElement(s.Select,{style:{width:200,marginLeft:40},value:m?.name??"",onChange:function(e){const t=f.find((t=>t.name===e.target.value));g(t)},disabled:0===f.length},f.map((e=>De.default.createElement(s.MenuItem,{key:e.name,value:e.name},e.displayName)))),De.default.createElement(s.DialogContent,null,De.default.createElement(A.DataGrid,{pagination:!0,rows:u,columns:[{field:"_id",headerName:"id",width:50},{field:"name",headerName:"Check name",width:200},{field:"refSeq",headerName:"Reference sequence ID",width:200},{field:"ids",headerName:"Feature IDs",width:200},{field:"message",headerName:"Message",flex:1}],getRowId:e=>e._id,slots:{toolbar:A.GridToolbar},initialState:{sorting:{sortModel:[{field:"name",sort:"asc"}]},columns:{columnVisibilityModel:{name:!0}}}})),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:e},"Close")),l?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},l)):null)}function Hn(e){return e.max-e.min<2?{isSplittable:!1,comment:"This exon is too short to be split"}:{isSplittable:!0,comment:""}}function Vn({changeManager:e,handleClose:n,selectedFeature:a,setSelectedFeature:o,sourceAssemblyId:r,sourceFeature:l}){const[i,u]=C.useState(""),d=c.getSnapshot(l);return De.default.createElement(Pt,{open:!0,title:"Split exon",handleClose:n,maxWidth:!1,"data-testid":"split-exon"},De.default.createElement("form",{onSubmit:function(s){s.preventDefault(),u(""),a?._id===l._id&&o();const i=d.min+(d.max-d.min)/2,c=Math.floor(i),f=Math.ceil(i);if(!l.parent?._id)throw new Error("Splitting an exon without parent is not possible yet");const m=new t.SplitExonChange({changedIds:[l._id],typeName:"SplitExonChange",assembly:r,exonToBeSplit:d,parentFeatureId:l.parent._id,upstreamCut:c,downstreamCut:f,leftExonId:(new ke.default).toHexString(),rightExonId:(new ke.default).toHexString()});e.submit(m),n(),s.preventDefault()}},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column"}},De.default.createElement(s.DialogContentText,null,function(e){const t=Hn(e);return t.isSplittable?"Are you sure you want to split the selected exon?":t.comment}(d))),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",type:"submit",disabled:!Hn(d).isSplittable},"Yes"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:n},"Cancel"))),i?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},i)):null)}function Jn(e){const{color:t}=e;return De.default.createElement(s.SvgIcon,{viewBox:"0 0 18 18",style:{fontSize:18,marginRight:4},...e},"disabled"===t?De.default.createElement("path",{d:"M9.001,10.71 l0,-3.348 l8.424,0 c0.126,0.567,0.225,1.098,0.225,1.845 c0,5.139,-3.447,8.793,-8.64,8.793 c-4.968,0,-9,-4.032,-9,-9 c0,-4.968,4.032,-9,9,-9 c2.43,0,4.464,0.891,6.021,2.349 l-2.556,2.484 c-0.648,-0.612,-1.782,-1.332,-3.465,-1.332 c-2.979,0,-5.409,2.475,-5.409,5.508 c0,3.033,2.43,5.508,5.409,5.508 c3.447,0,4.716,-2.385,4.95,-3.798 l-4.959,0 l0,-0.009 z"}):De.default.createElement(De.default.Fragment,null,De.default.createElement("path",{d:"M17.64,9.20454545 c0,-0.638,-0.057,-1.252,-0.164,-1.841 l-8.476,0 l0,3.481 l4.844,0 c-0.209,1.125,-0.843,2.079,-1.796,2.717 l0,2.258 l2.908,0 c1.702,-1.567,2.684,-3.874,2.684,-6.615 l0,0 z",fill:"#4285F4"}),De.default.createElement("path",{d:"M9,18 c2.43,0,4.467,-0.806,5.956,-2.18 l-2.908,-2.259 c-0.806,0.54,-1.837,0.859,-3.048,0.859 c-2.344,0,-4.328,-1.583,-5.036,-3.71 l-3.007,0 l0,2.332 c1.481,2.941,4.525,4.958,8.043,4.958 l0,0 z",fill:"#34A853"}),De.default.createElement("path",{d:"M3.96409091,10.71 c-0.18,-0.54,-0.282,-1.117,-0.282,-1.71 c0,-0.593,0.102,-1.17,0.282,-1.71 l0,-2.332 l-3.007,0 c-0.609,1.215,-0.957,2.59,-0.957,4.042 c0,1.452,0.348,2.827,0.957,4.042 l3.007,-2.332 l0,0 z",fill:"#FBBC05"}),De.default.createElement("path",{d:"M9,3.57954545 c1.321,0,2.508,0.454,3.44,1.346 l2.582,-2.581 c-1.559,-1.453,-3.596,-2.345,-6.022,-2.345 c-3.518,0,-6.562,2.017,-8.043,4.959 l3.007,2.331 c0.708,-2.127,2.692,-3.71,5.036,-3.71 l0,0 z",fill:"#EA4335"})))}function Xn(e){const{color:t}=e;return De.default.createElement(s.SvgIcon,{viewBox:"0 0 21 21",style:{fontSize:21},...e},De.default.createElement("rect",{x:"1",y:"1",width:"9",height:"9",fill:"disabled"===t?"#7B7B7B":"#F25022"}),De.default.createElement("rect",{x:"1",y:"11",width:"9",height:"9",fill:"disabled"===t?"#7B7B7B":"#00A4EF"}),De.default.createElement("rect",{x:"11",y:"1",width:"9",height:"9",fill:"disabled"===t?"#939393":"#7FBA00"}),De.default.createElement("rect",{x:"11",y:"11",width:"9",height:"9",fill:"disabled"===t?"#B9B9B9":"#FFB900"}))}const Kn=E.makeStyles()((e=>({loginButton:{marginBottom:e.spacing(1),width:"220px",height:"40px",fontSize:"16px",textTransform:"none",justifyContent:"left",padding:"3px 12px"}})));function Zn(e){const{classes:t}=Kn(),{disabled:n}=e;return De.default.createElement(s.Button,{className:t.loginButton,variant:"outlined",startIcon:De.default.createElement(Jn,{color:n?"disabled":void 0}),...e},"Sign in with Google")}function Yn(e){const{classes:t}=Kn(),{disabled:n}=e;return De.default.createElement(s.Button,{className:t.loginButton,variant:"outlined",startIcon:De.default.createElement(Xn,{color:n?"disabled":void 0}),...e},"Sign in with Microsoft")}function Qn(e){const{classes:t}=Kn();return De.default.createElement(s.Button,{className:t.loginButton,variant:"outlined",startIcon:De.default.createElement(_e.default,{fontSize:"small"}),...e},"Continue as Guest")}const ea=E.makeStyles()((e=>({divider:{marginTop:e.spacing(4),marginBottom:e.spacing(5)}}))),ta=({baseURL:e,handleClose:t,name:n})=>{const{classes:a}=ea(),[o,r]=C.useState(""),[l,i]=C.useState([]);function c(e){t("google"===e?"google":"microsoft"===e?"microsoft":"guest")}C.useEffect((()=>{const t=new AbortController,{signal:n}=t;return async function(){const t=new URL("auth/types",e).href,a=await fetch(t,{method:"GET",signal:n});if(!a.ok){const e=await Lt(a,"Error when retrieving auth types from server");return void r(e)}const o=await a.json();i(o)}().catch((e=>{I.isAbortException(e)||r(String(e))})),()=>{t.abort()}}),[e]);const u=l.includes("google"),d=l.includes("microsoft"),f=l.includes("guest");return De.default.createElement(Pt,{open:!0,title:`Log in to ${n}`,handleClose:t,maxWidth:!1,"data-testid":"login-apollo"},De.default.createElement(s.DialogContent,{style:{display:"flex",flexDirection:"column",paddingTop:8}},u?De.default.createElement(Zn,{disabled:!u,onClick:()=>{c("google")}}):null,d?De.default.createElement(Yn,{disabled:!d,onClick:()=>{c("microsoft")}}):null,f?De.default.createElement(De.default.Fragment,null,De.default.createElement(s.Divider,{className:a.divider}),De.default.createElement(Qn,{onClick:()=>{c("guest")}})):null),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:()=>{t()}},"Cancel")),o?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},o)):null)},na="undefined"==typeof sessionStorage,aa=n=>o.InternetAccount.named("ApolloInternetAccount").props({type:c.types.literal("ApolloInternetAccount"),configuration:a.ConfigurationReference(n)}).views((e=>({get baseURL(){return a.getConf(e,"baseURL")},getUserId(){const n=e.retrieveToken();if(n)return t.getDecodedToken(n).id}}))).volatile((()=>({role:void 0,controller:new AbortController}))).actions((e=>({setRole(){const n=e.retrieveToken();if(!n)return void(e.role=void 0);const a=t.getDecodedToken(n),{role:o}=a;e.role!==o&&(e.role=o)}}))).actions((e=>{let t;return{addMessageChannel(e,n){t=t=>{this.finishOAuthWindow(t,e,n)},window.addEventListener("message",t)},deleteMessageChannel(){window.removeEventListener("message",t)},finishOAuthWindow(t,n,a){if(t.data.name!==`JBrowseAuthWindow-${e.internetAccountId}`)return void this.deleteMessageChannel();const o=t.data.redirectUri.replace("#","?"),r=new URL(o),l=new URLSearchParams(r.search).get("access_token");this.deleteMessageChannel(),l?(e.storeToken(l),e.setRole(),n(l)):a(new Error("Error with token endpoint"))},async openAuthWindow(t,n,a){const o=r.isElectron?"http://localhost/auth":globalThis.location.origin+globalThis.location.pathname,l=new URL("auth/login",e.baseURL),s=new URLSearchParams({type:t,redirect_uri:o});l.search=s.toString();const i=`JBrowseAuthWindow-${e.internetAccountId}`;if(r.isElectron){const{ipcRenderer:t}=globalThis.require("electron"),r=await t.invoke("openAuthWindow",{internetAccountId:e.internetAccountId,data:{redirect_uri:o},url:l.toString()}),s=new MessageEvent("message",{data:{name:i,redirectUri:r}});this.finishOAuthWindow(s,n,a)}else this.addMessageChannel(n,a),window.open(l,i,"width=500,height=600")}}})).actions((e=>({async getTokenFromUser(t,n){const{baseURL:a}=e,o=await new Promise(((t,n)=>{const{session:a}=c.getRoot(e),{baseURL:o,name:r}=e;a.queueDialog((e=>[ta,{name:r,handleClose:a=>{a?a instanceof Error?n(a):t(a):n(new Error("user cancelled entry")),e()},baseURL:o}]))}));if("guest"!==o)return void e.openAuthWindow(o,t,n);const r=new URL("auth/login",a),l=new URLSearchParams({type:o});r.search=l.toString();const s=r.toString(),i=await fetch(s,{signal:e.controller.signal});if(!i.ok){const e=await Lt(i,"Error when logging in");return void n(new Error(e))}const{token:u}=await i.json();t(u)}}))).volatile((()=>({lastChangeSequenceNumber:void 0}))).actions((e=>({setLastChangeSequenceNumber(t){e.lastChangeSequenceNumber=t}}))).actions((t=>({updateLastChangeSequenceNumber:c.flow((function*(){const{baseURL:e}=t,n=new URL("changes",e),a=new URLSearchParams({limit:"1"});n.search=a.toString();const o=n.toString(),r=t.getFetcher({locationType:"UriLocation",uri:o});let l;try{l=yield r(o,{method:"GET",signal:t.controller.signal})}catch(e){return void(t.controller.signal.aborted||console.error(e))}if(!l.ok){const e=yield Lt(l,"Error when fetching server LastChangeSequence");throw new Error(e)}const s=yield l.json();t.setLastChangeSequenceNumber(s.length>0?s[0].sequence:0)})),getMissingChanges:c.flow((function*(){const{session:n}=c.getRoot(t),{changeManager:a}=n.apolloDataStore;if(!t.lastChangeSequenceNumber)throw new Error("No LastChangeSequence stored in session. Please, refresh you browser to get last updates from server");const{baseURL:o,lastChangeSequenceNumber:r}=t,l=new URL("changes",o),s=new URLSearchParams({since:String(r),sort:"1"});l.search=s.toString();const i=l.toString(),u=t.getFetcher({locationType:"UriLocation",uri:i});let d;try{d=yield u(i,{method:"GET",signal:t.controller.signal})}catch(e){return void(t.controller.signal.aborted||console.error(e))}if(!d.ok)return void console.error(`Error when fetching the last updates to recover socket connection — ${d.status}`);const f=yield d.json();for(const t of f){const n=e.Change.fromJSON(t);a.submit(n,{submitToBackend:!1})}}))}))).volatile((e=>{const{origin:t,pathname:n}=new URL("socket.io/",e.baseURL);return{socket:u.io(t,{path:n})}})).actions((n=>({addSocketListeners(){const{session:a}=c.getRoot(n),{notify:o}=a,r=n.retrieveToken();if(!r)throw new Error("No Token found");const l=t.getDecodedToken(r),s=t.makeUserSessionId(l),{socket:i}=n,{addCheckResult:u,changeManager:d,deleteCheckResult:f}=a.apolloDataStore;i.on("connect",(()=>{n.getMissingChanges()})),i.on("connect_error",(e=>{console.error(e),o("Could not connect to the Apollo server.","error")})),i.on("COMMON",(t=>{if("checkResult"in t)return void(t.deleted?f(t.checkResult._id.toString()):u(t.checkResult));if(sessionStorage.setItem("LastChangeSequence",String(t.changeSequence)),t.userSessionId===s)return;const n=e.Change.fromJSON(t.changeInfo);d.submit(n,{submitToBackend:!1})})),i.on("USER_LOCATION",(e=>{const{channel:t,locations:n,userName:o,userSessionId:r}=e;"USER_LOCATION"===t&&r!==s&&a.addOrUpdateCollaborator({name:o,id:r,locations:n})})),i.on("REQUEST_INFORMATION",(e=>{const{channel:t,userSessionId:n}=e;"REQUEST_INFORMATION"===t&&n!==r&&a.broadcastLocations()}))}}))).actions((e=>({postUserLocation:(t=>{let n;return t=>{clearTimeout(n),n=setTimeout((()=>{!async function(t){if(!c.isAlive(e)||"none"===e.role)return;const{baseURL:n,controller:a}=e,o=new URL("users/userLocation",n).href,r=new URLSearchParams(JSON.stringify(t)),l=e.getFetcher({locationType:"UriLocation",uri:o});try{if(!(await l(o,{method:"POST",body:r,signal:a.signal})).ok)throw new Error("ignore")}catch{console.error("Broadcasting user location failed")}}(t)}),300)}})()}))).volatile((()=>({roleNotificationSent:!1}))).actions((e=>{function t(){e.postUserLocation([])}function n(){if("hidden"===document.visibilityState&&e.postUserLocation([]),"visible"===document.visibilityState){const{session:t}=c.getRoot(e);t.broadcastLocations()}}return{initialize:c.flow((function*(a){if("none"===a){if(!e.roleNotificationSent){const{session:t}=c.getRoot(e);t.notify("You have registered as an Apollo user but have not been given access. Ask your administrator to enable access for your account.","warning"),e.roleNotificationSent=!0}return}if("admin"===a){const t=c.getRoot(e);r.isAbstractMenuManager(t)&&function(e){e.appendToMenu("Apollo",{label:"Admin",type:"subMenu",icon:Se.default,subMenu:[{label:"Add Assembly",icon:be.default,onClick:e=>{e.queueDialog((t=>[Ut,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Delete Assembly",icon:we.default,onClick:e=>{e.queueDialog((t=>[kn,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Import Features",icon:Ce.default,onClick:e=>{e.queueDialog((t=>[Rn,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Add reference sequence aliases",onClick:e=>{e.queueDialog((t=>[Wn,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Add Assembly aliases",onClick:e=>{e.queueDialog((t=>[jt,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Manage Users",icon:Ee.default,onClick:e=>{e.queueDialog((t=>[Ln,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Manage Checks",icon:ve.default,onClick:e=>{e.queueDialog((t=>[Mn,{session:e,handleClose:()=>{t()}}]))}}]})}(t)}yield e.updateLastChangeSequenceNumber(),e.addSocketListeners();const{baseURL:o}=e,l=new URL("users/locations",o).href,s=e.getFetcher({locationType:"UriLocation",uri:l});yield s(l,{method:"GET",signal:e.controller.signal}),window.addEventListener("beforeunload",t),document.addEventListener("visibilitychange",n)})),removeBeforeUnloadListener(){window.removeEventListener("beforeunload",t)},removeVisibilityChangeListener(){document.removeEventListener("visibilitychange",n)}}})).actions((e=>({afterAttach(){e.setRole(),i.autorun((async t=>{if(na)return;const{session:n}=c.getRoot(e);n&&e.role&&(await e.initialize(e.role),t.dispose())}),{name:"ApolloInternetAccount"})},beforeDestroy(){e.removeBeforeUnloadListener(),e.removeVisibilityChangeListener(),e.controller.abort("internet account beforeDestroy"),e.socket.close()}}))),oa="undefined"==typeof sessionStorage;class ra extends G.BaseAdapter{refNameAliases;async getRefNameAliases(){const e=a.readConfObject(this.config,"assemblyId");if(!oa){const t=this.pluginManager?.rootModel?.session?.apolloDataStore;if(!t)throw new Error("No Apollo data store found");const n=t.getBackendDriver(e);if(!n)throw new Error("No backend driver found");return await n.getRefNameAliases(e)}const t=await new Promise(((t,n)=>{const a=setTimeout((()=>{n(new Error("timeout"))}),2e4),o=U.nanoid(),r=e=>{const n=e.data;(function(e){return"object"==typeof e&&null!==e&&"apollo"in e&&!0===e.apollo&&"refNameAliases"in e})(n)&&n.messageId===o&&(clearTimeout(a),removeEventListener("message",r),t(n.refNameAliases))};addEventListener("message",r),rpcServer.emit("apollo",{apollo:!0,method:"getRefNameAliases",assembly:e,messageId:o})}));return this.refNameAliases=t,t}freeResources(){}}var la=a.ConfigurationSchema("ApolloRefNameAliasAdapter",{assemblyId:{type:"string",defaultValue:""}},{explicitlyTyped:!0});function sa(e){return"object"==typeof e&&null!==e&&"apollo"in e&&!0===e.apollo}const ia="undefined"==typeof sessionStorage;class ca extends G.BaseSequenceAdapter{regions;async getRefNames(){return(await this.getRegions()).map((e=>e.refName))}async getRegions(){if(this.regions)return this.regions;const e=a.readConfObject(this.config,"assemblyId");if(!ia){const t=this.pluginManager?.rootModel?.session?.apolloDataStore;if(!t)throw new Error("No Apollo data store found");const n=t.getBackendDriver(e);if(!n)throw new Error("No backend driver found");const a=await n.getRegions(e);return this.regions=a,a}const t=await new Promise(((t,n)=>{const a=setTimeout((()=>{n("timeout")}),2e4),o=U.nanoid(),r=e=>{const{data:n}=e;sa(n)&&n.messageId===o&&(clearTimeout(a),removeEventListener("message",r),t(n.regions))};addEventListener("message",r),globalThis.rpcServer.emit("apollo",{apollo:!0,method:"getRegions",assembly:e,messageId:o})}));return this.regions=t,t}getFeatures(e){const{end:t,refName:n,start:o}=e,r=a.readConfObject(this.config,"assemblyId"),l={...e,assemblyName:r};return W.ObservableCreate((async e=>{if(!ia){const a=this.pluginManager?.rootModel?.session?.apolloDataStore;if(!a)return void e.error("No Apollo data store found");const s=a.getBackendDriver(r);if(!s)return void e.error("No backend driver found");const i=(await s.getRegions(l.assemblyName)).find((e=>e.refName===l.refName));if(!i)return void e.error("Cannot get region");l.end>i.end&&(l.end=i.end);const{seq:c}=await s.getSequence(l);return e.next(new Ue.default({id:`${n} ${o}-${t}`,data:{refName:n,start:o,end:t,seq:c}})),void e.complete()}const a=await new Promise(((e,t)=>{const n=setTimeout((()=>{t("timeout")}),2e4),a=U.nanoid(),o=t=>{const{data:r}=t;sa(r)&&r.messageId===a&&(clearTimeout(n),removeEventListener("message",o),e(r.sequence))};addEventListener("message",o),globalThis.rpcServer.emit("apollo",{apollo:!0,method:"getSequence",region:l,messageId:a})}));e.next(new Ue.default({id:`${n} ${o}-${t}`,data:{refName:n,start:o,end:t,seq:a}})),e.complete()}))}freeResources(){}}var ua=a.ConfigurationSchema("ApolloSequenceAdapter",{assemblyId:{type:"string",defaultValue:""}},{explicitlyTyped:!0});class da extends G.BaseAdapter{get baseURL(){return a.readConfObject(this.config,"baseURL").uri}get trackId(){return a.readConfObject(this.config,"trackId")}get assemblyNames(){return a.readConfObject(this.config,"assemblyNames")}mapBaseResult(e,t,n){return e.map((e=>{const a=t.getCanonicalRefName(e.refSeq);return new $e.default({label:n,trackId:this.trackId,locString:`${a}:${e.min+1}..${e.max}`})}))}async searchIndex(e){const t=e.queryString,n=[],a=this.pluginManager?.rootModel?.session;if(!a)return n;const{apolloDataStore:o}=a,{assemblyManager:r}=a;for(const a of this.assemblyNames){const l=o.getBackendDriver(a),s=r.get(a);if(!l||!s)continue;const i=await l.searchFeatures(e.queryString,[a]);n.push(...this.mapBaseResult(i,s,t))}return n}freeResources(){}}var fa=a.ConfigurationSchema("ApolloTextSearchAdapter",{assemblyNames:{type:"stringArray",defaultValue:[],description:"List of assemblies covered by text search adapter"},trackId:{type:"string",defaultValue:""},baseURL:{type:"fileLocation",defaultValue:{uri:"",locationType:"UriLocation"}}},{explicitlyTyped:!0,explicitIdentifier:"textSearchAdapterId"});const ma=E.makeStyles()((e=>({attributeKey:{fontWeight:"bold",marginRight:e.spacing(2)}})));function ga({attributeKey:e}){const{classes:n}=ma(),a=/^[A-Z]/.test(e);let o,r=e;return t.isGFFInternalAttribute(e)?(r=t.internalToGFF[e],o=`On GFF3 export, this will be assigned to the GFF3's reserved "${r}" attribute`):t.isGFFColumnInternal(e)?(r=t.gffInternalToColumn[e],o=`On GFF3 export, this will be placed in the GFF3's "${r}" column`):a&&(o="On GFF3 export, this attribute will be changed to start with a lower-case letter because attributes starting with an upper-case letter are reserved in GFF3"),De.default.createElement("div",{style:{display:"flex"}},De.default.createElement(s.Typography,{className:n.attributeKey},r),o?De.default.createElement(s.Tooltip,{title:o},De.default.createElement(s.Chip,{icon:De.default.createElement(xe.default,null),label:"GFF3",size:"small",variant:"outlined"})):null)}const pa="Custom",ha={[pa]:"custom"};for(const[e,n]of Object.entries(t.gffToInternal))ha[`GFF ${n}`]=e;for(const[e,n]of Object.entries(t.gffColumnToInternal))ha[`GFF ${n}`]=e;const ya=D.observer((function({setKey:e,session:t}){const{pluginManager:n}=r.getEnv(t),a=n.evaluateExtensionPoint("Apollo-ReservedAttributeKeys",ha),o=Object.keys(a).at(0)??pa,[l,i]=C.useState(o),[c,u]=C.useState(),d=l===pa;return De.default.createElement("form",{onSubmit:function(t){t.preventDefault(),e(d?c:a[l])}},De.default.createElement("div",{style:{display:"flex",flexDirection:"column",margin:8}},De.default.createElement(s.FormControl,{variant:"outlined"},De.default.createElement(s.InputLabel,{id:"attribute-key-select-label"},"Key"),De.default.createElement(s.Select,{labelId:"attribute-key-select-label",value:l,label:"Key",onChange:e=>{i(e.target.value)}},Object.keys(a).map((e=>De.default.createElement(s.MenuItem,{key:e,value:e},e))))),d?De.default.createElement(s.TextField,{label:"Attribute key",variant:"outlined",id:"attributeKey",onChange:e=>{u(e.target.value)}}):null),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{color:"primary",variant:"contained",type:"submit",disabled:d&&!c},"Add"),De.default.createElement(s.Button,{variant:"outlined",onClick:function(){e()}},"Cancel")))})),ba=D.observer((function({onChangeCommitted:e,value:t,...n}){const[a,o]=C.useState(String(t)),[r,l]=C.useState(!1),[i,c]=C.useState(null);return C.useEffect((()=>{o(String(t))}),[t]),C.useEffect((()=>{r&&(i?.blur(),l(!1))}),[r,i]),De.default.createElement(s.TextField,{...n,type:"text",onChange:function(e){o(e.target.value)},value:a,onKeyDown:e=>{"Enter"===e.key?i?.blur():"Escape"===e.key&&(o(String(t)),l(!0))},onBlur:()=>{a!==String(t)&&e(a)},inputRef:e=>{c(e)}})})),Sa=D.observer((function({attributeValues:e,setAttribute:t,isNew:n=!1}){const[a,o]=C.useState(e&&e.length>0?e:[""]);return De.default.createElement(De.default.Fragment,null,a.map(((e,t)=>De.default.createElement("div",{key:`${t}-${e}`,style:{display:"flex"}},De.default.createElement(ba,{value:e,onChangeCommitted:e=>{!function(e,t){o((n=>{const a=[...n];return a[e]=t,a}))}(t,e)},variant:"outlined",fullWidth:!0}),De.default.createElement(s.IconButton,{"aria-label":"delete",size:"medium",edge:"end",onClick:()=>{!function(e){o((t=>{const n=[...t];return n.splice(e,1),n}))}(t)}},De.default.createElement(we.default,{fontSize:"inherit"}))))),De.default.createElement(s.IconButton,{"aria-label":"add",size:"medium",color:"secondary",edge:"start",onClick:function(){o((e=>{const t=[...e];return t.push(""),t}))}},De.default.createElement(ze.default,{fontSize:"inherit"})),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{color:"primary",variant:"contained",onClick:()=>{t(a.filter(Boolean))}},n?"Add":"Update"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:()=>{t()}},"Cancel")))}));function wa({values:e}){return De.default.createElement(De.default.Fragment,null,e?.map(((e,t)=>De.default.createElement(s.Typography,{key:`${t}.${e}`,variant:"body2",color:"textSecondary"},e))))}const Ca=E.makeStyles()((e=>({list:{"li:nth-of-type(odd)":{backgroundColor:e.palette.action.focus},"li:nth-of-type(even)":{backgroundColor:e.palette.action.hover}}}))),Ea=D.observer((function({assembly:e,editable:n,feature:a,session:o}){const{pluginManager:l}=r.getEnv(o),{classes:u}=Ca(),[d,f]=C.useState(null),[m,g]=C.useState(null),[p,h]=C.useState(null),[y,b]=C.useState(!1),[S,w]=C.useState(),E=Boolean(d),{changeManager:v}=o.apolloDataStore,{notify:x}=o;function T(){f(null),g(null)}const{_id:A,attributes:F}=a,k=l.evaluateExtensionPoint("Apollo-AttributeEditorComponent",Sa,{key:S});return De.default.createElement(De.default.Fragment,null,De.default.createElement(s.List,{className:u.list},i.entries(F).map((([r,i])=>{const u=l.evaluateExtensionPoint("Apollo-AttributeEditorComponent",Sa,{key:r}),d=l.evaluateExtensionPoint("Apollo-AttributeViewerComponent",wa,{key:r});return De.default.createElement(s.ListItem,{key:r,secondaryAction:n&&!p?De.default.createElement(s.IconButton,{edge:"end",onClick:e=>{!function(e,t){f(e.currentTarget),g(t)}(e,r)}},De.default.createElement(We.default,null)):null},De.default.createElement(s.ListItemText,{disableTypography:!0,primary:De.default.createElement(ga,{attributeKey:r}),secondary:p===r?De.default.createElement(u,{session:o,attributeValues:i,setAttribute:n=>{h(null),n&&function(n,o){const r={...c.getSnapshot(F)},l=structuredClone(r);if(!(n in r))return void x(`"${n}" not found in feature attributes`,"error");if(r[n].toString()===o.toString())return;r[n]=o;const s=new t.FeatureAttributeChange({changedIds:[a._id],typeName:"FeatureAttributeChange",assembly:e,featureId:a._id,oldAttributes:l,newAttributes:r});v.submit(s)}(r,n)}}):De.default.createElement(d,{values:i})}))})),S?De.default.createElement(s.ListItem,null,De.default.createElement(s.ListItemText,{disableTypography:!0,primary:De.default.createElement(ga,{attributeKey:S}),secondary:De.default.createElement(k,{session:o,attributeValues:[],setAttribute:n=>{n&&function(n,o){const r={...c.getSnapshot(F)},l=structuredClone(r);if(n in r)return void x(`Feature already has attribute "${n}"`,"error");r[n]=o;const s=new t.FeatureAttributeChange({changedIds:[a._id],typeName:"FeatureAttributeChange",assembly:e,featureId:a._id,oldAttributes:l,newAttributes:r});v.submit(s)}(S,n),w(void 0)},isNew:!0})})):null),n?De.default.createElement(s.Button,{color:"primary",variant:"contained",disabled:y||Boolean(S),onClick:()=>{b(!0)}},"Add new"):null,y?De.default.createElement(s.Paper,{variant:"outlined",style:{marginTop:8}},De.default.createElement(ya,{session:o,setKey:e=>{w(e),b(!1)}})):null,De.default.createElement(s.Menu,{anchorEl:d,open:E,onClose:T},De.default.createElement(s.MenuItem,{onClick:function(){m&&function(n){const a=c.getSnapshot(F),{[n]:o,...r}=a,l=new t.FeatureAttributeChange({changedIds:[A],typeName:"FeatureAttributeChange",assembly:e,featureId:A,oldAttributes:a,newAttributes:r});v.submit(l)}(m),T()}},De.default.createElement(s.ListItemIcon,null,De.default.createElement(we.default,{fontSize:"small"})),De.default.createElement(s.Typography,{variant:"inherit"},"Delete")),De.default.createElement(s.MenuItem,{onClick:function(){m&&h(m),T()}},De.default.createElement(s.ListItemIcon,null,De.default.createElement(Ge.default,{fontSize:"small"})),De.default.createElement(s.Typography,{variant:"inherit"},"Edit"))))})),va=D.observer((function({onChangeCommitted:e,value:t,...n}){const[a,o]=C.useState(String(t)),[r,l]=C.useState(!1),[i,c]=C.useState(null);C.useEffect((()=>{o(String(t))}),[t]),C.useEffect((()=>{r&&(i?.blur(),l(!1))}),[r,i]);const u=Number.isNaN(Number(a));return De.default.createElement(s.TextField,{...n,type:"text",onChange:function(e){o(e.target.value)},value:a,onKeyDown:e=>{"Enter"===e.key?i?.blur():"Escape"===e.key&&(o(String(t)),l(!0))},onBlur:()=>{const n=Number(a);a!==String(t)&&(Number.isNaN(n)?o(String(t)):e(n)||o(String(t)))},inputRef:e=>{c(e)},error:u,helperText:u?"Not a valid number":void 0})})),xa=D.observer((function({assembly:e,feature:n,session:a}){const[o,r]=C.useState(""),[l,i]=C.useState(""),{_id:c,assemblyId:u,max:d,min:f,strand:m,type:g}=n,p=e=>{a.notify(e.message,"error")},{changeManager:h}=a.apolloDataStore;function y(n){const{value:a}=n.target,o=a?Number(a):void 0,r=new t.StrandChange({typeName:"StrandChange",changedIds:[c],featureId:c,oldStrand:m,newStrand:o,assembly:e});return h.submit(r)}return De.default.createElement("div",{"data-testid":"basic_information"},De.default.createElement(va,{margin:"dense",id:"start",label:"Start",fullWidth:!0,variant:"outlined",value:f+1,onChangeCommitted:function(n){n--;const a=new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[c],featureId:c,oldStart:f,newStart:n,assembly:e});return h.submit(a),!0}}),De.default.createElement(va,{margin:"dense",id:"end",label:"End",fullWidth:!0,variant:"outlined",value:d,onChangeCommitted:function(n){const a=new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[c],featureId:c,oldEnd:d,newEnd:n,assembly:e});return h.submit(a),!0}}),De.default.createElement(hn,{session:a,ontologyName:"Sequence Ontology",value:g,filterTerms:mn,fetchValidTerms:async function(e,t,n){const a=await pn(e,t);if(a)return a;i(`Type "${e?.type}" does not have any children in the ontology`)}.bind(null,n),renderInput:e=>De.default.createElement(s.TextField,{...e,label:"Type",variant:"outlined",fullWidth:!0,error:Boolean(l),helperText:l}),onChange:(e,n)=>{n&&function(e){r("");const n=new t.TypeChange({typeName:"TypeChange",changedIds:[c],featureId:c,oldType:g,newType:e,assembly:u});return h.submit(n)}(n).catch(p)}}),De.default.createElement("label",null,De.default.createElement("input",{type:"radio",value:"1",checked:1===m,onChange:y}),"Positive Strand (+)"),De.default.createElement("label",null,De.default.createElement("input",{type:"radio",value:"-1",checked:-1===m,onChange:y}),"Negative Strand (-)"),De.default.createElement("label",null,De.default.createElement("input",{type:"radio",value:"",checked:void 0===m,onChange:y}),"No Strand Information"),o?De.default.createElement(s.Typography,{color:"error"},o):null)})),Ta=D.observer((function(e){const{feature:t,model:n}=e,{children:a,parent:o}=t,r=[];if(a)for(const[,e]of a)r.push(e);return o??r.length>0?De.default.createElement("div",{style:{marginTop:10}},o&&De.default.createElement("div",null,De.default.createElement(s.Typography,{variant:"h6"},"Parent:"),De.default.createElement(s.Button,{variant:"contained",onClick:()=>{n.setFeature(o)}},o.type,gt(o)," (",o.min,"..",o.max,")")),r.length>0&&De.default.createElement("div",null,De.default.createElement(s.Typography,{variant:"h6"},1===r.length?"Child":"Children",":"),r.map((e=>De.default.createElement("div",{key:e._id,style:{marginBottom:5}},De.default.createElement(s.Button,{variant:"contained",onClick:()=>{n.setFeature(e)}},e.type,gt(e)," (",e.min,"..",e.max,")")))))):null})),Aa=E.makeStyles()({sequence:{width:"100%",resize:"vertical"}}),Fa=D.observer((function({assembly:e,feature:t,refName:n,session:a}){const o=a.apolloDataStore.assemblies.get(e),{classes:r}=Aa();if(!t||!o)return null;const l=o.getByRefName(n);if(!l)return null;const{max:s,min:i}=t;let c=l.getSequence(i,s);return c?c=function(e,t,n,a,o){return`>${t}:${n+1}–${a}\n${e}`}(c,n,i,s):a.apolloDataStore.loadRefSeq([{assemblyName:e,refName:n,start:i,end:s}]),De.default.createElement("div",null,De.default.createElement("textarea",{readOnly:!0,rows:20,className:r.sequence,value:c}))})),ka=E.makeStyles()((e=>({root:{padding:e.spacing(2)}}))),Da=D.observer((function(e){const{model:t}=e,{assembly:n,feature:a,refName:o}=t,l=r.getSession(t),i=l.apolloDataStore.assemblies.get(n),{classes:c}=ka(),[u,d]=C.useState(["attributes"]);if(C.useEffect((()=>{d(["attributes"])}),[a]),!a||!i)return null;const f=i.getByRefName(o);if(!f)return null;const{max:m,min:g}=a;function p(e,t){d(e?[...u,t]:u.filter((e=>e!==t)))}return f.getSequence(g,m)||l.apolloDataStore.loadRefSeq([{assemblyName:n,refName:o,start:g,end:m}]),De.default.createElement("div",{className:c.root},De.default.createElement(xa,{feature:a,session:l,assembly:i._id}),De.default.createElement(s.Accordion,{style:{marginTop:10},expanded:u.includes("attributes"),onChange:(e,t)=>{p(t,"attributes")}},De.default.createElement(s.AccordionSummary,{expandIcon:De.default.createElement(je.default,{style:{color:"white"}}),"aria-controls":"panel1-content",id:"panel1-header"},De.default.createElement(s.Typography,{component:"span"},"Attributes")),De.default.createElement(s.AccordionDetails,null,De.default.createElement(Ea,{feature:a,session:l,assembly:i._id,editable:!0}))),De.default.createElement(s.Accordion,{style:{marginTop:10},expanded:u.includes("sequence"),onChange:(e,t)=>{p(t,"sequence")}},De.default.createElement(s.AccordionSummary,{expandIcon:De.default.createElement(je.default,{style:{color:"white"}}),"aria-controls":"panel2-content",id:"panel2-header"},De.default.createElement(s.Typography,{component:"span"},"Sequence")),De.default.createElement(s.AccordionDetails,null,u.includes("sequence")&&De.default.createElement(Fa,{feature:a,session:l,assembly:i._id,refName:o}))),De.default.createElement(s.Accordion,{style:{marginTop:10},expanded:u.includes("related_features"),onChange:(e,t)=>{p(t,"related_features")}},De.default.createElement(s.AccordionSummary,{expandIcon:De.default.createElement(je.default,{style:{color:"white"}}),"aria-controls":"panel3-content",id:"panel3-header"},De.default.createElement(s.Typography,{component:"span"},"Related features")),De.default.createElement(s.AccordionDetails,null,De.default.createElement(Ta,{model:t,feature:a}))))})),Na=c.types.model("ApolloFeatureDetailsWidget",{id:N.ElementId,type:c.types.literal("ApolloFeatureDetailsWidget"),feature:c.types.maybe(c.types.reference(Z.AnnotationFeatureModel,{onInvalidated(e){e.parent.setTryReload(e.invalidId),e.removeRef()}})),assembly:c.types.string,refName:c.types.string}).volatile((()=>({tryReload:void 0}))).actions((e=>({setFeature(t){e.feature=t},setTryReload(t){e.tryReload=t}}))).actions((e=>({afterAttach(){c.addDisposer(e,i.autorun((t=>{if(!e.tryReload)return;const n=r.getSession(e),{apolloDataStore:a}=n;if(!a)return;const o=a.getFeature(e.tryReload);o&&(e.setFeature(o),e.setTryReload(),t.dispose())})))}}))),Ra=c.types.model("ApolloTranscriptDetails",{id:N.ElementId,type:c.types.literal("ApolloTranscriptDetails"),feature:c.types.maybe(c.types.reference(Z.AnnotationFeatureModel,{onInvalidated(e){e.parent.setTryReload(e.invalidId),e.removeRef()}})),assembly:c.types.string,refName:c.types.string}).volatile((()=>({tryReload:void 0}))).actions((e=>({setFeature(t){e.feature=t},setTryReload(t){e.tryReload=t}}))).actions((e=>({afterAttach(){c.addDisposer(e,i.autorun((t=>{if(!e.tryReload)return;const n=r.getSession(e),{apolloDataStore:a}=n;if(!a)return;const o=a.getFeature(e.tryReload);o&&(e.setFeature(o),e.setTryReload(),t.dispose())})))}})));async function Ia(e){if(isSecureContext){const t=new Blob([e.outerText],{type:"text/plain"}),n=new Blob([e.outerHTML],{type:"text/html"}),a=new ClipboardItem({[t.type]:t,[n.type]:n});return navigator.clipboard.write([a])}const t=t=>{t.clipboardData?.setData("text/plain",e.outerText),t.clipboardData?.setData("text/html",e.outerHTML),t.preventDefault()};document.addEventListener("copy",t),document.execCommand("copy"),document.removeEventListener("copy",t)}function Ma(e,t,n){const a=[],{cdsLocations:o,strand:l,transcriptParts:s}=t;switch(e){case"genomic":case"cDNA":{const[t]=s;for(const o of t){if("cDNA"===e&&"intron"===o.type)continue;let t=n(o.min,o.max);-1===l&&(t=r.revcom(t));const s="fivePrimeUTR"===o.type||"threePrimeUTR"===o.type?"UTR":o.type,i=a.at(-1);i&&i.type===s?(i.sequence+=t,i.locs.push({min:o.min,max:o.max})):a.push({type:s,sequence:t,locs:[{min:o.min,max:o.max}]})}return a}case"CDS":{let e="";const[t]=o,s=[];for(const a of t){let t=n(a.min,a.max);-1===l&&(t=r.revcom(t)),e+=t,s.push({min:a.min,max:a.max})}return a.push({type:"CDS",sequence:e,locs:s}),a}case"protein":{let e="";const[t]=o,s=[];for(const a of t){let t=n(a.min,a.max);-1===l&&(t=r.revcom(t)),e+=t,s.push({min:a.min,max:a.max})}let i="";for(let t=0;t<e.length;t+=3){const n=e.slice(t,t+3).toUpperCase();i+=r.defaultCodonTable[n]||"&"}return a.push({type:"protein",sequence:i,locs:s}),a}}}function La(e){switch(e){case"upOrDownstream":return"rgb(255,255,255)";case"exon":case"UTR":return"rgb(194,106,119)";case"CDS":return"rgb(93,168,153)";case"intron":return"rgb(187,187,187)";case"protein":return"rgb(148,203,236)"}}function qa(e){const t=[],n=e.flatMap((e=>e.locs));let[a]=n;for(let e=1;e<n.length;e++)a.min===n[e].max||a.max===n[e].min?a={min:Math.min(a.min,n[e].min),max:Math.max(a.max,n[e].max)}:(t.push(a),a=n[e]);return t.push(a),t}const Pa=D.observer((function({assembly:e,feature:n,refName:a,session:o}){const r=o.apolloDataStore.assemblies.get(e),l=r?.getByRefName(a),{featureTypeOntology:i}=o.apolloDataStore.ontologyManager,c="genomic",u=["genomic","cDNA"],[d,f]=C.useState(u),[m,g]=C.useState(c),[p,h]=C.useState((()=>l?Ma(c,n,((e,t)=>l.getSequence(e,t))):[])),[y,b]=C.useState((()=>qa(p))),S=s.useTheme(),w=C.useRef(null);if(C.useEffect((()=>{const{cdsLocations:e}=n,[t]=e;f(t.length>0?[...u,"CDS","protein"]:u)}),[n]),!r||!l)return null;const E=r.getByRefName(a);if(!E)return null;if(!i)throw new Error("featureTypeOntology is undefined");return i.isTypeOf(n.type,"transcript")?De.default.createElement(De.default.Fragment,null,De.default.createElement(s.Select,{defaultValue:"genomic",value:m,onChange:function(e){const t=e.target.value;g(t);const a=l?Ma(t,n,((e,t)=>l.getSequence(e,t))):[],o=qa(a);h(a),b(o)},size:"small","data-testid":"sequenceOptionSelector"},d.map((e=>De.default.createElement(s.MenuItem,{key:e,value:e,"data-testid":`sequenceOption-${e}`},e)))),De.default.createElement(s.Button,{variant:"contained",onClick:()=>{const e=w.current;e&&Ia(e)},style:{marginLeft:10},size:"medium"},"Copy sequence"),De.default.createElement(s.Paper,{style:{fontFamily:"monospace",padding:S.spacing(),overflowX:"auto"},ref:w},">",E.name,":",y.map((e=>1===n.strand?`${e.min+1}-${e.max}`:`${e.max}-${e.min+1}`)).join(";"),"(strand=",1===n.strand?"+":"-",";length=",function(e){let t=0;for(const n of e)t+=n.sequence.length;return t}(p),")",De.default.createElement("br",null),function(e,n){const a=[];let o=0;for(const[n,r]of e.entries()){const e=o%60,l=o>0&&0===e?"\n":"";o+=r.sequence.length;const s=l+r.sequence.slice(0,60-e),i=[s,...t.splitStringIntoChunks(r.sequence.slice(s.length),60)],c=De.default.createElement("span",{key:`${r.type}-${n}`,style:{background:La(r.type),color:S.palette.getContrastText(La(r.type)),whiteSpace:"pre-line"}},i.join("\n"));a.push(c)}return a}(p))):null})),Oa=He.default(va)((()=>({"&.MuiFormControl-root":{marginTop:0,marginBottom:0,width:"100%"},"& .MuiInputBase-input":{fontSize:12,height:20,padding:1,paddingLeft:10}}))),_a=He.default("div")({display:"flex",justifyContent:"center",alignItems:"center",textAlign:"left",width:"100%",overflowWrap:"break-word",wordWrap:"break-word",wordBreak:"break-all","& span":{fontSize:12}}),Ba=e=>{const{strand:t}=e;return De.default.createElement("div",null,1===t?De.default.createElement(be.default,null):-1===t?De.default.createElement(Xe.default,null):De.default.createElement(s.Typography,{component:"span"},"N/A"))},Ua=D.observer((function({assembly:e,feature:n,refName:a,session:o}){const{notify:l}=o,i=o.apolloDataStore.assemblies.get(e),c=i?.getByRefName(a),{changeManager:u}=o.apolloDataStore,d=C.useRef(null);if(!c)return null;const{apolloDataStore:f}=o,{featureTypeOntology:m}=f.ontologyManager;if(!m.isTypeOf(n.type,"transcript")&&!m.isTypeOf(n.type,"pseudogenic_transcript"))throw new Error("Feature is not a transcript or equivalent");const{cdsLocations:g,transcriptExonParts:p,strand:h}=n,[y]=g,[b,S]=((e,t)=>{const{transcriptExonParts:n}=e,a=n.filter((e=>t.isTypeOf(e.type,"exon"))).sort((({min:e},{min:t})=>e-t)),o=a[0]?.min,r=a[a.length-1]?.max;return[o,r]})(n,m);let w=b,E=S;const v=y.length>0;if(v){const e=y.toSorted((({min:e},{min:t})=>e-t));w=e[0].min,E=e[e.length-1].max}const x=(n,a,o,r,s)=>{if(!o.children)throw new Error("Transcript should have child features");if(n===a)return!0;const i=k(o,m,n,r);if(!i)return l("No matching CDS feature found","error"),!1;if(r&&a>=i.max)return l("Start location should be less than CDS end location","error"),!1;if(!r&&a<=i.min)return l("End location should be greater than CDS start location","error"),!1;if(!I(o,m,a,r))return l("There should be an overlapping exon for the new CDS location","error"),!1;const c=r?new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[i._id],featureId:i._id,oldStart:i.min,newStart:a,assembly:e}):new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[i._id],featureId:i._id,oldEnd:i.max,newEnd:a,assembly:e});return u.submit(c).then((()=>{s&&s()})).catch((()=>{l("Error updating feature CDS position","error")})),!0};function T(n,a,o,r){if(!o.children)throw new Error("Transcript should have child features");const{matchingExon:s,prevExon:i,nextExon:c}=M(o,m,n,r);if(!s)return l("No matching exon found","error"),!1;if(r&&a>=s.max)return l("Start location should be less than end location","error"),!1;if(!r&&a<=s.min)return l("End location should be greater than start location","error"),!1;if(i&&i.max+2>a)return l("Error while changing start location","error"),!1;if(c&&c.min-2<a)return l("Error while changing end location","error"),!1;const d=N(o,s.min,s.max,m);if(!d)return l("No matching exon feature found","error"),!1;const f=D(o,m);if(r&&a!==s.min){const n=new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[],changes:[],assembly:e});if(i)F(d,n,a);else{const e=o.min,t=o.parent;if(a<e)t&&a<t.min&&F(t,n,a),F(o,n,a),F(d,n,a);else if(a>e&&(F(d,n,a),F(o,n,a),t)){const[e]=R(t,o,a,m,r);t.min!=e&&F(t,n,e)}}f&&f.min>=s.min&&f.min<=s.max&&a>f.min&&F(f,n,a),u.submit(n).catch((()=>{l("Error updating feature exon start position","error")}))}if(!r&&a!==s.max){const n=new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[],changes:[],assembly:e});if(c)A(d,n,a);else{const e=o.max,t=o.parent;if(a>e)t&&a>t.max&&A(t,n,a),A(o,n,a),A(d,n,a);else if(a<e&&(A(d,n,a),A(o,n,a),t)){const[,e]=R(t,o,a,m,r);t.max!=e&&A(t,n,e)}}f&&f.max>=s.min&&f.max<=s.max&&a<f.max&&A(f,n,a),u.submit(n).catch((()=>{l("Error updating feature exon end position","error")}))}return!0}const A=(e,t,n)=>{t.changedIds.push(e._id),t.changes.push({featureId:e._id,oldEnd:e.max,newEnd:n})},F=(e,t,n)=>{t.changedIds.push(e._id),t.changes.push({featureId:e._id,oldStart:e.min,newStart:n})},k=(e,t,n,a)=>{let o;for(const[,r]of e.children??[])if(t.isTypeOf(r.type,"CDS")){if(a&&n===r.min){o=r;break}if(!a&&n===r.max){o=r;break}}return o},D=(e,t)=>{let n;for(const[,a]of e.children??[])if(t.isTypeOf(a.type,"CDS")){n=a;break}return n},N=(e,t,n,a)=>{let o;for(const[,r]of e.children??[])if(a.isTypeOf(r.type,"exon")&&t===r.min&&n===r.max){o=r;break}return o},R=(e,t,n,a,o)=>{const r=[],l=[];for(const[,s]of e.children?.entries()??[])a.isTypeOf(s.type,"transcript")&&(s._id===t._id?o?(r.push(n),l.push(s.max)):(l.push(n),r.push(s.min)):(r.push(s.min),l.push(s.max)));return[Math.min(...r),Math.max(...l)]},I=(e,t,n,a)=>{const{transcriptExonParts:o}=e;let r;for(const[,e]of o.entries())if(t.isTypeOf(e.type,"exon")){if(!a&&n>=e.min&&n<=e.max){r=e;break}if(a&&n>=e.min&&n<=e.max){r=e;break}}return r},M=(e,t,n,a)=>{const{transcriptExonParts:o,strand:r}=e;let l,s,i,c;for(const[e,r]of o.entries())if(t.isTypeOf(r.type,"exon")){if(a&&r.min===n){l=r,s=e;break}if(!a&&r.max===n){l=r,s=e;break}}if(l&&void 0!==s){if(1===r&&s>0)for(let e=s-1;e>=0;e--){const n=o[e];if(t.isTypeOf(n.type,"exon")){i=n;break}}if(-1===r&&s<o.length-1)for(let e=s+1;e<o.length;e++){const n=o[e];if(t.isTypeOf(n.type,"exon")){i=n;break}}if(1===r&&s<o.length-1)for(let e=s+1;e<o.length;e++){const n=o[e];if(t.isTypeOf(n.type,"exon")){c=n;break}}if(-1===r&&s>0)for(let e=s-1;e>=0;e--){const n=o[e];if(t.isTypeOf(n.type,"exon")){c=n;break}}}return{matchingExon:l,prevExon:i,nextExon:c}},L=()=>{let e="";const[t]=g,a=t.toSorted((({min:e},{min:t})=>e-t));for(const t of a)e+=c.getSequence(t.min,t.max);-1===h&&(e=r.revcom(e));const o=[];for(let t=0;t<e.length;t+=3){const a=e.slice(t,t+3).toUpperCase(),l=r.defaultCodonTable[a]||"&";"ATG"===a?o.push(De.default.createElement(s.Typography,{component:"span",style:{backgroundColor:"yellow",cursor:"pointer",border:"1px solid black"},key:t,onClick:()=>{const e=q(t);e!==w&&1===h&&x(w,e,n,!0),e!==E&&-1===h&&x(E,e,n,!1)}},l)):["TAA","TAG","TGA"].includes(a)?o.push(De.default.createElement(s.Typography,{style:{backgroundColor:"red",color:"white"},component:"span",key:t},l)):o.push(De.default.createElement(s.Typography,{component:"span",key:t},l))}return o},q=e=>{const[t]=g;let n=0;const a=t.toSorted((({min:e},{min:t})=>e-t));if(1===h)for(const t of a){const a=t.max-t.min;if(n+a>e)return t.min+(e-n);n+=a}else if(-1===h)for(let t=a.length-1;t>=0;t--){const o=a[t],r=o.max-o.min;if(n+r>e)return o.max-(e-n);n+=r}return 1===h?w:E};return De.default.createElement("div",null,v&&De.default.createElement("div",null,De.default.createElement(s.Accordion,null,De.default.createElement(Wa,{expandIcon:De.default.createElement(je.default,{style:{color:"white"}}),"aria-controls":"panel1-content",id:"panel1-header"},De.default.createElement(s.Typography,{component:"span",fontWeight:"bold"},"Translation")),De.default.createElement(s.AccordionDetails,null,De.default.createElement(_a,null,De.default.createElement(s.Typography,{component:"span",ref:d,style:{maxHeight:120,overflowY:"scroll"}},L())),De.default.createElement("div",{style:{marginTop:10,display:"flex",flexDirection:"row",alignItems:"center",gap:10}},De.default.createElement(s.Tooltip,{title:"Copy"},De.default.createElement(Ve.default,{style:{fontSize:15,cursor:"pointer"},onClick:()=>{const e=d.current;e&&Ia(e)}})),De.default.createElement(s.Tooltip,{title:"Trim"},De.default.createElement(Je.default,{style:{fontSize:15,cursor:"pointer"},onClick:()=>{const e=L(),t=e.map((e=>e.props.children)).join("");if(t.startsWith("M")&&t.endsWith("*"))return;const a=[];for(const t of e)a.push({codonGenomicPos:t.key,sequenceLetter:t.props.children});if(0===a.length)return;const o=t.indexOf("M"),r=t.indexOf("*")+1,s=a[o].codonGenomicPos,i=a[r].codonGenomicPos;if(!s||!i)return;const c=q(s),u=q(i);if(1===h){if(c>u)return void l("Start codon genomic location should be less than stop codon genomic location","error");let e;c!==w&&(e=new Promise((e=>{x(w,c,n,!0,(()=>{e(!0)}))}))),u!==E&&(e?e.then((()=>{x(E,u,n,!1)})):x(E,u,n,!1))}if(-1===h){if(c<u)return void l("Start codon genomic location should be less than stop codon genomic location","error");let e;c!==E&&(e=new Promise((e=>{x(E,c,n,!1,(()=>{e(!0)}))}))),u!==w&&(e?e.then((()=>{x(w,u,n,!0)})):x(w,u,n,!0))}l("Translation sequence trimmed to start and stop codons","success")}}))))),De.default.createElement(s.Grid,{container:!0,justifyContent:"center",alignItems:"center",style:{textAlign:"center",marginTop:10}},De.default.createElement(s.Grid,{size:1}),De.default.createElement(s.Grid,{size:4},De.default.createElement(Oa,1===h?{margin:"dense",variant:"outlined",value:w+1,onChangeCommitted:e=>x(w,e-1,n,!0),style:{border:"1px solid black",borderRadius:5}}:{margin:"dense",variant:"outlined",value:E,onChangeCommitted:e=>x(E,e,n,!1),style:{border:"1px solid black",borderRadius:5}})),De.default.createElement(s.Grid,{size:2},De.default.createElement(s.Typography,{component:"span"},"CDS")),De.default.createElement(s.Grid,{size:4},De.default.createElement(Oa,1===h?{margin:"dense",variant:"outlined",value:E,onChangeCommitted:e=>x(E,e,n,!1),style:{border:"1px solid black",borderRadius:5}}:{margin:"dense",variant:"outlined",value:w+1,onChangeCommitted:e=>x(w,e-1,n,!0),style:{border:"1px solid black",borderRadius:5}})),De.default.createElement(s.Grid,{size:1}))),De.default.createElement("div",{style:{marginTop:5}},p.map(((e,t)=>De.default.createElement("div",{key:t},"exon"===e.type&&De.default.createElement(s.Grid,{container:!0,justifyContent:"center",alignItems:"center",style:{textAlign:"center"}},De.default.createElement(s.Grid,{size:1},0!==t&&((e,t)=>{let n="";if(t>0){const a=p[t-1];1===h?"intron"===a.type&&(n=c.getSequence(e.min-2,e.min)):"intron"===a.type&&(n=r.revcom(c.getSequence(e.max,e.max+2)))}return n=n.toUpperCase(),[{spliceSite:n,color:"AG"===n?"green":"red"}]})(e,t).map(((e,t)=>De.default.createElement(s.Typography,{key:t,component:"span",color:e.color},e.spliceSite)))),De.default.createElement(s.Grid,{size:4,style:{padding:0}},De.default.createElement(Oa,1===h?{margin:"dense",variant:"outlined",value:e.min+1,onChangeCommitted:t=>T(e.min,t-1,n,!0)}:{margin:"dense",variant:"outlined",value:e.max,onChangeCommitted:t=>T(e.max,t,n,!1)})),De.default.createElement(s.Grid,{size:2},De.default.createElement(Ba,{strand:n.strand})),De.default.createElement(s.Grid,{size:4,style:{padding:0}},De.default.createElement(Oa,1===h?{margin:"dense",variant:"outlined",value:e.max,onChangeCommitted:t=>T(e.max,t,n,!1)}:{margin:"dense",variant:"outlined",value:e.min+1,onChangeCommitted:t=>T(e.min,t-1,n,!0)})),De.default.createElement(s.Grid,{size:1},t!==p.length-1&&((e,t)=>{let n="";if(t<p.length-1){const a=p[t+1];1===h?"intron"===a.type&&(n=c.getSequence(e.max,e.max+2)):"intron"===a.type&&(n=r.revcom(c.getSequence(e.min-2,e.min)))}return n=n.toUpperCase(),[{spliceSite:n,color:"GT"===n?"green":"red"}]})(e,t).map(((e,t)=>De.default.createElement(s.Typography,{key:t,component:"span",color:e.color},e.spliceSite))))))))))})),$a=He.default(s.TableCell)((()=>({fontWeight:"bold"}))),ja=D.observer((function(e){const{feature:t}=e,n=ft(t),a=mt(t);return De.default.createElement(s.Table,{size:"small",sx:{fontSize:"0.75rem","& .MuiTableCell-root":{padding:"4px"}}},De.default.createElement(s.TableBody,null,""!==n&&De.default.createElement(s.TableRow,null,De.default.createElement($a,null,"Name"),De.default.createElement(s.TableCell,null,ft(t))),""!==a&&De.default.createElement(s.TableRow,null,De.default.createElement($a,null,"ID"),De.default.createElement(s.TableCell,null,mt(t))),De.default.createElement(s.TableRow,null,De.default.createElement($a,null,"Type"),De.default.createElement(s.TableCell,null,t.type)),De.default.createElement(s.TableRow,null,De.default.createElement($a,null,"Location"),De.default.createElement(s.TableCell,null,e.refName,":",t.min,"..",t.max)),De.default.createElement(s.TableRow,null,De.default.createElement($a,null,"Strand"),De.default.createElement(s.TableCell,null,1===(o=t.strand)?"Forward":-1===o?"Reverse":""))));var o})),Ga=E.makeStyles()((e=>({root:{padding:e.spacing(2)}}))),Wa=He.default(s.AccordionSummary)((()=>({minHeight:30,maxHeight:30,"&.Mui-expanded":{minHeight:30,maxHeight:30}})));function za(e){return null}const Ha=D.observer((function(e){const{classes:t}=Ga(),n=["summary","location"],[a,o]=C.useState(n),{model:l}=e,{assembly:i,feature:u,refName:d}=l;C.useEffect((()=>{o(n)}),[u]);const f=r.getSession(l),{pluginManager:m}=r.getEnv(f),g=r.getSession(l),p=g.apolloDataStore.assemblies.get(i),{internetAccounts:h}=c.getRoot(f),y=h.find((e=>"ApolloInternetAccount"===e.type)),b=["admin","user"].includes((y?y.role:"admin")??"");if(!u||!p)return null;const S=p.getByRefName(d);if(!S)return null;const{max:w,min:E}=u;function v(e,t){o(e?[...a,t]:a.filter((e=>e!==t)))}S.getSequence(E,w)||g.apolloDataStore.loadRefSeq([{assemblyName:i,refName:d,start:E,end:w}]);const x=m.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-InsideSummary",za,{feature:u,session:f}),T=m.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-AfterSummary",za,{feature:u,session:f}),A=m.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-InsideLocation",za,{feature:u,session:f}),F=m.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-AfterLocation",za,{feature:u,session:f}),k=m.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-InsideAttributes",za,{feature:u,session:f}),D=m.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-AfterAttributes",za,{feature:u,session:f}),N=m.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-InsideSequence",za,{feature:u,session:f}),R=m.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-AfterSequence",za,{feature:u,session:f});return De.default.createElement("div",{className:t.root},De.default.createElement(s.Accordion,{expanded:a.includes("summary"),onChange:(e,t)=>{v(t,"summary")}},De.default.createElement(Wa,{expandIcon:De.default.createElement(je.default,{style:{color:"white"}}),"aria-controls":"panel1-content",id:"panel1-header"},De.default.createElement(s.Typography,{component:"span",fontWeight:"bold"},"Summary")),De.default.createElement(s.AccordionDetails,null,De.default.createElement(ja,{feature:u,refName:d}),De.default.createElement(x,{session:f,feature:u}))),De.default.createElement(T,{session:f,feature:u}),De.default.createElement(s.Accordion,{style:{marginTop:5},expanded:a.includes("location"),onChange:(e,t)=>{v(t,"location")}},De.default.createElement(Wa,{expandIcon:De.default.createElement(je.default,{style:{color:"white"}}),"aria-controls":"panel2-content",id:"panel2-header"},De.default.createElement(s.Typography,{component:"span",fontWeight:"bold"},"Location")),De.default.createElement(s.AccordionDetails,null,De.default.createElement(Ua,{feature:u,refName:d,session:g,assembly:p._id||""}),De.default.createElement(A,{session:f,feature:u}))),De.default.createElement(F,{session:f,feature:u}),De.default.createElement(s.Accordion,{style:{marginTop:5},expanded:a.includes("attrs"),onChange:(e,t)=>{v(t,"attrs")}},De.default.createElement(Wa,{expandIcon:De.default.createElement(je.default,{style:{color:"white"}}),"aria-controls":"panel3-content",id:"panel3-header"},De.default.createElement("div",{style:{display:"flex",alignItems:"center"}},De.default.createElement(s.Typography,{component:"span",fontWeight:"bold"},"Attributes"," "),De.default.createElement(s.Tooltip,{title:"Separate multiple values for the attribute with commas"},De.default.createElement(xe.default,{style:{color:"white",fontSize:15,marginLeft:10}})))),De.default.createElement(s.AccordionDetails,null,De.default.createElement(Ea,{feature:u,session:g,assembly:p._id||"",editable:b}),De.default.createElement(k,{session:f,feature:u}))),De.default.createElement(D,{session:f,feature:u}),De.default.createElement(s.Accordion,{style:{marginTop:5},expanded:a.includes("sequence"),onChange:(e,t)=>{v(t,"sequence")}},De.default.createElement(Wa,{expandIcon:De.default.createElement(je.default,{style:{color:"white"}}),"aria-controls":"panel4-content",id:"panel4-header"},De.default.createElement(s.Typography,{component:"span",fontWeight:"bold"},"Sequence")),De.default.createElement(s.AccordionDetails,null,a.includes("sequence")&&De.default.createElement(Pa,{feature:u,session:g,assembly:p._id||"",refName:d}),De.default.createElement(N,{session:f,feature:u}))),De.default.createElement(R,{feature:u,session:f}))})),Va=a.ConfigurationSchema("LinearApolloDisplay",{},{explicitIdentifier:"displayId",explicitlyTyped:!0}),Ja=E.makeStyles()({highlighted:{background:"orange"}}),Xa=({highlight:e,text:t})=>{const{classes:n}=Ja();if(!e)return De.default.createElement(De.default.Fragment,null,t);const a=t.split(e);if(1===a.length)return De.default.createElement(De.default.Fragment,null,t);const o=[];for(let t=0;t<a.length-1;t++)o.push(a[t],De.default.createElement("span",{className:n.highlighted},e));return De.default.createElement(De.default.Fragment,null,o,a.at(-1))},Ka=D.observer((function({feature:e,filterText:t}){const n=[...e.attributes.entries()].map((([e,t])=>{if(e.startsWith("gff_")){const n=e.slice(4);return[n.charAt(0).toUpperCase()+n.slice(1),c.getSnapshot(t)]}return"_id"===e?["ID",c.getSnapshot(t)]:[e,c.getSnapshot(t)]})).filter((([e])=>e)).map((([e,t])=>`${e}=${Array.isArray(t)?t.join(", "):t}`)).join(", ");return De.default.createElement(Xa,{text:n,highlight:t})})),Za=E.makeStyles()((e=>({inputWrapper:{position:"relative"},hiddenWidthSpan:{padding:e.spacing(.5),color:"transparent"},numberTextInput:{border:"none",background:"inherit",font:"inherit",position:"absolute",width:"100%",left:0}}))),Ya=D.observer((function({initialValue:e,notifyError:t,onChangeCommitted:n}){const[a,o]=C.useState(e),[r,l]=C.useState(!1),[s,i]=C.useState(null),{classes:c}=Za();return C.useEffect((()=>{e!==a&&o(e)}),[e]),C.useEffect((()=>{r&&(s?.blur(),l(!1))}),[r,s]),De.default.createElement("span",{className:c.inputWrapper},De.default.createElement("span",{className:c.hiddenWidthSpan,"aria-hidden":!0},a),De.default.createElement("input",{type:"text",value:a,className:c.numberTextInput,onChange:function(e){const t=Number(e.target.value);Number.isNaN(t)||o(t)},onKeyDown:t=>{"Enter"===t.key?s?.blur():"Escape"===t.key&&(o(e),l(!0))},onBlur:()=>{a!==e&&n(a).catch(t)},ref:e=>{i(e)}}))})),Qa=E.makeStyles()((e=>({typeContent:{display:"inline-block",width:"174px",height:"100%",cursor:"text"},feature:{td:{position:"relative",verticalAlign:"top",paddingLeft:"0.5em"}},arrow:{display:"inline-block",width:"1.6em",textAlign:"center",cursor:"pointer"},arrowExpanded:{transform:"rotate(90deg)"},hoveredFeature:{backgroundColor:e.palette.action.hover},typeInputElement:{border:"none",background:"none"},typeErrorMessage:{color:"red"}})));function eo(e,t){const{changeManager:n,getAssemblyId:a,regions:o,selectedFeature:l,session:s,setSelectedFeature:i,filteredTranscripts:u,updateFilteredTranscripts:d}=e;return function(e,t,n,a,o,l,s,i,u){const d=function(e){const{internetAccounts:t}=c.getParent(e);return t.find((e=>"ApolloInternetAccount"===e.type))}(l),f=d?d.role:"admin",m="admin"===f,g=!(f&&["admin","user"].includes(f)),p=[];if(e){const c=e.attributes.get("gff_id")?.toString(),f=n(t.assemblyName),h=n(t.assemblyName);p.push({label:"Edit feature details",onClick:()=>{const n=l.addWidget("ApolloFeatureDetailsWidget","apolloFeatureDetailsWidget",{feature:e,assembly:h,refName:t.refName});l.showWidget(n)}},{label:"Add child feature",disabled:g,onClick:()=>{l.queueDialog((t=>[yn,{session:l,handleClose:()=>{t()},changeManager:s,sourceFeature:e,sourceAssemblyId:f,internetAccount:d}]))}},{label:"Copy features and annotations",disabled:g,onClick:()=>{l.queueDialog((t=>[Fn,{session:l,handleClose:()=>{t()},changeManager:s,sourceFeature:e,sourceAssemblyId:h}]))}},{label:"Delete feature",disabled:!m,onClick:()=>{l.queueDialog((t=>[Dn,{session:l,handleClose:()=>{t()},changeManager:s,sourceFeature:e,sourceAssemblyId:h,selectedFeature:a,setSelectedFeature:o}]))}},{label:"Merge transcripts",disabled:!m,onClick:()=>{l.queueDialog((t=>[_n,{session:l,handleClose:()=>{t()},changeManager:s,sourceFeature:e,sourceAssemblyId:h,selectedFeature:a,setSelectedFeature:o}]))}},{label:"Merge exons",disabled:!m,onClick:()=>{l.queueDialog((t=>[Pn,{session:l,handleClose:()=>{t()},changeManager:s,sourceFeature:e,sourceAssemblyId:h,selectedFeature:a,setSelectedFeature:o}]))}},{label:"Split exon",disabled:!m,onClick:()=>{l.queueDialog((t=>[Vn,{session:l,handleClose:()=>{t()},changeManager:s,sourceFeature:e,sourceAssemblyId:h,selectedFeature:a,setSelectedFeature:o}]))}});const{featureTypeOntology:y}=l.apolloDataStore.ontologyManager;if(!y)throw new Error("featureTypeOntology is undefined");(y.isTypeOf(e.type,"transcript")||y.isTypeOf(e.type,"pseudogenic_transcript"))&&r.isSessionModelWithWidgets(l)&&p.push({label:"Edit transcript details",onClick:()=>{const n=l.addWidget("ApolloTranscriptDetails","apolloTranscriptDetails",{feature:e,assembly:h,changeManager:s,refName:t.refName});l.showWidget(n)}},{label:"Visible",type:"checkbox",checked:!c||!i.includes(c),onClick:()=>{if(c){const e=i.includes(c)?i.filter((e=>e!==c)):[...i,c];u(e)}}})}return p}(t,o[0],a,l,i,s,n,u,d)}const to=D.observer((function e({depth:n,feature:a,isHovered:o,isSelected:r,model:l,selectedFeatureClass:s,setContextMenu:i}){const{classes:c}=Qa(),{changeManager:u,hoveredFeature:d,selectedFeature:f,session:m,tabularEditor:g}=l,{featureCollapsed:p,filterText:h}=g,{_id:y,children:b,max:S,min:w,strand:C,type:E}=a,v=!p.get(y),x=e=>{m.notify(e.message,"error")};return De.default.createElement(De.default.Fragment,null,De.default.createElement("tr",{onMouseEnter:e=>{l.setHoveredFeature({feature:a,bp:w})},className:c.feature+(r?` ${s}`:o?` ${c.hoveredFeature}`:""),onClick:e=>{e.stopPropagation(),l.setSelectedFeature(a)},onDoubleClick:()=>{l.setSelectedFeature(a),function(e,t){e.lgv.navTo(kt(t,.1,e.lgv.totalBp))}(l,a)},onContextMenu:e=>(e.preventDefault(),i({position:{left:e.clientX+2,top:e.clientY-6},items:eo(l,a)}),!1)},De.default.createElement("td",{style:{whiteSpace:"nowrap",borderLeft:2*n+"em solid transparent"}},b?.size?De.default.createElement("div",{onClick:e=>{e.stopPropagation(),g.setFeatureCollapsed(y,v)},className:c.arrow+(v?` ${c.arrowExpanded}`:"")},"❯"):null,De.default.createElement("div",{className:c.typeContent},De.default.createElement(hn,{session:m,ontologyName:"Sequence Ontology",style:{width:170},value:E,filterTerms:mn,fetchValidTerms:no.bind(null,a),renderInput:e=>De.default.createElement("div",{ref:e.InputProps.ref},De.default.createElement("input",{type:"text",...e.inputProps,className:c.typeInputElement,style:{width:170}}),e.error?De.default.createElement("div",{className:c.typeErrorMessage},e.errorMessage??"unknown error"):null),onChange:(e,n)=>{n&&function(e,n,a,o){const r=n._id,l=new t.TypeChange({typeName:"TypeChange",changedIds:[r],featureId:r,oldType:String(a),newType:String(o),assembly:n.assemblyId});return e.submit(l)}(u,a,e,n).catch(x)}}))),De.default.createElement("td",null,De.default.createElement(Ya,{initialValue:w+1,notifyError:x,onChangeCommitted:e=>function(e,n,a,o){const r=n._id,l=new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[r],featureId:r,oldStart:a,newStart:o,assembly:n.assemblyId});return e.submit(l)}(u,a,w,e-1)})),De.default.createElement("td",null,De.default.createElement(Ya,{initialValue:S,notifyError:x,onChangeCommitted:e=>function(e,n,a,o){const r=n._id,l=new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[r],featureId:r,oldEnd:a,newEnd:o,assembly:n.assemblyId});return e.submit(l)}(u,a,S,e)})),De.default.createElement("td",null,1===C?"+":-1===C?"-":void 0),De.default.createElement("td",null,De.default.createElement(Ka,{filterText:h,feature:a}))),v&&b?[...b.entries()].filter((e=>{if(!h)return!0;const[,t]=e;return JSON.stringify(t).includes(h)})).map((([t,a])=>De.default.createElement(e,{isHovered:d?.feature._id===a._id,isSelected:f?._id===a._id,selectedFeatureClass:s,key:t,depth:(n||0)+1,feature:a,model:l,setContextMenu:i}))):null)}));async function no(e,t,n){const{parent:a}=e;if(a){const e=(await t.getTermsWithLabelOrSynonym(a.type,{includeSubclasses:!1})).filter(mn);if(e.length>0)return await t.getClassesThat("part_of",e)}}const ao=E.makeStyles()((e=>({scrollableTable:{width:"100%",height:"100%",th:{position:"sticky",top:0,zIndex:2,textAlign:"left",background:e.palette.background.paper,paddingTop:"3.2em"},td:{whiteSpace:"normal"}},selectedFeature:{backgroundColor:e.palette.action.selected}}))),oo=D.observer((function({model:e}){const{hoveredFeature:t,seenFeatures:n,selectedFeature:a,tabularEditor:o}=e,r=s.useTheme(),{classes:l}=ao(),i=C.useRef(null),[c,u]=C.useState(null),{filterText:d}=o;return C.useEffect((()=>{const e=i.current;if(e&&a){const t=e.querySelector(`.${l.selectedFeature}`);if(t){const n=e.scrollTop,a=t.offsetTop-25;a>n&&a<n+e.offsetHeight||e.scroll({top:a-40,behavior:"smooth"})}}}),[a,n,l.selectedFeature]),De.default.createElement("div",{ref:i,style:{width:"100%",overflowY:"auto",height:"100%"}},De.default.createElement("table",{className:l.scrollableTable},De.default.createElement("thead",null,De.default.createElement("tr",null,De.default.createElement("th",null,"Type"),De.default.createElement("th",null,"Start"),De.default.createElement("th",null,"End"),De.default.createElement("th",null,"Strand"),De.default.createElement("th",null,"Attributes"))),De.default.createElement("tbody",null,[...n.entries()].filter((e=>{if(!d)return!0;const[,t]=e;return JSON.stringify(t).includes(d)})).sort(((e,t)=>e[1].min-t[1].min)).map((([n,o])=>De.default.createElement(to,{key:n,isSelected:a?._id===n,isHovered:t?.feature._id===n,selectedFeatureClass:l.selectedFeature,feature:o,model:e,depth:0,setContextMenu:u}))))),De.default.createElement(F.Menu,{open:Boolean(c),onMenuItemClick:(e,t)=>{t(),u(null)},onClose:()=>{u(null)},slotProps:{transition:{onExit:()=>{u(null)}}},style:{zIndex:r.zIndex.tooltip},menuItems:c?.items??[],anchorReference:"anchorPosition",anchorPosition:c?.position}))})),ro=E.makeStyles()({toolbar:{width:"100%",display:"flex",paddingRight:"2em",flexDirection:"row",justifyContent:"space-between",position:"absolute",zIndex:4},filterText:{}}),lo=D.observer((function({model:e}){const t=e.tabularEditor,{classes:n}=ro();return De.default.createElement("div",{className:n.toolbar},De.default.createElement(s.Tooltip,{title:"Collapse all"},De.default.createElement(s.IconButton,{"aria-label":"collapse",sx:{marginTop:0},onClick:t.collapseAllFeatures},De.default.createElement(Ze.default,null))),De.default.createElement(s.TextField,{className:n.filterText,label:"Filter features",value:t.filterText,sx:{marginTop:0},variant:"outlined",onChange:e=>{t.setFilterText(e.target.value)},slotProps:{input:{endAdornment:De.default.createElement(s.InputAdornment,{position:"end"},De.default.createElement(s.IconButton,{onClick:()=>{t.clearFilterText()}},De.default.createElement(Ke.default,null)))}}}))}));function so(e){e.stopPropagation()}const io=D.observer((function({model:e}){return e.tabularEditor.isShown?De.default.createElement("div",{onMouseDown:so,onClick:so,style:{width:"100%",height:"100%",position:"relative"}},De.default.createElement(lo,{model:e}),De.default.createElement(oo,{model:e})):null})),co=c.types.model("TabularEditor",{isShown:!0,featureCollapsed:c.types.map(c.types.boolean),filterText:""}).actions((e=>({setFeatureCollapsed(t,n){e.featureCollapsed.set(t,n)},setFilterText(t){e.filterText=t},clearFilterText(){e.filterText=""},collapseAllFeatures(){const t=c.getParent(e);for(const[n]of t.seenFeatures.entries())e.featureCollapsed.set(n,!0)},togglePane(){e.isShown=!e.isShown},hidePane(){e.isShown=!1},showPane(){e.isShown=!0}})));function uo(e,t,n,a=!1){const{apolloRowHeight:o,lgv:r,theme:l}=e,s=e.getFeatureLayoutPosition(n);if(!s)return;const{bpPerPx:i,displayedRegions:c,offsetPx:u}=r,{layoutIndex:d,layoutRow:f}=s,m=c[d],{refName:g,reversed:p}=m,{length:h,max:y,min:b}=n,S=(r.bpToPx({refName:g,coord:p?y:b,regionNumber:d})?.offsetPx??0)-u,w=f*o,C=h/i;t.fillStyle=a?l.palette.action.disabled:l.palette.action.focus,t.fillRect(S,w,C,o)}function fo(e,t,n,a,o,r){e.fillStyle=r,e.fillRect(t,n,a,o)}function mo(e,t,n){const{refName:a,regionNumber:o,x:r}=e,{lgv:l}=n,{offsetPx:s}=l,i=l.bpToPx({refName:a,coord:t.min,regionNumber:o}),c=l.bpToPx({refName:a,coord:t.max,regionNumber:o});if(void 0!==i&&void 0!==c){const e=i.offsetPx-s,t=c.offsetPx-s;if(Math.abs(t-e)<8)return;if(Math.abs(e-r)<4)return"min";if(Math.abs(t-r)<4)return"max"}}const go={draw:function(e,t,n,a,o){const{apolloRowHeight:r,lgv:l,selectedFeature:s,theme:i}=a,{bpPerPx:c,displayedRegions:u,offsetPx:d}=l,f=u[o],m=(l.bpToPx({refName:f.refName,coord:t.min,regionNumber:o})?.offsetPx??0)-d,{reversed:g}=f,p=t.length/c,h=g?m-p:m,y=n*r,b=i.palette.background.default;!function(e,t,n,a,o,r){fo(e,t,n,a,o,r),a<=2||e.clearRect(t+1,n+1,a-2,o-2)}(e,h,y,p,r,i.palette.text.primary),p<=2||(function(e,t,n,a,o,r){fo(e,t+1,n+1,a-2,o-2,r)}(e,h,y,p,r,b),xt(t,s)&&uo(a,e,t,!0))},drawDragPreview:function(e,t){const{apolloDragging:n,apolloRowHeight:a,lgv:o,theme:r}=e,{bpPerPx:l,displayedRegions:i,offsetPx:c}=o;if(!n)return;const{current:u,edge:d,feature:f,start:m}=n,g=Math.floor(m.y/a),p=i[m.regionNumber],h=(p.reversed?p.end-f[d]:f[d]-p.start)/l-c,y=Math.min(u.x,h),b=g*a,S=Math.abs(u.x-h),w=1*a;t.strokeStyle=r.palette.info.main,t.setLineDash([6]),t.strokeRect(y,b,S,w),t.fillStyle=s.alpha(r.palette.info.main,.2),t.fillRect(y,b,S,w)},drawHover:function(e,t){const{hoveredFeature:n}=e;n&&uo(e,t,n.feature)},drawTooltip:function(e,t){const{hoveredFeature:n,apolloRowHeight:a,lgv:o,theme:r}=e;if(!n)return;const{feature:l}=n,i=e.getFeatureLayoutPosition(l);if(!i)return;const{featureRow:c,layoutIndex:u,layoutRow:d}=i,{bpPerPx:f,displayedRegions:m,offsetPx:g}=o,p=m[u],{refName:h,reversed:y}=p;let b="Loc: ";const{length:S,max:w,min:C}=l;b+=`${C+1}–${w}`;let E=(o.bpToPx({refName:h,coord:y?w:C,regionNumber:u})?.offsetPx??0)-g;const v=(d+c)*a,x=S/f,T=`Type: ${l.type}`,{attributes:A}=l,F=A.get("gff_name")?.find((e=>""!==e)),k=[t.measureText(T).width,t.measureText(b).width];F&&k.push(t.measureText(`Name: ${F}`).width);const D=Math.max(...k);E=E+x+5,t.fillStyle=s.alpha(r.palette.text.primary,.7),t.fillRect(E,v,D+4,3===k.length?45:35),t.beginPath(),t.moveTo(E,v),t.lineTo(E-5,v+5),t.lineTo(E,v+10),t.fill(),t.fillStyle=r.palette.background.default;let N=v+12;t.fillText(T,E+2,N),F&&(N+=12,t.fillText(`Name: ${F}`,E+2,N)),N+=12,t.fillText(b,E+2,N)},getContextMenuItemsForFeature:Ft,getContextMenuItems:function(e){const{hoveredFeature:t}=e;return t?Ft(e,t.feature):[]},getFeatureFromLayout:function(e,t,n){return e},getRowCount:function(e){return 1},getRowForFeature:function(e,t){return 0},onMouseDown:function(e,t,n){const{feature:a}=t,o=mo(t,a,e);o&&(n.stopPropagation(),e.startDrag(t,a,o))},onMouseLeave:function(){},onMouseMove:function(e,t){if(It(t)){const{feature:n,bp:a}=t;if(e.setHoveredFeature({feature:n,bp:a}),mo(t,n,e))return void e.setCursor("col-resize")}e.setCursor()},onMouseUp:function(e,t){if(e.apolloDragging)return;const{feature:n}=t;n&&(e.setSelectedFeature(n),e.showFeatureDetailsWidget(n))}};let po=null,ho=null,yo=null,bo=null;const So=globalThis.document.createElement("canvas");if(So?.getContext)for(const e of["forward","backward"])for(const t of["light","dark"]){const n=document.createElement("canvas"),a=10;n.width=n.height=a;const o=n.getContext("2d");if(o){const r="light"===t?"rgba(0,0,0,0)":"rgba(0,0,0,0.75)",l="light"===t?"rgba(255,255,255,0.25)":"rgba(0,0,0,0.50)",s="forward"===e?o.createLinearGradient(0,a,a,0):o.createLinearGradient(0,0,a,a);s.addColorStop(0,r),s.addColorStop(.25,r),s.addColorStop(.25,l),s.addColorStop(.5,l),s.addColorStop(.5,r),s.addColorStop(.75,r),s.addColorStop(.75,l),s.addColorStop(1,l),o.fillStyle=s,o.fillRect(0,0,10,10),"forward"===e?"light"===t?po=o.createPattern(n,"repeat"):yo=o.createPattern(n,"repeat"):"light"===t?ho=o.createPattern(n,"repeat"):bo=o.createPattern(n,"repeat")}}function wo(e,t,n,a,o,r,l,s,i){const{apolloRowHeight:c,lgv:u,theme:d}=t,{bpPerPx:f,displayedRegions:m,offsetPx:g}=u,p=m[n],{refName:h,reversed:y}=p,b=(u.bpToPx({refName:h,coord:o.min,regionNumber:n})?.offsetPx??0)-g,S=o.length/f,w=y?b-S:b,C=(a+r)*c,E=Math.round(.6*c),v=C+(c-E)/2;if(e.fillStyle=d.palette.text.primary,e.fillRect(w,v,S,E),S>2&&(e.clearRect(w+1,v+1,S-2,E-2),e.fillStyle="rgb(211,211,211)",e.fillRect(w+1,v+1,S-2,E-2),s&&i&&l)){const t=y?-1:1,[n,a]=l*t==1?[s,i]:[i,s];e.fillStyle=n,e.fillRect(w+1,v+1,S-2,(E-2)/2),e.fillStyle=a,e.fillRect(w+1,v+1+(E-2)/2,S-2,(E-2)/2)}}function*Co(e,t,n=1){if(e!==t)if(e<t)for(let a=e;a<t;a+=n)yield a;else for(let a=e;a>t;a-=n)yield a}function Eo(e,t,n,a,o,r){const{apolloRowHeight:l,lgv:s,theme:i}=t,{bpPerPx:c,displayedRegions:u,offsetPx:d}=s,f=u[n],{refName:m,reversed:g}=f,p=(s.bpToPx({refName:m,coord:o.min,regionNumber:n})?.offsetPx??0)-d,h=Math.round(o.length/c),y=g?p-h:p,b=Math.round((r+.5)*l)+a*l;e.strokeStyle=i.palette.text.primary;const{strand:S=1}=o;e.beginPath();const w=S*(g?-1:1),C=y-(-1===w?5:0),E=y+h+(-1===w?0:5);e.moveTo(C,b),e.lineTo(E,b);const v=C+(-1===w?0:3),x=E-(-1===w?3:0),T=-1===w?3:-3,A=-1===w?Co(v,x,20):Co(x,v,20);for(const t of A)e.moveTo(t+T,b+T),e.lineTo(t,b),e.lineTo(t+T,b-T);e.stroke()}function vo(e,t,n,a=!1){const{apolloRowHeight:o,lgv:r,session:l,theme:s}=e,{featureTypeOntology:i}=l.apolloDataStore.ontologyManager,c=e.getFeatureLayoutPosition(n);if(!c)return;const{bpPerPx:u,displayedRegions:d,offsetPx:f}=r,{featureRow:m,layoutIndex:g,layoutRow:p}=c,h=d[g],{refName:y,reversed:b}=h,{length:S,max:w,min:C}=n,E=(r.bpToPx({refName:y,coord:b?w:C,regionNumber:g})?.offsetPx??0)-f,v=(p+m)*o,x=S/u;if(t.fillStyle=a?s.palette.action.disabled:s.palette.action.focus,!i)throw new Error("featureTypeOntology is undefined");t.fillRect(E,v,x,o*To(n,i))}function xo(e,t){const{children:n,type:a}=e;if(!n)return 0;let o=0;if(t.isTypeOf(a,"transcript"))for(const[,e]of n)t.isTypeOf(e.type,"CDS")&&(o+=1);return o}function To(e,t,n){const{children:a,type:o}=e;if(!a)return 1;let r=0;if(t.isTypeOf(o,"transcript")||t.isTypeOf(o,"pseudogenic_transcript")){for(const[,e]of a)t.isTypeOf(e.type,"CDS")&&(r+=1);return 0===r?1:r}for(const[,e]of a)r+=To(e,t);return r}function Ao(e,t){if(!t.isTypeOf(e.type,"gene")&&!t.isTypeOf(e.type,"pseudogene"))throw new Error('Top level feature for GeneGlyph must have type "gene"');const{children:n}=e;if(!n)return[[e]];const a=[];for(const[,o]of n){if(!t.isTypeOf(o.type,"transcript")&&!t.isTypeOf(o.type,"pseudogenic_transcript")){a.push([o,e]);continue}if(!o.children)continue;const n=[],r=[];for(const[,e]of o.children)t.isTypeOf(e.type,"CDS")?n.push(e):t.isTypeOf(e.type,"exon")&&r.push(e);for(const t of n)a.push([t,...r,o,e]);0===n.length&&a.push([...r,o,e])}return a}function Fo(e,t,n){const{session:a}=n,{apolloDataStore:o}=a,{featureTypeOntology:l}=o.ontologyManager;if(!l)throw new Error("featureTypeOntology is undefined");const s=l.isTypeOf(t.type,"gene")||l.isTypeOf(t.type,"pseudogene"),i=l.isTypeOf(t.type,"transcript")||l.isTypeOf(t.type,"pseudogenic_transcript"),c=l.isTypeOf(t.type,"CDS");if(s||i)return;const{bp:u,refName:d,regionNumber:f,x:m}=e,{lgv:g}=n;if(c){const e=t.parent;if(!e?.children)return;const n=[];for(const t of e.children.values())l.isTypeOf(t.type,"exon")&&n.push(t);const a=n.find((e=>{const[t,n]=r.intersection2(u-1,u,e.min,e.max);return void 0!==t&&void 0!==n}));if(a){const e=Et(a,d,f,g);if(e){const t=vt(a,m,e);if(t)return t}}}const p=Et(t,d,f,g);if(p){const e=vt(t,m,p);if(e)return e}}const{drawTooltip:ko,getContextMenuItemsForFeature:Do,onMouseLeave:No}=go,Ro={draw:function(e,t,n,o,l){const{apolloRowHeight:i,lgv:c,selectedFeature:u,session:d,theme:f}=o,{bpPerPx:m,displayedRegions:g,offsetPx:p}=c,h=g[l],{refName:y,reversed:b}=h,S=i,w=Math.round(.9*S),{children:C,strand:E}=t;if(!C)return;const{apolloDataStore:v}=d,{featureTypeOntology:x}=v.ontologyManager;if(!x)throw new Error("featureTypeOntology is undefined");!function(e,t,n,o,r,l){const{apolloRowHeight:i,lgv:c,session:u,theme:d}=n,{bpPerPx:f,displayedRegions:m,offsetPx:g}=c,p=m[o],{refName:h,reversed:y}=p,{apolloDataStore:b}=u,{featureTypeOntology:S}=b.ontologyManager;if(!S)throw new Error("featureTypeOntology is undefined");const w=(c.bpToPx({refName:h,coord:t.min,regionNumber:o})?.offsetPx??0)-g,C=t.length/f,E=y?w-C:w,v=r*i,x=To(t,S)*i;let T;T=a.readConfObject(u.getPluginConfiguration(),"geneBackgroundColor",{featureType:t.type}),T||(T=s.alpha(d.palette.background.paper,.6)),e.fillStyle=T,e.fillRect(E,v,C,x)}(e,t,o,l,n);let T=0;for(const[,t]of C){if(!x.isTypeOf(t.type,"transcript")&&!x.isTypeOf(t.type,"pseudogenic_transcript")){T+=1;continue}const{children:a}=t;if(!a)continue;const r=xo(t,x);for(const[,r]of a)x.isTypeOf(r.type,"CDS")&&(Eo(e,o,l,n,t,T),T+=1);0===r&&(Eo(e,o,l,n,t,T),T+=1)}const A="dark"===f.palette.mode?yo:po,F="dark"===f.palette.mode?bo:ho;T=0;for(const[,t]of C){if(!x.isTypeOf(t.type,"transcript")&&!x.isTypeOf(t.type,"pseudogenic_transcript")){go.draw(e,t,n,o,l),T+=1;continue}const a=xo(t,x);if(0!=a)for(const a of t.cdsLocations){const{children:s}=t;if(s){for(const[,t]of s)x.isTypeOf(t.type,"exon")&&wo(e,o,l,n,t,T,E,A,F);for(const o of a){const a=(o.max-o.min)/m,s=(c.bpToPx({refName:y,coord:o.min,regionNumber:l})?.offsetPx??0)-p,i=b?s-a:s;e.fillStyle=f.palette.text.primary;const u=(n+T)*S+(S-w)/2;if(e.fillRect(i,u,a,w),a>2){e.clearRect(i+1,u+1,a-2,w-2);const n=r.getFrame(o.min,o.max,t.strand??1,o.phase),l=f.palette.framesCDS.at(n)?.main;if(e.fillStyle=l??"black",e.fillRect(i+1,u+1,a-2,w-2),A&&F&&E){const t=b?-1:1,[n,o]=E*t==1?[A,F]:[F,A];e.fillStyle=n,e.fillRect(i+1,u+1,a-2,(w-2)/2),e.fillStyle=o,e.fillRect(i+1,u+(w-2)/2,a-2,(w-2)/2)}}}T+=1}}const{children:s}=t;if(0===a&&s){for(const[,t]of s)x.isTypeOf(t.type,"exon")&&wo(e,o,l,n,t,T,E,A,F);T+=1}}u&&Tt(t,u)&&vo(o,e,u,!0)},drawDragPreview:function(e,t){const{apolloDragging:n,apolloRowHeight:a,lgv:o,theme:r}=e,{bpPerPx:l,displayedRegions:i,offsetPx:c}=o;if(!n)return;const{current:u,edge:d,feature:f,start:m}=n,g=Math.floor(m.y/a),p=i[m.regionNumber],h=(p.reversed?p.end-f[d]:f[d]-p.start)/l-c,y=Math.min(u.x,h),b=g*a,S=Math.abs(u.x-h),w=1*a;t.strokeStyle=r.palette.info.main,t.setLineDash([6]),t.strokeRect(y,b,S,w),t.fillStyle=s.alpha(r.palette.info.main,.2),t.fillRect(y,b,S,w)},drawHover:function(e,t){const{hoveredFeature:n}=e;n&&vo(e,t,n.feature)},drawTooltip:ko,getContextMenuItems:function(e,t){const{apolloInternetAccount:n,hoveredFeature:a,changeManager:o,regions:l,selectedFeature:s,session:i}=e,[c]=l,u=e.getAssemblyId(c.assemblyName),d=[],f="admin"===(n?n.role:"admin");if(!a)return d;if(It(t)){const{bp:n,feature:a}=t;let l=pt(a,n);St(a,i)&&(l=pt(a,n,!0));for(const n of l){const a=go.getContextMenuItemsForFeature(e,n);if(bt(n,i)){const l=wt(n,e,t,i),c=r.getContainingView(e);if(l.upstream){const t=l.upstream;a.push({label:"Go to upstream exon",icon:Ct(n.strand,!0,c.displayedRegions.at(0)?.reversed),onClick:()=>{c.navTo(kt(t,.1,c.totalBp)),ht(e,t)}})}if(l.downstream){const t=l.downstream;a.push({label:"Go to downstream exon",icon:Ct(n.strand,!1,c.displayedRegions.at(0)?.reversed),onClick:()=>{c.navTo(kt(t,.1,c.totalBp)),ht(e,t)}})}a.push({label:"Merge exons",disabled:!f,onClick:()=>{i.queueDialog((t=>[Pn,{session:i,handleClose:()=>{t()},changeManager:o,sourceFeature:n,sourceAssemblyId:u,selectedFeature:s,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}},{label:"Split exon",disabled:!f,onClick:()=>{i.queueDialog((t=>[Vn,{session:i,handleClose:()=>{t()},changeManager:o,sourceFeature:n,sourceAssemblyId:u,selectedFeature:s,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}})}yt(n,i)&&(a.push({label:"Merge transcript",onClick:()=>{i.queueDialog((t=>[_n,{session:i,handleClose:()=>{t()},changeManager:o,sourceFeature:n,sourceAssemblyId:u,selectedFeature:s,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}}),r.isSessionModelWithWidgets(i)&&a.push({label:"Open transcript details",onClick:()=>{const e=i.addWidget("ApolloTranscriptDetails","apolloTranscriptDetails",{feature:n,assembly:u,changeManager:o,refName:c.refName});i.showWidget(e)}})),d.push({label:n.type,subMenu:a})}}return d},getContextMenuItemsForFeature:Do,getFeatureFromLayout:function(e,t,n,a){const o=Ao(e,a)[n]||[];for(const e of o){let n;if(t>=e.min&&t<=e.max&&e.parent&&(n=e),n){if(a.isTypeOf(n.type,"CDS")&&n.parent&&(a.isTypeOf(n.parent.type,"transcript")||a.isTypeOf(n.parent.type,"pseudogenic_transcript"))){const{cdsLocations:e}=n.parent;for(const a of e)for(const e of a)if(t>=e.min&&t<=e.max)return n;return n.parent}return n}}return e},getRowCount:To,getRowForFeature:function(e,t,n){const a=Ao(e,n);for(const[e,n]of a.entries())if(n.some((e=>e._id===t._id)))return e},onMouseDown:function(e,t,n){const{feature:a}=t,o=Fo(t,a,e);o&&(n.stopPropagation(),e.startDrag(t,o.feature,o.edge,!0))},onMouseLeave:No,onMouseMove:function(e,t){if(It(t)){const{feature:n,bp:a}=t;if(e.setHoveredFeature({feature:n,bp:a}),Fo(t,n,e))return void e.setCursor("col-resize")}e.setCursor()},onMouseUp:function(e,t){if(e.apolloDragging)return;const{feature:n}=t;n&&ht(e,n)}};function Io(e){const t=[[e]];if(e.children)for(const[,n]of e.children)t.push(...Io(n));return t}function Mo(e){return Io(e).length}function Lo(e,t,n,a,o,r){const l=Io(t)[n-a];for(const t of l)qo(e,t,n,o,r)}function qo(e,t,n,a,o){const{apolloRowHeight:r,lgv:l,theme:i}=a,{bpPerPx:c,displayedRegions:u,offsetPx:d}=l,f=u[o],m=(l.bpToPx({refName:f.refName,coord:t.min,regionNumber:o})?.offsetPx??0)-d,{reversed:g}=f,p=t.length/c,h=g?m-p:m,y=n*r,b=Mo(t),S=s.alpha(i.palette.background.paper,.6);b>1&&fo(e,h,y,p,b*r,S),go.draw(e,t,n,a,o)}function Po(e,t,n,a=!1){const{apolloRowHeight:o,lgv:r,theme:l}=e,s=e.getFeatureLayoutPosition(n);if(!s)return;const{featureRow:i,layoutIndex:c,layoutRow:u}=s,{bpPerPx:d,displayedRegions:f,offsetPx:m}=r,g=f[c],{refName:p,reversed:h}=g,{length:y,max:b,min:S}=n,w=(r.bpToPx({refName:p,coord:h?b:S,regionNumber:c})?.offsetPx??0)-m,C=(u+i)*o,E=y/d;t.fillStyle=a?l.palette.action.disabled:l.palette.action.focus,t.fillRect(w,C,E,o*Mo(n))}const{drawDragPreview:Oo,drawTooltip:_o,getContextMenuItemsForFeature:Bo,onMouseDown:Uo,onMouseLeave:$o,onMouseMove:jo,onMouseUp:Go}=go,Wo={draw:function(e,t,n,a,o){const{selectedFeature:r}=a;for(let r=0;r<Mo(t);r++)Lo(e,t,n+r,n,a,o);r&&Tt(t,r)&&Po(a,e,r)},drawDragPreview:Oo,drawHover:function(e,t){const{hoveredFeature:n}=e;n&&Po(e,t,n.feature)},drawTooltip:_o,getContextMenuItemsForFeature:Bo,getContextMenuItems:function(e,t){const{hoveredFeature:n,session:a}=e,o=[];if(!n)return o;const{featureTypeOntology:r}=a.apolloDataStore.ontologyManager;if(!r)throw new Error("featureTypeOntology is undefined");const l=go.getContextMenuItems(e,t);if(o.push({label:n.feature.type,subMenu:l}),It(t)){const{bp:a,feature:r}=t;for(const t of pt(r,a)){if(t._id===n.feature._id)continue;const a=go.getContextMenuItemsForFeature(e,t);o.push({label:t.type,subMenu:a})}}return o},getFeatureFromLayout:function(e,t,n){return Io(e)[n].find((e=>t>=e.min&&t<=e.max))},getRowCount:Mo,getRowForFeature:function(e,t){const n=Io(e);for(const[e,a]of n.entries())if(a.some((e=>e._id===t._id)))return e},onMouseDown:Uo,onMouseLeave:$o,onMouseMove:jo,onMouseUp:Go},zo=D.observer((function({featureTypes:e,handleClose:t,onUpdate:n,session:a}){const[o,r]=C.useState(""),[l,i]=C.useState(e);return De.default.createElement(Pt,{open:!0,maxWidth:!1,"data-testid":"filter-features-dialog",title:"Filter features by type",handleClose:t},De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,null,"Select the feature types you want to display in the apollo track"),De.default.createElement(s.Grid,{container:!0,spacing:2},De.default.createElement(s.Grid,{size:8},De.default.createElement(hn,{session:a,ontologyName:"Sequence Ontology",style:{width:"100%"},value:o,filterTerms:mn,renderInput:e=>De.default.createElement(s.TextField,{...e,label:"Feature type",variant:"outlined",fullWidth:!0}),onChange:(e,t)=>{t&&r(t)}})),De.default.createElement(s.Grid,{size:4},De.default.createElement(s.Button,{variant:"contained",onClick:()=>{if(o){if(l.includes(o))return;n([...l,o]),i([...l,o])}},disabled:!o,style:{marginTop:9},size:"medium"},"Add"))),l.length>0&&De.default.createElement("div",null,De.default.createElement("hr",null),De.default.createElement("div",{style:{width:300}},De.default.createElement(s.DialogContentText,null,"Selected feature types:"),De.default.createElement(s.Box,{sx:{display:"flex",flexWrap:"wrap",gap:.5}},l.map((e=>De.default.createElement(s.Chip,{key:e,label:e,onDelete:()=>{(e=>{const t=l.filter((t=>t!==e));n(t),i(t)})(e)}}))))))))})),Ho=D.observer((function({model:e,handleClose:t}){const[n,a]=C.useState(`${e.zoomThresholdSetting}`);return De.default.createElement(F.Dialog,{open:!0,onClose:t,title:"Edit zoom threshold setting"},De.default.createElement(s.DialogContent,null,De.default.createElement(s.Typography,null,"The zoom level in base pairs (bp) per pixel at which features are rendered in this Annotations track. Increasing the value will allow features to render when zooming out, but might impact performance."),De.default.createElement(s.TextField,{label:"Threshold value (bpPerPx)",value:n,onChange:e=>{a(e.target.value)}}),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",onClick:()=>{e.setZoomThresholdSetting({zoomThreshold:+n}),t()}},"Submit"),De.default.createElement(s.Button,{variant:"contained",color:"secondary",onClick:()=>{t()}},"Cancel"))))})),Vo=E.makeStyles()((e=>({canvasContainer:{position:"relative",left:0},canvas:{position:"absolute",left:0},center:{display:"flex",justifyContent:"center"},ellipses:{textOverflow:"ellipsis",overflow:"hidden"},avatar:{position:"static",height:"100%",width:"100%",overflow:"visible",color:e.palette.warning.light,backgroundColor:e.palette.warning.contrastText},box:{position:"absolute",overflow:"visible"},badge:{display:"inline-block"},loading:{position:"absolute",right:e.spacing(3),zIndex:10,pointerEvents:"none",textAlign:"right"},locked:{position:"absolute",right:e.spacing(3),top:e.spacing(6),zIndex:1,pointerEvents:"none",textAlign:"right"}})));function Jo(e,t,n){const a=new Map;for(const t of e)(a.get(t.message)??a.set(t.message,[]).get(t.message)).push(t);const o=[];for(const[e,s]of a.entries()){if(0===s.length)continue;s.sort(((e,t)=>e.start-t.start));let a=[s[0]],i=s[0].start,c=s[0].start+t;const u=()=>{const t=a.map((e=>e.start)).sort(((e,t)=>e-t)),n=Math.floor(t.length/2),r=a[0].ids;o.push({_id:a[0]._id,message:e,start:t.length%2?t[n]:(t[n-1]+t[n])/2,count:a.length,members:[...a],range:{min:i,max:c},featureIds:r})};for(let e=1;e<s.length;e++){const o=s[e],d=o.start,f=d+t;r=c,l=d,(n?l<=r:l<r)?(a.push(o),d<i&&(i=d),f>c&&(c=f)):(u(),a=[o],i=d,c=f)}u()}var r,l;return o.sort(((e,t)=>e.message.localeCompare(t.message)||e.start-t.start)),o}function Xo(e,t,n){const a=[];for(let o=e;o<e+t;o++){const e=n.get(o);e&&a.push(e)}return a}function Ko(e,t){for(const n of e)for(const[e,a]of n)if(r.doesIntersect2(t.min,t.max,e,a)||r.doesIntersect2(e,a,t.min,t.max))return!1;return!0}function Zo(e,n){return function(e,n){return function(e,t){const n=function(e,t){return function(e,t){const n=function(e,t){return o.BaseDisplay.named("BaseLinearApolloDisplay").props({type:c.types.literal("LinearApolloDisplay"),configuration:a.ConfigurationReference(t),graphical:!0,table:!1,showCheckResults:!0,zoomThreshold:200,heightPreConfig:c.types.maybe(c.types.refinement("displayHeight",c.types.number,(e=>e>=20))),filteredFeatureTypes:c.types.array(c.types.string),loadingState:!1}).views((e=>{const{configuration:t,renderProps:n}=e;return{renderProps:()=>({...n(),...oe.getParentRenderProps(e),config:t.renderer})}})).volatile((()=>({scrollTop:0}))).views((e=>({get lgv(){return r.getContainingView(e)},get height(){return e.heightPreConfig?e.heightPreConfig:e.graphical&&e.table?400:e.graphical?100:200},get loading(){return e.loadingState},get zoomThresholdSetting(){return e.zoomThreshold??a.getConf(e,"zoomThreshold")}}))).views((e=>({get rendererTypeName(){return e.configuration.renderer.type},get session(){return r.getSession(e)},get regions(){return e.lgv.dynamicBlocks.contentBlocks.map((({assemblyName:e,end:t,refName:n,start:a})=>({assemblyName:e,refName:n,start:Math.round(a),end:Math.round(t)})))},regionCannotBeRendered(){if(e.lgv&&e.lgv.bpPerPx>=e.zoomThreshold)return"Zoom in to see annotations"}}))).views((e=>({get apolloInternetAccount(){const[t]=e.regions,{internetAccounts:n}=c.getRoot(e),{assemblyName:o}=t,{assemblyManager:r}=e.session,l=r.get(o);if(!l)throw new Error(`No assembly found with name ${o}`);const{internetAccountConfigId:s}=a.getConf(l,["sequence","metadata"]);return n.find((e=>a.getConf(e,"internetAccountId")===s))},get changeManager(){return e.session.apolloDataStore.changeManager},getAssemblyId(t){const{assemblyManager:n}=e.session,a=n.get(t);if(!a)throw new Error(`Could not find assembly named ${t}`);return a.name},get selectedFeature(){return e.session.apolloSelectedFeature},get hoveredFeature(){return e.session.apolloHoveredFeature}}))).actions((e=>({setScrollTop(t){e.scrollTop=t},setHeight:t=>(e.heightPreConfig=Math.max(t,20),e.height),resizeHeight(t){const n=e.height;return this.setHeight(e.height+t)-n},showGraphicalOnly(){e.graphical=!0,e.table=!1},showTableOnly(){e.graphical=!1,e.table=!0},showGraphicalAndTable(){e.graphical=!0,e.table=!0},toggleShowCheckResults(){e.showCheckResults=!e.showCheckResults},updateFilteredFeatureTypes(t){e.filteredFeatureTypes=c.cast(t)},setLoading(t){e.loadingState=t},setZoomThresholdSetting({zoomThreshold:t}){e.zoomThreshold=t}}))).views((e=>{const{filteredFeatureTypes:t,trackMenuItems:n}=e;return{trackMenuItems(){const{graphical:a,table:o,showCheckResults:l}=e;return[...n(),{type:"subMenu",label:"Appearance",subMenu:[{label:"Show graphical display",type:"radio",checked:a&&!o,onClick:()=>{e.showGraphicalOnly()}},{label:"Show table display",type:"radio",checked:o&&!a,onClick:()=>{e.showTableOnly()}},{label:"Show both graphical and table display",type:"radio",checked:o&&a,onClick:()=>{e.showGraphicalAndTable()}},{label:"Check Results",type:"checkbox",checked:l,onClick:()=>{e.toggleShowCheckResults()}},{label:"Change zoom threshold",onClick:()=>{r.getSession(e).queueDialog((t=>[Ho,{model:e,handleClose:t}]))}}]},{label:"Filter features by type",onClick:()=>{const n=e.session;e.session.queueDialog((a=>[zo,{session:n,handleClose:()=>{a()},featureTypes:c.getSnapshot(t),onUpdate:t=>{e.updateFilteredFeatureTypes(t)}}]))}}]}}})).actions((e=>({setSelectedFeature(t){e.session.apolloSetSelectedFeature(t)},setHoveredFeature(t){e.session.apolloSetHoveredFeature(t)},showFeatureDetailsWidget(t,n){const[a]=e.regions,{assemblyName:o,refName:r}=a,l=e.getAssemblyId(o);if(!l)return;const{session:s}=e,{changeManager:i}=s.apolloDataStore,[c,u]=n??["ApolloFeatureDetailsWidget","apolloFeatureDetailsWidget"],d=s.addWidget(c,u,{feature:t,assembly:l,refName:r,changeManager:i});s.showWidget(d)},afterAttach(){c.addDisposer(e,i.autorun((()=>{e.lgv.initialized&&!e.regionCannotBeRendered()&&(e.setLoading(!0),e.session.apolloDataStore.loadFeatures(e.regions).then((()=>{setTimeout((()=>{e.setLoading(!1)}),1e3)})))}),{name:"LinearApolloDisplayLoadFeatures",delay:1e3}))}})))}(0,t);return n.named("LinearApolloDisplayLayouts").props({cleanupBoundary:2e5}).volatile((()=>({seenFeatures:i.observable.map()}))).views((e=>({getAnnotationFeatureById:t=>e.seenFeatures.get(t),getGlyph(e){const{topLevelFeature:t}=e;return t.looksLikeGene?Ro:t.children?.size?Wo:go}}))).actions((e=>({addSeenFeature(t){e.seenFeatures.set(t._id,t)},deleteSeenFeature(t){e.seenFeatures.delete(t)}}))).views((e=>({get featureLayouts(){const{assemblyManager:t}=e.session;return e.lgv.displayedRegions.map((n=>{const a=t.get(n.assemblyName),o=new Map,l=new Map,{end:s,refName:i,start:u}=n;for(const[t,n]of e.seenFeatures.entries()){if(!c.isAlive(n)){e.deleteSeenFeature(t);continue}if(i!==a?.getCanonicalRefName(n.refSeq)||!r.doesIntersect2(u,s,n.min,n.max)||e.filteredFeatureTypes.length>0&&!e.filteredFeatureTypes.includes(n.type))continue;const{featureTypeOntology:d}=e.session.apolloDataStore.ontologyManager;if(!d)throw new Error("featureTypeOntology is undefined");const f=e.getGlyph(n).getRowCount(n,d,e.lgv.bpPerPx);let m=0,g=!1;for(;!g;){let e=Xo(m,f,l);if(e.length<f){for(let t=0;t<f-e.length;t++){const e=l.size;l.set(e,[]),o.set(e,[])}e=Xo(m,f,l)}if(Ko(e,n)){for(let e=m;e<m+f;e++){l.get(e)?.push([n.min,n.max]);const t=o.get(e);t?.push([e-m,n._id])}g=!0}else m+=1}}return o}))},getFeatureLayoutPosition(t){const{featureLayouts:n}=this,{featureTypeOntology:a}=e.session.apolloDataStore.ontologyManager;for(const[o,r]of n.entries())for(const[n,l]of r)for(const[r,s]of l){if(0!==r)continue;const l=e.getAnnotationFeatureById(s);if(l){if(t._id===l._id)return{layoutIndex:o,layoutRow:n,featureRow:r};if(l.hasDescendant(t._id)){if(!a)throw new Error("featureTypeOntology is undefined");const r=e.getGlyph(l).getRowForFeature(l,t,a);if(void 0!==r)return{layoutIndex:o,layoutRow:n,featureRow:r}}}}}}))).views((e=>({get highestRow(){return Math.max(0,...e.featureLayouts.map((e=>Math.max(...e.keys()))))}}))).actions((e=>({afterAttach(){c.addDisposer(e,i.autorun((()=>{if(e.lgv.initialized&&!e.regionCannotBeRendered()){for(const[t,n]of e.seenFeatures.entries()){let a=!1;for(const t of e.regions)if(r.doesIntersect2(t.start-e.cleanupBoundary,t.end+e.cleanupBoundary,n.min,n.max)){a=!0;break}a||e.deleteSeenFeature(t)}for(const t of e.regions){const n=e.session.apolloDataStore.assemblies.get(t.assemblyName),a=n?.getByRefName(t.refName),o=a?.features;if(o)for(const[,n]of o)r.doesIntersect2(t.start,t.end,n.min,n.max)&&!e.seenFeatures.has(n._id)&&e.addSeenFeature(n)}}}),{name:"LinearApolloDisplaySetSeenFeatures",delay:1e3}))}})))}(0,t).named("LinearApolloDisplayRendering").props({apolloRowHeight:20,detailsMinHeight:200,detailsHeight:200,lastRowTooltipBufferHeight:40,isShown:!0,filteredTranscripts:c.types.array(c.types.string)}).volatile((()=>({canvas:null,overlayCanvas:null,collaboratorCanvas:null,theme:s.createTheme()}))).views((e=>({get featuresHeight(){return(e.highestRow+1)*e.apolloRowHeight+e.lastRowTooltipBufferHeight}}))).actions((e=>({toggleShown(){e.isShown=!e.isShown},setDetailsHeight(t){e.detailsHeight=e.isShown?Math.max(Math.min(t,e.height-100),Math.min(e.height,e.detailsMinHeight)):t},setCanvas(t){e.canvas=t},setOverlayCanvas(t){e.overlayCanvas=t},setCollaboratorCanvas(t){e.collaboratorCanvas=t},setTheme(t){e.theme=t}}))).actions((e=>({afterAttach(){c.addDisposer(e,i.autorun((()=>{if(!e.lgv.initialized||e.regionCannotBeRendered())return;const t=e.collaboratorCanvas?.getContext("2d");if(t){t.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.featuresHeight);for(const n of e.session.collaborators){const{locations:a}=n;if(0===a.length)continue;let o=0;for(const r of e.lgv.displayedRegions){for(const l of a){if(l.refSeq!==r.refName)continue;const{end:a,refSeq:s,start:i}=l,c=e.lgv.bpToPx({refName:s,coord:i,regionNumber:o});if(!c)continue;const u=c.offsetPx-e.lgv.offsetPx,d=(a-i)/e.lgv.bpPerPx;t.fillStyle="rgba(0,255,0,.2)",t.fillRect(u,1,d,100),t.fillStyle="black",t.fillText(n.name,u+1,11,d-2)}o++}}}}),{name:"LinearApolloDisplayRenderCollaborators"})),c.addDisposer(e,i.autorun((()=>{const{canvas:t,featureLayouts:n,featuresHeight:a,lgv:o}=e;if(!o.initialized||e.regionCannotBeRendered())return;const{displayedRegions:l,dynamicBlocks:s}=o,i=t?.getContext("2d");if(i){i.clearRect(0,0,s.totalWidthPx,a);for(const[t,a]of n.entries()){const n=l[t];for(const[o,l]of a.entries())for(const[a,s]of l){const l=e.getAnnotationFeatureById(s);a>0||!l||r.doesIntersect2(n.start,n.end,l.min,l.max)&&e.getGlyph(l).draw(i,l,o,e,t)}}}}),{name:"LinearApolloDisplayRenderFeatures"}))}})))}(0,t);return n.named("LinearApolloDisplayMouseEvents").volatile((()=>({apolloDragging:null,cursor:void 0}))).views((e=>({getMousePosition(t){const n=Mt(t,e.lgv),{bp:a,regionNumber:o,y:r}=n,l=Math.floor(r/e.apolloRowHeight),s=e.featureLayouts[o].get(l);if(!s)return n;const i=s.find((t=>{const n=e.getAnnotationFeatureById(t[1]);return n&&a>=n.min&&a<=n.max}));if(!i)return n;const[c,u]=i,d=e.getAnnotationFeatureById(u);if(!d)return n;const f=e.getGlyph(d),{featureTypeOntology:m}=e.session.apolloDataStore.ontologyManager;if(!m)throw new Error("featureTypeOntology is undefined");const g=f.getFeatureFromLayout(d,a,c,m);return g?{...n,feature:g}:n}}))).actions((e=>({continueDrag(t,n){if(!e.apolloDragging)throw new Error("continueDrag() called with no current drag in progress");n.stopPropagation(),e.apolloDragging={...e.apolloDragging,current:t}},setDragging(t){e.apolloDragging=t??null}}))).actions((e=>({setCursor(t){e.cursor!==t&&(e.cursor=t)},updateFilteredTranscripts(e){}}))).actions((()=>({onClick(){}})))}(0,n).views((e=>({contextMenuItems(t){const{hoveredFeature:n}=e;if(!n)return[];const a=e.getMousePosition(t),{topLevelFeature:o}=n.feature,r=e.getGlyph(o);return It(a)?r.getContextMenuItems(e,a):[]}}))).actions((e=>({startDrag(t,n,a,o=!1){e.apolloDragging={start:t,current:t,feature:n,edge:a,shrinkParent:o}},endDrag(){if(!e.apolloDragging)throw new Error("endDrag() called with no current drag in progress");const{current:n,edge:a,feature:o,start:r,shrinkParent:l}=e.apolloDragging;if(Math.abs(n.x-r.x)<=4)return e.setDragging(),void e.setCursor();const{displayedRegions:s}=e.lgv,i=e.getAssemblyId(s[r.regionNumber].assemblyName),c=Rt(o,n.bp,a,l),u="max"===a?new t.LocationEndChange({typeName:"LocationEndChange",changedIds:c.map((e=>e.featureId)),changes:c.map((e=>({featureId:e.featureId,oldEnd:e.oldLocation,newEnd:e.newLocation}))),assembly:i}):new t.LocationStartChange({typeName:"LocationStartChange",changedIds:c.map((e=>e.featureId)),changes:c.map((e=>({featureId:e.featureId,oldStart:e.oldLocation,newStart:e.newLocation}))),assembly:i});e.changeManager.submit(u),e.setDragging(),e.setCursor()}}))).actions((e=>({onMouseDown(t){const n=e.getMousePosition(t);It(n)&&e.getGlyph(n.feature).onMouseDown(e,n,t)},onMouseMove(t){const n=e.getMousePosition(t);if(e.apolloDragging)return e.setCursor("col-resize"),void e.continueDrag(n,t);It(n)?e.getGlyph(n.feature).onMouseMove(e,n,t):(e.setHoveredFeature(),e.setCursor())},onMouseLeave(t){e.setDragging(),e.setHoveredFeature();const n=e.getMousePosition(t);It(n)&&e.getGlyph(n.feature).onMouseLeave(e,n,t)},onMouseUp(t){const n=e.getMousePosition(t);It(n)?e.getGlyph(n.feature).onMouseUp(e,n,t):e.setSelectedFeature(),e.apolloDragging&&e.endDrag()}}))).actions((e=>({afterAttach(){c.addDisposer(e,i.autorun((()=>{if(!e.lgv.initialized||e.regionCannotBeRendered())return;const t=e.overlayCanvas?.getContext("2d");if(!t)return;t.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.featuresHeight);const{apolloDragging:n,hoveredFeature:a}=e;if(!a)return;const o=e.getGlyph(a.feature);o.drawHover(e,t),o.drawTooltip(e,t),n&&e.getGlyph(n.feature.topLevelFeature).drawDragPreview(e,t)}),{name:"LinearApolloDisplayRenderMouseoverAndDrag"}))}})))}(0,n).props({tabularEditor:c.types.optional(co,{})}).named("LinearApolloDisplay")}const Yo=a.ConfigurationSchema("LinearApolloReferenceSequenceDisplay",{},{explicitIdentifier:"displayId",explicitlyTyped:!0});function Qo(e,t){const n=t<=1?2:0;switch(e){case 3:return 0;case 2:return 1;case 1:return 2;case-1:return 3+n;case-2:return 4+n;case-3:return 5+n}}function er(e,t,n,a){return a.offsetPx-n+(a.reversed?a.end-e.max:e.min-a.start)/t}function tr(e,t,n,a,o,r,l=!1){e.fillStyle=l?r.palette.action.disabled:r.palette.action.focus,e.fillRect(t,n,a,o),e.strokeStyle=l?r.palette.text.secondary:r.palette.text.primary,e.strokeStyle=r.palette.text.primary,e.strokeRect(t,n,a,o)}function nr(e,t,n,a,o,r,l,s=!1){const i=function(e,t){if(!(t>1||void 0===e))return 1===e?3:4}(t.strand,n);i&&tr(e,er(t,n,a,r),i*o,t.length/n,o,l,s)}function ar(e,t,n,a,o,l,s,i=!1){const c=t.parent;if(!c)return;const u=c.cdsLocations.find((e=>{const n=e.at(1===t.strand?0:-1)?.min,a=e.at(1===t.strand?-1:0)?.max;return t.min===n&&t.max===a}));if(u)for(const c of u){const u=Qo(r.getFrame(c.min,c.max,t.strand??1,c.phase),n);tr(e,er(c,n,a,l),u*o,(c.max-c.min)/n,o,s,i)}}function or(e,t){const n=e.toUpperCase();return"A"===n||"C"===n||"G"===n||"T"===n?t.palette.bases[n].main.toString():"lightgray"}function rr(e,t,n){return"M"===e?t.palette.startCodon:"*"===e?n?t.palette.text.primary:t.palette.stopCodon:void 0}function lr(e,t,n,a,o){const r=Math.min(a,10);e.fillStyle="#000",e.font=`${r}px`;const l=e.measureText(o).width;e.fillText(o,t+(a-l)/2,n+10)}function sr(e,t,n,a,o,l,s){const i=1/o;if(i<1)return;const c=a+n/o,u=[-1,1];for(const n of u){const a=(1===n?3:4)*l,u=1===n?t:r.revcom(t);e.fillStyle=or(u,s),e.fillRect(c,a,i,l),1/o>=12&&(e.strokeStyle=s.palette.text.disabled,e.strokeRect(c,a,i,l),lr(e,c,a,i,u))}}function ir(e,t,n,a,o,l,s,i,c,u,d){const f=(s<=1?[0,2,1,0,7,6,5]:[0,2,1,0,5,4,3]).map((e=>e*c)),m=[-1,1];for(const g of m){const m=r.getFrame(i,i+3,g,0),p=f.at(m);if(void 0===p)continue;const h=Math.round(n+a/s),y=Math.round(3/s),b=1===g?t:r.revcom(t),S=r.defaultCodonTable[b],w=rr(S,o,l);w&&(d&&"*"==S||u&&"*"!=S)&&(e.fillStyle=w,e.fillRect(h,p,y,c)),1/s>=4&&(e.strokeStyle=o.palette.text.disabled,e.strokeRect(h,p,y,c),lr(e,h,p,y,S))}}function cr(e,t){return function(e,t){const n=function(e,t){return o.BaseDisplay.named("BaseLinearApolloReferenceSequenceDisplay").props({type:c.types.literal("LinearApolloReferenceSequenceDisplay"),configuration:a.ConfigurationReference(t),showStartCodons:!1,showStopCodons:!0,highContrast:!1,heightPreConfig:c.types.maybe(c.types.refinement("displayHeight",c.types.number,(e=>e>=20))),sequenceRowHeight:15}).views((e=>{const{configuration:t,renderProps:n}=e;return{renderProps:()=>({...n(),...oe.getParentRenderProps(e),config:t.renderer})}})).views((e=>({get lgv(){return r.getContainingView(e)}}))).views((e=>({get rendererTypeName(){return e.configuration.renderer.type},get session(){return r.getSession(e)},get regions(){return e.lgv.dynamicBlocks.contentBlocks.map((({assemblyName:e,end:t,refName:n,start:a})=>({assemblyName:e,refName:n,start:Math.round(a),end:Math.round(t)})))},regionCannotBeRendered(){if(e.lgv&&e.lgv.bpPerPx>=3)return"Zoom in to see sequence"}}))).views((e=>({get apolloInternetAccount(){const[t]=e.regions,{internetAccounts:n}=c.getRoot(e),{assemblyName:o}=t,{assemblyManager:r}=e.session,l=r.get(o);if(!l)throw new Error(`No assembly found with name ${o}`);const{internetAccountConfigId:s}=a.getConf(l,["sequence","metadata"]);return n.find((e=>a.getConf(e,"internetAccountId")===s))},get changeManager(){return e.session.apolloDataStore.changeManager},getAssemblyId(t){const{assemblyManager:n}=e.session,a=n.get(t);if(!a)throw new Error(`Could not find assembly named ${t}`);return a.name},get selectedFeature(){return e.session.apolloSelectedFeature},get hoveredFeature(){return e.session.apolloHoveredFeature},get height(){const{sequenceRowHeight:t}=e;return e.lgv.bpPerPx<=1?8*t:6*t}}))).volatile((()=>({scrollTop:0}))).actions((e=>({setScrollTop(t){e.scrollTop=t},setHeight:t=>(e.heightPreConfig=Math.max(t,20),e.height),resizeHeight(t){const n=e.height;return this.setHeight(e.height+t)-n},toggleShowStartCodons(){e.showStartCodons=!e.showStartCodons},toggleShowStopCodons(){e.showStopCodons=!e.showStopCodons},toggleHighContrast(){e.highContrast=!e.highContrast}}))).views((e=>{const{trackMenuItems:t}=e;return{trackMenuItems(){const{showStartCodons:n,showStopCodons:a,highContrast:o}=e;return[...t(),{type:"subMenu",label:"Appearance",subMenu:[{label:"Show start codons",type:"checkbox",checked:n,onClick:()=>{e.toggleShowStartCodons()}},{label:"Show stop codons",type:"checkbox",checked:a,onClick:()=>{e.toggleShowStopCodons()}},{label:"Use high contrast colors",type:"checkbox",checked:o,onClick:()=>{e.toggleHighContrast()}}]}]}}})).actions((e=>({afterAttach(){c.addDisposer(e,i.autorun((()=>{e.lgv.initialized&&!e.regionCannotBeRendered()&&e.lgv.bpPerPx<=3&&e.session.apolloDataStore.loadRefSeq(e.regions)}),{name:"LinearApolloReferenceSequenceDisplayLoadFeatures",delay:1e3}))}})))}(0,t);return n.named("LinearApolloReferenceSequenceDisplayRendering").volatile((()=>({seqTrackCanvas:null,seqTrackOverlayCanvas:null,theme:s.createTheme()}))).actions((e=>({setSeqTrackCanvas(t){e.seqTrackCanvas=t},setSeqTrackOverlayCanvas(t){e.seqTrackOverlayCanvas=t},setTheme(t){e.theme=t},afterAttach(){c.addDisposer(e,i.autorun((()=>{const{lgv:t,seqTrackCanvas:n,theme:a,highContrast:o,showStartCodons:r,showStopCodons:l,sequenceRowHeight:s,session:i}=e;if(!t.initialized||e.regionCannotBeRendered()||!n)return;if(3/t.bpPerPx<1)return;const{bpPerPx:c,offsetPx:u,dynamicBlocks:d}=t;!function(e,t,n,a,o,r,l,s,i,c){const u=e.getContext("2d");if(!u)return;u.clearRect(0,0,e.width,e.height),function(e,t,n,a,o,r,l){const s=n<=1?[3,2,1,0,0,-1,-2,-3]:[3,2,1,-1,-2,-3];for(const[e,n]of s.entries()){const s=a.palette.framesCDS.at(n)?.main;if(!s)continue;const i=e*l,{offsetPx:c}=o,u=Math.max(0,-c),d=o.totalWidthPx;t.fillStyle=r?a.palette.background.default:s,t.fillRect(u,i,d,l),r&&(t.strokeStyle=a.palette.grey[200],t.strokeRect(u,i,d,l))}for(const n of o.getBlocks())"InterRegionPaddingBlock"===n.type&&t.clearRect(n.offsetPx-o.offsetPx,0,n.widthPx,e.height)}(e,u,n,t,o,r,i);const{apolloDataStore:d}=c;for(const e of o.contentBlocks){const o=d.assemblies.get(e.assemblyName),c=o?.getByRefName(e.refName),f=Math.floor(e.start),m=Math.ceil(e.end);let g=c?.getSequence(f,m);if(!g)return;g=g.toUpperCase();const p=Math.round(e.offsetPx-a-(e.start-f)/n);for(let e=0;e<g.length;e++){const a=f+e,o=g.slice(e,e+3);sr(u,g[e],e,p,n,i,t),3===o.length&&ir(u,o,p,e,t,r,n,a,i,l,s)}}}(n,a,c,u,d,o,r,l,s,i)}),{name:"LinearApolloReferenceSequenceDisplayRenderSequence"})),c.addDisposer(e,i.autorun((()=>{const{seqTrackOverlayCanvas:t}=e;if(!e.lgv.initialized||e.regionCannotBeRendered()||!t)return;const n=t.getContext("2d");if(!n)return;n.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.height);const{hoveredFeature:a,selectedFeature:o,lgv:r,sequenceRowHeight:l,session:s,theme:i}=e;if(!a&&!o)return;const{bpPerPx:c,dynamicBlocks:u,offsetPx:d}=r;!function(e,t,n,a,o,r,l,s,i,c){const{featureTypeOntology:u}=l.apolloDataStore.ontologyManager;if(!u)throw new Error("featureTypeOntology is undefined");for(const l of c.contentBlocks){t.save(),t.beginPath(),t.rect(l.offsetPx-i,0,l.widthPx,e.height),t.clip();for(const e of[a,n?.feature].filter((e=>void 0!==e)))u.isTypeOf(e.type,"CDS")?ar(t,e,s,i,o,l,r,!0):nr(t,e,s,i,o,l,r,!0);t.restore()}}(t,n,a,o,l,i,s,c,d,u)}),{name:"LinearApolloReferenceSequenceDisplayRenderSequenceHighlight"}))}})))}(0,t).named("LinearApolloReferenceSequenceDisplay")}const ur=D.observer((function(e){const t=s.useTheme(),{model:n}=e,{height:a,regionCannotBeRendered:o,setSeqTrackCanvas:l,setSeqTrackOverlayCanvas:i,setTheme:c}=n,{classes:u}=Vo();C.useEffect((()=>{c(t)}),[t,c]);const d=r.getContainingView(n),f=o();return f?De.default.createElement(s.Alert,{severity:"warning",classes:{message:u.ellipses},slotProps:{root:{className:u.center}}},De.default.createElement(s.Tooltip,{title:f},De.default.createElement("div",null,f))):De.default.createElement(De.default.Fragment,null,3/d.bpPerPx>=1?De.default.createElement("div",{className:u.canvasContainer,style:{width:d.dynamicBlocks.totalWidthPx,height:a}},De.default.createElement("canvas",{ref:async e=>{await Promise.resolve(),l(e)},width:d.dynamicBlocks.totalWidthPx,height:a,className:u.canvas,"data-testid":"seqTrackCanvas"}),De.default.createElement("canvas",{ref:async e=>{await Promise.resolve(),i(e)},width:d.dynamicBlocks.totalWidthPx,height:a,className:u.canvas,"data-testid":"seqTrackOverlayCanvas"})):null)})),dr=a.ConfigurationSchema("LinearApolloSixFrameDisplay",{},{explicitIdentifier:"displayId",explicitlyTyped:!0}),fr=D.observer((function({sourceFeature:e,filteredTranscripts:t,handleClose:n,onUpdate:a}){const o=[];if(e.children)for(const[,t]of e.children){const e=t.attributes.get("gff_id")?.toString();e&&o.push(e)}const[r,l]=C.useState(t);return De.default.createElement(Pt,{open:!0,maxWidth:!1,"data-testid":"filter-transcripts-dialog",title:"Filter transcripts by ID",handleClose:n},De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,null,"Select the alternate transcripts you want to display in the apollo track"),De.default.createElement(s.Grid,{container:!0,spacing:2},De.default.createElement(s.Grid,{size:8},De.default.createElement(s.FormGroup,null,o.map((e=>De.default.createElement(s.FormControlLabel,{control:De.default.createElement(s.Checkbox,{checked:!r.includes(e),onChange:()=>{(e=>{const t=r.includes(e)?r.filter((t=>t!==e)):[...r,e];a(t),l(t)})(e)},slotProps:{input:{"aria-label":"controlled"}}}),label:e}))))))))}));let mr=null,gr=null,pr=null,hr=null;const yr=globalThis.document.createElement("canvas");if(yr?.getContext)for(const e of["forward","backward"])for(const t of["light","dark"]){const n=document.createElement("canvas"),a=10;n.width=n.height=a;const o=n.getContext("2d");if(o){const r="light"===t?"rgba(0,0,0,0)":"rgba(0,0,0,0.75)",l="light"===t?"rgba(255,255,255,0.25)":"rgba(0,0,0,0.50)",s="forward"===e?o.createLinearGradient(0,a,a,0):o.createLinearGradient(0,0,a,a);s.addColorStop(0,r),s.addColorStop(.25,r),s.addColorStop(.25,l),s.addColorStop(.5,l),s.addColorStop(.5,r),s.addColorStop(.75,r),s.addColorStop(.75,l),s.addColorStop(1,l),o.fillStyle=s,o.fillRect(0,0,10,10),"forward"===e?"light"===t?mr=o.createPattern(n,"repeat"):pr=o.createPattern(n,"repeat"):"light"===t?gr=o.createPattern(n,"repeat"):hr=o.createPattern(n,"repeat")}}function br(e,t){for(const n of e)if(Le.default(n,t))return!0;return!1}function Sr(e,t,n){const{filteredTranscripts:a,session:o}=n,{apolloDataStore:l}=o,{featureTypeOntology:s}=l.ontologyManager;if(!s)throw new Error("featureTypeOntology is undefined");const i=s.isTypeOf(t.type,"transcript"),c=t.attributes.get("gff_id")?.toString();if(c&&a.includes(c))return;const{bp:u,refName:d,regionNumber:f,x:m}=e,{lgv:g}=n;if(i){const e=t;if(!e.children)return;const n=[],a=[];for(const t of e.children.values()){const e=s.isTypeOf(t.type,"exon"),o=s.isTypeOf(t.type,"CDS");e?n.push(t):o&&a.push(t)}const o=n.find((e=>{const[t,n]=r.intersection2(u,u+1,e.min,e.max);return void 0!==t&&void 0!==n}));if(o){const e=Et(o,d,f,g);if(e){const t=vt(o,m,e);if(t)return t}}for(const t of e.cdsLocations)for(const e of t){const t=Et(e,d,f,g);if(t){const e=a.find((e=>{const[t,n]=r.intersection2(u,u+1,e.min,e.max);return void 0!==t&&void 0!==n}));if(e){const n=vt(e,m,t);if(n)return n}}}}}const wr={draw:function(e,t,n,a,o){const{apolloRowHeight:l,lgv:i,session:c,theme:u,highestRow:d,filteredTranscripts:f,selectedFeature:m,showFeatureLabels:g}=a,{bpPerPx:p,displayedRegions:h,offsetPx:y}=i,b=h[o],{refName:S,reversed:w}=b,C=l,E=C,v=C,x=C,T=g?2:1,A=u.palette.text.primary,{attributes:F,children:k,min:D,strand:N}=t;if(!k)return;const{apolloDataStore:R}=c,{featureTypeOntology:I}=R.ontologyManager;if(!I)throw new Error("featureTypeOntology is undefined");const M=[],L=(i.bpToPx({refName:S,coord:D,regionNumber:o})?.offsetPx??0)-y,q=t.length/p,P=w?L-q:L,O=(1==N?3:4)*T*C;e.fillStyle=u.palette.text.primary,e.fillRect(P,O,q,x),e.fillStyle=xt(t,m)?s.alpha("rgb(0,0,0)",.7):s.alpha(u.palette.background.paper,.7),e.fillRect(P+1,O+1,q-2,x-2);const _=xt(t,m),B={x:P,y:O,h:x,text:F.get("gff_id")?.toString(),color:A,isSelected:_};_?M.unshift(B):M.push(B);const U="dark"===u.palette.mode?pr:mr,$="dark"===u.palette.mode?hr:gr,j=w?-1:1;let G=null,W=null;N&&([G,W]=N*j==1?[U,$]:[$,U]),G&&W&&(e.fillStyle=G,e.fillRect(P+1,O+1,q-2,(x-2)/2),e.fillStyle=W,e.fillRect(P+1,O+(x-2)/2,q-2,(x-2)/2));const z=new Set;for(const[,t]of k){if(!I.isTypeOf(t.type,"transcript")&&!I.isTypeOf(t.type,"pseudogenic_transcript"))continue;const{children:n,cdsLocations:a}=t;if(!n)continue;const l=t.attributes.get("gff_id")?.toString();if(l&&f.includes(l))continue;for(const[,t]of n){if(!I.isTypeOf(t.type,"exon"))continue;const n=(i.bpToPx({refName:S,coord:t.min,regionNumber:o})?.offsetPx??0)-y,a=t.length/p,r=w?n-a:n,l=O+(x-E)/2,c=xt(t,m);if(e.fillStyle=u.palette.text.primary,e.fillRect(r,l,a,E),a>2){e.clearRect(r+1,l+1,a-2,E-2),e.fillStyle=c?"rgb(0,0,0)":s.alpha("#f5f500",.6),e.fillRect(r+1,l+1,a-2,E-2),G&&W&&(e.fillStyle=G,e.fillRect(r+1,l+1,a-2,(E-2)/2),e.fillStyle=W,e.fillRect(r+1,l+1+(E-2)/2,a-2,(E-2)/2));const n={x:r,y:l,h:E,text:t.attributes.get("gff_id")?.toString(),color:A,isSelected:c};c?M.unshift(n):M.push(n)}}const c=xt(t,m?.parent);let g=0,h=0;for(const n of a){let a=0,l=0,s=1;for(const f of n.sort(((e,t)=>e.max-t.max)))if(m&&c&&I.isTypeOf(m.type,"CDS")||!br(z,f)){const n=(f.max-f.min)/p,b=(i.bpToPx({refName:S,coord:f.min,regionNumber:o})?.offsetPx??0)-y;g=w?b-n:b,e.fillStyle=u.palette.text.primary;const E=r.getFrame(f.min,f.max,t.strand??1,f.phase);if(h=((E<0?-1*E+5:E)*T-T)*C,e.fillRect(g,h,n,v),s>1){const t=[(g-l)/2+l,Math.max(E<0?C*T*d+1:1,Math.min(a,h)-C/2)];e.strokeStyle="rgb(0, 128, 128)",e.beginPath(),e.moveTo(l,a),e.lineTo(...t),e.stroke(),e.moveTo(...t),e.lineTo(g,h+C/2),e.stroke()}if(l=g+n,a=h+C/2,s+=1,n>2){e.clearRect(g+1,h+1,n-2,v-2);const t=u.palette.framesCDS.at(E)?.main,a=t??"rgb(171,71,188)";e.fillStyle=a,e.fillStyle=m&&c&&I.isTypeOf(m.type,"CDS")?"rgb(0,0,0)":a,e.fillRect(g+1,h+1,n-2,v-2),G&&W&&(e.fillStyle=G,e.fillRect(g+1,h+1,n-2,(v-2)/2),e.fillStyle=W,e.fillRect(g+1,h+(v-2)/2,n-2,(v-2)/2))}z.add(f)}}const b={x:g,y:h,h:v,text:t.attributes.get("gff_id")?.toString(),color:A,isSelected:c};c?M.unshift(b):M.push(b)}g&&function(e,t,n="10px sans-serif"){for(let a=t.length-1;a>=0;--a){const o=t[a];e.fillStyle=o.color;const l=o.x+1,s=o.y+o.h,i=r.measureText(o.text,10);o.isSelected&&(e.font="bold ".concat(n)),o.text&&(e.clearRect(l-5,s,i+10,o.h),e.fillText(o.text,l,s+11,i),e.font=n)}}(e,M)},drawDragPreview:function(e,t){const{apolloDragging:n,apolloRowHeight:a,lgv:o,theme:r}=e,{bpPerPx:l,displayedRegions:i,offsetPx:c}=o;if(!n)return;const{current:u,edge:d,feature:f,start:m}=n,g=Math.floor(m.y/a),p=i[m.regionNumber],h=(p.reversed?p.end-f[d]:f[d]-p.start)/l-c,y=Math.min(u.x,h),b=g*a,S=Math.abs(u.x-h),w=1*a;t.strokeStyle=r.palette.info.main,t.setLineDash([6]),t.strokeRect(y,b,S,w),t.fillStyle=s.alpha(r.palette.info.main,.2),t.fillRect(y,b,S,w)},drawHover:function(e,t){const{hoveredFeature:n,apolloRowHeight:a,filteredTranscripts:o,lgv:l,highestRow:s,session:i,showFeatureLabels:c}=e;if(!n)return;const{feature:u}=n,{apolloDataStore:d}=i,{featureTypeOntology:f}=d.ontologyManager;if(!f)throw new Error("featureTypeOntology is undefined");if(!f.isTypeOf(u.type,"transcript"))return;const m=u.attributes.get("gff_id")?.toString();if(m&&o.includes(m))return;const g=e.getFeatureLayoutPosition(u);if(!g)return;const{bpPerPx:p,displayedRegions:h,offsetPx:y}=l,{layoutIndex:b}=g,S=h[b],{refName:w,reversed:C}=S,E=a,v=E,x=c?2:1,{cdsLocations:T,strand:A}=u;for(const e of T){let n=0,a=0,o=1;for(const i of e.sort(((e,t)=>e.max-t.max))){const e=(i.max-i.min)/p,c=(l.bpToPx({refName:w,coord:i.min,regionNumber:b})?.offsetPx??0)-y,u=C?c-e:c,d=r.getFrame(i.min,i.max,A??1,i.phase),f=((d<0?-1*d+5:d)*x-x)*E;if(o>1){const e=[(u-a)/2+a,Math.max(d<0?E*x*s+1:1,Math.min(n,f)-E/2)];t.strokeStyle="rgb(0, 0, 0)",t.lineWidth=2,t.beginPath(),t.moveTo(a,n),t.lineTo(...e),t.stroke(),t.moveTo(...e),t.lineTo(u,f+E/2),t.stroke()}a=u+e,n=f+E/2,o+=1,e>2&&(t.fillStyle="rgba(255,0,0,0.6)",t.fillRect(u,f,e,v))}}},drawTooltip:function(e,t){const{hoveredFeature:n,apolloRowHeight:a,filteredTranscripts:o,lgv:l,session:i,showFeatureLabels:c,theme:u}=e;if(!n)return;const{feature:d,bp:f}=n,{featureTypeOntology:m}=i.apolloDataStore.ontologyManager;if(!m)throw new Error("featureTypeOntology is undefined");if(!m.isTypeOf(d.type,"transcript"))return;const{attributes:g,strand:p,type:h}=d,y=e.getFeatureLayoutPosition(d);if(!y)return;const b=g.get("gff_id")?.toString();if(b&&o.includes(b))return;const{layoutIndex:S}=y,{bpPerPx:w,displayedRegions:C,offsetPx:E}=l,v=C[S],{refName:x,reversed:T}=v,A=a,F=Math.round(.7*A),k=c?2:1;let D,N="Loc: ";for(const e of d.cdsLocations)for(const t of e)if(f>=t.min&&f<=t.max){D=t;break}if(!D)return;const{max:R,min:I,phase:M}=D;N+=`${I+1}–${R}`;let L=(l.bpToPx({refName:x,coord:T?R:I,regionNumber:S})?.offsetPx??0)-E;const q=r.getFrame(I,R,p??1,M),P=((q<0?-1*q+5:q)*k-k)*A+(A-F)/2,O=(R-I)/w,_=`Type: ${D.type}`,B=g.get("gff_name")?.find((e=>""!==e)),U=[t.measureText(_).width,t.measureText(N).width];B&&U.push(t.measureText(`Parent Type: ${h}`).width,t.measureText(`Parent Name: ${B}`).width);const $=Math.max(...U);L=L+O+5,t.fillStyle=s.alpha(u.palette.text.primary,.7),t.fillRect(L,P,$+4,4===U.length?55:35),t.beginPath(),t.moveTo(L,P),t.lineTo(L-5,P+5),t.lineTo(L,P+10),t.fill(),t.fillStyle=u.palette.background.default;let j=P+12;t.fillText(_,L+2,j),B&&(j+=12,t.fillText(`Parent Type: ${h}`,L+2,j),j+=12,t.fillText(`Parent Name: ${B}`,L+2,j)),j+=12,t.fillText(N,L+2,j)},getContextMenuItems:function(e,t){const{apolloInternetAccount:n,hoveredFeature:a,changeManager:o,filteredTranscripts:l,regions:s,selectedFeature:i,session:u}=e,[d]=s,f=e.getAssemblyId(d.assemblyName),m=[],g="admin"===(n?n.role:"admin");if(!a)return m;const{featureTypeOntology:p}=u.apolloDataStore.ontologyManager;if(!p)throw new Error("featureTypeOntology is undefined");if(It(t)){const{bp:n,feature:a}=t;let s=pt(a,n);St(a,u)&&(s=pt(a,n,!0));for(const n of s){const a=n.attributes.get("gff_id")?.toString();if(a&&l.includes(a))continue;const s=Ft(e,n);if(bt(n,u)){const a=wt(n,e,t,u),l=r.getContainingView(e);if(a.upstream){const t=a.upstream;s.push({label:"Go to upstream exon",icon:Ct(n.strand,!0,l.displayedRegions.at(0)?.reversed),onClick:()=>{l.navTo(kt(t,.1,l.totalBp)),ht(e,t)}})}if(a.downstream){const t=a.downstream;s.push({label:"Go to downstream exon",icon:Ct(n.strand,!1,l.displayedRegions.at(0)?.reversed),onClick:()=>{l.navTo(kt(t,.1,l.totalBp)),ht(e,t)}})}s.push({label:"Merge exons",disabled:!g,onClick:()=>{u.queueDialog((t=>[Pn,{session:u,handleClose:()=>{t()},changeManager:o,sourceFeature:n,sourceAssemblyId:f,selectedFeature:i,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}},{label:"Split exon",disabled:!g,onClick:()=>{u.queueDialog((t=>[Vn,{session:u,handleClose:()=>{t()},changeManager:o,sourceFeature:n,sourceAssemblyId:f,selectedFeature:i,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}})}p.isTypeOf(n.type,"gene")&&s.push({label:"Filter alternate transcripts",onClick:()=>{u.queueDialog((t=>[fr,{handleClose:()=>{t()},sourceFeature:n,filteredTranscripts:c.getSnapshot(l),onUpdate:t=>{e.updateFilteredTranscripts(t)}}]))}}),m.push({label:n.type,subMenu:s})}}return m},getContextMenuItemsForFeature:Ft,onMouseDown:function(e,t,n){const{feature:a}=t,o=Sr(t,a,e);o&&(n.stopPropagation(),e.startDrag(t,o.feature,o.edge,!0))},onMouseLeave:function(){},onMouseMove:function(e,t){if(It(t)){const{feature:n,bp:a}=t;if(e.setHoveredFeature({feature:n,bp:a}),Sr(t,n,e))return void e.setCursor("col-resize")}e.setCursor()},onMouseUp:function(e,t){if(!e.apolloDragging&&It(t)){const{feature:n}=t,{session:a}=e,{apolloDataStore:o}=a,{featureTypeOntology:r}=o.ontologyManager;if(e.setSelectedFeature(n),!r)throw new Error("featureTypeOntology is undefined");let l=!1;for(const[,e]of n.children??[])if(r.isTypeOf(e.type,"CDS")||r.isTypeOf(e.type,"exon")){l=!0;break}(r.isTypeOf(n.type,"transcript")||r.isTypeOf(n.type,"pseudogenic_transcript"))&&l?e.showFeatureDetailsWidget(n,["ApolloTranscriptDetails","apolloTranscriptDetails"]):e.showFeatureDetailsWidget(n)}}};function Cr(e,n){return function(e,n){return function(e,t){const n=function(e,t){return function(e,t){const n=function(e,t){return o.BaseDisplay.named("BaseLinearApolloSixFrameDisplay").props({type:c.types.literal("LinearApolloSixFrameDisplay"),configuration:a.ConfigurationReference(t),graphical:!0,table:!1,showFeatureLabels:!0,showCheckResults:!0,zoomThreshold:200,heightPreConfig:c.types.maybe(c.types.refinement("displayHeight",c.types.number,(e=>e>=20))),filteredFeatureTypes:c.types.array(c.types.string)}).views((e=>{const{configuration:t,renderProps:n}=e;return{renderProps:()=>({...n(),...oe.getParentRenderProps(e),config:t.renderer})}})).volatile((()=>({scrollTop:0}))).views((e=>({get lgv(){return r.getContainingView(e)},get height(){return e.heightPreConfig?e.heightPreConfig:e.graphical&&e.table?500:e.graphical?e.showFeatureLabels?400:200:300},get zoomThresholdSetting(){return e.zoomThreshold??a.getConf(e,"zoomThreshold")}}))).views((e=>({get rendererTypeName(){return e.configuration.renderer.type},get session(){return r.getSession(e)},get regions(){return e.lgv.dynamicBlocks.contentBlocks.map((({assemblyName:e,end:t,refName:n,start:a})=>({assemblyName:e,refName:n,start:Math.round(a),end:Math.round(t)})))},regionCannotBeRendered(){if(e.lgv&&e.lgv.bpPerPx>=e.zoomThreshold)return"Zoom in to see annotations"}}))).views((e=>({get apolloInternetAccount(){const[t]=e.regions,{internetAccounts:n}=c.getRoot(e),{assemblyName:o}=t,{assemblyManager:r}=e.session,l=r.get(o);if(!l)throw new Error(`No assembly found with name ${o}`);const{internetAccountConfigId:s}=a.getConf(l,["sequence","metadata"]);return n.find((e=>a.getConf(e,"internetAccountId")===s))},get changeManager(){return e.session.apolloDataStore.changeManager},getAssemblyId(t){const{assemblyManager:n}=e.session,a=n.get(t);if(!a)throw new Error(`Could not find assembly named ${t}`);return a.name},get selectedFeature(){return e.session.apolloSelectedFeature},get hoveredFeature(){return e.session.apolloHoveredFeature}}))).actions((e=>({setScrollTop(t){e.scrollTop=t},setHeight:t=>(e.heightPreConfig=Math.max(t,20),e.height),resizeHeight(t){const n=e.height;return this.setHeight(e.height+t)-n},showGraphicalOnly(){e.graphical=!0,e.table=!1},showTableOnly(){e.graphical=!1,e.table=!0},showGraphicalAndTable(){e.graphical=!0,e.table=!0},toggleShowFeatureLabels(){e.showFeatureLabels=!e.showFeatureLabels},toggleShowCheckResults(){e.showCheckResults=!e.showCheckResults},updateFilteredFeatureTypes(t){e.filteredFeatureTypes=c.cast(t)},setZoomThresholdSetting({zoomThreshold:t}){e.zoomThreshold=t}}))).views((e=>{const{filteredFeatureTypes:t,trackMenuItems:n}=e;return{trackMenuItems(){const{graphical:a,table:o,showFeatureLabels:l,showCheckResults:s}=e;return[...n(),{type:"subMenu",label:"Appearance",subMenu:[{label:"Show graphical display",type:"radio",checked:a&&!o,onClick:()=>{e.showGraphicalOnly()}},{label:"Show table display",type:"radio",checked:o&&!a,onClick:()=>{e.showTableOnly()}},{label:"Show both graphical and table display",type:"radio",checked:o&&a,onClick:()=>{e.showGraphicalAndTable()}},{label:"Feature Labels",type:"checkbox",checked:l,onClick:()=>{e.toggleShowFeatureLabels()}},{label:"Check Results",type:"checkbox",checked:s,onClick:()=>{e.toggleShowCheckResults()}},{label:"Change zoom threshold",onClick:()=>{r.getSession(e).queueDialog((t=>[Ho,{model:e,handleClose:t}]))}}]},{label:"Filter features by type",onClick:()=>{const n=e.session;e.session.queueDialog((a=>[zo,{session:n,handleClose:()=>{a()},featureTypes:c.getSnapshot(t),onUpdate:t=>{e.updateFilteredFeatureTypes(t)}}]))}}]}}})).actions((e=>({setSelectedFeature(t){e.session.apolloSetSelectedFeature(t)},setHoveredFeature(t){e.session.apolloSetHoveredFeature(t)},showFeatureDetailsWidget(t,n){const[a]=e.regions,{assemblyName:o,refName:r}=a,l=e.getAssemblyId(o);if(!l)return;const{session:s}=e,{changeManager:i}=s.apolloDataStore,[c,u]=n??["ApolloFeatureDetailsWidget","apolloFeatureDetailsWidget"],d=s.addWidget(c,u,{feature:t,assembly:l,refName:r,changeManager:i});s.showWidget(d)},afterAttach(){c.addDisposer(e,i.autorun((()=>{e.lgv.initialized&&!e.regionCannotBeRendered()&&(e.session.apolloDataStore.loadFeatures(e.regions),e.lgv.bpPerPx<=3&&e.session.apolloDataStore.loadRefSeq(e.regions))}),{name:"LinearApolloSixFrameDisplayLoadFeatures",delay:1e3}))}})))}(0,t);return n.named("LinearApolloSixFrameDisplayLayouts").props({featuresMinMaxLimit:5e5}).volatile((()=>({seenFeatures:i.observable.map()}))).views((e=>({get featuresMinMax(){const{assemblyManager:t}=e.session;return e.lgv.displayedRegions.map((n=>{const a=t.get(n.assemblyName);let o,l;const{end:s,refName:i,start:c}=n;for(const[,t]of e.seenFeatures)i!==a?.getCanonicalRefName(t.refSeq)||!r.doesIntersect2(c,s,t.min,t.max)||t.length>e.featuresMinMaxLimit||(void 0===o&&({min:o}=t),void 0===l&&({max:l}=t),t.minWithChildren<o&&({min:o}=t),t.maxWithChildren>l&&({max:l}=t));if(void 0!==o&&void 0!==l)return[o,l]}))},getGlyph:e=>wr,featureLabelSpacer:t=>e.showFeatureLabels?2*t-1:t}))).actions((e=>({addSeenFeature(t){e.seenFeatures.set(t._id,t)},deleteSeenFeature(t){e.seenFeatures.delete(t)}}))).views((e=>({get geneTrackRowNums(){return[4,5].map((t=>e.featureLabelSpacer(t)))}}))).views((e=>({get featureLayouts(){const{assemblyManager:t}=e.session;return e.lgv.displayedRegions.map(((n,a)=>{const o=t.get(n.assemblyName),l=new Map;if(!e.featuresMinMax[a])return l;const{end:s,refName:i,start:u}=n;for(const[t,n]of e.seenFeatures.entries()){if(!c.isAlive(n)){e.deleteSeenFeature(t);continue}if(i!==o?.getCanonicalRefName(n.refSeq)||!r.doesIntersect2(u,s,n.min,n.max))continue;const{featureTypeOntology:a}=e.session.apolloDataStore.ontologyManager;if(!a)throw new Error("featureTypeOntology is undefined");if(n.looksLikeGene){const t=1==n.strand?e.geneTrackRowNums[0]:e.geneTrackRowNums[1];l.get(t)||l.set(t,[]);const o=l.get(t);o?.push({rowNum:t,feature:n});const{children:s}=n;if(!s)continue;for(const[,t]of s)if(a.isTypeOf(t.type,"transcript")){const{cdsLocations:n,strand:o,children:s}=t;if(s)for(const[,t]of s){if(!a.isTypeOf(t.type,"exon"))continue;const n=1==t.strand?e.geneTrackRowNums[0]:e.geneTrackRowNums[1],o=l.get(n);o?.push({rowNum:n,feature:t})}for(const a of n)for(const n of a){let a=r.getFrame(n.min,n.max,o??1,n.phase);a=e.featureLabelSpacer(a<0?-1*a+5:a),l.get(a)||l.set(a,[]);const s=l.get(a);s?.push({rowNum:a,feature:t})}}}}return l}))},getFeatureLayoutPosition(e){const{featureLayouts:t}=this;for(const[n,a]of t.entries())for(const[,t]of a)for(const{feature:a}of t)if(e._id===a._id)return{layoutIndex:n,layoutRow:0,featureRow:0}}}))).views((e=>({get highestRow(){return 5}}))).actions((e=>({afterAttach(){c.addDisposer(e,i.autorun((()=>{if(e.lgv.initialized&&!e.regionCannotBeRendered())for(const t of e.regions){const n=e.session.apolloDataStore.assemblies.get(t.assemblyName),a=n?.getByRefName(t.refName),o=a?.features;if(o)for(const[,n]of o)r.doesIntersect2(t.start,t.end,n.min,n.max)&&!e.seenFeatures.has(n._id)&&e.addSeenFeature(n)}}),{name:"LinearApolloSixFrameDisplaySetSeenFeatures",delay:1e3}))}})))}(0,t).named("LinearApolloSixFrameDisplayRendering").props({apolloRowHeight:20,detailsMinHeight:200,detailsHeight:200,lastRowTooltipBufferHeight:120,isShown:!0,filteredTranscripts:c.types.array(c.types.string)}).volatile((()=>({canvas:null,overlayCanvas:null,collaboratorCanvas:null,theme:s.createTheme()}))).views((e=>({get featuresHeight(){return(e.highestRow+1)*e.apolloRowHeight*(e.showFeatureLabels?2:1)+e.lastRowTooltipBufferHeight}}))).actions((e=>({toggleShown(){e.isShown=!e.isShown},setDetailsHeight(t){e.detailsHeight=e.isShown?Math.max(Math.min(t,e.height-100),Math.min(e.height,e.detailsMinHeight)):t},setCanvas(t){e.canvas=t},setOverlayCanvas(t){e.overlayCanvas=t},setCollaboratorCanvas(t){e.collaboratorCanvas=t},setTheme(t){e.theme=t}}))).actions((e=>({afterAttach(){c.addDisposer(e,i.autorun((()=>{if(!e.lgv.initialized||e.regionCannotBeRendered())return;const t=e.collaboratorCanvas?.getContext("2d");if(t){t.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.featuresHeight);for(const n of e.session.collaborators){const{locations:a}=n;if(0===a.length)continue;let o=0;for(const r of e.lgv.displayedRegions){for(const l of a){if(l.refSeq!==r.refName)continue;const{end:a,refSeq:s,start:i}=l,c=e.lgv.bpToPx({refName:s,coord:i,regionNumber:o});if(!c)continue;const u=c.offsetPx-e.lgv.offsetPx,d=(a-i)/e.lgv.bpPerPx;t.fillStyle="rgba(0,255,0,.2)",t.fillRect(u,1,d,100),t.fillStyle="black",t.fillText(n.name,u+1,11,d-2)}o++}}}}),{name:"LinearApolloSixFrameDisplayRenderCollaborators"})),c.addDisposer(e,i.autorun((()=>{const{canvas:t,featureLayouts:n,featuresHeight:a,lgv:o}=e;if(!o.initialized||e.regionCannotBeRendered())return;const{displayedRegions:l,dynamicBlocks:s}=o,i=t?.getContext("2d");if(i){i.clearRect(0,0,s.totalWidthPx,a);for(const[t,a]of n.entries()){const n=l[t];for(const[o,l]of a.entries())for(const{feature:a}of l){if(!a.looksLikeGene)continue;if(!r.doesIntersect2(n.start,n.end,a.min,a.max))continue;const{topLevelFeature:l}=a,s=e.getGlyph(l);void 0!==s&&s.draw(i,l,o,e,t)}}}}),{name:"LinearApolloSixFrameDisplayRenderFeatures"}))}})))}(0,t);return n.named("LinearApolloSixFrameDisplayMouseEvents").volatile((()=>({apolloDragging:null,cursor:void 0}))).views((e=>({getMousePosition(t){const n=Mt(t,e.lgv),{bp:a,regionNumber:o,y:l}=n,s=Math.floor(l/e.apolloRowHeight)+1,i=e.featureLayouts[o].get(s);if(!i)return n;const{featureTypeOntology:c}=e.session.apolloDataStore.ontologyManager;if(!c)throw new Error("featureTypeOntology is undefined");let u;if(e.geneTrackRowNums.includes(s)?(u=i.find((e=>"exon"==e.feature.type&&a>=e.feature.min&&a<=e.feature.max)),u||(u=i.find((e=>a>=e.feature.min&&a<=e.feature.max)))):u=i.find((t=>{const{feature:n}=t,o=n.attributes.get("gff_id")?.toString();if(!c.isTypeOf(n.type,"transcript"))return!1;for(const t of n.cdsLocations)for(const l of t){let t=r.getFrame(l.min,l.max,n.strand??1,l.phase);if(t=e.featureLabelSpacer(t<0?-1*t+5:t),s===t&&a>=l.min&&a<=l.max)return void 0===o||!e.filteredTranscripts.includes(o)}return!1})),!u)return n;const{feature:d}=u;return{...n,feature:d}}}))).actions((e=>({continueDrag(t,n){if(!e.apolloDragging)throw new Error("continueDrag() called with no current drag in progress");n.stopPropagation(),e.apolloDragging={...e.apolloDragging,current:t}},setDragging(t){e.apolloDragging=t??null}}))).actions((e=>({setCursor(t){e.cursor!==t&&(e.cursor=t)},updateFilteredTranscripts(t){e.filteredTranscripts=c.cast(t)}}))).actions((()=>({onClick(){}})))}(0,n).views((e=>({contextMenuItems(t){const{hoveredFeature:n}=e;if(!n)return[];const a=e.getMousePosition(t),{topLevelFeature:o}=n.feature,r=e.getGlyph(o);return It(a)?r.getContextMenuItems(e,a):[]}}))).actions((e=>({startDrag(t,n,a,o=!1){e.apolloDragging={start:t,current:t,feature:n,edge:a,shrinkParent:o}},endDrag(){if(!e.apolloDragging)throw new Error("endDrag() called with no current drag in progress");const{current:n,edge:a,feature:o,start:r,shrinkParent:l}=e.apolloDragging;if(Math.abs(n.x-r.x)<=4)return e.setDragging(),void e.setCursor();const{displayedRegions:s}=e.lgv,i=e.getAssemblyId(s[r.regionNumber].assemblyName),c=Rt(o,n.bp,a,l),u="max"===a?new t.LocationEndChange({typeName:"LocationEndChange",changedIds:c.map((e=>e.featureId)),changes:c.map((e=>({featureId:e.featureId,oldEnd:e.oldLocation,newEnd:e.newLocation}))),assembly:i}):new t.LocationStartChange({typeName:"LocationStartChange",changedIds:c.map((e=>e.featureId)),changes:c.map((e=>({featureId:e.featureId,oldStart:e.oldLocation,newStart:e.newLocation}))),assembly:i});e.changeManager.submit(u),e.setDragging(),e.setCursor()}}))).actions((e=>({onMouseDown(t){const n=e.getMousePosition(t);It(n)&&e.getGlyph(n.feature).onMouseDown(e,n,t)},onMouseMove(t){const n=e.getMousePosition(t);if(e.apolloDragging)return e.setCursor("col-resize"),void e.continueDrag(n,t);It(n)?e.getGlyph(n.feature).onMouseMove(e,n,t):(e.setHoveredFeature(),e.setCursor())},onMouseLeave(t){e.setDragging(),e.setHoveredFeature();const n=e.getMousePosition(t);It(n)&&e.getGlyph(n.feature).onMouseLeave(e,n,t)},onMouseUp(t){const n=e.getMousePosition(t);It(n)?e.getGlyph(n.feature).onMouseUp(e,n,t):e.setSelectedFeature(),e.apolloDragging&&e.endDrag()}}))).actions((e=>({afterAttach(){c.addDisposer(e,i.autorun((()=>{if(!e.lgv.initialized||e.regionCannotBeRendered())return;const t=e.overlayCanvas?.getContext("2d");if(!t)return;t.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.featuresHeight);const{apolloDragging:n,hoveredFeature:a}=e;if(!a)return;const o=e.getGlyph(a.feature);o.drawHover(e,t),o.drawTooltip(e,t),n&&e.getGlyph(n.feature.topLevelFeature).drawDragPreview(e,t)}),{name:"LinearApolloSixFrameDisplayRenderMouseoverAndDrag"}))}})))}(0,n).props({tabularEditor:c.types.optional(co,{})}).named("LinearApolloSixFrameDisplay")}const Er=a.ConfigurationSchema("ApolloPlugin",{ontologies:c.types.array(fn),featureTypeOntologyName:{description:"Name of the feature type ontology",type:"string",defaultValue:"Sequence Ontology"},hasRole:{description:"Flag used internally by jbrowse-plugin-apollo",type:"boolean",defaultValue:!1},geneBackgroundColor:{description:"Color for feature background",type:"string",defaultValue:"jexl:geneBackgroundColor(featureType)",contextVariable:["featureType"]}}),vr=(e,t)=>{const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"gene")||n.isTypeOf(e.type,"transcript")||n.isTypeOf(e.type,"pseudogene")||n.isTypeOf(e.type,"pseudogenic_transcript")},xr=(e,t)=>{const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"gene")||n.isTypeOf(e.type,"pseudogene")},Tr=(e,t)=>{const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"transcript")||n.isTypeOf(e.type,"pseudogenic_transcript")};function Ar(e){const{attributes:t}=e,n=["gene_name","gene_id","gene_stable_id"];for(const e of n){const n=t?.[e];if(n?.[0])return n[0]}return""}const Fr=e=>{const t=function(e){const{attributes:t}=e,n=["name","gff_name","transcript_name","gene_name"];for(const e of n){const n=t?.[e];if(n?.[0])return n[0]}return""}(e),n=function(e){const{attributes:t}=e,n=["id","gff_id","transcript_id","gene_id","gene_stable_id","stable_id"];for(const e of n){const n=t?.[e];if(n?.[0])return n[0]}return""}(e);return t?`${e.type} - ${t}`:n?`${e.type} - ${n}`:e.type};function kr({annotationFeature:e,assembly:n,handleClose:a,refSeqId:o,session:r,region:l}){const i=r,{featureTypeOntology:u}=i.apolloDataStore.ontologyManager,d=C.useMemo((()=>Object.keys(e.children??{})),[e]),[f,m]=C.useState(!0),[g,p]=C.useState(d),[h,y]=C.useState(""),[b,S]=C.useState([]),[w,E]=C.useState(!1),[v,x]=C.useState(),T=i.apolloDataStore.assemblies.get(n.name),A=T?.refSeqs.get(o),F=A?.getFeatures(l.start,l.end),k=()=>{const e=[];for(const t of F??[])if(!(t.min>l.end||t.max<l.start)&&u?.isTypeOf(t.type,"gene")){const n=c.getSnapshot(t);e.push(n)}return e};C.useEffect((()=>{y("");const e=k();S(e),x(e[0])}),[g,f,l]);const D=async e=>{if(v)for(const a of Object.keys(e)){const o=e[a];if(o.strand=v.strand,o.children)for(const e of Object.keys(o.children))o.children[e].strand=v.strand;const r=new t.AddFeatureChange({parentFeatureId:v._id,changedIds:[v._id],typeName:"AddFeatureChange",assembly:n.name,addedFeature:o});await I(r,a)}},N=async a=>{const r=(new ke.default).toHexString(),l=Math.min(...Object.values(a).map((e=>e.min))),s=Math.max(...Object.values(a).map((e=>e.max))),i=new t.AddFeatureChange({changedIds:[r],typeName:"AddFeatureChange",assembly:n.name,addedFeature:{_id:r,refSeq:o,min:l,max:s,strand:e.strand,type:"gene",children:a,attributes:{name:[Ar(e)],gene_name:[Ar(e)]}}});await I(i,r)},R=async(e,a)=>{if(!v)return;const o=[];e!==v.min&&o.push(new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[v._id],featureId:v._id,assembly:n.name,oldStart:v.min,newStart:e})),a!==v.max&&o.push(new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[v._id],featureId:v._id,assembly:n.name,oldEnd:v.max,newEnd:a}));for(const e of o)await I(e)},I=async(e,t)=>{await i.apolloDataStore.changeManager.submit(e).then((()=>{i.apolloSetSelectedFeature(t)}))};return De.default.createElement(Pt,{open:!0,title:"Create Apollo Annotation",handleClose:a,fullWidth:!0,maxWidth:"sm"},De.default.createElement(s.DialogTitle,{fontSize:15},"Select the feature to be copied to apollo track"),De.default.createElement(s.DialogContent,null,De.default.createElement(s.Box,{sx:{ml:3}},vr(e,i)&&De.default.createElement(s.FormControlLabel,{control:De.default.createElement(s.Checkbox,{size:"small",checked:f,onChange:e=>{const t=e.target.checked;m(t),p(t?d:[])}}),label:`${Fr(e)} (${e.min+1}..${e.max})`}),e.children&&De.default.createElement(s.Box,{sx:{display:"flex",flexDirection:"column",ml:3}},Object.values(e.children).filter((e=>Tr(e,i))).map((e=>De.default.createElement(s.FormControlLabel,{key:e._id,control:De.default.createElement(s.Checkbox,{size:"small",checked:g.includes(e._id),onChange:t=>{((e,t)=>{p((n=>e.target.checked?[...n,t._id]:n.filter((e=>e!==t._id))))})(t,e)}}),label:`${Fr(e)} (${e.min+1}..${e.max})`}))))),b.length>0&&(!f&&g.length>0||f&&Tr(e,i))&&De.default.createElement("div",{style:{border:"1px solid #ccc",marginTop:20,padding:10,borderRadius:5}},De.default.createElement(s.Box,{sx:{ml:3}},De.default.createElement(s.Typography,{variant:"caption",fontSize:12},"Select the destination feature to copy the selected features"),De.default.createElement(s.Box,{sx:{mt:1}},De.default.createElement(s.Select,{labelId:"label",style:{width:"100%"},value:v?._id??"",onChange:e=>{const t=b.find((t=>t._id===e.target.value));x(t)},disabled:w},b.map((e=>De.default.createElement(s.MenuItem,{key:e._id,value:e._id},`${Fr(e)} (${e.min+1}..${e.max})`)))))),De.default.createElement(s.Box,{sx:{ml:3}},De.default.createElement(s.FormGroup,null,De.default.createElement(s.FormControlLabel,{control:De.default.createElement(s.Checkbox,{checked:w,onChange:e=>{E(e.target.checked)}}),label:"Create new gene"}))))),De.default.createElement(s.DialogActions,null,De.default.createElement(s.Button,{variant:"contained",type:"submit",disabled:0===g.length||!f&&g.length>0&&!v,onClick:async()=>{if(f){if(xr(e,i)&&(await(async()=>{let a;if(e.children&&g.length!==Object.values(e.children).length){const o={};for(const t of g)o[t]=e.children[t];a=new t.AddFeatureChange({changedIds:[e._id],typeName:"AddFeatureChange",assembly:n.name,addedFeature:{...e,children:o}})}else a=new t.AddFeatureChange({changedIds:[e._id],typeName:"AddFeatureChange",assembly:n.name,addedFeature:e});await I(a,e._id)})(),r.notify("Successfully copied selected gene and transcript(s)","success")),Tr(e,i))if(v&&!w){const t={};if(t[e._id]=e,v.max<e.max||v.min>e.min){const n=Math.min(v.min,e.min),a=Math.max(v.max,e.max);await R(n,a),await D(t)}else await D(t);r.notify("Successfully copied selected transcripts to destination gene","success")}else{const t={};t[e._id]=e,await N(t),r.notify("Successfully created a new gene with selected transcripts","success")}}else{if(!e.children)return;if(v&&!w){const t={};for(const n of g)t[n]=e.children[n];const n=Math.min(...Object.values(t).map((e=>e.min))),a=Math.max(...Object.values(t).map((e=>e.max)));if(v.min>n||v.max<a){const e=Math.min(v.min,n),o=Math.max(v.max,a);await R(e,o),await D(t)}else await D(t);r.notify("Successfully copied transcript to destination gene","success")}else{const t={};for(const n of g)t[n]=e.children[n];await N(t),r.notify("Successfully created a new gene with selected transcript","success")}}a()}},"Create"),De.default.createElement(s.Button,{variant:"outlined",type:"submit",onClick:a},"Cancel")),h?De.default.createElement(s.DialogContent,null,De.default.createElement(s.DialogContentText,{color:"error"},h)):null)}function Dr(e){if("LinearPileupDisplay"!==e.name)return e;const{stateModel:t}=e,n=t.views((e=>({getFirstRegion:()=>r.getContainingView(e).dynamicBlocks.contentBlocks[0],getAssembly(){const t=e.getFirstRegion(),n=r.getSession(e),{assemblyManager:a}=n,{assemblyName:o}=t,l=a.get(o);if(!l)throw new Error(`Could not find assembly named ${o}`);return l},getRefSeqId(t){const n=e.getFirstRegion(),{refName:a}=n,{refNameAliases:o}=t;if(!o)throw new Error(`Could not find aliases for ${t.name}`);const r=[...Object.entries(o)].filter((([e,t])=>e!==t)).map((([e,t])=>({_id:e,name:t}))),l=r.find((e=>e.name===a))?._id;if(!l)throw new Error(`Could not find refSeqId named ${a}`);return l},getAnnotationFeature(){const t=e.contextMenuFeature,n=e.getAssembly(),a=e.getRefSeqId(n),o=t.get("start"),r=t.get("end"),l=t.get("strand"),s=t.get("name"),i=function(e){const t=/(\d+)([MIDNSHPX=])/g,n=[];let a;for(;null!==(a=t.exec(e));)n.push([a[2],Number.parseInt(a[1],10)]);return n}(t.get("CIGAR"));let c,u=o;const d=[];for(const[e,t]of i)switch(e){case"M":case"=":case"X":void 0===c&&(c=u),u+=t;break;case"N":void 0!==c&&(d.push({start:c,end:u}),c=void 0),u+=t;break;case"D":u+=t;break;case"I":case"S":case"H":case"P":break;default:throw new Error(`Unknown CIGAR operation: ${e}`)}void 0!==c&&d.push({start:c,end:u});const f={_id:ke.default().toHexString(),refSeq:a,min:o,max:r,type:"mRNA",strand:l,attributes:{name:[s]}};if(0===d.length)return f;f.children={};for(const e of d){const t={_id:ke.default().toHexString(),refSeq:a,min:e.start,max:e.end,type:"exon",strand:l};f.children[t._id]=t}return f}}))).views((e=>{const t=e.contextMenuItems;return{contextMenuItems(){const n=r.getSession(e),a=e.getAssembly(),o=e.getFirstRegion();return e.contextMenuFeature?[...t(),{label:"Create Apollo annotation",icon:be.default,onClick:()=>{n.queueDialog((t=>[kr,{session:n,handleClose:()=>{t()},annotationFeature:e.getAnnotationFeature(a),assembly:a,refSeqId:e.getRefSeqId(a),region:o}]))}}]:t()}}}));return e.stateModel=n,e}function Nr(e,t){const n=JSON.parse(JSON.stringify(e)),a=n.subfeatures;return[{start:n.start+1,end:n.end,seq_id:t,source:n.source??null,type:n.type??null,score:n.score??null,strand:n.strand?1===n.strand?"+":"-":null,phase:null!==n.phase||void 0!==n.phase?n.phase:null,attributes:Ir(n),derived_features:[],child_features:a?a.map((e=>Nr(e,t))):[]}]}function Rr(e,n){return t.gff3ToAnnotationFeature(Nr(e,n))}function Ir(e){const t={},n=new Set(["start","end","type","strand","refName","subfeatures","derived_features","phase","source","score"]);for(const[a,o]of Object.entries(e))n.has(a)||(t[a]=Array.isArray(o)?o.map(String):[String(o)]);return t}function Mr(e){if("LinearBasicDisplay"!==e.name)return e;const{stateModel:t}=e,n=t.views((e=>({getFirstRegion:()=>r.getContainingView(e).dynamicBlocks.contentBlocks[0],getAssembly(){const t=e.getFirstRegion(),n=r.getSession(e),{assemblyManager:a}=n,{assemblyName:o}=t,l=a.get(o);if(!l)throw new Error(`Could not find assembly named ${o}`);return l},getRefSeqId(t){const n=e.getFirstRegion(),{refName:a}=n,{refNameAliases:o}=t;if(!o)throw new Error(`Could not find aliases for ${t.name}`);const r=[...Object.entries(o)].filter((([e,t])=>e!==t)).map((([e,t])=>({_id:e,name:t}))),l=r.find((e=>e.name===a))?._id;if(!l)throw new Error(`Could not find refSeqId named ${a}`);return l},getAnnotationFeature(t){const n=e.getRefSeqId(t);return Rr(e.contextMenuFeature.data,n)}}))).views((e=>{const t=e.contextMenuItems;return{contextMenuItems(){const n=r.getSession(e),a=e.getAssembly(),o=e.getFirstRegion();return e.contextMenuFeature?[...t(),{label:"Create Apollo annotation",icon:be.default,onClick:()=>{n.queueDialog((t=>[kr,{session:n,handleClose:()=>{t()},annotationFeature:e.getAnnotationFeature(a),assembly:a,refSeqId:e.getRefSeqId(a),region:o}]))}}]:t()}}}));return e.stateModel=n,e}const Lr=D.observer((function({display:e}){const{classes:t}=Vo(),{apolloDragging:n,apolloRowHeight:a,lgv:o,session:l,showCheckResults:i}=e,{assemblyManager:c}=l;return i?o.dynamicBlocks.contentBlocks.map((i=>{const u=o.bpPerPx*a,d=c.get(i.assemblyName);return d?Jo([...l.apolloDataStore.checkResults.values()].filter((e=>d.isValidRefName(e.refSeq)&&d.getCanonicalRefName(e.refSeq)===i.refName&&r.doesIntersect2(i.start,i.end,e.start,e.end))),u,!0).map((o=>{const r=Math.round(function(e,t,n){const{lgv:a}=e,{bpPerPx:o,offsetPx:r}=a;return n.offsetPx-r+(n.reversed?n.end-t.max:t.min-n.start)/o}(e,o.range,i)),[l]=o.featureIds;if(!l)return null;let c=0;const u=e.getFeatureLayoutPosition(l);return u&&(c=u.layoutRow+u.featureRow),De.default.createElement(s.Tooltip,{key:o._id,title:o.message},De.default.createElement(s.Box,{className:t.box,style:{top:c*a,left:r,height:a,width:a,pointerEvents:n?"none":"auto"}},De.default.createElement(s.Badge,{className:t.badge,badgeContent:o.count,color:"primary",overlap:"circular",anchorOrigin:{vertical:"bottom",horizontal:"right"},invisible:o.count<=1},De.default.createElement(s.Avatar,{className:t.avatar},De.default.createElement(et.default,{"data-testid":`ErrorIcon-${o.start}`})))))})):null})):null})),qr=D.observer((function(e){const t=s.useTheme(),{model:n}=e,{loading:a,contextMenuItems:o,cursor:l,featuresHeight:i,isShown:c,onMouseDown:u,onMouseLeave:d,onMouseMove:f,onMouseUp:m,regionCannotBeRendered:g,session:p,setCanvas:h,setCollaboratorCanvas:y,setOverlayCanvas:b,setTheme:S}=n,{classes:w}=Vo(),E=r.getContainingView(n);C.useEffect((()=>{S(t)}),[t,S]);const[v,x]=C.useState(),[T,A]=C.useState([]),k=g();return c?De.default.createElement(De.default.Fragment,null,De.default.createElement("div",{className:w.canvasContainer,style:{width:E.dynamicBlocks.totalWidthPx,height:i},onContextMenu:e=>{e.preventDefault(),T.length>0?A([]):(x([e.clientX,e.clientY]),A(o(e)))}},p.isLocked?De.default.createElement("div",{className:w.locked,"data-testid":"lock-icon"},De.default.createElement(Qe.default,null)):null,a?De.default.createElement("div",{className:w.loading},De.default.createElement(s.CircularProgress,{size:"18px"})):null,k?De.default.createElement(s.Alert,{severity:"warning",classes:{message:w.ellipses},slotProps:{root:{className:w.center}}},De.default.createElement(s.Tooltip,{title:k},De.default.createElement("div",null,k))):De.default.createElement(De.default.Fragment,null,De.default.createElement("canvas",{ref:async e=>{await Promise.resolve(),y(e)},width:E.dynamicBlocks.totalWidthPx,height:i,className:w.canvas,"data-testid":"collaboratorCanvas"}),De.default.createElement("canvas",{ref:async e=>{await Promise.resolve(),h(e)},width:E.dynamicBlocks.totalWidthPx,height:i,className:w.canvas,"data-testid":"canvas"}),De.default.createElement("canvas",{ref:async e=>{await Promise.resolve(),b(e)},width:E.dynamicBlocks.totalWidthPx,height:i,onMouseMove:f,onMouseLeave:d,onMouseDown:u,onMouseUp:m,className:w.canvas,style:{cursor:l??"default"},"data-testid":"overlayCanvas"}),De.default.createElement(Lr,{display:n}),De.default.createElement(F.Menu,{open:T.length>0,onMenuItemClick:(e,t)=>{t(),A([])},onClose:()=>{A([])},slotProps:{transition:{onExit:()=>{A([])}}},anchorReference:"anchorPosition",anchorPosition:v?{top:v[1],left:v[0]}:void 0,style:{zIndex:t.zIndex.tooltip},menuItems:T})))):null})),Pr=D.observer((function({model:e,hrStyle:t={margin:0,top:0,color:"black"},idx:n=0}){const{apolloRowHeight:a,highestRow:o,showFeatureLabels:r}=e,l=r?2:1;return De.default.createElement("div",{style:{position:"absolute",left:0,top:a*l*(o+1)/2+n*l*a,width:"100%"}},De.default.createElement("hr",{style:t}))})),Or=D.observer((function(e,t){const n=s.useTheme(),{model:a}=e,{apolloRowHeight:o,contextMenuItems:l,cursor:i,featuresHeight:c,featureLabelSpacer:u,geneTrackRowNums:d,isShown:f,onMouseDown:m,onMouseLeave:g,onMouseMove:p,onMouseUp:h,regionCannotBeRendered:y,session:b,setCanvas:S,setCollaboratorCanvas:w,setOverlayCanvas:E,setTheme:v,showCheckResults:x}=a,{classes:T}=Vo(),A=r.getContainingView(a);C.useEffect((()=>{v(n)}),[n,v]);const[k,D]=C.useState(),[N,R]=C.useState([]),I=y();if(!f)return null;const{assemblyManager:M}=b;return De.default.createElement(De.default.Fragment,null,De.default.createElement("div",{className:T.canvasContainer,style:{width:A.dynamicBlocks.totalWidthPx,height:c},onContextMenu:e=>{e.preventDefault(),N.length>0?R([]):(D([e.clientX,e.clientY]),R(l(e)))}},b.isLocked?De.default.createElement("div",{className:T.locked,"data-testid":"lock-icon"},De.default.createElement(Qe.default,null)):null,I?De.default.createElement(s.Alert,{severity:"warning",classes:{message:T.ellipses},slotProps:{root:{className:T.center}}},De.default.createElement(s.Tooltip,{title:I},De.default.createElement("div",null,I))):De.default.createElement(De.default.Fragment,null,De.default.createElement(Pr,{model:a,idx:0}),De.default.createElement(Pr,{model:a,hrStyle:{margin:0,top:0,color:"grey",opacity:.4},idx:1}),De.default.createElement(Pr,{model:a,idx:2}),De.default.createElement("canvas",{ref:async e=>{await Promise.resolve(),w(e)},width:A.dynamicBlocks.totalWidthPx,height:c,className:T.canvas,"data-testid":"collaboratorCanvas"}),De.default.createElement("canvas",{ref:async e=>{await Promise.resolve(),S(e)},width:A.dynamicBlocks.totalWidthPx,height:c,className:T.canvas,"data-testid":"canvas"}),De.default.createElement("canvas",{ref:async e=>{await Promise.resolve(),E(e)},width:A.dynamicBlocks.totalWidthPx,height:c,onMouseMove:p,onMouseLeave:g,onMouseDown:m,onMouseUp:h,className:T.canvas,style:{cursor:i??"default"},"data-testid":"overlayCanvas"}),A.displayedRegions.flatMap(((e,n)=>{const a=A.bpPerPx*o,l=M.get(e.assemblyName);return x?Jo([...b.apolloDataStore.checkResults.values()].filter((t=>l?.isValidRefName(t.refSeq)&&l.getCanonicalRefName(t.refSeq)===e.refName&&r.doesIntersect2(e.start,e.end,t.start,t.end))),a,!0).map((a=>{const l=(A.bpToPx({refName:e.refName,coord:a.start,regionNumber:n})?.offsetPx??0)-A.offsetPx,[i]=a.featureIds;if(!i||!i.parent?.looksLikeGene)return null;let c;for(const e of i.cdsLocations)for(const t of e){let e=r.getFrame(t.min,t.max,i.strand??1,t.phase);if(e=u(e<0?-1*e+5:e),a.start>=t.min&&a.start<=t.max){c=e-1;break}}return void 0===c&&(c=(1==i.strand?d[0]:d[1])-1),De.default.createElement(s.Tooltip,{key:a._id,title:a.message},De.default.createElement(s.Box,{className:T.box,style:{top:c*o,left:l,height:o,width:o,pointerEvents:t?"none":"auto"}},De.default.createElement(s.Badge,{className:T.badge,badgeContent:a.count,color:"primary",overlap:"circular",anchorOrigin:{vertical:"bottom",horizontal:"right"},invisible:a.count<=1},De.default.createElement(s.Avatar,{className:T.avatar},De.default.createElement(et.default,{"data-testid":`ErrorIcon-${a.start}`})))))})):null})),De.default.createElement(F.Menu,{open:N.length>0,onMenuItemClick:(e,t)=>{t(),R([])},onClose:()=>{R([])},slotProps:{transition:{onExit:()=>{R([])}}},anchorReference:"anchorPosition",anchorPosition:k?{top:k[1],left:k[0]}:void 0,style:{zIndex:n.zIndex.tooltip},menuItems:N}))))})),_r=E.makeStyles()((e=>({shading:{background:s.alpha(e.palette.primary.main,.2),overflowX:"hidden"},details:{background:e.palette.background.paper},accordionControl:{height:12,width:"100%","&:hover":{background:e.palette.action.hover},display:"flex",alignItems:"center",justifyContent:"center"},accordionRoot:{background:e.palette.divider},resizeHandle:{width:"100%",height:4,position:"absolute",cursor:"row-resize",zIndex:100},expandIcon:{},title:{userSelect:"none"},alertContainer:{display:"flex",alignItems:"center",justifyContent:"center"}})));function Br(e,t){const{apolloRowHeight:n,selectedFeature:a}=e;if(t.current&&a){const o=e.getFeatureLayoutPosition(a);o&&t.current.scroll({top:(o.layoutRow+o.featureRow)*n,behavior:"smooth"})}}const Ur=({onResize:e})=>{const{classes:t}=_r(),n=C.useCallback((t=>{t.stopPropagation(),t.preventDefault(),e(t.movementY)}),[e]);return De.default.createElement("div",{onMouseDown:e=>{e.stopPropagation();const t=new AbortController,{signal:a}=t;function o(){t.abort()}globalThis.addEventListener("mousemove",n,{signal:a}),globalThis.addEventListener("mouseup",o,{signal:a}),globalThis.addEventListener("mouseleave",o,{signal:a})},onClick:e=>{e.stopPropagation(),e.preventDefault()},className:t.resizeHandle})},$r=D.observer((function({onClick:e,onResize:t,open:n,title:a}){const{classes:o}=_r();return De.default.createElement("div",{className:o.accordionRoot},n&&t?De.default.createElement(Ur,{onResize:t}):null,De.default.createElement("div",{className:o.accordionControl,onClick:e},De.default.createElement(n?Ye.default:je.default,{className:o.expandIcon}),a?De.default.createElement(s.Typography,{className:o.title,variant:"caption",component:"span"},a):null))})),jr=D.observer((function({model:e,...t}){const n=r.getSession(e),{ontologyManager:a}=n.apolloDataStore,{featureTypeOntology:o}=a,l=o?.dataStore,{classes:i}=_r(),{graphical:c,height:u,isShown:d,selectedFeature:f,table:m,tabularEditor:g,toggleShown:p}=e,h=C.useRef(null);C.useEffect((()=>{Br(e,h)}),[e,f]);const y=t=>{e.setDetailsHeight(e.detailsHeight-t)};if(!l)return De.default.createElement("div",{className:i.alertContainer},De.default.createElement(s.Alert,{severity:"error"},"Could not load feature type ontology."));if(c&&m){const n=g.isShown?e.detailsHeight:0,a=d?u-e.detailsHeight-24:0;return De.default.createElement("div",{style:{height:u}},De.default.createElement($r,{open:d,title:"Graphical",onClick:p}),De.default.createElement("div",{className:i.shading,ref:h,style:{height:a}},De.default.createElement(qr,{model:e,...t})),De.default.createElement($r,{title:"Table",open:g.isShown,onClick:g.togglePane,onResize:y}),De.default.createElement("div",{className:i.details,style:{height:n}},De.default.createElement(io,{model:e})))}return c?De.default.createElement("div",{className:i.shading,ref:h,style:{height:u}},De.default.createElement(qr,{model:e,...t})):De.default.createElement("div",{className:i.details,style:{height:u}},De.default.createElement(io,{model:e}))})),Gr=D.observer((function({model:e,...t}){const n=r.getSession(e),{ontologyManager:a}=n.apolloDataStore,{featureTypeOntology:o}=a,l=o?.dataStore,{classes:i}=_r(),{detailsHeight:c,graphical:u,height:d,isShown:f,selectedFeature:m,table:g,tabularEditor:p,toggleShown:h}=e,y=C.useRef(null);C.useEffect((()=>{Br(e,y)}),[e,m]);const b=t=>{e.setDetailsHeight(c-t)};if(!l)return De.default.createElement("div",{className:i.alertContainer},De.default.createElement(s.Alert,{severity:"error"},"Could not load feature type ontology."));if(u&&g){const n=p.isShown?c:0,a=f?d-c-24:0;return De.default.createElement("div",{style:{height:d}},De.default.createElement($r,{open:f,title:"Graphical",onClick:h}),De.default.createElement("div",{className:i.shading,ref:y,style:{height:a}},De.default.createElement(Or,{model:e,...t})),De.default.createElement($r,{title:"Table",open:p.isShown,onClick:p.togglePane,onResize:b}),De.default.createElement("div",{className:i.details,style:{height:n}},De.default.createElement(io,{model:e})))}return u?De.default.createElement("div",{className:i.shading,ref:y,style:{height:d}},De.default.createElement(Or,{model:e,...t})):De.default.createElement("div",{className:i.details,style:{height:d}},De.default.createElement(io,{model:e}))})),Wr=c.types.model("JobsManager",{}).views((e=>({get jobStatusWidget(){const{widgets:t}=r.getSession(e);let n=t.get("JobsList");return n||(n=r.getSession(e).addWidget("JobsListWidget","JobsList")),n}}))).actions((e=>({update(t,n,a){e.jobStatusWidget.updateJobStatusMessage(t,n),a&&e.jobStatusWidget.updateJobProgressPct(t,a)},abortJob(t,n){const a=r.getSession(e);if(r.isSessionModelWithWidgets(a)){a.showWidget(e.jobStatusWidget),e.jobStatusWidget.updateJobStatusMessage(t,n??"Aborted unexpectedly");const o=e.jobStatusWidget.jobs.findIndex((e=>e.name===t));e.jobStatusWidget.addAbortedJob({...e.jobStatusWidget.jobs[o]}),e.jobStatusWidget.removeJob(t),a.notify("Job aborted","info")}},runJob(t){const n=r.getSession(e);r.isSessionModelWithWidgets(n)&&(n.showWidget(e.jobStatusWidget),e.jobStatusWidget.addJob(t))},done(t){const n=r.getSession(e);r.isSessionModelWithWidgets(n)&&(n.showWidget(e.jobStatusWidget),e.jobStatusWidget.removeJob(t.name),e.jobStatusWidget.addFinishedJob({name:t.name,statusMessage:"All operations successful",progressPct:100,cancelCallback:t.cancelCallback}))}})));function zr(e,n){const o=e.evaluateExtensionPoint("Apollo-extendAnnotationFeature",Z.AnnotationFeatureModel),l=function(e){return c.types.model("ClientDataStore",{typeName:c.types.optional(c.types.literal("Client"),"Client"),assemblies:c.types.map(Z.ApolloAssembly),checkResults:c.types.map(Z.CheckResult),ontologyManager:c.types.optional(un,{})}).views((t=>({get internetAccounts(){return c.getRoot(t).internetAccounts},get pluginConfiguration(){return c.getRoot(t).jbrowse.configuration.ApolloPlugin},getFeature:n=>c.resolveIdentifier(e,t.assemblies,n)}))).actions((e=>({addAssembly(t,n){const a={_id:t,refSeqs:{}};return n&&(a.backendDriverType=n),e.assemblies.put(a)}}))).actions((e=>({addFeature(t,n){const a=r.getSession(e),{assemblyManager:o}=a;let l=e.assemblies.get(t);if(!l){if(!o.get(t))throw new Error(`Could not find assembly "${t}" to add feature "${n._id}"`);l=e.addAssembly(t)}let s=l.refSeqs.get(n.refSeq);if(!s){const e=o.get(t);if(!e)throw new Error(`Could not find assembly "${t}" to add feature "${n._id}"`);const a=e.getCanonicalRefName(n.refSeq);if(!a)throw new Error(`Could not find refSeq "${n.refSeq}" to add feature "${n._id}"`);s=l.addRefSeq(n.refSeq,a)}s.features.put(n)},deleteFeature(t){const n=e.getFeature(t);if(!n)throw new Error(`Could not find feature "${t}" to delete`);const{_id:a,parent:o}=n;o?o.deleteChild(t):c.getParentOfType(n,Z.ApolloRefSeq).deleteFeature(a)},deleteAssembly(t){e.assemblies.delete(t)},addCheckResult(t){e.checkResults.put(t)},addCheckResults(t){for(const n of t)e.checkResults.has(n._id)||e.checkResults.put(n)},deleteCheckResult(t){e.checkResults.delete(t)},clearCheckResults(){e.checkResults.clear()}}))).volatile((e=>({changeManager:new Sn(e),collaborationServerDriver:new wn(e),inMemoryFileDriver:new Cn(e),desktopFileDriver:r.isElectron?new En(e):void 0}))).actions((e=>({afterCreate(){c.addDisposer(e,i.autorun((()=>{const{ontologyManager:t,pluginConfiguration:n}=e,o=n.ontologies;for(const n of o||[]){const[o,l,s,i]=[a.readConfObject(n,"name"),a.readConfObject(n,"version"),a.readConfObject(n,"source"),a.readConfObject(n,"textIndexFields")];if(!t.findOntology(o)){const n=r.getSession(e),{jobsManager:a}=n,c=new AbortController,u=`Loading ontology "${o}"`,d={name:u,statusMessage:`Loading ontology "${o}", version "${l}", this may take a while`,progressPct:0,cancelCallback:()=>{c.abort(),a.abortJob(d.name)}};t.addOntology(o,l,s,{textIndexing:{indexFields:i},update:(e,t)=>{0!==t?100!==t?a.update(u,e,t):a.done(d):a.runJob(d)}})}}})))}}))).views((e=>({getBackendDriver(t){const n=r.getSession(e),{assemblyManager:o}=n,l=o.get(t);if(!l)return;const{file:s,internetAccountConfigId:i}=a.getConf(l,["sequence","metadata"]);return r.isElectron&&s?e.desktopFileDriver:i?e.collaborationServerDriver:e.inMemoryFileDriver},getInternetAccount(t,n){if(!(t??n))throw new Error("Must provide either assemblyName or internetAccountId");let o=n;if(t&&!o){const{assemblyManager:n}=r.getSession(e),l=n.get(t);if(!l)throw new Error(`No assembly found with name ${t}`);({internetAccountConfigId:o}=a.getConf(l,["sequence","metadata"]))}const{internetAccounts:l}=e,s=l.find((e=>e.internetAccountId===o));if(!s)throw new Error(`No InternetAccount found with config id ${n}`);return s}}))).actions((e=>({loadFeatures:c.flow((function*(t){for(const n of t){const t=e.getBackendDriver(n.assemblyName);if(!t)return;const[a,o]=yield t.getFeatures(n);if(0===a.length)continue;const{assemblyName:r,refName:l}=n;let s=e.assemblies.get(r);s||(s=e.assemblies.put({_id:r,refSeqs:{}}));const[i]=a;let c=s.refSeqs.get(i.refSeq);c||(c=s.refSeqs.put({_id:i.refSeq,name:l,features:{}}));for(const e of a)c.features.has(e._id)||c.features.put(e);e.addCheckResults(o)}})),loadRefSeq:c.flow((function*(t){for(const n of t){const t=e.getBackendDriver(n.assemblyName);if(!t)return;const{refSeq:a,seq:o}=yield t.getSequence(n),{assemblyName:r,end:l,refName:s,start:i}=n;let c=e.assemblies.get(r);c||(c=e.assemblies.put({_id:r,refSeqs:{}}));let u=c.refSeqs.get(a);u||(u=c.refSeqs.put({_id:a,name:s,sequence:[]})),u.addSequence({start:i,stop:l,sequence:o})}}))})))}(o),s=n.props({apolloDataStore:c.types.optional(l,{typeName:"Client"}),apolloSelectedFeature:c.types.safeReference(o),jobsManager:c.types.optional(Wr,{}),isLocked:c.types.optional(c.types.boolean,!1)}).volatile((()=>({apolloHoveredFeature:void 0,abortController:new AbortController}))).extend((()=>{const e=i.observable.array([]);return{views:{get collaborators(){return e}},actions:{addOrUpdateCollaborator(t){const n=e.find((e=>e.id===t.id));n?n.locations=t.locations:e.push(t)}}}})).actions((e=>({apolloSetSelectedFeature(t){e.apolloSelectedFeature=t},apolloSetHoveredFeature(t){e.apolloHoveredFeature=t},addApolloTrackConfig(t,n){const o=`apollo_track_${t.name}`;e.tracks.some((e=>e.trackId===o))||e.addTrackConf({type:"ApolloTrack",trackId:o,name:`Annotations (${a.getConf(t,"displayName")||t.name})`,assemblyNames:[t.name],textSearching:{textSearchAdapter:{type:"ApolloTextSearchAdapter",trackId:o,assemblyNames:[t.name],textSearchAdapterId:`apollo_search_${t.name}`,...n?{baseURL:{uri:n,locationType:"UriLocation"}}:{}}}})},toggleLocked(){e.isLocked=!e.isLocked},getPluginConfiguration(){const{jbrowse:t}=c.getRoot(e);return t.configuration.ApolloPlugin},broadcastLocations(){const{internetAccounts:t}=c.getRoot(e),n=[];for(const t of e.views){if("LinearGenomeView"!==t.type)return;const a=t;if(a.initialized){const{dynamicBlocks:t}=a;for(const a of t.contentBlocks){const{assemblyName:t,end:o,refName:r,start:l}=a,s=e.apolloDataStore.assemblies.get(t);s&&"CollaborationServerDriver"===s.backendDriverType&&n.push({assemblyName:t,refName:r,start:l,end:o})}}}if(0===n.length){for(const e of t)"baseURL"in e&&e.postUserLocation([]);return}const a=[];for(const e of t)if("baseURL"in e){for(const e of n)a.push({assemblyId:e.assemblyName,refSeq:e.refName,start:e.start,end:e.end});e.postUserLocation(a)}}}))).volatile((e=>({previousSnapshot:c.getSnapshot(e)}))).actions((e=>({afterCreate(){c.applySnapshot(e,{name:e.name,id:e.id});const{internetAccounts:t,jbrowse:n,reloadPluginManagerCallback:o}=c.getRoot(e);c.addDisposer(e,i.autorun((()=>{const n=[];for(const t of e.views){if("LinearGenomeView"!==t.type)return;const a=t;if(a.initialized){const{dynamicBlocks:t}=a;for(const a of t.contentBlocks){const{assemblyName:t,end:o,refName:r,start:l}=a,s=e.apolloDataStore.assemblies.get(t);s&&"CollaborationServerDriver"===s.backendDriverType&&n.push({assemblyName:t,refName:r,start:l,end:o})}}}if(0===n.length){for(const e of t)"baseURL"in e&&e.postUserLocation([]);return}const a=[];for(const e of t)if("baseURL"in e){for(const e of n)a.push({assemblyId:e.assemblyName,refSeq:e.refName,start:e.start,end:e.end});e.postUserLocation(a)}}),{name:"ApolloSessionBroadcastLocations"})),c.addDisposer(e,i.autorun((async r=>{if(a.readConfObject(n.configuration.ApolloPlugin,"hasRole"))return c.applySnapshot(e,e.previousSnapshot),void r.dispose();const{signal:l}=e.abortController;for(const n of t){if("ApolloInternetAccount"!==n.type)continue;const{baseURL:t}=n,a=new URL("jbrowse/config.json",t).href,s=n.getFetcher({locationType:"UriLocation",uri:a});let i,c;try{i=await s(a,{signal:l})}catch(t){e.abortController.signal.aborted||console.error(t);continue}if(i.ok){try{c=await i.json()}catch(e){console.error(e);continue}o(c,e.previousSnapshot),r.dispose()}else{const e=await Lt(i,"Failed to fetch assemblies");console.error(e)}}}),{name:"ApolloSessionLoadConfig"}))},beforeDestroy(){e.abortController.abort("destroying session model")}}))).views((e=>{const n=e.getTrackActionMenuItems;return{getTrackActionMenuItems(o){if("ApolloTrack"===o.type||"ReferenceSequenceTrack"===o.type)return n?.(o);const r=a.readConfObject(o,"trackId");return r.endsWith("-sessionTrack")?[...n?.(o)??[],{label:"Save track to Apollo",onClick:async()=>{const{internetAccounts:n,jbrowse:a}=c.getRoot(e),l=c.getSnapshot(a);let s;s=t.filterJBrowseConfig(l),0===Object.keys(s).length&&(s=void 0);const i={...c.getSnapshot(o),trackId:r.slice(0,r.length-13)};for(const a of n){if("ApolloInternetAccount"!==a.type)continue;const n=new t.ImportJBrowseConfigChange({typeName:"ImportJBrowseConfigChange",oldJBrowseConfig:s,newJBrowseConfig:{...s,tracks:s?.tracks&&[...s.tracks,i]}}),{internetAccountId:o}=a;await e.apolloDataStore.changeManager.submit(n,{internetAccountId:o});const{notify:r}=e;r("Track added","success")}e.deleteTrackConf(o),a.addTrackConf(i)},icon:it.default}]:[...n?.(o)??[],{label:"Remove track from Apollo",onClick:async()=>{const{internetAccounts:n,jbrowse:a}=c.getRoot(e),l=c.getSnapshot(a);let s;s=t.filterJBrowseConfig(l),0===Object.keys(s).length&&(s=void 0);const i=s?.tracks?.filter((e=>e.trackId!==r));for(const a of n){if("ApolloInternetAccount"!==a.type)continue;const n=new t.ImportJBrowseConfigChange({typeName:"ImportJBrowseConfigChange",oldJBrowseConfig:s,newJBrowseConfig:{...s,tracks:i}}),{internetAccountId:o}=a;await e.apolloDataStore.changeManager.submit(n,{internetAccountId:o});const{notify:r}=e;r("Track removed","success")}e.deleteTrackConf(o),a.deleteTrackConf(o)},icon:it.default}]}}}));return c.types.snapshotProcessor(s,{postProcessor(e,t){e.apolloSelectedFeature=void 0;const n=Object.fromEntries(Object.entries(e.apolloDataStore.assemblies).filter((([,e])=>"InMemoryFileDriver"===e.backendDriverType)));if(e.apolloDataStore={typeName:"Client",assemblies:n,checkResults:{}},!t)return e;const{apolloDataStore:a}=t,{checkResults:o}=a;for(const[,t]of o){const[n]=t.ids;if(!n)continue;const o=a.assemblies.get(n.assemblyId);o&&"InMemoryFileDriver"===o.backendDriverType&&(e.apolloDataStore.checkResults[t._id]=c.getSnapshot(t))}return e}})}const Hr="WorkerGlobalScope"in globalThis;for(const[n,a]of Object.entries(t.changes))e.changeRegistry.registerChange(n,a);const Vr=new t.CDSCheck;e.checkRegistry.registerCheck(Vr.name,Vr);const Jr=new t.TranscriptCheck;e.checkRegistry.registerCheck(Jr.name,Jr),t.validationRegistry.registerValidation(new t.CoreValidation),t.validationRegistry.registerValidation(new t.ParentChildValidation),exports.default=class extends ye.default{name="ApolloPlugin";version="0.3.9";configurationSchema=Er;install(e){!function(e){e.addAdapterType((()=>new Be.default({name:"ApolloSequenceAdapter",configSchema:ua,adapterMetadata:{category:void 0,hiddenFromGUI:!0,description:void 0},AdapterClass:ca})))}(e),function(e){e.addAdapterType((()=>new Be.default({name:"ApolloRefNameAliasAdapter",configSchema:la,adapterMetadata:{category:void 0,hiddenFromGUI:!0,description:void 0},AdapterClass:ra})))}(e),function(e){e.addTextSearchAdapterType((()=>new o.TextSearchAdapterType({name:"ApolloTextSearchAdapter",displayName:"Apollo text search adapter",configSchema:fa,AdapterClass:da,description:"Apollo Text Search adapter"})))}(e),e.addWidgetType((()=>{const e=a.ConfigurationSchema("ApolloFeatureDetailsWidget",{});return new o.WidgetType({name:"ApolloFeatureDetailsWidget",heading:"Apollo feature details",configSchema:e,stateModel:Na,ReactComponent:Da})})),e.addWidgetType((()=>{const e=a.ConfigurationSchema("ApolloTranscriptDetails",{});return new o.WidgetType({name:"ApolloTranscriptDetails",heading:"Apollo transcript details",configSchema:e,stateModel:Ra,ReactComponent:Ha})})),e.addTrackType((()=>{const t=a.ConfigurationSchema("ApolloTrack",{adapter:""},{baseConfiguration:o.createBaseTrackConfig(e),explicitIdentifier:"trackId"});return new o.TrackType({name:"ApolloTrack",configSchema:t,stateModel:o.createBaseTrackModel(e,"ApolloTrack",t)})})),e.addInternetAccountType((()=>new o.InternetAccountType({name:"ApolloInternetAccount",configSchema:ct,stateModel:aa(ct)}))),e.addDisplayType((()=>new o.DisplayType({name:"LinearApolloDisplay",configSchema:Va,stateModel:Zo(0,Va),trackType:"ApolloTrack",viewType:"LinearGenomeView",ReactComponent:jr}))),e.addDisplayType((()=>new o.DisplayType({name:"LinearApolloSixFrameDisplay",configSchema:dr,stateModel:Cr(0,dr),trackType:"ApolloTrack",viewType:"LinearGenomeView",ReactComponent:Gr}))),e.addDisplayType((()=>new o.DisplayType({name:"LinearApolloReferenceSequenceDisplay",configSchema:Yo,stateModel:cr(0,Yo),displayName:"Apollo reference sequence display",trackType:"ReferenceSequenceTrack",viewType:"LinearGenomeView",ReactComponent:ur}))),e.addToExtensionPoint("Core-extendSession",zr.bind(this,e)),e.addToExtensionPoint("Core-extendPluggableElement",(e=>{if("LinearGenomeView"===e.name){const{stateModel:t}=e,n=t.views((e=>{const t=e.rubberBandMenuItems;return{rubberBandMenuItems:()=>[...t(),{label:"Add new feature",icon:be.default,onClick:()=>{const t=r.getSession(e),{leftOffset:n,rightOffset:a}=e,o=e.getSelectedRegions(n,a);t.queueDialog((e=>[Tn,{session:t,handleClose:()=>{e()},region:o[0],changeManager:t.apolloDataStore.changeManager}]))}}]}}));e.stateModel=n}return e})),e.addToExtensionPoint("Core-extendPluggableElement",Dr),e.addToExtensionPoint("Core-extendPluggableElement",Mr),Hr||e.addToExtensionPoint("Core-extendWorker",(t=>"on"in t&&t.on?(t.on("apollo",(async n=>{if("object"!=typeof(a=n)||null===a||!("apollo"in a)||!0!==a.apollo)return;var a;const{apollo:o,messageId:r,method:l}=n;switch(l){case"getSequence":{const{region:a}=n,{assemblyName:l}=a,s=e.rootModel?.session?.apolloDataStore;if(!s)break;const i=s.getBackendDriver(l);if(!i)break;const{seq:c}=await i.getSequence(a);t.workers[0].postMessage({apollo:o,messageId:r,sequence:c});break}case"getRegions":{const{assembly:a}=n,l=e.rootModel?.session?.apolloDataStore;if(!l)break;const s=l.getBackendDriver(a);if(!s)break;const i=await s.getRegions(a);t.workers[0].postMessage({apollo:o,messageId:r,regions:i});break}case"getRefNameAliases":{const{assembly:a}=n,l=e.rootModel?.session?.apolloDataStore;if(!l)break;const s=l.getBackendDriver(a);if(!s)break;const i=await s.getRefNameAliases(a);t.workers[0].postMessage({apollo:o,messageId:r,refNameAliases:i});break}}})),t):t))}configure(e){var t;r.isAbstractMenuManager(e.rootModel)&&(e.jexl.addFunction("geneBackgroundColor",(e=>"pseudogene"===e?s.alpha("rgb(148, 203, 236)",.6):"ncRNA_gene"===e?s.alpha("rgb(194, 106, 119)",.6):void 0)),(t=e.rootModel).insertInMenu("Apollo",{label:"Redo",icon:rt.default,onClick(e){const{apolloDataStore:t}=e;t.changeManager.redoLastChange()}},0),t.insertInMenu("Apollo",{label:"Undo",icon:st.default,onClick(e){const{apolloDataStore:t}=e;t.changeManager.undoLastChange()}},0),t.appendToMenu("Apollo",{label:"Download GFF3",icon:tt.default,onClick:e=>{e.queueDialog((t=>[Nn,{session:e,handleClose:()=>{t()}}]))}}),t.appendToMenu("Apollo",{label:"View Change Log",icon:lt.default,onClick:e=>{e.queueDialog((t=>[$n,{session:e,handleClose:()=>{t()}}]))}}),t.appendToMenu("Apollo",{label:"Open local GFF3 file",icon:at.default,onClick:e=>{e.queueDialog((t=>[Bn,{session:e,handleClose:()=>{t()},inMemoryFileDriver:e.apolloDataStore.inMemoryFileDriver}]))}}),t.appendToMenu("Apollo",{label:"View check results",icon:nt.default,onClick:e=>{e.queueDialog((t=>[zn,{session:e,handleClose:()=>{t()}}]))}}),t.appendToMenu("Apollo",{label:"Lock/Unlock session",onClick:e=>{e.toggleLocked()}}),t.appendToMenu("Apollo",{label:"Log out",icon:ot.default,onClick:e=>{e.queueDialog((t=>[In,{session:e,handleClose:()=>{t()}}]))}}))}};
2
2
  //# sourceMappingURL=jbrowse-plugin-apollo.cjs.production.min.js.map