@sjcrh/proteinpaint-client 2.207.1 → 2.208.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 (919) hide show
  1. package/dist/2dmaf-PN5YS362.js +1367 -0
  2. package/dist/AggMatrixInput-NJHU4FU2.js +406 -0
  3. package/dist/AggMatrixInput-NJHU4FU2.js.map +7 -0
  4. package/dist/AggregateMatrix-IBWOJWOC.js +41 -0
  5. package/dist/AppHeader-XV6S7GG5.js +830 -0
  6. package/dist/BoxPlot-ZIVA55SK.js +1211 -0
  7. package/dist/CorrelationVolcano-33I4FC44.js +617 -0
  8. package/dist/CorrelationVolcano-33I4FC44.js.map +7 -0
  9. package/dist/Cuminc-WKY35UGV.js +1219 -0
  10. package/dist/DE-E256DHID.js +89 -0
  11. package/dist/DEinput-YU3W72K7.js +499 -0
  12. package/dist/DM-W7PXTIKY.js +90 -0
  13. package/dist/DifferentialAnalysis-SHMQHWJL.js +236 -0
  14. package/dist/DifferentialAnalysis-SHMQHWJL.js.map +7 -0
  15. package/dist/Disco-OZY5GW2Z.js +3389 -0
  16. package/dist/Disco.UI-NRALEYXK.js +243 -0
  17. package/dist/DmrPlot-QKUX5XUW.js +637 -0
  18. package/dist/GB-ZYH7PGHT.js +1391 -0
  19. package/dist/GSEA-VQTD4MLY.js +851 -0
  20. package/dist/GeneExpInput-XEFUTLFU.js +42 -0
  21. package/dist/Geomap-GEK7UEDU.js +84 -0
  22. package/dist/HicApp-ZY7UHV5H.js +2245 -0
  23. package/dist/IDCViewer-YNKG4V46.js +10812 -0
  24. package/dist/NumBinaryEditor-NEL727DX.js +279 -0
  25. package/dist/NumBinaryEditor.unit.spec-GCGZMJYF.js +312 -0
  26. package/dist/NumContEditor-IM6RRDGU.js +105 -0
  27. package/dist/NumContEditor.unit.spec-B5AJXANS.js +164 -0
  28. package/dist/NumCustomBinEditor-EZT5DRKP.js +33 -0
  29. package/dist/NumCustomBinEditor.unit.spec-KLUDS6TH.js +397 -0
  30. package/dist/NumDiscreteEditor-2M6Q5AAZ.js +170 -0
  31. package/dist/NumDiscreteEditor.unit.spec-2JYZYJUX.js +233 -0
  32. package/dist/NumRegularBinEditor-AQDHA2PU.js +33 -0
  33. package/dist/NumRegularBinEditor.unit.spec-62BYFNYG.js +278 -0
  34. package/dist/NumSplineEditor-6Y5TZSTO.js +210 -0
  35. package/dist/NumSplineEditor.unit.spec-S65AV5EK.js +224 -0
  36. package/dist/NumericDensity-5ES4SDWZ.js +33 -0
  37. package/dist/NumericDensity.unit.spec-J6KZSE2P.js +418 -0
  38. package/dist/NumericHandler-ZTLDPP2F.js +34 -0
  39. package/dist/NumericHandler.unit.spec-BZFBVHGU.js +214 -0
  40. package/dist/ProteomeInput-IKEXPCGV.js +388 -0
  41. package/dist/Regression-6F6YP3AX.js +1416 -0
  42. package/dist/RunChart2-CVRPXQH5.js +749 -0
  43. package/dist/SC-FPXVXBXF.js +1175 -0
  44. package/dist/SC-FPXVXBXF.js.map +7 -0
  45. package/dist/Violin-BAS6DQHL.js +1081 -0
  46. package/dist/Violin-BAS6DQHL.js.map +7 -0
  47. package/dist/Volcano-FCCWUMX7.js +1649 -0
  48. package/dist/Wsi-3YTFABWG.js +629 -0
  49. package/dist/Wsi-3YTFABWG.js.map +7 -0
  50. package/dist/adSandbox-QYIG6637.js +33 -0
  51. package/dist/animatedBubbleChart-X53PR73H.js +547 -0
  52. package/dist/app-HJLTRZPI.js +32 -0
  53. package/dist/app-MGY6A4DM.js +42 -0
  54. package/dist/app.js +14 -14
  55. package/dist/bam-VRQHRCP5.js +876 -0
  56. package/dist/barchart-TWMOUZFL.js +42 -0
  57. package/dist/barchart2-CV7RMMRG.js +309 -0
  58. package/dist/block-L53P4UGQ.js +6249 -0
  59. package/dist/block.init-XYOJTXKP.js +33 -0
  60. package/dist/block.mds.expressionrank-77FSBDHA.js +354 -0
  61. package/dist/block.mds.geneboxplot-4TSYV4WS.js +823 -0
  62. package/dist/block.mds.junction-P4MYDET6.js +1539 -0
  63. package/dist/block.mds.svcnv-CYOFAS2T.js +6796 -0
  64. package/dist/block.svg-IT3ELCF4.js +159 -0
  65. package/dist/block.tk.aicheck-GULHJLV5.js +278 -0
  66. package/dist/block.tk.ase-RW5YL6HN.js +360 -0
  67. package/dist/block.tk.bam-MPGQW6KB.js +1901 -0
  68. package/dist/block.tk.bedgraphdot-EYRY374P.js +379 -0
  69. package/dist/block.tk.bigwig.ui-BKSXCDNM.js +206 -0
  70. package/dist/block.tk.hicstraw-76PV6NM3.js +818 -0
  71. package/dist/block.tk.junction-Z52QHQJQ.js +2358 -0
  72. package/dist/block.tk.junction.textmatrixui-K32OOTZC.js +194 -0
  73. package/dist/block.tk.ld-DDGLRHPO.js +94 -0
  74. package/dist/block.tk.menu-MO6TESKI.js +1024 -0
  75. package/dist/block.tk.pgv-AKLKKSEP.js +938 -0
  76. package/dist/brainImaging-KSTJQJAB.js +555 -0
  77. package/dist/brainRegions-WCRMMSK4.js +217 -0
  78. package/dist/bubbleHeatmap-4YOQ3BAB.js +378 -0
  79. package/dist/cellTypeBubbleHeatmap-O6YZ2RW4.js +278 -0
  80. package/dist/chunk-3GUVLDUS.js +299 -0
  81. package/dist/chunk-3PQDD5HM.js +446 -0
  82. package/dist/chunk-3WYUHDDP.js +1986 -0
  83. package/dist/chunk-4C7MA5Q3.js +158 -0
  84. package/dist/chunk-4EZLVENZ.js +1612 -0
  85. package/dist/chunk-4EZLVENZ.js.map +7 -0
  86. package/dist/chunk-4PB5ZEOB.js +102 -0
  87. package/dist/chunk-5IMFPVGT.js +119 -0
  88. package/dist/chunk-6DPELKO5.js +518 -0
  89. package/dist/chunk-6HGTVMZM.js +54 -0
  90. package/dist/chunk-6HGTVMZM.js.map +7 -0
  91. package/dist/chunk-72P6O537.js +1731 -0
  92. package/dist/chunk-72P6O537.js.map +7 -0
  93. package/dist/chunk-74C6G6JD.js +397 -0
  94. package/dist/chunk-A7TXS6JR.js +276 -0
  95. package/dist/chunk-AAJXHERO.js +123 -0
  96. package/dist/chunk-AVS4IXEA.js +692 -0
  97. package/dist/chunk-AVS4IXEA.js.map +7 -0
  98. package/dist/chunk-BFXZBZEV.js +176 -0
  99. package/dist/chunk-BGVGN73F.js +480 -0
  100. package/dist/chunk-BL7EYUZC.js +6360 -0
  101. package/dist/chunk-BPGZUNLL.js +274 -0
  102. package/dist/chunk-CPIPN5F6.js +141 -0
  103. package/dist/chunk-D5MSWPAZ.js +217 -0
  104. package/dist/chunk-DFT2PAIU.js +243 -0
  105. package/dist/chunk-DMWOK4DS.js +178 -0
  106. package/dist/chunk-DMWOK4DS.js.map +7 -0
  107. package/dist/chunk-E7NVJ44Z.js +263 -0
  108. package/dist/chunk-EMMGUSJB.js +54 -0
  109. package/dist/chunk-G3CCQOLH.js +240 -0
  110. package/dist/chunk-GGQVDHYF.js +379 -0
  111. package/dist/chunk-GMRIEUBW.js +408 -0
  112. package/dist/chunk-GMRIEUBW.js.map +7 -0
  113. package/dist/chunk-GPZYAJQH.js +2676 -0
  114. package/dist/chunk-GS6ZMPKP.js +272 -0
  115. package/dist/chunk-GUXKLMLM.js +102 -0
  116. package/dist/chunk-HELEV3LT.js +2853 -0
  117. package/dist/chunk-HKKTNIMX.js +339 -0
  118. package/dist/chunk-HKSRIEWJ.js +26 -0
  119. package/dist/chunk-IELQ3HMN.js +70 -0
  120. package/dist/chunk-IISNWG4X.js +103 -0
  121. package/dist/chunk-J7KB2MH3.js +34 -0
  122. package/dist/chunk-JEJV7V7M.js +2327 -0
  123. package/dist/chunk-JIZ3B32T.js +626 -0
  124. package/dist/chunk-KAY2ODXX.js +38 -0
  125. package/dist/chunk-KJM6PLXM.js +5071 -0
  126. package/dist/chunk-KZHF3MQX.js +1278 -0
  127. package/dist/chunk-MC674TS2.js +194 -0
  128. package/dist/chunk-MLKQZ3RL.js +1339 -0
  129. package/dist/chunk-MSSPT5YM.js +550 -0
  130. package/dist/chunk-N6IWVSFP.js +4375 -0
  131. package/dist/chunk-N6IWVSFP.js.map +7 -0
  132. package/dist/chunk-NBGVEZNX.js +56 -0
  133. package/dist/chunk-NBGVEZNX.js.map +7 -0
  134. package/dist/chunk-OBBR4UYN.js +54 -0
  135. package/dist/chunk-PQA3C2NY.js +294 -0
  136. package/dist/chunk-QJ2VBXFB.js +134 -0
  137. package/dist/chunk-QJ3HYZH3.js +24772 -0
  138. package/dist/chunk-QJ3HYZH3.js.map +7 -0
  139. package/dist/chunk-QP7EJXSU.js +55 -0
  140. package/dist/chunk-QUHXX7JE.js +56 -0
  141. package/dist/chunk-QUHXX7JE.js.map +7 -0
  142. package/dist/chunk-REPQKF5L.js +182 -0
  143. package/dist/chunk-REPQKF5L.js.map +7 -0
  144. package/dist/chunk-SHXJW27D.js +2784 -0
  145. package/dist/chunk-SUNDNTVY.js +302 -0
  146. package/dist/chunk-TSI4W6XO.js +98 -0
  147. package/dist/chunk-TXIQ5PHR.js +468 -0
  148. package/dist/chunk-U45R6QNT.js +562 -0
  149. package/dist/chunk-UMZJQWWK.js +1233 -0
  150. package/dist/chunk-VMRO6DMC.js +2140 -0
  151. package/dist/chunk-VMRO6DMC.js.map +7 -0
  152. package/dist/chunk-VO7Q4WMM.js +55 -0
  153. package/dist/chunk-VWGRKOVJ.js +170 -0
  154. package/dist/chunk-WCTKHF5T.js +197 -0
  155. package/dist/chunk-WOMERKMR.js +31 -0
  156. package/dist/chunk-WXX2YD4Q.js +59 -0
  157. package/dist/chunk-X44AR557.js +382 -0
  158. package/dist/chunk-XEU5HXOY.js +783 -0
  159. package/dist/chunk-XGYQZHNX.js +281 -0
  160. package/dist/chunk-XOND7UIK.js +49 -0
  161. package/dist/chunk-XRMUUWLS.js +339 -0
  162. package/dist/chunk-XTOGCXPD.js +129 -0
  163. package/dist/chunk-Y5BBFDC3.js +14 -0
  164. package/dist/chunk-Z2FSHODI.js +203 -0
  165. package/dist/cohort-JWIQOO7U.js +70 -0
  166. package/dist/condition-ZUAQYF5C.js +327 -0
  167. package/dist/controls-ZPQ6SXD2.js +34 -0
  168. package/dist/controls.config-NELL5HY5.js +34 -0
  169. package/dist/correlation-2X76UI3K.js +95 -0
  170. package/dist/customdata.inputui-V6QIGFRP.js +284 -0
  171. package/dist/dataDownload-NSDY4MSL.js +329 -0
  172. package/dist/databrowser.ui-DDLFQB6K.js +425 -0
  173. package/dist/dictionary-WSDD6TFI.js +113 -0
  174. package/dist/dnaMethylation-3IM4OACZ.js +33 -0
  175. package/dist/dnaMethylation.integration.spec-5CSJA67S.js +198 -0
  176. package/dist/dofetch-GZ7POIBV.js +48 -0
  177. package/dist/e2pca-AX7U2DOI.js +344 -0
  178. package/dist/ep-UKACHFJU.js +1249 -0
  179. package/dist/expclust.gdc.spec-46HDKH2Q.js +302 -0
  180. package/dist/facet-3EONZDDE.js +519 -0
  181. package/dist/gb-W7GX5NWS.js +81 -0
  182. package/dist/geneExpClustering-PJA6Y5GW.js +244 -0
  183. package/dist/geneExpression-EMLVPVNK.js +310 -0
  184. package/dist/geneExpression-JMGYBT53.js +33 -0
  185. package/dist/geneExpression.unit.spec-DDZVZJVC.js +128 -0
  186. package/dist/geneORA-CIAFQQWB.js +273 -0
  187. package/dist/geneRanking-JRAU6FMJ.js +548 -0
  188. package/dist/geneVariant-3DZTWQFG.js +36 -0
  189. package/dist/geneVariant-YWURIZ72.js +286 -0
  190. package/dist/geneVariant.integration.spec-V3KECZMM.js +489 -0
  191. package/dist/genefusion.ui-AO3TUDTL.js +303 -0
  192. package/dist/geneset-RCIP2GZH.js +203 -0
  193. package/dist/genomeBrowser.spec-7PZCNBL3.js +276 -0
  194. package/dist/grin2-EUBCNH4Q.js +70 -0
  195. package/dist/grin2-YYBB5XJK.js +1137 -0
  196. package/dist/hierCluster-AV5NO2GW.js +59 -0
  197. package/dist/hierCluster-W2MVN34V.js +55 -0
  198. package/dist/hierCluster.config-4MBWG6RZ.js +36 -0
  199. package/dist/hierCluster.integration.spec-JUIBIUKH.js +483 -0
  200. package/dist/hierCluster.interactivity-6PJE64PF.js +49 -0
  201. package/dist/hierCluster.renderers-RWDQ5SHY.js +19 -0
  202. package/dist/imagePlot-XLDQNUJA.js +156 -0
  203. package/dist/importPlot-7FISAQKR.js +8 -0
  204. package/dist/isoformExpression-WOQAOVZS.js +35 -0
  205. package/dist/isoformExpression.unit.spec-BMEGJNCO.js +237 -0
  206. package/dist/junction-6NO36IPU.js +36 -0
  207. package/dist/junction.customTerm-N6JAOWZO.js +16 -0
  208. package/dist/junction.unit.spec-UKGSQHO4.js +182 -0
  209. package/dist/launch.adhoc-42PUNEA6.js +37 -0
  210. package/dist/leftlabel.sample-EXAUDPSB.js +258 -0
  211. package/dist/lollipop-4ASTA5HO.js +166 -0
  212. package/dist/maf-HPXANL3M.js +455 -0
  213. package/dist/maftimeline-2SXFX3HF.js +587 -0
  214. package/dist/matrix-DX4W5XMX.js +59 -0
  215. package/dist/matrix-S34ITAPJ.js +54 -0
  216. package/dist/matrix.cells-BLULUGSZ.js +26 -0
  217. package/dist/matrix.config-Z3LWYH74.js +37 -0
  218. package/dist/matrix.data-73HY7Y2V.js +23 -0
  219. package/dist/matrix.groups-NOUMYNFY.js +26 -0
  220. package/dist/matrix.integration.spec-VTXYJ46U.js +3160 -0
  221. package/dist/matrix.interactivity-YHDIO5A2.js +37 -0
  222. package/dist/matrix.layout-25HYKUF2.js +39 -0
  223. package/dist/matrix.legend-IMK7DH4V.js +20 -0
  224. package/dist/matrix.renderers-3RZRN6HO.js +34 -0
  225. package/dist/matrix.serieses-ZTVHQ7QA.js +19 -0
  226. package/dist/matrix.sort-EDXHT6NZ.js +26 -0
  227. package/dist/matrix.sort.unit.spec-LSNY7PHU.js +468 -0
  228. package/dist/matrix.sorterUi-3DRNHG5Z.js +16 -0
  229. package/dist/matrix.sorterUi.unit.spec-GNIIWGRJ.js +338 -0
  230. package/dist/matrix.unit.spec-7A6ZFRXI.js +150 -0
  231. package/dist/mavb-M5AXPLYX.js +727 -0
  232. package/dist/mds.fimo-QE5OFA22.js +513 -0
  233. package/dist/mds.samplescatterplot-664EOHX2.js +1545 -0
  234. package/dist/mds.survivalplot-H4TJD44D.js +477 -0
  235. package/dist/multivalue-JD3CNQJR.js +83 -0
  236. package/dist/numericDictTermCluster-XPKEYXD7.js +63 -0
  237. package/dist/oncomatrix-TX5PZQ76.js +290 -0
  238. package/dist/oncomatrix.spec-6X2WAHL7.js +443 -0
  239. package/dist/plot.2dvaf-5OHUFTMK.js +372 -0
  240. package/dist/plot.app-XIVVJHWG.js +36 -0
  241. package/dist/plot.barplot-PSODLAXD.js +97 -0
  242. package/dist/plot.boxplot-W3ASYFOG.js +146 -0
  243. package/dist/plot.brainImaging-JGDLKLR7.js +51 -0
  244. package/dist/plot.disco-TPMXTTZK.js +99 -0
  245. package/dist/plot.ssgq-KIZIOZIF.js +134 -0
  246. package/dist/plot.vaf2cov-MSMW72IY.js +253 -0
  247. package/dist/polar2-LA4MSRRN.js +232 -0
  248. package/dist/profileForms-BJRNB2ZF.js +941 -0
  249. package/dist/profilePlot-DDO53C4T.js +49 -0
  250. package/dist/proteinView-NFUR42XQ.js +1357 -0
  251. package/dist/proteomeCohortCompare-OZVF3X66.js +912 -0
  252. package/dist/pseudbulk.unit.spec-RY72JF7A.js +86 -0
  253. package/dist/pseudbulk.unit.spec-RY72JF7A.js.map +7 -0
  254. package/dist/pseudobulk-UVT5G2VL.js +35 -0
  255. package/dist/qualitative-X3VXNC7X.js +38 -0
  256. package/dist/radar2-RTVUJ3AN.js +327 -0
  257. package/dist/radarFacility2-ZGLZ5AKM.js +335 -0
  258. package/dist/rememberedGvQ.unit.spec-RLLLWU5M.js +211 -0
  259. package/dist/render-LR5BOYW6.js +33 -0
  260. package/dist/report-37W5OXUM.js +217 -0
  261. package/dist/sampleView-BDC2WPH7.js +43 -0
  262. package/dist/samplelst-V2EIVZC5.js +106 -0
  263. package/dist/samplematrix-XOSKILUL.js +2193 -0
  264. package/dist/sc-ZVZPWQY7.js +81 -0
  265. package/dist/scatter-2ZE5MCYH.js +88 -0
  266. package/dist/scatter-ZOWFPGIS.js +925 -0
  267. package/dist/scatter-ZOWFPGIS.js.map +7 -0
  268. package/dist/selectGenomeWithTklst-EF7WYEAJ.js +129 -0
  269. package/dist/singleCellCellType-TKCGC3G3.js +33 -0
  270. package/dist/singleCellCellType.unit.spec-JZ6UHC5F.js +154 -0
  271. package/dist/singleCellGeneExpression-I2INGXGI.js +33 -0
  272. package/dist/singleCellGeneExpression.unit.spec-KL77FSHZ.js +148 -0
  273. package/dist/singleCellNumericValue-2X5NCEHL.js +33 -0
  274. package/dist/singleCellNumericValue.unit.spec-OUDBX5MY.js +416 -0
  275. package/dist/singleCellNumericValue.unit.spec-OUDBX5MY.js.map +7 -0
  276. package/dist/singleCellPlot-Q6INE54V.js +48 -0
  277. package/dist/singlecell-5N2P5ZAT.js +81 -0
  278. package/dist/singlecell-NPSWMNI3.js +1566 -0
  279. package/dist/snp-2WPJYPDE.js +33 -0
  280. package/dist/snp.unit.spec-PPWIIOX6.js +171 -0
  281. package/dist/snplocus-T3HZFZWA.js +203 -0
  282. package/dist/spliceevent.a53ss.diagram-APCF4LV5.js +146 -0
  283. package/dist/spliceevent.exonskip.diagram-TT5JGBSC.js +278 -0
  284. package/dist/spliceevent.noeventdiagram-CPXQSX3Z.js +455 -0
  285. package/dist/ssGSEA-FSX6P7HA.js +33 -0
  286. package/dist/ssGSEA.unit.spec-TXYT665R.js +83 -0
  287. package/dist/stattable-BD64SFYV.js +117 -0
  288. package/dist/studyCatalog-6BOWO4PO.js +414 -0
  289. package/dist/summarizeCnvGeneexp-AMLYJIPU.js +158 -0
  290. package/dist/summarizeGeneexpSurvival-IDM7T333.js +105 -0
  291. package/dist/summarizeMutationCnv-R6SYSJQC.js +159 -0
  292. package/dist/summarizeMutationDiagnosis-XZJ4JLW2.js +35 -0
  293. package/dist/summarizeMutationSurvival-ABJ5RL4L.js +99 -0
  294. package/dist/summary-NVYCTE6P.js +44 -0
  295. package/dist/summary.integration.spec-SSLTLVNW.js +409 -0
  296. package/dist/summaryInput-SJOZETRP.js +242 -0
  297. package/dist/sunburst-RU5ZPJKW.js +278 -0
  298. package/dist/survival-BHJQMXKI.js +53 -0
  299. package/dist/survival-DVG6Y2FV.js +1248 -0
  300. package/dist/survival.integration.spec-OJUPTY5N.js +613 -0
  301. package/dist/survival.integration.spec-OJUPTY5N.js.map +7 -0
  302. package/dist/svgraph-ETFA4GRX.js +1382 -0
  303. package/dist/svmr-AI3RU4JK.js +3837 -0
  304. package/dist/table-YCTSMLQL.js +197 -0
  305. package/dist/termCollection-GMKEZR6D.js +252 -0
  306. package/dist/termCollection-VEVKKJZD.js +33 -0
  307. package/dist/termCollection.unit.spec-EU6YCEPX.js +299 -0
  308. package/dist/termCollectionFractionSelection-UBS74X36.js +42 -0
  309. package/dist/termCollectionFractionSelection.unit.spec-Y5OJFGDD.js +188 -0
  310. package/dist/tk-HMF4HCNV.js +1121 -0
  311. package/dist/tk-W6Z4FJMW.js +41 -0
  312. package/dist/tp.ui-NECRDJCS.js +1454 -0
  313. package/dist/tvs.dt-2JEH3F35.js +34 -0
  314. package/dist/tvs.dtcnv.categorical-YBXKEBR2.js +35 -0
  315. package/dist/tvs.dtcnv.continuous-AD3SJ6BY.js +67 -0
  316. package/dist/tvs.dtfusion-ODI3CLQS.js +35 -0
  317. package/dist/tvs.dtitd-V3LYLPJY.js +35 -0
  318. package/dist/tvs.dtsnvindel-R3V5LTNL.js +35 -0
  319. package/dist/tvs.dtsv-ZQLKEDLJ.js +35 -0
  320. package/dist/tvs.samplelst-G25A7HM6.js +98 -0
  321. package/dist/tvs.termCollection-WLVCWDEJ.js +124 -0
  322. package/dist/vocabulary-6K537FJM.js +36 -0
  323. package/dist/vocabulary-6K537FJM.js.map +7 -0
  324. package/dist/wsi.direct-SNPPQPVO.js +8343 -0
  325. package/package.json +3 -3
  326. package/dist/2dmaf-32F56QBJ.js +0 -1367
  327. package/dist/AggMatrixInput-RDFMGV47.js +0 -277
  328. package/dist/AggMatrixInput-RDFMGV47.js.map +0 -7
  329. package/dist/AggregateMatrix-TPXNNWVD.js +0 -41
  330. package/dist/AppHeader-SEJXDJE3.js +0 -830
  331. package/dist/BoxPlot-LOAO2MDO.js +0 -1211
  332. package/dist/CorrelationVolcano-AU6ZAFPG.js +0 -614
  333. package/dist/CorrelationVolcano-AU6ZAFPG.js.map +0 -7
  334. package/dist/Cuminc-O533BXFY.js +0 -1219
  335. package/dist/DE-FDAUNOWU.js +0 -89
  336. package/dist/DEinput-TF2VYTIJ.js +0 -499
  337. package/dist/DM-42YN3OEO.js +0 -90
  338. package/dist/DifferentialAnalysis-H5NBPR3P.js +0 -237
  339. package/dist/DifferentialAnalysis-H5NBPR3P.js.map +0 -7
  340. package/dist/Disco-FGFHIKUR.js +0 -3389
  341. package/dist/Disco.UI-YGIU2JPM.js +0 -243
  342. package/dist/DmrPlot-EQFXMAW5.js +0 -637
  343. package/dist/GB-244UT5VU.js +0 -1391
  344. package/dist/GSEA-KXQBR3HH.js +0 -851
  345. package/dist/GeneExpInput-ZY6SHXTX.js +0 -42
  346. package/dist/Geomap-6ZV4AM23.js +0 -84
  347. package/dist/HicApp-4UHX2YGP.js +0 -2245
  348. package/dist/IDCViewer-AB6LLO64.js +0 -10812
  349. package/dist/NumBinaryEditor-CGSO2T4L.js +0 -279
  350. package/dist/NumBinaryEditor.unit.spec-3QHARZQJ.js +0 -312
  351. package/dist/NumContEditor-YLKSC4Y2.js +0 -105
  352. package/dist/NumContEditor.unit.spec-L3GC3ZTJ.js +0 -164
  353. package/dist/NumCustomBinEditor-K3XSFHCC.js +0 -33
  354. package/dist/NumCustomBinEditor.unit.spec-2FUHE6BX.js +0 -397
  355. package/dist/NumDiscreteEditor-RJCSIW4R.js +0 -170
  356. package/dist/NumDiscreteEditor.unit.spec-CUA6BOIS.js +0 -233
  357. package/dist/NumRegularBinEditor-C3VIFDS4.js +0 -33
  358. package/dist/NumRegularBinEditor.unit.spec-V2UJ5FLH.js +0 -278
  359. package/dist/NumSplineEditor-XBE7OV7P.js +0 -210
  360. package/dist/NumSplineEditor.unit.spec-CKRRI4US.js +0 -224
  361. package/dist/NumericDensity-ZL7UY7TL.js +0 -33
  362. package/dist/NumericDensity.unit.spec-CWTMSR56.js +0 -418
  363. package/dist/NumericHandler-56ENFMNK.js +0 -34
  364. package/dist/NumericHandler.unit.spec-3YW34TTJ.js +0 -214
  365. package/dist/ProteomeInput-HIS4GYWH.js +0 -388
  366. package/dist/Regression-C5GZYLEN.js +0 -1416
  367. package/dist/RunChart2-X5WKYLPQ.js +0 -749
  368. package/dist/SC-3Y5J65DT.js +0 -1107
  369. package/dist/SC-3Y5J65DT.js.map +0 -7
  370. package/dist/Violin-F3QS2EMJ.js +0 -1082
  371. package/dist/Violin-F3QS2EMJ.js.map +0 -7
  372. package/dist/Volcano-ZNYDKP2O.js +0 -1649
  373. package/dist/Wsi-B6EIGTI2.js +0 -609
  374. package/dist/Wsi-B6EIGTI2.js.map +0 -7
  375. package/dist/adSandbox-A52OQSOW.js +0 -33
  376. package/dist/animatedBubbleChart-OQOZ3WFK.js +0 -547
  377. package/dist/app-4KIKXQX4.js +0 -32
  378. package/dist/app-NZUNKWKK.js +0 -42
  379. package/dist/bam-SME7YD3E.js +0 -876
  380. package/dist/barchart-ESY6FOS4.js +0 -42
  381. package/dist/barchart2-XEJZGCES.js +0 -309
  382. package/dist/block-747IK2EW.js +0 -6249
  383. package/dist/block.init-ITZ42K43.js +0 -33
  384. package/dist/block.mds.expressionrank-Q63IJAJK.js +0 -354
  385. package/dist/block.mds.geneboxplot-EZIKAIKC.js +0 -823
  386. package/dist/block.mds.junction-TJXFKZ2Q.js +0 -1539
  387. package/dist/block.mds.svcnv-WSIEAII6.js +0 -6796
  388. package/dist/block.svg-CQX5W6R4.js +0 -159
  389. package/dist/block.tk.aicheck-J4MQ4BSD.js +0 -278
  390. package/dist/block.tk.ase-2JFNPWCZ.js +0 -360
  391. package/dist/block.tk.bam-RBQ4AXSQ.js +0 -1901
  392. package/dist/block.tk.bedgraphdot-ZQBOMVTO.js +0 -379
  393. package/dist/block.tk.bigwig.ui-U5IBO3VF.js +0 -206
  394. package/dist/block.tk.hicstraw-ZRZMFLLX.js +0 -818
  395. package/dist/block.tk.junction-7U7ABE4O.js +0 -2358
  396. package/dist/block.tk.junction.textmatrixui-AEXZ7W3U.js +0 -194
  397. package/dist/block.tk.ld-E7WPFL5P.js +0 -94
  398. package/dist/block.tk.menu-AITMEZTZ.js +0 -1024
  399. package/dist/block.tk.pgv-EDPZHI5L.js +0 -938
  400. package/dist/brainImaging-35LPNBDR.js +0 -555
  401. package/dist/brainRegions-JMTQT4X3.js +0 -217
  402. package/dist/bubbleHeatmap-FMBKMDUL.js +0 -378
  403. package/dist/cellTypeBubbleHeatmap-ZPTAGEWW.js +0 -278
  404. package/dist/chunk-2GBG3KA7.js +0 -129
  405. package/dist/chunk-2IVN5DWA.js +0 -302
  406. package/dist/chunk-36AAUYZE.js +0 -194
  407. package/dist/chunk-3K7AYA3M.js +0 -54
  408. package/dist/chunk-4JFFFGL3.js +0 -468
  409. package/dist/chunk-4KJSNR5E.js +0 -562
  410. package/dist/chunk-52QHIKH2.js +0 -2139
  411. package/dist/chunk-52QHIKH2.js.map +0 -7
  412. package/dist/chunk-5ALGKNTQ.js +0 -6360
  413. package/dist/chunk-5JCTTSV4.js +0 -480
  414. package/dist/chunk-5W7K7STT.js +0 -26
  415. package/dist/chunk-6CIGRV5K.js +0 -677
  416. package/dist/chunk-6CIGRV5K.js.map +0 -7
  417. package/dist/chunk-6U2OPC6J.js +0 -176
  418. package/dist/chunk-7AHTS4BP.js +0 -382
  419. package/dist/chunk-7HFAEB3C.js +0 -55
  420. package/dist/chunk-7HGZRJZZ.js +0 -98
  421. package/dist/chunk-A2ORIMUJ.js +0 -339
  422. package/dist/chunk-A32SGNCT.js +0 -1233
  423. package/dist/chunk-AKA6RWLC.js +0 -217
  424. package/dist/chunk-AMVZ6KT5.js +0 -240
  425. package/dist/chunk-ASXUC6SM.js +0 -54
  426. package/dist/chunk-BCO5T43J.js +0 -379
  427. package/dist/chunk-BDQPMVKD.js +0 -783
  428. package/dist/chunk-BOQZOLRA.js +0 -274
  429. package/dist/chunk-BSCMVKBP.js +0 -5071
  430. package/dist/chunk-BZN2O76M.js +0 -119
  431. package/dist/chunk-BZZZQFTI.js +0 -34
  432. package/dist/chunk-CRHGXVUQ.js +0 -272
  433. package/dist/chunk-D6AB63O3.js +0 -216
  434. package/dist/chunk-D6AB63O3.js.map +0 -7
  435. package/dist/chunk-DPQP2GUW.js +0 -626
  436. package/dist/chunk-EKQ7NYOU.js +0 -276
  437. package/dist/chunk-EUQEQOFE.js +0 -141
  438. package/dist/chunk-FKA55PHV.js +0 -281
  439. package/dist/chunk-GVLWCGXX.js +0 -397
  440. package/dist/chunk-HLVWCJRO.js +0 -518
  441. package/dist/chunk-HPAW7XDM.js +0 -178
  442. package/dist/chunk-HPAW7XDM.js.map +0 -7
  443. package/dist/chunk-IV57XNTG.js +0 -123
  444. package/dist/chunk-JMAFJKGG.js +0 -243
  445. package/dist/chunk-JZHRVYNS.js +0 -2676
  446. package/dist/chunk-K6YUMBDY.js +0 -55
  447. package/dist/chunk-L6WNBKYN.js +0 -158
  448. package/dist/chunk-LGR6CJTW.js +0 -2853
  449. package/dist/chunk-LOWJQFCC.js +0 -550
  450. package/dist/chunk-M5SYLBBC.js +0 -2327
  451. package/dist/chunk-MKAILEWO.js +0 -59
  452. package/dist/chunk-N4PDPZWQ.js +0 -4366
  453. package/dist/chunk-N4PDPZWQ.js.map +0 -7
  454. package/dist/chunk-OIJ6GRVS.js +0 -134
  455. package/dist/chunk-ONVIVITY.js +0 -203
  456. package/dist/chunk-OQX3HO46.js +0 -56
  457. package/dist/chunk-OQX3HO46.js.map +0 -7
  458. package/dist/chunk-OYLGAFFY.js +0 -31
  459. package/dist/chunk-P7DIIYCX.js +0 -197
  460. package/dist/chunk-PC4MFDHP.js +0 -24613
  461. package/dist/chunk-PC4MFDHP.js.map +0 -7
  462. package/dist/chunk-PGKOJYV6.js +0 -50
  463. package/dist/chunk-PGKOJYV6.js.map +0 -7
  464. package/dist/chunk-PPSWNLMG.js +0 -402
  465. package/dist/chunk-PPSWNLMG.js.map +0 -7
  466. package/dist/chunk-R624P2GE.js +0 -263
  467. package/dist/chunk-RBSAEAQV.js +0 -446
  468. package/dist/chunk-RUBZCKIX.js +0 -1608
  469. package/dist/chunk-RUBZCKIX.js.map +0 -7
  470. package/dist/chunk-RZ3KEFZ2.js +0 -339
  471. package/dist/chunk-SS66BHGA.js +0 -103
  472. package/dist/chunk-SU63FEY6.js +0 -294
  473. package/dist/chunk-SVC65ZPG.js +0 -102
  474. package/dist/chunk-TG3QBMDK.js +0 -102
  475. package/dist/chunk-TMXW5HVE.js +0 -1278
  476. package/dist/chunk-TPDBOH3A.js +0 -1339
  477. package/dist/chunk-U5RWKZVS.js +0 -1720
  478. package/dist/chunk-U5RWKZVS.js.map +0 -7
  479. package/dist/chunk-UYKZ5HXA.js +0 -1986
  480. package/dist/chunk-VOYUJJQ6.js +0 -70
  481. package/dist/chunk-W4RYRU5D.js +0 -38
  482. package/dist/chunk-WFSMIVJT.js +0 -2784
  483. package/dist/chunk-Y4PX2ECH.js +0 -299
  484. package/dist/chunk-YKM46UX5.js +0 -170
  485. package/dist/chunk-Z7AO6A7M.js +0 -14
  486. package/dist/chunk-ZENZ5H2Q.js +0 -49
  487. package/dist/cohort-Q7TW5XTY.js +0 -70
  488. package/dist/condition-H6LBUHIF.js +0 -327
  489. package/dist/controls-DWDKFDXY.js +0 -34
  490. package/dist/controls.config-KF7PHZSG.js +0 -34
  491. package/dist/correlation-YMSARIER.js +0 -95
  492. package/dist/customdata.inputui-KEFE7ZHS.js +0 -284
  493. package/dist/dataDownload-G7TGPFGL.js +0 -329
  494. package/dist/databrowser.ui-NFIIFQJZ.js +0 -425
  495. package/dist/dictionary-ERJQMALC.js +0 -113
  496. package/dist/dnaMethylation-KVCXKAU3.js +0 -33
  497. package/dist/dnaMethylation.integration.spec-3NXGGG4J.js +0 -198
  498. package/dist/dofetch-YRWLEQEH.js +0 -48
  499. package/dist/e2pca-M2F2CI6I.js +0 -344
  500. package/dist/ep-QAEG4RV4.js +0 -1249
  501. package/dist/expclust.gdc.spec-P77T6JR2.js +0 -302
  502. package/dist/facet-LJTSTASE.js +0 -519
  503. package/dist/gb-KSB2DQHH.js +0 -81
  504. package/dist/geneExpClustering-KHDCPE65.js +0 -244
  505. package/dist/geneExpression-AWWMOUAR.js +0 -310
  506. package/dist/geneExpression-Z2EDR6EN.js +0 -33
  507. package/dist/geneExpression.unit.spec-WB2ESPKT.js +0 -128
  508. package/dist/geneORA-NGZTMFSJ.js +0 -273
  509. package/dist/geneRanking-AYNBGFKU.js +0 -548
  510. package/dist/geneVariant-AL64NDHH.js +0 -36
  511. package/dist/geneVariant-QMKR3LUV.js +0 -286
  512. package/dist/geneVariant.integration.spec-N3U5CIRT.js +0 -489
  513. package/dist/genefusion.ui-IWJMF2BM.js +0 -303
  514. package/dist/geneset-APCO4BRX.js +0 -203
  515. package/dist/genomeBrowser.spec-JTCVUTO5.js +0 -276
  516. package/dist/grin2-FVX6AIST.js +0 -70
  517. package/dist/grin2-LF46UKFY.js +0 -1137
  518. package/dist/hierCluster-4DRHXD6W.js +0 -55
  519. package/dist/hierCluster-SFRQK3PS.js +0 -59
  520. package/dist/hierCluster.config-G2TFGBYF.js +0 -36
  521. package/dist/hierCluster.integration.spec-ZUZKCG6A.js +0 -483
  522. package/dist/hierCluster.interactivity-LQA6J56H.js +0 -49
  523. package/dist/hierCluster.renderers-TZZJEVFO.js +0 -19
  524. package/dist/imagePlot-OUHFWYKT.js +0 -156
  525. package/dist/importPlot-7V456QK7.js +0 -8
  526. package/dist/isoformExpression-NGUJJ6VI.js +0 -35
  527. package/dist/isoformExpression.unit.spec-DCRPXPBY.js +0 -237
  528. package/dist/junction-QYKLNXIW.js +0 -36
  529. package/dist/junction.customTerm-EHOOBR4V.js +0 -16
  530. package/dist/junction.unit.spec-LDNY7OFK.js +0 -182
  531. package/dist/launch.adhoc-FF7B3UG6.js +0 -37
  532. package/dist/leftlabel.sample-BTHMKLGF.js +0 -258
  533. package/dist/lollipop-H3UCNMHN.js +0 -166
  534. package/dist/maf-KWGUTPKO.js +0 -455
  535. package/dist/maftimeline-UD5VE4UW.js +0 -587
  536. package/dist/matrix-DLCX6GOO.js +0 -59
  537. package/dist/matrix-TIV42IQB.js +0 -54
  538. package/dist/matrix.cells-J3QZ7C6U.js +0 -26
  539. package/dist/matrix.config-VNMS6B7J.js +0 -37
  540. package/dist/matrix.data-PIE3TLKD.js +0 -23
  541. package/dist/matrix.groups-URBU775S.js +0 -26
  542. package/dist/matrix.integration.spec-LC6YMEKP.js +0 -3160
  543. package/dist/matrix.interactivity-W5AFOAQN.js +0 -37
  544. package/dist/matrix.layout-LU3NIJAL.js +0 -39
  545. package/dist/matrix.legend-LTP6ETZO.js +0 -20
  546. package/dist/matrix.renderers-762XI65L.js +0 -34
  547. package/dist/matrix.serieses-FHDBRPZA.js +0 -19
  548. package/dist/matrix.sort-Q6A6UWMY.js +0 -26
  549. package/dist/matrix.sort.unit.spec-CTCOPKVS.js +0 -468
  550. package/dist/matrix.sorterUi-4M5AU5EL.js +0 -16
  551. package/dist/matrix.sorterUi.unit.spec-Y7GC3PM5.js +0 -338
  552. package/dist/matrix.unit.spec-DROPHFTM.js +0 -150
  553. package/dist/mavb-BWA73N3U.js +0 -727
  554. package/dist/mds.fimo-3UJWIH2J.js +0 -513
  555. package/dist/mds.samplescatterplot-EUS7DCSQ.js +0 -1545
  556. package/dist/mds.survivalplot-77UEBQIC.js +0 -477
  557. package/dist/multivalue-KZ2DMVIR.js +0 -83
  558. package/dist/numericDictTermCluster-C2MYJYPZ.js +0 -63
  559. package/dist/oncomatrix-6LGB3M7R.js +0 -290
  560. package/dist/oncomatrix.spec-UWMSLOHW.js +0 -443
  561. package/dist/plot.2dvaf-LZAVWH65.js +0 -372
  562. package/dist/plot.app-OEWE3AYV.js +0 -36
  563. package/dist/plot.barplot-VIBHGTUT.js +0 -97
  564. package/dist/plot.boxplot-NQI3PSKR.js +0 -146
  565. package/dist/plot.brainImaging-3MTTCZHI.js +0 -51
  566. package/dist/plot.disco-HODBY7SO.js +0 -99
  567. package/dist/plot.ssgq-4URQE673.js +0 -134
  568. package/dist/plot.vaf2cov-QIJNEKCK.js +0 -253
  569. package/dist/polar2-GVFQNSLK.js +0 -232
  570. package/dist/profileForms-Z22CJXI4.js +0 -941
  571. package/dist/profilePlot-IVQZBSID.js +0 -49
  572. package/dist/proteinView-AUK634AU.js +0 -1357
  573. package/dist/proteomeCohortCompare-7G2F35H5.js +0 -912
  574. package/dist/pseudbulk.unit.spec-JDKUQUCM.js +0 -106
  575. package/dist/pseudbulk.unit.spec-JDKUQUCM.js.map +0 -7
  576. package/dist/pseudobulk-QTCUSH5I.js +0 -37
  577. package/dist/qualitative-7ST7SSBT.js +0 -38
  578. package/dist/radar2-CEE6SNBS.js +0 -327
  579. package/dist/radarFacility2-OSKDYIK7.js +0 -335
  580. package/dist/rememberedGvQ.unit.spec-RYFUJ2NW.js +0 -211
  581. package/dist/render-MAD3WMVD.js +0 -33
  582. package/dist/report-6JXJVSEB.js +0 -217
  583. package/dist/sampleView-SG3QYZKQ.js +0 -43
  584. package/dist/samplelst-R765UFP6.js +0 -106
  585. package/dist/samplematrix-EBJYE5SM.js +0 -2193
  586. package/dist/sc-7ZXPFDHD.js +0 -81
  587. package/dist/scatter-3GUL4KF3.js +0 -88
  588. package/dist/scatter-RHUVER53.js +0 -920
  589. package/dist/scatter-RHUVER53.js.map +0 -7
  590. package/dist/selectGenomeWithTklst-K4YXGJYG.js +0 -129
  591. package/dist/singleCellCellType-TU5VTPLP.js +0 -33
  592. package/dist/singleCellCellType.unit.spec-IRITQIGT.js +0 -154
  593. package/dist/singleCellGeneExpression-3IL52QDK.js +0 -33
  594. package/dist/singleCellGeneExpression.unit.spec-WXC4C37T.js +0 -148
  595. package/dist/singleCellPlot-XG3HZS7I.js +0 -48
  596. package/dist/singlecell-BRF2HAV2.js +0 -81
  597. package/dist/singlecell-KVCJF2HI.js +0 -1566
  598. package/dist/snp-RMZRB426.js +0 -33
  599. package/dist/snp.unit.spec-JF6KR2NT.js +0 -171
  600. package/dist/snplocus-AHUFHQ3Q.js +0 -203
  601. package/dist/spliceevent.a53ss.diagram-OSZZ2CF2.js +0 -146
  602. package/dist/spliceevent.exonskip.diagram-AMA2D2OL.js +0 -278
  603. package/dist/spliceevent.noeventdiagram-RKTUXH5D.js +0 -455
  604. package/dist/ssGSEA-7RKWYZKX.js +0 -33
  605. package/dist/ssGSEA.unit.spec-XLCZHH7S.js +0 -83
  606. package/dist/stattable-NDYUCLVZ.js +0 -117
  607. package/dist/studyCatalog-TAXRF5NS.js +0 -414
  608. package/dist/summarizeCnvGeneexp-3QLHU6N7.js +0 -158
  609. package/dist/summarizeGeneexpSurvival-ARI4MPFX.js +0 -105
  610. package/dist/summarizeMutationCnv-W7V7CKPI.js +0 -159
  611. package/dist/summarizeMutationDiagnosis-GCL4SRON.js +0 -35
  612. package/dist/summarizeMutationSurvival-6TTMSRRX.js +0 -99
  613. package/dist/summary-OUYDWLBF.js +0 -44
  614. package/dist/summary.integration.spec-4GTCG6HY.js +0 -409
  615. package/dist/summaryInput-UK3TLC7M.js +0 -242
  616. package/dist/sunburst-2UFHMNH3.js +0 -278
  617. package/dist/survival-SPWYSDVB.js +0 -53
  618. package/dist/survival-TL6UZ6FQ.js +0 -1248
  619. package/dist/survival.integration.spec-WWZELTKZ.js +0 -613
  620. package/dist/survival.integration.spec-WWZELTKZ.js.map +0 -7
  621. package/dist/svgraph-Z543MLIN.js +0 -1382
  622. package/dist/svmr-SZCAOAIF.js +0 -3837
  623. package/dist/table-IAQ6J4DO.js +0 -197
  624. package/dist/termCollection-3NGHR7QN.js +0 -252
  625. package/dist/termCollection-7P3WU6X6.js +0 -33
  626. package/dist/termCollection.unit.spec-EPYC7LOA.js +0 -299
  627. package/dist/termCollectionFractionSelection-YKIE6BME.js +0 -42
  628. package/dist/termCollectionFractionSelection.unit.spec-AG2CZPGZ.js +0 -188
  629. package/dist/tk-TOXMU4GT.js +0 -1121
  630. package/dist/tk-X454XH5N.js +0 -41
  631. package/dist/tp.ui-FDQ76KPL.js +0 -1454
  632. package/dist/tvs.dt-U77PCG6X.js +0 -34
  633. package/dist/tvs.dtcnv.categorical-XYZU4XLO.js +0 -35
  634. package/dist/tvs.dtcnv.continuous-4GJILFGP.js +0 -67
  635. package/dist/tvs.dtfusion-7YROAHVI.js +0 -35
  636. package/dist/tvs.dtitd-MIYU4ZHH.js +0 -35
  637. package/dist/tvs.dtsnvindel-XLDY7KWB.js +0 -35
  638. package/dist/tvs.dtsv-YMLJ37YR.js +0 -35
  639. package/dist/tvs.samplelst-KIVEXJKD.js +0 -98
  640. package/dist/tvs.termCollection-4CQV3EB3.js +0 -124
  641. package/dist/vocabulary-64GO4YDB.js +0 -36
  642. package/dist/wsi.direct-5MQVRJZX.js +0 -8343
  643. /package/dist/{2dmaf-32F56QBJ.js.map → 2dmaf-PN5YS362.js.map} +0 -0
  644. /package/dist/{AggregateMatrix-TPXNNWVD.js.map → AggregateMatrix-IBWOJWOC.js.map} +0 -0
  645. /package/dist/{AppHeader-SEJXDJE3.js.map → AppHeader-XV6S7GG5.js.map} +0 -0
  646. /package/dist/{BoxPlot-LOAO2MDO.js.map → BoxPlot-ZIVA55SK.js.map} +0 -0
  647. /package/dist/{Cuminc-O533BXFY.js.map → Cuminc-WKY35UGV.js.map} +0 -0
  648. /package/dist/{DE-FDAUNOWU.js.map → DE-E256DHID.js.map} +0 -0
  649. /package/dist/{DEinput-TF2VYTIJ.js.map → DEinput-YU3W72K7.js.map} +0 -0
  650. /package/dist/{DM-42YN3OEO.js.map → DM-W7PXTIKY.js.map} +0 -0
  651. /package/dist/{Disco-FGFHIKUR.js.map → Disco-OZY5GW2Z.js.map} +0 -0
  652. /package/dist/{Disco.UI-YGIU2JPM.js.map → Disco.UI-NRALEYXK.js.map} +0 -0
  653. /package/dist/{DmrPlot-EQFXMAW5.js.map → DmrPlot-QKUX5XUW.js.map} +0 -0
  654. /package/dist/{GB-244UT5VU.js.map → GB-ZYH7PGHT.js.map} +0 -0
  655. /package/dist/{GSEA-KXQBR3HH.js.map → GSEA-VQTD4MLY.js.map} +0 -0
  656. /package/dist/{GeneExpInput-ZY6SHXTX.js.map → GeneExpInput-XEFUTLFU.js.map} +0 -0
  657. /package/dist/{Geomap-6ZV4AM23.js.map → Geomap-GEK7UEDU.js.map} +0 -0
  658. /package/dist/{HicApp-4UHX2YGP.js.map → HicApp-ZY7UHV5H.js.map} +0 -0
  659. /package/dist/{IDCViewer-AB6LLO64.js.map → IDCViewer-YNKG4V46.js.map} +0 -0
  660. /package/dist/{NumBinaryEditor-CGSO2T4L.js.map → NumBinaryEditor-NEL727DX.js.map} +0 -0
  661. /package/dist/{NumBinaryEditor.unit.spec-3QHARZQJ.js.map → NumBinaryEditor.unit.spec-GCGZMJYF.js.map} +0 -0
  662. /package/dist/{NumContEditor-YLKSC4Y2.js.map → NumContEditor-IM6RRDGU.js.map} +0 -0
  663. /package/dist/{NumContEditor.unit.spec-L3GC3ZTJ.js.map → NumContEditor.unit.spec-B5AJXANS.js.map} +0 -0
  664. /package/dist/{NumCustomBinEditor-K3XSFHCC.js.map → NumCustomBinEditor-EZT5DRKP.js.map} +0 -0
  665. /package/dist/{NumCustomBinEditor.unit.spec-2FUHE6BX.js.map → NumCustomBinEditor.unit.spec-KLUDS6TH.js.map} +0 -0
  666. /package/dist/{NumDiscreteEditor-RJCSIW4R.js.map → NumDiscreteEditor-2M6Q5AAZ.js.map} +0 -0
  667. /package/dist/{NumDiscreteEditor.unit.spec-CUA6BOIS.js.map → NumDiscreteEditor.unit.spec-2JYZYJUX.js.map} +0 -0
  668. /package/dist/{NumRegularBinEditor-C3VIFDS4.js.map → NumRegularBinEditor-AQDHA2PU.js.map} +0 -0
  669. /package/dist/{NumRegularBinEditor.unit.spec-V2UJ5FLH.js.map → NumRegularBinEditor.unit.spec-62BYFNYG.js.map} +0 -0
  670. /package/dist/{NumSplineEditor-XBE7OV7P.js.map → NumSplineEditor-6Y5TZSTO.js.map} +0 -0
  671. /package/dist/{NumSplineEditor.unit.spec-CKRRI4US.js.map → NumSplineEditor.unit.spec-S65AV5EK.js.map} +0 -0
  672. /package/dist/{NumericDensity-ZL7UY7TL.js.map → NumericDensity-5ES4SDWZ.js.map} +0 -0
  673. /package/dist/{NumericDensity.unit.spec-CWTMSR56.js.map → NumericDensity.unit.spec-J6KZSE2P.js.map} +0 -0
  674. /package/dist/{NumericHandler-56ENFMNK.js.map → NumericHandler-ZTLDPP2F.js.map} +0 -0
  675. /package/dist/{NumericHandler.unit.spec-3YW34TTJ.js.map → NumericHandler.unit.spec-BZFBVHGU.js.map} +0 -0
  676. /package/dist/{ProteomeInput-HIS4GYWH.js.map → ProteomeInput-IKEXPCGV.js.map} +0 -0
  677. /package/dist/{Regression-C5GZYLEN.js.map → Regression-6F6YP3AX.js.map} +0 -0
  678. /package/dist/{RunChart2-X5WKYLPQ.js.map → RunChart2-CVRPXQH5.js.map} +0 -0
  679. /package/dist/{Volcano-ZNYDKP2O.js.map → Volcano-FCCWUMX7.js.map} +0 -0
  680. /package/dist/{adSandbox-A52OQSOW.js.map → adSandbox-QYIG6637.js.map} +0 -0
  681. /package/dist/{animatedBubbleChart-OQOZ3WFK.js.map → animatedBubbleChart-X53PR73H.js.map} +0 -0
  682. /package/dist/{app-4KIKXQX4.js.map → app-HJLTRZPI.js.map} +0 -0
  683. /package/dist/{app-NZUNKWKK.js.map → app-MGY6A4DM.js.map} +0 -0
  684. /package/dist/{bam-SME7YD3E.js.map → bam-VRQHRCP5.js.map} +0 -0
  685. /package/dist/{barchart-ESY6FOS4.js.map → barchart-TWMOUZFL.js.map} +0 -0
  686. /package/dist/{barchart2-XEJZGCES.js.map → barchart2-CV7RMMRG.js.map} +0 -0
  687. /package/dist/{block-747IK2EW.js.map → block-L53P4UGQ.js.map} +0 -0
  688. /package/dist/{block.init-ITZ42K43.js.map → block.init-XYOJTXKP.js.map} +0 -0
  689. /package/dist/{block.mds.expressionrank-Q63IJAJK.js.map → block.mds.expressionrank-77FSBDHA.js.map} +0 -0
  690. /package/dist/{block.mds.geneboxplot-EZIKAIKC.js.map → block.mds.geneboxplot-4TSYV4WS.js.map} +0 -0
  691. /package/dist/{block.mds.junction-TJXFKZ2Q.js.map → block.mds.junction-P4MYDET6.js.map} +0 -0
  692. /package/dist/{block.mds.svcnv-WSIEAII6.js.map → block.mds.svcnv-CYOFAS2T.js.map} +0 -0
  693. /package/dist/{block.svg-CQX5W6R4.js.map → block.svg-IT3ELCF4.js.map} +0 -0
  694. /package/dist/{block.tk.aicheck-J4MQ4BSD.js.map → block.tk.aicheck-GULHJLV5.js.map} +0 -0
  695. /package/dist/{block.tk.ase-2JFNPWCZ.js.map → block.tk.ase-RW5YL6HN.js.map} +0 -0
  696. /package/dist/{block.tk.bam-RBQ4AXSQ.js.map → block.tk.bam-MPGQW6KB.js.map} +0 -0
  697. /package/dist/{block.tk.bedgraphdot-ZQBOMVTO.js.map → block.tk.bedgraphdot-EYRY374P.js.map} +0 -0
  698. /package/dist/{block.tk.bigwig.ui-U5IBO3VF.js.map → block.tk.bigwig.ui-BKSXCDNM.js.map} +0 -0
  699. /package/dist/{block.tk.hicstraw-ZRZMFLLX.js.map → block.tk.hicstraw-76PV6NM3.js.map} +0 -0
  700. /package/dist/{block.tk.junction-7U7ABE4O.js.map → block.tk.junction-Z52QHQJQ.js.map} +0 -0
  701. /package/dist/{block.tk.junction.textmatrixui-AEXZ7W3U.js.map → block.tk.junction.textmatrixui-K32OOTZC.js.map} +0 -0
  702. /package/dist/{block.tk.ld-E7WPFL5P.js.map → block.tk.ld-DDGLRHPO.js.map} +0 -0
  703. /package/dist/{block.tk.menu-AITMEZTZ.js.map → block.tk.menu-MO6TESKI.js.map} +0 -0
  704. /package/dist/{block.tk.pgv-EDPZHI5L.js.map → block.tk.pgv-AKLKKSEP.js.map} +0 -0
  705. /package/dist/{brainImaging-35LPNBDR.js.map → brainImaging-KSTJQJAB.js.map} +0 -0
  706. /package/dist/{brainRegions-JMTQT4X3.js.map → brainRegions-WCRMMSK4.js.map} +0 -0
  707. /package/dist/{bubbleHeatmap-FMBKMDUL.js.map → bubbleHeatmap-4YOQ3BAB.js.map} +0 -0
  708. /package/dist/{cellTypeBubbleHeatmap-ZPTAGEWW.js.map → cellTypeBubbleHeatmap-O6YZ2RW4.js.map} +0 -0
  709. /package/dist/{chunk-Y4PX2ECH.js.map → chunk-3GUVLDUS.js.map} +0 -0
  710. /package/dist/{chunk-RBSAEAQV.js.map → chunk-3PQDD5HM.js.map} +0 -0
  711. /package/dist/{chunk-UYKZ5HXA.js.map → chunk-3WYUHDDP.js.map} +0 -0
  712. /package/dist/{chunk-L6WNBKYN.js.map → chunk-4C7MA5Q3.js.map} +0 -0
  713. /package/dist/{chunk-TG3QBMDK.js.map → chunk-4PB5ZEOB.js.map} +0 -0
  714. /package/dist/{chunk-BZN2O76M.js.map → chunk-5IMFPVGT.js.map} +0 -0
  715. /package/dist/{chunk-HLVWCJRO.js.map → chunk-6DPELKO5.js.map} +0 -0
  716. /package/dist/{chunk-GVLWCGXX.js.map → chunk-74C6G6JD.js.map} +0 -0
  717. /package/dist/{chunk-EKQ7NYOU.js.map → chunk-A7TXS6JR.js.map} +0 -0
  718. /package/dist/{chunk-IV57XNTG.js.map → chunk-AAJXHERO.js.map} +0 -0
  719. /package/dist/{chunk-6U2OPC6J.js.map → chunk-BFXZBZEV.js.map} +0 -0
  720. /package/dist/{chunk-5JCTTSV4.js.map → chunk-BGVGN73F.js.map} +0 -0
  721. /package/dist/{chunk-5ALGKNTQ.js.map → chunk-BL7EYUZC.js.map} +0 -0
  722. /package/dist/{chunk-BOQZOLRA.js.map → chunk-BPGZUNLL.js.map} +0 -0
  723. /package/dist/{chunk-EUQEQOFE.js.map → chunk-CPIPN5F6.js.map} +0 -0
  724. /package/dist/{chunk-AKA6RWLC.js.map → chunk-D5MSWPAZ.js.map} +0 -0
  725. /package/dist/{chunk-JMAFJKGG.js.map → chunk-DFT2PAIU.js.map} +0 -0
  726. /package/dist/{chunk-R624P2GE.js.map → chunk-E7NVJ44Z.js.map} +0 -0
  727. /package/dist/{chunk-3K7AYA3M.js.map → chunk-EMMGUSJB.js.map} +0 -0
  728. /package/dist/{chunk-AMVZ6KT5.js.map → chunk-G3CCQOLH.js.map} +0 -0
  729. /package/dist/{chunk-BCO5T43J.js.map → chunk-GGQVDHYF.js.map} +0 -0
  730. /package/dist/{chunk-JZHRVYNS.js.map → chunk-GPZYAJQH.js.map} +0 -0
  731. /package/dist/{chunk-CRHGXVUQ.js.map → chunk-GS6ZMPKP.js.map} +0 -0
  732. /package/dist/{chunk-SVC65ZPG.js.map → chunk-GUXKLMLM.js.map} +0 -0
  733. /package/dist/{chunk-LGR6CJTW.js.map → chunk-HELEV3LT.js.map} +0 -0
  734. /package/dist/{chunk-A2ORIMUJ.js.map → chunk-HKKTNIMX.js.map} +0 -0
  735. /package/dist/{chunk-5W7K7STT.js.map → chunk-HKSRIEWJ.js.map} +0 -0
  736. /package/dist/{chunk-VOYUJJQ6.js.map → chunk-IELQ3HMN.js.map} +0 -0
  737. /package/dist/{chunk-SS66BHGA.js.map → chunk-IISNWG4X.js.map} +0 -0
  738. /package/dist/{chunk-BZZZQFTI.js.map → chunk-J7KB2MH3.js.map} +0 -0
  739. /package/dist/{chunk-M5SYLBBC.js.map → chunk-JEJV7V7M.js.map} +0 -0
  740. /package/dist/{chunk-DPQP2GUW.js.map → chunk-JIZ3B32T.js.map} +0 -0
  741. /package/dist/{chunk-W4RYRU5D.js.map → chunk-KAY2ODXX.js.map} +0 -0
  742. /package/dist/{chunk-BSCMVKBP.js.map → chunk-KJM6PLXM.js.map} +0 -0
  743. /package/dist/{chunk-TMXW5HVE.js.map → chunk-KZHF3MQX.js.map} +0 -0
  744. /package/dist/{chunk-36AAUYZE.js.map → chunk-MC674TS2.js.map} +0 -0
  745. /package/dist/{chunk-TPDBOH3A.js.map → chunk-MLKQZ3RL.js.map} +0 -0
  746. /package/dist/{chunk-LOWJQFCC.js.map → chunk-MSSPT5YM.js.map} +0 -0
  747. /package/dist/{chunk-ASXUC6SM.js.map → chunk-OBBR4UYN.js.map} +0 -0
  748. /package/dist/{chunk-SU63FEY6.js.map → chunk-PQA3C2NY.js.map} +0 -0
  749. /package/dist/{chunk-OIJ6GRVS.js.map → chunk-QJ2VBXFB.js.map} +0 -0
  750. /package/dist/{chunk-7HFAEB3C.js.map → chunk-QP7EJXSU.js.map} +0 -0
  751. /package/dist/{chunk-WFSMIVJT.js.map → chunk-SHXJW27D.js.map} +0 -0
  752. /package/dist/{chunk-2IVN5DWA.js.map → chunk-SUNDNTVY.js.map} +0 -0
  753. /package/dist/{chunk-7HGZRJZZ.js.map → chunk-TSI4W6XO.js.map} +0 -0
  754. /package/dist/{chunk-4JFFFGL3.js.map → chunk-TXIQ5PHR.js.map} +0 -0
  755. /package/dist/{chunk-4KJSNR5E.js.map → chunk-U45R6QNT.js.map} +0 -0
  756. /package/dist/{chunk-A32SGNCT.js.map → chunk-UMZJQWWK.js.map} +0 -0
  757. /package/dist/{chunk-K6YUMBDY.js.map → chunk-VO7Q4WMM.js.map} +0 -0
  758. /package/dist/{chunk-YKM46UX5.js.map → chunk-VWGRKOVJ.js.map} +0 -0
  759. /package/dist/{chunk-P7DIIYCX.js.map → chunk-WCTKHF5T.js.map} +0 -0
  760. /package/dist/{chunk-OYLGAFFY.js.map → chunk-WOMERKMR.js.map} +0 -0
  761. /package/dist/{chunk-MKAILEWO.js.map → chunk-WXX2YD4Q.js.map} +0 -0
  762. /package/dist/{chunk-7AHTS4BP.js.map → chunk-X44AR557.js.map} +0 -0
  763. /package/dist/{chunk-BDQPMVKD.js.map → chunk-XEU5HXOY.js.map} +0 -0
  764. /package/dist/{chunk-FKA55PHV.js.map → chunk-XGYQZHNX.js.map} +0 -0
  765. /package/dist/{chunk-ZENZ5H2Q.js.map → chunk-XOND7UIK.js.map} +0 -0
  766. /package/dist/{chunk-RZ3KEFZ2.js.map → chunk-XRMUUWLS.js.map} +0 -0
  767. /package/dist/{chunk-2GBG3KA7.js.map → chunk-XTOGCXPD.js.map} +0 -0
  768. /package/dist/{chunk-Z7AO6A7M.js.map → chunk-Y5BBFDC3.js.map} +0 -0
  769. /package/dist/{chunk-ONVIVITY.js.map → chunk-Z2FSHODI.js.map} +0 -0
  770. /package/dist/{cohort-Q7TW5XTY.js.map → cohort-JWIQOO7U.js.map} +0 -0
  771. /package/dist/{condition-H6LBUHIF.js.map → condition-ZUAQYF5C.js.map} +0 -0
  772. /package/dist/{controls-DWDKFDXY.js.map → controls-ZPQ6SXD2.js.map} +0 -0
  773. /package/dist/{controls.config-KF7PHZSG.js.map → controls.config-NELL5HY5.js.map} +0 -0
  774. /package/dist/{correlation-YMSARIER.js.map → correlation-2X76UI3K.js.map} +0 -0
  775. /package/dist/{customdata.inputui-KEFE7ZHS.js.map → customdata.inputui-V6QIGFRP.js.map} +0 -0
  776. /package/dist/{dataDownload-G7TGPFGL.js.map → dataDownload-NSDY4MSL.js.map} +0 -0
  777. /package/dist/{databrowser.ui-NFIIFQJZ.js.map → databrowser.ui-DDLFQB6K.js.map} +0 -0
  778. /package/dist/{dictionary-ERJQMALC.js.map → dictionary-WSDD6TFI.js.map} +0 -0
  779. /package/dist/{dnaMethylation-KVCXKAU3.js.map → dnaMethylation-3IM4OACZ.js.map} +0 -0
  780. /package/dist/{dnaMethylation.integration.spec-3NXGGG4J.js.map → dnaMethylation.integration.spec-5CSJA67S.js.map} +0 -0
  781. /package/dist/{dofetch-YRWLEQEH.js.map → dofetch-GZ7POIBV.js.map} +0 -0
  782. /package/dist/{e2pca-M2F2CI6I.js.map → e2pca-AX7U2DOI.js.map} +0 -0
  783. /package/dist/{ep-QAEG4RV4.js.map → ep-UKACHFJU.js.map} +0 -0
  784. /package/dist/{expclust.gdc.spec-P77T6JR2.js.map → expclust.gdc.spec-46HDKH2Q.js.map} +0 -0
  785. /package/dist/{facet-LJTSTASE.js.map → facet-3EONZDDE.js.map} +0 -0
  786. /package/dist/{gb-KSB2DQHH.js.map → gb-W7GX5NWS.js.map} +0 -0
  787. /package/dist/{geneExpClustering-KHDCPE65.js.map → geneExpClustering-PJA6Y5GW.js.map} +0 -0
  788. /package/dist/{geneExpression-AWWMOUAR.js.map → geneExpression-EMLVPVNK.js.map} +0 -0
  789. /package/dist/{geneExpression-Z2EDR6EN.js.map → geneExpression-JMGYBT53.js.map} +0 -0
  790. /package/dist/{geneExpression.unit.spec-WB2ESPKT.js.map → geneExpression.unit.spec-DDZVZJVC.js.map} +0 -0
  791. /package/dist/{geneORA-NGZTMFSJ.js.map → geneORA-CIAFQQWB.js.map} +0 -0
  792. /package/dist/{geneRanking-AYNBGFKU.js.map → geneRanking-JRAU6FMJ.js.map} +0 -0
  793. /package/dist/{geneVariant-AL64NDHH.js.map → geneVariant-3DZTWQFG.js.map} +0 -0
  794. /package/dist/{geneVariant-QMKR3LUV.js.map → geneVariant-YWURIZ72.js.map} +0 -0
  795. /package/dist/{geneVariant.integration.spec-N3U5CIRT.js.map → geneVariant.integration.spec-V3KECZMM.js.map} +0 -0
  796. /package/dist/{genefusion.ui-IWJMF2BM.js.map → genefusion.ui-AO3TUDTL.js.map} +0 -0
  797. /package/dist/{geneset-APCO4BRX.js.map → geneset-RCIP2GZH.js.map} +0 -0
  798. /package/dist/{genomeBrowser.spec-JTCVUTO5.js.map → genomeBrowser.spec-7PZCNBL3.js.map} +0 -0
  799. /package/dist/{grin2-FVX6AIST.js.map → grin2-EUBCNH4Q.js.map} +0 -0
  800. /package/dist/{grin2-LF46UKFY.js.map → grin2-YYBB5XJK.js.map} +0 -0
  801. /package/dist/{hierCluster-4DRHXD6W.js.map → hierCluster-AV5NO2GW.js.map} +0 -0
  802. /package/dist/{hierCluster-SFRQK3PS.js.map → hierCluster-W2MVN34V.js.map} +0 -0
  803. /package/dist/{hierCluster.config-G2TFGBYF.js.map → hierCluster.config-4MBWG6RZ.js.map} +0 -0
  804. /package/dist/{hierCluster.integration.spec-ZUZKCG6A.js.map → hierCluster.integration.spec-JUIBIUKH.js.map} +0 -0
  805. /package/dist/{hierCluster.interactivity-LQA6J56H.js.map → hierCluster.interactivity-6PJE64PF.js.map} +0 -0
  806. /package/dist/{hierCluster.renderers-TZZJEVFO.js.map → hierCluster.renderers-RWDQ5SHY.js.map} +0 -0
  807. /package/dist/{imagePlot-OUHFWYKT.js.map → imagePlot-XLDQNUJA.js.map} +0 -0
  808. /package/dist/{importPlot-7V456QK7.js.map → importPlot-7FISAQKR.js.map} +0 -0
  809. /package/dist/{isoformExpression-NGUJJ6VI.js.map → isoformExpression-WOQAOVZS.js.map} +0 -0
  810. /package/dist/{isoformExpression.unit.spec-DCRPXPBY.js.map → isoformExpression.unit.spec-BMEGJNCO.js.map} +0 -0
  811. /package/dist/{junction-QYKLNXIW.js.map → junction-6NO36IPU.js.map} +0 -0
  812. /package/dist/{junction.customTerm-EHOOBR4V.js.map → junction.customTerm-N6JAOWZO.js.map} +0 -0
  813. /package/dist/{junction.unit.spec-LDNY7OFK.js.map → junction.unit.spec-UKGSQHO4.js.map} +0 -0
  814. /package/dist/{launch.adhoc-FF7B3UG6.js.map → launch.adhoc-42PUNEA6.js.map} +0 -0
  815. /package/dist/{leftlabel.sample-BTHMKLGF.js.map → leftlabel.sample-EXAUDPSB.js.map} +0 -0
  816. /package/dist/{lollipop-H3UCNMHN.js.map → lollipop-4ASTA5HO.js.map} +0 -0
  817. /package/dist/{maf-KWGUTPKO.js.map → maf-HPXANL3M.js.map} +0 -0
  818. /package/dist/{maftimeline-UD5VE4UW.js.map → maftimeline-2SXFX3HF.js.map} +0 -0
  819. /package/dist/{matrix-DLCX6GOO.js.map → matrix-DX4W5XMX.js.map} +0 -0
  820. /package/dist/{matrix-TIV42IQB.js.map → matrix-S34ITAPJ.js.map} +0 -0
  821. /package/dist/{matrix.cells-J3QZ7C6U.js.map → matrix.cells-BLULUGSZ.js.map} +0 -0
  822. /package/dist/{matrix.config-VNMS6B7J.js.map → matrix.config-Z3LWYH74.js.map} +0 -0
  823. /package/dist/{matrix.data-PIE3TLKD.js.map → matrix.data-73HY7Y2V.js.map} +0 -0
  824. /package/dist/{matrix.groups-URBU775S.js.map → matrix.groups-NOUMYNFY.js.map} +0 -0
  825. /package/dist/{matrix.integration.spec-LC6YMEKP.js.map → matrix.integration.spec-VTXYJ46U.js.map} +0 -0
  826. /package/dist/{matrix.interactivity-W5AFOAQN.js.map → matrix.interactivity-YHDIO5A2.js.map} +0 -0
  827. /package/dist/{matrix.layout-LU3NIJAL.js.map → matrix.layout-25HYKUF2.js.map} +0 -0
  828. /package/dist/{matrix.legend-LTP6ETZO.js.map → matrix.legend-IMK7DH4V.js.map} +0 -0
  829. /package/dist/{matrix.renderers-762XI65L.js.map → matrix.renderers-3RZRN6HO.js.map} +0 -0
  830. /package/dist/{matrix.serieses-FHDBRPZA.js.map → matrix.serieses-ZTVHQ7QA.js.map} +0 -0
  831. /package/dist/{matrix.sort-Q6A6UWMY.js.map → matrix.sort-EDXHT6NZ.js.map} +0 -0
  832. /package/dist/{matrix.sort.unit.spec-CTCOPKVS.js.map → matrix.sort.unit.spec-LSNY7PHU.js.map} +0 -0
  833. /package/dist/{matrix.sorterUi-4M5AU5EL.js.map → matrix.sorterUi-3DRNHG5Z.js.map} +0 -0
  834. /package/dist/{matrix.sorterUi.unit.spec-Y7GC3PM5.js.map → matrix.sorterUi.unit.spec-GNIIWGRJ.js.map} +0 -0
  835. /package/dist/{matrix.unit.spec-DROPHFTM.js.map → matrix.unit.spec-7A6ZFRXI.js.map} +0 -0
  836. /package/dist/{mavb-BWA73N3U.js.map → mavb-M5AXPLYX.js.map} +0 -0
  837. /package/dist/{mds.fimo-3UJWIH2J.js.map → mds.fimo-QE5OFA22.js.map} +0 -0
  838. /package/dist/{mds.samplescatterplot-EUS7DCSQ.js.map → mds.samplescatterplot-664EOHX2.js.map} +0 -0
  839. /package/dist/{mds.survivalplot-77UEBQIC.js.map → mds.survivalplot-H4TJD44D.js.map} +0 -0
  840. /package/dist/{multivalue-KZ2DMVIR.js.map → multivalue-JD3CNQJR.js.map} +0 -0
  841. /package/dist/{numericDictTermCluster-C2MYJYPZ.js.map → numericDictTermCluster-XPKEYXD7.js.map} +0 -0
  842. /package/dist/{oncomatrix-6LGB3M7R.js.map → oncomatrix-TX5PZQ76.js.map} +0 -0
  843. /package/dist/{oncomatrix.spec-UWMSLOHW.js.map → oncomatrix.spec-6X2WAHL7.js.map} +0 -0
  844. /package/dist/{plot.2dvaf-LZAVWH65.js.map → plot.2dvaf-5OHUFTMK.js.map} +0 -0
  845. /package/dist/{plot.app-OEWE3AYV.js.map → plot.app-XIVVJHWG.js.map} +0 -0
  846. /package/dist/{plot.barplot-VIBHGTUT.js.map → plot.barplot-PSODLAXD.js.map} +0 -0
  847. /package/dist/{plot.boxplot-NQI3PSKR.js.map → plot.boxplot-W3ASYFOG.js.map} +0 -0
  848. /package/dist/{plot.brainImaging-3MTTCZHI.js.map → plot.brainImaging-JGDLKLR7.js.map} +0 -0
  849. /package/dist/{plot.disco-HODBY7SO.js.map → plot.disco-TPMXTTZK.js.map} +0 -0
  850. /package/dist/{plot.ssgq-4URQE673.js.map → plot.ssgq-KIZIOZIF.js.map} +0 -0
  851. /package/dist/{plot.vaf2cov-QIJNEKCK.js.map → plot.vaf2cov-MSMW72IY.js.map} +0 -0
  852. /package/dist/{polar2-GVFQNSLK.js.map → polar2-LA4MSRRN.js.map} +0 -0
  853. /package/dist/{profileForms-Z22CJXI4.js.map → profileForms-BJRNB2ZF.js.map} +0 -0
  854. /package/dist/{profilePlot-IVQZBSID.js.map → profilePlot-DDO53C4T.js.map} +0 -0
  855. /package/dist/{proteinView-AUK634AU.js.map → proteinView-NFUR42XQ.js.map} +0 -0
  856. /package/dist/{proteomeCohortCompare-7G2F35H5.js.map → proteomeCohortCompare-OZVF3X66.js.map} +0 -0
  857. /package/dist/{pseudobulk-QTCUSH5I.js.map → pseudobulk-UVT5G2VL.js.map} +0 -0
  858. /package/dist/{qualitative-7ST7SSBT.js.map → qualitative-X3VXNC7X.js.map} +0 -0
  859. /package/dist/{radar2-CEE6SNBS.js.map → radar2-RTVUJ3AN.js.map} +0 -0
  860. /package/dist/{radarFacility2-OSKDYIK7.js.map → radarFacility2-ZGLZ5AKM.js.map} +0 -0
  861. /package/dist/{rememberedGvQ.unit.spec-RYFUJ2NW.js.map → rememberedGvQ.unit.spec-RLLLWU5M.js.map} +0 -0
  862. /package/dist/{render-MAD3WMVD.js.map → render-LR5BOYW6.js.map} +0 -0
  863. /package/dist/{report-6JXJVSEB.js.map → report-37W5OXUM.js.map} +0 -0
  864. /package/dist/{sampleView-SG3QYZKQ.js.map → sampleView-BDC2WPH7.js.map} +0 -0
  865. /package/dist/{samplelst-R765UFP6.js.map → samplelst-V2EIVZC5.js.map} +0 -0
  866. /package/dist/{samplematrix-EBJYE5SM.js.map → samplematrix-XOSKILUL.js.map} +0 -0
  867. /package/dist/{sc-7ZXPFDHD.js.map → sc-ZVZPWQY7.js.map} +0 -0
  868. /package/dist/{scatter-3GUL4KF3.js.map → scatter-2ZE5MCYH.js.map} +0 -0
  869. /package/dist/{selectGenomeWithTklst-K4YXGJYG.js.map → selectGenomeWithTklst-EF7WYEAJ.js.map} +0 -0
  870. /package/dist/{singleCellCellType-TU5VTPLP.js.map → singleCellCellType-TKCGC3G3.js.map} +0 -0
  871. /package/dist/{singleCellCellType.unit.spec-IRITQIGT.js.map → singleCellCellType.unit.spec-JZ6UHC5F.js.map} +0 -0
  872. /package/dist/{singleCellGeneExpression-3IL52QDK.js.map → singleCellGeneExpression-I2INGXGI.js.map} +0 -0
  873. /package/dist/{singleCellGeneExpression.unit.spec-WXC4C37T.js.map → singleCellGeneExpression.unit.spec-KL77FSHZ.js.map} +0 -0
  874. /package/dist/{singleCellPlot-XG3HZS7I.js.map → singleCellNumericValue-2X5NCEHL.js.map} +0 -0
  875. /package/dist/{snp-RMZRB426.js.map → singleCellPlot-Q6INE54V.js.map} +0 -0
  876. /package/dist/{singlecell-BRF2HAV2.js.map → singlecell-5N2P5ZAT.js.map} +0 -0
  877. /package/dist/{singlecell-KVCJF2HI.js.map → singlecell-NPSWMNI3.js.map} +0 -0
  878. /package/dist/{ssGSEA-7RKWYZKX.js.map → snp-2WPJYPDE.js.map} +0 -0
  879. /package/dist/{snp.unit.spec-JF6KR2NT.js.map → snp.unit.spec-PPWIIOX6.js.map} +0 -0
  880. /package/dist/{snplocus-AHUFHQ3Q.js.map → snplocus-T3HZFZWA.js.map} +0 -0
  881. /package/dist/{spliceevent.a53ss.diagram-OSZZ2CF2.js.map → spliceevent.a53ss.diagram-APCF4LV5.js.map} +0 -0
  882. /package/dist/{spliceevent.exonskip.diagram-AMA2D2OL.js.map → spliceevent.exonskip.diagram-TT5JGBSC.js.map} +0 -0
  883. /package/dist/{spliceevent.noeventdiagram-RKTUXH5D.js.map → spliceevent.noeventdiagram-CPXQSX3Z.js.map} +0 -0
  884. /package/dist/{summarizeMutationDiagnosis-GCL4SRON.js.map → ssGSEA-FSX6P7HA.js.map} +0 -0
  885. /package/dist/{ssGSEA.unit.spec-XLCZHH7S.js.map → ssGSEA.unit.spec-TXYT665R.js.map} +0 -0
  886. /package/dist/{stattable-NDYUCLVZ.js.map → stattable-BD64SFYV.js.map} +0 -0
  887. /package/dist/{studyCatalog-TAXRF5NS.js.map → studyCatalog-6BOWO4PO.js.map} +0 -0
  888. /package/dist/{summarizeCnvGeneexp-3QLHU6N7.js.map → summarizeCnvGeneexp-AMLYJIPU.js.map} +0 -0
  889. /package/dist/{summarizeGeneexpSurvival-ARI4MPFX.js.map → summarizeGeneexpSurvival-IDM7T333.js.map} +0 -0
  890. /package/dist/{summarizeMutationCnv-W7V7CKPI.js.map → summarizeMutationCnv-R6SYSJQC.js.map} +0 -0
  891. /package/dist/{summary-OUYDWLBF.js.map → summarizeMutationDiagnosis-XZJ4JLW2.js.map} +0 -0
  892. /package/dist/{summarizeMutationSurvival-6TTMSRRX.js.map → summarizeMutationSurvival-ABJ5RL4L.js.map} +0 -0
  893. /package/dist/{termCollection-7P3WU6X6.js.map → summary-NVYCTE6P.js.map} +0 -0
  894. /package/dist/{summary.integration.spec-4GTCG6HY.js.map → summary.integration.spec-SSLTLVNW.js.map} +0 -0
  895. /package/dist/{summaryInput-UK3TLC7M.js.map → summaryInput-SJOZETRP.js.map} +0 -0
  896. /package/dist/{sunburst-2UFHMNH3.js.map → sunburst-RU5ZPJKW.js.map} +0 -0
  897. /package/dist/{survival-SPWYSDVB.js.map → survival-BHJQMXKI.js.map} +0 -0
  898. /package/dist/{survival-TL6UZ6FQ.js.map → survival-DVG6Y2FV.js.map} +0 -0
  899. /package/dist/{svgraph-Z543MLIN.js.map → svgraph-ETFA4GRX.js.map} +0 -0
  900. /package/dist/{svmr-SZCAOAIF.js.map → svmr-AI3RU4JK.js.map} +0 -0
  901. /package/dist/{table-IAQ6J4DO.js.map → table-YCTSMLQL.js.map} +0 -0
  902. /package/dist/{termCollection-3NGHR7QN.js.map → termCollection-GMKEZR6D.js.map} +0 -0
  903. /package/dist/{termCollectionFractionSelection-YKIE6BME.js.map → termCollection-VEVKKJZD.js.map} +0 -0
  904. /package/dist/{termCollection.unit.spec-EPYC7LOA.js.map → termCollection.unit.spec-EU6YCEPX.js.map} +0 -0
  905. /package/dist/{tk-X454XH5N.js.map → termCollectionFractionSelection-UBS74X36.js.map} +0 -0
  906. /package/dist/{termCollectionFractionSelection.unit.spec-AG2CZPGZ.js.map → termCollectionFractionSelection.unit.spec-Y5OJFGDD.js.map} +0 -0
  907. /package/dist/{tk-TOXMU4GT.js.map → tk-HMF4HCNV.js.map} +0 -0
  908. /package/dist/{tvs.dt-U77PCG6X.js.map → tk-W6Z4FJMW.js.map} +0 -0
  909. /package/dist/{tp.ui-FDQ76KPL.js.map → tp.ui-NECRDJCS.js.map} +0 -0
  910. /package/dist/{vocabulary-64GO4YDB.js.map → tvs.dt-2JEH3F35.js.map} +0 -0
  911. /package/dist/{tvs.dtcnv.categorical-XYZU4XLO.js.map → tvs.dtcnv.categorical-YBXKEBR2.js.map} +0 -0
  912. /package/dist/{tvs.dtcnv.continuous-4GJILFGP.js.map → tvs.dtcnv.continuous-AD3SJ6BY.js.map} +0 -0
  913. /package/dist/{tvs.dtfusion-7YROAHVI.js.map → tvs.dtfusion-ODI3CLQS.js.map} +0 -0
  914. /package/dist/{tvs.dtitd-MIYU4ZHH.js.map → tvs.dtitd-V3LYLPJY.js.map} +0 -0
  915. /package/dist/{tvs.dtsnvindel-XLDY7KWB.js.map → tvs.dtsnvindel-R3V5LTNL.js.map} +0 -0
  916. /package/dist/{tvs.dtsv-YMLJ37YR.js.map → tvs.dtsv-ZQLKEDLJ.js.map} +0 -0
  917. /package/dist/{tvs.samplelst-KIVEXJKD.js.map → tvs.samplelst-G25A7HM6.js.map} +0 -0
  918. /package/dist/{tvs.termCollection-4CQV3EB3.js.map → tvs.termCollection-WLVCWDEJ.js.map} +0 -0
  919. /package/dist/{wsi.direct-5MQVRJZX.js.map → wsi.direct-SNPPQPVO.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../shared/utils/src/boxplot.ts", "../../shared/utils/src/bulk.ts", "../../shared/utils/src/clustering.ts", "../../shared/utils/src/compute.percentile.ts", "../../shared/utils/src/hash.ts", "../../shared/utils/src/urljson.ts", "../../shared/utils/src/fetch-helpers.ts", "../../shared/utils/src/fileSize.ts", "../../shared/utils/src/mds3tk.ts", "../../shared/utils/src/scatter.ts", "../../shared/utils/src/termdb.bins.ts", "../../shared/utils/src/termdb.initbinconfig.ts", "../../shared/utils/src/termdb.usecase.ts", "../../shared/utils/src/time.ts", "../../shared/utils/src/vcf.ann.ts", "../../shared/utils/src/vcf.csq.ts", "../../shared/utils/src/vcf.info.ts", "../../shared/utils/src/vcf.type.ts", "../../shared/utils/src/vcf.ts", "../common/auth.js", "../common/dofetch.js"],
4
+ "sourcesContent": ["export type BoxplotValue = { value: number }\n\nexport type BoxplotResult<T extends number | BoxplotValue> = {\n\tw1?: number\n\tw2?: number\n\tp05?: number\n\tp25?: number\n\tp50?: number\n\tp75?: number\n\tp95?: number\n\tiqr?: number\n\tout: T[]\n}\n\n/**\n * Calculates boxplot values from an ascending array. Object inputs are retained\n * in `out`; numeric inputs return numeric outliers.\n */\nexport function boxplot_getvalue<T extends number | BoxplotValue>(lst: T[], removeOutliers = false): BoxplotResult<T> {\n\tconst l = lst.length\n\tif (l < 5) return { out: lst }\n\n\tconst isN = typeof lst[0] === 'number'\n\n\tconst valueOf: (item: T) => number = isN ? item => item as number : item => (item as BoxplotValue).value\n\n\tconst p50 = valueOf(lst[Math.floor(l / 2)])\n\tconst p25 = valueOf(lst[Math.floor(l / 4)])\n\tconst p75 = valueOf(lst[Math.floor((l * 3) / 4)])\n\tconst p05 = valueOf(lst[Math.floor(l * 0.05)])\n\tconst p95 = valueOf(lst[Math.floor(l * 0.95)])\n\tconst iqr = p75 - p25\n\n\tlet w1: number, w2: number\n\tif (iqr === 0) {\n\t\tw1 = p25\n\t\tw2 = p25\n\t} else {\n\t\tconst i = lst.findIndex(item => valueOf(item) > p25 - iqr * 1.5)\n\t\tw1 = valueOf(lst[i === -1 ? 0 : i])\n\t\tconst j = lst.findIndex(item => valueOf(item) > p75 + iqr * 1.5)\n\t\tw2 = valueOf(lst[j === -1 ? l - 1 : j - 1])\n\t}\n\tconst out = removeOutliers\n\t\t? []\n\t\t: lst.filter(item => valueOf(item) < p25 - iqr * 1.5 || valueOf(item) > p75 + iqr * 1.5)\n\treturn { w1, w2, p05, p25, p50, p75, p95, iqr, out }\n}\n", "////////////////////////////////////\n//\n// shared between client and server\n//\n////////////////////////////////////\n\nimport * as common from './common.js'\n\nexport default {}\n\nexport function init_bulk_flag(genome) {\n\tif (!genome) {\n\t\treturn null\n\t}\n\tconst mclasslabel2key = {}\n\tfor (const n in common.mclass) {\n\t\tmclasslabel2key[common.mclass[n].label.toUpperCase()] = n\n\t}\n\treturn {\n\t\tgenome: genome,\n\t\tmclasslabel2key: mclasslabel2key,\n\t\tdata: {},\n\t\tsample2disease: {}, // (proof) k: sample, v: disease\n\t\t// will only record this when origin is used\n\t\tpatient2st: {},\n\t\t// k: patient, v: { k: sampletype, v: sample }\n\t\t// new sample names always override old\n\t\tgood: 0,\n\t\tgeneToUpper: true, // option to not force uppercase on gene names\n\t\tsnv: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: [],\n\t\t\t// jinghui: based on missense/silent ratio of entire dataset to decide whether to include silent when importing...\n\t\t\t// hard-coded class codes\n\t\t\tmissense: 0,\n\t\t\tsilent: 0\n\t\t},\n\t\tsvjson: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: []\n\t\t},\n\t\tfusion: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: [],\n\t\t\toriginal: []\n\t\t},\n\t\tsv: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: [],\n\t\t\toriginal: []\n\t\t},\n\t\tcnv: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: []\n\t\t},\n\t\titd: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: []\n\t\t},\n\t\tdel: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: []\n\t\t},\n\t\ttruncation: {\n\t\t\tloaded: false,\n\t\t\theader: null,\n\t\t\tbadlines: []\n\t\t}\n\t}\n}\n\nexport function parsesample(m, flag, i, lst) {\n\tlet variantorigin = common.moriginsomatic\n\tif (m.sampletype) {\n\t\tconst s = m.sampletype.toLowerCase()\n\t\tswitch (s) {\n\t\t\tcase 'relapse':\n\t\t\t\tvariantorigin = common.moriginrelapse\n\t\t\t\tbreak\n\t\t\tcase 'germline':\n\t\t\t\tvariantorigin = common.morigingermline\n\t\t\t\tbreak\n\t\t\tcase 'somatic':\n\t\t\tcase 'diagnosis':\n\t\t\t\tbreak\n\t\t}\n\t\tif (m.sample) {\n\t\t\tif (m.patient) {\n\t\t\t\t// good\n\t\t\t} else {\n\t\t\t\tm.patient = m.sample + ' ' + m.sampletype\n\t\t\t}\n\t\t} else {\n\t\t\tif (m.patient) {\n\t\t\t\tm.sample = m.patient + ' ' + m.sampletype\n\t\t\t} else {\n\t\t\t\t// neither sample or patient, will quit later\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (m.patient) {\n\t\t\tif (m.sample) {\n\t\t\t\tm.sampletype = m.sample\n\t\t\t} else {\n\t\t\t\tm.sample = m.sampletype = m.patient\n\t\t\t}\n\t\t} else {\n\t\t\tif (m.sample) {\n\t\t\t\tm.sampletype = m.sample\n\t\t\t} else {\n\t\t\t\t// no patient/sample, will quit later\n\t\t\t}\n\t\t}\n\t}\n\tif (m.origin) {\n\t\t// override existing variantorigin\n\t\tconst s = m.origin.toLowerCase()\n\t\tswitch (s) {\n\t\t\tcase 'r':\n\t\t\tcase 'relapse':\n\t\t\t\tvariantorigin = common.moriginrelapse\n\t\t\t\tm.isrim2 = true\n\t\t\t\tbreak\n\t\t\tcase 'g':\n\t\t\tcase 'germline':\n\t\t\t\tvariantorigin = common.morigingermline\n\t\t\t\tm.isrim1 = true\n\t\t\t\tbreak\n\t\t\tcase 'gp':\n\t\t\tcase 'germline pathogenic':\n\t\t\t\tvariantorigin = common.morigingermlinepathogenic\n\t\t\t\tm.isrim1 = true\n\t\t\t\tbreak\n\t\t\tcase 'gnp':\n\t\t\tcase 'germline nonpathogenic':\n\t\t\tcase 'germline non-pathogenic':\n\t\t\t\tvariantorigin = common.morigingermlinenonpathogenic\n\t\t\t\tm.isrim1 = true\n\t\t\t\tbreak\n\t\t\tcase 's':\n\t\t\tcase 'somatic':\n\t\t\tcase 'diagnosis':\n\t\t\t\tvariantorigin = common.moriginsomatic\n\t\t\t\tbreak\n\t\t}\n\t}\n\tm.origin = variantorigin\n\n\tif (!m.sample && !m.patient) {\n\t\t// will not go into sample table\n\t\treturn\n\t}\n\n\tconst nopatientname = 'no patient/individual name'\n\n\tif (m.patient) {\n\t\tif (!flag.patient2st[m.patient]) {\n\t\t\tflag.patient2st[m.patient] = {}\n\t\t}\n\t\tflag.patient2st[m.patient][m.sampletype] = m.sample\n\t} else {\n\t\tif (!flag.patient2st[nopatientname]) {\n\t\t\tflag.patient2st[nopatientname] = {}\n\t\t}\n\t\tflag.patient2st[nopatientname][m.sampletype] = m.sample\n\t}\n\n\tif (m.sample) {\n\t\tif (m.disease) {\n\t\t\tif (m.sample in flag.sample2disease) {\n\t\t\t\tif (m.disease != flag.sample2disease[m.sample]) {\n\t\t\t\t\tflag.snv.badlines.push([\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t'conflict of disease types for sample \"' +\n\t\t\t\t\t\t\tm.sample +\n\t\t\t\t\t\t\t'\": ' +\n\t\t\t\t\t\t\tm.disease +\n\t\t\t\t\t\t\t', ' +\n\t\t\t\t\t\t\tflag.sample2disease[m.sample],\n\t\t\t\t\t\tlst\n\t\t\t\t\t])\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tflag.sample2disease[m.sample] = m.disease\n\t\t\t}\n\t\t}\n\t}\n\treturn false\n}\n", "export const clusterMethodLst = [\n\t{\n\t\tlabel: 'Average',\n\t\tvalue: 'average',\n\t\ttitle: `Cluster by average value`\n\t},\n\t{\n\t\tlabel: `Complete`,\n\t\tvalue: 'complete',\n\t\ttitle: `Use the complete clustering method`\n\t},\n\t{\n\t\tlabel: `Single`,\n\t\tvalue: 'single',\n\t\ttitle: `Use the single clustering method`\n\t},\n\t{\n\t\tlabel: `Ward.D`,\n\t\tvalue: 'ward.D',\n\t\ttitle: `Use the ward.D clustering method`\n\t},\n\t{\n\t\tlabel: `Ward.D2`,\n\t\tvalue: 'ward.D2',\n\t\ttitle: `Use the ward.D2 clustering method`\n\t},\n\t{\n\t\tlabel: `Mcquitty`,\n\t\tvalue: 'mcquitty',\n\t\ttitle: `Use the Mcquity clustering method`\n\t}\n\t/* These methods are currently disabled because the dendrogram lines tend to cross one another.\n\t{\n\t\tlabel: `Centroid`,\n\t\tvalue: 'centroid',\n\t\ttitle: `Use the centroid clustering method`\n\t},\n \t{\n\t\tlabel: `Median`,\n\t\tvalue: 'median',\n\t\ttitle: `Use the median clustering method`\n\t}\n */\n]\nexport const distanceMethodLst = [\n\t{\n\t\tlabel: 'Euclidean',\n\t\tvalue: 'euclidean',\n\t\ttitle: `Calculate distance using euclidean method`\n\t},\n\t{\n\t\tlabel: 'Maximum',\n\t\tvalue: 'maximum',\n\t\ttitle: `Maximum distance between two components of x and y`\n\t},\n\t{\n\t\tlabel: 'Manhattan',\n\t\tvalue: 'manhattan',\n\t\ttitle: `Calculate distance using the absolute distance between the two vectors`\n\t},\n\t{\n\t\tlabel: 'Canberra',\n\t\tvalue: 'canberra',\n\t\ttitle: `Calculate distance using Canberra method`\n\t}\n]\n", "// compute the percentile value from an array of values\n// sorted parameter allows to skip sorting if array is pre-sorted\n// source: https://www.dummies.com/article/academics-the-arts/math/statistics/how-to-calculate-percentiles-in-statistics-169783/\nexport default function computePercentile(values, percentile, sorted = false) {\n\tif (!sorted) values.sort((a, b) => a - b)\n\tconst index = Math.abs((percentile / 100) * values.length - 1)\n\tconst value = Number.isInteger(index) ? (values[index] + values[index + 1]) / 2 : values[Math.ceil(index)]\n\treturn value\n}\n", "const encoder = new TextEncoder()\n\nexport async function hash(message) {\n\tconst msgUint8 = encoder.encode(message) // encode as (utf-8) Uint8Array\n\tconst hashBuffer = await crypto.subtle.digest('SHA-1', msgUint8) // hash the message\n\tconst hashArray = Array.from(new Uint8Array(hashBuffer)) // convert buffer to byte array\n\tconst hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('') // convert bytes to hex string\n\treturn hexToBase64(hashHex).replace('=', '-') // shorten from 40 to 28 chars\n}\n\nfunction hexToBase64(hexStr) {\n\treturn btoa(\n\t\t[...hexStr].reduce(\n\t\t\t(acc, _, i) => (acc += !((i - 1) & 1) ? String.fromCharCode(parseInt(hexStr.substring(i - 1, i + 1), 16)) : ''),\n\t\t\t''\n\t\t)\n\t)\n}\n", "import { isNumeric } from './helpers.js'\n\n/*\n\tA custom encoder-decoder for URL query parameter values\n\n\tAll values are strings except for the following, which\n\twill are assumed to be json-encoded:\n\n\t- those that correspond to JSON reserved keywords: true, false, null\n\t- numeric values using the isNumeric() function below\n\t- values that are wrapped by \"\", {}, []\n\n\tIn addition, a URL-payload that includes an `encoding=urljson` parameter\n\twill cause all query parameter values to be processed by the decode()\n\tfunction below. This is not required, but may help remove ambiguity, especially\n\tto distinguish urljson-encoded params vs legacy URL params that have \n\tbeen manually coded in a way that doesn't conform to the expectations here.\n\n\tWhy not just encode every URL query parameter value as JSON?\n\n\t- That makes the URL harder to read, since more encoding characters have to\n\t\tbe URI (percent) encoded. In contrast, since most values are strings or numbers,\n\t the encoder below leaves those values alone for better readability of the URL. For\n\t example, unambiguous strings would not have to be wrapped with double-quotes\n\t that are then URI encoded.\n\n\t- The decoder will always accept and correctly process values that are JSON-encoded.\n\t So the encoding exceptions above do not prevent harder-to-read JSON-encoded string\n\t values. \n*/\n\n// a URL query parameters object with values to be encoded\nexport type UrlJsonRaw = {\n\t[key: string]: any //boolean | string | number | any[] | null | undefined //| { [key: string]: any }\n}\n\n// a URL query parameters object with values to be decoded\nexport type UrlJsonEncoded = {\n\t[key: string]: string\n}\n\nconst reserved = ['false', 'true', 'null', 'undefined']\nconst delimiters = ['\"', '{', '[']\n\nexport function encode(rawObject: UrlJsonRaw) {\n\tconst params: any[] = []\n\tfor (const [key, value] of Object.entries(rawObject)) {\n\t\tif (typeof value == 'string' && !isNumeric(value) && !reserved.includes(value) && !delimiters.includes(value[0])) {\n\t\t\t// no need to json-encode a string before percent encoding\n\t\t\t// if it doesn't contain reserved JSON keywords/wrapper characters\n\t\t\tparams.push(`${key}=${encodeURIComponent(value)}`)\n\t\t} else if (value !== undefined) {\n\t\t\tparams.push(`${key}=${encodeURIComponent(JSON.stringify(value))}`)\n\t\t}\n\t}\n\treturn params.join('&')\n}\n\nexport function decode(query: UrlJsonEncoded) {\n\tconst encoding = query.encoding\n\tfor (const [key, value] of Object.entries(query)) {\n\t\t//const value = query[key]\n\t\t// if (value == 'undefined') {\n\t\t// \t// maybe better to also detect this common error\n\t\t// \tconsole.warn(`${key}=\"undefined\" value as a string URL query parameter`)\n\t\t// \tquery[key] = undefined\n\t\t// \tcontinue\n\t\t// }\n\t\tif (\n\t\t\tencoding == 'json' ||\n\t\t\tvalue == 'null' || // not new, always been\n\t\t\tvalue == 'true' || // NEED TO FIND-REPLACE CODE THAT USES value == 'true'\n\t\t\tvalue == 'false' || // NEED TO FIND-REPLACE CODE THAT USES value == 'false'\n\t\t\tisNumeric(value) || // NEED TO check\n\t\t\t(typeof value == 'string' && value.startsWith('\"') && value.endsWith('\"')) ||\n\t\t\t(typeof value == 'string' && value.startsWith('{') && value.endsWith('}')) ||\n\t\t\t(typeof value == 'string' && value.startsWith('[') && value.endsWith(']'))\n\t\t)\n\t\t\tquery[key] = JSON.parse(value)\n\t\t// else the value is already a string\n\t}\n\treturn query\n}\n", "import { hash } from './hash.js'\nimport { encode } from './urljson.js'\nimport { deepFreeze } from './helpers.js'\n\n// tracks serverData objects so their associated cache entries can be cleared; uses WeakMap to avoid memory leaks\nconst optsServerDataNames = new WeakMap()\n\n/*\n\tezFetch()\n\tfetch wrapper with automatic response content-type detection and handling\n\n\t- this addresses issues with ky.json() or got.json(), where a HTTP 404 NOT FOUND\n\t\tresponse with text/html can break error handling/logging, making it harder to debug\n\n\t- this also automatically handles multipart responses\n\n - NOTE: for backend, use xfetch() instead, it uses ky() and its built-in retry support\n\n\targuments:\n\turl\n\tinit{headers?, body?}\n\t- first two arguments are same as native fetch\n*/\nexport async function ezFetch(_url, init: Record<string, any> = {}, opts: Record<string, any> = {}) {\n\tconst url = opts.autoMethod ? mayAdjustRequest(_url, init) : _url\n\tif (typeof init.body === 'object') init.body = JSON.stringify(init.body)\n\n\treturn fetch(url, init).then(async r => {\n\t\tconst response = await processResponse(r)\n\t\tif (!r.ok) {\n\t\t\tconsole.log('ezFetch error ' + r.status)\n\t\t\tconsole.log(response)\n\t\t\tthrow response\n\t\t}\n\t\treturn response\n\t})\n}\n\nfunction mayAdjustRequest(url, init: Record<string, any>) {\n\tconst method = init.method?.toUpperCase() || 'GET'\n\tif (method == 'POST') {\n\t\tif (!init.headers) init.headers = {}\n\t\tif (init.body) {\n\t\t\tif (!init.headers['content-type']) init.headers['content-type'] = 'application/json'\n\t\t\tif (init.headers['content-type'].toLowerCase() == 'application/json') {\n\t\t\t\t// if consumer code has pre-encoded the body, parse to verify correctness\n\t\t\t\tif (typeof init.body == 'string') init.body = JSON.parse(init.body)\n\t\t\t\tinit.body = JSON.stringify(init.body)\n\t\t\t}\n\t\t}\n\t\treturn url\n\t}\n\t// default to GET method per native fetch\n\tif (init.body) {\n\t\tif (typeof init.body != 'object') throw `init.body should be an object`\n\t\t// init.body should be an object, to be converted to GET URL search parameter strings\n\t\tif (!url.includes('?')) url += '?'\n\t\treturn `${url}${encode(init.body)}`\n\t}\n}\n\n/* \nr: a native fetch response argument\n\npotentially allow \"application/octet-stream\" as response type\nin such case it will not try to parse it as json\nalso the caller should just call dofetch2() without a serverData{}\nrather than dofetch3\n*/\nexport async function processResponse(r) {\n\t// if (!r.ok) {\n\t// throw new Error(`HTTP error! status: ${r.status}`)\n\t// }\n\tconst ct = r.headers.get('content-type') // content type is always present\n\tif (!ct) throw `missing response.header['content-type']`\n\tif (ct.includes('/json')) {\n\t\tconst payload = await r.json()\n\t\t// server should use a standard HTTP response status 400+, 500+\n\t\t// so that !r.ok will already be caught when wrapping fetch with try-catch\n\t\t// if (payload.error || payload.status == '') throw payload\n\t\t// if (payload.status === 'error') throw payload.message || payload\n\t\treturn payload\n\t}\n\tif (ct.includes('/text') || ct.includes('text/')) {\n\t\treturn r.text()\n\t}\n\tif (ct.includes('multipart')) {\n\t\tif (ct.startsWith('multipart/form-data')) return processFormData(r)\n\t\telse throw `cannot handle response content-type: '${ct}'`\n\t}\n\tif (ct == 'application/x-ndjson-nestedkey') {\n\t\treturn processNDJSON_nestedKey(r)\n\t}\n\t// call blob() as catch-all\n\t// https://developer.mozilla.org/en-US/docs/Web/API/Response\n\treturn r.blob()\n}\n\n/*\n\texpected response format\n\t--boundary-text-from-HTTP-headers-content-type\n\theader-key1: header-value1\n\theader-key2: header-value2\n\n\t...json, text, blob, value, etc...\n\t--boundary-text-from-HTTP-headers-content-type\n\t... same format as previous chunk ...\n\n\t--boundary-text-from-HTTP-headers-content-type--\n*/\n\nexport async function processFormData(res) {\n\tconst data = {}\n\tconst form = await res.formData()\n\t// The key of each form entry is a string, and the value is either a string or a Blob.\n\t// see https://developer.mozilla.org/en-US/docs/Web/API/FormData/entries\n\tfor (const [key, value] of form.entries()) {\n\t\tif (value.type) {\n\t\t\t// value is a Blob\n\t\t\tdata[key] = { headers: { 'content-type': value.type }, body: value }\n\t\t} else {\n\t\t\t// value is a string, assume to be application/x-jsonlines (one json encoded value per line)\n\t\t\t// and convert into an array of json-decoded values\n\t\t\tconst body = !value ? [] : value.trim().split('\\n').map(JSON.parse)\n\t\t\tdata[key] = { headers: { 'content-type': 'application/json' }, body }\n\t\t}\n\t}\n\treturn data\n}\n\nasync function processNDJSON_nestedKey(r) {\n\t// 1. Pipe through TextDecoder to convert bytes to text\n\tconst stream = r.body.pipeThrough(new TextDecoderStream())\n\tconst reader = stream.getReader()\n\tlet rootObj = {}\n\n\tlet buffer = ''\n\n\tlet done = false\n\twhile (!done) {\n\t\tconst readResult = await reader.read()\n\t\tdone = readResult.done\n\t\tif (done) break\n\t\tconst value = readResult.value\n\n\t\t// 2. Add new chunk to buffer\n\t\tbuffer += value\n\n\t\t// 3. Split by newline\n\t\tconst parts = buffer.split('\\n')\n\n\t\t// 4. Keep the last partial line in the buffer\n\t\tbuffer = parts.pop() ?? ''\n\n\t\t// 5. Process complete lines\n\t\tfor (const line of parts) {\n\t\t\tif (line.trim()) {\n\t\t\t\tconst [keys, data] = JSON.parse(line) //; console.log(143, keys, data) // Process JSON data\n\t\t\t\tif (!keys.length) rootObj = data\n\t\t\t\telse {\n\t\t\t\t\tconst lastKey = keys.pop()\n\t\t\t\t\tlet target = rootObj\n\t\t\t\t\tfor (const k of keys) target = target[k]\n\t\t\t\t\ttarget[lastKey] = data\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn rootObj\n}\n\n// key: request object reference or computed string dataName\n// value: {\n// response: fetch promise or response,\n// exp: expiration timestamp\n// }\nconst dataCache = new Map()\n// maximum number of cached dataNames, oldest will be deleted if this is exceeded\nconst maxNumOfDataKeys = 10\nconst cacheLifetime = 1000 * 60 * 5\n/*\n\tmemFetch()\n\t- fetch wrapper that saves cached responses into memory and recovers them for matching subsequent requests\n\t- recommended for caching responses in the backend, with the opts.q argument to cache per expressjs request object\n\t- should call deleteCache(request) at the end of request handling, to free unneeded cache\n\t\n\tSee the usage note for getDataName() to avoid non-unique request/response.\n\t\n\tArguments:\n\turl\n\tinit{headers?, body?}\n\t- first two arguments are same as native fetch\n - when passing opts.client, may include other applicable options inside the init{} object, such as retry\n\n\topts{client}\n\n client: use this http client instead of native fetch\n - since fetch-helpers is shared between server and frontend workspaces,\n cannot directly import non-native modules at the beginning of this code file\n - for server side usage, client may be `xfetch()`, `ky` or other libraries\n\n\t!! CAUTION: memFetch is not interchangeable with xfetch/ky !!\n\n\tThe default for a new request is xfetch/ky. But where memFetch is already in use, it is load-bearing\n\tand must not be swapped back to a plain client \"for consistency\" -- it does two things a plain client\n\tdoes not:\n\t 1. caches the response in this process's RAM, keyed on url + body + headers\n\t 2. caches the in-flight *promise*, so concurrent identical calls share one round trip\n\n\tSwapping it out compiles, passes unit tests, and returns correct data. It only shows up as\n\teverything getting slower -- typically as e2e tests that start timing out and look like flake.\n\tThis has already happened once: an external API call that ran once per cohort became one per\n\tquery, and the \"fix\" nearly applied was raising the test timeout.\n\n\tUse memFetch when a request is keyed on something coarse (a cohort, a dataset version) rather\n\tthan on the specific thing being asked about (a gene, a sample), AND is issued repeatedly across\n\ta session. Keep the payload small enough to sit in RAM.\n\n\tTwo rules for any memFetch call site:\n\t - do NOT pass an abort signal. The response is shared, so an abort from one caller or browser\n\t tab would poison it for every other reader of the same cache entry.\n\t - make sure something invalidates the cache when the upstream data changes\n\t (see clearMemFetchDataCache(), called on a new GDC data version).\n*/\nexport async function memFetch(url, init: Record<string, any>, opts: Record<string, any> = {}) {\n\tif (typeof init.body === 'object') init.body = JSON.stringify(init.body)\n\tconst dataKey = opts.q || (await getDataName(url, init))\n\tconst { response } = dataCache.get(dataKey) || {}\n\tconst now = Date.now()\n\tlet result = response // either a Promise or actual data\n\n\tif (result) {\n\t\t// extend the expiration, since exp is more about managing the cache size\n\t\t// and not the validity of the cached response. A response for the current\n\t\t// dataName req.url + body + headers is technically valid until a new data version\n\t\t// gets published.\n\t\tdataCache.set(dataKey, { response, exp: now + cacheLifetime })\n\t\treturn result\n\t} else {\n\t\ttry {\n\t\t\t// IMPORTANT: do not await so that this same promise may be reused\n\t\t\t// by subsequent requests with the same dataKey\n\t\t\tresult = opts.client\n\t\t\t\t? opts.client(url, init, Object.assign(opts, { client: undefined })).then(response => {\n\t\t\t\t\t\t// replace the cached promise result with the actual data,\n\t\t\t\t\t\t// since persisting a cached promise for a long time is likely not best practice\n\t\t\t\t\t\tdataCache.set(dataKey, { response, exp: Date.now() + cacheLifetime })\n\t\t\t\t\t\treturn response\n\t\t\t\t })\n\t\t\t\t: fetch(url, init)\n\t\t\t\t\t\t.then(async r => {\n\t\t\t\t\t\t\tconst response = await processResponse(r)\n\t\t\t\t\t\t\tif (!r.ok) {\n\t\t\t\t\t\t\t\tconsole.trace(response)\n\t\t\t\t\t\t\t\tthrow (\n\t\t\t\t\t\t\t\t\t'memFetch error ' +\n\t\t\t\t\t\t\t\t\tr.status +\n\t\t\t\t\t\t\t\t\t': ' +\n\t\t\t\t\t\t\t\t\t(typeof response == 'object' ? response.message || response.error : response)\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// replace the cached promise result with the actual data,\n\t\t\t\t\t\t\t// since persisting a cached promise for a long time is likely not best practice\n\t\t\t\t\t\t\tdataCache.set(dataKey, { response: deepFreeze(response), exp: Date.now() + cacheLifetime })\n\t\t\t\t\t\t\treturn response\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(e => {\n\t\t\t\t\t\t\tif (dataCache.get(dataKey)) dataCache.delete(dataKey)\n\t\t\t\t\t\t\tthrow e\n\t\t\t\t\t\t})\n\n\t\t\tdataCache.set(dataKey, { response: result, exp: Date.now() + cacheLifetime })\n\t\t\tmanageCacheSize(now)\n\t\t\treturn result\n\t\t} catch (e) {\n\t\t\t// delete this cache only if it is a promise;\n\t\t\t// do not delete a valid resolved data cache\n\t\t\tif (dataCache.get(dataKey) instanceof Promise) dataCache.delete(dataKey)\n\t\t\tthrow e\n\t\t}\n\t}\n}\n\nexport function deleteCache(key) {\n\tdataCache.delete(key)\n}\n\nexport function manageCacheSize(_now) {\n\tconst now = _now || Date.now()\n\tconst keyExp: { key: any; exp: number }[] = []\n\tfor (const [key, result] of dataCache.entries()) {\n\t\tif (result.exp < now) dataCache.delete(key)\n\t\telse keyExp.push({ key, exp: result.exp })\n\t}\n\tif (dataCache.size > maxNumOfDataKeys) {\n\t\tconst oldestEntries = keyExp.sort((a, b) => a.exp - b.exp).slice(maxNumOfDataKeys)\n\t\tfor (const entry of oldestEntries) dataCache.delete(entry.key)\n\t}\n}\n\n/*\n\tNOTE: When used in client-side code, an HttpOnly cookie for a logged in user will not be\n\ttracked in init.headers below. \n*/\nexport async function getDataName(url: string, init: { [optKey: string]: any }) {\n\t// IMPORTANT: must ensure dataName is unique to either public or logged-in user\n\tconst dataName = url + ' | ' + init.method + ' | ' + init.body + ' | ' + JSON.stringify(init.headers)\n\treturn await hash(dataName)\n}\n\n//\nexport function clearMemFetchDataCache(opts: Record<string, any> = {}) {\n\tif (!opts.serverData) {\n\t\tdataCache.clear()\n\t\treturn\n\t}\n\tif (typeof opts.serverData != 'object') throw `opts.serverData is not an object`\n\tfor (const k of Object.keys(opts.serverData)) {\n\t\tdelete opts.serverData[k]\n\t}\n\tif (optsServerDataNames.has(opts.serverData)) optsServerDataNames.delete(opts.serverData)\n}\n", "export function fileSize(v) {\n\tif (v > 1e9) return (v / 1e9).toFixed(2) + ' GB'\n\tif (v > 1e6) return (v / 1e6).toFixed(2) + ' MB'\n\tif (v > 1e3) return (v / 1e3).toFixed(2) + ' KB'\n\treturn v + ' Bytes'\n}\n", "import { dtcnv, dtsnvindel, dtsv, dtfusionrna, dtitd, mclassitd } from './common.js'\n\n// this script should contain mds3 track-related stuff shared between client and backend\n\n/*\nthe separator is used to join essential bits of a variant obj into a string as the \"ssm_id\", aims to uniquely identify a variant irrespective of sample\nthis is to mimic the GDC \"ssm_id\" which is a random id, with below benefits:\n- consistent way to pass request body for both gdc and non-gdc\n- uniform identification of ssm/cnv/sv in non-gdc backend code\n- uniform identification of all variants in client\n\nssm: chr + pos + ref + alt\ncnv: chr + start + stop + class\nsvfusion: dt + chr + pos + strand + pairlstidx + mname\n\nthe separator must avoid conflicting with characters from gene names, and can be changed based on needs\n*/\nexport const ssmIdFieldsSeparator = '__'\n\n/*\ninput: array of mixture of ssm, svfusion and cnv\n\noutput: sorted array. each element: [ class/dt, count of m ]\n*/\nexport function summarize_mclass(mlst) {\n\tconst m2c = new Map() // k: mclass, v: {}\n\tconst cnvs: any[] = []\n\tfor (const m of mlst) {\n\t\tif (m.dt == dtcnv) {\n\t\t\tcnvs.push(m)\n\t\t\tcontinue // process cnv later\n\t\t}\n\t\t// snvindel has m.class=str, svfusion has only dt=int\n\t\tconst key = m.class || m.dt\n\t\tm2c.set(key, 1 + (m2c.get(key) || 0))\n\t}\n\n\tif (cnvs.length) {\n\t\tif (Number.isFinite(cnvs[0].value)) {\n\t\t\t// first cnv uses numeric value (assumes all the same). record by dt\n\t\t\tm2c.set(dtcnv, cnvs.length)\n\t\t} else {\n\t\t\t// cnv not numeric and uses class; record by each class\n\t\t\tfor (const c of cnvs) {\n\t\t\t\tif (!c.class) continue // should not happen\n\t\t\t\tm2c.set(c.class, 1 + (m2c.get(c.class) || 0))\n\t\t\t}\n\t\t}\n\t}\n\treturn [...m2c].sort((i, j) => j[1] - i[1])\n}\n\n/*\nssmid is not specific for ssm, it covers all alterations\ngdc ssm are identified by a specific uuid, thus the design\n*/\nexport function guessSsmid(ssmid) {\n\tconst l = ssmid.split(ssmIdFieldsSeparator)\n\tif (l.length == 4) {\n\t\tconst [chr, tmp, ref, alt] = l\n\t\tconst pos = Number(tmp)\n\t\tif (Number.isNaN(pos)) throw 'ssmid snvindel pos not integer'\n\t\treturn { dt: dtsnvindel, l: [chr, pos, ref, alt] }\n\t}\n\tif (l.length == 5) {\n\t\tconst [chr, _start, _stop, _class, _value] = l\n\t\tconst start = Number(_start),\n\t\t\tstop = Number(_stop)\n\t\tif (Number.isNaN(start) || Number.isNaN(stop)) throw new Error('ssmid cnv start/stop not integer')\n\t\tconst value = _value == '' ? null : Number(_value)\n\t\tif (_class == mclassitd) {\n\t\t\treturn { dt: dtitd, l: [chr, start, stop, _class, value] }\n\t\t}\n\t\t// cnv. if type=cat, _value is blank string\n\t\treturn { dt: dtcnv, l: [chr, start, stop, _class, value] }\n\t}\n\tif (l.length == 6) {\n\t\tif (l[3] == '+' || l[3] == '-') {\n\t\t\t// sv/fusion\n\t\t\tconst [_dt, chr, _pos, strand, _pi, _mname] = l\n\n\t\t\t// mname is encoded in case it contains comma (and is same as ssmIdFieldsSeparator)\n\t\t\tconst mname = decodeURIComponent(_mname)\n\t\t\tconst dt = Number(_dt)\n\t\t\tif (dt != dtsv && dt != dtfusionrna) throw 'ssmid dt not sv/fusion'\n\t\t\tconst pos = Number(_pos)\n\t\t\tif (Number.isNaN(pos)) throw 'ssmid svfusion position not integer'\n\t\t\tconst pairlstIdx = Number(_pi)\n\t\t\tif (Number.isNaN(pairlstIdx)) throw 'ssmid pairlstIdx not integer'\n\t\t\treturn { dt, l: [dt, chr, pos, strand, pairlstIdx, mname] }\n\t\t}\n\t\t// cnv or itd with sample\n\t\tconst [chr, _start, _stop, _class, _value, sample] = l\n\t\tconst start = Number(_start),\n\t\t\tstop = Number(_stop)\n\t\tif (Number.isNaN(start) || Number.isNaN(stop)) throw new Error('ssmid cnv start/stop not integer')\n\t\tif (_class == mclassitd) {\n\t\t\treturn { dt: dtitd, l: [chr, start, stop, _class, _value, sample] }\n\t\t}\n\t\tconst value = _value == '' ? null : Number(_value) // if cnv not using value, must avoid `Number('')=0`\n\t\treturn { dt: dtcnv, l: [chr, start, stop, _class, value, sample] }\n\t}\n\tthrow new Error('unknown ssmid')\n}\n", "/** The scatter renders both on the client and the server.\n * The consts and functions below are data processing and formatting utils used\n * in both contexts. */\n\nexport const xAxisOffSet = 80\nexport const yAxisOffSet = 30\n\nexport function getCoordinate(val: number, min: number | null, max: number | null) {\n\tif (min != null && val < min) return min\n\tif (max != null && val > max) return max\n\treturn val\n}\n\n/** Extra space prevents clipping data points on the scale (i.e. plot axis) */\nexport function calculatePadding(minScale: number | null, maxScale: number | null, min: number, max: number) {\n\treturn minScale != null || maxScale != null ? 0 : (max - min) * 0.01\n}\n", "import { format } from 'd3-format'\nimport { getColors } from './common.js'\nimport { isNumeric, isStrictNumeric, convertUnits } from './helpers.js'\nimport type { RegularNumericBinConfig, CustomNumericBinConfig } from '#types'\n\ntype BinRuntimeExtras = {\n\tresults?: { summary: any }\n\tbinLabelFormatter?: (d: any) => any\n\tlabel_offset_ignored?: boolean\n\tuse_as?: string\n\ttermtype?: string\n}\n\ntype BinWithRuntimeExtras = {\n\tstart_percentile?: number\n\tstop_percentile?: number\n\tcolor?: string\n}\n\ntype RegularBinConfig = Omit<RegularNumericBinConfig, 'first_bin' | 'last_bin'> &\n\tBinRuntimeExtras & {\n\t\ttype: 'regular-bin'\n\t\tfirst_bin: RegularNumericBinConfig['first_bin'] & BinWithRuntimeExtras\n\t\tlast_bin?: NonNullable<RegularNumericBinConfig['last_bin']> & BinWithRuntimeExtras\n\t}\n\ntype CustomBinConfig = Omit<CustomNumericBinConfig, 'lst'> &\n\tBinRuntimeExtras & {\n\t\ttype: 'custom-bin'\n\t\tlst: [\n\t\t\tCustomNumericBinConfig['lst'][number] & BinWithRuntimeExtras,\n\t\t\t...(CustomNumericBinConfig['lst'][number] & BinWithRuntimeExtras)[]\n\t\t]\n\t}\n\ntype BinConfig = RegularBinConfig | CustomBinConfig\n\nexport default function validate_bins(binconfig: BinConfig) {\n\t// Number.isFinite('1') returns false, which is desired\n\n\tconst bc: any = binconfig\n\tif (!bc || typeof bc !== 'object') throw 'bin schema must be an object'\n\t// assign default type\n\tif (!('type' in bc)) (bc as BinConfig).type = 'regular-bin'\n\n\tif (bc.type == 'custom-bin') {\n\t\tif (!Array.isArray(bc.lst)) throw 'binconfig.lst must be an array'\n\t\tif (!bc.lst.length) throw 'binconfig.lst must have entries'\n\t\tconst first_bin = bc.lst[0]\n\t\tconst last_bin = bc.lst[bc.lst.length - 1]\n\n\t\tfor (const bin of bc.lst) {\n\t\t\tif (!('startinclusive' in bin) && !('stopinclusive' in bin)) {\n\t\t\t\tthrow 'custom bin.startinclusive and/or bin.stopinclusive must be defined'\n\t\t\t}\n\n\t\t\tif (bin == first_bin) {\n\t\t\t\tif ('startunbounded' in bin && !bin.startunbounded) {\n\t\t\t\t\tthrow `a custom first bin must not set bin.startunbounded to false`\n\t\t\t\t}\n\t\t\t\tbin.startunbounded = true\n\t\t\t\tif ('start' in bin) {\n\t\t\t\t\tthrow 'a custom first bin must not set a bin.start value'\n\t\t\t\t}\n\t\t\t\tif ('start_percentile' in bin) {\n\t\t\t\t\tthrow 'the first bin must not set a bin.start_percentile value'\n\t\t\t\t}\n\t\t\t\tif (!('stop' in bin)) {\n\t\t\t\t\tthrow `a custom first bin must define a bin.stop value`\n\t\t\t\t}\n\t\t\t\tif (!isStrictNumeric(bin.stop)) {\n\t\t\t\t\tthrow `a custom first bin.stop value should be numeric`\n\t\t\t\t}\n\t\t\t} else if (bin == last_bin) {\n\t\t\t\tif (!('start' in bin)) {\n\t\t\t\t\tthrow `a custom last bin must define a bin.start value`\n\t\t\t\t}\n\t\t\t\tif (!isStrictNumeric(bin.start)) {\n\t\t\t\t\tthrow `a custom last bin.start must be numeric`\n\t\t\t\t}\n\t\t\t\tif ('stopunbounded' in bin && !bin.stopunbounded) {\n\t\t\t\t\tthrow 'a custom last bin must not set bin.stopunbounded to false'\n\t\t\t\t}\n\t\t\t\tbin.stopunbounded = true\n\t\t\t\tif ('stop' in bin) {\n\t\t\t\t\tthrow 'a custom last bin must not set a bin.stop value'\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (bin.startunbounded || bin.stopunbounded) {\n\t\t\t\t\tthrow 'bin.startunbounded and bin.stopunbounded must not be set for non-first/non-last bins'\n\t\t\t\t}\n\t\t\t\tif (!isStrictNumeric(bin.start)) throw 'bin.start must be numeric for a non-first bin'\n\t\t\t\tif (!isStrictNumeric(bin.stop)) throw 'bin.stop must be numeric for a non-last bin'\n\t\t\t}\n\t\t}\n\t} else if (bc.type == 'regular-bin') {\n\t\t// required custom_bin parameter\n\t\tif (!Number.isFinite(bc.bin_size)) throw 'non-numeric bin_size'\n\t\tif (!bc.bin_size || bc.bin_size <= 0) throw 'bin_size must be greater than 0'\n\n\t\tif (!bc.startinclusive && !bc.stopinclusive) {\n\t\t\tbc.startinclusive = true\n\t\t\tbc.stopinclusive = false\n\t\t}\n\n\t\tif (!bc.first_bin) throw 'first_bin{} missing'\n\t\tif (typeof bc.first_bin != 'object') throw 'first_bin{} is not an object'\n\t\tif (!Object.keys(bc.first_bin).length) throw 'first_bin is an empty object'\n\n\t\t{\n\t\t\tconst b = bc.first_bin\n\t\t\tb.startunbounded = true\n\t\t\t// requires stop_percentile, or stop\n\t\t\tif (b.stop_percentile) {\n\t\t\t\tif (!Number.isInteger(b.stop_percentile)) throw 'first_bin.stop_percentile should be integer'\n\t\t\t\tif (b.stop_percentile <= 0 || b.stop_percentile >= 100) throw 'first_bin.stop_percentile out of bound (0-100)'\n\t\t\t} else if (!Number.isFinite(b.stop)) {\n\t\t\t\tthrow 'first_bin.stop not a number when stop_percentile is not set'\n\t\t\t}\n\t\t}\n\n\t\tif (bc.last_bin) {\n\t\t\tconst b = bc.last_bin\n\t\t\t// requires start_percentile or start\n\t\t\tif (b.start_percentile) {\n\t\t\t\tif (!Number.isInteger(b.start_percentile)) throw 'last_bin.start_percentile should be integer'\n\t\t\t\tif (b.start_percentile <= 0 || b.start_percentile >= 100) throw 'last_bin.start_percentile out of bound (0-100)'\n\t\t\t} else if (!Number.isFinite(b.start)) {\n\t\t\t\tthrow 'last_bin.start not a number when start_percentile is not set'\n\t\t\t}\n\n\t\t\tb.stopunbounded = true\n\t\t\tif ('stop' in b) {\n\t\t\t\tthrow 'a regular last bin must not set a bin.stop value'\n\t\t\t}\n\t\t}\n\t} else {\n\t\tthrow `invalid binconfig.type=\"${bc.type}\"`\n\t}\n}\n\nconst maxNumBins = 100 // hardcoded limit for now to not stress sqlite\n\nexport function compute_bins(binconfig: BinConfig, summaryfxn: (f?: any) => any, valueConversion?: any) {\n\t/*\n\t Bins generator\n\t \n\tbinconfig \n\t configuration of bins per the Numerical Binning Scheme\n\n\tsummaryfxn (percentiles)=> return {min, max, pX, pY, ...}\n\t - required function\n\n\t - must accept an array of desired percentile values\n\t and returns an object of computed properties\n\t {\n\t\tmin: minimum value\n\t\tmax: maximum value\n\t\tpX: percentile at X value, so p10 will be 10th percentile value\n\t\tpY: .. corresponding to the desired percentile values \n\t }\n\t*/\n\tconst bc: any = binconfig\n\n\tvalidate_bins(bc)\n\tif (bc.lst) {\n\t\tif (!Array.isArray(bc.lst)) throw `bc.lst is not an array`\n\t\tif (bc.lst.length > maxNumBins) throw `bc.lst exceed the maximum of ${maxNumBins} allowed entries`\n\t\tassignBinColors(bc.lst)\n\t}\n\tif (bc.type == 'custom-bin') return JSON.parse(JSON.stringify(bc.lst))\n\tif (typeof summaryfxn != 'function') throw 'summaryfxn required for modules/termdb.bins.js compute_bins()'\n\tconst percentiles = target_percentiles(bc)\n\tconst summary = summaryfxn(percentiles)\n\tif (!summary || typeof summary !== 'object') throw 'invalid returned value by summaryfxn'\n\tbc.results = { summary }\n\tif (!bc.binLabelFormatter) bc.binLabelFormatter = getNumDecimalsFormatter(bc)\n\n\t// round the min and max values for use as bin start and stop\n\t// in the first and last bins, respectively\n\tconst minFloor = Math.floor(summary.min * 100) / 100\n\tconst maxCeil = Math.ceil(summary.max * 100) / 100\n\tconst min = bc.first_bin.startunbounded\n\t\t? minFloor\n\t\t: bc.first_bin.start_percentile\n\t\t? summary['p' + bc.first_bin.start_percentile]\n\t\t: bc.first_bin.start\n\tlet max = maxCeil, // in order to include the max value in the last bin\n\t\tlast_start,\n\t\tlast_stop\n\n\tif (bc.last_bin) {\n\t\tmax = bc.last_bin.stopunbounded\n\t\t\t? maxCeil // in order to include the max value in the last bin\n\t\t\t: bc.last_bin.stop_percentile\n\t\t\t? summary['p' + bc.last_bin.stop_percentile]\n\t\t\t: isNumeric(bc.last_bin.stop) && bc.last_bin.stop <= summary.max // '0.0088' < 0.0088\n\t\t\t? bc.last_bin.stop\n\t\t\t: maxCeil // in order to include the max value in the last bin\n\t\tlast_start = isStrictNumeric(bc.last_bin.start_percentile)\n\t\t\t? summary['p' + bc.last_bin.start_percentile]\n\t\t\t: isStrictNumeric(bc.last_bin.start)\n\t\t\t? bc.last_bin.start\n\t\t\t: undefined\n\t\tlast_stop = bc.last_bin.stopunbounded\n\t\t\t? null\n\t\t\t: bc.last_bin.stop_percentile\n\t\t\t? summary['p' + bc.last_bin.stop_percentile]\n\t\t\t: isStrictNumeric(bc.last_bin.stop)\n\t\t\t? bc.last_bin.stop\n\t\t\t: null\n\t} else if (bc.lst) {\n\t\tconst last_bin = bc.lst[bc.lst.length - 1]\n\t\tlast_start = last_bin.start\n\t\tlast_stop = 'stop' in last_bin && !last_bin.stopunbounded ? last_bin.stop : maxCeil\n\t\tmax = last_stop\n\t} else {\n\t\tlast_start = maxCeil\n\t\tlast_stop = maxCeil\n\t}\n\n\tconst numericMax = isStrictNumeric(max)\n\tconst numericLastStart = isStrictNumeric(last_start)\n\tconst numericLastStop = isStrictNumeric(last_stop)\n\n\tif (!numericMax && !numericLastStart) return [] //throw 'unable to compute the last bin start or stop'\n\n\tconst bins: any[] = []\n\tlet currBin: Record<string, any> = {\n\t\tstartunbounded: bc.first_bin.startunbounded,\n\t\tstart: bc.first_bin.startunbounded ? undefined : min,\n\t\tstop: isStrictNumeric(bc.first_bin.stop_percentile)\n\t\t\t? +summary['p' + bc.first_bin.stop_percentile]\n\t\t\t: isStrictNumeric(bc.first_bin.stop)\n\t\t\t? +bc.first_bin.stop\n\t\t\t: min + bc.bin_size,\n\t\tstartinclusive: bc.startinclusive,\n\t\tstopinclusive: bc.stopinclusive\n\t}\n\n\tif (!isStrictNumeric(currBin.stop)) throw 'the computed first_bin.stop is non-numeric' + currBin.stop\n\n\twhile ((numericMax && currBin.stop <= max) || (currBin.startunbounded && !bins.length) || currBin.stopunbounded) {\n\t\tbins.push(currBin)\n\t\t// force a computed last bin to have stopunbounded true\n\t\tif (currBin.stop >= max) {\n\t\t\tcurrBin.stopunbounded = true\n\t\t\tif (bins.length > 1) {\n\t\t\t\tdelete currBin.stop\n\t\t\t}\n\t\t}\n\t\tcurrBin.label = get_bin_label(currBin, bc, valueConversion)\n\t\tif (currBin.stopunbounded) break\n\n\t\tconst upper = currBin.stop + bc.bin_size\n\t\tconst previousStop = currBin.stop\n\t\tcurrBin = {\n\t\t\tstartinclusive: bc.startinclusive,\n\t\t\tstopinclusive: bc.stopinclusive,\n\t\t\tstart: previousStop,\n\t\t\tstop:\n\t\t\t\tnumericLastStop && (previousStop == last_start || upper > last_stop)\n\t\t\t\t\t? last_stop\n\t\t\t\t\t: numericLastStart && upper > last_start && previousStop != last_start\n\t\t\t\t\t? last_start\n\t\t\t\t\t: upper\n\t\t}\n\n\t\tif (currBin.stop >= max) {\n\t\t\tcurrBin.stop = max\n\t\t\tif (bc.last_bin && bc.last_bin.stopunbounded) currBin.stopunbounded = 1\n\t\t\tif (bc.last_bin && bc.last_bin.stopinclusive) currBin.stopinclusive = 1\n\t\t}\n\t\tif (numericLastStart && currBin.start == last_start) {\n\t\t\tif (bc.last_bin && bc.last_bin.stopunbounded) currBin.stopunbounded = 1\n\t\t}\n\t\tif (currBin.start > currBin.stop) {\n\t\t\tif (numericLastStart && currBin.stop == last_start && bc.last_bin && bc.last_bin.stopunbounded)\n\t\t\t\tcurrBin.stopunbounded = true\n\t\t\telse break\n\t\t}\n\t\tif (bins.length + 1 >= maxNumBins) {\n\t\t\t// this limit is computed before processing actual numeric values, since\n\t\t\t// the computation with actual values may be problematic when there are lots of bins\n\t\t\tdelete currBin.stop\n\t\t\tcurrBin.stopunbounded = true\n\t\t\tcurrBin.label = get_bin_label(currBin, bc, valueConversion)\n\t\t\tif (!bins.includes(currBin)) bins.push(currBin)\n\t\t\tconst hint = 'Please increase the bin_size or first bin stop, or have a lower last bin start.'\n\t\t\t// throw instead of making the error handling dependent on client code,\n\t\t\t// to make the error behavior consistent across different chart types;\n\t\t\t// previously, the error message was not thrown but assigned as bc.error\n\t\t\tthrow new Error(hint + ' (max_num_bins_reached)')\n\t\t}\n\t}\n\tdelete bc.binLabelFormatter\n\tif (bins.length > 1) {\n\t\tdelete bins[bins.length - 1].stop\n\t}\n\tassignBinColors(bins)\n\treturn bins\n}\n\n/* assign a default color to each bin, so that consumers coloring by bin do not have to fall back\nto a scheme of their own. bins are colored in place and returned.\nused by compute_bins(), and by callers that use a q.lst[] as-is without computing bins.\nthe ordinal scale is keyed by bin index, not bin.label: label is optional on a bin and is often\nonly derived later by get_bin_label(), so keying by label would hand every unlabeled bin the same\ncolor. for distinctly labeled bins the two are equivalent, as an ordinal scale hands out range\nentries in order of first appearance.\nany pre-existing bin.color is deliberately overwritten, so that the palette always matches the\ncurrent bin count: a client that echoes back a bin list it was served would otherwise keep colors\ndrawn from a scale of a different size. user-chosen bin colors are not carried on q.lst[] -- they\ntravel separately as q.binColored[] and are applied downstream of getData() */\nexport function assignBinColors(lst: any[]) {\n\tconst k2c = getColors(lst.length)\n\tfor (const [i, bin] of lst.entries()) bin.color = k2c(String(i))\n\treturn lst\n}\n\nfunction getNumDecimalsFormatter(bc: any) {\n\t//return format('rounding' in bc ? bc.rounding : '')\n\treturn 'rounding' in bc ? format(bc.rounding) : (d: any) => d // default to labeling using the start/stop value as-is\n}\n\nexport function get_bin_label(bin: any, binconfig: any, valueConversion?: any) {\n\t/*\n\t Generate a numeric bin label given a bin configuration and an optional term valueConversion object\n\t*/\n\tif (!bin) return 'missing bin.label'\n\tif (bin.label) return bin.label\n\n\tconst bc = binconfig\n\tif (!bc.binLabelFormatter) bc.binLabelFormatter = getNumDecimalsFormatter(bc)\n\tif (!bin.startunbounded && !bin.stopunbounded && !('startinclusive' in bin) && !('stopinclusive' in bin)) {\n\t\tif (bc.startinclusive) bin.startinclusive = true\n\t\telse if (bc.stopinclusive) bin.stopinclusive = true\n\t}\n\n\tconst start = bc.use_as == 'bins' || bin.start\n\tconst stop = bc.use_as == 'bins' || bin.stop\n\n\tlet label_offset = 0\n\tif ('label_offset' in bc) {\n\t\tbc.label_offset_ignored = 'bin_size' in bc && bc.bin_size < bc.label_offset\n\t\tif (!bc.label_offset_ignored) label_offset = bc.label_offset\n\t} else if (bc.bin_size === 1 && bc.termtype == 'integer') {\n\t\tlabel_offset = 1\n\t}\n\n\t// one side-unbounded bins\n\t// label will be \">v\" or \"<v\"\n\tif (bin.startunbounded) {\n\t\tconst oper = bin.stopinclusive ? '\u2264' : '<' // \\u2264\n\t\tconst v1 = valueConversion\n\t\t\t? convertUnits(stop, valueConversion.fromUnit, valueConversion.toUnit, valueConversion.scaleFactor, true)\n\t\t\t: bc.binLabelFormatter(stop) //bin.startinclusive && label_offset ? stop - label_offset : stop)\n\t\treturn oper + v1\n\t}\n\t// a data value may coincide with the last bin's start\n\tif (bin.stopunbounded || start === stop) {\n\t\tconst oper = bin.startinclusive /*|| label_offset*/ ? '\u2265' : '>' // \\u2265\n\t\tconst v0 = valueConversion\n\t\t\t? convertUnits(start, valueConversion.fromUnit, valueConversion.toUnit, valueConversion.scaleFactor, true)\n\t\t\t: bc.binLabelFormatter(start) //bin.startinclusive || start == min ? start : start + label_offset)\n\t\treturn oper + v0\n\t}\n\n\t// two-sided bins\n\tif (label_offset && bin.startinclusive && !bin.stopinclusive) {\n\t\tif (Number.isInteger(bc.bin_size) && Math.abs(start - stop) === label_offset) {\n\t\t\t// make a simpler label when the range simply spans the bin_size\n\t\t\treturn (\n\t\t\t\t'' +\n\t\t\t\t(valueConversion\n\t\t\t\t\t? convertUnits(start, valueConversion.fromUnit, valueConversion.toUnit, valueConversion.scaleFactor, true)\n\t\t\t\t\t: bc.binLabelFormatter(start))\n\t\t\t)\n\t\t} else {\n\t\t\tconst v0 = valueConversion\n\t\t\t\t? convertUnits(start, valueConversion.fromUnit, valueConversion.toUnit, valueConversion.scaleFactor, true)\n\t\t\t\t: bc.binLabelFormatter(start)\n\t\t\tconst v1 = valueConversion\n\t\t\t\t? convertUnits(\n\t\t\t\t\t\tstop - label_offset,\n\t\t\t\t\t\tvalueConversion.fromUnit,\n\t\t\t\t\t\tvalueConversion.toUnit,\n\t\t\t\t\t\tvalueConversion.scaleFactor,\n\t\t\t\t\t\ttrue\n\t\t\t\t )\n\t\t\t\t: bc.binLabelFormatter(stop - label_offset)\n\t\t\t// ensure that last two bin labels make sense (the last is stopunbounded)\n\t\t\treturn +v0 >= +v1 ? v0.toString() : v0 + ' to ' + v1\n\t\t}\n\t} else {\n\t\t// stop_inclusive || label_offset == 0\n\t\tconst oper0 = bin.startinclusive ? '' : '>'\n\t\tconst oper1 = bin.stopinclusive ? '' : '<'\n\t\tconst v0 = valueConversion\n\t\t\t? convertUnits(start, valueConversion.fromUnit, valueConversion.toUnit, valueConversion.scaleFactor, true)\n\t\t\t: Number.isInteger(start)\n\t\t\t? start\n\t\t\t: bc.binLabelFormatter(start)\n\t\tconst v1 = valueConversion\n\t\t\t? convertUnits(stop, valueConversion.fromUnit, valueConversion.toUnit, valueConversion.scaleFactor, true)\n\t\t\t: Number.isInteger(stop)\n\t\t\t? stop\n\t\t\t: bc.binLabelFormatter(stop)\n\t\t// after rounding the bin labels, the bin start may equal the last bin stop as derived from actual data\n\t\tif (+v0 >= +v1) {\n\t\t\tconst oper = bin.startinclusive ? '\u2265' : '>' // \\u2265\n\t\t\treturn oper + v0\n\t\t} else {\n\t\t\treturn oper0 + v0 + ' to ' + oper1 + v1\n\t\t}\n\t}\n}\n\n// get bin range equation from bin label and bin properties\n// valueConversion, when given, states the range in the term's user-facing unit, as get_bin_label() does\nexport function get_bin_range_equation(bin: any, binconfig: any, valueConversion?: any) {\n\tconst x = '<span style=\"font-family:Times;font-style:italic;\">x</span>'\n\tlet range_eq\n\t// should always use computed (not user-customized) bin label to determine bin range text\n\tconst copy = structuredClone(bin)\n\tcopy.label = '' // mutate only the copy, and not the original bin argument\n\tconst bin_label = get_bin_label(copy, binconfig, valueConversion)\n\tif (bin.startunbounded || bin.stopunbounded) {\n\t\t// first or last bins, e.g. x \u2264 14 and x > 16\n\t\trange_eq = x + ' ' + bin_label\n\t} else if (bin.startinclusive) {\n\t\t// bins with startinclusive, e.g. 14 \u2264 x < 16\n\t\trange_eq = bin_label.replace('to <', '\u2264 ' + x + ' <')\n\t} else if (bin.stopinclusive) {\n\t\t// bins with stopinclusive, e.g. 14 < x \u2264 16\n\t\trange_eq = bin_label.replace('>', '').replace('to', '< ' + x + ' \u2264')\n\t}\n\treturn range_eq\n}\n\nexport function target_percentiles(binconfig: RegularBinConfig) {\n\tconst percentiles: any[] = []\n\tconst f = binconfig.first_bin\n\tif (f && isStrictNumeric(f.start_percentile)) percentiles.push(f.start_percentile)\n\tif (f && isStrictNumeric(f.stop_percentile)) percentiles.push(f.stop_percentile)\n\tconst l = binconfig.last_bin\n\tif (l && isStrictNumeric(l.start_percentile)) percentiles.push(l.start_percentile)\n\tif (l && isStrictNumeric(l.stop_percentile)) percentiles.push(l.stop_percentile)\n\treturn percentiles\n}\n", "/*\nInitialize a bin configuration for a numeric dataset\n<data>: array of numeric data values\n<opts> (optional): object of options\n {}: output bin config as JavaScript object (default)\n {format: 'string'}: output bin config as JSON string\n*/\nexport default function initBinConfig(data, opts = {}) {\n\tif (!data.length)\n\t\treturn { mode: 'discrete', type: 'regular-bin', startinclusive: true, bin_size: null, first_bin: { stop: null } }\n\tif (data.find(d => !Number.isFinite(d))) throw new Error('non-numeric values found')\n\n\tlet binConfig\n\tconst s = new Set(data)\n\tif (s.size === 1) {\n\t\t// single unique value in data array\n\t\t// prepare custom bin config for 3 bins: first bin\n\t\t// for values less than the value, second bin for values\n\t\t// equal to the value, and third bin one for values\n\t\t// greater than the value\n\t\t// all data values will fall into the second bin\n\t\tconst value = [...s][0]\n\t\tbinConfig = {\n\t\t\ttype: 'custom-bin',\n\t\t\tlst: [\n\t\t\t\t{ stop: value, stopinclusive: false, startunbounded: true, label: '<' + value },\n\t\t\t\t{ start: value, stop: value, startinclusive: true, stopinclusive: true, label: '=' + value },\n\t\t\t\t{ start: value, startinclusive: false, stopunbounded: true, label: '>' + value }\n\t\t\t]\n\t\t}\n\t} else {\n\t\t// multiple unique values in data array\n\t\t// prepare regular bin config\n\n\t\t// compute the bin size for a maximum bin number of 8\n\t\tdata.sort((a, b) => a - b)\n\t\tconst l = data.length\n\t\tconst min = data[0]\n\t\tconst max = data[l - 1]\n\t\tconst p5idx = Math.ceil(l * 0.05) - 1\n\t\tconst p98idx = Math.ceil(l * 0.98) - 1\n\t\tconst p5 = data[p5idx]\n\t\tconst p98 = data[p98idx]\n\t\t// use 98th and 5th percentiles to compute bin size to reduce outlier influence\n\t\t// if 98th = 5th, use max and min instead\n\t\tconst binSize = p98 != p5 ? (p98 - p5) / 8 : (max - min) / 8\n\t\t// first bin stop will equal either (minimum + bin size) or (5th percentile), whichever is larger.\n\t\tconst firstBinStop = Math.max(min + binSize, p5)\n\t\t// round the bin values\n\t\tconst [binSize_rnd, firstBinStop_rnd, lastBinStart_rnd, rounding] = roundBinVals(binSize, firstBinStop, max, min)\n\t\t// generate the bin configuration\n\t\tbinConfig = {\n\t\t\ttype: 'regular-bin',\n\t\t\tstartinclusive: true,\n\t\t\tbin_size: binSize_rnd,\n\t\t\tfirst_bin: { stop: firstBinStop_rnd }\n\t\t}\n\t\tif (lastBinStart_rnd) binConfig.last_bin = { start: lastBinStart_rnd }\n\t\tif (rounding) binConfig.rounding = rounding\n\t}\n\tif ('format' in opts) {\n\t\tif (opts.format === 'string') {\n\t\t\treturn JSON.stringify(binConfig)\n\t\t} else {\n\t\t\tthrow 'options are not in the correct format'\n\t\t}\n\t} else {\n\t\treturn binConfig\n\t}\n}\n\nfunction roundBinVals(binSize, firstBinStop, max, min) {\n\tlet binSize_rnd, firstBinStop_rnd, lastBinStart_rnd, rounding\n\tconst log = Math.floor(Math.log10(binSize))\n\tif (binSize >= 0.1 && binSize <= 2) {\n\t\t// Round to the nearest one for small bin sizes\n\t\tbinSize_rnd = Math.round(binSize / (1 * 10 ** log)) * (1 * 10 ** log)\n\t\tfirstBinStop_rnd = Math.round(firstBinStop / (1 * 10 ** log)) * (1 * 10 ** log)\n\t} else {\n\t\t// Round to the nearest five for large bin sizes\n\t\tbinSize_rnd = Math.round(binSize / (5 * 10 ** log)) * (5 * 10 ** log)\n\t\tfirstBinStop_rnd = Math.round(firstBinStop / (5 * 10 ** log)) * (5 * 10 ** log)\n\t\tif (binSize_rnd === 0) binSize_rnd = 1 * 10 ** log\n\t\tif (firstBinStop_rnd === 0) firstBinStop_rnd = 1 * 10 ** log\n\t\tif (binSize_rnd === 5 * 10 ** log && firstBinStop_rnd === 1 * 10 ** log) firstBinStop_rnd = 5 * 10 ** log\n\t}\n\tif (firstBinStop_rnd < min) firstBinStop_rnd = firstBinStop_rnd * 2\n\t// if the number of bins is above 8 after rounding, then set the last bin start to restrict the number of bins to 8\n\tconst eighthBinStop_rnd = firstBinStop_rnd + binSize_rnd * 7\n\tif (max > eighthBinStop_rnd) {\n\t\tlastBinStart_rnd = firstBinStop_rnd + binSize_rnd * 6\n\t}\n\tif (binSize < 1) {\n\t\tconst digits = Math.abs(log)\n\t\tbinSize_rnd = Number(binSize_rnd.toFixed(digits))\n\t\tfirstBinStop_rnd = Number(firstBinStop_rnd.toFixed(digits))\n\t\tif (lastBinStart_rnd) lastBinStart_rnd = Number(lastBinStart_rnd.toFixed(digits))\n\t\trounding = '.' + digits + 'f'\n\t}\n\tif (Object.is(firstBinStop_rnd, -0)) firstBinStop_rnd = 0\n\treturn [binSize_rnd, firstBinStop_rnd, lastBinStart_rnd, rounding]\n}\n", "import { isNumericTerm } from './terms.js'\nimport { TermTypes, SINGLECELL_CELLTYPE, SINGLECELL_GENE_EXPRESSION, ISOFORM_EXPRESSION } from '#types'\n\nexport const graphableTypes = new Set([\n\t'categorical',\n\t'integer',\n\t'float',\n\t'condition',\n\t'survival',\n\t'snplst',\n\t'snplocus',\n\t'geneVariant',\n\t'samplelst',\n\t'geneExpression',\n\tISOFORM_EXPRESSION,\n\t'dtcnv',\n\t'dtsnvindel',\n\t'dtfusion',\n\t'dtsv',\n\t'date',\n\tTermTypes.SSGSEA,\n\tTermTypes.DNA_METHYLATION,\n\tTermTypes.METABOLITE_INTENSITY,\n\tTermTypes.PROTEOME_ABUNDANCE,\n\tTermTypes.PSEUDOBULK,\n\tTermTypes.JUNCTION,\n\tSINGLECELL_GENE_EXPRESSION,\n\tSINGLECELL_CELLTYPE,\n\tTermTypes.SINGLECELL_NUMERIC_VALUE,\n\tTermTypes.SNP,\n\tTermTypes.TERM_COLLECTION,\n\tTermTypes.COHORT,\n\tTermTypes.MULTIVALUE\n])\n\n/*\nisUsableTerm() will\n\n\t- centralize the \"allowed term\" logic\n\twhich can be intricate or dataset-specific \n\tfor certain terms or contexts\n\t- make it easy to handle new term types\n\nArguments:\n\n\tterm {}\n\t\t.type: 'categorical', etc.\n\t\t.child_types: []\n\t\n\t_usecase {}\n\t\t.target (REQUIRED): 'barchart', 'regression', etc\n\t\t\t- used as a switch-case \"router\" for additional use-specific logic\n\t\t\t- other parameters, if applicable, are described in the route \"handler\" \n\t\t.detail \n\t\t - a more specific detailed use case\n\t\n\n\ttermdbConfig\n\t\toptional. provides ds overrides on default rules via excludedTermtypeByTarget. for use on client\n\n\tds\n\t\toptional. provides ds overrides when the function runs on backend\n\t\tserver-side dataset object that can supply overrides (in the form of functions) to the use case logic,\n\t\tfor example, to apply role-based allowed term uses or performance-related restrictions\n\t\tto ancestor terms when a use case aggregates too many data points for a given chart type\n\nReturns\n\n\ta Set{} with zero or more of the following strings:\n\t- 'plot' if the term can be used in a plot chartType\n\t- 'branch' if the term can be used only as an expandable tree branch, but not in a plot\n\t- an empty Set means that the term has no valid uses, i.e, it cannot be used either for plotting or as a tree branch\n*/\nexport function isUsableTerm(term: any, _usecase: any, termdbConfig?: any, ds?: any) {\n\tconst usecase = _usecase || {}\n\n\t// may apply dataset specific override filter for a use case\n\tif (typeof ds?.usecase?.[usecase.target] == 'function') {\n\t\treturn ds.usecase[usecase.target](term, usecase)\n\t}\n\n\t// if (term.isprivate && !user.roleCanUse(term)) return false\n\n\tconst uses = new Set()\n\t// note: expects term.child_types to be null if term.isleaf == true\n\tconst child_types = term.child_types || []\n\t// default handling\n\tswitch (usecase.target) {\n\t\tcase 'barchart':\n\t\tcase 'violin':\n\t\tcase 'boxplot':\n\t\tcase 'summary': {\n\t\t\t// multivalue is excluded as overlay (term2): a sample can belong to multiple\n\t\t\t// categories, which inflates stacked segments past the bar's sample count and\n\t\t\t// invalidates the term1-term2 association tests. it remains allowed as term1\n\t\t\t// and as divide-by (term0), where each chart is a self-contained subset\n\t\t\tconst excluded = usecase.detail == 'term2' ? ['survival', 'multivalue'] : ['survival']\n\t\t\tif (term.type && !excluded.includes(term.type)) uses.add('plot')\n\t\t\tif (hasAllowedChildTypes(child_types, excluded)) uses.add('branch')\n\t\t\treturn uses\n\t\t}\n\n\t\tcase 'summaryInput':\n\t\t\tif (usecase.detail === 'term2' || usecase.detail == 'term0') {\n\t\t\t\t// same overlay exclusion as the barchart/violin/boxplot/summary case above\n\t\t\t\tconst excluded = usecase.detail === 'term2' ? ['survival', 'multivalue'] : ['survival']\n\t\t\t\tif (term.type && !excluded.includes(term.type)) uses.add('plot')\n\t\t\t\tif (hasAllowedChildTypes(child_types, excluded)) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t} else {\n\t\t\t\tif (graphableTypes.has(term.type)) uses.add('plot')\n\t\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t}\n\n\t\tcase 'matrix':\n\t\t\tif (term.type) uses.add('plot')\n\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\treturn uses\n\n\t\tcase 'table':\n\t\t\tif (usecase.detail == 'term') uses.add('plot')\n\t\t\tif (child_types.length > 1) uses.add('branch')\n\t\t\treturn uses\n\n\t\tcase 'sampleScatter':\n\t\t\tif (usecase.detail == 'numeric') {\n\t\t\t\tif (isNumericTerm(term)) {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (hasNumericChild(child_types)) uses.add('branch')\n\t\t\t}\n\t\t\t// Commenting out for now. May need later for another single\n\t\t\t// cell term. Revisit logic at that time.\n\t\t\t// else if (usecase?.specialCase?.type == 'singleCell') {\n\t\t\t// \t\tif (term.type && term.type.startsWith('singleCell')) {\n\t\t\t// \t\t\tif (term.plot && term.plot == usecase.specialCase?.config.name) {\n\t\t\t// \t\t\t\tuses.add('plot')\n\t\t\t// \t\t\t}\n\t\t\t// \t\t}\n\t\t\t// }\n\t\t\telse {\n\t\t\t\t// multivalue is excluded: a sample belonging to multiple categories\n\t\t\t\t// cannot be assigned a single color/shape\n\t\t\t\tif (graphableTypes.has(term.type) && term.type != 'multivalue') uses.add('plot')\n\t\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\t}\n\t\t\treturn uses\n\t\tcase 'runChart2':\n\t\t\tif (usecase.detail == 'date' || usecase.detail == 'xtw') {\n\t\t\t\tif (term.type == 'date') {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (child_types.includes('date')) uses.add('branch')\n\t\t\t} else if (usecase.detail == 'numeric') {\n\t\t\t\tif (isNumericTerm(term) && term.type != 'date') {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (hasNumericChild(child_types)) uses.add('branch')\n\t\t\t} else {\n\t\t\t\t// multivalue is excluded: overlapping categories are not supported by this chart\n\t\t\t\tif (graphableTypes.has(term.type) && term.type != 'multivalue') uses.add('plot')\n\t\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\t}\n\t\t\treturn uses\n\n\t\tcase 'numericDictTermCluster':\n\t\t\tif (!usecase.detail?.exclude?.includes(term.id)) {\n\t\t\t\tif (isNumericTerm(term)) {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (hasNumericChild(child_types)) {\n\t\t\t\t\tuses.add('branch')\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn uses\n\n\t\tcase 'termCollections':\n\t\t\tif (usecase.detail?.termIds?.includes(term.id)) uses.add('plot')\n\t\t\tif (usecase.detail?.branchIds?.includes(term.id)) uses.add('branch')\n\t\t\treturn uses\n\n\t\tcase 'profileForms':\n\t\t\tif (!term.isleaf) {\n\t\t\t\tconst ancestors = term.id.split('__').length //depends on using the __ naming convension!\n\t\t\t\tif (ancestors == 3) {\n\t\t\t\t\t// 3rd level term is a domain, we show the templates associated to this domain\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t} else if (ancestors < 3) uses.add('branch')\n\t\t\t}\n\t\t\treturn uses\n\n\t\t// case 'boxplot':\n\t\t// \tif (term.type == 'float' || term.type == 'integer') uses.add('plot')\n\t\t// \tif (usecase.detail === 'term2' && hasNumericChild(child_types)) uses.add('branch')\n\t\t// \treturn uses\n\n\t\tcase 'cuminc':\n\t\t\tif (usecase.detail == 'term') {\n\t\t\t\tif (term.type == 'condition') uses.add('plot')\n\t\t\t\tif (child_types.includes('condition')) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t}\n\t\t\tif (usecase.detail === 'term2' || usecase.detail == 'term0') {\n\t\t\t\t// multivalue is excluded: a sample can belong to multiple groups at once,\n\t\t\t\t// which would place it on multiple incidence curves and invalidate group comparison\n\t\t\t\tif (term.type && term.type != 'condition' && term.type != 'survival' && term.type != 'multivalue')\n\t\t\t\t\tuses.add('plot')\n\t\t\t\tif (hasAllowedChildTypes(child_types, ['condition', 'survival', 'multivalue'])) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t}\n\t\t\treturn uses\n\n\t\tcase 'survival':\n\t\t\tif (usecase.detail == 'term') {\n\t\t\t\tif (term.type == 'survival') uses.add('plot')\n\t\t\t\tif (child_types.includes('survival')) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t}\n\t\t\tif (usecase.detail === 'term2' || usecase.detail == 'term0') {\n\t\t\t\t// multivalue is excluded: overlapping group membership would place a sample\n\t\t\t\t// on multiple survival curves and invalidate group comparison\n\t\t\t\tif (term.type && term.type != 'survival' && term.type != 'multivalue') uses.add('plot')\n\t\t\t\tif (hasAllowedChildTypes(child_types, ['survival', 'multivalue'])) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t}\n\t\t\treturn uses\n\n\t\tcase 'regression':\n\t\t\tif (usecase.detail == 'outcome') {\n\t\t\t\tif (usecase.regressionType == 'linear') {\n\t\t\t\t\tif (term.type == 'float' || term.type == 'integer') uses.add('plot')\n\t\t\t\t\tif (hasNumericChild(child_types)) uses.add('branch')\n\t\t\t\t\treturn uses\n\t\t\t\t}\n\t\t\t\tif (usecase.regressionType == 'logistic') {\n\t\t\t\t\t// multivalue is excluded: overlapping group membership cannot define a binary outcome\n\t\t\t\t\tif (term.type && term.type != 'survival' && term.type != 'multivalue') uses.add('plot')\n\t\t\t\t\tif (hasAllowedChildTypes(child_types, ['survival', 'multivalue'])) uses.add('branch')\n\t\t\t\t\treturn uses\n\t\t\t\t} else if (usecase.regressionType == 'cox') {\n\t\t\t\t\tif (term.type == 'condition' || term.type == 'survival') uses.add('plot')\n\t\t\t\t\tif (child_types.includes('condition') || child_types.includes('survival')) uses.add('branch')\n\t\t\t\t\treturn uses\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (usecase.detail == 'independent') {\n\t\t\t\t/* a term collection holds one value per member term, which is not a model variable.\n\t\t\t\tonly a numeric collection is offered, and only as a fraction: selecting it opens the\n\t\t\t\tnumerator/denominator chooser (client/termdb/handlers/termCollectionFractionSelection.ts),\n\t\t\t\twhich reduces the collection to one numeric value per sample. a categorical collection\n\t\t\t\thas no such scalar form. the outcome is excluded above: it must be a dictionary term,\n\t\t\t\tas enforced by TermdbVocab.getRegressionData() */\n\t\t\t\tif (term.type == TermTypes.TERM_COLLECTION) {\n\t\t\t\t\t// memberType is read directly: isNumTermCollection() does not yet test it\n\t\t\t\t\tif (term.memberType == 'numeric') uses.add('plot')\n\t\t\t\t\treturn uses\n\t\t\t\t}\n\t\t\t\tif (term.type == 'float' || term.type == 'integer' || term.type == 'categorical' || term.type == 'samplelst')\n\t\t\t\t\tuses.add('plot')\n\t\t\t\tif (hasChildTypes(child_types, ['categorical', 'float', 'integer'])) uses.add('branch')\n\t\t\t\treturn uses\n\t\t\t}\n\t\t\treturn uses\n\n\t\tcase 'filter': {\n\t\t\t// apply \"exlst\" to other targets as needed\n\t\t\tconst exlst = termdbConfig?.excludedTermtypeByTarget?.filter\n\t\t\tif (exlst) {\n\t\t\t\tif (graphableTypes.has(term.type) && !exlst.includes(term.type)) uses.add('plot')\n\t\t\t\tif (child_types.find((t: any) => !exlst.includes(t))) uses.add('branch') // there's a non-excluded child type, allow branch to show\n\t\t\t\treturn uses\n\t\t\t}\n\t\t\t// no specific rule for filter. use default rules\n\t\t\tif (graphableTypes.has(term.type)) uses.add('plot')\n\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\treturn uses\n\t\t}\n\n\t\tcase 'correlationVolcano':\n\t\t\tif (usecase.detail == 'numeric') {\n\t\t\t\tif (isNumericTerm(term)) {\n\t\t\t\t\tuses.add('plot')\n\t\t\t\t}\n\t\t\t\tif (hasNumericChild(child_types)) uses.add('branch')\n\t\t\t} else {\n\t\t\t\t// multivalue is excluded: overlapping categories are not supported by this chart\n\t\t\t\tif (graphableTypes.has(term.type) && term.type != 'multivalue') uses.add('plot')\n\t\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\t}\n\t\t\treturn uses\n\n\t\tcase 'proteinView':\n\t\t\tif (term.type == TermTypes.PROTEOME_ABUNDANCE) uses.add('plot')\n\t\t\tif (child_types.includes(TermTypes.PROTEOME_ABUNDANCE)) uses.add('branch')\n\t\t\treturn uses\n\n\t\tcase 'brainImaging': {\n\t\t\t/* multivalue is allowed as divide-by (term0): the image route renders a sample\n\t\t\tbelonging to several categories in each of their panels. it is excluded as\n\t\t\tcolor-by (term2): one sample intensity cannot carry more than one color */\n\t\t\tconst allowMultivalue = usecase.detail == 'term0'\n\t\t\tif (graphableTypes.has(term.type) && (allowMultivalue || term.type != 'multivalue')) uses.add('plot')\n\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\treturn uses\n\t\t}\n\n\t\tcase 'dictionary':\n\t\t\t// dictionary browsing must show every graphable term, including multivalue\n\t\t\tif (graphableTypes.has(term.type)) uses.add('plot')\n\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\treturn uses\n\n\t\tdefault:\n\t\t\t/* multivalue is excluded by default: a sample can belong to multiple\n\t\t\tcategories at once, which a chart must explicitly support (see the\n\t\t\tbarchart/violin/matrix cases above). a new chart type that wants\n\t\t\tmultivalue terms must add its own case rather than rely on default */\n\t\t\tif (graphableTypes.has(term.type) && term.type != 'multivalue') uses.add('plot')\n\t\t\tif (!term.isleaf) uses.add('branch')\n\t\t\treturn uses\n\t}\n}\n\n// determine if the term has at least one child type that\n// is not excluded\nfunction hasAllowedChildTypes(child_types: string[], excluded_types: string[]) {\n\tif (!child_types.length) {\n\t\t// term does not have children\n\t\treturn false\n\t}\n\tif (!excluded_types?.length) {\n\t\t// no excluded types\n\t\treturn true\n\t}\n\tif (child_types.some(type => !excluded_types.includes(type))) {\n\t\t// at least one child type is not excluded\n\t\treturn true\n\t}\n}\n\nfunction hasNumericChild(child_types: string[]) {\n\treturn child_types.includes('float') || child_types.includes('integer')\n}\n\nfunction hasChildTypes(child_types: string[], expected_types: string[]) {\n\tfor (const a of expected_types) {\n\t\tif (child_types.includes(a)) return true\n\t}\n}\n", "/**\n * Format elapsed time in milliseconds to a human-readable string\n * Handles negative times (preserves sign) for defensive programming - useful when\n * calculating time differences that might be in the wrong order (e.g., startTime - endTime)\n * @param {number} ms - Time in milliseconds\n * @param {number} [precision=2] - Number of decimal places for seconds (optional, defaults to 2)\n * @returns {string} Formatted time string with units\n */\nexport function formatElapsedTime(ms: number | unknown, precision: number = 2): string {\n\t// Handle all invalid cases\n\tif (typeof ms !== 'number' || isNaN(ms)) {\n\t\treturn typeof ms !== 'number' ? 'Invalid time: not a number' : 'Invalid time: NaN'\n\t}\n\tif (!isFinite(ms)) {\n\t\treturn ms > 0 ? 'Infinite time' : '-Infinite time'\n\t}\n\n\t// This additional logic is for handling negative times and preserving the sign in the output\n\tconst absMs = Math.abs(ms)\n\tconst sign = ms < 0 ? '-' : ''\n\n\tif (absMs < 1e3) {\n\t\treturn `${sign}${absMs}ms`\n\t}\n\tif (absMs < 6e4) {\n\t\treturn `${sign}${(absMs / 1e3).toFixed(precision)}s`\n\t}\n\tconst minutes = Math.floor(absMs / 6e4)\n\tconst seconds = ((absMs % 6e4) / 1e3).toFixed(precision)\n\treturn `${sign}${minutes}m ${seconds}s`\n}\n", "import { vepinfo, dtsnvindel, mclassnonstandard } from './common.js'\n\nexport function parse_ANN(str, header, m) {\n\t// snpEff\n\tif (!header) {\n\t\treturn null\n\t}\n\tfor (const thisannotation of str.split(',')) {\n\t\tconst lst = thisannotation.replace(/&/g, ',').split('|')\n\n\t\tconst o: Record<string, any> = {}\n\n\t\tfor (let i = 0; i < header.length; i++) {\n\t\t\tif (lst[i]) {\n\t\t\t\to[header[i].name] = lst[i]\n\t\t\t}\n\t\t}\n\t\tif (!o.Allele) {\n\t\t\tcontinue\n\t\t}\n\t\tlet allele: any = null\n\t\tfor (const a of m.alleles) {\n\t\t\tif (a.allele == o.Allele) {\n\t\t\t\tallele = a\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif (!allele) {\n\t\t\t// cannot match to allele!!!\n\t\t\tcontinue\n\t\t}\n\t\tif (!allele.ann) {\n\t\t\tallele.ann = []\n\t\t}\n\t\tallele.ann.push(o)\n\t\to._gene = o.Gene_Name\n\t\t// isoform\n\t\tif (o.Feature_Type && o.Feature_Type == 'transcript' && o.Feature_ID) {\n\t\t\to._isoform = o.Feature_ID.split('.')[0]\n\t\t}\n\t\t// class\n\t\tif (o.Annotation) {\n\t\t\tconst [dt, cls, rank] = vepinfo(o.Annotation)\n\t\t\to._dt = dt\n\t\t\to._class = cls\n\t\t\to._csqrank = rank\n\t\t} else {\n\t\t\t// FIXME\n\t\t\to._dt = dtsnvindel\n\t\t\to._class = mclassnonstandard\n\t\t}\n\t\t// mname\n\t\tif (o['HGVS.p']) {\n\t\t\t//o._mname=decodeURIComponent(o.HGVSp.substr(o.HGVSp.indexOf(':')+1))\n\t\t\to._mname = o['HGVS.p']\n\t\t} else if (o['HGVS.c']) {\n\t\t\to._mname = o['HGVS.c']\n\t\t}\n\t}\n\treturn true\n}\n", "import { vepinfo, dtsnvindel, mclassnonstandard } from './common.js'\n/*\nparse csq field from a variant line, not header\nCSQ header must have already been parsed\n\nstr: the csq value for a vcf line\nheader: [ // something like this\n { name: 'Allele' },\n { name: 'Consequence' },\n { name: 'IMPACT' },\n { name: 'SYMBOL' },\n { name: 'Gene' },\n { name: 'Feature_type' },\n { name: 'Feature' },\n { name: 'BIOTYPE' },\n { name: 'EXON' },\n { name: 'INTRON' },\n { name: 'HGVSc' },\n { name: 'HGVSp' },\n { name: 'cDNA_position' },\n { name: 'CDS_position' },\n { name: 'Protein_position' },\n { name: 'Amino_acids' },\n { name: 'Codons' },\n { name: 'Existing_variation' },\n { name: 'DISTANCE' },\n { name: 'STRAND' },\n { name: 'FLAGS' },\n { name: 'SYMBOL_SOURCE' },\n { name: 'HGNC_ID' },\n { name: 'CANONICAL' },\n { name: 'REFSEQ_MATCH' },\n { name: 'GIVEN_REF' },\n { name: 'USED_REF' },\n { name: 'BAM_EDIT' },\n { name: 'HGVS_OFFSET' },\n { name: 'CLIN_SIG' },\n { name: 'SOMATIC' },\n { name: 'PHENO' }\n]\n\nm: {\n\tmlst[ {} ]\n\t\t.allele_original\n\t\t.csq[ {} ] // parse_CSQ will add this array to this allele\n\t\t\t._class\n\t\t\t._csqrank\n\t\t\t._dt\n\t\t\t._gene\n\t\t\t._isoform\n\t\t\t._mname\n}\n\n*/\n\nexport function parse_CSQ(str, header, m) {\n\tif (!header) {\n\t\treturn null\n\t}\n\tfor (const thisannotation of str.split(',')) {\n\t\tconst lst = thisannotation.replace(/&/g, ',').split('|')\n\n\t\tconst o: Record<string, any> = {}\n\n\t\tfor (let i = 0; i < header.length; i++) {\n\t\t\tif (lst[i]) {\n\t\t\t\to[header[i].name] = lst[i]\n\t\t\t}\n\t\t}\n\t\tif (!o.Allele) {\n\t\t\tcontinue\n\t\t}\n\t\tlet allele: any = null\n\n\t\t//////////////////////////////////////\n\t\t// NOTE\n\t\t// mds2delete\n\t\t// m.alleles[] is based on old vcf parsing and may delete?\n\t\t// latest spec is m.mlst[]\n\t\t//////////////////////////////////////\n\n\t\tfor (const a of m.mlst || m.alleles) {\n\t\t\tif (a.allele_original == o.Allele) {\n\t\t\t\tallele = a\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif (!allele) {\n\t\t\tif (o.Allele == '-') {\n\t\t\t\t// deletion\n\t\t\t\tif (m.mlst) {\n\t\t\t\t\tif (m.mlst.length == 1) {\n\t\t\t\t\t\tallele = m.mlst[0]\n\t\t\t\t\t}\n\t\t\t\t} else if (m.alleles) {\n\t\t\t\t\tif (m.alleles.length == 1) {\n\t\t\t\t\t\tallele = m.alleles[0]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (const a of m.mlst || m.alleles) {\n\t\t\t\t\tif (a.allele_original.substr(1) == o.Allele) {\n\t\t\t\t\t\t// insertion, without first padding base\n\t\t\t\t\t\tallele = a\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!allele) {\n\t\t\t\t// cannot match to allele!!!\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tif (!allele.csq) {\n\t\t\tallele.csq = []\n\t\t}\n\t\tallele.csq.push(o)\n\n\t\t// gene\n\t\to._gene = o.SYMBOL || o.Gene\n\n\t\t// isoform\n\t\tif (o.Feature_type && o.Feature_type == 'Transcript') {\n\t\t\to._isoform = o.Feature.split('.')[0] // remove version\n\t\t} else {\n\t\t\to._isoform = o._gene\n\t\t}\n\n\t\t// class\n\t\tif (o.Consequence) {\n\t\t\tconst [dt, cls, rank] = vepinfo(o.Consequence)\n\t\t\to._dt = dt\n\t\t\to._class = cls\n\t\t\to._csqrank = rank\n\t\t} else {\n\t\t\t// FIXME\n\t\t\to._dt = dtsnvindel\n\t\t\to._class = mclassnonstandard\n\t\t}\n\t\t// mname\n\t\tif (o.HGVSp) {\n\t\t\to._mname = decodeURIComponent(o.HGVSp.substr(o.HGVSp.indexOf(':') + 1))\n\t\t} else if (o.Protein_position && o.Amino_acids) {\n\t\t\to._mname = decodeURIComponent(o.Protein_position + o.Amino_acids)\n\t\t} else if (o.HGVSc) {\n\t\t\to._mname = o.HGVSc.substr(o.HGVSc.indexOf(':') + 1)\n\t\t} else if (o.Existing_variation) {\n\t\t\to._name = o.Existing_variation\n\t\t}\n\t}\n\treturn true\n}\n", "/*\nto parse a variant line, not header\n\ncannot simply slice by /[;=]/, but read char by char\ncase CLNVI=Breast_Cancer_Information_Core__(BRCA2):745-4&base_change=C_to_G;\ncase k1=v1;DB;k2=v2;\n*/\nexport function dissect_INFO(str) {\n\t//let findequal=true\n\tlet findsemicolon = false\n\tlet findequalorsemicolon = true\n\n\tlet i = 0\n\tlet idx = 0\n\n\tconst k2v = {}\n\tlet lastkey\n\n\twhile (i < str.length) {\n\t\tconst c = str[i]\n\t\tif (findequalorsemicolon) {\n\t\t\tif (c == '=') {\n\t\t\t\tfindsemicolon = true\n\t\t\t\tfindequalorsemicolon = false\n\t\t\t\tlastkey = str.substring(idx, i)\n\t\t\t\tidx = i + 1\n\t\t\t} else if (c == ';') {\n\t\t\t\t// should be a flag\n\t\t\t\tk2v[str.substring(idx, i)] = 1\n\t\t\t\tidx = i + 1\n\t\t\t}\n\t\t} else if (findsemicolon && c == ';') {\n\t\t\tfindequalorsemicolon = true\n\t\t\tfindsemicolon = false\n\t\t\tk2v[lastkey] = str.substring(idx, i)\n\t\t\tlastkey = null\n\t\t\tidx = i + 1\n\t\t}\n\t\ti++\n\t}\n\n\tconst remainstr = str.substr(idx, i)\n\tif (lastkey) {\n\t\tk2v[lastkey] = remainstr\n\t} else {\n\t\tk2v[remainstr] = 1\n\t}\n\n\treturn k2v\n}\n", "import { mclassdeletion, mclasssnv, mclassmnv, mclassinsertion, mclassnonstandard } from './common.js'\n\nexport function getVariantType(ref, alt) {\n\tif (ref.length == 1 && alt.length == 1) {\n\t\t// both alleles length of 1\n\t\tif (alt == '.') {\n\t\t\t// alt is missing\n\t\t\treturn mclassdeletion\n\t\t}\n\t\t// snv\n\t\treturn mclasssnv\n\t}\n\tif (ref.length == alt.length) return mclassmnv\n\t// FIXME only when empty length of one allele\n\tif (ref.length < alt.length) return mclassinsertion\n\tif (ref.length > alt.length) return mclassdeletion\n\treturn mclassnonstandard\n}\n", "import { mclass } from './common.js'\nimport { dissect_INFO } from './vcf.info.js'\nimport { parse_CSQ } from './vcf.csq.js'\nimport { parse_ANN } from './vcf.ann.js'\nimport { getVariantType } from './vcf.type.js'\n\n/*\nOnly for parsing vcf files\nis not involved in creating vcf tracks\n\nshared between client-server\n*/\n\n// for telling symbolic alleles e.g. <*:DEL>\nconst getallelename = new RegExp(/<(.+)>/)\n\nconst mclasslabel2key = {}\nfor (const k in mclass) {\n\tmclasslabel2key[mclass[k].label.toUpperCase()] = k\n}\n\nexport function vcfparsemeta(lines) {\n\t/*\n\tinput: array of string, as lines separated by linebreak\n\n\t##INFO for meta lines\n\t#CHROM for header, to get samples\n\n\t*/\n\n\tlet sample = []\n\tconst errlst: string[] = []\n\tconst info: Record<string, any> = {}\n\tlet hasinfo = false\n\tconst format: Record<string, any> = {}\n\tlet hasformat = false\n\n\tfor (const line of lines) {\n\t\tif (!line.startsWith('#')) {\n\t\t\tcontinue\n\t\t}\n\n\t\tif (line.startsWith('#C')) {\n\t\t\t// header, get samples\n\t\t\tsample = line.split('\\t').slice(9)\n\t\t\tcontinue\n\t\t}\n\n\t\tif (line.startsWith('##INFO')) {\n\t\t\tconst e = tohash(line.substring(8, line.length - 1), info)\n\t\t\tif (e) {\n\t\t\t\terrlst.push('INFO error: ' + e)\n\t\t\t} else {\n\t\t\t\thasinfo = true\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif (line.startsWith('##FORMAT')) {\n\t\t\tconst e = tohash(line.substring(10, line.length - 1), format)\n\t\t\tif (e) {\n\t\t\t\terrlst.push('FORMAT error: ' + e)\n\t\t\t} else {\n\t\t\t\thasformat = true\n\t\t\t}\n\t\t}\n\t}\n\n\tconst sampleobjlst: any[] = []\n\tfor (const samplename of sample) {\n\t\tconst a = { name: samplename }\n\n\t\t// this enables adding key4annotation to match with .ds.cohort.annotation\n\n\t\tsampleobjlst.push(a)\n\t}\n\n\t// reserved INFO fields\n\tif (info.CSQ) {\n\t\tconst lst = info.CSQ.Description.split(' Format: ')\n\t\tif (lst[1]) {\n\t\t\tconst lst2 = lst[1].split('|')\n\t\t\tif (lst2.length > 1) {\n\t\t\t\t// fix csq headers so to allow configuring show/hide of csq fields\n\t\t\t\tinfo.CSQ.csqheader = []\n\t\t\t\tfor (const str of lst2) {\n\t\t\t\t\tconst attr = { name: str }\n\t\t\t\t\tinfo.CSQ.csqheader.push(attr)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\terrlst.push('unknown format for CSQ header: ' + info.CSQ.Description)\n\t\t\t}\n\t\t} else {\n\t\t\terrlst.push('unknown format for CSQ header: ' + info.CSQ.Description)\n\t\t}\n\t}\n\n\tif (info.ANN) {\n\t\tconst lst = info.ANN.Description.split(\"'\")\n\t\tif (lst[1]) {\n\t\t\tconst lst2 = lst[1].split(' | ')\n\t\t\tif (lst2.length) {\n\t\t\t\tinfo.ANN.annheader = []\n\t\t\t\tfor (const s of lst2) {\n\t\t\t\t\tconst attr = { name: s }\n\t\t\t\t\tinfo.ANN.annheader.push(attr)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\terrlst.push('no \" | \" joined annotation fields for ANN (snpEff annotation): ' + info.ANN.Description)\n\t\t\t}\n\t\t} else {\n\t\t\terrlst.push('no single-quote enclosed annotation fields for ANN (snpEff annotation): ' + info.ANN.Description)\n\t\t}\n\t}\n\n\treturn [hasinfo ? info : null, hasformat ? format : null, sampleobjlst, errlst.length ? errlst : null]\n}\n\nexport function vcfparseline(line, vcf) {\n\t/*\n\tvcf, samples/info is generated by vcfparsemeta()\n\t\t.nochr BOOL\n\t\t.samples [ {} ]\n\t\t\t.name\n\t\t.info {}\n\t\t.format {}\n\n\treturn:\n\t\terror message STR\n\t\taltinvalid []\n\t\tmlst [ m ] one m per alt allele\n\t\t\tchr\n\t\t\tpos\n\t\t\tname\n\t\t\ttype\n\t\t\tref\n\t\t\talt\n\t\t\taltstr\n\t\t\tsampledata []\n\t\t\taltinfo\n\t*/\n\n\tconst lst = line.split('\\t')\n\tif (lst.length < 8) {\n\t\t// no good\n\t\treturn ['line has less than 8 fields', null, null]\n\t}\n\n\tconst rawpos = Number.parseInt(lst[2 - 1])\n\tif (!Number.isInteger(rawpos)) {\n\t\treturn ['invalid value for genomic position', null, null]\n\t}\n\n\tconst refallele = lst[4 - 1]\n\n\tconst m: Record<string, any> = {\n\t\tvcf_ID: lst[3 - 1],\n\t\tchr: (vcf.nochr ? 'chr' : '') + lst[1 - 1],\n\t\tpos: rawpos - 1,\n\t\tref: refallele,\n\t\t//refstr:refallele, // e.g. GA>GCC, ref:A, refstr:GA, \"refstr\" is required for matching in FORMAT\n\t\taltstr: lst[5 - 1],\n\t\talleles: [\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\tref allele only a placeholder, to be removed, this array only contains alt alleles\n\t\t\t\tthis is a must\n\t\t\t\talso allows GT allele index to work\n\t\t\t\t*/\n\t\t\t\tallele: refallele,\n\t\t\t\tsampledata: []\n\t\t\t}\n\t\t],\n\n\t\tinfo: {}, // locus info, do not contain allele info\n\n\t\tname: lst[3 - 1] == '.' ? null : lst[3 - 1]\n\t}\n\n\t// parse alt\n\tconst altinvalid: string[] = []\n\tfor (const alt of lst[5 - 1].split(',')) {\n\t\tconst a: Record<string, any> = {\n\t\t\tref: m.ref, // may be corrected just below!\n\t\t\tallele: alt,\n\t\t\t// 5078356.TATCAGAGAA.GGGAGGA keep original allele for matching with csq which hardcodes original allele\n\t\t\tallele_original: alt,\n\t\t\tsampledata: [],\n\t\t\t_m: m,\n\t\t\tinfo: {} // allele info, do not contain locus info\n\t\t}\n\t\tm.alleles.push(a)\n\t\tif (alt[0] == '<') {\n\t\t\t/*\n\t\t\tsymbolic allele, show text within <> as name\n\t\t\tFIXME match INFO\n\t\t\t*/\n\t\t\tconst tmp = alt.match(getallelename)\n\t\t\tif (!tmp) {\n\t\t\t\taltinvalid.push(alt)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ta.type = tmp[1]\n\n\t\t\ta.allele = tmp[1]\n\t\t\ta.issymbolicallele = true\n\t\t} else {\n\t\t\t// normal nucleotide\n\n\t\t\tconst [p, ref, alt] = correctRefAlt(m.pos, m.ref, a.allele)\n\t\t\ta.pos = p\n\t\t\ta.ref = ref\n\t\t\ta.allele = alt\n\t\t}\n\t}\n\n\tif (lst[9 - 1] && lst[10 - 1]) {\n\t\tparse_FORMAT2(lst, m, vcf)\n\t}\n\n\t/*\n\tremove ref allele so it only contain alternative alleles\n\tso that parse_INFO can safely apply Number=A fields to m.alleles\n\t*/\n\tm.alleles.shift()\n\n\t// info\n\tconst tmp = lst[8 - 1] == '.' ? [] : dissect_INFO(lst[8 - 1])\n\tlet badinfokeys: string[] = []\n\n\tif (vcf.info) {\n\t\tbadinfokeys = parse_INFO(tmp, m, vcf)\n\t} else {\n\t\t// vcf meta lines told nothing about INFO, do not parse\n\t\tm.info = tmp\n\t}\n\n\tconst mlst: any[] = []\n\tfor (const a of m.alleles) {\n\t\tconst m2: Record<string, any> = {}\n\t\tfor (const k in m) {\n\t\t\tif (k != 'alleles') {\n\t\t\t\tm2[k] = m[k]\n\t\t\t}\n\t\t}\n\t\tfor (const k in a) {\n\t\t\tif (k == 'allele') {\n\t\t\t\tm2.alt = a[k]\n\t\t\t} else if (k == 'info') {\n\t\t\t\tm2.altinfo = a[k]\n\t\t\t} else {\n\t\t\t\tm2[k] = a[k]\n\t\t\t}\n\t\t}\n\t\tif (!m2.issymbolicallele && m2.alt != 'NON_REF') {\n\t\t\tm2.type = getVariantType(m2.ref, m2.alt)\n\t\t\t/*\n\t\t\t// valid alt allele, apply Dr. J's cool method\n\t\t\tconst [p,ref,alt]=correctRefAlt(m2.pos, m2.ref, m2.alt)\n\t\t\tm2.pos=p\n\t\t\tm2.ref=ref\n\t\t\tm2.alt=alt\n\t\t\t*/\n\t\t}\n\t\tmlst.push(m2)\n\t}\n\treturn [\n\t\tbadinfokeys.length ? 'unknown info keys: ' + badinfokeys.join(',') : null,\n\t\tmlst,\n\t\taltinvalid.length > 0 ? altinvalid : null\n\t]\n}\n\nfunction correctRefAlt(p, ref, alt) {\n\t// for oligos, always trim the last identical base\n\twhile (ref.length > 1 && alt.length > 1 && ref[ref.length - 1] == alt[alt.length - 1]) {\n\t\tref = ref.substr(0, ref.length - 1)\n\t\talt = alt.substr(0, alt.length - 1)\n\t}\n\t// move position up as long as first positions are equal\n\twhile (ref.length > 1 && alt.length > 1 && ref[0] == alt[0]) {\n\t\tref = ref.substr(1)\n\t\talt = alt.substr(1)\n\t\tp++\n\t}\n\treturn [p, ref, alt]\n}\n\nfunction parse_FORMAT2(lst, m, vcf) {\n\t/*\n\tm.alleles[0] is ref allele\n\n\teach allele:\n\t\t.ref\n\t\t.allele\n\t\t.allele_original\n\t\t.sampledata[] blank array\n\t*/\n\tconst formatfields = lst[9 - 1].split(':')\n\n\tfor (let _sampleidx = 9; _sampleidx < lst.length; _sampleidx++) {\n\t\t// for each sample\n\n\t\tconst valuelst = lst[_sampleidx].split(':')\n\t\t{\n\t\t\t// tell if this sample have any data in this line (variant), if .:., then skip\n\t\t\tlet none = true\n\t\t\tfor (const v of valuelst) {\n\t\t\t\tif (v != '.') {\n\t\t\t\t\tnone = false\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (none) {\n\t\t\t\t// this sample has no format value\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t/* should create an object of {format:value} of this sample\n\t\twith this object, for each alt allele this sample has,\n\t\tput a copy in m.allele[x].sampledata[]\n\t\t*/\n\n\t\tconst sampleidx = _sampleidx - 9\n\n\t\t/*\n\t\tfor each alt allele, initialize obj of this sample and store in this allele\n\t\tlater, to iterate over format fields and put in appropriate values\n\t\tnote that this sample may not actually have this allele\n\t\t*/\n\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\tconst sobj: Record<string, any> = {}\n\t\t\tif (vcf.samples && vcf.samples[sampleidx]) {\n\t\t\t\tfor (const k in vcf.samples[sampleidx]) {\n\t\t\t\t\tsobj[k] = vcf.samples[sampleidx][k]\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsobj.name = 'missing_samplename_from_vcf_header'\n\t\t\t}\n\t\t\tm.alleles[i].sampledata.push({\n\t\t\t\tsampleobj: sobj\n\t\t\t})\n\t\t}\n\n\t\tfor (let fi = 0; fi < formatfields.length; fi++) {\n\t\t\t// for each field of this sample\n\n\t\t\tconst field = formatfields[fi]\n\t\t\tconst value = valuelst[fi]\n\t\t\tif (value == '.') {\n\t\t\t\t// no value for this field\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (field == 'GT') {\n\t\t\t\tconst splitter = value.indexOf('/') != -1 ? '/' : '|'\n\t\t\t\tlet gtsum = 0 // for calculating gtallref=true, old\n\t\t\t\tlet unknowngt = false // if any is '.', then won't calculate gtallref\n\t\t\t\tconst gtalleles: string[] = []\n\t\t\t\tfor (const i of value.split(splitter)) {\n\t\t\t\t\tif (i == '.') {\n\t\t\t\t\t\tunknowngt = true\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tconst j = Number.parseInt(i)\n\t\t\t\t\tif (Number.isNaN(j)) {\n\t\t\t\t\t\tunknowngt = true\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tgtsum += j\n\t\t\t\t\tconst ale = m.alleles[j]\n\t\t\t\t\tif (ale) {\n\t\t\t\t\t\tgtalleles.push(ale.allele)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlet gtallref = false\n\t\t\t\tif (!unknowngt) {\n\t\t\t\t\tgtallref = gtsum == 0\n\t\t\t\t}\n\n\t\t\t\tconst genotype = gtalleles.join(splitter)\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tconst ms = m.alleles[i].sampledata[m.alleles[i].sampledata.length - 1]\n\t\t\t\t\tms.GT = value\n\t\t\t\t\tms.genotype = genotype\n\t\t\t\t\tif (gtallref) {\n\t\t\t\t\t\tms.gtallref = true\n\t\t\t\t\t}\n\n\t\t\t\t\t// for mds vcf to drop out samples that do not have this alt allele\n\t\t\t\t\tms.__gtalleles = gtalleles\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// other data fields\n\t\t\tconst formatdesc = vcf.format ? vcf.format[field] : null\n\t\t\tif (!formatdesc) {\n\t\t\t\t// unspecified field, put to all alt alleles\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tm.alleles[i].sampledata[m.alleles[i].sampledata.length - 1][field] = value\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst isinteger = formatdesc.Type == 'Integer'\n\t\t\tconst isfloat = formatdesc.Type == 'Float'\n\n\t\t\tif ((formatdesc.Number && formatdesc.Number == 'R') || field == 'AD') {\n\t\t\t\t/*\n\t\t\t\tper-allele value, including ref\n\t\t\t\tv4.1 has AD not with \"R\", must process as R\n\t\t\t\t*/\n\t\t\t\tconst fvlst = value.split(',').map(i => {\n\t\t\t\t\tif (isinteger) return Number.parseInt(i)\n\t\t\t\t\tif (isfloat) return Number.parseFloat(i)\n\t\t\t\t\treturn i\n\t\t\t\t})\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tif (fvlst[i] != undefined) {\n\t\t\t\t\t\t// this allele has value\n\t\t\t\t\t\tconst m2 = m.alleles[i]\n\t\t\t\t\t\tconst m2s = m2.sampledata[m2.sampledata.length - 1]\n\t\t\t\t\t\t// use this allele's ref/alt (after nt trimming)\n\t\t\t\t\t\tm2s[field] = {}\n\t\t\t\t\t\tm2s[field][m2.ref] = fvlst[0]\n\t\t\t\t\t\tm2s[field][m2.allele] = fvlst[i]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (formatdesc.Number && formatdesc.Number == 'A') {\n\t\t\t\t// per alt-allele value\n\t\t\t\tconst fvlst = value.split(',').map(i => {\n\t\t\t\t\tif (isinteger) return Number.parseInt(i)\n\t\t\t\t\tif (isfloat) return Number.parseFloat(i)\n\t\t\t\t\treturn i\n\t\t\t\t})\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tif (fvlst[i - 1] != undefined) {\n\t\t\t\t\t\t// this allele has value\n\t\t\t\t\t\tconst m2 = m.alleles[i]\n\t\t\t\t\t\tconst m2s = m2.sampledata[m2.sampledata.length - 1]\n\t\t\t\t\t\t// use this allele's ref/alt (after nt trimming)\n\t\t\t\t\t\tm2s[field] = {}\n\t\t\t\t\t\tm2s[field][m2.allele] = fvlst[i - 1]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// otherwise, append this field to all alt\n\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\tm.alleles[i].sampledata[m.alleles[i].sampledata.length - 1][field] = value\n\t\t\t}\n\t\t}\n\t}\n\n\t// compatible with old ds: make allele2readcount from AD\n\tfor (const a of m.alleles) {\n\t\tfor (const s of a.sampledata) {\n\t\t\tif (s.AD) {\n\t\t\t\ts.allele2readcount = {}\n\t\t\t\tfor (const k in s.AD) {\n\t\t\t\t\ts.allele2readcount[k] = s.AD[k]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction tohash(s, hash) {\n\t/*\n\tparse INFO\n\t*/\n\tconst h: Record<string, any> = {},\n\t\terr: string[] = []\n\tlet prev = 0,\n\t\tprevdoublequote = false,\n\t\tk = null\n\tfor (let i = 0; i < s.length; i++) {\n\t\tif (s[i] == '\"') {\n\t\t\ti++\n\t\t\tconst thisstart = i\n\t\t\twhile (s[i] != '\"') {\n\t\t\t\ti++\n\t\t\t}\n\t\t\tif (k) {\n\t\t\t\th[k] = s.substring(thisstart, i)\n\t\t\t\tk = null\n\t\t\t} else {\n\t\t\t\terr.push('k undefined before double quotes')\n\t\t\t}\n\t\t\tprevdoublequote = true\n\t\t\tcontinue\n\t\t}\n\t\tif (s[i] == '=') {\n\t\t\tk = s.substring(prev, i)\n\t\t\tprev = i + 1\n\t\t\tcontinue\n\t\t}\n\t\tif (s[i] == ',') {\n\t\t\tif (prevdoublequote) {\n\t\t\t\tprevdoublequote = false\n\t\t\t} else {\n\t\t\t\tif (k) {\n\t\t\t\t\th[k] = s.substring(prev, i)\n\t\t\t\t\tk = null\n\t\t\t\t} else {\n\t\t\t\t\terr.push('k undefined')\n\t\t\t\t}\n\t\t\t}\n\t\t\tprev = i + 1\n\t\t\tcontinue\n\t\t}\n\t}\n\tif (k) {\n\t\th[k] = s.substring(prev)\n\t}\n\tif (h.ID) {\n\t\thash[h.ID] = h\n\t} else {\n\t\treturn 'no ID'\n\t}\n\tif (err.length) return err.join('\\n')\n}\n\nfunction parse_INFO(tmp, m, vcf) {\n\t/*\n\tthis function fills in both m.info{} and m.alleles[].info{}\n\n\tthe m.alleles[] will later be converted to [m], each carrying one alt allele\n\teach m will have .info{} for locus info, and .altinfo{} for alt allele info\n\n\t*/\n\n\tconst badinfokeys: string[] = []\n\n\tfor (const key in tmp) {\n\t\tif (vcf.info[key] == undefined) {\n\t\t\tbadinfokeys.push(key)\n\t\t\tcontinue\n\t\t}\n\n\t\tconst value = tmp[key]\n\n\t\t////////////////// hard-coded fields\n\n\t\tif (key == 'CSQ') {\n\t\t\tconst okay = parse_CSQ(value, vcf.info.CSQ.csqheader, m)\n\t\t\tif (!okay) {\n\t\t\t\tm.info[key] = value\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif (key == 'ANN') {\n\t\t\tconst okay = parse_ANN(value, vcf.info.ANN.annheader, m)\n\t\t\tif (!okay) {\n\t\t\t\tm.info[key] = value\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t////////////////// end of hardcoded fields\n\n\t\tif (vcf.info[key].Type == 'Flag') {\n\t\t\t// flag has no value\n\t\t\tm.info[key] = key\n\t\t\tcontinue\n\t\t}\n\n\t\tconst __number = vcf.info[key].Number\n\t\tconst isinteger = vcf.info[key].Type == 'Integer'\n\t\tconst isfloat = vcf.info[key].Type == 'Float'\n\n\t\tif (__number == '0') {\n\t\t\t/*\n\t\t\tno value, should be a Flag\n\t\t\t*/\n\t\t\tm.info[key] = key\n\t\t\tcontinue\n\t\t}\n\n\t\tif (__number == 'A') {\n\t\t\t/*\n\t\t\tper alt allele\n\t\t\t*/\n\t\t\tconst tt = value.split(',')\n\t\t\tfor (let j = 0; j < tt.length; j++) {\n\t\t\t\tif (m.alleles[j]) {\n\t\t\t\t\tm.alleles[j].info[key] = isinteger ? Number.parseInt(tt[j]) : isfloat ? Number.parseFloat(tt[j]) : tt[j]\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif (__number == 'R') {\n\t\t\t/*\n\t\t\tFIXME \"R\" is not considered, m.alleles only contain alt, which .info{} for each\n\t\t\tthe current datastructure does not support info for ref allele!\n\t\t\t*/\n\t\t}\n\n\t\tif (__number == '1') {\n\t\t\t/*\n\t\t\tsingle value\n\t\t\t*/\n\t\t\tm.info[key] = isinteger ? Number.parseInt(value) : isfloat ? Number.parseFloat(value) : value\n\t\t\tcontinue\n\t\t}\n\n\t\tif (!value.split) {\n\t\t\t// unknown error\n\t\t\tcontinue\n\t\t}\n\n\t\t// number of values unknown, \"commas are permitted only as delimiters for lists of values\"\n\n\t\tconst lst = value.split(',') // value is always array!!\n\t\tif (isinteger) {\n\t\t\tm.info[key] = lst.map(Number.parseInt)\n\t\t} else if (isfloat) {\n\t\t\tm.info[key] = lst.map(Number.parseFloat)\n\t\t} else {\n\t\t\tm.info[key] = lst\n\t\t}\n\t}\n\treturn badinfokeys\n}\n", "import { select } from 'd3-selection'\n//import { dofetch3 } from './dofetch'\n\nlet jwtByDsRoute\n\nfunction setJwtByDsRoute() {\n\tif (jwtByDsRoute) return\n\tconst jwtByDsRouteStr = localStorage.getItem('jwtByDsRoute') || `{}`\n\tjwtByDsRoute = JSON.parse(jwtByDsRouteStr)\n}\n\n/*\n\tsetTokenByDsRoute() sets this storage item:\n\n\tjwtByDsRoute = {\n\t\t[dslabel]: { // the dataset that is being protected, should match one of the serverconfig.dsCredentials key\n\t\t\t[route]: // the route that is being protected, should match one of the serverconfig.dsCredentials[dslabel] key\n\t\t\t\t\"...jwt...string...\" // ProteinPaint-issued jwt from a `/jwt-status` or `/dslogin` response, \n\t\t\t\t // which also includes dslabel and route to use as nested keys for this jwtByDsRoute\n\t\t}\n\t}\n\t\n\tNote that jwtByDsRoute does not have a nesting level of embedder, unlike serverconfig.dsCredentials, since\n\tthe embedder is detected directly from the winddow.location.hostname.\n\n\tThe stored token will be submitted as part of Vocab.mayGetAuthHeaders() or getSavedToken().\n*/\nexport function setTokenByDsRoute(dslabel, route, jwt) {\n\tsetJwtByDsRoute()\n\tif (!jwtByDsRoute[dslabel]) jwtByDsRoute[dslabel] = {}\n\tif (jwt) jwtByDsRoute[dslabel][route] = jwt\n\telse delete jwtByDsRoute[dslabel][route]\n\tlocalStorage.setItem('jwtByDsRoute', JSON.stringify(jwtByDsRoute))\n}\n\n// get jwt string directly from localStorage/jwtByDsRoute tracking object\nexport function getSavedToken(dslabel, route) {\n\tsetJwtByDsRoute()\n\treturn jwtByDsRoute[dslabel]?.[route] || jwtByDsRoute[dslabel]?.['/**']\n}\n\nexport function mayAddJwtToRequest(init, body, url) {\n\tif (init.headers.authorization) return\n\tlet dslabel = body?.dslabel // || body.mass?.vocab.dslabel || body.tracks?.find(t => t.dslabel)?.dslabel\n\tif (!dslabel) {\n\t\tconst param = url\n\t\t\t.split('?')[1]\n\t\t\t?.split('&')\n\t\t\t.find(kv => kv.includes('dslabel'))\n\t\tif (!param) return\n\t\tlet value = decodeURIComponent(param.split('=')[1])\n\t\tif (value.startsWith('{') && value.endsWith('}')) {\n\t\t\tvalue = JSON.parse(value)\n\t\t\tdslabel = value.dslabel || value.mass?.vocab.dslabel || value.tracks?.find(t => t.dslabel)?.dslabel\n\t\t} else {\n\t\t\tdslabel = value\n\t\t}\n\t}\n\tsetJwtByDsRoute()\n\tif (!dslabel || !jwtByDsRoute[dslabel]) return\n\tconst h = url.split('//')\n\tconst postProtocolStr = h[1] || h[0] // handle a url such as '://something.abc'\n\tconst preQuestionMarkStr = postProtocolStr.split('?')[0]\n\tconst pathSegments = preQuestionMarkStr.split('/')\n\tlet route = pathSegments.find(p => p != '' && !p.includes(':') && !p.includes('.'))\n\t// TODO: should not have to do this hardcoded mapping, ideally routes that are\n\t// protected together will share the same initial path segment\n\n\tconst jwt = jwtByDsRoute[dslabel][route] || jwtByDsRoute[dslabel]['/**']\n\tif (jwt) init.headers.authorization = 'Bearer ' + btoa(jwt)\n}\n\nconst dsAuthOk = new Set()\nlet dsAuth, authUi, authUiHolder\n\nexport let includeEmbedder = false\n\n/*\n\topts{}\n\t.dsAuth: required, array of dataset names that require login\n\t.authUi: optional, a custom login UI function to launch as needed\n\t.holder: optional, a d3-wrapped selection to hold the auth UI\n*/\nexport async function setDsAuthOk(opts) {\n\tdsAuth = opts.dsAuth\n\tauthUi = opts.ui || defaultAuthUi\n\tauthUiHolder = opts.holder || select('body')\n\tfor (const auth of dsAuth) {\n\t\t// fillin all the dslabels that has an active session\n\t\t// so that an unnecessary login form will not be shown\n\t\tif (auth.insession) dsAuthOk.add(auth)\n\t\t// defer the check for saved jwtByDsRoute to isInSession(),\n\t\t// so that there are no confusing multiple /jwt-status requests\n\t\t// in the Network requests tab in simulated demoToken usage\n\t\t// which is only one dslabel at a time\n\t}\n\tincludeEmbedder = opts.dsAuth?.length > 0 || false\n}\n\nexport function getRequiredAuth(dslabel, route) {\n\tif (!dsAuth || !Array.isArray(dsAuth)) return\n\tfor (const a of dsAuth) {\n\t\t// wildcard route '*' is transformed by server auth.js into '/**' to support glob-pattern matching,\n\t\t// since a single character '*' is interpreted by glob as a file, so need to also detect '/**' route\n\t\tif (a.dslabel == dslabel && (a.route == route || a.route == '*' || a.route == '/**')) return a\n\t}\n}\n\n// check if a user is logged in, usually checked together with requiredAuth in termdb/config,\n// so access to unprotected ds/routes should not be affected by this check\nexport async function isInSession(dslabel, route) {\n\tif (!dslabel) return false\n\tif (!Array.isArray(dsAuth)) return false\n\tfor (const a of dsAuth) {\n\t\tif (a.dslabel != dslabel || (a.route != route && a.route != '/**')) continue\n\t\tif (dsAuthOk.has(a)) return true\n\t\t// TODO: for auth.type == 'jwt', consider migrating to always using getDatasetAccessToken()\n\t\t// instead of saving a session jwt in localStorage\n\t\tif (a.checked /*|| a.type == 'jwt'*/) return false\n\t\t// for other auth types like basic (password login), recover related saved jwt that\n\t\t// allows one-time sign-in throughout a user's browser session;\n\t\t// check if there is a PP-server generated session token that has been saved from a previous login\n\t\tconst jwt = getSavedToken(dslabel, a.route)\n\t\tif (!jwt) return false\n\t\tconst { dofetch3 } = await import('./dofetch')\n\t\tconst payload = decodeJwtPayload(jwt)\n\t\tif (payload.exp && Math.ceil(Date.now() / 1000) > payload.exp) return false\n\t\tconst data = await dofetch3('/jwt-status', {\n\t\t\tmethod: 'POST',\n\t\t\tcredentials: 'include',\n\t\t\theaders: {\n\t\t\t\t//authorization: `Bearer ${btoa(jwt)}`\n\t\t\t\t[a.headerKey]: jwt\n\t\t\t},\n\t\t\tbody: {\n\t\t\t\tdslabel,\n\t\t\t\troute,\n\t\t\t\tembedder: location.hostname\n\t\t\t}\n\t\t})\n\t\ta.checked = true\n\t\tif (data.ok || data.status == 'ok') {\n\t\t\tdsAuthOk.add(a)\n\t\t\ta.insession = true\n\t\t\treturn true\n\t\t}\n\t}\n\t// no matching sessions found for this dslabel and route\n\treturn false\n}\n\n/* \n\tmayShowAuthUi() is the client-side \"gatekeeper\"\n\tmethod to check if a dataset requires credentials\n*/\n\nexport async function mayShowAuthUi(init, path, opts = {}) {\n\tconst ok = { status: 'ok' }\n\tif (!dsAuth || path.endsWith('jwt-status')) return ok\n\n\tconst body = JSON.parse(init.body || `{}`)\n\tconst params = (path.split('?')[1] || '').split('&').reduce((obj, kv) => {\n\t\tconst [key, value] = kv.split('=')\n\t\tobj[key] = value\n\t\treturn obj\n\t}, {})\n\tconst q = Object.assign({}, body, params)\n\tconst route = ((path.split('?')[0] || '').split('//')[1] || '').split('/').slice(1).join('/')\n\n\tfor (const a of dsAuth) {\n\t\tif (q.dslabel == a.dslabel && (a.route == '/**' || route == a.route)) {\n\t\t\tif (dsAuthOk.has(a)) return ok\n\t\t\t// dofetch should show the authUi only when all routes ('/**') are protected\n\t\t\t// otherwise, the authUi should be opened only when requesting data from a protected route,\n\t\t\t// that will be determined within feature code such as for 'termdb', 'burden', etc\n\t\t\telse if (a.route != '/**') return ok\n\t\t\telse if (a.type == 'basic') return await authUi(a.dslabel, a, opts)\n\t\t\telse if (a.type == 'jwt') {\n\t\t\t\t// assume the embedder/portal provides the login UI\n\t\t\t\t// so no need to do anything here\n\t\t\t} else if (a.type == 'forbidden') {\n\t\t\t\talert('Forbidden access')\n\t\t\t\t// don't do anything\n\t\t\t} else throw `unsupported dsAuth type='${a.type}'`\n\t\t}\n\t}\n\treturn ok\n}\n\n/*\n\tthis is the default login UI, may be overriden\n\tby an optional different form, for example if PP \n\tis embedded in another portal\n*/\nasync function defaultAuthUi(dslabel, auth, opts = {}) {\n\tconst mask = authUiHolder\n\t\t.append('div')\n\t\t.style('position', 'fixed')\n\t\t.style('top', 0)\n\t\t.style('left', 0)\n\t\t.style('height', '100%')\n\t\t.style('width', '100%')\n\t\t.style('margin', 0)\n\t\t.style('padding', '20px')\n\t\t.style('background-color', 'rgb(150,150,150)')\n\n\tconst form = mask.append('div').style('opacity', 1)\n\tform.append('div').html(`Restricted dataset '${dslabel}'`)\n\tform.append('span').html('Please enter password ')\n\n\tconst pwd = form.append('input').attr('type', 'password')\n\tpwd.node().focus()\n\n\tconst btn = form.append('button').html('Submit')\n\n\treturn new Promise((resolve, reject) => {\n\t\tfunction login() {\n\t\t\tfetch('/dslogin', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\tauthorization: `Basic ${btoa(pwd.property('value'))}`\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({ dslabel, route: auth.route, embedder: window.location.hostname })\n\t\t\t})\n\t\t\t\t.then(res => res.json())\n\t\t\t\t.then(res => {\n\t\t\t\t\tif (res.error) throw res.error\n\n\t\t\t\t\tmask.remove()\n\t\t\t\t\tdsAuthOk.add(auth)\n\t\t\t\t\tif (res.jwt) {\n\t\t\t\t\t\tsetTokenByDsRoute(dslabel, res.route, res.jwt)\n\t\t\t\t\t}\n\t\t\t\t\tif (!opts.setDomRefs) window.location.reload()\n\t\t\t\t\telse resolve(dslabel)\n\t\t\t\t})\n\t\t\t\t.catch(e => {\n\t\t\t\t\talert('login error: ' + e)\n\t\t\t\t\t// allow to reuse the login UI, do not hide or reject\n\t\t\t\t\t// mask.remove()\n\t\t\t\t\t// reject(e)\n\t\t\t\t})\n\t\t}\n\t\tbtn.on('click', login)\n\t\tpwd.on('change', login)\n\n\t\tif (opts.setDomRefs)\n\t\t\topts.setDomRefs({\n\t\t\t\tpwd,\n\t\t\t\tbtn,\n\t\t\t\tmask,\n\t\t\t\tauthUiHolder\n\t\t\t})\n\t})\n}\n\nfunction decodeJwtPayload(token) {\n\t// 1. Split the token into its 3 parts (header, payload, signature)\n\tconst base64Url = token.split('.')[1]\n\t// 2. Convert Base64Url to standard Base64\n\tconst base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/')\n\tconst paddedBase64 = base64 + '='.repeat((4 - (base64.length % 4)) % 4)\n\t// 3. Decode the Base64 string and parse it as JSON\n\tconst jsonPayload = decodeURIComponent(window.atob(paddedBase64).split('').map(convertAtoBresult).join(''))\n\treturn JSON.parse(jsonPayload)\n}\n\nfunction convertAtoBresult(c) {\n\treturn '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)\n}\n", "import { deepFreeze, sleep } from '#rx'\nimport { encode, getDataName, processResponse } from '#shared'\nimport { mayShowAuthUi, mayAddJwtToRequest, includeEmbedder, setDsAuthOk } from './auth.js'\nexport * from './auth.js'\nexport { processFormData } from '#shared'\n\n/*\n\tpath: URL\n\targ: HTTP request body\n\topts: see dofetch2() opts argument\n*/\nexport function dofetch(path, arg, opts = null) {\n\tif (opts && typeof opts == 'object') {\n\t\tif (opts.serverData && typeof opts.serverData == 'object') {\n\t\t\tif (!dofetch.serverData) {\n\t\t\t\tdofetch.serverData = opts.serverData\n\t\t\t} else if (!opts.serverData) {\n\t\t\t\topts.serverData = dofetch.serverData\n\t\t\t}\n\t\t}\n\t\treturn dofetch2(\n\t\t\tpath,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'content-type': 'application/json'\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(arg)\n\t\t\t},\n\t\t\topts\n\t\t)\n\t} else {\n\t\t// path should be \"path\" but not \"/path\"\n\t\tif (path[0] == '/') {\n\t\t\tpath = path.slice(1)\n\t\t}\n\n\t\tconst jwt = sessionStorage.getItem('jwt')\n\t\tif (jwt) {\n\t\t\targ.jwt = jwt\n\t\t}\n\n\t\tlet url = path\n\t\tconst host = sessionStorage.getItem('hostURL') || window.testHost || ''\n\t\tif (host) {\n\t\t\t// hostURL can end with / or not, must use 'host/path'\n\t\t\tif (host.endsWith('/')) {\n\t\t\t\turl = host + path\n\t\t\t} else {\n\t\t\t\turl = host + '/' + path\n\t\t\t}\n\t\t}\n\n\t\treturn fetch(\n\t\t\tnew Request(url, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'content-type': 'application/json'\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(arg)\n\t\t\t})\n\t\t).then(r => r.json())\n\t}\n}\n\nexport function dofetch2(path, init = {}, opts = {}) {\n\t/*\n\tpath\"\" string URL path\n\n\tinit{}\n\t\twill be supplied as the second argument to\n\t\tthe native fetch api, so the method, headers, body\n\t\tmay be optionally supplied in the \"init\" argument\n\t\tsee https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n\n\topts{}: all other optional arguments that are not related to the native fetch init argument\n\t\t.serverData{} an object for caching fetch Promise \n\t*/\n\t// path should be \"path\" but not \"/path\"\n\tif (path[0] == '/') {\n\t\tpath = path.slice(1)\n\t}\n\n\tlet url = path\n\tconst host = sessionStorage.getItem('hostURL') || window.testHost || ''\n\tif (host) {\n\t\t// hostURL can end with / or not, must use 'host/path'\n\t\tif (host.endsWith('/')) {\n\t\t\turl = host + path\n\t\t} else {\n\t\t\turl = host + '/' + path\n\t\t}\n\t}\n\n\t// create a reference to be able to detect body params, easier than\n\t// getting params once converted to a URL\n\tconst body = init.body || {}\n\t// this may convert a GET into a POST method, and\n\t// encode the payload either in the URL or request body\n\turl = mayAdjustRequest(url, init)\n\n\tif (!init.headers) {\n\t\tinit.headers = {}\n\t}\n\n\tif (!init.headers['content-type'] && init.body) {\n\t\tinit.headers['content-type'] = 'application/json'\n\t}\n\n\t// this jwt is site-wide for a particular PP host, not dslabel-specific\n\tconst jwt = sessionStorage.getItem('jwt')\n\tif (jwt) {\n\t\tinit.headers.authorization = 'Bearer ' + jwt\n\t}\n\n\t/*\n\t\tthis is client-side \"gatekeeper\", will not proceed\n\t\tto the usual request handling unless no credentials\n\t\tare required or a valid session has already been established\n\t*/\n\treturn mayShowAuthUi(init, url).then(async () => {\n\t\tif (!jwt) mayAddJwtToRequest(init, body, url)\n\t\tif (opts.serverData) {\n\t\t\treturn namedFetch(url, init, opts)\n\t\t} else {\n\t\t\treturn fetch(url, init).then(processResponse)\n\t\t}\n\t})\n}\n\n// key: opts.serverData object\n// value: array of cached dataNames\nconst optsServerDataNames = new WeakMap() // do not prevent garbage collection of unneeded opts.serverData in consumer code\n/*\n\tnamedFetch()\n\t- opts.serverData is expected to cache response by computed data name\n\t- preserves the caching expectations from \n\t\n\topts{}\n\tserverData: optional plain object to store response by dataName (string) keys\n\t\t- if a computed dataName is found as a key in this object, the cached response will be reused to fulfill the fetch\n\t\t- note that the plain object as storage is to support legacy dofetch code\n*/\nexport async function namedFetch(url, init, opts = {}) {\n\tif (!opts.serverData) throw `use ezFetch() from fetch-helpers if a fetched response is not meant to be cached`\n\tif (typeof opts.serverData != 'object') throw `opts.serverData is not an object`\n\n\tlet result\n\tconst dataName = await getDataName(url, init)\n\tif (opts.serverData[dataName]) {\n\t\tif (init.signal) {\n\t\t\t// should not reuse a response if the abortController.signal option has been aborted,\n\t\t\t// sleep() below allows sufficient time for the abort() to be called in rx AppApi.dispatch() or elsewhere,\n\t\t\t// otherwise the cached response copy will be returned too soon and cause race-condition issues;\n\t\t\t// this fix is tested in hierCluster.integration.spec.js 'avoid race condition - reused fetch response cache'\n\t\t\tawait sleep(0)\n\t\t\tif (init.signal.aborted) throw `stale sequenceId`\n\t\t}\n\t\tresult = structuredClone(opts.serverData[dataName])\n\t}\n\n\tif (!result || (typeof result != 'object' && !(result instanceof Promise))) {\n\t\tdelete opts.serverData[dataName]\n\t\tresult = undefined\n\t}\n\n\tif (!result) {\n\t\ttry {\n\t\t\tconst res = await fetch(url, init)\n\t\t\tresult = await processResponse(res)\n\t\t\t// in case this fetch was cancelled with AbortController.signal,\n\t\t\t// then the result may be another Promise instead of a data object,\n\t\t\t// as observed when rapidly changing the gdc cohort filter\n\t\t\tif (typeof result == 'object' && !(result instanceof Promise)) {\n\t\t\t\t// Ignore opts.cacheAs == 'Response':\n\t\t\t\t// - per https://developer.mozilla.org/en-US/docs/Web/API/Response/clone,\n\t\t\t\t// **should not use (.clone) to read very large bodies in parallel** at different speeds,\n\t\t\t\t// may also mean(?) to not persist/store the Response for a long time as is being done here\n\t\t\t\t//\n\t\t\t\t// - Make decoded caching as default, since storing as a\n\t\t\t\t// fetch Response interface can be problematic when a opts.signal is aborted\n\t\t\t\t// after being reused as an option to different fetch requests. Calling signal.abort()\n\t\t\t\t// will cause res.clone() to fail in all requests that reuse the signal.\n\t\t\t\t//\n\t\t\t\tdeepFreeze(result)\n\t\t\t\topts.serverData[dataName] = result // store as a deeply frozen object\n\t\t\t\t// should prefer to store results as a deeply frozen object instead of a Response interface,\n\t\t\t\t// but must not return the same object to be reused by different requests\n\t\t\t\tresult = structuredClone(result)\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tdelete opts.serverData[dataName]\n\t\t\tthrow e\n\t\t}\n\t}\n\n\t// manage opts.serverData cache size\n\tif (!optsServerDataNames.has(opts.serverData)) optsServerDataNames.set(opts.serverData, [])\n\tconst keys = optsServerDataNames.get(opts.serverData)\n\tconst i = keys.indexOf(dataName)\n\tif (i > 0) {\n\t\t// move this cached response as the most recent entry, by object key\n\t\tkeys.splice(i, 1)\n\t}\n\tkeys.unshift(dataName)\n\tconst maxKeys = 360\n\twhile (keys.length > maxKeys) {\n\t\tconst oldestDataKey = keys.pop() // delete the dataName from the tracking array\n\t\tdelete opts.serverData[oldestDataKey]\n\t}\n\treturn result\n}\n\nconst defaultServerDataCache = {}\n/*\n\tThis is a convenience function that sets a default serverData object\n\tand init.signal (AbortSignal) option to dofetch2(), instead of\n\trequiring consumer code to call dofetch2() directly with those options.\n\n\tpath: request url\n\tinit: native fetch init option\n\topts: dofetch2() 3rd argument, options that are not related to native fetch\t\n*/\nexport function dofetch3(path, init = {}, opts = {}) {\n\t// may set a default init.signal if missing;\n\t// The AbortSignal can cancel any request due to an app state change, such as\n\t// when the GDC cohort changes, thus aborting stale data requests that may\n\t// result in misleading rendered plots. This approach is more reliable than\n\t// requiring consumer code that use vocabApi methods to supply an\n\t// init.signal option, or for a vocabApi method to supply a default\n\t// init.signal.\n\t//\n\t// 'this' is a Vocab or TermdbVocab instance, where the Vocab constructor sets a\n\t// this.dofetch3 method that has access to a plot-level or app-level getAbortSignal.\n\t// In Javascript, a function that's attached to an object and called as\n\t// object.method() will have its `this` context set to the object that it's\n\t// attached to.\n\tif (!init.signal && this) {\n\t\tinit.signal = this.getAbortSignal?.() || this.app?.getAbortSignal?.()\n\t}\n\n\topts.serverData = defaultServerDataCache\n\treturn dofetch2(path, init, opts)\n}\n\nexport function clearServerDataCache(opts = {}) {\n\tconst cache = opts?.serverData || defaultServerDataCache\n\tif (!cache) return\n\tfor (const k of Object.keys(cache)) {\n\t\tdelete cache[k]\n\t}\n}\n\nconst urlMaxLength = 2000 // if a GET url is longer than this, will be converted to POST of the same route\n\n/*\t\n\turl: full request url with host/path\n\n\tinit {}\n\t\tsame as the init argument for dofetch2\n\t\twill be supplied as the second argument to\n\t\tthe native fetch api, so the method, headers, body\n\t\tmay be optionally supplied in the \"init\" argument\n\t\tsee https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n*/\nfunction mayAdjustRequest(url, init) {\n\tconst hostname = window.location.hostname\n\tconst method = (init.method && init.method.toUpperCase()) || 'GET'\n\tif (method == 'POST') {\n\t\t// assume a minimal URL path + parameters for a POST request\n\t\t// since the payload will be in the request body\n\t\tif (typeof init.body == 'string') init.body = JSON.parse(init.body)\n\t\tif (!init.body.embedder && includeEmbedder) init.body.embedder = hostname\n\t\tinit.body = JSON.stringify(init.body)\n\t\treturn url\n\t}\n\n\tif (method != 'GET' && method != 'DELETE' && method != 'PUT') {\n\t\tthrow `unsupported init.method='${method}': must be undefined or GET or POST or DELETE or PUT`\n\t}\n\n\tif (init.body) {\n\t\t// init.body should be an object, to be converted to either\n\t\t// (a) GET URL search parameter strings, OR\n\t\t// (b) POST body, JSON-encoded\n\t\tif (!init.body.embedder && includeEmbedder) init.body.embedder = hostname\n\n\t\tconst params = encode(init.body)\n\t\tif (!url.includes('?')) url += '?'\n\t\turl += params\n\t}\n\n\tif (!url.includes('embedder=') && includeEmbedder) {\n\t\tconst sep = url.includes('?') ? '&' : '?'\n\t\turl += `${sep}embedder=${hostname}`\n\t}\n\n\tif (url.length < urlMaxLength) {\n\t\t// the request body has been encoded as URL parameters, so can delete it\n\t\tif (init.body) delete init.body\n\t\treturn url\n\t}\n\n\t// convert to a POST request because the URL is too long\n\t// !!! NOTE: the requested server route must support both GET and POST, for example, app.all('/route', handler)\n\tinit.method = 'POST'\n\tconst [hostpath, query] = url.split('?') // must use url but not path\n\n\tif (init.body) {\n\t\t// assumes that all or most of the url string length were from parameters in the init.body argument to dofetch2\n\t\tinit.body = JSON.stringify(init.body)\n\t} else {\n\t\t// the url parameters were provided directly in the path argument to dofetch2()\n\t\tconst params = {}\n\t\t// decode URL search parameters, if available\n\t\tif (query)\n\t\t\t// TODO: !!! use urljson.decode here !!!\n\t\t\tquery.split('&').forEach(p => {\n\t\t\t\tconst [k, v] = p.split('=')\n\t\t\t\tconst decodedVal = decodeURIComponent(v)\n\t\t\t\ttry {\n\t\t\t\t\tparams[k] = JSON.parse(decodedVal)\n\t\t\t\t} catch {\n\t\t\t\t\tparams[k] = decodedVal\n\t\t\t\t}\n\t\t\t})\n\t\tif (!params.embedder && includeEmbedder) params.embedder = hostname\n\t\tinit.body = JSON.stringify(params)\n\t}\n\n\treturn hostpath\n}\n\n// see opts argument to setDsAuthOk\nexport function setAuth(opts) {\n\tsetDsAuthOk(opts, dofetch3)\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBO,SAAS,iBAAkD,KAAU,iBAAiB,OAAyB;AACrH,QAAM,IAAI,IAAI;AACd,MAAI,IAAI,EAAG,QAAO,EAAE,KAAK,IAAI;AAE7B,QAAM,MAAM,OAAO,IAAI,CAAC,MAAM;AAE9B,QAAM,UAA+B,MAAM,CAAA,SAAQ,OAAiB,CAAA,SAAS,KAAsB;AAEnG,QAAM,MAAM,QAAQ,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC;AAC1C,QAAM,MAAM,QAAQ,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC;AAC1C,QAAM,MAAM,QAAQ,IAAI,KAAK,MAAO,IAAI,IAAK,CAAC,CAAC,CAAC;AAChD,QAAM,MAAM,QAAQ,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC;AAC7C,QAAM,MAAM,QAAQ,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC;AAC7C,QAAM,MAAM,MAAM;AAElB,MAAI,IAAY;AAChB,MAAI,QAAQ,GAAG;AACd,SAAK;AACL,SAAK;EACN,OAAO;AACN,UAAM,IAAI,IAAI,UAAU,CAAA,SAAQ,QAAQ,IAAI,IAAI,MAAM,MAAM,GAAG;AAC/D,SAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC;AAClC,UAAM,IAAI,IAAI,UAAU,CAAA,SAAQ,QAAQ,IAAI,IAAI,MAAM,MAAM,GAAG;AAC/D,SAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC;EAC3C;AACA,QAAM,MAAM,iBACT,CAAC,IACD,IAAI,OAAO,CAAA,SAAQ,QAAQ,IAAI,IAAI,MAAM,MAAM,OAAO,QAAQ,IAAI,IAAI,MAAM,MAAM,GAAG;AACxF,SAAO,EAAE,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI;AACpD;;;ACrCO,SAAS,eAAe,QAAQ;AACtC,MAAI,CAAC,QAAQ;AACZ,WAAO;EACR;AACA,QAAMA,mBAAkB,CAAC;AACzB,aAAW,KAAY,QAAQ;AAC9B,IAAAA,iBAAuB,OAAO,CAAC,EAAE,MAAM,YAAY,CAAC,IAAI;EACzD;AACA,SAAO;IACN;IACA,iBAAAA;IACA,MAAM,CAAC;IACP,gBAAgB,CAAC;;;IAEjB,YAAY,CAAC;;;IAGb,MAAM;IACN,aAAa;;IACb,KAAK;MACJ,QAAQ;MACR,QAAQ;MACR,UAAU,CAAC;;;MAGX,UAAU;MACV,QAAQ;IACT;IACA,QAAQ;MACP,QAAQ;MACR,QAAQ;MACR,UAAU,CAAC;IACZ;IACA,QAAQ;MACP,QAAQ;MACR,QAAQ;MACR,UAAU,CAAC;MACX,UAAU,CAAC;IACZ;IACA,IAAI;MACH,QAAQ;MACR,QAAQ;MACR,UAAU,CAAC;MACX,UAAU,CAAC;IACZ;IACA,KAAK;MACJ,QAAQ;MACR,QAAQ;MACR,UAAU,CAAC;IACZ;IACA,KAAK;MACJ,QAAQ;MACR,QAAQ;MACR,UAAU,CAAC;IACZ;IACA,KAAK;MACJ,QAAQ;MACR,QAAQ;MACR,UAAU,CAAC;IACZ;IACA,YAAY;MACX,QAAQ;MACR,QAAQ;MACR,UAAU,CAAC;IACZ;EACD;AACD;AAEO,SAAS,YAAY,GAAG,MAAM,GAAG,KAAK;AAC5C,MAAI,gBAAuB;AAC3B,MAAI,EAAE,YAAY;AACjB,UAAM,IAAI,EAAE,WAAW,YAAY;AACnC,YAAQ,GAAG;MACV,KAAK;AACJ,wBAAuB;AACvB;MACD,KAAK;AACJ,wBAAuB;AACvB;MACD,KAAK;MACL,KAAK;AACJ;IACF;AACA,QAAI,EAAE,QAAQ;AACb,UAAI,EAAE,SAAS;MAEf,OAAO;AACN,UAAE,UAAU,EAAE,SAAS,MAAM,EAAE;MAChC;IACD,OAAO;AACN,UAAI,EAAE,SAAS;AACd,UAAE,SAAS,EAAE,UAAU,MAAM,EAAE;MAChC,OAAO;MAEP;IACD;EACD,OAAO;AACN,QAAI,EAAE,SAAS;AACd,UAAI,EAAE,QAAQ;AACb,UAAE,aAAa,EAAE;MAClB,OAAO;AACN,UAAE,SAAS,EAAE,aAAa,EAAE;MAC7B;IACD,OAAO;AACN,UAAI,EAAE,QAAQ;AACb,UAAE,aAAa,EAAE;MAClB,OAAO;MAEP;IACD;EACD;AACA,MAAI,EAAE,QAAQ;AAEb,UAAM,IAAI,EAAE,OAAO,YAAY;AAC/B,YAAQ,GAAG;MACV,KAAK;MACL,KAAK;AACJ,wBAAuB;AACvB,UAAE,SAAS;AACX;MACD,KAAK;MACL,KAAK;AACJ,wBAAuB;AACvB,UAAE,SAAS;AACX;MACD,KAAK;MACL,KAAK;AACJ,wBAAuB;AACvB,UAAE,SAAS;AACX;MACD,KAAK;MACL,KAAK;MACL,KAAK;AACJ,wBAAuB;AACvB,UAAE,SAAS;AACX;MACD,KAAK;MACL,KAAK;MACL,KAAK;AACJ,wBAAuB;AACvB;IACF;EACD;AACA,IAAE,SAAS;AAEX,MAAI,CAAC,EAAE,UAAU,CAAC,EAAE,SAAS;AAE5B;EACD;AAEA,QAAM,gBAAgB;AAEtB,MAAI,EAAE,SAAS;AACd,QAAI,CAAC,KAAK,WAAW,EAAE,OAAO,GAAG;AAChC,WAAK,WAAW,EAAE,OAAO,IAAI,CAAC;IAC/B;AACA,SAAK,WAAW,EAAE,OAAO,EAAE,EAAE,UAAU,IAAI,EAAE;EAC9C,OAAO;AACN,QAAI,CAAC,KAAK,WAAW,aAAa,GAAG;AACpC,WAAK,WAAW,aAAa,IAAI,CAAC;IACnC;AACA,SAAK,WAAW,aAAa,EAAE,EAAE,UAAU,IAAI,EAAE;EAClD;AAEA,MAAI,EAAE,QAAQ;AACb,QAAI,EAAE,SAAS;AACd,UAAI,EAAE,UAAU,KAAK,gBAAgB;AACpC,YAAI,EAAE,WAAW,KAAK,eAAe,EAAE,MAAM,GAAG;AAC/C,eAAK,IAAI,SAAS,KAAK;YACtB;YACA,2CACC,EAAE,SACF,QACA,EAAE,UACF,OACA,KAAK,eAAe,EAAE,MAAM;YAC7B;UACD,CAAC;AACD,iBAAO;QACR;MACD,OAAO;AACN,aAAK,eAAe,EAAE,MAAM,IAAI,EAAE;MACnC;IACD;EACD;AACA,SAAO;AACR;;;ACpMO,IAAM,mBAAmB;EAC/B;IACC,OAAO;IACP,OAAO;IACP,OAAO;EACR;EACA;IACC,OAAO;IACP,OAAO;IACP,OAAO;EACR;EACA;IACC,OAAO;IACP,OAAO;IACP,OAAO;EACR;EACA;IACC,OAAO;IACP,OAAO;IACP,OAAO;EACR;EACA;IACC,OAAO;IACP,OAAO;IACP,OAAO;EACR;EACA;IACC,OAAO;IACP,OAAO;IACP,OAAO;EACR;;;;;;;;;;;;;AAaD;AACO,IAAM,oBAAoB;EAChC;IACC,OAAO;IACP,OAAO;IACP,OAAO;EACR;EACA;IACC,OAAO;IACP,OAAO;IACP,OAAO;EACR;EACA;IACC,OAAO;IACP,OAAO;IACP,OAAO;EACR;EACA;IACC,OAAO;IACP,OAAO;IACP,OAAO;EACR;AACD;;;AC9De,SAAR,kBAAmC,QAAQ,YAAY,SAAS,OAAO;AAC7E,MAAI,CAAC,OAAQ,QAAO,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACxC,QAAM,QAAQ,KAAK,IAAK,aAAa,MAAO,OAAO,SAAS,CAAC;AAC7D,QAAM,QAAQ,OAAO,UAAU,KAAK,KAAK,OAAO,KAAK,IAAI,OAAO,QAAQ,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,KAAK,CAAC;AACzG,SAAO;AACR;;;ACRA,IAAM,UAAU,IAAI,YAAY;AAEhC,eAAsB,KAAK,SAAS;AACnC,QAAM,WAAW,QAAQ,OAAO,OAAO;AACvC,QAAM,aAAa,MAAM,OAAO,OAAO,OAAO,SAAS,QAAQ;AAC/D,QAAM,YAAY,MAAM,KAAK,IAAI,WAAW,UAAU,CAAC;AACvD,QAAM,UAAU,UAAU,IAAI,CAAA,MAAK,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAC3E,SAAO,YAAY,OAAO,EAAE,QAAQ,KAAK,GAAG;AAC7C;AAEA,SAAS,YAAY,QAAQ;AAC5B,SAAO;IACN,CAAC,GAAG,MAAM,EAAE;MACX,CAAC,KAAK,GAAG,MAAO,OAAO,EAAG,IAAI,IAAK,KAAK,OAAO,aAAa,SAAS,OAAO,UAAU,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI;MAC5G;IACD;EACD;AACD;;;ACwBA,IAAM,WAAW,CAAC,SAAS,QAAQ,QAAQ,WAAW;AACtD,IAAM,aAAa,CAAC,KAAK,KAAK,GAAG;AAE1B,SAAS,OAAO,WAAuB;AAC7C,QAAM,SAAgB,CAAC;AACvB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACrD,QAAI,OAAO,SAAS,YAAY,CAAC,UAAU,KAAK,KAAK,CAAC,SAAS,SAAS,KAAK,KAAK,CAAC,WAAW,SAAS,MAAM,CAAC,CAAC,GAAG;AAGjH,aAAO,KAAK,GAAG,GAAG,IAAI,mBAAmB,KAAK,CAAC,EAAE;IAClD,WAAW,UAAU,QAAW;AAC/B,aAAO,KAAK,GAAG,GAAG,IAAI,mBAAmB,KAAK,UAAU,KAAK,CAAC,CAAC,EAAE;IAClE;EACD;AACA,SAAO,OAAO,KAAK,GAAG;AACvB;;;ACaA,eAAsB,gBAAgB,GAAG;AAIxC,QAAM,KAAK,EAAE,QAAQ,IAAI,cAAc;AACvC,MAAI,CAAC,GAAI,OAAM;AACf,MAAI,GAAG,SAAS,OAAO,GAAG;AACzB,UAAM,UAAU,MAAM,EAAE,KAAK;AAK7B,WAAO;EACR;AACA,MAAI,GAAG,SAAS,OAAO,KAAK,GAAG,SAAS,OAAO,GAAG;AACjD,WAAO,EAAE,KAAK;EACf;AACA,MAAI,GAAG,SAAS,WAAW,GAAG;AAC7B,QAAI,GAAG,WAAW,qBAAqB,EAAG,QAAO,gBAAgB,CAAC;QAC7D,OAAM,yCAAyC,EAAE;EACvD;AACA,MAAI,MAAM,kCAAkC;AAC3C,WAAO,wBAAwB,CAAC;EACjC;AAGA,SAAO,EAAE,KAAK;AACf;AAeA,eAAsB,gBAAgB,KAAK;AAC1C,QAAM,OAAO,CAAC;AACd,QAAM,OAAO,MAAM,IAAI,SAAS;AAGhC,aAAW,CAAC,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG;AAC1C,QAAI,MAAM,MAAM;AAEf,WAAK,GAAG,IAAI,EAAE,SAAS,EAAE,gBAAgB,MAAM,KAAK,GAAG,MAAM,MAAM;IACpE,OAAO;AAGN,YAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,MAAM,KAAK,EAAE,MAAM,IAAI,EAAE,IAAI,KAAK,KAAK;AAClE,WAAK,GAAG,IAAI,EAAE,SAAS,EAAE,gBAAgB,mBAAmB,GAAG,KAAK;IACrE;EACD;AACA,SAAO;AACR;AAEA,eAAe,wBAAwB,GAAG;AAEzC,QAAM,SAAS,EAAE,KAAK,YAAY,IAAI,kBAAkB,CAAC;AACzD,QAAM,SAAS,OAAO,UAAU;AAChC,MAAI,UAAU,CAAC;AAEf,MAAI,SAAS;AAEb,MAAI,OAAO;AACX,SAAO,CAAC,MAAM;AACb,UAAM,aAAa,MAAM,OAAO,KAAK;AACrC,WAAO,WAAW;AAClB,QAAI,KAAM;AACV,UAAM,QAAQ,WAAW;AAGzB,cAAU;AAGV,UAAM,QAAQ,OAAO,MAAM,IAAI;AAG/B,aAAS,MAAM,IAAI,KAAK;AAGxB,eAAW,QAAQ,OAAO;AACzB,UAAI,KAAK,KAAK,GAAG;AAChB,cAAM,CAAC,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI;AACpC,YAAI,CAAC,KAAK,OAAQ,WAAU;aACvB;AACJ,gBAAM,UAAU,KAAK,IAAI;AACzB,cAAI,SAAS;AACb,qBAAW,KAAK,KAAM,UAAS,OAAO,CAAC;AACvC,iBAAO,OAAO,IAAI;QACnB;MACD;IACD;EACD;AACA,SAAO;AACR;AAUA,IAAM,gBAAgB,MAAO,KAAK;AA6HlC,eAAsB,YAAY,KAAa,MAAiC;AAE/E,QAAM,WAAW,MAAM,QAAQ,KAAK,SAAS,QAAQ,KAAK,OAAO,QAAQ,KAAK,UAAU,KAAK,OAAO;AACpG,SAAO,MAAM,KAAK,QAAQ;AAC3B;;;ACpTO,SAAS,SAAS,GAAG;AAC3B,MAAI,IAAI,IAAK,SAAQ,IAAI,KAAK,QAAQ,CAAC,IAAI;AAC3C,MAAI,IAAI,IAAK,SAAQ,IAAI,KAAK,QAAQ,CAAC,IAAI;AAC3C,MAAI,IAAI,IAAK,SAAQ,IAAI,KAAK,QAAQ,CAAC,IAAI;AAC3C,SAAO,IAAI;AACZ;;;ACYO,IAAM,uBAAuB;AAO7B,SAAS,iBAAiB,MAAM;AACtC,QAAM,MAAM,oBAAI,IAAI;AACpB,QAAM,OAAc,CAAC;AACrB,aAAW,KAAK,MAAM;AACrB,QAAI,EAAE,MAAM,OAAO;AAClB,WAAK,KAAK,CAAC;AACX;IACD;AAEA,UAAM,MAAM,EAAE,SAAS,EAAE;AACzB,QAAI,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE;EACrC;AAEA,MAAI,KAAK,QAAQ;AAChB,QAAI,OAAO,SAAS,KAAK,CAAC,EAAE,KAAK,GAAG;AAEnC,UAAI,IAAI,OAAO,KAAK,MAAM;IAC3B,OAAO;AAEN,iBAAW,KAAK,MAAM;AACrB,YAAI,CAAC,EAAE,MAAO;AACd,YAAI,IAAI,EAAE,OAAO,KAAK,IAAI,IAAI,EAAE,KAAK,KAAK,EAAE;MAC7C;IACD;EACD;AACA,SAAO,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAC3C;AAMO,SAAS,WAAW,OAAO;AACjC,QAAM,IAAI,MAAM,MAAM,oBAAoB;AAC1C,MAAI,EAAE,UAAU,GAAG;AAClB,UAAM,CAAC,KAAK,KAAK,KAAK,GAAG,IAAI;AAC7B,UAAM,MAAM,OAAO,GAAG;AACtB,QAAI,OAAO,MAAM,GAAG,EAAG,OAAM;AAC7B,WAAO,EAAE,IAAI,YAAY,GAAG,CAAC,KAAK,KAAK,KAAK,GAAG,EAAE;EAClD;AACA,MAAI,EAAE,UAAU,GAAG;AAClB,UAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,MAAM,IAAI;AAC7C,UAAM,QAAQ,OAAO,MAAM,GAC1B,OAAO,OAAO,KAAK;AACpB,QAAI,OAAO,MAAM,KAAK,KAAK,OAAO,MAAM,IAAI,EAAG,OAAM,IAAI,MAAM,kCAAkC;AACjG,UAAM,QAAQ,UAAU,KAAK,OAAO,OAAO,MAAM;AACjD,QAAI,UAAU,WAAW;AACxB,aAAO,EAAE,IAAI,OAAO,GAAG,CAAC,KAAK,OAAO,MAAM,QAAQ,KAAK,EAAE;IAC1D;AAEA,WAAO,EAAE,IAAI,OAAO,GAAG,CAAC,KAAK,OAAO,MAAM,QAAQ,KAAK,EAAE;EAC1D;AACA,MAAI,EAAE,UAAU,GAAG;AAClB,QAAI,EAAE,CAAC,KAAK,OAAO,EAAE,CAAC,KAAK,KAAK;AAE/B,YAAM,CAAC,KAAKC,MAAK,MAAM,QAAQ,KAAK,MAAM,IAAI;AAG9C,YAAM,QAAQ,mBAAmB,MAAM;AACvC,YAAM,KAAK,OAAO,GAAG;AACrB,UAAI,MAAM,QAAQ,MAAM,YAAa,OAAM;AAC3C,YAAM,MAAM,OAAO,IAAI;AACvB,UAAI,OAAO,MAAM,GAAG,EAAG,OAAM;AAC7B,YAAM,aAAa,OAAO,GAAG;AAC7B,UAAI,OAAO,MAAM,UAAU,EAAG,OAAM;AACpC,aAAO,EAAE,IAAI,GAAG,CAAC,IAAIA,MAAK,KAAK,QAAQ,YAAY,KAAK,EAAE;IAC3D;AAEA,UAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,QAAQ,MAAM,IAAI;AACrD,UAAM,QAAQ,OAAO,MAAM,GAC1B,OAAO,OAAO,KAAK;AACpB,QAAI,OAAO,MAAM,KAAK,KAAK,OAAO,MAAM,IAAI,EAAG,OAAM,IAAI,MAAM,kCAAkC;AACjG,QAAI,UAAU,WAAW;AACxB,aAAO,EAAE,IAAI,OAAO,GAAG,CAAC,KAAK,OAAO,MAAM,QAAQ,QAAQ,MAAM,EAAE;IACnE;AACA,UAAM,QAAQ,UAAU,KAAK,OAAO,OAAO,MAAM;AACjD,WAAO,EAAE,IAAI,OAAO,GAAG,CAAC,KAAK,OAAO,MAAM,QAAQ,OAAO,MAAM,EAAE;EAClE;AACA,QAAM,IAAI,MAAM,eAAe;AAChC;;;ACnGO,IAAM,cAAc;AACpB,IAAM,cAAc;AAEpB,SAAS,cAAc,KAAa,KAAoB,KAAoB;AAClF,MAAI,OAAO,QAAQ,MAAM,IAAK,QAAO;AACrC,MAAI,OAAO,QAAQ,MAAM,IAAK,QAAO;AACrC,SAAO;AACR;AAGO,SAAS,iBAAiB,UAAyB,UAAyB,KAAa,KAAa;AAC5G,SAAO,YAAY,QAAQ,YAAY,OAAO,KAAK,MAAM,OAAO;AACjE;;;ACqBe,SAAR,cAA+B,WAAsB;AAG3D,QAAM,KAAU;AAChB,MAAI,CAAC,MAAM,OAAO,OAAO,SAAU,OAAM;AAEzC,MAAI,EAAE,UAAU,IAAM,IAAiB,OAAO;AAE9C,MAAI,GAAG,QAAQ,cAAc;AAC5B,QAAI,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAG,OAAM;AAClC,QAAI,CAAC,GAAG,IAAI,OAAQ,OAAM;AAC1B,UAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,UAAM,WAAW,GAAG,IAAI,GAAG,IAAI,SAAS,CAAC;AAEzC,eAAW,OAAO,GAAG,KAAK;AACzB,UAAI,EAAE,oBAAoB,QAAQ,EAAE,mBAAmB,MAAM;AAC5D,cAAM;MACP;AAEA,UAAI,OAAO,WAAW;AACrB,YAAI,oBAAoB,OAAO,CAAC,IAAI,gBAAgB;AACnD,gBAAM;QACP;AACA,YAAI,iBAAiB;AACrB,YAAI,WAAW,KAAK;AACnB,gBAAM;QACP;AACA,YAAI,sBAAsB,KAAK;AAC9B,gBAAM;QACP;AACA,YAAI,EAAE,UAAU,MAAM;AACrB,gBAAM;QACP;AACA,YAAI,CAAC,gBAAgB,IAAI,IAAI,GAAG;AAC/B,gBAAM;QACP;MACD,WAAW,OAAO,UAAU;AAC3B,YAAI,EAAE,WAAW,MAAM;AACtB,gBAAM;QACP;AACA,YAAI,CAAC,gBAAgB,IAAI,KAAK,GAAG;AAChC,gBAAM;QACP;AACA,YAAI,mBAAmB,OAAO,CAAC,IAAI,eAAe;AACjD,gBAAM;QACP;AACA,YAAI,gBAAgB;AACpB,YAAI,UAAU,KAAK;AAClB,gBAAM;QACP;MACD,OAAO;AACN,YAAI,IAAI,kBAAkB,IAAI,eAAe;AAC5C,gBAAM;QACP;AACA,YAAI,CAAC,gBAAgB,IAAI,KAAK,EAAG,OAAM;AACvC,YAAI,CAAC,gBAAgB,IAAI,IAAI,EAAG,OAAM;MACvC;IACD;EACD,WAAW,GAAG,QAAQ,eAAe;AAEpC,QAAI,CAAC,OAAO,SAAS,GAAG,QAAQ,EAAG,OAAM;AACzC,QAAI,CAAC,GAAG,YAAY,GAAG,YAAY,EAAG,OAAM;AAE5C,QAAI,CAAC,GAAG,kBAAkB,CAAC,GAAG,eAAe;AAC5C,SAAG,iBAAiB;AACpB,SAAG,gBAAgB;IACpB;AAEA,QAAI,CAAC,GAAG,UAAW,OAAM;AACzB,QAAI,OAAO,GAAG,aAAa,SAAU,OAAM;AAC3C,QAAI,CAAC,OAAO,KAAK,GAAG,SAAS,EAAE,OAAQ,OAAM;AAE7C;AACC,YAAM,IAAI,GAAG;AACb,QAAE,iBAAiB;AAEnB,UAAI,EAAE,iBAAiB;AACtB,YAAI,CAAC,OAAO,UAAU,EAAE,eAAe,EAAG,OAAM;AAChD,YAAI,EAAE,mBAAmB,KAAK,EAAE,mBAAmB,IAAK,OAAM;MAC/D,WAAW,CAAC,OAAO,SAAS,EAAE,IAAI,GAAG;AACpC,cAAM;MACP;IACD;AAEA,QAAI,GAAG,UAAU;AAChB,YAAM,IAAI,GAAG;AAEb,UAAI,EAAE,kBAAkB;AACvB,YAAI,CAAC,OAAO,UAAU,EAAE,gBAAgB,EAAG,OAAM;AACjD,YAAI,EAAE,oBAAoB,KAAK,EAAE,oBAAoB,IAAK,OAAM;MACjE,WAAW,CAAC,OAAO,SAAS,EAAE,KAAK,GAAG;AACrC,cAAM;MACP;AAEA,QAAE,gBAAgB;AAClB,UAAI,UAAU,GAAG;AAChB,cAAM;MACP;IACD;EACD,OAAO;AACN,UAAM,2BAA2B,GAAG,IAAI;EACzC;AACD;AAEA,IAAM,aAAa;AAEZ,SAAS,aAAa,WAAsB,YAA8B,iBAAuB;AAmBvG,QAAM,KAAU;AAEhB,gBAAc,EAAE;AAChB,MAAI,GAAG,KAAK;AACX,QAAI,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAG,OAAM;AAClC,QAAI,GAAG,IAAI,SAAS,WAAY,OAAM,gCAAgC,UAAU;AAChF,oBAAgB,GAAG,GAAG;EACvB;AACA,MAAI,GAAG,QAAQ,aAAc,QAAO,KAAK,MAAM,KAAK,UAAU,GAAG,GAAG,CAAC;AACrE,MAAI,OAAO,cAAc,WAAY,OAAM;AAC3C,QAAM,cAAc,mBAAmB,EAAE;AACzC,QAAM,UAAU,WAAW,WAAW;AACtC,MAAI,CAAC,WAAW,OAAO,YAAY,SAAU,OAAM;AACnD,KAAG,UAAU,EAAE,QAAQ;AACvB,MAAI,CAAC,GAAG,kBAAmB,IAAG,oBAAoB,wBAAwB,EAAE;AAI5E,QAAM,WAAW,KAAK,MAAM,QAAQ,MAAM,GAAG,IAAI;AACjD,QAAM,UAAU,KAAK,KAAK,QAAQ,MAAM,GAAG,IAAI;AAC/C,QAAM,MAAM,GAAG,UAAU,iBACtB,WACA,GAAG,UAAU,mBACb,QAAQ,MAAM,GAAG,UAAU,gBAAgB,IAC3C,GAAG,UAAU;AAChB,MAAI,MAAM,SACT,YACA;AAED,MAAI,GAAG,UAAU;AAChB,UAAM,GAAG,SAAS,gBACf,UACA,GAAG,SAAS,kBACZ,QAAQ,MAAM,GAAG,SAAS,eAAe,IACzC,UAAU,GAAG,SAAS,IAAI,KAAK,GAAG,SAAS,QAAQ,QAAQ,MAC3D,GAAG,SAAS,OACZ;AACH,iBAAa,gBAAgB,GAAG,SAAS,gBAAgB,IACtD,QAAQ,MAAM,GAAG,SAAS,gBAAgB,IAC1C,gBAAgB,GAAG,SAAS,KAAK,IACjC,GAAG,SAAS,QACZ;AACH,gBAAY,GAAG,SAAS,gBACrB,OACA,GAAG,SAAS,kBACZ,QAAQ,MAAM,GAAG,SAAS,eAAe,IACzC,gBAAgB,GAAG,SAAS,IAAI,IAChC,GAAG,SAAS,OACZ;EACJ,WAAW,GAAG,KAAK;AAClB,UAAM,WAAW,GAAG,IAAI,GAAG,IAAI,SAAS,CAAC;AACzC,iBAAa,SAAS;AACtB,gBAAY,UAAU,YAAY,CAAC,SAAS,gBAAgB,SAAS,OAAO;AAC5E,UAAM;EACP,OAAO;AACN,iBAAa;AACb,gBAAY;EACb;AAEA,QAAM,aAAa,gBAAgB,GAAG;AACtC,QAAM,mBAAmB,gBAAgB,UAAU;AACnD,QAAM,kBAAkB,gBAAgB,SAAS;AAEjD,MAAI,CAAC,cAAc,CAAC,iBAAkB,QAAO,CAAC;AAE9C,QAAM,OAAc,CAAC;AACrB,MAAI,UAA+B;IAClC,gBAAgB,GAAG,UAAU;IAC7B,OAAO,GAAG,UAAU,iBAAiB,SAAY;IACjD,MAAM,gBAAgB,GAAG,UAAU,eAAe,IAC/C,CAAC,QAAQ,MAAM,GAAG,UAAU,eAAe,IAC3C,gBAAgB,GAAG,UAAU,IAAI,IACjC,CAAC,GAAG,UAAU,OACd,MAAM,GAAG;IACZ,gBAAgB,GAAG;IACnB,eAAe,GAAG;EACnB;AAEA,MAAI,CAAC,gBAAgB,QAAQ,IAAI,EAAG,OAAM,+CAA+C,QAAQ;AAEjG,SAAQ,cAAc,QAAQ,QAAQ,OAAS,QAAQ,kBAAkB,CAAC,KAAK,UAAW,QAAQ,eAAe;AAChH,SAAK,KAAK,OAAO;AAEjB,QAAI,QAAQ,QAAQ,KAAK;AACxB,cAAQ,gBAAgB;AACxB,UAAI,KAAK,SAAS,GAAG;AACpB,eAAO,QAAQ;MAChB;IACD;AACA,YAAQ,QAAQ,cAAc,SAAS,IAAI,eAAe;AAC1D,QAAI,QAAQ,cAAe;AAE3B,UAAM,QAAQ,QAAQ,OAAO,GAAG;AAChC,UAAM,eAAe,QAAQ;AAC7B,cAAU;MACT,gBAAgB,GAAG;MACnB,eAAe,GAAG;MAClB,OAAO;MACP,MACC,oBAAoB,gBAAgB,cAAc,QAAQ,aACvD,YACA,oBAAoB,QAAQ,cAAc,gBAAgB,aAC1D,aACA;IACL;AAEA,QAAI,QAAQ,QAAQ,KAAK;AACxB,cAAQ,OAAO;AACf,UAAI,GAAG,YAAY,GAAG,SAAS,cAAe,SAAQ,gBAAgB;AACtE,UAAI,GAAG,YAAY,GAAG,SAAS,cAAe,SAAQ,gBAAgB;IACvE;AACA,QAAI,oBAAoB,QAAQ,SAAS,YAAY;AACpD,UAAI,GAAG,YAAY,GAAG,SAAS,cAAe,SAAQ,gBAAgB;IACvE;AACA,QAAI,QAAQ,QAAQ,QAAQ,MAAM;AACjC,UAAI,oBAAoB,QAAQ,QAAQ,cAAc,GAAG,YAAY,GAAG,SAAS;AAChF,gBAAQ,gBAAgB;UACpB;IACN;AACA,QAAI,KAAK,SAAS,KAAK,YAAY;AAGlC,aAAO,QAAQ;AACf,cAAQ,gBAAgB;AACxB,cAAQ,QAAQ,cAAc,SAAS,IAAI,eAAe;AAC1D,UAAI,CAAC,KAAK,SAAS,OAAO,EAAG,MAAK,KAAK,OAAO;AAC9C,YAAM,OAAO;AAIb,YAAM,IAAI,MAAM,OAAO,yBAAyB;IACjD;EACD;AACA,SAAO,GAAG;AACV,MAAI,KAAK,SAAS,GAAG;AACpB,WAAO,KAAK,KAAK,SAAS,CAAC,EAAE;EAC9B;AACA,kBAAgB,IAAI;AACpB,SAAO;AACR;AAaO,SAAS,gBAAgB,KAAY;AAC3C,QAAM,MAAM,UAAU,IAAI,MAAM;AAChC,aAAW,CAAC,GAAG,GAAG,KAAK,IAAI,QAAQ,EAAG,KAAI,QAAQ,IAAI,OAAO,CAAC,CAAC;AAC/D,SAAO;AACR;AAEA,SAAS,wBAAwB,IAAS;AAEzC,SAAO,cAAc,KAAK,OAAO,GAAG,QAAQ,IAAI,CAAC,MAAW;AAC7D;AAEO,SAAS,cAAc,KAAU,WAAgB,iBAAuB;AAI9E,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,IAAI,MAAO,QAAO,IAAI;AAE1B,QAAM,KAAK;AACX,MAAI,CAAC,GAAG,kBAAmB,IAAG,oBAAoB,wBAAwB,EAAE;AAC5E,MAAI,CAAC,IAAI,kBAAkB,CAAC,IAAI,iBAAiB,EAAE,oBAAoB,QAAQ,EAAE,mBAAmB,MAAM;AACzG,QAAI,GAAG,eAAgB,KAAI,iBAAiB;aACnC,GAAG,cAAe,KAAI,gBAAgB;EAChD;AAEA,QAAM,QAAQ,GAAG,UAAU,UAAU,IAAI;AACzC,QAAM,OAAO,GAAG,UAAU,UAAU,IAAI;AAExC,MAAI,eAAe;AACnB,MAAI,kBAAkB,IAAI;AACzB,OAAG,uBAAuB,cAAc,MAAM,GAAG,WAAW,GAAG;AAC/D,QAAI,CAAC,GAAG,qBAAsB,gBAAe,GAAG;EACjD,WAAW,GAAG,aAAa,KAAK,GAAG,YAAY,WAAW;AACzD,mBAAe;EAChB;AAIA,MAAI,IAAI,gBAAgB;AACvB,UAAM,OAAO,IAAI,gBAAgB,WAAM;AACvC,UAAM,KAAK,kBACR,aAAa,MAAM,gBAAgB,UAAU,gBAAgB,QAAQ,gBAAgB,aAAa,IAAI,IACtG,GAAG,kBAAkB,IAAI;AAC5B,WAAO,OAAO;EACf;AAEA,MAAI,IAAI,iBAAiB,UAAU,MAAM;AACxC,UAAM,OAAO,IAAI,iBAAqC,WAAM;AAC5D,UAAM,KAAK,kBACR,aAAa,OAAO,gBAAgB,UAAU,gBAAgB,QAAQ,gBAAgB,aAAa,IAAI,IACvG,GAAG,kBAAkB,KAAK;AAC7B,WAAO,OAAO;EACf;AAGA,MAAI,gBAAgB,IAAI,kBAAkB,CAAC,IAAI,eAAe;AAC7D,QAAI,OAAO,UAAU,GAAG,QAAQ,KAAK,KAAK,IAAI,QAAQ,IAAI,MAAM,cAAc;AAE7E,aACC,MACC,kBACE,aAAa,OAAO,gBAAgB,UAAU,gBAAgB,QAAQ,gBAAgB,aAAa,IAAI,IACvG,GAAG,kBAAkB,KAAK;IAE/B,OAAO;AACN,YAAM,KAAK,kBACR,aAAa,OAAO,gBAAgB,UAAU,gBAAgB,QAAQ,gBAAgB,aAAa,IAAI,IACvG,GAAG,kBAAkB,KAAK;AAC7B,YAAM,KAAK,kBACR;QACA,OAAO;QACP,gBAAgB;QAChB,gBAAgB;QAChB,gBAAgB;QAChB;MACA,IACA,GAAG,kBAAkB,OAAO,YAAY;AAE3C,aAAO,CAAC,MAAM,CAAC,KAAK,GAAG,SAAS,IAAI,KAAK,SAAS;IACnD;EACD,OAAO;AAEN,UAAM,QAAQ,IAAI,iBAAiB,KAAK;AACxC,UAAM,QAAQ,IAAI,gBAAgB,KAAK;AACvC,UAAM,KAAK,kBACR,aAAa,OAAO,gBAAgB,UAAU,gBAAgB,QAAQ,gBAAgB,aAAa,IAAI,IACvG,OAAO,UAAU,KAAK,IACtB,QACA,GAAG,kBAAkB,KAAK;AAC7B,UAAM,KAAK,kBACR,aAAa,MAAM,gBAAgB,UAAU,gBAAgB,QAAQ,gBAAgB,aAAa,IAAI,IACtG,OAAO,UAAU,IAAI,IACrB,OACA,GAAG,kBAAkB,IAAI;AAE5B,QAAI,CAAC,MAAM,CAAC,IAAI;AACf,YAAM,OAAO,IAAI,iBAAiB,WAAM;AACxC,aAAO,OAAO;IACf,OAAO;AACN,aAAO,QAAQ,KAAK,SAAS,QAAQ;IACtC;EACD;AACD;AAIO,SAAS,uBAAuB,KAAU,WAAgB,iBAAuB;AACvF,QAAM,IAAI;AACV,MAAI;AAEJ,QAAM,OAAO,gBAAgB,GAAG;AAChC,OAAK,QAAQ;AACb,QAAM,YAAY,cAAc,MAAM,WAAW,eAAe;AAChE,MAAI,IAAI,kBAAkB,IAAI,eAAe;AAE5C,eAAW,IAAI,MAAM;EACtB,WAAW,IAAI,gBAAgB;AAE9B,eAAW,UAAU,QAAQ,QAAQ,YAAO,IAAI,IAAI;EACrD,WAAW,IAAI,eAAe;AAE7B,eAAW,UAAU,QAAQ,KAAK,EAAE,EAAE,QAAQ,MAAM,OAAO,IAAI,SAAI;EACpE;AACA,SAAO;AACR;AAEO,SAAS,mBAAmB,WAA6B;AAC/D,QAAM,cAAqB,CAAC;AAC5B,QAAM,IAAI,UAAU;AACpB,MAAI,KAAK,gBAAgB,EAAE,gBAAgB,EAAG,aAAY,KAAK,EAAE,gBAAgB;AACjF,MAAI,KAAK,gBAAgB,EAAE,eAAe,EAAG,aAAY,KAAK,EAAE,eAAe;AAC/E,QAAM,IAAI,UAAU;AACpB,MAAI,KAAK,gBAAgB,EAAE,gBAAgB,EAAG,aAAY,KAAK,EAAE,gBAAgB;AACjF,MAAI,KAAK,gBAAgB,EAAE,eAAe,EAAG,aAAY,KAAK,EAAE,eAAe;AAC/E,SAAO;AACR;;;AC1be,SAAR,cAA+B,MAAM,OAAO,CAAC,GAAG;AACtD,MAAI,CAAC,KAAK;AACT,WAAO,EAAE,MAAM,YAAY,MAAM,eAAe,gBAAgB,MAAM,UAAU,MAAM,WAAW,EAAE,MAAM,KAAK,EAAE;AACjH,MAAI,KAAK,KAAK,CAAA,MAAK,CAAC,OAAO,SAAS,CAAC,CAAC,EAAG,OAAM,IAAI,MAAM,0BAA0B;AAEnF,MAAI;AACJ,QAAM,IAAI,IAAI,IAAI,IAAI;AACtB,MAAI,EAAE,SAAS,GAAG;AAOjB,UAAM,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACtB,gBAAY;MACX,MAAM;MACN,KAAK;QACJ,EAAE,MAAM,OAAO,eAAe,OAAO,gBAAgB,MAAM,OAAO,MAAM,MAAM;QAC9E,EAAE,OAAO,OAAO,MAAM,OAAO,gBAAgB,MAAM,eAAe,MAAM,OAAO,MAAM,MAAM;QAC3F,EAAE,OAAO,OAAO,gBAAgB,OAAO,eAAe,MAAM,OAAO,MAAM,MAAM;MAChF;IACD;EACD,OAAO;AAKN,SAAK,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACzB,UAAM,IAAI,KAAK;AACf,UAAM,MAAM,KAAK,CAAC;AAClB,UAAM,MAAM,KAAK,IAAI,CAAC;AACtB,UAAM,QAAQ,KAAK,KAAK,IAAI,IAAI,IAAI;AACpC,UAAM,SAAS,KAAK,KAAK,IAAI,IAAI,IAAI;AACrC,UAAM,KAAK,KAAK,KAAK;AACrB,UAAM,MAAM,KAAK,MAAM;AAGvB,UAAM,UAAU,OAAO,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO;AAE3D,UAAM,eAAe,KAAK,IAAI,MAAM,SAAS,EAAE;AAE/C,UAAM,CAAC,aAAa,kBAAkB,kBAAkB,QAAQ,IAAI,aAAa,SAAS,cAAc,KAAK,GAAG;AAEhH,gBAAY;MACX,MAAM;MACN,gBAAgB;MAChB,UAAU;MACV,WAAW,EAAE,MAAM,iBAAiB;IACrC;AACA,QAAI,iBAAkB,WAAU,WAAW,EAAE,OAAO,iBAAiB;AACrE,QAAI,SAAU,WAAU,WAAW;EACpC;AACA,MAAI,YAAY,MAAM;AACrB,QAAI,KAAK,WAAW,UAAU;AAC7B,aAAO,KAAK,UAAU,SAAS;IAChC,OAAO;AACN,YAAM;IACP;EACD,OAAO;AACN,WAAO;EACR;AACD;AAEA,SAAS,aAAa,SAAS,cAAc,KAAK,KAAK;AACtD,MAAI,aAAa,kBAAkB,kBAAkB;AACrD,QAAM,MAAM,KAAK,MAAM,KAAK,MAAM,OAAO,CAAC;AAC1C,MAAI,WAAW,OAAO,WAAW,GAAG;AAEnC,kBAAc,KAAK,MAAM,WAAW,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM;AACjE,uBAAmB,KAAK,MAAM,gBAAgB,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM;EAC5E,OAAO;AAEN,kBAAc,KAAK,MAAM,WAAW,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM;AACjE,uBAAmB,KAAK,MAAM,gBAAgB,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM;AAC3E,QAAI,gBAAgB,EAAG,eAAc,IAAI,MAAM;AAC/C,QAAI,qBAAqB,EAAG,oBAAmB,IAAI,MAAM;AACzD,QAAI,gBAAgB,IAAI,MAAM,OAAO,qBAAqB,IAAI,MAAM,IAAK,oBAAmB,IAAI,MAAM;EACvG;AACA,MAAI,mBAAmB,IAAK,oBAAmB,mBAAmB;AAElE,QAAM,oBAAoB,mBAAmB,cAAc;AAC3D,MAAI,MAAM,mBAAmB;AAC5B,uBAAmB,mBAAmB,cAAc;EACrD;AACA,MAAI,UAAU,GAAG;AAChB,UAAM,SAAS,KAAK,IAAI,GAAG;AAC3B,kBAAc,OAAO,YAAY,QAAQ,MAAM,CAAC;AAChD,uBAAmB,OAAO,iBAAiB,QAAQ,MAAM,CAAC;AAC1D,QAAI,iBAAkB,oBAAmB,OAAO,iBAAiB,QAAQ,MAAM,CAAC;AAChF,eAAW,MAAM,SAAS;EAC3B;AACA,MAAI,OAAO,GAAG,kBAAkB,EAAE,EAAG,oBAAmB;AACxD,SAAO,CAAC,aAAa,kBAAkB,kBAAkB,QAAQ;AAClE;;;AClGO,IAAM,iBAAiB,oBAAI,IAAI;EACrC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,UAAU;EACV,UAAU;EACV,UAAU;EACV,UAAU;EACV,UAAU;EACV,UAAU;EACV;EACA;EACA,UAAU;EACV,UAAU;EACV,UAAU;EACV,UAAU;EACV,UAAU;AACX,CAAC;AAwCM,SAAS,aAAa,MAAW,UAAe,cAAoB,IAAU;AACpF,QAAM,UAAU,YAAY,CAAC;AAG7B,MAAI,OAAO,IAAI,UAAU,QAAQ,MAAM,KAAK,YAAY;AACvD,WAAO,GAAG,QAAQ,QAAQ,MAAM,EAAE,MAAM,OAAO;EAChD;AAIA,QAAM,OAAO,oBAAI,IAAI;AAErB,QAAM,cAAc,KAAK,eAAe,CAAC;AAEzC,UAAQ,QAAQ,QAAQ;IACvB,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK,WAAW;AAKf,YAAM,WAAW,QAAQ,UAAU,UAAU,CAAC,YAAY,YAAY,IAAI,CAAC,UAAU;AACrF,UAAI,KAAK,QAAQ,CAAC,SAAS,SAAS,KAAK,IAAI,EAAG,MAAK,IAAI,MAAM;AAC/D,UAAI,qBAAqB,aAAa,QAAQ,EAAG,MAAK,IAAI,QAAQ;AAClE,aAAO;IACR;IAEA,KAAK;AACJ,UAAI,QAAQ,WAAW,WAAW,QAAQ,UAAU,SAAS;AAE5D,cAAM,WAAW,QAAQ,WAAW,UAAU,CAAC,YAAY,YAAY,IAAI,CAAC,UAAU;AACtF,YAAI,KAAK,QAAQ,CAAC,SAAS,SAAS,KAAK,IAAI,EAAG,MAAK,IAAI,MAAM;AAC/D,YAAI,qBAAqB,aAAa,QAAQ,EAAG,MAAK,IAAI,QAAQ;AAClE,eAAO;MACR,OAAO;AACN,YAAI,eAAe,IAAI,KAAK,IAAI,EAAG,MAAK,IAAI,MAAM;AAClD,YAAI,CAAC,KAAK,OAAQ,MAAK,IAAI,QAAQ;AACnC,eAAO;MACR;IAED,KAAK;AACJ,UAAI,KAAK,KAAM,MAAK,IAAI,MAAM;AAC9B,UAAI,CAAC,KAAK,OAAQ,MAAK,IAAI,QAAQ;AACnC,aAAO;IAER,KAAK;AACJ,UAAI,QAAQ,UAAU,OAAQ,MAAK,IAAI,MAAM;AAC7C,UAAI,YAAY,SAAS,EAAG,MAAK,IAAI,QAAQ;AAC7C,aAAO;IAER,KAAK;AACJ,UAAI,QAAQ,UAAU,WAAW;AAChC,YAAI,cAAc,IAAI,GAAG;AACxB,eAAK,IAAI,MAAM;QAChB;AACA,YAAI,gBAAgB,WAAW,EAAG,MAAK,IAAI,QAAQ;MACpD,OAUK;AAGJ,YAAI,eAAe,IAAI,KAAK,IAAI,KAAK,KAAK,QAAQ,aAAc,MAAK,IAAI,MAAM;AAC/E,YAAI,CAAC,KAAK,OAAQ,MAAK,IAAI,QAAQ;MACpC;AACA,aAAO;IACR,KAAK;AACJ,UAAI,QAAQ,UAAU,UAAU,QAAQ,UAAU,OAAO;AACxD,YAAI,KAAK,QAAQ,QAAQ;AACxB,eAAK,IAAI,MAAM;QAChB;AACA,YAAI,YAAY,SAAS,MAAM,EAAG,MAAK,IAAI,QAAQ;MACpD,WAAW,QAAQ,UAAU,WAAW;AACvC,YAAI,cAAc,IAAI,KAAK,KAAK,QAAQ,QAAQ;AAC/C,eAAK,IAAI,MAAM;QAChB;AACA,YAAI,gBAAgB,WAAW,EAAG,MAAK,IAAI,QAAQ;MACpD,OAAO;AAEN,YAAI,eAAe,IAAI,KAAK,IAAI,KAAK,KAAK,QAAQ,aAAc,MAAK,IAAI,MAAM;AAC/E,YAAI,CAAC,KAAK,OAAQ,MAAK,IAAI,QAAQ;MACpC;AACA,aAAO;IAER,KAAK;AACJ,UAAI,CAAC,QAAQ,QAAQ,SAAS,SAAS,KAAK,EAAE,GAAG;AAChD,YAAI,cAAc,IAAI,GAAG;AACxB,eAAK,IAAI,MAAM;QAChB;AACA,YAAI,gBAAgB,WAAW,GAAG;AACjC,eAAK,IAAI,QAAQ;QAClB;MACD;AACA,aAAO;IAER,KAAK;AACJ,UAAI,QAAQ,QAAQ,SAAS,SAAS,KAAK,EAAE,EAAG,MAAK,IAAI,MAAM;AAC/D,UAAI,QAAQ,QAAQ,WAAW,SAAS,KAAK,EAAE,EAAG,MAAK,IAAI,QAAQ;AACnE,aAAO;IAER,KAAK;AACJ,UAAI,CAAC,KAAK,QAAQ;AACjB,cAAM,YAAY,KAAK,GAAG,MAAM,IAAI,EAAE;AACtC,YAAI,aAAa,GAAG;AAEnB,eAAK,IAAI,MAAM;QAChB,WAAW,YAAY,EAAG,MAAK,IAAI,QAAQ;MAC5C;AACA,aAAO;;;;;IAOR,KAAK;AACJ,UAAI,QAAQ,UAAU,QAAQ;AAC7B,YAAI,KAAK,QAAQ,YAAa,MAAK,IAAI,MAAM;AAC7C,YAAI,YAAY,SAAS,WAAW,EAAG,MAAK,IAAI,QAAQ;AACxD,eAAO;MACR;AACA,UAAI,QAAQ,WAAW,WAAW,QAAQ,UAAU,SAAS;AAG5D,YAAI,KAAK,QAAQ,KAAK,QAAQ,eAAe,KAAK,QAAQ,cAAc,KAAK,QAAQ;AACpF,eAAK,IAAI,MAAM;AAChB,YAAI,qBAAqB,aAAa,CAAC,aAAa,YAAY,YAAY,CAAC,EAAG,MAAK,IAAI,QAAQ;AACjG,eAAO;MACR;AACA,aAAO;IAER,KAAK;AACJ,UAAI,QAAQ,UAAU,QAAQ;AAC7B,YAAI,KAAK,QAAQ,WAAY,MAAK,IAAI,MAAM;AAC5C,YAAI,YAAY,SAAS,UAAU,EAAG,MAAK,IAAI,QAAQ;AACvD,eAAO;MACR;AACA,UAAI,QAAQ,WAAW,WAAW,QAAQ,UAAU,SAAS;AAG5D,YAAI,KAAK,QAAQ,KAAK,QAAQ,cAAc,KAAK,QAAQ,aAAc,MAAK,IAAI,MAAM;AACtF,YAAI,qBAAqB,aAAa,CAAC,YAAY,YAAY,CAAC,EAAG,MAAK,IAAI,QAAQ;AACpF,eAAO;MACR;AACA,aAAO;IAER,KAAK;AACJ,UAAI,QAAQ,UAAU,WAAW;AAChC,YAAI,QAAQ,kBAAkB,UAAU;AACvC,cAAI,KAAK,QAAQ,WAAW,KAAK,QAAQ,UAAW,MAAK,IAAI,MAAM;AACnE,cAAI,gBAAgB,WAAW,EAAG,MAAK,IAAI,QAAQ;AACnD,iBAAO;QACR;AACA,YAAI,QAAQ,kBAAkB,YAAY;AAEzC,cAAI,KAAK,QAAQ,KAAK,QAAQ,cAAc,KAAK,QAAQ,aAAc,MAAK,IAAI,MAAM;AACtF,cAAI,qBAAqB,aAAa,CAAC,YAAY,YAAY,CAAC,EAAG,MAAK,IAAI,QAAQ;AACpF,iBAAO;QACR,WAAW,QAAQ,kBAAkB,OAAO;AAC3C,cAAI,KAAK,QAAQ,eAAe,KAAK,QAAQ,WAAY,MAAK,IAAI,MAAM;AACxE,cAAI,YAAY,SAAS,WAAW,KAAK,YAAY,SAAS,UAAU,EAAG,MAAK,IAAI,QAAQ;AAC5F,iBAAO;QACR;MACD;AAEA,UAAI,QAAQ,UAAU,eAAe;AAOpC,YAAI,KAAK,QAAQ,UAAU,iBAAiB;AAE3C,cAAI,KAAK,cAAc,UAAW,MAAK,IAAI,MAAM;AACjD,iBAAO;QACR;AACA,YAAI,KAAK,QAAQ,WAAW,KAAK,QAAQ,aAAa,KAAK,QAAQ,iBAAiB,KAAK,QAAQ;AAChG,eAAK,IAAI,MAAM;AAChB,YAAI,cAAc,aAAa,CAAC,eAAe,SAAS,SAAS,CAAC,EAAG,MAAK,IAAI,QAAQ;AACtF,eAAO;MACR;AACA,aAAO;IAER,KAAK,UAAU;AAEd,YAAM,QAAQ,cAAc,0BAA0B;AACtD,UAAI,OAAO;AACV,YAAI,eAAe,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,SAAS,KAAK,IAAI,EAAG,MAAK,IAAI,MAAM;AAChF,YAAI,YAAY,KAAK,CAAC,MAAW,CAAC,MAAM,SAAS,CAAC,CAAC,EAAG,MAAK,IAAI,QAAQ;AACvE,eAAO;MACR;AAEA,UAAI,eAAe,IAAI,KAAK,IAAI,EAAG,MAAK,IAAI,MAAM;AAClD,UAAI,CAAC,KAAK,OAAQ,MAAK,IAAI,QAAQ;AACnC,aAAO;IACR;IAEA,KAAK;AACJ,UAAI,QAAQ,UAAU,WAAW;AAChC,YAAI,cAAc,IAAI,GAAG;AACxB,eAAK,IAAI,MAAM;QAChB;AACA,YAAI,gBAAgB,WAAW,EAAG,MAAK,IAAI,QAAQ;MACpD,OAAO;AAEN,YAAI,eAAe,IAAI,KAAK,IAAI,KAAK,KAAK,QAAQ,aAAc,MAAK,IAAI,MAAM;AAC/E,YAAI,CAAC,KAAK,OAAQ,MAAK,IAAI,QAAQ;MACpC;AACA,aAAO;IAER,KAAK;AACJ,UAAI,KAAK,QAAQ,UAAU,mBAAoB,MAAK,IAAI,MAAM;AAC9D,UAAI,YAAY,SAAS,UAAU,kBAAkB,EAAG,MAAK,IAAI,QAAQ;AACzE,aAAO;IAER,KAAK,gBAAgB;AAIpB,YAAM,kBAAkB,QAAQ,UAAU;AAC1C,UAAI,eAAe,IAAI,KAAK,IAAI,MAAM,mBAAmB,KAAK,QAAQ,cAAe,MAAK,IAAI,MAAM;AACpG,UAAI,CAAC,KAAK,OAAQ,MAAK,IAAI,QAAQ;AACnC,aAAO;IACR;IAEA,KAAK;AAEJ,UAAI,eAAe,IAAI,KAAK,IAAI,EAAG,MAAK,IAAI,MAAM;AAClD,UAAI,CAAC,KAAK,OAAQ,MAAK,IAAI,QAAQ;AACnC,aAAO;IAER;AAKC,UAAI,eAAe,IAAI,KAAK,IAAI,KAAK,KAAK,QAAQ,aAAc,MAAK,IAAI,MAAM;AAC/E,UAAI,CAAC,KAAK,OAAQ,MAAK,IAAI,QAAQ;AACnC,aAAO;EACT;AACD;AAIA,SAAS,qBAAqB,aAAuB,gBAA0B;AAC9E,MAAI,CAAC,YAAY,QAAQ;AAExB,WAAO;EACR;AACA,MAAI,CAAC,gBAAgB,QAAQ;AAE5B,WAAO;EACR;AACA,MAAI,YAAY,KAAK,CAAA,SAAQ,CAAC,eAAe,SAAS,IAAI,CAAC,GAAG;AAE7D,WAAO;EACR;AACD;AAEA,SAAS,gBAAgB,aAAuB;AAC/C,SAAO,YAAY,SAAS,OAAO,KAAK,YAAY,SAAS,SAAS;AACvE;AAEA,SAAS,cAAc,aAAuB,gBAA0B;AACvE,aAAW,KAAK,gBAAgB;AAC/B,QAAI,YAAY,SAAS,CAAC,EAAG,QAAO;EACrC;AACD;;;ACtVO,SAAS,kBAAkB,IAAsB,YAAoB,GAAW;AAEtF,MAAI,OAAO,OAAO,YAAY,MAAM,EAAE,GAAG;AACxC,WAAO,OAAO,OAAO,WAAW,+BAA+B;EAChE;AACA,MAAI,CAAC,SAAS,EAAE,GAAG;AAClB,WAAO,KAAK,IAAI,kBAAkB;EACnC;AAGA,QAAM,QAAQ,KAAK,IAAI,EAAE;AACzB,QAAM,OAAO,KAAK,IAAI,MAAM;AAE5B,MAAI,QAAQ,KAAK;AAChB,WAAO,GAAG,IAAI,GAAG,KAAK;EACvB;AACA,MAAI,QAAQ,KAAK;AAChB,WAAO,GAAG,IAAI,IAAI,QAAQ,KAAK,QAAQ,SAAS,CAAC;EAClD;AACA,QAAM,UAAU,KAAK,MAAM,QAAQ,GAAG;AACtC,QAAM,WAAY,QAAQ,MAAO,KAAK,QAAQ,SAAS;AACvD,SAAO,GAAG,IAAI,GAAG,OAAO,KAAK,OAAO;AACrC;;;AC5BO,SAAS,UAAU,KAAK,QAAQ,GAAG;AAEzC,MAAI,CAAC,QAAQ;AACZ,WAAO;EACR;AACA,aAAW,kBAAkB,IAAI,MAAM,GAAG,GAAG;AAC5C,UAAM,MAAM,eAAe,QAAQ,MAAM,GAAG,EAAE,MAAM,GAAG;AAEvD,UAAM,IAAyB,CAAC;AAEhC,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACvC,UAAI,IAAI,CAAC,GAAG;AACX,UAAE,OAAO,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;MAC1B;IACD;AACA,QAAI,CAAC,EAAE,QAAQ;AACd;IACD;AACA,QAAI,SAAc;AAClB,eAAW,KAAK,EAAE,SAAS;AAC1B,UAAI,EAAE,UAAU,EAAE,QAAQ;AACzB,iBAAS;AACT;MACD;IACD;AACA,QAAI,CAAC,QAAQ;AAEZ;IACD;AACA,QAAI,CAAC,OAAO,KAAK;AAChB,aAAO,MAAM,CAAC;IACf;AACA,WAAO,IAAI,KAAK,CAAC;AACjB,MAAE,QAAQ,EAAE;AAEZ,QAAI,EAAE,gBAAgB,EAAE,gBAAgB,gBAAgB,EAAE,YAAY;AACrE,QAAE,WAAW,EAAE,WAAW,MAAM,GAAG,EAAE,CAAC;IACvC;AAEA,QAAI,EAAE,YAAY;AACjB,YAAM,CAAC,IAAI,KAAK,IAAI,IAAI,QAAQ,EAAE,UAAU;AAC5C,QAAE,MAAM;AACR,QAAE,SAAS;AACX,QAAE,WAAW;IACd,OAAO;AAEN,QAAE,MAAM;AACR,QAAE,SAAS;IACZ;AAEA,QAAI,EAAE,QAAQ,GAAG;AAEhB,QAAE,SAAS,EAAE,QAAQ;IACtB,WAAW,EAAE,QAAQ,GAAG;AACvB,QAAE,SAAS,EAAE,QAAQ;IACtB;EACD;AACA,SAAO;AACR;;;ACLO,SAAS,UAAU,KAAK,QAAQ,GAAG;AACzC,MAAI,CAAC,QAAQ;AACZ,WAAO;EACR;AACA,aAAW,kBAAkB,IAAI,MAAM,GAAG,GAAG;AAC5C,UAAM,MAAM,eAAe,QAAQ,MAAM,GAAG,EAAE,MAAM,GAAG;AAEvD,UAAM,IAAyB,CAAC;AAEhC,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACvC,UAAI,IAAI,CAAC,GAAG;AACX,UAAE,OAAO,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;MAC1B;IACD;AACA,QAAI,CAAC,EAAE,QAAQ;AACd;IACD;AACA,QAAI,SAAc;AASlB,eAAW,KAAK,EAAE,QAAQ,EAAE,SAAS;AACpC,UAAI,EAAE,mBAAmB,EAAE,QAAQ;AAClC,iBAAS;AACT;MACD;IACD;AACA,QAAI,CAAC,QAAQ;AACZ,UAAI,EAAE,UAAU,KAAK;AAEpB,YAAI,EAAE,MAAM;AACX,cAAI,EAAE,KAAK,UAAU,GAAG;AACvB,qBAAS,EAAE,KAAK,CAAC;UAClB;QACD,WAAW,EAAE,SAAS;AACrB,cAAI,EAAE,QAAQ,UAAU,GAAG;AAC1B,qBAAS,EAAE,QAAQ,CAAC;UACrB;QACD;MACD,OAAO;AACN,mBAAW,KAAK,EAAE,QAAQ,EAAE,SAAS;AACpC,cAAI,EAAE,gBAAgB,OAAO,CAAC,KAAK,EAAE,QAAQ;AAE5C,qBAAS;AACT;UACD;QACD;MACD;AACA,UAAI,CAAC,QAAQ;AAEZ;MACD;IACD;AACA,QAAI,CAAC,OAAO,KAAK;AAChB,aAAO,MAAM,CAAC;IACf;AACA,WAAO,IAAI,KAAK,CAAC;AAGjB,MAAE,QAAQ,EAAE,UAAU,EAAE;AAGxB,QAAI,EAAE,gBAAgB,EAAE,gBAAgB,cAAc;AACrD,QAAE,WAAW,EAAE,QAAQ,MAAM,GAAG,EAAE,CAAC;IACpC,OAAO;AACN,QAAE,WAAW,EAAE;IAChB;AAGA,QAAI,EAAE,aAAa;AAClB,YAAM,CAAC,IAAI,KAAK,IAAI,IAAI,QAAQ,EAAE,WAAW;AAC7C,QAAE,MAAM;AACR,QAAE,SAAS;AACX,QAAE,WAAW;IACd,OAAO;AAEN,QAAE,MAAM;AACR,QAAE,SAAS;IACZ;AAEA,QAAI,EAAE,OAAO;AACZ,QAAE,SAAS,mBAAmB,EAAE,MAAM,OAAO,EAAE,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC;IACvE,WAAW,EAAE,oBAAoB,EAAE,aAAa;AAC/C,QAAE,SAAS,mBAAmB,EAAE,mBAAmB,EAAE,WAAW;IACjE,WAAW,EAAE,OAAO;AACnB,QAAE,SAAS,EAAE,MAAM,OAAO,EAAE,MAAM,QAAQ,GAAG,IAAI,CAAC;IACnD,WAAW,EAAE,oBAAoB;AAChC,QAAE,QAAQ,EAAE;IACb;EACD;AACA,SAAO;AACR;;;AChJO,SAAS,aAAa,KAAK;AAEjC,MAAI,gBAAgB;AACpB,MAAI,uBAAuB;AAE3B,MAAI,IAAI;AACR,MAAI,MAAM;AAEV,QAAM,MAAM,CAAC;AACb,MAAI;AAEJ,SAAO,IAAI,IAAI,QAAQ;AACtB,UAAM,IAAI,IAAI,CAAC;AACf,QAAI,sBAAsB;AACzB,UAAI,KAAK,KAAK;AACb,wBAAgB;AAChB,+BAAuB;AACvB,kBAAU,IAAI,UAAU,KAAK,CAAC;AAC9B,cAAM,IAAI;MACX,WAAW,KAAK,KAAK;AAEpB,YAAI,IAAI,UAAU,KAAK,CAAC,CAAC,IAAI;AAC7B,cAAM,IAAI;MACX;IACD,WAAW,iBAAiB,KAAK,KAAK;AACrC,6BAAuB;AACvB,sBAAgB;AAChB,UAAI,OAAO,IAAI,IAAI,UAAU,KAAK,CAAC;AACnC,gBAAU;AACV,YAAM,IAAI;IACX;AACA;EACD;AAEA,QAAM,YAAY,IAAI,OAAO,KAAK,CAAC;AACnC,MAAI,SAAS;AACZ,QAAI,OAAO,IAAI;EAChB,OAAO;AACN,QAAI,SAAS,IAAI;EAClB;AAEA,SAAO;AACR;;;AC/CO,SAAS,eAAe,KAAK,KAAK;AACxC,MAAI,IAAI,UAAU,KAAK,IAAI,UAAU,GAAG;AAEvC,QAAI,OAAO,KAAK;AAEf,aAAO;IACR;AAEA,WAAO;EACR;AACA,MAAI,IAAI,UAAU,IAAI,OAAQ,QAAO;AAErC,MAAI,IAAI,SAAS,IAAI,OAAQ,QAAO;AACpC,MAAI,IAAI,SAAS,IAAI,OAAQ,QAAO;AACpC,SAAO;AACR;;;ACHA,IAAM,gBAAgB,IAAI,OAAO,QAAQ;AAEzC,IAAM,kBAAkB,CAAC;AACzB,WAAW,KAAK,QAAQ;AACvB,kBAAgB,OAAO,CAAC,EAAE,MAAM,YAAY,CAAC,IAAI;AAClD;AAEO,SAAS,aAAa,OAAO;AASnC,MAAI,SAAS,CAAC;AACd,QAAM,SAAmB,CAAC;AAC1B,QAAM,OAA4B,CAAC;AACnC,MAAI,UAAU;AACd,QAAMC,UAA8B,CAAC;AACrC,MAAI,YAAY;AAEhB,aAAW,QAAQ,OAAO;AACzB,QAAI,CAAC,KAAK,WAAW,GAAG,GAAG;AAC1B;IACD;AAEA,QAAI,KAAK,WAAW,IAAI,GAAG;AAE1B,eAAS,KAAK,MAAM,GAAI,EAAE,MAAM,CAAC;AACjC;IACD;AAEA,QAAI,KAAK,WAAW,QAAQ,GAAG;AAC9B,YAAM,IAAI,OAAO,KAAK,UAAU,GAAG,KAAK,SAAS,CAAC,GAAG,IAAI;AACzD,UAAI,GAAG;AACN,eAAO,KAAK,iBAAiB,CAAC;MAC/B,OAAO;AACN,kBAAU;MACX;AACA;IACD;AAEA,QAAI,KAAK,WAAW,UAAU,GAAG;AAChC,YAAM,IAAI,OAAO,KAAK,UAAU,IAAI,KAAK,SAAS,CAAC,GAAGA,OAAM;AAC5D,UAAI,GAAG;AACN,eAAO,KAAK,mBAAmB,CAAC;MACjC,OAAO;AACN,oBAAY;MACb;IACD;EACD;AAEA,QAAM,eAAsB,CAAC;AAC7B,aAAW,cAAc,QAAQ;AAChC,UAAM,IAAI,EAAE,MAAM,WAAW;AAI7B,iBAAa,KAAK,CAAC;EACpB;AAGA,MAAI,KAAK,KAAK;AACb,UAAM,MAAM,KAAK,IAAI,YAAY,MAAM,WAAW;AAClD,QAAI,IAAI,CAAC,GAAG;AACX,YAAM,OAAO,IAAI,CAAC,EAAE,MAAM,GAAG;AAC7B,UAAI,KAAK,SAAS,GAAG;AAEpB,aAAK,IAAI,YAAY,CAAC;AACtB,mBAAW,OAAO,MAAM;AACvB,gBAAM,OAAO,EAAE,MAAM,IAAI;AACzB,eAAK,IAAI,UAAU,KAAK,IAAI;QAC7B;MACD,OAAO;AACN,eAAO,KAAK,oCAAoC,KAAK,IAAI,WAAW;MACrE;IACD,OAAO;AACN,aAAO,KAAK,oCAAoC,KAAK,IAAI,WAAW;IACrE;EACD;AAEA,MAAI,KAAK,KAAK;AACb,UAAM,MAAM,KAAK,IAAI,YAAY,MAAM,GAAG;AAC1C,QAAI,IAAI,CAAC,GAAG;AACX,YAAM,OAAO,IAAI,CAAC,EAAE,MAAM,KAAK;AAC/B,UAAI,KAAK,QAAQ;AAChB,aAAK,IAAI,YAAY,CAAC;AACtB,mBAAW,KAAK,MAAM;AACrB,gBAAM,OAAO,EAAE,MAAM,EAAE;AACvB,eAAK,IAAI,UAAU,KAAK,IAAI;QAC7B;MACD,OAAO;AACN,eAAO,KAAK,oEAAoE,KAAK,IAAI,WAAW;MACrG;IACD,OAAO;AACN,aAAO,KAAK,6EAA6E,KAAK,IAAI,WAAW;IAC9G;EACD;AAEA,SAAO,CAAC,UAAU,OAAO,MAAM,YAAYA,UAAS,MAAM,cAAc,OAAO,SAAS,SAAS,IAAI;AACtG;AAEO,SAAS,aAAa,MAAM,KAAK;AAwBvC,QAAM,MAAM,KAAK,MAAM,GAAI;AAC3B,MAAI,IAAI,SAAS,GAAG;AAEnB,WAAO,CAAC,+BAA+B,MAAM,IAAI;EAClD;AAEA,QAAM,SAAS,OAAO,SAAS,IAAI,IAAI,CAAC,CAAC;AACzC,MAAI,CAAC,OAAO,UAAU,MAAM,GAAG;AAC9B,WAAO,CAAC,sCAAsC,MAAM,IAAI;EACzD;AAEA,QAAM,YAAY,IAAI,IAAI,CAAC;AAE3B,QAAM,IAAyB;IAC9B,QAAQ,IAAI,IAAI,CAAC;IACjB,MAAM,IAAI,QAAQ,QAAQ,MAAM,IAAI,IAAI,CAAC;IACzC,KAAK,SAAS;IACd,KAAK;;IAEL,QAAQ,IAAI,IAAI,CAAC;IACjB,SAAS;MACR;;;;;;QAMC,QAAQ;QACR,YAAY,CAAC;MACd;IACD;IAEA,MAAM,CAAC;;IAEP,MAAM,IAAI,IAAI,CAAC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC;EAC3C;AAGA,QAAM,aAAuB,CAAC;AAC9B,aAAW,OAAO,IAAI,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG;AACxC,UAAM,IAAyB;MAC9B,KAAK,EAAE;;MACP,QAAQ;;MAER,iBAAiB;MACjB,YAAY,CAAC;MACb,IAAI;MACJ,MAAM,CAAC;;IACR;AACA,MAAE,QAAQ,KAAK,CAAC;AAChB,QAAI,IAAI,CAAC,KAAK,KAAK;AAKlB,YAAMC,OAAM,IAAI,MAAM,aAAa;AACnC,UAAI,CAACA,MAAK;AACT,mBAAW,KAAK,GAAG;AACnB;MACD;AACA,QAAE,OAAOA,KAAI,CAAC;AAEd,QAAE,SAASA,KAAI,CAAC;AAChB,QAAE,mBAAmB;IACtB,OAAO;AAGN,YAAM,CAAC,GAAG,KAAKC,IAAG,IAAI,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;AAC1D,QAAE,MAAM;AACR,QAAE,MAAM;AACR,QAAE,SAASA;IACZ;EACD;AAEA,MAAI,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG;AAC9B,kBAAc,KAAK,GAAG,GAAG;EAC1B;AAMA,IAAE,QAAQ,MAAM;AAGhB,QAAM,MAAM,IAAI,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,aAAa,IAAI,IAAI,CAAC,CAAC;AAC5D,MAAI,cAAwB,CAAC;AAE7B,MAAI,IAAI,MAAM;AACb,kBAAc,WAAW,KAAK,GAAG,GAAG;EACrC,OAAO;AAEN,MAAE,OAAO;EACV;AAEA,QAAM,OAAc,CAAC;AACrB,aAAW,KAAK,EAAE,SAAS;AAC1B,UAAM,KAA0B,CAAC;AACjC,eAAW,KAAK,GAAG;AAClB,UAAI,KAAK,WAAW;AACnB,WAAG,CAAC,IAAI,EAAE,CAAC;MACZ;IACD;AACA,eAAW,KAAK,GAAG;AAClB,UAAI,KAAK,UAAU;AAClB,WAAG,MAAM,EAAE,CAAC;MACb,WAAW,KAAK,QAAQ;AACvB,WAAG,UAAU,EAAE,CAAC;MACjB,OAAO;AACN,WAAG,CAAC,IAAI,EAAE,CAAC;MACZ;IACD;AACA,QAAI,CAAC,GAAG,oBAAoB,GAAG,OAAO,WAAW;AAChD,SAAG,OAAO,eAAe,GAAG,KAAK,GAAG,GAAG;IAQxC;AACA,SAAK,KAAK,EAAE;EACb;AACA,SAAO;IACN,YAAY,SAAS,wBAAwB,YAAY,KAAK,GAAG,IAAI;IACrE;IACA,WAAW,SAAS,IAAI,aAAa;EACtC;AACD;AAEA,SAAS,cAAc,GAAG,KAAK,KAAK;AAEnC,SAAO,IAAI,SAAS,KAAK,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,KAAK,IAAI,IAAI,SAAS,CAAC,GAAG;AACtF,UAAM,IAAI,OAAO,GAAG,IAAI,SAAS,CAAC;AAClC,UAAM,IAAI,OAAO,GAAG,IAAI,SAAS,CAAC;EACnC;AAEA,SAAO,IAAI,SAAS,KAAK,IAAI,SAAS,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AAC5D,UAAM,IAAI,OAAO,CAAC;AAClB,UAAM,IAAI,OAAO,CAAC;AAClB;EACD;AACA,SAAO,CAAC,GAAG,KAAK,GAAG;AACpB;AAEA,SAAS,cAAc,KAAK,GAAG,KAAK;AAUnC,QAAM,eAAe,IAAI,IAAI,CAAC,EAAE,MAAM,GAAG;AAEzC,WAAS,aAAa,GAAG,aAAa,IAAI,QAAQ,cAAc;AAG/D,UAAM,WAAW,IAAI,UAAU,EAAE,MAAM,GAAG;AAC1C;AAEC,UAAI,OAAO;AACX,iBAAW,KAAK,UAAU;AACzB,YAAI,KAAK,KAAK;AACb,iBAAO;AACP;QACD;MACD;AACA,UAAI,MAAM;AAET;MACD;IACD;AAOA,UAAM,YAAY,aAAa;AAO/B,aAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,QAAQ,KAAK;AAC1C,YAAM,OAA4B,CAAC;AACnC,UAAI,IAAI,WAAW,IAAI,QAAQ,SAAS,GAAG;AAC1C,mBAAW,KAAK,IAAI,QAAQ,SAAS,GAAG;AACvC,eAAK,CAAC,IAAI,IAAI,QAAQ,SAAS,EAAE,CAAC;QACnC;MACD,OAAO;AACN,aAAK,OAAO;MACb;AACA,QAAE,QAAQ,CAAC,EAAE,WAAW,KAAK;QAC5B,WAAW;MACZ,CAAC;IACF;AAEA,aAAS,KAAK,GAAG,KAAK,aAAa,QAAQ,MAAM;AAGhD,YAAM,QAAQ,aAAa,EAAE;AAC7B,YAAM,QAAQ,SAAS,EAAE;AACzB,UAAI,SAAS,KAAK;AAEjB;MACD;AAEA,UAAI,SAAS,MAAM;AAClB,cAAM,WAAW,MAAM,QAAQ,GAAG,KAAK,KAAK,MAAM;AAClD,YAAI,QAAQ;AACZ,YAAI,YAAY;AAChB,cAAM,YAAsB,CAAC;AAC7B,mBAAW,KAAK,MAAM,MAAM,QAAQ,GAAG;AACtC,cAAI,KAAK,KAAK;AACb,wBAAY;AACZ;UACD;AACA,gBAAM,IAAI,OAAO,SAAS,CAAC;AAC3B,cAAI,OAAO,MAAM,CAAC,GAAG;AACpB,wBAAY;AACZ;UACD;AACA,mBAAS;AACT,gBAAM,MAAM,EAAE,QAAQ,CAAC;AACvB,cAAI,KAAK;AACR,sBAAU,KAAK,IAAI,MAAM;UAC1B;QACD;AACA,YAAI,WAAW;AACf,YAAI,CAAC,WAAW;AACf,qBAAW,SAAS;QACrB;AAEA,cAAM,WAAW,UAAU,KAAK,QAAQ;AACxC,iBAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,QAAQ,KAAK;AAC1C,gBAAM,KAAK,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,WAAW,SAAS,CAAC;AACrE,aAAG,KAAK;AACR,aAAG,WAAW;AACd,cAAI,UAAU;AACb,eAAG,WAAW;UACf;AAGA,aAAG,cAAc;QAClB;AACA;MACD;AAGA,YAAM,aAAa,IAAI,SAAS,IAAI,OAAO,KAAK,IAAI;AACpD,UAAI,CAAC,YAAY;AAEhB,iBAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,QAAQ,KAAK;AAC1C,YAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,WAAW,SAAS,CAAC,EAAE,KAAK,IAAI;QACtE;AACA;MACD;AAEA,YAAM,YAAY,WAAW,QAAQ;AACrC,YAAM,UAAU,WAAW,QAAQ;AAEnC,UAAK,WAAW,UAAU,WAAW,UAAU,OAAQ,SAAS,MAAM;AAKrE,cAAM,QAAQ,MAAM,MAAM,GAAG,EAAE,IAAI,CAAA,MAAK;AACvC,cAAI,UAAW,QAAO,OAAO,SAAS,CAAC;AACvC,cAAI,QAAS,QAAO,OAAO,WAAW,CAAC;AACvC,iBAAO;QACR,CAAC;AACD,iBAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,QAAQ,KAAK;AAC1C,cAAI,MAAM,CAAC,KAAK,QAAW;AAE1B,kBAAM,KAAK,EAAE,QAAQ,CAAC;AACtB,kBAAM,MAAM,GAAG,WAAW,GAAG,WAAW,SAAS,CAAC;AAElD,gBAAI,KAAK,IAAI,CAAC;AACd,gBAAI,KAAK,EAAE,GAAG,GAAG,IAAI,MAAM,CAAC;AAC5B,gBAAI,KAAK,EAAE,GAAG,MAAM,IAAI,MAAM,CAAC;UAChC;QACD;AACA;MACD;AACA,UAAI,WAAW,UAAU,WAAW,UAAU,KAAK;AAElD,cAAM,QAAQ,MAAM,MAAM,GAAG,EAAE,IAAI,CAAA,MAAK;AACvC,cAAI,UAAW,QAAO,OAAO,SAAS,CAAC;AACvC,cAAI,QAAS,QAAO,OAAO,WAAW,CAAC;AACvC,iBAAO;QACR,CAAC;AACD,iBAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,QAAQ,KAAK;AAC1C,cAAI,MAAM,IAAI,CAAC,KAAK,QAAW;AAE9B,kBAAM,KAAK,EAAE,QAAQ,CAAC;AACtB,kBAAM,MAAM,GAAG,WAAW,GAAG,WAAW,SAAS,CAAC;AAElD,gBAAI,KAAK,IAAI,CAAC;AACd,gBAAI,KAAK,EAAE,GAAG,MAAM,IAAI,MAAM,IAAI,CAAC;UACpC;QACD;AACA;MACD;AAEA,eAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,QAAQ,KAAK;AAC1C,UAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,WAAW,SAAS,CAAC,EAAE,KAAK,IAAI;MACtE;IACD;EACD;AAGA,aAAW,KAAK,EAAE,SAAS;AAC1B,eAAW,KAAK,EAAE,YAAY;AAC7B,UAAI,EAAE,IAAI;AACT,UAAE,mBAAmB,CAAC;AACtB,mBAAW,KAAK,EAAE,IAAI;AACrB,YAAE,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC;QAC/B;MACD;IACD;EACD;AACD;AAEA,SAAS,OAAO,GAAGC,OAAM;AAIxB,QAAM,IAAyB,CAAC,GAC/B,MAAgB,CAAC;AAClB,MAAI,OAAO,GACV,kBAAkB,OAClB,IAAI;AACL,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAClC,QAAI,EAAE,CAAC,KAAK,KAAK;AAChB;AACA,YAAM,YAAY;AAClB,aAAO,EAAE,CAAC,KAAK,KAAK;AACnB;MACD;AACA,UAAI,GAAG;AACN,UAAE,CAAC,IAAI,EAAE,UAAU,WAAW,CAAC;AAC/B,YAAI;MACL,OAAO;AACN,YAAI,KAAK,kCAAkC;MAC5C;AACA,wBAAkB;AAClB;IACD;AACA,QAAI,EAAE,CAAC,KAAK,KAAK;AAChB,UAAI,EAAE,UAAU,MAAM,CAAC;AACvB,aAAO,IAAI;AACX;IACD;AACA,QAAI,EAAE,CAAC,KAAK,KAAK;AAChB,UAAI,iBAAiB;AACpB,0BAAkB;MACnB,OAAO;AACN,YAAI,GAAG;AACN,YAAE,CAAC,IAAI,EAAE,UAAU,MAAM,CAAC;AAC1B,cAAI;QACL,OAAO;AACN,cAAI,KAAK,aAAa;QACvB;MACD;AACA,aAAO,IAAI;AACX;IACD;EACD;AACA,MAAI,GAAG;AACN,MAAE,CAAC,IAAI,EAAE,UAAU,IAAI;EACxB;AACA,MAAI,EAAE,IAAI;AACT,IAAAA,MAAK,EAAE,EAAE,IAAI;EACd,OAAO;AACN,WAAO;EACR;AACA,MAAI,IAAI,OAAQ,QAAO,IAAI,KAAK,IAAI;AACrC;AAEA,SAAS,WAAW,KAAK,GAAG,KAAK;AAShC,QAAM,cAAwB,CAAC;AAE/B,aAAW,OAAO,KAAK;AACtB,QAAI,IAAI,KAAK,GAAG,KAAK,QAAW;AAC/B,kBAAY,KAAK,GAAG;AACpB;IACD;AAEA,UAAM,QAAQ,IAAI,GAAG;AAIrB,QAAI,OAAO,OAAO;AACjB,YAAM,OAAO,UAAU,OAAO,IAAI,KAAK,IAAI,WAAW,CAAC;AACvD,UAAI,CAAC,MAAM;AACV,UAAE,KAAK,GAAG,IAAI;MACf;AACA;IACD;AACA,QAAI,OAAO,OAAO;AACjB,YAAM,OAAO,UAAU,OAAO,IAAI,KAAK,IAAI,WAAW,CAAC;AACvD,UAAI,CAAC,MAAM;AACV,UAAE,KAAK,GAAG,IAAI;MACf;AACA;IACD;AAIA,QAAI,IAAI,KAAK,GAAG,EAAE,QAAQ,QAAQ;AAEjC,QAAE,KAAK,GAAG,IAAI;AACd;IACD;AAEA,UAAM,WAAW,IAAI,KAAK,GAAG,EAAE;AAC/B,UAAM,YAAY,IAAI,KAAK,GAAG,EAAE,QAAQ;AACxC,UAAM,UAAU,IAAI,KAAK,GAAG,EAAE,QAAQ;AAEtC,QAAI,YAAY,KAAK;AAIpB,QAAE,KAAK,GAAG,IAAI;AACd;IACD;AAEA,QAAI,YAAY,KAAK;AAIpB,YAAM,KAAK,MAAM,MAAM,GAAG;AAC1B,eAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,KAAK;AACnC,YAAI,EAAE,QAAQ,CAAC,GAAG;AACjB,YAAE,QAAQ,CAAC,EAAE,KAAK,GAAG,IAAI,YAAY,OAAO,SAAS,GAAG,CAAC,CAAC,IAAI,UAAU,OAAO,WAAW,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;QACxG;MACD;AACA;IACD;AAEA,QAAI,YAAY,KAAK;IAKrB;AAEA,QAAI,YAAY,KAAK;AAIpB,QAAE,KAAK,GAAG,IAAI,YAAY,OAAO,SAAS,KAAK,IAAI,UAAU,OAAO,WAAW,KAAK,IAAI;AACxF;IACD;AAEA,QAAI,CAAC,MAAM,OAAO;AAEjB;IACD;AAIA,UAAM,MAAM,MAAM,MAAM,GAAG;AAC3B,QAAI,WAAW;AACd,QAAE,KAAK,GAAG,IAAI,IAAI,IAAI,OAAO,QAAQ;IACtC,WAAW,SAAS;AACnB,QAAE,KAAK,GAAG,IAAI,IAAI,IAAI,OAAO,UAAU;IACxC,OAAO;AACN,QAAE,KAAK,GAAG,IAAI;IACf;EACD;AACA,SAAO;AACR;;;ACjnBA,IAAI;AAEJ,SAAS,kBAAkB;AAC1B,MAAI,aAAc;AAClB,QAAM,kBAAkB,aAAa,QAAQ,cAAc,KAAK;AAChE,iBAAe,KAAK,MAAM,eAAe;AAC1C;AAkBO,SAAS,kBAAkB,SAAS,OAAO,KAAK;AACtD,kBAAgB;AAChB,MAAI,CAAC,aAAa,OAAO,EAAG,cAAa,OAAO,IAAI,CAAC;AACrD,MAAI,IAAK,cAAa,OAAO,EAAE,KAAK,IAAI;AAAA,MACnC,QAAO,aAAa,OAAO,EAAE,KAAK;AACvC,eAAa,QAAQ,gBAAgB,KAAK,UAAU,YAAY,CAAC;AAClE;AAGO,SAAS,cAAc,SAAS,OAAO;AAC7C,kBAAgB;AAChB,SAAO,aAAa,OAAO,IAAI,KAAK,KAAK,aAAa,OAAO,IAAI,KAAK;AACvE;AAEO,SAAS,mBAAmB,MAAM,MAAM,KAAK;AACnD,MAAI,KAAK,QAAQ,cAAe;AAChC,MAAI,UAAU,MAAM;AACpB,MAAI,CAAC,SAAS;AACb,UAAM,QAAQ,IACZ,MAAM,GAAG,EAAE,CAAC,GACX,MAAM,GAAG,EACV,KAAK,QAAM,GAAG,SAAS,SAAS,CAAC;AACnC,QAAI,CAAC,MAAO;AACZ,QAAI,QAAQ,mBAAmB,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC;AAClD,QAAI,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAG;AACjD,cAAQ,KAAK,MAAM,KAAK;AACxB,gBAAU,MAAM,WAAW,MAAM,MAAM,MAAM,WAAW,MAAM,QAAQ,KAAK,OAAK,EAAE,OAAO,GAAG;AAAA,IAC7F,OAAO;AACN,gBAAU;AAAA,IACX;AAAA,EACD;AACA,kBAAgB;AAChB,MAAI,CAAC,WAAW,CAAC,aAAa,OAAO,EAAG;AACxC,QAAM,IAAI,IAAI,MAAM,IAAI;AACxB,QAAM,kBAAkB,EAAE,CAAC,KAAK,EAAE,CAAC;AACnC,QAAM,qBAAqB,gBAAgB,MAAM,GAAG,EAAE,CAAC;AACvD,QAAM,eAAe,mBAAmB,MAAM,GAAG;AACjD,MAAI,QAAQ,aAAa,KAAK,OAAK,KAAK,MAAM,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,EAAE,SAAS,GAAG,CAAC;AAIlF,QAAM,MAAM,aAAa,OAAO,EAAE,KAAK,KAAK,aAAa,OAAO,EAAE,KAAK;AACvE,MAAI,IAAK,MAAK,QAAQ,gBAAgB,YAAY,KAAK,GAAG;AAC3D;AAEA,IAAM,WAAW,oBAAI,IAAI;AACzB,IAAI;AAAJ,IAAY;AAAZ,IAAoB;AAEb,IAAI,kBAAkB;AAQ7B,eAAsB,YAAY,MAAM;AACvC,WAAS,KAAK;AACd,WAAS,KAAK,MAAM;AACpB,iBAAe,KAAK,UAAU,eAAO,MAAM;AAC3C,aAAW,QAAQ,QAAQ;AAG1B,QAAI,KAAK,UAAW,UAAS,IAAI,IAAI;AAAA,EAKtC;AACA,oBAAkB,KAAK,QAAQ,SAAS,KAAK;AAC9C;AAEO,SAAS,gBAAgB,SAAS,OAAO;AAC/C,MAAI,CAAC,UAAU,CAAC,MAAM,QAAQ,MAAM,EAAG;AACvC,aAAW,KAAK,QAAQ;AAGvB,QAAI,EAAE,WAAW,YAAY,EAAE,SAAS,SAAS,EAAE,SAAS,OAAO,EAAE,SAAS,OAAQ,QAAO;AAAA,EAC9F;AACD;AAIA,eAAsB,YAAY,SAAS,OAAO;AACjD,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO;AACnC,aAAW,KAAK,QAAQ;AACvB,QAAI,EAAE,WAAW,WAAY,EAAE,SAAS,SAAS,EAAE,SAAS,MAAQ;AACpE,QAAI,SAAS,IAAI,CAAC,EAAG,QAAO;AAG5B,QAAI,EAAE,QAAgC,QAAO;AAI7C,UAAM,MAAM,cAAc,SAAS,EAAE,KAAK;AAC1C,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,EAAE,UAAAC,UAAS,IAAI,MAAM,OAAO,uBAAW;AAC7C,UAAM,UAAU,iBAAiB,GAAG;AACpC,QAAI,QAAQ,OAAO,KAAK,KAAK,KAAK,IAAI,IAAI,GAAI,IAAI,QAAQ,IAAK,QAAO;AACtE,UAAM,OAAO,MAAMA,UAAS,eAAe;AAAA,MAC1C,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,SAAS;AAAA;AAAA,QAER,CAAC,EAAE,SAAS,GAAG;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,QACL;AAAA,QACA;AAAA,QACA,UAAU,SAAS;AAAA,MACpB;AAAA,IACD,CAAC;AACD,MAAE,UAAU;AACZ,QAAI,KAAK,MAAM,KAAK,UAAU,MAAM;AACnC,eAAS,IAAI,CAAC;AACd,QAAE,YAAY;AACd,aAAO;AAAA,IACR;AAAA,EACD;AAEA,SAAO;AACR;AAOA,eAAsB,cAAc,MAAM,MAAM,OAAO,CAAC,GAAG;AAC1D,QAAM,KAAK,EAAE,QAAQ,KAAK;AAC1B,MAAI,CAAC,UAAU,KAAK,SAAS,YAAY,EAAG,QAAO;AAEnD,QAAM,OAAO,KAAK,MAAM,KAAK,QAAQ,IAAI;AACzC,QAAM,UAAU,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,MAAM,GAAG,EAAE,OAAO,CAAC,KAAK,OAAO;AACxE,UAAM,CAAC,KAAK,KAAK,IAAI,GAAG,MAAM,GAAG;AACjC,QAAI,GAAG,IAAI;AACX,WAAO;AAAA,EACR,GAAG,CAAC,CAAC;AACL,QAAM,IAAI,OAAO,OAAO,CAAC,GAAG,MAAM,MAAM;AACxC,QAAM,UAAU,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,MAAM,IAAI,EAAE,CAAC,KAAK,IAAI,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAE5F,aAAW,KAAK,QAAQ;AACvB,QAAI,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,SAAS,SAAS,EAAE,QAAQ;AACrE,UAAI,SAAS,IAAI,CAAC,EAAG,QAAO;AAAA,eAInB,EAAE,SAAS,MAAO,QAAO;AAAA,eACzB,EAAE,QAAQ,QAAS,QAAO,MAAM,OAAO,EAAE,SAAS,GAAG,IAAI;AAAA,eACzD,EAAE,QAAQ,OAAO;AAAA,MAG1B,WAAW,EAAE,QAAQ,aAAa;AACjC,cAAM,kBAAkB;AAAA,MAEzB,MAAO,OAAM,4BAA4B,EAAE,IAAI;AAAA,IAChD;AAAA,EACD;AACA,SAAO;AACR;AAOA,eAAe,cAAc,SAAS,MAAM,OAAO,CAAC,GAAG;AACtD,QAAM,OAAO,aACX,OAAO,KAAK,EACZ,MAAM,YAAY,OAAO,EACzB,MAAM,OAAO,CAAC,EACd,MAAM,QAAQ,CAAC,EACf,MAAM,UAAU,MAAM,EACtB,MAAM,SAAS,MAAM,EACrB,MAAM,UAAU,CAAC,EACjB,MAAM,WAAW,MAAM,EACvB,MAAM,oBAAoB,kBAAkB;AAE9C,QAAM,OAAO,KAAK,OAAO,KAAK,EAAE,MAAM,WAAW,CAAC;AAClD,OAAK,OAAO,KAAK,EAAE,KAAK,uBAAuB,OAAO,GAAG;AACzD,OAAK,OAAO,MAAM,EAAE,KAAK,wBAAwB;AAEjD,QAAM,MAAM,KAAK,OAAO,OAAO,EAAE,KAAK,QAAQ,UAAU;AACxD,MAAI,KAAK,EAAE,MAAM;AAEjB,QAAM,MAAM,KAAK,OAAO,QAAQ,EAAE,KAAK,QAAQ;AAE/C,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACvC,aAAS,QAAQ;AAChB,YAAM,YAAY;AAAA,QACjB,QAAQ;AAAA,QACR,SAAS;AAAA,UACR,eAAe,SAAS,KAAK,IAAI,SAAS,OAAO,CAAC,CAAC;AAAA,QACpD;AAAA,QACA,MAAM,KAAK,UAAU,EAAE,SAAS,OAAO,KAAK,OAAO,UAAU,OAAO,SAAS,SAAS,CAAC;AAAA,MACxF,CAAC,EACC,KAAK,SAAO,IAAI,KAAK,CAAC,EACtB,KAAK,SAAO;AACZ,YAAI,IAAI,MAAO,OAAM,IAAI;AAEzB,aAAK,OAAO;AACZ,iBAAS,IAAI,IAAI;AACjB,YAAI,IAAI,KAAK;AACZ,4BAAkB,SAAS,IAAI,OAAO,IAAI,GAAG;AAAA,QAC9C;AACA,YAAI,CAAC,KAAK,WAAY,QAAO,SAAS,OAAO;AAAA,YACxC,SAAQ,OAAO;AAAA,MACrB,CAAC,EACA,MAAM,OAAK;AACX,cAAM,kBAAkB,CAAC;AAAA,MAI1B,CAAC;AAAA,IACH;AACA,QAAI,GAAG,SAAS,KAAK;AACrB,QAAI,GAAG,UAAU,KAAK;AAEtB,QAAI,KAAK;AACR,WAAK,WAAW;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,CAAC;AAAA,EACH,CAAC;AACF;AAEA,SAAS,iBAAiB,OAAO;AAEhC,QAAM,YAAY,MAAM,MAAM,GAAG,EAAE,CAAC;AAEpC,QAAM,SAAS,UAAU,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AAC7D,QAAM,eAAe,SAAS,IAAI,QAAQ,IAAK,OAAO,SAAS,KAAM,CAAC;AAEtE,QAAM,cAAc,mBAAmB,OAAO,KAAK,YAAY,EAAE,MAAM,EAAE,EAAE,IAAI,iBAAiB,EAAE,KAAK,EAAE,CAAC;AAC1G,SAAO,KAAK,MAAM,WAAW;AAC9B;AAEA,SAAS,kBAAkB,GAAG;AAC7B,SAAO,OAAO,OAAO,EAAE,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE;AAC5D;;;AClQO,SAAS,QAAQ,MAAM,KAAK,OAAO,MAAM;AAC/C,MAAI,QAAQ,OAAO,QAAQ,UAAU;AACpC,QAAI,KAAK,cAAc,OAAO,KAAK,cAAc,UAAU;AAC1D,UAAI,CAAC,QAAQ,YAAY;AACxB,gBAAQ,aAAa,KAAK;AAAA,MAC3B,WAAW,CAAC,KAAK,YAAY;AAC5B,aAAK,aAAa,QAAQ;AAAA,MAC3B;AAAA,IACD;AACA,WAAO;AAAA,MACN;AAAA,MACA;AAAA,QACC,QAAQ;AAAA,QACR,SAAS;AAAA,UACR,gBAAgB;AAAA,QACjB;AAAA,QACA,MAAM,KAAK,UAAU,GAAG;AAAA,MACzB;AAAA,MACA;AAAA,IACD;AAAA,EACD,OAAO;AAEN,QAAI,KAAK,CAAC,KAAK,KAAK;AACnB,aAAO,KAAK,MAAM,CAAC;AAAA,IACpB;AAEA,UAAM,MAAM,eAAe,QAAQ,KAAK;AACxC,QAAI,KAAK;AACR,UAAI,MAAM;AAAA,IACX;AAEA,QAAI,MAAM;AACV,UAAM,OAAO,eAAe,QAAQ,SAAS,KAAK,OAAO,YAAY;AACrE,QAAI,MAAM;AAET,UAAI,KAAK,SAAS,GAAG,GAAG;AACvB,cAAM,OAAO;AAAA,MACd,OAAO;AACN,cAAM,OAAO,MAAM;AAAA,MACpB;AAAA,IACD;AAEA,WAAO;AAAA,MACN,IAAI,QAAQ,KAAK;AAAA,QAChB,QAAQ;AAAA,QACR,SAAS;AAAA,UACR,gBAAgB;AAAA,QACjB;AAAA,QACA,MAAM,KAAK,UAAU,GAAG;AAAA,MACzB,CAAC;AAAA,IACF,EAAE,KAAK,OAAK,EAAE,KAAK,CAAC;AAAA,EACrB;AACD;AAEO,SAAS,SAAS,MAAM,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG;AAcpD,MAAI,KAAK,CAAC,KAAK,KAAK;AACnB,WAAO,KAAK,MAAM,CAAC;AAAA,EACpB;AAEA,MAAI,MAAM;AACV,QAAM,OAAO,eAAe,QAAQ,SAAS,KAAK,OAAO,YAAY;AACrE,MAAI,MAAM;AAET,QAAI,KAAK,SAAS,GAAG,GAAG;AACvB,YAAM,OAAO;AAAA,IACd,OAAO;AACN,YAAM,OAAO,MAAM;AAAA,IACpB;AAAA,EACD;AAIA,QAAM,OAAO,KAAK,QAAQ,CAAC;AAG3B,QAAM,iBAAiB,KAAK,IAAI;AAEhC,MAAI,CAAC,KAAK,SAAS;AAClB,SAAK,UAAU,CAAC;AAAA,EACjB;AAEA,MAAI,CAAC,KAAK,QAAQ,cAAc,KAAK,KAAK,MAAM;AAC/C,SAAK,QAAQ,cAAc,IAAI;AAAA,EAChC;AAGA,QAAM,MAAM,eAAe,QAAQ,KAAK;AACxC,MAAI,KAAK;AACR,SAAK,QAAQ,gBAAgB,YAAY;AAAA,EAC1C;AAOA,SAAO,cAAc,MAAM,GAAG,EAAE,KAAK,YAAY;AAChD,QAAI,CAAC,IAAK,oBAAmB,MAAM,MAAM,GAAG;AAC5C,QAAI,KAAK,YAAY;AACpB,aAAO,WAAW,KAAK,MAAM,IAAI;AAAA,IAClC,OAAO;AACN,aAAO,MAAM,KAAK,IAAI,EAAE,KAAK,eAAe;AAAA,IAC7C;AAAA,EACD,CAAC;AACF;AAIA,IAAM,sBAAsB,oBAAI,QAAQ;AAWxC,eAAsB,WAAW,KAAK,MAAM,OAAO,CAAC,GAAG;AACtD,MAAI,CAAC,KAAK,WAAY,OAAM;AAC5B,MAAI,OAAO,KAAK,cAAc,SAAU,OAAM;AAE9C,MAAI;AACJ,QAAM,WAAW,MAAM,YAAY,KAAK,IAAI;AAC5C,MAAI,KAAK,WAAW,QAAQ,GAAG;AAC9B,QAAI,KAAK,QAAQ;AAKhB,YAAM,MAAM,CAAC;AACb,UAAI,KAAK,OAAO,QAAS,OAAM;AAAA,IAChC;AACA,aAAS,gBAAgB,KAAK,WAAW,QAAQ,CAAC;AAAA,EACnD;AAEA,MAAI,CAAC,UAAW,OAAO,UAAU,YAAY,EAAE,kBAAkB,UAAW;AAC3E,WAAO,KAAK,WAAW,QAAQ;AAC/B,aAAS;AAAA,EACV;AAEA,MAAI,CAAC,QAAQ;AACZ,QAAI;AACH,YAAM,MAAM,MAAM,MAAM,KAAK,IAAI;AACjC,eAAS,MAAM,gBAAgB,GAAG;AAIlC,UAAI,OAAO,UAAU,YAAY,EAAE,kBAAkB,UAAU;AAW9D,mBAAW,MAAM;AACjB,aAAK,WAAW,QAAQ,IAAI;AAG5B,iBAAS,gBAAgB,MAAM;AAAA,MAChC;AAAA,IACD,SAAS,GAAG;AACX,aAAO,KAAK,WAAW,QAAQ;AAC/B,YAAM;AAAA,IACP;AAAA,EACD;AAGA,MAAI,CAAC,oBAAoB,IAAI,KAAK,UAAU,EAAG,qBAAoB,IAAI,KAAK,YAAY,CAAC,CAAC;AAC1F,QAAM,OAAO,oBAAoB,IAAI,KAAK,UAAU;AACpD,QAAM,IAAI,KAAK,QAAQ,QAAQ;AAC/B,MAAI,IAAI,GAAG;AAEV,SAAK,OAAO,GAAG,CAAC;AAAA,EACjB;AACA,OAAK,QAAQ,QAAQ;AACrB,QAAM,UAAU;AAChB,SAAO,KAAK,SAAS,SAAS;AAC7B,UAAM,gBAAgB,KAAK,IAAI;AAC/B,WAAO,KAAK,WAAW,aAAa;AAAA,EACrC;AACA,SAAO;AACR;AAEA,IAAM,yBAAyB,CAAC;AAUzB,SAAS,SAAS,MAAM,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG;AAcpD,MAAI,CAAC,KAAK,UAAU,MAAM;AACzB,SAAK,SAAS,KAAK,iBAAiB,KAAK,KAAK,KAAK,iBAAiB;AAAA,EACrE;AAEA,OAAK,aAAa;AAClB,SAAO,SAAS,MAAM,MAAM,IAAI;AACjC;AAEO,SAAS,qBAAqB,OAAO,CAAC,GAAG;AAC/C,QAAM,QAAQ,MAAM,cAAc;AAClC,MAAI,CAAC,MAAO;AACZ,aAAW,KAAK,OAAO,KAAK,KAAK,GAAG;AACnC,WAAO,MAAM,CAAC;AAAA,EACf;AACD;AAEA,IAAM,eAAe;AAYrB,SAAS,iBAAiB,KAAK,MAAM;AACpC,QAAM,WAAW,OAAO,SAAS;AACjC,QAAM,SAAU,KAAK,UAAU,KAAK,OAAO,YAAY,KAAM;AAC7D,MAAI,UAAU,QAAQ;AAGrB,QAAI,OAAO,KAAK,QAAQ,SAAU,MAAK,OAAO,KAAK,MAAM,KAAK,IAAI;AAClE,QAAI,CAAC,KAAK,KAAK,YAAY,gBAAiB,MAAK,KAAK,WAAW;AACjE,SAAK,OAAO,KAAK,UAAU,KAAK,IAAI;AACpC,WAAO;AAAA,EACR;AAEA,MAAI,UAAU,SAAS,UAAU,YAAY,UAAU,OAAO;AAC7D,UAAM,4BAA4B,MAAM;AAAA,EACzC;AAEA,MAAI,KAAK,MAAM;AAId,QAAI,CAAC,KAAK,KAAK,YAAY,gBAAiB,MAAK,KAAK,WAAW;AAEjE,UAAM,SAAS,OAAO,KAAK,IAAI;AAC/B,QAAI,CAAC,IAAI,SAAS,GAAG,EAAG,QAAO;AAC/B,WAAO;AAAA,EACR;AAEA,MAAI,CAAC,IAAI,SAAS,WAAW,KAAK,iBAAiB;AAClD,UAAM,MAAM,IAAI,SAAS,GAAG,IAAI,MAAM;AACtC,WAAO,GAAG,GAAG,YAAY,QAAQ;AAAA,EAClC;AAEA,MAAI,IAAI,SAAS,cAAc;AAE9B,QAAI,KAAK,KAAM,QAAO,KAAK;AAC3B,WAAO;AAAA,EACR;AAIA,OAAK,SAAS;AACd,QAAM,CAAC,UAAU,KAAK,IAAI,IAAI,MAAM,GAAG;AAEvC,MAAI,KAAK,MAAM;AAEd,SAAK,OAAO,KAAK,UAAU,KAAK,IAAI;AAAA,EACrC,OAAO;AAEN,UAAM,SAAS,CAAC;AAEhB,QAAI;AAEH,YAAM,MAAM,GAAG,EAAE,QAAQ,OAAK;AAC7B,cAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG;AAC1B,cAAM,aAAa,mBAAmB,CAAC;AACvC,YAAI;AACH,iBAAO,CAAC,IAAI,KAAK,MAAM,UAAU;AAAA,QAClC,QAAQ;AACP,iBAAO,CAAC,IAAI;AAAA,QACb;AAAA,MACD,CAAC;AACF,QAAI,CAAC,OAAO,YAAY,gBAAiB,QAAO,WAAW;AAC3D,SAAK,OAAO,KAAK,UAAU,MAAM;AAAA,EAClC;AAEA,SAAO;AACR;AAGO,SAAS,QAAQ,MAAM;AAC7B,cAAY,MAAM,QAAQ;AAC3B;",
6
+ "names": ["mclasslabel2key", "chr", "format", "tmp", "alt", "hash", "dofetch3"]
7
+ }
@@ -0,0 +1,55 @@
1
+ import {
2
+ addGeneSearchbox,
3
+ getGEunit,
4
+ getSelectedSampleTypes,
5
+ renderSampleTypeSelect,
6
+ table2col
7
+ } from "./chunk-QJ3HYZH3.js";
8
+ import {
9
+ Menu
10
+ } from "./chunk-ELJX3QIQ.js";
11
+ import {
12
+ TermTypes
13
+ } from "./chunk-4EZLVENZ.js";
14
+
15
+ // termdb/handlers/geneExpression.ts
16
+ var SearchHandler = class {
17
+ init(opts) {
18
+ this.callback = opts.callback;
19
+ this.app = opts.app;
20
+ const holder = opts.holder.append("div").style("padding", "10px 0px");
21
+ this.querySampleTypes = this.app.vocabApi.termdbConfig?.queries.geneExpression.sampleTypes;
22
+ if (Array.isArray(this.querySampleTypes) && this.querySampleTypes.length >= 2) {
23
+ const sampleTypeDiv = holder.append("div");
24
+ const table = table2col({ holder: sampleTypeDiv, margin: "0px 0px 15px 0px" });
25
+ const [td1, td2] = table.addRow();
26
+ td1.text("Sample Type");
27
+ this.sampleTypeSelect = renderSampleTypeSelect(td2, this.querySampleTypes, this.app.vocabApi.termdbConfig);
28
+ }
29
+ const geneSearch = addGeneSearchbox({
30
+ tip: new Menu({ padding: "0px" }),
31
+ genome: opts.genomeObj,
32
+ row: holder,
33
+ searchOnly: "gene",
34
+ callback: () => this.selectGene(geneSearch)
35
+ });
36
+ }
37
+ async selectGene(geneSearch) {
38
+ const gene = geneSearch?.geneSymbol;
39
+ if (!gene) throw new Error("No gene selected");
40
+ const sampleTypes = getSelectedSampleTypes(this.sampleTypeSelect) || this.querySampleTypes;
41
+ if (this.sampleTypeSelect && !sampleTypes?.length) {
42
+ window.alert("Must select at least one sample type");
43
+ return;
44
+ }
45
+ const unit = getGEunit(this.app.vocabApi);
46
+ const name = `${gene} ${unit}`;
47
+ const term = { gene, name, type: TermTypes.GENE_EXPRESSION, sampleTypes };
48
+ this.callback(term);
49
+ }
50
+ };
51
+
52
+ export {
53
+ SearchHandler
54
+ };
55
+ //# sourceMappingURL=chunk-VO7Q4WMM.js.map