jbrowse-plugin-msaview 5.4.0 → 5.6.0

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 (47) hide show
  1. package/dist/MsaViewPanel/afterCreateAutoruns.d.ts +1 -0
  2. package/dist/MsaViewPanel/afterCreateAutoruns.js +8 -0
  3. package/dist/MsaViewPanel/connectedDomains.d.ts +58 -0
  4. package/dist/MsaViewPanel/connectedDomains.js +101 -0
  5. package/dist/MsaViewPanel/connectedDomains.test.d.ts +1 -0
  6. package/dist/MsaViewPanel/connectedDomains.test.js +147 -0
  7. package/dist/MsaViewPanel/domainTrack.d.ts +84 -0
  8. package/dist/MsaViewPanel/domainTrack.js +51 -0
  9. package/dist/MsaViewPanel/domainTrack.test.d.ts +1 -0
  10. package/dist/MsaViewPanel/domainTrack.test.js +69 -0
  11. package/dist/MsaViewPanel/loadProteinDomains.js +2 -1
  12. package/dist/MsaViewPanel/loadProteinDomains.test.js +2 -0
  13. package/dist/MsaViewPanel/model.d.ts +22 -2
  14. package/dist/MsaViewPanel/model.js +71 -2
  15. package/dist/MsaViewPanel/model.test.js +94 -0
  16. package/dist/MsaViewPanel/msaCoordToGenomeCoord.d.ts +11 -3
  17. package/dist/MsaViewPanel/msaCoordToGenomeCoord.js +21 -14
  18. package/dist/chunks/{LaunchMsaViewDialog-HGL6P4E4.js → LaunchMsaViewDialog-BG4MX2BW.js} +2 -2
  19. package/dist/chunks/{chunk-2XCUSA22.js → chunk-4TEPHD3L.js} +2 -2
  20. package/dist/chunks/{chunk-2XCUSA22.js.map → chunk-4TEPHD3L.js.map} +2 -2
  21. package/dist/chunks/model-SEEQQSQO.js +12 -0
  22. package/dist/chunks/model-SEEQQSQO.js.map +7 -0
  23. package/dist/jbrowse-plugin-msaview.esm.js +2 -2
  24. package/dist/jbrowse-plugin-msaview.esm.js.map +2 -2
  25. package/dist/utils/domainCache.js +24 -2
  26. package/dist/utils/ncbiDomains.d.ts +4 -1
  27. package/dist/utils/ncbiDomains.js +16 -25
  28. package/dist/version.d.ts +1 -1
  29. package/dist/version.js +1 -1
  30. package/package.json +1 -1
  31. package/src/LaunchMsaViewExtensionPoint/index.ts +5 -0
  32. package/src/MsaViewPanel/afterCreateAutoruns.ts +11 -0
  33. package/src/MsaViewPanel/connectedDomains.test.ts +196 -0
  34. package/src/MsaViewPanel/connectedDomains.ts +151 -0
  35. package/src/MsaViewPanel/domainTrack.test.ts +75 -0
  36. package/src/MsaViewPanel/domainTrack.ts +66 -0
  37. package/src/MsaViewPanel/loadProteinDomains.test.ts +2 -0
  38. package/src/MsaViewPanel/loadProteinDomains.ts +13 -11
  39. package/src/MsaViewPanel/model.test.ts +100 -0
  40. package/src/MsaViewPanel/model.ts +82 -1
  41. package/src/MsaViewPanel/msaCoordToGenomeCoord.ts +37 -25
  42. package/src/utils/domainCache.ts +27 -2
  43. package/src/utils/ncbiDomains.ts +20 -27
  44. package/src/version.ts +1 -1
  45. package/dist/chunks/model-36HCIOZJ.js +0 -12
  46. package/dist/chunks/model-36HCIOZJ.js.map +0 -7
  47. /package/dist/chunks/{LaunchMsaViewDialog-HGL6P4E4.js.map → LaunchMsaViewDialog-BG4MX2BW.js.map} +0 -0
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["global-externals:@jbrowse/core/util/translateTranscript", "../../src/LaunchMsaView/util.ts", "../../src/LaunchMsaView/components/fetchSeq.ts", "../../src/utils/eutils.ts", "../../src/utils/ncbiOrthologs.ts", "../../node_modules/.pnpm/idb@8.0.4/node_modules/idb/build/index.js", "../../src/utils/idb.ts", "../../src/utils/blastCache.ts", "../../src/utils/taxonomyNames.ts"],
4
4
  "sourcesContent": ["module.exports = JBrowseExports[\"@jbrowse/core/util/translateTranscript\"];", "import { getContainingView, sum } from '@jbrowse/core/util'\n\nimport type { AbstractTrackModel, Feature } from '@jbrowse/core/util'\nimport type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nexport function getLinearGenomeView(model: AbstractTrackModel) {\n return getContainingView(model) as LinearGenomeViewModel\n}\n\nfunction isNonEmptyString(v: unknown): v is string {\n return typeof v === 'string' && v !== ''\n}\n\nfunction uniqueDefined(vals: unknown[]): string[] {\n return [...new Set(vals.filter(isNonEmptyString))]\n}\n\nfunction joinDefined(sep: string, parts: unknown[]): string {\n return parts.filter(isNonEmptyString).join(sep)\n}\n\nexport function getTranscriptFeatures(feature: Feature) {\n // check if we are looking at a 'two-level' or 'three-level' feature by\n // finding exon/CDS subfeatures. we want to select from transcript names\n const subfeatures = feature.get('subfeatures') ?? []\n\n // Check for mRNA/transcript subfeatures (three-level: gene \u2192 mRNA \u2192 CDS)\n // Filter to only those that have CDS subfeatures (i.e. are coding)\n const transcripts = subfeatures.filter(\n (f: Feature) =>\n (f.get('type') === 'mRNA' || f.get('type') === 'transcript') &&\n f.get('subfeatures')?.some((s: Feature) => s.get('type') === 'CDS'),\n )\n if (transcripts.length > 0) {\n return transcripts\n }\n\n // Has direct CDS children, treat feature itself as the transcript\n // (two-level: gene \u2192 CDS or mRNA \u2192 CDS)\n return [feature]\n}\n\nexport function getTranscriptLength(feature: Feature) {\n const cdsLen = sum(\n feature\n .get('subfeatures')\n ?.filter(f => f.get('type') === 'CDS')\n .map(s => s.get('end') - s.get('start')) ?? [],\n )\n return {\n len: Math.floor(cdsLen / 3),\n mod: cdsLen % 3,\n }\n}\nexport function getId(val?: Feature): string {\n return val?.id() ?? ''\n}\n\nfunction getMatchableIds(val?: Feature): string[] {\n return val\n ? uniqueDefined([\n val.id(),\n val.get('name'),\n val.get('id'),\n val.get('transcript_id'),\n ])\n : []\n}\n\nexport function featureMatchesId(feature: Feature, id: string): boolean {\n return getMatchableIds(feature).includes(id)\n}\n\nexport function getTranscriptDisplayName(val?: Feature) {\n return val ? joinDefined(' ', [val.get('name'), val.get('id')]) : ''\n}\n\nexport function getGeneDisplayName(val?: Feature) {\n return val\n ? joinDefined(' ', [\n val.get('gene_name') ?? val.get('name'),\n val.get('id') ? `(${val.get('id')})` : undefined,\n ])\n : ''\n}\n\nexport function getBlastViewTitle(feature: Feature, transcript: Feature) {\n return `BLAST - ${getGeneDisplayName(feature)} - ${getTranscriptDisplayName(transcript)}`\n}\n\nexport function getSortedTranscriptFeatures(feature: Feature) {\n const transcripts = getTranscriptFeatures(feature)\n return transcripts.toSorted(\n (a, b) => getTranscriptLength(b).len - getTranscriptLength(a).len,\n )\n}\n\n/**\n * A translation as a query, still one residue per codon: g2p numbers codons,\n * and the query row is read through it. So the partial first codon (`&`), an\n * internal stop and an unreadable codon become X, and only what trails the\n * last whole codon is dropped.\n */\nexport function cleanProteinSequence(seq: string) {\n return seq.replace(/[*&]+$/, '').replaceAll(/[*&]/g, 'X')\n}\n\nexport function getGeneIdentifiers(feature: Feature): string[] {\n return uniqueDefined([\n feature.id(),\n feature.get('id'),\n feature.get('name'),\n feature.get('gene_id'),\n feature.get('gene_name'),\n ])\n}\n", "import { getConf } from '@jbrowse/core/configuration'\n\nimport type { AbstractSessionModel } from '@jbrowse/core/util'\n\nexport async function fetchSeq({\n start,\n end,\n refName,\n session,\n assemblyName,\n}: {\n start: number\n end: number\n refName: string\n assemblyName: string\n session: AbstractSessionModel\n}) {\n const { assemblyManager, rpcManager } = session\n const assembly = await assemblyManager.waitForAssembly(assemblyName)\n if (!assembly) {\n throw new Error('assembly not found')\n }\n const feats = await rpcManager.call('getSequence', 'CoreGetFeatures', {\n adapterConfig: getConf(assembly, ['sequence', 'adapter']),\n regions: [\n {\n start,\n end,\n refName: assembly.getCanonicalRefName(refName) ?? refName,\n assemblyName,\n },\n ],\n })\n return {\n seq: (feats[0]?.get('seq') as string | undefined) ?? '',\n // travels with the sequence because the caller needs both to translate, and\n // resolving the assembly twice to get them is the shape that lost it\n assemblyGeneticCodeId: assembly.getGeneticCodeId(refName),\n }\n}\n", "import { jsonfetch, textfetch, timeout } from './fetch'\n\n// NCBI asks that programmatic E-utilities requests identify themselves with a\n// tool name and contact email so they can reach out before throttling, rather\n// than silently rate-limiting. https://www.ncbi.nlm.nih.gov/books/NBK25497/\nconst NCBI_TOOL = 'jbrowse-plugin-msaview'\nconst NCBI_EMAIL = 'jbrowse2@berkeley.edu'\n\nconst EUTILS = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils'\n\ntype Endpoint = 'efetch' | 'esearch' | 'esummary'\n\nfunction identified(params: Record<string, string>) {\n return new URLSearchParams({ ...params, tool: NCBI_TOOL, email: NCBI_EMAIL })\n}\n\nexport function eutilsUrl(endpoint: Endpoint, params: Record<string, string>) {\n return `${EUTILS}/${endpoint}.fcgi?${identified(params).toString()}`\n}\n\nexport function efetchUrl(params: Record<string, string>) {\n return eutilsUrl('efetch', params)\n}\n\n/**\n * The same request as a POST body. An `id` list of a few hundred accessions\n * exceeds what a URL carries \u2014 865 of them is ~13KB \u2014 and NCBI documents POST\n * as the route above about 200 ids. eutils sends `ACAO: *` on both verbs.\n */\nexport function efetchPost(params: Record<string, string>) {\n return [\n `${EUTILS}/efetch.fcgi`,\n { method: 'POST', body: identified(params) },\n ] as const\n}\n\n/**\n * eutils allows 3 requests a second without an API key and answers a burst\n * over that with no `Access-Control-Allow-Origin`, which the browser reports as\n * a CORS failure. Every eutils request takes the next start slot, so however\n * many callers ask at once the requests go out under the limit.\n */\nexport const EUTILS_SPACING_MS = 350\n\nlet nextSlot = 0\n\nasync function eutilsSlot(signal?: AbortSignal | null) {\n const now = Date.now()\n const start = Math.max(now, nextSlot)\n nextSlot = start + EUTILS_SPACING_MS\n if (start > now) {\n try {\n await timeout(start - now, signal ?? undefined)\n } catch (e) {\n if (nextSlot === start + EUTILS_SPACING_MS) {\n nextSlot = start\n }\n throw e\n }\n }\n}\n\nexport async function eutilsText(url: string, init?: RequestInit) {\n await eutilsSlot(init?.signal)\n return textfetch(url, init)\n}\n\nexport async function eutilsJson<T>(url: string, init?: RequestInit) {\n await eutilsSlot(init?.signal)\n return jsonfetch<T>(url, init)\n}\n\nconst namedEntities: Record<string, string> = {\n amp: '&',\n apos: \"'\",\n gt: '>',\n lt: '<',\n quot: '\"',\n}\n\n/** Text lifted out of eutils XML still carries its escapes: `5&apos;-3&apos;`. */\nexport function decodeXmlEntities(text: string) {\n return text.replaceAll(\n /&(#x[\\da-f]+|#\\d+|[a-z]+);/gi,\n (entity, name: string) =>\n name.startsWith('#x') || name.startsWith('#X')\n ? String.fromCodePoint(Number.parseInt(name.slice(2), 16))\n : name.startsWith('#')\n ? String.fromCodePoint(Number(name.slice(1)))\n : (namedEntities[name] ?? entity),\n )\n}\n", "// Homolog discovery WITHOUT a search job.\n//\n// The BLAST path answers \"what looks like this sequence\", which is not the\n// question an MSA row set wants \u2014 it wants \"what is homologous to this gene,\n// one per species, labelled by species\". BLAST then costs 10+ minutes to\n// return a redundant, accession-labelled hit list that has to be deduplicated\n// before it reads. NCBI has already computed the answer: the Datasets\n// orthologs endpoint returns one ortholog gene per species, instantly.\n//\n// gene symbol -> gene id -> orthologs -> a representative protein each ->\n// sequences, all from NCBI, in a handful of requests. The caller aligns them\n// (EBI Clustal Omega, ~10s) and overlays CDD domains, which are already baked\n// into the GenPept records (see ncbiDomains.ts).\n//\n// Mirrors jb2hubs' website/src/components/proteinMsa.ts assembler, trimmed to\n// what the launch dialog needs and using this plugin's fetch/eutils helpers.\n\nimport {\n efetchPost,\n efetchUrl,\n eutilsJson,\n eutilsText,\n eutilsUrl,\n} from './eutils'\nimport { HttpError, jsonfetch } from './fetch'\n\n// v2, not v2alpha: the alpha path still answers /orthologs but 404s\n// /product_report, so an assembler pointed at it silently resolves zero\n// representative proteins and reports \"no orthologs\" for every gene.\nconst DATASETS = 'https://api.ncbi.nlm.nih.gov/datasets/v2'\n\n// NCBI's ortholog report IS the species panel. There is no list here to keep in\n// step with what NCBI knows, and the panel widens by itself as NCBI annotates\n// more genomes.\n//\n// It used to be a hand-written 23-species list intersected with the report, and\n// the intersection is what made the alignment thin: NCBI publishes 165 orthologs\n// for human NLRP1 and 865 for CFTR, so the list kept 12 of the first and 19 of\n// the second. It also carried four species -- fruitfly, yeast, C. elegans and\n// arabidopsis -- that the endpoint has never once returned for a human gene:\n// checked against NLRP1, TP53, ACTB, BRCA1, PIK3CA, APOE and NOTCH1, whose fly\n// ortholog is famous and still absent. NCBI's ortholog sets are vertebrate\n// scoped.\n//\n// The report's OWN order is the ladder the list was hand-built to approximate,\n// and it is per gene. CFTR opens human, mouse, rat, zebrafish, pig, sheep,\n// rabbit, chicken, cattle, ferret, dog, rhesus; NLRP1, which has no ortholog\n// outside placental mammals, opens human, mouse, rhesus, shrew mouse, chimp,\n// dog, cattle, horse. So `limit` takes a prefix and never needs a rank table.\n//\n// The rows are SUBMITTED in that order, not drawn in it -- the view lays rows out\n// by the guide tree the aligner returns.\n//\n// What limits the row count is the aligner, and it is linear in rows at roughly\n// half a second each for a ~1400aa protein: 165 NLRP1 orthologs align at EBI in\n// 88s, 865 CFTR orthologs in 407s. `defaultMaxSpecies` keeps a default run under\n// a minute; EBI's own ceiling is 4000 sequences and 4MB, which even CFTR's full\n// set (1.3MB) sits inside.\nexport const defaultMaxSpecies = 100\n\nexport interface OrthologRow {\n taxId: number\n /** single-token id used identically in the FASTA, the tree and the domain GFF */\n label: string\n scientificName: string\n commonName?: string\n geneId: string\n /** accession.version */\n protein: string\n sequence: string\n}\n\n/**\n * A candidate gene reference as the ortholog services know it: a GFF ID prefix\n * (gene:TP53) and a version suffix (NM_000546.6) stripped off. Shared with\n * pantherOrthologs, which asks PANTHER the same question with the same\n * candidates.\n */\nexport function cleanGeneCandidate(raw: string) {\n return raw\n .trim()\n .replace(/^\\w+:/, '')\n .replace(/\\.\\d+$/, '')\n}\n\nexport interface SymbolCandidate {\n gene_id?: string\n symbol?: string\n synonyms?: string[]\n}\n\n/**\n * NCBI's symbol lookups match aliases as well as symbols and rank neither\n * first: `TTN` in human answers TTR (transthyretin, whose alias it is) ahead of\n * titin, from Datasets and from an esearch `[Gene Name]` alike. Case decides\n * before a case-blind match, because fly `Dl` (Delta) and `dl` (dorsal) differ\n * by it alone. The first hit stands when nothing matches, which is what keeps\n * an alias like `p53` working. The same rule as jb2hubs' orthologSet.ts.\n */\nexport function pickBySymbol(query: string, candidates: SymbolCandidate[]) {\n const lower = query.toLowerCase()\n const exact =\n candidates.find(c => c.symbol === query) ??\n candidates.find(c => c.synonyms?.includes(query)) ??\n candidates.find(c => c.symbol?.toLowerCase() === lower)\n return (exact ?? candidates[0])?.gene_id\n}\n\n/** Datasets answers an unknown symbol with `{}` and an unroutable one with a 404 */\nasync function symbolCandidates(\n symbol: string,\n taxId: number,\n signal?: AbortSignal,\n) {\n try {\n const json = await jsonfetch<{ reports?: { gene?: SymbolCandidate }[] }>(\n `${DATASETS}/gene/symbol/${encodeURIComponent(symbol)}/taxon/${taxId}`,\n { signal },\n )\n return (json.reports ?? []).flatMap(r => (r.gene ? [r.gene] : []))\n } catch (e) {\n if (e instanceof HttpError && (e.status === 400 || e.status === 404)) {\n return []\n }\n throw e\n }\n}\n\nasync function searchGeneName(\n name: string,\n taxId: number,\n signal?: AbortSignal,\n) {\n const json = await eutilsJson<{\n esearchresult?: { idlist?: string[] }\n }>(\n eutilsUrl('esearch', {\n db: 'gene',\n term: `${name}[Gene Name] AND ${taxId}[taxid]`,\n retmode: 'json',\n retmax: '1',\n }),\n { signal },\n )\n return json.esearchresult?.idlist?.[0]\n}\n\n/**\n * A free-text gene reference -> NCBI gene id. Several candidate identifiers\n * are tried in order, because a JBrowse feature carries whatever its GFF/BigBed\n * had \u2014 `id()`, `name`, `gene_name` \u2014 and only some of those are real symbols.\n * `gene:TP53` and `TP53` are one search. Each is asked of Datasets, whose\n * candidates `pickBySymbol` ranks, and then of esearch, which also reaches\n * descriptions.\n *\n * A bare number is taken as the id itself only when no name resolves, since\n * nothing checks whose gene it is: a GFF `ID=12345` beside `Name=TP53` would\n * otherwise align some other organism's orthologs.\n */\nexport async function resolveGeneId(\n candidates: string[],\n taxId: number,\n signal?: AbortSignal,\n): Promise<{ geneId: string; matched: string } | undefined> {\n const asked = new Set<string>()\n const queries = candidates.map(c => c.trim())\n const isId = (query: string) => /^\\d+$/.test(query)\n for (const query of queries.filter(q => !isId(q))) {\n const cleaned = cleanGeneCandidate(query)\n if (!cleaned || asked.has(cleaned)) {\n continue\n }\n asked.add(cleaned)\n const geneId =\n pickBySymbol(cleaned, await symbolCandidates(cleaned, taxId, signal)) ??\n (await searchGeneName(cleaned, taxId, signal))\n if (geneId) {\n return { geneId, matched: cleaned }\n }\n }\n const id = queries.find(isId)\n return id ? { geneId: id, matched: id } : undefined\n}\n\ninterface OrthologReport {\n reports?: {\n gene?: {\n gene_id?: string\n tax_id?: string | number\n taxname?: string\n common_name?: string\n }\n }[]\n}\n\n/**\n * One ortholog gene per species, in NCBI's report order, capped at `limit`.\n *\n * `taxa` narrows the set when a caller wants specific species; omitted, every\n * species NCBI has an ortholog for is a candidate. `exclude` drops the query\n * taxon, which already has its own `<species>_query` row.\n */\nexport async function fetchOrthologGenes(\n geneId: string,\n {\n taxa,\n exclude,\n limit = defaultMaxSpecies,\n signal,\n }: {\n taxa?: Set<number>\n exclude?: number\n limit?: number\n signal?: AbortSignal\n } = {},\n) {\n const json = await jsonfetch<OrthologReport>(\n `${DATASETS}/gene/id/${geneId}/orthologs?returned_content=COMPLETE`,\n { signal },\n )\n const byTaxon = new Map<\n number,\n {\n taxId: number\n geneId: string\n scientificName: string\n commonName?: string\n }\n >()\n for (const { gene } of json.reports ?? []) {\n const taxId = Number(gene?.tax_id)\n if (\n gene?.gene_id &&\n taxId !== exclude &&\n (taxa?.has(taxId) ?? true) &&\n !byTaxon.has(taxId)\n ) {\n byTaxon.set(taxId, {\n taxId,\n geneId: gene.gene_id,\n scientificName: gene.taxname ?? String(taxId),\n commonName: gene.common_name,\n })\n }\n if (byTaxon.size >= limit) {\n break\n }\n }\n return [...byTaxon.values()]\n}\n\ninterface ProductReport {\n reports?: {\n product?: {\n gene_id?: string\n transcripts?: {\n select_category?: string\n protein?: { accession_version?: string; length?: number }\n }[]\n }\n }[]\n}\n\n// Two ceilings sit between a gene id list and its product report, and both fail\n// by returning less rather than by erroring, so a caller that ignores them just\n// draws a thinner alignment.\n//\n// The ids go in the URL PATH, and NCBI answers HTTP 414 above roughly 8KB of\n// them -- CFTR's 865 orthologs join to 8609 characters and 414 on the nose.\n// `PRODUCT_REPORT_CHUNK` keeps a request well inside that.\n//\n// Then the endpoint paginates at 20 with the count in `total_count` and the rest\n// behind `next_page_token`, which is invisible to a caller reading `reports`.\n// `page_size` covers a chunk in one request. The old 23-species panel never\n// reached this: the query taxon is excluded and NCBI has no ortholog for the\n// four invertebrate entries, so its ceiling was 19.\nconst PRODUCT_REPORT_CHUNK = 150\n\n/**\n * geneId -> representative protein accession: MANE Select where flagged, else\n * the longest isoform. A stable, comparable choice across species \u2014 picking\n * \"the first\" would silently vary with NCBI's ordering.\n */\nexport async function fetchRepresentativeProteins(\n geneIds: string[],\n signal?: AbortSignal,\n) {\n const byGene = new Map<string, string>()\n for (let i = 0; i < geneIds.length; i += PRODUCT_REPORT_CHUNK) {\n const chunk = geneIds.slice(i, i + PRODUCT_REPORT_CHUNK)\n const json = await jsonfetch<ProductReport>(\n `${DATASETS}/gene/id/${chunk.join(',')}/product_report?page_size=${chunk.length}`,\n { signal },\n )\n for (const { product } of json.reports ?? []) {\n const candidates = (product?.transcripts ?? [])\n .map(t => ({\n acc: t.protein?.accession_version,\n len: t.protein?.length ?? 0,\n mane: /select/i.test(t.select_category ?? ''),\n }))\n .filter(\n (c): c is { acc: string; len: number; mane: boolean } => !!c.acc,\n )\n const best =\n candidates.find(c => c.mane) ??\n [...candidates].sort((a, b) => b.len - a.len).at(0)\n if (product?.gene_id && best) {\n byGene.set(product.gene_id, best.acc)\n }\n }\n }\n return byGene\n}\n\n/** accession (first header token) -> ungapped sequence, from a multi-FASTA. */\nexport function parseFasta(text: string) {\n const map = new Map<string, string>()\n let acc: string | undefined\n let buf: string[] = []\n for (const line of text.split('\\n')) {\n if (line.startsWith('>')) {\n if (acc) {\n map.set(acc, buf.join(''))\n }\n acc = line.slice(1).split(/\\s+/)[0]\n buf = []\n } else {\n buf.push(line.trim())\n }\n }\n if (acc) {\n map.set(acc, buf.join(''))\n }\n return map\n}\n\nfunction sanitize(name: string) {\n return name.replace(/[^A-Za-z0-9]+/g, '_').replace(/^_+|_+$/g, '')\n}\n\n/**\n * Sanitized, unique single-token labels used identically in the FASTA headers,\n * the tree leaf names and the domain GFF seq_ids \u2014 that identity is how the\n * viewer pairs a tree leaf to its alignment row to its domain track. Collisions\n * get a numeric suffix rather than silently overwriting a row, and the suffix\n * climbs past labels already emitted: a species genuinely named `human_2` would\n * otherwise take the label the second `human` is about to get, merging two rows\n * into one.\n */\nexport function dedupeLabels(names: string[]) {\n const used = new Set<string>()\n return names.map(name => {\n const base = sanitize(name) || 'row'\n let label = base\n let n = 1\n while (used.has(label)) {\n n += 1\n label = `${base}_${n}`\n }\n used.add(label)\n return label\n })\n}\n\n/**\n * The representative protein for a single gene, with its sequence. Used to\n * decide whether the user's own translated transcript is byte-identical to the\n * RefSeq protein \u2014 if it is, that accession's precomputed CDD domains apply to\n * the query row exactly, and if it isn't, they would land at an offset.\n */\nexport async function fetchProteinForGene(\n geneId: string,\n signal?: AbortSignal,\n) {\n const acc = (await fetchRepresentativeProteins([geneId], signal)).get(geneId)\n if (!acc) {\n return undefined\n }\n const seq = parseFasta(\n await eutilsText(\n efetchUrl({ db: 'protein', id: acc, rettype: 'fasta', retmode: 'text' }),\n { signal },\n ),\n ).get(acc)\n return seq ? { accession: acc, sequence: seq } : undefined\n}\n\n/**\n * The whole NCBI half of the pipeline: gene -> ortholog rows carrying labels,\n * accessions and sequences. Everything here is a precomputed lookup, so this\n * returns in seconds rather than the 10+ minutes a BLAST submission costs.\n */\nexport async function fetchOrthologRows({\n geneId,\n taxa,\n exclude,\n limit,\n onProgress,\n signal,\n}: {\n geneId: string\n taxa?: Set<number>\n exclude?: number\n limit?: number\n onProgress: (arg: string) => void\n signal?: AbortSignal\n}): Promise<OrthologRow[]> {\n onProgress('Finding orthologs across species...')\n const genes = await fetchOrthologGenes(geneId, {\n taxa,\n exclude,\n limit,\n signal,\n })\n if (genes.length < 2) {\n throw new Error(\n `Only ${genes.length} ortholog(s) found for this gene \u2014 not enough to align`,\n )\n }\n\n onProgress('Selecting a representative protein per species...')\n const proteinByGene = await fetchRepresentativeProteins(\n genes.map(g => g.geneId),\n signal,\n )\n const withProtein = genes.filter(g => proteinByGene.has(g.geneId))\n if (withProtein.length < 2) {\n throw new Error(\n 'Could not resolve representative proteins for the orthologs',\n )\n }\n\n onProgress(`Fetching ${withProtein.length} protein sequences...`)\n const accessions = withProtein.map(g => proteinByGene.get(g.geneId)!)\n const [efetch, init] = efetchPost({\n db: 'protein',\n id: accessions.join(','),\n rettype: 'fasta',\n retmode: 'text',\n })\n const seqByAcc = parseFasta(await eutilsText(efetch, { ...init, signal }))\n\n const labels = dedupeLabels(\n withProtein.map(g => g.commonName ?? g.scientificName),\n )\n const rows = withProtein\n .map((g, i) => {\n const protein = proteinByGene.get(g.geneId)!\n return {\n taxId: g.taxId,\n label: labels[i]!,\n scientificName: g.scientificName,\n commonName: g.commonName,\n geneId: g.geneId,\n protein,\n sequence: seqByAcc.get(protein) ?? '',\n }\n })\n .filter(r => r.sequence)\n if (rows.length < 2) {\n throw new Error('Could not fetch protein sequences for the orthologs')\n }\n return rows\n}\n", "const instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c);\n\nlet idbProxyableTypes;\nlet cursorAdvanceMethods;\n// This is a function to prevent it throwing up in node environments.\nfunction getIdbProxyableTypes() {\n return (idbProxyableTypes ||\n (idbProxyableTypes = [\n IDBIndex,\n IDBObjectStore,\n IDBCursor,\n IDBDatabase,\n IDBTransaction,\n ]));\n}\n// This is a function to prevent it throwing up in node environments.\nfunction getCursorAdvanceMethods() {\n return (cursorAdvanceMethods ||\n (cursorAdvanceMethods = ['advance', 'continue', 'continuePrimaryKey'].map((method) => IDBCursor.prototype[method])));\n}\nconst transactionDoneMap = new WeakMap();\nconst transformCache = new WeakMap();\nconst reverseTransformCache = new WeakMap();\nfunction promisifyRequest(request) {\n const promise = new Promise((resolve, reject) => {\n const unlisten = () => {\n request.removeEventListener('success', success);\n request.removeEventListener('error', error);\n };\n const success = () => {\n resolve(wrap(request.result));\n unlisten();\n };\n const error = () => {\n reject(request.error);\n unlisten();\n };\n request.addEventListener('success', success);\n request.addEventListener('error', error);\n });\n // This mapping exists in reverseTransformCache but doesn't exist in transformCache. This\n // is because we create many promises from a single IDBRequest.\n reverseTransformCache.set(promise, request);\n return promise;\n}\nfunction cacheDonePromiseForTransaction(tx) {\n // Early bail if we've already created a done promise for this transaction.\n if (transactionDoneMap.has(tx))\n return;\n const done = new Promise((resolve, reject) => {\n const unlisten = () => {\n tx.removeEventListener('complete', complete);\n tx.removeEventListener('error', error);\n tx.removeEventListener('abort', error);\n };\n const complete = () => {\n resolve();\n unlisten();\n };\n const error = () => {\n reject(tx.error || new DOMException('AbortError', 'AbortError'));\n unlisten();\n };\n tx.addEventListener('complete', complete);\n tx.addEventListener('error', error);\n tx.addEventListener('abort', error);\n });\n // Cache it for later retrieval.\n transactionDoneMap.set(tx, done);\n}\nlet idbProxyTraps = {\n get(target, prop, receiver) {\n if (target instanceof IDBTransaction) {\n // Special handling for transaction.done.\n if (prop === 'done')\n return transactionDoneMap.get(target);\n // Make tx.store return the only store in the transaction, or undefined if there are many.\n if (prop === 'store') {\n return receiver.objectStoreNames[1]\n ? undefined\n : receiver.objectStore(receiver.objectStoreNames[0]);\n }\n }\n // Else transform whatever we get back.\n return wrap(target[prop]);\n },\n set(target, prop, value) {\n target[prop] = value;\n return true;\n },\n has(target, prop) {\n if (target instanceof IDBTransaction &&\n (prop === 'done' || prop === 'store')) {\n return true;\n }\n return prop in target;\n },\n};\nfunction replaceTraps(callback) {\n idbProxyTraps = callback(idbProxyTraps);\n}\nfunction wrapFunction(func) {\n // Due to expected object equality (which is enforced by the caching in `wrap`), we\n // only create one new func per func.\n // Cursor methods are special, as the behaviour is a little more different to standard IDB. In\n // IDB, you advance the cursor and wait for a new 'success' on the IDBRequest that gave you the\n // cursor. It's kinda like a promise that can resolve with many values. That doesn't make sense\n // with real promises, so each advance methods returns a new promise for the cursor object, or\n // undefined if the end of the cursor has been reached.\n if (getCursorAdvanceMethods().includes(func)) {\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n func.apply(unwrap(this), args);\n return wrap(this.request);\n };\n }\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n return wrap(func.apply(unwrap(this), args));\n };\n}\nfunction transformCachableValue(value) {\n if (typeof value === 'function')\n return wrapFunction(value);\n // This doesn't return, it just creates a 'done' promise for the transaction,\n // which is later returned for transaction.done (see idbObjectHandler).\n if (value instanceof IDBTransaction)\n cacheDonePromiseForTransaction(value);\n if (instanceOfAny(value, getIdbProxyableTypes()))\n return new Proxy(value, idbProxyTraps);\n // Return the same value back if we're not going to transform it.\n return value;\n}\nfunction wrap(value) {\n // We sometimes generate multiple promises from a single IDBRequest (eg when cursoring), because\n // IDB is weird and a single IDBRequest can yield many responses, so these can't be cached.\n if (value instanceof IDBRequest)\n return promisifyRequest(value);\n // If we've already transformed this value before, reuse the transformed value.\n // This is faster, but it also provides object equality.\n if (transformCache.has(value))\n return transformCache.get(value);\n const newValue = transformCachableValue(value);\n // Not all types are transformed.\n // These may be primitive types, so they can't be WeakMap keys.\n if (!Object.is(newValue, value)) {\n transformCache.set(value, newValue);\n reverseTransformCache.set(newValue, value);\n }\n return newValue;\n}\nconst unwrap = (value) => reverseTransformCache.get(value);\n\n/**\n * Open a database.\n *\n * @param name Name of the database.\n * @param version Schema version.\n * @param callbacks Additional callbacks.\n */\nfunction openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) {\n const request = indexedDB.open(name, version);\n const openPromise = wrap(request);\n if (upgrade) {\n request.addEventListener('upgradeneeded', (event) => {\n upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction), event);\n });\n }\n if (blocked) {\n request.addEventListener('blocked', (event) => blocked(\n // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405\n event.oldVersion, event.newVersion, event));\n }\n openPromise\n .then((db) => {\n if (terminated)\n db.addEventListener('close', () => terminated());\n if (blocking) {\n db.addEventListener('versionchange', (event) => blocking(event.oldVersion, event.newVersion, event));\n }\n })\n .catch(() => { });\n return openPromise;\n}\n/**\n * Delete a database.\n *\n * @param name Name of the database.\n */\nfunction deleteDB(name, { blocked } = {}) {\n const request = indexedDB.deleteDatabase(name);\n if (blocked) {\n request.addEventListener('blocked', (event) => blocked(\n // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405\n event.oldVersion, event));\n }\n return wrap(request).then(() => undefined);\n}\n\nconst readMethods = ['get', 'getKey', 'getAll', 'getAllKeys', 'count'];\nconst writeMethods = ['put', 'add', 'delete', 'clear'];\nconst cachedMethods = {};\nfunction getMethod(target, prop) {\n if (!(target instanceof IDBDatabase &&\n !(prop in target) &&\n typeof prop === 'string')) {\n return;\n }\n if (cachedMethods[prop])\n return cachedMethods[prop];\n const targetFuncName = prop.replace(/FromIndex$/, '');\n const useIndex = prop !== targetFuncName;\n const isWrite = writeMethods.includes(targetFuncName);\n if (\n // Bail if the target doesn't exist on the target. Eg, getAll isn't in Edge.\n !(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) ||\n !(isWrite || readMethods.includes(targetFuncName))) {\n return;\n }\n const method = async function (storeName, ...args) {\n // isWrite ? 'readwrite' : undefined gzipps better, but fails in Edge :(\n const tx = this.transaction(storeName, isWrite ? 'readwrite' : 'readonly');\n let target = tx.store;\n if (useIndex)\n target = target.index(args.shift());\n // Must reject if op rejects.\n // If it's a write operation, must reject if tx.done rejects.\n // Must reject with op rejection first.\n // Must resolve with op value.\n // Must handle both promises (no unhandled rejections)\n return (await Promise.all([\n target[targetFuncName](...args),\n isWrite && tx.done,\n ]))[0];\n };\n return (cachedMethods[prop] = method);\n}\nreplaceTraps((oldTraps) => ({\n ...oldTraps,\n get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver),\n has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop),\n}));\n\nconst advanceMethodProps = ['advance', 'continue', 'continuePrimaryKey'];\nconst methodMap = {};\nconst advanceResults = new WeakMap();\nconst ittrProxiedCursorToOriginalProxy = new WeakMap();\nconst cursorIteratorTraps = {\n get(target, prop) {\n if (!advanceMethodProps.includes(prop))\n return target[prop];\n let cachedFunc = methodMap[prop];\n if (!cachedFunc) {\n cachedFunc = methodMap[prop] = function (...args) {\n advanceResults.set(this, ittrProxiedCursorToOriginalProxy.get(this)[prop](...args));\n };\n }\n return cachedFunc;\n },\n};\nasync function* iterate(...args) {\n // tslint:disable-next-line:no-this-assignment\n let cursor = this;\n if (!(cursor instanceof IDBCursor)) {\n cursor = await cursor.openCursor(...args);\n }\n if (!cursor)\n return;\n cursor = cursor;\n const proxiedCursor = new Proxy(cursor, cursorIteratorTraps);\n ittrProxiedCursorToOriginalProxy.set(proxiedCursor, cursor);\n // Map this double-proxy back to the original, so other cursor methods work.\n reverseTransformCache.set(proxiedCursor, unwrap(cursor));\n while (cursor) {\n yield proxiedCursor;\n // If one of the advancing methods was not called, call continue().\n cursor = await (advanceResults.get(proxiedCursor) || cursor.continue());\n advanceResults.delete(proxiedCursor);\n }\n}\nfunction isIteratorProp(target, prop) {\n return ((prop === Symbol.asyncIterator &&\n instanceOfAny(target, [IDBIndex, IDBObjectStore, IDBCursor])) ||\n (prop === 'iterate' && instanceOfAny(target, [IDBIndex, IDBObjectStore])));\n}\nreplaceTraps((oldTraps) => ({\n ...oldTraps,\n get(target, prop, receiver) {\n if (isIteratorProp(target, prop))\n return iterate;\n return oldTraps.get(target, prop, receiver);\n },\n has(target, prop) {\n return isIteratorProp(target, prop) || oldTraps.has(target, prop);\n },\n}));\n\nexport { deleteDB, openDB, unwrap, wrap };\n", "import { openDB } from 'idb'\n\nimport type { DBSchema, IDBPDatabase, OpenDBCallbacks } from 'idb'\n\n/**\n * Memoized `openDB` for a typed schema, shared by this plugin's caches.\n *\n * Callers share one connection. The opener forgets it whenever it stops being\n * usable, so the next call opens a fresh one instead of replaying a rejection\n * or waiting on a dead handle: when the open fails (IndexedDB is unavailable in\n * some private-browsing modes), when another tab is blocked upgrading the\n * database and this connection steps aside for it, and when the browser\n * terminates the connection.\n *\n * An open blocked by another tab's older connection rejects rather than waiting\n * for that tab to close, which may never happen, since a build that predates\n * `blocking` never steps aside.\n *\n * Passing a DBSchema is what keeps `get`/`getAll` from returning `any`: with an\n * untyped database every cached record reaches the UI unchecked.\n */\nexport function createDbOpener<T extends DBSchema>(\n name: string,\n version: number,\n upgrade: OpenDBCallbacks<T>['upgrade'],\n) {\n let dbPromise: Promise<IDBPDatabase<T>> | undefined\n const forget = () => {\n dbPromise = undefined\n }\n return () => {\n dbPromise ??= new Promise<IDBPDatabase<T>>((resolve, reject) => {\n let gaveUp = false\n openDB<T>(name, version, {\n upgrade,\n blocked(currentVersion) {\n gaveUp = true\n reject(\n new Error(\n `${name} is held open at version ${currentVersion} by another tab`,\n ),\n )\n },\n blocking(_currentVersion, _blockedVersion, event) {\n ;(event.target as IDBDatabase).close()\n forget()\n },\n terminated: forget,\n }).then(db => {\n if (gaveUp) {\n db.close()\n } else {\n resolve(db)\n }\n }, reject)\n }).catch((e: unknown) => {\n forget()\n throw e\n })\n return dbPromise\n }\n}\n\n/**\n * Run a cache operation that the caller can do without. A cache only saves\n * work, so a read that fails answers `fallback` (a miss) and a write that fails\n * is skipped: neither may cost the user a search that already finished.\n */\nexport async function bestEffort<R>(\n what: string,\n operation: () => Promise<R>,\n fallback: R,\n) {\n try {\n return await operation()\n } catch (e) {\n console.warn(`[msaview] ${what} failed, continuing without it:`, e)\n return fallback\n }\n}\n", "import { defaultMaxHits } from '../LaunchMsaView/components/BlastQuery/consts'\nimport { bestEffort, createDbOpener } from './idb'\n\nimport type {\n BlastDatabase,\n MsaAlgorithm,\n PhmmerDatabase,\n SearchProgram,\n} from '../LaunchMsaView/components/BlastQuery/consts'\nimport type { DBSchema, IDBPDatabase } from 'idb'\n\nconst DB_NAME = 'jbrowse-msaview-blast-cache'\nconst STORE_NAME = 'blast-results'\nconst DB_VERSION = 2\n\n/**\n * How many results the history keeps. Every row holds a whole alignment and its\n * tree \u2014 megabytes each \u2014 so an unbounded store grows until the browser starts\n * refusing writes to it, and the user never sees why.\n */\nconst MAX_CACHED_RESULTS = 50\n\nexport interface CachedBlastResult {\n id: string\n proteinSequence: string\n blastDatabase: BlastDatabase | PhmmerDatabase\n /**\n * Only ever set on rows cached by a version that still queried NCBI, where\n * the choice between blastp and quick-blastp was real. Kept so those rows\n * still display; never written now.\n */\n blastProgram?: string\n /** absent on rows cached before phmmer existed, which were all blastp */\n searchProgram?: SearchProgram\n /** absent on phmmer rows, which are aligned by the search itself */\n msaAlgorithm?: MsaAlgorithm\n /** absent on rows saved before it was recorded */\n maxHits?: number\n msa: string\n tree: string\n treeMetadata: string\n rid: string\n timestamp: number\n geneId?: string\n transcriptId?: string\n transcriptName?: string\n geneName?: string\n}\n\ninterface BlastCacheDB extends DBSchema {\n [STORE_NAME]: {\n key: string\n value: CachedBlastResult\n }\n}\n\nconst getDB = createDbOpener<BlastCacheDB>(\n DB_NAME,\n DB_VERSION,\n (db, oldVersion) => {\n if (oldVersion < 2 && db.objectStoreNames.contains(STORE_NAME)) {\n db.deleteObjectStore(STORE_NAME)\n }\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME, { keyPath: 'id' })\n }\n },\n)\n\n/**\n * One history row per distinct search. Every input that changes the stored\n * alignment is in the key, or re-running the query with another aligner or hit\n * count overwrites the earlier row. A part added later is left out at its old\n * value so rows saved before it still resolve: phmmer keys are prefixed and\n * blastp keys are not, and the hit count appears only when it is not the\n * default.\n */\nexport function createCacheKey({\n proteinSequence,\n blastDatabase,\n msaAlgorithm,\n searchProgram,\n transcriptId,\n maxHits,\n}: {\n proteinSequence: string\n blastDatabase: BlastDatabase | PhmmerDatabase\n msaAlgorithm?: MsaAlgorithm\n searchProgram?: SearchProgram\n transcriptId?: string\n maxHits?: number\n}) {\n const idPart = transcriptId ? `:${transcriptId}` : ''\n const hitsPart =\n maxHits === undefined || maxHits === defaultMaxHits ? '' : `:n${maxHits}`\n return searchProgram === 'phmmer'\n ? `phmmer:${blastDatabase}${idPart}${hitsPart}:${proteinSequence}`\n : `${blastDatabase}:${msaAlgorithm}${idPart}${hitsPart}:${proteinSequence}`\n}\n\n/**\n * Record a finished search in the history. Best effort: the alignment is\n * already in hand, and a browser refusing the write must not turn it into a\n * failed launch.\n */\nexport function saveBlastResult({\n proteinSequence,\n blastDatabase,\n msaAlgorithm,\n searchProgram,\n maxHits,\n msa,\n tree,\n treeMetadata,\n rid,\n geneId,\n transcriptId,\n transcriptName,\n geneName,\n}: {\n proteinSequence: string\n blastDatabase: BlastDatabase | PhmmerDatabase\n msaAlgorithm?: MsaAlgorithm\n searchProgram?: SearchProgram\n maxHits?: number\n msa: string\n tree: string\n treeMetadata: string\n rid: string\n geneId?: string\n transcriptId?: string\n transcriptName?: string\n geneName?: string\n}) {\n return bestEffort(\n 'BLAST history write',\n async () => {\n const db = await getDB()\n const entry: CachedBlastResult = {\n id: createCacheKey({\n proteinSequence,\n blastDatabase,\n msaAlgorithm,\n searchProgram,\n transcriptId,\n maxHits,\n }),\n proteinSequence,\n blastDatabase,\n msaAlgorithm,\n searchProgram,\n maxHits,\n msa,\n tree,\n treeMetadata,\n rid,\n timestamp: Date.now(),\n geneId,\n transcriptId,\n transcriptName,\n geneName,\n }\n await db.put(STORE_NAME, entry)\n await evictOldest(db)\n return entry\n },\n undefined,\n )\n}\n\n/**\n * Drop the oldest rows until the store is back at MAX_CACHED_RESULTS.\n *\n * `count` first so the common save reads no values at all: without a timestamp\n * index the oldest have to be found by loading every row, and each one is an\n * entire alignment. Failing to evict must not fail the save \u2014 the result is\n * already in hand and losing it to a housekeeping error would be the worse\n * outcome.\n */\nasync function evictOldest(db: IDBPDatabase<BlastCacheDB>) {\n try {\n if ((await db.count(STORE_NAME)) <= MAX_CACHED_RESULTS) {\n return\n }\n const all = await db.getAll(STORE_NAME)\n const doomed = all\n .toSorted((a, b) => a.timestamp - b.timestamp)\n .slice(0, all.length - MAX_CACHED_RESULTS)\n const tx = db.transaction(STORE_NAME, 'readwrite')\n await Promise.all([...doomed.map(e => tx.store.delete(e.id)), tx.done])\n } catch (e) {\n console.warn('Failed to evict old BLAST cache entries:', e)\n }\n}\n\nexport async function getAllCachedResults() {\n const db = await getDB()\n const results = await db.getAll(STORE_NAME)\n return results.toSorted((a, b) => b.timestamp - a.timestamp)\n}\n\nexport async function deleteCachedResult(id: string) {\n const db = await getDB()\n await db.delete(STORE_NAME, id)\n}\n", "import { decodeXmlEntities, efetchUrl, eutilsText } from './eutils'\nimport { isAbortError } from './fetch'\nimport { bestEffort, createDbOpener } from './idb'\n\nimport type { DBSchema } from 'idb'\n\nconst DB_NAME = 'jbrowse-msaview-taxonomy-cache'\nconst STORE_NAME = 'common-names'\nconst DB_VERSION = 2\n\ninterface CachedTaxonomy {\n taxid: number\n sciname: string\n commonName?: string\n}\n\ninterface TaxonomyCacheDB extends DBSchema {\n [STORE_NAME]: {\n key: number\n value: CachedTaxonomy\n }\n}\n\nconst getDB = createDbOpener<TaxonomyCacheDB>(DB_NAME, DB_VERSION, db => {\n if (db.objectStoreNames.contains(STORE_NAME)) {\n db.deleteObjectStore(STORE_NAME)\n }\n db.createObjectStore(STORE_NAME, { keyPath: 'taxid' })\n})\n\nfunction getCachedTaxonomies(taxids: number[]) {\n return bestEffort(\n 'taxonomy cache read',\n async () => {\n const db = await getDB()\n const tx = db.transaction(STORE_NAME, 'readonly')\n const results = await Promise.all(\n taxids.map(taxid => tx.store.get(taxid)),\n )\n await tx.done\n return results\n },\n [],\n )\n}\n\nfunction saveTaxonomyCache(entries: CachedTaxonomy[]) {\n return bestEffort(\n 'taxonomy cache write',\n async () => {\n const db = await getDB()\n const tx = db.transaction(STORE_NAME, 'readwrite')\n for (const entry of entries) {\n await tx.store.put(entry)\n }\n await tx.done\n },\n undefined,\n )\n}\n\nexport interface TaxonomyInfo {\n sciname: string\n commonName?: string\n}\n\n/**\n * Names are a nicety, so a batch NCBI refuses leaves its taxa out of the\n * result rather than failing the caller. `onFailure` hears about each one, for\n * a caller that wants to say the names are missing.\n */\nexport async function fetchTaxonomyInfo(\n taxidsWithRepeats: number[],\n signal?: AbortSignal,\n onFailure?: (error: unknown) => void,\n): Promise<Map<number, TaxonomyInfo>> {\n // callers pass one taxid per alignment row, and a BLAST hit list is several\n // rows per species: 100 albumin hits are maybe 50 taxa, and asking as they\n // came did 100 IndexedDB reads and sent eutils 100 ids for 50 answers. The\n // result is keyed by taxid, so no caller can tell the difference\n const taxids = [...new Set(taxidsWithRepeats)]\n const result = new Map<number, TaxonomyInfo>()\n const uncachedTaxids: number[] = []\n const cachedResults = await getCachedTaxonomies(taxids)\n\n for (let i = 0; i < taxids.length; i++) {\n const taxid = taxids[i]!\n const cached = cachedResults[i]\n if (cached) {\n result.set(taxid, {\n sciname: cached.sciname,\n commonName: cached.commonName,\n })\n } else {\n uncachedTaxids.push(taxid)\n }\n }\n\n if (uncachedTaxids.length === 0) {\n return result\n }\n\n const batchSize = 100\n const toCache: CachedTaxonomy[] = []\n\n for (let i = 0; i < uncachedTaxids.length; i += batchSize) {\n const batch = uncachedTaxids.slice(i, i + batchSize)\n const idsParam = batch.join(',')\n\n try {\n // textfetch rather than a bare fetch: an NCBI 429/5xx returns an HTML\n // error body that the regexes below silently find nothing in, so without\n // the status check a throttled batch looks like \"these taxa have no\n // names\" instead of reporting why\n const text = await eutilsText(\n efetchUrl({ db: 'taxonomy', id: idsParam, retmode: 'xml' }),\n { signal },\n )\n\n // Build a map of taxid -> taxon block by finding Taxon elements.\n // Prefer entries with <LineageEx> (full top-level entries) over nested\n // entries inside another taxon's LineageEx\n const taxonMap = new Map<number, string>()\n const taxonRegex = /<Taxon>\\s*<TaxId>(\\d+)<\\/TaxId>/g\n let match\n while ((match = taxonRegex.exec(text)) !== null) {\n const matchedTaxid = Number(match[1])\n const startIdx = match.index\n\n // Find the matching closing </Taxon> by counting nesting depth\n let depth = 1\n let endIdx = startIdx + match[0].length\n while (depth > 0 && endIdx < text.length) {\n const openMatch = text.indexOf('<Taxon>', endIdx)\n const closeMatch = text.indexOf('</Taxon>', endIdx)\n if (closeMatch === -1) {\n break\n }\n if (openMatch !== -1 && openMatch < closeMatch) {\n depth++\n endIdx = openMatch + 7\n } else {\n depth--\n endIdx = closeMatch + 8\n }\n }\n\n const taxonXml = text.slice(startIdx, endIdx)\n const existing = taxonMap.get(matchedTaxid)\n const hasLineageEx = taxonXml.includes('<LineageEx>')\n const existingHasLineageEx = existing?.includes('<LineageEx>')\n if (!existing || (hasLineageEx && !existingHasLineageEx)) {\n taxonMap.set(matchedTaxid, taxonXml)\n }\n }\n\n for (const taxid of batch) {\n const taxonXml = taxonMap.get(taxid)\n if (taxonXml) {\n const genbankCommon =\n /<GenbankCommonName>(.*?)<\\/GenbankCommonName>/.exec(taxonXml)\n const commonName = /<CommonName>(.*?)<\\/CommonName>/.exec(taxonXml)\n const sciName = /<ScientificName>(.*?)<\\/ScientificName>/.exec(\n taxonXml,\n )\n const rawName = genbankCommon?.[1] ?? commonName?.[1]\n const name = rawName && decodeXmlEntities(rawName)\n\n const sci = decodeXmlEntities(sciName?.[1] ?? '')\n result.set(taxid, { sciname: sci, commonName: name })\n toCache.push({ taxid, sciname: sci, commonName: name })\n }\n }\n } catch (error) {\n if (isAbortError(error)) {\n await saveTaxonomyCache(toCache)\n throw error\n }\n console.error('Failed to fetch taxonomy data:', error)\n onFailure?.(error)\n }\n }\n\n if (toCache.length > 0) {\n await saveTaxonomyCache(toCache)\n }\n\n return result\n}\n"],
5
- "mappings": "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",
6
- "names": ["require_translateTranscript", "__commonJSMin", "exports", "module", "import_util", "getLinearGenomeView", "model", "isNonEmptyString", "v", "uniqueDefined", "vals", "joinDefined", "sep", "parts", "getTranscriptFeatures", "feature", "transcripts", "f", "s", "getTranscriptLength", "cdsLen", "getId", "val", "getMatchableIds", "featureMatchesId", "id", "getTranscriptDisplayName", "getGeneDisplayName", "getBlastViewTitle", "transcript", "getSortedTranscriptFeatures", "a", "b", "cleanProteinSequence", "seq", "getGeneIdentifiers", "import_configuration", "fetchSeq", "start", "end", "refName", "session", "assemblyName", "assemblyManager", "rpcManager", "assembly", "NCBI_TOOL", "NCBI_EMAIL", "EUTILS", "identified", "params", "eutilsUrl", "endpoint", "efetchUrl", "efetchPost", "EUTILS_SPACING_MS", "nextSlot", "eutilsSlot", "signal", "now", "start", "timeout", "e", "eutilsText", "url", "init", "textfetch", "eutilsJson", "jsonfetch", "namedEntities", "decodeXmlEntities", "text", "entity", "name", "DATASETS", "defaultMaxSpecies", "cleanGeneCandidate", "raw", "pickBySymbol", "query", "candidates", "lower", "c", "symbolCandidates", "symbol", "taxId", "signal", "jsonfetch", "r", "e", "HttpError", "searchGeneName", "name", "eutilsJson", "eutilsUrl", "resolveGeneId", "asked", "queries", "isId", "q", "cleaned", "geneId", "id", "fetchOrthologGenes", "taxa", "exclude", "limit", "json", "byTaxon", "gene", "PRODUCT_REPORT_CHUNK", "fetchRepresentativeProteins", "geneIds", "byGene", "i", "chunk", "product", "t", "best", "a", "b", "parseFasta", "text", "map", "acc", "buf", "line", "sanitize", "dedupeLabels", "names", "used", "base", "label", "n", "fetchProteinForGene", "seq", "eutilsText", "efetchUrl", "fetchOrthologRows", "onProgress", "genes", "proteinByGene", "g", "withProtein", "accessions", "efetch", "init", "efetchPost", "seqByAcc", "labels", "rows", "protein", "instanceOfAny", "object", "constructors", "c", "idbProxyableTypes", "cursorAdvanceMethods", "getIdbProxyableTypes", "getCursorAdvanceMethods", "method", "transactionDoneMap", "transformCache", "reverseTransformCache", "promisifyRequest", "request", "promise", "resolve", "reject", "unlisten", "success", "error", "wrap", "cacheDonePromiseForTransaction", "tx", "done", "complete", "idbProxyTraps", "target", "prop", "receiver", "value", "replaceTraps", "callback", "wrapFunction", "func", "args", "unwrap", "transformCachableValue", "newValue", "openDB", "name", "version", "blocked", "upgrade", "blocking", "terminated", "openPromise", "event", "db", "readMethods", "writeMethods", "cachedMethods", "getMethod", "target", "prop", "targetFuncName", "useIndex", "isWrite", "method", "storeName", "args", "tx", "replaceTraps", "oldTraps", "receiver", "advanceMethodProps", "methodMap", "advanceResults", "ittrProxiedCursorToOriginalProxy", "cursorIteratorTraps", "cachedFunc", "iterate", "cursor", "proxiedCursor", "reverseTransformCache", "unwrap", "isIteratorProp", "instanceOfAny", "createDbOpener", "name", "version", "upgrade", "dbPromise", "forget", "resolve", "reject", "gaveUp", "openDB", "currentVersion", "_currentVersion", "_blockedVersion", "event", "db", "e", "bestEffort", "what", "operation", "fallback", "DB_NAME", "STORE_NAME", "DB_VERSION", "MAX_CACHED_RESULTS", "getDB", "createDbOpener", "db", "oldVersion", "createCacheKey", "proteinSequence", "blastDatabase", "msaAlgorithm", "searchProgram", "transcriptId", "maxHits", "idPart", "hitsPart", "defaultMaxHits", "saveBlastResult", "msa", "tree", "treeMetadata", "rid", "geneId", "transcriptName", "geneName", "bestEffort", "entry", "evictOldest", "all", "doomed", "a", "b", "tx", "e", "getAllCachedResults", "deleteCachedResult", "id", "DB_NAME", "STORE_NAME", "DB_VERSION", "getDB", "createDbOpener", "db", "getCachedTaxonomies", "taxids", "bestEffort", "tx", "results", "taxid", "saveTaxonomyCache", "entries", "entry", "fetchTaxonomyInfo", "taxidsWithRepeats", "signal", "onFailure", "result", "uncachedTaxids", "cachedResults", "i", "cached", "batchSize", "toCache", "batch", "idsParam", "text", "eutilsText", "efetchUrl", "taxonMap", "taxonRegex", "match", "matchedTaxid", "startIdx", "depth", "endIdx", "openMatch", "closeMatch", "taxonXml", "existing", "hasLineageEx", "existingHasLineageEx", "genbankCommon", "commonName", "sciName", "rawName", "name", "decodeXmlEntities", "sci", "error", "isAbortError"]
5
+ "mappings": "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",
6
+ "names": ["require_translateTranscript", "__commonJSMin", "exports", "module", "import_util", "getLinearGenomeView", "model", "isNonEmptyString", "v", "uniqueDefined", "vals", "joinDefined", "sep", "parts", "getTranscriptFeatures", "feature", "transcripts", "f", "s", "getTranscriptLength", "cdsLen", "getId", "val", "getMatchableIds", "featureMatchesId", "id", "getTranscriptDisplayName", "getGeneDisplayName", "getBlastViewTitle", "transcript", "getSortedTranscriptFeatures", "a", "b", "cleanProteinSequence", "seq", "getGeneIdentifiers", "import_configuration", "fetchSeq", "start", "end", "refName", "session", "assemblyName", "assemblyManager", "rpcManager", "assembly", "NCBI_TOOL", "NCBI_EMAIL", "EUTILS", "identified", "params", "eutilsUrl", "endpoint", "efetchUrl", "efetchPost", "EUTILS_SPACING_MS", "nextSlot", "eutilsSlot", "signal", "now", "start", "timeout", "e", "eutilsText", "url", "init", "textfetch", "eutilsJson", "jsonfetch", "namedEntities", "decodeXmlEntities", "text", "entity", "name", "DATASETS", "defaultMaxSpecies", "cleanGeneCandidate", "raw", "pickBySymbol", "query", "candidates", "lower", "c", "symbolCandidates", "symbol", "taxId", "signal", "jsonfetch", "r", "e", "HttpError", "searchGeneName", "name", "eutilsJson", "eutilsUrl", "resolveGeneId", "asked", "queries", "isId", "q", "cleaned", "geneId", "id", "fetchOrthologGenes", "taxa", "exclude", "limit", "json", "byTaxon", "gene", "PRODUCT_REPORT_CHUNK", "fetchRepresentativeProteins", "geneIds", "byGene", "i", "chunk", "product", "t", "best", "a", "b", "parseFasta", "text", "map", "acc", "buf", "line", "sanitize", "dedupeLabels", "names", "used", "base", "label", "n", "fetchProteinForGene", "seq", "eutilsText", "efetchUrl", "fetchOrthologRows", "onProgress", "genes", "proteinByGene", "g", "withProtein", "accessions", "efetch", "init", "efetchPost", "seqByAcc", "labels", "rows", "protein", "instanceOfAny", "object", "constructors", "c", "idbProxyableTypes", "cursorAdvanceMethods", "getIdbProxyableTypes", "getCursorAdvanceMethods", "method", "transactionDoneMap", "transformCache", "reverseTransformCache", "promisifyRequest", "request", "promise", "resolve", "reject", "unlisten", "success", "error", "wrap", "cacheDonePromiseForTransaction", "tx", "done", "complete", "idbProxyTraps", "target", "prop", "receiver", "value", "replaceTraps", "callback", "wrapFunction", "func", "args", "unwrap", "transformCachableValue", "newValue", "openDB", "name", "version", "blocked", "upgrade", "blocking", "terminated", "openPromise", "event", "db", "deleteDB", "readMethods", "writeMethods", "cachedMethods", "getMethod", "targetFuncName", "useIndex", "isWrite", "storeName", "oldTraps", "advanceMethodProps", "methodMap", "advanceResults", "ittrProxiedCursorToOriginalProxy", "cursorIteratorTraps", "cachedFunc", "iterate", "cursor", "proxiedCursor", "isIteratorProp", "createDbOpener", "name", "version", "upgrade", "dbPromise", "forget", "resolve", "reject", "gaveUp", "openDB", "currentVersion", "_currentVersion", "_blockedVersion", "event", "db", "e", "bestEffort", "what", "operation", "fallback", "DB_NAME", "STORE_NAME", "DB_VERSION", "MAX_CACHED_RESULTS", "getDB", "createDbOpener", "db", "oldVersion", "createCacheKey", "proteinSequence", "blastDatabase", "msaAlgorithm", "searchProgram", "transcriptId", "maxHits", "idPart", "hitsPart", "defaultMaxHits", "saveBlastResult", "msa", "tree", "treeMetadata", "rid", "geneId", "transcriptName", "geneName", "bestEffort", "entry", "evictOldest", "all", "doomed", "a", "b", "tx", "e", "getAllCachedResults", "deleteCachedResult", "id", "DB_NAME", "STORE_NAME", "DB_VERSION", "getDB", "createDbOpener", "db", "getCachedTaxonomies", "taxids", "bestEffort", "tx", "results", "taxid", "saveTaxonomyCache", "entries", "entry", "fetchTaxonomyInfo", "taxidsWithRepeats", "signal", "onFailure", "result", "uncachedTaxids", "cachedResults", "i", "cached", "batchSize", "toCache", "batch", "idsParam", "text", "eutilsText", "efetchUrl", "taxonMap", "taxonRegex", "match", "matchedTaxid", "startIdx", "depth", "endIdx", "openMatch", "closeMatch", "taxonXml", "existing", "hasLineageEx", "existingHasLineageEx", "genbankCommon", "commonName", "sciName", "rawName", "name", "decodeXmlEntities", "sci", "error", "isAbortError"]
7
7
  }
@@ -0,0 +1,12 @@
1
+ import{b as rt,e as it}from"./chunk-QQKPT6EL.js";import{e as ot}from"./chunk-FFHB7WP7.js";import"./chunk-JDQUBCHM.js";import"./chunk-5OSSOQH4.js";import{a as xA,b as _e,c as lA,d as FA,e as Ye,f as RA,g as He,h as Pe,i as Ho}from"./chunk-JFL3LJPO.js";import{a as ne}from"./chunk-FCWXYIFC.js";import{A as et,B as rA,C as tt,D as nt,E as iA,b as Ze,j as GA,l as Po,m as Xe,n as je,o as nA,p as oA,q as We,u as ze,v as $e,x as At,y as mA,z as JA}from"./chunk-4TEPHD3L.js";import{b as Ke,d as O,e as Te,f as R,j as Oe,p as Ve}from"./chunk-F726IWCW.js";import{c as Ko}from"./chunk-AQ2THRTR.js";import"./chunk-XXCNVFGP.js";import{a as uA}from"./chunk-KSCGTF4R.js";import{a as Yo}from"./chunk-2IWD4OO4.js";import{a as vA}from"./chunk-ASUKJX5J.js";import"./chunk-ZQSWX57C.js";import"./chunk-73KAPCJ2.js";import"./chunk-35FWLG3N.js";import"./chunk-CVLB4VFP.js";import"./chunk-DNFD5II2.js";import"./chunk-BX4Z274Q.js";import"./chunk-J6KYLXRD.js";import{b as F}from"./chunk-FY3BTKY4.js";var _o=F(Ho()),K=F(uA()),b=F(ne()),ee=F(vA());var uo=F(uA()),MA=F(ne()),SA=F(vA());var re="ARNDCQEGHILKMFPSTWYVBZX*",To=[[4,-1,-2,-2,0,-1,-1,0,-2,-1,-1,-1,-1,-2,-1,1,0,-3,-2,0,-2,-1,0,-4],[-1,5,0,-2,-3,1,0,-2,0,-3,-2,2,-1,-3,-2,-1,-1,-3,-2,-3,-1,0,-1,-4],[-2,0,6,1,-3,0,0,0,1,-3,-3,0,-2,-3,-2,1,0,-4,-2,-3,3,0,-1,-4],[-2,-2,1,6,-3,0,2,-1,-1,-3,-4,-1,-3,-3,-1,0,-1,-4,-3,-3,4,1,-1,-4],[0,-3,-3,-3,9,-3,-4,-3,-3,-1,-1,-3,-1,-2,-3,-1,-1,-2,-2,-1,-3,-3,-2,-4],[-1,1,0,0,-3,5,2,-2,0,-3,-2,1,0,-3,-1,0,-1,-2,-1,-2,0,3,-1,-4],[-1,0,0,2,-4,2,5,-2,0,-3,-3,1,-2,-3,-1,0,-1,-3,-2,-2,1,4,-1,-4],[0,-2,0,-1,-3,-2,-2,6,-2,-4,-4,-2,-3,-3,-2,0,-2,-2,-3,-3,-1,-2,-1,-4],[-2,0,1,-1,-3,0,0,-2,8,-3,-3,-1,-2,-1,-2,-1,-2,-2,2,-3,0,0,-1,-4],[-1,-3,-3,-3,-1,-3,-3,-4,-3,4,2,-3,1,0,-3,-2,-1,-3,-1,3,-3,-3,-1,-4],[-1,-2,-3,-4,-1,-2,-3,-4,-3,2,4,-2,2,0,-3,-2,-1,-2,-1,1,-4,-3,-1,-4],[-1,2,0,-1,-3,1,1,-2,-1,-3,-2,5,-1,-3,-1,0,-1,-3,-2,-2,0,1,-1,-4],[-1,-1,-2,-3,-1,0,-2,-3,-2,1,2,-1,5,0,-2,-1,-1,-1,-1,1,-3,-1,-1,-4],[-2,-3,-3,-3,-2,-3,-3,-3,-1,0,0,-3,0,6,-4,-2,-2,1,3,-1,-3,-3,-1,-4],[-1,-2,-2,-1,-3,-1,-1,-2,-2,-3,-3,-1,-2,-4,7,-1,-1,-4,-3,-2,-2,-1,-2,-4],[1,-1,1,0,-1,0,0,0,-1,-2,-2,0,-1,-2,-1,4,1,-3,-2,-2,0,0,0,-4],[0,-1,0,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-2,-1,1,5,-2,-2,0,-1,-1,0,-4],[-3,-3,-4,-4,-2,-2,-3,-2,-2,-3,-2,-3,-1,1,-4,-3,-2,11,2,-3,-4,-3,-2,-4],[-2,-2,-2,-3,-2,-1,-2,-3,2,-1,-1,-2,-1,3,-3,-2,-2,2,7,-1,-3,-2,-1,-4],[0,-3,-3,-3,-1,-2,-2,-3,-3,3,1,-2,1,-1,-2,-2,0,-3,-1,4,-3,-2,-1,-4],[-2,-1,3,4,-3,0,1,-1,0,-3,-4,0,-3,-3,-2,0,-1,-4,-3,-3,4,1,-1,-4],[-1,0,0,1,-3,3,4,-2,0,-3,-3,1,-1,-3,-1,0,-1,-3,-2,-2,1,4,-1,-4],[0,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,0,0,-2,-1,-1,-1,-1,-1,-4],[-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,1]],gt=re.length,Oo=Int8Array.from(To.flat()),ct=re.indexOf("X"),oe=new Uint8Array(128).fill(ct);for(let A=0;A<gt;A++){let t=re[A];oe[t.charCodeAt(0)]=A,oe[t.toLowerCase().charCodeAt(0)]=A}function at(A){let t=new Uint8Array(A.length);for(let e=0;e<A.length;e++){let n=A.charCodeAt(e);t[e]=n<128?oe[n]:ct}return t}var aA=11,LA=1,W=-1e6,z=0,sA=1,hA=2;function Zo(A,t){let e=at(A),n=at(t),r=e.length,o=n.length,i=o+1,s=new Uint8Array((r+1)*i),c=new Int32Array(i),a=new Int32Array(i),g=new Int32Array(i),C=new Int32Array(i),Q=new Int32Array(i),I=new Int32Array(i);c[0]=0,a[0]=W,g[0]=W;for(let w=1;w<=o;w++)c[w]=W,a[w]=W,g[w]=0;let d=W,h=0,u=0,l=z;for(let w=1;w<=r;w++){C[0]=W,Q[0]=0,I[0]=W;let D=e[w-1]*gt,x=w*i;for(let N=1;N<=o;N++){let L=Oo[D+n[N-1]],U=c[N-1],tA=z;a[N-1]>U&&(U=a[N-1],tA=sA),g[N-1]>U&&(U=g[N-1],tA=hA),C[N]=U+L;let q=c[N]-aA,T=z;a[N]-LA>q&&(q=a[N]-LA,T=sA),g[N]-aA>q&&(q=g[N]-aA,T=hA),Q[N]=q;let fA=C[N-1]-aA,te=z;I[N-1]-LA>fA&&(fA=I[N-1]-LA,te=hA),Q[N-1]-aA>fA&&(fA=Q[N-1]-aA,te=sA),I[N]=fA,s[x+N]=tA|T<<2|te<<4}for(let[N,L]of[[z,C],[sA,Q],[hA,I]])L[o]>d&&(d=L[o],h=w,u=o,l=N);if(w===r)for(let N=0;N<o;N++)for(let[L,U]of[[z,C],[sA,Q],[hA,I]])U[N]>d&&(d=U[N],h=r,u=N,l=L);[c,C]=[C,c],[a,Q]=[Q,a],[g,I]=[I,g]}let p=Array.from({length:r}).fill("-"),m=Array.from({length:r+1}).fill("");m[r]=t.slice(u);let B=h,E=u,y=l,f=[],k=w=>{f.length&&(m[w]=f.reverse().join("")+m[w],f=[])};for(;B>0&&E>0;){let w=B*i+E;y===z?(k(B),p[B-1]=t[E-1],y=s[w]&3,B--,E--):y===sA?(k(B),y=s[w]>>2&3,B--):(f.push(t[E-1]),y=s[w]>>4,E--)}return k(B),m[0]=t.slice(0,E)+m[0],{matched:p,inserts:m}}function Xo(A,t){let e=A.sequence.length,n=new Array(e+1).fill(0);for(let{alignment:o}of t)for(let i=0;i<=e;i++)n[i]=Math.max(n[i],o.inserts[i].length);let r=(o,i)=>{let s=[];for(let c=0;c<=e;c++)s.push(i[c].padEnd(n[c],"-")),c<e&&s.push(o[c]);return s.join("")};return[{name:A.name,sequence:r(A.sequence.split(""),Array.from({length:e+1}).fill(""))},...t.map(({name:o,alignment:i})=>({name:o,sequence:r(i.matched,i.inserts)}))]}var st=5e7,Vo=5e6;function ie(A,t,e){if(t*e>st)throw new Error(`${A} (${t} residues) against the ${e}-residue query is too large to align in the browser, which stops at ${st/1e6}M residue pairs per sequence. Choose an EBI aligner such as Clustal Omega instead.`)}async function It({query:A,targets:t,onProgress:e,signal:n}){for(let i of t)ie(i.name,i.sequence.length,A.sequence.length);let r=[],o=1/0;for(let i of t)o>=Vo&&(e?.(`Aligning ${r.length+1} of ${t.length} sequences in the browser...`),await Te(0,n),o=0),r.push({name:i.name,alignment:Zo(A.sequence,i.sequence)}),o+=A.sequence.length*i.sequence.length;return Xo(A,r).map(i=>`>${i.name}
2
+ ${i.sequence}`).join(`
3
+ `)}function Qt(A){let t=[];for(let e of A.split(">")){let[n,...r]=e.split(`
4
+ `),o=n?.trim().split(/\s+/)[0];o&&t.push({name:o,sequence:r.join("").replaceAll(/[\s*-]/g,"")})}return t}var Bt={blastp:rt,phmmer:it};var jo={clustalo:{params:{},msaResult:"aln-clustal_num",treeResult:"phylotree"},muscle:{params:{format:"clw",tree:"tree1"},msaResult:"fa",treeResult:"phylotree"},kalign:{params:{stype:"protein"},msaResult:"fa",treeResult:"phylotree"},mafft:{params:{stype:"protein"},msaResult:"fa",treeResult:"phylotree"}};async function UA({algorithm:A,sequence:t,onProgress:e,signal:n}){if(A==="browser"){let[c,...a]=Qt(t);if(!c)throw new Error("Nothing to align");return{msa:await It({query:c,targets:a,onProgress:e,signal:n}),tree:""}}let r=jo[A],o=await Oe({tool:A,label:`${A} MSA`,params:{...r.params,sequence:t},onProgress:e,signal:n}),[i,s]=await Promise.all([o.result(r.msaResult),o.result(r.treeResult)]);return{msa:i,tree:s}}function Wo(A,t){let e=A.sciname.replaceAll(" ","_");if(A.taxid&&t?.has(A.taxid)){let n=t.get(A.taxid);n.commonName&&(e=n.commonName.split(" ").map(r=>r.charAt(0).toUpperCase()+r.slice(1).toLowerCase()).join("_"))}return`${A.accession}-${e}`}function zo(A,t){let e={},n=A.taxid?t.get(A.taxid):void 0;return n?.sciname&&(e["Scientific name"]=n.sciname),n?.commonName&&(e["Common name"]=n.commonName),A.accession&&(e.Accession=A.accession),A.id&&(e.ID=A.id),A.title&&(e.Description=A.title),e}function $o(A,t){let e=A.map(o=>Wo(o,t)),n=new Map;for(let o of e)n.set(o,(n.get(o)??0)+1);let r=new Set;return e.map((o,i)=>{let s=n.get(o)>1?`${o}_${A[i].range??i+1}`:o;for(;r.has(s);)s=`${s}_${i+1}`;return r.add(s),s})}function Ct({hits:A,query:t,queryRow:e,taxonomyInfo:n,querySeqName:r="QUERY"}){let o={},i=$o(A,n),s=A.map((c,a)=>{let g=i[a];return o[g]=zo(c,n),`>${g}
5
+ ${c.sequence}`});return{msa:[`>${r}
6
+ ${e??t}`,...s].join(`
7
+ `),treeMetadata:o}}var Ar="jbrowse-msaview-search-cache",gA="searches",Et=20,er=10080*60*1e3,dt=nA(Ar,1,A=>{A.createObjectStore(gA,{keyPath:"id"})});function ft({searchProgram:A,database:t,maxHits:e,querySeqName:n,query:r}){return[A,t,e??"",n,r].join(":")}function ut(A){return oA("search cache read",async()=>{let t=await(await dt()).get(gA,A);return t&&Date.now()-t.timestamp<er?t:void 0},void 0)}function lt(A){return oA("search cache write",async()=>{let t=await dt();if(await t.put(gA,{...A,timestamp:Date.now()}),await t.count(gA)>Et){let e=await t.getAll(gA),n=e.toSorted((o,i)=>o.timestamp-i.timestamp).slice(0,e.length-Et),r=t.transaction(gA,"readwrite");await Promise.all([...n.map(o=>r.store.delete(o.id)),r.done])}},void 0)}var qA="https://rest.uniprot.org";var tr="keyword:KW-1185",nr=/^(?:[OPQ][0-9][A-Z0-9]{3}[0-9]|[A-NR-Z][0-9](?:[A-Z][A-Z0-9]{2}[0-9]){1,2})(?:-\d+)?$/,ae="accession,id,reviewed,organism_name,organism_id,protein_name,sequence";function ht(A){let{primaryAccession:t,uniProtkbId:e,organism:n,sequence:r}=A;if(!(!t||!n?.taxonId||!r?.value))return{accession:t,id:e??t,reviewed:/\breviewed\b/i.test(A.entryType??""),taxId:n.taxonId,scientificName:n.scientificName??String(n.taxonId),commonName:n.commonName,title:A.proteinDescription?.recommendedName?.fullName?.value??A.proteinDescription?.submissionNames?.[0]?.fullName?.value,sequence:r.value}}function wt(A){return(A.results??[]).flatMap(t=>{let e=ht(t);return e?[e]:[]})}function se(A,t){return Number(t.reviewed)-Number(A.reviewed)||t.sequence.length-A.sequence.length}async function ge(A,t,e){for(let n of A){let r=JA(n);if(!r)continue;if(nr.test(r))try{let c=ht(await O(`${qA}/uniprotkb/${r}?fields=${ae}`,{signal:e}));if(c)return c}catch(c){if(R(c))throw c}let o=`gene_exact:"${r.replaceAll('"',"")}" AND organism_id:${t}`,i=await O(`${qA}/uniprotkb/search?query=${encodeURIComponent(o)}&fields=${ae}&size=25`,{signal:e}),[s]=wt(i).sort(se);if(s)return s}}async function or(A,t,e){let n=`(uniprot_id:${A}) AND (identity:${t/100})`,o=(await O(`${qA}/uniref/search?query=${encodeURIComponent(n)}&fields=id,count&size=1`,{signal:e})).results?.[0];return o?.id?{id:o.id,memberCount:o.memberCount}:void 0}var rr=500,mt=5e3;function ir(A){let t=A.headers.get("link")??"";return/<([^>]+)>;\s*rel="next"/.exec(t)?.[1]}async function ar({clusterId:A,identity:t,referenceProteomesOnly:e=!0,taxa:n,exclude:r,limit:o=mA,onProgress:i,signal:s}){let c=[`uniref_cluster_${t}:${A}`,...e?[tr]:[]].join(" AND "),a=`${qA}/uniprotkb/search?query=${encodeURIComponent(c)}&fields=${ae}&size=${rr}&format=json`,g=new Map,C=0,Q;for(;a&&C<mt;){let I=await Ke(a,{signal:s});Q??=Number(I.headers.get("x-total-results"))||void 0;let d=wt(await I.json());C+=d.length;for(let h of d){if(h.taxId===r||n&&!n.has(h.taxId))continue;let u=g.get(h.taxId);(!u||se(h,u)<0)&&g.set(h.taxId,h)}if(i?.(`Read ${C}${Q?` of ${Q}`:""} cluster members, ${g.size} species...`),n&&[...n].every(h=>h===r||g.get(h)?.reviewed))break;a=d.length?ir(I):void 0}return{total:Q,scanned:C,truncated:!!a&&C>=mt,rows:[...g.values()].sort(se).slice(0,o)}}async function pt({candidates:A,taxId:t,identity:e=50,referenceProteomesOnly:n=!0,taxa:r,exclude:o,limit:i=mA,onProgress:s,signal:c}){s("Resolving the query at UniProt...");let a=await ge(A,t,c);if(!a)throw new Error(`UniProt has no entry for ${A.join(", ")} in taxon ${t}. Try the BLAST tab, which needs no gene identifier.`);s(`Finding the UniRef${e} cluster of ${a.id}...`);let g=await or(a.accession,e,c);if(!g)throw new Error(`${a.accession} is in no UniRef${e} cluster`);let{total:C,scanned:Q,truncated:I,rows:d}=await ar({clusterId:g.id,identity:e,referenceProteomesOnly:n,taxa:r,exclude:o,limit:i,onProgress:s,signal:c});if(d.length<1)throw new Error(`${g.id} has no other ${n?"reference-proteome ":""}member to align ${a.id} against`);let h=rA(d.map(u=>u.commonName??u.scientificName));return{query:a,clusterId:g.id,total:C,warning:I?`${g.id} lists ${C??"more than "+Q} UniProtKB entries and the first ${Q} were read, so species whose only entries come later are missing.`:void 0,rows:d.map((u,l)=>({taxId:u.taxId,label:h[l],scientificName:u.scientificName,commonName:u.commonName,geneId:u.id,protein:u.accession,sequence:u.sequence}))}}async function sr(A,t){let e=A.blastParams;if(e.proteinSequence)return{sequence:GA(e.proteinSequence),name:A.querySeqName};if(e.accession){t.onProgress(`Fetching ${e.accession} from UniProt...`);let n=await ge([e.accession],0,t.signal);if(!n)throw new Error(`UniProt has no entry ${e.accession}`);let r=`${n.id}_query`;return t.act(()=>{A.setQuerySeqName(r)}),{sequence:n.sequence,name:r}}throw new Error("No query: a search needs a proteinSequence, a UniProt accession, or a connectedTranscript to translate")}async function gr({self:A,scope:t,query:e,querySeqName:n,maxHits:r,key:o}){let i=A.blastParams,{onProgress:s,onRid:c,signal:a}=t,{hits:g,queryRow:C,rid:Q}=await Bt[i.searchProgram??"blastp"]({query:e,database:i.blastDatabase,maxHits:r,onProgress:s,onRid:c,signal:a});if(g.length===0)throw new Error("No hits found");s("Fetching species taxonomy info...");let I=[],d=await iA(g.map(p=>p.taxid).filter(p=>p!==void 0),a,p=>{I.push(p)}),{msa:h,treeMetadata:u}=Ct({hits:g,query:e,queryRow:C,taxonomyInfo:d,querySeqName:n}),l=I.length>0;return!C&&!l&&await lt({id:o,fasta:h,treeMetadata:u,rid:Q}),{fasta:h,treeMetadata:u,rid:Q,queryRow:C,warnings:l?["NCBI did not answer for some species names, so those rows are named by scientific name alone."]:[]}}async function Dt({self:A,scope:t}){let e=A.blastParams,{selectedTranscript:n,maxHits:r=Ve,searchProgram:o="blastp"}=e,i=e.msaAlgorithm??"browser",{sequence:s,name:c}=await sr(A,t);o==="blastp"&&i==="browser"&&ie(c,s.length,s.length);let{onProgress:a,signal:g}=t,C=ft({searchProgram:o,database:e.blastDatabase,maxHits:r,querySeqName:c,query:s}),Q=await ut(C);Q&&a(`Reusing the ${o} search from ${new Date(Q.timestamp).toLocaleString()}...`);let{fasta:I,treeMetadata:d,rid:h,queryRow:u,warnings:l}=Q??await gr({self:A,scope:t,query:s,querySeqName:c,maxHits:r,key:C}),{msa:p,tree:m}=u?{msa:I,tree:""}:await UA({algorithm:i,sequence:I,onProgress:a,signal:g}),B=_e(n),E=JSON.stringify(d);return await We({proteinSequence:s,blastDatabase:e.blastDatabase,msaAlgorithm:u?void 0:i,searchProgram:e.searchProgram,maxHits:r,msa:p,tree:m,treeMetadata:E,rid:h??"",geneId:lA(B.parentId),transcriptId:lA(B.uniqueId),transcriptName:FA(n),geneName:lA(B.gene_name)??lA(B.parentId)}),{msa:p,tree:m,treeMetadata:E,warnings:l}}var kt="https://pantherdb.org/services/oai/pantherdb",cr="https://rest.uniprot.org/uniprotkb";function Ir(A){return(A.search?.output?.genomes?.genome??[]).flatMap(e=>e.short_name&&e.taxon_id?[{code:e.short_name,taxId:e.taxon_id,name:e.name??e.short_name,longName:e.long_name??e.short_name}]:[])}function yt(A){let[t,...e]=(A??"").split("|"),n=e.find(o=>o.startsWith("UniProtKB="))?.slice(10),r=e.find(o=>!o.startsWith("UniProtKB="))??n;return t&&n&&r?{code:t,accession:n,geneRef:r}:void 0}function Qr(A){let t=A.search?.mapping,e=t?.mapped,n=Array.isArray(e)?e:e?[e]:[],r=[],o;for(let i of n){o??=yt(i.gene);let s=yt(i.target_gene);s&&(i.ortholog==="LDO"||i.ortholog==="O")&&r.push({...s,symbol:i.target_gene_symbol===void 0?void 0:String(i.target_gene_symbol),type:i.ortholog})}return{unmapped:!!t?.unmapped_ids,query:o,hits:r}}function Br(A){let t=new Map;for(let e of A){let n=t.get(e.code);(!n||n.type==="O"&&e.type==="LDO")&&t.set(e.code,e)}return[...t.values()]}function Cr(A){let t=new Map;for(let e of A.results??[])e.primaryAccession&&e.sequence?.value&&t.set(e.primaryAccession,e.sequence.value);return t}var ce;function Er(){return ce??=O(`${kt}/supportedgenomes`).then(Ir).catch(A=>{throw ce=void 0,A}),ce}var Nt=100;async function dr(A,t){let e=new Map;for(let n=0;n<A.length;n+=Nt){let r=A.slice(n,n+Nt),o=await O(`${cr}/accessions?accessions=${r.join(",")}&fields=accession,sequence&format=json`,{signal:t});for(let[i,s]of Cr(o))e.set(i,s)}return e}async function fr(A,t,e,n){let r;for(let o of A){let i=JA(o);if(!i)continue;let s=new URLSearchParams({geneInputList:i,organism:String(t),orthologType:"all"});e&&s.set("targetOrganism",e.map(a=>a.taxId).join(","));let c=Qr(await O(`${kt}/ortholog/matchortho?${s.toString()}`,{signal:n}));if(!c.unmapped&&(r??=i,c.query))return{...c,matched:i}}return r===void 0?void 0:{matched:r,hits:[],query:void 0}}async function bt({candidates:A,taxId:t,taxa:e,exclude:n,limit:r=mA,onProgress:o,signal:i}){let s=await Er();i?.throwIfAborted();let c=new Map(s.map(E=>[E.taxId,E])),a=new Map(s.map(E=>[E.code,E])),g=c.get(t);if(!g)throw new Error(`PANTHER has no reference proteome for taxon ${t}. NCBI orthologs cover vertebrates and insects; try that source.`);let C=e?[...e].flatMap(E=>{let y=c.get(E);return y&&E!==n?[y]:[]}):void 0;if(C?.length===0)throw new Error("None of the requested species has a PANTHER reference proteome. NCBI orthologs cover vertebrates and insects; try that source.");o("Matching orthologs at PANTHER...");let Q=await fr(A,t,C,i);if(!Q)throw new Error(`PANTHER has no entry for ${A.join(", ")} in ${g.longName}. Try the NCBI BLAST tab, which needs no gene identifier.`);let I=new Map(C?.map((E,y)=>[E.taxId,y])),d=Br(Q.hits).map(E=>({hit:E,genome:a.get(E.code)})).filter(E=>!!E.genome&&E.genome.taxId!==n&&(C?I.has(E.genome.taxId):!0)).sort((E,y)=>C?I.get(E.genome.taxId)-I.get(y.genome.taxId):0).slice(0,r);if(d.length<2)throw new Error(`Only ${d.length} PANTHER ortholog(s) found for ${Q.matched} \u2014 not enough to align`);o(`Fetching ${d.length} protein sequences from UniProt...`);let[h,u]=await Promise.all([ur(d.map(E=>E.genome.taxId),i),dr([...Q.query?[Q.query.accession]:[],...d.map(E=>E.hit.accession)],i)]),l=d.map(({hit:E,genome:y})=>{let f=h.get(y.taxId);return{hit:E,genome:y,name:f?.commonName||f?.sciname||y.name,scientificName:f?.sciname||y.longName,commonName:f?.commonName}}),p=rA(l.map(E=>E.name)),m=l.map(({hit:E,genome:y,scientificName:f,commonName:k},w)=>({taxId:y.taxId,label:p[w],scientificName:f,commonName:k,geneId:E.geneRef,protein:E.accession,sequence:u.get(E.accession)??""})).filter(E=>E.sequence);if(m.length<2)throw new Error("Could not fetch protein sequences for the orthologs");let B=Q.query&&u.get(Q.query.accession);return{matched:Q.matched,query:Q.query&&B?{...Q.query,sequence:B}:void 0,rows:m}}async function ur(A,t){try{return await iA(A,t)}catch(e){if(R(e))throw e;return console.warn("[msaview-orthologs] taxonomy name lookup failed:",e),new Map}}async function St({self:A,scope:t}){let{taxId:e,taxa:n,maxSpecies:r,geneCandidates:o,msaAlgorithm:i,proteinSequence:s,source:c="ncbi",identity:a,referenceProteomesOnly:g}=A.orthologParams,{onProgress:C,act:Q,signal:I}=t,d={taxId:e,geneCandidates:o,taxa:n?new Set(n):void 0,exclude:e,limit:r,onProgress:C,signal:I},{geneId:h,representative:u,rows:l,warning:p}=c==="panther"?await wr(d):c==="uniref"?await hr({...d,identity:a,referenceProteomesOnly:g}):await lr(d),m=s?GA(s):u?.sequence;if(!m)throw new Error(`No query protein: none was supplied and ${mr[c]} returned no representative protein for gene ${h}.`);let B=await pr(e,l,I);Q(()=>{A.setQuerySeqName(B)});let E={[B]:yr(A,h,m,u)};for(let f of l)E[f.label]=Nr(f);return{...await UA({algorithm:i,sequence:[`>${B}
8
+ ${m}`,...l.map(f=>`>${f.label}
9
+ ${f.sequence}`)].join(`
10
+ `),onProgress:C,signal:I}),treeMetadata:JSON.stringify(E),warnings:p?[p]:[]}}async function lr({taxId:A,geneCandidates:t,onProgress:e,signal:n,...r}){e("Resolving gene at NCBI...");let o=await et(t,A,n);if(!o)throw new Error(`Could not resolve any of ${t.join(", ")} to an NCBI gene in taxon ${A}. Try the NCBI BLAST tab, which needs no gene identifier.`);let i=await Dr(o.geneId,n),s=await nt({geneId:o.geneId,onProgress:e,signal:n,...r});return{geneId:o.geneId,representative:i,rows:s}}var mr={ncbi:"NCBI",panther:"PANTHER",uniref:"UniProt"};async function hr({geneCandidates:A,identity:t,referenceProteomesOnly:e,...n}){let r=await pt({candidates:A,identity:t,referenceProteomesOnly:e,...n});return{geneId:r.query.id,representative:{accession:r.query.accession,sequence:r.query.sequence},rows:r.rows,warning:r.warning}}async function wr({geneCandidates:A,...t}){let e=await bt({candidates:A,...t});return{geneId:e.query?.geneRef??e.matched,representative:e.query,rows:e.rows}}async function pr(A,t,e){let n;try{let r=(await iA([A],e)).get(A);n=r?.commonName??r?.sciname}catch(r){if(R(r))throw r;console.warn("[msaview-orthologs] taxonomy name lookup failed:",r)}return rA([...t.map(r=>r.label),`${n??"query"}_query`]).at(-1)}async function Dr(A,t){try{return await tt(A,t)}catch(e){if(R(e))throw e;console.warn("[msaview-orthologs] query protein lookup failed:",e);return}}function yr(A,t,e,n){let r={"Gene ID":t},o=FA(A.orthologParams?.selectedTranscript);return o&&(r.Transcript=o),n?.sequence===e&&(r.Accession=n.accession),r}function Nr(A){let t={"Scientific name":A.scientificName,Accession:A.protein,"Gene ID":A.geneId};return A.commonName&&(t["Common name"]=A.commonName),t}function _A(A,t=0){let e=A.getUint32(t,!0);return A.getUint32(t+4,!0)*4294967296+e}var Ie=16,kr={compressed:new Float64Array(0),uncompressed:new Float64Array(0)};function Mt(A,t){let e=new Float64Array(t+1),n=new Float64Array(t+1),r=new DataView(A.buffer,A.byteOffset,A.byteLength);for(let o=0;o<t;o+=1){let i=o*Ie;e[o+1]=_A(r,i),n[o+1]=_A(r,i+8)}return{compressed:e,uncompressed:n}}function xt(A,t){let e=0,n=A.length;for(;e<n;){let r=e+n>>>1;A[r]<=t?e=r+1:n=r}return e}var wA=class{filehandle;index;constructor({filehandle:t}){this.filehandle=t}_getIndex(){return this.index||(this.index=this._readIndex().catch(t=>{throw this.index=void 0,t})),this.index}async _readIndex(){let t=await this.filehandle.read(8,0),e=_A(new DataView(t.buffer,t.byteOffset,t.byteLength));if(e===0)return Mt(new Uint8Array(0),0);if(e>Number.MAX_SAFE_INTEGER/Ie)throw new TypeError("integer overflow");let n=await this.filehandle.read(Ie*e,8);return Mt(n,e)}async getRelevantBlocksForRead(t,e){if(t===0)return{...kr,nextCompressedPosition:void 0};let{compressed:n,uncompressed:r}=await this._getIndex(),o=xt(r,e)-1,i=xt(r,e+t-1);return{compressed:n.subarray(o,i),uncompressed:r.subarray(o,i),nextCompressedPosition:i<n.length?n[i]:void 0}}};var Qe=0;var Be=2;var pA=4;var Z=0,DA=1,Ft=2;var Rt=-5;function br(A,t){return Object.prototype.hasOwnProperty.call(A,t)}function Gt(A){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var e=t.shift();if(e){if(typeof e!="object")throw new TypeError(e+"must be non-object");for(var n in e)br(e,n)&&(A[n]=e[n])}}return A}function HA(A,t){return A.length===t?A:A.subarray?A.subarray(0,t):(A.length=t,A)}var yA={arraySet:function(A,t,e,n,r){if(t.subarray&&A.subarray){A.set(t.subarray(e,e+n),r);return}for(var o=0;o<n;o++)A[r+o]=t[e+o]},flattenChunks:function(A){var t,e,n,r,o,i;for(n=0,t=0,e=A.length;t<e;t++)n+=A[t].length;for(i=new Uint8Array(n),r=0,t=0,e=A.length;t<e;t++)o=A[t],i.set(o,r),r+=o.length;return i},Buf8:function(A){return new Uint8Array(A)},Buf16:function(A){return new Uint16Array(A)},Buf32:function(A){return new Int32Array(A)}},NA={arraySet:function(A,t,e,n,r){for(var o=0;o<n;o++)A[r+o]=t[e+o]},flattenChunks:function(A){return[].concat.apply([],A)},Buf8:function(A){return new Array(A)},Buf16:function(A){return new Array(A)},Buf32:function(A){return new Array(A)}},cA=()=>{let A=typeof Uint8Array<"u"&&typeof Uint16Array<"u"&&typeof Int32Array<"u";return cA=()=>A,A},_=(A,t,e,n,r)=>(_=cA()?yA.arraySet:NA.arraySet,_(A,t,e,n,r)),YA=A=>(YA=cA()?yA.flattenChunks:NA.flattenChunks,YA(A)),Y=A=>(Y=cA()?yA.Buf8:NA.Buf8,Y(A)),X=A=>(X=cA()?yA.Buf16:NA.Buf16,X(A)),$=A=>($=cA()?yA.Buf32:NA.Buf32,$(A));var Jt=function(){let A=!0;try{String.fromCharCode.apply(null,[0])}catch{A=!1}return Jt=()=>A,A},vt=function(){let A=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch{A=!1}return vt=()=>A,A},Ce=function(A){for(var t=Y(256),e=0;e<256;e++)t[e]=e>=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;return t[254]=t[254]=1,Ce=n=>t[n],t[A]};function Ee(A){var t,e,n,r,o,i=A.length,s=0;for(r=0;r<i;r++)e=A.charCodeAt(r),(e&64512)===55296&&r+1<i&&(n=A.charCodeAt(r+1),(n&64512)===56320&&(e=65536+(e-55296<<10)+(n-56320),r++)),s+=e<128?1:e<2048?2:e<65536?3:4;for(t=new Uint8Array(s),o=0,r=0;o<s;r++)e=A.charCodeAt(r),(e&64512)===55296&&r+1<i&&(n=A.charCodeAt(r+1),(n&64512)===56320&&(e=65536+(e-55296<<10)+(n-56320),r++)),e<128?t[o++]=e:e<2048?(t[o++]=192|e>>>6,t[o++]=128|e&63):e<65536?(t[o++]=224|e>>>12,t[o++]=128|e>>>6&63,t[o++]=128|e&63):(t[o++]=240|e>>>18,t[o++]=128|e>>>12&63,t[o++]=128|e>>>6&63,t[o++]=128|e&63);return t}function Sr(A,t){if(t<65534&&(A.subarray&&vt()||!A.subarray&&Jt()))return String.fromCharCode.apply(null,HA(A,t));for(var e="",n=0;n<t;n++)e+=String.fromCharCode(A[n]);return e}function Lt(A){for(var t=new Uint8Array(A.length),e=0,n=t.length;e<n;e++)t[e]=A.charCodeAt(e);return t}function Ut(A,t){var e,n,r,o,i=t||A.length,s=new Array(i*2);for(n=0,e=0;e<i;){if(r=A[e++],r<128){s[n++]=r;continue}if(o=Ce(r),o>4){s[n++]=65533,e+=o-1;continue}for(r&=o===2?31:o===3?15:7;o>1&&e<i;)r=r<<6|A[e++]&63,o--;if(o>1){s[n++]=65533;continue}r<65536?s[n++]=r:(r-=65536,s[n++]=55296|r>>10&1023,s[n++]=56320|r&1023)}return Sr(s,n)}function qt(A,t){var e;for(t=t||A.length,t>A.length&&(t=A.length),e=t-1;e>=0&&(A[e]&192)===128;)e--;return e<0||e===0?t:e+Ce(A[e])>t?e:t}function de(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}function kA(A,t,e,n){for(var r=A&65535|0,o=A>>>16&65535|0,i=0;e!==0;){i=e>2e3?2e3:e,e-=i;do r=r+t[n++]|0,o=o+r|0;while(--i);r%=65521,o%=65521}return r|o<<16|0}function Mr(){for(var A,t=[],e=0;e<256;e++){A=e;for(var n=0;n<8;n++)A=A&1?3988292384^A>>>1:A>>>1;t[e]=A}return t}var _t=function(){let A=Mr();return _t=()=>A,A};function J(A,t,e,n){var r=_t(),o=n+e;A^=-1;for(var i=n;i<o;i++)A=A>>>8^r[(A^t[i])&255];return A^-1}var PA=30,xr=12;function fe(A,t){var e,n,r,o,i,s,c,a,g,C,Q,I,d,h,u,l,p,m,B,E,y,f,k,w,D;e=A.state,n=A.next_in,w=A.input,r=n+(A.avail_in-5),o=A.next_out,D=A.output,i=o-(t-A.avail_out),s=o+(A.avail_out-257),c=e.dmax,a=e.wsize,g=e.whave,C=e.wnext,Q=e.window,I=e.hold,d=e.bits,h=e.lencode,u=e.distcode,l=(1<<e.lenbits)-1,p=(1<<e.distbits)-1;A:do{d<15&&(I+=w[n++]<<d,d+=8,I+=w[n++]<<d,d+=8),m=h[I&l];e:for(;;){if(B=m>>>24,I>>>=B,d-=B,B=m>>>16&255,B===0)D[o++]=m&65535;else if(B&16){E=m&65535,B&=15,B&&(d<B&&(I+=w[n++]<<d,d+=8),E+=I&(1<<B)-1,I>>>=B,d-=B),d<15&&(I+=w[n++]<<d,d+=8,I+=w[n++]<<d,d+=8),m=u[I&p];t:for(;;){if(B=m>>>24,I>>>=B,d-=B,B=m>>>16&255,B&16){if(y=m&65535,B&=15,d<B&&(I+=w[n++]<<d,d+=8,d<B&&(I+=w[n++]<<d,d+=8)),y+=I&(1<<B)-1,y>c){A.msg="invalid distance too far back",e.mode=PA;break A}if(I>>>=B,d-=B,B=o-i,y>B){if(B=y-B,B>g&&e.sane){A.msg="invalid distance too far back",e.mode=PA;break A}if(f=0,k=Q,C===0){if(f+=a-B,B<E){E-=B;do D[o++]=Q[f++];while(--B);f=o-y,k=D}}else if(C<B){if(f+=a+C-B,B-=C,B<E){E-=B;do D[o++]=Q[f++];while(--B);if(f=0,C<E){B=C,E-=B;do D[o++]=Q[f++];while(--B);f=o-y,k=D}}}else if(f+=C-B,B<E){E-=B;do D[o++]=Q[f++];while(--B);f=o-y,k=D}for(;E>2;)D[o++]=k[f++],D[o++]=k[f++],D[o++]=k[f++],E-=3;E&&(D[o++]=k[f++],E>1&&(D[o++]=k[f++]))}else{f=o-y;do D[o++]=D[f++],D[o++]=D[f++],D[o++]=D[f++],E-=3;while(E>2);E&&(D[o++]=D[f++],E>1&&(D[o++]=D[f++]))}}else if((B&64)===0){m=u[(m&65535)+(I&(1<<B)-1)];continue t}else{A.msg="invalid distance code",e.mode=PA;break A}break}}else if((B&64)===0){m=h[(m&65535)+(I&(1<<B)-1)];continue e}else if(B&32){e.mode=xr;break A}else{A.msg="invalid literal/length code",e.mode=PA;break A}break}}while(n<r&&o<s);E=d>>3,n-=E,d-=E<<3,I&=(1<<d)-1,A.next_in=n,A.next_out=o,A.avail_in=n<r?5+(r-n):5-(n-r),A.avail_out=o<s?257+(s-o):257-(o-s),e.hold=I,e.bits=d}var IA=15,Yt=852,Ht=592,Pt=0,ue=1,Kt=2,Fr=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],Rr=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],Gr=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],Jr=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];function AA(A,t,e,n,r,o,i,s){var c=s.bits,a=0,g=0,C=0,Q=0,I=0,d=0,h=0,u=0,l=0,p=0,m,B,E,y,f,k=null,w=0,D,x=X(IA+1),N=X(IA+1),L=null,U=0,tA,q,T;for(a=0;a<=IA;a++)x[a]=0;for(g=0;g<n;g++)x[t[e+g]]++;for(I=c,Q=IA;Q>=1&&x[Q]===0;Q--);if(I>Q&&(I=Q),Q===0)return r[o++]=1<<24|64<<16|0,r[o++]=1<<24|64<<16|0,s.bits=1,0;for(C=1;C<Q&&x[C]===0;C++);for(I<C&&(I=C),u=1,a=1;a<=IA;a++)if(u<<=1,u-=x[a],u<0)return-1;if(u>0&&(A===Pt||Q!==1))return-1;for(N[1]=0,a=1;a<IA;a++)N[a+1]=N[a]+x[a];for(g=0;g<n;g++)t[e+g]!==0&&(i[N[t[e+g]]++]=g);if(A===Pt?(k=L=i,D=19):A===ue?(k=Fr,w-=257,L=Rr,U-=257,D=256):(k=Gr,L=Jr,D=-1),p=0,g=0,a=C,f=o,d=I,h=0,E=-1,l=1<<I,y=l-1,A===ue&&l>Yt||A===Kt&&l>Ht)return 1;for(;;){tA=a-h,i[g]<D?(q=0,T=i[g]):i[g]>D?(q=L[U+i[g]],T=k[w+i[g]]):(q=96,T=0),m=1<<a-h,B=1<<d,C=B;do B-=m,r[f+(p>>h)+B]=tA<<24|q<<16|T|0;while(B!==0);for(m=1<<a-1;p&m;)m>>=1;if(m!==0?(p&=m-1,p+=m):p=0,g++,--x[a]===0){if(a===Q)break;a=t[e+i[g]]}if(a>I&&(p&y)!==E){for(h===0&&(h=I),f+=C,d=a-h,u=1<<d;d+h<Q&&(u-=x[d+h],!(u<=0));)d++,u<<=1;if(l+=1<<d,A===ue&&l>Yt||A===Kt&&l>Ht)return 1;E=p&y,r[E]=I<<24|d<<16|f-o|0}}return p!==0&&(r[f+p]=a-h<<24|64<<16|0),s.bits=I,0}var vr=0,fn=1,un=2,Tt=4,Lr=5,KA=6,eA=0,Ur=1,qr=2,v=-2,ln=-3,De=-4,_r=-5,Ot=8,mn=1,Zt=2,Xt=3,Vt=4,jt=5,Wt=6,zt=7,$t=8,An=9,en=10,ZA=11,H=12,le=13,tn=14,me=15,nn=16,on=17,rn=18,an=19,TA=20,OA=21,sn=22,gn=23,cn=24,In=25,Qn=26,he=27,Bn=28,Cn=29,M=30,ye=31,Yr=32,Hr=852,Pr=592;function En(A){return(A>>>24&255)+(A>>>8&65280)+((A&65280)<<8)+((A&255)<<24)}function Kr(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=X(320),this.work=X(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function Tr(A){var t;return!A||!A.state?v:(t=A.state,A.total_in=A.total_out=t.total=0,A.msg="",t.wrap&&(A.adler=t.wrap&1),t.mode=mn,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=$(Hr),t.distcode=t.distdyn=$(Pr),t.sane=1,t.back=-1,eA)}function Or(A){var t;return!A||!A.state?v:(t=A.state,t.wsize=0,t.whave=0,t.wnext=0,Tr(A))}function Zr(A,t){var e,n;return!A||!A.state||(n=A.state,t<0?(e=0,t=-t):(e=(t>>4)+1,t<48&&(t&=15)),t&&(t<8||t>15))?v:(n.window!==null&&n.wbits!==t&&(n.window=null),n.wrap=e,n.wbits=t,Or(A))}function hn(A,t){var e,n;return A?(n=new Kr,A.state=n,n.window=null,e=Zr(A,t),e!==eA&&(A.state=null),e):v}var dn=!0,we,pe;function Xr(A){if(dn){var t;for(we=$(512),pe=$(32),t=0;t<144;)A.lens[t++]=8;for(;t<256;)A.lens[t++]=9;for(;t<280;)A.lens[t++]=7;for(;t<288;)A.lens[t++]=8;for(AA(fn,A.lens,0,288,we,0,A.work,{bits:9}),t=0;t<32;)A.lens[t++]=5;AA(un,A.lens,0,32,pe,0,A.work,{bits:5}),dn=!1}A.lencode=we,A.lenbits=9,A.distcode=pe,A.distbits=5}function wn(A,t,e,n){var r,o=A.state;return o.window===null&&(o.wsize=1<<o.wbits,o.wnext=0,o.whave=0,o.window=Y(o.wsize)),n>=o.wsize?(_(o.window,t,e-o.wsize,o.wsize,0),o.wnext=0,o.whave=o.wsize):(r=o.wsize-o.wnext,r>n&&(r=n),_(o.window,t,e-n,r,o.wnext),n-=r,n?(_(o.window,t,e-n,n,0),o.wnext=n,o.whave=o.wsize):(o.wnext+=r,o.wnext===o.wsize&&(o.wnext=0),o.whave<o.wsize&&(o.whave+=r))),0}function pn(A,t){var e,n,r,o,i,s,c,a,g,C,Q,I,d,h,u=0,l,p,m,B,E,y,f,k,w=Y(4),D,x,N=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!A||!A.state||!A.output||!A.input&&A.avail_in!==0)return v;e=A.state,e.mode===H&&(e.mode=le),i=A.next_out,r=A.output,c=A.avail_out,o=A.next_in,n=A.input,s=A.avail_in,a=e.hold,g=e.bits,C=s,Q=c,k=eA;A:for(;;)switch(e.mode){case mn:if(e.wrap===0){e.mode=le;break}for(;g<16;){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}if(e.wrap&2&&a===35615){e.check=0,w[0]=a&255,w[1]=a>>>8&255,e.check=J(e.check,w,2,0),a=0,g=0,e.mode=Zt;break}if(e.flags=0,e.head&&(e.head.done=!1),!(e.wrap&1)||(((a&255)<<8)+(a>>8))%31){A.msg="incorrect header check",e.mode=M;break}if((a&15)!==Ot){A.msg="unknown compression method",e.mode=M;break}if(a>>>=4,g-=4,f=(a&15)+8,e.wbits===0)e.wbits=f;else if(f>e.wbits){A.msg="invalid window size",e.mode=M;break}e.dmax=1<<f,A.adler=e.check=1,e.mode=a&512?en:H,a=0,g=0;break;case Zt:for(;g<16;){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}if(e.flags=a,(e.flags&255)!==Ot){A.msg="unknown compression method",e.mode=M;break}if(e.flags&57344){A.msg="unknown header flags set",e.mode=M;break}e.head&&(e.head.text=a>>8&1),e.flags&512&&(w[0]=a&255,w[1]=a>>>8&255,e.check=J(e.check,w,2,0)),a=0,g=0,e.mode=Xt;case Xt:for(;g<32;){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}e.head&&(e.head.time=a),e.flags&512&&(w[0]=a&255,w[1]=a>>>8&255,w[2]=a>>>16&255,w[3]=a>>>24&255,e.check=J(e.check,w,4,0)),a=0,g=0,e.mode=Vt;case Vt:for(;g<16;){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}e.head&&(e.head.xflags=a&255,e.head.os=a>>8),e.flags&512&&(w[0]=a&255,w[1]=a>>>8&255,e.check=J(e.check,w,2,0)),a=0,g=0,e.mode=jt;case jt:if(e.flags&1024){for(;g<16;){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}e.length=a,e.head&&(e.head.extra_len=a),e.flags&512&&(w[0]=a&255,w[1]=a>>>8&255,e.check=J(e.check,w,2,0)),a=0,g=0}else e.head&&(e.head.extra=null);e.mode=Wt;case Wt:if(e.flags&1024&&(I=e.length,I>s&&(I=s),I&&(e.head&&(f=e.head.extra_len-e.length,e.head.extra||(e.head.extra=new Array(e.head.extra_len)),_(e.head.extra,n,o,I,f)),e.flags&512&&(e.check=J(e.check,n,I,o)),s-=I,o+=I,e.length-=I),e.length))break A;e.length=0,e.mode=zt;case zt:if(e.flags&2048){if(s===0)break A;I=0;do f=n[o+I++],e.head&&f&&e.length<65536&&(e.head.name+=String.fromCharCode(f));while(f&&I<s);if(e.flags&512&&(e.check=J(e.check,n,I,o)),s-=I,o+=I,f)break A}else e.head&&(e.head.name=null);e.length=0,e.mode=$t;case $t:if(e.flags&4096){if(s===0)break A;I=0;do f=n[o+I++],e.head&&f&&e.length<65536&&(e.head.comment+=String.fromCharCode(f));while(f&&I<s);if(e.flags&512&&(e.check=J(e.check,n,I,o)),s-=I,o+=I,f)break A}else e.head&&(e.head.comment=null);e.mode=An;case An:if(e.flags&512){for(;g<16;){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}if(a!==(e.check&65535)){A.msg="header crc mismatch",e.mode=M;break}a=0,g=0}e.head&&(e.head.hcrc=e.flags>>9&1,e.head.done=!0),A.adler=e.check=0,e.mode=H;break;case en:for(;g<32;){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}A.adler=e.check=En(a),a=0,g=0,e.mode=ZA;case ZA:if(e.havedict===0)return A.next_out=i,A.avail_out=c,A.next_in=o,A.avail_in=s,e.hold=a,e.bits=g,qr;A.adler=e.check=1,e.mode=H;case H:if(t===Lr||t===KA)break A;case le:if(e.last){a>>>=g&7,g-=g&7,e.mode=he;break}for(;g<3;){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}switch(e.last=a&1,a>>>=1,g-=1,a&3){case 0:e.mode=tn;break;case 1:if(Xr(e),e.mode=TA,t===KA){a>>>=2,g-=2;break A}break;case 2:e.mode=on;break;case 3:A.msg="invalid block type",e.mode=M}a>>>=2,g-=2;break;case tn:for(a>>>=g&7,g-=g&7;g<32;){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}if((a&65535)!==(a>>>16^65535)){A.msg="invalid stored block lengths",e.mode=M;break}if(e.length=a&65535,a=0,g=0,e.mode=me,t===KA)break A;case me:e.mode=nn;case nn:if(I=e.length,I){if(I>s&&(I=s),I>c&&(I=c),I===0)break A;_(r,n,o,I,i),s-=I,o+=I,c-=I,i+=I,e.length-=I;break}e.mode=H;break;case on:for(;g<14;){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}if(e.nlen=(a&31)+257,a>>>=5,g-=5,e.ndist=(a&31)+1,a>>>=5,g-=5,e.ncode=(a&15)+4,a>>>=4,g-=4,e.nlen>286||e.ndist>30){A.msg="too many length or distance symbols",e.mode=M;break}e.have=0,e.mode=rn;case rn:for(;e.have<e.ncode;){for(;g<3;){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}e.lens[N[e.have++]]=a&7,a>>>=3,g-=3}for(;e.have<19;)e.lens[N[e.have++]]=0;if(e.lencode=e.lendyn,e.lenbits=7,D={bits:e.lenbits},k=AA(vr,e.lens,0,19,e.lencode,0,e.work,D),e.lenbits=D.bits,k){A.msg="invalid code lengths set",e.mode=M;break}e.have=0,e.mode=an;case an:for(;e.have<e.nlen+e.ndist;){for(;u=e.lencode[a&(1<<e.lenbits)-1],l=u>>>24,p=u>>>16&255,m=u&65535,!(l<=g);){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}if(m<16)a>>>=l,g-=l,e.lens[e.have++]=m;else{if(m===16){for(x=l+2;g<x;){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}if(a>>>=l,g-=l,e.have===0){A.msg="invalid bit length repeat",e.mode=M;break}f=e.lens[e.have-1],I=3+(a&3),a>>>=2,g-=2}else if(m===17){for(x=l+3;g<x;){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}a>>>=l,g-=l,f=0,I=3+(a&7),a>>>=3,g-=3}else{for(x=l+7;g<x;){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}a>>>=l,g-=l,f=0,I=11+(a&127),a>>>=7,g-=7}if(e.have+I>e.nlen+e.ndist){A.msg="invalid bit length repeat",e.mode=M;break}for(;I--;)e.lens[e.have++]=f}}if(e.mode===M)break;if(e.lens[256]===0){A.msg="invalid code -- missing end-of-block",e.mode=M;break}if(e.lenbits=9,D={bits:e.lenbits},k=AA(fn,e.lens,0,e.nlen,e.lencode,0,e.work,D),e.lenbits=D.bits,k){A.msg="invalid literal/lengths set",e.mode=M;break}if(e.distbits=6,e.distcode=e.distdyn,D={bits:e.distbits},k=AA(un,e.lens,e.nlen,e.ndist,e.distcode,0,e.work,D),e.distbits=D.bits,k){A.msg="invalid distances set",e.mode=M;break}if(e.mode=TA,t===KA)break A;case TA:e.mode=OA;case OA:if(s>=6&&c>=258){A.next_out=i,A.avail_out=c,A.next_in=o,A.avail_in=s,e.hold=a,e.bits=g,fe(A,Q),i=A.next_out,r=A.output,c=A.avail_out,o=A.next_in,n=A.input,s=A.avail_in,a=e.hold,g=e.bits,e.mode===H&&(e.back=-1);break}for(e.back=0;u=e.lencode[a&(1<<e.lenbits)-1],l=u>>>24,p=u>>>16&255,m=u&65535,!(l<=g);){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}if(p&&(p&240)===0){for(B=l,E=p,y=m;u=e.lencode[y+((a&(1<<B+E)-1)>>B)],l=u>>>24,p=u>>>16&255,m=u&65535,!(B+l<=g);){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}a>>>=B,g-=B,e.back+=B}if(a>>>=l,g-=l,e.back+=l,e.length=m,p===0){e.mode=Qn;break}if(p&32){e.back=-1,e.mode=H;break}if(p&64){A.msg="invalid literal/length code",e.mode=M;break}e.extra=p&15,e.mode=sn;case sn:if(e.extra){for(x=e.extra;g<x;){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}e.length+=a&(1<<e.extra)-1,a>>>=e.extra,g-=e.extra,e.back+=e.extra}e.was=e.length,e.mode=gn;case gn:for(;u=e.distcode[a&(1<<e.distbits)-1],l=u>>>24,p=u>>>16&255,m=u&65535,!(l<=g);){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}if((p&240)===0){for(B=l,E=p,y=m;u=e.distcode[y+((a&(1<<B+E)-1)>>B)],l=u>>>24,p=u>>>16&255,m=u&65535,!(B+l<=g);){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}a>>>=B,g-=B,e.back+=B}if(a>>>=l,g-=l,e.back+=l,p&64){A.msg="invalid distance code",e.mode=M;break}e.offset=m,e.extra=p&15,e.mode=cn;case cn:if(e.extra){for(x=e.extra;g<x;){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}e.offset+=a&(1<<e.extra)-1,a>>>=e.extra,g-=e.extra,e.back+=e.extra}if(e.offset>e.dmax){A.msg="invalid distance too far back",e.mode=M;break}e.mode=In;case In:if(c===0)break A;if(I=Q-c,e.offset>I){if(I=e.offset-I,I>e.whave&&e.sane){A.msg="invalid distance too far back",e.mode=M;break}I>e.wnext?(I-=e.wnext,d=e.wsize-I):d=e.wnext-I,I>e.length&&(I=e.length),h=e.window}else h=r,d=i-e.offset,I=e.length;I>c&&(I=c),c-=I,e.length-=I;do r[i++]=h[d++];while(--I);e.length===0&&(e.mode=OA);break;case Qn:if(c===0)break A;r[i++]=e.length,c--,e.mode=OA;break;case he:if(e.wrap){for(;g<32;){if(s===0)break A;s--,a|=n[o++]<<g,g+=8}if(Q-=c,A.total_out+=Q,e.total+=Q,Q&&(A.adler=e.check=e.flags?J(e.check,r,Q,i-Q):kA(e.check,r,Q,i-Q)),Q=c,(e.flags?a:En(a))!==e.check){A.msg="incorrect data check",e.mode=M;break}a=0,g=0}e.mode=Bn;case Bn:if(e.wrap&&e.flags){for(;g<32;){if(s===0)break A;s--,a+=n[o++]<<g,g+=8}if(a!==(e.total&4294967295)){A.msg="incorrect length check",e.mode=M;break}a=0,g=0}e.mode=Cn;case Cn:k=Ur;break A;case M:k=ln;break A;case ye:return De;case Yr:default:return v}return A.next_out=i,A.avail_out=c,A.next_in=o,A.avail_in=s,e.hold=a,e.bits=g,(e.wsize||Q!==A.avail_out&&e.mode<M&&(e.mode<he||t!==Tt))&&wn(A,A.output,A.next_out,Q-A.avail_out)?(e.mode=ye,De):(C-=A.avail_in,Q-=A.avail_out,A.total_in+=C,A.total_out+=Q,e.total+=Q,e.wrap&&Q&&(A.adler=e.check=e.flags?J(e.check,r,Q,A.next_out-Q):kA(e.check,r,Q,A.next_out-Q)),A.data_type=e.bits+(e.last?64:0)+(e.mode===H?128:0)+(e.mode===TA||e.mode===me?256:0),(C===0&&Q===0||t===Tt)&&k===eA&&(k=_r),k)}function Dn(A){if(!A||!A.state)return v;var t=A.state;return t.window&&(t.window=null),A.state=null,eA}function yn(A,t){var e;return!A||!A.state||(e=A.state,(e.wrap&2)===0)?v:(e.head=t,t.done=!1,eA)}function Ne(A,t){var e=t.length,n,r,o;return!A||!A.state||(n=A.state,n.wrap!==0&&n.mode!==ZA)?v:n.mode===ZA&&(r=1,r=kA(r,t,e,0),r!==n.check)?ln:(o=wn(A,t,e,e),o?(n.mode=ye,De):(n.havedict=1,eA))}var XA={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"};function ke(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}var be=Object.prototype.toString,Se=class A{constructor(t){if(!(this instanceof A))return new A(t);this.options=Gt({chunkSize:16384,windowBits:0,to:""},t||{});var e=this.options;e.raw&&e.windowBits>=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,e.windowBits===0&&(e.windowBits=-15)),e.windowBits>=0&&e.windowBits<16&&!(t&&t.windowBits)&&(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&(e.windowBits&15)===0&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new ke,this.strm.avail_out=0;var n=hn(this.strm,e.windowBits);if(n!==Z)throw new Error(XA[n]);if(this.header=new de,yn(this.strm,this.header),e.dictionary&&(typeof e.dictionary=="string"?e.dictionary=Ee(e.dictionary):be.call(e.dictionary)==="[object ArrayBuffer]"&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(n=Ne(this.strm,e.dictionary),n!==Z)))throw new Error(XA[n])}push(t,e){var n=this.strm,r=this.options.chunkSize,o=this.options.dictionary,i,s,c,a,g,C,Q=!1;if(this.ended)return!1;s=e===~~e?e:e===!0?pA:Qe,typeof t=="string"?n.input=Lt(t):be.call(t)==="[object ArrayBuffer]"?n.input=new Uint8Array(t):n.input=t,n.next_in=0,n.avail_in=n.input.length;do{if(n.avail_out===0&&(n.output=Y(r),n.next_out=0,n.avail_out=r),i=pn(n,Qe),i===Ft&&o&&(typeof o=="string"?C=Ee(o):be.call(o)==="[object ArrayBuffer]"?C=new Uint8Array(o):C=o,i=Ne(this.strm,C)),i===Rt&&Q===!0&&(i=Z,Q=!1),i!==DA&&i!==Z)return this.onEnd(i),this.ended=!0,!1;n.next_out&&(n.avail_out===0||i===DA||n.avail_in===0&&(s===pA||s===Be))&&(this.options.to==="string"?(c=qt(n.output,n.next_out),a=n.next_out-c,g=Ut(n.output,c),n.next_out=a,n.avail_out=r-a,a&&_(n.output,n.output,c,a,0),this.onData(g)):this.onData(HA(n.output,n.next_out))),n.avail_in===0&&n.avail_out===0&&(Q=!0)}while((n.avail_in>0||n.avail_out===0)&&i!==DA);return i===DA&&(s=pA),s===pA?(i=Dn(this.strm),this.onEnd(i),this.ended=!0,i===Z):(s===Be&&(this.onEnd(Z),n.avail_out=0),!0)}onData(t){this.chunks.push(t)}onEnd(t){t===Z&&(this.options.to==="string"?this.result=this.chunks.join(""):this.result=YA(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg}};function Vr(A,t){var e=new Se(t);if(e.push(A,!0),e.err)throw e.msg||XA[e.err];return e.result}var Nn=Vr;function kn(A){let t=0;for(let r of A)t+=r.length;let e=new Uint8Array(t),n=0;for(let r of A)e.set(r,n),n+=r.length;return e}var V={};V.d=(A,t)=>{if(Array.isArray(t))for(var e=0;e<t.length;){var n=t[e++],r=t[e++];V.o(A,n)?r===0&&e++:r===0?Object.defineProperty(A,n,{enumerable:!0,value:t[e++]}):Object.defineProperty(A,n,{enumerable:!0,get:r})}else for(var n in t)V.o(t,n)&&!V.o(A,n)&&Object.defineProperty(A,n,{enumerable:!0,get:t[n]})};V.o=(A,t)=>Object.prototype.hasOwnProperty.call(A,t);V.r=A=>{Symbol.toStringTag&&Object.defineProperty(A,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(A,"__esModule",{value:!0})};var Fe={};V.r(Fe);V.d(Fe,{ChunkSliceResult:()=>CA,__wbg_Error_92b29b0548f8b746:()=>zr,__wbg___wbindgen_throw_344f42d3211c4765:()=>$r,__wbg_set_wasm:()=>Jn,decompress_all:()=>Mn,decompress_chunk_slice:()=>Wr});var jr="data:application/wasm;base64,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AghBAUEAEBUACywCAX8BfiMAQRBrIgEkACAAKQIAIQIgASAANgIMIAEgAjcCBCABQQRqEGYACyMBAX8jAEEQayICJAAgAiABNgIMIAIgADYCCCACQQhqEGUACyAAAkAgASgCAEUNACAAQbiXwAA2AgQgACABNgIADwsACx4BAX8CQCAAKAIAIgJFDQAgASACIAAoAgQQTQ8LAAsbAQF/EGogAEEEakEEEFgiASAANgIAIAFBBGoLHgEBfwJAIAAoAgAiAUEBSA0AIAAoAgQgAUEBEFMLCx4AIAAoAgAgACgCBEEAKALomkAiAEEEIAAbEQQAAAsjAQF/AkBBhIrAABAtIgANAEG4icAAQTpB9InAABA4AAsgAAsXAAJAIABBf2pBfk8NACABIABBARBTCwscAQF/AkAgACgCACIBRQ0AIAAoAgQgAUEBEFMLCxcAAkAgAUEJSQ0AIAEgABAODwsgABACCxUAIABBfGoiACAAKAIAQQRqQQQQUwsUAAJAIABFDQAgACABEF8ACxBWAAsRACAAIAFBAXRBAXIgAhAxAAsSAAJAIAFFDQAgACABIAIQUwsLEgAgACABIAIgAyAEQQAgBRADCxUAAkAgAEUNACAAIAAoAqhaEQIACwsaACAAQQApAoSWQDcCCCAAQQApAvyVQDcCAAsaACAAQQApAvSVQDcCCCAAQQApAuyVQDcCAAsWACAAKAIAIAEgAiAAKAIEKAIMEQcACw0AIAAgASACIAMQBw8LFABBACAANgK8mkBBAEEBNgK4mkALEwAgAEG4l8AANgIEIAAgATYCAAsQACABIAAoAgAgACgCBBBNCxAAIAEgACgCACAAKAIEEAoLCwAgACABIAIQKg8LCgAgACABEGkaAAsPACAAQZyVwAAgASACEAwLEQBBkJjAAEEjQaSYwAAQMQALCwAgACMAaiQAIwALCQAgACABEEQPCwkAIAAgARAuDwsJACAAIAEQYQALDABBr4fAAEEbEFoACw0AQcqHwABBzwAQWgALCQAgASAAEDsACwwAIAAgASkCADcDAAsJACABIAAQXQALDQAgAUH8mcAAQRgQCgsIACAAIAEQAAsIACAAIAEQAQsJACAAKAIAEEoLBwAgABA5AAsHACAAEEAACwcAIAAQJgALCwBBAEEBOgDAnkALCQAgAEEANgIACwUAEGsACwMADwsDAAALAgALC74aAgBBgIDAAAuUGkF0dGVtcHRlZCB0byBpbml0aWFsaXplIHRocmVhZC1sb2NhbCB3aGlsZSBpdCBpcyBiZWluZyBkcm9wcGVkFnNsaWNlIGluZGV4IHN0YXJ0cyBhdCDADSBidXQgZW5kcyBhdCDAABJyYW5nZSBzdGFydCBpbmRleCDAIiBvdXQgb2YgcmFuZ2UgZm9yIHNsaWNlIG9mIGxlbmd0aCDAABByYW5nZSBlbmQgaW5kZXggwCIgb3V0IG9mIHJhbmdlIGZvciBzbGljZSBvZiBsZW5ndGggwAAvcnVzdGMvNDhhMjI5Y2VhZWZkNDk4NWM1MDk5MGIxNDExNmI2ZDg1NmFmMDk4NS9saWJyYXJ5L3N0ZC9zcmMvc3lzL3RocmVhZF9sb2NhbC9ub190aHJlYWRzLnJzAC9ydXN0Yy80OGEyMjljZWFlZmQ0OTg1YzUwOTkwYjE0MTE2YjZkODU2YWYwOTg1L2xpYnJhcnkvc3RkL3NyYy9zeXMvc3luYy9yd2xvY2svbm9fdGhyZWFkcy5ycwAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93YXNtLWJpbmRnZW4tMC4yLjEyNi9zcmMvZXh0ZXJucmVmLnJzAC9ydXN0Yy80OGEyMjljZWFlZmQ0OTg1YzUwOTkwYjE0MTE2YjZkODU2YWYwOTg1L2xpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMvbW9kLnJzAC9ydXN0L2RlcHMvZGxtYWxsb2MtMC4yLjEzL3NyYy9kbG1hbGxvYy5ycwAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9saWJkZWZsYXRlci0xLjI1LjIvc3JjL2xpYi5ycwAA1gAQAF4AAABrAAAADQAAAMwCEAAKAAAAHAAAACQAAADMAhAACgAAAMIAAAApAAAAzAIQAAoAAAC2AAAAJwAAAMwCEAAKAAAAcQAAABwAAADMAhAACgAAAG0AAABBAAAAZGVjb21wcmVzc2lvbiBmYWlsZWRpbnZhbGlkIGJnemYgaGVhZGVyAMwCEAAKAAAATAAAAD0A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",CA=class A{static __wrap(t){let e=Object.create(A.prototype);return e.__wbg_ptr=t,bn.register(e,e.__wbg_ptr,e),e}__destroy_into_raw(){let t=this.__wbg_ptr;return this.__wbg_ptr=0,bn.unregister(this),t}free(){let t=this.__destroy_into_raw();S.__wbg_chunksliceresult_free(t,0)}take_buffer(){try{let r=S.__wbindgen_add_to_stack_pointer(-16);S.chunksliceresult_take_buffer(r,this.__wbg_ptr);var t=G().getInt32(r+0,!0),e=G().getInt32(r+4,!0),n=xn(t,e).slice();return S.__wbindgen_export(t,e*1,1),n}finally{S.__wbindgen_add_to_stack_pointer(16)}}take_cpositions(){try{let r=S.__wbindgen_add_to_stack_pointer(-16);S.chunksliceresult_take_cpositions(r,this.__wbg_ptr);var t=G().getInt32(r+0,!0),e=G().getInt32(r+4,!0),n=Sn(t,e).slice();return S.__wbindgen_export(t,e*8,8),n}finally{S.__wbindgen_add_to_stack_pointer(16)}}take_dpositions(){try{let r=S.__wbindgen_add_to_stack_pointer(-16);S.chunksliceresult_take_dpositions(r,this.__wbg_ptr);var t=G().getInt32(r+0,!0),e=G().getInt32(r+4,!0),n=Sn(t,e).slice();return S.__wbindgen_export(t,e*8,8),n}finally{S.__wbindgen_add_to_stack_pointer(16)}}};Symbol.dispose&&(CA.prototype[Symbol.dispose]=CA.prototype.free);function Mn(A){try{let i=S.__wbindgen_add_to_stack_pointer(-16),s=Rn(A,S.__wbindgen_export2),c=Ge;S.decompress_all(i,s,c);var t=G().getInt32(i+0,!0),e=G().getInt32(i+4,!0),n=G().getInt32(i+8,!0),r=G().getInt32(i+12,!0);if(r)throw Gn(n);var o=xn(t,e).slice();return S.__wbindgen_export(t,e*1,1),o}finally{S.__wbindgen_add_to_stack_pointer(16)}}function Wr(A,t,e,n,r){try{let c=S.__wbindgen_add_to_stack_pointer(-16),a=Rn(A,S.__wbindgen_export2),g=Ge;S.decompress_chunk_slice(c,a,g,t,e,n,r);var o=G().getInt32(c+0,!0),i=G().getInt32(c+4,!0),s=G().getInt32(c+8,!0);if(s)throw Gn(i);return CA.__wrap(o)}finally{S.__wbindgen_add_to_stack_pointer(16)}}function zr(A,t){let e=Error(Fn(A,t));return Ai(e)}function $r(A,t){throw new Error(Fn(A,t))}var bn=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(A=>S.__wbg_chunksliceresult_free(A,1));function Ai(A){bA===P.length&&P.push(P.length+1);let t=bA;return bA=P[t],P[t]=A,t}function ei(A){A<1028||(P[A]=bA,bA=A)}function Sn(A,t){return A=A>>>0,ti().subarray(A/8,A/8+t)}function xn(A,t){return A=A>>>0,Re().subarray(A/1,A/1+t)}var QA=null;function G(){return(QA===null||QA.buffer.detached===!0||QA.buffer.detached===void 0&&QA.buffer!==S.memory.buffer)&&(QA=new DataView(S.memory.buffer)),QA}var VA=null;function ti(){return(VA===null||VA.byteLength===0)&&(VA=new Float64Array(S.memory.buffer)),VA}function Fn(A,t){return ri(A>>>0,t)}var jA=null;function Re(){return(jA===null||jA.byteLength===0)&&(jA=new Uint8Array(S.memory.buffer)),jA}function ni(A){return P[A]}var P=new Array(1024).fill(void 0);P.push(void 0,null,!0,!1);var bA=P.length;function Rn(A,t){let e=t(A.length*1,1)>>>0;return Re().set(A,e/1),Ge=A.length,e}function Gn(A){let t=ni(A);return ei(A),t}var WA=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});WA.decode();var oi=2146435072,Me=0;function ri(A,t){return Me+=t,Me>=oi&&(WA=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),WA.decode(),Me=t),WA.decode(Re().subarray(A,A+t).slice())}var Ge=0,S;function Jn(A){S=A}var BA=null,xe=null;async function ii(){return BA||(xe||(xe=(async()=>{let t=await(await fetch(jr)).arrayBuffer(),{instance:e}=await WebAssembly.instantiate(t,{"./bgzf_wasm_bg.js":Fe});return BA=e.exports,Jn(BA),BA})()),xe)}async function vn(A){return BA||await ii(),Mn(A)}var ai=26;function Un(A){return A[0]===31&&A[1]===139}function si(A){return A.length>=ai&&Un(A)&&A[2]===8&&A[3]===4&&A[10]===6&&A[12]===66&&A[13]===67}function qn(A){return A instanceof Error?A.message:`${A}`}async function Ln(A){if(typeof DecompressionStream<"u"){let t=new Blob([A]).stream().pipeThrough(new DecompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}else return Nn(A,void 0)}function gi(A){return qn(A).includes("invalid gzip header")?new Error("problem decompressing block: incorrect gzip header check",{cause:A}):A}async function _n(A){if(A.length===0)return new Uint8Array(0);if(!si(A)){if(Un(A))return Ln(A);throw new Error("problem decompressing block: not a valid bgzf or gzip block")}try{return await vn(A)}catch(t){if(qn(t).includes("invalid bgzf header"))return Ln(A);throw gi(t)}}var ci=10,Ii=32*1024*1024;function Qi(A){let t=0,e=[],n=()=>{t--,e.shift()?.()};return async r=>{t>=A&&await new Promise(o=>{e.push(o)}),t++;try{return await r()}finally{n()}}}function Bi(A,t,e){let n=[],r=A.length,o=0;for(;o<r;){let i=o+1;for(;i<r&&t[i]-t[o]<Ii;)i+=1;n.push({compressedStart:A[o],compressedEnd:i<r?A[i]:e??A[r-1]+65536,uncompressedStart:t[o]}),o=i}return n}function Ci(A,t,e,n){let r=Math.max(0,e-t),o=Math.min(n,t+A.length)-t;return r<A.length?A.subarray(r,o):new Uint8Array(0)}var EA=class{filehandle;gzi;limit;constructor({filehandle:t,gziFilehandle:e,blockConcurrency:n=ci}){this.filehandle=t,this.gzi=new wA({filehandle:e}),this.limit=Qi(n)}async read(t,e){let{compressed:n,uncompressed:r,nextCompressedPosition:o}=await this.gzi.getRelevantBlocksForRead(t,e);if(n.length===0)return new Uint8Array(0);let i=e+t,s=Bi(n,r,o),c=await Promise.all(s.map(a=>this.limit(async()=>{let g=await this.filehandle.read(a.compressedEnd-a.compressedStart,a.compressedStart);return Ci(await _n(g),a.uncompressedStart,e,i)})));return kn(c)}};var Hn=F(Ko());async function Pn({location:A,name:t}){let e=o=>(0,Hn.openLocation)({uri:o,locationType:"UriLocation"}),n=await e(`${A.uri}.idx`).readFile("utf8"),r=Ei(n,t);if(r){let i=await new EA({filehandle:e(A.uri),gziFilehandle:e(`${A.uri}.gzi`)}).read(r.length,r.offset);return new TextDecoder().decode(i).trim()}}var Yn=A=>A.replace(/\.\d+$/,"");function Ei(A,t){let e=Yn(t);for(let n of A.split(`
11
+ `)){let[r,o,i]=n.split(" ");if(r&&Yn(r)===e)return{offset:Number(o),length:Number(i)}}}var Kn=F(uA());function Tn({model:A}){let{assemblyManager:t,hovered:e}=(0,Kn.getSession)(A),{transcriptToMsaMap:n,connectedView:r,mafRegion:o}=A;if(!r?.initialized||!He(e)||!xA(A))return;let{coord:i,refName:s}=e.hoverPosition,c=i-1,a=t.get(o?.assemblyName??r.assemblyNames[0]??""),g=Q=>(a?.initialized?a.getCanonicalRefName(Q):void 0)??Q,C=g(s);if(o)return C!==g(o.refName)||!r.assemblyNames.includes(o.assemblyName)||c<o.start||c>=o.end?void 0:Ye(A,c-o.start);if(n&&C===g(n.refName)){let Q=n.g2p[c];if(Q!==void 0)return RA(A,Q)}}var di="jbrowse-msaview-domain-cache-v3",fi=["jbrowse-msaview-domain-cache","jbrowse-msaview-domain-cache-v2"],zA="domains",ui=1,li=nA(di,ui,A=>{A.objectStoreNames.contains(zA)||A.createObjectStore(zA,{keyPath:"accession"})}),On=!1;function Zn(){if(!On){On=!0;for(let A of fi)Promise.resolve().then(()=>je(A)).catch(()=>{})}return li()}function Xn(A){return oA("domain cache read",async()=>{let e=(await Zn()).transaction(zA,"readonly"),n=await Promise.all(A.map(r=>e.store.get(r)));return await e.done,n},[])}function Vn(A){return oA("domain cache write",async()=>{let e=(await Zn()).transaction(zA,"readwrite");for(let n of A)await e.store.put(n);await e.done},void 0)}function j(A,t){let e=new RegExp(`<${t}>(.*?)</${t}>`,"s").exec(A)?.[1];return e===void 0?void 0:At(e)}function mi(A){let t={},e=/<GBQualifier>([\s\S]*?)<\/GBQualifier>/g,n;for(;(n=e.exec(A))!==null;){let r=j(n[1],"GBQualifier_name"),o=j(n[1],"GBQualifier_value");r&&o!==void 0&&t[r]===void 0&&(t[r]=o)}return t}function hi(A){let t=[],e=/<GBInterval>([\s\S]*?)<\/GBInterval>/g,n;for(;(n=e.exec(A))!==null;){let r=n[1],o=j(r,"GBInterval_from"),i=j(r,"GBInterval_to"),s=j(r,"GBInterval_point");o&&i?t.push({start:Number(o),end:Number(i)}):s&&t.push({start:Number(s),end:Number(s)})}return t}function wi(A){let t=j(A,"GBFeature_key"),e=mi(A),n=e.db_xref,r=hi(A);if((t==="Region"||t==="Site")&&n?.startsWith("CDD:")&&r.length>0){let o=n.replace("CDD:",""),i=t==="Region",s=e.note?.split(/[[(]/)[0]?.trim(),c=i?e.region_name??o:s||e.site_type||"site",a=i?o:`${o}:${c}`;return{signature:{entry:{name:c,description:e.note??c,accession:a}},locations:r,featureType:t}}}function pi(A){let t=new Map,e=/<GBSeq>([\s\S]*?)<\/GBSeq>/g,n;for(;(n=e.exec(A))!==null;){let r=n[1],o=[],i=/<GBFeature>([\s\S]*?)<\/GBFeature>/g,s;for(;(s=i.exec(r))!==null;){let c=wi(s[1]);c&&o.push(c)}for(let c of[j(r,"GBSeq_accession-version"),j(r,"GBSeq_primary-accession")])c&&t.set(c,o)}return t}async function jn(A,t){let e=[...new Set(A)].filter(Boolean),n=new Map,r=await Xn(e),o=[];e.forEach((c,a)=>{let g=r[a];g?n.set(c,g.matches):o.push(c)});let i=[],s=100;for(let c=0;c<o.length;c+=s){let a=o.slice(c,c+s),g;try{g=await $e(ze({db:"protein",id:a.join(","),rettype:"gp",retmode:"xml"}),{signal:t})}catch(Q){if(R(Q))throw Q;console.warn("[msaview-domains] efetch failed, keeping what loaded:",Q);break}let C=pi(g);for(let Q of a){let I=C.get(Q);I!==void 0&&(n.set(Q,I),i.push({accession:Q,matches:I}))}}return i.length>0&&await Vn(i),n}async function Wn(A,t){let e=Object.entries(A.rowData).flatMap(([o,i])=>i?.Accession?[{rowName:o,accession:i.Accession}]:[]);if(e.length===0)throw new Error("No NCBI accessions found in alignment rows");let n=await jn(e.map(o=>o.accession),t),r=e.flatMap(({rowName:o,accession:i})=>(n.get(i)??[]).flatMap(({signature:s,locations:c,featureType:a})=>s.entry?c.map(({start:g,end:C})=>({id:o,accession:s.entry.accession,name:s.entry.name,description:s.entry.description,featureType:a,start:g,end:C})):[]));if(r.length===0)throw new Error("No CDD domain annotations found for these proteins");A.setAnnotations(r)}var Di="jbrowse-msaview-data",yi=1,dA="msa-data",Je=nA(Di,yi,A=>{A.objectStoreNames.contains(dA)||A.createObjectStore(dA,{keyPath:"id"}).createIndex("timestamp","timestamp",{unique:!1})});function zn(){return`msa-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}async function $n(A,t){try{let e=await Je(),n={...t,id:A,timestamp:Date.now()};return await e.put(dA,n),!0}catch(e){return console.warn("Failed to store MSA data:",e),!1}}async function Ao(A){let t=await Je(),e=await t.get(dA,A);if(!e)return;try{await t.put(dA,{...e,timestamp:Date.now()})}catch(i){console.warn("Failed to refresh MSA data timestamp:",i)}let{id:n,timestamp:r,...o}=e;return o}async function eo(A=10080*60*1e3){try{let t=await Je(),e=Date.now()-A,o=await t.transaction(dA,"readwrite").store.index("timestamp").openCursor(IDBKeyRange.upperBound(e)),i=0;for(;o;)await o.delete(),i++,o=await o.continue();return i}catch(t){return console.warn("Failed to cleanup old MSA data:",t),0}}var to=F(uA()),no=F(vA());function Ni(A){if(!(A.rows.length<2))try{A.calculateNeighborJoiningTreeFromMSA()}catch(t){console.error(t);try{(0,to.getSession)(A).notify(`The alignment loaded, but no tree was built. ${t instanceof Error?t.message:String(t)}`,"warning")}catch(e){console.error(e)}}}function oo(A){(0,no.untracked)(()=>{ki(A)})}function ki({self:A,message:t,launch:e,onLaunched:n}){A.launchController?.abort();let r=new AbortController,{signal:o}=r;A.setLaunchController(r);let i=c=>{o.aborted||c()},s={signal:o,act:i,onProgress:c=>{i(()=>{A.setProgress(c)})},onRid:c=>{i(()=>{A.setRid(c)})}};(async()=>{try{i(()=>{A.setProgress(t),A.setError(void 0)});let{warnings:c=[],...a}=await e(s);i(()=>{A.setData(a);for(let g of c)A.addWarning(g);n()}),a.tree||i(()=>{Ni(A)})}catch(c){R(c)||(i(()=>{A.setError(c)}),console.error(c))}finally{i(()=>{A.setProgress(""),A.launchController===r&&A.setLaunchController(void 0)})}})()}function bi(A){let t=A;return t.type==="ProteinView"&&Array.isArray(t.structures)}function ro(A){return A.filter(bi)}function io(A){let t=A.strand,e=A.refName;if(t!==-1&&t!==1)throw new Error(`Invalid strand value: ${t}. Expected 1 or -1.`);if(!e)throw new Error("refName is required");let n=new Map;for(let c of A.subfeatures??[])if(c.type==="CDS"&&c.start<c.end){let a=`${c.start}-${c.end}`;n.has(a)||n.set(a,c)}let r=[...n.values()].sort((c,a)=>t*(c.start-a.start)),o={},i={},s={};if(r.length!==0){let a=(3-(r[0]?.phase??0))%3,g=-1;for(let C of r){let Q=C.end-C.start;for(let I=0;I<Q;I++){let d=t===1?C.start+I:C.end-1-I,h=Math.floor(a++/3);o[d]=h,h!==g?(i[h]=d,s[h]=[d],g=h):s[h].push(d)}}}return{g2p:o,p2g:i,p2gCodon:s,refName:e,strand:t}}function ao(A,t){let e=A[t];if(e===void 0)return;let n=[...e].sort((o,i)=>o-i),r=[];for(let o of n){let i=r.at(-1);i?.[1]===o?i[1]=o+1:r.push([o,o+1])}return r}var Si=1e6;function ve(A){return typeof A=="object"&&A!==null}function so(A){return Number.isSafeInteger(A)}function go(A){return ve(A)&&typeof A.type=="string"&&A.type.toLowerCase()==="cds"&&so(A.start)&&so(A.end)&&A.start<A.end}function Mi(A){let t=Number(A);return t===1||t===2?t:0}function xi(A){let{subfeatures:t}=A,e=(Array.isArray(t)?t:[]).filter(go);return e.length>0?e:go(A)?[A]:[]}function Fi(A){if(!ve(A))return{reason:"it is not a feature"};let{refName:t,strand:e}=A;if(typeof t!="string"||!t)return{reason:"it has no refName"};if(e!==1&&e!==-1)return{reason:`its strand is ${JSON.stringify(e)}, not 1 or -1`};let n=xi(A).map(o=>({refName:t,type:"CDS",start:o.start,end:o.end,phase:Mi(o.phase)}));if(n.length===0)return{reason:"it has no CDS with numeric start < end"};let r=n.reduce((o,i)=>o+i.end-i.start,0);return r>Si?{reason:`its CDS covers ${r} bases, more than any real transcript`}:{transcript:{refName:t,strand:e,start:Math.min(...n.map(o=>o.start)),end:Math.max(...n.map(o=>o.end)),subfeatures:n}}}var co=new WeakSet;function Io(A){let t=Fi(A);if("reason"in t){ve(A)&&!co.has(A)&&(co.add(A),console.warn(`[msaview] the linked transcript is not mapped to the genome: ${t.reason}`));return}let e=io(t.transcript);return{...e,codingPositions:Object.keys(e.g2p).map(Number).sort((n,r)=>n-r)}}function Ri(A,t){let e=0,n=A.length;for(;e<n;){let r=e+n>>>1;A[r]<t?e=r+1:n=r}return e}function Qo(A,t,e){let n=new Set,{codingPositions:r,g2p:o}=A;for(let i=Ri(r,t);i<r.length&&r[i]<e;i++)n.add(o[r[i]]);return n}var Gi="This view's alignment is no longer in browser storage. Stored alignments are kept for 7 days after they were last used, and are lost when site data is cleared.",Bo=" Retry runs the original search again and rebuilds it.",Co=" Relaunch it from the gene to rebuild it.",Ji="This view's alignment could not be read from browser storage.",vi="Part of this view is no longer in browser storage: annotations, a tree or row metadata too large for the session. Stored documents are kept for 7 days after they were last used, and are lost when site data is cleared.";function lo(A){let{dataStoreId:t}=A;t&&(async()=>{try{A.setLoadingStoredData(!0);let e=await Ao(t);if(A.dataStoreId!==t)return;(0,SA.transaction)(()=>{if(e){let{data:n}=A;e.msa&&!n.msa&&A.setMSA(e.msa),e.tree&&!n.tree&&A.setTree(e.tree),e.treeMetadata&&!n.treeMetadata&&A.setTreeMetadata(e.treeMetadata),e.gff&&!n.gff&&A.setGFF(e.gff),A.setLastStoredData(e)}else A.setDataStoreId(void 0),Eo(A)?A.addWarning(vi):A.setError(new Error(Gi+(A.blastParams??A.orthologParams?Bo:Co)))})}catch(e){console.error("Failed to load MSA data from IndexedDB:",e),(0,MA.isAlive)(A)&&!Eo(A)&&A.setError(new Error(`${Ji} ${e}.${A.blastParams??A.orthologParams?Bo:Co}`))}finally{A.setLoadingStoredData(!1)}})()}function Eo(A){return!!(A.data.msa||A.msaFilehandle||A.init?.msaIndexedLocation)}function Li(A){return!(A.msa||A.tree||A.treeMetadata||A.gff)}function Ui(A,t){return!!A&&A.msa===t.msa&&A.tree===t.tree&&A.treeMetadata===t.treeMetadata&&A.gff===t.gff}function mo(A){let{dataStoreId:t,ownsDataStoreRow:e,isStoringData:n,loadingStoredData:r,lastStoredData:o}=A,i=A.unsavedDocuments;if(!(n||r||Ui(o,i))){if(Li(i)){o&&(0,SA.transaction)(()=>{A.setDataStoreId(void 0),A.setOwnsDataStoreRow(!1),A.setLastStoredData(i)});return}A.setIsStoringData(!0),(async()=>{try{let s=t&&e?t:zn();await $n(s,i)&&(0,SA.transaction)(()=>{A.setDataStoreId(s),A.setOwnsDataStoreRow(!0)})}catch(s){console.error("Failed to store MSA data to IndexedDB:",s)}finally{(0,SA.transaction)(()=>{A.setLastStoredData(i),A.setIsStoringData(!1)})}})()}}function qi(A){return!!A.connectedTranscript&&!A.connectedFeature}function ho(A,t,e,n){t&&!A.launchCompleted&&!qi(A)&&oo({self:A,message:e,launch:n,onLaunched:()=>{A.setLaunchCompleted(!0)}})}function wo(A){ho(A,!!A.orthologParams,"Resolving orthologs",t=>St({self:A,scope:t}))}function po(A){ho(A,!!A.blastParams,"Submitting query",t=>Dt({self:A,scope:t}))}function Do(A){let{rows:t,domainsRequested:e,annotations:n,rowData:r}=A;if(t.length>0&&n.length===0&&!e&&Object.values(r).some(o=>o?.Accession)){let o=new AbortController,i=()=>{o.abort()};(0,MA.addDisposer)(A,i),A.setDomainsRequested(!0),A.setStatus({msg:"Fetching protein domains from NCBI",onCancel:i}),(async()=>{try{await Wn(A,o.signal)}catch(s){R(s)||console.error("[msaview-domains] auto-load failed:",s)}finally{(0,MA.isAlive)(A)&&A.setStatus(void 0)}})()}}function yo(A){let{init:t}=A;if(t){let{msaUrl:e,msaIndexedLocation:n,msaName:r,querySeqName:o}=t,i=!!(n&&r);if(i&&A.data.msa)return;(async()=>{try{A.setError(void 0);let s=e?Pe(e):void 0;s&&A.setUniprotId(s);let c=o??(s?"query":void 0);if(c&&A.setQuerySeqName(c),e)A.setMSAFilehandle({uri:e,locationType:"UriLocation"});else if(n&&r){let a=await Pn({location:n,name:r});if(!a)throw new Error(`No alignment named ${r} in ${n.uri}`);A.setMSA(a)}i||A.setInit(void 0)}catch(s){A.setError(s),console.error(s)}})()}}function No(A){let t=!1;return()=>{let e=Tn({model:A});e!==void 0?(A.setMousePos(e),t=!0):t&&(A.setMousePos(void 0),t=!1)}}function fo(A,t){let{connectedViewId:e,transcriptToMsaMap:n}=A;if(!n||!xA(A))return[];let r=new Set;for(let o of ro((0,uo.getSession)(A).views))for(let i of o.structures)if(i.connectedViewId===e)for(let{start:s,end:c}of i[t]??[])for(let a of Qo(n,s,c)){let g=RA(A,a);g!==void 0&&r.add(g)}return[...r]}function _i(A,t){return!A||!t?A===t:A.length===t.length&&A.every((e,n)=>e===t[n])}function ko(A){let t;return()=>{let{connectedViewId:e,transcriptToMsaMap:n}=A;if(!e||!n)return;let r=fo(A,"hoverGenomeHighlights"),o=r.length?[]:fo(A,"clickGenomeHighlights"),i=A.highlightColumns??[],s=r.length?r:o.length?o:i,c=s.length>0?s:void 0;_i(t,c)||(t=c,A.setHighlightedColumns(c))}}function bo(){eo().catch(A=>{console.error("Failed to cleanup old MSA data:",A)})}function So(A){A.domainsOnGenome&&A.connectedView&&A.connectedDomains.features.length>0&&(A.showDomainsOnGenome(),A.setDomainsOnGenome(!1))}function Le(A,t){let{transcriptToMsaMap:e,mafRegion:n}=A;if(n){let r=n.start+t;return r<n.end?[{refName:n.refName,start:r,end:r+1}]:[]}if(e){let{refName:r,p2gCodon:o}=e,i=t+(A.querySeqOffset??0);return ao(o,i)?.map(([s,c])=>({refName:r,start:s,end:c}))??[]}return[]}function $A({model:A,coord:t}){let e=A.visibleColToSeqPos(A.querySeqName,t);return e===void 0?[]:Le(A,e)}function Mo(A){let t=$A(A),e=t[0],n=t.at(-1);return e&&n?{refName:e.refName,start:e.start,end:n.end}:void 0}function Yi(A){return A&&/(^|[_ ])site$/i.test(A)?"site":"domain"}function Hi(A){let t=[];for(let e of A.toSorted((n,r)=>n.start-r.start)){let n=t.at(-1);n&&n.refName===e.refName&&e.start<=n.end?n.end=Math.max(n.end,e.end):t.push({...e})}return t}function Pi(A,t){let e=[];for(let n of t)e.push(...Le(A,n));return Hi(e)}function xo(A){let t=new Map;if(A.showDomains)for(let n of A.annotationsByRow[A.querySeqName]??[]){let r=t.get(n.accession);r?r.push(n):t.set(n.accession,[n])}let e=[...t].flatMap(([n,r])=>{let o=new Set;for(let{start:a,end:g}of r)for(let C=a-1;C<g;C++)o.add(C);let i=r[0],s=A.featureColors.get(i)?.fill,c=Pi(A,o);return s&&c.length>0?[{feature:{name:A.annotationTypes.get(n)?.name??i.name,accession:n,kind:Yi(i.featureType),regions:c},fill:s,residues:o.size}]:[]}).toSorted((n,r)=>r.residues-n.residues);return{features:e.map(n=>n.feature),color:{field:"accession",domain:e.map(n=>n.feature.accession),range:e.map(n=>n.fill),labels:e.map(n=>n.feature.name)}}}function Ki(A){return`msaview-domains-${A}`}function Fo({viewId:A,assemblyName:t,name:e,strand:n,domains:r}){let o=Ki(A),i=n===void 0?{}:{strand:n};return{type:"FeatureTrack",trackId:o,name:e,assemblyNames:[t],adapter:{type:"FromConfigAdapter",features:r.features.map(({name:s,accession:c,regions:a},g)=>{let C=`${o}-${g}`;return{uniqueId:C,refName:a[0].refName,start:Math.min(...a.map(Q=>Q.start)),end:Math.max(...a.map(Q=>Q.end)),...i,type:"protein_domain",name:s,accession:c,subfeatures:a.map((Q,I)=>({uniqueId:`${C}-${I}`,refName:Q.refName,start:Q.start,end:Q.end,...i,type:"protein_domain_part"}))}})},displays:[{type:"LinearBasicDisplay",displayId:`${o}-LinearBasicDisplay`,color:{...r.color,title:"Domains"}}]}}var Jo=F(Yo()),qe=F(uA()),vo=F(Po()),Lo=F(ne()),Ae=F(vA());function Ro(A){return A.replace(/\.\d+$/,"")}function Ti(A,t){let e=Ro(t);return[A.get("name"),A.get("id"),A.get("transcript_id"),A.id()].some(n=>typeof n=="string"&&(n===t||Ro(n)===e))}function Go(A){return A.map(t=>({assemblyName:t.assemblyName,refName:t.refName,start:Math.floor(t.start),end:Math.ceil(t.end)}))}function Oi(A){let t=Go(A.dynamicBlocks?.contentBlocks??[]),e=Go(A.displayedRegions);return t.length>0?[t,e]:[e]}function Uo(A){return A.filter(t=>t.type==="FeatureTrack")}async function Zi(A,t){let e=A.connectedView,n=(0,qe.getSession)(A),r="msaview-connectedTranscript",o=Uo(e.tracks);for(let i of Oi(e))for(let s of o){let c=await n.rpcManager.call(r,"CoreGetFeatures",{adapterConfig:(0,Jo.getConf)(s,"adapter"),regions:i});for(let a of c){let g=Ze(a).find(C=>Ti(C,t));if(g)return g}}}async function Xi(A,t){let e=await Xe({start:t.get("start"),end:t.get("end"),refName:t.get("refName"),assemblyName:A.connectedView.assemblyNames[0],session:(0,qe.getSession)(A)});return(0,vo.translateTranscript)({transcript:t,...e})?.protein}var Ue=new WeakMap;async function Vi({self:A,transcriptId:t,blastParams:e,orthologParams:n,isCurrent:r}){let o=Uo(A.connectedView.tracks).length;try{A.setProgress(`Looking up ${t} in the genome view...`);let i=await Zi(A,t);if(!i)throw new Error(`Transcript "${t}" was not found in the ${o} feature track(s) open in the connected genome view. Open the gene track that carries it, and make sure the view is on its locus.`);let s=await Xi(A,i);if(!s)throw new Error(`Transcript "${t}" has no CDS to translate`);if(!r())return;let c=i.toJSON();(0,Ae.transaction)(()=>{A.setProgress(""),e&&!e.proteinSequence&&A.setBlastParams({...e,selectedTranscript:c,proteinSequence:s}),n&&!n.proteinSequence&&A.setOrthologParams({...n,selectedTranscript:c,proteinSequence:s}),A.setConnectedFeature(c)})}catch(i){console.error(i),r()&&(A.setProgress(""),A.setError(i))}}function qo(A){let{connectedTranscript:t,connectedFeature:e,connectedView:n,blastParams:r,orthologParams:o}=A;if(!t||e||!n?.initialized||n.tracks.length===0)return;let i=(Ue.get(A)??0)+1;Ue.set(A,i),(0,Ae.untracked)(()=>{Vi({self:A,transcriptId:t,blastParams:r,orthologParams:o,isCurrent:()=>(0,Lo.isAlive)(A)&&Ue.get(A)===i})})}var ug=["ncbi","panther","uniref"];function ji(){return b.types.compose(_o.BaseViewModel,ot(),b.types.model("MsaView",{connectedViewId:b.types.maybe(b.types.string),connectedFeature:b.types.frozen(),connectedTranscript:b.types.maybe(b.types.string),blastParams:b.types.frozen(),orthologParams:b.types.frozen(),querySeqName:b.types.stripDefault(b.types.string,"QUERY"),querySeqOffset:b.types.stripDefault(b.types.number,0),uniprotId:b.types.maybe(b.types.string),zoomToBaseLevel:b.types.stripDefault(b.types.boolean,!1),init:b.types.frozen(),dataStoreId:b.types.maybe(b.types.string),launchCompleted:!1,mafRegion:b.types.frozen(),embeddedMode:!0,domainsOnGenome:b.types.stripDefault(b.types.boolean,!1)})).volatile(()=>({rid:void 0,progress:"",loadingStoredData:!1,isStoringData:!1,lastStoredData:void 0,ownsDataStoreRow:!1,launchController:void 0,domainsRequested:!1})).views(A=>({get transcriptToMsaMap(){return A.connectedFeature?Io(A.connectedFeature):void 0},get connectedView(){let{views:t}=(0,K.getSession)(A);return t.find(e=>e.id===A.connectedViewId)}})).views(A=>({get connectedHoverHighlights(){let{mouseCol:t}=A;return t===void 0?[]:$A({model:A,coord:t})},get connectedClickHighlights(){let{mouseClickCol:t}=A;return t===void 0?[]:$A({model:A,coord:t})},get connectedHighlights(){return[...this.connectedHoverHighlights,...this.connectedClickHighlights]},get connectedDomains(){return xo(A)}})).views(A=>({get hostRestoresData(){let{msaIndexedLocation:t,msaName:e}=A.init??{};return A.hostCarriesData||!!(t&&e)},get unsavedDocuments(){let{data:t,init:e}=A,n=(0,b.getSnapshot)(t),r=(o,i)=>{let s=t[o];return s&&!i&&!n[o]?s:void 0};return{msa:r("msa",A.msaFilehandle??e?.msaIndexedLocation),tree:r("tree",A.treeFilehandle),treeMetadata:r("treeMetadata",A.treeMetadataFilehandle),gff:r("gff",A.gffFilehandle)}}})).actions(A=>({setZoomToBaseLevel(t){A.zoomToBaseLevel=t},setProgress(t){A.progress=t},setRid(t){A.rid=t},setBlastParams(t){A.blastParams=t},setConnectedFeature(t){A.connectedFeature=t},setOrthologParams(t){A.orthologParams=t},setInit(t){A.init=t},setQuerySeqName(t){A.querySeqName=t},setUniprotId(t){A.uniprotId=t},setDataStoreId(t){A.dataStoreId=t},setLaunchCompleted(t){A.launchCompleted=t},setLoadingStoredData(t){A.loadingStoredData=t},setIsStoringData(t){A.isStoringData=t},setLastStoredData(t){A.lastStoredData=t},setOwnsDataStoreRow(t){A.ownsDataStoreRow=t},setLaunchController(t){A.launchController=t},cancelLaunch(){A.launchController?.abort(),A.launchController=void 0,A.blastParams=void 0,A.orthologParams=void 0,A.init=void 0,A.launchCompleted=!1,A.progress="",A.rid=void 0,A.error=void 0},retryLaunch(){A.launchController?.abort(),A.launchController=void 0,A.progress="",A.rid=void 0,A.error=void 0,A.launchCompleted=!1,A.blastParams&&(A.blastParams={...A.blastParams}),A.orthologParams&&(A.orthologParams={...A.orthologParams}),A.init&&(A.init={...A.init})},setDomainsRequested(t){A.domainsRequested=t},setDomainsOnGenome(t){A.domainsOnGenome=t},showDomainsOnGenome(){let t=(0,K.getSession)(A),{connectedView:e,connectedDomains:n,connectedFeature:r}=A,o=e?.assemblyNames[0];if(!e||!o||n.features.length===0||!(0,K.isSessionWithAddSessionTrack)(t))return;let i=r,s=[i?.gene_name,i?.gene,i?.name].find(g=>typeof g=="string"&&g!==""),c=Fo({viewId:A.id,assemblyName:o,name:`${s??A.querySeqName} domains (from the alignment)`,strand:A.mafRegion?void 0:A.transcriptToMsaMap?.strand,domains:n}),a=(0,K.isSessionWithSessionTracks)(t)?t.sessionTracks.find(g=>g.trackId===c.trackId):void 0;a&&(0,K.isSessionWithDeleteTrackConf)(t)&&t.deleteTrackConf(a),t.addSessionTrackConf(c)&&e.launchTrack(c.trackId)},handleMsaClick(t){let{connectedView:e,zoomToBaseLevel:n}=A,r=Mo({model:A,coord:t});!r||!e||(n?e.navTo(r):e.centerAt(r.start,r.refName))}})).actions(A=>{let t=A.setMouseClickPos.bind(A);return{setMouseClickPos(e,n){t(e,n),e!==void 0&&A.handleMsaClick(e)}}}).actions(A=>{let t=A.reset.bind(A);return{reset(){let{displayName:e,minimized:n,zoomToBaseLevel:r}=A;t(),e!==void 0&&A.setDisplayName(e),A.setMinimized(n),A.setZoomToBaseLevel(r),A.setDomainsRequested(!1),A.setLastStoredData(void 0),A.setOwnsDataStoreRow(!1)}}}).views(A=>{let t=A.menuItems.bind(A);return{menuItems(){return[...t(),{label:"Zoom to base level on click?",type:"checkbox",checked:A.zoomToBaseLevel,onClick:()=>{A.setZoomToBaseLevel(!A.zoomToBaseLevel)}},...A.connectedView&&A.connectedDomains.features.length>0?[{label:"Show domains on the genome",onClick:()=>{A.showDomainsOnGenome()}}]:[]]}}}).actions(A=>({afterCreate(){bo(),(0,b.addDisposer)(A,()=>{A.launchController?.abort()}),lo(A);for(let t of[mo,qo,po,wo,yo,Do,So])(0,b.addDisposer)(A,(0,ee.autorun)(()=>{t(A)}));(0,b.addDisposer)(A,(0,ee.autorun)(No(A))),(0,b.addDisposer)(A,(0,ee.autorun)(ko(A)))}}))}export{ji as default,ug as orthologSources};
12
+ //# sourceMappingURL=model-SEEQQSQO.js.map