@datagrok/bio 2.1.12 → 2.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +11 -12
  2. package/css/helm.css +10 -0
  3. package/detectors.js +83 -59
  4. package/dist/package-test.js +2 -13168
  5. package/dist/package-test.js.map +1 -0
  6. package/dist/package.js +2 -10560
  7. package/dist/package.js.map +1 -0
  8. package/dockerfiles/Dockerfile +86 -0
  9. package/files/icons/composition-analysis.svg +17 -0
  10. package/files/icons/sequence-diversity-viewer.svg +4 -0
  11. package/files/icons/sequence-similarity-viewer.svg +4 -0
  12. package/files/icons/vdregions-viewer.svg +22 -0
  13. package/files/icons/weblogo-viewer.svg +7 -0
  14. package/files/tests/testUrl.csv +11 -0
  15. package/files/tests/toAtomicLevelTest.csv +4 -0
  16. package/package.json +24 -25
  17. package/src/analysis/sequence-activity-cliffs.ts +11 -9
  18. package/src/analysis/sequence-search-base-viewer.ts +2 -1
  19. package/src/analysis/sequence-similarity-viewer.ts +3 -3
  20. package/src/analysis/sequence-space.ts +2 -1
  21. package/src/calculations/monomerLevelMols.ts +4 -4
  22. package/src/package-test.ts +9 -2
  23. package/src/package.ts +215 -131
  24. package/src/substructure-search/substructure-search.ts +19 -16
  25. package/src/tests/Palettes-test.ts +1 -1
  26. package/src/tests/WebLogo-positions-test.ts +113 -57
  27. package/src/tests/_first-tests.ts +9 -0
  28. package/src/tests/activity-cliffs-tests.ts +8 -7
  29. package/src/tests/activity-cliffs-utils.ts +17 -9
  30. package/src/tests/bio-tests.ts +4 -5
  31. package/src/tests/checkInputColumn-tests.ts +1 -1
  32. package/src/tests/converters-test.ts +52 -17
  33. package/src/tests/detectors-benchmark-tests.ts +3 -2
  34. package/src/tests/detectors-tests.ts +177 -172
  35. package/src/tests/fasta-export-tests.ts +1 -1
  36. package/src/tests/monomer-libraries-tests.ts +34 -0
  37. package/src/tests/pepsea-tests.ts +21 -0
  38. package/src/tests/renderers-test.ts +21 -19
  39. package/src/tests/sequence-space-test.ts +6 -4
  40. package/src/tests/similarity-diversity-tests.ts +4 -4
  41. package/src/tests/splitters-test.ts +4 -5
  42. package/src/tests/substructure-filters-tests.ts +23 -1
  43. package/src/tests/utils/sequences-generators.ts +1 -1
  44. package/src/tests/utils.ts +2 -1
  45. package/src/tests/viewers.ts +16 -0
  46. package/src/utils/cell-renderer.ts +88 -35
  47. package/src/utils/constants.ts +7 -6
  48. package/src/utils/convert.ts +8 -2
  49. package/src/utils/monomer-lib.ts +174 -0
  50. package/src/utils/multiple-sequence-alignment.ts +44 -20
  51. package/src/utils/pepsea.ts +78 -0
  52. package/src/utils/save-as-fasta.ts +2 -1
  53. package/src/utils/ui-utils.ts +15 -3
  54. package/src/viewers/vd-regions-viewer.ts +113 -72
  55. package/src/viewers/web-logo-viewer.ts +1031 -0
  56. package/src/widgets/bio-substructure-filter.ts +38 -24
  57. package/tsconfig.json +71 -72
  58. package/webpack.config.js +4 -11
  59. package/dist/vendors-node_modules_datagrok-libraries_ml_src_workers_dimensionality-reducer_js.js +0 -9039
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","mappings":"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AAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAEjD,GAAS2tC,YAAcG,UAAU9tC,KAAK,EACjC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC9C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAEjD,GAAS6tC,WAAaC,UAAU9tC,KAAK,EAChC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC9C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,E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G,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,GACjE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GACrE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GACjE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GACnE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAClE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GACjE,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAClE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GACnE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GACtE,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,EAAE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","sources":["webpack://bio/./node_modules/@datagrok-libraries/bio/src/aminoacids.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/monomer-works/monomer-utils.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/nucleotides.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/seq-palettes.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/unknown.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/const.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/fasta-handler.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/notation-converter.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/units-handler.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/viewers/web-logo.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/random.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/test.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/to-console.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://bio/./node_modules/@keckelt/tsne/lib/index.js","webpack://bio/./node_modules/@keckelt/tsne/lib/tsne.js","webpack://bio/./node_modules/@datagrok-libraries/ml/css/styles.css","webpack://bio/./node_modules/css-loader/dist/runtime/api.js","webpack://bio/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://bio/./node_modules/fast-sha256/sha256.js","webpack://bio/./node_modules/jaro-winkler-typescript/lib/index.js","webpack://bio/./node_modules/is-any-array/src/index.js","webpack://bio/./node_modules/ml-levenberg-marquardt/src/errorCalculation.js","webpack://bio/./node_modules/ml-matrix/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-rescale/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-max/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-min/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-rescale/lib-es6/index.js","webpack://bio/./node_modules/ml-array-min/lib-es6/index.js","webpack://bio/./node_modules/ml-array-max/lib-es6/index.js","webpack://bio/./node_modules/ml-matrix/src/inspect.js","webpack://bio/./node_modules/ml-matrix/src/util.js","webpack://bio/./node_modules/ml-matrix/src/matrix.js","webpack://bio/./node_modules/ml-matrix/src/stat.js","webpack://bio/./node_modules/ml-matrix/src/mathOperations.js","webpack://bio/./node_modules/ml-matrix/src/wrap/WrapperMatrix2D.js","webpack://bio/./node_modules/ml-matrix/src/dc/lu.js","webpack://bio/./node_modules/ml-matrix/src/dc/util.js","webpack://bio/./node_modules/ml-matrix/src/dc/qr.js","webpack://bio/./node_modules/ml-matrix/src/dc/svd.js","webpack://bio/./node_modules/ml-levenberg-marquardt/src/step.js","webpack://bio/./node_modules/ml-matrix/src/decompositions.js","webpack://bio/./node_modules/ml-levenberg-marquardt/src/index.js","webpack://bio/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://bio/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://bio/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://bio/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://bio/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://bio/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://bio/./src/calculations/monomerLevelMols.ts","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/cell-renderer.js","webpack://bio/./src/utils/cell-renderer.ts","webpack://bio/./node_modules/@datagrok-libraries/bio/src/viewers/vd-regions.js","webpack://bio/./src/viewers/vd-regions-viewer.ts","webpack://bio/./src/analysis/sequence-space.ts","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-metrics-methods.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/dataframe-utils.js","webpack://bio/./node_modules/@datagrok-libraries/ml/css/styles.css?8c03","webpack://bio/./node_modules/@datagrok-libraries/ml/src/viewers/activity-cliffs.js","webpack://bio/./node_modules/fastest-levenshtein/esm/mod.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/typed-metrics.js","webpack://bio/./src/analysis/sequence-activity-cliffs.ts","webpack://bio/./node_modules/@datagrok-libraries/bio/src/monomer-works/to-atomic-level.js","webpack://bio/./src/analysis/sequence-search-base-viewer.ts","webpack://bio/./src/analysis/sequence-similarity-viewer.ts","webpack://bio/./src/analysis/sequence-diversity-viewer.ts","webpack://bio/./node_modules/@datagrok-libraries/ml/src/spe.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/bit-array.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/reduce-dimensionality.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/functionEditors/seq-space-base-editor.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/functionEditors/seq-space-editor.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/functionEditors/activity-cliffs-editor.js","webpack://bio/./src/package.ts","webpack://bio/./src/widgets/representations.ts","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/splitter.js","webpack://bio/./src/seq_align.ts","webpack://bio/./src/substructure-search/substructure-search.ts","webpack://bio/./src/utils/constants.ts","webpack://bio/external var \"$\"","webpack://bio/./src/utils/convert.ts","webpack://bio/./src/utils/monomer-lib.ts","webpack://bio/./node_modules/@biowasm/aioli/dist/aioli.mjs","webpack://bio/./node_modules/@datagrok-libraries/bio/src/sequence-encoder.js","webpack://bio/./src/utils/multiple-sequence-alignment.ts","webpack://bio/./src/utils/pepsea.ts","webpack://bio/./src/utils/save-as-fasta.ts","webpack://bio/./src/utils/ui-utils.ts","webpack://bio/./src/viewers/web-logo-viewer.ts","webpack://bio/external var \"rxjs.operators\"","webpack://bio/./src/widgets/bio-substructure-filter.ts","webpack://bio/./node_modules/umap-js/dist/heap.js","webpack://bio/./node_modules/umap-js/dist/index.js","webpack://bio/./node_modules/umap-js/dist/matrix.js","webpack://bio/./node_modules/umap-js/dist/nn_descent.js","webpack://bio/./node_modules/umap-js/dist/tree.js","webpack://bio/./node_modules/umap-js/dist/umap.js","webpack://bio/./node_modules/umap-js/dist/utils.js","webpack://bio/external var \"DG\"","webpack://bio/external var \"grok\"","webpack://bio/external var \"rxjs\"","webpack://bio/external var \"ui\"","webpack://bio/external var \"wu\"","webpack://bio/webpack/bootstrap","webpack://bio/webpack/runtime/compat get default export","webpack://bio/webpack/runtime/define property getters","webpack://bio/webpack/runtime/global","webpack://bio/webpack/runtime/hasOwnProperty shorthand","webpack://bio/webpack/runtime/make namespace object","webpack://bio/webpack/runtime/nonce","webpack://bio/webpack/startup"],"sourcesContent":["import { SeqPaletteBase } from './seq-palettes';\nexport class AminoacidsPalettes extends SeqPaletteBase {\n static get Lesk() {\n if (this.lesk === void 0) {\n this.lesk = this.makePalette([\n [['G', 'A', 'S', 'T'], 'orange'],\n [['C', 'V', 'I', 'L', 'P', 'F', 'Y', 'M', 'W'], 'all_green'],\n [['N', 'Q', 'H'], 'magenta'],\n [['D', 'E'], 'red'],\n [['K', 'R'], 'all_blue'],\n ], false, AminoacidsPalettes);\n }\n return this.lesk;\n }\n static get GrokGroups() {\n if (this.grokGroups === void 0) {\n this.grokGroups = this.makePalette([\n [['C', 'U'], 'yellow'],\n [['G', 'P'], 'red'],\n [['A', 'V', 'I', 'L', 'M', 'F', 'Y', 'W'], 'all_green'],\n [['R', 'H', 'K'], 'light_blue'],\n [['D', 'E'], 'dark_blue'],\n [['S', 'T', 'N', 'Q'], 'orange'],\n ], false, AminoacidsPalettes);\n }\n return this.grokGroups;\n }\n static get RasMol() {\n if (this.rasMol === void 0) {\n this.rasMol = new AminoacidsPalettes({\n // http://acces.ens-lyon.fr/biotic/rastop/help/colour.htm\n 'D': '#E60A0A',\n 'E': '#E60A0A',\n 'C': '#E6E600',\n 'M': '#E6E600',\n 'K': '#145AFF',\n 'R': '#145AFF',\n 'S': '#FA9600',\n 'T': '#FA9600',\n 'F': '#3232AA',\n 'Y': '#3232AA',\n 'N': '#00DCDC',\n 'Q': '#00DCDC',\n 'G': '#EBEBEB',\n 'L': '#0F820F',\n 'V': '#0F820F',\n 'I': '#0F820F',\n 'A': '#C8C8C8',\n 'W': '#B45AB4',\n 'H': '#8282D2',\n 'P': '#DC9682',\n 'others': '#BEA06E',\n });\n }\n return this.rasMol;\n }\n get(m) {\n const resM = m in AminoacidsPalettes.aaSynonyms ? AminoacidsPalettes.aaSynonyms[m] : m;\n const res = super.get(resM);\n return res;\n }\n}\n/** Only some of the synonyms. These were obtained from the clustered oligopeptide dataset. */\nAminoacidsPalettes.aaSynonyms = {\n 'MeNle': 'L',\n 'MeA': 'A',\n 'MeG': 'G',\n 'MeF': 'F',\n};\nexport class Aminoacids {\n static getPalette(scheme = 'grok') {\n switch (scheme) {\n case 'grok':\n return AminoacidsPalettes.GrokGroups;\n case 'lesk':\n return AminoacidsPalettes.Lesk;\n default:\n throw new Error(`ChemPalette: scheme \\`${scheme}\\` does not exist`);\n }\n }\n /**\n * Returns divided amino acid with its content in the bracket, if the content is number, then its omitted\n *\n * @param {string} c raw amino\n * @return {[string, string]} outer and inner content\n */\n static getInnerOuter(c) {\n let isInner = 0;\n let inner = '';\n let outer = '';\n for (const char of c) {\n if (char == '(')\n isInner++;\n else if (char == ')')\n isInner--;\n else if (isInner)\n inner += char;\n else\n outer += char;\n }\n return !isNaN(parseInt(inner)) ? [outer, ''] : [outer, inner];\n }\n static getColorAAPivot(monomer = '', scheme = 'grok') {\n var _a, _b, _c;\n //const chemPaletteInstance = AAPalettes.GrokGroups();\n const chemPaletteInstance = this.getPalette(scheme);\n let [outerMonomer, innerMonomer] = this.getInnerOuter(monomer);\n outerMonomer = (outerMonomer.length > 6 ? `${outerMonomer.slice(0, 3)}...` : outerMonomer);\n innerMonomer = (innerMonomer.length > 6 ? `${innerMonomer.slice(0, 3)}...` : innerMonomer);\n if (monomer.length == 1 || monomer[1] == '(') {\n const amino = (_a = monomer[0]) === null || _a === void 0 ? void 0 : _a.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 1] :\n [this.undefinedColor, outerMonomer, innerMonomer, 1];\n }\n if (monomer[0] == 'd' && monomer[1] in chemPaletteInstance) {\n if (monomer.length == 2 || monomer[2] == '(') {\n const amino = (_b = monomer[1]) === null || _b === void 0 ? void 0 : _b.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 2] :\n [this.undefinedColor, outerMonomer, innerMonomer, 2];\n }\n }\n if (monomer.substring(0, 3) in this.AAFullNames) {\n if (monomer.length == 3 || monomer[3] == '(') {\n const amino = this.AAFullNames[monomer.substring(0, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 3] :\n [this.undefinedColor, outerMonomer, innerMonomer, 3];\n }\n }\n if (((_c = monomer[0]) === null || _c === void 0 ? void 0 : _c.toLowerCase()) == monomer[0]) {\n if (monomer.substring(1, 3) in this.AAFullNames) {\n if (monomer.length == 4 || monomer[4] == '(') {\n const amino = this.AAFullNames[monomer.substring(1, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 4] :\n [this.undefinedColor, outerMonomer, innerMonomer, 4];\n }\n }\n }\n return [this.undefinedColor, outerMonomer, innerMonomer, 0];\n }\n}\nAminoacids.SemType = 'Aminoacids';\nAminoacids.SemTypeMultipleAlignment = 'AminoacidsMultipleAlignment';\nAminoacids.undefinedColor = 'rgb(100,100,100)';\nAminoacids.Names = {\n 'G': 'Glycine',\n 'L': 'Leucine',\n 'Y': 'Tyrosine',\n 'S': 'Serine',\n 'E': 'Glutamic acid',\n 'Q': 'Glutamine',\n 'D': 'Aspartic acid',\n 'N': 'Asparagine',\n 'F': 'Phenylalanine',\n 'A': 'Alanine',\n 'K': 'Lysine',\n 'R': 'Arginine',\n 'H': 'Histidine',\n 'C': 'Cysteine',\n 'V': 'Valine',\n 'P': 'Proline',\n 'W': 'Tryptophan',\n 'I': 'Isoleucine',\n 'M': 'Methionine',\n 'T': 'Threonine',\n};\nAminoacids.AASmiles = {\n 'G': 'NCC(=O)O',\n 'L': 'N[C@H](CC(C)C)C(=O)O',\n 'Y': 'NC(CC1=CC=C(O)C=C1)C(=O)O',\n 'S': 'NC(CO)C(=O)O',\n 'E': 'N[C@@H](CCC(O)=O)C(=O)O',\n 'Q': 'N[C@@H](CCC(N)=O)C(=O)O',\n 'D': 'N[C@@H](CC(O)=O)C(=O)O',\n 'N': 'N[C@@H](CC(N)=O)C(=O)O',\n 'F': 'NC(CC1=CC=CC=C1)C(=O)O',\n 'A': 'N[C@H](C)C(=O)O',\n 'K': 'NC(CCCCN)C(=O)O',\n 'R': 'N[C@H](CCCNC(=N)C)C(=O)O',\n 'H': 'NC(CC1=CN=C[N]1)C(=O)O',\n 'C': 'N[C@@H](CS)C(=O)O',\n 'V': 'NC(C(C)C)C(=O)O',\n 'P': 'N(CCC1)C1C(=O)O',\n 'W': 'N[C@@H](Cc1c2ccccc2n([H])c1)C(=O)O',\n 'I': 'N[C@H]([C@H](C)CC)C(=O)O',\n 'M': 'NC(CCSC)C(=O)O',\n 'T': 'NC(C(O)C)C(=O)O',\n};\nAminoacids.AASmilesTruncated = {\n 'G': '*C*',\n 'L': 'CC(C)C[C@H](*)*',\n 'Y': 'C1=CC(=CC=C1CC(*)*)O',\n 'S': 'OCC(*)C*',\n 'E': '*[C@@H](CCC(O)=O)*',\n 'Q': '*N[C@@H](CCC(N)=O)*',\n 'D': '*[C@@H](CC(O)=O)*',\n 'N': '*[C@@H](CC(N)=O)*',\n 'F': 'C1=CC=C(C=C1)CC(*)*',\n 'A': 'C[C@H](*)*',\n 'K': 'C(CCN)CC(*)*',\n 'R': '*[C@H](CCCNC(=N)C)*',\n 'H': 'C1=C(NC=N1)CC(*)*',\n 'C': 'C([C@@H](*)*)S',\n 'V': 'CC(C)C(*)*',\n 'P': 'C1CCN(*)C1*',\n 'W': '*[C@@H](Cc1c2ccccc2n([H])c1)*',\n 'I': 'CC[C@H](C)[C@H](*)*',\n 'M': 'CSCCC(*)*',\n 'T': 'CC(O)C(*)*',\n};\n/** TODO: Full?\n */\nAminoacids.AAFullNames = {\n 'Ala': 'A',\n 'Arg': 'R',\n 'Asn': 'N',\n 'Asp': 'D',\n 'Cys': 'C',\n 'Gln': 'Q',\n 'Glu': 'E',\n 'Gly': 'G',\n 'His': 'H',\n 'Ile': 'I',\n 'Leu': 'L',\n 'Lys': 'K',\n 'Met': 'M',\n 'Phe': 'F',\n 'Pro': 'P',\n 'Ser': 'S',\n 'Thr': 'T',\n 'Trp': 'W',\n 'Tyr': 'Y',\n 'Val': 'V',\n};\n//# sourceMappingURL=aminoacids.js.map","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n// import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\nimport { HELM_CORE_FIELDS, jsonSdfMonomerLibDict, MONOMER_ENCODE_MAX, MONOMER_ENCODE_MIN, SDF_MONOMER_NAME } from '../utils/const';\nimport { getSplitter } from '../utils/macromolecule';\nexport const expectedMonomerData = ['symbol', 'name', 'molfile', 'rgroups', 'polymerType', 'monomerType'];\nexport function encodeMonomers(col) {\n let encodeSymbol = MONOMER_ENCODE_MIN;\n const monomerSymbolDict = {};\n const units = col.tags[DG.TAGS.UNITS];\n const sep = col.getTag(\"separator\" /* TAGS.separator */);\n const splitterFunc = getSplitter(units, sep);\n const encodedStringArray = [];\n for (let i = 0; i < col.length; ++i) {\n let encodedMonomerStr = '';\n const monomers = splitterFunc(col.get(i));\n monomers.forEach((m) => {\n if (!monomerSymbolDict[m]) {\n if (encodeSymbol > MONOMER_ENCODE_MAX) {\n grok.shell.error(`Not enough symbols to encode monomers`);\n return null;\n }\n monomerSymbolDict[m] = encodeSymbol;\n encodeSymbol++;\n }\n encodedMonomerStr += String.fromCodePoint(monomerSymbolDict[m]);\n });\n encodedStringArray.push(encodedMonomerStr);\n }\n return DG.Column.fromStrings('encodedMolecules', encodedStringArray);\n}\nexport function getMolfilesFromSeq(col, monomersLibObject) {\n const units = col.tags[DG.TAGS.UNITS];\n const sep = col.getTag('separator');\n const splitterFunc = getSplitter(units, sep);\n const monomersDict = createMomomersMolDict(monomersLibObject);\n const molFiles = [];\n for (let i = 0; i < col.length; ++i) {\n const macroMolecule = col.get(i);\n const monomers = splitterFunc(macroMolecule);\n const molFilesForSeq = [];\n for (let j = 0; j < monomers.length; ++j) {\n if (monomers[j]) {\n if (!monomersDict[monomers[j]]) {\n grok.shell.warning(`Monomer ${monomers[j]} is missing in HELM library. Structure cannot be created`);\n return null;\n }\n // what is the reason of double conversion?\n molFilesForSeq.push(JSON.parse(JSON.stringify(monomersDict[monomers[j]])));\n }\n }\n molFiles.push(molFilesForSeq);\n }\n return molFiles;\n}\nexport function getMolfilesFromSingleSeq(cell, monomersLibObject) {\n const units = cell.column.tags[DG.TAGS.UNITS];\n const sep = cell.column.getTag('separator');\n const splitterFunc = getSplitter(units, sep);\n const monomersDict = createMomomersMolDict(monomersLibObject);\n const molFiles = [];\n const macroMolecule = cell.value;\n const monomers = splitterFunc(macroMolecule);\n const molFilesForSeq = [];\n for (let j = 0; j < monomers.length; ++j) {\n if (monomers[j]) {\n if (!monomersDict[monomers[j]]) {\n grok.shell.warning(`Monomer ${monomers[j]} is missing in HELM library. Structure cannot be created`);\n return null;\n }\n molFilesForSeq.push(JSON.parse(JSON.stringify(monomersDict[monomers[j]])));\n }\n }\n molFiles.push(molFilesForSeq);\n return molFiles;\n}\nexport function createMomomersMolDict(lib) {\n const dict = {};\n lib.forEach((it) => {\n if (it['polymerType'] === 'PEPTIDE') {\n const monomerObject = {};\n HELM_CORE_FIELDS.forEach((field) => {\n monomerObject[field] = it[field];\n });\n dict[it[\"symbol\" /* HELM_FIELDS.SYMBOL */]] = monomerObject;\n }\n });\n return dict;\n}\nexport function createJsonMonomerLibFromSdf(table) {\n const resultLib = [];\n for (let i = 0; i < table.rowCount; i++) {\n const monomer = {};\n Object.keys(jsonSdfMonomerLibDict).forEach((key) => {\n if (key === \"symbol\" /* HELM_FIELDS.SYMBOL */) {\n const monomerSymbol = table.get(jsonSdfMonomerLibDict[key], i);\n monomer[key] = monomerSymbol === '.' ? table.get(SDF_MONOMER_NAME, i) : monomerSymbol;\n }\n else if (key === \"rgroups\" /* HELM_FIELDS.RGROUPS */) {\n const rgroups = table.get(jsonSdfMonomerLibDict[key], i).split('\\n');\n const jsonRgroups = [];\n rgroups.forEach((g) => {\n const rgroup = {};\n const altAtom = g.substring(g.lastIndexOf(']') + 1);\n const radicalNum = g.match(/\\[R(\\d+)\\]/)[1];\n rgroup[\"capGroupSmiles\" /* RGROUP_FIELDS.CAP_GROUP_SMILES */] = altAtom === 'H' ? `[*:${radicalNum}][H]` : `O[*:${radicalNum}]`;\n rgroup[\"alternateId\" /* RGROUP_FIELDS.ALTER_ID */] = altAtom === 'H' ? `R${radicalNum}-H` : `R${radicalNum}-OH`;\n rgroup[\"capGroupName\" /* RGROUP_FIELDS.CAP_GROUP_NAME */] = altAtom === 'H' ? `H` : `OH`;\n rgroup[\"label\" /* RGROUP_FIELDS.LABEL */] = `R${radicalNum}`;\n jsonRgroups.push(rgroup);\n });\n monomer[key] = jsonRgroups;\n }\n else {\n if (jsonSdfMonomerLibDict[key])\n monomer[key] = table.get(jsonSdfMonomerLibDict[key], i);\n }\n });\n resultLib.push(monomer);\n }\n return resultLib;\n}\nexport function getMonomerLibHelper() {\n return __awaiter(this, void 0, void 0, function* () {\n const funcList = DG.Func.find({ package: 'Bio', name: 'getMonomerLibHelper' });\n if (funcList.length === 0)\n throw new Error('Package \"Bio\" must be installer for MonomerLibraryHelper.');\n const res = (yield funcList[0].prepare().call()).getOutputParamValue();\n return res;\n });\n}\n//# sourceMappingURL=monomer-utils.js.map","import { SeqPaletteBase } from './seq-palettes';\nexport class NucleotidesPalettes extends SeqPaletteBase {\n static get Chromatogram() {\n if (this.chromatogram === void 0) {\n this.chromatogram = new NucleotidesPalettes({\n 'A': 'green',\n 'C': 'blue',\n 'G': 'black',\n 'T': 'red',\n 'U': 'red',\n 'others': 'gray',\n });\n }\n return this.chromatogram;\n }\n}\nexport class Nucleotides {\n}\nNucleotides.SemType = 'Nucleotides';\nNucleotides.SemTypeMultipleAlignment = 'NucleotidesMultipleAlignment';\nNucleotides.Names = {\n 'A': 'Adenine',\n 'C': 'Cytosine',\n 'G': 'Guanine',\n 'T': 'Thymine',\n 'U': 'Uracil',\n};\n//# sourceMappingURL=nucleotides.js.map","export class SeqPaletteBase {\n static makePalette(dt, simplified = false, PaletteType = SeqPaletteBase) {\n const palette = {};\n dt.forEach((cp) => {\n const objList = cp[0];\n const colour = cp[1];\n objList.forEach((obj, ind) => {\n palette[obj] = this.colourPalette[colour][simplified ? 0 : ind];\n });\n });\n return new PaletteType(palette);\n }\n constructor(palette) {\n this._palette = palette;\n }\n get(m) {\n return this._palette[m];\n }\n}\nSeqPaletteBase.undefinedColor = 'rgb(100,100,100)';\n/** Palette with shades of primary colors */\nSeqPaletteBase.colourPalette = {\n 'orange': ['rgb(255,187,120)', 'rgb(245,167,100)', 'rgb(235,137,70)', 'rgb(205, 111, 71)'],\n 'all_green': ['rgb(44,160,44)', 'rgb(74,160,74)', 'rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)',\n 'rgb(24,110,79)', 'rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'all_blue': ['rgb(31,119,180)', 'rgb(23,190,207)', 'rgb(122, 102, 189)', 'rgb(158,218,229)', 'rgb(141, 124, 217)',\n 'rgb(31, 120, 150)'],\n 'magenta': ['rgb(162,106,192)', 'rgb(197,165,224)', 'rgb(208,113,218)'],\n 'red': ['rgb(214,39,40)', 'rgb(255,152,150)'],\n 'st_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(31,119,180)'],\n 'dark_blue': ['rgb(31,119,180)', 'rgb(31, 120, 150)'],\n 'light_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(108, 218, 229)', 'rgb(23,190,227)'],\n 'lilac_blue': ['rgb(124,102,211)', 'rgb(149,134,217)', 'rgb(97, 81, 150)'],\n 'dark_green': ['rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)', 'rgb(24,110,79)'],\n 'green': ['rgb(44,160,44)', 'rgb(74,160,74)'],\n 'light_green': ['rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'st_green': ['rgb(44,160,44)', 'rgb(152,223,138)', 'rgb(39, 174, 96)', 'rgb(74,160,74)'],\n 'pink': ['rgb(247,182,210)'],\n 'brown': ['rgb(140,86,75)', 'rgb(102, 62, 54)'],\n 'gray': ['rgb(127,127,127)', 'rgb(199,199,199)', 'rgb(196,156,148)', 'rgb(222, 222, 180)'],\n 'yellow': ['rgb(188,189,34)'],\n 'white': ['rgb(230,230,230)'],\n};\n//# sourceMappingURL=seq-palettes.js.map","import * as DG from 'datagrok-api/dg';\n/** makes the color less white, makes the transparency effect always perceptible\n * @param {string} color x coordinate.\n * */\nfunction correctColor(color) {\n if (color == null)\n return 'rgb(100,100,100)';\n const dgColor = DG.Color.fromHtml(color);\n const g = DG.Color.g(dgColor);\n const r = DG.Color.r(dgColor);\n const b = DG.Color.b(dgColor);\n // calculate euclidean distance to white\n const distToBlack = Math.sqrt(Math.pow(0 - r, 2) + Math.pow(0 - g, 2) + Math.pow(0 - b, 2));\n // normalize vector r g b\n const normR = r / distToBlack;\n const normG = g / distToBlack;\n const normB = b / distToBlack;\n if (distToBlack > 210) {\n return `rgb(${normR * 210},${normG * 210},${normB * 210})`;\n }\n return DG.Color.toRgb(dgColor);\n}\nexport class StringUtils {\n static hashCode(s) {\n let hash = 0;\n if (s.length === 0)\n return hash;\n for (let i = 0; i < s.length; i++) {\n const chr = s.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n }\n}\nimport { SeqPaletteBase } from './seq-palettes';\nexport class UnknownSeqPalette {\n}\nexport class GrayAllPalette extends UnknownSeqPalette {\n get(m) {\n return '#666666';\n }\n}\nexport class UnknownColorPalette extends UnknownSeqPalette {\n static buildPalette() {\n const res = [].concat(...Object.values(SeqPaletteBase.colourPalette));\n return res;\n }\n get(m) {\n const hash = StringUtils.hashCode(m);\n const pI = hash % UnknownColorPalette.palette.length;\n return correctColor(UnknownColorPalette.palette[pI]);\n }\n}\nUnknownColorPalette.palette = UnknownColorPalette.buildPalette();\nexport class UnknownSeqPalettes extends SeqPaletteBase {\n static get Gray() {\n if (this.gray === void 0)\n this.gray = new GrayAllPalette();\n return this.gray;\n }\n static get Color() {\n if (this.color === void 0)\n this.color = new UnknownColorPalette();\n return this.color;\n }\n}\n//# sourceMappingURL=unknown.js.map","export const HELM_CORE_LIB_FILENAME = '/data/HELMCoreLibrary.json';\n// core fields of HELM library object used in toAtomicLevel function\nexport const HELM_CORE_FIELDS = [\n \"symbol\" /* HELM_FIELDS.SYMBOL */,\n \"molfile\" /* HELM_FIELDS.MOLFILE */,\n \"rgroups\" /* HELM_FIELDS.RGROUPS */,\n \"name\" /* HELM_FIELDS.NAME */,\n // HELM_FIELDS.MONOMER_TYPE, // add if terminal monomers for PEPTIDEs to be\n // supported\n];\nexport const SDF_MONOMER_NAME = 'MonomerName';\n// todo: ideally, keys should be expressed via constants\nexport const jsonSdfMonomerLibDict = {\n 'monomerType': null,\n 'smiles': null,\n 'name': 'MonomerName',\n 'author': null,\n 'molfile': 'molecule',\n 'naturalAnalog': 'MonomerNaturalAnalogCode',\n 'rgroups': 'MonomerCaps',\n 'createDate': null,\n 'id': null,\n 'polymerType': 'MonomerType',\n 'symbol': 'MonomerCode'\n};\n// range of hex nubers used in PepSea library to endode monomers\nexport const MONOMER_ENCODE_MIN = 0x100;\nexport const MONOMER_ENCODE_MAX = 0x40A;\n//# sourceMappingURL=const.js.map","import * as DG from 'datagrok-api/dg';\nimport { UnitsHandler } from './units-handler';\n/** Class for parsing FASTA files */\nexport class FastaFileHandler {\n // private _columnsParsed: boolean = false;\n get descriptionsArray() { return this._descriptionsArray; }\n get sequencesArray() { return this._sequencesArray; }\n /**\n * Helper method to parse a macromolecule from a FASTA file (string)\n *\n * @param {number} startOfSequence index of macromolecule substring beginning\n * @param {number} endOfSequence index of macromolecule substring end\n \n * @return {string} parsed macromolecule\n */\n parseMacromolecule(startOfSequence, endOfSequence) {\n const seq = this._fileContent.slice(startOfSequence, endOfSequence);\n const seqArray = seq.split(/\\s/);\n return seqArray.join('');\n }\n /** Parse descriptions and sequences from a FASTA string */\n parseColumns() {\n const regex = /^>(.*)$/gm; // match 'description' lines starting with >\n let startOfSequence = 0;\n let match; // match.index is the beginning of the matched line\n while (match = regex.exec(this._fileContent)) {\n const description = this._fileContent.substring(match.index + 1, regex.lastIndex);\n this._descriptionsArray.push(description);\n if (startOfSequence !== 0)\n this._sequencesArray.push(this.parseMacromolecule(startOfSequence, match.index));\n startOfSequence = regex.lastIndex + 1;\n }\n this._sequencesArray.push(this.parseMacromolecule(startOfSequence, -1));\n // this._columnsParsed = true;\n }\n /**\n * File-handler method for import as FASTA\n *\n * @return {DG.DataFrame[]} dataframe with parsed FASTA content\n */\n importFasta() {\n const descriptionsArrayCol = DG.Column.fromStrings('description', this.descriptionsArray);\n const sequenceCol = DG.Column.fromStrings('sequence', this.sequencesArray);\n sequenceCol.semType = DG.SEMTYPE.MACROMOLECULE;\n // here should go the code from units handler\n UnitsHandler.setUnitsToFastaColumn(sequenceCol);\n return [DG.DataFrame.fromColumns([\n descriptionsArrayCol,\n sequenceCol,\n ])];\n }\n constructor(fileContent) {\n this._descriptionsArray = []; // parsed FASTA descriptions\n this._sequencesArray = []; // parsed FASTA sequeces\n this._fileContent = fileContent;\n this.parseColumns();\n }\n}\n//# sourceMappingURL=fasta-handler.js.map","import * as DG from 'datagrok-api/dg';\nimport wu from 'wu';\nimport { Vector } from '@datagrok-libraries/utils/src/type-declarations';\nimport { vectorLength, vectorDotProduct } from '@datagrok-libraries/utils/src/vector-operations';\nimport { AminoacidsPalettes } from '../aminoacids';\nimport { NucleotidesPalettes } from '../nucleotides';\nimport { UnknownSeqPalettes } from '../unknown';\nimport { UnitsHandler } from '../utils/units-handler';\n;\n/** Stats of sequences with specified splitter func, returns { freq, sameLength }.\n * @param {DG.Column} seqCol\n * @param {number} minLength\n * @param {SplitterFunc} splitter\n * @return { SeqColStats }, sameLength: boolean } stats of column sequences\n */\nexport function getStats(seqCol, minLength, splitter) {\n const freq = {};\n let sameLength = true;\n let firstLength = null;\n for (const seq of seqCol.categories) {\n const mSeq = splitter(seq);\n if (firstLength == null)\n firstLength = mSeq.length;\n else if (mSeq.length !== firstLength)\n sameLength = false;\n if (mSeq.length >= minLength) {\n for (const m of mSeq) {\n if (!(m in freq))\n freq[m] = 0;\n freq[m] += 1;\n }\n }\n }\n return { freq: freq, sameLength: sameLength };\n}\nexport const monomerRe = /\\[(\\w+)\\]|(\\w)|(-)/g;\n/** Split sequence for single character monomers, square brackets multichar monomer names or gap symbol.\n * @param {any} seq object with sequence\n * @return {string[]} array of monomers\n */\nexport function splitterAsFasta(seq) {\n return wu(seq.toString().matchAll(monomerRe))\n .map((ma) => {\n let mRes;\n const m = ma[0];\n if (m.length > 1) {\n mRes = ma[1];\n }\n else {\n mRes = m;\n }\n return mRes;\n }).toArray();\n}\n/** Gets method to split sequence by separator\n * @param {string} separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitterWithSeparator(separator, limit = undefined) {\n return (seq) => {\n return seq.split(separator, limit);\n };\n}\nconst helmRe = /(PEPTIDE1|DNA1|RNA1)\\{([^}]+)}/g;\nconst helmPp1Re = /\\[([^\\[\\]]+)]/g;\n/** Splits Helm string to monomers, but does not replace monomer names to other notation (e.g. for RNA).\n * Only for linear polymers, does not split RNA for ribose and phosphate monomers.\n * @param {string} seq Source string of HELM notation\n * @return {string[]}\n */\nexport function splitterAsHelm(seq) {\n helmRe.lastIndex = 0;\n const ea = helmRe.exec(seq.toString());\n const inSeq = ea ? ea[2] : null;\n const mmPostProcess = (mm) => {\n helmPp1Re.lastIndex = 0;\n const pp1M = helmPp1Re.exec(mm);\n if (pp1M && pp1M.length >= 2)\n return pp1M[1];\n else\n return mm;\n };\n const mmList = inSeq ? inSeq.split('.') : [];\n return mmList.map(mmPostProcess);\n}\n/** Get splitter method to split sequences to monomers\n * @param {string} units\n * @param {string} separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitter(units, separator, limit = undefined) {\n if (units.toLowerCase().startsWith(\"fasta\" /* NOTATION.FASTA */))\n return splitterAsFasta;\n else if (units.toLowerCase().startsWith(\"separator\" /* NOTATION.SEPARATOR */))\n return getSplitterWithSeparator(separator, limit);\n else if (units.toLowerCase().startsWith(\"helm\" /* NOTATION.HELM */))\n return splitterAsHelm;\n else\n throw new Error(`Unexpected units ${units} .`);\n // TODO: Splitter for HELM\n}\n/** Generate splitter function for sequence column\n * @param {DG.Column} col\n * @return {SplitterFunc} Splitter function\n */\nexport function getSplitterForColumn(col) {\n if (col.semType !== DG.SEMTYPE.MACROMOLECULE)\n throw new Error(`Get splitter for semType \"${DG.SEMTYPE.MACROMOLECULE}\" only.`);\n const units = col.getTag(DG.TAGS.UNITS);\n const separator = col.getTag(\"separator\" /* TAGS.separator */);\n return getSplitter(units, separator);\n}\nconst longMonomerPartRe = /(\\w+)/g;\n/** Convert long monomer names to short ones */\nexport function monomerToShort(amino, maxLengthOfMonomer) {\n var _a, _b;\n const shortAminoMatch = amino.match(longMonomerPartRe);\n const needAddDots = amino.length > maxLengthOfMonomer || ((_a = shortAminoMatch === null || shortAminoMatch === void 0 ? void 0 : shortAminoMatch.length) !== null && _a !== void 0 ? _a : 0) > 1;\n const shortAmino = (_b = shortAminoMatch === null || shortAminoMatch === void 0 ? void 0 : shortAminoMatch[0]) !== null && _b !== void 0 ? _b : ' ';\n return !needAddDots ? shortAmino : shortAmino.substring(0, maxLengthOfMonomer) + '…';\n}\n/** */\nexport function getAlphabet(alphabet) {\n switch (alphabet) {\n case \"DNA\" /* ALPHABET.DNA */:\n return UnitsHandler.DnaFastaAlphabet;\n case \"RNA\" /* ALPHABET.RNA */:\n return UnitsHandler.RnaFastaAlphabet;\n case \"PT\" /* ALPHABET.PT */:\n return UnitsHandler.PeptideFastaAlphabet;\n default:\n throw new Error(`Unsupported alphabet '${alphabet}'.`);\n }\n}\n/** Calculate similarity in current sequence and alphabet.\n * @param {MonomerFreqs} freq\n * @param {Set<string>} alphabet\n * @param {string} gapSymbol\n * @return {number} Cosine similarity\n */\nexport function getAlphabetSimilarity(freq, alphabet, gapSymbol = '-') {\n const keys = new Set([...new Set(Object.keys(freq)), ...alphabet]);\n keys.delete(gapSymbol);\n const freqA = [];\n const alphabetA = [];\n for (const m of keys) {\n freqA.push(m in freq ? freq[m] : 0);\n alphabetA.push(alphabet.has(m) ? 1 : 0);\n }\n /* There were a few ideas: chi-squared, pearson correlation (variance?), scalar product */\n const freqV = new Vector(freqA);\n const alphabetV = new Vector(alphabetA);\n return vectorDotProduct(freqV, alphabetV) / (vectorLength(freqV) * vectorLength(alphabetV));\n}\nexport function detectAlphabet(stats) {\n const alphabetCandidates = [\n [\"PT\" /* ALPHABET.PT */, UnitsHandler.PeptideFastaAlphabet],\n [\"DNA\" /* ALPHABET.DNA */, UnitsHandler.DnaFastaAlphabet],\n [\"RNA\" /* ALPHABET.RNA */, UnitsHandler.RnaFastaAlphabet],\n ];\n // Calculate likelihoods for alphabet_candidates\n const alphabetCandidatesSim = alphabetCandidates.map((c) => getAlphabetSimilarity(stats.freq, c[1]));\n const maxCos = Math.max(...alphabetCandidatesSim);\n const alphabet = maxCos > 0.65 ? alphabetCandidates[alphabetCandidatesSim.indexOf(maxCos)][0] : 'UN';\n return alphabet;\n}\n/** Selects a suitable palette based on column data\n * @param {DG.Column} seqCol Column to look for a palette\n * @param {number} minLength minimum length of sequence to detect palette (empty strings are allowed)\n * @return {SeqPalette} Palette corresponding to the alphabet of the sequences in the column\n */\nexport function pickUpPalette(seqCol, minLength = 5) {\n let alphabet;\n if (seqCol.semType == DG.SEMTYPE.MACROMOLECULE) {\n const uh = new UnitsHandler(seqCol);\n alphabet = uh.alphabet;\n }\n else {\n const stats = getStats(seqCol, minLength, splitterAsFasta);\n alphabet = detectAlphabet(stats);\n }\n const res = getPaletteByType(alphabet);\n return res;\n}\nexport function getPaletteByType(paletteType) {\n switch (paletteType) {\n case 'PT':\n return AminoacidsPalettes.GrokGroups;\n case 'NT':\n case 'DNA':\n case 'RNA':\n return NucleotidesPalettes.Chromatogram;\n // other\n default:\n return UnknownSeqPalettes.Color;\n }\n}\nexport function pickUpSeqCol(df) {\n var _a;\n const semTypeColList = df.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);\n let resCol = (_a = semTypeColList.find((col) => {\n const units = col.getTag(DG.TAGS.UNITS);\n return units ? units.indexOf('MSA') !== -1 : false;\n })) !== null && _a !== void 0 ? _a : null;\n if (!resCol && semTypeColList.length > 0)\n resCol = semTypeColList[0];\n return resCol;\n}\n//# sourceMappingURL=macromolecule.js.map","import * as DG from 'datagrok-api/dg';\nimport { UnitsHandler } from './units-handler';\nimport { getSplitterForColumn, getStats } from './macromolecule';\n/** Class for handling conversion of notation systems in Macromolecule columns */\nexport class NotationConverter extends UnitsHandler {\n get splitter() {\n if (this._splitter === null)\n this._splitter = getSplitterForColumn(this.column);\n return this._splitter;\n }\n toFasta(targetNotation) { return targetNotation === \"fasta\" /* NOTATION.FASTA */; }\n toSeparator(targetNotation) { return targetNotation === \"separator\" /* NOTATION.SEPARATOR */; }\n toHelm(targetNotation) { return targetNotation === \"helm\" /* NOTATION.HELM */; }\n /**\n * Convert a Macromolecule column from FASTA to SEPARATOR notation\n *\n * @param {string} separator A specific separator to be used\n * @param {string} fastaGapSymbol Gap symbol in FASTA, '-' by default\n * @return {DG.Column} A new column in SEPARATOR notation\n */\n convertFastaToSeparator(separator, fastaGapSymbol = null) {\n if (fastaGapSymbol === null)\n fastaGapSymbol = this.defaultGapSymbol;\n const newColumn = this.getNewColumn(\"separator\" /* NOTATION.SEPARATOR */);\n // assign the values to the newly created empty column\n newColumn.init((idx) => {\n const fastaPolymer = this.column.get(idx);\n const fastaMonomersArray = this.splitter(fastaPolymer);\n for (let i = 0; i < fastaMonomersArray.length; i++) {\n if (fastaMonomersArray[i] === fastaGapSymbol)\n fastaMonomersArray[i] = UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n }\n return fastaMonomersArray.join(separator);\n });\n newColumn.setTag(DG.TAGS.UNITS, \"separator\" /* NOTATION.SEPARATOR */);\n newColumn.setTag(\"separator\" /* TAGS.separator */, separator);\n return newColumn;\n }\n /**\n * Get the wrapper strings for HELM, depending on the type of the\n * macromolecule (peptide, DNA, RNA)\n *\n * @return {string[]} Array of wrappers\n */\n getHelmWrappers() {\n const prefix = (this.isDna()) ? 'DNA1{' :\n (this.isRna()) ? 'RNA1{' :\n (this.isPeptide()) ? 'PEPTIDE1{' :\n 'Unknown'; // this case should be handled as exceptional\n if (prefix === 'Unknown')\n throw new Error('Neither peptide, nor nucleotide');\n const postfix = '}$$$';\n const leftWrapper = (this.isDna()) ? 'D(' :\n (this.isRna()) ? 'R(' : ''; // no wrapper for peptides\n const rightWrapper = (this.isDna() || this.isRna()) ? ')P' : ''; // no wrapper for peptides\n return [prefix, leftWrapper, rightWrapper, postfix];\n }\n // A helper function for converting strings to HELM\n convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix) {\n const monomerArray = this.splitter(sourcePolymer);\n const monomerHelmArray = monomerArray.map((mm) => {\n if (mm === sourceGapSymbol)\n return UnitsHandler._defaultGapSymbolsDict.HELM;\n else\n return `${leftWrapper}${mm}${rightWrapper}`;\n });\n return `${prefix}${monomerHelmArray.join('.')}${postfix}`;\n }\n /**\n * Convert a string with SEPARATOR/FASTA notation to HELM\n *\n * @param {string} sourcePolymer A string to be converted\n * @param {string | null} sourceGapSymbol An optional gap symbol, set to\n * default values ('-' for FASTA and '' for SEPARATOR) unless specified\n * @return {string} The target HELM string\n */\n convertStringToHelm(sourcePolymer, sourceGapSymbol = null) {\n if (sourceGapSymbol === null)\n sourceGapSymbol = this.defaultGapSymbol;\n const [prefix, leftWrapper, rightWrapper, postfix] = this.getHelmWrappers();\n return this.convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix);\n }\n /**\n * Convert a column to HELM\n *\n * @param {string | null} sourceGapSymbol\n * @return {DG.Column}\n */\n convertToHelm(sourceGapSymbol = null) {\n if (sourceGapSymbol === null)\n sourceGapSymbol = this.defaultGapSymbol;\n const [prefix, leftWrapper, rightWrapper, postfix] = this.getHelmWrappers();\n const newColumn = this.getNewColumn(\"helm\" /* NOTATION.HELM */);\n // assign the values to the empty column\n newColumn.init((idx) => {\n const sourcePolymer = this.column.get(idx);\n return this.convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix);\n });\n newColumn.setTag(DG.TAGS.UNITS, \"helm\" /* NOTATION.HELM */);\n return newColumn;\n }\n /**\n * Convert SEPARATOR column to FASTA notation\n *\n * @param {string | null} fastaGapSymbol Optional gap symbol for FASTA\n * @return {DG.Column} Converted column\n */\n convertSeparatorToFasta(fastaGapSymbol = null) {\n if (fastaGapSymbol === null)\n fastaGapSymbol = UnitsHandler._defaultGapSymbolsDict.FASTA;\n const newColumn = this.getNewColumn(\"fasta\" /* NOTATION.FASTA */);\n // assign the values to the empty column\n newColumn.init((idx) => {\n const separatorPolymer = this.column.get(idx);\n // items can be monomers or separators\n const separatorItemsArray = this.splitter(separatorPolymer);\n const fastaMonomersArray = [];\n for (let i = 0; i < separatorItemsArray.length; i++) {\n const item = separatorItemsArray[i];\n if (item.length === 0) {\n fastaMonomersArray.push(fastaGapSymbol);\n }\n else if (item.length > 1) {\n // the case of a multi-character monomer\n const monomer = '[' + item + ']';\n fastaMonomersArray.push(monomer);\n }\n else {\n fastaMonomersArray.push(item);\n }\n }\n return fastaMonomersArray.join('');\n });\n newColumn.setTag(DG.TAGS.UNITS, \"fasta\" /* NOTATION.FASTA */);\n return newColumn;\n }\n /**\n * Convert HELM string to FASTA/SEPARATOR\n *\n * @param {string} helmPolymer A string to be converted\n * @param {string} tgtNotation Target notation: FASTA or SEPARATOR\n * @param {string} tgtSeparator Optional target separator (for HELM ->\n * @param {string | null} tgtGapSymbol Optional target gap symbol\n * SEPARATOR)\n * @return {string} Converted string\n */\n convertHelmToFastaSeparator(helmPolymer, tgtNotation, tgtSeparator, tgtGapSymbol) {\n if (!tgtGapSymbol) {\n tgtGapSymbol = (this.toFasta(tgtNotation)) ?\n UnitsHandler._defaultGapSymbolsDict.FASTA :\n UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n }\n if (!tgtSeparator) {\n tgtSeparator = (this.toFasta(tgtNotation)) ? '' : this.separator;\n }\n const helmWrappersRe = /(R\\(|D\\(|\\)|P)/g;\n const isNucleotide = helmPolymer.startsWith('DNA') || helmPolymer.startsWith('RNA');\n // items can be monomers or helms\n const helmItemsArray = this.splitter(helmPolymer);\n const tgtMonomersArray = [];\n for (let i = 0; i < helmItemsArray.length; i++) {\n let item = helmItemsArray[i];\n if (isNucleotide)\n item = item.replace(helmWrappersRe, '');\n if (item === UnitsHandler._defaultGapSymbolsDict.HELM) {\n tgtMonomersArray.push(tgtGapSymbol);\n }\n else if (this.toFasta(tgtNotation) && item.length > 1) {\n // the case of a multi-character monomer converted to FASTA\n const monomer = '[' + item + ']';\n tgtMonomersArray.push(monomer);\n }\n else {\n tgtMonomersArray.push(item);\n }\n }\n return tgtMonomersArray.join(tgtSeparator);\n }\n /**\n * Convert HELM column to FASTA/SEPARATOR\n *\n * @param {string} tgtNotation Target notation: FASTA or SEPARATOR\n * @param {string} tgtSeparator Optional target separator (for HELM ->\n * @param {string | null} tgtGapSymbol Optional target gap symbol\n * SEPARATOR)\n * @return {DG.Column} Converted column\n */\n convertHelm(tgtNotation, tgtSeparator, tgtGapSymbol) {\n // This function must not contain calls of isDna() and isRna(), for\n // source helm columns may contain RNA, DNA and PT across different rows\n const newColumn = this.getNewColumn(tgtNotation);\n // assign the values to the empty column\n newColumn.init((idx) => {\n const helmPolymer = this.column.get(idx);\n return this.convertHelmToFastaSeparator(helmPolymer, tgtNotation, tgtSeparator, tgtGapSymbol);\n // we cannot use isDna() or isRna() because source helm columns can\n // contain DNA, RNA and PT in different cells, so the corresponding\n // tags cannot be set for the whole column\n });\n // TAGS.aligned is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n const splitter = getSplitterForColumn(newColumn);\n const stats = getStats(newColumn, 5, splitter);\n const aligned = stats.sameLength ? 'SEQ.MSA' : 'SEQ';\n newColumn.setTag(\"aligned\" /* TAGS.aligned */, aligned);\n return newColumn;\n }\n convertHelmToSeparator() {\n // TODO: implementatioreturn this.getNewColumn();\n return this.getNewColumn(\"separator\" /* NOTATION.SEPARATOR */);\n }\n /** Dispatcher method for notation conversion\n *\n * @param {NOTATION} tgtNotation Notation we want to convert to\n * @param {string | null} tgtSeparator Possible separator\n * @return {DG.Column} Converted column\n */\n convert(tgtNotation, tgtSeparator = null) {\n // possible exceptions\n if (this.notation === tgtNotation)\n throw new Error('tgt notation is invalid');\n if (this.toSeparator(tgtNotation) && tgtSeparator === null)\n throw new Error('tgt separator is not specified');\n if (this.isFasta() && this.toSeparator(tgtNotation) && tgtSeparator !== null)\n return this.convertFastaToSeparator(tgtSeparator);\n else if ((this.isFasta() || this.isSeparator()) && this.toHelm(tgtNotation))\n return this.convertToHelm();\n else if (this.isSeparator() && this.toFasta(tgtNotation))\n return this.convertSeparatorToFasta();\n else if (this.isHelm() && this.toFasta(tgtNotation)) // the case of HELM\n return this.convertHelm(tgtNotation);\n else if (this.isHelm() && this.toSeparator(tgtNotation))\n return this.convertHelm(tgtNotation, tgtSeparator);\n else\n throw new Error('Not supported conversion ' +\n `from source notation '${this.notation}' to target notation '${tgtNotation}'.`);\n }\n constructor(col) {\n super(col);\n this._splitter = null;\n }\n}\n//# sourceMappingURL=notation-converter.js.map","import * as DG from 'datagrok-api/dg';\nimport { detectAlphabet, getSplitterForColumn, getStats, splitterAsFasta } from './macromolecule';\n/** Class for handling notation units in Macromolecule columns */\nexport class UnitsHandler {\n static setUnitsToFastaColumn(col) {\n if (col.semType !== DG.SEMTYPE.MACROMOLECULE)\n throw new Error('Fasta column must be MACROMOLECULE');\n const stats = getStats(col, 5, splitterAsFasta);\n const aligned = stats.sameLength ? 'SEQ.MSA' : 'SEQ';\n const alphabet = detectAlphabet(stats);\n col.setTag(DG.TAGS.UNITS, \"fasta\" /* NOTATION.FASTA */);\n col.setTag(\"aligned\" /* TAGS.aligned */, aligned);\n col.setTag(\"alphabet\" /* TAGS.alphabet */, alphabet);\n }\n get units() { return this._units; }\n get column() { return this._column; }\n get notation() { return this._notation; }\n get defaultGapSymbol() { return this._defaultGapSymbol; }\n get separator() {\n var _a;\n const separator = (_a = this.column.getTag(\"separator\" /* TAGS.separator */)) !== null && _a !== void 0 ? _a : undefined;\n if (this.notation === \"separator\" /* NOTATION.SEPARATOR */ && separator === undefined)\n throw new Error(`Separator is mandatory for column '${this.column.name}' of notation '${this.notation}'.`);\n return separator;\n }\n get aligned() {\n const aligned = this.column.getTag(\"aligned\" /* TAGS.aligned */);\n // TAGS.aligned is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n if (!aligned && (this.isFasta() || this.isSeparator()))\n throw new Error('Tag aligned not set');\n return aligned;\n }\n /** Alphabet name (upper case) */\n get alphabet() {\n const alphabet = this.column.getTag(\"alphabet\" /* TAGS.alphabet */);\n // TAGS.alphabet is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n if (!alphabet && (this.isFasta() || this.isSeparator()))\n throw new Error('Tag alphabet not set');\n return alphabet;\n }\n getAlphabetSize() {\n if (this.notation == \"helm\" /* NOTATION.HELM */ || this.alphabet == \"UN\" /* ALPHABET.UN */) {\n const alphabetSizeStr = this.column.getTag(\".alphabetSize\" /* TAGS.alphabetSize */);\n let alphabetSize;\n if (alphabetSizeStr) {\n alphabetSize = parseInt(alphabetSizeStr);\n }\n else {\n // calculate alphabetSize on demand\n const splitter = getSplitterForColumn(this.column);\n const stats = getStats(this.column, 1, splitter);\n alphabetSize = Object.keys(stats.freq).length;\n }\n return alphabetSize;\n }\n else {\n switch (this.alphabet) {\n case \"PT\" /* ALPHABET.PT */:\n return 20;\n case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\n return 4;\n case 'NT':\n console.warn(`Unexpected alphabet 'NT'.`);\n return 4;\n default:\n throw new Error(`Unexpected alphabet '${this.alphabet}'.`);\n }\n }\n }\n getAlphabetIsMultichar() {\n if (this.notation == \"helm\" /* NOTATION.HELM */ || this.alphabet == \"UN\" /* ALPHABET.UN */)\n return this.column.getTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */) == 'true';\n else\n return false;\n }\n isFasta() { return this.notation === \"fasta\" /* NOTATION.FASTA */; }\n isSeparator() { return this.notation === \"separator\" /* NOTATION.SEPARATOR */; }\n isHelm() { return this.notation === \"helm\" /* NOTATION.HELM */; }\n isRna() { return this.alphabet === \"RNA\" /* ALPHABET.RNA */; }\n isDna() { return this.alphabet === \"DNA\" /* ALPHABET.DNA */; }\n isPeptide() { return this.alphabet === \"PT\" /* ALPHABET.PT */; }\n isMsa() { return this.aligned ? this.aligned.toUpperCase().includes('MSA') : false; }\n /** Associate notation types with the corresponding units */\n /**\n * @return {NOTATION} Notation associated with the units type\n */\n getNotation() {\n if (this.units.toLowerCase().startsWith(\"fasta\" /* NOTATION.FASTA */))\n return \"fasta\" /* NOTATION.FASTA */;\n else if (this.units.toLowerCase().startsWith(\"separator\" /* NOTATION.SEPARATOR */))\n return \"separator\" /* NOTATION.SEPARATOR */;\n else if (this.units.toLowerCase().startsWith(\"helm\" /* NOTATION.HELM */))\n return \"helm\" /* NOTATION.HELM */;\n else\n throw new Error(`Column '${this.column.name}' has unexpected notation '${this.units}'.`);\n }\n /**\n * Create a new empty column of the specified notation type and the same\n * length as column\n *\n * @param {NOTATION} targetNotation\n * @return {DG.Column}\n */\n getNewColumn(targetNotation) {\n const col = this.column;\n const len = col.length;\n const name = targetNotation.toLowerCase() + '(' + col.name + ')';\n const newColName = col.dataFrame.columns.getUnusedName(name);\n const newColumn = DG.Column.fromList('string', newColName, new Array(len).fill(''));\n newColumn.semType = DG.SEMTYPE.MACROMOLECULE;\n newColumn.setTag(DG.TAGS.UNITS, targetNotation);\n newColumn.setTag(DG.TAGS.CELL_RENDERER, 'Macromolecule');\n const srcAligned = col.getTag(\"aligned\" /* TAGS.aligned */);\n if (srcAligned)\n newColumn.setTag(\"aligned\" /* TAGS.aligned */, srcAligned);\n const srcAlphabet = col.getTag(\"alphabet\" /* TAGS.alphabet */);\n if (srcAlphabet)\n newColumn.setTag(\"alphabet\" /* TAGS.alphabet */, srcAlphabet);\n let srcAlphabetSize = col.getTag(\".alphabetSize\" /* TAGS.alphabetSize */);\n if (srcAlphabetSize)\n newColumn.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, srcAlphabetSize);\n const srcAlphabetIsMultichar = col.getTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */);\n if (srcAlphabetIsMultichar !== undefined)\n newColumn.setTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */, srcAlphabetIsMultichar);\n if (targetNotation == \"helm\" /* NOTATION.HELM */) {\n srcAlphabetSize = this.getAlphabetSize().toString();\n newColumn.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, srcAlphabetSize);\n }\n return newColumn;\n }\n /**\n * Create a new empty column using templateCol as a template\n *\n * @param {DG.Column} templateCol the properties and units of this column are used as a\n * template to build the new one\n * @return {DG.Column}\n */\n static getNewColumn(templateCol) {\n const col = new UnitsHandler(templateCol);\n const targetNotation = col.notation;\n return col.getNewColumn(targetNotation);\n }\n /**\n * A helper function checking the validity of the 'units' string\n *\n * @param {string} units the string to be validated\n * @return {boolean}\n */\n static unitsStringIsValid(units) {\n units = units.toLowerCase();\n const prefixes = [\"fasta\" /* NOTATION.FASTA */, \"separator\" /* NOTATION.SEPARATOR */, \"helm\" /* NOTATION.HELM */];\n const postfixes = ['rna', 'dna', 'pt'];\n const prefixCriterion = prefixes.some((p) => units.startsWith(p.toLowerCase()));\n return prefixCriterion;\n }\n /**\n * Construct a new column of semantic type MACROMOLECULE from the list of\n * specified parameters\n *\n * @param {number} len the length of the new column\n * @param {string} name the name of the new column\n * @param {string} units the units of the new column\n * @return {DG.Column}\n */\n static getNewColumnFromParams(len, name, units) {\n // WARNING: in this implementation is is impossible to verify the uniqueness\n // of the new column's name\n // TODO: verify the validity of units parameter\n if (!UnitsHandler.unitsStringIsValid(units))\n throw new Error('Invalid format of \\'units\\' parameter');\n const newColumn = DG.Column.fromList('string', name, new Array(len).fill(''));\n newColumn.semType = DG.SEMTYPE.MACROMOLECULE;\n newColumn.setTag(DG.TAGS.UNITS, units);\n return newColumn;\n }\n constructor(col) {\n this._column = col;\n const units = this._column.tags[DG.TAGS.UNITS];\n if (units !== null)\n this._units = units;\n else\n throw new Error('Units are not specified in column');\n this._notation = this.getNotation();\n this._defaultGapSymbol = (this.isFasta()) ? UnitsHandler._defaultGapSymbolsDict.FASTA :\n (this.isHelm()) ? UnitsHandler._defaultGapSymbolsDict.HELM :\n UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n if (!this.column.tags.has(\"aligned\" /* TAGS.aligned */)) {\n if (this.isFasta() || this.isSeparator())\n throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +\n `tag '${\"aligned\" /* TAGS.aligned */}' is mandatory.`);\n }\n // if (!this.column.tags.has(TAGS.alphabetSize)) {\n // if (this.isHelm())\n // throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +\n // `tag '${TAGS.alphabetSize}' is mandatory.`);\n // else if (['UN'].includes(this.alphabet))\n // throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +\n // `tag '${TAGS.alphabetSize}' is mandatory.`);\n // }\n if (!this.column.tags.has(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */)) {\n if (this.isHelm())\n throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +\n `tag '${\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */}' is mandatory.`);\n else if (['UN'].includes(this.alphabet))\n throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +\n `tag '${\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */}' is mandatory.`);\n }\n }\n}\nUnitsHandler._defaultGapSymbolsDict = {\n HELM: '*',\n SEPARATOR: '',\n FASTA: '-',\n};\nUnitsHandler.PeptideFastaAlphabet = new Set([\n 'G', 'L', 'Y', 'S', 'E', 'Q', 'D', 'N', 'F', 'A',\n 'K', 'R', 'H', 'C', 'V', 'P', 'W', 'I', 'M', 'T',\n]);\nUnitsHandler.DnaFastaAlphabet = new Set(['A', 'C', 'G', 'T']);\nUnitsHandler.RnaFastaAlphabet = new Set(['A', 'C', 'G', 'U']);\n//# sourceMappingURL=units-handler.js.map","export var PositionHeight;\n(function (PositionHeight) {\n PositionHeight[\"Entropy\"] = \"Entropy\";\n PositionHeight[\"full\"] = \"100%\";\n})(PositionHeight || (PositionHeight = {}));\nexport class WebLogoPropsDefault {\n constructor() {\n // -- Data --\n this.sequenceColumnName = null;\n this.startPositionName = null;\n this.endPositionName = null;\n this.skipEmptySequences = true;\n this.skipEmptyPositions = false;\n this.shrinkEmptyTail = true;\n }\n}\nexport const positionSeparator = ', ';\nexport const positionRe = /(\\d+)([A-Z]?)/;\nexport var TAGS;\n(function (TAGS) {\n TAGS[\"positionNames\"] = \".positionNames\";\n})(TAGS || (TAGS = {}));\n//# sourceMappingURL=web-logo.js.map","/**\n * Generates single random float from 0 to range.\n *\n * @export\n * @param {number} range Max generating value.\n * @return {number} A random float generated.\n */\nexport function randomFloat(range) {\n return Math.random() * range;\n}\n/**\n * Generates single random integer from 0 to range.\n *\n * @export\n * @param {number} range Max generating value.\n * @return {number} A random integer generated.\n */\nexport function randomInt(range) {\n return Math.floor(randomFloat(range));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmFuZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYTtJQUN2QyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYTtJQUNyQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gZmxvYXQgZnJvbSAwIHRvIHJhbmdlLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSByYW5nZSBNYXggZ2VuZXJhdGluZyB2YWx1ZS5cbiAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gZmxvYXQgZ2VuZXJhdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tRmxvYXQocmFuZ2U6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpICogcmFuZ2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gaW50ZWdlciBmcm9tIDAgdG8gcmFuZ2UuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHJhbmdlIE1heCBnZW5lcmF0aW5nIHZhbHVlLlxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBpbnRlZ2VyIGdlbmVyYXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbUludChyYW5nZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IocmFuZG9tRmxvYXQocmFuZ2UpKTtcbn1cbiJdfQ==","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nexport const tests = {};\nconst autoTestsCatName = 'Auto Tests';\nconst wasRegistered = {};\nexport let currentCategory;\nexport var assure;\n(function (assure) {\n function notNull(value, name) {\n if (value == null)\n throw new Error(`${name == null ? 'Value' : name} not defined`);\n }\n assure.notNull = notNull;\n})(assure || (assure = {}));\nexport class TestContext {\n constructor(catchUnhandled, report) {\n this.catchUnhandled = true;\n this.report = false;\n if (catchUnhandled !== undefined)\n this.catchUnhandled = catchUnhandled;\n if (report !== undefined)\n this.report = report;\n }\n ;\n}\nexport class Test {\n constructor(category, name, test, options) {\n var _a;\n this.category = category;\n this.name = name;\n options !== null && options !== void 0 ? options : (options = {});\n (_a = options.timeout) !== null && _a !== void 0 ? _a : (options.timeout = 30000);\n this.options = options;\n this.test = () => __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n let result = '';\n try {\n result = yield test();\n }\n catch (e) {\n reject(e);\n }\n resolve(result);\n }));\n });\n }\n}\nexport function testEvent(event, handler, trigger, ms = 0) {\n return __awaiter(this, void 0, void 0, function* () {\n let sub;\n return new Promise((resolve, reject) => {\n sub = event.subscribe((args) => {\n try {\n handler(args);\n }\n catch (e) {\n reject(e);\n }\n sub.unsubscribe();\n resolve('OK');\n });\n setTimeout(() => {\n sub.unsubscribe();\n // eslint-disable-next-line prefer-promise-reject-errors\n reject('timeout');\n }, ms);\n trigger();\n });\n });\n}\nexport function test(name, test, options) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n if (tests[currentCategory].tests == undefined)\n tests[currentCategory].tests = [];\n tests[currentCategory].tests.push(new Test(currentCategory, name, test, options));\n}\n/* Tests two objects for equality, throws an exception if they are not equal. */\nexport function expect(actual, expected = true, error) {\n if (error)\n error = `${error}, `;\n else\n error = '';\n if (actual !== expected)\n throw new Error(`${error}Expected \"${expected}\", got \"${actual}\"`);\n}\nexport function expectFloat(actual, expected, tolerance = 0.001, error) {\n if ((actual === Number.POSITIVE_INFINITY && expected === Number.POSITIVE_INFINITY) ||\n (actual === Number.NEGATIVE_INFINITY && expected === Number.NEGATIVE_INFINITY) ||\n (actual === Number.NaN && expected === Number.NaN) || (isNaN(actual) && isNaN(expected)))\n return;\n const areEqual = Math.abs(actual - expected) < tolerance;\n expect(areEqual, true, `${error !== null && error !== void 0 ? error : ''} (tolerance = ${tolerance})`);\n if (!areEqual)\n throw new Error(`Expected ${expected}, got ${actual} (tolerance = ${tolerance})`);\n}\nexport function expectTable(actual, expected, error) {\n const expectedRowCount = expected.rowCount;\n const actualRowCount = actual.rowCount;\n expect(actualRowCount, expectedRowCount, `${error !== null && error !== void 0 ? error : ''}, row count`);\n for (const column of expected.columns) {\n const actualColumn = actual.columns.byName(column.name);\n if (actualColumn == null)\n throw new Error(`Column ${column.name} not found`);\n if (actualColumn.type != column.type)\n throw new Error(`Column ${column.name} type expected ${column.type} got ${actualColumn.type}`);\n for (let i = 0; i < expectedRowCount; i++) {\n const value = column.get(i);\n const actualValue = actualColumn.get(i);\n if (column.type == DG.TYPE.FLOAT)\n expectFloat(actualValue, value, 0.0001, error);\n else if (column.type == DG.TYPE.DATE_TIME)\n expect(actualValue.isSame(value), true, error);\n else\n expect(actualValue, value, error);\n }\n }\n}\nexport function expectObject(actual, expected) {\n for (const [expectedKey, expectedValue] of Object.entries(expected)) {\n if (!actual.hasOwnProperty(expectedKey))\n throw new Error(`Expected property \"${expectedKey}\" not found`);\n const actualValue = actual[expectedKey];\n if (actualValue instanceof Array && expectedValue instanceof Array)\n expectArray(actualValue, expectedValue);\n else if (actualValue instanceof Object && expectedValue instanceof Object)\n expectObject(actualValue, expectedValue);\n else if (Number.isFinite(actualValue) && Number.isFinite(expectedValue))\n expectFloat(actualValue, expectedValue);\n else if (actualValue != expectedValue)\n throw new Error(`Expected (${expectedValue}) for key '${expectedKey}', got (${actualValue})`);\n }\n}\nexport function expectArray(actual, expected) {\n const actualLength = actual.length;\n const expectedLength = expected.length;\n if (actualLength != expectedLength) {\n throw new Error(`Arrays are of different length: actual array length is ${actualLength} ` +\n `and expected array length is ${expectedLength}`);\n }\n for (let i = 0; i < actualLength; i++) {\n if (actual[i] instanceof Array && expected[i] instanceof Array)\n expectArray(actual[i], expected[i]);\n else if (actual[i] instanceof Object && expected[i] instanceof Object)\n expectObject(actual[i], expected[i]);\n else if (actual[i] != expected[i])\n throw new Error(`Expected ${expected[i]} at position ${i}, got ${actual[i]}`);\n }\n}\n/* Defines a test suite. */\nexport function category(category, tests) {\n currentCategory = category;\n tests();\n}\n/* Defines a function to be executed before the tests in this category are executed. */\nexport function before(before) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].before = before;\n}\n/* Defines a function to be executed after the tests in this category are executed. */\nexport function after(after) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].after = after;\n}\nfunction addNamespace(s, f) {\n return s.replace(new RegExp(f.name, 'gi'), f.nqName);\n}\nexport function initAutoTests(packageId, module) {\n return __awaiter(this, void 0, void 0, function* () {\n if (wasRegistered[packageId])\n return;\n const moduleTests = module ? module.tests : tests;\n if (moduleTests[autoTestsCatName] !== undefined) {\n wasRegistered[packageId] = true;\n return;\n }\n const moduleAutoTests = [];\n const packFunctions = yield grok.dapi.functions.filter(`package.id = \"${packageId}\"`).list();\n for (const f of packFunctions) {\n const tests = f.options['test'];\n if (!(tests && Array.isArray(tests) && tests.length))\n continue;\n for (let i = 0; i < tests.length; i++) {\n moduleAutoTests.push(new Test(autoTestsCatName, tests.length === 1 ? f.name : `${f.name} ${i + 1}`, () => __awaiter(this, void 0, void 0, function* () {\n const res = yield grok.functions.eval(addNamespace(tests[i], f));\n // eslint-disable-next-line no-throw-literal\n if (res !== true)\n throw `Failed: ${tests[i]}`;\n })));\n }\n }\n wasRegistered[packageId] = true;\n if (!moduleAutoTests.length)\n return;\n moduleTests[autoTestsCatName] = { tests: moduleAutoTests };\n });\n}\nexport function runTests(options) {\n var _a, _b, _c, _d;\n var _e;\n return __awaiter(this, void 0, void 0, function* () {\n const package_ = (_b = (_a = grok.functions.getCurrentCall()) === null || _a === void 0 ? void 0 : _a.func) === null || _b === void 0 ? void 0 : _b.package;\n yield initAutoTests(package_.id);\n const results = [];\n console.log(`Running tests`);\n options !== null && options !== void 0 ? options : (options = {});\n (_c = (_e = options).testContext) !== null && _c !== void 0 ? _c : (_e.testContext = new TestContext());\n grok.shell.lastError = '';\n for (const [key, value] of Object.entries(tests)) {\n if ((options === null || options === void 0 ? void 0 : options.category) != undefined) {\n if (!key.toLowerCase().startsWith(options === null || options === void 0 ? void 0 : options.category.toLowerCase()))\n continue;\n }\n console.log(`Started ${key} category`);\n try {\n if (value.before)\n yield value.before();\n }\n catch (x) {\n value.beforeStatus = x.toString();\n }\n const t = (_d = value.tests) !== null && _d !== void 0 ? _d : [];\n const res = [];\n for (let i = 0; i < t.length; i++)\n res.push(yield execTest(t[i], options === null || options === void 0 ? void 0 : options.test));\n const data = (yield Promise.all(res)).filter((d) => d.result != 'skipped');\n try {\n if (value.after)\n yield value.after();\n }\n catch (x) {\n value.afterStatus = x.toString();\n }\n if (value.afterStatus)\n data.push({ category: key, name: 'init', result: value.afterStatus, success: false, ms: 0, skipped: false });\n if (value.beforeStatus)\n data.push({ category: key, name: 'init', result: value.beforeStatus, success: false, ms: 0, skipped: false });\n results.push(...data);\n }\n if (options.testContext.catchUnhandled) {\n yield delay(1000);\n if (grok.shell.lastError.length > 0) {\n results.push({\n category: 'Unhandled exceptions',\n name: 'exceptions',\n result: grok.shell.lastError, success: false, ms: 0, skipped: false\n });\n }\n }\n if (options.testContext.report) {\n const logger = new DG.Logger();\n const successful = results.filter((r) => r.success).length;\n const skipped = results.filter((r) => r.skipped).length;\n const failed = results.filter((r) => !r.success);\n const description = 'Package @package tested: @successful successful, @skipped skipped, @failed failed tests';\n const params = {\n successful: successful,\n skipped: skipped,\n failed: failed.length,\n package: package_\n };\n for (const r of failed)\n Object.assign(params, { [`${r.category} | ${r.name}`]: r.result });\n logger.log(description, params, 'package-tested');\n }\n return results;\n });\n}\nfunction execTest(t, predicate) {\n var _a, _b, _c;\n return __awaiter(this, void 0, void 0, function* () {\n let r;\n const filter = predicate != undefined && (!t.name.toLowerCase().startsWith(predicate.toLowerCase()));\n const skip = ((_a = t.options) === null || _a === void 0 ? void 0 : _a.skipReason) || filter;\n const skipReason = filter ? 'skipped' : (_b = t.options) === null || _b === void 0 ? void 0 : _b.skipReason;\n if (!skip)\n console.log(`Started ${t.category} ${t.name}`);\n const start = new Date();\n try {\n if (skip)\n r = { success: true, result: skipReason, ms: 0, skipped: true };\n else\n r = { success: true, result: (_c = yield t.test()) !== null && _c !== void 0 ? _c : 'OK', ms: 0, skipped: false };\n }\n catch (x) {\n r = { success: false, result: x.toString(), ms: 0, skipped: false };\n }\n const stop = new Date();\n // @ts-ignore\n r.ms = stop - start;\n if (!skip)\n console.log(`Finished ${t.category} ${t.name} for ${r.ms} ms`);\n r.category = t.category;\n r.name = t.name;\n return r;\n });\n}\n/* Waits [ms] milliseconds */\nexport function delay(ms) {\n return __awaiter(this, void 0, void 0, function* () {\n yield new Promise((r) => setTimeout(r, ms));\n });\n}\nexport function awaitCheck(checkHandler, error = 'Timeout exceeded', wait = 500) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n clearInterval(interval);\n reject(new Error(error));\n }, wait);\n // @ts-ignore\n const interval = setInterval(() => {\n if (checkHandler()) {\n clearInterval(interval);\n resolve();\n }\n }, 50);\n });\n });\n}\nexport function isDialogPresent(dialogTitle) {\n for (let i = 0; i < DG.Dialog.getOpenDialogs().length; i++) {\n if (DG.Dialog.getOpenDialogs()[i].title == dialogTitle)\n return true;\n }\n return false;\n}\nexport function testViewer(v, df, detectSemanticTypes = false) {\n return __awaiter(this, void 0, void 0, function* () {\n if (detectSemanticTypes)\n yield grok.data.detectSemanticTypes(df);\n const tv = grok.shell.addTableView(df);\n const viewerName = `[name=viewer-${v.replace(/\\s+/g, '-')} i]`;\n const selector = `${viewerName} canvas,${viewerName} svg,${viewerName} img,\n ${viewerName} input,${viewerName} h1,${viewerName} a`;\n const res = [];\n try {\n let viewer = tv.addViewer(v);\n yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer', 3000);\n res.push(Array.from(tv.viewers).length);\n Array.from(df.row(0).cells).forEach((c) => c.value = null);\n df.rows.select((row) => row.idx > 1 && row.idx < 7);\n for (let i = 7; i < 12; i++)\n df.filter.set(i, false);\n df.currentRowIdx = 1;\n const props = viewer.getOptions(true).look;\n const newProps = {};\n Object.keys(props).filter((k) => typeof props[k] === 'boolean').forEach((k) => newProps[k] = !props[k]);\n viewer.setOptions(newProps);\n yield delay(250);\n const layout = tv.saveLayout();\n const oldProps = viewer.getOptions().look;\n tv.resetLayout();\n res.push(Array.from(tv.viewers).length);\n tv.loadLayout(layout);\n yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer from layout', 3000);\n yield delay(250);\n res.push(Array.from(tv.viewers).length);\n viewer = Array.from(tv.viewers).find((v) => v.type !== 'Grid');\n expectArray(res, [2, 1, 2]);\n expect(JSON.stringify(viewer.getOptions().look), JSON.stringify(oldProps));\n }\n finally {\n tv.close();\n grok.shell.closeTable(df);\n }\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBS3RDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FLZCxFQUFFLENBQUM7QUFFUCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQztBQUN0QyxNQUFNLGFBQWEsR0FBNkIsRUFBRSxDQUFDO0FBQ25ELE1BQU0sQ0FBQyxJQUFJLGVBQXVCLENBQUM7QUFFbkMsTUFBTSxLQUFXLE1BQU0sQ0FLdEI7QUFMRCxXQUFpQixNQUFNO0lBQ3JCLFNBQWdCLE9BQU8sQ0FBQyxLQUFVLEVBQUUsSUFBYTtRQUMvQyxJQUFJLEtBQUssSUFBSSxJQUFJO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBSGUsY0FBTyxVQUd0QixDQUFBO0FBQ0gsQ0FBQyxFQUxnQixNQUFNLEtBQU4sTUFBTSxRQUt0QjtBQVFELE1BQU0sT0FBTyxXQUFXO0lBSXRCLFlBQVksY0FBd0IsRUFBRSxNQUFnQjtRQUh0RCxtQkFBYyxHQUFHLElBQUksQ0FBQztRQUN0QixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBR2IsSUFBSSxjQUFjLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3ZFLElBQUksTUFBTSxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUNqRCxDQUFDO0lBQUEsQ0FBQztDQUNIO0FBRUQsTUFBTSxPQUFPLElBQUk7SUFNZixZQUFZLFFBQWdCLEVBQUUsSUFBWSxFQUFFLElBQXdCLEVBQUUsT0FB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Q0FBQztZQUNYLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IFRpbWVvdXQgPSBOb2RlSlMuVGltZW91dDtcbmltcG9ydCB7RGF0YUZyYW1lfSBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5leHBvcnQgY29uc3QgdGVzdHM6IHtcbiAgW2tleTogc3RyaW5nXToge1xuICAgIHRlc3RzPzogVGVzdFtdLCBiZWZvcmU/OiAoKSA9PiBQcm9taXNlPHZvaWQ+LCBhZnRlcj86ICgpID0+IFByb21pc2U8dm9pZD4sXG4gICAgYmVmb3JlU3RhdHVzPzogc3RyaW5nLCBhZnRlclN0YXR1cz86IHN0cmluZ1xuICB9XG59ID0ge307XG5cbmNvbnN0IGF1dG9UZXN0c0NhdE5hbWUgPSAnQXV0byBUZXN0cyc7XG5jb25zdCB3YXNSZWdpc3RlcmVkOiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn0gPSB7fTtcbmV4cG9ydCBsZXQgY3VycmVudENhdGVnb3J5OiBzdHJpbmc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgYXNzdXJlIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIG5vdE51bGwodmFsdWU6IGFueSwgbmFtZT86IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke25hbWUgPT0gbnVsbCA/ICdWYWx1ZScgOiBuYW1lfSBub3QgZGVmaW5lZGApO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdE9wdGlvbnMge1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICB1bmhhbmRsZWRFeGNlcHRpb25UaW1lb3V0PzogbnVtYmVyO1xuICBza2lwUmVhc29uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgVGVzdENvbnRleHQge1xuICBjYXRjaFVuaGFuZGxlZCA9IHRydWU7XG4gIHJlcG9ydCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGNhdGNoVW5oYW5kbGVkPzogYm9vbGVhbiwgcmVwb3J0PzogYm9vbGVhbikge1xuICAgIGlmIChjYXRjaFVuaGFuZGxlZCAhPT0gdW5kZWZpbmVkKSB0aGlzLmNhdGNoVW5oYW5kbGVkID0gY2F0Y2hVbmhhbmRsZWQ7XG4gICAgaWYgKHJlcG9ydCAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlcG9ydCA9IHJlcG9ydDtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFRlc3Qge1xuICB0ZXN0OiAoKSA9PiBQcm9taXNlPGFueT47XG4gIG5hbWU6IHN0cmluZztcbiAgY2F0ZWdvcnk6IHN0cmluZztcbiAgb3B0aW9ucz86IFRlc3RPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKGNhdGVnb3J5OiBzdHJpbmcsIG5hbWU6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+LCBvcHRpb25zPzogVGVzdE9wdGlvbnMpIHtcbiAgICB0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICBvcHRpb25zID8/PSB7fTtcbiAgICBvcHRpb25zLnRpbWVvdXQgPz89IDMwMDAwO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy50ZXN0ID0gYXN5bmMgKCk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGVzdCgpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdEV2ZW50PFQ+KGV2ZW50OiBPYnNlcnZhYmxlPFQ+LFxuICBoYW5kbGVyOiAoYXJnczogVCkgPT4gdm9pZCwgdHJpZ2dlcjogKCkgPT4gdm9pZCwgbXM6IG51bWJlciA9IDApOiBQcm9taXNlPHN0cmluZz4ge1xuICBsZXQgc3ViOiBTdWJzY3JpcHRpb247XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc3ViID0gZXZlbnQuc3Vic2NyaWJlKChhcmdzKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBoYW5kbGVyKGFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIHJlc29sdmUoJ09LJyk7XG4gICAgfSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QoJ3RpbWVvdXQnKTtcbiAgICB9LCBtcyk7XG4gICAgdHJpZ2dlcigpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRlc3QobmFtZTogc3RyaW5nLCB0ZXN0OiAoKSA9PiBQcm9taXNlPGFueT4sIG9wdGlvbnM/OiBUZXN0T3B0aW9ucyk6IHZvaWQge1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XSA9PSB1bmRlZmluZWQpXG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyA9PSB1bmRlZmluZWQpXG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyA9IFtdO1xuICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLnRlc3RzIS5wdXNoKG5ldyBUZXN0KGN1cnJlbnRDYXRlZ29yeSwgbmFtZSwgdGVzdCwgb3B0aW9ucykpO1xufVxuXG4vKiBUZXN0cyB0d28gb2JqZWN0cyBmb3IgZXF1YWxpdHksIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhleSBhcmUgbm90IGVxdWFsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdChhY3R1YWw6IGFueSwgZXhwZWN0ZWQ6IGFueSA9IHRydWUsIGVycm9yPzogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChlcnJvcilcbiAgICBlcnJvciA9IGAke2Vycm9yfSwgYDtcbiAgZWxzZSBlcnJvciA9ICcnO1xuICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3J9RXhwZWN0ZWQgXCIke2V4cGVjdGVkfVwiLCBnb3QgXCIke2FjdHVhbH1cImApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0RmxvYXQoYWN0dWFsOiBudW1iZXIsIGV4cGVjdGVkOiBudW1iZXIsIHRvbGVyYW5jZSA9IDAuMDAxLCBlcnJvcj86IHN0cmluZyk6IHZvaWQge1xuICBpZiAoKGFjdHVhbCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZICYmIGV4cGVjdGVkID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHx8XG4gICAgICAoYWN0dWFsID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgJiYgZXhwZWN0ZWQgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSkgfHxcbiAgICAgIChhY3R1YWwgPT09IE51bWJlci5OYU4gJiYgZXhwZWN0ZWQgPT09IE51bWJlci5OYU4pIHx8IChpc05hTihhY3R1YWwpICYmIGlzTmFOKGV4cGVjdGVkKSkpXG4gICAgcmV0dXJuO1xuICBjb25zdCBhcmVFcXVhbCA9IE1hdGguYWJzKGFjdHVhbCAtIGV4cGVjdGVkKSA8IHRvbGVyYW5jZTtcbiAgZXhwZWN0KGFyZUVxdWFsLCB0cnVlLCBgJHtlcnJvciA/PyAnJ30gKHRvbGVyYW5jZSA9ICR7dG9sZXJhbmNlfSlgKTtcbiAgaWYgKCFhcmVFcXVhbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZXhwZWN0ZWR9LCBnb3QgJHthY3R1YWx9ICh0b2xlcmFuY2UgPSAke3RvbGVyYW5jZX0pYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RUYWJsZShhY3R1YWw6IERhdGFGcmFtZSwgZXhwZWN0ZWQ6IERhdGFGcmFtZSwgZXJyb3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZXhwZWN0ZWRSb3dDb3VudCA9IGV4cGVjdGVkLnJvd0NvdW50O1xuICBjb25zdCBhY3R1YWxSb3dDb3VudCA9IGFjdHVhbC5yb3dDb3VudDtcbiAgZXhwZWN0KGFjdHVhbFJvd0NvdW50LCBleHBlY3RlZFJvd0NvdW50LCBgJHtlcnJvciA/PyAnJ30sIHJvdyBjb3VudGApO1xuXG4gIGZvciAoY29uc3QgY29sdW1uIG9mIGV4cGVjdGVkLmNvbHVtbnMpIHtcbiAgICBjb25zdCBhY3R1YWxDb2x1bW4gPSBhY3R1YWwuY29sdW1ucy5ieU5hbWUoY29sdW1uLm5hbWUpO1xuICAgIGlmIChhY3R1YWxDb2x1bW4gPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uICR7Y29sdW1uLm5hbWV9IG5vdCBmb3VuZGApO1xuICAgIGlmIChhY3R1YWxDb2x1bW4udHlwZSAhPSBjb2x1bW4udHlwZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uICR7Y29sdW1uLm5hbWV9IHR5cGUgZXhwZWN0ZWQgJHtjb2x1bW4udHlwZX0gZ290ICR7YWN0dWFsQ29sdW1uLnR5cGV9YCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBlY3RlZFJvd0NvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29sdW1uLmdldChpKTtcbiAgICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gYWN0dWFsQ29sdW1uLmdldChpKTtcbiAgICAgIGlmIChjb2x1bW4udHlwZSA9PSBERy5UWVBFLkZMT0FUKVxuICAgICAgICBleHBlY3RGbG9hdChhY3R1YWxWYWx1ZSwgdmFsdWUsIDAuMDAwMSwgZXJyb3IpO1xuICAgICAgZWxzZSBpZiAoY29sdW1uLnR5cGUgPT0gREcuVFlQRS5EQVRFX1RJTUUpXG4gICAgICAgIGV4cGVjdChhY3R1YWxWYWx1ZS5pc1NhbWUodmFsdWUpLCB0cnVlLCBlcnJvcik7XG4gICAgICBlbHNlXG4gICAgICAgIGV4cGVjdChhY3R1YWxWYWx1ZSwgdmFsdWUsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdE9iamVjdChhY3R1YWw6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGV4cGVjdGVkOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7XG4gIGZvciAoY29uc3QgW2V4cGVjdGVkS2V5LCBleHBlY3RlZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhleHBlY3RlZCkpIHtcbiAgICBpZiAoIWFjdHVhbC5oYXNPd25Qcm9wZXJ0eShleHBlY3RlZEtleSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHByb3BlcnR5IFwiJHtleHBlY3RlZEtleX1cIiBub3QgZm91bmRgKTtcblxuICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gYWN0dWFsW2V4cGVjdGVkS2V5XTtcbiAgICBpZiAoYWN0dWFsVmFsdWUgaW5zdGFuY2VvZiBBcnJheSAmJiBleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgQXJyYXkpXG4gICAgICBleHBlY3RBcnJheShhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsVmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgIGV4cGVjdE9iamVjdChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7XG4gICAgZWxzZSBpZiAoTnVtYmVyLmlzRmluaXRlKGFjdHVhbFZhbHVlKSAmJiBOdW1iZXIuaXNGaW5pdGUoZXhwZWN0ZWRWYWx1ZSkpXG4gICAgICBleHBlY3RGbG9hdChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsVmFsdWUgIT0gZXhwZWN0ZWRWYWx1ZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgKCR7ZXhwZWN0ZWRWYWx1ZX0pIGZvciBrZXkgJyR7ZXhwZWN0ZWRLZXl9JywgZ290ICgke2FjdHVhbFZhbHVlfSlgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0QXJyYXkoYWN0dWFsOiBBcnJheUxpa2U8YW55PiwgZXhwZWN0ZWQ6IEFycmF5TGlrZTxhbnk+KSB7XG4gIGNvbnN0IGFjdHVhbExlbmd0aCA9IGFjdHVhbC5sZW5ndGg7XG4gIGNvbnN0IGV4cGVjdGVkTGVuZ3RoID0gZXhwZWN0ZWQubGVuZ3RoO1xuXG4gIGlmIChhY3R1YWxMZW5ndGggIT0gZXhwZWN0ZWRMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEFycmF5cyBhcmUgb2YgZGlmZmVyZW50IGxlbmd0aDogYWN0dWFsIGFycmF5IGxlbmd0aCBpcyAke2FjdHVhbExlbmd0aH0gYCArXG4gICAgICBgYW5kIGV4cGVjdGVkIGFycmF5IGxlbmd0aCBpcyAke2V4cGVjdGVkTGVuZ3RofWApO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhY3R1YWxMZW5ndGg7IGkrKykge1xuICAgIGlmIChhY3R1YWxbaV0gaW5zdGFuY2VvZiBBcnJheSAmJiBleHBlY3RlZFtpXSBpbnN0YW5jZW9mIEFycmF5KVxuICAgICAgZXhwZWN0QXJyYXkoYWN0dWFsW2ldLCBleHBlY3RlZFtpXSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsW2ldIGluc3RhbmNlb2YgT2JqZWN0ICYmIGV4cGVjdGVkW2ldIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgZXhwZWN0T2JqZWN0KGFjdHVhbFtpXSwgZXhwZWN0ZWRbaV0pO1xuICAgIGVsc2UgaWYgKGFjdHVhbFtpXSAhPSBleHBlY3RlZFtpXSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtleHBlY3RlZFtpXX0gYXQgcG9zaXRpb24gJHtpfSwgZ290ICR7YWN0dWFsW2ldfWApO1xuICB9XG59XG5cbi8qIERlZmluZXMgYSB0ZXN0IHN1aXRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcsIHRlc3RzOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gIGN1cnJlbnRDYXRlZ29yeSA9IGNhdGVnb3J5O1xuICB0ZXN0cygpO1xufVxuXG4vKiBEZWZpbmVzIGEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYmVmb3JlIHRoZSB0ZXN0cyBpbiB0aGlzIGNhdGVnb3J5IGFyZSBleGVjdXRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiZWZvcmUoYmVmb3JlOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogdm9pZCB7XG4gIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID0ge307XG4gIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uYmVmb3JlID0gYmVmb3JlO1xufVxuXG4vKiBEZWZpbmVzIGEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyKGFmdGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogdm9pZCB7XG4gIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID0ge307XG4gIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uYWZ0ZXIgPSBhZnRlcjtcbn1cblxuZnVuY3Rpb24gYWRkTmFtZXNwYWNlKHM6IHN0cmluZywgZjogREcuRnVuYyk6IHN0cmluZyB7XG4gIHJldHVybiBzLnJlcGxhY2UobmV3IFJlZ0V4cChmLm5hbWUsICdnaScpLCBmLm5xTmFtZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0QXV0b1Rlc3RzKHBhY2thZ2VJZDogc3RyaW5nLCBtb2R1bGU/OiBhbnkpIHtcbiAgaWYgKHdhc1JlZ2lzdGVyZWRbcGFja2FnZUlkXSkgcmV0dXJuO1xuICBjb25zdCBtb2R1bGVUZXN0cyA9IG1vZHVsZSA/IG1vZHVsZS50ZXN0cyA6IHRlc3RzO1xuICBpZiAobW9kdWxlVGVzdHNbYXV0b1Rlc3RzQ2F0TmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgIHdhc1JlZ2lzdGVyZWRbcGFja2FnZUlkXSA9IHRydWU7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG1vZHVsZUF1dG9UZXN0cyA9IFtdO1xuICBjb25zdCBwYWNrRnVuY3Rpb25zID0gYXdhaXQgZ3Jvay5kYXBpLmZ1bmN0aW9ucy5maWx0ZXIoYHBhY2thZ2UuaWQgPSBcIiR7cGFja2FnZUlkfVwiYCkubGlzdCgpO1xuICBmb3IgKGNvbnN0IGYgb2YgcGFja0Z1bmN0aW9ucykge1xuICAgIGNvbnN0IHRlc3RzID0gZi5vcHRpb25zWyd0ZXN0J107XG4gICAgaWYgKCEodGVzdHMgJiYgQXJyYXkuaXNBcnJheSh0ZXN0cykgJiYgdGVzdHMubGVuZ3RoKSkgY29udGludWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgbW9kdWxlQXV0b1Rlc3RzLnB1c2gobmV3IFRlc3QoYXV0b1Rlc3RzQ2F0TmFtZSwgdGVzdHMubGVuZ3RoID09PSAxID8gZi5uYW1lIDogYCR7Zi5uYW1lfSAke2kgKyAxfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ3Jvay5mdW5jdGlvbnMuZXZhbChhZGROYW1lc3BhY2UodGVzdHNbaV0sIGYpKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgICAgICAgaWYgKHJlcyAhPT0gdHJ1ZSkgdGhyb3cgYEZhaWxlZDogJHt0ZXN0c1tpXX1gO1xuICAgICAgfSkpO1xuICAgIH1cbiAgfVxuICB3YXNSZWdpc3RlcmVkW3BhY2thZ2VJZF0gPSB0cnVlO1xuICBpZiAoIW1vZHVsZUF1dG9UZXN0cy5sZW5ndGgpIHJldHVybjtcbiAgbW9kdWxlVGVzdHNbYXV0b1Rlc3RzQ2F0TmFtZV0gPSB7dGVzdHM6IG1vZHVsZUF1dG9UZXN0c307XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5UZXN0cyhvcHRpb25zPzoge2NhdGVnb3J5Pzogc3RyaW5nLCB0ZXN0Pzogc3RyaW5nLCB0ZXN0Q29udGV4dD86IFRlc3RDb250ZXh0fSkge1xuICBjb25zdCBwYWNrYWdlXyA9IGdyb2suZnVuY3Rpb25zLmdldEN1cnJlbnRDYWxsKCk/LmZ1bmM/LnBhY2thZ2U7XG4gIGF3YWl0IGluaXRBdXRvVGVzdHMocGFja2FnZV8uaWQpO1xuICBjb25zdCByZXN1bHRzOiB7IGNhdGVnb3J5Pzogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBzdWNjZXNzOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgIHJlc3VsdDogc3RyaW5nLCBtczogbnVtYmVyLCBza2lwcGVkOiBib29sZWFuIH1bXSA9IFtdO1xuICBjb25zb2xlLmxvZyhgUnVubmluZyB0ZXN0c2ApO1xuICBvcHRpb25zID8/PSB7fTtcbiAgb3B0aW9ucyEudGVzdENvbnRleHQgPz89IG5ldyBUZXN0Q29udGV4dCgpO1xuICBncm9rLnNoZWxsLmxhc3RFcnJvciA9ICcnO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0ZXN0cykpIHtcbiAgICBpZiAob3B0aW9ucz8uY2F0ZWdvcnkgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIWtleS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgob3B0aW9ucz8uY2F0ZWdvcnkudG9Mb3dlckNhc2UoKSkpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke2tleX0gY2F0ZWdvcnlgKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHZhbHVlLmJlZm9yZSlcbiAgICAgICAgYXdhaXQgdmFsdWUuYmVmb3JlKCk7XG4gICAgfSBjYXRjaCAoeDogYW55KSB7XG4gICAgICB2YWx1ZS5iZWZvcmVTdGF0dXMgPSB4LnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGNvbnN0IHQgPSB2YWx1ZS50ZXN0cyA/PyBbXTtcbiAgICBjb25zdCByZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspXG4gICAgICByZXMucHVzaChhd2FpdCBleGVjVGVzdCh0W2ldLCBvcHRpb25zPy50ZXN0KSk7XG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCBQcm9taXNlLmFsbChyZXMpKS5maWx0ZXIoKGQpID0+IGQucmVzdWx0ICE9ICdza2lwcGVkJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5hZnRlcilcbiAgICAgICAgYXdhaXQgdmFsdWUuYWZ0ZXIoKTtcbiAgICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICAgIHZhbHVlLmFmdGVyU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAodmFsdWUuYWZ0ZXJTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5hZnRlclN0YXR1cywgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZX0pO1xuICAgIGlmICh2YWx1ZS5iZWZvcmVTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5iZWZvcmVTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlLCBtczogMCwgc2tpcHBlZDogZmFsc2V9KTtcbiAgICByZXN1bHRzLnB1c2goLi4uZGF0YSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMudGVzdENvbnRleHQuY2F0Y2hVbmhhbmRsZWQpIHtcbiAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICBpZiAoZ3Jvay5zaGVsbC5sYXN0RXJyb3IubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgY2F0ZWdvcnk6ICdVbmhhbmRsZWQgZXhjZXB0aW9ucycsXG4gICAgICAgIG5hbWU6ICdleGNlcHRpb25zJyxcbiAgICAgICAgcmVzdWx0OiBncm9rLnNoZWxsLmxhc3RFcnJvciwgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChvcHRpb25zLnRlc3RDb250ZXh0LnJlcG9ydCkge1xuICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBERy5Mb2dnZXIoKTtcbiAgICBjb25zdCBzdWNjZXNzZnVsID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuc3VjY2VzcykubGVuZ3RoO1xuICAgIGNvbnN0IHNraXBwZWQgPSByZXN1bHRzLmZpbHRlcigocikgPT4gci5za2lwcGVkKS5sZW5ndGg7XG4gICAgY29uc3QgZmFpbGVkID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+ICFyLnN1Y2Nlc3MpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gJ1BhY2thZ2UgQHBhY2thZ2UgdGVzdGVkOiBAc3VjY2Vzc2Z1bCBzdWNjZXNzZnVsLCBAc2tpcHBlZCBza2lwcGVkLCBAZmFpbGVkIGZhaWxlZCB0ZXN0cyc7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgc3VjY2Vzc2Z1bDogc3VjY2Vzc2Z1bCxcbiAgICAgIHNraXBwZWQ6IHNraXBwZWQsXG4gICAgICBmYWlsZWQ6IGZhaWxlZC5sZW5ndGgsXG4gICAgICBwYWNrYWdlOiBwYWNrYWdlX1xuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIGZhaWxlZCkgT2JqZWN0LmFzc2lnbihwYXJhbXMsIHtbYCR7ci5jYXRlZ29yeX0gfCAke3IubmFtZX1gXTogci5yZXN1bHR9KTtcbiAgICBsb2dnZXIubG9nKGRlc2NyaXB0aW9uLCBwYXJhbXMsICdwYWNrYWdlLXRlc3RlZCcpO1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjVGVzdCh0OiBUZXN0LCBwcmVkaWNhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICBsZXQgcjogeyBjYXRlZ29yeT86IHN0cmluZywgbmFtZT86IHN0cmluZywgc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIG1zOiBudW1iZXIsIHNraXBwZWQ6IGJvb2xlYW4gfTtcbiAgY29uc3QgZmlsdGVyID0gcHJlZGljYXRlICE9IHVuZGVmaW5lZCAmJiAoIXQubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocHJlZGljYXRlLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc2tpcCA9IHQub3B0aW9ucz8uc2tpcFJlYXNvbiB8fCBmaWx0ZXI7XG4gIGNvbnN0IHNraXBSZWFzb24gPSBmaWx0ZXIgPyAnc2tpcHBlZCcgOiB0Lm9wdGlvbnM/LnNraXBSZWFzb247XG4gIGlmICghc2tpcClcbiAgICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke3QuY2F0ZWdvcnl9ICR7dC5uYW1lfWApO1xuICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCk7XG4gIHRyeSB7XG4gICAgaWYgKHNraXApXG4gICAgICByID0ge3N1Y2Nlc3M6IHRydWUsIHJlc3VsdDogc2tpcFJlYXNvbiEsIG1zOiAwLCBza2lwcGVkOiB0cnVlfTtcbiAgICBlbHNlXG4gICAgICByID0ge3N1Y2Nlc3M6IHRydWUsIHJlc3VsdDogYXdhaXQgdC50ZXN0KCkgPz8gJ09LJywgbXM6IDAsIHNraXBwZWQ6IGZhbHNlfTtcbiAgfSBjYXRjaCAoeDogYW55KSB7XG4gICAgciA9IHtzdWNjZXNzOiBmYWxzZSwgcmVzdWx0OiB4LnRvU3RyaW5nKCksIG1zOiAwLCBza2lwcGVkOiBmYWxzZX07XG4gIH1cbiAgY29uc3Qgc3RvcCA9IG5ldyBEYXRlKCk7XG4gIC8vIEB0cy1pZ25vcmVcbiAgci5tcyA9IHN0b3AgLSBzdGFydDtcbiAgaWYgKCFza2lwKVxuICAgIGNvbnNvbGUubG9nKGBGaW5pc2hlZCAke3QuY2F0ZWdvcnl9ICR7dC5uYW1lfSBmb3IgJHtyLm1zfSBtc2ApO1xuICByLmNhdGVnb3J5ID0gdC5jYXRlZ29yeTtcbiAgci5uYW1lID0gdC5uYW1lO1xuICByZXR1cm4gcjtcbn1cblxuLyogV2FpdHMgW21zXSBtaWxsaXNlY29uZHMgKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxheShtczogbnVtYmVyKSB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIG1zKSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhd2FpdENoZWNrKGNoZWNrSGFuZGxlcjogKCkgPT4gYm9vbGVhbixcbiAgZXJyb3I6IHN0cmluZyA9ICdUaW1lb3V0IGV4Y2VlZGVkJywgd2FpdDogbnVtYmVyID0gNTAwKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoZXJyb3IpKTtcbiAgICB9LCB3YWl0KTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgaW50ZXJ2YWw6IFRpbWVvdXQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAoY2hlY2tIYW5kbGVyKCkpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9LCA1MCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEaWFsb2dQcmVzZW50KGRpYWxvZ1RpdGxlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBERy5EaWFsb2cuZ2V0T3BlbkRpYWxvZ3MoKS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChERy5EaWFsb2cuZ2V0T3BlbkRpYWxvZ3MoKVtpXS50aXRsZSA9PSBkaWFsb2dUaXRsZSlcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RWaWV3ZXIodjogc3RyaW5nLCBkZjogREcuRGF0YUZyYW1lLCBkZXRlY3RTZW1hbnRpY1R5cGVzOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGRldGVjdFNlbWFudGljVHlwZXMpIGF3YWl0IGdyb2suZGF0YS5kZXRlY3RTZW1hbnRpY1R5cGVzKGRmKTtcbiAgY29uc3QgdHYgPSBncm9rLnNoZWxsLmFkZFRhYmxlVmlldyhkZik7XG4gIGNvbnN0IHZpZXdlck5hbWUgPSBgW25hbWU9dmlld2VyLSR7di5yZXBsYWNlKC9cXHMrL2csICctJyl9IGldYDtcbiAgY29uc3Qgc2VsZWN0b3IgPSBgJHt2aWV3ZXJOYW1lfSBjYW52YXMsJHt2aWV3ZXJOYW1lfSBzdmcsJHt2aWV3ZXJOYW1lfSBpbWcsXG4gICAgJHt2aWV3ZXJOYW1lfSBpbnB1dCwke3ZpZXdlck5hbWV9IGgxLCR7dmlld2VyTmFtZX0gYWA7XG4gIGNvbnN0IHJlcyA9IFtdO1xuICB0cnkge1xuICAgIGxldCB2aWV3ZXIgPSB0di5hZGRWaWV3ZXIodik7XG4gICAgYXdhaXQgYXdhaXRDaGVjaygoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSAhPT0gbnVsbCxcbiAgICAgICdjYW5ub3QgbG9hZCB2aWV3ZXInLCAzMDAwKTtcbiAgICByZXMucHVzaChBcnJheS5mcm9tKHR2LnZpZXdlcnMpLmxlbmd0aCk7XG4gICAgQXJyYXkuZnJvbShkZi5yb3coMCkuY2VsbHMpLmZvckVhY2goKGMpID0+IGMudmFsdWUgPSBudWxsKTtcbiAgICBkZi5yb3dzLnNlbGVjdCgocm93KSA9PiByb3cuaWR4ID4gMSAmJiByb3cuaWR4IDwgNyk7XG4gICAgZm9yIChsZXQgaSA9IDc7IGkgPCAxMjsgaSsrKSBkZi5maWx0ZXIuc2V0KGksIGZhbHNlKTtcbiAgICBkZi5jdXJyZW50Um93SWR4ID0gMTtcbiAgICBjb25zdCBwcm9wcyA9IHZpZXdlci5nZXRPcHRpb25zKHRydWUpLmxvb2s7XG4gICAgY29uc3QgbmV3UHJvcHM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gICAgT2JqZWN0LmtleXMocHJvcHMpLmZpbHRlcigoaykgPT4gdHlwZW9mIHByb3BzW2tdID09PSAnYm9vbGVhbicpLmZvckVhY2goKGspID0+IG5ld1Byb3BzW2tdID0gIXByb3BzW2tdKTtcbiAgICB2aWV3ZXIuc2V0T3B0aW9ucyhuZXdQcm9wcyk7XG4gICAgYXdhaXQgZGVsYXkoMjUwKTtcbiAgICBjb25zdCBsYXlvdXQgPSB0di5zYXZlTGF5b3V0KCk7XG4gICAgY29uc3Qgb2xkUHJvcHMgPSB2aWV3ZXIuZ2V0T3B0aW9ucygpLmxvb2s7XG4gICAgdHYucmVzZXRMYXlvdXQoKTtcbiAgICByZXMucHVzaChBcnJheS5mcm9tKHR2LnZpZXdlcnMpLmxlbmd0aCk7XG4gICAgdHYubG9hZExheW91dChsYXlvdXQpO1xuICAgIGF3YWl0IGF3YWl0Q2hlY2soKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgIT09IG51bGwsXG4gICAgICAnY2Fubm90IGxvYWQgdmlld2VyIGZyb20gbGF5b3V0JywgMzAwMCk7XG4gICAgYXdhaXQgZGVsYXkoMjUwKTtcbiAgICByZXMucHVzaChBcnJheS5mcm9tKHR2LnZpZXdlcnMpLmxlbmd0aCk7XG4gICAgdmlld2VyID0gQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5maW5kKCh2KSA9PiB2LnR5cGUgIT09ICdHcmlkJykhO1xuICAgIGV4cGVjdEFycmF5KHJlcywgWzIsIDEsIDJdKTtcbiAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkodmlld2VyLmdldE9wdGlvbnMoKS5sb29rKSwgSlNPTi5zdHJpbmdpZnkob2xkUHJvcHMpKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0di5jbG9zZSgpO1xuICAgIGdyb2suc2hlbGwuY2xvc2VUYWJsZShkZik7XG4gIH1cbn1cbiJdfQ==","export function errorToConsole(err) {\n var _a;\n if (typeof err === 'string' || err instanceof String) {\n return err;\n }\n else if ((typeof err == 'object' || err instanceof Object) && '$thrownJsError' in err) {\n return errorToConsole(err['$thrownJsError']);\n }\n else if (err instanceof Error) {\n return (_a = err.stack) !== null && _a !== void 0 ? _a : err.message;\n }\n else {\n return err.toString();\n }\n}\nexport function rectToConsole(rect) {\n return `(x=${rect.x}, y=${rect.y}, w=${rect.width}, h=${rect.height})`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8tY29uc29sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvLWNvbnNvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFROztJQUNyQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLFlBQVksTUFBTSxFQUFFO1FBQ3BELE9BQU8sR0FBYSxDQUFDO0tBQ3RCO1NBQU0sSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFFBQVEsSUFBSSxHQUFHLFlBQVksTUFBTSxDQUFDLElBQUksZ0JBQWdCLElBQUksR0FBRyxFQUFFO1FBQ3ZGLE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7S0FDOUM7U0FBTSxJQUFJLEdBQUcsWUFBWSxLQUFLLEVBQUU7UUFDL0IsT0FBTyxNQUFDLEdBQWEsQ0FBQyxLQUFLLG1DQUFLLEdBQWEsQ0FBQyxPQUFPLENBQUM7S0FDdkQ7U0FBTTtRQUNMLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQ3ZCO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsSUFBYTtJQUN6QyxPQUFPLE1BQU0sSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO0FBQ3pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvclRvQ29uc29sZShlcnI6IGFueSk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJyB8fCBlcnIgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICByZXR1cm4gZXJyIGFzIHN0cmluZztcbiAgfSBlbHNlIGlmICgodHlwZW9mIGVyciA9PSAnb2JqZWN0JyB8fCBlcnIgaW5zdGFuY2VvZiBPYmplY3QpICYmICckdGhyb3duSnNFcnJvcicgaW4gZXJyKSB7XG4gICAgcmV0dXJuIGVycm9yVG9Db25zb2xlKGVyclsnJHRocm93bkpzRXJyb3InXSk7XG4gIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gKGVyciBhcyBFcnJvcikuc3RhY2sgPz8gKGVyciBhcyBFcnJvcikubWVzc2FnZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXJyLnRvU3RyaW5nKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY3RUb0NvbnNvbGUocmVjdDogREcuUmVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBgKHg9JHtyZWN0Lnh9LCB5PSR7cmVjdC55fSwgdz0ke3JlY3Qud2lkdGh9LCBoPSR7cmVjdC5oZWlnaHR9KWA7XG59XG4iXX0=","/**\n * Denotes a vector of floating poit values.\n *\n * @export\n * @class Vector\n * @extends {Float32Array}\n */\nexport class Vector extends Float32Array {\n}\n/**\n * Denotes a two-dimensional matrix.\n *\n * @export\n * @class Matrix\n * @extends {Array<Vector>}\n */\nexport class Matrix extends Array {\n}\n/**\n * Denotes cartesian coordinates.\n *\n * @export\n * @class Coordinates\n * @extends {Matrix}\n */\nexport class Coordinates extends Matrix {\n}\n/**\n * Denotes an array of arbitrary-typed vectors.\n *\n * @export\n * @class Vectors\n * @extends {Array<any>}\n */\nexport class Vectors extends Array {\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLWRlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVub3RlcyBhIHZlY3RvciBvZiBmbG9hdGluZyBwb2l0IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVmVjdG9yXG4gKiBAZXh0ZW5kcyB7RmxvYXQzMkFycmF5fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yIGV4dGVuZHMgRmxvYXQzMkFycmF5IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIHR3by1kaW1lbnNpb25hbCBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE1hdHJpeFxuICogQGV4dGVuZHMge0FycmF5PFZlY3Rvcj59XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBcnJheTxWZWN0b3I+IHt9XG5cbi8qKlxuICogRGVub3RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvb3JkaW5hdGVzXG4gKiBAZXh0ZW5kcyB7TWF0cml4fVxuICovXG5leHBvcnQgY2xhc3MgQ29vcmRpbmF0ZXMgZXh0ZW5kcyBNYXRyaXgge31cblxuLyoqXG4gKiBEZW5vdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeS10eXBlZCB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBWZWN0b3JzXG4gKiBAZXh0ZW5kcyB7QXJyYXk8YW55Pn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcnMgZXh0ZW5kcyBBcnJheTxhbnk+IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBmdW5jdGlvbiBvcHRpb25zLlxuICpcbiAqIEBleHBvcnRcbiAqIEB0eXBlIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcbiAqIEBwYXJhbSB7YW55fSB2MSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHthbnl9IHYyIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBEaXN0YW5jZU1ldHJpYyA9ICh2MTogYW55LCB2MjogYW55KSA9PiAobnVtYmVyKTtcblxuLyoqXG4gKiBEZW5vdGVzIGEgc2ltcGxlIHN0cmluZyB0byBzdHJpbmcgZGljdGlvbmFyeS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdHlwZSBTdHJpbmdEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0RpY3Rpb25hcnkgPSB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbiJdfQ==","import { Vector } from './type-declarations';\nimport { randomFloat, randomInt } from './random';\n/**\n * Asserts a condition by throwing an Error.\n *\n * @export\n * @param {boolean} [condition=false] Condition to assert.\n * @param {string} [message='Assertion error.'] Message to output.\n * @throws {Error}\n */\nexport function assert(condition = false, message = 'Assertion error.') {\n if (!condition)\n throw new Error(message);\n}\n/**\n * Creates new two-dimensional array and fills it with the value given.\n *\n * @param {number} dimension1 The first dimension of the coordinates (number of rows).\n * @param {number} dimension2 The second dimension of the coordinates (number of columns).\n * @param {number} [fill=0] A value to fill the coordinates with.\n * @return {Coordinates} A two-dimensional filled with the value given.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nfunction initCoordinates(dimension1, dimension2, fill = 0) {\n return new Array(dimension1).fill(fill).map(() => (new Vector(dimension2).fill(fill)));\n}\n/**\n * Transpose matrix.\n *\n * @export\n * @param {Matrix} matrix The matrix to be transposed.\n * @return {Matrix} Transposed matrix.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function transposeMatrix(matrix) {\n return new Array(matrix[0].length).fill(0)\n .map((_, i) => (new Vector(matrix.length).fill(0).map((_, j) => (matrix[j][i]))));\n}\n/**\n * Adds two vectors with the second one to be multiplied by the given ratio.\n *\n * @export\n * @param {Vector} p The first vector to add.\n * @param {Vector} q The second vector to add.\n * @param {number} [multiplier=1] A multiplier to be used before the second vector is added.\n * @return {Vector} New vector contained the result of operation p+multiplier*q.\n */\nexport function vectorAdd(p, q, multiplier = 1) {\n const nItems = p.length;\n assert(nItems == q.length, 'Vector lengths do not match.');\n const total = new Vector(nItems);\n for (let i = 0; i < p.length; ++i)\n total[i] = p[i] + multiplier * q[i];\n return total;\n}\n/**\n * Sums the vector's items.\n *\n * @param {Vector} v The vector to be summed.\n * @return {number} The vector's items sum.\n */\nfunction itemsSum(v) {\n let total = 0;\n for (let i = 0; i < v.length; ++i)\n total += v[i];\n return total;\n}\n/**\n * Suqares the vector's items.\n *\n * @param {Vector} v The vector to square.\n * @return {Vector} A new vector containing the original's items squared.\n */\nfunction vectorSquare(v) {\n const nItems = v.length;\n const total = new Vector(nItems);\n for (let i = 0; i < v.length; ++i)\n total[i] = v[i] * v[i];\n return total;\n}\nexport function vectorLength(v) {\n let sqrSum = 0;\n for (let i = 0; i < v.length; i++)\n sqrSum += v[i] * v[i];\n return Math.sqrt(sqrSum);\n}\nexport function vectorDotProduct(v1, v2) {\n if (v1.length != v2.length)\n throw new Error('The dimensionality of the vectors must match');\n let prod = 0;\n for (let i = 0; i < v1.length; i++)\n prod += v1[i] * v2[i];\n return prod;\n}\n/**\n * Creates a matrix filled with random floating point values.\n *\n * @export\n * @param {number} dimension1 The first dimension of the matrix.\n * @param {number} dimension2 The second dimension of the matrix.\n * @param {number} [scale=1.] Max value given by random generator.\n * @return {Matrix} A new matrix filled with random floating point values.\n */\nexport function fillRandomMatrix(dimension1, dimension2, scale = 1.) {\n const matrix = initCoordinates(dimension1, dimension2);\n for (let i = 0; i < dimension1; ++i) {\n for (let j = 0; j < dimension2; ++j)\n matrix[i][j] = randomFloat(scale);\n }\n return matrix;\n}\n/**\n * Calculates Euclidean distance between two vectors.\n *\n * @export\n * @param {Vector} p The first vector.\n * @param {Vector} q The second vector.\n * @return {number} Euclidean distance between the given vectors.\n */\nexport function calculateEuclideanDistance(p, q) {\n const diff = vectorAdd(p, q, -1);\n const sqdiff = vectorSquare(diff);\n const sqdiffSumm = itemsSum(sqdiff);\n return Math.sqrt(sqdiffSumm);\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n }\n }\n return matrix;\n}\n/** Generates array from a range [begin; end] or [begin; end) if endExclusive. **/\nexport function genRange(begin, end, endExclusive = false) {\n const nItems = end - begin + (endExclusive ? 0 : 1);\n const series = new Int32Array(nItems);\n for (let i = 0; i < nItems; ++i)\n series[i] = begin + i;\n return series;\n}\n/**\n * Returns order of values as if they are sorted.\n *\n * @export\n * @param {any[]} values Input array.\n * @param {boolean} [reverse=false] Whether to return reversed order.\n * @return {number[]} The order computed.\n */\nexport function argSort(values, reverse = false) {\n const sortfn = reverse ? (a, b) => (b[0] - a[0]) : (a, b) => (a[0] - b[0]);\n const decor = (v, i) => [v, i]; // set index to value\n const undecor = (a) => a[1]; // leave only index\n const _argsort = (arr) => arr.map(decor).sort(sortfn).map(undecor);\n return _argsort(values);\n}\n/**\n * Returns the indexes of the most diverse objects according to the dist function\n * @param {number} length total number of objects\n * @param {number} n number of diverse elements to find\n * @param {(i1: number, i2: number) => number} dist a function which calculates distance between\n * two objects using their indexes\n * @returns {number[]} The indexes of the most diverse objects\n */\nexport function getDiverseSubset(length, n, dist) {\n function maxBy(values, orderBy) {\n let maxValue = null;\n let maxOrderBy = null;\n for (const element of values) {\n const elementOrderBy = orderBy(element);\n if (maxOrderBy == null || elementOrderBy > maxOrderBy) {\n maxValue = element;\n maxOrderBy = elementOrderBy;\n }\n }\n return maxValue;\n }\n const subset = [randomInt(length - 1)];\n const complement = new Set();\n for (let i = 0; i < length; ++i) {\n if (!subset.includes(i))\n complement.add(i);\n }\n while (subset.length < n) {\n const idx = maxBy(complement.values(), (i) => Math.min.apply(Math, subset.map(function (val, index) {\n return dist(i, val);\n })));\n if (idx) {\n subset.push(idx);\n complement.delete(idx);\n }\n }\n return subset;\n}\n/**\n * Returns normalized vector\n * @param {Vector} data numerical array\n */\nexport function normalize(data) {\n let mean = 0;\n let std = 0;\n for (let i = 0; i < data.length; ++i)\n mean += data[i];\n mean /= data.length;\n for (let i = 0; i < data.length; ++i)\n std += (data[i] - mean) * (data[i] - mean);\n std = Math.sqrt(std / data.length);\n for (let i = 0; i < data.length; ++i)\n data[i] = (data[i] - mean) / std;\n return data;\n}\n/**\n * Finds set difference between two lists.\n * @param {any[]} a The first list.\n * @param {any[]} b The second list.\n * @return {any[]}\n */\nexport function setDifference(a, b) {\n const bSet = new Set(b);\n return Array.from(new Set(a.filter((x) => !bSet.has(x))).values());\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsZUFBZSxDQUFDLFVBQWtCLEVBQUUsVUFBa0IsRUFBRSxPQUFlLENBQUM7SUFDL0UsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBYztJQUM1QyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1B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LENBQUM7UUFDbEMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBRTdDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7SUFFbkMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLENBQVEsRUFBRSxDQUFRO0lBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TWF0cml4LCBWZWN0b3IsIENvb3JkaW5hdGVzLCBWZWN0b3JzLCBEaXN0YW5jZU1ldHJpY30gZnJvbSAnLi90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge3JhbmRvbUZsb2F0LCByYW5kb21JbnR9IGZyb20gJy4vcmFuZG9tJztcblxuLyoqXG4gKiBBc3NlcnRzIGEgY29uZGl0aW9uIGJ5IHRocm93aW5nIGFuIEVycm9yLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmRpdGlvbj1mYWxzZV0gQ29uZGl0aW9uIHRvIGFzc2VydC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZT0nQXNzZXJ0aW9uIGVycm9yLiddIE1lc3NhZ2UgdG8gb3V0cHV0LlxuICogQHRocm93cyB7RXJyb3J9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uOiBib29sZWFuID0gZmFsc2UsIG1lc3NhZ2U6IHN0cmluZyA9ICdBc3NlcnRpb24gZXJyb3IuJykge1xuICBpZiAoIWNvbmRpdGlvbilcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBuZXcgdHdvLWRpbWVuc2lvbmFsIGFycmF5IGFuZCBmaWxscyBpdCB3aXRoIHRoZSB2YWx1ZSBnaXZlbi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBjb29yZGluYXRlcyAobnVtYmVyIG9mIHJvd3MpLlxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjIgVGhlIHNlY29uZCBkaW1lbnNpb24gb2YgdGhlIGNvb3JkaW5hdGVzIChudW1iZXIgb2YgY29sdW1ucykuXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGw9MF0gQSB2YWx1ZSB0byBmaWxsIHRoZSBjb29yZGluYXRlcyB3aXRoLlxuICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IEEgdHdvLWRpbWVuc2lvbmFsIGZpbGxlZCB3aXRoIHRoZSB2YWx1ZSBnaXZlbi5cbiAqIEB0b2RvIE1pZ2h0IGJlIHNsb3cgc2luY2UgdXNlZCBBcnJheS5tYXAuIFByb2JhYmx5IG5lZWRzIHBlcmZvcm1hbmNlIHJldmlzaW9uLlxuICovXG5mdW5jdGlvbiBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIGZpbGw6IG51bWJlciA9IDApOiBDb29yZGluYXRlcyB7XG4gIHJldHVybiBuZXcgQXJyYXkoZGltZW5zaW9uMSkuZmlsbChmaWxsKS5tYXAoKCkgPT4gKG5ldyBWZWN0b3IoZGltZW5zaW9uMikuZmlsbChmaWxsKSkpO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBNYXRyaXgge1xuICByZXR1cm4gbmV3IEFycmF5KG1hdHJpeFswXS5sZW5ndGgpLmZpbGwoMClcbiAgICAubWFwKChfLCBpKSA9PiAobmV3IFZlY3RvcihtYXRyaXgubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaikgPT4gKG1hdHJpeFtqXVtpXSkpKSk7XG59XG5cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocDogVmVjdG9yLCBxOiBWZWN0b3IsIG11bHRpcGxpZXI6IG51bWJlciA9IDEpOiBWZWN0b3Ige1xuICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcblxuICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuXG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHBbaV0gKyBtdWx0aXBsaWVyICogcVtpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbi8qKlxuICogU3VtcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBiZSBzdW1tZWQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2ZWN0b3IncyBpdGVtcyBzdW0uXG4gKi9cbmZ1bmN0aW9uIGl0ZW1zU3VtKHY6IFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgIHRvdGFsICs9IHZbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1cWFyZXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gc3F1YXJlLlxuICogQHJldHVybiB7VmVjdG9yfSBBIG5ldyB2ZWN0b3IgY29udGFpbmluZyB0aGUgb3JpZ2luYWwncyBpdGVtcyBzcXVhcmVkLlxuICovXG5mdW5jdGlvbiB2ZWN0b3JTcXVhcmUodjogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3Rvckxlbmd0aCh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgc3FyU3VtOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICBzcXJTdW0gKz0gdltpXSAqIHZbaV07XG4gIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvckRvdFByb2R1Y3QodjE6IFZlY3RvciwgdjI6IFZlY3Rvcik6IG51bWJlciB7XG4gIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSB2ZWN0b3JzIG11c3QgbWF0Y2gnKTtcbiAgbGV0IHByb2Q6IG51bWJlciA9IDA7XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKylcbiAgICBwcm9kICs9IHYxW2ldICogdjJbaV07XG4gIHJldHVybiBwcm9kO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xLl0gTWF4IHZhbHVlIGdpdmVuIGJ5IHJhbmRvbSBnZW5lcmF0b3IuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IEEgbmV3IG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSYW5kb21NYXRyaXgoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIHNjYWxlOiBudW1iZXIgPSAxLik6IE1hdHJpeCB7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhkaW1lbnNpb24xLCBkaW1lbnNpb24yKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbWVuc2lvbjE7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UocDogVmVjdG9yLCBxOiBWZWN0b3IpOiBudW1iZXIge1xuICBjb25zdCBkaWZmID0gdmVjdG9yQWRkKHAsIHEsIC0xKTtcbiAgY29uc3Qgc3FkaWZmID0gdmVjdG9yU3F1YXJlKGRpZmYpO1xuICBjb25zdCBzcWRpZmZTdW1tID0gaXRlbXNTdW0oc3FkaWZmKTtcbiAgcmV0dXJuIE1hdGguc3FydChzcWRpZmZTdW1tKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGlzdGFuY2UgbWF0cml4IHVzaW5nIGEgY3VzdG9tIGRpc3RhbmNlIGZ1bmN0aW9uLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yc30gZGF0YSBJbnB1dCB2ZWN0b3JzIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZXMuXG4gKiBAcGFyYW0ge0Rpc3RhbmNlTWV0cmljfSBkaXN0YW5jZSBDdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtNYXRyaXh9IENhbGN1bGF0ZWQgY3VzdG9tIGRpc3RhbmNlIG1hdHJpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGNEaXN0YW5jZU1hdHJpeChkYXRhOiBWZWN0b3JzLCBkaXN0YW5jZTogRGlzdGFuY2VNZXRyaWMpOiBNYXRyaXgge1xuICBjb25zdCBuSXRlbXMgPSBkYXRhLmxlbmd0aDtcbiAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbkl0ZW1zOyArK2opIHtcbiAgICAgIGNvbnN0IGQ6IG51bWJlciA9IChkYXRhW2ldID09IG51bGwpIHx8IChkYXRhW2pdID09IG51bGwpID8gMCA6IGRpc3RhbmNlKGRhdGFbaV0sIGRhdGFbal0pO1xuICAgICAgbWF0cml4W2ldW2pdID0gbWF0cml4W2pdW2ldID0gZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hdHJpeDtcbn1cblxuLyoqIEdlbmVyYXRlcyBhcnJheSBmcm9tIGEgcmFuZ2UgW2JlZ2luOyBlbmRdIG9yIFtiZWdpbjsgZW5kKSBpZiBlbmRFeGNsdXNpdmUuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlblJhbmdlKGJlZ2luOiBudW1iZXIsIGVuZDogbnVtYmVyLCBlbmRFeGNsdXNpdmUgPSBmYWxzZSk6IEludDMyQXJyYXkge1xuICBjb25zdCBuSXRlbXMgPSBlbmQgLSBiZWdpbiArIChlbmRFeGNsdXNpdmUgPyAwIDogMSk7XG4gIGNvbnN0IHNlcmllcyA9IG5ldyBJbnQzMkFycmF5KG5JdGVtcyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuSXRlbXM7ICsraSlcbiAgICBzZXJpZXNbaV0gPSBiZWdpbiArIGk7XG5cbiAgcmV0dXJuIHNlcmllcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG9yZGVyIG9mIHZhbHVlcyBhcyBpZiB0aGV5IGFyZSBzb3J0ZWQuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHthbnlbXX0gdmFsdWVzIElucHV0IGFycmF5LlxuICogQHBhcmFtIHtib29sZWFufSBbcmV2ZXJzZT1mYWxzZV0gV2hldGhlciB0byByZXR1cm4gcmV2ZXJzZWQgb3JkZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJbXX0gVGhlIG9yZGVyIGNvbXB1dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJnU29ydCh2YWx1ZXM6IGFueVtdLCByZXZlcnNlID0gZmFsc2UpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNvcnRmbiA9IHJldmVyc2UgPyAoYTogYW55W10sIGI6IGFueVtdKSA9PiAoYlswXSAtIGFbMF0pIDogKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGFbMF0gLSBiWzBdKTtcbiAgY29uc3QgZGVjb3IgPSAodjogYW55LCBpOiBudW1iZXIpID0+IFt2LCBpXTsgLy8gc2V0IGluZGV4IHRvIHZhbHVlXG4gIGNvbnN0IHVuZGVjb3IgPSAoYTogYW55W10pID0+IGFbMV07IC8vIGxlYXZlIG9ubHkgaW5kZXhcbiAgY29uc3QgX2FyZ3NvcnQgPSAoYXJyOiBhbnlbXSkgPT4gYXJyLm1hcChkZWNvcikuc29ydChzb3J0Zm4pLm1hcCh1bmRlY29yKTtcbiAgcmV0dXJuIF9hcmdzb3J0KHZhbHVlcyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHMgYWNjb3JkaW5nIHRvIHRoZSBkaXN0IGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIHRvdGFsIG51bWJlciBvZiBvYmplY3RzXG4gKiBAcGFyYW0ge251bWJlcn0gbiBudW1iZXIgb2YgZGl2ZXJzZSBlbGVtZW50cyB0byBmaW5kXG4gKiBAcGFyYW0geyhpMTogbnVtYmVyLCBpMjogbnVtYmVyKSA9PiBudW1iZXJ9IGRpc3QgYSBmdW5jdGlvbiB3aGljaCBjYWxjdWxhdGVzIGRpc3RhbmNlIGJldHdlZW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gb2JqZWN0cyB1c2luZyB0aGVpciBpbmRleGVzXG4gKiBAcmV0dXJucyB7bnVtYmVyW119IFRoZSBpbmRleGVzIG9mIHRoZSBtb3N0IGRpdmVyc2Ugb2JqZWN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGl2ZXJzZVN1YnNldChsZW5ndGg6IG51bWJlciwgbjogbnVtYmVyLCBkaXN0OiAoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyKTogbnVtYmVyW10ge1xuICBmdW5jdGlvbiBtYXhCeSh2YWx1ZXM6IEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPiwgb3JkZXJCeTogKGk6IG51bWJlcikgPT4gbnVtYmVyKSB7XG4gICAgbGV0IG1heFZhbHVlID0gbnVsbDtcbiAgICBsZXQgbWF4T3JkZXJCeSA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWVzKSB7XG4gICAgICBjb25zdCBlbGVtZW50T3JkZXJCeSA9IG9yZGVyQnkoZWxlbWVudCk7XG4gICAgICBpZiAobWF4T3JkZXJCeSA9PSBudWxsIHx8IGVsZW1lbnRPcmRlckJ5ID4gbWF4T3JkZXJCeSkge1xuICAgICAgICBtYXhWYWx1ZSA9IGVsZW1lbnQ7XG4gICAgICAgIG1heE9yZGVyQnkgPSBlbGVtZW50T3JkZXJCeTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heFZhbHVlO1xuICB9XG5cbiAgY29uc3Qgc3Vic2V0ID0gW3JhbmRvbUludChsZW5ndGggLSAxKV07XG4gIGNvbnN0IGNvbXBsZW1lbnQgPSBuZXcgU2V0KCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICghc3Vic2V0LmluY2x1ZGVzKGkpKVxuICAgICAgY29tcGxlbWVudC5hZGQoaSk7XG4gIH1cblxuICB3aGlsZSAoc3Vic2V0Lmxlbmd0aCA8IG4pIHtcbiAgICBjb25zdCBpZHggPSBtYXhCeShcbiAgICAgIGNvbXBsZW1lbnQudmFsdWVzKCkgYXMgSXRlcmFibGVJdGVyYXRvcjxudW1iZXI+LFxuICAgICAgKGkpID0+IE1hdGgubWluLmFwcGx5KE1hdGgsIHN1YnNldC5tYXAoZnVuY3Rpb24odmFsLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gZGlzdChpLCB2YWwpO1xuICAgICAgfSkpKTtcbiAgICBpZiAoaWR4KSB7XG4gICAgICBzdWJzZXQucHVzaChpZHgpO1xuICAgICAgY29tcGxlbWVudC5kZWxldGUoaWR4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1YnNldDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG5vcm1hbGl6ZWQgdmVjdG9yXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gZGF0YSBudW1lcmljYWwgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShkYXRhOiBWZWN0b3IpOiBWZWN0b3Ige1xuICBsZXQgbWVhbiA9IDA7XG4gIGxldCBzdGQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSlcbiAgICBtZWFuICs9IGRhdGFbaV07XG5cbiAgbWVhbiAvPSBkYXRhLmxlbmd0aDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpXG4gICAgc3RkICs9IChkYXRhW2ldIC0gbWVhbikgKiAoZGF0YVtpXSAtIG1lYW4pO1xuXG4gIHN0ZCA9IE1hdGguc3FydChzdGQgLyBkYXRhLmxlbmd0aCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pIC8gc3RkO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEZpbmRzIHNldCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGxpc3RzLlxuICogQHBhcmFtIHthbnlbXX0gYSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7YW55W119IGIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7YW55W119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREaWZmZXJlbmNlKGE6IGFueVtdLCBiOiBhbnlbXSk6IGFueVtdIHtcbiAgY29uc3QgYlNldCA9IG5ldyBTZXQoYik7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoYS5maWx0ZXIoKHgpID0+ICFiU2V0Lmhhcyh4KSkpLnZhbHVlcygpKTtcbn1cbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TSNE = void 0;\nvar tsne_1 = require(\"./tsne\");\nObject.defineProperty(exports, \"TSNE\", { enumerable: true, get: function () { return tsne_1.TSNE; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TSNE = void 0;\nclass TSNE {\n constructor(opt) {\n // return 0 mean unit standard deviation random number\n this.returnV = false;\n this.vValue = 0.0;\n this.iter = 0;\n opt = opt || {};\n this.perplexity = this.getopt(opt, 'perplexity', 30); // effective number of nearest neighbors\n this.dim = this.getopt(opt, 'dim', 2); // by default 2-D tSNE\n this.epsilon = this.getopt(opt, 'epsilon', 10); // learning rate\n }\n assert(condition, message) {\n if (!condition) {\n throw message || 'Assertion failed';\n }\n }\n // syntax sugar\n getopt(opt, field, defaultval) {\n if (opt.hasOwnProperty(field)) {\n return opt[field];\n }\n else {\n return defaultval;\n }\n }\n gaussRandom() {\n if (this.returnV) {\n this.returnV = false;\n return this.vValue;\n }\n const u = 2 * Math.random() - 1;\n const v = 2 * Math.random() - 1;\n const r = u * u + v * v;\n if (r === 0 || r > 1) {\n return this.gaussRandom();\n }\n const c = Math.sqrt(-2 * Math.log(r) / r);\n this.vValue = v * c; // cache this for next function call for efficiency\n this.returnV = true;\n return u * c;\n }\n // return random normal number\n randn(mu, std) { return mu + this.gaussRandom() * std; }\n // utilitity that creates contiguous vector of zeros of size n\n zeros(n) {\n if (typeof (n) === 'undefined' || isNaN(n)) {\n return [];\n }\n if (typeof ArrayBuffer === 'undefined') {\n // lacking browser support\n const arr = new Array(n);\n for (let i = 0; i < n; i++) {\n arr[i] = 0;\n }\n return arr;\n }\n else {\n return new Float64Array(n); // typed arrays are faster\n }\n }\n // utility that returns 2d array filled with random numbers\n // or with value s, if provided\n randn2d(n, d, s) {\n const uses = typeof s !== 'undefined';\n const x = [];\n for (let i = 0; i < n; i++) {\n const xhere = [];\n for (let j = 0; j < d; j++) {\n if (uses) {\n xhere.push(s);\n }\n else {\n xhere.push(this.randn(0.0, 1e-4));\n }\n }\n x.push(xhere);\n }\n return x;\n }\n // compute L2 distance between two vectors\n L2(x1, x2) {\n const D = x1.length;\n let d = 0;\n for (let i = 0; i < D; i++) {\n const x1i = x1[i];\n const x2i = x2[i];\n d += (x1i - x2i) * (x1i - x2i);\n }\n return d;\n }\n // compute pairwise distance in all vectors in X\n xtod(X) {\n const N = X.length;\n const dist = this.zeros(N * N); // allocate contiguous array\n for (let i = 0; i < N; i++) {\n for (let j = i + 1; j < N; j++) {\n const d = this.L2(X[i], X[j]);\n dist[i * N + j] = d;\n dist[j * N + i] = d;\n }\n }\n return dist;\n }\n // compute (p_{i|j} + p_{j|i})/(2n)\n d2p(D, perplexity, tol) {\n const nf = Math.sqrt(D.length); // this better be an integer\n const n = Math.floor(nf);\n this.assert(n === nf, 'D should have square number of elements.');\n const hTarget = Math.log(perplexity); // target entropy of distribution\n const P = this.zeros(n * n); // temporary probability matrix\n const prow = this.zeros(n); // a temporary storage compartment\n for (let i = 0; i < n; i++) {\n let betamin = -Infinity;\n let betamax = Infinity;\n let beta = 1; // initial value of precision\n let done = false;\n const maxtries = 50;\n // perform binary search to find a suitable precision beta\n // so that the entropy of the distribution is appropriate\n let num = 0;\n while (!done) {\n //debugger;\n // compute entropy and kernel row with beta precision\n let psum = 0.0;\n for (let j = 0; j < n; j++) {\n let pj = Math.exp(-D[i * n + j] * beta);\n if (i === j) {\n pj = 0;\n } // we dont care about diagonals\n prow[j] = pj;\n psum += pj;\n }\n // normalize p and compute entropy\n let nHere = 0.0;\n for (let j = 0; j < n; j++) {\n let pj;\n if (psum === 0) {\n pj = 0;\n }\n else {\n pj = prow[j] / psum;\n }\n prow[j] = pj;\n if (pj > 1e-7) {\n nHere -= pj * Math.log(pj);\n }\n }\n // adjust beta based on result\n if (nHere > hTarget) {\n // entropy was too high (distribution too diffuse)\n // so we need to increase the precision for more peaky distribution\n betamin = beta; // move up the bounds\n if (betamax === Infinity) {\n beta = beta * 2;\n }\n else {\n beta = (beta + betamax) / 2;\n }\n }\n else {\n // converse case. make distrubtion less peaky\n betamax = beta;\n if (betamin === -Infinity) {\n beta = beta / 2;\n }\n else {\n beta = (beta + betamin) / 2;\n }\n }\n // stopping conditions: too many tries or got a good precision\n num++;\n if (Math.abs(nHere - hTarget) < tol) {\n done = true;\n }\n if (num >= maxtries) {\n done = true;\n }\n }\n // console.log('data point ' + i + ' gets precision ' + beta + ' after ' + num + ' binary search steps.');\n // copy over the final prow to P at row i\n for (let j = 0; j < n; j++) {\n P[i * n + j] = prow[j];\n }\n } // end loop over examples i\n // symmetrize P and normalize it to sum to 1 over all ij\n const pOut = this.zeros(n * n);\n const N2 = n * 2;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n pOut[i * n + j] = Math.max((P[i * n + j] + P[j * n + i]) / N2, 1e-100);\n }\n }\n return pOut;\n }\n // helper function\n sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }\n // this function takes a set of high-dimensional points\n // and creates matrix P from them using gaussian kernel\n initDataRaw(X) {\n const N = X.length;\n const D = X[0].length;\n this.assert(N > 0, ' X is empty? You must have some data!');\n this.assert(D > 0, ' X[0] is empty? Where is the data?');\n const dists = this.xtod(X); // convert X to distances using gaussian kernel\n this.P = this.d2p(dists, this.perplexity, 1e-4); // attach to object\n this.N = N; // back up the size of the dataset\n this.initSolution(); // refresh this\n }\n // this function takes a given distance matrix and creates\n // matrix P from them.\n // D is assumed to be provided as a list of lists, and should be symmetric\n initDataDist(D) {\n const N = D.length;\n this.assert(N > 0, ' X is empty? You must have some data!');\n // convert D to a (fast) typed array version\n const dists = this.zeros(N * N); // allocate contiguous array\n for (let i = 0; i < N; i++) {\n for (let j = i + 1; j < N; j++) {\n const d = D[i][j];\n dists[i * N + j] = d;\n dists[j * N + i] = d;\n }\n }\n this.P = this.d2p(dists, this.perplexity, 1e-4);\n this.N = N;\n this.initSolution(); // refresh this\n }\n // (re)initializes the solution to random\n initSolution() {\n // generate random solution to t-SNE\n this.Y = this.randn2d(this.N, this.dim); // the solution\n this.gains = this.randn2d(this.N, this.dim, 1.0); // step gains to accelerate progress in unchanging directions\n this.ystep = this.randn2d(this.N, this.dim, 0.0); // momentum accumulator\n this.iter = 0;\n }\n // return pointer to current solution\n getSolution() {\n return this.Y;\n }\n // perform a single step of optimization to improve the embedding\n step() {\n this.iter += 1;\n const N = this.N;\n const cg = this.costGrad(this.Y); // evaluate gradient\n const cost = cg.cost;\n const grad = cg.grad;\n // perform gradient step\n const ymean = this.zeros(this.dim);\n for (let i = 0; i < N; i++) {\n for (let d = 0; d < this.dim; d++) {\n const gid = grad[i][d];\n const sid = this.ystep[i][d];\n const gainid = this.gains[i][d];\n // compute gain update\n let newgain = this.sign(gid) === this.sign(sid) ? gainid * 0.8 : gainid + 0.2;\n if (newgain < 0.01) {\n newgain = 0.01;\n } // clamp\n this.gains[i][d] = newgain; // store for next turn\n // compute momentum step direction\n const momval = this.iter < 250 ? 0.5 : 0.8;\n const newsid = momval * sid - this.epsilon * newgain * grad[i][d];\n this.ystep[i][d] = newsid; // remember the step we took\n // step!\n this.Y[i][d] += newsid;\n ymean[d] += this.Y[i][d]; // accumulate mean so that we can center later\n }\n }\n // reproject Y to be zero mean\n for (let i = 0; i < N; i++) {\n for (let d = 0; d < this.dim; d++) {\n this.Y[i][d] -= ymean[d] / N;\n }\n }\n //if(this.iter%100===0) console.log('iter ' + this.iter + ', cost: ' + cost);\n return cost; // return current cost\n }\n // for debugging: gradient check\n debugGrad() {\n const N = this.N;\n const cg = this.costGrad(this.Y); // evaluate gradient\n const cost = cg.cost;\n const grad = cg.grad;\n const e = 1e-5;\n for (let i = 0; i < N; i++) {\n for (let d = 0; d < this.dim; d++) {\n const yold = this.Y[i][d];\n this.Y[i][d] = yold + e;\n const cg0 = this.costGrad(this.Y);\n this.Y[i][d] = yold - e;\n const cg1 = this.costGrad(this.Y);\n const analytic = grad[i][d];\n const numerical = (cg0.cost - cg1.cost) / (2 * e);\n console.log(i + ',' + d + ': gradcheck analytic: ' + analytic + ' vs. numerical: ' + numerical);\n this.Y[i][d] = yold;\n }\n }\n }\n // return cost and gradient, given an arrangement\n costGrad(Y) {\n const N = this.N;\n const dim = this.dim; // dim of output space\n const P = this.P;\n const pmul = this.iter < 100 ? 4 : 1; // trick that helps with local optima\n // compute current Q distribution, unnormalized first\n const quArr = this.zeros(N * N);\n let qsum = 0.0;\n for (let i = 0; i < N; i++) {\n for (let j = i + 1; j < N; j++) {\n let dsum = 0.0;\n for (let d = 0; d < dim; d++) {\n const dhere = Y[i][d] - Y[j][d];\n dsum += dhere * dhere;\n }\n const qu = 1.0 / (1.0 + dsum); // Student t-distribution\n quArr[i * N + j] = qu;\n quArr[j * N + i] = qu;\n qsum += 2 * qu;\n }\n }\n // normalize Q distribution to sum to 1\n const NN = N * N;\n const Q = this.zeros(NN);\n for (let q = 0; q < NN; q++) {\n Q[q] = Math.max(quArr[q] / qsum, 1e-100);\n }\n let cost = 0.0;\n const grad = [];\n for (let i = 0; i < N; i++) {\n const gsum = new Array(dim); // init grad for point i\n for (let d = 0; d < dim; d++) {\n gsum[d] = 0.0;\n }\n for (let j = 0; j < N; j++) {\n cost += -P[i * N + j] * Math.log(Q[i * N + j]); // accumulate cost (the non-constant portion at least...)\n const premult = 4 * (pmul * P[i * N + j] - Q[i * N + j]) * quArr[i * N + j];\n for (let d = 0; d < dim; d++) {\n gsum[d] += premult * (Y[i][d] - Y[j][d]);\n }\n }\n grad.push(gsum);\n }\n return { cost, grad };\n }\n}\nexports.TSNE = TSNE;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".scatter_plot_link {\\n position: absolute!important;\\n right: 10px;\\n}\\n\\n.cliffs_grid {\\n top: 10px;\\n}\\n\\n.show_only_cliffs {\\n top: 30px;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./node_modules/@datagrok-libraries/ml/css/styles.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,4BAA4B;IAC5B,WAAW;AACf;;AAEA;IACI,SAAS;AACb;;AAEA;IACI,SAAS;AACb\",\"sourcesContent\":[\".scatter_plot_link {\\n position: absolute!important;\\n right: 10px;\\n}\\n\\n.cliffs_grid {\\n top: 10px;\\n}\\n\\n.show_only_cliffs {\\n top: 30px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","(function (root, factory) {\n // Hack to make all exports of this module sha256 function object properties.\n var exports = {};\n factory(exports);\n var sha256 = exports[\"default\"];\n for (var k in exports) {\n sha256[k] = exports[k];\n }\n \n if (typeof module === 'object' && typeof module.exports === 'object') {\n module.exports = sha256;\n } else if (typeof define === 'function' && define.amd) {\n define(function() { return sha256; }); \n } else {\n root.sha256 = sha256;\n }\n})(this, function(exports) {\n\"use strict\";\nexports.__esModule = true;\n// SHA-256 (+ HMAC and PBKDF2) for JavaScript.\n//\n// Written in 2014-2016 by Dmitry Chestnykh.\n// Public domain, no warranty.\n//\n// Functions (accept and return Uint8Arrays):\n//\n// sha256(message) -> hash\n// sha256.hmac(key, message) -> mac\n// sha256.pbkdf2(password, salt, rounds, dkLen) -> dk\n//\n// Classes:\n//\n// new sha256.Hash()\n// new sha256.HMAC(key)\n//\nexports.digestLength = 32;\nexports.blockSize = 64;\n// SHA-256 constants\nvar K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b,\n 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01,\n 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7,\n 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152,\n 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc,\n 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819,\n 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08,\n 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f,\n 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\nfunction hashBlocks(w, v, p, pos, len) {\n var a, b, c, d, e, f, g, h, u, i, j, t1, t2;\n while (len >= 64) {\n a = v[0];\n b = v[1];\n c = v[2];\n d = v[3];\n e = v[4];\n f = v[5];\n g = v[6];\n h = v[7];\n for (i = 0; i < 16; i++) {\n j = pos + i * 4;\n w[i] = (((p[j] & 0xff) << 24) | ((p[j + 1] & 0xff) << 16) |\n ((p[j + 2] & 0xff) << 8) | (p[j + 3] & 0xff));\n }\n for (i = 16; i < 64; i++) {\n u = w[i - 2];\n t1 = (u >>> 17 | u << (32 - 17)) ^ (u >>> 19 | u << (32 - 19)) ^ (u >>> 10);\n u = w[i - 15];\n t2 = (u >>> 7 | u << (32 - 7)) ^ (u >>> 18 | u << (32 - 18)) ^ (u >>> 3);\n w[i] = (t1 + w[i - 7] | 0) + (t2 + w[i - 16] | 0);\n }\n for (i = 0; i < 64; i++) {\n t1 = (((((e >>> 6 | e << (32 - 6)) ^ (e >>> 11 | e << (32 - 11)) ^\n (e >>> 25 | e << (32 - 25))) + ((e & f) ^ (~e & g))) | 0) +\n ((h + ((K[i] + w[i]) | 0)) | 0)) | 0;\n t2 = (((a >>> 2 | a << (32 - 2)) ^ (a >>> 13 | a << (32 - 13)) ^\n (a >>> 22 | a << (32 - 22))) + ((a & b) ^ (a & c) ^ (b & c))) | 0;\n h = g;\n g = f;\n f = e;\n e = (d + t1) | 0;\n d = c;\n c = b;\n b = a;\n a = (t1 + t2) | 0;\n }\n v[0] += a;\n v[1] += b;\n v[2] += c;\n v[3] += d;\n v[4] += e;\n v[5] += f;\n v[6] += g;\n v[7] += h;\n pos += 64;\n len -= 64;\n }\n return pos;\n}\n// Hash implements SHA256 hash algorithm.\nvar Hash = /** @class */ (function () {\n function Hash() {\n this.digestLength = exports.digestLength;\n this.blockSize = exports.blockSize;\n // Note: Int32Array is used instead of Uint32Array for performance reasons.\n this.state = new Int32Array(8); // hash state\n this.temp = new Int32Array(64); // temporary state\n this.buffer = new Uint8Array(128); // buffer for data to hash\n this.bufferLength = 0; // number of bytes in buffer\n this.bytesHashed = 0; // number of total bytes hashed\n this.finished = false; // indicates whether the hash was finalized\n this.reset();\n }\n // Resets hash state making it possible\n // to re-use this instance to hash other data.\n Hash.prototype.reset = function () {\n this.state[0] = 0x6a09e667;\n this.state[1] = 0xbb67ae85;\n this.state[2] = 0x3c6ef372;\n this.state[3] = 0xa54ff53a;\n this.state[4] = 0x510e527f;\n this.state[5] = 0x9b05688c;\n this.state[6] = 0x1f83d9ab;\n this.state[7] = 0x5be0cd19;\n this.bufferLength = 0;\n this.bytesHashed = 0;\n this.finished = false;\n return this;\n };\n // Cleans internal buffers and re-initializes hash state.\n Hash.prototype.clean = function () {\n for (var i = 0; i < this.buffer.length; i++) {\n this.buffer[i] = 0;\n }\n for (var i = 0; i < this.temp.length; i++) {\n this.temp[i] = 0;\n }\n this.reset();\n };\n // Updates hash state with the given data.\n //\n // Optionally, length of the data can be specified to hash\n // fewer bytes than data.length.\n //\n // Throws error when trying to update already finalized hash:\n // instance must be reset to use it again.\n Hash.prototype.update = function (data, dataLength) {\n if (dataLength === void 0) { dataLength = data.length; }\n if (this.finished) {\n throw new Error(\"SHA256: can't update because hash was finished.\");\n }\n var dataPos = 0;\n this.bytesHashed += dataLength;\n if (this.bufferLength > 0) {\n while (this.bufferLength < 64 && dataLength > 0) {\n this.buffer[this.bufferLength++] = data[dataPos++];\n dataLength--;\n }\n if (this.bufferLength === 64) {\n hashBlocks(this.temp, this.state, this.buffer, 0, 64);\n this.bufferLength = 0;\n }\n }\n if (dataLength >= 64) {\n dataPos = hashBlocks(this.temp, this.state, data, dataPos, dataLength);\n dataLength %= 64;\n }\n while (dataLength > 0) {\n this.buffer[this.bufferLength++] = data[dataPos++];\n dataLength--;\n }\n return this;\n };\n // Finalizes hash state and puts hash into out.\n //\n // If hash was already finalized, puts the same value.\n Hash.prototype.finish = function (out) {\n if (!this.finished) {\n var bytesHashed = this.bytesHashed;\n var left = this.bufferLength;\n var bitLenHi = (bytesHashed / 0x20000000) | 0;\n var bitLenLo = bytesHashed << 3;\n var padLength = (bytesHashed % 64 < 56) ? 64 : 128;\n this.buffer[left] = 0x80;\n for (var i = left + 1; i < padLength - 8; i++) {\n this.buffer[i] = 0;\n }\n this.buffer[padLength - 8] = (bitLenHi >>> 24) & 0xff;\n this.buffer[padLength - 7] = (bitLenHi >>> 16) & 0xff;\n this.buffer[padLength - 6] = (bitLenHi >>> 8) & 0xff;\n this.buffer[padLength - 5] = (bitLenHi >>> 0) & 0xff;\n this.buffer[padLength - 4] = (bitLenLo >>> 24) & 0xff;\n this.buffer[padLength - 3] = (bitLenLo >>> 16) & 0xff;\n this.buffer[padLength - 2] = (bitLenLo >>> 8) & 0xff;\n this.buffer[padLength - 1] = (bitLenLo >>> 0) & 0xff;\n hashBlocks(this.temp, this.state, this.buffer, 0, padLength);\n this.finished = true;\n }\n for (var i = 0; i < 8; i++) {\n out[i * 4 + 0] = (this.state[i] >>> 24) & 0xff;\n out[i * 4 + 1] = (this.state[i] >>> 16) & 0xff;\n out[i * 4 + 2] = (this.state[i] >>> 8) & 0xff;\n out[i * 4 + 3] = (this.state[i] >>> 0) & 0xff;\n }\n return this;\n };\n // Returns the final hash digest.\n Hash.prototype.digest = function () {\n var out = new Uint8Array(this.digestLength);\n this.finish(out);\n return out;\n };\n // Internal function for use in HMAC for optimization.\n Hash.prototype._saveState = function (out) {\n for (var i = 0; i < this.state.length; i++) {\n out[i] = this.state[i];\n }\n };\n // Internal function for use in HMAC for optimization.\n Hash.prototype._restoreState = function (from, bytesHashed) {\n for (var i = 0; i < this.state.length; i++) {\n this.state[i] = from[i];\n }\n this.bytesHashed = bytesHashed;\n this.finished = false;\n this.bufferLength = 0;\n };\n return Hash;\n}());\nexports.Hash = Hash;\n// HMAC implements HMAC-SHA256 message authentication algorithm.\nvar HMAC = /** @class */ (function () {\n function HMAC(key) {\n this.inner = new Hash();\n this.outer = new Hash();\n this.blockSize = this.inner.blockSize;\n this.digestLength = this.inner.digestLength;\n var pad = new Uint8Array(this.blockSize);\n if (key.length > this.blockSize) {\n (new Hash()).update(key).finish(pad).clean();\n }\n else {\n for (var i = 0; i < key.length; i++) {\n pad[i] = key[i];\n }\n }\n for (var i = 0; i < pad.length; i++) {\n pad[i] ^= 0x36;\n }\n this.inner.update(pad);\n for (var i = 0; i < pad.length; i++) {\n pad[i] ^= 0x36 ^ 0x5c;\n }\n this.outer.update(pad);\n this.istate = new Uint32Array(8);\n this.ostate = new Uint32Array(8);\n this.inner._saveState(this.istate);\n this.outer._saveState(this.ostate);\n for (var i = 0; i < pad.length; i++) {\n pad[i] = 0;\n }\n }\n // Returns HMAC state to the state initialized with key\n // to make it possible to run HMAC over the other data with the same\n // key without creating a new instance.\n HMAC.prototype.reset = function () {\n this.inner._restoreState(this.istate, this.inner.blockSize);\n this.outer._restoreState(this.ostate, this.outer.blockSize);\n return this;\n };\n // Cleans HMAC state.\n HMAC.prototype.clean = function () {\n for (var i = 0; i < this.istate.length; i++) {\n this.ostate[i] = this.istate[i] = 0;\n }\n this.inner.clean();\n this.outer.clean();\n };\n // Updates state with provided data.\n HMAC.prototype.update = function (data) {\n this.inner.update(data);\n return this;\n };\n // Finalizes HMAC and puts the result in out.\n HMAC.prototype.finish = function (out) {\n if (this.outer.finished) {\n this.outer.finish(out);\n }\n else {\n this.inner.finish(out);\n this.outer.update(out, this.digestLength).finish(out);\n }\n return this;\n };\n // Returns message authentication code.\n HMAC.prototype.digest = function () {\n var out = new Uint8Array(this.digestLength);\n this.finish(out);\n return out;\n };\n return HMAC;\n}());\nexports.HMAC = HMAC;\n// Returns SHA256 hash of data.\nfunction hash(data) {\n var h = (new Hash()).update(data);\n var digest = h.digest();\n h.clean();\n return digest;\n}\nexports.hash = hash;\n// Function hash is both available as module.hash and as default export.\nexports[\"default\"] = hash;\n// Returns HMAC-SHA256 of data under the key.\nfunction hmac(key, data) {\n var h = (new HMAC(key)).update(data);\n var digest = h.digest();\n h.clean();\n return digest;\n}\nexports.hmac = hmac;\n// Fills hkdf buffer like this:\n// T(1) = HMAC-Hash(PRK, T(0) | info | 0x01)\nfunction fillBuffer(buffer, hmac, info, counter) {\n // Counter is a byte value: check if it overflowed.\n var num = counter[0];\n if (num === 0) {\n throw new Error(\"hkdf: cannot expand more\");\n }\n // Prepare HMAC instance for new data with old key.\n hmac.reset();\n // Hash in previous output if it was generated\n // (i.e. counter is greater than 1).\n if (num > 1) {\n hmac.update(buffer);\n }\n // Hash in info if it exists.\n if (info) {\n hmac.update(info);\n }\n // Hash in the counter.\n hmac.update(counter);\n // Output result to buffer and clean HMAC instance.\n hmac.finish(buffer);\n // Increment counter inside typed array, this works properly.\n counter[0]++;\n}\nvar hkdfSalt = new Uint8Array(exports.digestLength); // Filled with zeroes.\nfunction hkdf(key, salt, info, length) {\n if (salt === void 0) { salt = hkdfSalt; }\n if (length === void 0) { length = 32; }\n var counter = new Uint8Array([1]);\n // HKDF-Extract uses salt as HMAC key, and key as data.\n var okm = hmac(salt, key);\n // Initialize HMAC for expanding with extracted key.\n // Ensure no collisions with `hmac` function.\n var hmac_ = new HMAC(okm);\n // Allocate buffer.\n var buffer = new Uint8Array(hmac_.digestLength);\n var bufpos = buffer.length;\n var out = new Uint8Array(length);\n for (var i = 0; i < length; i++) {\n if (bufpos === buffer.length) {\n fillBuffer(buffer, hmac_, info, counter);\n bufpos = 0;\n }\n out[i] = buffer[bufpos++];\n }\n hmac_.clean();\n buffer.fill(0);\n counter.fill(0);\n return out;\n}\nexports.hkdf = hkdf;\n// Derives a key from password and salt using PBKDF2-HMAC-SHA256\n// with the given number of iterations.\n//\n// The number of bytes returned is equal to dkLen.\n//\n// (For better security, avoid dkLen greater than hash length - 32 bytes).\nfunction pbkdf2(password, salt, iterations, dkLen) {\n var prf = new HMAC(password);\n var len = prf.digestLength;\n var ctr = new Uint8Array(4);\n var t = new Uint8Array(len);\n var u = new Uint8Array(len);\n var dk = new Uint8Array(dkLen);\n for (var i = 0; i * len < dkLen; i++) {\n var c = i + 1;\n ctr[0] = (c >>> 24) & 0xff;\n ctr[1] = (c >>> 16) & 0xff;\n ctr[2] = (c >>> 8) & 0xff;\n ctr[3] = (c >>> 0) & 0xff;\n prf.reset();\n prf.update(salt);\n prf.update(ctr);\n prf.finish(u);\n for (var j = 0; j < len; j++) {\n t[j] = u[j];\n }\n for (var j = 2; j <= iterations; j++) {\n prf.reset();\n prf.update(u).finish(u);\n for (var k = 0; k < len; k++) {\n t[k] ^= u[k];\n }\n }\n for (var j = 0; j < len && i * len + j < dkLen; j++) {\n dk[i * len + j] = t[j];\n }\n }\n for (var i = 0; i < len; i++) {\n t[i] = u[i] = 0;\n }\n for (var i = 0; i < 4; i++) {\n ctr[i] = 0;\n }\n prf.clean();\n return dk;\n}\nexports.pbkdf2 = pbkdf2;\n});\n","\"use strict\";\n// Reference: https://www.geeksforgeeks.org/jaro-and-jaro-winkler-similarity/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.jaroWinkler = exports.jaro = void 0;\n/**\n *\n * @param str1 String 1 for compare\n * @param str2 String 2 for compare\n * @param options to control case sensitive or not\n */\nfunction jaro(str1, str2, options) {\n // Exit early if either are empty.\n if (str1.length === 0 || str2.length === 0) {\n return 0;\n }\n // Convert to upper if case-sensitive is false.\n if (options && !options.caseSensitive) {\n str1 = str1.toUpperCase();\n str2 = str2.toUpperCase();\n }\n // Exact match\n if (str1 === str2) {\n return 1;\n }\n // Number of matches\n var m = 0;\n // Length of two Strings\n var len1 = str1.length;\n var len2 = str2.length;\n // Maximum distance\n var window = Math.floor(Math.max(len1, len2) / 2) - 1;\n // Hash for matches\n var str1Hash = new Array(len1);\n var str2Hash = new Array(len2);\n for (var i = 0; i < len1; i++) {\n for (var j = Math.max(0, i - window); j <= Math.min(len2, i + window + 1); j++) {\n if (!str1Hash[i] && !str2Hash[j] && str1[i] === str2[j]) {\n ++m;\n str1Hash[i] = str2Hash[j] = true;\n break;\n }\n }\n }\n // Exit early if no matches were found.\n if (m === 0) {\n return 0;\n }\n // Count the transpositions.\n var t = 0;\n var point = 0;\n for (var i = 0; i < len1; i++) {\n if (str1Hash[i]) {\n while (!str2Hash[point]) {\n point++;\n }\n if (str1.charAt(i) !== str2.charAt(point++)) {\n t++;\n }\n }\n }\n t /= 2;\n return (m / len1 + m / len2 + (m - t) / m) / 3;\n}\nexports.jaro = jaro;\n/**\n *\n * @param str1 String 1 for compare\n * @param str2 String 2 for compare\n * @param options to control case sensitive or not\n */\nfunction jaroWinkler(str1, str2, options) {\n // Jaro Distance\n var jaroDist = jaro(str1, str2, options);\n // Same prefix length, maxium is 4\n var prefix = 0;\n if (jaroDist > 0.7) {\n var minIndex = Math.min(str1.length, str2.length);\n var i = 0;\n while (str1[i] === str2[i] && i < 4 && i < minIndex) {\n ++prefix;\n i++;\n }\n jaroDist += 0.1 * prefix * (1 - jaroDist);\n }\n return jaroDist;\n}\nexports.jaroWinkler = jaroWinkler;\n","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n return toString.call(object).endsWith('Array]');\n}\n","/**\n * Calculate current error\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} parameters - Array of current parameter values\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {number}\n */\nexport default function errorCalculation(\n data,\n parameters,\n parameterizedFunction,\n) {\n let error = 0;\n const func = parameterizedFunction(parameters);\n\n for (let i = 0; i < data.x.length; i++) {\n error += Math.abs(data.y[i] - func(data.x[i]));\n }\n\n return error;\n}\n","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n } else if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var output;\n\n if (options.output !== undefined) {\n if (!isAnyArray(options.output)) {\n throw new TypeError('output option must be an array if specified');\n }\n\n output = options.output;\n } else {\n output = new Array(input.length);\n }\n\n var currentMin = min(input);\n var currentMax = max(input);\n\n if (currentMin === currentMax) {\n throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n }\n\n var _options$min = options.min,\n minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n _options$max = options.max,\n maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n if (minValue >= maxValue) {\n throw new RangeError('min option must be smaller than max option');\n }\n\n var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n for (var i = 0; i < input.length; i++) {\n output[i] = (input[i] - currentMin) * factor + minValue;\n }\n\n return output;\n}\n\nexport { rescale as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n }\n\n if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var _options$fromIndex = options.fromIndex,\n fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n _options$toIndex = options.toIndex,\n toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n throw new Error('fromIndex must be a positive integer smaller than length');\n }\n\n if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n }\n\n var minValue = input[fromIndex];\n\n for (var i = fromIndex + 1; i < toIndex; i++) {\n if (input[i] < minValue) minValue = input[i];\n }\n\n return minValue;\n}\n\nexport { min as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n }\n\n if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var _options$fromIndex = options.fromIndex,\n fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n _options$toIndex = options.toIndex,\n toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n throw new Error('fromIndex must be a positive integer smaller than length');\n }\n\n if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n }\n\n var maxValue = input[fromIndex];\n\n for (var i = fromIndex + 1; i < toIndex; i++) {\n if (input[i] > maxValue) maxValue = input[i];\n }\n\n return maxValue;\n}\n\nexport { max as default };\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n const {\n maxRows = 15,\n maxColumns = 10,\n maxNumSize = 8,\n padMinus = 'auto',\n } = options;\n return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus) {\n const { rows, columns } = matrix;\n const maxI = Math.min(rows, maxRows);\n const maxJ = Math.min(columns, maxColumns);\n const result = [];\n\n if (padMinus === 'auto') {\n padMinus = false;\n loop: for (let i = 0; i < maxI; i++) {\n for (let j = 0; j < maxJ; j++) {\n if (matrix.get(i, j) < 0) {\n padMinus = true;\n break loop;\n }\n }\n }\n }\n\n for (let i = 0; i < maxI; i++) {\n let line = [];\n for (let j = 0; j < maxJ; j++) {\n line.push(formatNumber(matrix.get(i, j), maxNumSize, padMinus));\n }\n result.push(`${line.join(' ')}`);\n }\n if (maxJ !== columns) {\n result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n }\n if (maxI !== rows) {\n result.push(`... ${rows - maxRows} more rows`);\n }\n return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize, padMinus) {\n return (\n num >= 0 && padMinus\n ? ` ${formatNumber2(num, maxNumSize - 1)}`\n : formatNumber2(num, maxNumSize)\n ).padEnd(maxNumSize);\n}\n\nfunction formatNumber2(num, len) {\n // small.length numbers should be as is\n let str = num.toString();\n if (str.length <= len) return str;\n\n // (7)'0.00123' is better then (7)'1.23e-2'\n // (8)'0.000123' is worse then (7)'1.23e-3',\n let fix = num.toFixed(len);\n if (fix.length > len) {\n fix = num.toFixed(Math.max(0, len - (fix.length - len)));\n }\n if (\n fix.length <= len &&\n !fix.startsWith('0.000') &&\n !fix.startsWith('-0.000')\n ) {\n return fix;\n }\n\n // well, if it's still too long the user should've used longer numbers\n let exp = num.toExponential(len);\n if (exp.length > len) {\n exp = num.toExponential(Math.max(0, len - (exp.length - len)));\n }\n return exp.slice(0);\n}\n","import { isAnyArray } from 'is-any-array';\n\n/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n let max = outer ? matrix.rows : matrix.rows - 1;\n if (index < 0 || index > max) {\n throw new RangeError('Row index out of range');\n }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n let max = outer ? matrix.columns : matrix.columns - 1;\n if (index < 0 || index > max) {\n throw new RangeError('Column index out of range');\n }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n if (vector.to1DArray) {\n vector = vector.to1DArray();\n }\n if (vector.length !== matrix.columns) {\n throw new RangeError(\n 'vector size must be the same as the number of columns',\n );\n }\n return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n if (vector.to1DArray) {\n vector = vector.to1DArray();\n }\n if (vector.length !== matrix.rows) {\n throw new RangeError('vector size must be the same as the number of rows');\n }\n return vector;\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n if (!isAnyArray(rowIndices)) {\n throw new TypeError('row indices must be an array');\n }\n\n for (let i = 0; i < rowIndices.length; i++) {\n if (rowIndices[i] < 0 || rowIndices[i] >= matrix.rows) {\n throw new RangeError('row indices are out of range');\n }\n }\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n if (!isAnyArray(columnIndices)) {\n throw new TypeError('column indices must be an array');\n }\n\n for (let i = 0; i < columnIndices.length; i++) {\n if (columnIndices[i] < 0 || columnIndices[i] >= matrix.columns) {\n throw new RangeError('column indices are out of range');\n }\n }\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n if (arguments.length !== 5) {\n throw new RangeError('expected 4 arguments');\n }\n checkNumber('startRow', startRow);\n checkNumber('endRow', endRow);\n checkNumber('startColumn', startColumn);\n checkNumber('endColumn', endColumn);\n if (\n startRow > endRow ||\n startColumn > endColumn ||\n startRow < 0 ||\n startRow >= matrix.rows ||\n endRow < 0 ||\n endRow >= matrix.rows ||\n startColumn < 0 ||\n startColumn >= matrix.columns ||\n endColumn < 0 ||\n endColumn >= matrix.columns\n ) {\n throw new RangeError('Submatrix indices are out of range');\n }\n}\n\nexport function newArray(length, value = 0) {\n let array = [];\n for (let i = 0; i < length; i++) {\n array.push(value);\n }\n return array;\n}\n\nfunction checkNumber(name, value) {\n if (typeof value !== 'number') {\n throw new TypeError(`${name} must be a number`);\n }\n}\n\nexport function checkNonEmpty(matrix) {\n if (matrix.isEmpty()) {\n throw new Error('Empty matrix has no elements to index');\n }\n}\n","import { isAnyArray } from 'is-any-array';\nimport rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n sumByRow,\n sumByColumn,\n sumAll,\n productByRow,\n productByColumn,\n productAll,\n varianceByRow,\n varianceByColumn,\n varianceAll,\n centerByRow,\n centerByColumn,\n centerAll,\n scaleByRow,\n scaleByColumn,\n scaleAll,\n getScaleByRow,\n getScaleByColumn,\n getScaleAll,\n} from './stat';\nimport {\n checkRowVector,\n checkRowIndex,\n checkColumnIndex,\n checkColumnVector,\n checkRange,\n checkNonEmpty,\n checkRowIndices,\n checkColumnIndices,\n} from './util';\n\nexport class AbstractMatrix {\n static from1DArray(newRows, newColumns, newData) {\n let length = newRows * newColumns;\n if (length !== newData.length) {\n throw new RangeError('data length does not match given dimensions');\n }\n let newMatrix = new Matrix(newRows, newColumns);\n for (let row = 0; row < newRows; row++) {\n for (let column = 0; column < newColumns; column++) {\n newMatrix.set(row, column, newData[row * newColumns + column]);\n }\n }\n return newMatrix;\n }\n\n static rowVector(newData) {\n let vector = new Matrix(1, newData.length);\n for (let i = 0; i < newData.length; i++) {\n vector.set(0, i, newData[i]);\n }\n return vector;\n }\n\n static columnVector(newData) {\n let vector = new Matrix(newData.length, 1);\n for (let i = 0; i < newData.length; i++) {\n vector.set(i, 0, newData[i]);\n }\n return vector;\n }\n\n static zeros(rows, columns) {\n return new Matrix(rows, columns);\n }\n\n static ones(rows, columns) {\n return new Matrix(rows, columns).fill(1);\n }\n\n static rand(rows, columns, options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { random = Math.random } = options;\n let matrix = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n matrix.set(i, j, random());\n }\n }\n return matrix;\n }\n\n static randInt(rows, columns, options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1000, random = Math.random } = options;\n if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let interval = max - min;\n let matrix = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n let value = min + Math.round(random() * interval);\n matrix.set(i, j, value);\n }\n }\n return matrix;\n }\n\n static eye(rows, columns, value) {\n if (columns === undefined) columns = rows;\n if (value === undefined) value = 1;\n let min = Math.min(rows, columns);\n let matrix = this.zeros(rows, columns);\n for (let i = 0; i < min; i++) {\n matrix.set(i, i, value);\n }\n return matrix;\n }\n\n static diag(data, rows, columns) {\n let l = data.length;\n if (rows === undefined) rows = l;\n if (columns === undefined) columns = rows;\n let min = Math.min(l, rows, columns);\n let matrix = this.zeros(rows, columns);\n for (let i = 0; i < min; i++) {\n matrix.set(i, i, data[i]);\n }\n return matrix;\n }\n\n static min(matrix1, matrix2) {\n matrix1 = this.checkMatrix(matrix1);\n matrix2 = this.checkMatrix(matrix2);\n let rows = matrix1.rows;\n let columns = matrix1.columns;\n let result = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n }\n }\n return result;\n }\n\n static max(matrix1, matrix2) {\n matrix1 = this.checkMatrix(matrix1);\n matrix2 = this.checkMatrix(matrix2);\n let rows = matrix1.rows;\n let columns = matrix1.columns;\n let result = new this(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n }\n }\n return result;\n }\n\n static checkMatrix(value) {\n return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n }\n\n static isMatrix(value) {\n return value != null && value.klass === 'Matrix';\n }\n\n get size() {\n return this.rows * this.columns;\n }\n\n apply(callback) {\n if (typeof callback !== 'function') {\n throw new TypeError('callback must be a function');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n callback.call(this, i, j);\n }\n }\n return this;\n }\n\n to1DArray() {\n let array = [];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n array.push(this.get(i, j));\n }\n }\n return array;\n }\n\n to2DArray() {\n let copy = [];\n for (let i = 0; i < this.rows; i++) {\n copy.push([]);\n for (let j = 0; j < this.columns; j++) {\n copy[i].push(this.get(i, j));\n }\n }\n return copy;\n }\n\n toJSON() {\n return this.to2DArray();\n }\n\n isRowVector() {\n return this.rows === 1;\n }\n\n isColumnVector() {\n return this.columns === 1;\n }\n\n isVector() {\n return this.rows === 1 || this.columns === 1;\n }\n\n isSquare() {\n return this.rows === this.columns;\n }\n\n isEmpty() {\n return this.rows === 0 || this.columns === 0;\n }\n\n isSymmetric() {\n if (this.isSquare()) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j <= i; j++) {\n if (this.get(i, j) !== this.get(j, i)) {\n return false;\n }\n }\n }\n return true;\n }\n return false;\n }\n\n isEchelonForm() {\n let i = 0;\n let j = 0;\n let previousColumn = -1;\n let isEchelonForm = true;\n let checked = false;\n while (i < this.rows && isEchelonForm) {\n j = 0;\n checked = false;\n while (j < this.columns && checked === false) {\n if (this.get(i, j) === 0) {\n j++;\n } else if (this.get(i, j) === 1 && j > previousColumn) {\n checked = true;\n previousColumn = j;\n } else {\n isEchelonForm = false;\n checked = true;\n }\n }\n i++;\n }\n return isEchelonForm;\n }\n\n isReducedEchelonForm() {\n let i = 0;\n let j = 0;\n let previousColumn = -1;\n let isReducedEchelonForm = true;\n let checked = false;\n while (i < this.rows && isReducedEchelonForm) {\n j = 0;\n checked = false;\n while (j < this.columns && checked === false) {\n if (this.get(i, j) === 0) {\n j++;\n } else if (this.get(i, j) === 1 && j > previousColumn) {\n checked = true;\n previousColumn = j;\n } else {\n isReducedEchelonForm = false;\n checked = true;\n }\n }\n for (let k = j + 1; k < this.rows; k++) {\n if (this.get(i, k) !== 0) {\n isReducedEchelonForm = false;\n }\n }\n i++;\n }\n return isReducedEchelonForm;\n }\n\n echelonForm() {\n let result = this.clone();\n let h = 0;\n let k = 0;\n while (h < result.rows && k < result.columns) {\n let iMax = h;\n for (let i = h; i < result.rows; i++) {\n if (result.get(i, k) > result.get(iMax, k)) {\n iMax = i;\n }\n }\n if (result.get(iMax, k) === 0) {\n k++;\n } else {\n result.swapRows(h, iMax);\n let tmp = result.get(h, k);\n for (let j = k; j < result.columns; j++) {\n result.set(h, j, result.get(h, j) / tmp);\n }\n for (let i = h + 1; i < result.rows; i++) {\n let factor = result.get(i, k) / result.get(h, k);\n result.set(i, k, 0);\n for (let j = k + 1; j < result.columns; j++) {\n result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n }\n }\n h++;\n k++;\n }\n }\n return result;\n }\n\n reducedEchelonForm() {\n let result = this.echelonForm();\n let m = result.columns;\n let n = result.rows;\n let h = n - 1;\n while (h >= 0) {\n if (result.maxRow(h) === 0) {\n h--;\n } else {\n let p = 0;\n let pivot = false;\n while (p < n && pivot === false) {\n if (result.get(h, p) === 1) {\n pivot = true;\n } else {\n p++;\n }\n }\n for (let i = 0; i < h; i++) {\n let factor = result.get(i, p);\n for (let j = p; j < m; j++) {\n let tmp = result.get(i, j) - factor * result.get(h, j);\n result.set(i, j, tmp);\n }\n }\n h--;\n }\n }\n return result;\n }\n\n set() {\n throw new Error('set method is unimplemented');\n }\n\n get() {\n throw new Error('get method is unimplemented');\n }\n\n repeat(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { rows = 1, columns = 1 } = options;\n if (!Number.isInteger(rows) || rows <= 0) {\n throw new TypeError('rows must be a positive integer');\n }\n if (!Number.isInteger(columns) || columns <= 0) {\n throw new TypeError('columns must be a positive integer');\n }\n let matrix = new Matrix(this.rows * rows, this.columns * columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n }\n }\n return matrix;\n }\n\n fill(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, value);\n }\n }\n return this;\n }\n\n neg() {\n return this.mulS(-1);\n }\n\n getRow(index) {\n checkRowIndex(this, index);\n let row = [];\n for (let i = 0; i < this.columns; i++) {\n row.push(this.get(index, i));\n }\n return row;\n }\n\n getRowVector(index) {\n return Matrix.rowVector(this.getRow(index));\n }\n\n setRow(index, array) {\n checkRowIndex(this, index);\n array = checkRowVector(this, array);\n for (let i = 0; i < this.columns; i++) {\n this.set(index, i, array[i]);\n }\n return this;\n }\n\n swapRows(row1, row2) {\n checkRowIndex(this, row1);\n checkRowIndex(this, row2);\n for (let i = 0; i < this.columns; i++) {\n let temp = this.get(row1, i);\n this.set(row1, i, this.get(row2, i));\n this.set(row2, i, temp);\n }\n return this;\n }\n\n getColumn(index) {\n checkColumnIndex(this, index);\n let column = [];\n for (let i = 0; i < this.rows; i++) {\n column.push(this.get(i, index));\n }\n return column;\n }\n\n getColumnVector(index) {\n return Matrix.columnVector(this.getColumn(index));\n }\n\n setColumn(index, array) {\n checkColumnIndex(this, index);\n array = checkColumnVector(this, array);\n for (let i = 0; i < this.rows; i++) {\n this.set(i, index, array[i]);\n }\n return this;\n }\n\n swapColumns(column1, column2) {\n checkColumnIndex(this, column1);\n checkColumnIndex(this, column2);\n for (let i = 0; i < this.rows; i++) {\n let temp = this.get(i, column1);\n this.set(i, column1, this.get(i, column2));\n this.set(i, column2, temp);\n }\n return this;\n }\n\n addRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + vector[j]);\n }\n }\n return this;\n }\n\n subRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - vector[j]);\n }\n }\n return this;\n }\n\n mulRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * vector[j]);\n }\n }\n return this;\n }\n\n divRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / vector[j]);\n }\n }\n return this;\n }\n\n addColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + vector[i]);\n }\n }\n return this;\n }\n\n subColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - vector[i]);\n }\n }\n return this;\n }\n\n mulColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * vector[i]);\n }\n }\n return this;\n }\n\n divColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / vector[i]);\n }\n }\n return this;\n }\n\n mulRow(index, value) {\n checkRowIndex(this, index);\n for (let i = 0; i < this.columns; i++) {\n this.set(index, i, this.get(index, i) * value);\n }\n return this;\n }\n\n mulColumn(index, value) {\n checkColumnIndex(this, index);\n for (let i = 0; i < this.rows; i++) {\n this.set(i, index, this.get(i, index) * value);\n }\n return this;\n }\n\n max(by) {\n if (this.isEmpty()) {\n return NaN;\n }\n switch (by) {\n case 'row': {\n const max = new Array(this.rows).fill(Number.NEGATIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max[row]) {\n max[row] = this.get(row, column);\n }\n }\n }\n return max;\n }\n case 'column': {\n const max = new Array(this.columns).fill(Number.NEGATIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max[column]) {\n max[column] = this.get(row, column);\n }\n }\n }\n return max;\n }\n case undefined: {\n let max = this.get(0, 0);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max) {\n max = this.get(row, column);\n }\n }\n }\n return max;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n maxIndex() {\n checkNonEmpty(this);\n let v = this.get(0, 0);\n let idx = [0, 0];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n if (this.get(i, j) > v) {\n v = this.get(i, j);\n idx[0] = i;\n idx[1] = j;\n }\n }\n }\n return idx;\n }\n\n min(by) {\n if (this.isEmpty()) {\n return NaN;\n }\n\n switch (by) {\n case 'row': {\n const min = new Array(this.rows).fill(Number.POSITIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min[row]) {\n min[row] = this.get(row, column);\n }\n }\n }\n return min;\n }\n case 'column': {\n const min = new Array(this.columns).fill(Number.POSITIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min[column]) {\n min[column] = this.get(row, column);\n }\n }\n }\n return min;\n }\n case undefined: {\n let min = this.get(0, 0);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min) {\n min = this.get(row, column);\n }\n }\n }\n return min;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n minIndex() {\n checkNonEmpty(this);\n let v = this.get(0, 0);\n let idx = [0, 0];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n if (this.get(i, j) < v) {\n v = this.get(i, j);\n idx[0] = i;\n idx[1] = j;\n }\n }\n }\n return idx;\n }\n\n maxRow(row) {\n checkRowIndex(this, row);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(row, 0);\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) > v) {\n v = this.get(row, i);\n }\n }\n return v;\n }\n\n maxRowIndex(row) {\n checkRowIndex(this, row);\n checkNonEmpty(this);\n let v = this.get(row, 0);\n let idx = [row, 0];\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) > v) {\n v = this.get(row, i);\n idx[1] = i;\n }\n }\n return idx;\n }\n\n minRow(row) {\n checkRowIndex(this, row);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(row, 0);\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) < v) {\n v = this.get(row, i);\n }\n }\n return v;\n }\n\n minRowIndex(row) {\n checkRowIndex(this, row);\n checkNonEmpty(this);\n let v = this.get(row, 0);\n let idx = [row, 0];\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) < v) {\n v = this.get(row, i);\n idx[1] = i;\n }\n }\n return idx;\n }\n\n maxColumn(column) {\n checkColumnIndex(this, column);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(0, column);\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) > v) {\n v = this.get(i, column);\n }\n }\n return v;\n }\n\n maxColumnIndex(column) {\n checkColumnIndex(this, column);\n checkNonEmpty(this);\n let v = this.get(0, column);\n let idx = [0, column];\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) > v) {\n v = this.get(i, column);\n idx[0] = i;\n }\n }\n return idx;\n }\n\n minColumn(column) {\n checkColumnIndex(this, column);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(0, column);\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) < v) {\n v = this.get(i, column);\n }\n }\n return v;\n }\n\n minColumnIndex(column) {\n checkColumnIndex(this, column);\n checkNonEmpty(this);\n let v = this.get(0, column);\n let idx = [0, column];\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) < v) {\n v = this.get(i, column);\n idx[0] = i;\n }\n }\n return idx;\n }\n\n diag() {\n let min = Math.min(this.rows, this.columns);\n let diag = [];\n for (let i = 0; i < min; i++) {\n diag.push(this.get(i, i));\n }\n return diag;\n }\n\n norm(type = 'frobenius') {\n let result = 0;\n if (type === 'max') {\n return this.max();\n } else if (type === 'frobenius') {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n result = result + this.get(i, j) * this.get(i, j);\n }\n }\n return Math.sqrt(result);\n } else {\n throw new RangeError(`unknown norm type: ${type}`);\n }\n }\n\n cumulativeSum() {\n let sum = 0;\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n sum += this.get(i, j);\n this.set(i, j, sum);\n }\n }\n return this;\n }\n\n dot(vector2) {\n if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n let vector1 = this.to1DArray();\n if (vector1.length !== vector2.length) {\n throw new RangeError('vectors do not have the same size');\n }\n let dot = 0;\n for (let i = 0; i < vector1.length; i++) {\n dot += vector1[i] * vector2[i];\n }\n return dot;\n }\n\n mmul(other) {\n other = Matrix.checkMatrix(other);\n\n let m = this.rows;\n let n = this.columns;\n let p = other.columns;\n\n let result = new Matrix(m, p);\n\n let Bcolj = new Float64Array(n);\n for (let j = 0; j < p; j++) {\n for (let k = 0; k < n; k++) {\n Bcolj[k] = other.get(k, j);\n }\n\n for (let i = 0; i < m; i++) {\n let s = 0;\n for (let k = 0; k < n; k++) {\n s += this.get(i, k) * Bcolj[k];\n }\n\n result.set(i, j, s);\n }\n }\n return result;\n }\n\n strassen2x2(other) {\n other = Matrix.checkMatrix(other);\n let result = new Matrix(2, 2);\n const a11 = this.get(0, 0);\n const b11 = other.get(0, 0);\n const a12 = this.get(0, 1);\n const b12 = other.get(0, 1);\n const a21 = this.get(1, 0);\n const b21 = other.get(1, 0);\n const a22 = this.get(1, 1);\n const b22 = other.get(1, 1);\n\n // Compute intermediate values.\n const m1 = (a11 + a22) * (b11 + b22);\n const m2 = (a21 + a22) * b11;\n const m3 = a11 * (b12 - b22);\n const m4 = a22 * (b21 - b11);\n const m5 = (a11 + a12) * b22;\n const m6 = (a21 - a11) * (b11 + b12);\n const m7 = (a12 - a22) * (b21 + b22);\n\n // Combine intermediate values into the output.\n const c00 = m1 + m4 - m5 + m7;\n const c01 = m3 + m5;\n const c10 = m2 + m4;\n const c11 = m1 - m2 + m3 + m6;\n\n result.set(0, 0, c00);\n result.set(0, 1, c01);\n result.set(1, 0, c10);\n result.set(1, 1, c11);\n return result;\n }\n\n strassen3x3(other) {\n other = Matrix.checkMatrix(other);\n let result = new Matrix(3, 3);\n\n const a00 = this.get(0, 0);\n const a01 = this.get(0, 1);\n const a02 = this.get(0, 2);\n const a10 = this.get(1, 0);\n const a11 = this.get(1, 1);\n const a12 = this.get(1, 2);\n const a20 = this.get(2, 0);\n const a21 = this.get(2, 1);\n const a22 = this.get(2, 2);\n\n const b00 = other.get(0, 0);\n const b01 = other.get(0, 1);\n const b02 = other.get(0, 2);\n const b10 = other.get(1, 0);\n const b11 = other.get(1, 1);\n const b12 = other.get(1, 2);\n const b20 = other.get(2, 0);\n const b21 = other.get(2, 1);\n const b22 = other.get(2, 2);\n\n const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n const m2 = (a00 - a10) * (-b01 + b11);\n const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n const m5 = (a10 + a11) * (-b00 + b01);\n const m6 = a00 * b00;\n const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n const m8 = (-a00 + a20) * (b02 - b12);\n const m9 = (a20 + a21) * (-b00 + b02);\n const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n const m13 = (a02 - a22) * (b11 - b21);\n const m14 = a02 * b20;\n const m15 = (a21 + a22) * (-b20 + b21);\n const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n const m17 = (a02 - a12) * (b12 - b22);\n const m18 = (a11 + a12) * (-b20 + b22);\n const m19 = a01 * b10;\n const m20 = a12 * b21;\n const m21 = a10 * b02;\n const m22 = a20 * b01;\n const m23 = a22 * b22;\n\n const c00 = m6 + m14 + m19;\n const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n const c11 = m2 + m4 + m5 + m6 + m20;\n const c12 = m14 + m16 + m17 + m18 + m21;\n const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n const c21 = m12 + m13 + m14 + m15 + m22;\n const c22 = m6 + m7 + m8 + m9 + m23;\n\n result.set(0, 0, c00);\n result.set(0, 1, c01);\n result.set(0, 2, c02);\n result.set(1, 0, c10);\n result.set(1, 1, c11);\n result.set(1, 2, c12);\n result.set(2, 0, c20);\n result.set(2, 1, c21);\n result.set(2, 2, c22);\n return result;\n }\n\n mmulStrassen(y) {\n y = Matrix.checkMatrix(y);\n let x = this.clone();\n let r1 = x.rows;\n let c1 = x.columns;\n let r2 = y.rows;\n let c2 = y.columns;\n if (c1 !== r2) {\n // eslint-disable-next-line no-console\n console.warn(\n `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n );\n }\n\n // Put a matrix into the top left of a matrix of zeros.\n // `rows` and `cols` are the dimensions of the output matrix.\n function embed(mat, rows, cols) {\n let r = mat.rows;\n let c = mat.columns;\n if (r === rows && c === cols) {\n return mat;\n } else {\n let resultat = AbstractMatrix.zeros(rows, cols);\n resultat = resultat.setSubMatrix(mat, 0, 0);\n return resultat;\n }\n }\n\n // Make sure both matrices are the same size.\n // This is exclusively for simplicity:\n // this algorithm can be implemented with matrices of different sizes.\n\n let r = Math.max(r1, r2);\n let c = Math.max(c1, c2);\n x = embed(x, r, c);\n y = embed(y, r, c);\n\n // Our recursive multiplication function.\n function blockMult(a, b, rows, cols) {\n // For small matrices, resort to naive multiplication.\n if (rows <= 512 || cols <= 512) {\n return a.mmul(b); // a is equivalent to this\n }\n\n // Apply dynamic padding.\n if (rows % 2 === 1 && cols % 2 === 1) {\n a = embed(a, rows + 1, cols + 1);\n b = embed(b, rows + 1, cols + 1);\n } else if (rows % 2 === 1) {\n a = embed(a, rows + 1, cols);\n b = embed(b, rows + 1, cols);\n } else if (cols % 2 === 1) {\n a = embed(a, rows, cols + 1);\n b = embed(b, rows, cols + 1);\n }\n\n let halfRows = parseInt(a.rows / 2, 10);\n let halfCols = parseInt(a.columns / 2, 10);\n // Subdivide input matrices.\n let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n // Compute intermediate values.\n let m1 = blockMult(\n AbstractMatrix.add(a11, a22),\n AbstractMatrix.add(b11, b22),\n halfRows,\n halfCols,\n );\n let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n let m6 = blockMult(\n AbstractMatrix.sub(a21, a11),\n AbstractMatrix.add(b11, b12),\n halfRows,\n halfCols,\n );\n let m7 = blockMult(\n AbstractMatrix.sub(a12, a22),\n AbstractMatrix.add(b21, b22),\n halfRows,\n halfCols,\n );\n\n // Combine intermediate values into the output.\n let c11 = AbstractMatrix.add(m1, m4);\n c11.sub(m5);\n c11.add(m7);\n let c12 = AbstractMatrix.add(m3, m5);\n let c21 = AbstractMatrix.add(m2, m4);\n let c22 = AbstractMatrix.sub(m1, m2);\n c22.add(m3);\n c22.add(m6);\n\n // Crop output to the desired size (undo dynamic padding).\n let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n resultat = resultat.setSubMatrix(c11, 0, 0);\n resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n }\n\n return blockMult(x, y, r, c);\n }\n\n scaleRows(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1 } = options;\n if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let newMatrix = new Matrix(this.rows, this.columns);\n for (let i = 0; i < this.rows; i++) {\n const row = this.getRow(i);\n if (row.length > 0) {\n rescale(row, { min, max, output: row });\n }\n newMatrix.setRow(i, row);\n }\n return newMatrix;\n }\n\n scaleColumns(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1 } = options;\n if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let newMatrix = new Matrix(this.rows, this.columns);\n for (let i = 0; i < this.columns; i++) {\n const column = this.getColumn(i);\n if (column.length) {\n rescale(column, {\n min: min,\n max: max,\n output: column,\n });\n }\n newMatrix.setColumn(i, column);\n }\n return newMatrix;\n }\n\n flipRows() {\n const middle = Math.ceil(this.columns / 2);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < middle; j++) {\n let first = this.get(i, j);\n let last = this.get(i, this.columns - 1 - j);\n this.set(i, j, last);\n this.set(i, this.columns - 1 - j, first);\n }\n }\n return this;\n }\n\n flipColumns() {\n const middle = Math.ceil(this.rows / 2);\n for (let j = 0; j < this.columns; j++) {\n for (let i = 0; i < middle; i++) {\n let first = this.get(i, j);\n let last = this.get(this.rows - 1 - i, j);\n this.set(i, j, last);\n this.set(this.rows - 1 - i, j, first);\n }\n }\n return this;\n }\n\n kroneckerProduct(other) {\n other = Matrix.checkMatrix(other);\n\n let m = this.rows;\n let n = this.columns;\n let p = other.rows;\n let q = other.columns;\n\n let result = new Matrix(m * p, n * q);\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n for (let k = 0; k < p; k++) {\n for (let l = 0; l < q; l++) {\n result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n }\n }\n }\n }\n return result;\n }\n\n kroneckerSum(other) {\n other = Matrix.checkMatrix(other);\n if (!this.isSquare() || !other.isSquare()) {\n throw new Error('Kronecker Sum needs two Square Matrices');\n }\n let m = this.rows;\n let n = other.rows;\n let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n return AxI.add(IxB);\n }\n\n transpose() {\n let result = new Matrix(this.columns, this.rows);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n result.set(j, i, this.get(i, j));\n }\n }\n return result;\n }\n\n sortRows(compareFunction = compareNumbers) {\n for (let i = 0; i < this.rows; i++) {\n this.setRow(i, this.getRow(i).sort(compareFunction));\n }\n return this;\n }\n\n sortColumns(compareFunction = compareNumbers) {\n for (let i = 0; i < this.columns; i++) {\n this.setColumn(i, this.getColumn(i).sort(compareFunction));\n }\n return this;\n }\n\n subMatrix(startRow, endRow, startColumn, endColumn) {\n checkRange(this, startRow, endRow, startColumn, endColumn);\n let newMatrix = new Matrix(\n endRow - startRow + 1,\n endColumn - startColumn + 1,\n );\n for (let i = startRow; i <= endRow; i++) {\n for (let j = startColumn; j <= endColumn; j++) {\n newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n }\n }\n return newMatrix;\n }\n\n subMatrixRow(indices, startColumn, endColumn) {\n if (startColumn === undefined) startColumn = 0;\n if (endColumn === undefined) endColumn = this.columns - 1;\n if (\n startColumn > endColumn ||\n startColumn < 0 ||\n startColumn >= this.columns ||\n endColumn < 0 ||\n endColumn >= this.columns\n ) {\n throw new RangeError('Argument out of range');\n }\n\n let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n for (let i = 0; i < indices.length; i++) {\n for (let j = startColumn; j <= endColumn; j++) {\n if (indices[i] < 0 || indices[i] >= this.rows) {\n throw new RangeError(`Row index out of range: ${indices[i]}`);\n }\n newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n }\n }\n return newMatrix;\n }\n\n subMatrixColumn(indices, startRow, endRow) {\n if (startRow === undefined) startRow = 0;\n if (endRow === undefined) endRow = this.rows - 1;\n if (\n startRow > endRow ||\n startRow < 0 ||\n startRow >= this.rows ||\n endRow < 0 ||\n endRow >= this.rows\n ) {\n throw new RangeError('Argument out of range');\n }\n\n let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n for (let i = 0; i < indices.length; i++) {\n for (let j = startRow; j <= endRow; j++) {\n if (indices[i] < 0 || indices[i] >= this.columns) {\n throw new RangeError(`Column index out of range: ${indices[i]}`);\n }\n newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n }\n }\n return newMatrix;\n }\n\n setSubMatrix(matrix, startRow, startColumn) {\n matrix = Matrix.checkMatrix(matrix);\n if (matrix.isEmpty()) {\n return this;\n }\n let endRow = startRow + matrix.rows - 1;\n let endColumn = startColumn + matrix.columns - 1;\n checkRange(this, startRow, endRow, startColumn, endColumn);\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n this.set(startRow + i, startColumn + j, matrix.get(i, j));\n }\n }\n return this;\n }\n\n selection(rowIndices, columnIndices) {\n checkRowIndices(this, rowIndices);\n checkColumnIndices(this, columnIndices);\n let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n for (let i = 0; i < rowIndices.length; i++) {\n let rowIndex = rowIndices[i];\n for (let j = 0; j < columnIndices.length; j++) {\n let columnIndex = columnIndices[j];\n newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n }\n }\n return newMatrix;\n }\n\n trace() {\n let min = Math.min(this.rows, this.columns);\n let trace = 0;\n for (let i = 0; i < min; i++) {\n trace += this.get(i, i);\n }\n return trace;\n }\n\n clone() {\n let newMatrix = new Matrix(this.rows, this.columns);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n newMatrix.set(row, column, this.get(row, column));\n }\n }\n return newMatrix;\n }\n\n sum(by) {\n switch (by) {\n case 'row':\n return sumByRow(this);\n case 'column':\n return sumByColumn(this);\n case undefined:\n return sumAll(this);\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n product(by) {\n switch (by) {\n case 'row':\n return productByRow(this);\n case 'column':\n return productByColumn(this);\n case undefined:\n return productAll(this);\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n mean(by) {\n const sum = this.sum(by);\n switch (by) {\n case 'row': {\n for (let i = 0; i < this.rows; i++) {\n sum[i] /= this.columns;\n }\n return sum;\n }\n case 'column': {\n for (let i = 0; i < this.columns; i++) {\n sum[i] /= this.rows;\n }\n return sum;\n }\n case undefined:\n return sum / this.size;\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n variance(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { unbiased = true, mean = this.mean(by) } = options;\n if (typeof unbiased !== 'boolean') {\n throw new TypeError('unbiased must be a boolean');\n }\n switch (by) {\n case 'row': {\n if (!isAnyArray(mean)) {\n throw new TypeError('mean must be an array');\n }\n return varianceByRow(this, unbiased, mean);\n }\n case 'column': {\n if (!isAnyArray(mean)) {\n throw new TypeError('mean must be an array');\n }\n return varianceByColumn(this, unbiased, mean);\n }\n case undefined: {\n if (typeof mean !== 'number') {\n throw new TypeError('mean must be a number');\n }\n return varianceAll(this, unbiased, mean);\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n standardDeviation(by, options) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n const variance = this.variance(by, options);\n if (by === undefined) {\n return Math.sqrt(variance);\n } else {\n for (let i = 0; i < variance.length; i++) {\n variance[i] = Math.sqrt(variance[i]);\n }\n return variance;\n }\n }\n\n center(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { center = this.mean(by) } = options;\n switch (by) {\n case 'row': {\n if (!isAnyArray(center)) {\n throw new TypeError('center must be an array');\n }\n centerByRow(this, center);\n return this;\n }\n case 'column': {\n if (!isAnyArray(center)) {\n throw new TypeError('center must be an array');\n }\n centerByColumn(this, center);\n return this;\n }\n case undefined: {\n if (typeof center !== 'number') {\n throw new TypeError('center must be a number');\n }\n centerAll(this, center);\n return this;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n scale(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n let scale = options.scale;\n switch (by) {\n case 'row': {\n if (scale === undefined) {\n scale = getScaleByRow(this);\n } else if (!isAnyArray(scale)) {\n throw new TypeError('scale must be an array');\n }\n scaleByRow(this, scale);\n return this;\n }\n case 'column': {\n if (scale === undefined) {\n scale = getScaleByColumn(this);\n } else if (!isAnyArray(scale)) {\n throw new TypeError('scale must be an array');\n }\n scaleByColumn(this, scale);\n return this;\n }\n case undefined: {\n if (scale === undefined) {\n scale = getScaleAll(this);\n } else if (typeof scale !== 'number') {\n throw new TypeError('scale must be a number');\n }\n scaleAll(this, scale);\n return this;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n toString(options) {\n return inspectMatrixWithOptions(this, options);\n }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n return a - b;\n}\n\nfunction isArrayOfNumbers(array) {\n return array.every((element) => {\n return typeof element === 'number';\n });\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n constructor(nRows, nColumns) {\n super();\n if (Matrix.isMatrix(nRows)) {\n // eslint-disable-next-line no-constructor-return\n return nRows.clone();\n } else if (Number.isInteger(nRows) && nRows >= 0) {\n // Create an empty matrix\n this.data = [];\n if (Number.isInteger(nColumns) && nColumns >= 0) {\n for (let i = 0; i < nRows; i++) {\n this.data.push(new Float64Array(nColumns));\n }\n } else {\n throw new TypeError('nColumns must be a positive integer');\n }\n } else if (isAnyArray(nRows)) {\n // Copy the values from the 2D array\n const arrayData = nRows;\n nRows = arrayData.length;\n nColumns = nRows ? arrayData[0].length : 0;\n if (typeof nColumns !== 'number') {\n throw new TypeError(\n 'Data must be a 2D array with at least one element',\n );\n }\n this.data = [];\n for (let i = 0; i < nRows; i++) {\n if (arrayData[i].length !== nColumns) {\n throw new RangeError('Inconsistent array dimensions');\n }\n if (!isArrayOfNumbers(arrayData[i])) {\n throw new TypeError('Input data contains non-numeric values');\n }\n this.data.push(Float64Array.from(arrayData[i]));\n }\n } else {\n throw new TypeError(\n 'First argument must be a positive number or an array',\n );\n }\n this.rows = nRows;\n this.columns = nColumns;\n }\n\n set(rowIndex, columnIndex, value) {\n this.data[rowIndex][columnIndex] = value;\n return this;\n }\n\n get(rowIndex, columnIndex) {\n return this.data[rowIndex][columnIndex];\n }\n\n removeRow(index) {\n checkRowIndex(this, index);\n this.data.splice(index, 1);\n this.rows -= 1;\n return this;\n }\n\n addRow(index, array) {\n if (array === undefined) {\n array = index;\n index = this.rows;\n }\n checkRowIndex(this, index, true);\n array = Float64Array.from(checkRowVector(this, array));\n this.data.splice(index, 0, array);\n this.rows += 1;\n return this;\n }\n\n removeColumn(index) {\n checkColumnIndex(this, index);\n for (let i = 0; i < this.rows; i++) {\n const newRow = new Float64Array(this.columns - 1);\n for (let j = 0; j < index; j++) {\n newRow[j] = this.data[i][j];\n }\n for (let j = index + 1; j < this.columns; j++) {\n newRow[j - 1] = this.data[i][j];\n }\n this.data[i] = newRow;\n }\n this.columns -= 1;\n return this;\n }\n\n addColumn(index, array) {\n if (typeof array === 'undefined') {\n array = index;\n index = this.columns;\n }\n checkColumnIndex(this, index, true);\n array = checkColumnVector(this, array);\n for (let i = 0; i < this.rows; i++) {\n const newRow = new Float64Array(this.columns + 1);\n let j = 0;\n for (; j < index; j++) {\n newRow[j] = this.data[i][j];\n }\n newRow[j++] = array[i];\n for (; j < this.columns + 1; j++) {\n newRow[j] = this.data[i][j - 1];\n }\n this.data[i] = newRow;\n }\n this.columns += 1;\n return this;\n }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n let sum = newArray(matrix.rows);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[i] += matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function sumByColumn(matrix) {\n let sum = newArray(matrix.columns);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[j] += matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function sumAll(matrix) {\n let v = 0;\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n v += matrix.get(i, j);\n }\n }\n return v;\n}\n\nexport function productByRow(matrix) {\n let sum = newArray(matrix.rows, 1);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[i] *= matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function productByColumn(matrix) {\n let sum = newArray(matrix.columns, 1);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[j] *= matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function productAll(matrix) {\n let v = 1;\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n v *= matrix.get(i, j);\n }\n }\n return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const variance = [];\n\n for (let i = 0; i < rows; i++) {\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let j = 0; j < cols; j++) {\n x = matrix.get(i, j) - mean[i];\n sum1 += x;\n sum2 += x * x;\n }\n if (unbiased) {\n variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n } else {\n variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n }\n }\n return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const variance = [];\n\n for (let j = 0; j < cols; j++) {\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let i = 0; i < rows; i++) {\n x = matrix.get(i, j) - mean[j];\n sum1 += x;\n sum2 += x * x;\n }\n if (unbiased) {\n variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n } else {\n variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n }\n }\n return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const size = rows * cols;\n\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < cols; j++) {\n x = matrix.get(i, j) - mean;\n sum1 += x;\n sum2 += x * x;\n }\n }\n if (unbiased) {\n return (sum2 - (sum1 * sum1) / size) / (size - 1);\n } else {\n return (sum2 - (sum1 * sum1) / size) / size;\n }\n}\n\nexport function centerByRow(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean[i]);\n }\n }\n}\n\nexport function centerByColumn(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean[j]);\n }\n }\n}\n\nexport function centerAll(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean);\n }\n }\n}\n\nexport function getScaleByRow(matrix) {\n const scale = [];\n for (let i = 0; i < matrix.rows; i++) {\n let sum = 0;\n for (let j = 0; j < matrix.columns; j++) {\n sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n }\n scale.push(Math.sqrt(sum));\n }\n return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale[i]);\n }\n }\n}\n\nexport function getScaleByColumn(matrix) {\n const scale = [];\n for (let j = 0; j < matrix.columns; j++) {\n let sum = 0;\n for (let i = 0; i < matrix.rows; i++) {\n sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n }\n scale.push(Math.sqrt(sum));\n }\n return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale[j]);\n }\n }\n}\n\nexport function getScaleAll(matrix) {\n const divider = matrix.size - 1;\n let sum = 0;\n for (let j = 0; j < matrix.columns; j++) {\n for (let i = 0; i < matrix.rows; i++) {\n sum += Math.pow(matrix.get(i, j), 2) / divider;\n }\n }\n return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale);\n }\n }\n}\n","export function installMathOperations(AbstractMatrix, Matrix) {\n AbstractMatrix.prototype.add = function add(value) {\n if (typeof value === 'number') return this.addS(value);\n return this.addM(value);\n };\n\n AbstractMatrix.prototype.addS = function addS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.addM = function addM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.add = function add(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.add(value);\n };\n\n AbstractMatrix.prototype.sub = function sub(value) {\n if (typeof value === 'number') return this.subS(value);\n return this.subM(value);\n };\n\n AbstractMatrix.prototype.subS = function subS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.subM = function subM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.sub = function sub(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sub(value);\n };\n AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n AbstractMatrix.subtract = AbstractMatrix.sub;\n\n AbstractMatrix.prototype.mul = function mul(value) {\n if (typeof value === 'number') return this.mulS(value);\n return this.mulM(value);\n };\n\n AbstractMatrix.prototype.mulS = function mulS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.mulM = function mulM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.mul = function mul(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.mul(value);\n };\n AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n AbstractMatrix.multiply = AbstractMatrix.mul;\n\n AbstractMatrix.prototype.div = function div(value) {\n if (typeof value === 'number') return this.divS(value);\n return this.divM(value);\n };\n\n AbstractMatrix.prototype.divS = function divS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.divM = function divM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.div = function div(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.div(value);\n };\n AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n AbstractMatrix.divide = AbstractMatrix.div;\n\n AbstractMatrix.prototype.mod = function mod(value) {\n if (typeof value === 'number') return this.modS(value);\n return this.modM(value);\n };\n\n AbstractMatrix.prototype.modS = function modS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) % value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.modM = function modM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) % matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.mod = function mod(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.mod(value);\n };\n AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n AbstractMatrix.modulus = AbstractMatrix.mod;\n\n AbstractMatrix.prototype.and = function and(value) {\n if (typeof value === 'number') return this.andS(value);\n return this.andM(value);\n };\n\n AbstractMatrix.prototype.andS = function andS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) & value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.andM = function andM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) & matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.and = function and(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.and(value);\n };\n\n AbstractMatrix.prototype.or = function or(value) {\n if (typeof value === 'number') return this.orS(value);\n return this.orM(value);\n };\n\n AbstractMatrix.prototype.orS = function orS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) | value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.orM = function orM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) | matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.or = function or(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.or(value);\n };\n\n AbstractMatrix.prototype.xor = function xor(value) {\n if (typeof value === 'number') return this.xorS(value);\n return this.xorM(value);\n };\n\n AbstractMatrix.prototype.xorS = function xorS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) ^ value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.xorM = function xorM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.xor = function xor(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.xor(value);\n };\n\n AbstractMatrix.prototype.leftShift = function leftShift(value) {\n if (typeof value === 'number') return this.leftShiftS(value);\n return this.leftShiftM(value);\n };\n\n AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) << value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) << matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.leftShift = function leftShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.leftShift(value);\n };\n\n AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n return this.signPropagatingRightShiftM(value);\n };\n\n AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >> value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.signPropagatingRightShift(value);\n };\n\n AbstractMatrix.prototype.rightShift = function rightShift(value) {\n if (typeof value === 'number') return this.rightShiftS(value);\n return this.rightShiftM(value);\n };\n\n AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >>> value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.rightShift = function rightShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.rightShift(value);\n };\n AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n AbstractMatrix.prototype.not = function not() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, ~(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.not = function not(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.not();\n };\n\n AbstractMatrix.prototype.abs = function abs() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.abs(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.abs = function abs(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.abs();\n };\n\n AbstractMatrix.prototype.acos = function acos() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.acos(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.acos = function acos(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.acos();\n };\n\n AbstractMatrix.prototype.acosh = function acosh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.acosh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.acosh = function acosh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.acosh();\n };\n\n AbstractMatrix.prototype.asin = function asin() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.asin(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.asin = function asin(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.asin();\n };\n\n AbstractMatrix.prototype.asinh = function asinh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.asinh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.asinh = function asinh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.asinh();\n };\n\n AbstractMatrix.prototype.atan = function atan() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.atan(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.atan = function atan(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.atan();\n };\n\n AbstractMatrix.prototype.atanh = function atanh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.atanh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.atanh = function atanh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.atanh();\n };\n\n AbstractMatrix.prototype.cbrt = function cbrt() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cbrt(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cbrt = function cbrt(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cbrt();\n };\n\n AbstractMatrix.prototype.ceil = function ceil() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.ceil(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.ceil = function ceil(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.ceil();\n };\n\n AbstractMatrix.prototype.clz32 = function clz32() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.clz32(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.clz32 = function clz32(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.clz32();\n };\n\n AbstractMatrix.prototype.cos = function cos() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cos(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cos = function cos(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cos();\n };\n\n AbstractMatrix.prototype.cosh = function cosh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cosh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cosh = function cosh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cosh();\n };\n\n AbstractMatrix.prototype.exp = function exp() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.exp(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.exp = function exp(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.exp();\n };\n\n AbstractMatrix.prototype.expm1 = function expm1() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.expm1(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.expm1 = function expm1(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.expm1();\n };\n\n AbstractMatrix.prototype.floor = function floor() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.floor(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.floor = function floor(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.floor();\n };\n\n AbstractMatrix.prototype.fround = function fround() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.fround(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.fround = function fround(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.fround();\n };\n\n AbstractMatrix.prototype.log = function log() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log = function log(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log();\n };\n\n AbstractMatrix.prototype.log1p = function log1p() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log1p(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log1p = function log1p(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log1p();\n };\n\n AbstractMatrix.prototype.log10 = function log10() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log10(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log10 = function log10(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log10();\n };\n\n AbstractMatrix.prototype.log2 = function log2() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log2(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log2 = function log2(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log2();\n };\n\n AbstractMatrix.prototype.round = function round() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.round(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.round = function round(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.round();\n };\n\n AbstractMatrix.prototype.sign = function sign() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sign(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sign = function sign(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sign();\n };\n\n AbstractMatrix.prototype.sin = function sin() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sin(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sin = function sin(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sin();\n };\n\n AbstractMatrix.prototype.sinh = function sinh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sinh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sinh = function sinh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sinh();\n };\n\n AbstractMatrix.prototype.sqrt = function sqrt() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sqrt(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sqrt = function sqrt(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sqrt();\n };\n\n AbstractMatrix.prototype.tan = function tan() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.tan(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.tan = function tan(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.tan();\n };\n\n AbstractMatrix.prototype.tanh = function tanh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.tanh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.tanh = function tanh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.tanh();\n };\n\n AbstractMatrix.prototype.trunc = function trunc() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.trunc(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.trunc = function trunc(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.trunc();\n };\n\n AbstractMatrix.pow = function pow(matrix, arg0) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.pow(arg0);\n };\n\n AbstractMatrix.prototype.pow = function pow(value) {\n if (typeof value === 'number') return this.powS(value);\n return this.powM(value);\n };\n\n AbstractMatrix.prototype.powS = function powS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.pow(this.get(i, j), value));\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.powM = function powM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n }\n }\n return this;\n };\n}\n","import { AbstractMatrix } from '../matrix';\n\nexport default class WrapperMatrix2D extends AbstractMatrix {\n constructor(data) {\n super();\n this.data = data;\n this.rows = data.length;\n this.columns = data[0].length;\n }\n\n set(rowIndex, columnIndex, value) {\n this.data[rowIndex][columnIndex] = value;\n return this;\n }\n\n get(rowIndex, columnIndex) {\n return this.data[rowIndex][columnIndex];\n }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nexport default class LuDecomposition {\n constructor(matrix) {\n matrix = WrapperMatrix2D.checkMatrix(matrix);\n\n let lu = matrix.clone();\n let rows = lu.rows;\n let columns = lu.columns;\n let pivotVector = new Float64Array(rows);\n let pivotSign = 1;\n let i, j, k, p, s, t, v;\n let LUcolj, kmax;\n\n for (i = 0; i < rows; i++) {\n pivotVector[i] = i;\n }\n\n LUcolj = new Float64Array(rows);\n\n for (j = 0; j < columns; j++) {\n for (i = 0; i < rows; i++) {\n LUcolj[i] = lu.get(i, j);\n }\n\n for (i = 0; i < rows; i++) {\n kmax = Math.min(i, j);\n s = 0;\n for (k = 0; k < kmax; k++) {\n s += lu.get(i, k) * LUcolj[k];\n }\n LUcolj[i] -= s;\n lu.set(i, j, LUcolj[i]);\n }\n\n p = j;\n for (i = j + 1; i < rows; i++) {\n if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {\n p = i;\n }\n }\n\n if (p !== j) {\n for (k = 0; k < columns; k++) {\n t = lu.get(p, k);\n lu.set(p, k, lu.get(j, k));\n lu.set(j, k, t);\n }\n\n v = pivotVector[p];\n pivotVector[p] = pivotVector[j];\n pivotVector[j] = v;\n\n pivotSign = -pivotSign;\n }\n\n if (j < rows && lu.get(j, j) !== 0) {\n for (i = j + 1; i < rows; i++) {\n lu.set(i, j, lu.get(i, j) / lu.get(j, j));\n }\n }\n }\n\n this.LU = lu;\n this.pivotVector = pivotVector;\n this.pivotSign = pivotSign;\n }\n\n isSingular() {\n let data = this.LU;\n let col = data.columns;\n for (let j = 0; j < col; j++) {\n if (data.get(j, j) === 0) {\n return true;\n }\n }\n return false;\n }\n\n solve(value) {\n value = Matrix.checkMatrix(value);\n\n let lu = this.LU;\n let rows = lu.rows;\n\n if (rows !== value.rows) {\n throw new Error('Invalid matrix dimensions');\n }\n if (this.isSingular()) {\n throw new Error('LU matrix is singular');\n }\n\n let count = value.columns;\n let X = value.subMatrixRow(this.pivotVector, 0, count - 1);\n let columns = lu.columns;\n let i, j, k;\n\n for (k = 0; k < columns; k++) {\n for (i = k + 1; i < columns; i++) {\n for (j = 0; j < count; j++) {\n X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n }\n }\n }\n for (k = columns - 1; k >= 0; k--) {\n for (j = 0; j < count; j++) {\n X.set(k, j, X.get(k, j) / lu.get(k, k));\n }\n for (i = 0; i < k; i++) {\n for (j = 0; j < count; j++) {\n X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n }\n }\n }\n return X;\n }\n\n get determinant() {\n let data = this.LU;\n if (!data.isSquare()) {\n throw new Error('Matrix must be square');\n }\n let determinant = this.pivotSign;\n let col = data.columns;\n for (let j = 0; j < col; j++) {\n determinant *= data.get(j, j);\n }\n return determinant;\n }\n\n get lowerTriangularMatrix() {\n let data = this.LU;\n let rows = data.rows;\n let columns = data.columns;\n let X = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n if (i > j) {\n X.set(i, j, data.get(i, j));\n } else if (i === j) {\n X.set(i, j, 1);\n } else {\n X.set(i, j, 0);\n }\n }\n }\n return X;\n }\n\n get upperTriangularMatrix() {\n let data = this.LU;\n let rows = data.rows;\n let columns = data.columns;\n let X = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n if (i <= j) {\n X.set(i, j, data.get(i, j));\n } else {\n X.set(i, j, 0);\n }\n }\n }\n return X;\n }\n\n get pivotPermutationVector() {\n return Array.from(this.pivotVector);\n }\n}\n","export function hypotenuse(a, b) {\n let r = 0;\n if (Math.abs(a) > Math.abs(b)) {\n r = b / a;\n return Math.abs(a) * Math.sqrt(1 + r * r);\n }\n if (b !== 0) {\n r = a / b;\n return Math.abs(b) * Math.sqrt(1 + r * r);\n }\n return 0;\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class QrDecomposition {\n constructor(value) {\n value = WrapperMatrix2D.checkMatrix(value);\n\n let qr = value.clone();\n let m = value.rows;\n let n = value.columns;\n let rdiag = new Float64Array(n);\n let i, j, k, s;\n\n for (k = 0; k < n; k++) {\n let nrm = 0;\n for (i = k; i < m; i++) {\n nrm = hypotenuse(nrm, qr.get(i, k));\n }\n if (nrm !== 0) {\n if (qr.get(k, k) < 0) {\n nrm = -nrm;\n }\n for (i = k; i < m; i++) {\n qr.set(i, k, qr.get(i, k) / nrm);\n }\n qr.set(k, k, qr.get(k, k) + 1);\n for (j = k + 1; j < n; j++) {\n s = 0;\n for (i = k; i < m; i++) {\n s += qr.get(i, k) * qr.get(i, j);\n }\n s = -s / qr.get(k, k);\n for (i = k; i < m; i++) {\n qr.set(i, j, qr.get(i, j) + s * qr.get(i, k));\n }\n }\n }\n rdiag[k] = -nrm;\n }\n\n this.QR = qr;\n this.Rdiag = rdiag;\n }\n\n solve(value) {\n value = Matrix.checkMatrix(value);\n\n let qr = this.QR;\n let m = qr.rows;\n\n if (value.rows !== m) {\n throw new Error('Matrix row dimensions must agree');\n }\n if (!this.isFullRank()) {\n throw new Error('Matrix is rank deficient');\n }\n\n let count = value.columns;\n let X = value.clone();\n let n = qr.columns;\n let i, j, k, s;\n\n for (k = 0; k < n; k++) {\n for (j = 0; j < count; j++) {\n s = 0;\n for (i = k; i < m; i++) {\n s += qr.get(i, k) * X.get(i, j);\n }\n s = -s / qr.get(k, k);\n for (i = k; i < m; i++) {\n X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n }\n }\n }\n for (k = n - 1; k >= 0; k--) {\n for (j = 0; j < count; j++) {\n X.set(k, j, X.get(k, j) / this.Rdiag[k]);\n }\n for (i = 0; i < k; i++) {\n for (j = 0; j < count; j++) {\n X.set(i, j, X.get(i, j) - X.get(k, j) * qr.get(i, k));\n }\n }\n }\n\n return X.subMatrix(0, n - 1, 0, count - 1);\n }\n\n isFullRank() {\n let columns = this.QR.columns;\n for (let i = 0; i < columns; i++) {\n if (this.Rdiag[i] === 0) {\n return false;\n }\n }\n return true;\n }\n\n get upperTriangularMatrix() {\n let qr = this.QR;\n let n = qr.columns;\n let X = new Matrix(n, n);\n let i, j;\n for (i = 0; i < n; i++) {\n for (j = 0; j < n; j++) {\n if (i < j) {\n X.set(i, j, qr.get(i, j));\n } else if (i === j) {\n X.set(i, j, this.Rdiag[i]);\n } else {\n X.set(i, j, 0);\n }\n }\n }\n return X;\n }\n\n get orthogonalMatrix() {\n let qr = this.QR;\n let rows = qr.rows;\n let columns = qr.columns;\n let X = new Matrix(rows, columns);\n let i, j, k, s;\n\n for (k = columns - 1; k >= 0; k--) {\n for (i = 0; i < rows; i++) {\n X.set(i, k, 0);\n }\n X.set(k, k, 1);\n for (j = k; j < columns; j++) {\n if (qr.get(k, k) !== 0) {\n s = 0;\n for (i = k; i < rows; i++) {\n s += qr.get(i, k) * X.get(i, j);\n }\n\n s = -s / qr.get(k, k);\n\n for (i = k; i < rows; i++) {\n X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n }\n }\n }\n }\n return X;\n }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class SingularValueDecomposition {\n constructor(value, options = {}) {\n value = WrapperMatrix2D.checkMatrix(value);\n\n if (value.isEmpty()) {\n throw new Error('Matrix must be non-empty');\n }\n\n let m = value.rows;\n let n = value.columns;\n\n const {\n computeLeftSingularVectors = true,\n computeRightSingularVectors = true,\n autoTranspose = false,\n } = options;\n\n let wantu = Boolean(computeLeftSingularVectors);\n let wantv = Boolean(computeRightSingularVectors);\n\n let swapped = false;\n let a;\n if (m < n) {\n if (!autoTranspose) {\n a = value.clone();\n // eslint-disable-next-line no-console\n console.warn(\n 'Computing SVD on a matrix with more columns than rows. Consider enabling autoTranspose',\n );\n } else {\n a = value.transpose();\n m = a.rows;\n n = a.columns;\n swapped = true;\n let aux = wantu;\n wantu = wantv;\n wantv = aux;\n }\n } else {\n a = value.clone();\n }\n\n let nu = Math.min(m, n);\n let ni = Math.min(m + 1, n);\n let s = new Float64Array(ni);\n let U = new Matrix(m, nu);\n let V = new Matrix(n, n);\n\n let e = new Float64Array(n);\n let work = new Float64Array(m);\n\n let si = new Float64Array(ni);\n for (let i = 0; i < ni; i++) si[i] = i;\n\n let nct = Math.min(m - 1, n);\n let nrt = Math.max(0, Math.min(n - 2, m));\n let mrc = Math.max(nct, nrt);\n\n for (let k = 0; k < mrc; k++) {\n if (k < nct) {\n s[k] = 0;\n for (let i = k; i < m; i++) {\n s[k] = hypotenuse(s[k], a.get(i, k));\n }\n if (s[k] !== 0) {\n if (a.get(k, k) < 0) {\n s[k] = -s[k];\n }\n for (let i = k; i < m; i++) {\n a.set(i, k, a.get(i, k) / s[k]);\n }\n a.set(k, k, a.get(k, k) + 1);\n }\n s[k] = -s[k];\n }\n\n for (let j = k + 1; j < n; j++) {\n if (k < nct && s[k] !== 0) {\n let t = 0;\n for (let i = k; i < m; i++) {\n t += a.get(i, k) * a.get(i, j);\n }\n t = -t / a.get(k, k);\n for (let i = k; i < m; i++) {\n a.set(i, j, a.get(i, j) + t * a.get(i, k));\n }\n }\n e[j] = a.get(k, j);\n }\n\n if (wantu && k < nct) {\n for (let i = k; i < m; i++) {\n U.set(i, k, a.get(i, k));\n }\n }\n\n if (k < nrt) {\n e[k] = 0;\n for (let i = k + 1; i < n; i++) {\n e[k] = hypotenuse(e[k], e[i]);\n }\n if (e[k] !== 0) {\n if (e[k + 1] < 0) {\n e[k] = 0 - e[k];\n }\n for (let i = k + 1; i < n; i++) {\n e[i] /= e[k];\n }\n e[k + 1] += 1;\n }\n e[k] = -e[k];\n if (k + 1 < m && e[k] !== 0) {\n for (let i = k + 1; i < m; i++) {\n work[i] = 0;\n }\n for (let i = k + 1; i < m; i++) {\n for (let j = k + 1; j < n; j++) {\n work[i] += e[j] * a.get(i, j);\n }\n }\n for (let j = k + 1; j < n; j++) {\n let t = -e[j] / e[k + 1];\n for (let i = k + 1; i < m; i++) {\n a.set(i, j, a.get(i, j) + t * work[i]);\n }\n }\n }\n if (wantv) {\n for (let i = k + 1; i < n; i++) {\n V.set(i, k, e[i]);\n }\n }\n }\n }\n\n let p = Math.min(n, m + 1);\n if (nct < n) {\n s[nct] = a.get(nct, nct);\n }\n if (m < p) {\n s[p - 1] = 0;\n }\n if (nrt + 1 < p) {\n e[nrt] = a.get(nrt, p - 1);\n }\n e[p - 1] = 0;\n\n if (wantu) {\n for (let j = nct; j < nu; j++) {\n for (let i = 0; i < m; i++) {\n U.set(i, j, 0);\n }\n U.set(j, j, 1);\n }\n for (let k = nct - 1; k >= 0; k--) {\n if (s[k] !== 0) {\n for (let j = k + 1; j < nu; j++) {\n let t = 0;\n for (let i = k; i < m; i++) {\n t += U.get(i, k) * U.get(i, j);\n }\n t = -t / U.get(k, k);\n for (let i = k; i < m; i++) {\n U.set(i, j, U.get(i, j) + t * U.get(i, k));\n }\n }\n for (let i = k; i < m; i++) {\n U.set(i, k, -U.get(i, k));\n }\n U.set(k, k, 1 + U.get(k, k));\n for (let i = 0; i < k - 1; i++) {\n U.set(i, k, 0);\n }\n } else {\n for (let i = 0; i < m; i++) {\n U.set(i, k, 0);\n }\n U.set(k, k, 1);\n }\n }\n }\n\n if (wantv) {\n for (let k = n - 1; k >= 0; k--) {\n if (k < nrt && e[k] !== 0) {\n for (let j = k + 1; j < n; j++) {\n let t = 0;\n for (let i = k + 1; i < n; i++) {\n t += V.get(i, k) * V.get(i, j);\n }\n t = -t / V.get(k + 1, k);\n for (let i = k + 1; i < n; i++) {\n V.set(i, j, V.get(i, j) + t * V.get(i, k));\n }\n }\n }\n for (let i = 0; i < n; i++) {\n V.set(i, k, 0);\n }\n V.set(k, k, 1);\n }\n }\n\n let pp = p - 1;\n let iter = 0;\n let eps = Number.EPSILON;\n while (p > 0) {\n let k, kase;\n for (k = p - 2; k >= -1; k--) {\n if (k === -1) {\n break;\n }\n const alpha =\n Number.MIN_VALUE + eps * Math.abs(s[k] + Math.abs(s[k + 1]));\n if (Math.abs(e[k]) <= alpha || Number.isNaN(e[k])) {\n e[k] = 0;\n break;\n }\n }\n if (k === p - 2) {\n kase = 4;\n } else {\n let ks;\n for (ks = p - 1; ks >= k; ks--) {\n if (ks === k) {\n break;\n }\n let t =\n (ks !== p ? Math.abs(e[ks]) : 0) +\n (ks !== k + 1 ? Math.abs(e[ks - 1]) : 0);\n if (Math.abs(s[ks]) <= eps * t) {\n s[ks] = 0;\n break;\n }\n }\n if (ks === k) {\n kase = 3;\n } else if (ks === p - 1) {\n kase = 1;\n } else {\n kase = 2;\n k = ks;\n }\n }\n\n k++;\n\n switch (kase) {\n case 1: {\n let f = e[p - 2];\n e[p - 2] = 0;\n for (let j = p - 2; j >= k; j--) {\n let t = hypotenuse(s[j], f);\n let cs = s[j] / t;\n let sn = f / t;\n s[j] = t;\n if (j !== k) {\n f = -sn * e[j - 1];\n e[j - 1] = cs * e[j - 1];\n }\n if (wantv) {\n for (let i = 0; i < n; i++) {\n t = cs * V.get(i, j) + sn * V.get(i, p - 1);\n V.set(i, p - 1, -sn * V.get(i, j) + cs * V.get(i, p - 1));\n V.set(i, j, t);\n }\n }\n }\n break;\n }\n case 2: {\n let f = e[k - 1];\n e[k - 1] = 0;\n for (let j = k; j < p; j++) {\n let t = hypotenuse(s[j], f);\n let cs = s[j] / t;\n let sn = f / t;\n s[j] = t;\n f = -sn * e[j];\n e[j] = cs * e[j];\n if (wantu) {\n for (let i = 0; i < m; i++) {\n t = cs * U.get(i, j) + sn * U.get(i, k - 1);\n U.set(i, k - 1, -sn * U.get(i, j) + cs * U.get(i, k - 1));\n U.set(i, j, t);\n }\n }\n }\n break;\n }\n case 3: {\n const scale = Math.max(\n Math.abs(s[p - 1]),\n Math.abs(s[p - 2]),\n Math.abs(e[p - 2]),\n Math.abs(s[k]),\n Math.abs(e[k]),\n );\n const sp = s[p - 1] / scale;\n const spm1 = s[p - 2] / scale;\n const epm1 = e[p - 2] / scale;\n const sk = s[k] / scale;\n const ek = e[k] / scale;\n const b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2;\n const c = sp * epm1 * (sp * epm1);\n let shift = 0;\n if (b !== 0 || c !== 0) {\n if (b < 0) {\n shift = 0 - Math.sqrt(b * b + c);\n } else {\n shift = Math.sqrt(b * b + c);\n }\n shift = c / (b + shift);\n }\n let f = (sk + sp) * (sk - sp) + shift;\n let g = sk * ek;\n for (let j = k; j < p - 1; j++) {\n let t = hypotenuse(f, g);\n if (t === 0) t = Number.MIN_VALUE;\n let cs = f / t;\n let sn = g / t;\n if (j !== k) {\n e[j - 1] = t;\n }\n f = cs * s[j] + sn * e[j];\n e[j] = cs * e[j] - sn * s[j];\n g = sn * s[j + 1];\n s[j + 1] = cs * s[j + 1];\n if (wantv) {\n for (let i = 0; i < n; i++) {\n t = cs * V.get(i, j) + sn * V.get(i, j + 1);\n V.set(i, j + 1, -sn * V.get(i, j) + cs * V.get(i, j + 1));\n V.set(i, j, t);\n }\n }\n t = hypotenuse(f, g);\n if (t === 0) t = Number.MIN_VALUE;\n cs = f / t;\n sn = g / t;\n s[j] = t;\n f = cs * e[j] + sn * s[j + 1];\n s[j + 1] = -sn * e[j] + cs * s[j + 1];\n g = sn * e[j + 1];\n e[j + 1] = cs * e[j + 1];\n if (wantu && j < m - 1) {\n for (let i = 0; i < m; i++) {\n t = cs * U.get(i, j) + sn * U.get(i, j + 1);\n U.set(i, j + 1, -sn * U.get(i, j) + cs * U.get(i, j + 1));\n U.set(i, j, t);\n }\n }\n }\n e[p - 2] = f;\n iter = iter + 1;\n break;\n }\n case 4: {\n if (s[k] <= 0) {\n s[k] = s[k] < 0 ? -s[k] : 0;\n if (wantv) {\n for (let i = 0; i <= pp; i++) {\n V.set(i, k, -V.get(i, k));\n }\n }\n }\n while (k < pp) {\n if (s[k] >= s[k + 1]) {\n break;\n }\n let t = s[k];\n s[k] = s[k + 1];\n s[k + 1] = t;\n if (wantv && k < n - 1) {\n for (let i = 0; i < n; i++) {\n t = V.get(i, k + 1);\n V.set(i, k + 1, V.get(i, k));\n V.set(i, k, t);\n }\n }\n if (wantu && k < m - 1) {\n for (let i = 0; i < m; i++) {\n t = U.get(i, k + 1);\n U.set(i, k + 1, U.get(i, k));\n U.set(i, k, t);\n }\n }\n k++;\n }\n iter = 0;\n p--;\n break;\n }\n // no default\n }\n }\n\n if (swapped) {\n let tmp = V;\n V = U;\n U = tmp;\n }\n\n this.m = m;\n this.n = n;\n this.s = s;\n this.U = U;\n this.V = V;\n }\n\n solve(value) {\n let Y = value;\n let e = this.threshold;\n let scols = this.s.length;\n let Ls = Matrix.zeros(scols, scols);\n\n for (let i = 0; i < scols; i++) {\n if (Math.abs(this.s[i]) <= e) {\n Ls.set(i, i, 0);\n } else {\n Ls.set(i, i, 1 / this.s[i]);\n }\n }\n\n let U = this.U;\n let V = this.rightSingularVectors;\n\n let VL = V.mmul(Ls);\n let vrows = V.rows;\n let urows = U.rows;\n let VLU = Matrix.zeros(vrows, urows);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < urows; j++) {\n let sum = 0;\n for (let k = 0; k < scols; k++) {\n sum += VL.get(i, k) * U.get(j, k);\n }\n VLU.set(i, j, sum);\n }\n }\n\n return VLU.mmul(Y);\n }\n\n solveForDiagonal(value) {\n return this.solve(Matrix.diag(value));\n }\n\n inverse() {\n let V = this.V;\n let e = this.threshold;\n let vrows = V.rows;\n let vcols = V.columns;\n let X = new Matrix(vrows, this.s.length);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < vcols; j++) {\n if (Math.abs(this.s[j]) > e) {\n X.set(i, j, V.get(i, j) / this.s[j]);\n }\n }\n }\n\n let U = this.U;\n\n let urows = U.rows;\n let ucols = U.columns;\n let Y = new Matrix(vrows, urows);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < urows; j++) {\n let sum = 0;\n for (let k = 0; k < ucols; k++) {\n sum += X.get(i, k) * U.get(j, k);\n }\n Y.set(i, j, sum);\n }\n }\n\n return Y;\n }\n\n get condition() {\n return this.s[0] / this.s[Math.min(this.m, this.n) - 1];\n }\n\n get norm2() {\n return this.s[0];\n }\n\n get rank() {\n let tol = Math.max(this.m, this.n) * this.s[0] * Number.EPSILON;\n let r = 0;\n let s = this.s;\n for (let i = 0, ii = s.length; i < ii; i++) {\n if (s[i] > tol) {\n r++;\n }\n }\n return r;\n }\n\n get diagonal() {\n return Array.from(this.s);\n }\n\n get threshold() {\n return (Number.EPSILON / 2) * Math.max(this.m, this.n) * this.s[0];\n }\n\n get leftSingularVectors() {\n return this.U;\n }\n\n get rightSingularVectors() {\n return this.V;\n }\n\n get diagonalMatrix() {\n return Matrix.diag(this.s);\n }\n}\n","import { inverse, Matrix } from 'ml-matrix';\n\n/**\n * Difference of the matrix function over the parameters\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} evaluatedData - Array of previous evaluated function values\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number} gradientDifference - Adjustment for decrease the damping parameter\n * @param {function} paramFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Matrix}\n */\nfunction gradientFunction(\n data,\n evaluatedData,\n params,\n gradientDifference,\n paramFunction,\n) {\n const n = params.length;\n const m = data.x.length;\n\n let ans = new Array(n);\n\n for (let param = 0; param < n; param++) {\n ans[param] = new Array(m);\n let auxParams = params.slice();\n auxParams[param] += gradientDifference;\n let funcParam = paramFunction(auxParams);\n\n for (let point = 0; point < m; point++) {\n ans[param][point] = evaluatedData[point] - funcParam(data.x[point]);\n }\n }\n return new Matrix(ans);\n}\n\n/**\n * Matrix function over the samples\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} evaluatedData - Array of previous evaluated function values\n * @return {Matrix}\n */\nfunction matrixFunction(data, evaluatedData) {\n const m = data.x.length;\n\n let ans = new Array(m);\n\n for (let point = 0; point < m; point++) {\n ans[point] = [data.y[point] - evaluatedData[point]];\n }\n\n return new Matrix(ans);\n}\n\n/**\n * Iteration for Levenberg-Marquardt\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number} damping - Levenberg-Marquardt parameter\n * @param {number} gradientDifference - Adjustment for decrease the damping parameter\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Array<number>}\n */\nexport default function step(\n data,\n params,\n damping,\n gradientDifference,\n parameterizedFunction,\n) {\n let value = damping * gradientDifference * gradientDifference;\n let identity = Matrix.eye(params.length, params.length, value);\n\n const func = parameterizedFunction(params);\n\n let evaluatedData = new Float64Array(data.x.length);\n for (let i = 0; i < data.x.length; i++) {\n evaluatedData[i] = func(data.x[i]);\n }\n\n let gradientFunc = gradientFunction(\n data,\n evaluatedData,\n params,\n gradientDifference,\n parameterizedFunction,\n );\n let matrixFunc = matrixFunction(data, evaluatedData);\n let inverseMatrix = inverse(\n identity.add(gradientFunc.mmul(gradientFunc.transpose())),\n );\n\n params = new Matrix([params]);\n params = params.sub(\n inverseMatrix\n .mmul(gradientFunc)\n .mmul(matrixFunc)\n .mul(gradientDifference)\n .transpose(),\n );\n\n return params.to1DArray();\n}\n","import LuDecomposition from './dc/lu';\nimport QrDecomposition from './dc/qr';\nimport SingularValueDecomposition from './dc/svd';\nimport Matrix from './matrix';\nimport WrapperMatrix2D from './wrap/WrapperMatrix2D';\n\nexport function inverse(matrix, useSVD = false) {\n matrix = WrapperMatrix2D.checkMatrix(matrix);\n if (useSVD) {\n return new SingularValueDecomposition(matrix).inverse();\n } else {\n return solve(matrix, Matrix.eye(matrix.rows));\n }\n}\n\nexport function solve(leftHandSide, rightHandSide, useSVD = false) {\n leftHandSide = WrapperMatrix2D.checkMatrix(leftHandSide);\n rightHandSide = WrapperMatrix2D.checkMatrix(rightHandSide);\n if (useSVD) {\n return new SingularValueDecomposition(leftHandSide).solve(rightHandSide);\n } else {\n return leftHandSide.isSquare()\n ? new LuDecomposition(leftHandSide).solve(rightHandSide)\n : new QrDecomposition(leftHandSide).solve(rightHandSide);\n }\n}\n","import isArray from 'is-any-array';\n\nimport errorCalculation from './errorCalculation';\nimport step from './step';\n\n/**\n * Curve fitting algorithm\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param {object} [options] - Options object\n * @param {number} [options.damping] - Levenberg-Marquardt parameter\n * @param {number} [options.gradientDifference = 10e-2] - Adjustment for decrease the damping parameter\n * @param {Array<number>} [options.minValues] - Minimum allowed values for parameters\n * @param {Array<number>} [options.maxValues] - Maximum allowed values for parameters\n * @param {Array<number>} [options.initialValues] - Array of initial parameter values\n * @param {number} [options.maxIterations = 100] - Maximum of allowed iterations\n * @param {number} [options.errorTolerance = 10e-3] - Minimum uncertainty allowed for each point\n * @return {{parameterValues: Array<number>, parameterError: number, iterations: number}}\n */\nexport default function levenbergMarquardt(\n data,\n parameterizedFunction,\n options = {},\n) {\n let {\n maxIterations = 100,\n gradientDifference = 10e-2,\n damping = 0,\n errorTolerance = 10e-3,\n minValues,\n maxValues,\n initialValues,\n } = options;\n\n if (damping <= 0) {\n throw new Error('The damping option must be a positive number');\n } else if (!data.x || !data.y) {\n throw new Error('The data parameter must have x and y elements');\n } else if (\n !isArray(data.x) ||\n data.x.length < 2 ||\n !isArray(data.y) ||\n data.y.length < 2\n ) {\n throw new Error(\n 'The data parameter elements must be an array with more than 2 points',\n );\n } else if (data.x.length !== data.y.length) {\n throw new Error('The data parameter elements must have the same size');\n }\n\n let parameters =\n initialValues || new Array(parameterizedFunction.length).fill(1);\n let parLen = parameters.length;\n maxValues = maxValues || new Array(parLen).fill(Number.MAX_SAFE_INTEGER);\n minValues = minValues || new Array(parLen).fill(Number.MIN_SAFE_INTEGER);\n\n if (maxValues.length !== minValues.length) {\n throw new Error('minValues and maxValues must be the same size');\n }\n\n if (!isArray(parameters)) {\n throw new Error('initialValues must be an array');\n }\n\n let error = errorCalculation(data, parameters, parameterizedFunction);\n\n let converged = error <= errorTolerance;\n\n let iteration;\n for (iteration = 0; iteration < maxIterations && !converged; iteration++) {\n parameters = step(\n data,\n parameters,\n damping,\n gradientDifference,\n parameterizedFunction,\n );\n\n for (let k = 0; k < parLen; k++) {\n parameters[k] = Math.min(\n Math.max(minValues[k], parameters[k]),\n maxValues[k],\n );\n }\n\n error = errorCalculation(data, parameters, parameterizedFunction);\n if (isNaN(error)) break;\n converged = error <= errorTolerance;\n }\n\n return {\n parameterValues: parameters,\n parameterError: error,\n iterations: iteration,\n };\n}\n","\"use strict\";\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport * as C from '../utils/constants';\nimport {getHelmMonomers} from '../package';\nimport {TAGS as bioTAGS, getSplitter, getStats} from '@datagrok-libraries/bio/src/utils/macromolecule';\n\nconst V2000_ATOM_NAME_POS = 31;\n\nexport async function getMonomericMols(mcol: DG.Column<string>,\n pattern: boolean = false, monomersDict?: Map<string, string>): Promise<DG.Column> {\n const separator: string = mcol.tags[bioTAGS.separator];\n const units: string = mcol.tags[DG.TAGS.UNITS];\n const splitter = getSplitter(units, separator);\n let molV3000Array;\n monomersDict ??= new Map();\n const monomers = units === 'helm' ?\n getHelmMonomers(mcol) : Object.keys(getStats(mcol, 0, splitter).freq).filter((it) => it !== '');\n\n for (let i = 0; i < monomers.length; i++) {\n if (!monomersDict.has(monomers[i]))\n monomersDict.set(monomers[i], `${monomersDict.size + 1}`);\n }\n\n if (units === 'helm') {\n molV3000Array = await grok.functions.call('HELM:getMolFiles', {col: mcol});\n molV3000Array = changeV2000ToV3000(molV3000Array, monomersDict, pattern);\n } else {\n molV3000Array = new Array<string>(mcol.length);\n for (let i = 0; i < mcol.length; i++) {\n const sequenceMonomers = splitter(mcol.get(i)!).filter((it) => it !== '');\n const molV3000 = molV3000FromNonHelmSequence(sequenceMonomers, monomersDict, pattern);\n molV3000Array[i] = molV3000;\n }\n }\n return DG.Column.fromStrings('monomericMols', molV3000Array);\n}\n\nfunction molV3000FromNonHelmSequence(\n monomers: Array<string>, monomersDict: Map<string, string>, pattern: boolean = false) {\n let molV3000 = `\n Datagrok macromolecule handler\n\n 0 0 0 0 0 0 999 V3000\nM V30 BEGIN CTAB\n`;\n\n molV3000 += `M V30 COUNTS ${monomers.length} ${monomers.length ? monomers.length - 1 : 0} 0 0 0\\n`;\n molV3000 += 'M V30 BEGIN ATOM\\n';\n\n for (let atomRowI = 0; atomRowI < monomers.length; atomRowI++) {\n molV3000 += pattern ?\n `M V30 ${atomRowI + 1} R${monomersDict.get(monomers[atomRowI])} 0.000 0.000 0 0\\n` :\n `M V30 ${atomRowI + 1} At 0.000 0.000 0 0 MASS=${monomersDict.get(monomers[atomRowI])}\\n`;\n }\n\n molV3000 += 'M V30 END ATOM\\n';\n molV3000 += 'M V30 BEGIN BOND\\n';\n\n for (let bondRowI = 0; bondRowI < monomers.length - 1; bondRowI++)\n molV3000 += `M V30 ${bondRowI + 1} 1 ${bondRowI + 1} ${bondRowI + 2}\\n`;\n\n molV3000 += 'M V30 END BOND\\n';\n molV3000 += 'M V30 END CTAB\\n';\n molV3000 += 'M END';\n return molV3000;\n}\n\nfunction changeV2000ToV3000(mols: DG.Column, dict: Map<string, string>, pattern: boolean = false): Array<string> {\n const molsArray = new Array<string>(mols.length);\n for (let i = 0; i < mols.length; i++) {\n let curPos = 0;\n let endPos = 0;\n let molV3000 = `\n Datagrok macromolecule handler\n\n 0 0 0 0 0 0 999 V3000\nM V30 BEGIN CTAB\n`;\n\n const mol = mols.get(i);\n curPos = mol.indexOf('\\n', curPos) + 1;\n curPos = mol.indexOf('\\n', curPos) + 1;\n curPos = mol.indexOf('\\n', curPos) + 1;\n\n const atomMonomerCounts = parseInt(mol.substring(curPos, curPos + 3));\n const bondMonomerCounts = parseInt(mol.substring(curPos + 3, curPos + 6));\n\n molV3000 += `M V30 COUNTS ${atomMonomerCounts} ${bondMonomerCounts} 0 0 0\\n`;\n molV3000 += 'M V30 BEGIN ATOM\\n';\n\n for (let atomRowI = 0; atomRowI < atomMonomerCounts; atomRowI++) {\n curPos = mol.indexOf('\\n', curPos) + 1 + V2000_ATOM_NAME_POS;\n endPos = mol.indexOf(' ', curPos);\n const monomerName: string = mol.substring(curPos, endPos);\n molV3000 += pattern ?\n `M V30 ${atomRowI + 1} R${dict.get(monomerName)} 0.000 0.000 0 0\\n` :\n `M V30 ${atomRowI + 1} At 0.000 0.000 0 0 MASS=${dict.get(monomerName)}\\n`;\n }\n\n molV3000 += 'M V30 END ATOM\\n';\n molV3000 += 'M V30 BEGIN BOND\\n';\n\n for (let bondRowI = 0; bondRowI < bondMonomerCounts; bondRowI++) {\n curPos = mol.indexOf('\\n', curPos) + 1;\n const firstMonomer = parseInt(mol.substring(curPos, curPos + 3).trim());\n const secondMonomer = parseInt(mol.substring(curPos + 3, curPos + 6).trim());\n const order = parseInt(mol.substring(curPos + 6, curPos + 9).trim());\n\n molV3000 += `M V30 ${bondRowI + 1} ${order} ${firstMonomer} ${secondMonomer}\\n`;\n }\n\n molV3000 += 'M V30 END BOND\\n';\n molV3000 += 'M V30 END CTAB\\n';\n molV3000 += 'M END';\n molsArray[i] = molV3000;\n }\n\n return molsArray;\n}\n","import { monomerToShort } from './macromolecule';\nconst undefinedColor = 'rgb(100,100,100)';\nconst grayColor = '#808080';\nconst blackColor = 'rgb(0,0,0)';\nconst monomerToShortFunction = monomerToShort;\nexport var DrawStyle;\n(function (DrawStyle) {\n DrawStyle[\"MSA\"] = \"MSA\";\n DrawStyle[\"classic\"] = \"classic\";\n})(DrawStyle || (DrawStyle = {}));\n/**\n * A function that prints a string aligned to left or centered.\n *\n * @param {number} x x coordinate.\n * @param {number} y y coordinate.\n * @param {number} w Width.\n * @param {number} h Height.\n * @param {CanvasRenderingContext2D} g Canvas rendering context.\n * @param {string} s String to print.\n * @param {string} [color=undefinedColor] String color.\n * @param {number} [pivot=0] Pirvot.\n * @param {boolean} [left=false] Is left aligned.\n * @param {number} [transparencyRate=0.0] Transparency rate where 1.0 is fully transparent\n * @param {string} [separator=''] Is separator for sequence.\n * @param {boolean} [last=false] Is checker if element last or not.\n * @param drawStyle Is draw style. MSA - for multicharSeq, classic - for other seq.\n * @param maxWord Is array of max words for each line.\n * @param wordIdx Is index of word we currently draw.\n * @param gridCell Is grid cell.\n * @param referenceSequence Is reference sequence for diff mode.\n * @param maxLengthOfMonomer Is max length of monomer.\n * @return {number} x coordinate to start printing at.\n */\nexport const printLeftOrCentered = (x, y, w, h, g, s, color = undefinedColor, pivot = 0, left = false, transparencyRate = 1.0, separator = '', last = false, drawStyle = DrawStyle.classic, maxWord = {}, wordIdx = 0, gridCell = null, referenceSequence = [], maxLengthOfMonomer = null) => {\n var _a, _b, _c;\n g.textAlign = 'start';\n let colorPart = s.substring(0);\n let grayPart = last ? '' : separator;\n if (drawStyle === DrawStyle.MSA) {\n grayPart = '';\n }\n let colorCode = true;\n let compareWithCurrent = true;\n let highlightDifference = 'difference';\n if ((gridCell != null) && (gridCell.cell.column != null)) {\n colorCode = (_a = gridCell.cell.column.temp['color-code']) !== null && _a !== void 0 ? _a : true;\n compareWithCurrent = (_b = gridCell.cell.column.temp['compare-with-current']) !== null && _b !== void 0 ? _b : true;\n highlightDifference = (_c = gridCell.cell.column.temp['highlight-difference']) !== null && _c !== void 0 ? _c : 'difference';\n }\n const currentMonomer = referenceSequence[wordIdx];\n if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'difference')) {\n transparencyRate = (colorPart == currentMonomer) ? 0.3 : transparencyRate;\n }\n if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'equal')) {\n transparencyRate = (colorPart != currentMonomer) ? 0.3 : transparencyRate;\n }\n if (maxLengthOfMonomer != null) {\n colorPart = monomerToShortFunction(colorPart, maxLengthOfMonomer);\n }\n let textSize = g.measureText(colorPart + grayPart);\n const indent = 5;\n let maxColorTextSize = g.measureText(colorPart).width;\n let colorTextSize = g.measureText(colorPart).width;\n const dy = h / 2 - (textSize.fontBoundingBoxAscent + textSize.fontBoundingBoxDescent) / 2 + 1;\n textSize = textSize.width;\n if (drawStyle === DrawStyle.MSA) {\n maxColorTextSize = maxWord[wordIdx];\n textSize = maxWord[wordIdx];\n }\n function draw(dx1, dx2) {\n const drawColor = colorCode ? color : blackColor;\n g.fillStyle = drawColor;\n g.globalAlpha = transparencyRate;\n if (drawStyle === DrawStyle.classic) {\n g.fillText(colorPart, x + dx1, y + dy);\n g.fillStyle = grayColor;\n g.fillText(grayPart, x + dx2, y + dy);\n }\n if (drawStyle === DrawStyle.MSA) {\n g.fillStyle = drawColor;\n g.fillText(colorPart, x + dx1 + ((maxWord[wordIdx] - colorTextSize) / 2), y + dy);\n }\n }\n if (left || textSize > w) {\n draw(indent, indent + maxColorTextSize);\n return x + maxColorTextSize + g.measureText(grayPart).width;\n }\n else {\n const dx = (w - textSize) / 2;\n draw(dx, dx + maxColorTextSize);\n return x + dx + maxColorTextSize;\n }\n};\n//# sourceMappingURL=cell-renderer.js.map","import * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\n\nimport {printLeftOrCentered, DrawStyle} from '@datagrok-libraries/bio/src/utils/cell-renderer';\nimport * as C from './constants';\nimport {\n ALIGNMENT,\n getPaletteByType,\n getSplitter,\n monomerToShort,\n NOTATION,\n SplitterFunc,\n TAGS as bioTAGS,\n} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {SeqPalette} from '@datagrok-libraries/bio/src/seq-palettes';\nimport {UnknownSeqPalettes} from '@datagrok-libraries/bio/src/unknown';\n\nconst enum tempTAGS {\n referenceSequence = 'reference-sequence',\n currentWord = 'current-word',\n monomerWidth = 'monomer-width',\n bioSumMaxLengthWords = 'bio-sum-maxLengthWords',\n bioMaxIndex = 'bio-maxIndex',\n bioMaxLengthWords = 'bio-maxLengthWords',\n}\n\ntype TempType = { [tagName: string]: any };\n\nconst undefinedColor = 'rgb(100,100,100)';\nconst monomerToShortFunction: (amino: string, maxLengthOfMonomer: number) => string = monomerToShort;\n\nfunction getUpdatedWidth(grid: DG.Grid | null, g: CanvasRenderingContext2D, x: number, w: number): number {\n return grid ? Math.min(grid.canvas.width - x, w) : g.canvas.width - x;\n}\n\nexport function processSequence(subParts: string[]): [string[], boolean] {\n const simplified = !subParts.some((amino, index) =>\n amino.length > 1 &&\n index != 0 &&\n index != subParts.length - 1);\n\n const text: string[] = [];\n const gap = simplified ? '' : ' ';\n subParts.forEach((amino: string, index) => {\n if (index < subParts.length)\n amino += `${amino ? '' : '-'}${gap}`;\n\n text.push(amino);\n });\n return [text, simplified];\n}\n\n\nexport class MacromoleculeSequenceCellRenderer extends DG.GridCellRenderer {\n get name(): string { return 'sequence'; }\n\n get cellType(): string { return 'sequence'; }\n\n get defaultHeight(): number { return 30; }\n\n get defaultWidth(): number { return 230; }\n\n onClick(gridCell: DG.GridCell, e: MouseEvent): void {\n const colTemp: TempType = gridCell.cell.column.temp;\n colTemp[tempTAGS.currentWord] = gridCell.cell.value;\n gridCell.grid.invalidate();\n }\n\n onMouseMove(gridCell: DG.GridCell, e: MouseEvent): void {\n if (gridCell.cell.column.getTag(bioTAGS.aligned) !== ALIGNMENT.SEQ_MSA)\n return;\n\n const colTemp: TempType = gridCell.cell.column.temp;\n const maxLengthWordsSum = colTemp[tempTAGS.bioSumMaxLengthWords];\n const maxIndex = colTemp[tempTAGS.bioMaxIndex];\n const argsX = e.offsetX - gridCell.gridColumn.left + (gridCell.gridColumn.left - gridCell.bounds.x);\n let left = 0;\n let right = maxIndex;\n let found = false;\n maxLengthWordsSum[maxIndex + 1] = argsX + 1;\n let mid = 0;\n if (argsX > maxLengthWordsSum[0]) {\n while (!found) {\n mid = Math.floor((right + left) / 2);\n if (argsX >= maxLengthWordsSum[mid] && argsX <= maxLengthWordsSum[mid + 1]) {\n left = mid;\n found = true;\n } else if (argsX < maxLengthWordsSum[mid]) {\n right = mid - 1;\n } else if (argsX > maxLengthWordsSum[mid + 1]) {\n left = mid + 1;\n }\n if (left == right)\n found = true;\n }\n }\n left = (argsX >= maxLengthWordsSum[left]) ? left + 1 : left;\n const separator = gridCell.cell.column.getTag('separator') ?? '';\n const splitterFunc: SplitterFunc = getSplitter('separator', separator);\n const subParts: string[] = splitterFunc(gridCell.cell.value);\n (((subParts[left]?.length ?? 0) > 0)) ?\n ui.tooltip.show(ui.div(subParts[left]), e.x + 16, e.y + 16) : ui.tooltip.hide();\n }\n\n /**\n * Cell renderer function.\n *\n * @param {CanvasRenderingContext2D} g Canvas rendering context.\n * @param {number} x x coordinate on the canvas.\n * @param {number} y y coordinate on the canvas.\n * @param {number} w width of the cell.\n * @param {number} h height of the cell.\n * @param {DG.GridCell} gridCell Grid cell.\n * @param {DG.GridCellStyle} cellStyle Cell style.\n * @memberof AlignedSequenceCellRenderer\n */\n render(\n g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, gridCell: DG.GridCell,\n cellStyle: DG.GridCellStyle\n ) {\n const grid = gridCell.gridRow !== -1 ? gridCell.grid : null;\n const cell = gridCell.cell;\n const paletteType = gridCell.cell.column.getTag(bioTAGS.alphabet);\n const minDistanceRenderer = 50;\n w = getUpdatedWidth(grid, g, x, w);\n g.save();\n g.beginPath();\n g.rect(x, y, w, h);\n g.clip();\n g.font = '12px monospace';\n g.textBaseline = 'top';\n\n //TODO: can this be replaced/merged with splitSequence?\n const units = gridCell.cell.column.getTag(DG.TAGS.UNITS);\n const aligned: string = gridCell.cell.column.getTag(bioTAGS.aligned);\n\n const palette = getPaletteByType(paletteType);\n\n const separator = gridCell.cell.column.getTag(bioTAGS.separator) ?? '';\n const splitLimit = w / 5;\n const splitterFunc: SplitterFunc = getSplitter(units, separator, splitLimit);\n\n // TODO: Store temp data to GridColumn\n // Now the renderer requires data frame table Column underlying GridColumn\n const colTemp: TempType = gridCell.cell.column.temp;\n\n const tempReferenceSequence: string | null = colTemp[tempTAGS.referenceSequence];\n const tempCurrentWord: string | null = colTemp[tempTAGS.currentWord];\n const tempMonomerWidth: string | null = colTemp[tempTAGS.monomerWidth];\n const referenceSequence: string[] = splitterFunc(\n ((tempReferenceSequence != null) && (tempReferenceSequence != '')) ?\n tempReferenceSequence : tempCurrentWord ?? '');\n const monomerWidth: string = (tempMonomerWidth != null) ? tempMonomerWidth : 'short';\n\n let gapRenderer = 5;\n let maxIndex = 0;\n let maxLengthOfMonomer = 8;\n\n if (monomerWidth === 'short') {\n gapRenderer = 12;\n maxLengthOfMonomer = 1;\n }\n\n let maxLengthWords: any = {};\n if (gridCell.cell.column.getTag('.calculatedCellRender') !== splitLimit.toString()) {\n let samples = 0;\n while (samples < Math.min(gridCell.cell.column.length, 100)) {\n const column = gridCell.cell.column.get(samples);\n const subParts: string[] = splitterFunc(column);\n subParts.forEach((amino, index) => {\n const textSize = monomerToShortFunction(amino, maxLengthOfMonomer).length * 7 + gapRenderer;\n if (textSize > (maxLengthWords[index] ?? 0))\n maxLengthWords[index] = textSize;\n if (index > maxIndex) maxIndex = index;\n });\n samples += 1;\n }\n const minLength = 3 * 7;\n for (let i = 0; i <= maxIndex; i++) {\n if (maxLengthWords[i] < minLength) maxLengthWords[i] = minLength;\n const maxLengthWordSum: any = {};\n maxLengthWordSum[0] = maxLengthWords[0];\n for (let i = 1; i <= maxIndex; i++) maxLengthWordSum[i] = maxLengthWordSum[i - 1] + maxLengthWords[i];\n colTemp[tempTAGS.bioSumMaxLengthWords] = maxLengthWordSum;\n colTemp[tempTAGS.bioMaxIndex] = maxIndex;\n colTemp[tempTAGS.bioMaxLengthWords] = maxLengthWords;\n gridCell.cell.column.setTag('.calculatedCellRender', splitLimit.toString());\n }\n } else {\n maxLengthWords = colTemp[tempTAGS.bioMaxLengthWords];\n }\n\n const subParts: string[] = splitterFunc(cell.value);\n let x1 = x;\n let color = undefinedColor;\n let drawStyle = DrawStyle.classic;\n\n\n if (aligned && aligned.includes('MSA') && units == NOTATION.SEPARATOR)\n drawStyle = DrawStyle.MSA;\n\n subParts.every((amino, index) => {\n color = palette.get(amino);\n g.fillStyle = undefinedColor;\n const last = index === subParts.length - 1;\n x1 = printLeftOrCentered(x1, y, w, h,\n g, amino, color, 0, true, 1.0, separator, last, drawStyle,\n maxLengthWords, index, gridCell, referenceSequence, maxLengthOfMonomer);\n return minDistanceRenderer <= w;\n });\n\n g.restore();\n return;\n }\n}\n\nexport class MonomerCellRenderer extends DG.GridCellRenderer {\n get name(): string { return C.SEM_TYPES.MONOMER; }\n\n get cellType(): string { return C.SEM_TYPES.MONOMER; }\n\n get defaultHeight(): number { return 15; }\n\n get defaultWidth(): number { return 30; }\n\n /**\n * Cell renderer function.\n *\n * @param {CanvasRenderingContext2D} g Canvas rendering context.\n * @param {number} x x coordinate on the canvas.\n * @param {number} y y coordinate on the canvas.\n * @param {number} w width of the cell.\n * @param {number} h height of the cell.\n * @param {DG.GridCell} gridCell Grid cell.\n * @param {DG.GridCellStyle} _cellStyle Cell style.\n */\n render(\n g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, gridCell: DG.GridCell,\n _cellStyle: DG.GridCellStyle): void {\n g.font = `12px monospace`;\n g.textBaseline = 'middle';\n g.textAlign = 'center';\n\n const palette = getPaletteByType(gridCell.cell.column.getTag(bioTAGS.alphabet));\n const s: string = gridCell.cell.value;\n if (!s)\n return;\n const color = palette.get(s);\n\n g.fillStyle = color;\n g.fillText(monomerToShort(s, 3), x + (w / 2), y + (h / 2), w);\n }\n}\n\nexport class MacromoleculeDifferenceCellRenderer extends DG.GridCellRenderer {\n get name(): string { return 'MacromoleculeDifferenceCR'; }\n\n get cellType(): string { return C.SEM_TYPES.MACROMOLECULE_DIFFERENCE; }\n\n get defaultHeight(): number { return 30; }\n\n get defaultWidth(): number { return 230; }\n\n /**\n * Cell renderer function.\n *\n * @param {CanvasRenderingContext2D} g Canvas rendering context.\n * @param {number} x x coordinate on the canvas.\n * @param {number} y y coordinate on the canvas.\n * @param {number} w width of the cell.\n * @param {number} h height of the cell.\n * @param {DG.GridCell} gridCell Grid cell.\n * @param {DG.GridCellStyle} _cellStyle Cell style.\n * @memberof AlignedSequenceDifferenceCellRenderer\n */\n render(\n g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, gridCell: DG.GridCell,\n _cellStyle: DG.GridCellStyle): void {\n const grid = gridCell.grid;\n const cell = gridCell.cell;\n const s: string = cell.value ?? '';\n const separator = gridCell.tableColumn!.tags[bioTAGS.separator];\n const units: string = gridCell.tableColumn!.tags[DG.TAGS.UNITS];\n w = getUpdatedWidth(grid, g, x, w);\n //TODO: can this be replaced/merged with splitSequence?\n const [s1, s2] = s.split('#');\n const splitter = getSplitter(units, separator);\n const subParts1 = splitter(s1);\n const subParts2 = splitter(s2);\n drawMoleculeDifferenceOnCanvas(g, x, y, w, h, subParts1, subParts2, units);\n }\n}\n\nexport function drawMoleculeDifferenceOnCanvas(\n g: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n subParts1: string [],\n subParts2: string [],\n units: string,\n fullStringLength?: boolean,\n molDifferences?: { [key: number]: HTMLCanvasElement }\n): void {\n if (subParts1.length !== subParts2.length) {\n const sequences: IComparedSequences = fillShorterSequence(subParts1, subParts2);\n subParts1 = sequences.subParts1;\n subParts2 = sequences.subParts2;\n }\n const textSize1 = g.measureText(processSequence(subParts1).join(''));\n const textSize2 = g.measureText(processSequence(subParts2).join(''));\n const textWidth = Math.max(textSize1.width, textSize2.width);\n if (fullStringLength) {\n w = textWidth + subParts1.length * 4;\n g.canvas.width = textWidth + subParts1.length * 4;\n }\n let updatedX = Math.max(x, x + (w - (textWidth + subParts1.length * 4)) / 2);\n // 28 is the height of the two substitutions on top of each other + space\n const updatedY = Math.max(y, y + (h - 28) / 2);\n\n g.save();\n g.beginPath();\n g.rect(x, y, fullStringLength ? textWidth + subParts1.length * 4 : w, h);\n g.clip();\n g.font = '12px monospace';\n g.textBaseline = 'top';\n\n let palette: SeqPalette = UnknownSeqPalettes.Color;\n if (units != 'HELM')\n palette = getPaletteByType(units.substring(units.length - 2));\n\n const vShift = 7;\n for (let i = 0; i < subParts1.length; i++) {\n const amino1 = subParts1[i];\n const amino2 = subParts2[i];\n const color1 = palette.get(amino1);\n\n if (amino1 != amino2) {\n const color2 = palette.get(amino2);\n const subX0 = printLeftOrCentered(updatedX, updatedY - vShift, w, h, g, amino1, color1, 0, true);\n const subX1 = printLeftOrCentered(updatedX, updatedY + vShift, w, h, g, amino2, color2, 0, true);\n updatedX = Math.max(subX1, subX0);\n if (molDifferences)\n molDifferences[i] = createDifferenceCanvas(amino1, amino2, color1, color2, updatedY, vShift, h);\n } else { updatedX = printLeftOrCentered(updatedX, updatedY, w, h, g, amino1, color1, 0, true, 0.5); }\n updatedX += 4;\n }\n g.restore();\n}\n\ninterface IComparedSequences{\n subParts1: string[];\n subParts2: string[];\n}\n\nfunction createDifferenceCanvas(\n amino1: string,\n amino2: string,\n color1: string,\n color2: string,\n y: number,\n shift: number,\n h: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d')!;\n context.font = '12px monospace';\n const width1 = context.measureText(processSequence([amino1]).join('')).width;\n const width2 = context.measureText(processSequence([amino2]).join('')).width;\n const width = Math.max(width1, width2);\n canvas.height = h;\n canvas.width = width + 4;\n context.font = '12px monospace';\n context.textBaseline = 'top';\n printLeftOrCentered(0, y - shift, width, h, context, amino1, color1, 0, true);\n printLeftOrCentered(0, y + shift, width, h, context, amino2, color2, 0, true);\n return canvas;\n}\n\nfunction fillShorterSequence(subParts1: string[], subParts2: string[]): IComparedSequences {\n let numIdenticalStart = 0;\n let numIdenticalEnd = 0;\n const longerSeq = subParts1.length > subParts2.length ? subParts1 : subParts2;\n let shorterSeq = subParts1.length > subParts2.length ? subParts2 : subParts1;\n\n for (let i = 0; i < shorterSeq.length; i++) {\n if (longerSeq[i] === shorterSeq[i])\n numIdenticalStart++;\n }\n\n const lengthDiff = longerSeq.length - shorterSeq.length;\n for (let i = longerSeq.length - 1; i > lengthDiff; i--) {\n if (longerSeq[i] === shorterSeq[i - lengthDiff])\n numIdenticalEnd++;\n }\n\n const emptyMonomersArray = new Array<string>(Math.abs(subParts1.length - subParts2.length)).fill('');\n\n function concatWithEmptyVals(subparts: string[]): string[] {\n return numIdenticalStart > numIdenticalEnd ? subparts.concat(emptyMonomersArray) : emptyMonomersArray.concat(subparts);\n }\n\n subParts1.length > subParts2.length ? subParts2 = concatWithEmptyVals(subParts2) : subParts1 = concatWithEmptyVals(subParts1);\n return {subParts1: subParts1, subParts2: subParts2};\n}\n","import { PositionHeight } from './web-logo';\n// Data structures for V-Domain regions of antibodies\nexport var VdRegionType;\n(function (VdRegionType) {\n VdRegionType[\"Unknown\"] = \"unknown\";\n VdRegionType[\"FR\"] = \"framework\";\n VdRegionType[\"CDR\"] = \"cdr\";\n})(VdRegionType || (VdRegionType = {}));\nexport class VdRegionsPropsDefault {\n constructor() {\n this.regionTypes = [VdRegionType.CDR];\n this.chains = ['Heavy', 'Light'];\n //sequenceColumnNamePostfix: string = 'chain sequence';\n this.skipEmptyPositions = false;\n this.positionWidth = 16;\n this.positionHeight = PositionHeight.Entropy;\n }\n}\n//# sourceMappingURL=vd-regions.js.map","import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport * as rxjs from 'rxjs';\nimport {FilterSources, WebLogoViewer, PROPS as wlPROPS} from '../viewers/web-logo-viewer';\nimport {\n VdRegionsPropsDefault, VdRegionsProps, IVdRegionsViewer,\n VdRegion, VdRegionType\n} from '@datagrok-libraries/bio/src/viewers/vd-regions';\nimport {PositionHeight} from '@datagrok-libraries/bio/src/viewers/web-logo';\nimport {Unsubscribable} from 'rxjs';\n\nconst vrt = VdRegionType;\n\n// Positions of regions for numbering schemes\n// http://www.bioinf.org.uk/abs/info.html\n\n// const imgtRegions: VdRegion[] = [\n// new VdRegion(vrt.FR, 'FR1', 'Light', 1, '1', '26'),\n// new VdRegion(vrt.FR, 'FR1', 'Heavy', 1, '1', '26'),\n//\n// new VdRegion(vrt.CDR, 'CDR1', 'Light', 2, '27', '38'), // 27-32\n// new VdRegion(vrt.CDR, 'CDR1', 'Heavy', 2, '27', '38'), // 27-32\n//\n// new VdRegion(vrt.FR, 'FR2', 'Light', 3, '39', '55'),\n// new VdRegion(vrt.FR, 'FR2', 'Heavy', 3, '39', '55'),\n//\n// new VdRegion(vrt.CDR, 'CDR2', 'Light', 4, '56', '65'),\n// new VdRegion(vrt.CDR, 'CDR2', 'Heavy', 4, '56', '65'),\n//\n// new VdRegion(vrt.FR, 'FR3', 'Light', 5, '66', '104'),\n// new VdRegion(vrt.FR, 'FR3', 'Heavy', 5, '66', '104'),\n//\n// new VdRegion(vrt.CDR, 'CDR3', 'Light', 6, '105', '117'),\n// new VdRegion(vrt.CDR, 'CDR3', 'Heavy', 6, '105', '117'),\n//\n// new VdRegion(vrt.FR, 'FR4', 'Light', 7, '118', null/*127*/),\n// new VdRegion(vrt.FR, 'FR4', 'Heavy', 7, '118', null/*128*/),\n// ];\n\n/** Viewer with tabs based on description of chain regions.\n * Used to define regions of an immunoglobulin LC.\n */\nexport class VdRegionsViewer extends DG.JsViewer implements IVdRegionsViewer {\n private viewed: boolean = false;\n\n // private regionsDf: DG.DataFrame;\n private regionsFg: DG.FilterGroup | null = null;\n // private regionsTV: DG.TableView;\n private regionsRoot: HTMLElement | null = null;\n\n private isOpened: boolean = false;\n private panelNode: DG.DockNode | null = null;\n\n public regions: VdRegion[] = [];\n public regionTypes: VdRegionType[];\n public chains: string[];\n // public sequenceColumnNamePostfix: string;\n\n public skipEmptyPositions: boolean;\n public positionWidth: number;\n public positionHeight: PositionHeight;\n\n constructor() {\n super();\n\n // To prevent ambiguous numbering scheme in MLB\n this.regionTypes = this.stringList('regionTypes', [vrt.CDR],\n {choices: Object.values(vrt).filter((t) => t != vrt.Unknown)}) as VdRegionType[];\n this.chains = this.stringList('chains', ['Heavy', 'Light'],\n {choices: ['Heavy', 'Light']});\n // this.sequenceColumnNamePostfix = this.string('sequenceColumnNamePostfix', 'chain sequence');\n\n this.skipEmptyPositions = this.bool('skipEmptyPositions', false);\n this.positionWidth = this.float('positionWidth', 16);\n this.positionHeight = this.string('positionHeight', PositionHeight.Entropy,\n {choices: Object.keys(PositionHeight)}) as PositionHeight;\n }\n\n public async init() {\n //#region regionsDF with filter\n // this.regionsDf = DG.DataFrame.fromObjects(this.regions);\n // this.regionsDf.rows.filter((row) => row.name == 'CDR1');\n // // To available options /\n // this.regionsFg = (await this.regionsDf.plot.fromType(DG.VIEWER.FILTERS, {\n // // columnNames: ['name',],\n // showFilterCountsIndication: false,\n // showHeader: false,\n // showSearchBox: false,\n // filters: [\n // {type: DG.FILTER_TYPE.CATEGORICAL, column: 'type', label: 'Region name', showHistogram: false},\n // {type: DG.FILTER_TYPE.CATEGORICAL, column: 'name', label: 'Region type', showHistogram: false},\n // ],\n // title: 'Regions filter',\n // showTitle: true,\n // description: 'Filter for regions of multiple alignment by IMGT nomenclature',\n // someProperty: 'Hello',\n // })) as DG.FilterGroup;\n\n //#endregion regionsDF with filter\n\n // this.mlbView.dockManager.dock(this.regionsFg.root, DG.DOCK_TYPE.LEFT, rootNode, 'Filter regions', 0.2);\n\n this.subs.push(ui.onSizeChanged(this.root).subscribe(this.rootOnSizeChanged.bind(this)));\n this.subs.push(rxjs.fromEvent<MouseEvent>(this.root, 'mousemove').subscribe(this.rootOnMouseMove.bind(this)));\n\n // await this.buildView('init'); // init\n }\n\n public override async onTableAttached() {\n const superOnTableAttached = super.onTableAttached.bind(this);\n this.viewPromise = this.viewPromise.then(async () => { // onTableAttached\n superOnTableAttached();\n if (!this.viewed) {\n await this.buildView('onTableAttached'); // onTableAttached\n this.viewed = true;\n }\n });\n }\n\n public override onPropertyChanged(property: DG.Property | null): void {\n super.onPropertyChanged(property);\n\n if (!property) {\n console.warn('Bio: VdRegionsViewer.onPropertyChanged() property is null');\n return;\n }\n\n if (property) {\n switch (property.name) {\n case 'regionTypes':\n break;\n case 'chains':\n break;\n case 'sequenceColumnNamePostfix':\n break;\n // for (let orderI = 0; orderI < this.logos.length; orderI++) {\n // for (let chainI = 0; chainI < this.chains.length; chainI++) {\n // const chain: string = this.chains[chainI];\n // this.logos[orderI][chain].setOptions({skipEmptyPositions: this.skipEmptyPositions});\n // }\n // }\n // this.calcSize();\n }\n }\n\n switch (property.name) {\n case 'skipEmptyPositions':\n case 'positionWidth':\n case 'positionHeight':\n this.setData(this.dataFrame, this.regions); // onPropertyChanged\n break;\n }\n }\n\n // -- Data --\n\n // TODO: .onTableAttached is not calling on dataFrame set, onPropertyChanged also not calling\n public setData(mlbDf: DG.DataFrame, regions: VdRegion[]) {\n console.debug('Bio: VdRegionsViewer.setData()');\n this.viewPromise = this.viewPromise.then(async () => { // setData\n if (this.viewed) {\n await this.destroyView('setData'); // setData\n this.viewed = false;\n }\n });\n\n this.regions = regions;\n this.dataFrame = mlbDf; // causes detach and onTableAttached\n\n this.viewPromise = this.viewPromise.then(async () => { // setData\n if (!this.viewed) {\n await this.buildView('setData'); // setData\n this.viewed = true;\n }\n });\n }\n\n override detach() {\n const superDetach = super.detach.bind(this);\n this.viewPromise = this.viewPromise.then(async () => { // detach\n if (this.viewed) {\n await this.destroyView('detach'); // detach\n this.viewed = false;\n }\n superDetach();\n });\n }\n\n // -- View --\n\n private viewPromise: Promise<void> = Promise.resolve();\n\n private host: HTMLElement | null = null;\n private filterSourceInput: DG.InputBase<boolean | null> | null = null;\n private mainLayout: HTMLTableElement | null = null;\n private logos: { [chain: string]: WebLogoViewer }[] = [];\n\n private viewSubs: Unsubscribable[] = [];\n\n private async destroyView(purpose: string): Promise<void> {\n // TODO: Unsubscribe from and remove all view elements\n console.debug(`Bio: VdRegionsViewer.destroyView( mainLayout = ${!this.mainLayout ? 'none' : 'value'} ), ` +\n `purpose = '${purpose}'`);\n if (this.filterSourceInput) {\n //\n ui.empty(this.filterSourceInput.root);\n }\n\n if (this.mainLayout != null) {\n // this.root.removeChild(this.host);\n this.mainLayout.remove();\n this.host!.remove();\n this.host = null;\n this.mainLayout = null;\n }\n\n for (const sub of this.viewSubs) sub.unsubscribe();\n }\n\n private async buildView(purpose: string): Promise<void> {\n console.debug(`Bio: VdRegionsViewer.buildView() begin, ` + `purpose = '${purpose}'`);\n\n const regionsFiltered: VdRegion[] = this.regions.filter((r: VdRegion) => this.regionTypes.includes(r.type));\n const orderList: number[] = Array.from(new Set(regionsFiltered.map((r) => r.order))).sort();\n\n this.logos = [];\n for (let orderI = 0; orderI < orderList.length; orderI++) {\n const regionChains: { [chain: string]: WebLogoViewer } = {};\n for (const chain of this.chains) {\n const region: VdRegion | undefined = regionsFiltered\n .find((r) => r.order == orderList[orderI] && r.chain == chain);\n regionChains[chain] = (await this.dataFrame.plot.fromType('WebLogo', {\n sequenceColumnName: region!.sequenceColumnName,\n startPositionName: region!.positionStartName,\n endPositionName: region!.positionEndName,\n fixWidth: true,\n skipEmptyPositions: this.skipEmptyPositions,\n positionWidth: this.positionWidth,\n positionHeight: this.positionHeight,\n })) as unknown as WebLogoViewer;\n }\n // WebLogo creation fires onRootSizeChanged event even before control being added to this.logos\n this.logos[orderI] = regionChains;\n }\n\n // ui.tableFromMap()\n // DG.HtmlTable.create()\n this.mainLayout = ui.table(\n this.chains,\n (chain) => {\n const elements = [\n // This is chain label\n ...(orderList.length > 0 ? [ui.div(chain, {\n style: {\n transform: 'rotate(-90deg)',\n font: '12px Roboto, Roboto Local, sans-serif',\n textAlign: 'center',\n width: '16px',\n marginTop: '24px',\n marginLeft: '6px',\n }\n })] : []),\n // List with controls for regions\n ...[...Array(orderList.length).keys()].map((orderI) => {\n const wl: WebLogoViewer = this.logos[orderI][chain];\n wl.root.style.height = '100%';\n\n const resDiv = ui.div([wl.root]/*`${chain} ${regionsFiltered[rI]}`*/, {\n style: {\n // height: '100%',\n marginTop: '4px',\n marginBottom: '4px',\n }\n });\n\n return resDiv;\n })];\n return elements;\n },\n ['', ...[...Array(orderList.length).keys()].map(\n (orderI: number) => regionsFiltered.find(\n (r: VdRegion) => r.order == orderList[orderI] && r.chain == this.chains[0]\n )!.name || 'Name')]\n );\n this.mainLayout.className = 'mlb-vd-regions-viewer-table2';\n // this.mainLayout.style.background = '#EEEEFF';\n // this.mainLayout.style.height = '100%';\n // this.mainLayout.style.border = '1px solid black';\n\n this.filterSourceInput = ui.boolInput('', false, this.filterSourceInputOnValueChanged.bind(this));\n this.filterSourceInput.root.style.position = 'absolute';\n this.filterSourceInput.root.style.left = '10px';\n this.filterSourceInput.root.style.top = '-3px';\n ui.tooltip.bind(this.filterSourceInput.root, 'Check to filter sequences for selected VRs');\n\n const color: string = `#ffbb${Math.ceil(Math.random() * 255).toString(16)}`;\n this.host = ui.div([this.mainLayout, this.filterSourceInput!.root],\n {/*style: {backgroundColor: color}*/});\n this.root.appendChild(this.host);\n this.root.style.overflowX = 'auto';\n\n this.calcSize();\n\n console.debug('Bio: VdRegionsViewer.buildView() end');\n }\n\n private calcSize() {\n const logoHeight = (this.root.clientHeight - 54) / this.chains.length;\n\n const maxHeight: number = Math.min(logoHeight,\n Math.max(...this.logos.map((wlDict) =>\n Math.max(...Object.values(wlDict).map((wl) => wl.maxHeight))))\n );\n\n for (let orderI = 0; orderI < this.logos.length; orderI++) {\n for (let chainI = 0; chainI < this.chains.length; chainI++) {\n const chain: string = this.chains[chainI];\n this.logos[orderI][chain].root.style.height = `${maxHeight}px`;\n }\n }\n }\n\n // -- Handle events --\n\n private rootOnSizeChanged(args: any): void {\n this.calcSize();\n }\n\n private rootOnMouseMove(e: MouseEvent) {\n // ui.tooltip.show('text', e.x + 8, e.y + 8,);\n // console.log(`onMouseMoveRoot.( x: ${e.x}, y: ${e.y} )`);\n }\n\n private filterSourceInputOnValueChanged(): void {\n const filterSource: FilterSources = this.filterSourceInput!.value == true ?\n FilterSources.Selected : FilterSources.Filtered;\n\n for (let orderI = 0; orderI < this.logos.length; orderI++) {\n for (let chainI = 0; chainI < this.chains.length; chainI++) {\n const chain: string = this.chains[chainI];\n const wl: DG.JsViewer = this.logos[orderI][chain];\n wl.setOptions({[wlPROPS.filterSource]: filterSource});\n }\n }\n }\n}\n","import * as DG from 'datagrok-api/dg';\nimport {AvailableMetrics} from '@datagrok-libraries/ml/src/typed-metrics';\nimport {reduceDimensinalityWithNormalization} from '@datagrok-libraries/ml/src/sequence-space';\nimport {BitArrayMetrics, StringMetrics} from '@datagrok-libraries/ml/src/typed-metrics';\nimport {Matrix} from '@datagrok-libraries/utils/src/type-declarations';\nimport BitArray from '@datagrok-libraries/utils/src/bit-array';\nimport {ISequenceSpaceParams} from '@datagrok-libraries/ml/src/viewers/activity-cliffs';\nimport {invalidateMols, MONOMERIC_COL_TAGS} from '../substructure-search/substructure-search';\nimport * as grok from 'datagrok-api/grok';\n\nexport interface ISequenceSpaceResult {\n distance: Matrix;\n coordinates: DG.ColumnList;\n}\n\nexport async function sequenceSpace(spaceParams: ISequenceSpaceParams): Promise<ISequenceSpaceResult> {\n // code deprecated since seqCol is encoded\n /* let preparedData: any;\n if (!(spaceParams.seqCol!.tags[DG.TAGS.UNITS] === 'HELM')) {\n const sep = spaceParams.seqCol.getTag(UnitsHandler.TAGS.separator);\n const sepFinal = sep ? sep === '.' ? '\\\\\\.' : sep : '-';\n const regex = new RegExp(sepFinal, 'g');\n if (Object.keys(AvailableMetrics['String']).includes(spaceParams.similarityMetric))\n preparedData = spaceParams.seqCol.toList().map((v: string) => v.replace(regex, '')) as string[];\n else\n preparedData = spaceParams.seqCol.toList().map((v: string) => v.replace(regex, '')) as string[];\n } else {\n preparedData = spaceParams.seqCol.toList();\n } */\n\n const sequenceSpaceResult = await reduceDimensinalityWithNormalization(\n spaceParams.seqCol.toList(),\n spaceParams.methodName,\n spaceParams.similarityMetric as StringMetrics | BitArrayMetrics,\n spaceParams.options);\n const cols: DG.Column[] = spaceParams.embedAxesNames.map(\n (name: string, index: number) => DG.Column.fromFloat32Array(name, sequenceSpaceResult.embedding[index]));\n return {distance: sequenceSpaceResult.distance, coordinates: new DG.ColumnList(cols)};\n}\n\nexport async function sequenceSpaceByFingerprints(spaceParams: ISequenceSpaceParams): Promise<ISequenceSpaceResult> {\n if (spaceParams.seqCol.version !== spaceParams.seqCol.temp[MONOMERIC_COL_TAGS.LAST_INVALIDATED_VERSION])\n await invalidateMols(spaceParams.seqCol, false);\n\n const result = await grok.functions.call('Chem:getChemSpaceEmbeddings', {\n col: spaceParams.seqCol.temp[MONOMERIC_COL_TAGS.MONOMERIC_MOLS],\n methodName: spaceParams.methodName,\n similarityMetric: spaceParams.similarityMetric,\n xAxis: spaceParams.embedAxesNames[0],\n yAxis: spaceParams.embedAxesNames[1],\n options: spaceParams.options\n });\n return result;\n}\n\n\nexport function getEmbeddingColsNames(df: DG.DataFrame) {\n const axes = ['Embed_X', 'Embed_Y'];\n const colNameInd = df.columns.names().filter((it: string) => it.includes(axes[0])).length + 1;\n return axes.map((it) => `${it}_${colNameInd}`);\n}\n","export const similarityMetric = {\n 'Tanimoto': tanimotoSimilarity,\n 'Dice': diceSimilarity,\n 'Asymmetric': asymmetricSimilarity,\n 'Braun-Blanquet': braunBlanquetSimilarity,\n 'Cosine': cosineSimilarity,\n 'Kulczynski': kulczynskiSimilarity,\n 'Mc-Connaughey': mcConnaugheySimilarity,\n 'Rogot-Goldberg': rogotGoldbergSimilarity,\n 'Russel': russelSimilarity,\n 'Sokal': sokalSimilarity,\n 'Hamming': hammingSimilarity,\n 'Euclidean': euclideanSimilarity,\n};\nexport const distanceMetrics = {\n 'Tanimoto': tanimotoDistance,\n 'Dice': diceDistance,\n 'Asymmetric': asymmetricDistance,\n 'Braun-Blanquet': braunBlanquetDistance,\n 'Cosine': cosineDistance,\n 'Kulczynski': kulczynskiDistance,\n 'Mc-Connaughey': mcConnaugheyDistance,\n 'Rogot-Goldberg': rogotGoldbergDistance,\n 'Russel': russelDistance,\n 'Sokal': sokalDistance,\n 'Hamming': hammingDistance,\n 'Euclidean': euclideanDistance,\n};\nexport const CHEM_SIMILARITY_METRICS = ['Tanimoto', 'Dice', 'Cosine', 'Hamming', 'Euclidean'];\nexport const SEQ_SPACE_SIMILARITY_METRICS = ['Tanimoto', 'Asymmetric', 'Cosine', 'Sokal'];\nexport function tanimotoSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n if (total == 0)\n return 1.0;\n const common = x.andWithCountBits(y, true);\n return common / (total - common);\n}\nexport function tanimotoDistance(x, y) {\n return getDistanceFromSimilarity(tanimotoSimilarity(x, y));\n}\nexport function diceSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n if (total == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return 2 * common / total;\n}\nexport function diceDistance(x, y) {\n return getDistanceFromSimilarity(diceSimilarity(x, y));\n}\nexport function cosineSimilarity(x, y) {\n const total = x.trueCount() * y.trueCount();\n if (total == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / Math.sqrt(total);\n}\nexport function cosineDistance(x, y) {\n return getDistanceFromSimilarity(cosineSimilarity(x, y));\n}\nexport function euclideanSimilarity(x, y) {\n return getSimilarityFromDistance(euclideanDistance(x, y));\n}\nexport function euclideanDistance(x, y) {\n return Math.sqrt(x.trueCount() + y.trueCount() - 2 * x.andWithCountBits(y, true));\n}\nexport function hammingSimilarity(x, y) {\n return getSimilarityFromDistance(hammingDistance(x, y));\n}\nexport function hammingDistance(x, y) {\n return x.trueCount() + y.trueCount() - 2 * x.andWithCountBits(y, true);\n}\nexport function sokalSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const common = x.andWithCountBits(y, true);\n return common / (2 * total - 3 * common);\n}\nexport function sokalDistance(x, y) {\n return getDistanceFromSimilarity(sokalSimilarity(x, y));\n}\nexport function kulczynskiSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const totalProd = x.trueCount() * y.trueCount();\n if (totalProd == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return (common * total) / (2 * totalProd);\n}\nexport function kulczynskiDistance(x, y) {\n return getDistanceFromSimilarity(kulczynskiSimilarity(x, y));\n}\nexport function mcConnaugheySimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const totalProd = x.trueCount() * y.trueCount();\n if (totalProd == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return (common * total - totalProd) / totalProd;\n}\nexport function mcConnaugheyDistance(x, y) {\n return getDistanceFromSimilarity(mcConnaugheySimilarity(x, y));\n}\nexport function asymmetricSimilarity(x, y) {\n const min = Math.min(x.trueCount(), y.trueCount());\n if (min == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / min;\n}\nexport function asymmetricDistance(x, y) {\n return getDistanceFromSimilarity(asymmetricSimilarity(x, y));\n}\nexport function braunBlanquetSimilarity(x, y) {\n const max = Math.max(x.trueCount(), y.trueCount());\n if (max == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / max;\n}\nexport function braunBlanquetDistance(x, y) {\n return getDistanceFromSimilarity(braunBlanquetSimilarity(x, y));\n}\nexport function russelSimilarity(x, y) {\n if (x.length == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / x.length;\n}\nexport function russelDistance(x, y) {\n return getDistanceFromSimilarity(russelSimilarity(x, y));\n}\nexport function rogotGoldbergSimilarity(x, y) {\n const common = x.andWithCountBits(y, true);\n const total = x.countBits(true) + y.countBits(true);\n const len = x.length;\n const diff = len - total + common;\n if ((common == len) || (diff == len))\n return 1.0;\n else\n return common / total + diff / (2 * len - total);\n}\nexport function rogotGoldbergDistance(x, y) {\n return getDistanceFromSimilarity(rogotGoldbergSimilarity(x, y));\n}\nexport function getSimilarityFromDistance(distance) {\n return 1 / (1 + distance);\n}\nexport function getDistanceFromSimilarity(similarity) {\n return 1 / similarity - 1;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE2RDtJQUN4RixVQUFVLEVBQUUsa0JBQWtCO0lBQzlCLE1BQU0sRUFBRSxjQUFjO0lBQ3RCLFlBQVksRUFBRSxvQkFBb0I7SUFDbEMsZ0JBQWdCLEVBQUUsdUJBQXVCO0lBQ3pDLFFBQVEsRUFBRSxnQkFBZ0I7SUFDMUIsWUFBWSxFQUFFLG9CQUFvQjtJQUNsQyxlQUFlLEVBQUUsc0JBQXNCO0lBQ3ZDLGdCQUFnQixFQUFFLHVCQUF1QjtJQUN6QyxRQUFRLEVBQUUsZ0JBQWdCO0lBQzFCLE9BQU8sRUFBRSxlQUFlO0lBQ3hCLFNBQVMsRUFBRSxpQkFBaUI7SUFDNUIsV0FBVyxFQUFFLG1CQUFtQjtDQUNqQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUE2RDtJQUN2RixVQUFVLEVBQUUsZ0JBQWdCO0lBQzVCLE1BQU0sRUFBRSxZQUFZO0lBQ3BCLFlBQVksRUFBRSxrQkFBa0I7SUFDaEMsZ0JBQWdCLEVBQUUscUJBQXFCO0lBQ3ZDLFFBQVEsRUFBRSxjQUFjO0lBQ3hCLFlBQVksRUFBRSxrQkFBa0I7SUFDaEMsZUFBZSxFQUFFLG9CQUFvQjtJQUNyQyxnQkFBZ0IsRUFBRSxxQkFBcUI7SUFDdkMsUUFBUSxFQUFFLGNBQWM7SUFDeEIsT0FBTyxFQUFFLGFBQWE7SUFDdEIsU0FBUyxFQUFFLGVBQWU7SUFDMUIsV0FBVyxFQUFFLGlCQUFpQjtDQUMvQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDOUYsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxVQUFVLEVB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LENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyQixNQUFNLElBQUksR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLE1BQU0sQ0FBQztJQUNsQyxJQUFJLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDOztRQUM1QyxPQUFPLE1BQU0sR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLENBQVcsRUFBRSxDQUFXO0lBQzVELE9BQU8seUJBQXlCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxRQUFnQjtJQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQsTUFBTSxVQUFVLHlCQUF5QixDQUFDLFVBQWtCO0lBQzFELE9BQU8sQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaXRBcnJheSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy9iaXQtYXJyYXknO1xuXG5leHBvcnQgY29uc3Qgc2ltaWxhcml0eU1ldHJpYzogeyBbbmFtZTogc3RyaW5nXTogKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSkgPT4gbnVtYmVyIH0gPSB7XG4gICdUYW5pbW90byc6IHRhbmltb3RvU2ltaWxhcml0eSxcbiAgJ0RpY2UnOiBkaWNlU2ltaWxhcml0eSxcbiAgJ0FzeW1tZXRyaWMnOiBhc3ltbWV0cmljU2ltaWxhcml0eSxcbiAgJ0JyYXVuLUJsYW5xdWV0JzogYnJhdW5CbGFucXVldFNpbWlsYXJpdHksXG4gICdDb3NpbmUnOiBjb3NpbmVTaW1pbGFyaXR5LFxuICAnS3VsY3p5bnNraSc6IGt1bGN6eW5za2lTaW1pbGFyaXR5LFxuICAnTWMtQ29ubmF1Z2hleSc6IG1jQ29ubmF1Z2hleVNpbWlsYXJpdHksXG4gICdSb2dvdC1Hb2xkYmVyZyc6IHJvZ290R29sZGJlcmdTaW1pbGFyaXR5LFxuICAnUnVzc2VsJzogcnVzc2VsU2ltaWxhcml0eSxcbiAgJ1Nva2FsJzogc29rYWxTaW1pbGFyaXR5LFxuICAnSGFtbWluZyc6IGhhbW1pbmdTaW1pbGFyaXR5LFxuICAnRXVjbGlkZWFuJzogZXVjbGlkZWFuU2ltaWxhcml0eSxcbn07XG5cbmV4cG9ydCBjb25zdCBkaXN0YW5jZU1ldHJpY3M6IHsgW25hbWU6IHN0cmluZ106ICh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpID0+IG51bWJlciB9ID0ge1xuICAnVGFuaW1vdG8nOiB0YW5pbW90b0Rpc3RhbmNlLFxuICAnRGljZSc6IGRpY2VEaXN0YW5jZSxcbiAgJ0FzeW1tZXRyaWMnOiBhc3ltbWV0cmljRGlzdGFuY2UsXG4gICdCcmF1bi1CbGFucXVldCc6IGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgJ0Nvc2luZSc6IGNvc2luZURpc3RhbmNlLFxuICAnS3VsY3p5bnNraSc6IGt1bGN6eW5za2lEaXN0YW5jZSxcbiAgJ01jLUNvbm5hdWdoZXknOiBtY0Nvbm5hdWdoZXlEaXN0YW5jZSxcbiAgJ1JvZ290LUdvbGRiZXJnJzogcm9nb3RHb2xkYmVyZ0Rpc3RhbmNlLFxuICAnUnVzc2VsJzogcnVzc2VsRGlzdGFuY2UsXG4gICdTb2thbCc6IHNva2FsRGlzdGFuY2UsXG4gICdIYW1taW5nJzogaGFtbWluZ0Rpc3RhbmNlLFxuICAnRXVjbGlkZWFuJzogZXVjbGlkZWFuRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3QgQ0hFTV9TSU1JTEFSSVRZX01FVFJJQ1MgPSBbJ1Rhbmltb3RvJywgJ0RpY2UnLCAnQ29zaW5lJywgJ0hhbW1pbmcnLCAnRXVjbGlkZWFuJ107XG5leHBvcnQgY29uc3QgU0VRX1NQQUNFX1NJTUlMQVJJVFlfTUVUUklDUyA9IFsnVGFuaW1vdG8nLCAnQXN5bW1ldHJpYycsICdDb3NpbmUnLCAnU29rYWwnXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRhbmltb3RvU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBpZiAodG90YWwgPT0gMCkgcmV0dXJuIDEuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gKHRvdGFsIC0gY29tbW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRhbmltb3RvRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkodGFuaW1vdG9TaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpY2VTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCk7XG4gIGlmICh0b3RhbCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiAyICogY29tbW9uIC8gdG90YWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWNlRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkoZGljZVNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29zaW5lU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKiB5LnRydWVDb3VudCgpO1xuICBpZiAodG90YWwgPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gTWF0aC5zcXJ0KHRvdGFsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvc2luZURpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KGNvc2luZVNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXVjbGlkZWFuU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0U2ltaWxhcml0eUZyb21EaXN0YW5jZShldWNsaWRlYW5EaXN0YW5jZSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldWNsaWRlYW5EaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5zcXJ0KHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpIC0gMiAqIHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW1taW5nU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0U2ltaWxhcml0eUZyb21EaXN0YW5jZShoYW1taW5nRGlzdGFuY2UoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFtbWluZ0Rpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKSAtIDIgKiB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb2thbFNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gKDIgKiB0b3RhbCAtIDMgKiBjb21tb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29rYWxEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShzb2thbFNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga3VsY3p5bnNraVNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgY29uc3QgdG90YWxQcm9kID0geC50cnVlQ291bnQoKSAqIHkudHJ1ZUNvdW50KCk7XG4gIGlmICh0b3RhbFByb2QgPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gKGNvbW1vbiAqIHRvdGFsKSAvICgyICogdG90YWxQcm9kKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGt1bGN6eW5za2lEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShrdWxjenluc2tpU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtY0Nvbm5hdWdoZXlTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCk7XG4gIGNvbnN0IHRvdGFsUHJvZCA9IHgudHJ1ZUNvdW50KCkgKiB5LnRydWVDb3VudCgpO1xuICBpZiAodG90YWxQcm9kID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIChjb21tb24gKiB0b3RhbCAtIHRvdGFsUHJvZCkgLyB0b3RhbFByb2Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtY0Nvbm5hdWdoZXlEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShtY0Nvbm5hdWdoZXlTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzeW1tZXRyaWNTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IG1pbiA9IE1hdGgubWluKHgudHJ1ZUNvdW50KCksIHkudHJ1ZUNvdW50KCkpO1xuICBpZiAobWluID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvIG1pbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzeW1tZXRyaWNEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShhc3ltbWV0cmljU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBicmF1bkJsYW5xdWV0U2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCBtYXggPSBNYXRoLm1heCh4LnRydWVDb3VudCgpLCB5LnRydWVDb3VudCgpKTtcbiAgaWYgKG1heCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyBtYXg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBicmF1bkJsYW5xdWV0RGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkoYnJhdW5CbGFucXVldFNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVzc2VsU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBpZiAoeC5sZW5ndGggPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8geC5sZW5ndGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydXNzZWxEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShydXNzZWxTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJvZ290R29sZGJlcmdTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgY29uc3QgdG90YWwgPSB4LmNvdW50Qml0cyh0cnVlKSArIHkuY291bnRCaXRzKHRydWUpO1xuICBjb25zdCBsZW4gPSB4Lmxlbmd0aDtcbiAgY29uc3QgZGlmZiA9IGxlbiAtIHRvdGFsICsgY29tbW9uO1xuICBpZiAoKGNvbW1vbiA9PSBsZW4pIHx8IChkaWZmID09IGxlbikpIHJldHVybiAxLjA7XG4gIGVsc2UgcmV0dXJuIGNvbW1vbiAvIHRvdGFsICsgZGlmZiAvICgyICogbGVuIC0gdG90YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcm9nb3RHb2xkYmVyZ0Rpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KHJvZ290R29sZGJlcmdTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpbWlsYXJpdHlGcm9tRGlzdGFuY2UoZGlzdGFuY2U6IG51bWJlcikge1xuICByZXR1cm4gMSAvICgxICsgZGlzdGFuY2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShzaW1pbGFyaXR5OiBudW1iZXIpIHtcbiAgcmV0dXJuIDEgLyBzaW1pbGFyaXR5IC0gMTtcbn1cbiJdfQ==","import * as DG from 'datagrok-api/dg';\nimport * as sha256 from 'fast-sha256';\n/**\n * For columns of string type. Checks whether column contains empty values and removes corresponding rows in case user selects to remove.\n *\n */\nexport function removeEmptyStringRows(table, col) {\n const cats = col.categories;\n const emptyRawInd = cats.map((val, ind) => !val ? ind : null).filter((it) => it !== null);\n const rawData = [...col.getRawData()];\n const emptyRawsIndexes = [];\n let removedRowsCounter = 0;\n for (let i = 0; i < table.rowCount; i++) {\n if (emptyRawInd.includes(rawData[i])) {\n table.rows.removeAt(i - removedRowsCounter);\n emptyRawsIndexes.push(i);\n removedRowsCounter += 1;\n }\n }\n return emptyRawsIndexes;\n}\nexport function hashDataFrame(table, names) {\n names !== null && names !== void 0 ? names : (names = table.columns.names());\n const hasher = new sha256.Hash();\n const order = table.getSortedOrder(names);\n const encoder = new TextEncoder();\n for (const name of names) {\n const column = table.columns.byName(name);\n const dataArray = column.getRawData();\n const isString = column.type == DG.TYPE.STRING;\n const cats = column.categories;\n for (let i = 0; i < dataArray.length; i++) {\n if (isString) {\n const data = cats[dataArray[order[i]]];\n hasher.update(encoder.encode(data));\n }\n else {\n const data = dataArray[order[i]];\n hasher.update(Uint8Array.from([data]));\n }\n }\n }\n return hasher.digest();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZyYW1lLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGF0YWZyYW1lLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDdEM7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQW1CLEVBQUUsR0FBYztJQUN2RSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDO0lBQzVCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUMxRixNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDdEMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDNUIsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7SUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdkMsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3BDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDO1lBQzVDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixrQkFBa0IsSUFBSSxDQUFDLENBQUM7U0FDekI7S0FDRjtJQUNELE9BQU8sZ0JBQWdCLENBQUM7QUFDMUIsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBbUIsRUFBRSxLQUFnQjtJQUNqRSxLQUFLLGFBQUwsS0FBSyxjQUFMLEtBQUssSUFBTCxLQUFLLEdBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBQztJQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNqQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDbEMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7UUFDeEIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFFBQVEsRUFBRTtnQkFDWixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQ3JDO2lCQUFNO2dCQUNMLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hDO1NBQ0Y7S0FDRjtJQUNELE9BQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0ICogYXMgc2hhMjU2IGZyb20gJ2Zhc3Qtc2hhMjU2Jztcbi8qKlxuICogRm9yIGNvbHVtbnMgb2Ygc3RyaW5nIHR5cGUuIENoZWNrcyB3aGV0aGVyIGNvbHVtbiBjb250YWlucyBlbXB0eSB2YWx1ZXMgYW5kIHJlbW92ZXMgY29ycmVzcG9uZGluZyByb3dzIGluIGNhc2UgdXNlciBzZWxlY3RzIHRvIHJlbW92ZS5cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVFbXB0eVN0cmluZ1Jvd3ModGFibGU6IERHLkRhdGFGcmFtZSwgY29sOiBERy5Db2x1bW4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGNhdHMgPSBjb2wuY2F0ZWdvcmllcztcbiAgY29uc3QgZW1wdHlSYXdJbmQgPSBjYXRzLm1hcCgodmFsLCBpbmQpID0+ICF2YWwgPyBpbmQgOiBudWxsKS5maWx0ZXIoKGl0KSA9PiBpdCAhPT0gbnVsbCk7XG4gIGNvbnN0IHJhd0RhdGEgPSBbLi4uY29sLmdldFJhd0RhdGEoKV07XG4gIGNvbnN0IGVtcHR5UmF3c0luZGV4ZXMgPSBbXTtcbiAgbGV0IHJlbW92ZWRSb3dzQ291bnRlciA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUucm93Q291bnQ7IGkrKykge1xuICAgIGlmIChlbXB0eVJhd0luZC5pbmNsdWRlcyhyYXdEYXRhW2ldKSkge1xuICAgICAgdGFibGUucm93cy5yZW1vdmVBdChpIC0gcmVtb3ZlZFJvd3NDb3VudGVyKTtcbiAgICAgIGVtcHR5UmF3c0luZGV4ZXMucHVzaChpKTtcbiAgICAgIHJlbW92ZWRSb3dzQ291bnRlciArPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW1wdHlSYXdzSW5kZXhlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc2hEYXRhRnJhbWUodGFibGU6IERHLkRhdGFGcmFtZSwgbmFtZXM/OiBzdHJpbmdbXSk6IFVpbnQ4QXJyYXkge1xuICBuYW1lcyA/Pz0gdGFibGUuY29sdW1ucy5uYW1lcygpO1xuICBjb25zdCBoYXNoZXIgPSBuZXcgc2hhMjU2Lkhhc2goKTtcbiAgY29uc3Qgb3JkZXIgPSB0YWJsZS5nZXRTb3J0ZWRPcmRlcihuYW1lcyk7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgY29uc3QgY29sdW1uID0gdGFibGUuY29sdW1ucy5ieU5hbWUobmFtZSk7XG4gICAgY29uc3QgZGF0YUFycmF5ID0gY29sdW1uLmdldFJhd0RhdGEoKTtcbiAgICBjb25zdCBpc1N0cmluZyA9IGNvbHVtbi50eXBlID09IERHLlRZUEUuU1RSSU5HO1xuICAgIGNvbnN0IGNhdHMgPSBjb2x1bW4uY2F0ZWdvcmllcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGlzU3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjYXRzW2RhdGFBcnJheVtvcmRlcltpXV1dO1xuICAgICAgICBoYXNoZXIudXBkYXRlKGVuY29kZXIuZW5jb2RlKGRhdGEpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBkYXRhQXJyYXlbb3JkZXJbaV1dO1xuICAgICAgICBoYXNoZXIudXBkYXRlKFVpbnQ4QXJyYXkuZnJvbShbZGF0YV0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhhc2hlci5kaWdlc3QoKTtcbn1cbiJdfQ==","\n import API from \"!../../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../css-loader/dist/cjs.js!./styles.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../css-loader/dist/cjs.js!./styles.css\";\n export default content && content.locals ? content.locals : undefined;\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport { getSimilarityFromDistance } from '../distance-metrics-methods';\nimport { removeEmptyStringRows } from '@datagrok-libraries/utils/src/dataframe-utils';\nimport { Subject } from 'rxjs';\nimport '../../css/styles.css';\nconst filterCliffsSubj = new Subject();\nconst nonNormalizedDistances = ['Levenshtein'];\nconst LINES_DF_ACT_DIFF_COL_NAME = 'act_diff';\nconst LINES_DF_SALI_COL_NAME = 'sali';\nconst LINES_DF_SIM_COL_NAME = 'sim';\nconst LINES_DF_LINE_IND_COL_NAME = 'line_index';\nconst LINES_DF_MOL_COLS_NAMES = ['1_seq', '2_seq'];\nconst CLIFFS_FILTER_APPLIED = 'filterCliffs';\n// Searches for activity cliffs in a chemical dataset by selected cutoff\nexport function getActivityCliffs(df, seqCol, encodedCol, axesNames, scatterTitle, activities, similarity, similarityMetric, methodName, semType, tags, seqSpaceFunc, simMatrixFunc, tooltipFunc, propertyPanelFunc, linesGridFunc, seqSpaceOptions) {\n return __awaiter(this, void 0, void 0, function* () {\n const similarityLimit = similarity / 100;\n const dimensionalityReduceCol = encodedCol !== null && encodedCol !== void 0 ? encodedCol : seqCol;\n let zoom = false;\n let ignoreSelectionChange = false;\n const cashedLinesData = {};\n let acc;\n let timer;\n const withoutEmptyValues = DG.DataFrame.fromColumns([dimensionalityReduceCol]).clone();\n const emptyValsIdxs = removeEmptyStringRows(withoutEmptyValues, dimensionalityReduceCol);\n const seqSpaceParams = {\n seqCol: withoutEmptyValues.col(dimensionalityReduceCol.name),\n methodName: methodName,\n similarityMetric: similarityMetric,\n embedAxesNames: axesNames,\n options: seqSpaceOptions,\n };\n const { distance, coordinates } = yield seqSpaceFunc(seqSpaceParams);\n const coordsWithInsertedEmptyVals = getEmbeddingColsWithInsertedEmptyVals(coordinates, emptyValsIdxs, df.rowCount);\n for (const col of coordsWithInsertedEmptyVals) {\n df.columns.add(col);\n }\n const simArr = yield createSimilaritiesMatrix(dimensionalityReduceCol, distance, !distance || emptyValsIdxs.length !== 0 || nonNormalizedDistances.includes(similarityMetric), simMatrixFunc);\n const cliffsMetrics = getActivityCliffsMetrics(simArr, similarityLimit, activities);\n const sali = getSaliCountCol(dimensionalityReduceCol.length, cliffsMetrics.saliVals, cliffsMetrics.n1, cliffsMetrics.n2, axesNames, activities);\n df.columns.add(sali);\n const cliffCol = getCliffsBooleanCol(df, cliffsMetrics.cliffsMolIds);\n df.columns.add(cliffCol);\n const saliMinMax = getSaliMinMax(cliffsMetrics.saliVals);\n const saliOpacityCoef = 0.8 / (saliMinMax.max - saliMinMax.min);\n ;\n const view = grok.shell.getTableView(df.name);\n view.grid.columns.byName(cliffCol.name).visible = false;\n const sp = view.addViewer(DG.VIEWER.SCATTER_PLOT, {\n xColumnName: axesNames[0],\n yColumnName: axesNames[1],\n size: sali.name,\n color: activities.name,\n showXSelector: false,\n showYSelector: false,\n showSizeSelector: false,\n showColorSelector: false,\n markerMinSize: 5,\n markerMaxSize: 25,\n title: scatterTitle,\n });\n const canvas = sp.getInfo()['canvas'];\n const linesRes = createLines(cliffsMetrics, seqCol, activities, semType, tags);\n const linesDfGrid = linesGridFunc ?\n linesGridFunc(linesRes.linesDf, LINES_DF_MOL_COLS_NAMES).sort([LINES_DF_SALI_COL_NAME], [false]) :\n linesRes.linesDf.plot.grid().sort([LINES_DF_SALI_COL_NAME], [false]);\n const listCliffsLink = ui.button(`${linesRes.linesDf.rowCount} cliffs`, () => {\n view.dockManager.dock(linesDfGrid.root, 'down', null, 'Activity cliffs', 0.2);\n });\n listCliffsLink.classList.add('scatter_plot_link', 'cliffs_grid');\n sp.root.append(listCliffsLink);\n /* in case several activity cliffs viewers are opened cliffs filtering can\n be applyed only to one of the viewers. When 'Show only cliffs' is switched on one of the viewers\n switch inputs on other viewers are disabled */\n const filterCliffsButton = ui.switchInput(`Show only cliffs`, false, () => {\n if (filterCliffsButton.value) {\n sp.dataFrame.setTag(CLIFFS_FILTER_APPLIED, cliffCol.name);\n df.filter.copyFrom(createCliffsOnlyFilter(df, cliffCol.name));\n filterCliffsSubj.next(cliffCol.name);\n }\n else {\n sp.dataFrame.setTag(CLIFFS_FILTER_APPLIED, '');\n df.filter.setAll(true, true);\n filterCliffsSubj.next('');\n }\n });\n filterCliffsButton.root.classList.add('scatter_plot_link', 'show_only_cliffs');\n sp.root.append(filterCliffsButton.root);\n filterCliffsSubj.subscribe((s) => {\n if (s !== '') {\n if (s !== cliffCol.name)\n filterCliffsButton.enabled = false;\n }\n else {\n filterCliffsButton.enabled = true;\n }\n });\n //closing docked grid when viewer is closed\n const viewerClosedSub = grok.events.onViewerClosed.subscribe((v) => {\n //@ts-ignore\n if (v.args.viewer === sp) {\n view.dockManager.close(linesDfGrid.root);\n viewerClosedSub.unsubscribe();\n view.subs = view.subs.filter((sub) => sub !== viewerClosedSub);\n }\n });\n view.subs.push(viewerClosedSub);\n linesRes.linesDf.onCurrentCellChanged.subscribe(() => {\n zoom = true;\n const currentMolIdx = linesRes.linesDf.currentCol && linesRes.linesDf.currentCol.name === LINES_DF_MOL_COLS_NAMES[1] ? 1 : 0;\n const line = linesRes.linesDf.currentRowIdx !== -1 ? linesRes.lines[linesRes.linesDf.currentRowIdx] : null;\n sp.dataFrame.currentRowIdx = line ? line.mols[currentMolIdx] : -1;\n sp.dataFrame.filter.set(0, !linesRes.lines[0].selected); //calling filter to force scatter plot re-rendering\n sp.dataFrame.filter.set(0, linesRes.lines[0].selected);\n if (line) {\n setTimeout(() => {\n updatePropertyPanel(df, acc, cashedLinesData, line, seqCol, activities, linesRes.linesDf.get(LINES_DF_SALI_COL_NAME, line.id), propertyPanelFunc);\n const order = sp.dataFrame.getSortedOrder(view.grid.sortByColumns, view.grid.sortTypes);\n view.grid.scrollToCell(seqCol.name, order.indexOf(sp.dataFrame.currentRowIdx));\n }, 1000);\n }\n });\n linesRes.linesDf.onSelectionChanged.subscribe((_) => {\n if (linesRes.linesDf.selection.anyTrue === false) { //case when selection is reset by pushing Esc\n linesRes.lines.forEach((l) => { l.selected = false; });\n }\n else {\n if (linesRes.linesDf.mouseOverRowIdx !== -1) {\n const line = linesRes.lines[linesRes.linesDf.mouseOverRowIdx];\n line.selected = !line.selected;\n }\n }\n setTimeout(() => {\n const selection = DG.BitSet.create(df.rowCount);\n linesRes.lines.forEach((l) => {\n if (l.selected) {\n l.mols.forEach((m) => {\n selection.set(m, l.selected, true);\n });\n }\n });\n df.selection.copyFrom(selection);\n view.grid.invalidate();\n }, 300); //timeout is required because of resetting selection by clicking on scatter plot. First selection is reset and after it is set again using by this method\n });\n df.onSelectionChanged.subscribe((e) => {\n if (ignoreSelectionChange) {\n ignoreSelectionChange = false;\n }\n else {\n if (df.selection.anyTrue === false && typeof e === 'number') { //catching event when initial df selection is reset by pushing Esc\n linesRes.lines.forEach((l) => { l.selected = false; });\n linesDfGrid.dataFrame.selection.setAll(false, false);\n linesDfGrid.invalidate();\n }\n }\n });\n canvas.addEventListener('mousemove', function (event) {\n clearTimeout(timer);\n timer = global.setTimeout(function () {\n const line = checkCursorOnLine(event, canvas, linesRes.lines);\n if (line && df.mouseOverRowIdx === -1) {\n ui.tooltip.show(tooltipFunc({ cashedData: cashedLinesData, line: line, df: df, seqCol: seqCol,\n activityCol: activities }), event.clientX, event.clientY);\n }\n }, 500);\n });\n canvas.addEventListener('mousedown', function (event) {\n ignoreSelectionChange = true; //clicking on a scatter plot leads to selection reset. Variable is required to prevent from resetting (is used in df.onSelectionChanged.subscribe)\n const line = checkCursorOnLine(event, canvas, linesRes.lines);\n if (line && df.mouseOverRowIdx === -1) {\n if (event.ctrlKey) {\n line.selected = !line.selected;\n linesRes.linesDf.selection.set(line.id, line.selected);\n }\n else {\n if (linesRes.linesDf.currentRowIdx !== line.id) {\n linesRes.linesDf.currentRowIdx = line.id;\n df.currentRowIdx = line.mols[0];\n df.filter.set(0, !linesRes.lines[0].selected); //calling filter to force scatter plot re-rendering\n df.filter.set(0, linesRes.lines[0].selected);\n }\n }\n const order = linesRes.linesDf.getSortedOrder(linesDfGrid.sortByColumns, linesDfGrid.sortTypes);\n linesDfGrid.scrollToCell(LINES_DF_MOL_COLS_NAMES[0], order.indexOf(line.id));\n }\n });\n sp.onEvent('d4-before-draw-scene')\n .subscribe((_) => {\n const lines = renderLines(sp, axesNames[0], axesNames[1], linesRes, cliffsMetrics.saliVals, saliOpacityCoef, saliMinMax.min);\n if (zoom) {\n const currentLine = lines[linesRes.linesDf.currentRowIdx];\n setTimeout(() => {\n const { zoomLeft, zoomRight, zoomTop, zoomBottom } = getZoomCoordinates(sp.viewport.width, sp.viewport.height, sp.dataFrame.get(axesNames[0], currentLine.mols[0]), sp.dataFrame.get(axesNames[1], currentLine.mols[0]), sp.dataFrame.get(axesNames[0], currentLine.mols[1]), sp.dataFrame.get(axesNames[1], currentLine.mols[1]));\n sp.zoom(zoomLeft, zoomTop, zoomRight, zoomBottom);\n }, 300);\n zoom = false;\n }\n if (filterCliffsButton.value) {\n df.filter.copyFrom(createCliffsOnlyFilter(df, cliffCol.name));\n }\n else if (filterCliffsButton.enabled === true)\n df.filter.setAll(true, false);\n });\n sp.addProperty('similarityLimit', 'double', similarityLimit);\n acc = createPopertyPanel();\n return sp;\n });\n}\nfunction createCliffsOnlyFilter(df, colName) {\n const filter = DG.BitSet.create(df.rowCount);\n const raw = df.col(colName).getRawData();\n for (let i = 0; i < raw.length; i++) {\n filter.set(i, !!raw[i], false);\n }\n return filter;\n}\nfunction getEmbeddingColsWithInsertedEmptyVals(coordinates, emptyValsIdxs, length) {\n const coordsWithInsertedEmptyVals = [];\n for (const col of coordinates) {\n const listValues = col.toList();\n emptyValsIdxs.forEach((ind) => listValues.splice(ind, 0, null));\n coordsWithInsertedEmptyVals.push(DG.Column.float(col.name, length).init((i) => listValues[i]));\n }\n return coordsWithInsertedEmptyVals;\n}\nfunction createSimilaritiesMatrix(col, distance, countFromDistance, simMatrixFunc) {\n return __awaiter(this, void 0, void 0, function* () {\n const cats = col.categories;\n const raw = col.getRawData();\n const newCol = DG.Column.string('seq', col.length).init((i) => cats[raw[i]]);\n const dfSeq = DG.DataFrame.fromColumns([newCol]);\n const dim = col.length;\n let simArr = Array(dim - 1);\n if (countFromDistance) {\n simArr = yield simMatrixFunc(dim, col, dfSeq, 'seq', simArr);\n }\n else {\n getSimilaritiesFromDistances(dim, distance, simArr);\n }\n return simArr;\n });\n}\nfunction getActivityCliffsMetrics(simArr, similarityLimit, activities) {\n const simVals = [];\n const saliVals = [];\n const n1 = [];\n const n2 = [];\n const cliffsMolIds = new Set();\n for (let i = 0; i != simArr.length; ++i) {\n for (let j = 0; j != simArr.length - i; ++j) {\n const sim = simArr[i] ? simArr[i].get(j) : 0;\n if (sim >= similarityLimit) {\n n1.push(i);\n n2.push(i + j + 1);\n cliffsMolIds.add(i);\n cliffsMolIds.add(i + j + 1);\n simVals.push(sim);\n const diff = Math.abs(activities.get(i) - activities.get(i + j + 1));\n if (sim != 1) {\n saliVals.push(diff / (1 - sim));\n }\n else {\n saliVals.push(Infinity);\n }\n }\n }\n }\n return { simVals: simVals, saliVals: saliVals, n1: n1, n2: n2, cliffsMolIds: cliffsMolIds };\n}\nfunction getSaliMinMax(saliVals) {\n const saliValsWithoutInfinity = saliVals.filter((it) => it !== Infinity);\n const saliMin = Math.min(...saliValsWithoutInfinity);\n const saliMax = Math.max(...saliValsWithoutInfinity);\n return { max: saliMax, min: saliMin };\n}\nfunction getSaliCountCol(length, saliVals, n1, n2, axesNames, activities) {\n const saliCount = new Array(length).fill(0);\n for (let i = 0; i != n1.length; ++i) {\n if (saliVals[i] != Infinity) {\n if (activities.get(n1[i]) > activities.get(n2[i])) {\n saliCount[n1[i]] += saliVals[i];\n }\n else {\n saliCount[n2[i]] += saliVals[i];\n }\n }\n }\n return DG.Column.fromList('double', `sali_${axesNames[0].substring(axesNames[0].lastIndexOf('_'))}`, saliCount);\n}\nfunction createPopertyPanel() {\n const acc = ui.accordion();\n const accIcon = ui.element('i');\n accIcon.className = 'grok-icon svg-icon svg-view-layout';\n acc.addTitle(ui.span([accIcon, ui.label(`Activity cliffs`)]));\n acc.addPane('Cliff Details', () => ui.divText('Cliff has not been selected'), true);\n grok.shell.o = acc.root;\n return acc;\n}\nfunction updatePropertyPanel(df, acc, cashedData, line, seqCol, activities, sali, propPanelFunc) {\n const panel = acc.getPane('Cliff Details');\n ui.empty(panel.root);\n const panelElement = propPanelFunc({ cashedData: cashedData, line: line, df: df, seqCol: seqCol,\n activityCol: activities, sali: sali });\n panel.root.append(panelElement);\n setTimeout(() => {\n grok.shell.o = acc.root;\n }, 500);\n}\nfunction getZoomCoordinates(W0, H0, x1, y1, x2, y2) {\n const W1 = Math.abs(x1 - x2);\n const H1 = Math.abs(y1 - y2);\n const scaleW = W0 / W1;\n const scaleH = H0 / H1;\n const scale = Math.min(scaleW, scaleH);\n const W2 = (W0 / scale) * 5;\n const H2 = (H0 / scale) * 5;\n const left = x1 < x2 ? x1 : x2;\n const top = y1 > y2 ? y1 : y2;\n const zoomLeft = (left + W1 / 2) - W2 / 2;\n const zoomRight = zoomLeft + W2;\n const zoomTop = (top - H1 / 2) + H2 / 2;\n const zoomBottom = zoomTop - H2;\n return { zoomLeft: zoomLeft, zoomRight: zoomRight, zoomTop: zoomTop, zoomBottom: zoomBottom };\n}\nfunction checkCursorOnLine(event, canvas, lines) {\n const rect = canvas.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n let closestLine = null;\n let minDist = 0;\n for (const line of lines) {\n const dist = Math.abs(Math.hypot(line.a[0] - x, line.a[1] - y) +\n Math.hypot(line.b[0] - x, line.b[1] - y) - Math.hypot(line.a[0] - line.b[0], line.a[1] - line.b[1]));\n if ((!minDist && dist < 2) || dist < minDist) {\n minDist = dist;\n closestLine = line;\n }\n }\n return closestLine;\n}\nfunction renderLines(sp, xAxis, yAxis, linesRes, saliVals, saliOpacityCoef, saliMin) {\n const lines = linesRes.lines;\n const canvas = sp.getInfo()['canvas'];\n const ctx = canvas.getContext('2d');\n const x = sp.dataFrame.columns.byName(xAxis);\n const y = sp.dataFrame.columns.byName(yAxis);\n for (let i = 0; i < lines.length; i++) {\n const pointFrom = sp.worldToScreen(x.get(lines[i].mols[0]), y.get(lines[i].mols[0]));\n const pointTo = sp.worldToScreen(x.get(lines[i].mols[1]), y.get(lines[i].mols[1]));\n lines[i].a = [pointFrom.x, pointFrom.y];\n lines[i].b = [pointTo.x, pointTo.y];\n const line = new Path2D();\n line.moveTo(lines[i].a[0], lines[i].a[1]);\n const color = lines[i].selected ? '255,255,0' : '0,128,0';\n const opacity = saliVals[i] === Infinity ? 1 : 0.2 + (saliVals[i] - saliMin) * saliOpacityCoef;\n ctx.strokeStyle = `rgba(${color},${opacity})`;\n ctx.lineWidth = lines[i].id === linesRes.linesDf.currentRowIdx ? 3 : 1;\n line.lineTo(lines[i].b[0], lines[i].b[1]);\n ctx.stroke(line);\n }\n return lines;\n}\nfunction createLines(params, seq, activities, semType, tags) {\n const lines = new Array(params.n1.length).fill(null);\n for (let i = 0; i < params.n1.length; i++) {\n const num1 = params.n1[i];\n const num2 = params.n2[i];\n lines[i] = ({ id: i, mols: [num1, num2], selected: false, a: [], b: [] });\n }\n const linesDf = DG.DataFrame.create(lines.length);\n LINES_DF_MOL_COLS_NAMES.forEach((it, idx) => {\n linesDf.columns.addNewString(it).init((i) => seq.get(lines[i].mols[idx]));\n setTags(linesDf.col(it), tags);\n linesDf.col(it).semType = semType;\n });\n linesDf.columns.addNewFloat(LINES_DF_ACT_DIFF_COL_NAME)\n .init((i) => Math.abs(activities.get(lines[i].mols[0]) - activities.get(lines[i].mols[1])));\n linesDf.columns.addNewInt(LINES_DF_LINE_IND_COL_NAME).init((i) => i);\n linesDf.columns.addNewFloat(LINES_DF_SALI_COL_NAME).init((i) => params.saliVals[i]);\n linesDf.columns.addNewFloat(LINES_DF_SIM_COL_NAME).init((i) => params.simVals[i]);\n return { lines, linesDf };\n}\nfunction setTags(col, tags) {\n Object.keys(tags).forEach((tag) => {\n col.tags[tag] = tags[tag];\n });\n}\nexport function getSimilaritiesMatrix(dim, seqCol, dfSeq, simArr, simFunc) {\n return __awaiter(this, void 0, void 0, function* () {\n for (let i = 0; i != dim - 1; ++i) {\n const mol = seqCol.get(i);\n dfSeq.rows.removeAt(0, 1, false);\n simArr[i] = (yield simFunc(dfSeq.col('seq'), mol));\n }\n return simArr;\n });\n}\nexport function getSimilaritiesFromDistances(dim, distances, simArr) {\n for (let i = 0; i < dim - 1; ++i) {\n const similarityArr = new Float32Array(dim - i - 1).fill(0);\n for (let j = i + 1; j < dim; ++j) {\n similarityArr[j - i - 1] = getSimilarityFromDistance(distances[i][j]);\n }\n simArr[i] = DG.Column.fromFloat32Array('similarity', similarityArr);\n }\n return simArr;\n}\nexport function getCliffsBooleanCol(df, ids) {\n const colname = 'containsCliff';\n const colNameInd = df.columns.names().filter((it) => it.includes(colname)).length + 1;\n const newColName = `${colname}_${colNameInd}`;\n return DG.Column.bool(newColName, df.rowCount).init((i) => ids.has(i));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZpdHktY2xpZmZzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYWN0aXZpdHktY2xpZmZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxzQkFBc0IsQ0FBQztBQWtEOUIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO0FBQy9DLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUMvQyxNQUFNLDBCQUEwQixHQUFHLFVBQVUsQ0FBQztBQUM5QyxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQztBQUN0QyxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQztBQUNwQyxNQUFNLDBCQUEwQixHQUFHLFlBQVksQ0FBQztBQUNoRCxNQUFNLHVCQUF1QixHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ25ELE1BQU0scUJBQXFCLEdBQUcsY0FBYyxDQUFDO0FBRTdDLHdFQUF3RTtBQUN4RSxNQUFNLFVBQWdCLGlCQUFpQixDQUFDLEVBQWdCLEVBQUUsTUFBaUIsRUFBRSxVQUE0QixFQUN2RyxTQUFtQixFQUFFLFlBQW9CLEVBQUUsVUFBcUIsRUFBRSxVQUFrQixFQUFFLGdCQUF3QixFQUM5RyxVQUFrQixFQUFFLE9BQWUsRUFBRSxJQUErQixFQUNwRSxZQUE2RSxFQUM3RSxhQUM4QyxFQUM5QyxXQUE0RCxFQUM1RCxpQkFB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QUFFLEVBQUUsTUFBTSxFQUFFLE1BQU07UUFDNUYsV0FBVyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztJQUN4QyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNoQyxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztJQUMxQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDVixDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVU7SUFDaEcsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDN0IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDN0IsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUN2QixNQUFNLE1BQU0sR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsTUFBTSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDL0IsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUIs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Q0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkYsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDMUQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FB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Q0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQge01hdHJpeH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdHlwZS1kZWNsYXJhdGlvbnMnO1xuaW1wb3J0IHtnZXRTaW1pbGFyaXR5RnJvbURpc3RhbmNlfSBmcm9tICcuLi9kaXN0YW5jZS1tZXRyaWNzLW1ldGhvZHMnO1xuaW1wb3J0IHtyZW1vdmVFbXB0eVN0cmluZ1Jvd3N9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL2RhdGFmcmFtZS11dGlscyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgJy4uLy4uL2Nzcy9zdHlsZXMuY3NzJztcblxuZXhwb3J0IGludGVyZmFjZSBJTGluZSB7XG4gIGlkOiBudW1iZXI7XG4gIG1vbHM6IG51bWJlcltdO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgYTogbnVtYmVyW107IC8vIFt4LCB5XVxuICBiOiBudW1iZXJbXTsgLy8gW3gsIHldXG59XG5cbmludGVyZmFjZSBJUmVuZGVyZWRMaW5lcyB7XG4gIGxpbmVzOiBJTGluZVtdO1xuICBsaW5lc0RmOiBERy5EYXRhRnJhbWU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlcXVlbmNlU3BhY2VQYXJhbXMge1xuICBzZXFDb2w6IERHLkNvbHVtbixcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBzaW1pbGFyaXR5TWV0cmljOiBzdHJpbmcsXG4gIGVtYmVkQXhlc05hbWVzOiBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IGFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZXF1ZW5jZVNwYWNlUmVzdWx0IHtcbiAgZGlzdGFuY2U6IE1hdHJpeDtcbiAgY29vcmRpbmF0ZXM6IERHLkNvbHVtbkxpc3Q7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRvb2x0aXBBbmRQYW5lbFBhcmFtcyB7XG4gIGNhc2hlZERhdGE6IGFueSxcbiAgbGluZTogSUxpbmUsXG4gIGRmOiBERy5EYXRhRnJhbWUsXG4gIHNlcUNvbDogREcuQ29sdW1uLFxuICBhY3Rpdml0eUNvbDogREcuQ29sdW1uLFxuICBzYWxpPzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFjdGl2aXR5Q2xpZmZzTWV0cmljcyB7XG4gIHNpbVZhbHM6IG51bWJlcltdO1xuICBzYWxpVmFsczogbnVtYmVyW107XG4gIG4xOiBudW1iZXJbXTtcbiAgbjI6IG51bWJlcltdO1xuICBjbGlmZnNNb2xJZHM6IFNldDxudW1iZXI+O1xufVxuXG5pbnRlcmZhY2UgSVNhbGlMaW1zIHtcbiAgbWluOiBudW1iZXI7XG4gIG1heDogbnVtYmVyO1xufVxuXG5jb25zdCBmaWx0ZXJDbGlmZnNTdWJqID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuY29uc3Qgbm9uTm9ybWFsaXplZERpc3RhbmNlcyA9IFsnTGV2ZW5zaHRlaW4nXTtcbmNvbnN0IExJTkVTX0RGX0FDVF9ESUZGX0NPTF9OQU1FID0gJ2FjdF9kaWZmJztcbmNvbnN0IExJTkVTX0RGX1NBTElfQ09MX05BTUUgPSAnc2FsaSc7XG5jb25zdCBMSU5FU19ERl9TSU1fQ09MX05BTUUgPSAnc2ltJztcbmNvbnN0IExJTkVTX0RGX0xJTkVfSU5EX0NPTF9OQU1FID0gJ2xpbmVfaW5kZXgnO1xuY29uc3QgTElORVNfREZfTU9MX0NPTFNfTkFNRVMgPSBbJzFfc2VxJywgJzJfc2VxJ107XG5jb25zdCBDTElGRlNfRklMVEVSX0FQUExJRUQgPSAnZmlsdGVyQ2xpZmZzJztcblxuLy8gU2VhcmNoZXMgZm9yIGFjdGl2aXR5IGNsaWZmcyBpbiBhIGNoZW1pY2FsIGRhdGFzZXQgYnkgc2VsZWN0ZWQgY3V0b2ZmXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWN0aXZpdHlDbGlmZnMoZGY6IERHLkRhdGFGcmFtZSwgc2VxQ29sOiBERy5Db2x1bW4sIGVuY29kZWRDb2w6IERHLkNvbHVtbiB8IG51bGwsXG4gIGF4ZXNOYW1lczogc3RyaW5nW10sIHNjYXR0ZXJUaXRsZTogc3RyaW5nLCBhY3Rpdml0aWVzOiBERy5Db2x1bW4sIHNpbWlsYXJpdHk6IG51bWJlciwgc2ltaWxhcml0eU1ldHJpYzogc3RyaW5nLFxuICBtZXRob2ROYW1lOiBzdHJpbmcsIHNlbVR5cGU6IHN0cmluZywgdGFnczoge1tpbmRleDogc3RyaW5nXTogc3RyaW5nfSxcbiAgc2VxU3BhY2VGdW5jOiAocGFyYW1zOiBJU2VxdWVuY2VTcGFjZVBhcmFtcykgPT4gUHJvbWlzZTxJU2VxdWVuY2VTcGFjZVJlc3VsdD4sXG4gIHNpbU1hdHJpeEZ1bmM6IChkaW06IG51bWJlciwgc2VxQ29sOiBERy5Db2x1bW4sIGRmOiBERy5EYXRhRnJhbWUsIGNvbE5hbWU6IHN0cmluZyxcbiAgICBzaW1BcnI6IERHLkNvbHVtbltdKSA9PiBQcm9taXNlPERHLkNvbHVtbltdPixcbiAgdG9vbHRpcEZ1bmM6IChwYXJhbXM6IElUb29sdGlwQW5kUGFuZWxQYXJhbXMpID0+IEhUTUxFbGVtZW50LFxuICBwcm9wZXJ0eVBhbmVsRnVuYzogKHBhcmFtczogSVRvb2x0aXBBbmRQYW5lbFBhcmFtcykgPT4gSFRNTEVsZW1lbnQsXG4gIGxpbmVzR3JpZEZ1bmM/OiAoZGY6IERHLkRhdGFGcmFtZSwgcGFpckNvbE5hbWVzOiBzdHJpbmdbXSkgPT4gREcuR3JpZCxcbiAgc2VxU3BhY2VPcHRpb25zPzogYW55KSA6IFByb21pc2U8REcuVmlld2VyPiB7XG4gXG4gIGNvbnN0IHNpbWlsYXJpdHlMaW1pdCA9IHNpbWlsYXJpdHkgLyAxMDA7XG4gIGNvbnN0IGRpbWVuc2lvbmFsaXR5UmVkdWNlQ29sID0gZW5jb2RlZENvbCA/PyBzZXFDb2w7XG4gIGxldCB6b29tID0gZmFsc2U7XG4gIGxldCBpZ25vcmVTZWxlY3Rpb25DaGFuZ2UgPSBmYWxzZTtcbiAgY29uc3QgY2FzaGVkTGluZXNEYXRhOiBhbnkgPSB7fTtcbiAgbGV0IGFjYzogREcuQWNjb3JkaW9uO1xuICBsZXQgdGltZXI6IE5vZGVKUy5UaW1lb3V0O1xuXG4gIGNvbnN0IHdpdGhvdXRFbXB0eVZhbHVlcyA9IERHLkRhdGFGcmFtZS5mcm9tQ29sdW1ucyhbZGltZW5zaW9uYWxpdHlSZWR1Y2VDb2xdKS5jbG9uZSgpO1xuXG4gIGNvbnN0IGVtcHR5VmFsc0lkeHMgPSByZW1vdmVFbXB0eVN0cmluZ1Jvd3Mod2l0aG91dEVtcHR5VmFsdWVzLCBkaW1lbnNpb25hbGl0eVJlZHVjZUNvbCk7XG5cbiAgY29uc3Qgc2VxU3BhY2VQYXJhbXMgPSB7XG4gICAgc2VxQ29sOiB3aXRob3V0RW1wdHlWYWx1ZXMuY29sKGRpbWVuc2lvbmFsaXR5UmVkdWNlQ29sLm5hbWUpISxcbiAgICBtZXRob2ROYW1lOiBtZXRob2ROYW1lLFxuICAgIHNpbWlsYXJpdHlNZXRyaWM6IHNpbWlsYXJpdHlNZXRyaWMsXG4gICAgZW1iZWRBeGVzTmFtZXM6IGF4ZXNOYW1lcyxcbiAgICBvcHRpb25zOiBzZXFTcGFjZU9wdGlvbnMsXG4gIH07XG5cbiAgY29uc3QgeyBkaXN0YW5jZSwgY29vcmRpbmF0ZXMgfSA9IGF3YWl0IHNlcVNwYWNlRnVuYyhzZXFTcGFjZVBhcmFtcyk7XG4gIGNvbnN0IGNvb3Jkc1dpdGhJbnNlcnRlZEVtcHR5VmFscyA9IGdldEVtYmVkZGluZ0NvbHNXaXRoSW5zZXJ0ZWRFbXB0eVZhbHMoY29vcmRpbmF0ZXMsIGVtcHR5VmFsc0lkeHMsIGRmLnJvd0NvdW50KTtcbiAgZm9yIChjb25zdCBjb2wgb2YgY29vcmRzV2l0aEluc2VydGVkRW1wdHlWYWxzKSB7XG4gICAgZGYuY29sdW1ucy5hZGQoY29sKTtcbiAgfVxuXG4gIGNvbnN0IHNpbUFyciA9IGF3YWl0IGNyZWF0ZVNpbWlsYXJpdGllc01hdHJpeChkaW1lbnNpb25hbGl0eVJlZHVjZUNvbCwgZGlzdGFuY2UsXG4gICAgIWRpc3RhbmNlIHx8IGVtcHR5VmFsc0lkeHMubGVuZ3RoICE9PSAwIHx8IG5vbk5vcm1hbGl6ZWREaXN0YW5jZXMuaW5jbHVkZXMoc2ltaWxhcml0eU1ldHJpYyksIHNpbU1hdHJpeEZ1bmMpO1xuICBcbiAgY29uc3QgY2xpZmZzTWV0cmljczogSUFjdGl2aXR5Q2xpZmZzTWV0cmljcyA9IGdldEFjdGl2aXR5Q2xpZmZzTWV0cmljcyhzaW1BcnIsIHNpbWlsYXJpdHlMaW1pdCwgYWN0aXZpdGllcyk7XG5cbiAgY29uc3Qgc2FsaTogREcuQ29sdW1uID0gZ2V0U2FsaUNvdW50Q29sKGRpbWVuc2lvbmFsaXR5UmVkdWNlQ29sLmxlbmd0aCwgY2xpZmZzTWV0cmljcy5zYWxpVmFscywgY2xpZmZzTWV0cmljcy5uMSxcbiAgICBjbGlmZnNNZXRyaWNzLm4yLCBheGVzTmFtZXMsIGFjdGl2aXRpZXMpO1xuICBkZi5jb2x1bW5zLmFkZChzYWxpKTtcblxuICBjb25zdCBjbGlmZkNvbDogREcuQ29sdW1uID0gZ2V0Q2xpZmZzQm9vbGVhbkNvbChkZiwgY2xpZmZzTWV0cmljcy5jbGlmZnNNb2xJZHMpO1xuICBkZi5jb2x1bW5zLmFkZChjbGlmZkNvbCk7XG5cbiAgY29uc3Qgc2FsaU1pbk1heCA9IGdldFNhbGlNaW5NYXgoY2xpZmZzTWV0cmljcy5zYWxpVmFscyk7XG4gIGNvbnN0IHNhbGlPcGFjaXR5Q29lZiA9IDAuOC8oc2FsaU1pbk1heC5tYXggLSBzYWxpTWluTWF4Lm1pbik7O1xuXG4gIGNvbnN0IHZpZXcgPSBncm9rLnNoZWxsLmdldFRhYmxlVmlldyhkZi5uYW1lKTtcbiAgdmlldy5ncmlkLmNvbHVtbnMuYnlOYW1lKGNsaWZmQ29sLm5hbWUpIS52aXNpYmxlID0gZmFsc2U7XG4gIGNvbnN0IHNwID0gdmlldy5hZGRWaWV3ZXIoREcuVklFV0VSLlNDQVRURVJfUExPVCwge1xuICAgIHhDb2x1bW5OYW1lOiBheGVzTmFtZXNbMF0sXG4gICAgeUNvbHVtbk5hbWU6IGF4ZXNOYW1lc1sxXSxcbiAgICBzaXplOiBzYWxpLm5hbWUsXG4gICAgY29sb3I6IGFjdGl2aXRpZXMubmFtZSxcbiAgICBzaG93WFNlbGVjdG9yOiBmYWxzZSxcbiAgICBzaG93WVNlbGVjdG9yOiBmYWxzZSxcbiAgICBzaG93U2l6ZVNlbGVjdG9yOiBmYWxzZSxcbiAgICBzaG93Q29sb3JTZWxlY3RvcjogZmFsc2UsXG4gICAgbWFya2VyTWluU2l6ZTogNSxcbiAgICBtYXJrZXJNYXhTaXplOiAyNSxcbiAgICB0aXRsZTogc2NhdHRlclRpdGxlLFxuICB9KSBhcyBERy5TY2F0dGVyUGxvdFZpZXdlcjtcblxuICBjb25zdCBjYW52YXMgPSAoc3AuZ2V0SW5mbygpIGFzIGFueSlbJ2NhbnZhcyddO1xuICBjb25zdCBsaW5lc1JlcyA9IGNyZWF0ZUxpbmVzKGNsaWZmc01ldHJpY3MsIHNlcUNvbCwgYWN0aXZpdGllcywgc2VtVHlwZSwgdGFncyk7XG5cbiAgY29uc3QgbGluZXNEZkdyaWQgPSBsaW5lc0dyaWRGdW5jID9cbiAgbGluZXNHcmlkRnVuYyhsaW5lc1Jlcy5saW5lc0RmLCBMSU5FU19ERl9NT0xfQ09MU19OQU1FUykuc29ydChbTElORVNfREZfU0FMSV9DT0xfTkFNRV0sIFtmYWxzZV0pIDpcbiAgbGluZXNSZXMubGluZXNEZi5wbG90LmdyaWQoKS5zb3J0KFtMSU5FU19ERl9TQUxJX0NPTF9OQU1FXSwgW2ZhbHNlXSk7XG5cbiAgY29uc3QgbGlzdENsaWZmc0xpbmsgPSB1aS5idXR0b24oYCR7bGluZXNSZXMubGluZXNEZi5yb3dDb3VudH0gY2xpZmZzYCwgKCkgPT4ge1xuICAgIHZpZXcuZG9ja01hbmFnZXIuZG9jayhsaW5lc0RmR3JpZC5yb290LCAnZG93bicsIG51bGwsICdBY3Rpdml0eSBjbGlmZnMnLCAwLjIpO1xuICB9KTtcbiAgbGlzdENsaWZmc0xpbmsuY2xhc3NMaXN0LmFkZCgnc2NhdHRlcl9wbG90X2xpbmsnLCAnY2xpZmZzX2dyaWQnKTtcbiAgc3Aucm9vdC5hcHBlbmQobGlzdENsaWZmc0xpbmspO1xuXG4gIC8qIGluIGNhc2Ugc2V2ZXJhbCBhY3Rpdml0eSBjbGlmZnMgdmlld2VycyBhcmUgb3BlbmVkIGNsaWZmcyBmaWx0ZXJpbmcgY2FuIFxuICBiZSBhcHBseWVkIG9ubHkgdG8gb25lIG9mIHRoZSB2aWV3ZXJzLiBXaGVuICdTaG93IG9ubHkgY2xpZmZzJyBpcyBzd2l0Y2hlZCBvbiBvbmUgb2YgdGhlIHZpZXdlcnNcbiAgc3dpdGNoIGlucHV0cyBvbiBvdGhlciB2aWV3ZXJzIGFyZSBkaXNhYmxlZCAqL1xuICBjb25zdCBmaWx0ZXJDbGlmZnNCdXR0b24gPSB1aS5zd2l0Y2hJbnB1dChgU2hvdyBvbmx5IGNsaWZmc2AsIGZhbHNlLCAoKSA9PiB7XG4gICAgaWYgKGZpbHRlckNsaWZmc0J1dHRvbi52YWx1ZSkge1xuICAgICAgc3AuZGF0YUZyYW1lLnNldFRhZyhDTElGRlNfRklMVEVSX0FQUExJRUQsIGNsaWZmQ29sLm5hbWUpO1xuICAgICAgZGYuZmlsdGVyLmNvcHlGcm9tKGNyZWF0ZUNsaWZmc09ubHlGaWx0ZXIoZGYsIGNsaWZmQ29sLm5hbWUpKTtcbiAgICAgIGZpbHRlckNsaWZmc1N1YmoubmV4dChjbGlmZkNvbC5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3AuZGF0YUZyYW1lLnNldFRhZyhDTElGRlNfRklMVEVSX0FQUExJRUQsICcnKTtcbiAgICAgIGRmLmZpbHRlci5zZXRBbGwodHJ1ZSwgdHJ1ZSk7XG4gICAgICBmaWx0ZXJDbGlmZnNTdWJqLm5leHQoJycpO1xuICAgIH1cbiAgfSk7XG4gIGZpbHRlckNsaWZmc0J1dHRvbi5yb290LmNsYXNzTGlzdC5hZGQoJ3NjYXR0ZXJfcGxvdF9saW5rJywgJ3Nob3dfb25seV9jbGlmZnMnKTtcbiAgc3Aucm9vdC5hcHBlbmQoZmlsdGVyQ2xpZmZzQnV0dG9uLnJvb3QpO1xuXG4gIGZpbHRlckNsaWZmc1N1Ymouc3Vic2NyaWJlKChzOiBzdHJpbmcpID0+IHtcbiAgICBpZiAocyAhPT0gJycpIHtcbiAgICAgIGlmIChzICE9PSBjbGlmZkNvbC5uYW1lKVxuICAgICAgICBmaWx0ZXJDbGlmZnNCdXR0b24uZW5hYmxlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWx0ZXJDbGlmZnNCdXR0b24uZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuICB9KVxuXG4gIC8vY2xvc2luZyBkb2NrZWQgZ3JpZCB3aGVuIHZpZXdlciBpcyBjbG9zZWRcbiAgY29uc3Qgdmlld2VyQ2xvc2VkU3ViID0gZ3Jvay5ldmVudHMub25WaWV3ZXJDbG9zZWQuc3Vic2NyaWJlKCh2KSA9PiB7XG4gICAgLy9AdHMtaWdub3JlXG4gICAgaWYodi5hcmdzLnZpZXdlciA9PT0gc3ApIHtcbiAgICAgIHZpZXcuZG9ja01hbmFnZXIuY2xvc2UobGluZXNEZkdyaWQucm9vdCk7XG4gICAgICB2aWV3ZXJDbG9zZWRTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIHZpZXcuc3VicyA9IHZpZXcuc3Vicy5maWx0ZXIoKHN1YikgPT4gc3ViICE9PSB2aWV3ZXJDbG9zZWRTdWIpO1xuICAgIH0gIFxuICB9KVxuICB2aWV3LnN1YnMucHVzaCh2aWV3ZXJDbG9zZWRTdWIpO1xuXG5cbiAgbGluZXNSZXMubGluZXNEZi5vbkN1cnJlbnRDZWxsQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgIHpvb20gPSB0cnVlO1xuICAgIGNvbnN0IGN1cnJlbnRNb2xJZHggPSBsaW5lc1Jlcy5saW5lc0RmLmN1cnJlbnRDb2wgJiYgbGluZXNSZXMubGluZXNEZi5jdXJyZW50Q29sLm5hbWUgPT09IExJTkVTX0RGX01PTF9DT0xTX05BTUVTWzFdID8gMSA6IDA7XG4gICAgY29uc3QgbGluZSA9IGxpbmVzUmVzLmxpbmVzRGYuY3VycmVudFJvd0lkeCAhPT0gLTEgPyBsaW5lc1Jlcy5saW5lc1tsaW5lc1Jlcy5saW5lc0RmLmN1cnJlbnRSb3dJZHhdIDogbnVsbDtcbiAgICBzcC5kYXRhRnJhbWUuY3VycmVudFJvd0lkeCA9IGxpbmUgPyBsaW5lLm1vbHNbY3VycmVudE1vbElkeF0gOiAtMTtcbiAgICBzcC5kYXRhRnJhbWUuZmlsdGVyLnNldCgwLCAhbGluZXNSZXMubGluZXNbMF0uc2VsZWN0ZWQpOyAvL2NhbGxpbmcgZmlsdGVyIHRvIGZvcmNlIHNjYXR0ZXIgcGxvdCByZS1yZW5kZXJpbmdcbiAgICBzcC5kYXRhRnJhbWUuZmlsdGVyLnNldCgwLCBsaW5lc1Jlcy5saW5lc1swXS5zZWxlY3RlZCk7XG4gICAgaWYgKGxpbmUpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB1cGRhdGVQcm9wZXJ0eVBhbmVsKGRmLCBhY2MsIGNhc2hlZExpbmVzRGF0YSwgbGluZSwgc2VxQ29sLCBhY3Rpdml0aWVzLFxuICAgICAgICAgIGxpbmVzUmVzLmxpbmVzRGYuZ2V0KExJTkVTX0RGX1NBTElfQ09MX05BTUUsIGxpbmUuaWQpLCBwcm9wZXJ0eVBhbmVsRnVuYyk7XG4gICAgICAgIGNvbnN0IG9yZGVyID0gc3AuZGF0YUZyYW1lLmdldFNvcnRlZE9yZGVyKHZpZXcuZ3JpZC5zb3J0QnlDb2x1bW5zLCB2aWV3LmdyaWQuc29ydFR5cGVzKTtcbiAgICAgICAgdmlldy5ncmlkLnNjcm9sbFRvQ2VsbChzZXFDb2wubmFtZSwgb3JkZXIuaW5kZXhPZihzcC5kYXRhRnJhbWUuY3VycmVudFJvd0lkeCkpO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfVxuICB9KTtcblxuICBsaW5lc1Jlcy5saW5lc0RmLm9uU2VsZWN0aW9uQ2hhbmdlZC5zdWJzY3JpYmUoKF86IGFueSkgPT4ge1xuICAgIGlmIChsaW5lc1Jlcy5saW5lc0RmLnNlbGVjdGlvbi5hbnlUcnVlID09PSBmYWxzZSkgeyAvL2Nhc2Ugd2hlbiBzZWxlY3Rpb24gaXMgcmVzZXQgYnkgcHVzaGluZyBFc2NcbiAgICAgIGxpbmVzUmVzLmxpbmVzLmZvckVhY2goKGwpID0+IHsgbC5zZWxlY3RlZCA9IGZhbHNlOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGxpbmVzUmVzLmxpbmVzRGYubW91c2VPdmVyUm93SWR4ICE9PSAtMSkge1xuICAgICAgICBjb25zdCBsaW5lID0gbGluZXNSZXMubGluZXNbbGluZXNSZXMubGluZXNEZi5tb3VzZU92ZXJSb3dJZHhdO1xuICAgICAgICBsaW5lLnNlbGVjdGVkID0gIWxpbmUuc2VsZWN0ZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gREcuQml0U2V0LmNyZWF0ZShkZi5yb3dDb3VudCk7XG4gICAgICBsaW5lc1Jlcy5saW5lcy5mb3JFYWNoKChsKSA9PiB7XG4gICAgICAgIGlmIChsLnNlbGVjdGVkKSB7XG4gICAgICAgICAgbC5tb2xzLmZvckVhY2goKG0pID0+IHtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5zZXQobSwgbC5zZWxlY3RlZCwgdHJ1ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZGYuc2VsZWN0aW9uLmNvcHlGcm9tKHNlbGVjdGlvbik7XG4gICAgICB2aWV3LmdyaWQuaW52YWxpZGF0ZSgpO1xuICAgIH0sIDMwMCk7IC8vdGltZW91dCBpcyByZXF1aXJlZCBiZWNhdXNlIG9mIHJlc2V0dGluZyBzZWxlY3Rpb24gYnkgY2xpY2tpbmcgb24gc2NhdHRlciBwbG90LiBGaXJzdCBzZWxlY3Rpb24gaXMgcmVzZXQgYW5kIGFmdGVyIGl0IGlzIHNldCBhZ2FpbiB1c2luZyBieSB0aGlzIG1ldGhvZFxuICB9KTtcblxuICBkZi5vblNlbGVjdGlvbkNoYW5nZWQuc3Vic2NyaWJlKChlOiBhbnkpID0+IHtcbiAgICBpZiAoaWdub3JlU2VsZWN0aW9uQ2hhbmdlKSB7XG4gICAgICBpZ25vcmVTZWxlY3Rpb25DaGFuZ2UgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRmLnNlbGVjdGlvbi5hbnlUcnVlID09PSBmYWxzZSAmJiB0eXBlb2YgZSA9PT0gJ251bWJlcicpIHsgLy9jYXRjaGluZyBldmVudCB3aGVuIGluaXRpYWwgZGYgc2VsZWN0aW9uIGlzIHJlc2V0IGJ5IHB1c2hpbmcgRXNjXG4gICAgICAgIGxpbmVzUmVzLmxpbmVzLmZvckVhY2goKGwpID0+IHtsLnNlbGVjdGVkID0gZmFsc2U7IH0pO1xuICAgICAgICBsaW5lc0RmR3JpZC5kYXRhRnJhbWUuc2VsZWN0aW9uLnNldEFsbChmYWxzZSwgZmFsc2UpO1xuICAgICAgICBsaW5lc0RmR3JpZC5pbnZhbGlkYXRlKCk7XG4gICAgICB9IFxuICAgIH1cbiAgfSk7XG5cbiAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGZ1bmN0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB0aW1lciA9IGdsb2JhbC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbGluZSA9IGNoZWNrQ3Vyc29yT25MaW5lKGV2ZW50LCBjYW52YXMsIGxpbmVzUmVzLmxpbmVzKTtcbiAgICAgIGlmIChsaW5lICYmIGRmLm1vdXNlT3ZlclJvd0lkeCA9PT0gLTEpIHtcbiAgICAgICAgdWkudG9vbHRpcC5zaG93KHRvb2x0aXBGdW5jKHtjYXNoZWREYXRhOiBjYXNoZWRMaW5lc0RhdGEsIGxpbmU6IGxpbmUsIGRmOiBkZiwgc2VxQ29sOiBzZXFDb2wsXG4gICAgICAgICAgYWN0aXZpdHlDb2w6IGFjdGl2aXRpZXN9KSwgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgICB9XG4gICAgfSwgNTAwKTtcbiAgfSk7XG5cbiAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGZ1bmN0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWdub3JlU2VsZWN0aW9uQ2hhbmdlID0gdHJ1ZTsgLy9jbGlja2luZyBvbiBhIHNjYXR0ZXIgcGxvdCBsZWFkcyB0byBzZWxlY3Rpb24gcmVzZXQuIFZhcmlhYmxlIGlzIHJlcXVpcmVkIHRvIHByZXZlbnQgZnJvbSByZXNldHRpbmcgKGlzIHVzZWQgaW4gZGYub25TZWxlY3Rpb25DaGFuZ2VkLnN1YnNjcmliZSlcbiAgICBjb25zdCBsaW5lID0gY2hlY2tDdXJzb3JPbkxpbmUoZXZlbnQsIGNhbnZhcywgbGluZXNSZXMubGluZXMpO1xuICAgIGlmIChsaW5lICYmIGRmLm1vdXNlT3ZlclJvd0lkeCA9PT0gLTEpIHtcbiAgICAgIGlmIChldmVudC5jdHJsS2V5KSB7XG4gICAgICAgIGxpbmUuc2VsZWN0ZWQgPSAhbGluZS5zZWxlY3RlZDtcbiAgICAgICAgbGluZXNSZXMubGluZXNEZi5zZWxlY3Rpb24uc2V0KGxpbmUuaWQsIGxpbmUuc2VsZWN0ZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGxpbmVzUmVzLmxpbmVzRGYuY3VycmVudFJvd0lkeCAhPT0gbGluZS5pZCkge1xuICAgICAgICAgIGxpbmVzUmVzLmxpbmVzRGYuY3VycmVudFJvd0lkeCA9IGxpbmUuaWQ7XG4gICAgICAgICAgZGYuY3VycmVudFJvd0lkeCA9IGxpbmUubW9sc1swXTtcbiAgICAgICAgICBkZi5maWx0ZXIuc2V0KDAsICFsaW5lc1Jlcy5saW5lc1swXS5zZWxlY3RlZCk7IC8vY2FsbGluZyBmaWx0ZXIgdG8gZm9yY2Ugc2NhdHRlciBwbG90IHJlLXJlbmRlcmluZ1xuICAgICAgICAgIGRmLmZpbHRlci5zZXQoMCwgbGluZXNSZXMubGluZXNbMF0uc2VsZWN0ZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBvcmRlciA9IGxpbmVzUmVzLmxpbmVzRGYuZ2V0U29ydGVkT3JkZXIobGluZXNEZkdyaWQuc29ydEJ5Q29sdW1ucywgbGluZXNEZkdyaWQuc29ydFR5cGVzKTtcbiAgICAgIGxpbmVzRGZHcmlkLnNjcm9sbFRvQ2VsbChMSU5FU19ERl9NT0xfQ09MU19OQU1FU1swXSwgb3JkZXIuaW5kZXhPZihsaW5lLmlkKSk7XG4gICAgfVxuICB9KTtcblxuICBzcC5vbkV2ZW50KCdkNC1iZWZvcmUtZHJhdy1zY2VuZScpXG4gICAgLnN1YnNjcmliZSgoXzogYW55KSA9PiB7XG4gICAgICBjb25zdCBsaW5lcyA9IHJlbmRlckxpbmVzKHNwLFxuICAgICAgICBheGVzTmFtZXNbMF0sIGF4ZXNOYW1lc1sxXSwgbGluZXNSZXMsIGNsaWZmc01ldHJpY3Muc2FsaVZhbHMsIHNhbGlPcGFjaXR5Q29lZiwgc2FsaU1pbk1heC5taW4pO1xuICAgICAgaWYgKHpvb20pIHtcbiAgICAgICAgY29uc3QgY3VycmVudExpbmUgPSBsaW5lc1tsaW5lc1Jlcy5saW5lc0RmLmN1cnJlbnRSb3dJZHhdO1xuICAgICAgICBzZXRUaW1lb3V0KCgpPT4ge1xuICAgICAgICAgIGNvbnN0IHt6b29tTGVmdCwgem9vbVJpZ2h0LCB6b29tVG9wLCB6b29tQm90dG9tfSA9IGdldFpvb21Db29yZGluYXRlcyhcbiAgICAgICAgICAgIHNwLnZpZXdwb3J0LndpZHRoLFxuICAgICAgICAgICAgc3Audmlld3BvcnQuaGVpZ2h0LFxuICAgICAgICAgICAgc3AuZGF0YUZyYW1lLmdldChheGVzTmFtZXNbMF0sIGN1cnJlbnRMaW5lLm1vbHNbMF0pLFxuICAgICAgICAgICAgc3AuZGF0YUZyYW1lLmdldChheGVzTmFtZXNbMV0sIGN1cnJlbnRMaW5lLm1vbHNbMF0pLFxuICAgICAgICAgICAgc3AuZGF0YUZyYW1lLmdldChheGVzTmFtZXNbMF0sIGN1cnJlbnRMaW5lLm1vbHNbMV0pLFxuICAgICAgICAgICAgc3AuZGF0YUZyYW1lLmdldChheGVzTmFtZXNbMV0sIGN1cnJlbnRMaW5lLm1vbHNbMV0pLFxuICAgICAgICAgICk7XG4gICAgICAgICAgc3Auem9vbSh6b29tTGVmdCxcbiAgICAgICAgICAgIHpvb21Ub3AsXG4gICAgICAgICAgICB6b29tUmlnaHQsXG4gICAgICAgICAgICB6b29tQm90dG9tKTtcbiAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgem9vbSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGZpbHRlckNsaWZmc0J1dHRvbi52YWx1ZSkge1xuICAgICAgICBkZi5maWx0ZXIuY29weUZyb20oY3JlYXRlQ2xpZmZzT25seUZpbHRlcihkZiwgY2xpZmZDb2wubmFtZSkpO1xuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAgICBpZiAoZmlsdGVyQ2xpZmZzQnV0dG9uLmVuYWJsZWQgPT09IHRydWUpXG4gICAgICAgICAgZGYuZmlsdGVyLnNldEFsbCh0cnVlLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgc3AuYWRkUHJvcGVydHkoJ3NpbWlsYXJpdHlMaW1pdCcsICdkb3VibGUnLCBzaW1pbGFyaXR5TGltaXQpO1xuICBhY2MgPSBjcmVhdGVQb3BlcnR5UGFuZWwoKTtcbiAgcmV0dXJuIHNwO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbGlmZnNPbmx5RmlsdGVyKGRmOiBERy5EYXRhRnJhbWUsIGNvbE5hbWU6IHN0cmluZyk6IERHLkJpdFNldCB7XG4gIGNvbnN0IGZpbHRlciA9IERHLkJpdFNldC5jcmVhdGUoZGYucm93Q291bnQpO1xuICBjb25zdCByYXcgPSBkZi5jb2woY29sTmFtZSkhLmdldFJhd0RhdGEoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXcubGVuZ3RoOyBpKyspIHtcbiAgICBmaWx0ZXIuc2V0KGksICEhcmF3W2ldLCBmYWxzZSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcjtcbn1cblxuZnVuY3Rpb24gZ2V0RW1iZWRkaW5nQ29sc1dpdGhJbnNlcnRlZEVtcHR5VmFscyhjb29yZGluYXRlczogREcuQ29sdW1uTGlzdCwgZW1wdHlWYWxzSWR4czogbnVtYmVyW10sIGxlbmd0aDogbnVtYmVyKTogREcuQ29sdW1uW10ge1xuICBjb25zdCBjb29yZHNXaXRoSW5zZXJ0ZWRFbXB0eVZhbHMgPSBbXTtcbiAgZm9yIChjb25zdCBjb2wgb2YgY29vcmRpbmF0ZXMpIHtcbiAgICBjb25zdCBsaXN0VmFsdWVzID0gY29sLnRvTGlzdCgpO1xuICAgIGVtcHR5VmFsc0lkeHMuZm9yRWFjaCgoaW5kOiBudW1iZXIpID0+IGxpc3RWYWx1ZXMuc3BsaWNlKGluZCwgMCwgbnVsbCkpO1xuICAgIGNvb3Jkc1dpdGhJbnNlcnRlZEVtcHR5VmFscy5wdXNoKERHLkNvbHVtbi5mbG9hdChjb2wubmFtZSwgbGVuZ3RoKS5pbml0KChpKSA9PiBsaXN0VmFsdWVzW2ldKSk7XG4gIH1cbiAgcmV0dXJuIGNvb3Jkc1dpdGhJbnNlcnRlZEVtcHR5VmFscztcbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2ltaWxhcml0aWVzTWF0cml4KGNvbDogREcuQ29sdW1uLCBkaXN0YW5jZTogTWF0cml4LCBjb3VudEZyb21EaXN0YW5jZTogYm9vbGVhbixcbiAgc2ltTWF0cml4RnVuYzogKGRpbTogbnVtYmVyLCBzZXFDb2w6IERHLkNvbHVtbiwgZGY6IERHLkRhdGFGcmFtZSwgY29sTmFtZTogc3RyaW5nLCBzaW1BcnI6IERHLkNvbHVtbltdKSA9PiBQcm9taXNlPERHLkNvbHVtbltdPik6UHJvbWlzZTxERy5Db2x1bW5bXT4ge1xuICBjb25zdCBjYXRzID0gY29sLmNhdGVnb3JpZXM7XG4gIGNvbnN0IHJhdyA9IGNvbC5nZXRSYXdEYXRhKCk7XG4gIGNvbnN0IG5ld0NvbCA9IERHLkNvbHVtbi5zdHJpbmcoJ3NlcScsIGNvbC5sZW5ndGgpLmluaXQoKGkpID0+IGNhdHNbcmF3W2ldXSk7XG4gIGNvbnN0IGRmU2VxID0gREcuRGF0YUZyYW1lLmZyb21Db2x1bW5zKFtuZXdDb2xdKTtcbiAgY29uc3QgZGltID0gY29sLmxlbmd0aDtcbiAgbGV0IHNpbUFycjogREcuQ29sdW1uW10gPSBBcnJheShkaW0gLSAxKTtcblxuICBpZiAoY291bnRGcm9tRGlzdGFuY2UpIHtcbiAgICBzaW1BcnIgPSBhd2FpdCBzaW1NYXRyaXhGdW5jKGRpbSwgY29sLCBkZlNlcSwgJ3NlcScsIHNpbUFycik7XG4gIH0gZWxzZSB7XG4gICAgZ2V0U2ltaWxhcml0aWVzRnJvbURpc3RhbmNlcyhkaW0sIGRpc3RhbmNlLCBzaW1BcnIpO1xuICB9XG5cbiAgcmV0dXJuIHNpbUFycjtcbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZpdHlDbGlmZnNNZXRyaWNzKHNpbUFycjogREcuQ29sdW1uW10sIHNpbWlsYXJpdHlMaW1pdDogbnVtYmVyLCBhY3Rpdml0aWVzOiBERy5Db2x1bW4pOiBJQWN0aXZpdHlDbGlmZnNNZXRyaWNzIHtcbiAgY29uc3Qgc2ltVmFsczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3Qgc2FsaVZhbHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IG4xOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBuMjogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgY2xpZmZzTW9sSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgIT0gc2ltQXJyLmxlbmd0aDsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogIT0gc2ltQXJyLmxlbmd0aCAtIGk7ICsraikge1xuICAgICAgY29uc3Qgc2ltOiBudW1iZXIgPSBzaW1BcnJbaV0gPyBzaW1BcnJbaV0uZ2V0KGopIDogMDtcblxuICAgICAgaWYgKHNpbSA+PSBzaW1pbGFyaXR5TGltaXQpIHtcbiAgICAgICAgbjEucHVzaChpKTtcbiAgICAgICAgbjIucHVzaChpICsgaiArIDEpO1xuICAgICAgICBjbGlmZnNNb2xJZHMuYWRkKGkpO1xuICAgICAgICBjbGlmZnNNb2xJZHMuYWRkKGkgKyBqICsgMSk7XG4gICAgICAgIHNpbVZhbHMucHVzaChzaW0pO1xuICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5hYnMoYWN0aXZpdGllcy5nZXQoaSkgLSBhY3Rpdml0aWVzLmdldChpICsgaiArIDEpKTtcbiAgICAgICAgaWYgKHNpbSAhPSAxKSB7XG4gICAgICAgICAgc2FsaVZhbHMucHVzaChkaWZmIC8gKDEgLSBzaW0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzYWxpVmFscy5wdXNoKEluZmluaXR5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7c2ltVmFsczogc2ltVmFscywgc2FsaVZhbHM6IHNhbGlWYWxzLCBuMTogbjEsIG4yOiBuMiwgY2xpZmZzTW9sSWRzOiBjbGlmZnNNb2xJZHN9O1xufVxuXG5mdW5jdGlvbiBnZXRTYWxpTWluTWF4KHNhbGlWYWxzOiBudW1iZXJbXSk6IElTYWxpTGltcyB7XG4gIGNvbnN0IHNhbGlWYWxzV2l0aG91dEluZmluaXR5ID0gc2FsaVZhbHMuZmlsdGVyKChpdCkgPT4gaXQgIT09IEluZmluaXR5KTtcbiAgY29uc3Qgc2FsaU1pbiA9IE1hdGgubWluKC4uLnNhbGlWYWxzV2l0aG91dEluZmluaXR5KTtcbiAgY29uc3Qgc2FsaU1heCA9IE1hdGgubWF4KC4uLnNhbGlWYWxzV2l0aG91dEluZmluaXR5KTtcbiAgcmV0dXJuIHttYXg6IHNhbGlNYXgsIG1pbjogc2FsaU1pbn07XG59XG5cbmZ1bmN0aW9uIGdldFNhbGlDb3VudENvbChsZW5ndGg6IG51bWJlciwgc2FsaVZhbHM6IG51bWJlcltdLCBuMTogbnVtYmVyW10sIG4yOiBudW1iZXJbXSxcbiAgYXhlc05hbWVzOiBzdHJpbmdbXSwgYWN0aXZpdGllczogREcuQ29sdW1uKTogREcuQ29sdW1uIHtcbiAgY29uc3Qgc2FsaUNvdW50ID0gbmV3IEFycmF5KGxlbmd0aCkuZmlsbCgwKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSAhPSBuMS5sZW5ndGg7ICsraSkge1xuICAgIGlmIChzYWxpVmFsc1tpXSAhPSBJbmZpbml0eSkge1xuICAgICAgaWYgKGFjdGl2aXRpZXMuZ2V0KG4xW2ldKSA+IGFjdGl2aXRpZXMuZ2V0KG4yW2ldKSkge1xuICAgICAgICBzYWxpQ291bnRbbjFbaV1dICs9IHNhbGlWYWxzW2ldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2FsaUNvdW50W24yW2ldXSArPSBzYWxpVmFsc1tpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gREcuQ29sdW1uLmZyb21MaXN0KCdkb3VibGUnLCBgc2FsaV8ke2F4ZXNOYW1lc1swXS5zdWJzdHJpbmcoYXhlc05hbWVzWzBdLmxhc3RJbmRleE9mKCdfJykpfWAsIHNhbGlDb3VudCk7XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlUG9wZXJ0eVBhbmVsKCk6IERHLkFjY29yZGlvbiB7XG4gIGNvbnN0IGFjYyA9IHVpLmFjY29yZGlvbigpO1xuICBjb25zdCBhY2NJY29uID0gdWkuZWxlbWVudCgnaScpO1xuICBhY2NJY29uLmNsYXNzTmFtZSA9ICdncm9rLWljb24gc3ZnLWljb24gc3ZnLXZpZXctbGF5b3V0JztcbiAgYWNjLmFkZFRpdGxlKHVpLnNwYW4oW2FjY0ljb24sIHVpLmxhYmVsKGBBY3Rpdml0eSBjbGlmZnNgKV0pKTtcbiAgYWNjLmFkZFBhbmUoJ0NsaWZmIERldGFpbHMnLCAoKSA9PiB1aS5kaXZUZXh0KCdDbGlmZiBoYXMgbm90IGJlZW4gc2VsZWN0ZWQnKSwgdHJ1ZSk7XG4gIGdyb2suc2hlbGwubyA9IGFjYy5yb290O1xuICByZXR1cm4gYWNjO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVQcm9wZXJ0eVBhbmVsKGRmOiBERy5EYXRhRnJhbWUsIGFjYzogREcuQWNjb3JkaW9uLCBjYXNoZWREYXRhOiBhbnksIGxpbmU6IElMaW5lLCBzZXFDb2w6IERHLkNvbHVtbixcbiAgYWN0aXZpdGllczogREcuQ29sdW1uLCBzYWxpOiBudW1iZXIsIHByb3BQYW5lbEZ1bmM6IChwYXJhbXM6IElUb29sdGlwQW5kUGFuZWxQYXJhbXMpID0+IEhUTUxFbGVtZW50KSB7XG4gIGNvbnN0IHBhbmVsID0gYWNjLmdldFBhbmUoJ0NsaWZmIERldGFpbHMnKTtcbiAgdWkuZW1wdHkocGFuZWwucm9vdCk7XG4gIGNvbnN0IHBhbmVsRWxlbWVudCA9IHByb3BQYW5lbEZ1bmMoe2Nhc2hlZERhdGE6IGNhc2hlZERhdGEsIGxpbmU6IGxpbmUsIGRmOiBkZiwgc2VxQ29sOiBzZXFDb2wsXG4gICAgYWN0aXZpdHlDb2w6IGFjdGl2aXRpZXMsIHNhbGk6IHNhbGl9KTtcbiAgcGFuZWwucm9vdC5hcHBlbmQocGFuZWxFbGVtZW50KTtcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgZ3Jvay5zaGVsbC5vID0gYWNjLnJvb3Q7XG4gIH0sIDUwMCk7XG59XG5cbmZ1bmN0aW9uIGdldFpvb21Db29yZGluYXRlcyhXMDogbnVtYmVyLCBIMDogbnVtYmVyLCB4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyKSB7XG4gIGNvbnN0IFcxID0gTWF0aC5hYnMoeDEgLSB4Mik7XG4gIGNvbnN0IEgxID0gTWF0aC5hYnMoeTEgLSB5Mik7XG4gIGNvbnN0IHNjYWxlVyA9IFcwIC8gVzE7XG4gIGNvbnN0IHNjYWxlSCA9IEgwIC8gSDE7XG4gIGNvbnN0IHNjYWxlID0gTWF0aC5taW4oc2NhbGVXLCBzY2FsZUgpO1xuICBjb25zdCBXMiA9IChXMCAvIHNjYWxlKSAqIDU7XG4gIGNvbnN0IEgyID0gKEgwIC8gc2NhbGUpICogNTtcbiAgY29uc3QgbGVmdCA9IHgxIDwgeDIgPyB4MSA6IHgyO1xuICBjb25zdCB0b3AgPSB5MSA+IHkyID8geTEgOiB5MjtcbiAgY29uc3Qgem9vbUxlZnQgPSAobGVmdCArIFcxIC8gMikgLSBXMiAvIDI7XG4gIGNvbnN0IHpvb21SaWdodCA9IHpvb21MZWZ0ICsgVzI7XG4gIGNvbnN0IHpvb21Ub3AgPSAodG9wIC0gSDEgLyAyKSArIEgyIC8gMjtcbiAgY29uc3Qgem9vbUJvdHRvbSA9IHpvb21Ub3AgLSBIMjtcbiAgcmV0dXJuIHt6b29tTGVmdDogem9vbUxlZnQsIHpvb21SaWdodDogem9vbVJpZ2h0LCB6b29tVG9wOiB6b29tVG9wLCB6b29tQm90dG9tOiB6b29tQm90dG9tfTtcbn1cblxuZnVuY3Rpb24gY2hlY2tDdXJzb3JPbkxpbmUoZXZlbnQ6IGFueSwgY2FudmFzOiBhbnksIGxpbmVzOiBJTGluZVtdKTogSUxpbmUgfCBudWxsIHtcbiAgY29uc3QgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQ7XG4gIGNvbnN0IHkgPSBldmVudC5jbGllbnRZIC0gcmVjdC50b3A7XG4gIGxldCBjbG9zZXN0TGluZSA9IG51bGw7XG4gIGxldCBtaW5EaXN0ID0gMDtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgY29uc3QgZGlzdCA9XG4gICAgICBNYXRoLmFicyhNYXRoLmh5cG90KGxpbmUuYVswXSAtIHgsIGxpbmUuYVsxXSAtIHkpICtcbiAgICAgIE1hdGguaHlwb3QobGluZS5iWzBdIC0geCwgbGluZS5iWzFdIC0geSkgLSBNYXRoLmh5cG90KGxpbmUuYVswXSAtIGxpbmUuYlswXSwgbGluZS5hWzFdIC0gbGluZS5iWzFdKSk7XG4gICAgaWYgKCghbWluRGlzdCAmJiBkaXN0IDwgMikgfHwgZGlzdCA8IG1pbkRpc3QpIHtcbiAgICAgIG1pbkRpc3QgPSBkaXN0O1xuICAgICAgY2xvc2VzdExpbmUgPSBsaW5lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2xvc2VzdExpbmU7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckxpbmVzKHNwOiBERy5TY2F0dGVyUGxvdFZpZXdlciwgeEF4aXM6IHN0cmluZywgeUF4aXM6IHN0cmluZywgbGluZXNSZXM6IElSZW5kZXJlZExpbmVzLFxuICBzYWxpVmFsczogbnVtYmVyW10sIHNhbGlPcGFjaXR5Q29lZjogbnVtYmVyLCBzYWxpTWluOiBudW1iZXIpOiBJTGluZSBbXSB7XG4gIGNvbnN0IGxpbmVzID0gbGluZXNSZXMubGluZXM7XG4gIGNvbnN0IGNhbnZhcyA9IChzcC5nZXRJbmZvKCkgYXMge1tpbmRleDogc3RyaW5nXSA6IGFueX0pWydjYW52YXMnXTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykgYXMgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICBjb25zdCB4ID0gc3AuZGF0YUZyYW1lIS5jb2x1bW5zLmJ5TmFtZSh4QXhpcyk7XG4gIGNvbnN0IHkgPSBzcC5kYXRhRnJhbWUhLmNvbHVtbnMuYnlOYW1lKHlBeGlzKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHBvaW50RnJvbSA9IHNwLndvcmxkVG9TY3JlZW4oeC5nZXQobGluZXNbaV0ubW9sc1swXSksIHkuZ2V0KGxpbmVzW2ldLm1vbHNbMF0pKTtcbiAgICBjb25zdCBwb2ludFRvID0gc3Aud29ybGRUb1NjcmVlbih4LmdldChsaW5lc1tpXS5tb2xzWzFdKSwgeS5nZXQobGluZXNbaV0ubW9sc1sxXSkpO1xuICAgIGxpbmVzW2ldLmEgPSBbcG9pbnRGcm9tLngsIHBvaW50RnJvbS55XTtcbiAgICBsaW5lc1tpXS5iID0gW3BvaW50VG8ueCwgcG9pbnRUby55XTtcbiAgICBjb25zdCBsaW5lID0gbmV3IFBhdGgyRCgpO1xuICAgIGxpbmUubW92ZVRvKGxpbmVzW2ldLmFbMF0sIGxpbmVzW2ldLmFbMV0pO1xuICAgIGNvbnN0IGNvbG9yID0gbGluZXNbaV0uc2VsZWN0ZWQgPyAnMjU1LDI1NSwwJyA6ICcwLDEyOCwwJztcbiAgICBjb25zdCBvcGFjaXR5ID0gc2FsaVZhbHNbaV0gPT09IEluZmluaXR5ID8gMSA6IDAuMiArIChzYWxpVmFsc1tpXSAtIHNhbGlNaW4pKnNhbGlPcGFjaXR5Q29lZjtcbiAgICBjdHguc3Ryb2tlU3R5bGUgPSBgcmdiYSgke2NvbG9yfSwke29wYWNpdHl9KWA7XG4gICAgY3R4LmxpbmVXaWR0aCA9IGxpbmVzW2ldLmlkID09PSBsaW5lc1Jlcy5saW5lc0RmLmN1cnJlbnRSb3dJZHggPyAzIDogMTtcbiAgICBsaW5lLmxpbmVUbyhsaW5lc1tpXS5iWzBdLCBsaW5lc1tpXS5iWzFdKTtcbiAgICBjdHguc3Ryb2tlKGxpbmUpO1xuICB9XG4gIHJldHVybiBsaW5lcztcbn1cblxuZnVuY3Rpb24gY3JlYXRlTGluZXMocGFyYW1zOiBJQWN0aXZpdHlDbGlmZnNNZXRyaWNzLCBzZXE6IERHLkNvbHVtbiwgYWN0aXZpdGllczogREcuQ29sdW1uLCBzZW1UeXBlOiBzdHJpbmcsXG4gIHRhZ3M6IHtbaW5kZXg6IHN0cmluZ106IHN0cmluZ30pIDogSVJlbmRlcmVkTGluZXMge1xuICBjb25zdCBsaW5lczogSUxpbmVbXSA9IG5ldyBBcnJheShwYXJhbXMubjEubGVuZ3RoKS5maWxsKG51bGwpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5uMS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG51bTEgPSBwYXJhbXMubjFbaV07XG4gICAgY29uc3QgbnVtMiA9IHBhcmFtcy5uMltpXTtcbiAgICBsaW5lc1tpXSA9ICh7aWQ6IGksIG1vbHM6IFtudW0xLCBudW0yXSwgc2VsZWN0ZWQ6IGZhbHNlLCBhOiBbXSwgYjogW119KTtcbiAgfVxuICBjb25zdCBsaW5lc0RmID0gREcuRGF0YUZyYW1lLmNyZWF0ZShsaW5lcy5sZW5ndGgpO1xuICBMSU5FU19ERl9NT0xfQ09MU19OQU1FUy5mb3JFYWNoKChpdCwgaWR4KSA9PiB7XG4gICAgbGluZXNEZi5jb2x1bW5zLmFkZE5ld1N0cmluZyhpdCkuaW5pdCgoaTogbnVtYmVyKSA9PiBzZXEuZ2V0KGxpbmVzW2ldLm1vbHNbaWR4XSkpO1xuICAgIHNldFRhZ3MobGluZXNEZi5jb2woaXQpISwgdGFncyk7XG4gICAgbGluZXNEZi5jb2woaXQpIS5zZW1UeXBlID0gc2VtVHlwZTtcbiAgfSk7XG4gIGxpbmVzRGYuY29sdW1ucy5hZGROZXdGbG9hdChMSU5FU19ERl9BQ1RfRElGRl9DT0xfTkFNRSlcbiAgICAuaW5pdCgoaTogbnVtYmVyKSA9PiBNYXRoLmFicyhhY3Rpdml0aWVzLmdldChsaW5lc1tpXS5tb2xzWzBdKSAtIGFjdGl2aXRpZXMuZ2V0KGxpbmVzW2ldLm1vbHNbMV0pKSk7XG4gIGxpbmVzRGYuY29sdW1ucy5hZGROZXdJbnQoTElORVNfREZfTElORV9JTkRfQ09MX05BTUUpLmluaXQoKGk6IG51bWJlcikgPT4gaSk7XG4gIGxpbmVzRGYuY29sdW1ucy5hZGROZXdGbG9hdChMSU5FU19ERl9TQUxJX0NPTF9OQU1FKS5pbml0KChpOiBudW1iZXIpID0+IHBhcmFtcy5zYWxpVmFsc1tpXSk7XG4gIGxpbmVzRGYuY29sdW1ucy5hZGROZXdGbG9hdChMSU5FU19ERl9TSU1fQ09MX05BTUUpLmluaXQoKGk6IG51bWJlcikgPT4gcGFyYW1zLnNpbVZhbHNbaV0pO1xuICByZXR1cm4ge2xpbmVzLCBsaW5lc0RmfTtcbn1cblxuZnVuY3Rpb24gc2V0VGFncyhjb2w6IERHLkNvbHVtbiwgdGFnczoge1tpbmRleDogc3RyaW5nXTogc3RyaW5nfSkge1xuICBPYmplY3Qua2V5cyh0YWdzKS5mb3JFYWNoKCh0YWcpID0+IHtcbiAgICBjb2wudGFnc1t0YWddID0gdGFnc1t0YWddO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNpbWlsYXJpdGllc01hdHJpeCggZGltOiBudW1iZXIsIHNlcUNvbDogREcuQ29sdW1uLCBkZlNlcTogREcuRGF0YUZyYW1lLCBzaW1BcnI6IERHLkNvbHVtbltdLFxuICBzaW1GdW5jOiAoY29sOiBERy5Db2x1bW4sIG1vbDogc3RyaW5nKSA9PiBQcm9taXNlPERHLkNvbHVtbiB8IG51bGw+KTogUHJvbWlzZTxERy5Db2x1bW5bXT4ge1xuICBmb3IgKGxldCBpID0gMDsgaSAhPSBkaW0gLSAxOyArK2kpIHtcbiAgICBjb25zdCBtb2wgPSBzZXFDb2wuZ2V0KGkpO1xuICAgIGRmU2VxLnJvd3MucmVtb3ZlQXQoMCwgMSwgZmFsc2UpO1xuICAgIHNpbUFycltpXSA9IChhd2FpdCBzaW1GdW5jKGRmU2VxLmNvbCgnc2VxJykhLCBtb2wpKSE7XG4gIH1cbiAgcmV0dXJuIHNpbUFycjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpbWlsYXJpdGllc0Zyb21EaXN0YW5jZXMoZGltOiBudW1iZXIsIGRpc3RhbmNlczogTWF0cml4LCBzaW1BcnI6IERHLkNvbHVtbltdKVxuICA6IERHLkNvbHVtbltdIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaW0gLSAxOyArK2kpIHtcbiAgICBjb25zdCBzaW1pbGFyaXR5QXJyID0gbmV3IEZsb2F0MzJBcnJheShkaW0gLSBpIC0gMSkuZmlsbCgwKTtcbiAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBkaW07ICsraikge1xuICAgICAgc2ltaWxhcml0eUFycltqIC0gaSAtIDFdID0gZ2V0U2ltaWxhcml0eUZyb21EaXN0YW5jZShkaXN0YW5jZXNbaV1bal0pO1xuICAgIH1cbiAgICBzaW1BcnJbaV0gPSBERy5Db2x1bW4uZnJvbUZsb2F0MzJBcnJheSgnc2ltaWxhcml0eScsIHNpbWlsYXJpdHlBcnIpO1xuICB9XG4gIHJldHVybiBzaW1BcnI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGlmZnNCb29sZWFuQ29sKGRmOiBERy5EYXRhRnJhbWUsIGlkczogU2V0PG51bWJlcj4pOiBERy5Db2x1bW4ge1xuICBjb25zdCBjb2xuYW1lID0gJ2NvbnRhaW5zQ2xpZmYnO1xuICBjb25zdCBjb2xOYW1lSW5kID0gZGYuY29sdW1ucy5uYW1lcygpLmZpbHRlcigoaXQ6IHN0cmluZykgPT4gaXQuaW5jbHVkZXMoY29sbmFtZSkpLmxlbmd0aCArIDE7XG4gIGNvbnN0IG5ld0NvbE5hbWUgPSBgJHtjb2xuYW1lfV8ke2NvbE5hbWVJbmR9YDtcbiAgcmV0dXJuIERHLkNvbHVtbi5ib29sKG5ld0NvbE5hbWUsIGRmLnJvd0NvdW50KS5pbml0KChpKSA9PiBpZHMuaGFzKGkpKTtcbn1cbiJdfQ==","const peq = new Uint32Array(0x10000);\nconst myers_32 = (a, b) => {\n const n = a.length;\n const m = b.length;\n const lst = 1 << (n - 1);\n let pv = -1;\n let mv = 0;\n let sc = n;\n let i = n;\n while (i--) {\n peq[a.charCodeAt(i)] |= 1 << i;\n }\n for (i = 0; i < m; i++) {\n let eq = peq[b.charCodeAt(i)];\n const xv = eq | mv;\n eq |= ((eq & pv) + pv) ^ pv;\n mv |= ~(eq | pv);\n pv &= eq;\n if (mv & lst) {\n sc++;\n }\n if (pv & lst) {\n sc--;\n }\n mv = (mv << 1) | 1;\n pv = (pv << 1) | ~(xv | mv);\n mv &= xv;\n }\n i = n;\n while (i--) {\n peq[a.charCodeAt(i)] = 0;\n }\n return sc;\n};\nconst myers_x = (b, a) => {\n const n = a.length;\n const m = b.length;\n const mhc = [];\n const phc = [];\n const hsize = Math.ceil(n / 32);\n const vsize = Math.ceil(m / 32);\n for (let i = 0; i < hsize; i++) {\n phc[i] = -1;\n mhc[i] = 0;\n }\n let j = 0;\n for (; j < vsize - 1; j++) {\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] |= 1 << k;\n }\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)];\n const pb = (phc[(i / 32) | 0] >>> i) & 1;\n const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0] ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0] ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n }\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m - start) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] |= 1 << k;\n }\n let score = m;\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)];\n const pb = (phc[(i / 32) | 0] >>> i) & 1;\n const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n score += (ph >>> (m - 1)) & 1;\n score -= (mh >>> (m - 1)) & 1;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0] ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0] ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n return score;\n};\nconst distance = (a, b) => {\n if (a.length < b.length) {\n const tmp = b;\n b = a;\n a = tmp;\n }\n if (b.length === 0) {\n return a.length;\n }\n if (a.length <= 32) {\n return myers_32(a, b);\n }\n return myers_x(a, b);\n};\nconst closest = (str, arr) => {\n let min_distance = Infinity;\n let min_index = 0;\n for (let i = 0; i < arr.length; i++) {\n const dist = distance(str, arr[i]);\n if (dist < min_distance) {\n min_distance = dist;\n min_index = i;\n }\n }\n return arr[min_index];\n};\nexport { closest, distance };\n","import * as fl from 'fastest-levenshtein';\nimport { jaroWinkler } from 'jaro-winkler-typescript';\nimport { asymmetricDistance, braunBlanquetDistance, cosineDistance, diceDistance, euclideanDistance, hammingDistance, kulczynskiDistance, mcConnaugheyDistance, rogotGoldbergDistance, russelDistance, sokalDistance, tanimotoDistance, } from './distance-metrics-methods';\nimport { calculateEuclideanDistance } from '@datagrok-libraries/utils/src/vector-operations';\nexport var StringMetricsNames;\n(function (StringMetricsNames) {\n StringMetricsNames[\"Levenshtein\"] = \"Levenshtein\";\n StringMetricsNames[\"JaroWinkler\"] = \"Jaro-Winkler\";\n StringMetricsNames[\"Manhattan\"] = \"Manhattan\";\n})(StringMetricsNames || (StringMetricsNames = {}));\nexport var VectorMetricsNames;\n(function (VectorMetricsNames) {\n VectorMetricsNames[\"Euclidean\"] = \"Euclidean\";\n})(VectorMetricsNames || (VectorMetricsNames = {}));\nexport var BitArrayMetricsNames;\n(function (BitArrayMetricsNames) {\n BitArrayMetricsNames[\"Tanimoto\"] = \"Tanimoto\";\n BitArrayMetricsNames[\"Dice\"] = \"Dice\";\n BitArrayMetricsNames[\"Asymmetric\"] = \"Asymmetric\";\n BitArrayMetricsNames[\"BraunBlanquet\"] = \"Braun-Blanquet\";\n BitArrayMetricsNames[\"Cosine\"] = \"Cosine\";\n BitArrayMetricsNames[\"Kulczynski\"] = \"Kulczynski\";\n BitArrayMetricsNames[\"McConnaughey\"] = \"Mc-Connaughey\";\n BitArrayMetricsNames[\"RogotGoldberg\"] = \"Rogot-Goldberg\";\n BitArrayMetricsNames[\"Russel\"] = \"Russel\";\n BitArrayMetricsNames[\"Sokal\"] = \"Sokal\";\n BitArrayMetricsNames[\"Hamming\"] = \"Hamming\";\n BitArrayMetricsNames[\"Euclidean\"] = \"Euclidean\";\n})(BitArrayMetricsNames || (BitArrayMetricsNames = {}));\nexport const vectorDistanceMetricsMethods = {\n [VectorMetricsNames.Euclidean]: calculateEuclideanDistance,\n};\nexport const stringDistanceMetricsMethods = {\n [StringMetricsNames.Levenshtein]: fl.distance,\n [StringMetricsNames.JaroWinkler]: jaroWinkler,\n [StringMetricsNames.Manhattan]: manhattanDistance,\n};\nexport const bitArrayDistanceMetricsMethods = {\n [BitArrayMetricsNames.Tanimoto]: tanimotoDistance,\n [BitArrayMetricsNames.Dice]: diceDistance,\n [BitArrayMetricsNames.Asymmetric]: asymmetricDistance,\n [BitArrayMetricsNames.BraunBlanquet]: braunBlanquetDistance,\n [BitArrayMetricsNames.Cosine]: cosineDistance,\n [BitArrayMetricsNames.Kulczynski]: kulczynskiDistance,\n [BitArrayMetricsNames.McConnaughey]: mcConnaugheyDistance,\n [BitArrayMetricsNames.RogotGoldberg]: rogotGoldbergDistance,\n [BitArrayMetricsNames.Russel]: russelDistance,\n [BitArrayMetricsNames.Sokal]: sokalDistance,\n [BitArrayMetricsNames.Hamming]: hammingDistance,\n [BitArrayMetricsNames.Euclidean]: euclideanDistance,\n};\nexport var AvailableMetricsTypes;\n(function (AvailableMetricsTypes) {\n AvailableMetricsTypes[\"Vector\"] = \"Vector\";\n AvailableMetricsTypes[\"String\"] = \"String\";\n AvailableMetricsTypes[\"BitArray\"] = \"BitArray\";\n})(AvailableMetricsTypes || (AvailableMetricsTypes = {}));\nexport const AvailableMetrics = {\n [AvailableMetricsTypes.Vector]: {\n [VectorMetricsNames.Euclidean]: vectorDistanceMetricsMethods[VectorMetricsNames.Euclidean],\n },\n [AvailableMetricsTypes.String]: {\n [StringMetricsNames.Levenshtein]: stringDistanceMetricsMethods[StringMetricsNames.Levenshtein],\n [StringMetricsNames.JaroWinkler]: stringDistanceMetricsMethods[StringMetricsNames.JaroWinkler],\n [StringMetricsNames.Manhattan]: stringDistanceMetricsMethods[StringMetricsNames.Manhattan],\n },\n [AvailableMetricsTypes.BitArray]: {\n [BitArrayMetricsNames.Tanimoto]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Tanimoto],\n [BitArrayMetricsNames.Dice]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Dice],\n [BitArrayMetricsNames.Asymmetric]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Asymmetric],\n [BitArrayMetricsNames.BraunBlanquet]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.BraunBlanquet],\n [BitArrayMetricsNames.Cosine]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Cosine],\n [BitArrayMetricsNames.Kulczynski]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Kulczynski],\n [BitArrayMetricsNames.McConnaughey]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.McConnaughey],\n [BitArrayMetricsNames.RogotGoldberg]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.RogotGoldberg],\n [BitArrayMetricsNames.Russel]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Russel],\n [BitArrayMetricsNames.Sokal]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Sokal],\n },\n};\nexport const MetricToDataType = Object.keys(AvailableMetrics)\n .reduce((ret, key) => {\n for (const val of Object.keys(AvailableMetrics[key])) {\n ret[val] = key;\n }\n return ret;\n}, {});\nexport function isStringMetric(name) {\n return MetricToDataType[name] == 'String';\n}\nexport function isBitArrayMetric(name) {\n return MetricToDataType[name] == 'BitArray';\n}\nexport function isVectorMetric(name) {\n return MetricToDataType[name] == 'Vector';\n}\n/** Manhattan distance between two sequences (match - 0, mismatch - 1) normalized for length. */\nexport function manhattanDistance(s1, s2) {\n if (s1.length !== s2.length) {\n return 1;\n }\n else {\n let dist = 0;\n for (let i = 1; i < s1.length; i++) {\n dist += s1[i] == s2[i] ? 0 : 1;\n }\n return dist / s1.length;\n }\n}\n/** Unified class implementing different string measures. */\nexport class Measure {\n /**\n * Creates an instance of Measure with .\n * @param {string} method Method to calculate distance between strings.\n * @memberof Measurer\n */\n constructor(method) {\n this.method = method;\n this.dataType = MetricToDataType[method];\n }\n /**\n * Returns custom string distance function specified.\n * @return {DistanceMetric} Callback of the measure chosen.\n * @memberof Measurer\n */\n getMeasure() {\n const dict = AvailableMetrics;\n return dict[this.dataType][this.method];\n }\n /**\n * Returns custom string distance by the given data type.\n * @param {AvailableDataTypes} dataType Metric's data type\n * @return {string[]} Metric names which expects the given data type\n * @memberof Measurer\n */\n static getMetricByDataType(dataType) {\n return Object.keys(AvailableMetrics[dataType]);\n }\n /** Returns metric names available.\n * @memberof Measurer\n */\n static get availableMeasures() {\n return Object.keys(AvailableMetrics);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWQtbWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInR5cGVkLW1ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsY0FBYyxFQUNkLFlBQVksRUFDWixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxhQUFhLEVBQ2IsZ0JBQWdCLEdBQ2pCLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0saURBQWlELENBQUM7QUFJM0YsTUFBTSxDQUFOLElBQVksa0JBSVg7QUFKRCxXQUFZLGtCQUFrQjtJQUM1QixpREFBMkIsQ0FBQTtJQUMzQixrREFBNEIsQ0FBQTtJQUM1Qiw2Q0FBdUIsQ0FBQTtBQUN6QixDQUFDLEVBSlcsa0JBQWtCLEtBQWxCLGtCQUFrQixRQUk3QjtBQUVELE1BQU0sQ0FBTixJQUFZLGtCQUVYO0FBRkQsV0FBWSxrQkFBa0I7SUFDNUIsNkNBQXVCLENBQUE7QUFDekIsQ0FBQyxFQUZXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFFN0I7QUFFRCxNQUFNLENBQU4sSUFBWSxvQkFhWDtBQWJELFdBQVksb0JBQW9CO0lBQzlCLDZDQUFxQixDQUFBO0lBQ3JCLHFDQUFhLENBQUE7SUFDYixpREFBeUIsQ0FBQTtJQUN6Qix3REFBZ0MsQ0FBQTtJQUNoQyx5Q0FBaUIsQ0FBQTtJQUNqQixpREFBeUIsQ0FBQTtJQUN6QixzREFBOEIsQ0FBQTtJQUM5Qix3REFBZ0MsQ0FBQTtJQUNoQyx5Q0FBaUIsQ0FBQTtJQUNqQix1Q0FBZSxDQUFBO0lBQ2YsMkNBQW1CLENBQUE7SUFDbkIsK0NBQXVC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QUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sS0FBSyxpQkFBaUI7UUFDMUIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZmwgZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5pbXBvcnQge2phcm9XaW5rbGVyfSBmcm9tICdqYXJvLXdpbmtsZXItdHlwZXNjcmlwdCc7XG5pbXBvcnQge0Rpc3RhbmNlTWV0cmljfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge1xuICBhc3ltbWV0cmljRGlzdGFuY2UsXG4gIGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgY29zaW5lRGlzdGFuY2UsXG4gIGRpY2VEaXN0YW5jZSxcbiAgZXVjbGlkZWFuRGlzdGFuY2UsXG4gIGhhbW1pbmdEaXN0YW5jZSxcbiAga3VsY3p5bnNraURpc3RhbmNlLFxuICBtY0Nvbm5hdWdoZXlEaXN0YW5jZSxcbiAgcm9nb3RHb2xkYmVyZ0Rpc3RhbmNlLFxuICBydXNzZWxEaXN0YW5jZSxcbiAgc29rYWxEaXN0YW5jZSxcbiAgdGFuaW1vdG9EaXN0YW5jZSxcbn0gZnJvbSAnLi9kaXN0YW5jZS1tZXRyaWNzLW1ldGhvZHMnO1xuXG5pbXBvcnQge2NhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy92ZWN0b3Itb3BlcmF0aW9ucyc7XG5pbXBvcnQgQml0QXJyYXkgZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvYml0LWFycmF5JztcbmltcG9ydCB7VmVjdG9yLCBTdHJpbmdEaWN0aW9uYXJ5fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5cbmV4cG9ydCBlbnVtIFN0cmluZ01ldHJpY3NOYW1lcyB7XG4gIExldmVuc2h0ZWluID0gJ0xldmVuc2h0ZWluJyxcbiAgSmFyb1dpbmtsZXIgPSAnSmFyby1XaW5rbGVyJyxcbiAgTWFuaGF0dGFuID0gJ01hbmhhdHRhbicsXG59XG5cbmV4cG9ydCBlbnVtIFZlY3Rvck1ldHJpY3NOYW1lcyB7XG4gIEV1Y2xpZGVhbiA9ICdFdWNsaWRlYW4nLFxufVxuXG5leHBvcnQgZW51bSBCaXRBcnJheU1ldHJpY3NOYW1lcyB7XG4gIFRhbmltb3RvID0gJ1Rhbmltb3RvJyxcbiAgRGljZSA9ICdEaWNlJyxcbiAgQXN5bW1ldHJpYyA9ICdBc3ltbWV0cmljJyxcbiAgQnJhdW5CbGFucXVldCA9ICdCcmF1bi1CbGFucXVldCcsXG4gIENvc2luZSA9ICdDb3NpbmUnLFxuICBLdWxjenluc2tpID0gJ0t1bGN6eW5za2knLFxuICBNY0Nvbm5hdWdoZXkgPSAnTWMtQ29ubmF1Z2hleScsXG4gIFJvZ290R29sZGJlcmcgPSAnUm9nb3QtR29sZGJlcmcnLFxuICBSdXNzZWwgPSAnUnVzc2VsJyxcbiAgU29rYWwgPSAnU29rYWwnLFxuICBIYW1taW5nID0gJ0hhbW1pbmcnLFxuICBFdWNsaWRlYW4gPSAnRXVjbGlkZWFuJyxcbn1cblxuZXhwb3J0IGNvbnN0IHZlY3RvckRpc3RhbmNlTWV0cmljc01ldGhvZHM6IHsgW25hbWU6IHN0cmluZ106ICh4OiBWZWN0b3IsIHk6IFZlY3RvcikgPT4gbnVtYmVyIH0gPSB7XG4gIFtWZWN0b3JNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXTogY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3Qgc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kczogeyBbbmFtZTogc3RyaW5nXTogKHg6IHN0cmluZywgeTogc3RyaW5nKSA9PiBudW1iZXIgfSA9IHtcbiAgW1N0cmluZ01ldHJpY3NOYW1lcy5MZXZlbnNodGVpbl06IGZsLmRpc3RhbmNlLFxuICBbU3RyaW5nTWV0cmljc05hbWVzLkphcm9XaW5rbGVyXTogamFyb1dpbmtsZXIsXG4gIFtTdHJpbmdNZXRyaWNzTmFtZXMuTWFuaGF0dGFuXTogbWFuaGF0dGFuRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3QgYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KSA9PiBudW1iZXIgfSA9IHtcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvXTogdGFuaW1vdG9EaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdOiBkaWNlRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYXN5bW1ldHJpY0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQnJhdW5CbGFucXVldF06IGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV06IGNvc2luZURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGt1bGN6eW5za2lEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV06IG1jQ29ubmF1Z2hleURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ106IHJvZ290R29sZGJlcmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IHJ1c3NlbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuU29rYWxdOiBzb2thbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuSGFtbWluZ106IGhhbW1pbmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGV1Y2xpZGVhbkRpc3RhbmNlLFxufTtcblxuZXhwb3J0IGVudW0gQXZhaWxhYmxlTWV0cmljc1R5cGVzIHtcbiAgVmVjdG9yID0gJ1ZlY3RvcicsXG4gIFN0cmluZyA9ICdTdHJpbmcnLFxuICBCaXRBcnJheSA9ICdCaXRBcnJheSdcbn1cblxuZXhwb3J0IGNvbnN0IEF2YWlsYWJsZU1ldHJpY3MgPSB7XG4gIFtBdmFpbGFibGVNZXRyaWNzVHlwZXMuVmVjdG9yXToge1xuICAgIFtWZWN0b3JNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXTogdmVjdG9yRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tWZWN0b3JNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXSxcbiAgfSxcbiAgW0F2YWlsYWJsZU1ldHJpY3NUeXBlcy5TdHJpbmddOiB7XG4gICAgW1N0cmluZ01ldHJpY3NOYW1lcy5MZXZlbnNodGVpbl06IHN0cmluZ0Rpc3RhbmNlTWV0cmljc01ldGhvZHNbU3RyaW5nTWV0cmljc05hbWVzLkxldmVuc2h0ZWluXSxcbiAgICBbU3RyaW5nTWV0cmljc05hbWVzLkphcm9XaW5rbGVyXTogc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tTdHJpbmdNZXRyaWNzTmFtZXMuSmFyb1dpbmtsZXJdLFxuICAgIFtTdHJpbmdNZXRyaWNzTmFtZXMuTWFuaGF0dGFuXTogc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tTdHJpbmdNZXRyaWNzTmFtZXMuTWFuaGF0dGFuXSxcbiAgfSxcbiAgW0F2YWlsYWJsZU1ldHJpY3NUeXBlcy5CaXRBcnJheV06IHtcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5EaWNlXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkFzeW1tZXRyaWNdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5CcmF1bkJsYW5xdWV0XTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkJyYXVuQmxhbnF1ZXRdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lXSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5LdWxjenluc2tpXSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuTWNDb25uYXVnaGV5XTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJvZ290R29sZGJlcmddOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ10sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5SdXNzZWxdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF0sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgTWV0cmljVG9EYXRhVHlwZTogU3RyaW5nRGljdGlvbmFyeSA9IE9iamVjdC5rZXlzKEF2YWlsYWJsZU1ldHJpY3MpXG4gIC5yZWR1Y2UoKHJldDogU3RyaW5nRGljdGlvbmFyeSwga2V5KSA9PiB7XG4gICAgZm9yIChjb25zdCB2YWwgb2YgT2JqZWN0LmtleXMoQXZhaWxhYmxlTWV0cmljc1trZXkgYXMgQXZhaWxhYmxlRGF0YVR5cGVzXSkpIHtcbiAgICAgIHJldFt2YWwgYXMgQXZhaWxhYmxlRGF0YVR5cGVzXSA9IGtleTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfSwge30pO1xuXG5leHBvcnQgdHlwZSBBdmFpbGFibGVEYXRhVHlwZXMgPSBrZXlvZiB0eXBlb2YgQXZhaWxhYmxlTWV0cmljcztcbmV4cG9ydCB0eXBlIFZlY3Rvck1ldHJpY3MgPSBrZXlvZiB0eXBlb2YgQXZhaWxhYmxlTWV0cmljc1tBdmFpbGFibGVNZXRyaWNzVHlwZXMuVmVjdG9yXTtcbmV4cG9ydCB0eXBlIFN0cmluZ01ldHJpY3MgPSBrZXlvZiB0eXBlb2YgQXZhaWxhYmxlTWV0cmljc1tBdmFpbGFibGVNZXRyaWNzVHlwZXMuU3RyaW5nXTtcbmV4cG9ydCB0eXBlIEJpdEFycmF5TWV0cmljcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVNZXRyaWNzW0F2YWlsYWJsZU1ldHJpY3NUeXBlcy5CaXRBcnJheV07XG5leHBvcnQgdHlwZSBLbm93bk1ldHJpY3MgPSBTdHJpbmdNZXRyaWNzIHwgQml0QXJyYXlNZXRyaWNzIHwgVmVjdG9yTWV0cmljcztcblxuZXhwb3J0IHR5cGUgVmFsaWRUeXBlcyA9IHsgZGF0YTogc3RyaW5nW10sIG1ldHJpYzogU3RyaW5nTWV0cmljcyB9IHwgeyBkYXRhOiBWZWN0b3JbXSwgbWV0cmljOiBWZWN0b3JNZXRyaWNzIH0gfFxuICB7IGRhdGE6IEJpdEFycmF5W10sIG1ldHJpYzogQml0QXJyYXlNZXRyaWNzIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZ01ldHJpYyhuYW1lOiBLbm93bk1ldHJpY3MpIHtcbiAgcmV0dXJuIE1ldHJpY1RvRGF0YVR5cGVbbmFtZV0gPT0gJ1N0cmluZyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0JpdEFycmF5TWV0cmljKG5hbWU6IEtub3duTWV0cmljcykge1xuICByZXR1cm4gTWV0cmljVG9EYXRhVHlwZVtuYW1lXSA9PSAnQml0QXJyYXknO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWZWN0b3JNZXRyaWMobmFtZTogS25vd25NZXRyaWNzKSB7XG4gIHJldHVybiBNZXRyaWNUb0RhdGFUeXBlW25hbWVdID09ICdWZWN0b3InO1xufVxuXG4vKiogTWFuaGF0dGFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNlcXVlbmNlcyAobWF0Y2ggLSAwLCBtaXNtYXRjaCAtIDEpIG5vcm1hbGl6ZWQgZm9yIGxlbmd0aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYW5oYXR0YW5EaXN0YW5jZShzMTogc3RyaW5nLCBzMjogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKHMxLmxlbmd0aCAhPT0gczIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSB7XG4gICAgbGV0IGRpc3Q6IG51bWJlciA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzMS5sZW5ndGg7IGkrKykge1xuICAgICAgZGlzdCArPSBzMVtpXSA9PSBzMltpXSA/IDAgOiAxO1xuICAgIH1cbiAgICByZXR1cm4gZGlzdCAvIHMxLmxlbmd0aDtcbiAgfVxufVxuXG4vKiogVW5pZmllZCBjbGFzcyBpbXBsZW1lbnRpbmcgZGlmZmVyZW50IHN0cmluZyBtZWFzdXJlcy4gKi9cbmV4cG9ydCBjbGFzcyBNZWFzdXJlIHtcbiAgcHJvdGVjdGVkIG1ldGhvZDogS25vd25NZXRyaWNzO1xuICBwcm90ZWN0ZWQgZGF0YVR5cGU6IEF2YWlsYWJsZURhdGFUeXBlcztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBNZWFzdXJlIHdpdGggLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIE1ldGhvZCB0byBjYWxjdWxhdGUgZGlzdGFuY2UgYmV0d2VlbiBzdHJpbmdzLlxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1ldGhvZDogS25vd25NZXRyaWNzKSB7XG4gICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgdGhpcy5kYXRhVHlwZSA9IE1ldHJpY1RvRGF0YVR5cGVbbWV0aG9kXSBhcyBBdmFpbGFibGVEYXRhVHlwZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBjdXN0b20gc3RyaW5nIGRpc3RhbmNlIGZ1bmN0aW9uIHNwZWNpZmllZC5cbiAgICogQHJldHVybiB7RGlzdGFuY2VNZXRyaWN9IENhbGxiYWNrIG9mIHRoZSBtZWFzdXJlIGNob3Nlbi5cbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBwdWJsaWMgZ2V0TWVhc3VyZSgpOiBEaXN0YW5jZU1ldHJpYyB7XG4gICAgY29uc3QgZGljdDogeyBba2V5OiBzdHJpbmddOiB7IFtrZXkyOiBzdHJpbmddOiBEaXN0YW5jZU1ldHJpYyB9IH0gPSBBdmFpbGFibGVNZXRyaWNzO1xuICAgIHJldHVybiBkaWN0W3RoaXMuZGF0YVR5cGVdW3RoaXMubWV0aG9kXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGN1c3RvbSBzdHJpbmcgZGlzdGFuY2UgYnkgdGhlIGdpdmVuIGRhdGEgdHlwZS5cbiAgICogQHBhcmFtIHtBdmFpbGFibGVEYXRhVHlwZXN9IGRhdGFUeXBlIE1ldHJpYydzIGRhdGEgdHlwZVxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gTWV0cmljIG5hbWVzIHdoaWNoIGV4cGVjdHMgdGhlIGdpdmVuIGRhdGEgdHlwZVxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TWV0cmljQnlEYXRhVHlwZShkYXRhVHlwZTogQXZhaWxhYmxlRGF0YVR5cGVzKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzW2RhdGFUeXBlXSk7XG4gIH1cblxuICAvKiogUmV0dXJucyBtZXRyaWMgbmFtZXMgYXZhaWxhYmxlLlxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIHN0YXRpYyBnZXQgYXZhaWxhYmxlTWVhc3VyZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzKTtcbiAgfVxufVxuIl19","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {ITooltipAndPanelParams} from '@datagrok-libraries/ml/src/viewers/activity-cliffs';\nimport {getSimilarityFromDistance} from '@datagrok-libraries/ml/src/distance-metrics-methods';\nimport {AvailableMetrics, AvailableMetricsTypes, StringMetricsNames} from '@datagrok-libraries/ml/src/typed-metrics';\nimport {drawMoleculeDifferenceOnCanvas} from '../utils/cell-renderer';\nimport * as C from '../utils/constants';\nimport {GridColumn} from 'datagrok-api/dg';\nimport {invalidateMols, MONOMERIC_COL_TAGS} from '../substructure-search/substructure-search';\nimport {getSplitter, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';\n\nexport async function getDistances(col: DG.Column, seq: string): Promise<Array<number>> {\n const stringArray = col.toList();\n const distances = new Array(stringArray.length).fill(0);\n const distanceMethod: (x: string, y: string) => number =\n AvailableMetrics[AvailableMetricsTypes.String][StringMetricsNames.Levenshtein];\n for (let i = 0; i < stringArray.length; ++i) {\n const distance = stringArray[i] ? distanceMethod(stringArray[i], seq) : null;\n distances[i] = distance ? distance / Math.max((stringArray[i] as string).length, seq.length) : null;\n }\n return distances;\n}\n\nexport async function getSimilaritiesMatrix(\n dim: number, seqCol: DG.Column, df: DG.DataFrame, colName: string, simArr: DG.Column[]\n): Promise<DG.Column[]> {\n const distances = new Array(simArr.length).fill(null);\n for (let i = 0; i != dim - 1; ++i) {\n const seq: string = seqCol.get(i);\n df.rows.removeAt(0, 1, false);\n distances[i] = (await getDistances(df.col(colName)!, seq))!;\n }\n\n for (let i = 0; i < distances.length; i++) {\n for (let j = 0; j < distances[i].length; j++)\n distances[i][j] = getSimilarityFromDistance(distances[i][j]);\n\n simArr[i] = DG.Column.fromList(DG.COLUMN_TYPE.FLOAT, 'distances', distances[i]);\n }\n return simArr;\n}\n\nexport async function getChemSimilaritiesMatrix(dim: number, seqCol: DG.Column,\n df: DG.DataFrame, colName: string, simArr: DG.Column[])\n : Promise<DG.Column[]> {\n if (seqCol.version !== seqCol.temp[MONOMERIC_COL_TAGS.LAST_INVALIDATED_VERSION])\n await invalidateMols(seqCol, false);\n const fpDf = DG.DataFrame.create(seqCol.length);\n fpDf.columns.addNewString(colName).init((i) => seqCol.temp[MONOMERIC_COL_TAGS.MONOMERIC_MOLS].get(i));\n const res = await grok.functions.call('Chem:getChemSimilaritiesMatrix', {\n dim: dim,\n col: seqCol.temp[MONOMERIC_COL_TAGS.MONOMERIC_MOLS],\n df: fpDf,\n colName: colName,\n simArr: simArr\n });\n return res;\n}\n\nexport function createTooltipElement(params: ITooltipAndPanelParams): HTMLDivElement {\n const tooltipElement = ui.divH([]);\n const columnNames = ui.divV([\n ui.divText(params.seqCol.name),\n ui.divText(params.activityCol.name),\n ]);\n columnNames.style.fontWeight = 'bold';\n columnNames.style.display = 'flex';\n columnNames.style.justifyContent = 'space-between';\n tooltipElement.append(columnNames);\n params.line.mols.forEach((molIdx: number, idx: number) => {\n const activity = ui.divText(params.activityCol.get(molIdx).toFixed(2));\n activity.style.display = 'flex';\n activity.style.justifyContent = 'left';\n activity.style.paddingLeft = '30px';\n tooltipElement.append(ui.divV([\n ui.divText(params.seqCol.get(molIdx)),\n activity,\n ]));\n });\n return tooltipElement;\n}\n\nfunction moleculeInfo(df: DG.DataFrame, idx: number, seqColName: string): HTMLElement {\n const dict: { [key: string]: string } = {};\n for (const col of df.columns) {\n if (col.name !== seqColName)\n dict[col.name] = df.get(col.name, idx);\n }\n return ui.tableFromMap(dict);\n}\n\n\nexport function createPropPanelElement(params: ITooltipAndPanelParams): HTMLDivElement {\n const propPanel = ui.div();\n\n propPanel.append(ui.divText(params.seqCol.name, {style: {fontWeight: 'bold'}}));\n\n const sequencesArray = new Array<string>(2);\n const activitiesArray = new Array<number>(2);\n params.line.mols.forEach((molIdx, idx) => {\n sequencesArray[idx] = params.seqCol.get(molIdx);\n activitiesArray[idx] = params.activityCol.get(molIdx);\n });\n\n const molDifferences: { [key: number]: HTMLCanvasElement } = {};\n const units = params.seqCol.getTag(DG.TAGS.UNITS);\n const separator = params.seqCol.getTag(bioTAGS.separator);\n const splitter = getSplitter(units, separator);\n const subParts1 = splitter(sequencesArray[0]);\n const subParts2 = splitter(sequencesArray[1]);\n const canvas = createDifferenceCanvas(subParts1, subParts2, units, molDifferences);\n propPanel.append(ui.div(canvas, {style: {width: '300px', overflow: 'scroll'}}));\n\n propPanel.append(createDifferencesWithPositions(molDifferences));\n\n propPanel.append(createPropPanelField('Activity delta', Math.abs(activitiesArray[0] - activitiesArray[1])));\n propPanel.append(createPropPanelField('Cliff', params.sali!));\n\n return propPanel;\n}\n\nfunction createPropPanelField(name: string, value: number): HTMLDivElement {\n return ui.divH([\n ui.divText(`${name}: `, {style: {fontWeight: 'bold', paddingRight: '5px'}}),\n ui.divText(value.toFixed(2))\n ], {style: {paddingTop: '10px'}});\n}\n\nexport function createDifferenceCanvas(\n subParts1: string[],\n subParts2: string[],\n units: string,\n molDifferences: { [key: number]: HTMLCanvasElement }): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n canvas.height = 30;\n drawMoleculeDifferenceOnCanvas(context!, 0, 0, 0, 30, subParts1, subParts2, units, true, molDifferences);\n return canvas;\n}\n\nexport function createDifferencesWithPositions(\n molDifferences: { [key: number]: HTMLCanvasElement }): HTMLDivElement {\n const div = ui.div();\n if (Object.keys(molDifferences).length > 0) {\n const diffsPanel = ui.divV([]);\n diffsPanel.append(ui.divH([\n ui.divText('Pos', {style: {fontWeight: 'bold', width: '30px', borderBottom: '1px solid'}}),\n ui.divText('Difference', {style: {fontWeight: 'bold', borderBottom: '1px solid'}})\n ]));\n for (const key of Object.keys(molDifferences)) {\n molDifferences[key as any].style.borderBottom = '1px solid lightgray';\n diffsPanel.append(ui.divH([\n ui.divText((parseInt(key) + 1).toString(), {style: {width: '30px', borderBottom: '1px solid lightgray'}}),\n molDifferences[key as any]\n ]));\n }\n div.append(diffsPanel);\n }\n return div;\n}\n\nexport function createLinesGrid(df: DG.DataFrame, colNames: string[]): DG.Grid {\n const seqDiffCol = DG.Column.string('seq_diff', df.rowCount)\n .init((i) => `${df.get(colNames[0], i)}#${df.get(colNames[1], i)}`);\n seqDiffCol.semType = 'MacromoleculeDifference';\n seqDiffCol.setTag(DG.TAGS.UNITS, df.col(colNames[0])!.getTag(DG.TAGS.UNITS));\n seqDiffCol.setTag(bioTAGS.separator, df.col(colNames[0])!.getTag(bioTAGS.separator));\n df.columns.add(seqDiffCol);\n const grid = df.plot.grid();\n grid.col(colNames[0])!.visible = false;\n grid.col(colNames[1])!.visible = false;\n return grid;\n}\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nimport { HELM_CORE_FIELDS } from '../utils/const';\nimport { getSplitter } from '../utils/macromolecule';\n// import {UnitsHandler} from '../utils/units-handler';\nimport { NotationConverter } from '../utils/notation-converter';\nimport { errorToConsole } from '@datagrok-libraries/utils/src/to-console';\n// constants for parsing molfile V2000\nconst V2K_RGP_SHIFT = 8;\nconst V2K_RGP_LINE = 'M RGP';\nconst V2K_A_LINE = 'A ';\n// constants for parsing/reconstruction of molfile V3000\nconst V3K_COUNTS_SHIFT = 14;\nconst V3K_IDX_SHIFT = 7;\nconst V3K_HEADER_FIRST_LINE = '\\nDatagrok macromolecule handler\\n\\n';\nconst V3K_HEADER_SECOND_LINE = ' 0 0 0 0 0 0 999 V3000\\n';\nconst V3K_BEGIN_CTAB_BLOCK = 'M V30 BEGIN CTAB\\n';\nconst V3K_END_CTAB_BLOCK = 'M V30 END CTAB\\n';\nconst V3K_BEGIN_COUNTS_LINE = 'M V30 COUNTS ';\nconst V3K_COUNTS_LINE_ENDING = ' 0 0 0\\n';\nconst V3K_BEGIN_ATOM_BLOCK = 'M V30 BEGIN ATOM\\n';\nconst V3K_END_ATOM_BLOCK = 'M V30 END ATOM\\n';\nconst V3K_BEGIN_BOND_BLOCK = 'M V30 BEGIN BOND\\n';\nconst V3K_END_BOND_BLOCK = 'M V30 END BOND\\n';\nconst V3K_BOND_CONFIG = ' CFG=';\nconst V3K_BEGIN_DATA_LINE = 'M V30 ';\nconst V3K_END = 'M END\\n';\nconst PRECISION_FACTOR = 10000; // HELMCoreLibrary has 4 significant digits after decimal point in atom coordinates\n// symbols for the corresponding monomers in HELM library\nconst DEOXYRIBOSE = 'd';\nconst RIBOSE = 'r';\nconst PHOSPHATE = 'p';\nconst OXYGEN = 'O';\nconst HYDROGEN = 'H';\n// todo: verify that all functions have return types\n/** Convert Macromolecule column into Molecule column storing molfile V3000 with the help of a monomer library */\nexport function _toAtomicLevel(df, macroMolCol, monomersLibList) {\n return __awaiter(this, void 0, void 0, function* () {\n // todo: remove this from the library\n if (DG.Func.find({ package: 'Chem', name: 'getRdKitModule' }).length === 0) {\n grok.shell.warning('Transformation to atomic level requires package \"Chem\" installed.');\n return;\n }\n if (macroMolCol.semType !== DG.SEMTYPE.MACROMOLECULE) {\n grok.shell.warning(`Only the ${DG.SEMTYPE.MACROMOLECULE} columns can be converted to atomic\n level, the chosen column has semType ${macroMolCol.semType}`);\n return;\n }\n // convert 'helm' to 'separator' units\n if (macroMolCol.getTag(DG.TAGS.UNITS) === \"helm\" /* NOTATION.HELM */) {\n const converter = new NotationConverter(macroMolCol);\n const separator = '/';\n macroMolCol = converter.convert(\"separator\" /* NOTATION.SEPARATOR */, separator);\n }\n const alphabet = macroMolCol.getTag(\"alphabet\" /* TAGS.alphabet */);\n // determine the polymer type according to HELM specifications\n let polymerType;\n // todo: an exception from dart comes before this check if the alphabet is UN\n if (alphabet === \"PT\" /* ALPHABET.PT */ || alphabet === \"UN\" /* ALPHABET.UN */) {\n polymerType = \"PEPTIDE\" /* HELM_POLYMER_TYPE.PEPTIDE */;\n }\n else if (alphabet === \"RNA\" /* ALPHABET.RNA */ || alphabet === \"DNA\" /* ALPHABET.DNA */) {\n polymerType = \"RNA\" /* HELM_POLYMER_TYPE.RNA */;\n }\n else {\n grok.shell.warning(`Unexpected column's '${macroMolCol.name}' alphabet '${alphabet}'.`);\n return;\n }\n // work in standard mode, where, as in HELMCoreLibrary:\n // - monomers with polymerType 'PEPTIDE' have monomer type 'backbone'\n // - monomers with polymerType 'RNA' have monomer type 'branch' and 'backbone'\n // - the library provides molfiles in format V2000\n const mode = 0 /* MODE.STANDARD */;\n const monomerSequencesArray = getMonomerSequencesArray(macroMolCol);\n const monomersDict = yield getMonomersDictFromLib(monomerSequencesArray, monomersLibList, polymerType, alphabet);\n const columnLength = macroMolCol.length;\n const reconstructed = new Array(columnLength);\n for (let row = 0; row < columnLength; ++row) {\n const monomerSeq = monomerSequencesArray[row];\n reconstructed[row] = monomerSeqToMolfile(monomerSeq, monomersDict, alphabet, polymerType, mode);\n // console.log(reconstructed[row]);\n }\n // exclude name collisions\n const name = 'molfile(' + macroMolCol.name + ')';\n const newColName = df.columns.getUnusedName(name);\n const newCol = DG.Column.fromStrings(newColName, reconstructed);\n newCol.semType = DG.SEMTYPE.MOLECULE;\n newCol.setTag(DG.TAGS.UNITS, DG.UNITS.Molecule.MOLBLOCK);\n df.columns.add(newCol, true);\n yield grok.data.detectSemanticTypes(df);\n });\n}\n/** Get a mapping of peptide symbols to HELM monomer library\n * objects with selected fields.\n */\nfunction getFormattedMonomerLib(monomersLibList, polymerType, alphabet) {\n const map = new Map();\n monomersLibList.forEach((it) => {\n if (it[\"polymerType\" /* HELM_FIELDS.POLYMER_TYPE */] === polymerType) {\n if (polymerType === \"RNA\" /* HELM_POLYMER_TYPE.RNA */ &&\n (it[\"monomerType\" /* HELM_FIELDS.MONOMER_TYPE */] === \"Branch\" /* HELM_MONOMER_TYPE.BRANCH */ ||\n alphabet === \"DNA\" /* ALPHABET.DNA */ && it[\"symbol\" /* HELM_FIELDS.SYMBOL */] === DEOXYRIBOSE ||\n alphabet === \"RNA\" /* ALPHABET.RNA */ && it[\"symbol\" /* HELM_FIELDS.SYMBOL */] === RIBOSE ||\n it[\"symbol\" /* HELM_FIELDS.SYMBOL */] === PHOSPHATE) ||\n polymerType === \"PEPTIDE\" /* HELM_POLYMER_TYPE.PEPTIDE */ &&\n it[\"monomerType\" /* HELM_FIELDS.MONOMER_TYPE */] !== \"Branch\" /* HELM_MONOMER_TYPE.BRANCH */) {\n const monomerObject = {};\n HELM_CORE_FIELDS.forEach((field) => {\n monomerObject[field] = it[field];\n });\n map.set(it[\"symbol\" /* HELM_FIELDS.SYMBOL */], monomerObject);\n }\n }\n });\n return map;\n}\n/** Get jagged array of monomer symbols for the dataframe */\nfunction getMonomerSequencesArray(macroMolCol) {\n const columnLength = macroMolCol.length;\n const result = new Array(columnLength);\n // split the string into monomers\n const colUnits = macroMolCol.getTag(DG.TAGS.UNITS);\n const separator = macroMolCol.getTag(\"separator\" /* TAGS.separator */);\n const splitterFunc = getSplitter(colUnits, separator);\n for (let row = 0; row < columnLength; ++row) {\n const macroMolecule = macroMolCol.get(row);\n // todo: handle the exception case when macroMolecule is null\n result[row] = macroMolecule ? splitterFunc(macroMolecule) : [];\n }\n return result;\n}\n/** Get a mapping of monomer symbols to MolGraph objects. Notice, the\n * transformation from molfile V2000 to V3000 takes place,\n * with the help of async function call from Chem (RdKit module) */\nfunction getMonomersDictFromLib(monomerSequencesArray, monomersLibList, polymerType, alphabet) {\n return __awaiter(this, void 0, void 0, function* () {\n // todo: exception - no gaps, no empty string monomers\n const formattedMonomerLib = getFormattedMonomerLib(monomersLibList, polymerType, alphabet);\n const monomersDict = new Map();\n const moduleRdkit = yield grok.functions.call('Chem:getRdKitModule');\n const pointerToBranchAngle = {\n value: null\n };\n // this must NOT be placed after translating monomer sequences\n // because adding branch monomers for nucleobases relies on these data\n if (polymerType === \"RNA\" /* HELM_POLYMER_TYPE.RNA */) {\n const symbols = (alphabet === \"RNA\" /* ALPHABET.RNA */) ?\n [RIBOSE, PHOSPHATE] : [DEOXYRIBOSE, PHOSPHATE];\n for (const sym of symbols)\n addMonomerToDict(monomersDict, sym, formattedMonomerLib, moduleRdkit, polymerType, pointerToBranchAngle);\n }\n for (let row = 0; row < monomerSequencesArray.length; ++row) {\n const monomerSeq = monomerSequencesArray[row];\n for (const sym of monomerSeq) {\n if (sym === '')\n continue; // Skip gap/empty monomer for MSA\n try {\n addMonomerToDict(monomersDict, sym, formattedMonomerLib, moduleRdkit, polymerType, pointerToBranchAngle);\n }\n catch (err) {\n const errTxt = errorToConsole(err);\n console.error(`bio lib: getMonomersDictFromLib() sym='${sym}', error:\\n` + errTxt);\n const errMsg = `can't get monomer '${sym}' from library: ${errTxt}`; // Text for Datagrok error baloon\n throw new Error(errMsg);\n }\n }\n }\n return monomersDict;\n });\n}\nfunction getAngleBetweenSugarBranchAndOY(molGraph) {\n const x = molGraph.atoms.x;\n const y = molGraph.atoms.y;\n const rNode = molGraph.meta.rNodes[2] - 1;\n const terminalNode = molGraph.meta.terminalNodes[2] - 1;\n const xShift = x[rNode] - x[terminalNode];\n const yShift = y[rNode] - y[terminalNode];\n return Math.atan(yShift / xShift) + Math.PI / 2;\n}\n/** Get a mapping of monomer symbols to MolGraph objects from a map whose keys\n * are symbols and values, V3000 molfiles */\nfunction getMonomersDictFromMap(symbolToMolfileV3KMap) {\n const monomersDict = new Map();\n const mapKeyList = Array.from(symbolToMolfileV3KMap.keys());\n for (const sym of mapKeyList) {\n const molfileV3K = symbolToMolfileV3KMap.get(sym); // ! is guaranteed\n const counts = parseAtomAndBondCounts(molfileV3K);\n const atoms = parseAtomBlock(molfileV3K, counts.atomCount);\n const bonds = parseBondBlock(molfileV3K, counts.bondCount);\n // the rNodes are set to 0th and the last atom!\n // this is used because as for now it is unclear how to include the R-groups\n // into the V3K molfile\n const meta = getMonomerMetadata(atoms, bonds);\n const monomerGraph = { atoms: atoms, bonds: bonds, meta: meta };\n const leftNodeIdx = meta.rNodes[0] - 1;\n const rightNodeIdx = meta.terminalNodes[1] - 1;\n // todo: consider rotation?\n adjustBackboneMonomerGraph(monomerGraph, leftNodeIdx, rightNodeIdx);\n // set shifts\n // todo: wrap as a separate function?\n monomerGraph.meta.backboneShift = getShiftBetweenNodes(monomerGraph, rightNodeIdx, leftNodeIdx);\n removeNodeAndBonds(monomerGraph, monomerGraph.meta.rNodes[1]);\n monomersDict.set(sym, monomerGraph);\n }\n // console.log(monomersDict);\n return monomersDict;\n}\n/** Adds MolGraph object for 'sym' to the monomers dict when necessary */\nfunction addMonomerToDict(monomersDict, sym, formattedMonomerLib, moduleRdkit, polymerType, pointerToBranchAngle) {\n if (!monomersDict.has(sym)) {\n const monomerData = getMolGraph(sym, formattedMonomerLib, moduleRdkit, polymerType, pointerToBranchAngle);\n if (monomerData)\n monomersDict.set(sym, monomerData);\n else\n throw new Error(`Monomer with symbol '${sym}' is absent the monomer library`);\n // todo: handle exception\n }\n}\n/** Construct the MolGraph object for specified monomerSymbol: the associated\n * graph is adjusted in XY plane and filled with default R-groups */\nfunction getMolGraph(monomerSymbol, formattedMonomerLib, moduleRdkit, polymerType, pointerToBranchAngle) {\n if (!formattedMonomerLib.has(monomerSymbol)) {\n return null;\n }\n else {\n const libObject = formattedMonomerLib.get(monomerSymbol);\n const capGroups = parseCapGroups(libObject[\"rgroups\" /* HELM_FIELDS.RGROUPS */]);\n const capGroupIdxMap = parseCapGroupIdxMap(libObject[\"molfile\" /* HELM_FIELDS.MOLFILE */]);\n const molfileV3K = convertMolfileToV3K(removeRGroupLines(libObject[\"molfile\" /* HELM_FIELDS.MOLFILE */]), moduleRdkit);\n const counts = parseAtomAndBondCounts(molfileV3K);\n const atoms = parseAtomBlock(molfileV3K, counts.atomCount);\n const bonds = parseBondBlock(molfileV3K, counts.bondCount);\n const meta = getMonomerMetadata(atoms, bonds, capGroups, capGroupIdxMap);\n const monomerGraph = { atoms: atoms, bonds: bonds, meta: meta };\n if (polymerType === \"PEPTIDE\" /* HELM_POLYMER_TYPE.PEPTIDE */) {\n adjustPeptideMonomerGraph(monomerGraph);\n }\n else { // nucleotides\n if (monomerSymbol === RIBOSE || monomerSymbol === DEOXYRIBOSE)\n adjustSugarMonomerGraph(monomerGraph, pointerToBranchAngle);\n else if (monomerSymbol === PHOSPHATE)\n adjustPhosphateMonomerGraph(monomerGraph);\n else\n adjustBaseMonomerGraph(monomerGraph, pointerToBranchAngle);\n }\n setShiftsAndTerminalNodes(polymerType, monomerGraph, monomerSymbol);\n // todo: restore after debugging\n removeHydrogen(monomerGraph);\n return monomerGraph;\n }\n}\nfunction setShiftsAndTerminalNodes(polymerType, monomerGraph, monomerSymbol) {\n // remove the 'rightmost' chain-extending r-group node in the backbone\n if (polymerType === \"PEPTIDE\" /* HELM_POLYMER_TYPE.PEPTIDE */) {\n setShifts(monomerGraph, polymerType);\n removeNodeAndBonds(monomerGraph, monomerGraph.meta.rNodes[1]);\n }\n else { // nucleotides\n if (monomerSymbol === RIBOSE || monomerSymbol === DEOXYRIBOSE) {\n // remove R2\n removeNodeAndBonds(monomerGraph, monomerGraph.meta.rNodes[1]);\n // set terminalNode2 (oxygen) as new R2\n monomerGraph.meta.rNodes[1] = monomerGraph.meta.terminalNodes[1];\n setTerminalNodes(monomerGraph.bonds, monomerGraph.meta); // set terminal nodes anew\n setShifts(monomerGraph, polymerType);\n // remove 'new' R2 (oxygen)\n removeNodeAndBonds(monomerGraph, monomerGraph.meta.rNodes[1]);\n // remove R1\n removeNodeAndBonds(monomerGraph, monomerGraph.meta.rNodes[0]);\n // remove the branching r-group\n removeNodeAndBonds(monomerGraph, monomerGraph.meta.rNodes[2]);\n }\n else if (monomerSymbol === PHOSPHATE) {\n monomerGraph.meta.terminalNodes[0] = monomerGraph.meta.rNodes[0];\n shiftCoordinates(monomerGraph, -monomerGraph.atoms.x[monomerGraph.meta.terminalNodes[0] - 1], -monomerGraph.atoms.y[monomerGraph.meta.terminalNodes[0] - 1]);\n setShifts(monomerGraph, polymerType);\n removeNodeAndBonds(monomerGraph, monomerGraph.meta.rNodes[1]);\n }\n else { // nucleobases\n // removeNodeAndBonds(monomerGraph, monomerGraph.meta.rNodes[0]);\n }\n }\n}\n// todo: sdoc\nfunction getMonomerMetadata(atoms, bonds, capGroups, capGroupIdxMap) {\n const meta = {\n backboneShift: null,\n branchShift: null,\n terminalNodes: [],\n rNodes: [],\n };\n // corresponds to MODE.STANDARD\n const standardMode = typeof capGroups !== 'undefined' && typeof capGroupIdxMap !== 'undefined';\n if (standardMode) {\n substituteCapGroups(atoms, capGroups, capGroupIdxMap);\n setRNodes(capGroupIdxMap, meta);\n }\n else { // the case used in SequenceTranslator\n // todo: verify that the monomers are prepared in such a way that this works\n meta.rNodes = [0, atoms.x.length];\n }\n setTerminalNodes(bonds, meta);\n return meta;\n}\n/** Parse element symbols for R-groups from the HELM monomer library R-groups\n * field */\nexport function parseCapGroups(rGroupObjList) {\n // specifically for HELMCoreLibrary\n // considered only monoatomic rgroups\n // supposing that elements in rGroupObjList are sorted w.r.t. the rgroups idx\n const capGroupsArray = [];\n for (const obj of rGroupObjList) {\n let capGroup = obj[\"capGroupSmiles\" /* RGROUP_FIELDS.CAP_GROUP_SMILES */];\n // in some cases the smiles field is written with uppercase\n if (!capGroup)\n capGroup = obj[\"capGroupSMILES\" /* RGROUP_FIELDS.CAP_GROUP_SMILES_UPPERCASE */];\n capGroup = capGroup.replace(/(\\[|\\]|\\*|:|\\d)/g, '');\n capGroupsArray.push(capGroup);\n }\n return capGroupsArray;\n}\n/** Substitute the cap group elements instead of R# */\nfunction substituteCapGroups(atoms, capGroups, capGroupIdxMap) {\n for (const [node, capIdx] of capGroupIdxMap)\n atoms.atomTypes[node - 1] = capGroups[capIdx - 1]; // -1 because molfile indexing starts from 1\n}\nfunction setRNodes(capGroupIdxMap, meta) {\n meta.rNodes = Array.from(capGroupIdxMap.keys());\n for (let i = 0; i < meta.rNodes.length; i++) {\n for (const j of [1, 2]) { // 1 and 2 by def. correspond to 'left/rightmost' r-nodes\n // swap the values if necessary, so that the \"leftmost\" r-node is at 0,\n // and the 'rightmost', at 1\n if (capGroupIdxMap.get(meta.rNodes[i]) === j) {\n const tmp = meta.rNodes[j - 1];\n meta.rNodes[j - 1] = meta.rNodes[i];\n meta.rNodes[i] = tmp;\n }\n }\n }\n}\nfunction setTerminalNodes(bonds, meta) {\n const rNodes = meta.rNodes;\n meta.terminalNodes = new Array(rNodes.length).fill(0);\n const terminalNodes = meta.terminalNodes;\n const atomPairs = bonds.atomPairs;\n let i = 0;\n let j = 0;\n while ((i < atomPairs.length) && j < terminalNodes.length) {\n // rNodes array is sorted so that its 0th and 1st elements (if both\n // present) correspond to the chain extending (i.e. not branching) r-groups\n for (let k = 0; k < terminalNodes.length; ++k) {\n for (let l = 0; l < 2; ++l) {\n if (atomPairs[i][l] === rNodes[k]) {\n terminalNodes[k] = atomPairs[i][(l + 1) % 2];\n if (rNodes.length > 2) {\n }\n ++j;\n }\n }\n }\n ++i;\n }\n}\n/** Sets shifts in 'meta' attribute of MolGraph */\nfunction setShifts(molGraph, polymerType) {\n if (molGraph.meta.rNodes.length > 1) {\n molGraph.meta.backboneShift = getShiftBetweenNodes(molGraph, molGraph.meta.rNodes[1] - 1, molGraph.meta.terminalNodes[0] - 1);\n }\n if (polymerType === \"RNA\" /* HELM_POLYMER_TYPE.RNA */ && molGraph.meta.rNodes.length > 2) {\n molGraph.meta.branchShift = getShiftBetweenNodes(molGraph, molGraph.meta.rNodes[2] - 1, molGraph.meta.terminalNodes[0] - 1);\n }\n}\n/** Returns the pair [xShift, yShift] for specified node indices */\nfunction getShiftBetweenNodes(molGraph, rightNodeIdx, leftNodeIdx) {\n return [\n keepPrecision(molGraph.atoms.x[rightNodeIdx] -\n molGraph.atoms.x[leftNodeIdx]),\n keepPrecision(molGraph.atoms.y[rightNodeIdx] -\n molGraph.atoms.y[leftNodeIdx]),\n ];\n}\n/** Helper function necessary to build a correct V3000 molfile out of V2000 with\n * specified r-groups*/\nfunction removeRGroupLines(molfileV2K) {\n let begin = molfileV2K.indexOf(V2K_A_LINE, 0);\n if (begin === -1)\n begin = molfileV2K.indexOf(V2K_RGP_LINE);\n const end = molfileV2K.indexOf(V3K_END, begin);\n return molfileV2K.substring(0, begin) + molfileV2K.substring(end);\n}\n/** V2000 to V3000 converter */\nfunction convertMolfileToV3K(molfileV2K, moduleRdkit) {\n // The standard Chem converter is not used here because it relies on creation of moduleRdkit on each iteration\n const molObj = moduleRdkit.get_mol(molfileV2K);\n const molfileV3K = molObj.get_v3Kmolblock();\n molObj.delete();\n return molfileV3K;\n}\n/** Parse V3000 bond block and construct the Bonds object */\nfunction parseBondBlock(molfileV3K, bondCount) {\n const bondTypes = new Uint32Array(bondCount);\n const atomPairs = new Array(bondCount);\n const bondConfiguration = new Map();\n const kwargs = new Map();\n let begin = molfileV3K.indexOf(V3K_BEGIN_BOND_BLOCK);\n begin = molfileV3K.indexOf('\\n', begin);\n let end = begin;\n for (let i = 0; i < bondCount; ++i) {\n // parse bond type and atom pair\n const parsedValues = new Array(3);\n begin = molfileV3K.indexOf(V3K_BEGIN_DATA_LINE, end) + V3K_IDX_SHIFT;\n end = molfileV3K.indexOf(' ', begin);\n for (let k = 0; k < 3; ++k) {\n begin = end + 1;\n end = Math.min(molfileV3K.indexOf('\\n', begin), molfileV3K.indexOf(' ', begin));\n parsedValues[k] = parseInt(molfileV3K.slice(begin, end));\n }\n bondTypes[i] = parsedValues[0];\n atomPairs[i] = parsedValues.slice(1);\n // parse keyword arguments\n const endOfLine = molfileV3K.indexOf('\\n', begin);\n let lineRemainder = molfileV3K.slice(end, endOfLine);\n let beginCfg = lineRemainder.indexOf(V3K_BOND_CONFIG);\n if (beginCfg !== -1) {\n beginCfg = lineRemainder.indexOf('=', beginCfg) + 1;\n let endCfg = lineRemainder.indexOf(' ', beginCfg);\n if (endCfg === -1)\n endCfg = lineRemainder.length;\n const bondConfig = parseInt(lineRemainder.slice(beginCfg, endCfg));\n bondConfiguration.set(i, bondConfig);\n const removedSubstring = V3K_BOND_CONFIG + bondConfig.toString();\n lineRemainder = lineRemainder.replace(removedSubstring, '');\n }\n if (!lineRemainder)\n kwargs.set(i, lineRemainder);\n }\n return {\n bondTypes: bondTypes,\n atomPairs: atomPairs,\n bondConfiguration: bondConfiguration,\n kwargs: kwargs,\n };\n}\n/** Constructs mapping of r-group nodes to default capGroups, all numeration starting from 1.\n * According to https://pubs.acs.org/doi/10.1021/ci3001925, R1 and R2 are the chain extending attachment points,\n * while R3 is the branching attachment point. */\nfunction parseCapGroupIdxMap(molfileV2K) {\n const capGroupIdxMap = new Map();\n // parse A-lines (RNA)\n let begin = molfileV2K.indexOf(V2K_A_LINE, 0);\n let end = begin;\n while (begin !== -1) {\n // parse the rNode to which the cap group is attached\n end = molfileV2K.indexOf('\\n', begin);\n const rNode = parseInt(molfileV2K.substring(begin, end).replace(/^A\\s+/, ''));\n // parse the capGroup index\n begin = molfileV2K.indexOf('R', end);\n end = molfileV2K.indexOf('\\n', begin);\n const capGroup = parseInt(molfileV2K.substring(begin, end).replace(/^R/, ''));\n capGroupIdxMap.set(rNode, capGroup);\n begin = molfileV2K.indexOf(V2K_A_LINE, end);\n }\n // parse RGP lines (may be more than one in RNA monomers)\n begin = molfileV2K.indexOf(V2K_RGP_LINE, 0);\n end = molfileV2K.indexOf('\\n', begin);\n while (begin !== -1) {\n begin += V2K_RGP_SHIFT;\n end = molfileV2K.indexOf('\\n', begin);\n const rgpStringParsed = molfileV2K.substring(begin, end)\n .replaceAll(/\\s+/g, ' ')\n .split(' ');\n const rgpIndicesArray = rgpStringParsed.map((el) => parseInt(el))\n .slice(1); // slice from 1 because the 1st value is the number of pairs in the line\n for (let i = 0; i < rgpIndicesArray.length; i += 2) {\n // there may be conflicting cap group definitions, like 3-O-Methylribose (2,5 connectivity) in HELMCoreLibrary\n if (capGroupIdxMap.has(rgpIndicesArray[i]) && capGroupIdxMap.get(rgpIndicesArray[i]) !== rgpIndicesArray[i + 1])\n throw new Error(`r-group index ${rgpIndicesArray[i]} has already been added with a different value`);\n else\n capGroupIdxMap.set(rgpIndicesArray[i], rgpIndicesArray[i + 1]);\n }\n begin = molfileV2K.indexOf(V2K_RGP_LINE, end);\n }\n return capGroupIdxMap;\n}\nfunction parseAtomAndBondCounts(molfileV3K) {\n molfileV3K = molfileV3K.replaceAll('\\r', ''); // to handle old and new sdf standards\n // parse atom count\n let begin = molfileV3K.indexOf(V3K_BEGIN_COUNTS_LINE) + V3K_COUNTS_SHIFT;\n let end = molfileV3K.indexOf(' ', begin + 1);\n const numOfAtoms = parseInt(molfileV3K.substring(begin, end));\n // parse bond count\n begin = end + 1;\n end = molfileV3K.indexOf(' ', begin + 1);\n const numOfBonds = parseInt(molfileV3K.substring(begin, end));\n return { atomCount: numOfAtoms, bondCount: numOfBonds };\n}\n/** Parse V3000 atom block and return Atoms object. NOTICE: only atomTypes, x, y\n * and kwargs fields are set in the return value, with other fields dummy */\nfunction parseAtomBlock(molfileV3K, atomCount) {\n const atomTypes = new Array(atomCount);\n const x = new Float32Array(atomCount);\n const y = new Float32Array(atomCount);\n const kwargs = new Array(atomCount);\n let begin = molfileV3K.indexOf(V3K_BEGIN_ATOM_BLOCK); // V3000 atoms block\n begin = molfileV3K.indexOf('\\n', begin);\n let end = begin;\n for (let i = 0; i < atomCount; i++) {\n begin = molfileV3K.indexOf(V3K_BEGIN_DATA_LINE, begin) + V3K_IDX_SHIFT;\n end = molfileV3K.indexOf(' ', begin); // skip the idx row\n // parse atom type\n begin = end + 1;\n end = molfileV3K.indexOf(' ', begin);\n atomTypes[i] = molfileV3K.substring(begin, end);\n // parse X and Y coordinates of the atom\n const coordinate = new Array(2);\n for (let k = 0; k < 2; ++k) {\n begin = end + 1;\n end = molfileV3K.indexOf(' ', begin);\n coordinate[k] = parseFloat(molfileV3K.substring(begin, end));\n }\n x[i] = coordinate[0];\n y[i] = coordinate[1];\n // parse the remaining possible keyword arguments\n begin = end;\n end = molfileV3K.indexOf('\\n', begin) + 1;\n kwargs[i] = molfileV3K.slice(begin, end);\n begin = end;\n }\n return {\n atomTypes: atomTypes,\n x: x,\n y: y,\n kwargs: kwargs,\n };\n}\n/** Remove hydrogen nodes */\nfunction removeHydrogen(monomerGraph) {\n let i = 0;\n while (i < monomerGraph.atoms.atomTypes.length) {\n if (monomerGraph.atoms.atomTypes[i] === HYDROGEN) {\n removeNodeAndBonds(monomerGraph, i + 1); // i + 1 because molfile node indexing starts from 1\n --i;\n // monomerGraph.atoms.atomTypes[i] = 'Li';\n }\n ++i;\n }\n}\n/** Remove node 'removedNode' and the associated bonds. Notice, numeration of\n * nodes in molfiles starts from 1, not 0 */\nfunction removeNodeAndBonds(monomerGraph, removedNode) {\n if (typeof removedNode !== 'undefined') {\n const removedNodeIdx = removedNode - 1;\n const atoms = monomerGraph.atoms;\n const bonds = monomerGraph.bonds;\n const meta = monomerGraph.meta;\n // remove the node from atoms\n atoms.atomTypes.splice(removedNodeIdx, 1);\n atoms.x = spliceTypedArray(Float32Array, atoms.x, removedNodeIdx, 1);\n atoms.y = spliceTypedArray(Float32Array, atoms.y, removedNodeIdx, 1);\n atoms.kwargs.splice(removedNodeIdx, 1);\n // update the values of terminal and r-group nodes if necessary\n for (let i = 0; i < meta.terminalNodes.length; ++i) {\n if (meta.terminalNodes[i] > removedNode)\n --meta.terminalNodes[i];\n else if (meta.terminalNodes[i] === removedNode)\n meta.terminalNodes[i] = -1; // sentinel to mark the value as removed\n }\n for (let i = 0; i < meta.rNodes.length; ++i) {\n if (meta.rNodes[i] > removedNode)\n --meta.rNodes[i];\n else if (meta.rNodes[i] === removedNode)\n meta.rNodes[i] = -1; // sentinel to mark the value as removed\n }\n // update indices of atoms in bonds\n let i = 0;\n while (i < bonds.atomPairs.length) {\n const firstAtom = bonds.atomPairs[i][0];\n const secondAtom = bonds.atomPairs[i][1];\n if (firstAtom === removedNode || secondAtom === removedNode) {\n bonds.atomPairs.splice(i, 1);\n bonds.bondTypes = spliceTypedArray(Uint32Array, bonds.bondTypes, i, 1);\n if (bonds.bondConfiguration.has(i))\n bonds.bondConfiguration.delete(i);\n if (bonds.kwargs.has(i))\n bonds.kwargs.delete(i);\n --i;\n }\n else {\n bonds.atomPairs[i][0] = (firstAtom > removedNode) ? firstAtom - 1 : firstAtom;\n bonds.atomPairs[i][1] = (secondAtom > removedNode) ? secondAtom - 1 : secondAtom;\n }\n ++i;\n }\n // update bondConfiguration and kwargs keys\n let keys = Array.from(bonds.bondConfiguration.keys());\n keys.forEach((key) => {\n if (bonds.bondConfiguration.has(key) && key > removedNodeIdx) {\n const value = bonds.bondConfiguration.get(key);\n bonds.bondConfiguration.delete(key);\n bonds.bondConfiguration.set(key - 1, value);\n }\n });\n keys = Array.from(bonds.kwargs.keys());\n keys.forEach((key) => {\n if (bonds.kwargs.has(key) && key > removedNodeIdx) {\n const value = bonds.kwargs.get(key);\n bonds.kwargs.delete(key);\n bonds.kwargs.set(key - 1, value);\n }\n });\n }\n}\n// todo: rewrite the following two functions using templates,\nfunction spliceTypedArray(TConstructor, typedArray, start, count) {\n const result = new TConstructor(typedArray.length - count);\n let i = 0;\n let k = 0;\n while (i < typedArray.length) {\n if (i === start)\n i += count;\n result[k] = typedArray[i];\n ++k;\n ++i;\n }\n return result;\n}\n/** Adjust the peptide MolGraph to default/standardized position */\nfunction adjustPeptideMonomerGraph(monomer) {\n const centeredNode = monomer.meta.terminalNodes[0] - 1; // node indexing in molfiles starts from 1\n const rotatedNode = monomer.meta.rNodes[0] - 1;\n const x = monomer.atoms.x;\n const y = monomer.atoms.y;\n // place nodeOne at origin\n shiftCoordinates(monomer, -x[centeredNode], -y[centeredNode]);\n // angle is measured between OY and the rotated node\n const angle = findAngleWithOY(x[rotatedNode], y[rotatedNode]);\n // rotate the centered graph, so that 'nodeTwo' ends up on the positive ray of OY\n rotateCenteredGraph(monomer.atoms, -angle);\n if (x[monomer.meta.rNodes[1] - 1] < 0)\n flipMonomerAroundOY(monomer);\n const doubleBondedOxygen = findDoubleBondedCarbonylOxygen(monomer);\n // flip carboxyl and R if necessary\n flipCarboxylAndRadical(monomer, doubleBondedOxygen);\n // flip hydroxyl group with double-bound O inside carboxyl group if necessary\n flipHydroxilGroup(monomer, doubleBondedOxygen);\n}\nfunction adjustPhosphateMonomerGraph(monomer) {\n const centeredNode = monomer.meta.terminalNodes[0] - 1; // Phosphorus\n const rotatedNode = monomer.meta.rNodes[0] - 1; // Oxygen\n // const nodeTwoIdx = monomer.meta.rNodes[0] - 1;\n const x = monomer.atoms.x;\n const y = monomer.atoms.y;\n // place nodeOne at origin\n shiftCoordinates(monomer, -x[centeredNode], -y[centeredNode]);\n // angle is measured between OY and the rotated node\n const angle = findAngleWithOY(x[rotatedNode], y[rotatedNode]);\n // rotate the centered graph so that P-O is on OX\n rotateCenteredGraph(monomer.atoms, Math.PI / 2 - angle);\n}\n/** Adjust a backbone graph so that nodeOne is at origin and nodeTwo is at OX.\n * Notice: node indexing in molfiles starts from 1 */\nfunction adjustBackboneMonomerGraph(monomer, nodeOneIdx, nodeTwoIdx) {\n const x = monomer.atoms.x;\n const y = monomer.atoms.y;\n // place nodeOne at origin\n shiftCoordinates(monomer, -x[nodeOneIdx], -y[nodeOneIdx]);\n // angle is measured between OX and the rotated node\n const angle = findAngleWithOX(x[nodeTwoIdx], y[nodeTwoIdx]);\n // rotate the centered graph, so that 'nodeTwo' ends up on the positive ray of OX\n rotateCenteredGraph(monomer.atoms, -angle);\n}\nfunction adjustSugarMonomerGraph(monomer, pointerToBranchAngle) {\n const x = monomer.atoms.x;\n const y = monomer.atoms.y;\n let centeredNode = monomer.meta.terminalNodes[0] - 1;\n const rotatedNode = monomer.meta.rNodes[1] - 1;\n shiftCoordinates(monomer, -x[centeredNode], -y[centeredNode]);\n // angle is measured between OX and the rotated node\n const angle = findAngleWithOY(x[rotatedNode], y[rotatedNode]);\n // rotate the centered graph so that the rotated node in on OX\n rotateCenteredGraph(monomer.atoms, 3 * Math.PI / 2 - angle);\n pointerToBranchAngle.value = getAngleBetweenSugarBranchAndOY(monomer);\n centeredNode = monomer.meta.terminalNodes[0] - 1;\n shiftCoordinates(monomer, -x[centeredNode], -y[centeredNode]);\n}\nfunction adjustBaseMonomerGraph(monomer, pointerToBranchAngle) {\n const x = monomer.atoms.x;\n const y = monomer.atoms.y;\n const centeredNode = monomer.meta.terminalNodes[0] - 1; // node indexing in molfiles starts from 1\n const rotatedNode = monomer.meta.rNodes[0] - 1;\n // center graph at centeredNode\n shiftCoordinates(monomer, -x[centeredNode], -y[centeredNode]);\n // rotate so that the branch bond is aligned with that in sugar\n const baseBranchToOYAngle = findAngleWithOY(x[rotatedNode], y[rotatedNode]);\n const sugarBranchToOYAngle = pointerToBranchAngle.value;\n if (sugarBranchToOYAngle) {\n rotateCenteredGraph(monomer.atoms, Math.PI - baseBranchToOYAngle + sugarBranchToOYAngle);\n }\n else {\n throw new Error('The value of sugarBranchToOYAngle is null');\n }\n // scale graph in case its size does not fit the scale of phosphate and sugar\n // todo: consider extending to other monomer types\n const p1 = {\n x: x[monomer.meta.rNodes[0] - 1],\n y: y[monomer.meta.rNodes[0] - 1],\n };\n const p2 = {\n x: x[monomer.meta.terminalNodes[0] - 1],\n y: y[monomer.meta.terminalNodes[0] - 1],\n };\n const bondLength = getEuclideanDistance(p1, p2);\n if (bondLength != 1) {\n for (let i = 0; i < x.length; ++i) {\n x[i] = keepPrecision(x[i] / bondLength);\n y[i] = keepPrecision(y[i] / bondLength);\n }\n }\n}\nfunction getEuclideanDistance(p1, p2) {\n return keepPrecision(Math.sqrt(Math.pow((p1.x - p2.x), 2) + Math.pow((p1.y - p2.y), 2)));\n}\n/** Flip carboxyl group with the radical in a peptide monomer in case the\n * carboxyl group is in the lower half-plane */\nfunction flipCarboxylAndRadical(monomer, doubleBondedOxygen) {\n // verify that the carboxyl group is in the lower half-plane\n if (monomer.atoms.y[monomer.meta.rNodes[1] - 1] < 0 &&\n monomer.atoms.y[doubleBondedOxygen - 1] < 0) {\n flipMonomerAroundOX(monomer);\n rotateCenteredGraph(monomer.atoms, -findAngleWithOX(monomer.atoms.x[monomer.meta.terminalNodes[1] - 1], monomer.atoms.y[monomer.meta.terminalNodes[1] - 1]));\n }\n}\n/** Finds angle between OY and the ray joining origin with (x, y) */\nfunction findAngleWithOY(x, y) {\n let angle;\n if (x === 0) {\n angle = y > 0 ? 0 : Math.PI;\n }\n else if (y === 0) {\n angle = x > 0 ? -Math.PI / 2 : Math.PI / 2;\n }\n else {\n const tan = y / x;\n const atan = Math.atan(tan);\n angle = (x < 0) ? Math.PI / 2 + atan : -Math.PI / 2 + atan;\n }\n return angle;\n}\n/** Finds angle between OX and the ray joining origin with (x, y) */\nfunction findAngleWithOX(x, y) {\n return findAngleWithOY(x, y) + Math.PI / 2;\n}\n/** Rotate the graph around the origin by 'angle' */\nfunction rotateCenteredGraph(atoms, angle) {\n if (angle !== 0) {\n const x = atoms.x;\n const y = atoms.y;\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n for (let i = 0; i < x.length; ++i) {\n const tmp = x[i];\n x[i] = keepPrecision(tmp * cos - y[i] * sin);\n y[i] = keepPrecision(tmp * sin + y[i] * cos);\n }\n }\n}\n/** Flip monomer graph around OX axis preserving stereometry */\nfunction flipMonomerAroundOX(monomer) {\n flipMolGraph(monomer, true);\n}\n/** Flip monomer graph around OY axis preserving stereometry */\nfunction flipMonomerAroundOY(monomer) {\n flipMolGraph(monomer, false);\n}\n/** Flip graph around a specified axis: 'true' corresponds to OX, 'false' to OY */\nfunction flipMolGraph(molGraph, axis) {\n if (axis) { // flipping around OX\n const y = molGraph.atoms.y;\n for (let i = 0; i < y.length; i++)\n y[i] = -y[i];\n }\n else { // flipping around OY\n const x = molGraph.atoms.x;\n for (let i = 0; i < x.length; i++)\n x[i] = -x[i];\n }\n // preserve the stereometry\n const orientation = molGraph.bonds.bondConfiguration;\n for (const [key, value] of orientation) {\n const newValue = value === 1 ? 3 : 1;\n orientation.set(key, newValue);\n }\n}\n/** Flips double-bonded 'O' in carbonyl group with 'OH' in order for the monomers\n * to have standard representation simplifying their concatenation. The\n * monomer must already be adjusted with adjustPeptideMonomerGraph in order for this function to be implemented */\nfunction flipHydroxilGroup(monomer, doubleBondedOxygen) {\n const x = monomer.atoms.x;\n // -1 below because indexing of nodes in molfiles starts from 1, unlike arrays\n if (x[monomer.meta.rNodes[1] - 1] > x[doubleBondedOxygen - 1])\n swapNodes(monomer, doubleBondedOxygen, monomer.meta.rNodes[1]);\n}\n/** Determine the number of node (starting from 1) corresponding to the\n * double-bonded oxygen of the carbonyl group */\nfunction findDoubleBondedCarbonylOxygen(monomer) {\n const bondsMap = constructBondsMap(monomer);\n let doubleBondedOxygen = 0;\n let i = 0;\n // iterate over the nodes bonded to the carbon and find the double one\n while (doubleBondedOxygen === 0) {\n const node = bondsMap.get(monomer.meta.terminalNodes[1])[i];\n if (monomer.atoms.atomTypes[node - 1] === OXYGEN && node !== monomer.meta.rNodes[1])\n doubleBondedOxygen = node;\n i++;\n }\n return doubleBondedOxygen;\n}\n/** Swap the Cartesian coordinates of the two specified nodes in MolGraph */\nfunction swapNodes(monomer, nodeOne, nodeTwo) {\n const nodeOneIdx = nodeOne - 1;\n const nodeTwoIdx = nodeTwo - 1;\n const x = monomer.atoms.x;\n const y = monomer.atoms.y;\n const tmpX = x[nodeOneIdx];\n const tmpY = y[nodeOneIdx];\n x[nodeOneIdx] = x[nodeTwoIdx];\n y[nodeOneIdx] = y[nodeTwoIdx];\n x[nodeTwoIdx] = tmpX;\n y[nodeTwoIdx] = tmpY;\n}\n/** Maps a node to the list of nodes bound to it */\nfunction constructBondsMap(monomer) {\n var _a;\n const map = new Map();\n for (const atomPairs of monomer.bonds.atomPairs) {\n for (let i = 0; i < 2; i++) {\n const key = atomPairs[i];\n const value = atomPairs[(i + 1) % 2];\n if (map.has(key))\n (_a = map.get(key)) === null || _a === void 0 ? void 0 : _a.push(value);\n else\n map.set(key, new Array(1).fill(value));\n }\n }\n return map;\n}\n/** Shift molGraph in the XOY plane */\nfunction shiftCoordinates(molGraph, xShift, yShift) {\n const x = molGraph.atoms.x;\n const y = molGraph.atoms.y;\n for (let i = 0; i < x.length; ++i) {\n x[i] = keepPrecision(x[i] + xShift);\n if (typeof yShift !== 'undefined')\n y[i] = keepPrecision(y[i] + yShift);\n }\n}\n/** Translate a sequence of monomer symbols into Molfile V3000 */\nfunction monomerSeqToMolfile(monomerSeq, monomersDict, alphabet, polymerType, mode) {\n if (monomerSeq.length === 0)\n return '';\n // throw new Error('monomerSeq is empty');\n // define atom and bond counts, taking into account the bond type\n const getAtomAndBondCounts = (mode === 0 /* MODE.STANDARD */) ?\n getResultingAtomBondCounts : getResultingAtomBondCountsST;\n const { atomCount, bondCount } = getAtomAndBondCounts(monomerSeq, monomersDict, alphabet, polymerType, mode);\n // create arrays to store lines of the resulting molfile\n const molfileAtomBlock = new Array(atomCount);\n const molfileBondBlock = new Array(bondCount);\n let addMonomerToMolblock; // todo: types?\n let sugar = null;\n let phosphate = null;\n if (mode === 0 /* MODE.STANDARD */) {\n if (polymerType === \"PEPTIDE\" /* HELM_POLYMER_TYPE.PEPTIDE */) {\n addMonomerToMolblock = addAminoAcidToMolblock;\n }\n else { // nucleotides\n addMonomerToMolblock = addNucleotideToMolblock;\n sugar = (alphabet === \"DNA\" /* ALPHABET.DNA */) ? monomersDict.get(DEOXYRIBOSE) : monomersDict.get(RIBOSE);\n phosphate = monomersDict.get(PHOSPHATE);\n }\n }\n else {\n addMonomerToMolblock = addMonomerToMolblockST;\n }\n const v = {\n i: 0,\n nodeShift: 0,\n bondShift: 0,\n backbonePositionShift: new Array(2).fill(0),\n branchPositionShift: new Array(2).fill(0),\n backboneAttachNode: 0,\n branchAttachNode: 0,\n flipFactor: 1,\n };\n const C = {\n sugar: sugar,\n phosphate: phosphate,\n seqLength: monomerSeq.length,\n atomCount: atomCount,\n bondCount: bondCount,\n };\n for (v.i = 0; v.i < C.seqLength; ++v.i) {\n const monomer = monomersDict.get(monomerSeq[v.i]);\n addMonomerToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v, C);\n }\n capResultingMolblock(molfileAtomBlock, molfileBondBlock, v, C, mode);\n const molfileCountsLine = V3K_BEGIN_COUNTS_LINE + atomCount + ' ' + bondCount + V3K_COUNTS_LINE_ENDING;\n // todo: possible optimization may be achieved by replacing .join('') with +=\n // since counterintuitively joining an array into a new string is reportedly\n // slower than using += as below\n let result = '';\n result += V3K_HEADER_FIRST_LINE;\n result += V3K_HEADER_SECOND_LINE;\n result += V3K_BEGIN_CTAB_BLOCK;\n result += molfileCountsLine;\n result += V3K_BEGIN_ATOM_BLOCK;\n result += molfileAtomBlock.join('');\n result += V3K_END_ATOM_BLOCK;\n result += V3K_BEGIN_BOND_BLOCK;\n result += molfileBondBlock.join('');\n result += V3K_END_BOND_BLOCK;\n result += V3K_END_CTAB_BLOCK;\n result += V3K_END;\n // return molfileParts.join('');\n return result;\n}\n/** Cap the resulting (after sewing up all the monomers) molfile with 'O' */\nfunction capResultingMolblock(molfileAtomBlock, molfileBondBlock, v, C, mode) {\n if (mode === 0 /* MODE.STANDARD */) {\n // add terminal oxygen\n const atomIdx = v.nodeShift + 1;\n molfileAtomBlock[C.atomCount] = V3K_BEGIN_DATA_LINE + atomIdx + ' ' +\n OXYGEN + ' ' + keepPrecision(v.backbonePositionShift[0]) + ' ' +\n v.flipFactor * keepPrecision(v.backbonePositionShift[1]) + ' ' + '0.000000 0' + '\\n';\n // add terminal bond\n const firstAtom = v.backboneAttachNode;\n const secondAtom = atomIdx;\n molfileBondBlock[C.bondCount] = V3K_BEGIN_DATA_LINE + v.bondShift + ' ' +\n 1 + ' ' + firstAtom + ' ' + secondAtom + '\\n';\n }\n}\nfunction addAminoAcidToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v) {\n v.flipFactor = Math.pow((-1), (v.i % 2)); // to flip every even monomer over OX\n addBackboneMonomerToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v);\n}\nfunction addMonomerToMolblockST(monomer, molfileAtomBlock, molfileBondBlock, v) {\n addBranchMonomerToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v);\n}\nfunction addBackboneMonomerToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v) {\n // todo: remove these comments to the docstrings of the corr. functions\n // construnct the lines of V3K molfile atom block\n fillAtomLines(monomer, molfileAtomBlock, v);\n // construct the lines of V3K molfile bond block\n fillBondLines(monomer, molfileBondBlock, v);\n // peptide bond\n fillChainExtendingBond(monomer, molfileBondBlock, v);\n // update branch variables if necessary\n if (monomer.meta.branchShift !== null && monomer.meta.terminalNodes.length > 2)\n updateBranchVariables(monomer, v);\n // update loop variables\n updateChainExtendingVariables(monomer, v);\n}\n/** Defined for 'standard mode' RNA monomers, i.e. of 'branch' type, as in\n * HELMCoreLibrary. Will not work in SEQ_TRAN mode */\nfunction addNucleotideToMolblock(nucleobase, molfileAtomBlock, molfileBondBlock, v, C) {\n // construnct the lines of V3K molfile atom block corresponding to phosphate\n // and sugar\n if (v.i === 0) {\n addBackboneMonomerToMolblock(C.sugar, molfileAtomBlock, molfileBondBlock, v);\n }\n else {\n for (const monomer of [C.phosphate, C.sugar])\n addBackboneMonomerToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v);\n }\n addBranchMonomerToMolblock(nucleobase, molfileAtomBlock, molfileBondBlock, v);\n}\nfunction addBranchMonomerToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v) {\n fillBranchAtomLines(monomer, molfileAtomBlock, v);\n fillBondLines(monomer, molfileBondBlock, v);\n fillBackboneToBranchBond(monomer, molfileBondBlock, v);\n // C-N bond\n const bondIdx = v.bondShift;\n const firstAtom = v.branchAttachNode;\n const secondAtom = monomer.meta.terminalNodes[0] + v.nodeShift;\n molfileBondBlock[bondIdx - 1] = V3K_BEGIN_DATA_LINE + bondIdx + ' ' +\n 1 + ' ' + firstAtom + ' ' + secondAtom + '\\n';\n // update loop variables\n v.bondShift += monomer.bonds.atomPairs.length + 1;\n v.nodeShift += monomer.atoms.atomTypes.length;\n}\nfunction updateChainExtendingVariables(monomer, v) {\n v.backboneAttachNode = v.nodeShift + monomer.meta.terminalNodes[1];\n v.bondShift += monomer.bonds.atomPairs.length + 1;\n v.nodeShift += monomer.atoms.atomTypes.length;\n v.backbonePositionShift[0] += monomer.meta.backboneShift[0]; // todo: non-null check\n v.backbonePositionShift[1] += v.flipFactor * monomer.meta.backboneShift[1];\n}\nfunction updateBranchVariables(monomer, v) {\n v.branchAttachNode = v.nodeShift + monomer.meta.terminalNodes[2];\n for (let i = 0; i < 2; ++i)\n v.branchPositionShift[i] = v.backbonePositionShift[i] + monomer.meta.branchShift[i];\n}\nfunction fillAtomLines(monomer, molfileAtomBlock, v) {\n for (let j = 0; j < monomer.atoms.atomTypes.length; ++j) {\n const atomIdx = v.nodeShift + j + 1;\n molfileAtomBlock[v.nodeShift + j] = V3K_BEGIN_DATA_LINE + atomIdx + ' ' +\n monomer.atoms.atomTypes[j] + ' ' +\n keepPrecision(v.backbonePositionShift[0] + monomer.atoms.x[j]) + ' ' +\n keepPrecision(v.backbonePositionShift[1] + v.flipFactor * monomer.atoms.y[j]) +\n ' ' + monomer.atoms.kwargs[j];\n }\n}\n// todo: remove as quickfix\nfunction fillBranchAtomLines(monomer, molfileAtomBlock, v) {\n for (let j = 0; j < monomer.atoms.atomTypes.length; ++j) {\n const atomIdx = v.nodeShift + j + 1;\n molfileAtomBlock[v.nodeShift + j] = V3K_BEGIN_DATA_LINE + atomIdx + ' ' +\n monomer.atoms.atomTypes[j] + ' ' +\n keepPrecision(v.branchPositionShift[0] + monomer.atoms.x[j]) + ' ' +\n keepPrecision(v.branchPositionShift[1] + v.flipFactor * monomer.atoms.y[j]) +\n ' ' + monomer.atoms.kwargs[j];\n }\n}\nfunction fillBondLines(monomer, molfileBondBlock, v) {\n // construct the lines of V3K molfile bond block\n for (let j = 0; j < monomer.bonds.atomPairs.length; ++j) {\n const bondIdx = v.bondShift + j + 1;\n const firstAtom = monomer.bonds.atomPairs[j][0] + v.nodeShift;\n const secondAtom = monomer.bonds.atomPairs[j][1] + v.nodeShift;\n let bondCfg = '';\n if (monomer.bonds.bondConfiguration.has(j)) {\n // flip orientation when necessary\n let orientation = monomer.bonds.bondConfiguration.get(j);\n if (v.flipFactor < 0)\n orientation = (orientation === 1) ? 3 : 1;\n bondCfg = ' CFG=' + orientation;\n }\n const kwargs = monomer.bonds.kwargs.has(j) ?\n ' ' + monomer.bonds.kwargs.get(j) : '';\n molfileBondBlock[v.bondShift + j] = V3K_BEGIN_DATA_LINE + bondIdx + ' ' +\n monomer.bonds.bondTypes[j] + ' ' +\n firstAtom + ' ' + secondAtom + bondCfg + kwargs + '\\n';\n }\n}\nfunction fillChainExtendingBond(monomer, molfileBondBlock, v) {\n if (v.backboneAttachNode !== 0) {\n const bondIdx = v.bondShift;\n const firstAtom = v.backboneAttachNode;\n const secondAtom = monomer.meta.terminalNodes[0] + v.nodeShift;\n molfileBondBlock[v.bondShift - 1] = V3K_BEGIN_DATA_LINE + bondIdx + ' ' +\n 1 + ' ' + firstAtom + ' ' + secondAtom + '\\n';\n }\n}\n// todo: remove\nfunction fillBackboneToBranchBond(branchMonomer, molfileBondBlock, v) {\n const bondIdx = v.bondShift;\n const firstAtom = v.branchAttachNode;\n const secondAtom = branchMonomer.meta.terminalNodes[0] + v.nodeShift;\n molfileBondBlock[bondIdx - 1] = V3K_BEGIN_DATA_LINE + bondIdx + ' ' +\n 1 + ' ' + firstAtom + ' ' + secondAtom + '\\n';\n}\n/** Compute the atom/bond counts for the resulting molfile, depending on the\n * type of polymer (peptide/nucleotide) */\nfunction getResultingAtomBondCounts(monomerSeq, monomersDict, alphabet, polymerType, mode) {\n let atomCount = 0;\n let bondCount = 0;\n // sum up all the atoms/nodes provided by the sequence\n for (const monomerSymbol of monomerSeq) {\n if (monomerSymbol === '')\n continue; // Skip for gap/empty monomer in MSA\n const monomer = monomersDict.get(monomerSymbol);\n atomCount += monomer.atoms.x.length;\n bondCount += monomer.bonds.bondTypes.length;\n }\n // add extra values depending on the polymer type\n if (mode === 0 /* MODE.STANDARD */) {\n if (polymerType === \"PEPTIDE\" /* HELM_POLYMER_TYPE.PEPTIDE */) {\n // add the rightmost/terminating cap group 'OH' (i.e. 'O')\n atomCount += 1;\n // add chain-extending bonds (C-NH per each monomer pair and terminal C-OH)\n bondCount += monomerSeq.length;\n }\n else { // nucleotides\n const sugar = (alphabet === \"DNA\" /* ALPHABET.DNA */) ?\n monomersDict.get(DEOXYRIBOSE) : monomersDict.get(RIBOSE);\n const phosphate = monomersDict.get(PHOSPHATE);\n // add phosphate per each pair of nucleobase symbols\n atomCount += (monomerSeq.length - 1) * phosphate.atoms.x.length;\n // add sugar per each nucleobase symbol\n atomCount += monomerSeq.length * sugar.atoms.x.length;\n // add the leftmost cap group 'OH' (i.e. 'O')\n atomCount += 1;\n // add bonds from phosphate monomers\n bondCount += (monomerSeq.length - 1) * phosphate.bonds.bondTypes.length;\n // add bonds from sugar monomers\n bondCount += monomerSeq.length * sugar.bonds.bondTypes.length;\n // exclude the first chain-extending bond O-P (absent, no 'leftmost' phosphate)\n bondCount -= 1;\n // add chain-extending and branch bonds (O-P, C-O and C-N per each nucleotide)\n bondCount += monomerSeq.length * 3;\n }\n }\n else {\n // todo: fill for SequenceTranslator\n }\n return { atomCount, bondCount };\n}\n/** Keep precision upon floating point operations over atom coordinates */\nfunction keepPrecision(x) {\n return Math.round(PRECISION_FACTOR * x) / PRECISION_FACTOR;\n}\nfunction convertMolGraphToMolfileV3K(molGraph) {\n // counts line\n const atomType = molGraph.atoms.atomTypes;\n const x = molGraph.atoms.x;\n const y = molGraph.atoms.y;\n const atomKwargs = molGraph.atoms.kwargs;\n const bondType = molGraph.bonds.bondTypes;\n const atomPair = molGraph.bonds.atomPairs;\n const bondKwargs = molGraph.bonds.kwargs;\n const bondConfig = molGraph.bonds.bondConfiguration;\n const atomCount = atomType.length;\n const bondCount = molGraph.bonds.bondTypes.length;\n // todo rewrite using constants\n const molfileCountsLine = V3K_BEGIN_COUNTS_LINE + atomCount + ' ' + bondCount + V3K_COUNTS_LINE_ENDING;\n // atom block\n let molfileAtomBlock = '';\n for (let i = 0; i < atomCount; ++i) {\n const atomIdx = i + 1;\n const coordinate = [x[i].toString(), y[i].toString()];\n // format coordinates so that they have 6 digits after decimal point\n // for (let k = 0; k < 2; ++k) {\n // const formatted = coordinate[k].toString().split('.');\n // if (formatted.length === 1)\n // formatted.push('0');\n // formatted[1] = formatted[1].padEnd(V3K_ATOM_COORDINATE_PRECISION, '0');\n // coordinate[k] = formatted.join('.');\n // }\n const atomLine = V3K_BEGIN_DATA_LINE + atomIdx + ' ' + atomType[i] + ' ' +\n coordinate[0] + ' ' + coordinate[1] + ' ' + atomKwargs[i];\n molfileAtomBlock += atomLine;\n }\n // bond block\n let molfileBondBlock = '';\n for (let i = 0; i < bondCount; ++i) {\n const bondIdx = i + 1;\n const firstAtom = atomPair[i][0];\n const secondAtom = atomPair[i][1];\n const kwargs = bondKwargs.has(i) ? ' ' + bondKwargs.get(i) : '';\n const bondCfg = bondConfig.has(i) ? ' CFG=' + bondConfig.get(i) : '';\n const bondLine = V3K_BEGIN_DATA_LINE + bondIdx + ' ' + bondType[i] + ' ' +\n firstAtom + ' ' + secondAtom + bondCfg + kwargs + '\\n';\n molfileBondBlock += bondLine;\n }\n const molfileParts = [\n V3K_HEADER_FIRST_LINE,\n V3K_HEADER_SECOND_LINE,\n V3K_BEGIN_CTAB_BLOCK,\n molfileCountsLine,\n V3K_BEGIN_ATOM_BLOCK,\n molfileAtomBlock,\n V3K_END_ATOM_BLOCK,\n V3K_BEGIN_BOND_BLOCK,\n molfileBondBlock,\n V3K_END_BOND_BLOCK,\n V3K_END_CTAB_BLOCK,\n V3K_END,\n ];\n const resultingMolfile = molfileParts.join('');\n // console.log(resultingMolfile);\n return resultingMolfile;\n}\nexport function getSymbolToCappedMolfileMap(monomersLibList) {\n return __awaiter(this, void 0, void 0, function* () {\n if (DG.Func.find({ package: 'Chem', name: 'getRdKitModule' }).length === 0) {\n grok.shell.warning('Transformation to atomic level requires package \"Chem\" installed.');\n return;\n }\n const symbolToCappedMolfileMap = new Map();\n const moduleRdkit = yield grok.functions.call('Chem:getRdKitModule');\n for (const monomerLibObject of monomersLibList) {\n const monomerSymbol = monomerLibObject[\"symbol\" /* HELM_FIELDS.SYMBOL */];\n const capGroups = parseCapGroups(monomerLibObject[\"rgroups\" /* HELM_FIELDS.RGROUPS */]);\n const capGroupIdxMap = parseCapGroupIdxMap(monomerLibObject[\"molfile\" /* HELM_FIELDS.MOLFILE */]);\n const molfileV3K = convertMolfileToV3K(removeRGroupLines(monomerLibObject[\"molfile\" /* HELM_FIELDS.MOLFILE */]), moduleRdkit);\n const counts = parseAtomAndBondCounts(molfileV3K);\n const atoms = parseAtomBlock(molfileV3K, counts.atomCount);\n const bonds = parseBondBlock(molfileV3K, counts.bondCount);\n const meta = getMonomerMetadata(atoms, bonds, capGroups, capGroupIdxMap);\n const monomerGraph = { atoms: atoms, bonds: bonds, meta: meta };\n removeHydrogen(monomerGraph);\n const molfile = convertMolGraphToMolfileV3K(monomerGraph);\n symbolToCappedMolfileMap.set(monomerSymbol, molfile);\n }\n return symbolToCappedMolfileMap;\n });\n}\n/** Get the V3K molfile corresponding to the capped Monomer (default cap groups) */\nexport function capPeptideMonomer(monomer) {\n const funcList = DG.Func.find({ package: 'Chem', name: 'getRdKitModule' });\n const moduleRdkit = funcList[0].apply();\n const capGroups = parseCapGroups(monomer[\"rgroups\" /* HELM_FIELDS.RGROUPS */]);\n const capGroupIdxMap = parseCapGroupIdxMap(monomer[\"molfile\" /* HELM_FIELDS.MOLFILE */]);\n const molfileV3K = convertMolfileToV3K(removeRGroupLines(monomer[\"molfile\" /* HELM_FIELDS.MOLFILE */]), moduleRdkit);\n const counts = parseAtomAndBondCounts(molfileV3K);\n const atoms = parseAtomBlock(molfileV3K, counts.atomCount);\n const bonds = parseBondBlock(molfileV3K, counts.bondCount);\n const meta = getMonomerMetadata(atoms, bonds, capGroups, capGroupIdxMap);\n const monomerGraph = { atoms: atoms, bonds: bonds, meta: meta };\n adjustPeptideMonomerGraph(monomerGraph);\n const molfile = convertMolGraphToMolfileV3K(monomerGraph);\n return molfile;\n}\n/////////////// Sequence translator /////////////////\n/** Currently the ST has peculiar types of monomers, which do not fit the HELM\n * Core library types (in particular, the RNA monomers are backbones only,\n * and presented in Molfile V3K format).\n * TODO: integrate this part with the above functionality\n * Custom _toAtomicLevel version for SequenceTranslator\n */\nexport function sequenceToMolFileST(monomerSeq, // sequence of values of 'symbol' field for monomers\nsymbolToMolfileV3KObj // mapping of symbol to molfile V3000\n) {\n // work in SEQ_TRAN mode, where:\n // - monomers with polymerType 'RNA' have monomer type 'backbone'\n // - the library provides molfiles in format V3000\n const mode = 1 /* MODE.SEQ_TRAN */;\n const alphabet = \"PT\" /* ALPHABET.PT */; // dummy value! todo: make the argument optional\n const polymerType = \"RNA\" /* HELM_POLYMER_TYPE.RNA */; // dummy value! todo: make the argument optional\n // todo: consider refactoring from obj to map in monomer-worls\n const symbolToMolfileV3KMap = new Map();\n for (const sym in symbolToMolfileV3KObj)\n symbolToMolfileV3KMap.set(sym, symbolToMolfileV3KObj[sym]);\n const monomersDict = getMonomersDictFromMap(symbolToMolfileV3KMap);\n const result = monomerSeqToMolfile(monomerSeq, monomersDict, alphabet, polymerType, mode);\n // console.log(reconstructed[row]);\n return result;\n}\n/** Compute the atom/bond counts for the resulting molfile, depending on the\n * type of polymer (peptide/nucleotide) */\nfunction getResultingAtomBondCountsST(monomerSeq, monomersDict, alphabet, polymerType) {\n let atomCount = 0;\n let bondCount = 0;\n // sum up all the atoms/nodes provided by the sequence\n for (const monomerSymbol of monomerSeq) {\n const monomer = monomersDict.get(monomerSymbol);\n atomCount += monomer.atoms.x.length;\n bondCount += monomer.bonds.bondTypes.length;\n }\n // add extra values depending on the polymer type\n if (polymerType === \"PEPTIDE\" /* HELM_POLYMER_TYPE.PEPTIDE */) {\n // add the rightmost/terminating cap group 'OH' (i.e. 'O')\n atomCount += 1;\n // add chain-extending bonds (C-NH per each monomer pair and terminal C-OH)\n bondCount += monomerSeq.length;\n }\n else { // nucleotides\n const sugar = (alphabet === \"DNA\" /* ALPHABET.DNA */) ?\n monomersDict.get(DEOXYRIBOSE) : monomersDict.get(RIBOSE);\n const phosphate = monomersDict.get(PHOSPHATE);\n // add phosphate and sugar per each nucleobase symbol\n atomCount += monomerSeq.length * (phosphate.atoms.x.length + sugar.atoms.x.length);\n // add the leftmost cap group 'OH' (i.e. 'O') to the first phosphate\n atomCount += 1;\n // add bonds from phosphate and sugar\n bondCount += monomerSeq.length * (phosphate.bonds.bondTypes.length + sugar.bonds.bondTypes.length);\n // add chain-extending and branch bonds (O-P, C-O and C-N per each nucleotide)\n bondCount += monomerSeq.length * 3;\n }\n return { atomCount, bondCount };\n}\n//# sourceMappingURL=to-atomic-level.js.map","import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\n\nimport {CHEM_SIMILARITY_METRICS} from '@datagrok-libraries/ml/src/distance-metrics-methods';\nimport {TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport * as C from '../utils/constants';\n\nexport class SequenceSearchBaseViewer extends DG.JsViewer {\n name: string = '';\n distanceMetric: string;\n limit: number;\n fingerprint: string;\n metricsProperties = ['distanceMetric', 'fingerprint'];\n fingerprintChoices = ['Morgan', 'Pattern'];\n moleculeColumn?: DG.Column|null;\n moleculeColumnName: string;\n initialized: boolean = false;\n tags = [DG.TAGS.UNITS, bioTAGS.aligned, bioTAGS.separator, bioTAGS.alphabet];\n\n constructor(name: string) {\n super();\n this.fingerprint = this.string('fingerprint', this.fingerprintChoices[0], {choices: this.fingerprintChoices});\n this.limit = this.int('limit', 10);\n this.distanceMetric = this.string('distanceMetric', CHEM_SIMILARITY_METRICS[0], {choices: CHEM_SIMILARITY_METRICS});\n this.moleculeColumnName = this.string('moleculeColumnName');\n this.name = name;\n }\n\n init(): void {\n this.initialized = true;\n }\n\n detach(): void {\n this.subs.forEach((sub) => sub.unsubscribe());\n }\n\n async onTableAttached(): Promise<void> {\n this.init();\n\n if (this.dataFrame) {\n this.subs.push(DG.debounce(this.dataFrame.onRowsRemoved, 50).subscribe(async (_: any) => await this.render()));\n const compute = this.name !== 'diversity';\n this.subs.push(DG.debounce(this.dataFrame.onCurrentRowChanged, 50)\n .subscribe(async (_: any) => await this.render(compute)));\n this.subs.push(DG.debounce(this.dataFrame.selection.onChanged, 50)\n .subscribe(async (_: any) => await this.render(false)));\n this.subs.push(DG.debounce(ui.onSizeChanged(this.root), 50)\n .subscribe(async (_: any) => await this.render(false)));\n this.moleculeColumn = this.dataFrame.columns.bySemType(DG.SEMTYPE.MACROMOLECULE);\n this.moleculeColumnName = this.moleculeColumn?.name!;\n this.getProperty('limit')!.fromOptions({min: 1, max: this.dataFrame.rowCount});\n }\n await this.render();\n }\n\n onPropertyChanged(property: DG.Property): void {\n super.onPropertyChanged(property);\n if (!this.initialized)\n return;\n if (property.name === 'moleculeColumnName') {\n const col = this.dataFrame.col(property.get(this))!;\n if (col.semType === DG.SEMTYPE.MACROMOLECULE)\n this.moleculeColumn = col;\n }\n this.render();\n }\n\n async render(computeData = true) {\n\n }\n\n beforeRender() {\n if (!this.initialized)\n return false;\n if (this.dataFrame && this.moleculeColumnName &&\n this.dataFrame.col(this.moleculeColumnName)!.semType !== DG.SEMTYPE.MACROMOLECULE) {\n grok.shell.error(`${this.moleculeColumnName} is not Macromolecule type`);\n return false;\n }\n return true;\n }\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {SequenceSearchBaseViewer} from './sequence-search-base-viewer';\nimport {getMonomericMols} from '../calculations/monomerLevelMols';\nimport * as C from '../utils/constants';\nimport {createDifferenceCanvas, createDifferencesWithPositions} from './sequence-activity-cliffs';\nimport {updateDivInnerHTML} from '../utils/ui-utils';\nimport {Subject} from 'rxjs';\nimport {TAGS as bioTAGS, getSplitter} from '@datagrok-libraries/bio/src/utils/macromolecule';\n\nexport class SequenceSimilarityViewer extends SequenceSearchBaseViewer {\n hotSearch: boolean;\n sketchedMolecule: string = '';\n curIdx: number = 0;\n molCol: DG.Column | null = null;\n idxs: DG.Column | null = null;\n scores: DG.Column | null = null;\n cutoff: number;\n gridSelect: boolean = false;\n targetMoleculeIdx: number = 0;\n computeCompleted = new Subject<boolean>();\n\n constructor() {\n super('similarity');\n this.cutoff = this.float('cutoff', 0.01, {min: 0, max: 1});\n this.hotSearch = this.bool('hotSearch', true);\n }\n\n init(): void {\n this.hotSearch = true;\n this.initialized = true;\n }\n\n async render(computeData = true): Promise<void> {\n if (!this.beforeRender())\n return;\n if (this.moleculeColumn) {\n this.curIdx = this.dataFrame!.currentRowIdx == -1 ? 0 : this.dataFrame!.currentRowIdx;\n if (computeData && !this.gridSelect) {\n this.targetMoleculeIdx = this.dataFrame!.currentRowIdx == -1 ? 0 : this.dataFrame!.currentRowIdx;\n const monomericMols = await getMonomericMols(this.moleculeColumn);\n //need to create df to calculate fingerprints\n const monomericMolsDf = DG.DataFrame.fromColumns([monomericMols]);\n const df = await grok.functions.call('Chem:callChemSimilaritySearch', {\n df: this.dataFrame,\n col: monomericMols,\n molecule: monomericMols.get(this.targetMoleculeIdx),\n metricName: this.distanceMetric,\n limit: this.limit,\n minScore: this.cutoff,\n fingerprint: this.fingerprint\n });\n this.idxs = df.getCol('indexes');\n this.scores = df.getCol('score');\n this.molCol = DG.Column.string('sequence',\n this.idxs!.length).init((i) => this.moleculeColumn?.get(this.idxs?.get(i)));\n this.molCol.semType = DG.SEMTYPE.MACROMOLECULE;\n this.tags.forEach((tag) => this.molCol!.setTag(tag, this.moleculeColumn!.getTag(tag)));\n const resDf = DG.DataFrame.fromColumns([this.idxs!, this.molCol!, this.scores!]);\n resDf.onCurrentRowChanged.subscribe((_) => {\n this.dataFrame.currentRowIdx = resDf.col('indexes')!.get(resDf.currentRowIdx);\n setTimeout(() => { this.createPropertyPanel(resDf); }, 1000);\n this.gridSelect = true;\n });\n const grid = resDf.plot.grid();\n grid.col('indexes')!.visible = false;\n const targetMolRow = this.idxs?.getRawData().findIndex((it) => it == this.targetMoleculeIdx);\n const targetScoreCell = grid.cell('score', targetMolRow!);\n targetScoreCell.cell.value = null;\n (grok.shell.v as DG.TableView).grid.root.addEventListener('click', (event: MouseEvent) => {\n this.gridSelect = false;\n });\n updateDivInnerHTML(this.root, grid.root);\n this.computeCompleted.next(true);\n }\n }\n }\n\n\n createPropertyPanel(resDf: DG.DataFrame) {\n const propPanel = ui.div();\n const molDifferences: { [key: number]: HTMLCanvasElement } = {};\n const units = resDf.col('sequence')!.getTag(DG.TAGS.UNITS);\n const separator = resDf.col('sequence')!.getTag(bioTAGS.separator);\n const splitter = getSplitter(units, separator);\n const subParts1 = splitter(this.moleculeColumn!.get(this.targetMoleculeIdx));\n const subParts2 = splitter(resDf.get('sequence', resDf.currentRowIdx));\n const canvas = createDifferenceCanvas(subParts1, subParts2, units, molDifferences);\n propPanel.append(ui.div(canvas, {style: {width: '300px', overflow: 'scroll'}}));\n if (subParts1.length !== subParts2.length) {\n propPanel.append(ui.divV([\n ui.divText(`Different sequence length:`, {style: {fontWeight: 'bold'}}),\n ui.divText(`target: ${subParts1.length} monomers`),\n ui.divText(`selected: ${subParts2.length} monomers`)\n ], {style: {paddingBottom: '10px'}}));\n }\n propPanel.append(createDifferencesWithPositions(molDifferences));\n const acc = ui.accordion();\n const accIcon = ui.element('i');\n accIcon.className = 'grok-icon svg-icon svg-view-layout';\n acc.addTitle(ui.span([accIcon, ui.label(`Similarity search`)]));\n acc.addPane('Differences', () => propPanel, true);\n grok.shell.o = acc.root;\n }\n}\n","import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\n\nimport BitArray from '@datagrok-libraries/utils/src/bit-array';\nimport {getDiverseSubset} from '@datagrok-libraries/utils/src/similarity-metrics';\nimport $ from 'cash-dom';\nimport {ArrayUtils} from '@datagrok-libraries/utils/src/array-utils';\nimport {SequenceSearchBaseViewer} from './sequence-search-base-viewer';\nimport {getMonomericMols} from '../calculations/monomerLevelMols';\nimport {updateDivInnerHTML} from '../utils/ui-utils';\nimport {Subject} from 'rxjs';\n\nexport class SequenceDiversityViewer extends SequenceSearchBaseViewer {\n renderMolIds: number[] | null = null;\n columnNames = [];\n computeCompleted = new Subject<boolean>();\n\n constructor() {\n super('diversity');\n }\n\n\n async render(computeData = true): Promise<void> {\n if (!this.beforeRender())\n return;\n if (this.dataFrame) {\n if (computeData && this.moleculeColumn) {\n const monomericMols = await getMonomericMols(this.moleculeColumn);\n //need to create df to calculate fingerprints\n const monomericMolsDf = DG.DataFrame.fromColumns([monomericMols]);\n this.renderMolIds =\n await grok.functions.call('Chem:callChemDiversitySearch', {\n col: monomericMols,\n metricName: this.distanceMetric,\n limit: this.limit,\n fingerprint: this.fingerprint\n });\n const resCol = DG.Column.string('sequence', this.renderMolIds!.length)\n .init((i) => this.moleculeColumn?.get(this.renderMolIds![i]));\n resCol.semType = DG.SEMTYPE.MACROMOLECULE;\n this.tags.forEach((tag) => resCol.setTag(tag, this.moleculeColumn!.getTag(tag)));\n const resDf = DG.DataFrame.fromColumns([resCol]);\n updateDivInnerHTML(this.root, resDf.plot.grid().root);\n this.computeCompleted.next(true);\n }\n }\n }\n}\n","import { calculateEuclideanDistance, calcDistanceMatrix, fillRandomMatrix, vectorAdd, } from '@datagrok-libraries/utils/src/vector-operations';\nimport { randomInt } from '@datagrok-libraries/utils/src/random';\n/**\n * Implements stochastic proximity embedding.\n *\n * @export\n * @class SPEBase\n * @link doi:10.1016/S1093-3263(03)00155-4\n */\nexport class SPEBase {\n /**\n * Creates an instance of SPEBase.\n * @param {Options} [options] Options to pass to the constructor.\n * @memberof SPEBase\n */\n constructor(options) {\n var _a, _b, _c, _d, _e, _f, _g;\n this.steps = (_a = options === null || options === void 0 ? void 0 : options.steps) !== null && _a !== void 0 ? _a : 0;\n this.cycles = (_b = options === null || options === void 0 ? void 0 : options.cycles) !== null && _b !== void 0 ? _b : 1e6;\n // Select a cutoff distance {cutoff} and ...\n this.cutoff = (_c = options === null || options === void 0 ? void 0 : options.cutoff) !== null && _c !== void 0 ? _c : 0;\n // ... an initial learning rate {lambda} > 0\n this.lambda = (_d = options === null || options === void 0 ? void 0 : options.lambda) !== null && _d !== void 0 ? _d : 2.0;\n this.dlambda = (_e = options === null || options === void 0 ? void 0 : options.dlambda) !== null && _e !== void 0 ? _e : 0.01;\n this.lambda2 = this.lambda / 2.;\n this.dlambda2 = this.dlambda / 2.;\n this.epsilon = (_f = options === null || options === void 0 ? void 0 : options.epsilon) !== null && _f !== void 0 ? _f : 1e-10;\n // eslint-disable-next-line brace-style\n this.distanceFunction = (_g = options === null || options === void 0 ? void 0 : options.distance) !== null && _g !== void 0 ? _g : calculateEuclideanDistance;\n this.distance = [];\n }\n /**\n * Initializes distance matrix.\n *\n * @param {Vectors} vectors Input vectors to calculate distance between.\n * @memberof SPEBase\n */\n initDistance(vectors) {\n this.distance = calcDistanceMatrix(vectors, this.distanceFunction);\n }\n /**\n * Calculates distance between the two vectors given.\n *\n * @param {Vectors} vectors Set of vectors to calculate distances between.\n * @param {number} index1 Index of the first vector of the pair.\n * @param {number} index2 Index of the second vector of the pair.\n * @return {number} Distance between these two vectors.\n */\n calcDistance(vectors, index1, index2) {\n return this.distance[index1][index2];\n }\n /**\n * Embeds the vectors given into a two-dimensional space.\n *\n * @param {Vectors} vectors D-dimensional coordinates.\n * @return {Coordinates} SPE coordinates in D space.\n */\n embed(vectors) {\n const nItems = vectors.length;\n const areaWidth = 40;\n // Initialize the D-dimensional coordinates of the N points.\n const coordinates = fillRandomMatrix(nItems, SPEBase.dimension, areaWidth);\n let lambda2 = this.lambda2;\n if (this.steps == 0) {\n this.steps = vectors.length - 1;\n }\n this.initDistance(vectors);\n for (let cycle = 0; cycle < this.cycles; ++cycle) {\n for (let step = 0; step < this.steps; ++step) {\n // Select two points, i and j, at random, ...\n const i = randomInt(nItems);\n let j = randomInt(nItems);\n while (i == j)\n j = randomInt(nItems);\n const rowi = coordinates[i];\n const rowj = coordinates[j];\n // ... retrieve (or evaluate) their proximity in the input space, rij and ...\n const r = this.calcDistance(vectors, i, j);\n // ... compute their Euclidean distance on the D-dimensional map, dij.\n const d = calculateEuclideanDistance(rowi, rowj);\n // If rij <= rc, or if rij > rc and dij < rij ...\n if ((this.cutoff == 0) || (r <= this.cutoff) || (d < r)) {\n const multiplier = lambda2 * (r - d) / (d + this.epsilon);\n // ... update the coordinates xi and xj.\n const diffIJ = vectorAdd(rowi, rowj, -1);\n coordinates[i] = vectorAdd(rowi, diffIJ, multiplier);\n coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);\n }\n }\n // Decrease the learning rate {lambda} by a prescribed {dlambda}.\n lambda2 -= this.dlambda2;\n if (lambda2 <= 0.) {\n break;\n }\n }\n return coordinates;\n }\n}\nSPEBase.dimension = 2;\n/**\n * Implements modified stochastic proximity embedding.\n *\n * @export\n * @class PSPEBase\n * @link doi:10.1016/S1093-3263(03)00155-4\n */\nexport class PSPEBase extends SPEBase {\n /**\n * Embeds the vectors given into a two-dimensional space using a modified update rule.\n *\n * @param {Vectors} vectors D-dimensional coordinates.\n * @return {Coordinates} SPE coordinates in D space.\n */\n embed(vectors) {\n const nItems = vectors.length;\n const areaWidth = 40;\n // Initialize the D-dimensional coordinates of the N points.\n const coordinates = fillRandomMatrix(nItems, PSPEBase.dimension, areaWidth);\n let lambda = this.lambda;\n this.initDistance(vectors);\n for (let cycle = 0; cycle < this.cycles; ++cycle) {\n // Select a point, i, at random (pivot).\n const i = randomInt(nItems);\n const rowi = coordinates[i];\n // For every point j != i ...\n for (let j = 0; j < nItems; ++j) {\n if (i == j)\n continue;\n const rowj = coordinates[j];\n // ... retrieve (or evaluate) its proximity to i in the input space, rij ...\n const r = this.calcDistance(vectors, i, j);\n // ... and compute their Euclidean distance on the D-dimensional map, dij.\n const d = calculateEuclideanDistance(rowi, rowj);\n // If rij <= rc, or if rij > rc and dij < rij ...\n if ((this.cutoff == 0) || (r <= this.cutoff) || (d < r)) {\n const multiplier = lambda * (r - d) / (d + this.epsilon);\n const diffIJ = vectorAdd(rowi, rowj, -1);\n // ... update the coordinates xj.\n coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);\n }\n }\n // Decrease the learning rate {lambda} by a prescribed {dlambda}.\n lambda -= this.dlambda;\n if (lambda <= 0.) {\n break;\n }\n }\n return coordinates;\n }\n}\n/**\n * Implements modified stochastic proximity embedding.\n *\n * @export\n * @class OriginalSPE\n * @link doi:10.1002/jcc.10234\n */\nexport class OriginalSPE extends SPEBase {\n constructor(options) {\n var _a, _b, _c, _d, _e;\n super(options);\n this.cycles = (_a = options === null || options === void 0 ? void 0 : options.cycles) !== null && _a !== void 0 ? _a : 1e3;\n this.steps = (_b = options === null || options === void 0 ? void 0 : options.steps) !== null && _b !== void 0 ? _b : 100000;\n this.radiusPercent = (_c = options === null || options === void 0 ? void 0 : options.radiusPercent) !== null && _c !== void 0 ? _c : 1.0;\n this.maxDistance = (_d = options === null || options === void 0 ? void 0 : options.maxDistance) !== null && _d !== void 0 ? _d : null;\n this.maxDistanceSteps = (_e = options === null || options === void 0 ? void 0 : options.maxDistanceSteps) !== null && _e !== void 0 ? _e : null;\n }\n embed(vectors) {\n const nItems = vectors.length;\n const areaWidth = 40;\n // Initialize the D-dimensional coordinates of the N points.\n const coordinates = fillRandomMatrix(nItems, OriginalSPE.dimension, areaWidth);\n this.initDistance(vectors);\n if (this.maxDistanceSteps == null) {\n this.maxDistanceSteps = nItems * Math.floor((nItems - 1) / 2);\n }\n if (this.maxDistance == null) {\n this.maxDistance = -1e37;\n for (let n = 0; n < this.maxDistanceSteps; n++) {\n const i = randomInt(nItems);\n let j = randomInt(nItems);\n while (i == j)\n j = randomInt(nItems);\n const d = this.calcDistance(vectors, i, j);\n if (d > this.maxDistance) {\n this.maxDistance = d;\n }\n }\n }\n let lambda = this.lambda;\n const radius = (this.radiusPercent == 0.0) ? this.maxDistance : this.maxDistance * this.radiusPercent;\n for (let cycle = 0; cycle < this.cycles; ++cycle) {\n for (let step = 0; step < this.steps; ++step) {\n // Select two points, i and j, at random, ...\n const i = randomInt(nItems);\n let j = randomInt(nItems);\n while (i == j)\n j = randomInt(nItems);\n const rowi = coordinates[i];\n const rowj = coordinates[j];\n // retrieve (or evaluate) their proximity in the input space, rij and ...\n const r = this.calcDistance(vectors, i, j);\n // compute their Euclidean distance on the D-dimensional map, dij.\n const d = calculateEuclideanDistance(rowi, rowj);\n if ((r <= radius) || (d < r)) {\n const multiplier = lambda * 0.5 * (r - d) / (d + this.epsilon);\n // ... update the coordinates xi and xj.\n const diffIJ = vectorAdd(rowi, rowj, -1);\n coordinates[i] = vectorAdd(rowi, diffIJ, multiplier);\n coordinates[j] = vectorAdd(rowj, diffIJ, -multiplier);\n }\n }\n lambda -= ((this.lambda - this.dlambda) / (this.cycles - 1.0));\n ;\n if (lambda < this.dlambda) {\n break;\n }\n }\n return coordinates;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixTQUFTLEdBQ1YsTUFBTSxpREFBaUQsQ0FBQztBQUN6RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFFL0Q7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLE9BQU87SUFhbEI7Ozs7T0FJRztJQUNILFlBQVksT0FBaUI7O1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsS0FBSyxtQ0FBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxNQUFNLG1DQUFJLEdBQUcsQ0FBQztRQUNyQyw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxNQUFNLG1DQUFJLENBQUMsQ0FBQztRQUNuQyw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxNQUFNLG1DQUFJLEdBQUcsQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE9BQU8sbUNBQUksSUFBSSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBQyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFDLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE9BQU8s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bnRlbnQiOlsiaW1wb3J0IHtPcHRpb25zLCBDb29yZGluYXRlcywgVmVjdG9ycywgRGlzdGFuY2VNZXRyaWN9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlLFxuICBjYWxjRGlzdGFuY2VNYXRyaXgsXG4gIGZpbGxSYW5kb21NYXRyaXgsXG4gIHZlY3RvckFkZCxcbn0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdmVjdG9yLW9wZXJhdGlvbnMnO1xuaW1wb3J0IHtyYW5kb21JbnR9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3JhbmRvbSc7XG5cbi8qKlxuICogSW1wbGVtZW50cyBzdG9jaGFzdGljIHByb3hpbWl0eSBlbWJlZGRpbmcuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFNQRUJhc2VcbiAqIEBsaW5rIGRvaToxMC4xMDE2L1MxMDkzLTMyNjMoMDMpMDAxNTUtNFxuICovXG5leHBvcnQgY2xhc3MgU1BFQmFzZSB7XG4gIHByb3RlY3RlZCBzdGF0aWMgZGltZW5zaW9uID0gMjtcbiAgcHJvdGVjdGVkIHN0ZXBzOiBudW1iZXI7XG4gIHByb3RlY3RlZCBjeWNsZXM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGN1dG9mZjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgbGFtYmRhOiBudW1iZXI7XG4gIHByb3RlY3RlZCBkbGFtYmRhOiBudW1iZXI7XG4gIHByb3RlY3RlZCBsYW1iZGEyOiBudW1iZXI7XG4gIHByb3RlY3RlZCBkbGFtYmRhMjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgZXBzaWxvbjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgZGlzdGFuY2VGdW5jdGlvbjogRGlzdGFuY2VNZXRyaWM7XG4gIGRpc3RhbmNlOiBDb29yZGluYXRlcztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTUEVCYXNlLlxuICAgKiBAcGFyYW0ge09wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAbWVtYmVyb2YgU1BFQmFzZVxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICB0aGlzLnN0ZXBzID0gb3B0aW9ucz8uc3RlcHMgPz8gMDtcbiAgICB0aGlzLmN5Y2xlcyA9IG9wdGlvbnM/LmN5Y2xlcyA/PyAxZTY7XG4gICAgLy8gU2VsZWN0IGEgY3V0b2ZmIGRpc3RhbmNlIHtjdXRvZmZ9IGFuZCAuLi5cbiAgICB0aGlzLmN1dG9mZiA9IG9wdGlvbnM/LmN1dG9mZiA/PyAwO1xuICAgIC8vIC4uLiBhbiBpbml0aWFsIGxlYXJuaW5nIHJhdGUge2xhbWJkYX0gPiAwXG4gICAgdGhpcy5sYW1iZGEgPSBvcHRpb25zPy5sYW1iZGEgPz8gMi4wO1xuICAgIHRoaXMuZGxhbWJkYSA9IG9wdGlvbnM/LmRsYW1iZGEgPz8gMC4wMTtcbiAgICB0aGlzLmxhbWJkYTIgPSB0aGlzLmxhbWJkYS8yLjtcbiAgICB0aGlzLmRsYW1iZGEyID0gdGhpcy5kbGFtYmRhLzIuO1xuICAgIHRoaXMuZXBzaWxvbiA9IG9wdGlvbnM/LmVwc2lsb24gPz8gMWUtMTA7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGJyYWNlLXN0eWxlXG4gICAgdGhpcy5kaXN0YW5jZUZ1bmN0aW9uID0gb3B0aW9ucz8uZGlzdGFuY2UgPz8gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2U7XG4gICAgdGhpcy5kaXN0YW5jZSA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGRpc3RhbmNlIG1hdHJpeC5cbiAgICpcbiAgICogQHBhcmFtIHtWZWN0b3JzfSB2ZWN0b3JzIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4uXG4gICAqIEBtZW1iZXJvZiBTUEVCYXNlXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5pdERpc3RhbmNlKHZlY3RvcnM6IFZlY3RvcnMpIHtcbiAgICB0aGlzLmRpc3RhbmNlID0gY2FsY0Rpc3RhbmNlTWF0cml4KHZlY3RvcnMsIHRoaXMuZGlzdGFuY2VGdW5jdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gdmVjdG9ycyBnaXZlbi5cbiAgICpcbiAgICogQHBhcmFtIHtWZWN0b3JzfSB2ZWN0b3JzIFNldCBvZiB2ZWN0b3JzIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZXMgYmV0d2Vlbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4MSBJbmRleCBvZiB0aGUgZmlyc3QgdmVjdG9yIG9mIHRoZSBwYWlyLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXgyIEluZGV4IG9mIHRoZSBzZWNvbmQgdmVjdG9yIG9mIHRoZSBwYWlyLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IERpc3RhbmNlIGJldHdlZW4gdGhlc2UgdHdvIHZlY3RvcnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgY2FsY0Rpc3RhbmNlKHZlY3RvcnM6IFZlY3RvcnMsIGluZGV4MTogbnVtYmVyLCBpbmRleDI6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGlzdGFuY2VbaW5kZXgxXVtpbmRleDJdO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgdmVjdG9ycyBnaXZlbiBpbnRvIGEgdHdvLWRpbWVuc2lvbmFsIHNwYWNlLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcnN9IHZlY3RvcnMgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcy5cbiAgICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IFNQRSBjb29yZGluYXRlcyBpbiBEIHNwYWNlLlxuICAgKi9cbiAgcHVibGljIGVtYmVkKHZlY3RvcnM6IFZlY3RvcnMpOiBDb29yZGluYXRlcyB7XG4gICAgY29uc3Qgbkl0ZW1zID0gdmVjdG9ycy5sZW5ndGg7XG4gICAgY29uc3QgYXJlYVdpZHRoID0gNDA7XG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcyBvZiB0aGUgTiBwb2ludHMuXG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBmaWxsUmFuZG9tTWF0cml4KG5JdGVtcywgU1BFQmFzZS5kaW1lbnNpb24sIGFyZWFXaWR0aCk7XG5cbiAgICBsZXQgbGFtYmRhMiA9IHRoaXMubGFtYmRhMjtcblxuICAgIGlmICh0aGlzLnN0ZXBzID09IDApIHtcbiAgICAgIHRoaXMuc3RlcHMgPSB2ZWN0b3JzLmxlbmd0aC0xO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdERpc3RhbmNlKHZlY3RvcnMpO1xuXG4gICAgZm9yIChsZXQgY3ljbGUgPSAwOyBjeWNsZSA8IHRoaXMuY3ljbGVzOyArK2N5Y2xlKSB7XG4gICAgICBmb3IgKGxldCBzdGVwID0gMDsgc3RlcCA8IHRoaXMuc3RlcHM7ICsrc3RlcCkge1xuICAgICAgICAvLyBTZWxlY3QgdHdvIHBvaW50cywgaSBhbmQgaiwgYXQgcmFuZG9tLCAuLi5cbiAgICAgICAgY29uc3QgaSA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICBsZXQgaiA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICB3aGlsZSAoaSA9PSBqKSBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG5cbiAgICAgICAgY29uc3Qgcm93aSA9IGNvb3JkaW5hdGVzW2ldO1xuICAgICAgICBjb25zdCByb3dqID0gY29vcmRpbmF0ZXNbal07XG5cbiAgICAgICAgLy8gLi4uIHJldHJpZXZlIChvciBldmFsdWF0ZSkgdGhlaXIgcHJveGltaXR5IGluIHRoZSBpbnB1dCBzcGFjZSwgcmlqIGFuZCAuLi5cbiAgICAgICAgY29uc3QgciA9IHRoaXMuY2FsY0Rpc3RhbmNlKHZlY3RvcnMsIGksIGopO1xuICAgICAgICAvLyAuLi4gY29tcHV0ZSB0aGVpciBFdWNsaWRlYW4gZGlzdGFuY2Ugb24gdGhlIEQtZGltZW5zaW9uYWwgbWFwLCBkaWouXG4gICAgICAgIGNvbnN0IGQgPSBjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZShyb3dpLCByb3dqKTtcblxuICAgICAgICAvLyBJZiByaWogPD0gcmMsIG9yIGlmIHJpaiA+IHJjIGFuZCBkaWogPCByaWogLi4uXG4gICAgICAgIGlmICgodGhpcy5jdXRvZmYgPT0gMCkgfHwgKHIgPD0gdGhpcy5jdXRvZmYpIHx8IChkIDwgcikpIHtcbiAgICAgICAgICBjb25zdCBtdWx0aXBsaWVyID0gbGFtYmRhMioociAtIGQpIC8gKGQgKyB0aGlzLmVwc2lsb24pO1xuICAgICAgICAgIC8vIC4uLiB1cGRhdGUgdGhlIGNvb3JkaW5hdGVzIHhpIGFuZCB4ai5cbiAgICAgICAgICBjb25zdCBkaWZmSUogPSB2ZWN0b3JBZGQocm93aSwgcm93aiwgLTEpO1xuICAgICAgICAgIGNvb3JkaW5hdGVzW2ldID0gdmVjdG9yQWRkKHJvd2ksIGRpZmZJSiwgbXVsdGlwbGllcik7XG4gICAgICAgICAgY29vcmRpbmF0ZXNbal0gPSB2ZWN0b3JBZGQocm93aiwgZGlmZklKLCAtbXVsdGlwbGllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIERlY3JlYXNlIHRoZSBsZWFybmluZyByYXRlIHtsYW1iZGF9IGJ5IGEgcHJlc2NyaWJlZCB7ZGxhbWJkYX0uXG4gICAgICBsYW1iZGEyIC09IHRoaXMuZGxhbWJkYTI7XG4gICAgICBpZiAobGFtYmRhMiA8PSAwLikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvb3JkaW5hdGVzO1xuICB9XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBtb2RpZmllZCBzdG9jaGFzdGljIHByb3hpbWl0eSBlbWJlZGRpbmcuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFBTUEVCYXNlXG4gKiBAbGluayBkb2k6MTAuMTAxNi9TMTA5My0zMjYzKDAzKTAwMTU1LTRcbiAqL1xuZXhwb3J0IGNsYXNzIFBTUEVCYXNlIGV4dGVuZHMgU1BFQmFzZSB7XG4gIC8qKlxuICAgKiBFbWJlZHMgdGhlIHZlY3RvcnMgZ2l2ZW4gaW50byBhIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyBhIG1vZGlmaWVkIHVwZGF0ZSBydWxlLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcnN9IHZlY3RvcnMgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcy5cbiAgICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IFNQRSBjb29yZGluYXRlcyBpbiBEIHNwYWNlLlxuICAgKi9cbiAgcHVibGljIGVtYmVkKHZlY3RvcnM6IFZlY3RvcnMpOiBDb29yZGluYXRlcyB7XG4gICAgY29uc3Qgbkl0ZW1zID0gdmVjdG9ycy5sZW5ndGg7XG4gICAgY29uc3QgYXJlYVdpZHRoID0gNDA7XG4gICAgLy8gIEluaXRpYWxpemUgdGhlIEQtZGltZW5zaW9uYWwgY29vcmRpbmF0ZXMgb2YgdGhlIE4gcG9pbnRzLlxuICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gZmlsbFJhbmRvbU1hdHJpeChuSXRlbXMsIFBTUEVCYXNlLmRpbWVuc2lvbiwgYXJlYVdpZHRoKTtcbiAgICBsZXQgbGFtYmRhID0gdGhpcy5sYW1iZGE7XG5cbiAgICB0aGlzLmluaXREaXN0YW5jZSh2ZWN0b3JzKTtcblxuICAgIGZvciAobGV0IGN5Y2xlID0gMDsgY3ljbGUgPCB0aGlzLmN5Y2xlczsgKytjeWNsZSkge1xuICAgICAgLy8gU2VsZWN0IGEgcG9pbnQsIGksIGF0IHJhbmRvbSAocGl2b3QpLlxuICAgICAgY29uc3QgaTogbnVtYmVyID0gcmFuZG9tSW50KG5JdGVtcyk7XG4gICAgICBjb25zdCByb3dpID0gY29vcmRpbmF0ZXNbaV07XG5cbiAgICAgIC8vIEZvciBldmVyeSBwb2ludCBqICE9IGkgLi4uXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5JdGVtczsgKytqKSB7XG4gICAgICAgIGlmIChpID09IGopIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCByb3dqID0gY29vcmRpbmF0ZXNbal07XG4gICAgICAgIC8vIC4uLiByZXRyaWV2ZSAob3IgZXZhbHVhdGUpIGl0cyBwcm94aW1pdHkgdG8gaSBpbiB0aGUgaW5wdXQgc3BhY2UsIHJpaiAuLi5cbiAgICAgICAgY29uc3QgciA9IHRoaXMuY2FsY0Rpc3RhbmNlKHZlY3RvcnMsIGksIGopO1xuICAgICAgICAvLyAuLi4gYW5kIGNvbXB1dGUgdGhlaXIgRXVjbGlkZWFuIGRpc3RhbmNlIG9uIHRoZSBELWRpbWVuc2lvbmFsIG1hcCwgZGlqLlxuICAgICAgICBjb25zdCBkID0gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2Uocm93aSwgcm93aik7XG4gICAgICAgIC8vIElmIHJpaiA8PSByYywgb3IgaWYgcmlqID4gcmMgYW5kIGRpaiA8IHJpaiAuLi5cbiAgICAgICAgaWYgKCh0aGlzLmN1dG9mZiA9PSAwKSB8fCAociA8PSB0aGlzLmN1dG9mZikgfHwgKGQgPCByKSkge1xuICAgICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBsYW1iZGEgKiAociAtIGQpIC8gKGQgKyB0aGlzLmVwc2lsb24pO1xuICAgICAgICAgIGNvbnN0IGRpZmZJSiA9IHZlY3RvckFkZChyb3dpLCByb3dqLCAtMSk7XG4gICAgICAgICAgLy8gLi4uIHVwZGF0ZSB0aGUgY29vcmRpbmF0ZXMgeGouXG4gICAgICAgICAgY29vcmRpbmF0ZXNbal0gPSB2ZWN0b3JBZGQocm93aiwgZGlmZklKLCAtbXVsdGlwbGllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIERlY3JlYXNlIHRoZSBsZWFybmluZyByYXRlIHtsYW1iZGF9IGJ5IGEgcHJlc2NyaWJlZCB7ZGxhbWJkYX0uXG4gICAgICBsYW1iZGEgLT0gdGhpcy5kbGFtYmRhO1xuICAgICAgaWYgKGxhbWJkYSA8PSAwLikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvb3JkaW5hdGVzO1xuICB9XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBtb2RpZmllZCBzdG9jaGFzdGljIHByb3hpbWl0eSBlbWJlZGRpbmcuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE9yaWdpbmFsU1BFXG4gKiBAbGluayBkb2k6MTAuMTAwMi9qY2MuMTAyMzRcbiAqL1xuZXhwb3J0IGNsYXNzIE9yaWdpbmFsU1BFIGV4dGVuZHMgU1BFQmFzZSB7XG4gIC8qKlxuICAgKiBFbWJlZHMgdGhlIHZlY3RvcnMgZ2l2ZW4gaW50byBhIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyBhIG1vZGlmaWVkIHVwZGF0ZSBydWxlLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcnN9IHZlY3RvcnMgRC1kaW1lbnNpb25hbCBjb29yZGluYXRlcy5cbiAgICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IFNQRSBjb29yZGluYXRlcyBpbiBEIHNwYWNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJhZGl1c1BlcmNlbnQ6IG51bWJlcjtcbiAgcHJvdGVjdGVkIG1heERpc3RhbmNlOiBudW1iZXI7XG4gIHByb3RlY3RlZCBtYXhEaXN0YW5jZVN0ZXBzOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLmN5Y2xlcyA9IG9wdGlvbnM/LmN5Y2xlcyA/PyAxZTM7XG4gICAgdGhpcy5zdGVwcyA9IG9wdGlvbnM/LnN0ZXBzID8/IDEwMDAwMDtcbiAgICB0aGlzLnJhZGl1c1BlcmNlbnQgPSBvcHRpb25zPy5yYWRpdXNQZXJjZW50ID8/IDEuMDtcbiAgICB0aGlzLm1heERpc3RhbmNlID0gb3B0aW9ucz8ubWF4RGlzdGFuY2UgPz8gbnVsbDtcbiAgICB0aGlzLm1heERpc3RhbmNlU3RlcHMgPSBvcHRpb25zPy5tYXhEaXN0YW5jZVN0ZXBzID8/IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZW1iZWQodmVjdG9yczogVmVjdG9ycyk6IENvb3JkaW5hdGVzIHtcbiAgICBjb25zdCBuSXRlbXMgPSB2ZWN0b3JzLmxlbmd0aDtcbiAgICBjb25zdCBhcmVhV2lkdGggPSA0MDtcbiAgICAvLyBJbml0aWFsaXplIHRoZSBELWRpbWVuc2lvbmFsIGNvb3JkaW5hdGVzIG9mIHRoZSBOIHBvaW50cy5cbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGZpbGxSYW5kb21NYXRyaXgobkl0ZW1zLCBPcmlnaW5hbFNQRS5kaW1lbnNpb24sIGFyZWFXaWR0aCk7XG5cbiAgICB0aGlzLmluaXREaXN0YW5jZSh2ZWN0b3JzKTtcblxuICAgIGlmICh0aGlzLm1heERpc3RhbmNlU3RlcHMgPT0gbnVsbCkge1xuICAgICAgdGhpcy5tYXhEaXN0YW5jZVN0ZXBzID0gbkl0ZW1zICogTWF0aC5mbG9vcigobkl0ZW1zIC0gMSkgLyAyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF4RGlzdGFuY2UgPT0gbnVsbCkge1xuICAgICAgdGhpcy5tYXhEaXN0YW5jZSA9IC0xZTM3O1xuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCB0aGlzLm1heERpc3RhbmNlU3RlcHM7IG4rKykge1xuICAgICAgICBjb25zdCBpID0gcmFuZG9tSW50KG5JdGVtcyk7IGxldCBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG4gICAgICAgIHdoaWxlIChpID09IGopIGogPSByYW5kb21JbnQobkl0ZW1zKTtcblxuICAgICAgICBjb25zdCBkID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XG4gICAgICAgIGlmIChkID4gdGhpcy5tYXhEaXN0YW5jZSkge1xuICAgICAgICAgIHRoaXMubWF4RGlzdGFuY2UgPSBkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGxhbWJkYSA9IHRoaXMubGFtYmRhO1xuICAgIGNvbnN0IHJhZGl1cyA9ICh0aGlzLnJhZGl1c1BlcmNlbnQgPT0gMC4wKSA/IHRoaXMubWF4RGlzdGFuY2UgOiB0aGlzLm1heERpc3RhbmNlICogdGhpcy5yYWRpdXNQZXJjZW50O1xuXG4gICAgZm9yIChsZXQgY3ljbGUgPSAwOyBjeWNsZSA8IHRoaXMuY3ljbGVzOyArK2N5Y2xlKSB7XG4gICAgICBmb3IgKGxldCBzdGVwID0gMDsgc3RlcCA8IHRoaXMuc3RlcHM7ICsrc3RlcCkge1xuICAgICAgICAvLyBTZWxlY3QgdHdvIHBvaW50cywgaSBhbmQgaiwgYXQgcmFuZG9tLCAuLi5cbiAgICAgICAgY29uc3QgaSA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICBsZXQgaiA9IHJhbmRvbUludChuSXRlbXMpO1xuICAgICAgICB3aGlsZSAoaSA9PSBqKSBqID0gcmFuZG9tSW50KG5JdGVtcyk7XG5cbiAgICAgICAgY29uc3Qgcm93aSA9IGNvb3JkaW5hdGVzW2ldO1xuICAgICAgICBjb25zdCByb3dqID0gY29vcmRpbmF0ZXNbal07XG5cbiAgICAgICAgLy8gcmV0cmlldmUgKG9yIGV2YWx1YXRlKSB0aGVpciBwcm94aW1pdHkgaW4gdGhlIGlucHV0IHNwYWNlLCByaWogYW5kIC4uLlxuICAgICAgICBjb25zdCByID0gdGhpcy5jYWxjRGlzdGFuY2UodmVjdG9ycywgaSwgaik7XG4gICAgICAgIC8vIGNvbXB1dGUgdGhlaXIgRXVjbGlkZWFuIGRpc3RhbmNlIG9uIHRoZSBELWRpbWVuc2lvbmFsIG1hcCwgZGlqLlxuICAgICAgICBjb25zdCBkID0gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2Uocm93aSwgcm93aik7XG5cbiAgICAgICAgaWYgKChyIDw9IHJhZGl1cykgfHwgKGQgPCByKSkge1xuICAgICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBsYW1iZGEgKiAwLjUgKiAociAtIGQpIC8gKGQgKyB0aGlzLmVwc2lsb24pO1xuICAgICAgICAgIC8vIC4uLiB1cGRhdGUgdGhlIGNvb3JkaW5hdGVzIHhpIGFuZCB4ai5cbiAgICAgICAgICBjb25zdCBkaWZmSUogPSB2ZWN0b3JBZGQocm93aSwgcm93aiwgLTEpO1xuICAgICAgICAgIGNvb3JkaW5hdGVzW2ldID0gdmVjdG9yQWRkKHJvd2ksIGRpZmZJSiwgbXVsdGlwbGllcik7XG4gICAgICAgICAgY29vcmRpbmF0ZXNbal0gPSB2ZWN0b3JBZGQocm93aiwgZGlmZklKLCAtbXVsdGlwbGllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxhbWJkYSAtPSAoKHRoaXMubGFtYmRhIC0gdGhpcy5kbGFtYmRhKSAvICh0aGlzLmN5Y2xlcyAtIDEuMCkpOyA7XG4gICAgICBpZiAobGFtYmRhIDwgdGhpcy5kbGFtYmRhKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29vcmRpbmF0ZXM7XG4gIH1cbn1cbiJdfQ==","export default class BitArray {\n constructor(arg, defaultValue = false) {\n this._length = 0;\n this._version = 0;\n this._updateLevel = 0;\n this._selectedCount = 0;\n this._selectedCountVersion = -1;\n this._selectedIndexesVersion = -1;\n this._versionedName = '';\n this._versionedNameVersion = -1;\n this.SHRINK_THRESHOLD = 0x100;\n if (typeof arg === 'number') {\n const length = arg;\n const buff = BitArray._createBuffer(length);\n if (defaultValue) {\n for (let i = 0; i < buff.length; i++)\n buff[i] = -1;\n }\n this._data = buff;\n this._length = length;\n }\n else if (arg instanceof Uint32Array) {\n this._data = arg;\n this._length = defaultValue;\n }\n else {\n throw new Error('Invalid constructor');\n }\n }\n getRawData() { return this._data; }\n assureGoez(num, argName) {\n if (num < 0)\n throw new Error(`${argName} should be greater than zero`);\n }\n assureInRange(value, min, max, argName) {\n if ((value < min) || (value > max))\n throw new Error(`Argument ${argName} (${value}) out of range (${min}, ${max})`);\n }\n copy(src, dst, count) {\n for (let i = 0; i < count; i++)\n dst[i] = src[i];\n }\n copyFrom(other) {\n if (this._length != other._length)\n throw new Error(`Lengths differ (${this._length} != ${other._length})`);\n this.copy(other._data, this._data, this.lengthInInts);\n this._version++;\n }\n get length() {\n return this._length;\n }\n get buffer() {\n return this._data;\n }\n set buffer(data) {\n this._data = data;\n this._version++;\n }\n get version() {\n return this._version;\n }\n set version(value) {\n this._version = value;\n }\n incrementVersion(notify = true) {\n this._version++;\n }\n get lengthInInts() {\n return Math.floor((this._length + 0x1f) / 0x20);\n }\n get versionedName() {\n return this._version == this._versionedNameVersion ? this._versionedName : '';\n }\n set versionedName(name) {\n this._versionedName = name;\n this._versionedNameVersion = this._version;\n }\n get self() {\n return this;\n }\n setLength(value) {\n if (value < 0)\n throw new Error('should be >= 0');\n if (value == this._length)\n return;\n const nIntsNeeded = Math.floor((value + 0x1f) / 0x20);\n if ((nIntsNeeded > this._data.length) || ((nIntsNeeded + this.SHRINK_THRESHOLD) < this._data.length)) {\n const newData = new Uint32Array(nIntsNeeded);\n this.copy(this._data, newData, (nIntsNeeded > this._data.length) ? this._data.length : nIntsNeeded);\n this._data = newData;\n }\n if (value > this._length) {\n if (this._length % 0x20 > 0)\n this._data[this.lengthInInts - 1] &= (1 << ((this._length % 0x20) & 0x1f)) - 1;\n this._data.fill(0, this.lengthInInts, nIntsNeeded);\n }\n this._length = value;\n this._version++;\n }\n static fromAnd(set1, set2) {\n if (set1._length != set2._length)\n throw new Error(`Lengths differ (${set1._length} != ${set2._length})`);\n const temp = new BitArray(set1._length);\n temp._length = set1._length;\n temp._data = BitArray._createBuffer(temp._length);\n temp._version = 0;\n const len = set1.lengthInInts;\n for (let i = 0; i < len; i++)\n temp._data[i] = set1._data[i] & set2._data[i];\n return temp;\n }\n static _createBuffer(length) {\n return new Uint32Array(Math.floor((length + 0x1f) / 0x20));\n }\n static fromValues(values) {\n const temp = new BitArray(values.length);\n temp._version = 0;\n for (let i = 0; i < temp._length; i++) {\n if (values[i])\n temp._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);\n }\n return temp;\n }\n /// Constructs a [BitSet] of length [count], where idx-th bit is determined by a call to [flag] (idx).\n static fromSeq(count, flag) {\n const temp = new BitArray(count);\n for (let i = 0; i < count; ++i)\n temp.setBit(i, flag(i));\n temp._version = 0;\n return temp;\n }\n /// Constructs a [BitSet] from a string [s] containing '0' or '1'.\n static fromString(s) {\n return BitArray.fromSeq(s.length, (i) => s.charAt(i) == '1');\n }\n /// Constructs a [BitSet], based on length [_length] and byte array [_data].\n static fromUint32Array(_length, _data) {\n const temp = new BitArray(_length);\n temp._data = _data;\n return temp;\n }\n /// Deserializes a [BitSet] from [bytes].\n static fromBytes(bytes) {\n const len = bytes.length;\n const temp = new BitArray(len * 8);\n temp._data = new Uint32Array(Math.floor((len + 3) / 4));\n temp._length = len * 8;\n let num1 = 0;\n let num2 = 0;\n while ((len - num2) >= 4) {\n temp._data[num1++] = (((bytes[num2] & 0xff) | ((bytes[num2 + 1] & 0xff) << 8)) |\n ((bytes[num2 + 2] & 0xff) << 0x10)) | ((bytes[num2 + 3] & 0xff) << 0x18);\n num2 += 4;\n }\n if (len - num2 == 3)\n temp._data[num1] = (bytes[num2 + 2] & 0xff) << 0x10;\n if (len - num2 == 2)\n temp._data[num1] |= (bytes[num2 + 1] & 0xff) << 8;\n if (len - num2 == 1)\n temp._data[num1] |= bytes[num2] & 0xff;\n temp._version = 0;\n return temp;\n }\n toString() {\n return `${this._length} bits, ${this.countBits(true)} set`;\n }\n /// Performs deep comparison of two bitsets.\n equals(other) {\n if (this == other)\n return true;\n if (other == null)\n return false;\n if (this._length != other._length)\n return false;\n if (this._length == 0)\n return true;\n for (let i = 0; i < this._data.length - 1; i++)\n if (this._data[i] != other._data[i])\n return false;\n for (let i = (this._data.length - 1) * 8; i < this._length; i++) {\n if (this.getBit(i) != other.getBit(i))\n return false;\n }\n return true;\n }\n /** Clones a bitset. */\n clone() {\n const bitArray = new BitArray(0, false);\n bitArray._data = Uint32Array.from(this._data); // effective length: (lengthInInts)\n bitArray._length = this._length;\n bitArray._version = this._version;\n return bitArray;\n }\n /** Initializes a bitset. */\n init(flag, notify) {\n this.setAll(false, false);\n for (let i = 0; i < this._length; i++) {\n if (flag(i))\n this._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);\n }\n this.incrementVersion(notify);\n return this;\n }\n /// Inverts a bitset.\n invert(notify = true) {\n for (let i = 0; i < this._data.length; i++)\n this._data[i] ^= -1;\n this.incrementVersion(notify);\n }\n /// Sets all bits to [value], optionally suppressing notifications.\n setAll(value, notify = false) {\n const flags = value ? -1 : 0;\n const len = this.lengthInInts;\n for (let i = 0; i < len; i++) //todo: optimize\n this._data[i] = flags;\n this.incrementVersion(notify);\n }\n /// Sets bits at [indexes] position to [value].\n /// Clears the bitset if [clear] flag is true.\n /// Change notification is raised when [notify] is true.\n setIndexes(indexes, value = true, clear = true, notify = true) {\n if (clear)\n this.setAll(!value, false);\n for (const i of indexes)\n this.setFast(i, value);\n this.incrementVersion(notify);\n }\n everyIndex(indexes, value = true) {\n for (const index of indexes) {\n if (this.getBit(index) != value)\n return false;\n }\n return true;\n }\n anyIndex(indexes, value = true) {\n for (const index of indexes) {\n if (this.getBit(index) == value)\n return true;\n }\n return false;\n }\n setWhere(check, value = true, clear = true, notify = true, allowClear = true) {\n if (clear && allowClear)\n this.setAll(!value, false);\n if (allowClear) {\n for (let i = 0; i < this._length; i++) {\n if (check(i))\n this.setFast(i, value);\n }\n }\n else {\n for (let i = 0; i < this._length; i++)\n this.setFast(i, check(i) ? value : !value);\n }\n this.incrementVersion(notify);\n }\n getRange(from, to) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length, 'to');\n const arr = [];\n for (let i = from; i < to; ++i)\n arr.push(this.getBit(i));\n return BitArray.fromValues(arr);\n }\n getRangeAsList(from, to) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length, 'to');\n const arr = [];\n for (let i = from; i < to; ++i)\n arr.push(this.getBit(i));\n return arr;\n }\n setRange(from, to, value, notify = true) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length - 1, 'to');\n const start = Math.min(from, to);\n const end = Math.max(from, to);\n //todo: optimize\n if (value) {\n for (let i = start; i <= end; i++)\n this.setTrue(i);\n }\n else {\n for (let i = start; i <= end; i++)\n this.setFalse(i);\n }\n this.incrementVersion(notify);\n return this;\n }\n /// Sets n randomly chosen bits to value, remaining bits to !value.\n setRandom(n, value, notify = true) {\n if (n < 0 || n > this._length)\n throw new Error('n must be >= 0 && <= Count');\n if (n > this._length / 2)\n this.setRandom(this._length - n, !value);\n this.setAll(!value);\n for (let k = 0; k < n;) {\n const i = Math.floor(Math.random() * this._length);\n if (this.getBit(i) == value)\n continue;\n this.setFast(i, value);\n k++;\n }\n this.incrementVersion(notify);\n }\n /// Modifies current bitset by performing the bitwise AND operation against the\n /// corresponding elements in the specified bitset.\n and(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] &= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise AND NOT operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n andNot(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n const len = this.lengthInInts;\n for (let num2 = 0; num2 < len; num2++)\n this._data[num2] &= ~value._data[num2];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise NOT AND operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n notAnd(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] = (~this._data[i]) & value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Inverts all bit values in the current bitset\n not(notify = true) {\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] = ~this._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise OR operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n or(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] |= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise exclusive OR operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n xor(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] ^= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Inserts n 0-bits at position pos, resizing self and shifting bits appropriately.\n insertAt(pos, n, flag = false) {\n this.assureInRange(pos, 0, this._length, 'pos');\n if (n == 0)\n return;\n //TODO: optimize\n //the most primitive implementation, optimize it later!\n // beginUpdate();\n const oldlength = this._length;\n this.setLength(this._length + n);\n //if (!contains(!flag)) return; // nothing to do\n for (let i = oldlength - 1; i >= pos; i--)\n this.setBit(i + n, this.getBit(i));\n for (let i = pos; i < pos + n; i++)\n this.setBit(i, flag);\n // endUpdate();\n }\n /// Deletes n bits beginning at position pos, resizing self and shifting remaining\n /// bits appropriately.\n removeAt(pos, n = 1) {\n // the most primitive implementation, optimize it later!\n if (n < 0)\n throw new Error('n cannot be negative');\n this.assureInRange(pos, 0, this._length - n, 'pos');\n if (this.contains(true)) {\n for (let i = pos; i < this._length - n; i++)\n this.setBit(i, this.getBit(i + n));\n }\n this.setLength(this._length - n);\n }\n removeByMask(mask, flag = true) {\n if (this._length != mask.length)\n throw new Error('length != mask.length');\n if (mask == this) { // no need to iterate\n this.setLength(mask.countBits(!flag));\n this.setAll(!flag);\n }\n else {\n let dstIdx = 0;\n for (let srcIdx = -1; (srcIdx = mask.findNext(srcIdx, !flag)) != -1;)\n this.setFast(dstIdx++, this.getBit(srcIdx));\n this._length = dstIdx;\n this._version++;\n }\n return this;\n }\n /// Similar to the [] operator.\n getBit(pos) {\n return (this._data[Math.floor(pos / 0x20)] & (1 << (pos & 0x1f))) != 0;\n }\n /// Similar to the [] operator.\n setBit(pos, bit, notify = true) {\n this.setFast(pos, bit);\n if (notify)\n this._version++;\n else\n this._version++;\n }\n /// Sets [i]-th bit to [value], does not check bounds, does not increment version\n setFast(i, value) {\n if (value)\n this._data[Math.floor(i / 0x20)] |= 1 << (i & 0x1f);\n else\n this._data[Math.floor(i / 0x20)] &= ~(1 << (i & 0x1f));\n }\n setTrue(pos) {\n this._data[Math.floor(pos / 0x20)] |= 1 << (pos & 0x1f);\n }\n setFalse(pos) {\n this._data[Math.floor(pos / 0x20)] &= ~(1 << (pos & 0x1f));\n }\n trueCount() {\n return this.countBits(true);\n }\n falseCount() {\n return this.countBits(false);\n }\n /// Counts bits of the specified value.\n countBits(value) {\n if (this._length == 0)\n return 0;\n if (this._selectedCountVersion != this._version) {\n this._selectedCount = 0;\n const len = this.lengthInInts;\n let i = 0;\n for (; i < len - 1; i++) {\n for (let k = this._data[i]; k != 0; k >>>= 8) { //todo: cast data[i] to uint\n this._selectedCount += BitArray._onBitCount[k & 0xff];\n }\n }\n // The last int.\n let k = this._data[i];\n const remainingBits = this._length & 0x1f;\n if (remainingBits != 0) /* if remainingBits == 0, the last int is fully used and ALL bits should be left as is */\n k &= ~((4294967295) << remainingBits);\n for (; k != 0; k >>>= 8)\n this._selectedCount += BitArray._onBitCount[k & 0xff];\n this._selectedCountVersion = this._version;\n }\n return (value ? this._selectedCount : this._length - this._selectedCount);\n }\n /// Returns a number of set bits where also [check] is true\n countWhere(check) {\n let result = 0;\n if (this.trueCount() == this._length) {\n for (let i = 0; i < this._length; i++)\n result += check(i) ? 1 : 0;\n }\n else {\n for (let i = -1; (i = this.findNext(i, true)) != -1;)\n result += check(i) ? 1 : 0;\n }\n return result;\n }\n /// Performs bit \"and\" and counts bits of the specified value, without bitset modification.\n andWithCountBits(second, value) {\n if (this._length == 0)\n return 0;\n let count = 0;\n const len = this.lengthInInts;\n let i = 0;\n for (; i < len - 1; i++) {\n for (let k = this._data[i] & second._data[i]; k != 0; k >>>= 8)\n count += BitArray._onBitCount[k & 0xff];\n }\n // The last int.\n let k = this._data[i] & second._data[i];\n const remainingBits = this._length & 0x1f;\n if (remainingBits != 0)\n k &= ~((4294967295) << remainingBits);\n for (; k != 0; k >>>= 8)\n count += BitArray._onBitCount[k & 0xff];\n return (value ? count : this._length - count);\n }\n clear() {\n this.setLength(0);\n }\n contains(value) {\n return this.findNext(-1, value) >= 0;\n }\n get allTrue() {\n return this.countBits(true) == this._length;\n }\n get allFalse() {\n return this.countBits(false) == this._length;\n }\n get anyTrue() {\n return this.countBits(true) > 0;\n }\n get anyFalse() {\n return this.countBits(false) > 0;\n }\n /// Returns the position of the next bit of the specified value, starting from the specified position.\n /// Returns -1, if there are no such bits.\n findNext(index, value = true) {\n this.assureInRange(index, -1, this._length, 'index');\n if (index >= this._length - 1)\n return -1;\n index = index < 0 ? 0 : index + 1; // skip start\n let unusedBits = index & 0x1f;\n const numInts = this.lengthInInts;\n for (let i = Math.floor(index / 32); i < numInts; i++) {\n let k = (value ? this._data[i] : ~this._data[i]); // uint cast\n if (unusedBits != 0) {\n k &= ((0xffffffff << unusedBits) & 0xffffffff);\n unusedBits = 0;\n }\n else if (!value && k == -4294967296) /* looking for false, all bits are set */ {\n continue;\n }\n for (let j = 0; k != 0; j += 8, k >>>= 8) {\n const p = BitArray._firstOnBit[k & 0xff];\n if (p >= 0) {\n index = p + (i * 32) + j;\n if (index >= this._length)\n return -1;\n return index;\n }\n }\n }\n return -1;\n }\n /// Finds previous bit of the specified value in the bitset.\n findPrev(index, value = true) {\n if (index == 0)\n return -1;\n this.assureInRange(index, -1, this._length, 'index');\n index = index < 0 ? this._length - 1 : index - 1; // skip start\n const lastIntIdx = Math.floor(index / 0x20);\n let remainingBits = (index + 1) & 0x1f;\n for (let i = lastIntIdx; i >= 0; i--) {\n let k = (value ? this._data[i] : ~this._data[i]); // cast\n if (remainingBits != 0) {\n k &= ~((4294967295) << remainingBits);\n remainingBits = 0;\n }\n for (let j = 24; k != 0; j -= 8, k <<= 8) {\n const p = BitArray._lastOnBit[k >>> 0x18];\n if (p >= 0)\n return p + (i * 32) + j;\n }\n }\n return -1;\n }\n}\nBitArray._onBitCount = Int8Array.from([\n 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8\n]);\nBitArray._firstOnBit = Int8Array.from([\n -1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0\n]);\nBitArray._lastOnBit = Int8Array.from([\n -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,\n 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7\n]);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0LWFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYml0LWFycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUTtJQW9FM0IsWUFBWSxHQUF5QixFQUFFLGVBQWlDLEtBQUs7UUFackUsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQiw0QkFBdUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFLdkIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDM0IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ25CLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUMsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtvQkFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7U0FDdkI7YUFBTSxJQUFJLEdBQUcsWUFBWSxXQUFXLEVBQUU7WUFDckMsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFrQixDQUFDO1lBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBc0IsQ0FBQztTQUN2QzthQUFNO1lBQ0wsTUFBTSxJ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QUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FBQyxDQUFDLENBQUM7QUFFNUMsb0JBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMvQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUFDLENBQUMsQ0FBQztBQUU1QyxtQkFBVSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDakMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQy9DLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQml0QXJyYXkge1xuICBzdGF0aWMgX29uQml0Q291bnQgPSBJbnQ4QXJyYXkuZnJvbShbXG4gICAgMCwgMSwgMSwgMiwgMSwgMiwgMiwgMywgMSwgMiwgMiwgMywgMiwgMywgMywgNCxcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxuICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LFxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXG4gICAgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywgNSwgNiwgNiwgNywgNiwgNywgNywgOF0pO1xuXG4gIHN0YXRpYyBfZmlyc3RPbkJpdCA9IEludDhBcnJheS5mcm9tKFtcbiAgICAtMSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA2LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDcsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA1LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNiwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMF0pO1xuXG4gIHN0YXRpYyBfbGFzdE9uQml0ID0gSW50OEFycmF5LmZyb20oW1xuICAgIC0xLCAwLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLFxuICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSxcbiAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LFxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXG4gICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNixcbiAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LFxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3XSk7XG5cbiAgcHJpdmF0ZSBfZGF0YTogVWludDMyQXJyYXk7XG4gIHByaXZhdGUgX2xlbmd0aCA9IDA7XG4gIHByaXZhdGUgX3ZlcnNpb24gPSAwO1xuICBwcml2YXRlIF91cGRhdGVMZXZlbCA9IDA7XG4gIHByaXZhdGUgX3NlbGVjdGVkQ291bnQgPSAwO1xuICBwcml2YXRlIF9zZWxlY3RlZENvdW50VmVyc2lvbiA9IC0xO1xuICBwcml2YXRlIF9zZWxlY3RlZEluZGV4ZXNWZXJzaW9uID0gLTE7XG4gIHByaXZhdGUgX3ZlcnNpb25lZE5hbWUgPSAnJztcbiAgcHJpdmF0ZSBfdmVyc2lvbmVkTmFtZVZlcnNpb24gPSAtMTtcbiAgU0hSSU5LX1RIUkVTSE9MRCA9IDB4MTAwO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFVpbnQzMkFycmF5LCBsZW5ndGg6IG51bWJlcilcbiAgY29uc3RydWN0b3IobGVuZ3RoOiBudW1iZXIsIGRlZmF1bHRWYWx1ZT86IGJvb2xlYW4pXG4gIGNvbnN0cnVjdG9yKGFyZzogbnVtYmVyIHwgVWludDMyQXJyYXksIGRlZmF1bHRWYWx1ZTogYm9vbGVhbiB8IG51bWJlciA9IGZhbHNlKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBhcmc7XG4gICAgICBjb25zdCBidWZmID0gQml0QXJyYXkuX2NyZWF0ZUJ1ZmZlcihsZW5ndGgpO1xuICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmYubGVuZ3RoOyBpKyspXG4gICAgICAgICAgYnVmZltpXSA9IC0xO1xuICAgICAgfVxuICAgICAgdGhpcy5fZGF0YSA9IGJ1ZmY7XG4gICAgICB0aGlzLl9sZW5ndGggPSBsZW5ndGg7XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBVaW50MzJBcnJheSkge1xuICAgICAgdGhpcy5fZGF0YSA9IGFyZyBhcyBVaW50MzJBcnJheTtcbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRlZmF1bHRWYWx1ZSBhcyBudW1iZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb25zdHJ1Y3RvcicpO1xuICAgIH1cbiAgfVxuXG5cbiAgZ2V0UmF3RGF0YSgpIHsgcmV0dXJuIHRoaXMuX2RhdGE7IH1cblxuICBhc3N1cmVHb2V6KG51bTogbnVtYmVyLCBhcmdOYW1lOiBTdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobnVtIDwgMCkgdGhyb3cgbmV3IEVycm9yKGAke2FyZ05hbWV9IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gemVyb2ApO1xuICB9XG5cbiAgYXNzdXJlSW5SYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIsIGFyZ05hbWU6IFN0cmluZyk6IHZvaWQge1xuICAgIGlmICgodmFsdWUgPCBtaW4pIHx8ICh2YWx1ZSA+IG1heCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFyZ3VtZW50ICR7YXJnTmFtZX0gKCR7dmFsdWV9KSBvdXQgb2YgcmFuZ2UgKCR7bWlufSwgJHttYXh9KWApO1xuICB9XG5cbiAgY29weShzcmM6IFVpbnQzMkFycmF5LCBkc3Q6IFVpbnQzMkFycmF5LCBjb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKVxuICAgICAgZHN0W2ldID0gc3JjW2ldO1xuICB9XG5cbiAgY29weUZyb20ob3RoZXI6IEJpdEFycmF5KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSBvdGhlci5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMZW5ndGhzIGRpZmZlciAoJHt0aGlzLl9sZW5ndGh9ICE9ICR7b3RoZXIuX2xlbmd0aH0pYCk7XG4gICAgdGhpcy5jb3B5KG90aGVyLl9kYXRhLCB0aGlzLl9kYXRhLCB0aGlzLmxlbmd0aEluSW50cyk7XG4gICAgdGhpcy5fdmVyc2lvbisrO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGJ1ZmZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHNldCBidWZmZXIoZGF0YTogVWludDMyQXJyYXkpIHtcbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBnZXQgdmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgfVxuXG4gIHNldCB2ZXJzaW9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92ZXJzaW9uID0gdmFsdWU7XG4gIH1cblxuICBpbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBnZXQgbGVuZ3RoSW5JbnRzKCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKCh0aGlzLl9sZW5ndGggKyAweDFmKSAvIDB4MjApO1xuICB9XG5cbiAgZ2V0IHZlcnNpb25lZE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb24gPT0gdGhpcy5fdmVyc2lvbmVkTmFtZVZlcnNpb24gPyB0aGlzLl92ZXJzaW9uZWROYW1lIDogJyc7XG4gIH1cblxuICBzZXQgdmVyc2lvbmVkTmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lID0gbmFtZTtcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lVmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XG4gIH1cblxuICBnZXQgc2VsZigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldExlbmd0aCh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlIDwgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hvdWxkIGJlID49IDAnKTtcblxuICAgIGlmICh2YWx1ZSA9PSB0aGlzLl9sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuSW50c05lZWRlZCA9IE1hdGguZmxvb3IoKHZhbHVlICsgMHgxZikgLyAweDIwKTtcbiAgICBpZiAoKG5JbnRzTmVlZGVkID4gdGhpcy5fZGF0YS5sZW5ndGgpIHx8ICgobkludHNOZWVkZWQgKyB0aGlzLlNIUklOS19USFJFU0hPTEQpIDwgdGhpcy5fZGF0YS5sZW5ndGgpKSB7XG4gICAgICBjb25zdCBuZXdEYXRhID0gbmV3IFVpbnQzMkFycmF5KG5JbnRzTmVlZGVkKTtcbiAgICAgIHRoaXMuY29weSh0aGlzLl9kYXRhLCBuZXdEYXRhLCAobkludHNOZWVkZWQgPiB0aGlzLl9kYXRhLmxlbmd0aCkgPyB0aGlzLl9kYXRhLmxlbmd0aCA6IG5JbnRzTmVlZGVkKTtcbiAgICAgIHRoaXMuX2RhdGEgPSBuZXdEYXRhO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA+IHRoaXMuX2xlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuX2xlbmd0aCAlIDB4MjAgPiAwKVxuICAgICAgICB0aGlzLl9kYXRhW3RoaXMubGVuZ3RoSW5JbnRzIC0gMV0gJj0gKDEgPDwgKCh0aGlzLl9sZW5ndGggJSAweDIwKSAmIDB4MWYpKSAtIDE7XG5cbiAgICAgIHRoaXMuX2RhdGEuZmlsbCgwLCB0aGlzLmxlbmd0aEluSW50cywgbkludHNOZWVkZWQpO1xuICAgIH1cbiAgICB0aGlzLl9sZW5ndGggPSB2YWx1ZTtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBzdGF0aWMgZnJvbUFuZChzZXQxOiBCaXRBcnJheSwgc2V0MjogQml0QXJyYXkpOiBCaXRBcnJheSB7XG4gICAgaWYgKHNldDEuX2xlbmd0aCAhPSBzZXQyLl9sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExlbmd0aHMgZGlmZmVyICgke3NldDEuX2xlbmd0aH0gIT0gJHtzZXQyLl9sZW5ndGh9KWApO1xuXG4gICAgY29uc3QgdGVtcCA9IG5ldyBCaXRBcnJheShzZXQxLl9sZW5ndGgpO1xuICAgIHRlbXAuX2xlbmd0aCA9IHNldDEuX2xlbmd0aDtcbiAgICB0ZW1wLl9kYXRhID0gQml0QXJyYXkuX2NyZWF0ZUJ1ZmZlcih0ZW1wLl9sZW5ndGgpO1xuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuXG4gICAgY29uc3QgbGVuID0gc2V0MS5sZW5ndGhJbkludHM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIHRlbXAuX2RhdGFbaV0gPSBzZXQxLl9kYXRhW2ldICYgc2V0Mi5fZGF0YVtpXTtcblxuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2NyZWF0ZUJ1ZmZlcihsZW5ndGg6IG51bWJlcik6IFVpbnQzMkFycmF5IHtcbiAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KE1hdGguZmxvb3IoKGxlbmd0aCArIDB4MWYpIC8gMHgyMCkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21WYWx1ZXModmFsdWVzOiBBcnJheTxib29sZWFuPik6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wLl9sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlc1tpXSlcbiAgICAgICAgdGVtcC5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcDtcbiAgfVxuXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0gb2YgbGVuZ3RoIFtjb3VudF0sIHdoZXJlIGlkeC10aCBiaXQgaXMgZGV0ZXJtaW5lZCBieSBhIGNhbGwgdG8gW2ZsYWddIChpZHgpLlxuICBzdGF0aWMgZnJvbVNlcShjb3VudDogbnVtYmVyLCBmbGFnOiBGdW5jdGlvbik6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KGNvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpXG4gICAgICB0ZW1wLnNldEJpdChpLCBmbGFnKGkpKTtcblxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgLy8vIENvbnN0cnVjdHMgYSBbQml0U2V0XSBmcm9tIGEgc3RyaW5nIFtzXSBjb250YWluaW5nICcwJyBvciAnMScuXG4gIHN0YXRpYyBmcm9tU3RyaW5nKHM6IHN0cmluZyk6IEJpdEFycmF5IHtcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVNlcShzLmxlbmd0aCwgKGk6IG51bWJlcikgPT4gcy5jaGFyQXQoaSkgPT0gJzEnKTtcbiAgfVxuXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0sIGJhc2VkIG9uIGxlbmd0aCBbX2xlbmd0aF0gYW5kIGJ5dGUgYXJyYXkgW19kYXRhXS5cbiAgc3RhdGljIGZyb21VaW50MzJBcnJheShfbGVuZ3RoOiBudW1iZXIsIF9kYXRhOiBVaW50MzJBcnJheSk6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KF9sZW5ndGgpO1xuICAgIHRlbXAuX2RhdGEgPSBfZGF0YTtcbiAgICByZXR1cm4gdGVtcDtcbiAgfVxuXG4gIC8vLyBEZXNlcmlhbGl6ZXMgYSBbQml0U2V0XSBmcm9tIFtieXRlc10uXG4gIHN0YXRpYyBmcm9tQnl0ZXMoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBCaXRBcnJheSB7XG4gICAgY29uc3QgbGVuID0gYnl0ZXMubGVuZ3RoO1xuICAgIGNvbnN0IHRlbXAgPSBuZXcgQml0QXJyYXkobGVuICogOCk7XG4gICAgdGVtcC5fZGF0YSA9IG5ldyBVaW50MzJBcnJheShNYXRoLmZsb29yKChsZW4gKyAzKSAvIDQpKTtcbiAgICB0ZW1wLl9sZW5ndGggPSBsZW4gKiA4O1xuICAgIGxldCBudW0xID0gMDtcbiAgICBsZXQgbnVtMiA9IDA7XG5cbiAgICB3aGlsZSAoKGxlbiAtIG51bTIpID49IDQpIHtcbiAgICAgIHRlbXAuX2RhdGFbbnVtMSsrXSA9IChcbiAgICAgICAgKChieXRlc1tudW0yXSAmIDB4ZmYpIHwgKChieXRlc1tudW0yICsgMV0gJiAweGZmKSA8PCA4KSkgfFxuICAgICAgICAoKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTApXG4gICAgICApIHwgKChieXRlc1tudW0yICsgM10gJiAweGZmKSA8PCAweDE4KTtcblxuICAgICAgbnVtMiArPSA0O1xuICAgIH1cblxuICAgIGlmIChsZW4gLSBudW0yID09IDMpXG4gICAgICB0ZW1wLl9kYXRhW251bTFdID0gKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTA7XG5cbiAgICBpZiAobGVuIC0gbnVtMiA9PSAyKVxuICAgICAgdGVtcC5fZGF0YVtudW0xXSB8PSAoYnl0ZXNbbnVtMiArIDFdICYgMHhmZikgPDwgODtcblxuICAgIGlmIChsZW4gLSBudW0yID09IDEpXG4gICAgICB0ZW1wLl9kYXRhW251bTFdIHw9IGJ5dGVzW251bTJdICYgMHhmZjtcblxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5fbGVuZ3RofSBiaXRzLCAke3RoaXMuY291bnRCaXRzKHRydWUpfSBzZXRgO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIGRlZXAgY29tcGFyaXNvbiBvZiB0d28gYml0c2V0cy5cbiAgZXF1YWxzKG90aGVyOiBCaXRBcnJheSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gb3RoZXIuX2xlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl9sZW5ndGggPT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoIC0gMTsgaSsrKVxuICAgICAgaWYgKHRoaXMuX2RhdGFbaV0gIT0gb3RoZXIuX2RhdGFbaV0pIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAobGV0IGkgPSAodGhpcy5fZGF0YS5sZW5ndGggLSAxKSAqIDg7IGkgPCB0aGlzLl9sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZ2V0Qml0KGkpICE9IG90aGVyLmdldEJpdChpKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBDbG9uZXMgYSBiaXRzZXQuICovXG4gIGNsb25lKCk6IEJpdEFycmF5IHtcbiAgICBjb25zdCBiaXRBcnJheSA9IG5ldyBCaXRBcnJheSgwLCBmYWxzZSk7XG4gICAgYml0QXJyYXkuX2RhdGEgPSBVaW50MzJBcnJheS5mcm9tKHRoaXMuX2RhdGEpOyAvLyBlZmZlY3RpdmUgbGVuZ3RoOiAobGVuZ3RoSW5JbnRzKVxuICAgIGJpdEFycmF5Ll9sZW5ndGggPSB0aGlzLl9sZW5ndGg7XG4gICAgYml0QXJyYXkuX3ZlcnNpb24gPSB0aGlzLl92ZXJzaW9uO1xuICAgIHJldHVybiBiaXRBcnJheTtcbiAgfVxuXG4gIC8qKiBJbml0aWFsaXplcyBhIGJpdHNldC4gKi9cbiAgaW5pdChmbGFnOiBGdW5jdGlvbiwgbm90aWZ5OiBib29sZWFuKTogQml0QXJyYXkge1xuICAgIHRoaXMuc2V0QWxsKGZhbHNlLCBmYWxzZSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZmxhZyhpKSlcbiAgICAgICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xuICAgIH1cblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIEludmVydHMgYSBiaXRzZXQuXG4gIGludmVydChub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9kYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSBePSAtMTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICB9XG5cbiAgLy8vIFNldHMgYWxsIGJpdHMgdG8gW3ZhbHVlXSwgb3B0aW9uYWxseSBzdXBwcmVzc2luZyBub3RpZmljYXRpb25zLlxuICBzZXRBbGwodmFsdWU6IGJvb2xlYW4sIG5vdGlmeSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgZmxhZ3MgPSB2YWx1ZSA/IC0xIDogMDtcbiAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIC8vdG9kbzogb3B0aW1pemVcbiAgICAgIHRoaXMuX2RhdGFbaV0gPSBmbGFncztcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICB9XG5cbiAgLy8vIFNldHMgYml0cyBhdCBbaW5kZXhlc10gcG9zaXRpb24gdG8gW3ZhbHVlXS5cbiAgLy8vIENsZWFycyB0aGUgYml0c2V0IGlmIFtjbGVhcl0gZmxhZyBpcyB0cnVlLlxuICAvLy8gQ2hhbmdlIG5vdGlmaWNhdGlvbiBpcyByYWlzZWQgd2hlbiBbbm90aWZ5XSBpcyB0cnVlLlxuICBzZXRJbmRleGVzKGluZGV4ZXM6IEFycmF5PG51bWJlcj4sIHZhbHVlID0gdHJ1ZSwgY2xlYXIgPSB0cnVlLCBub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKGNsZWFyKVxuICAgICAgdGhpcy5zZXRBbGwoIXZhbHVlLCBmYWxzZSk7XG5cbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kZXhlcylcbiAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIGV2ZXJ5SW5kZXgoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWUgPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaW5kZXgpICE9IHZhbHVlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYW55SW5kZXgoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWUgPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaW5kZXgpID09IHZhbHVlKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc2V0V2hlcmUoY2hlY2s6IEZ1bmN0aW9uLCB2YWx1ZSA9IHRydWUsIGNsZWFyID0gdHJ1ZSwgbm90aWZ5ID0gdHJ1ZSwgYWxsb3dDbGVhciA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoY2xlYXIgJiYgYWxsb3dDbGVhcilcbiAgICAgIHRoaXMuc2V0QWxsKCF2YWx1ZSwgZmFsc2UpO1xuXG4gICAgaWYgKGFsbG93Q2xlYXIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNoZWNrKGkpKVxuICAgICAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspXG4gICAgICAgIHRoaXMuc2V0RmFzdChpLCBjaGVjayhpKSA/IHZhbHVlIDogIXZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIGdldFJhbmdlKGZyb206IG51bWJlciwgdG86IG51bWJlcik6IEJpdEFycmF5IHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCwgJ3RvJyk7XG4gICAgY29uc3QgYXJyOiBBcnJheTxib29sZWFuPiA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87ICsraSlcbiAgICAgIGFyci5wdXNoKHRoaXMuZ2V0Qml0KGkpKTtcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVZhbHVlcyhhcnIpO1xuICB9XG5cbiAgZ2V0UmFuZ2VBc0xpc3QoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKTogYm9vbGVhbltdIHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCwgJ3RvJyk7XG4gICAgY29uc3QgYXJyOiBib29sZWFuW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOyArK2kpXG4gICAgICBhcnIucHVzaCh0aGlzLmdldEJpdChpKSk7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG5cbiAgc2V0UmFuZ2UoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbiwgbm90aWZ5ID0gdHJ1ZSk6IEJpdEFycmF5IHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCAtIDEsICd0bycpO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbihmcm9tLCB0byk7XG4gICAgY29uc3QgZW5kID0gTWF0aC5tYXgoZnJvbSwgdG8pO1xuXG4gICAgLy90b2RvOiBvcHRpbWl6ZVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKVxuICAgICAgICB0aGlzLnNldFRydWUoaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKylcbiAgICAgICAgdGhpcy5zZXRGYWxzZShpKTtcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBTZXRzIG4gcmFuZG9tbHkgY2hvc2VuIGJpdHMgdG8gdmFsdWUsIHJlbWFpbmluZyBiaXRzIHRvICF2YWx1ZS5cbiAgc2V0UmFuZG9tKG46IG51bWJlciwgdmFsdWU6IGJvb2xlYW4sIG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAobiA8IDAgfHwgbiA+IHRoaXMuX2xlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBtdXN0IGJlID49IDAgJiYgPD0gQ291bnQnKTtcblxuICAgIGlmIChuID4gdGhpcy5fbGVuZ3RoIC8gMilcbiAgICAgIHRoaXMuc2V0UmFuZG9tKHRoaXMuX2xlbmd0aCAtIG4sICF2YWx1ZSk7XG5cbiAgICB0aGlzLnNldEFsbCghdmFsdWUpO1xuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBuOykge1xuICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMuX2xlbmd0aCk7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaSkgPT0gdmFsdWUpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5zZXRGYXN0KGksIHZhbHVlKTtcbiAgICAgIGsrKztcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIC8vLyBNb2RpZmllcyBjdXJyZW50IGJpdHNldCBieSBwZXJmb3JtaW5nIHRoZSBiaXR3aXNlIEFORCBvcGVyYXRpb24gYWdhaW5zdCB0aGVcbiAgLy8vIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIGFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSAmPSB2YWx1ZS5fZGF0YVtpXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIEFORCBOT1Qgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIGFuZE5vdCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xuICAgIGZvciAobGV0IG51bTIgPSAwOyBudW0yIDwgbGVuOyBudW0yKyspXG4gICAgICB0aGlzLl9kYXRhW251bTJdICY9IH52YWx1ZS5fZGF0YVtudW0yXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIE5PVCBBTkQgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIG5vdEFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9ICh+dGhpcy5fZGF0YVtpXSkgJiB2YWx1ZS5fZGF0YVtpXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIEludmVydHMgYWxsIGJpdCB2YWx1ZXMgaW4gdGhlIGN1cnJlbnQgYml0c2V0XG4gIG5vdChub3RpZnkgPSB0cnVlKTogQml0QXJyYXkge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9IH50aGlzLl9kYXRhW2ldO1xuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLy8gUGVyZm9ybXMgdGhlIGJpdHdpc2UgT1Igb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIG9yKHZhbHVlOiBCaXRBcnJheSwgbm90aWZ5ID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gdmFsdWUuX2xlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbGVuZ3RocyBkaWZmZXIuJyk7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7IGkgPCBsZW47IGkrKylcbiAgICAgIHRoaXMuX2RhdGFbaV0gfD0gdmFsdWUuX2RhdGFbaV07XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBQZXJmb3JtcyB0aGUgYml0d2lzZSBleGNsdXNpdmUgT1Igb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIHhvcih2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IHZhbHVlLl9sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IGxlbmd0aHMgZGlmZmVyLicpO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzOyBpIDwgbGVuOyBpKyspXG4gICAgICB0aGlzLl9kYXRhW2ldIF49IHZhbHVlLl9kYXRhW2ldO1xuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLy8gSW5zZXJ0cyBuIDAtYml0cyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIGJpdHMgYXBwcm9wcmlhdGVseS5cbiAgaW5zZXJ0QXQocG9zOiBudW1iZXIsIG46IG51bWJlciwgZmxhZyA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKHBvcywgMCwgdGhpcy5fbGVuZ3RoLCAncG9zJyk7XG5cbiAgICBpZiAobiA9PSAwKSByZXR1cm47XG5cbiAgICAvL1RPRE86IG9wdGltaXplXG4gICAgLy90aGUgbW9zdCBwcmltaXRpdmUgaW1wbGVtZW50YXRpb24sIG9wdGltaXplIGl0IGxhdGVyIVxuXG4gICAgLy8gYmVnaW5VcGRhdGUoKTtcbiAgICBjb25zdCBvbGRsZW5ndGggPSB0aGlzLl9sZW5ndGg7XG4gICAgdGhpcy5zZXRMZW5ndGgodGhpcy5fbGVuZ3RoICsgbik7XG5cbiAgICAvL2lmICghY29udGFpbnMoIWZsYWcpKSByZXR1cm47IC8vIG5vdGhpbmcgdG8gZG9cblxuICAgIGZvciAobGV0IGkgPSBvbGRsZW5ndGggLSAxOyBpID49IHBvczsgaS0tKVxuICAgICAgdGhpcy5zZXRCaXQoaSArIG4sIHRoaXMuZ2V0Qml0KGkpKTtcblxuICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCBwb3MgKyBuOyBpKyspXG4gICAgICB0aGlzLnNldEJpdChpLCBmbGFnKTtcblxuICAgIC8vIGVuZFVwZGF0ZSgpO1xuICB9XG5cbiAgLy8vIERlbGV0ZXMgbiBiaXRzIGJlZ2lubmluZyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIHJlbWFpbmluZ1xuICAvLy8gYml0cyBhcHByb3ByaWF0ZWx5LlxuICByZW1vdmVBdChwb3M6IG51bWJlciwgbiA9IDEpOiB2b2lkIHtcbiAgICAvLyB0aGUgbW9zdCBwcmltaXRpdmUgaW1wbGVtZW50YXRpb24sIG9wdGltaXplIGl0IGxhdGVyIVxuICAgIGlmIChuIDwgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBjYW5ub3QgYmUgbmVnYXRpdmUnKTtcblxuICAgIHRoaXMuYXNzdXJlSW5SYW5nZShwb3MsIDAsIHRoaXMuX2xlbmd0aCAtIG4sICdwb3MnKTtcblxuICAgIGlmICh0aGlzLmNvbnRhaW5zKHRydWUpKSB7XG4gICAgICBmb3IgKGxldCBpID0gcG9zOyBpIDwgdGhpcy5fbGVuZ3RoIC0gbjsgaSsrKVxuICAgICAgICB0aGlzLnNldEJpdChpLCB0aGlzLmdldEJpdChpICsgbikpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0TGVuZ3RoKHRoaXMuX2xlbmd0aCAtIG4pO1xuICB9XG5cbiAgcmVtb3ZlQnlNYXNrKG1hc2s6IEJpdEFycmF5LCBmbGFnID0gdHJ1ZSk6IEJpdEFycmF5IHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IG1hc2subGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsZW5ndGggIT0gbWFzay5sZW5ndGgnKTtcblxuICAgIGlmIChtYXNrID09IHRoaXMpIHsgLy8gbm8gbmVlZCB0byBpdGVyYXRlXG4gICAgICB0aGlzLnNldExlbmd0aChtYXNrLmNvdW50Qml0cyghZmxhZykpO1xuICAgICAgdGhpcy5zZXRBbGwoIWZsYWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZHN0SWR4ID0gMDtcblxuICAgICAgZm9yIChsZXQgc3JjSWR4ID0gLTE7IChzcmNJZHggPSBtYXNrLmZpbmROZXh0KHNyY0lkeCwgIWZsYWcpKSAhPSAtMTspXG4gICAgICAgIHRoaXMuc2V0RmFzdChkc3RJZHgrKywgdGhpcy5nZXRCaXQoc3JjSWR4KSk7XG5cbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRzdElkeDtcbiAgICAgIHRoaXMuX3ZlcnNpb24rKztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cbiAgZ2V0Qml0KHBvczogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLl9kYXRhW01hdGguZmxvb3IocG9zIC8gMHgyMCldICYgKDEgPDwgKHBvcyAmIDB4MWYpKSkgIT0gMDtcbiAgfVxuXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cbiAgc2V0Qml0KHBvczogbnVtYmVyLCBiaXQ6IGJvb2xlYW4sIG5vdGlmeSA9IHRydWUpIHtcbiAgICB0aGlzLnNldEZhc3QocG9zLCBiaXQpO1xuICAgIGlmIChub3RpZnkpXG4gICAgICB0aGlzLl92ZXJzaW9uKys7XG4gICAgZWxzZVxuICAgICAgdGhpcy5fdmVyc2lvbisrO1xuICB9XG5cbiAgLy8vIFNldHMgW2ldLXRoIGJpdCB0byBbdmFsdWVdLCBkb2VzIG5vdCBjaGVjayBib3VuZHMsIGRvZXMgbm90IGluY3JlbWVudCB2ZXJzaW9uXG4gIHNldEZhc3QoaTogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSlcbiAgICAgIHRoaXMuX2RhdGFbTWF0aC5mbG9vcihpIC8gMHgyMCldIHw9IDEgPDwgKGkgJiAweDFmKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLl9kYXRhW01hdGguZmxvb3IoaSAvIDB4MjApXSAmPSB+KDEgPDwgKGkgJiAweDFmKSk7XG4gIH1cblxuICBzZXRUcnVlKHBvczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSB8PSAxIDw8IChwb3MgJiAweDFmKTtcbiAgfVxuXG4gIHNldEZhbHNlKHBvczogbnVtYmVyKSB7XG4gICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSAmPSB+KDEgPDwgKHBvcyAmIDB4MWYpKTtcbiAgfVxuXG4gIHRydWVDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyh0cnVlKTtcbiAgfVxuXG4gIGZhbHNlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHMoZmFsc2UpO1xuICB9XG5cbiAgLy8vIENvdW50cyBiaXRzIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuXG4gIGNvdW50Qml0cyh2YWx1ZTogYm9vbGVhbik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCA9PSAwKSByZXR1cm4gMDtcblxuICAgIGlmICh0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZENvdW50ID0gMDtcbiAgICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgayA9IHRoaXMuX2RhdGFbaV07IGsgIT0gMDsgayA+Pj49IDgpIHsgLy90b2RvOiBjYXN0IGRhdGFbaV0gdG8gdWludFxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBsYXN0IGludC5cbiAgICAgIGxldCBrID0gdGhpcy5fZGF0YVtpXTtcbiAgICAgIGNvbnN0IHJlbWFpbmluZ0JpdHMgPSB0aGlzLl9sZW5ndGggJiAweDFmO1xuICAgICAgaWYgKHJlbWFpbmluZ0JpdHMgIT0gMCkgLyogaWYgcmVtYWluaW5nQml0cyA9PSAwLCB0aGUgbGFzdCBpbnQgaXMgZnVsbHkgdXNlZCBhbmQgQUxMIGJpdHMgc2hvdWxkIGJlIGxlZnQgYXMgaXMgKi9cbiAgICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcblxuICAgICAgZm9yICg7IGsgIT0gMDsgayA+Pj49IDgpXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xuXG4gICAgICB0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XG4gICAgfVxuXG4gICAgcmV0dXJuICh2YWx1ZSA/IHRoaXMuX3NlbGVjdGVkQ291bnQgOiB0aGlzLl9sZW5ndGggLSB0aGlzLl9zZWxlY3RlZENvdW50KTtcbiAgfVxuXG4gIC8vLyBSZXR1cm5zIGEgbnVtYmVyIG9mIHNldCBiaXRzIHdoZXJlIGFsc28gW2NoZWNrXSBpcyB0cnVlXG4gIGNvdW50V2hlcmUoY2hlY2s6IEZ1bmN0aW9uKTogbnVtYmVyIHtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBpZiAodGhpcy50cnVlQ291bnQoKSA9PSB0aGlzLl9sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspXG4gICAgICAgIHJlc3VsdCArPSBjaGVjayhpKSA/IDEgOiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gLTE7IChpID0gdGhpcy5maW5kTmV4dChpLCB0cnVlKSkgIT0gLTE7KVxuICAgICAgICByZXN1bHQgKz0gY2hlY2soaSkgPyAxIDogMDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vLyBQZXJmb3JtcyBiaXQgXCJhbmRcIiBhbmQgY291bnRzIGJpdHMgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgd2l0aG91dCBiaXRzZXQgbW9kaWZpY2F0aW9uLlxuICBhbmRXaXRoQ291bnRCaXRzKHNlY29uZDogQml0QXJyYXksIHZhbHVlOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoID09IDApIHJldHVybiAwO1xuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGsgPSB0aGlzLl9kYXRhW2ldICYgc2Vjb25kLl9kYXRhW2ldOyBrICE9IDA7IGsgPj4+PSA4KVxuICAgICAgICBjb3VudCArPSBCaXRBcnJheS5fb25CaXRDb3VudFtrICYgMHhmZl07XG4gICAgfVxuXG4gICAgLy8gVGhlIGxhc3QgaW50LlxuICAgIGxldCBrID0gdGhpcy5fZGF0YVtpXSAmIHNlY29uZC5fZGF0YVtpXTtcbiAgICBjb25zdCByZW1haW5pbmdCaXRzID0gdGhpcy5fbGVuZ3RoICYgMHgxZjtcbiAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKVxuICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcbiAgICBmb3IgKDsgayAhPSAwOyBrID4+Pj0gOClcbiAgICAgIGNvdW50ICs9IEJpdEFycmF5Ll9vbkJpdENvdW50W2sgJiAweGZmXTtcblxuICAgIHJldHVybiAodmFsdWUgPyBjb3VudCA6IHRoaXMuX2xlbmd0aCAtIGNvdW50KTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0TGVuZ3RoKDApO1xuICB9XG5cbiAgY29udGFpbnModmFsdWU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maW5kTmV4dCgtMSwgdmFsdWUpID49IDA7XG4gIH1cblxuICBnZXQgYWxsVHJ1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHModHJ1ZSkgPT0gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFsbEZhbHNlKCkge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyhmYWxzZSkgPT0gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFueVRydWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKHRydWUpID4gMDtcbiAgfVxuXG4gIGdldCBhbnlGYWxzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHMoZmFsc2UpID4gMDtcbiAgfVxuXG4gIC8vLyBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbmV4dCBiaXQgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLlxuICAvLy8gUmV0dXJucyAtMSwgaWYgdGhlcmUgYXJlIG5vIHN1Y2ggYml0cy5cbiAgZmluZE5leHQoaW5kZXg6IG51bWJlciwgdmFsdWUgPSB0cnVlKTogbnVtYmVyIHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoaW5kZXgsIC0xLCB0aGlzLl9sZW5ndGgsICdpbmRleCcpO1xuXG4gICAgaWYgKGluZGV4ID49IHRoaXMuX2xlbmd0aCAtIDEpIHJldHVybiAtMTtcbiAgICBpbmRleCA9IGluZGV4IDwgMCA/IDAgOiBpbmRleCArIDE7IC8vIHNraXAgc3RhcnRcbiAgICBsZXQgdW51c2VkQml0cyA9IGluZGV4ICYgMHgxZjtcbiAgICBjb25zdCBudW1JbnRzID0gdGhpcy5sZW5ndGhJbkludHM7XG5cbiAgICBmb3IgKGxldCBpID0gTWF0aC5mbG9vcihpbmRleCAvIDMyKTsgaSA8IG51bUludHM7IGkrKykge1xuICAgICAgbGV0IGsgPSAodmFsdWUgPyB0aGlzLl9kYXRhW2ldIDogfnRoaXMuX2RhdGFbaV0pOyAvLyB1aW50IGNhc3RcbiAgICAgIGlmICh1bnVzZWRCaXRzICE9IDApIHtcbiAgICAgICAgayAmPSAoKDB4ZmZmZmZmZmYgPDwgdW51c2VkQml0cykgJiAweGZmZmZmZmZmKTtcbiAgICAgICAgdW51c2VkQml0cyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKCF2YWx1ZSAmJiBrID09IC00Mjk0OTY3Mjk2KSAvKiBsb29raW5nIGZvciBmYWxzZSwgYWxsIGJpdHMgYXJlIHNldCAqL3tcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGogPSAwOyBrICE9IDA7IGogKz0gOCwgayA+Pj49IDgpIHtcbiAgICAgICAgY29uc3QgcCA9IEJpdEFycmF5Ll9maXJzdE9uQml0W2sgJiAweGZmXTtcbiAgICAgICAgaWYgKHAgPj0gMCkge1xuICAgICAgICAgIGluZGV4ID0gcCArIChpICogMzIpICsgajtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gdGhpcy5fbGVuZ3RoKSByZXR1cm4gLTE7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vLyBGaW5kcyBwcmV2aW91cyBiaXQgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSBpbiB0aGUgYml0c2V0LlxuICBmaW5kUHJldihpbmRleDogbnVtYmVyLCB2YWx1ZSA9IHRydWUpOiBudW1iZXIge1xuICAgIGlmIChpbmRleCA9PSAwKSByZXR1cm4gLTE7XG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKGluZGV4LCAtMSwgdGhpcy5fbGVuZ3RoLCAnaW5kZXgnKTtcblxuICAgIGluZGV4ID0gaW5kZXggPCAwID8gdGhpcy5fbGVuZ3RoIC0gMSA6IGluZGV4IC0gMTsgLy8gc2tpcCBzdGFydFxuXG4gICAgY29uc3QgbGFzdEludElkeCA9IE1hdGguZmxvb3IoaW5kZXggLyAweDIwKTtcbiAgICBsZXQgcmVtYWluaW5nQml0cyA9IChpbmRleCArIDEpICYgMHgxZjtcblxuICAgIGZvciAobGV0IGkgPSBsYXN0SW50SWR4OyBpID49IDA7IGktLSkge1xuICAgICAgbGV0IGsgPSAodmFsdWUgPyB0aGlzLl9kYXRhW2ldIDogfnRoaXMuX2RhdGFbaV0pOyAvLyBjYXN0XG4gICAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKSB7XG4gICAgICAgIGsgJj0gfigoNDI5NDk2NzI5NSkgPDwgcmVtYWluaW5nQml0cyk7XG4gICAgICAgIHJlbWFpbmluZ0JpdHMgPSAwO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaiA9IDI0OyBrICE9IDA7IGogLT0gOCwgayA8PD0gOCkge1xuICAgICAgICBjb25zdCBwID0gQml0QXJyYXkuX2xhc3RPbkJpdFtrID4+PiAweDE4XTtcbiAgICAgICAgaWYgKHAgPj0gMClcbiAgICAgICAgICByZXR1cm4gcCArIChpICogMzIpICsgajtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG4iXX0=","import * as umj from 'umap-js';\nimport { TSNE } from '@keckelt/tsne';\nimport { Vector, } from '@datagrok-libraries/utils/src/type-declarations';\nimport { calcDistanceMatrix, transposeMatrix, assert, } from '@datagrok-libraries/utils/src/vector-operations';\nimport { SPEBase, PSPEBase, OriginalSPE } from './spe';\nimport { Measure, AvailableMetrics, isBitArrayMetric } from './typed-metrics';\nimport BitArray from '@datagrok-libraries/utils/src/bit-array';\nexport const UMAP = 'UMAP';\nexport const T_SNE = 't-SNE';\nexport class UMAPOptions {\n constructor() {\n this.learningRate = { uiName: 'Learinig rate', value: 1, tooltip: 'The initial learning rate for the embedding optimization' };\n this.nComponents = { uiName: 'Components', value: 2, tooltip: 'The number of components (dimensions) to project the data to' };\n this.nEpochs = { uiName: 'Epochs', value: 0, tooltip: 'The number of epochs to optimize embeddings via SGD. Computed automatically if set to 0' };\n this.nNeighbors = { uiName: 'Neighbors', value: 15, tooltip: 'The number of nearest neighbors to construct the fuzzy manifold' };\n this.spread = { uiName: 'Spread', value: 1, tooltip: 'The effective scale of embedded points, used with min distance to control the clumped/dispersed nature of the embedding' };\n this.minDist = { uiName: 'Min distance', value: 0.1, tooltip: 'The effective minimum distance between embedded points, used with spread to control the clumped/dispersed nature of the embedding' };\n }\n ;\n}\nexport class TSNEOptions {\n constructor() {\n this.epsilon = { uiName: 'Epsilon', value: 10, tooltip: 'Epsilon is learning rate' };\n this.perplexity = { uiName: 'Perplexity', value: 30, tooltip: 'Roughly how many neighbors each point influences' };\n this.dim = { uiName: 'Dimensionality', value: 2, tooltip: 'Dimensionality of the embedding' };\n }\n ;\n}\n/** Abstract dimensionality reducer */\nclass Reducer {\n constructor(options) {\n this.data = options.data;\n }\n}\n/** t-SNE dimensionality reduction. */\nclass TSNEReducer extends Reducer {\n /**\n * Creates an instance of TSNEReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof TSNEReducer\n */\n constructor(options) {\n var _a;\n super(options);\n this.reducer = new TSNE(options);\n this.iterations = (_a = options === null || options === void 0 ? void 0 : options.iterations) !== null && _a !== void 0 ? _a : 100;\n this.distanceFn = options.distance;\n }\n /**\n * Embeds the data given into the two-dimensional space using t-SNE method.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n */\n transform() {\n const distance = calcDistanceMatrix(this.data, this.distanceFn);\n this.reducer.initDataDist(distance);\n for (let i = 0; i < this.iterations; ++i) {\n this.reducer.step(); // every time you call this, solution gets better\n }\n return { distance: distance, embedding: this.reducer.getSolution() };\n }\n}\n/**\n * Implements UMAP dimensionality reduction.\n *\n * @class UMAPReducer\n * @extends {Reducer}\n */\nclass UMAPReducer extends Reducer {\n /**\n * Creates an instance of UMAPReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof UMAPReducer\n */\n constructor(options) {\n super(options);\n assert('distanceFn' in options);\n this.distanceFn = options.distanceFn;\n this.vectors = [];\n options.distanceFn = this._encodedDistance.bind(this);\n if (this.data.length < 15)\n options.nNeighbors = this.data.length - 1;\n this.reducer = new umj.UMAP(options);\n }\n /**\n * Custom distance wrapper to have numeric inputs instead of string ones.\n *\n * @protected\n * @param {number[]} a The first item.\n * @param {number[]} b The first item.\n * @return {number} Distance metric.\n * @memberof UMAPReducer\n */\n _encodedDistance(a, b) {\n return this.distanceFn(this.data[a[0]], this.data[b[0]]);\n }\n /**\n * Encodes the input data as a vector of indices.\n *\n * @protected\n * @memberof UMAPReducer\n */\n _encode() {\n for (let i = 0; i < this.data.length; ++i) {\n this.vectors.push([i]);\n }\n }\n /**\n * Embeds the data given into the two-dimensional space using UMAP method.\n * @return {any} Cartesian coordinate of this embedding.\n */\n transform() {\n this._encode();\n const embedding = this.reducer.fit(this.vectors);\n function arrayCast2Coordinates(data) {\n return new Array(data.length).fill(0).map((_, i) => (Vector.from(data[i])));\n }\n return { embedding: arrayCast2Coordinates(embedding) };\n }\n}\n/**\n * Implements original SPE dimensionality reduction.\n *\n * @class SPEReducer\n * @extends {Reducer}\n */\nclass SPEReducer extends Reducer {\n /**\n * Creates an instance of SPEReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof SPEReducer\n */\n constructor(options) {\n super(options);\n this.reducer = new SPEBase(options);\n }\n /**\n * Embeds the data given into the two-dimensional space using the original SPE method.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n */\n transform() {\n const emb = this.reducer.embed(this.data);\n return { distance: this.reducer.distance, embedding: emb };\n }\n}\n/**\n * Implements modified SPE dimensionality reduction.\n *\n * @class PSPEReducer\n * @extends {Reducer}\n */\nclass PSPEReducer extends Reducer {\n /**\n * Creates an instance of PSPEReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof PSPEReducer\n */\n constructor(options) {\n super(options);\n this.reducer = new PSPEBase(options);\n }\n /**\n * Embeds the data given into the two-dimensional space using the modified SPE method.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n */\n transform() {\n const emb = this.reducer.embed(this.data);\n return { distance: this.reducer.distance, embedding: emb };\n }\n}\n/**\n * Implements original SPE dimensionality reduction.\n *\n * @class OriginalSPEReducer\n * @extends {Reducer}\n */\nclass OriginalSPEReducer extends Reducer {\n /**\n * Creates an instance of OriginalSPEReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof OriginalSPEReducer\n */\n constructor(options) {\n super(options);\n this.reducer = new OriginalSPE(options);\n }\n /**\n * Embeds the data given into the two-dimensional space using the original SPE method.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n */\n transform() {\n const emb = this.reducer.embed(this.data);\n return { distance: this.reducer.distance, embedding: emb };\n }\n}\nconst AvailableReducers = {\n 'UMAP': UMAPReducer,\n 't-SNE': TSNEReducer,\n 'SPE': SPEReducer,\n 'pSPE': PSPEReducer,\n 'OriginalSPE': OriginalSPEReducer,\n};\n/**\n * Unified class implementing different dimensionality reduction methods.\n *\n * @export\n * @class DimensionalityReducer\n */\nexport class DimensionalityReducer {\n /**\n * Creates an instance of DimensionalityReducer.\n * @param {any[]} data Vectors to embed.\n * @param {KnownMethods} method Embedding method to be applied\n * @param {KnownMetrics} metric Distance metric to be computed between each of the vectors.\n * @param {Options} [options] Options to pass to the implementing embedders.\n * @memberof DimensionalityReducer\n */\n constructor(data, method, metric, options) {\n var _a;\n const measure = new Measure(metric).getMeasure();\n let specOptions = {};\n if (isBitArrayMetric(metric)) {\n for (let i = 0; i < data.length; ++i) {\n data[i] = new BitArray(data[i]._data, data[i]._length);\n }\n }\n if (method == 'UMAP') {\n specOptions = Object.assign(Object.assign(Object.assign({ data: data }, { distanceFn: measure }), { nEpochs: options === null || options === void 0 ? void 0 : options.cycles }), options);\n }\n else if (method == 't-SNE') {\n specOptions = Object.assign(Object.assign(Object.assign({ data: data }, { distance: measure }), { iterations: (_a = options === null || options === void 0 ? void 0 : options.cycles) !== null && _a !== void 0 ? _a : undefined }), options);\n }\n else if (method == 'SPE') {\n specOptions = Object.assign(Object.assign({ data: data }, { distance: measure }), options);\n }\n else {\n specOptions = Object.assign(Object.assign({ data: data }, { distance: measure }), options);\n }\n this.reducer = new AvailableReducers[method](specOptions);\n }\n /**\n * Embeds the data given into the two-dimensional space using the chosen method.\n *\n * @param {boolean} transpose Whether to transform coordinates to have columns-first orientation.\n * @throws {Error} If the embedding method was not found.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n * @memberof DimensionalityReducer\n */\n transform(transpose = false) {\n if (this.reducer == undefined) {\n throw new Error('Reducer was not defined.');\n }\n let { embedding, distance } = this.reducer.transform();\n if (transpose) {\n embedding = transposeMatrix(embedding);\n }\n return { distance: distance, embedding: embedding };\n }\n /**\n * Returns metrics available by type.\n *\n * @param {AvailableDataTypes} typeName type name\n * @return {string[]} Metric names which expects the given data type\n * @memberof DimensionalityReducer\n */\n static availableMetricsByType(typeName) {\n return Object.keys(AvailableMetrics[typeName]);\n }\n /**\n * Returns dimensionality reduction methods available.\n *\n * @readonly\n * @memberof DimensionalityReducer\n */\n static get availableMethods() {\n return Object.keys(AvailableReducers);\n }\n /**\n * Returns metrics available.\n *\n * @readonly\n * @memberof DimensionalityReducer\n */\n static get availableMetrics() {\n let ans = [];\n Object.values(AvailableMetrics).forEach((obj) => {\n const array = Object.values(obj);\n ans = [...ans, ...array];\n });\n return ans;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlLWRpbWVuc2lvbmFsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVkdWNlLWRpbWVuc2lvbmFsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxHQUFHLE1BQU0sU0FBUyxDQUFDO0FBQy9CLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUlMLE1BQU0sR0FHUCxNQUFNLGlEQUFpRCxDQUFDO0FBQ3pELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLE1BQU0sR0FDUCxNQUFNLGlEQUFpRCxDQUFDO0FBQ3pELE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUNyRCxPQUFPLEVBQUMsT0FBTyxFQUFnQixnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBcUIsTUFBTSxpQkFBaUIsQ0FBQztBQUM5RyxPQUFPLFFBQVEsTUFBTSx5Q0FBeUMsQ0FBQztBQUcvRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDO0FBQzNCLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUM7QUF3QjdCLE1BQU0sT0FBTyxXQUFXO0lBUXRCO1FBUEEsaUJBQVksR0FBd0IsRUFBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLDBEQUEwRCxFQUFDLENBQUM7UUFDN0ksZ0JBQVcsR0FBdUIsRUFBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLDhEQUE4RCxFQUFDLENBQUM7UUFDNUksWUFBTyxHQUF1QixFQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUseUZBQXlGLEVBQUMsQ0FBQztRQUMvSixlQUFVLEdBQXVCLEVBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVB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Q0gsTUFBTSxDQUFDLHNCQUFzQixDQUFDLFFBQTRCO1FBQ3hELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sS0FBSyxnQkFBZ0I7UUFDekIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxLQUFLLGdCQUFnQjtRQUN6QixJQUFJLEdBQUcsR0FBYSxFQUFFLENBQUM7UUFDdkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzlDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdW1qIGZyb20gJ3VtYXAtanMnO1xuaW1wb3J0IHtUU05FfSBmcm9tICdAa2Vja2VsdC90c25lJztcbmltcG9ydCB7XG4gIE9wdGlvbnMsXG4gIERpc3RhbmNlTWV0cmljLFxuICBDb29yZGluYXRlcyxcbiAgVmVjdG9yLFxuICBWZWN0b3JzLFxuICBNYXRyaXgsXG59IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7XG4gIGNhbGNEaXN0YW5jZU1hdHJpeCxcbiAgdHJhbnNwb3NlTWF0cml4LFxuICBhc3NlcnQsXG59IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3ZlY3Rvci1vcGVyYXRpb25zJztcbmltcG9ydCB7U1BFQmFzZSwgUFNQRUJhc2UsIE9yaWdpbmFsU1BFfSBmcm9tICcuL3NwZSc7XG5pbXBvcnQge01lYXN1cmUsIEtub3duTWV0cmljcywgQXZhaWxhYmxlTWV0cmljcywgaXNCaXRBcnJheU1ldHJpYywgQXZhaWxhYmxlRGF0YVR5cGVzfSBmcm9tICcuL3R5cGVkLW1ldHJpY3MnO1xuaW1wb3J0IEJpdEFycmF5IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL2JpdC1hcnJheSc7XG5pbXBvcnQge1VNQVBQYXJhbWV0ZXJzfSBmcm9tICd1bWFwLWpzJztcblxuZXhwb3J0IGNvbnN0IFVNQVAgPSAnVU1BUCc7XG5leHBvcnQgY29uc3QgVF9TTkUgPSAndC1TTkUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElVTUFQT3B0aW9ucyB7XG4gIGxlYXJuaW5nUmF0ZT86IG51bWJlcjtcbiAgbkNvbXBvbmVudHM/OiBudW1iZXI7XG4gIG5FcG9jaHM/OiBudW1iZXI7XG4gIG5OZWlnaGJvcnM/OiBudW1iZXI7XG4gIHNwcmVhZD86IG51bWJlcjtcbiAgbWluRGlzdD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVFNORU9wdGlvbnMge1xuICBlcHNpbG9uPzogbnVtYmVyO1xuICBwZXJwbGV4aXR5PzogbnVtYmVyO1xuICBkaW0/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpbVJlZHVjdGlvblBhcmFtIHtcbiAgdWlOYW1lOiBzdHJpbmc7XG4gIHZhbHVlOiBudW1iZXIgfCBudWxsO1xuICB0b29sdGlwOiBzdHJpbmc7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgVU1BUE9wdGlvbnMge1xuICBsZWFybmluZ1JhdGU6IElEaW1SZWR1Y3Rpb25QYXJhbSA9ICB7dWlOYW1lOiAnTGVhcmluaWcgcmF0ZScsIHZhbHVlOiAxLCB0b29sdGlwOiAnVGhlIGluaXRpYWwgbGVhcm5pbmcgcmF0ZSBmb3IgdGhlIGVtYmVkZGluZyBvcHRpbWl6YXRpb24nfTtcbiAgbkNvbXBvbmVudHM6IElEaW1SZWR1Y3Rpb25QYXJhbSA9IHt1aU5hbWU6ICdDb21wb25lbnRzJywgdmFsdWU6IDIsIHRvb2x0aXA6ICdUaGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgKGRpbWVuc2lvbnMpIHRvIHByb2plY3QgdGhlIGRhdGEgdG8nfTtcbiAgbkVwb2NoczogSURpbVJlZHVjdGlvblBhcmFtID0ge3VpTmFtZTogJ0Vwb2NocycsIHZhbHVlOiAwLCB0b29sdGlwOiAnVGhlIG51bWJlciBvZiBlcG9jaHMgdG8gb3B0aW1pemUgZW1iZWRkaW5ncyB2aWEgU0dELiBDb21wdXRlZCBhdXRvbWF0aWNhbGx5IGlmIHNldCB0byAwJ307XG4gIG5OZWlnaGJvcnM6IElEaW1SZWR1Y3Rpb25QYXJhbSA9IHt1aU5hbWU6ICdOZWlnaGJvcnMnLCB2YWx1ZTogMTUsIHRvb2x0aXA6ICdUaGUgbnVtYmVyIG9mIG5lYXJlc3QgbmVpZ2hib3JzIHRvIGNvbnN0cnVjdCB0aGUgZnV6enkgbWFuaWZvbGQnfTtcbiAgc3ByZWFkOiBJRGltUmVkdWN0aW9uUGFyYW0gPSB7dWlOYW1lOiAnU3ByZWFkJywgdmFsdWU6IDEsIHRvb2x0aXA6ICdUaGUgZWZmZWN0aXZlIHNjYWxlIG9mIGVtYmVkZGVkIHBvaW50cywgdXNlZCB3aXRoIG1pbiBkaXN0YW5jZSB0byBjb250cm9sIHRoZSBjbHVtcGVkL2Rpc3BlcnNlZCBuYXR1cmUgb2YgdGhlIGVtYmVkZGluZyd9O1xuICBtaW5EaXN0OiBJRGltUmVkdWN0aW9uUGFyYW0gPSB7dWlOYW1lOiAnTWluIGRpc3RhbmNlJywgdmFsdWU6IDAuMSwgdG9vbHRpcDogJ1RoZSBlZmZlY3RpdmUgbWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIGVtYmVkZGVkIHBvaW50cywgdXNlZCB3aXRoIHNwcmVhZCB0byBjb250cm9sIHRoZSBjbHVtcGVkL2Rpc3BlcnNlZCBuYXR1cmUgb2YgdGhlIGVtYmVkZGluZyd9O1xuXG4gIGNvbnN0cnVjdG9yKCkge307XG59XG5cbmV4cG9ydCBjbGFzcyBUU05FT3B0aW9ucyB7XG4gIGVwc2lsb246IElEaW1SZWR1Y3Rpb25QYXJhbSA9ICB7dWlOYW1lOiAnRXBzaWxvbicsIHZhbHVlOiAxMCwgdG9vbHRpcDogJ0Vwc2lsb24gaXMgbGVhcm5pbmcgcmF0ZSd9O1xuICBwZXJwbGV4aXR5OiBJRGltUmVkdWN0aW9uUGFyYW0gPSB7dWlOYW1lOiAnUGVycGxleGl0eScsIHZhbHVlOiAzMCwgdG9vbHRpcDogJ1JvdWdobHkgaG93IG1hbnkgbmVpZ2hib3JzIGVhY2ggcG9pbnQgaW5mbHVlbmNlcyd9O1xuICBkaW06IElEaW1SZWR1Y3Rpb25QYXJhbSA9IHt1aU5hbWU6ICdEaW1lbnNpb25hbGl0eScsIHZhbHVlOiAyLCB0b29sdGlwOiAnRGltZW5zaW9uYWxpdHkgb2YgdGhlIGVtYmVkZGluZyd9O1xuXG4gIGNvbnN0cnVjdG9yKCkge307XG59XG5cblxuLyoqIEFic3RyYWN0IGRpbWVuc2lvbmFsaXR5IHJlZHVjZXIgKi9cbmFic3RyYWN0IGNsYXNzIFJlZHVjZXIge1xuICBwcm90ZWN0ZWQgZGF0YTogVmVjdG9ycztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgdGhpcy5kYXRhID0gb3B0aW9ucy5kYXRhO1xuICB9XG5cbiAgLyoqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UuXG4gICAqIEByZXR1cm4ge2FueX0gQ2FydGVzaWFuIGNvb3JkaW5hdGUgb2YgdGhpcyBlbWJlZGRpbmcgYW5kIGRpc3RhbmNlIG1hdHJpeCB3aGVyZSBhcHBsaWNhYmxlLiAqL1xuICBhYnN0cmFjdCB0cmFuc2Zvcm0oKTogeyBba2V5OiBzdHJpbmddOiBNYXRyaXggfTtcbn1cblxuLyoqIHQtU05FIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbi4gKi9cbmNsYXNzIFRTTkVSZWR1Y2VyIGV4dGVuZHMgUmVkdWNlciB7XG4gIHByb3RlY3RlZCByZWR1Y2VyOiBUU05FO1xuICBwcm90ZWN0ZWQgaXRlcmF0aW9uczogbnVtYmVyO1xuICBwcm90ZWN0ZWQgZGlzdGFuY2VGbjogRGlzdGFuY2VNZXRyaWM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgVFNORVJlZHVjZXIuXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAbWVtYmVyb2YgVFNORVJlZHVjZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLnJlZHVjZXIgPSBuZXcgVFNORShvcHRpb25zKTtcbiAgICB0aGlzLml0ZXJhdGlvbnMgPSBvcHRpb25zPy5pdGVyYXRpb25zID8/IDEwMDtcbiAgICB0aGlzLmRpc3RhbmNlRm4gPSBvcHRpb25zLmRpc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgdC1TTkUgbWV0aG9kLlxuICAgKiBAcmV0dXJuIHthbnl9IENhcnRlc2lhbiBjb29yZGluYXRlIG9mIHRoaXMgZW1iZWRkaW5nIGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZS5cbiAgICovXG4gIHB1YmxpYyB0cmFuc2Zvcm0oKTogeyBba2V5OiBzdHJpbmddOiBNYXRyaXggfSB7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBjYWxjRGlzdGFuY2VNYXRyaXgodGhpcy5kYXRhLCB0aGlzLmRpc3RhbmNlRm4pO1xuICAgIHRoaXMucmVkdWNlci5pbml0RGF0YURpc3QoZGlzdGFuY2UpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLml0ZXJhdGlvbnM7ICsraSkge1xuICAgICAgdGhpcy5yZWR1Y2VyLnN0ZXAoKTsgLy8gZXZlcnkgdGltZSB5b3UgY2FsbCB0aGlzLCBzb2x1dGlvbiBnZXRzIGJldHRlclxuICAgIH1cbiAgICByZXR1cm4ge2Rpc3RhbmNlOiBkaXN0YW5jZSwgZW1iZWRkaW5nOiB0aGlzLnJlZHVjZXIuZ2V0U29sdXRpb24oKX07XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgVW1hcE9wdGlvbnMgPSBPcHRpb25zICYgVU1BUFBhcmFtZXRlcnM7XG5cbi8qKlxuICogSW1wbGVtZW50cyBVTUFQIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbi5cbiAqXG4gKiBAY2xhc3MgVU1BUFJlZHVjZXJcbiAqIEBleHRlbmRzIHtSZWR1Y2VyfVxuICovXG5jbGFzcyBVTUFQUmVkdWNlciBleHRlbmRzIFJlZHVjZXIge1xuICBwcm90ZWN0ZWQgcmVkdWNlcjogdW1qLlVNQVA7XG4gIHByb3RlY3RlZCBkaXN0YW5jZUZuOiBGdW5jdGlvbjtcbiAgcHJvdGVjdGVkIHZlY3RvcnM6IG51bWJlcltdW107XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgVU1BUFJlZHVjZXIuXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAbWVtYmVyb2YgVU1BUFJlZHVjZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFVtYXBPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICBhc3NlcnQoJ2Rpc3RhbmNlRm4nIGluIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5kaXN0YW5jZUZuID0gb3B0aW9ucy5kaXN0YW5jZUZuITtcbiAgICB0aGlzLnZlY3RvcnMgPSBbXTtcbiAgICBvcHRpb25zLmRpc3RhbmNlRm4gPSB0aGlzLl9lbmNvZGVkRGlzdGFuY2UuYmluZCh0aGlzKTtcbiAgICBpZiAodGhpcy5kYXRhLmxlbmd0aCA8IDE1KVxuICAgICAgb3B0aW9ucy5uTmVpZ2hib3JzID0gdGhpcy5kYXRhLmxlbmd0aCAtIDE7XG4gICAgdGhpcy5yZWR1Y2VyID0gbmV3IHVtai5VTUFQKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBkaXN0YW5jZSB3cmFwcGVyIHRvIGhhdmUgbnVtZXJpYyBpbnB1dHMgaW5zdGVhZCBvZiBzdHJpbmcgb25lcy5cbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKiBAcGFyYW0ge251bWJlcltdfSBhIFRoZSBmaXJzdCBpdGVtLlxuICAgKiBAcGFyYW0ge251bWJlcltdfSBiIFRoZSBmaXJzdCBpdGVtLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IERpc3RhbmNlIG1ldHJpYy5cbiAgICogQG1lbWJlcm9mIFVNQVBSZWR1Y2VyXG4gICAqL1xuICBwcm90ZWN0ZWQgX2VuY29kZWREaXN0YW5jZShhOiBudW1iZXJbXSwgYjogbnVtYmVyW10pOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRpc3RhbmNlRm4odGhpcy5kYXRhW2FbMF1dLCB0aGlzLmRhdGFbYlswXV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZXMgdGhlIGlucHV0IGRhdGEgYXMgYSB2ZWN0b3Igb2YgaW5kaWNlcy5cbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKiBAbWVtYmVyb2YgVU1BUFJlZHVjZXJcbiAgICovXG4gIHByb3RlY3RlZCBfZW5jb2RlKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgKytpKSB7XG4gICAgICB0aGlzLnZlY3RvcnMucHVzaChbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbWJlZHMgdGhlIGRhdGEgZ2l2ZW4gaW50byB0aGUgdHdvLWRpbWVuc2lvbmFsIHNwYWNlIHVzaW5nIFVNQVAgbWV0aG9kLlxuICAgKiBAcmV0dXJuIHthbnl9IENhcnRlc2lhbiBjb29yZGluYXRlIG9mIHRoaXMgZW1iZWRkaW5nLlxuICAgKi9cbiAgcHVibGljIHRyYW5zZm9ybSgpOiB7IFtrZXk6IHN0cmluZ106IE1hdHJpeCB9IHtcbiAgICB0aGlzLl9lbmNvZGUoKTtcblxuICAgIGNvbnN0IGVtYmVkZGluZyA9IHRoaXMucmVkdWNlci5maXQodGhpcy52ZWN0b3JzKTtcblxuICAgIGZ1bmN0aW9uIGFycmF5Q2FzdDJDb29yZGluYXRlcyhkYXRhOiBudW1iZXJbXVtdKTogQ29vcmRpbmF0ZXMge1xuICAgICAgcmV0dXJuIG5ldyBBcnJheShkYXRhLmxlbmd0aCkuZmlsbCgwKS5tYXAoKF8sIGkpID0+IChWZWN0b3IuZnJvbShkYXRhW2ldKSkpO1xuICAgIH1cblxuICAgIHJldHVybiB7ZW1iZWRkaW5nOiBhcnJheUNhc3QyQ29vcmRpbmF0ZXMoZW1iZWRkaW5nKX07XG4gIH1cbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIG9yaWdpbmFsIFNQRSBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24uXG4gKlxuICogQGNsYXNzIFNQRVJlZHVjZXJcbiAqIEBleHRlbmRzIHtSZWR1Y2VyfVxuICovXG5jbGFzcyBTUEVSZWR1Y2VyIGV4dGVuZHMgUmVkdWNlciB7XG4gIHByb3RlY3RlZCByZWR1Y2VyOiBTUEVCYXNlO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFNQRVJlZHVjZXIuXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAbWVtYmVyb2YgU1BFUmVkdWNlclxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMucmVkdWNlciA9IG5ldyBTUEVCYXNlKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgdGhlIG9yaWdpbmFsIFNQRSBtZXRob2QuXG4gICAqIEByZXR1cm4ge2FueX0gQ2FydGVzaWFuIGNvb3JkaW5hdGUgb2YgdGhpcyBlbWJlZGRpbmcgYW5kIGRpc3RhbmNlIG1hdHJpeCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgKi9cbiAgcHVibGljIHRyYW5zZm9ybSgpOiB7IFtrZXk6IHN0cmluZ106IE1hdHJpeCB9IHtcbiAgICBjb25zdCBlbWIgPSB0aGlzLnJlZHVjZXIuZW1iZWQodGhpcy5kYXRhKTtcbiAgICByZXR1cm4ge2Rpc3RhbmNlOiB0aGlzLnJlZHVjZXIuZGlzdGFuY2UsIGVtYmVkZGluZzogZW1ifTtcbiAgfVxufVxuXG4vKipcbiAqIEltcGxlbWVudHMgbW9kaWZpZWQgU1BFIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbi5cbiAqXG4gKiBAY2xhc3MgUFNQRVJlZHVjZXJcbiAqIEBleHRlbmRzIHtSZWR1Y2VyfVxuICovXG5jbGFzcyBQU1BFUmVkdWNlciBleHRlbmRzIFJlZHVjZXIge1xuICBwcm90ZWN0ZWQgcmVkdWNlcjogUFNQRUJhc2U7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUFNQRVJlZHVjZXIuXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgKiBAbWVtYmVyb2YgUFNQRVJlZHVjZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLnJlZHVjZXIgPSBuZXcgUFNQRUJhc2Uob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRW1iZWRzIHRoZSBkYXRhIGdpdmVuIGludG8gdGhlIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyB0aGUgbW9kaWZpZWQgU1BFIG1ldGhvZC5cbiAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZyBhbmQgZGlzdGFuY2UgbWF0cml4IHdoZXJlIGFwcGxpY2FibGUuXG4gICAqL1xuICBwdWJsaWMgdHJhbnNmb3JtKCk6IHsgW2tleTogc3RyaW5nXTogTWF0cml4IH0ge1xuICAgIGNvbnN0IGVtYiA9IHRoaXMucmVkdWNlci5lbWJlZCh0aGlzLmRhdGEpO1xuICAgIHJldHVybiB7ZGlzdGFuY2U6IHRoaXMucmVkdWNlci5kaXN0YW5jZSwgZW1iZWRkaW5nOiBlbWJ9O1xuICB9XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBvcmlnaW5hbCBTUEUgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uLlxuICpcbiAqIEBjbGFzcyBPcmlnaW5hbFNQRVJlZHVjZXJcbiAqIEBleHRlbmRzIHtSZWR1Y2VyfVxuICovXG5jbGFzcyBPcmlnaW5hbFNQRVJlZHVjZXIgZXh0ZW5kcyBSZWR1Y2VyIHtcbiAgcHJvdGVjdGVkIHJlZHVjZXI6IE9yaWdpbmFsU1BFO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIE9yaWdpbmFsU1BFUmVkdWNlci5cbiAgICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAqIEBtZW1iZXJvZiBPcmlnaW5hbFNQRVJlZHVjZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLnJlZHVjZXIgPSBuZXcgT3JpZ2luYWxTUEUob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRW1iZWRzIHRoZSBkYXRhIGdpdmVuIGludG8gdGhlIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyB0aGUgb3JpZ2luYWwgU1BFIG1ldGhvZC5cbiAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZyBhbmQgZGlzdGFuY2UgbWF0cml4IHdoZXJlIGFwcGxpY2FibGUuXG4gICAqL1xuICBwdWJsaWMgdHJhbnNmb3JtKCk6IHsgW2tleTogc3RyaW5nXTogTWF0cml4IH0ge1xuICAgIGNvbnN0IGVtYiA9IHRoaXMucmVkdWNlci5lbWJlZCh0aGlzLmRhdGEpO1xuICAgIHJldHVybiB7ZGlzdGFuY2U6IHRoaXMucmVkdWNlci5kaXN0YW5jZSwgZW1iZWRkaW5nOiBlbWJ9O1xuICB9XG59XG5cbmNvbnN0IEF2YWlsYWJsZVJlZHVjZXJzID0ge1xuICAnVU1BUCc6IFVNQVBSZWR1Y2VyLFxuICAndC1TTkUnOiBUU05FUmVkdWNlcixcbiAgJ1NQRSc6IFNQRVJlZHVjZXIsXG4gICdwU1BFJzogUFNQRVJlZHVjZXIsXG4gICdPcmlnaW5hbFNQRSc6IE9yaWdpbmFsU1BFUmVkdWNlcixcbn07XG5cbmV4cG9ydCB0eXBlIEtub3duTWV0aG9kcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVSZWR1Y2VycztcblxuLyoqXG4gKiBVbmlmaWVkIGNsYXNzIGltcGxlbWVudGluZyBkaWZmZXJlbnQgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIG1ldGhvZHMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICovXG5leHBvcnQgY2xhc3MgRGltZW5zaW9uYWxpdHlSZWR1Y2VyIHtcbiAgcHJpdmF0ZSByZWR1Y2VyOiBSZWR1Y2VyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIERpbWVuc2lvbmFsaXR5UmVkdWNlci5cbiAgICogQHBhcmFtIHthbnlbXX0gZGF0YSBWZWN0b3JzIHRvIGVtYmVkLlxuICAgKiBAcGFyYW0ge0tub3duTWV0aG9kc30gbWV0aG9kIEVtYmVkZGluZyBtZXRob2QgdG8gYmUgYXBwbGllZFxuICAgKiBAcGFyYW0ge0tub3duTWV0cmljc30gbWV0cmljIERpc3RhbmNlIG1ldHJpYyB0byBiZSBjb21wdXRlZCBiZXR3ZWVuIGVhY2ggb2YgdGhlIHZlY3RvcnMuXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgaW1wbGVtZW50aW5nIGVtYmVkZGVycy5cbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgY29uc3RydWN0b3IoZGF0YTogYW55W10sIG1ldGhvZDogS25vd25NZXRob2RzLCBtZXRyaWM6IEtub3duTWV0cmljcywgb3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICBjb25zdCBtZWFzdXJlID0gbmV3IE1lYXN1cmUobWV0cmljKS5nZXRNZWFzdXJlKCk7XG4gICAgbGV0IHNwZWNPcHRpb25zID0ge307XG5cbiAgICBpZiAoaXNCaXRBcnJheU1ldHJpYyhtZXRyaWMpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgZGF0YVtpXSA9IG5ldyBCaXRBcnJheShkYXRhW2ldLl9kYXRhLCBkYXRhW2ldLl9sZW5ndGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT0gJ1VNQVAnKSB7XG4gICAgICBzcGVjT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ue2RhdGE6IGRhdGF9LFxuICAgICAgICAuLi57ZGlzdGFuY2VGbjogbWVhc3VyZX0sXG4gICAgICAgIC4uLntuRXBvY2hzOiBvcHRpb25zPy5jeWNsZXN9LFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PSAndC1TTkUnKSB7XG4gICAgICBzcGVjT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ue2RhdGE6IGRhdGF9LFxuICAgICAgICAuLi57ZGlzdGFuY2U6IG1lYXN1cmV9LFxuICAgICAgICAuLi57aXRlcmF0aW9uczogb3B0aW9ucz8uY3ljbGVzID8/IHVuZGVmaW5lZH0sXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAobWV0aG9kID09ICdTUEUnKSB7XG4gICAgICBzcGVjT3B0aW9ucyA9IHsuLi57ZGF0YTogZGF0YX0sIC4uLntkaXN0YW5jZTogbWVhc3VyZX0sIC4uLm9wdGlvbnN9O1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGVjT3B0aW9ucyA9IHsuLi57ZGF0YTogZGF0YX0sIC4uLntkaXN0YW5jZTogbWVhc3VyZX0sIC4uLm9wdGlvbnN9O1xuICAgIH1cbiAgICB0aGlzLnJlZHVjZXIgPSBuZXcgQXZhaWxhYmxlUmVkdWNlcnNbbWV0aG9kXShzcGVjT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRW1iZWRzIHRoZSBkYXRhIGdpdmVuIGludG8gdGhlIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyB0aGUgY2hvc2VuIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSB0cmFuc3Bvc2UgV2hldGhlciB0byB0cmFuc2Zvcm0gY29vcmRpbmF0ZXMgdG8gaGF2ZSBjb2x1bW5zLWZpcnN0IG9yaWVudGF0aW9uLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGVtYmVkZGluZyBtZXRob2Qgd2FzIG5vdCBmb3VuZC5cbiAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZyBhbmQgZGlzdGFuY2UgbWF0cml4IHdoZXJlIGFwcGxpY2FibGUuXG4gICAqIEBtZW1iZXJvZiBEaW1lbnNpb25hbGl0eVJlZHVjZXJcbiAgICovXG4gIHB1YmxpYyB0cmFuc2Zvcm0odHJhbnNwb3NlOiBib29sZWFuID0gZmFsc2UpOiB7IFtrZXk6IHN0cmluZ106IE1hdHJpeCB9IHtcbiAgICBpZiAodGhpcy5yZWR1Y2VyID09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWR1Y2VyIHdhcyBub3QgZGVmaW5lZC4nKTtcbiAgICB9XG5cbiAgICBsZXQge2VtYmVkZGluZywgZGlzdGFuY2V9ID0gdGhpcy5yZWR1Y2VyLnRyYW5zZm9ybSgpO1xuXG4gICAgaWYgKHRyYW5zcG9zZSkge1xuICAgICAgZW1iZWRkaW5nID0gdHJhbnNwb3NlTWF0cml4KGVtYmVkZGluZyk7XG4gICAgfVxuICAgIHJldHVybiB7ZGlzdGFuY2U6IGRpc3RhbmNlLCBlbWJlZGRpbmc6IGVtYmVkZGluZ307XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBtZXRyaWNzIGF2YWlsYWJsZSBieSB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0ge0F2YWlsYWJsZURhdGFUeXBlc30gdHlwZU5hbWUgdHlwZSBuYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBNZXRyaWMgbmFtZXMgd2hpY2ggZXhwZWN0cyB0aGUgZ2l2ZW4gZGF0YSB0eXBlXG4gICAqIEBtZW1iZXJvZiBEaW1lbnNpb25hbGl0eVJlZHVjZXJcbiAgICovXG4gIHN0YXRpYyBhdmFpbGFibGVNZXRyaWNzQnlUeXBlKHR5cGVOYW1lOiBBdmFpbGFibGVEYXRhVHlwZXMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoQXZhaWxhYmxlTWV0cmljc1t0eXBlTmFtZV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIG1ldGhvZHMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcmVhZG9ubHlcbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgc3RhdGljIGdldCBhdmFpbGFibGVNZXRob2RzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVSZWR1Y2Vycyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBtZXRyaWNzIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHJlYWRvbmx5XG4gICAqIEBtZW1iZXJvZiBEaW1lbnNpb25hbGl0eVJlZHVjZXJcbiAgICovXG4gIHN0YXRpYyBnZXQgYXZhaWxhYmxlTWV0cmljcygpIHtcbiAgICBsZXQgYW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIE9iamVjdC52YWx1ZXMoQXZhaWxhYmxlTWV0cmljcykuZm9yRWFjaCgob2JqKSA9PiB7XG4gICAgICBjb25zdCBhcnJheSA9IE9iamVjdC52YWx1ZXMob2JqKTtcbiAgICAgIGFucyA9IFsuLi5hbnMsIC4uLmFycmF5XTtcbiAgICB9KTtcbiAgICByZXR1cm4gYW5zO1xuICB9XG59XG4iXX0=","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport { TSNEOptions, T_SNE, UMAP, UMAPOptions } from '../reduce-dimensionality';\nexport const SEQ_COL_NAMES = {\n [DG.SEMTYPE.MOLECULE]: 'Molecule',\n [DG.SEMTYPE.MACROMOLECULE]: 'Sequence'\n};\nexport class SequenceSpaceBaseFuncEditor {\n constructor(semtype) {\n this.methodSettingsDiv = ui.form([]);\n this.moleculesColDiv = ui.div();\n this.methodsParams = {\n [UMAP]: new UMAPOptions(),\n [T_SNE]: new TSNEOptions()\n };\n this.tableInput = ui.tableInput('Table', grok.shell.tv.dataFrame, undefined, () => {\n this.onTableInputChanged(semtype);\n });\n this.molColInput = ui.columnInput(SEQ_COL_NAMES[semtype], this.tableInput.value, this.tableInput.value.columns.bySemType(semtype));\n this.molColInput.root.style.width = '332px';\n this.moleculesColDiv.append(this.molColInput.root);\n this.methodInput = ui.choiceInput('Method Name', UMAP, [UMAP, T_SNE], () => {\n if (settingsOpened) {\n this.createAlgorithmSettingsDiv(this.methodSettingsDiv, this.methodsParams[this.methodInput.value]);\n }\n });\n this.methodInput.input.style.width = '185px';\n this.methodInput.captionLabel.style.width = '122px';\n this.methodSettingsIcon = ui.icons.settings(() => {\n settingsOpened = !settingsOpened;\n if (!settingsOpened)\n ui.empty(this.methodSettingsDiv);\n else\n this.createAlgorithmSettingsDiv(this.methodSettingsDiv, this.methodsParams[this.methodInput.value]);\n }, 'Modify methods parameters');\n this.methodSettingsIcon.style.lineHeight = '1.7';\n this.methodSettingsIcon.style.fontSize = '18px';\n this.methodSettingsDiv = ui.form([]);\n let settingsOpened = false;\n }\n get algorithmOptions() {\n const algorithmParams = this.methodsParams[this.methodInput.value];\n const options = {};\n Object.keys(algorithmParams).forEach((key) => {\n if (algorithmParams[key].value != null)\n options[key] = algorithmParams[key].value;\n });\n return options;\n }\n createAlgorithmSettingsDiv(paramsForm, params) {\n ui.empty(paramsForm);\n Object.keys(params).forEach((it) => {\n const param = params[it];\n const input = ui.floatInput(param.uiName, param.value, () => {\n param.value = input.value;\n });\n ui.tooltip.bind(input.root, param.tooltip);\n paramsForm.append(input.root);\n });\n return paramsForm;\n }\n onTableInputChanged(semtype) {\n ui.empty(this.moleculesColDiv);\n this.molColInput = ui.columnInput(SEQ_COL_NAMES[semtype], this.tableInput.value, this.tableInput.value.columns.bySemType(semtype));\n this.molColInput.root.style.width = '335px';\n this.moleculesColDiv.append(this.molColInput.root);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxLXNwYWNlLWJhc2UtZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VxLXNwYWNlLWJhc2UtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sRUFBa0QsV0FBVyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFakksTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHO0lBQ3pCLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVO0lBQ2pDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxVQUFVO0NBQ3pDLENBQUE7QUFFRCxNQUFNLE9BQU8sMkJBQTJCO0lBc0JwQyxZQUFZLE9BQW1CO1FBakIvQixzQkFBaUIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLG9CQUFlLEdBQW1CLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMzQyxrQkFBYSxHQUErQztZQUMxRCxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksV0FBVyxFQUFFO1lBQ3pCLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxXQUFXLEVBQUU7U0FDM0IsQ0FBQztRQWFBLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUU7WUFDaEYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdB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QUssR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQzFELEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUM1QixDQUFDLENBQUMsQ0FBQztZQUNILEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELG1CQUFtQixDQUFDLE9BQW1CO1FBQ25DLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3JJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO1FBQzVDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7IElEaW1SZWR1Y3Rpb25QYXJhbSwgSVRTTkVPcHRpb25zLCBJVU1BUE9wdGlvbnMsIFRTTkVPcHRpb25zLCBUX1NORSwgVU1BUCwgVU1BUE9wdGlvbnMgfSBmcm9tICcuLi9yZWR1Y2UtZGltZW5zaW9uYWxpdHknO1xuXG5leHBvcnQgY29uc3QgU0VRX0NPTF9OQU1FUyA9IHtcbiAgICBbREcuU0VNVFlQRS5NT0xFQ1VMRV06ICdNb2xlY3VsZScsXG4gICAgW0RHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRV06ICdTZXF1ZW5jZSdcbn1cblxuZXhwb3J0IGNsYXNzIFNlcXVlbmNlU3BhY2VCYXNlRnVuY0VkaXRvciB7XG4gICAgdGFibGVJbnB1dDogREcuSW5wdXRCYXNlO1xuICAgIG1vbENvbElucHV0OiBERy5JbnB1dEJhc2U7XG4gICAgbWV0aG9kSW5wdXQ6IERHLklucHV0QmFzZTtcbiAgICBtZXRob2RTZXR0aW5nc0ljb246IEhUTUxFbGVtZW50O1xuICAgIG1ldGhvZFNldHRpbmdzRGl2ID0gdWkuZm9ybShbXSk7XG4gICAgbW9sZWN1bGVzQ29sRGl2OiBIVE1MRGl2RWxlbWVudCA9IHVpLmRpdigpO1xuICAgIG1ldGhvZHNQYXJhbXM6IHtba2V5OiBzdHJpbmddOiBVTUFQT3B0aW9ucyB8IFRTTkVPcHRpb25zfSA9IHtcbiAgICAgIFtVTUFQXTogbmV3IFVNQVBPcHRpb25zKCksXG4gICAgICBbVF9TTkVdOiBuZXcgVFNORU9wdGlvbnMoKVxuICAgIH07XG4gIFxuICAgIGdldCBhbGdvcml0aG1PcHRpb25zKCk6IElVTUFQT3B0aW9ucyB8IElUU05FT3B0aW9ucyB7XG4gICAgICBjb25zdCBhbGdvcml0aG1QYXJhbXM6IFVNQVBPcHRpb25zIHwgVFNORU9wdGlvbnMgPSB0aGlzLm1ldGhvZHNQYXJhbXNbdGhpcy5tZXRob2RJbnB1dC52YWx1ZSFdO1xuICAgICAgY29uc3Qgb3B0aW9uczogYW55ID0ge307XG4gICAgICBPYmplY3Qua2V5cyhhbGdvcml0aG1QYXJhbXMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICgoYWxnb3JpdGhtUGFyYW1zIGFzIGFueSlba2V5XS52YWx1ZSAhPSBudWxsKSBcbiAgICAgICAgICBvcHRpb25zW2tleV0gPSAoYWxnb3JpdGhtUGFyYW1zIGFzIGFueSlba2V5XS52YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuICBcbiAgICBjb25zdHJ1Y3RvcihzZW10eXBlOiBERy5TZW1UeXBlKXtcbiAgICAgIHRoaXMudGFibGVJbnB1dCA9IHVpLnRhYmxlSW5wdXQoJ1RhYmxlJywgZ3Jvay5zaGVsbC50di5kYXRhRnJhbWUsIHVuZGVmaW5lZCwgKCkgPT4ge1xuICAgICAgICB0aGlzLm9uVGFibGVJbnB1dENoYW5nZWQoc2VtdHlwZSk7XG4gICAgICB9KTtcbiAgXG4gICAgICB0aGlzLm1vbENvbElucHV0ID0gdWkuY29sdW1uSW5wdXQoU0VRX0NPTF9OQU1FU1tzZW10eXBlXSwgdGhpcy50YWJsZUlucHV0LnZhbHVlISwgdGhpcy50YWJsZUlucHV0LnZhbHVlIS5jb2x1bW5zLmJ5U2VtVHlwZShzZW10eXBlKSk7XG4gICAgICB0aGlzLm1vbENvbElucHV0LnJvb3Quc3R5bGUud2lkdGggPSAnMzMycHgnO1xuICAgICAgdGhpcy5tb2xlY3VsZXNDb2xEaXYuYXBwZW5kKHRoaXMubW9sQ29sSW5wdXQucm9vdCk7XG4gIFxuICAgICAgdGhpcy5tZXRob2RJbnB1dCA9IHVpLmNob2ljZUlucHV0KCdNZXRob2QgTmFtZScsIFVNQVAsIFtVTUFQLCBUX1NORV0sICgpID0+IHtcbiAgICAgICAgaWYoc2V0dGluZ3NPcGVuZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQWxnb3JpdGhtU2V0dGluZ3NEaXYodGhpcy5tZXRob2RTZXR0aW5nc0RpdiwgdGhpcy5tZXRob2RzUGFyYW1zW3RoaXMubWV0aG9kSW5wdXQudmFsdWUhXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5tZXRob2RJbnB1dC5pbnB1dC5zdHlsZS53aWR0aCA9ICcxODVweCc7XG4gICAgICB0aGlzLm1ldGhvZElucHV0LmNhcHRpb25MYWJlbC5zdHlsZS53aWR0aCA9ICcxMjJweCc7XG4gIFxuICAgICAgdGhpcy5tZXRob2RTZXR0aW5nc0ljb24gPSB1aS5pY29ucy5zZXR0aW5ncygoKT0+IHtcbiAgICAgICAgc2V0dGluZ3NPcGVuZWQgPSAhc2V0dGluZ3NPcGVuZWQ7XG4gICAgICAgIGlmICghc2V0dGluZ3NPcGVuZWQpXG4gICAgICAgICAgdWkuZW1wdHkodGhpcy5tZXRob2RTZXR0aW5nc0Rpdik7XG4gICAgICAgIGVsc2UgXG4gICAgICAgICAgdGhpcy5jcmVhdGVBbGdvcml0aG1TZXR0aW5nc0Rpdih0aGlzLm1ldGhvZFNldHRpbmdzRGl2LCB0aGlzLm1ldGhvZHNQYXJhbXNbdGhpcy5tZXRob2RJbnB1dC52YWx1ZSFdKTtcbiAgICAgIH0sICdNb2RpZnkgbWV0aG9kcyBwYXJhbWV0ZXJzJyk7XG4gICAgICB0aGlzLm1ldGhvZFNldHRpbmdzSWNvbi5zdHlsZS5saW5lSGVpZ2h0ID0gJzEuNyc7XG4gICAgICB0aGlzLm1ldGhvZFNldHRpbmdzSWNvbi5zdHlsZS5mb250U2l6ZSA9ICcxOHB4JztcbiAgICAgIHRoaXMubWV0aG9kU2V0dGluZ3NEaXYgPSB1aS5mb3JtKFtdKTtcbiAgICAgIGxldCBzZXR0aW5nc09wZW5lZCA9IGZhbHNlO1xuICAgIH1cbiAgXG4gICAgY3JlYXRlQWxnb3JpdGhtU2V0dGluZ3NEaXYocGFyYW1zRm9ybTogSFRNTERpdkVsZW1lbnQsIHBhcmFtczogVU1BUE9wdGlvbnMgfCBUU05FT3B0aW9ucykge1xuICAgICAgdWkuZW1wdHkocGFyYW1zRm9ybSk7XG4gICAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKGl0OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW06IElEaW1SZWR1Y3Rpb25QYXJhbSA9IChwYXJhbXMgYXMgYW55KVtpdF07XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdWkuZmxvYXRJbnB1dChwYXJhbS51aU5hbWUsIHBhcmFtLnZhbHVlLCAoKSA9PiB7XG4gICAgICAgICAgcGFyYW0udmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHVpLnRvb2x0aXAuYmluZChpbnB1dC5yb290LCBwYXJhbS50b29sdGlwKTtcbiAgICAgICAgcGFyYW1zRm9ybS5hcHBlbmQoaW5wdXQucm9vdCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwYXJhbXNGb3JtO1xuICAgIH1cblxuICAgIG9uVGFibGVJbnB1dENoYW5nZWQoc2VtdHlwZTogREcuU2VtVHlwZSkge1xuICAgICAgICB1aS5lbXB0eSh0aGlzLm1vbGVjdWxlc0NvbERpdik7XG4gICAgICAgIHRoaXMubW9sQ29sSW5wdXQgPSB1aS5jb2x1bW5JbnB1dChTRVFfQ09MX05BTUVTW3NlbXR5cGVdLCB0aGlzLnRhYmxlSW5wdXQudmFsdWUhLCB0aGlzLnRhYmxlSW5wdXQudmFsdWUhLmNvbHVtbnMuYnlTZW1UeXBlKHNlbXR5cGUpKTtcbiAgICAgICAgdGhpcy5tb2xDb2xJbnB1dC5yb290LnN0eWxlLndpZHRoID0gJzMzNXB4JztcbiAgICAgICAgdGhpcy5tb2xlY3VsZXNDb2xEaXYuYXBwZW5kKHRoaXMubW9sQ29sSW5wdXQucm9vdCk7XG4gICAgfVxuICB9Il19","import * as ui from 'datagrok-api/ui';\nimport { SequenceSpaceBaseFuncEditor } from './seq-space-base-editor';\nimport { SEQ_SPACE_SIMILARITY_METRICS } from '../distance-metrics-methods';\nexport class SequenceSpaceFunctionEditor extends SequenceSpaceBaseFuncEditor {\n constructor(semtype) {\n super(semtype);\n this.similarityMetricInput = ui.choiceInput('Similarity metric', 'Tanimoto', SEQ_SPACE_SIMILARITY_METRICS);\n this.plotEmbeddingsInput = ui.boolInput('Plot Embeddings', true);\n this.plotEmbeddingsInput.captionLabel.style.width = '130px';\n this.plotEmbeddingsInput.input.style.marginLeft = '0px';\n this.funcParamsDiv = ui.form([\n this.tableInput,\n //@ts-ignore\n this.moleculesColDiv,\n //@ts-ignore\n ui.divH([this.methodSettingsIcon, this.methodInput]),\n //@ts-ignore\n this.methodSettingsDiv,\n this.similarityMetricInput,\n this.plotEmbeddingsInput\n ]);\n }\n get funcParams() {\n return { table: this.tableInput.value, molecules: this.molColInput.value, methodName: this.methodInput.value,\n similarityMetric: this.similarityMetricInput.value, plotEmbeddings: this.plotEmbeddingsInput.value,\n options: this.algorithmOptions };\n }\n get paramsUI() {\n return this.funcParamsDiv;\n }\n createAlgorithmSettingsDiv(paramsForm, params) {\n ui.empty(paramsForm);\n Object.keys(params).forEach((it) => {\n const param = params[it];\n const input = ui.floatInput(param.uiName, param.value, () => {\n param.value = input.value;\n });\n ui.tooltip.bind(input.root, param.tooltip);\n paramsForm.append(input.root);\n });\n return paramsForm;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxLXNwYWNlLWVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNlcS1zcGFjZS1lZGl0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUd0QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUzRSxNQUFNLE9BQU8sMkJBQTRCLFNBQVEsMkJBQTJCO0lBZ0J4RSxZQUFZLE9BQW1CO1FBQzdCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFLFVBQVUsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO1FBRTNHLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUM7UUFDNUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUV4RCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDM0IsSUFBSSxDQUFDLFVBQVU7WUFDZixZQUFZO1lBQ1osSUFBSSxDQUFDLGVBQWU7WUFDcEIsWUFBWTtZQUNaLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BELFlBQVk7WUFDWixJQUFJLENBQUMsaUJBQWlCO1lBQ3RCLElBQUksQ0FBQyxxQkFBcUI7WUFDMUIsSUFBSSxDQUFDLG1CQUFtQjtTQUN6QixDQUFDLENBQUE7SUFDSixDQUFDO0lBN0JELElBQUksVUFBVTtRQUNaLE9BQU8sRUFBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQU07WUFDNUcsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQU0sRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQU07WUFDcEcsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQXVCRCwwQkFBMEIsQ0FBQyxVQUEwQixFQUFFLE1BQWlDO1FBQ3RGLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFPLEVBQUUsRUFBRTtZQUN0QyxNQUFNLEtBQUssR0FBd0IsTUFBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDMUQsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0MsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7IElEaW1SZWR1Y3Rpb25QYXJhbSwgVFNORU9wdGlvbnMsIFVNQVBPcHRpb25zIH0gZnJvbSAnLi4vcmVkdWNlLWRpbWVuc2lvbmFsaXR5JztcbmltcG9ydCB7IFNlcXVlbmNlU3BhY2VCYXNlRnVuY0VkaXRvciB9IGZyb20gJy4vc2VxLXNwYWNlLWJhc2UtZWRpdG9yJztcbmltcG9ydCB7IFNFUV9TUEFDRV9TSU1JTEFSSVRZX01FVFJJQ1MgfSBmcm9tICcuLi9kaXN0YW5jZS1tZXRyaWNzLW1ldGhvZHMnO1xuXG5leHBvcnQgY2xhc3MgU2VxdWVuY2VTcGFjZUZ1bmN0aW9uRWRpdG9yIGV4dGVuZHMgU2VxdWVuY2VTcGFjZUJhc2VGdW5jRWRpdG9yIHtcblxuICAgIHNpbWlsYXJpdHlNZXRyaWNJbnB1dDogREcuSW5wdXRCYXNlO1xuICAgIHBsb3RFbWJlZGRpbmdzSW5wdXQ6IERHLklucHV0QmFzZTtcbiAgICBmdW5jUGFyYW1zRGl2OiBIVE1MRGl2RWxlbWVudDtcbiAgXG4gICAgZ2V0IGZ1bmNQYXJhbXMoKTogYW55IHtcbiAgICAgIHJldHVybiB7dGFibGU6IHRoaXMudGFibGVJbnB1dC52YWx1ZSEsIG1vbGVjdWxlczogdGhpcy5tb2xDb2xJbnB1dC52YWx1ZSEsIG1ldGhvZE5hbWU6IHRoaXMubWV0aG9kSW5wdXQudmFsdWUhLFxuICAgICAgICBzaW1pbGFyaXR5TWV0cmljOiB0aGlzLnNpbWlsYXJpdHlNZXRyaWNJbnB1dC52YWx1ZSEsIHBsb3RFbWJlZGRpbmdzOiB0aGlzLnBsb3RFbWJlZGRpbmdzSW5wdXQudmFsdWUhLCBcbiAgICAgICAgb3B0aW9uczogdGhpcy5hbGdvcml0aG1PcHRpb25zfTtcbiAgICB9XG4gIFxuICAgIGdldCBwYXJhbXNVSSgpOiBIVE1MRGl2RWxlbWVudHtcbiAgICAgIHJldHVybiB0aGlzLmZ1bmNQYXJhbXNEaXY7XG4gICAgfVxuICBcbiAgICBjb25zdHJ1Y3RvcihzZW10eXBlOiBERy5TZW1UeXBlKXtcbiAgICAgIHN1cGVyKHNlbXR5cGUpO1xuICAgICAgdGhpcy5zaW1pbGFyaXR5TWV0cmljSW5wdXQgPSB1aS5jaG9pY2VJbnB1dCgnU2ltaWxhcml0eSBtZXRyaWMnLCAnVGFuaW1vdG8nLCBTRVFfU1BBQ0VfU0lNSUxBUklUWV9NRVRSSUNTKTtcbiAgICAgIFxuICAgICAgdGhpcy5wbG90RW1iZWRkaW5nc0lucHV0ID0gdWkuYm9vbElucHV0KCdQbG90IEVtYmVkZGluZ3MnLCB0cnVlKTtcbiAgICAgIHRoaXMucGxvdEVtYmVkZGluZ3NJbnB1dC5jYXB0aW9uTGFiZWwuc3R5bGUud2lkdGggPSAnMTMwcHgnO1xuICAgICAgdGhpcy5wbG90RW1iZWRkaW5nc0lucHV0LmlucHV0LnN0eWxlLm1hcmdpbkxlZnQgPSAnMHB4JztcbiAgICAgIFxuICAgICAgdGhpcy5mdW5jUGFyYW1zRGl2ID0gdWkuZm9ybShbXG4gICAgICAgIHRoaXMudGFibGVJbnB1dCxcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIHRoaXMubW9sZWN1bGVzQ29sRGl2LFxuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgdWkuZGl2SChbdGhpcy5tZXRob2RTZXR0aW5nc0ljb24sIHRoaXMubWV0aG9kSW5wdXRdKSxcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIHRoaXMubWV0aG9kU2V0dGluZ3NEaXYsXG4gICAgICAgIHRoaXMuc2ltaWxhcml0eU1ldHJpY0lucHV0LFxuICAgICAgICB0aGlzLnBsb3RFbWJlZGRpbmdzSW5wdXRcbiAgICAgIF0pXG4gICAgfVxuICBcbiAgICBjcmVhdGVBbGdvcml0aG1TZXR0aW5nc0RpdihwYXJhbXNGb3JtOiBIVE1MRGl2RWxlbWVudCwgcGFyYW1zOiBVTUFQT3B0aW9ucyB8IFRTTkVPcHRpb25zKSB7XG4gICAgICB1aS5lbXB0eShwYXJhbXNGb3JtKTtcbiAgICAgIE9iamVjdC5rZXlzKHBhcmFtcykuZm9yRWFjaCgoaXQ6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBwYXJhbTogSURpbVJlZHVjdGlvblBhcmFtID0gKHBhcmFtcyBhcyBhbnkpW2l0XTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB1aS5mbG9hdElucHV0KHBhcmFtLnVpTmFtZSwgcGFyYW0udmFsdWUsICgpID0+IHtcbiAgICAgICAgICBwYXJhbS52YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgICAgdWkudG9vbHRpcC5iaW5kKGlucHV0LnJvb3QsIHBhcmFtLnRvb2x0aXApO1xuICAgICAgICBwYXJhbXNGb3JtLmFwcGVuZChpbnB1dC5yb290KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHBhcmFtc0Zvcm07XG4gICAgfVxuICB9Il19","import * as ui from 'datagrok-api/ui';\nimport { SequenceSpaceBaseFuncEditor } from './seq-space-base-editor';\nexport class ActivityCliffsFunctionEditor extends SequenceSpaceBaseFuncEditor {\n constructor(semtype) {\n super(semtype);\n this.activitiesColDiv = ui.div();\n this.activitiesInput = ui.columnInput('Activities', this.tableInput.value, this.tableInput.value.columns.byIndex(0));\n this.activitiesInput.root.style.width = '335px';\n this.activitiesColDiv.append(this.activitiesInput.root);\n this.similarityInput = ui.intInput('Similarity', 80);\n this.funcParamsDiv = ui.form([\n this.tableInput,\n //@ts-ignore\n this.moleculesColDiv,\n //@ts-ignore\n this.activitiesColDiv,\n this.similarityInput,\n //@ts-ignore\n ui.divH([this.methodSettingsIcon, this.methodInput]),\n //@ts-ignore\n this.methodSettingsDiv\n ]);\n }\n get funcParams() {\n return { table: this.tableInput.value, molecules: this.molColInput.value, activities: this.activitiesInput.value,\n similarity: this.similarityInput.value, methodName: this.methodInput.value, options: this.algorithmOptions };\n }\n get paramsUI() {\n return this.funcParamsDiv;\n }\n createAlgorithmSettingsDiv(paramsForm, params) {\n ui.empty(paramsForm);\n Object.keys(params).forEach((it) => {\n const param = params[it];\n const input = ui.floatInput(param.uiName, param.value, () => {\n param.value = input.value;\n });\n ui.tooltip.bind(input.root, param.tooltip);\n paramsForm.append(input.root);\n });\n return paramsForm;\n }\n onTableInputChanged(semtype) {\n super.onTableInputChanged(semtype);\n ui.empty(this.activitiesColDiv);\n this.activitiesInput = ui.columnInput('Activities', this.tableInput.value, this.tableInput.value.columns.byIndex(0));\n this.activitiesInput.root.style.width = '335px';\n this.activitiesColDiv.append(this.activitiesInput.root);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZpdHktY2xpZmZzLWVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFjdGl2aXR5LWNsaWZmcy1lZGl0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUd0QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV0RSxNQUFNLE9BQU8sNEJBQTZCLFNBQVEsMkJBQTJCO0lBZ0J6RSxZQUFZLE9BQW1CO1FBQzdCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQVpqQixxQkFBZ0IsR0FBbUIsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBYTFDLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZILElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO1FBQ2hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV4RCxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztZQUMzQixJQUFJLENBQUMsVUFBVTtZQUNmLFlBQVk7WUFDWixJQUFJLENBQUMsZUFBZTtZQUNwQixZQUFZO1lBQ1osSUFBSSxDQUFDLGdCQUFnQjtZQUNyQixJQUFJLENBQUMsZUFBZTtZQUNwQixZQUFZO1lBQ1osRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEQsWUFBWTtZQUNaLElBQUksQ0FBQyxpQkFBaUI7U0FDdkIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQTdCRCxJQUFJLFVBQVU7UUFDWixPQUFPLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFNO1lBQ2hILFVBQVUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBQyxDQUFDO0lBQ2xILENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQXdCRCwwQkFBMEIsQ0FBQyxVQUEwQixFQUFFLE1BQWlDO1FBQ3RGLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFPLEVBQUUsRUFBRTtZQUN0QyxNQUFNLEtBQUssR0FBd0IsTUFBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDMUQsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0MsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsbUJBQW1CLENBQUMsT0FBbUI7UUFDbkMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkgsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUM7UUFDaEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHsgSURpbVJlZHVjdGlvblBhcmFtLCBUU05FT3B0aW9ucywgVU1BUE9wdGlvbnMgfSBmcm9tICcuLi9yZWR1Y2UtZGltZW5zaW9uYWxpdHknO1xuaW1wb3J0IHsgU2VxdWVuY2VTcGFjZUJhc2VGdW5jRWRpdG9yIH0gZnJvbSAnLi9zZXEtc3BhY2UtYmFzZS1lZGl0b3InO1xuXG5leHBvcnQgY2xhc3MgQWN0aXZpdHlDbGlmZnNGdW5jdGlvbkVkaXRvciBleHRlbmRzIFNlcXVlbmNlU3BhY2VCYXNlRnVuY0VkaXRvciB7XG5cbiAgICBhY3Rpdml0aWVzSW5wdXQ6IERHLklucHV0QmFzZTtcbiAgICBzaW1pbGFyaXR5SW5wdXQ6IERHLklucHV0QmFzZTtcbiAgICBmdW5jUGFyYW1zRGl2OiBIVE1MRGl2RWxlbWVudDtcbiAgICBhY3Rpdml0aWVzQ29sRGl2OiBIVE1MRGl2RWxlbWVudCA9IHVpLmRpdigpO1xuXG4gICAgZ2V0IGZ1bmNQYXJhbXMoKTogYW55IHtcbiAgICAgIHJldHVybiB7dGFibGU6IHRoaXMudGFibGVJbnB1dC52YWx1ZSEsIG1vbGVjdWxlczogdGhpcy5tb2xDb2xJbnB1dC52YWx1ZSEsIGFjdGl2aXRpZXM6IHRoaXMuYWN0aXZpdGllc0lucHV0LnZhbHVlISxcbiAgICAgICAgc2ltaWxhcml0eTogdGhpcy5zaW1pbGFyaXR5SW5wdXQudmFsdWUhLCBtZXRob2ROYW1lOiB0aGlzLm1ldGhvZElucHV0LnZhbHVlISwgb3B0aW9uczogdGhpcy5hbGdvcml0aG1PcHRpb25zfTtcbiAgICB9XG4gIFxuICAgIGdldCBwYXJhbXNVSSgpOiBIVE1MRGl2RWxlbWVudHtcbiAgICAgIHJldHVybiB0aGlzLmZ1bmNQYXJhbXNEaXY7XG4gICAgfVxuICBcbiAgICBjb25zdHJ1Y3RvcihzZW10eXBlOiBERy5TZW1UeXBlKXtcbiAgICAgIHN1cGVyKHNlbXR5cGUpO1xuICAgICAgdGhpcy5hY3Rpdml0aWVzSW5wdXQgPSB1aS5jb2x1bW5JbnB1dCgnQWN0aXZpdGllcycsIHRoaXMudGFibGVJbnB1dC52YWx1ZSEsIHRoaXMudGFibGVJbnB1dC52YWx1ZSEuY29sdW1ucy5ieUluZGV4KDApKTtcbiAgICAgIHRoaXMuYWN0aXZpdGllc0lucHV0LnJvb3Quc3R5bGUud2lkdGggPSAnMzM1cHgnO1xuICAgICAgdGhpcy5hY3Rpdml0aWVzQ29sRGl2LmFwcGVuZCh0aGlzLmFjdGl2aXRpZXNJbnB1dC5yb290KTtcbiAgICAgIFxuICAgICAgdGhpcy5zaW1pbGFyaXR5SW5wdXQgPSB1aS5pbnRJbnB1dCgnU2ltaWxhcml0eScsIDgwKTtcbiAgICAgIFxuICAgICAgdGhpcy5mdW5jUGFyYW1zRGl2ID0gdWkuZm9ybShbXG4gICAgICAgIHRoaXMudGFibGVJbnB1dCxcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIHRoaXMubW9sZWN1bGVzQ29sRGl2LFxuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5hY3Rpdml0aWVzQ29sRGl2LFxuICAgICAgICB0aGlzLnNpbWlsYXJpdHlJbnB1dCxcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIHVpLmRpdkgoW3RoaXMubWV0aG9kU2V0dGluZ3NJY29uLCB0aGlzLm1ldGhvZElucHV0XSksXG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLm1ldGhvZFNldHRpbmdzRGl2XG4gICAgICBdKVxuICAgIH1cbiAgXG4gICAgY3JlYXRlQWxnb3JpdGhtU2V0dGluZ3NEaXYocGFyYW1zRm9ybTogSFRNTERpdkVsZW1lbnQsIHBhcmFtczogVU1BUE9wdGlvbnMgfCBUU05FT3B0aW9ucykge1xuICAgICAgdWkuZW1wdHkocGFyYW1zRm9ybSk7XG4gICAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKGl0OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW06IElEaW1SZWR1Y3Rpb25QYXJhbSA9IChwYXJhbXMgYXMgYW55KVtpdF07XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdWkuZmxvYXRJbnB1dChwYXJhbS51aU5hbWUsIHBhcmFtLnZhbHVlLCAoKSA9PiB7XG4gICAgICAgICAgcGFyYW0udmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHVpLnRvb2x0aXAuYmluZChpbnB1dC5yb290LCBwYXJhbS50b29sdGlwKTtcbiAgICAgICAgcGFyYW1zRm9ybS5hcHBlbmQoaW5wdXQucm9vdCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwYXJhbXNGb3JtO1xuICAgIH1cblxuICAgIG9uVGFibGVJbnB1dENoYW5nZWQoc2VtdHlwZTogREcuU2VtVHlwZSkge1xuICAgICAgICBzdXBlci5vblRhYmxlSW5wdXRDaGFuZ2VkKHNlbXR5cGUpO1xuICAgICAgICB1aS5lbXB0eSh0aGlzLmFjdGl2aXRpZXNDb2xEaXYpO1xuICAgICAgICB0aGlzLmFjdGl2aXRpZXNJbnB1dCA9IHVpLmNvbHVtbklucHV0KCdBY3Rpdml0aWVzJywgdGhpcy50YWJsZUlucHV0LnZhbHVlISwgdGhpcy50YWJsZUlucHV0LnZhbHVlIS5jb2x1bW5zLmJ5SW5kZXgoMCkpO1xuICAgICAgICB0aGlzLmFjdGl2aXRpZXNJbnB1dC5yb290LnN0eWxlLndpZHRoID0gJzMzNXB4JztcbiAgICAgICAgdGhpcy5hY3Rpdml0aWVzQ29sRGl2LmFwcGVuZCh0aGlzLmFjdGl2aXRpZXNJbnB1dC5yb290KTtcbiAgICB9XG4gIH0iXX0=","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nexport const _package = new DG.Package();\n\nimport {MacromoleculeDifferenceCellRenderer, MonomerCellRenderer} from './utils/cell-renderer';\nimport {VdRegionsViewer} from './viewers/vd-regions-viewer';\nimport {runKalign} from './utils/multiple-sequence-alignment';\nimport {SequenceAlignment} from './seq_align';\nimport {getEmbeddingColsNames, sequenceSpaceByFingerprints} from './analysis/sequence-space';\nimport {getActivityCliffs} from '@datagrok-libraries/ml/src/viewers/activity-cliffs';\nimport {\n createLinesGrid, createPropPanelElement, createTooltipElement, getChemSimilaritiesMatrix,\n} from './analysis/sequence-activity-cliffs';\nimport {HELM_CORE_LIB_FILENAME} from '@datagrok-libraries/bio/src/utils/const';\nimport {MacromoleculeSequenceCellRenderer} from './utils/cell-renderer';\nimport {convert} from './utils/convert';\nimport {getMacroMolColumnPropertyPanel, representationsWidget} from './widgets/representations';\nimport {_toAtomicLevel} from '@datagrok-libraries/bio/src/monomer-works/to-atomic-level';\nimport {FastaFileHandler} from '@datagrok-libraries/bio/src/utils/fasta-handler';\nimport {removeEmptyStringRows} from '@datagrok-libraries/utils/src/dataframe-utils';\n\nimport {splitAlignedSequences} from '@datagrok-libraries/bio/src/utils/splitter';\nimport * as C from './utils/constants';\nimport {SequenceSimilarityViewer} from './analysis/sequence-similarity-viewer';\nimport {SequenceDiversityViewer} from './analysis/sequence-diversity-viewer';\nimport {substructureSearchDialog} from './substructure-search/substructure-search';\nimport {saveAsFastaUI} from './utils/save-as-fasta';\nimport {BioSubstructureFilter} from './widgets/bio-substructure-filter';\nimport {delay} from '@datagrok-libraries/utils/src/test';\nimport {\n getStats,\n NOTATION,\n splitterAsHelm,\n TAGS as bioTAGS,\n ALPHABET\n} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {pepseaMethods, runPepsea} from './utils/pepsea';\nimport {IMonomerLib} from '@datagrok-libraries/bio/src/types';\nimport {SeqPalette} from '@datagrok-libraries/bio/src/seq-palettes';\nimport {UnitsHandler} from '@datagrok-libraries/bio/src/utils/units-handler';\nimport {WebLogoViewer} from './viewers/web-logo-viewer';\nimport {createJsonMonomerLibFromSdf, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';\nimport {LIB_PATH, LIB_STORAGE_NAME, MonomerLibHelper} from './utils/monomer-lib';\nimport {getMacromoleculeColumn} from './utils/ui-utils';\nimport {IUMAPOptions, ITSNEOptions} from '@datagrok-libraries/ml/src/reduce-dimensionality';\nimport {SequenceSpaceFunctionEditor} from '@datagrok-libraries/ml/src/functionEditors/seq-space-editor';\nimport {ActivityCliffsFunctionEditor} from '@datagrok-libraries/ml/src/functionEditors/activity-cliffs-editor';\n\n// /** Avoid reassinging {@link monomerLib} because consumers subscribe to {@link IMonomerLib.onChanged} event */\n// let monomerLib: MonomerLib | null = null;\n\n//name: getMonomerLibHelper\n//description:\n//output: object result\nexport function getMonomerLibHelper(): IMonomerLibHelper {\n return MonomerLibHelper.instance;\n}\n\nexport let hydrophobPalette: SeqPaletteCustom | null = null;\n\nexport class SeqPaletteCustom implements SeqPalette {\n private readonly _palette: { [m: string]: string };\n\n constructor(palette: { [m: string]: string }) {\n this._palette = palette;\n }\n\n public get(m: string): string {\n return this._palette[m];\n }\n}\n\n// let loadLibrariesPromise: Promise<void> = Promise.resolve();\n\n//tags: init\nexport async function initBio() {\n // loadLibrariesPromise = loadLibrariesPromise.then(() => {\n await MonomerLibHelper.instance.loadLibraries(); // from initBio()\n // });\n // await loadLibrariesPromise;\n const monomerLib = MonomerLibHelper.instance.getBioLib();\n const monomers: string[] = [];\n const logPs: number[] = [];\n const module = await grok.functions.call('Chem:getRdKitModule');\n\n const series = monomerLib!.getMonomerMolsByType('PEPTIDE')!;\n Object.keys(series).forEach((symbol) => {\n monomers.push(symbol);\n const block = series[symbol].replaceAll('#R', 'O ');\n const mol = module.get_mol(block);\n const logP = JSON.parse(mol.get_descriptors()).CrippenClogP;\n logPs.push(logP);\n mol?.delete();\n });\n\n const sum = logPs.reduce((a, b) => a + b, 0);\n const avg = (sum / logPs.length) || 0;\n\n const palette: { [monomer: string]: string } = {};\n for (let i = 0; i < monomers.length; i++)\n palette[monomers[i]] = logPs[i] < avg ? '#4682B4' : '#DC143C';\n\n hydrophobPalette = new SeqPaletteCustom(palette);\n}\n\n//name: sequenceTooltip\n//tags: tooltip\n//input: column col {semType: Macromolecule}\n//output: widget result\nexport async function sequenceTooltip(col: DG.Column): Promise<DG.Widget<any>> {\n const tv = grok.shell.tv;\n const viewer = await tv.dataFrame.plot.fromType('WebLogo', {\n sequenceColumnName: col.name,\n backgroundColor: 0xFFfdffe5,\n fitArea: false,\n positionHeight: 'Entropy',\n fixWidth: true\n });\n viewer.root.style.height = '50px';\n return viewer;\n}\n\n//name: getBioLib\n//output: object monomerLib\nexport function getBioLib(): IMonomerLib {\n return MonomerLibHelper.instance.getBioLib();\n}\n\n//name: manageFiles\nexport async function manageFiles() {\n const a = ui.dialog({title: 'Manage files'})\n //@ts-ignore\n .add(ui.fileBrowser({path: 'System:AppData/Bio/libraries'}).root)\n .addButton('OK', () => a.close())\n .show();\n}\n\n//name: Manage Libraries\n//input: column seqColumn {semType: Macromolecule}\n//tags: panel, exclude-actions-panel\n//output: widget result\nexport async function libraryPanel(seqColumn: DG.Column): Promise<DG.Widget> {\n //@ts-ignore\n const filesButton: HTMLButtonElement = ui.button('Manage', manageFiles);\n const divInputs: HTMLDivElement = ui.div();\n const libFileNameList: string[] = (await grok.dapi.files.list(`${LIB_PATH}`, false, ''))\n .map((it) => it.fileName);\n const librariesUserSettingsSet: Set<string> = new Set<string>(Object.keys(\n await grok.dapi.userDataStorage.get(LIB_STORAGE_NAME, true)));\n\n let userStoragePromise: Promise<void> = Promise.resolve();\n for (const libFileName of libFileNameList) {\n const libInput: DG.InputBase<boolean | null> = ui.boolInput(libFileName, librariesUserSettingsSet.has(libFileName),\n () => {\n userStoragePromise = userStoragePromise.then(async () => {\n if (libInput.value == true) {\n // Save checked library to user settings 'Libraries'\n await grok.dapi.userDataStorage.postValue(LIB_STORAGE_NAME, libFileName, libFileName, true);\n await MonomerLibHelper.instance.loadLibraries(); // from libraryPanel()\n } else {\n // Remove unchecked library from user settings 'Libraries'\n await grok.dapi.userDataStorage.remove(LIB_STORAGE_NAME, libFileName, true);\n await MonomerLibHelper.instance.loadLibraries(true); // from libraryPanel()\n }\n grok.shell.info('Monomer library user settings saved.');\n });\n });\n divInputs.append(libInput.root);\n }\n\n return new DG.Widget(ui.splitV([\n divInputs,\n ui.divV([filesButton])\n ]));\n}\n\n//name: fastaSequenceCellRenderer\n//tags: cellRenderer\n//meta.cellType: sequence\n//meta.columnTags: quality=Macromolecule, units=fasta\n//output: grid_cell_renderer result\nexport function fastaSequenceCellRenderer(): MacromoleculeSequenceCellRenderer {\n return new MacromoleculeSequenceCellRenderer();\n}\n\n//name: Sequence Renderer\n//input: column molColumn {semType: Macromolecule}\n//tags: panel\n//output: widget result\nexport function macroMolColumnPropertyPanel(molColumn: DG.Column): DG.Widget {\n return getMacroMolColumnPropertyPanel(molColumn);\n}\n\n//name: separatorSequenceCellRenderer\n//tags: cellRenderer\n//meta.cellType: sequence\n//meta.columnTags: quality=Macromolecule, units=separator\n//output: grid_cell_renderer result\nexport function separatorSequenceCellRenderer(): MacromoleculeSequenceCellRenderer {\n return new MacromoleculeSequenceCellRenderer();\n}\n\n//name: MacromoleculeDifferenceCellRenderer\n//tags: cellRenderer\n//meta.cellType: MacromoleculeDifference\n//meta.columnTags: quality=MacromoleculeDifference\n//output: grid_cell_renderer result\nexport function macromoleculeDifferenceCellRenderer(): MacromoleculeDifferenceCellRenderer {\n return new MacromoleculeDifferenceCellRenderer();\n}\n\n\nfunction checkInputColumnUi(col: DG.Column, name: string, allowedNotations: string[] = [],\n allowedAlphabets: string[] = [], notify: boolean = true): boolean {\n const [res, msg]: [boolean, string] = checkInputColumn(col, name, allowedNotations, allowedAlphabets);\n if (notify && !res)\n grok.shell.warning(msg);\n return res;\n}\n\nexport function checkInputColumn(\n col: DG.Column, name: string, allowedNotations: string[] = [], allowedAlphabets: string[] = []\n): [boolean, string] {\n let res: boolean = true;\n let msg: string = '';\n\n const uh = new UnitsHandler(col);\n if (col.semType !== DG.SEMTYPE.MACROMOLECULE) {\n grok.shell.warning(name + ' analysis is allowed for Macromolecules semantic type');\n res = false;\n } else {\n const notation: string = uh.notation;\n if (allowedNotations.length > 0 &&\n !allowedNotations.some((n) => notation.toUpperCase() == (n.toUpperCase()))\n ) {\n const notationAdd = allowedNotations.length == 0 ? 'any notation' :\n (`notation${allowedNotations.length > 1 ? 's' : ''} ${allowedNotations.map((n) => `\"${n}\"`).join(', ')} `);\n msg = `${name} + ' analysis is allowed for Macromolecules with notation ${notationAdd}.`;\n res = false;\n } else if (!uh.isHelm()) {\n // alphabet is not specified for 'helm' notation\n const alphabet: string = uh.alphabet;\n if (\n allowedAlphabets.length > 0 &&\n !allowedAlphabets.some((a) => alphabet.toUpperCase() == (a.toUpperCase()))\n ) {\n const alphabetAdd = allowedAlphabets.length == 0 ? 'any alphabet' :\n (`alphabet${allowedAlphabets.length > 1 ? 's' : ''} ${allowedAlphabets.map((a) => `\"${a}\"`).join(', ')}.`);\n msg = `${name} + ' analysis is allowed for Macromolecules with alphabet ${alphabetAdd}.`;\n res = false;\n }\n }\n }\n\n return [res, msg];\n}\n\n//name: sequenceAlignment\n//input: string alignType {choices: ['Local alignment', 'Global alignment']}\n// eslint-disable-next-line max-len\n//input: string alignTable {choices: ['AUTO', 'NUCLEOTIDES', 'BLOSUM45', 'BLOSUM50','BLOSUM62','BLOSUM80','BLOSUM90','PAM30','PAM70','PAM250','SCHNEIDER','TRANS']}\n//input: double gap\n//input: string seq1\n//input: string seq2\n//output: object res\nexport function sequenceAlignment(alignType: string, alignTable: string, gap: number, seq1: string, seq2: string) {\n const toAlign = new SequenceAlignment(seq1, seq2, gap, alignTable);\n const res = alignType == 'Local alignment' ? toAlign.smithWaterman() : toAlign.needlemanWunch();\n return res;\n}\n\n//name: WebLogo\n//description: WebLogo\n//tags: viewer, panel\n//output: viewer result\n//meta.icon: files/icons/weblogo-viewer.svg\nexport function webLogoViewer() {\n return new WebLogoViewer();\n}\n\n//name: VdRegions\n//description: V-Domain regions viewer\n//tags: viewer, panel\n//meta.icon: files/icons/vdregions-viewer.svg\n//output: viewer result\nexport function vdRegionViewer() {\n return new VdRegionsViewer();\n}\n\n//name: SeqActivityCliffsEditor\n//tags: editor\n//input: funccall call\nexport function SeqActivityCliffsEditor(call: DG.FuncCall) {\n const funcEditor = new ActivityCliffsFunctionEditor(DG.SEMTYPE.MACROMOLECULE);\n ui.dialog({title: 'Activity Cliffs'})\n .add(funcEditor.paramsUI)\n .onOK(async () => {\n call.func.prepare(funcEditor.funcParams).call(true);\n })\n .show();\n}\n\n//top-menu: Bio | Sequence Activity Cliffs...\n//name: Sequence Activity Cliffs\n//description: detect activity cliffs\n//input: dataframe table [Input data table]\n//input: column molecules {semType: Macromolecule}\n//input: column activities\n//input: double similarity = 80 [Similarity cutoff]\n//input: string methodName { choices:[\"UMAP\", \"t-SNE\"] }\n//input: object options {optional: true}\n//output: viewer result\n//editor: Bio:SeqActivityCliffsEditor\nexport async function activityCliffs(df: DG.DataFrame, macroMolecule: DG.Column, activities: DG.Column,\n similarity: number, methodName: string, options?: IUMAPOptions | ITSNEOptions\n): Promise<DG.Viewer | undefined> {\n if (!checkInputColumnUi(macroMolecule, 'Activity Cliffs'))\n return;\n const axesNames = getEmbeddingColsNames(df);\n const tags = {\n 'units': macroMolecule.getTag(DG.TAGS.UNITS),\n 'aligned': macroMolecule.getTag(bioTAGS.aligned),\n 'separator': macroMolecule.getTag(bioTAGS.separator),\n 'alphabet': macroMolecule.getTag(bioTAGS.alphabet),\n };\n const sp = await getActivityCliffs(\n df,\n macroMolecule,\n null,\n axesNames,\n 'Activity cliffs',\n activities,\n similarity,\n 'Tanimoto',\n methodName,\n DG.SEMTYPE.MACROMOLECULE,\n tags,\n sequenceSpaceByFingerprints,\n getChemSimilaritiesMatrix,\n createTooltipElement,\n createPropPanelElement,\n createLinesGrid,\n options);\n return sp;\n}\n\n//name: SequenceSpaceEditor\n//tags: editor\n//input: funccall call\nexport function SequenceSpaceEditor(call: DG.FuncCall) {\n const funcEditor = new SequenceSpaceFunctionEditor(DG.SEMTYPE.MACROMOLECULE);\n ui.dialog({title: 'Sequence Space'})\n .add(funcEditor.paramsUI)\n .onOK(async () => {\n call.func.prepare(funcEditor.funcParams).call(true);\n })\n .show();\n}\n\n//top-menu: Bio | Sequence Space...\n//name: Sequence Space\n//input: dataframe table\n//input: column molecules { semType: Macromolecule }\n//input: string methodName { choices:[\"UMAP\", \"t-SNE\"] }\n//input: string similarityMetric { choices:[\"Tanimoto\", \"Asymmetric\", \"Cosine\", \"Sokal\"] }\n//input: bool plotEmbeddings = true\n//input: object options {optional: true}\n//editor: Bio:SequenceSpaceEditor\nexport async function sequenceSpaceTopMenu(table: DG.DataFrame, macroMolecule: DG.Column, methodName: string,\n similarityMetric: string = 'Tanimoto', plotEmbeddings: boolean, options?: IUMAPOptions | ITSNEOptions): Promise<DG.Viewer | undefined> {\n // Delay is required for initial function dialog to close before starting invalidating of molfiles.\n // Otherwise, dialog is freezing\n await delay(10);\n if (!checkInputColumnUi(macroMolecule, 'Sequence space'))\n return;\n\n const embedColsNames = getEmbeddingColsNames(table);\n const withoutEmptyValues = DG.DataFrame.fromColumns([macroMolecule]).clone();\n const emptyValsIdxs = removeEmptyStringRows(withoutEmptyValues, macroMolecule);\n\n const chemSpaceParams = {\n seqCol: withoutEmptyValues.col(macroMolecule.name)!,\n methodName: methodName,\n similarityMetric: similarityMetric,\n embedAxesNames: embedColsNames,\n options: options\n };\n const sequenceSpaceRes = await sequenceSpaceByFingerprints(chemSpaceParams);\n const embeddings = sequenceSpaceRes.coordinates;\n for (const col of embeddings) {\n const listValues = col.toList();\n emptyValsIdxs.forEach((ind: number) => listValues.splice(ind, 0, null));\n table.columns.add(DG.Column.float(col.name, table.rowCount).init((i) => listValues[i]));\n }\n if (plotEmbeddings) {\n return grok.shell\n .tableView(table.name)\n .scatterPlot({x: embedColsNames[0], y: embedColsNames[1], title: 'Sequence space'});\n }\n\n /* const encodedCol = encodeMonomers(macroMolecule);\n if (!encodedCol)\n return;\n const embedColsNames = getEmbeddingColsNames(table);\n const withoutEmptyValues = DG.DataFrame.fromColumns([encodedCol]).clone();\n const emptyValsIdxs = removeEmptyStringRows(withoutEmptyValues, encodedCol);\n\n const chemSpaceParams = {\n seqCol: withoutEmptyValues.col(encodedCol.name)!,\n methodName: methodName,\n similarityMetric: similarityMetric,\n embedAxesNames: embedColsNames\n };\n const sequenceSpaceRes = await sequenceSpace(chemSpaceParams);\n const embeddings = sequenceSpaceRes.coordinates;\n for (const col of embeddings) {\n const listValues = col.toList();\n emptyValsIdxs.forEach((ind: number) => listValues.splice(ind, 0, null));\n table.columns.add(DG.Column.fromList('double', col.name, listValues));\n }\n let sp;\n if (plotEmbeddings) {\n for (const v of grok.shell.views) {\n if (v.name === table.name)\n sp = (v as DG.TableView).scatterPlot({x: embedColsNames[0], y: embedColsNames[1], title: 'Sequence space'});\n }\n } */\n};\n\n//top-menu: Bio | To Atomic Level...\n//name: To Atomic Level\n//description: returns molfiles for each monomer from HELM library\n//input: dataframe df [Input data table]\n//input: column macroMolecule {semType: Macromolecule}\nexport async function toAtomicLevel(df: DG.DataFrame, macroMolecule: DG.Column): Promise<void> {\n if (DG.Func.find({package: 'Chem', name: 'getRdKitModule'}).length === 0) {\n grok.shell.warning('Transformation to atomic level requires package \"Chem\" installed.');\n return;\n }\n if (!checkInputColumnUi(macroMolecule, 'To Atomic Level'))\n return;\n const monomersLibFile = await _package.files.readAsText(HELM_CORE_LIB_FILENAME);\n const monomersLibObject: any[] = JSON.parse(monomersLibFile);\n await _toAtomicLevel(df, macroMolecule, monomersLibObject);\n}\n\n//top-menu: Bio | MSA...\n//name: MSA...\n//tags: bio, panel\nexport function multipleSequenceAlignmentAny(col: DG.Column<string> | null = null): void {\n const table = col?.dataFrame ?? grok.shell.t;\n const seqCol = col ?? table.columns.bySemType(DG.SEMTYPE.MACROMOLECULE);\n if (seqCol == null) {\n grok.shell.warning(`MSAError: dataset doesn't conain any Macromolecule column`);\n return;\n }\n\n let performAlignment: () => Promise<DG.Column<string> | null> = async () => null;\n const methodInput = ui.choiceInput('Method', pepseaMethods[0], pepseaMethods);\n methodInput.setTooltip('Alignment method');\n const gapOpenInput = ui.floatInput('Gap open', 1.53);\n gapOpenInput.setTooltip('Gap opening penalty at group-to-group alignment');\n const gapExtendInput = ui.floatInput('Gap extend', 0);\n gapExtendInput.setTooltip('Gap extension penalty to skip the alignment');\n const inputRootStyles = [methodInput.root.style, gapOpenInput.root.style, gapExtendInput.root.style];\n\n const colInput = ui.columnInput('Sequence', table, seqCol, () => {\n const potentialCol = colInput.value;\n const unusedName = table.columns.getUnusedName(`msa(${potentialCol.name})`);\n\n if (checkInputColumnUi(\n potentialCol, potentialCol.name, [NOTATION.FASTA], [ALPHABET.DNA, ALPHABET.RNA, ALPHABET.PT], false)) {\n for (const inputRootStyle of inputRootStyles)\n inputRootStyle.display = 'none';\n\n performAlignment = () => runKalign(potentialCol, false, unusedName, clustersColInput.value);\n } else if (checkInputColumnUi(potentialCol, potentialCol.name, [NOTATION.HELM], [], false)) {\n for (const inputRootStyle of inputRootStyles)\n inputRootStyle.display = 'initial';\n\n performAlignment = () => runPepsea(potentialCol, unusedName, methodInput.value!, gapOpenInput.value!,\n gapExtendInput.value!, clustersColInput.value);\n } else {\n for (const inputRootStyle of inputRootStyles)\n inputRootStyle.display = 'none';\n\n performAlignment = async () => null;\n }\n }) as DG.InputBase<DG.Column<string>>;\n colInput.setTooltip('Sequences column to use for alignment');\n colInput.fireChanged();\n\n const clustersColInput = ui.columnInput('Clusters', table, null);\n clustersColInput.nullable = true;\n\n let msaCol: DG.Column<string> | null = null;\n ui.dialog('MSA')\n .add(colInput)\n .add(clustersColInput)\n .add(methodInput)\n .add(gapOpenInput)\n .add(gapExtendInput)\n .onOK(async () => {\n colInput.fireChanged();\n msaCol = await performAlignment();\n if (msaCol == null)\n return grok.shell.warning('Wrong column format');\n\n table.columns.add(msaCol);\n await grok.data.detectSemanticTypes(table);\n })\n .show();\n}\n\n//name: Composition Analysis\n//top-menu: Bio | Composition Analysis\n//meta.icon: files/icons/composition-analysis.svg\n//output: viewer result\nexport async function compositionAnalysis(): Promise<void> {\n // Higher priority for columns with MSA data to show with WebLogo.\n const tv = grok.shell.tv;\n const df = tv.dataFrame;\n //@ts-ignore\n const colList: DG.Column[] = df.columns.toList().filter((col) => {\n if (col.semType != DG.SEMTYPE.MACROMOLECULE)\n return false;\n\n const colUH = new UnitsHandler(col);\n // TODO: prevent for cyclic, branched or multiple chains in Helm\n return true;\n });\n\n const handler = async (col: DG.Column) => {\n if (!checkInputColumnUi(col, 'Composition'))\n return;\n\n const wlViewer = tv.addViewer('WebLogo', {sequenceColumnName: col.name});\n grok.shell.tv.dockManager.dock(wlViewer, DG.DOCK_TYPE.DOWN, null, 'Composition analysis', 0.25);\n };\n\n let col: DG.Column | null = null;\n if (colList.length == 0) {\n grok.shell.error('Current table does not contain sequences');\n return;\n } else if (colList.length > 1) {\n const colListNames: string [] = colList.map((col) => col.name);\n const selectedCol = colList.find((c) => { return (new UnitsHandler(c)).isMsa(); });\n const colInput: DG.InputBase = ui.choiceInput(\n 'Column', selectedCol ? selectedCol.name : colListNames[0], colListNames);\n ui.dialog({\n title: 'Composition Analysis',\n helpUrl: '/help/domains/bio/macromolecules.md#composition-analysis'\n })\n .add(ui.div([\n colInput,\n ]))\n .onOK(async () => {\n const col: DG.Column | null = colList.find((col) => col.name == colInput.value) ?? null;\n\n if (col)\n await handler(col);\n })\n .show();\n } else {\n col = colList[0];\n }\n\n if (!col)\n return;\n\n await handler(col);\n}\n\n//top-menu: Bio | SDF to JSON lib...\n//name: SDF to JSON Lib\n//input: dataframe table\nexport async function sdfToJsonLib(table: DG.DataFrame) {\n const jsonMonomerLibrary = createJsonMonomerLibFromSdf(table);\n}\n\n//name: Representations\n//tags: panel, widgets\n//input: cell macroMolecule {semType: Macromolecule}\n//output: widget result\nexport async function peptideMolecule(macroMolecule: DG.Cell): Promise<DG.Widget> {\n const monomersLibFile = await _package.files.readAsText(HELM_CORE_LIB_FILENAME);\n const monomersLibObject: any[] = JSON.parse(monomersLibFile);\n\n return representationsWidget(macroMolecule, monomersLibObject);\n}\n\n//name: importFasta\n//description: Opens FASTA file\n//tags: file-handler\n//meta.ext: fasta, fna, ffn, faa, frn, fa, fst\n//input: string fileContent\n//output: list tables\nexport function importFasta(fileContent: string): DG.DataFrame [] {\n const ffh = new FastaFileHandler(fileContent);\n return ffh.importFasta();\n}\n\n//top-menu: Bio | Convert...\n//name: convertDialog\nexport function convertDialog() {\n const col = getMacromoleculeColumn();\n convert(col);\n}\n\n//name: monomerCellRenderer\n//tags: cellRenderer\n//meta.cellType: Monomer\n//output: grid_cell_renderer result\nexport function monomerCellRenderer(): MonomerCellRenderer {\n return new MonomerCellRenderer();\n}\n\n//name: testDetectMacromolecule\n//input: string path {choices: ['Demo:Files/', 'System:AppData/']}\n//output: dataframe result\nexport async function testDetectMacromolecule(path: string): Promise<DG.DataFrame> {\n const pi = DG.TaskBarProgressIndicator.create('Test detectMacromolecule...');\n\n const fileList = await grok.dapi.files.list(path, true, '');\n //@ts-ignore\n const fileListToTest = fileList.filter((fi) => fi.fileName.endsWith('.csv'));\n\n let readyCount = 0;\n const res = [];\n\n for (const fileInfo of fileListToTest) {\n try {\n const csv = await grok.dapi.files.readAsText(path + fileInfo.fullPath);\n const df = DG.DataFrame.fromCsv(csv);\n\n for (const col of df.columns) {\n const semType = await grok.functions.call('Bio:detectMacromolecule', {col: col});\n if (semType === DG.SEMTYPE.MACROMOLECULE) {\n //console.warn(`file: ${fileInfo.path}, column: ${col.name}, ` +\n // `semType: ${semType}, units: ${col.getTag(DG.TAGS.UNITS)}`);\n // console.warn('file: \"' + fileInfo.path + '\", semType: \"' + semType + '\", ' +\n // 'units: \"' + col.getTag(DG.TAGS.UNITS) + '\"');\n\n res.push({\n file: fileInfo.path, result: 'detected', column: col.name,\n message: `units: ${col.getTag(DG.TAGS.UNITS)}`\n });\n }\n }\n } catch (err: unknown) {\n // console.error('file: ' + fileInfo.path + ', error: ' + ex.toString());\n res.push({\n file: fileInfo.path, result: 'error', column: null,\n message: err instanceof Error ? err.message : (err as Object).toString(),\n });\n } finally {\n readyCount += 1;\n pi.update(100 * readyCount / fileListToTest.length, `Test ${fileInfo.fileName}`);\n }\n }\n\n grok.shell.info('Test Demo:Files for detectMacromolecule finished.');\n pi.close();\n const resDf = DG.DataFrame.fromObjects(res)!;\n resDf.name = `datasets_detectMacromolecule_${path}`;\n return resDf;\n}\n\n//top-menu: Bio | Split to monomers\n//name: splitToMonomers\nexport function splitToMonomers(): void {\n const col = getMacromoleculeColumn();\n const tempDf = splitAlignedSequences(col);\n const originalDf = col.dataFrame;\n for (const tempCol of tempDf.columns) {\n const newCol = originalDf.columns.add(tempCol);\n newCol.semType = C.SEM_TYPES.MONOMER;\n newCol.setTag(DG.TAGS.CELL_RENDERER, C.SEM_TYPES.MONOMER);\n newCol.setTag(bioTAGS.alphabet, col.getTag(bioTAGS.alphabet));\n }\n grok.shell.tv.grid.invalidate();\n}\n\n//name: Bio: getHelmMonomers\n//input: column sequence {semType: Macromolecule}\nexport function getHelmMonomers(sequence: DG.Column<string>): string[] {\n const stats = getStats(sequence, 1, splitterAsHelm);\n return Object.keys(stats.freq);\n}\n\n\n//name: Sequence Similarity Search\n//tags: viewer\n//meta.icon: files/icons/sequence-similarity-viewer.svg\n//output: viewer result\nexport function similaritySearchViewer(): SequenceSimilarityViewer {\n return new SequenceSimilarityViewer();\n}\n\n//top-menu: Bio | Search | Similarity Search\n//name: similaritySearch\n//description: finds the most similar sequence\n//output: viewer result\nexport function similaritySearchTopMenu(): void {\n const view = (grok.shell.v as DG.TableView);\n const viewer = view.addViewer('Sequence Similarity Search');\n view.dockManager.dock(viewer, 'down');\n}\n\n//name: Sequence Diversity Search\n//tags: viewer\n//meta.icon: files/icons/sequence-diversity-viewer.svg\n//output: viewer result\nexport function diversitySearchViewer(): SequenceDiversityViewer {\n return new SequenceDiversityViewer();\n}\n\n//top-menu: Bio | Search | Diversity Search\n//name: diversitySearch\n//description: finds the most diverse molecules\n//output: viewer result\nexport function diversitySearchTopMenu() {\n const view = (grok.shell.v as DG.TableView);\n const viewer = view.addViewer('Sequence Diversity Search');\n view.dockManager.dock(viewer, 'down');\n}\n\n//top-menu: Bio | Substructure Search ...\n//name: bioSubstructureSearch\nexport function bioSubstructureSearch(): void {\n const col = getMacromoleculeColumn();\n substructureSearchDialog(col);\n}\n\n//name: saveAsFasta\n//description: As FASTA...\n//tags: fileExporter\nexport function saveAsFasta() {\n saveAsFastaUI();\n}\n\n//name: BioSubstructureFilter\n//description: Substructure filter for macromolecules\n//tags: filter\n//output: filter result\n//meta.semType: Macromolecule\nexport function bioSubstructureFilter(): BioSubstructureFilter {\n return new BioSubstructureFilter();\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport {getMolfilesFromSingleSeq} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';\nimport {HELM_CORE_LIB_FILENAME} from '@datagrok-libraries/bio/src/utils/const';\n\n/**\n * @export\n * @param {DG.Column} col macromolecule cell.\n * @return {Promise<DG.Widget>} Widget.\n */\nexport function getMacroMolColumnPropertyPanel(col: DG.Column): DG.Widget {\n const NONE = 'None';\n const scaffoldColName = 'short';\n\n // TODO: replace with an efficient version, bySemTypesExact won't help; GROK-8094\n const columnsList = Array.from(col.dataFrame.columns as any).filter(\n (c: any) => c.semType === DG.SEMTYPE.MOLECULE).map((c: any) => c.name);\n const columnsSet = new Set(columnsList);\n columnsSet.delete(col.name);\n\n const monomerWidth = ui.choiceInput('Monomer width',\n (col?.temp['monomer-width'] != null) ? col.temp['monomer-width'] : 'short',\n ['short', 'long'],\n (s: string) => {\n col.temp['monomer-width'] = s;\n col.setTag('.calculatedCellRender', '0');\n col.dataFrame.fireValuesChanged();\n });\n monomerWidth.setTooltip('In short mode, only the first character should be visible, followed by .. if there are more characters');\n\n const colorCode = ui.boolInput('Color code',\n (col?.temp['color-code'] != null) ? col.temp['color-code'] : true,\n (v: boolean) => {\n col.temp['color-code'] = v;\n col.dataFrame.fireValuesChanged();\n });\n colorCode.setTooltip('Color code');\n\n const referenceSequence = ui.stringInput('Reference sequence', (col?.temp['reference-sequence'] != null) ? col?.temp['reference-sequence'] : '', (v: string) => {\n col.temp['reference-sequence'] = v;\n col.dataFrame.fireValuesChanged();\n });\n referenceSequence.setTooltip('Reference sequence is not empty, then the sequence will be render ' + '\\n' +\n 'as a difference from the reference sequence');\n\n const compareWithCurrent = ui.boolInput('Compare with current',\n (col?.temp['compare-with-current'] != null) ? col.temp['compare-with-current'] : true,\n (v: boolean) => {\n col.temp['compare-with-current'] = v;\n col.dataFrame.fireValuesChanged();\n });\n compareWithCurrent.setTooltip('When on, all sequences get rendered in the \"diff\" mode');\n\n const rdKitInputs = ui.inputs([\n monomerWidth,\n colorCode,\n referenceSequence,\n compareWithCurrent\n ]);\n\n return new DG.Widget(rdKitInputs);\n}\n\n/**\n * 3D representation widget of macromolecule.\n *\n * @export\n * @param {DG.Cell} macroMolecule macromolecule cell.\n * @param {any[]} monomersLibObject\n * @return {Promise<DG.Widget>} Widget.\n */\nexport async function representationsWidget(macroMolecule: DG.Cell, monomersLibObject: any[]): Promise<DG.Widget> {\n const pi = DG.TaskBarProgressIndicator.create('Creating 3D view');\n\n let widgetHost;\n let molBlock3D = '';\n try {\n try {\n const atomicCodes = getMolfilesFromSingleSeq(macroMolecule, monomersLibObject);\n const result = ''//await getMacroMol(atomicCodes!);\n const molBlock2D = result[0];\n molBlock3D = (await grok.functions.call('Bio:Embed', {molBlock2D})) as unknown as string;\n } catch (e) {\n console.warn(e);\n }\n\n try {\n molBlock3D = molBlock3D.replaceAll('\\\\n', '\\n');\n const stringBlob = new Blob([molBlock3D], {type: 'text/plain'});\n const nglHost = ui.div([], {classes: 'd4-ngl-viewer', id: 'ngl-3d-host'});\n\n //@ts-ignore\n const stage = new NGL.Stage(nglHost, {backgroundColor: 'white'});\n //@ts-ignore\n stage.loadFile(stringBlob, {ext: 'sdf'}).then(function(comp: NGL.StructureComponent) {\n stage.setSize(300, 300);\n comp.addRepresentation('ball+stick');\n comp.autoView();\n });\n const sketch = grok.chem.svgMol(molBlock3D);\n const panel = ui.divH([sketch]);\n\n widgetHost = ui.div([panel, nglHost]);\n } catch (e) {\n widgetHost = ui.divText('Couldn\\'t get peptide structure');\n }\n } catch (e) {\n widgetHost = ui.divText('Couldn\\'t get peptide structure');\n }\n pi.close();\n return new DG.Widget(widgetHost);\n}\n","import * as DG from 'datagrok-api/dg';\nimport { getSplitterForColumn } from './macromolecule';\nexport function splitAlignedSequences(sequenceColumn) {\n const splitter = getSplitterForColumn(sequenceColumn);\n const getCol = (index) => { var _a; return (_a = columnList[index]) !== null && _a !== void 0 ? _a : null; };\n const createCol = (index) => {\n const positionCol = resultDf.columns.addNewString((index + 1).toString());\n columnList.push(positionCol);\n return positionCol;\n };\n const columnList = [];\n const rowCount = sequenceColumn.length;\n const resultDf = DG.DataFrame.create(rowCount);\n for (let rowIndex = 0; rowIndex < rowCount; ++rowIndex) {\n const sequence = sequenceColumn.get(rowIndex);\n if (sequence == null)\n continue;\n const currentMonomerList = splitter(sequence);\n currentMonomerList.forEach((monomer, positionIndex) => {\n const col = getCol(positionIndex) || createCol(positionIndex);\n col.set(rowIndex, monomer || '-', false);\n });\n }\n return resultDf;\n}\n//# sourceMappingURL=splitter.js.map","\nclass Cell{\n public value: number;\n public parentI: number;\n public parentJ: number;\n public constructor(){\n this.value = 0;\n this.parentI = 0;\n this.parentJ = 0;\n }\n};\n\n\nexport class Aligned{\n public seq1: string;\n public seq2: string;\n public score: number;\n public constructor(seq1_:string, seq2_:string, score_: number){\n this.seq1 = seq1_;\n this.seq2 = seq2_;\n this.score = score_;\n }\n};\n\nexport class SequenceAlignment{\n private seq1:string ='';\n private seq2:string ='';\n private gap:number =1;\n private len1:number =0;\n private len2:number =0;\n private step:number= 1;\n private alignGrid:Array<Array<number>>=[];\n private scores:Array<Array<number>>=[];\n private dpGrid:Array<Array<Cell>>=[];\n private connections: {[id:string]:number} = {};\n private BLOSUM45:Array<Array<number>> = [[5,-2,-1,-2,-1,-1,-1,0,-2,-1,-1,-1,-1,-2,-1,1,0,-2,-2,0,-1,-1,0,-5],\n [-2,7,0,-1,-3,1,0,-2,0,-3,-2,3,-1,-2,-2,-1,-1,-2,-1,-2,-1,0,-1,-5],\n [-1,0,6,2,-2,0,0,0,1,-2,-3,0,-2,-2,-2,1,0,-4,-2,-3,4,0,-1,-5],\n [-2,-1,2,7,-3,0,2,-1,0,-4,-3,0,-3,-4,-1,0,-1,-4,-2,-3,5,1,-1,-5],\n [-1,-3,-2,-3,12,-3,-3,-3,-3,-3,-2,-3,-2,-2,-4,-1,-1,-5,-3,-1,-2,-3,-2,-5],\n [-1,1,0,0,-3,6,2,-2,1,-2,-2,1,0,-4,-1,0,-1,-2,-1,-3,0,4,-1,-5],\n [-1,0,0,2,-3,2,6,-2,0,-3,-2,1,-2,-3,0,0,-1,-3,-2,-3,1,4,-1,-5],\n [0,-2,0,-1,-3,-2,-2,7,-2,-4,-3,-2,-2,-3,-2,0,-2,-2,-3,-3,-1,-2,-1,-5],\n [-2,0,1,0,-3,1,0,-2,10,-3,-2,-1,0,-2,-2,-1,-2,-3,2,-3,0,0,-1,-5],\n [-1,-3,-2,-4,-3,-2,-3,-4,-3,5,2,-3,2,0,-2,-2,-1,-2,0,3,-3,-3,-1,-5],\n [-1,-2,-3,-3,-2,-2,-2,-3,-2,2,5,-3,2,1,-3,-3,-1,-2,0,1,-3,-2,-1,-5],\n [-1,3,0,0,-3,1,1,-2,-1,-3,-3,5,-1,-3,-1,-1,-1,-2,-1,-2,0,1,-1,-5],\n [-1,-1,-2,-3,-2,0,-2,-2,0,2,2,-1,6,0,-2,-2,-1,-2,0,1,-2,-1,-1,-5],\n [-2,-2,-2,-4,-2,-4,-3,-3,-2,0,1,-3,0,8,-3,-2,-1,1,3,0,-3,-3,-1,-5],\n [-1,-2,-2,-1,-4,-1,0,-2,-2,-2,-3,-1,-2,-3,9,-1,-1,-3,-3,-3,-2,-1,-1,-5],\n [1,-1,1,0,-1,0,0,0,-1,-2,-3,-1,-2,-2,-1,4,2,-4,-2,-1,0,0,0,-5],\n [0,-1,0,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-1,-1,2,5,-3,-1,0,0,-1,0,-5],\n [-2,-2,-4,-4,-5,-2,-3,-2,-3,-2,-2,-2,-2,1,-3,-4,-3,15,3,-3,-4,-2,-2,-5],\n [-2,-1,-2,-2,-3,-1,-2,-3,2,0,0,-1,0,3,-3,-2,-1,3,8,-1,-2,-2,-1,-5],\n [0,-2,-3,-3,-1,-3,-3,-3,-3,3,1,-2,1,0,-3,-1,0,-3,-1,5,-3,-3,-1,-5],\n [-1,-1,4,5,-2,0,1,-1,0,-3,-3,0,-2,-3,-2,0,0,-4,-2,-3,4,2,-1,-5],\n [-1,0,0,1,-3,4,4,-2,0,-3,-2,1,-1,-3,-1,0,-1,-2,-2,-3,2,4,-1,-5],\n [0,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,-2,-1,-1,-1,-1,-1,-5],\n [-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,1]];\n\n private BLOSUM50:Array<Array<number>> = [[5,-2,-1,-2,-1,-1,-1,0,-2,-1,-2,-1,-1,-3,-1,1,0,-3,-2,0,-2,-1,-1,-5],\n [-2,7,-1,-2,-4,1,0,-3,0,-4,-3,3,-2,-3,-3,-1,-1,-3,-1,-3,-1,0,-1,-5],\n [-1,-1,7,2,-2,0,0,0,1,-3,-4,0,-2,-4,-2,1,0,-4,-2,-3,4,0,-1,-5],\n [-2,-2,2,8,-4,0,2,-1,-1,-4,-4,-1,-4,-5,-1,0,-1,-5,-3,-4,5,1,-1,-5],\n [-1,-4,-2,-4,13,-3,-3,-3,-3,-2,-2,-3,-2,-2,-4,-1,-1,-5,-3,-1,-3,-3,-2,-5],\n [-1,1,0,0,-3,7,2,-2,1,-3,-2,2,0,-4,-1,0,-1,-1,-1,-3,0,4,-1,-5],\n [-1,0,0,2,-3,2,6,-3,0,-4,-3,1,-2,-3,-1,-1,-1,-3,-2,-3,1,5,-1,-5],\n [0,-3,0,-1,-3,-2,-3,8,-2,-4,-4,-2,-3,-4,-2,0,-2,-3,-3,-4,-1,-2,-2,-5],\n [-2,0,1,-1,-3,1,0,-2,10,-4,-3,0,-1,-1,-2,-1,-2,-3,2,-4,0,0,-1,-5],\n [-1,-4,-3,-4,-2,-3,-4,-4,-4,5,2,-3,2,0,-3,-3,-1,-3,-1,4,-4,-3,-1,-5],\n [-2,-3,-4,-4,-2,-2,-3,-4,-3,2,5,-3,3,1,-4,-3,-1,-2,-1,1,-4,-3,-1,-5],\n [-1,3,0,-1,-3,2,1,-2,0,-3,-3,6,-2,-4,-1,0,-1,-3,-2,-3,0,1,-1,-5],\n [-1,-2,-2,-4,-2,0,-2,-3,-1,2,3,-2,7,0,-3,-2,-1,-1,0,1,-3,-1,-1,-5],\n [-3,-3,-4,-5,-2,-4,-3,-4,-1,0,1,-4,0,8,-4,-3,-2,1,4,-1,-4,-4,-2,-5],\n [-1,-3,-2,-1,-4,-1,-1,-2,-2,-3,-4,-1,-3,-4,10,-1,-1,-4,-3,-3,-2,-1,-2,-5],\n [1,-1,1,0,-1,0,-1,0,-1,-3,-3,0,-2,-3,-1,5,2,-4,-2,-2,0,0,-1,-5],\n [0,-1,0,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-2,-1,2,5,-3,-2,0,0,-1,0,-5],\n [-3,-3,-4,-5,-5,-1,-3,-3,-3,-3,-2,-3,-1,1,-4,-4,-3,15,2,-3,-5,-2,-3,-5],\n [-2,-1,-2,-3,-3,-1,-2,-3,2,-1,-1,-2,0,4,-3,-2,-2,2,8,-1,-3,-2,-1,-5],\n [0,-3,-3,-4,-1,-3,-3,-4,-4,4,1,-3,1,-1,-3,-2,0,-3,-1,5,-4,-3,-1,-5],\n [-2,-1,4,5,-3,0,1,-1,0,-4,-4,0,-3,-4,-2,0,0,-5,-3,-4,5,2,-1,-5],\n [-1,0,0,1,-3,4,5,-2,0,-3,-3,1,-1,-4,-1,0,-1,-2,-2,-3,2,5,-1,-5],\n [-1,-1,-1,-1,-2,-1,-1,-2,-1,-1,-1,-1,-1,-2,-2,-1,0,-3,-1,-1,-1,-1,-1,-5],\n [-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,1]];\n\n private BLOSUM62:Array<Array<number>> = [[4,-1,-2,-2,0,-1,-1,0,-2,-1,-1,-1,-1,-2,-1,1,0,-3,-2,0,-2,-1,0,-4],\n [-1,5,0,-2,-3,1,0,-2,0,-3,-2,2,-1,-3,-2,-1,-1,-3,-2,-3,-1,0,-1,-4],\n [-2,0,6,1,-3,0,0,0,1,-3,-3,0,-2,-3,-2,1,0,-4,-2,-3,3,0,-1,-4],\n [-2,-2,1,6,-3,0,2,-1,-1,-3,-4,-1,-3,-3,-1,0,-1,-4,-3,-3,4,1,-1,-4],\n [0,-3,-3,-3,9,-3,-4,-3,-3,-1,-1,-3,-1,-2,-3,-1,-1,-2,-2,-1,-3,-3,-2,-4],\n [-1,1,0,0,-3,5,2,-2,0,-3,-2,1,0,-3,-1,0,-1,-2,-1,-2,0,3,-1,-4],\n [-1,0,0,2,-4,2,5,-2,0,-3,-3,1,-2,-3,-1,0,-1,-3,-2,-2,1,4,-1,-4],\n [0,-2,0,-1,-3,-2,-2,6,-2,-4,-4,-2,-3,-3,-2,0,-2,-2,-3,-3,-1,-2,-1,-4],\n [-2,0,1,-1,-3,0,0,-2,8,-3,-3,-1,-2,-1,-2,-1,-2,-2,2,-3,0,0,-1,-4],\n [-1,-3,-3,-3,-1,-3,-3,-4,-3,4,2,-3,1,0,-3,-2,-1,-3,-1,3,-3,-3,-1,-4],\n [-1,-2,-3,-4,-1,-2,-3,-4,-3,2,4,-2,2,0,-3,-2,-1,-2,-1,1,-4,-3,-1,-4],\n [-1,2,0,-1,-3,1,1,-2,-1,-3,-2,5,-1,-3,-1,0,-1,-3,-2,-2,0,1,-1,-4],\n [-1,-1,-2,-3,-1,0,-2,-3,-2,1,2,-1,5,0,-2,-1,-1,-1,-1,1,-3,-1,-1,-4],\n [-2,-3,-3,-3,-2,-3,-3,-3,-1,0,0,-3,0,6,-4,-2,-2,1,3,-1,-3,-3,-1,-4],\n [-1,-2,-2,-1,-3,-1,-1,-2,-2,-3,-3,-1,-2,-4,7,-1,-1,-4,-3,-2,-2,-1,-2,-4],\n [1,-1,1,0,-1,0,0,0,-1,-2,-2,0,-1,-2,-1,4,1,-3,-2,-2,0,0,0,-4],\n [0,-1,0,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-2,-1,1,5,-2,-2,0,-1,-1,0,-4],\n [-3,-3,-4,-4,-2,-2,-3,-2,-2,-3,-2,-3,-1,1,-4,-3,-2,11,2,-3,-4,-3,-2,-4],\n [-2,-2,-2,-3,-2,-1,-2,-3,2,-1,-1,-2,-1,3,-3,-2,-2,2,7,-1,-3,-2,-1,-4],\n [0,-3,-3,-3,-1,-2,-2,-3,-3,3,1,-2,1,-1,-2,-2,0,-3,-1,4,-3,-2,-1,-4],\n [-2,-1,3,4,-3,0,1,-1,0,-3,-4,0,-3,-3,-2,0,-1,-4,-3,-3,4,1,-1,-4],\n [-1,0,0,1,-3,3,4,-2,0,-3,-3,1,-1,-3,-1,0,-1,-3,-2,-2,1,4,-1,-4],\n [0,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,0,0,-2,-1,-1,-1,-1,-1,-4],\n [-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,1]];\n\n private BLOSUM80:Array<Array<number>> = [[7,-3,-3,-3,-1,-2,-2,0,-3,-3,-3,-1,-2,-4,-1,2,0,-5,-4,-1,-3,-2,-1,-8],\n [-3,9,-1,-3,-6,1,-1,-4,0,-5,-4,3,-3,-5,-3,-2,-2,-5,-4,-4,-2,0,-2,-8],\n [-3,-1,9,2,-5,0,-1,-1,1,-6,-6,0,-4,-6,-4,1,0,-7,-4,-5,5,-1,-2,-8],\n [-3,-3,2,10,-7,-1,2,-3,-2,-7,-7,-2,-6,-6,-3,-1,-2,-8,-6,-6,6,1,-3,-8],\n [-1,-6,-5,-7,13,-5,-7,-6,-7,-2,-3,-6,-3,-4,-6,-2,-2,-5,-5,-2,-6,-7,-4,-8],\n [-2,1,0,-1,-5,9,3,-4,1,-5,-4,2,-1,-5,-3,-1,-1,-4,-3,-4,-1,5,-2,-8],\n [-2,-1,-1,2,-7,3,8,-4,0,-6,-6,1,-4,-6,-2,-1,-2,-6,-5,-4,1,6,-2,-8],\n [0,-4,-1,-3,-6,-4,-4,9,-4,-7,-7,-3,-5,-6,-5,-1,-3,-6,-6,-6,-2,-4,-3,-8],\n [-3,0,1,-2,-7,1,0,-4,12,-6,-5,-1,-4,-2,-4,-2,-3,-4,3,-5,-1,0,-2,-8],\n [-3,-5,-6,-7,-2,-5,-6,-7,-6,7,2,-5,2,-1,-5,-4,-2,-5,-3,4,-6,-6,-2,-8],\n [-3,-4,-6,-7,-3,-4,-6,-7,-5,2,6,-4,3,0,-5,-4,-3,-4,-2,1,-7,-5,-2,-8],\n [-1,3,0,-2,-6,2,1,-3,-1,-5,-4,8,-3,-5,-2,-1,-1,-6,-4,-4,-1,1,-2,-8],\n [-2,-3,-4,-6,-3,-1,-4,-5,-4,2,3,-3,9,0,-4,-3,-1,-3,-3,1,-5,-3,-2,-8],\n [-4,-5,-6,-6,-4,-5,-6,-6,-2,-1,0,-5,0,10,-6,-4,-4,0,4,-2,-6,-6,-3,-8],\n [-1,-3,-4,-3,-6,-3,-2,-5,-4,-5,-5,-2,-4,-6,12,-2,-3,-7,-6,-4,-4,-2,-3,-8],\n [2,-2,1,-1,-2,-1,-1,-1,-2,-4,-4,-1,-3,-4,-2,7,2,-6,-3,-3,0,-1,-1,-8],\n [0,-2,0,-2,-2,-1,-2,-3,-3,-2,-3,-1,-1,-4,-3,2,8,-5,-3,0,-1,-2,-1,-8],\n [-5,-5,-7,-8,-5,-4,-6,-6,-4,-5,-4,-6,-3,0,-7,-6,-5,16,3,-5,-8,-5,-5,-8],\n [-4,-4,-4,-6,-5,-3,-5,-6,3,-3,-2,-4,-3,4,-6,-3,-3,3,11,-3,-5,-4,-3,-8],\n [-1,-4,-5,-6,-2,-4,-4,-6,-5,4,1,-4,1,-2,-4,-3,0,-5,-3,7,-6,-4,-2,-8],\n [-3,-2,5,6,-6,-1,1,-2,-1,-6,-7,-1,-5,-6,-4,0,-1,-8,-5,-6,6,0,-3,-8],\n [-2,0,-1,1,-7,5,6,-4,0,-6,-5,1,-3,-6,-2,-1,-2,-5,-4,-4,0,6,-1,-8],\n [-1,-2,-2,-3,-4,-2,-2,-3,-2,-2,-2,-2,-2,-3,-3,-1,-1,-5,-3,-2,-3,-1,-2,-8],\n [-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,1]];\n\n private BLOSUM90:Array<Array<number>> = [[5,-2,-2,-3,-1,-1,-1,0,-2,-2,-2,-1,-2,-3,-1,1,0,-4,-3,-1,-2,-1,-1,-6],\n [-2,6,-1,-3,-5,1,-1,-3,0,-4,-3,2,-2,-4,-3,-1,-2,-4,-3,-3,-2,0,-2,-6],\n [-2,-1,7,1,-4,0,-1,-1,0,-4,-4,0,-3,-4,-3,0,0,-5,-3,-4,4,-1,-2,-6],\n [-3,-3,1,7,-5,-1,1,-2,-2,-5,-5,-1,-4,-5,-3,-1,-2,-6,-4,-5,4,0,-2,-6],\n [-1,-5,-4,-5,9,-4,-6,-4,-5,-2,-2,-4,-2,-3,-4,-2,-2,-4,-4,-2,-4,-5,-3,-6],\n [-1,1,0,-1,-4,7,2,-3,1,-4,-3,1,0,-4,-2,-1,-1,-3,-3,-3,-1,4,-1,-6],\n [-1,-1,-1,1,-6,2,6,-3,-1,-4,-4,0,-3,-5,-2,-1,-1,-5,-4,-3,0,4,-2,-6],\n [0,-3,-1,-2,-4,-3,-3,6,-3,-5,-5,-2,-4,-5,-3,-1,-3,-4,-5,-5,-2,-3,-2,-6],\n [-2,0,0,-2,-5,1,-1,-3,8,-4,-4,-1,-3,-2,-3,-2,-2,-3,1,-4,-1,0,-2,-6],\n [-2,-4,-4,-5,-2,-4,-4,-5,-4,5,1,-4,1,-1,-4,-3,-1,-4,-2,3,-5,-4,-2,-6],\n [-2,-3,-4,-5,-2,-3,-4,-5,-4,1,5,-3,2,0,-4,-3,-2,-3,-2,0,-5,-4,-2,-6],\n [-1,2,0,-1,-4,1,0,-2,-1,-4,-3,6,-2,-4,-2,-1,-1,-5,-3,-3,-1,1,-1,-6],\n [-2,-2,-3,-4,-2,0,-3,-4,-3,1,2,-2,7,-1,-3,-2,-1,-2,-2,0,-4,-2,-1,-6],\n [-3,-4,-4,-5,-3,-4,-5,-5,-2,-1,0,-4,-1,7,-4,-3,-3,0,3,-2,-4,-4,-2,-6],\n [-1,-3,-3,-3,-4,-2,-2,-3,-3,-4,-4,-2,-3,-4,8,-2,-2,-5,-4,-3,-3,-2,-2,-6],\n [1,-1,0,-1,-2,-1,-1,-1,-2,-3,-3,-1,-2,-3,-2,5,1,-4,-3,-2,0,-1,-1,-6],\n [0,-2,0,-2,-2,-1,-1,-3,-2,-1,-2,-1,-1,-3,-2,1,6,-4,-2,-1,-1,-1,-1,-6],\n [-4,-4,-5,-6,-4,-3,-5,-4,-3,-4,-3,-5,-2,0,-5,-4,-4,11,2,-3,-6,-4,-3,-6],\n [-3,-3,-3,-4,-4,-3,-4,-5,1,-2,-2,-3,-2,3,-4,-3,-2,2,8,-3,-4,-3,-2,-6],\n [-1,-3,-4,-5,-2,-3,-3,-5,-4,3,0,-3,0,-2,-3,-2,-1,-3,-3,5,-4,-3,-2,-6],\n [-2,-2,4,4,-4,-1,0,-2,-1,-5,-5,-1,-4,-4,-3,0,-1,-6,-4,-4,4,0,-2,-6],\n [-1,0,-1,0,-5,4,4,-3,0,-4,-4,1,-2,-4,-2,-1,-1,-4,-3,-3,0,4,-1,-6],\n [-1,-2,-2,-2,-3,-1,-2,-2,-2,-2,-2,-1,-1,-2,-2,-1,-1,-3,-2,-2,-2,-1,-2,-6],\n [-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,1]];\n\n private NUCLEOTIDES: Array<Array<number>> = [[1,-1,-1,-1],\n [-1,1,-1,-1],\n [-1,-1,1,-1],\n [-1,-1,-1,1]];\n\n private PAM30: Array<Array<number>> = [[6,-7,-4,-3,-6,-4,-2,-2,-7,-5,-6,-7,-5,-8,-2,0,-1,-13,-8,-2,-3,-3,-3,-17],\n [-7,8,-6,-10,-8,-2,-9,-9,-2,-5,-8,0,-4,-9,-4,-3,-6,-2,-10,-8,-7,-4,-6,-17],\n [-4,-6,8,2,-11,-3,-2,-3,0,-5,-7,-1,-9,-9,-6,0,-2,-8,-4,-8,6,-3,-3,-17],\n [-3,-10,2,8,-14,-2,2,-3,-4,-7,-12,-4,-11,-15,-8,-4,-5,-15,-11,-8,6,1,-5,-17],\n [-6,-8,-11,-14,10,-14,-14,-9,-7,-6,-15,-14,-13,-13,-8,-3,-8,-15,-4,-6,-12,-14,-9,-17],\n [-4,-2,-3,-2,-14,8,1,-7,1,-8,-5,-3,-4,-13,-3,-5,-5,-13,-12,-7,-3,6,-5,-17],\n [-2,-9,-2,2,-14,1,8,-4,-5,-5,-9,-4,-7,-14,-5,-4,-6,-17,-8,-6,1,6,-5,-17],\n [-2,-9,-3,-3,-9,-7,-4,6,-9,-11,-10,-7,-8,-9,-6,-2,-6,-15,-14,-5,-3,-5,-5,-17],\n [-7,-2,0,-4,-7,1,-5,-9,9,-9,-6,-6,-10,-6,-4,-6,-7,-7,-3,-6,-1,-1,-5,-17],\n [-5,-5,-5,-7,-6,-8,-5,-11,-9,8,-1,-6,-1,-2,-8,-7,-2,-14,-6,2,-6,-6,-5,-17],\n [-6,-8,-7,-12,-15,-5,-9,-10,-6,-1,7,-8,1,-3,-7,-8,-7,-6,-7,-2,-9,-7,-6,-17],\n [-7,0,-1,-4,-14,-3,-4,-7,-6,-6,-8,7,-2,-14,-6,-4,-3,-12,-9,-9,-2,-4,-5,-17],\n [-5,-4,-9,-11,-13,-4,-7,-8,-10,-1,1,-2,11,-4,-8,-5,-4,-13,-11,-1,-10,-5,-5,-17],\n [-8,-9,-9,-15,-13,-13,-14,-9,-6,-2,-3,-14,-4,9,-10,-6,-9,-4,2,-8,-10,-13,-8,-17],\n [-2,-4,-6,-8,-8,-3,-5,-6,-4,-8,-7,-6,-8,-10,8,-2,-4,-14,-13,-6,-7,-4,-5,-17],\n [0,-3,0,-4,-3,-5,-4,-2,-6,-7,-8,-4,-5,-6,-2,6,0,-5,-7,-6,-1,-5,-3,-17],\n [-1,-6,-2,-5,-8,-5,-6,-6,-7,-2,-7,-3,-4,-9,-4,0,7,-13,-6,-3,-3,-6,-4,-17],\n [-13,-2,-8,-15,-15,-13,-17,-15,-7,-14,-6,-12,-13,-4,-14,-5,-13,13,-5,-15,-10,-14,-11,-17],\n [-8,-10,-4,-11,-4,-12,-8,-14,-3,-6,-7,-9,-11,2,-13,-7,-6,-5,10,-7,-6,-9,-7,-17],\n [-2,-8,-8,-8,-6,-7,-6,-5,-6,2,-2,-9,-1,-8,-6,-6,-3,-15,-7,7,-8,-6,-5,-17],\n [-3,-7,6,6,-12,-3,1,-3,-1,-6,-9,-2,-10,-10,-7,-1,-3,-10,-6,-8,6,0,-5,-17],\n [-3,-4,-3,1,-14,6,6,-5,-1,-6,-7,-4,-5,-13,-4,-5,-6,-14,-9,-6,0,6,-5,-17],\n [-3,-6,-3,-5,-9,-5,-5,-5,-5,-5,-6,-5,-5,-8,-5,-3,-4,-11,-7,-5,-5,-5,-5,-17],\n [-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,1]];\n\n private PAM70:Array<Array<number>> = [[5,-4,-2,-1,-4,-2,-1,0,-4,-2,-4,-4,-3,-6,0,1,1,-9,-5,-1,-1,-1,-2,-11],\n [-4,8,-3,-6,-5,0,-5,-6,0,-3,-6,2,-2,-7,-2,-1,-4,0,-7,-5,-4,-2,-3,-11],\n [-2,-3,6,3,-7,-1,0,-1,1,-3,-5,0,-5,-6,-3,1,0,-6,-3,-5,5,-1,-2,-11],\n [-1,-6,3,6,-9,0,3,-1,-1,-5,-8,-2,-7,-10,-4,-1,-2,-10,-7,-5,5,2,-3,-11],\n [-4,-5,-7,-9,9,-9,-9,-6,-5,-4,-10,-9,-9,-8,-5,-1,-5,-11,-2,-4,-8,-9,-6,-11],\n [-2,0,-1,0,-9,7,2,-4,2,-5,-3,-1,-2,-9,-1,-3,-3,-8,-8,-4,-1,5,-2,-11],\n [-1,-5,0,3,-9,2,6,-2,-2,-4,-6,-2,-4,-9,-3,-2,-3,-11,-6,-4,2,5,-3,-11],\n [0,-6,-1,-1,-6,-4,-2,6,-6,-6,-7,-5,-6,-7,-3,0,-3,-10,-9,-3,-1,-3,-3,-11],\n [-4,0,1,-1,-5,2,-2,-6,8,-6,-4,-3,-6,-4,-2,-3,-4,-5,-1,-4,0,1,-3,-11],\n [-2,-3,-3,-5,-4,-5,-4,-6,-6,7,1,-4,1,0,-5,-4,-1,-9,-4,3,-4,-4,-3,-11],\n [-4,-6,-5,-8,-10,-3,-6,-7,-4,1,6,-5,2,-1,-5,-6,-4,-4,-4,0,-6,-4,-4,-11],\n [-4,2,0,-2,-9,-1,-2,-5,-3,-4,-5,6,0,-9,-4,-2,-1,-7,-7,-6,-1,-2,-3,-11],\n [-3,-2,-5,-7,-9,-2,-4,-6,-6,1,2,0,10,-2,-5,-3,-2,-8,-7,0,-6,-3,-3,-11],\n [-6,-7,-6,-10,-8,-9,-9,-7,-4,0,-1,-9,-2,8,-7,-4,-6,-2,4,-5,-7,-9,-5,-11],\n [0,-2,-3,-4,-5,-1,-3,-3,-2,-5,-5,-4,-5,-7,7,0,-2,-9,-9,-3,-4,-2,-3,-11],\n [1,-1,1,-1,-1,-3,-2,0,-3,-4,-6,-2,-3,-4,0,5,2,-3,-5,-3,0,-2,-1,-11],\n [1,-4,0,-2,-5,-3,-3,-3,-4,-1,-4,-1,-2,-6,-2,2,6,-8,-4,-1,-1,-3,-2,-11],\n [-9,0,-6,-10,-11,-8,-11,-10,-5,-9,-4,-7,-8,-2,-9,-3,-8,13,-3,-10,-7,-10,-7,-11],\n [-5,-7,-3,-7,-2,-8,-6,-9,-1,-4,-4,-7,-7,4,-9,-5,-4,-3,9,-5,-4,-7,-5,-11],\n [-1,-5,-5,-5,-4,-4,-4,-3,-4,3,0,-6,0,-5,-3,-3,-1,-10,-5,6,-5,-4,-2,-11],\n [-1,-4,5,5,-8,-1,2,-1,0,-4,-6,-1,-6,-7,-4,0,-1,-7,-4,-5,5,1,-2,-11],\n [-1,-2,-1,2,-9,5,5,-3,1,-4,-4,-2,-3,-9,-2,-2,-3,-10,-7,-4,1,5,-3,-11],\n [-2,-3,-2,-3,-6,-2,-3,-3,-3,-3,-4,-3,-3,-5,-3,-1,-2,-7,-5,-2,-2,-3,-3,-11],\n [-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,1]];\n\n private PAM250:Array<Array<number>> = [[2,-2,0,0,-2,0,0,1,-1,-1,-2,-1,-1,-3,1,1,1,-6,-3,0,0,0,0,-8],\n [-2,6,0,-1,-4,1,-1,-3,2,-2,-3,3,0,-4,0,0,-1,2,-4,-2,-1,0,-1,-8],\n [0,0,2,2,-4,1,1,0,2,-2,-3,1,-2,-3,0,1,0,-4,-2,-2,2,1,0,-8],\n [0,-1,2,4,-5,2,3,1,1,-2,-4,0,-3,-6,-1,0,0,-7,-4,-2,3,3,-1,-8],\n [-2,-4,-4,-5,12,-5,-5,-3,-3,-2,-6,-5,-5,-4,-3,0,-2,-8,0,-2,-4,-5,-3,-8],\n [0,1,1,2,-5,4,2,-1,3,-2,-2,1,-1,-5,0,-1,-1,-5,-4,-2,1,3,-1,-8],\n [0,-1,1,3,-5,2,4,0,1,-2,-3,0,-2,-5,-1,0,0,-7,-4,-2,3,3,-1,-8],\n [1,-3,0,1,-3,-1,0,5,-2,-3,-4,-2,-3,-5,0,1,0,-7,-5,-1,0,0,-1,-8],\n [-1,2,2,1,-3,3,1,-2,6,-2,-2,0,-2,-2,0,-1,-1,-3,0,-2,1,2,-1,-8],\n [-1,-2,-2,-2,-2,-2,-2,-3,-2,5,2,-2,2,1,-2,-1,0,-5,-1,4,-2,-2,-1,-8],\n [-2,-3,-3,-4,-6,-2,-3,-4,-2,2,6,-3,4,2,-3,-3,-2,-2,-1,2,-3,-3,-1,-8],\n [-1,3,1,0,-5,1,0,-2,0,-2,-3,5,0,-5,-1,0,0,-3,-4,-2,1,0,-1,-8],\n [-1,0,-2,-3,-5,-1,-2,-3,-2,2,4,0,6,0,-2,-2,-1,-4,-2,2,-2,-2,-1,-8],\n [-3,-4,-3,-6,-4,-5,-5,-5,-2,1,2,-5,0,9,-5,-3,-3,0,7,-1,-4,-5,-2,-8],\n [1,0,0,-1,-3,0,-1,0,0,-2,-3,-1,-2,-5,6,1,0,-6,-5,-1,-1,0,-1,-8],\n [1,0,1,0,0,-1,0,1,-1,-1,-3,0,-2,-3,1,2,1,-2,-3,-1,0,0,0,-8],\n [1,-1,0,0,-2,-1,0,0,-1,0,-2,0,-1,-3,0,1,3,-5,-3,0,0,-1,0,-8],\n [-6,2,-4,-7,-8,-5,-7,-7,-3,-5,-2,-3,-4,0,-6,-2,-5,17,0,-6,-5,-6,-4,-8],\n [-3,-4,-2,-4,0,-4,-4,-5,0,-1,-1,-4,-2,7,-5,-3,-3,0,10,-2,-3,-4,-2,-8],\n [0,-2,-2,-2,-2,-2,-2,-1,-2,4,2,-2,2,-1,-1,-1,0,-6,-2,4,-2,-2,-1,-8],\n [0,-1,2,3,-4,1,3,0,1,-2,-3,1,-2,-4,-1,0,0,-5,-3,-2,3,2,-1,-8],\n [0,0,1,3,-5,3,3,0,2,-2,-3,0,-2,-5,0,0,-1,-6,-4,-2,2,3,-1,-8],\n [0,-1,0,-1,-3,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,0,0,-4,-2,-1,-1,-1,-1,-8],\n [-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,1]];\n\n private SCHNEIDER :Array<Array<number>> = [[11.6,-2.7,9.7,-1.7,-2.7,-6.4,-3.9,-5.6,5.1,-5.0,3.6,-4.2,-6.3,-13.0,-7.1,-11.5,0.4,-6.0,-1.9,-5.3,-8.5,-11.2,-8.9,-10.8,2.1,0.0,1.4,0.2,-10.2,-13.5,-13.0,-12.5,-2.6,-8.5,-5.0,-8.1,-6.3,-9.9,-7.5,-9.0,-7.1,-10.2,-8.2,-9.2,-8.2,-12.5,-11.1,-11.4,-50.0,-14.8,-50.0,-13.8,-7.3,-10.1,-8.4,-9.1,-50.0,-13.0,-13.5,-12.4,-10.7,-18.1,-11.8,-17.2,],\n [-2.7,13.0,-3.3,10.9,-3.5,-0.4,-3.3,-1.8,-5.4,4.6,-5.5,3.0,-10.2,-7.9,-9.9,-9.6,-5.0,0.5,-5.5,-1.0,-10.3,-8.1,-9.4,-9.6,-8.1,-5.0,-7.3,-6.3,-13.4,-11.3,-14.4,-12.9,-6.3,0.8,-6.4,-1.1,-7.4,-5.0,-6.2,-6.5,-5.6,-1.6,-4.7,-3.0,-10.8,-8.7,-11.9,-10.0,-50.0,-6.2,-50.0,-7.5,-6.3,-4.3,-6.2,-5.4,-50.0,-7.0,-16.3,-8.2,-13.2,-12.3,-13.1,-13.3,],\n [9.7,-3.3,11.6,-2.8,-4.5,-6.7,-3.1,-6.9,3.3,-5.5,4.8,-5.1,-8.9,-13.2,-5.7,-12.6,-1.5,-6.1,-0.6,-6.1,-10.0,-11.8,-8.6,-11.9,1.2,0.5,2.2,0.1,-11.8,-14.0,-11.9,-13.4,-4.9,-9.1,-3.4,-8.9,-8.0,-10.0,-7.2,-10.0,-9.1,-10.2,-7.1,-9.9,-10.1,-13.0,-10.6,-12.7,-50.0,-14.9,-50.0,-14.4,-8.9,-10.8,-8.9,-10.4,-50.0,-13.1,-11.8,-13.0,-12.4,-19.4,-11.5,-17.8,],\n [-1.7,10.9,-2.8,12.9,-2.7,-2.2,-2.8,0.2,-4.8,2.9,-5.2,5.2,-9.1,-9.5,-9.0,-7.0,-4.0,-1.0,-5.0,1.0,-9.0,-8.8,-8.9,-7.7,-7.0,-6.8,-7.1,-4.3,-12.4,-12.9,-13.9,-10.0,-4.9,-0.7,-5.6,1.4,-6.0,-6.5,-6.2,-4.8,-5.1,-3.2,-5.0,-1.2,-9.8,-9.9,-11.3,-8.2,-50.0,-7.6,-50.0,-5.1,-5.5,-5.8,-5.9,-4.2,-50.0,-8.3,-15.5,-5.9,-11.6,-14.2,-12.0,-11.6,],\n [-2.7,-3.5,-4.5,-2.7,11.7,9.0,10.6,9.6,-3.2,-0.7,-5.1,-0.4,0.7,-4.6,-0.4,-3.6,-4.8,-8.9,-6.5,-7.8,-1.4,-4.1,-2.9,-3.3,-8.0,-9.1,-8.0,-8.2,-6.0,-9.3,-7.7,-8.5,-6.4,-10.1,-7.5,-8.6,2.8,-0.7,0.9,0.1,-5.9,-7.3,-6.5,-6.5,-0.4,-3.9,-2.6,-3.1,-50.0,-14.6,-50.0,-12.6,2.9,0.1,1.8,1.0,-50.0,-9.2,-13.6,-7.7,-4.8,-12.2,-6.2,-11.0,],\n [-6.4,-0.4,-6.7,-2.2,9.0,12.3,9.8,9.6,-7.1,2.4,-7.2,0.3,-2.9,-1.2,-3.0,-3.3,-7.6,-6.7,-8.1,-7.9,-4.9,-1.9,-4.5,-3.8,-9.5,-7.8,-9.3,-8.9,-9.4,-7.1,-9.0,-9.0,-9.4,-7.5,-9.3,-9.2,-0.7,2.6,0.2,-0.1,-8.0,-4.6,-7.7,-6.1,-3.6,-1.0,-4.1,-3.1,-50.0,-11.6,-50.0,-11.6,0.2,2.3,0.4,0.5,-50.0,-6.5,-15.3,-7.8,-8.4,-9.5,-8.3,-11.1,],\n [-3.9,-3.3,-3.1,-2.8,10.6,9.8,12.2,9.8,-4.9,0.1,-3.6,-0.2,-1.7,-4.1,0.9,-3.5,-5.9,-8.9,-5.6,-8.5,-3.9,-3.9,-2.2,-4.5,-7.3,-7.5,-6.4,-8.5,-7.1,-8.2,-6.7,-7.8,-7.9,-9.1,-7.1,-9.4,0.9,-0.2,2.5,-0.3,-6.9,-6.5,-5.5,-6.8,-1.7,-3.4,-1.7,-2.8,-50.0,-13.0,-50.0,-11.5,1.5,0.7,2.7,0.6,-50.0,-8.9,-12.1,-7.4,-6.1,-11.5,-5.4,-10.4,],\n [-5.6,-1.8,-6.9,0.2,9.6,9.6,9.8,11.6,-6.6,0.9,-7.2,2.5,-2.3,-3.4,-2.3,-0.6,-6.5,-8.2,-8.0,-6.3,-3.7,-3.5,-3.9,-1.6,-9.9,-8.9,-9.6,-7.0,-8.6,-8.9,-8.8,-6.8,-8.6,-8.2,-8.8,-6.8,0.3,0.1,0.2,2.4,-7.4,-6.2,-6.9,-4.4,-2.9,-2.9,-3.5,-0.9,-50.0,-12.2,-50.0,-10.1,1.2,0.6,1.2,2.4,-50.0,-7.6,-16.1,-5.8,-7.2,-10.8,-7.4,-9.0,],\n [5.1,-5.4,3.3,-4.8,-3.2,-7.1,-4.9,-6.6,13.3,-2.8,11.2,-1.9,-5.7,-12.5,-7.2,-11.6,-0.7,-4.8,-3.1,-4.3,-10.0,-11.6,-8.8,-11.7,10.5,7.7,9.1,8.5,-9.8,-12.7,-11.7,-11.8,-6.3,-11.4,-8.8,-11.0,-7.5,-10.3,-8.3,-9.9,-1.9,-6.7,-4.1,-6.4,-7.9,-12.5,-11.4,-11.7,-50.0,-14.0,-50.0,-13.2,-8.5,-10.4,-9.1,-9.6,-50.0,-9.8,-7.7,-8.8,-10.3,-17.9,-11.8,-16.0,],\n [-5.0,4.6,-5.5,2.9,-0.7,2.4,0.1,0.9,-2.8,12.8,-2.6,11.0,-8.4,-6.3,-8.3,-7.7,-6.1,-2.9,-6.5,-4.2,-8.5,-5.9,-7.5,-7.7,-5.5,-2.4,-5.5,-4.1,-12.9,-10.3,-12.7,-11.3,-7.4,-3.1,-7.4,-4.9,-4.4,-1.8,-3.5,-3.5,-1.6,3.0,-0.8,0.9,-8.4,-6.3,-9.6,-7.3,-50.0,-9.0,-50.0,-9.7,-2.3,-0.2,-1.2,-1.5,-50.0,-0.7,-13.3,-2.0,-11.8,-11.9,-12.3,-12.7,],\n [3.6,-5.5,4.8,-5.2,-5.1,-7.2,-3.6,-7.2,11.2,-2.6,13.4,-2.1,-7.7,-12.5,-5.3,-11.9,-2.2,-4.4,-1.9,-4.8,-10.2,-11.5,-8.1,-12.0,9.3,8.2,10.0,8.0,-10.8,-11.9,-10.7,-12.4,-8.2,-11.8,-6.9,-11.5,-8.4,-9.9,-7.1,-10.6,-4.7,-6.8,-1.2,-7.0,-9.8,-11.6,-9.6,-12.1,-50.0,-14.1,-50.0,-12.7,-10.0,-10.8,-8.8,-10.5,-50.0,-9.2,-4.2,-9.3,-11.0,-18.2,-11.1,-16.1,],\n [-4.2,3.0,-5.1,5.2,-0.4,0.3,-0.2,2.5,-1.9,11.0,-2.1,13.2,-7.6,-8.5,-8.0,-5.3,-5.6,-4.5,-6.8,-2.4,-7.8,-7.9,-7.9,-6.2,-5.7,-5.1,-5.4,-2.1,-12.4,-12.3,-13.1,-10.1,-6.6,-4.4,-6.9,-2.6,-3.6,-3.8,-3.7,-2.0,-1.4,0.8,-0.9,3.0,-8.2,-8.1,-9.2,-5.8,-50.0,-10.1,-50.0,-7.4,-1.7,-2.0,-1.5,-0.5,-50.0,-2.1,-12.6,-0.4,-11.6,-13.9,-11.4,-11.1,],\n [-6.3,-10.2,-8.9,-9.1,0.7,-2.9,-1.7,-2.3,-5.7,-8.4,-7.7,-7.6,13.2,9.6,3.5,9.7,-8.7,-12.4,-10.7,-10.7,-7.8,-10.2,-8.8,-9.6,-9.5,-11.9,-10.9,-10.5,2.3,-0.4,-0.2,-0.3,-9.7,-15.5,-11.4,-13.7,-3.0,-6.4,-4.1,-5.4,-9.6,-11.9,-10.5,-11.8,6.2,3.3,3.7,3.6,-50.0,-13.6,-50.0,-11.9,-5.6,-8.8,-7.2,-8.9,-50.0,-12.4,-14.1,-11.6,2.8,-6.4,0.5,-5.2,],\n [-13.0,-7.9,-13.2,-9.5,-4.6,-1.2,-4.1,-3.4,-12.5,-6.3,-12.5,-8.5,9.6,12.7,0.2,10.5,-12.4,-11.6,-13.2,-12.0,-12.4,-10.1,-11.6,-12.0,-15.1,-13.1,-14.3,-13.4,-1.4,1.4,-1.6,-0.5,-14.9,-14.3,-15.2,-16.8,-7.7,-4.7,-6.3,-6.6,-14.6,-10.8,-12.8,-13.0,2.3,6.0,2.5,3.6,-50.0,-11.2,-50.0,-11.9,-10.5,-9.2,-10.5,-10.5,-50.0,-10.3,-16.2,-11.3,-1.7,-3.7,-2.5,-5.4,],\n [-7.1,-9.9,-5.7,-9.0,-0.4,-3.0,0.9,-2.3,-7.2,-8.3,-5.3,-8.0,3.5,0.2,14.3,1.0,-7.3,-11.2,-6.9,-9.7,-8.5,-10.2,-7.7,-9.8,-10.0,-10.4,-8.4,-10.2,1.0,-0.6,1.7,-0.5,-11.1,-14.8,-9.7,-14.5,-3.7,-5.8,-3.1,-5.6,-10.4,-11.5,-8.2,-11.1,0.6,-1.6,1.6,-1.1,-50.0,-12.4,-50.0,-11.5,-5.5,-8.0,-4.9,-7.2,-50.0,-12.4,-10.3,-11.6,0.7,-6.8,2.4,-6.0,],\n [-11.5,-9.6,-12.6,-7.0,-3.6,-3.3,-3.5,-0.6,-11.6,-7.7,-11.9,-5.3,9.7,10.5,1.0,12.6,-12.0,-12.2,-12.5,-9.7,-11.1,-11.2,-11.9,-9.4,-12.9,-14.3,-14.0,-11.9,-1.0,-0.4,-1.6,1.2,-13.9,-15.4,-13.7,-12.6,-6.2,-6.7,-6.3,-4.4,-13.0,-12.2,-13.0,-10.4,2.9,3.8,2.5,5.8,-50.0,-12.5,-50.0,-10.2,-9.6,-9.7,-9.6,-8.3,-50.0,-11.6,-15.4,-9.4,-1.1,-5.4,-1.6,-3.3,],\n [0.4,-5.0,-1.5,-4.0,-4.8,-7.6,-5.9,-6.5,-0.7,-6.1,-2.2,-5.6,-8.7,-12.4,-7.3,-12.0,12.8,2.3,10.2,3.0,0.0,-3.4,-0.7,-3.2,2.5,-0.8,0.9,0.2,-3.0,-7.2,-5.7,-6.1,-0.2,-6.6,-1.8,-6.0,-5.3,-8.2,-5.7,-7.6,-6.7,-9.6,-7.5,-9.3,-7.1,-10.5,-9.6,-9.4,-50.0,-8.1,-50.0,-7.2,-4.3,-6.8,-5.7,-6.3,-50.0,-9.5,-9.6,-8.9,-6.2,-12.8,-6.8,-11.8,],\n [-6.0,0.5,-6.1,-1.0,-8.9,-6.7,-8.9,-8.2,-4.8,-2.9,-4.4,-4.5,-12.4,-11.6,-11.2,-12.2,2.3,14.6,1.9,12.9,-5.5,-2.6,-4.1,-4.7,-1.2,3.0,-1.1,1.6,-8.0,-4.7,-8.7,-6.0,-8.2,-4.7,-7.8,-6.7,-10.0,-8.3,-8.9,-9.9,-10.8,-7.1,-10.0,-9.2,-11.6,-10.1,-12.3,-11.9,-50.0,2.2,-50.0,0.9,-7.9,-5.9,-7.4,-6.9,-50.0,-4.6,-11.6,-5.6,-9.7,-5.9,-9.9,-7.3,],\n [-1.9,-5.5,-0.6,-5.0,-6.5,-8.1,-5.6,-8.0,-3.1,-6.5,-1.9,-6.8,-10.7,-13.2,-6.9,-12.5,10.2,1.9,11.9,2.1,-2.3,-4.1,-0.5,-4.6,-0.1,-0.9,2.4,-0.8,-5.1,-6.9,-4.8,-6.7,-2.3,-7.1,-0.8,-7.2,-7.2,-8.0,-5.6,-8.5,-9.4,-9.7,-7.2,-9.8,-9.2,-11.1,-9.5,-10.7,-50.0,-8.7,-50.0,-8.6,-6.1,-7.5,-5.5,-7.7,-50.0,-10.4,-7.7,-10.0,-7.3,-13.6,-6.4,-13.3,],\n [-5.3,-1.0,-6.1,1.0,-7.8,-7.9,-8.5,-6.3,-4.3,-4.2,-4.8,-2.4,-10.7,-12.0,-9.7,-9.7,3.0,12.9,2.1,14.7,-4.9,-3.8,-4.0,-2.4,-1.0,0.8,-1.3,3.4,-7.6,-5.7,-8.1,-3.5,-6.8,-5.8,-7.2,-4.2,-8.9,-10.2,-8.4,-8.2,-9.9,-8.4,-9.7,-6.4,-11.1,-11.1,-11.8,-10.0,-50.0,0.4,-50.0,2.6,-7.2,-7.0,-7.4,-5.1,-50.0,-5.7,-9.8,-3.2,-8.4,-7.4,-8.9,-5.9,],\n [-8.5,-10.3,-10.0,-9.0,-1.4,-4.9,-3.9,-3.7,-10.0,-8.5,-10.2,-7.8,-7.8,-12.4,-8.5,-11.1,0.0,-5.5,-2.3,-4.9,12.6,10.0,11.1,10.5,-6.0,-8.3,-6.9,-7.5,-2.2,-7.4,-5.3,-5.9,-8.9,-12.5,-9.4,-11.6,-0.7,-3.9,-2.3,-3.0,-9.1,-9.8,-9.2,-9.5,-5.6,-9.0,-8.0,-8.5,-50.0,-15.3,-50.0,-14.1,2.3,-1.4,0.3,-0.5,-50.0,-13.6,-14.3,-11.5,-5.3,-13.7,-6.1,-12.7,],\n [-11.2,-8.1,-11.8,-8.8,-4.1,-1.9,-3.9,-3.5,-11.6,-5.9,-11.5,-7.9,-10.2,-10.1,-10.2,-11.2,-3.4,-2.6,-4.1,-3.8,10.0,13.1,10.7,10.6,-8.1,-5.2,-8.0,-6.7,-6.1,-3.7,-7.5,-5.6,-11.1,-10.3,-10.6,-11.9,-3.2,-1.0,-2.2,-2.8,-10.5,-8.1,-9.4,-9.5,-8.3,-6.9,-9.4,-8.8,-50.0,-11.3,-50.0,-12.8,-0.6,2.2,-0.3,0.1,-50.0,-10.1,-17.5,-11.1,-8.6,-9.9,-8.6,-11.9,],\n [-8.9,-9.4,-8.6,-8.9,-2.9,-4.5,-2.2,-3.9,-8.8,-7.5,-8.1,-7.9,-8.8,-11.6,-7.7,-11.9,-0.7,-4.1,-0.5,-4.0,11.1,10.7,13.2,10.4,-5.7,-5.8,-3.5,-6.1,-3.6,-6.5,-3.3,-5.5,-9.4,-11.0,-8.7,-11.2,-1.8,-2.7,0.7,-3.0,-9.1,-8.2,-7.3,-9.4,-7.2,-8.2,-7.2,-8.2,-50.0,-13.2,-50.0,-13.3,0.5,-0.9,1.8,-0.6,-50.0,-11.4,-11.1,-10.5,-6.1,-12.9,-5.0,-11.9,],\n [-10.8,-9.6,-11.9,-7.7,-3.3,-3.8,-4.5,-1.6,-11.7,-7.7,-12.0,-6.2,-9.6,-12.0,-9.8,-9.4,-3.2,-4.7,-4.6,-2.4,10.5,10.6,10.4,12.6,-8.2,-7.9,-9.0,-4.7,-6.1,-6.0,-7.5,-2.9,-10.9,-12.2,-11.2,-10.9,-2.4,-2.9,-2.7,-0.9,-10.4,-9.7,-10.2,-8.0,-8.4,-9.1,-9.3,-6.5,-50.0,-13.3,-50.0,-11.0,-0.0,-0.4,-0.4,2.3,-50.0,-10.9,-17.2,-8.3,-8.3,-12.7,-7.8,-9.3,],\n [2.1,-8.1,1.2,-7.0,-8.0,-9.5,-7.3,-9.9,10.5,-5.5,9.3,-5.7,-9.5,-15.1,-10.0,-12.9,2.5,-1.2,-0.1,-1.0,-6.0,-8.1,-5.7,-8.2,13.8,11.3,11.8,12.1,-6.0,-9.1,-9.0,-9.5,-8.9,-13.4,-10.0,-13.1,-9.9,-11.7,-9.8,-12.8,-5.9,-9.4,-6.5,-8.1,-10.7,-14.0,-13.3,-13.9,-50.0,-11.9,-50.0,-9.7,-8.9,-10.8,-9.0,-11.1,-50.0,-6.5,-5.3,-6.3,-10.5,-16.2,-10.4,-15.2,],\n [0.0,-5.0,0.5,-6.8,-9.1,-7.8,-7.5,-8.9,7.7,-2.4,8.2,-5.1,-11.9,-13.1,-10.4,-14.3,-0.8,3.0,-0.9,0.8,-8.3,-5.2,-5.8,-7.9,11.3,15.0,11.2,12.8,-9.7,-5.3,-9.2,-7.8,-11.7,-10.6,-10.1,-12.2,-11.7,-8.8,-8.9,-11.8,-9.3,-5.0,-8.0,-8.2,-13.6,-11.4,-12.8,-13.0,-50.0,-7.2,-50.0,-8.4,-11.0,-7.7,-8.7,-10.2,-50.0,-1.5,-7.1,-4.9,-11.2,-11.6,-11.6,-15.0,],\n [1.4,-7.3,2.2,-7.1,-8.0,-9.3,-6.4,-9.6,9.1,-5.5,10.0,-5.4,-10.9,-14.3,-8.4,-14.0,0.9,-1.1,2.4,-1.3,-6.9,-8.0,-3.5,-9.0,11.8,11.2,13.4,11.4,-7.3,-8.8,-6.5,-8.5,-10.0,-12.5,-7.8,-12.5,-9.6,-11.0,-7.1,-10.7,-7.9,-8.0,-4.3,-9.4,-11.4,-12.3,-10.9,-12.9,-50.0,-11.8,-50.0,-11.2,-9.4,-9.8,-7.3,-10.5,-50.0,-6.2,-2.2,-6.7,-9.8,-15.2,-8.5,-14.9,],\n [0.2,-6.3,0.1,-4.3,-8.2,-8.9,-8.5,-7.0,8.5,-4.1,8.0,-2.1,-10.5,-13.4,-10.2,-11.9,0.2,1.6,-0.8,3.4,-7.5,-6.7,-6.1,-4.7,12.1,12.8,11.4,14.7,-8.7,-7.4,-9.4,-5.3,-9.9,-11.8,-10.5,-10.3,-9.9,-10.1,-9.3,-9.3,-8.1,-7.2,-8.0,-5.2,-12.0,-12.1,-12.6,-10.9,-50.0,-7.9,-50.0,-5.3,-9.3,-8.8,-8.9,-7.0,-50.0,-3.6,-7.1,-1.2,-10.2,-12.7,-9.9,-11.0,],\n [-10.2,-13.4,-11.8,-12.4,-6.0,-9.4,-7.1,-8.6,-9.8,-12.9,-10.8,-12.4,2.3,-1.4,1.0,-1.0,-3.0,-8.0,-5.1,-7.6,-2.2,-6.1,-3.6,-6.1,-6.0,-9.7,-7.3,-8.7,11.2,7.9,8.9,8.1,-12.1,-17.4,-13.2,-16.8,-6.3,-9.5,-7.5,-8.8,-12.7,-15.2,-13.1,-14.2,0.0,-3.1,-1.8,-3.1,-50.0,-10.7,-50.0,-9.3,-4.6,-8.9,-5.9,-8.3,-50.0,-12.8,-9.6,-10.6,9.5,-3.2,8.2,-2.8,],\n [-13.5,-11.3,-14.0,-12.9,-9.3,-7.1,-8.2,-8.9,-12.7,-10.3,-11.9,-12.3,-0.4,1.4,-0.6,-0.4,-7.2,-4.7,-6.9,-5.7,-7.4,-3.7,-6.5,-6.0,-9.1,-5.3,-8.8,-7.4,7.9,11.9,7.8,9.3,-15.2,-15.1,-14.6,-17.2,-9.7,-7.3,-8.2,-9.2,-15.0,-12.8,-14.1,-14.9,-2.8,0.2,-2.9,-2.3,-50.0,-7.4,-50.0,-8.7,-9.4,-7.3,-9.4,-9.4,-50.0,-8.0,-11.9,-9.7,6.5,0.5,6.4,-1.8,],\n [-13.0,-14.4,-11.9,-13.9,-7.7,-9.0,-6.7,-8.8,-11.7,-12.7,-10.7,-13.1,-0.2,-1.6,1.7,-1.6,-5.7,-8.7,-4.8,-8.1,-5.3,-7.5,-3.3,-7.5,-9.0,-9.2,-6.5,-9.4,8.9,7.8,10.1,7.8,-14.3,-17.7,-13.0,-17.8,-8.0,-9.4,-6.2,-9.2,-15.1,-14.9,-12.2,-14.9,-1.8,-3.2,-0.8,-3.2,-50.0,-10.8,-50.0,-9.9,-7.3,-9.6,-6.4,-9.4,-50.0,-12.3,-8.7,-11.3,7.6,-3.3,8.7,-2.9,],\n [-12.5,-12.9,-13.4,-10.0,-8.5,-9.0,-7.8,-6.8,-11.8,-11.3,-12.4,-10.1,-0.3,-0.5,-0.5,1.2,-6.1,-6.0,-6.7,-3.5,-5.9,-5.6,-5.5,-2.9,-9.5,-7.8,-8.5,-5.3,8.1,9.3,7.8,11.8,-14.4,-15.7,-14.5,-14.6,-8.4,-8.7,-7.9,-7.1,-14.3,-13.8,-13.8,-12.3,-2.4,-2.2,-2.9,-0.2,-50.0,-8.9,-50.0,-7.1,-8.1,-9.1,-8.7,-6.6,-50.0,-9.7,-11.4,-8.0,6.8,-1.8,6.9,0.4,],\n [-2.6,-6.3,-4.9,-4.9,-6.4,-9.4,-7.9,-8.6,-6.3,-7.4,-8.2,-6.6,-9.7,-14.9,-11.1,-13.9,-0.2,-8.2,-2.3,-6.8,-8.9,-11.1,-9.4,-10.9,-8.9,-11.7,-10.0,-9.9,-12.1,-15.2,-14.3,-14.4,11.1,2.9,9.2,3.5,-3.0,-7.0,-4.3,-6.2,-2.2,-6.6,-3.7,-5.7,-6.0,-10.4,-8.6,-9.5,-50.0,-15.5,-50.0,-13.9,-7.8,-10.5,-8.7,-9.6,-50.0,-16.5,-17.1,-14.8,-12.1,-18.9,-12.4,-17.4,],\n [-8.5,0.8,-9.1,-0.7,-10.1,-7.5,-9.1,-8.2,-11.4,-3.1,-11.8,-4.4,-15.5,-14.3,-14.8,-15.4,-6.6,-4.7,-7.1,-5.8,-12.5,-10.3,-11.0,-12.2,-13.4,-10.6,-12.5,-11.8,-17.4,-15.1,-17.7,-15.7,2.9,12.5,3.1,10.3,-7.7,-5.2,-6.2,-7.3,-5.4,-1.7,-5.4,-3.7,-11.6,-9.1,-13.0,-10.8,-50.0,-10.3,-50.0,-11.2,-9.8,-8.3,-9.1,-9.7,-50.0,-12.7,-20.6,-13.1,-16.0,-16.6,-17.0,-18.4,],\n [-5.0,-6.4,-3.4,-5.6,-7.5,-9.3,-7.1,-8.8,-8.8,-7.4,-6.9,-6.9,-11.4,-15.2,-9.7,-13.7,-1.8,-7.8,-0.8,-7.2,-9.4,-10.6,-8.7,-11.2,-10.0,-10.1,-7.8,-10.5,-13.2,-14.6,-13.0,-14.5,9.2,3.1,10.8,3.0,-4.5,-6.7,-2.7,-6.7,-5.0,-6.8,-2.5,-6.7,-7.5,-10.4,-7.4,-10.2,-50.0,-15.5,-50.0,-14.2,-8.9,-10.2,-8.5,-10.0,-50.0,-15.6,-15.3,-15.5,-13.0,-18.8,-12.6,-18.3,],\n [-8.1,-1.1,-8.9,1.4,-8.6,-9.2,-9.4,-6.8,-11.0,-4.9,-11.5,-2.6,-13.7,-16.8,-14.5,-12.6,-6.0,-6.7,-7.2,-4.2,-11.6,-11.9,-11.2,-10.9,-13.1,-12.2,-12.5,-10.3,-16.8,-17.2,-17.8,-14.6,3.5,10.3,3.0,12.4,-6.9,-7.5,-6.8,-4.9,-5.4,-4.2,-5.4,-1.3,-10.8,-11.5,-12.4,-8.2,-50.0,-12.5,-50.0,-8.9,-9.2,-10.0,-9.4,-7.9,-50.0,-14.3,-19.9,-11.4,-16.2,-19.2,-15.8,-15.9,],\n [-6.3,-7.4,-8.0,-6.0,2.8,-0.7,0.9,0.3,-7.5,-4.4,-8.4,-3.6,-3.0,-7.7,-3.7,-6.2,-5.3,-10.0,-7.2,-8.9,-0.7,-3.2,-1.8,-2.4,-9.9,-11.7,-9.6,-9.9,-6.3,-9.7,-8.0,-8.4,-3.0,-7.7,-4.5,-6.9,11.3,8.2,9.4,9.1,-1.0,-3.3,-1.8,-2.4,1.5,-2.1,-0.4,-1.1,-50.0,-14.5,-50.0,-12.9,2.8,-0.0,1.4,0.7,-50.0,-8.7,-14.1,-7.5,-5.2,-12.5,-6.5,-10.7,],\n [-9.9,-5.0,-10.0,-6.5,-0.7,2.6,-0.2,0.1,-10.3,-1.8,-9.9,-3.8,-6.4,-4.7,-5.8,-6.7,-8.2,-8.3,-8.0,-10.2,-3.9,-1.0,-2.7,-2.9,-11.7,-8.8,-11.0,-10.1,-9.5,-7.3,-9.4,-8.7,-7.0,-5.2,-6.7,-7.5,8.2,11.6,8.8,9.1,-3.7,-0.9,-3.1,-3.0,-2.0,1.2,-2.3,-1.3,-50.0,-12.1,-50.0,-12.6,0.1,2.5,0.7,0.6,-50.0,-6.0,-14.8,-7.5,-8.6,-9.4,-8.5,-11.2,],\n [-7.5,-6.2,-7.2,-6.2,0.9,0.2,2.5,0.2,-8.3,-3.5,-7.1,-3.7,-4.1,-6.3,-3.1,-6.3,-5.7,-8.9,-5.6,-8.4,-2.3,-2.2,0.7,-2.7,-9.8,-8.9,-7.1,-9.3,-7.5,-8.2,-6.2,-7.9,-4.3,-6.2,-2.7,-6.8,9.4,8.8,12.1,8.8,-2.1,-2.0,0.1,-2.4,0.0,-1.1,1.3,-0.8,-50.0,-11.9,-50.0,-12.6,1.2,0.7,3.5,0.8,-50.0,-7.1,-12.4,-7.1,-7.1,-10.6,-5.0,-10.6,],\n [-9.0,-6.5,-10.0,-4.8,0.1,-0.1,-0.3,2.4,-9.9,-3.5,-10.6,-2.0,-5.4,-6.6,-5.6,-4.4,-7.6,-9.9,-8.5,-8.2,-3.0,-2.8,-3.0,-0.9,-12.8,-11.8,-10.7,-9.3,-8.8,-9.2,-9.2,-7.1,-6.2,-7.3,-6.7,-4.9,9.1,9.1,8.8,11.2,-3.1,-3.0,-3.3,-1.0,-1.1,-1.4,-2.0,1.2,-50.0,-12.8,-50.0,-10.9,0.8,0.5,0.7,2.3,-50.0,-7.5,-16.5,-5.9,-7.8,-11.1,-7.8,-9.0,],\n [-7.1,-5.6,-9.1,-5.1,-5.9,-8.0,-6.9,-7.4,-1.9,-1.6,-4.7,-1.4,-9.6,-14.6,-10.4,-13.0,-6.7,-10.8,-9.4,-9.9,-9.1,-10.5,-9.1,-10.4,-5.9,-9.3,-7.9,-8.1,-12.7,-15.0,-15.1,-14.3,-2.2,-5.4,-5.0,-5.4,-1.0,-3.7,-2.1,-3.1,12.8,9.6,11.1,10.1,-4.8,-9.4,-8.1,-8.6,-50.0,-18.3,-50.0,-15.4,-5.9,-7.5,-6.6,-7.1,-50.0,-9.5,-11.7,-8.4,-12.5,-17.3,-13.2,-15.4,],\n [-10.2,-1.6,-10.2,-3.2,-7.3,-4.6,-6.5,-6.2,-6.7,3.0,-6.8,0.8,-11.9,-10.8,-11.5,-12.2,-9.6,-7.1,-9.7,-8.4,-9.8,-8.1,-8.2,-9.7,-9.4,-5.0,-8.0,-7.2,-15.2,-12.8,-14.9,-13.8,-6.6,-1.7,-6.8,-4.2,-3.3,-0.9,-2.0,-3.0,9.6,12.8,9.7,10.5,-8.5,-5.6,-9.3,-7.8,-50.0,-12.7,-50.0,-13.8,-6.8,-5.1,-5.3,-6.5,-50.0,-4.1,-12.8,-5.8,-14.4,-14.1,-13.6,-14.8,],\n [-8.2,-4.7,-7.1,-5.0,-6.5,-7.7,-5.5,-6.9,-4.1,-0.8,-1.2,-0.9,-10.5,-12.8,-8.2,-13.0,-7.5,-10.0,-7.2,-9.7,-9.2,-9.4,-7.3,-10.2,-6.5,-8.0,-4.3,-8.0,-13.1,-14.1,-12.2,-13.8,-3.7,-5.4,-2.5,-5.4,-1.8,-3.1,0.1,-3.3,11.1,9.7,12.9,9.8,-5.5,-8.1,-5.4,-7.8,-50.0,-16.4,-50.0,-14.8,-5.9,-7.1,-4.7,-7.2,-50.0,-8.4,-6.4,-8.1,-12.1,-16.2,-10.3,-15.8,],\n [-9.2,-3.0,-9.9,-1.2,-6.5,-6.1,-6.8,-4.4,-6.4,0.9,-7.0,3.0,-11.8,-13.0,-11.1,-10.4,-9.3,-9.2,-9.8,-6.4,-9.5,-9.5,-9.4,-8.0,-8.1,-8.2,-9.4,-5.2,-14.2,-14.9,-14.9,-12.3,-5.7,-3.7,-6.7,-1.3,-2.4,-3.0,-2.4,-1.0,10.1,10.5,9.8,13.1,-7.2,-8.0,-8.4,-5.0,-50.0,-14.7,-50.0,-11.4,-6.3,-6.7,-5.8,-5.0,-50.0,-6.1,-13.4,-3.6,-13.0,-16.0,-13.7,-13.3,],\n [-8.2,-10.8,-10.1,-9.8,-0.4,-3.6,-1.7,-2.9,-7.9,-8.4,-9.8,-8.2,6.2,2.3,0.6,2.9,-7.1,-11.6,-9.2,-11.1,-5.6,-8.3,-7.2,-8.4,-10.7,-13.6,-11.4,-12.0,0.0,-2.8,-1.8,-2.4,-6.0,-11.6,-7.5,-10.8,1.5,-2.0,0.0,-1.1,-4.8,-8.5,-5.5,-7.2,11.9,8.6,10.0,9.0,-50.0,-14.2,-50.0,-12.8,-4.1,-7.4,-5.7,-6.5,-50.0,-11.0,-14.3,-9.9,1.4,-7.9,-0.7,-6.8,],\n [-12.5,-8.7,-13.0,-9.9,-3.9,-1.0,-3.4,-2.9,-12.5,-6.3,-11.6,-8.1,3.3,6.0,-1.6,3.8,-10.5,-10.1,-11.1,-11.1,-9.0,-6.9,-8.2,-9.1,-14.0,-11.4,-12.3,-12.1,-3.1,0.2,-3.2,-2.2,-10.4,-9.1,-10.4,-11.5,-2.1,1.2,-1.1,-1.4,-9.4,-5.6,-8.1,-8.0,8.6,12.4,8.6,9.5,-50.0,-10.4,-50.0,-11.6,-7.2,-5.7,-7.5,-7.4,-50.0,-8.6,-15.7,-9.7,-3.0,-3.7,-3.2,-5.9,],\n [-11.1,-11.9,-10.6,-11.3,-2.6,-4.1,-1.7,-3.5,-11.4,-9.6,-9.6,-9.2,3.7,2.5,1.6,2.5,-9.6,-12.3,-9.5,-11.8,-8.0,-9.4,-7.2,-9.3,-13.3,-12.8,-10.9,-12.6,-1.8,-2.9,-0.8,-2.9,-8.6,-13.0,-7.4,-12.4,-0.4,-2.3,1.3,-2.0,-8.1,-9.3,-5.4,-8.4,10.0,8.6,11.4,8.9,-50.0,-13.7,-50.0,-13.2,-6.1,-8.1,-5.5,-7.5,-50.0,-11.3,-12.7,-10.1,-1.6,-7.8,-0.3,-7.2,],\n [-11.4,-10.0,-12.7,-8.2,-3.1,-3.1,-2.8,-0.9,-11.7,-7.3,-12.1,-5.8,3.6,3.6,-1.1,5.8,-9.4,-11.9,-10.7,-10.0,-8.5,-8.8,-8.2,-6.5,-13.9,-13.0,-12.9,-10.9,-3.1,-2.3,-3.2,-0.2,-9.5,-10.8,-10.2,-8.2,-1.1,-1.3,-0.8,1.2,-8.6,-7.8,-7.8,-5.0,9.0,9.5,8.9,12.0,-50.0,-13.0,-50.0,-10.3,-6.2,-7.0,-7.1,-5.4,-50.0,-9.3,-14.0,-8.2,-2.4,-6.3,-2.4,-3.9,],\n [-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,33.3,-50.0,30.6,-50.0,-50.0,-50.0,-50.0,-50.0,29.2,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,],\n [-14.8,-6.2,-14.9,-7.6,-14.6,-11.6,-13.0,-12.2,-14.0,-9.0,-14.1,-10.1,-13.6,-11.2,-12.4,-12.5,-8.1,2.2,-8.7,0.4,-15.3,-11.3,-13.2,-13.3,-11.9,-7.2,-11.8,-7.9,-10.7,-7.4,-10.8,-8.9,-15.5,-10.3,-15.5,-12.5,-14.5,-12.1,-11.9,-12.8,-18.3,-12.7,-16.4,-14.7,-14.2,-10.4,-13.7,-13.0,-50.0,15.1,-50.0,13.3,-9.9,-5.8,-8.9,-7.6,-50.0,-1.5,-7.8,-3.0,-8.1,3.6,-9.4,2.0,],\n [-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,30.6,-50.0,35.2,-50.0,-50.0,-50.0,-50.0,-50.0,28.5,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,],\n [-13.8,-7.5,-14.4,-5.1,-12.6,-11.6,-11.5,-10.1,-13.2,-9.7,-12.7,-7.4,-11.9,-11.9,-11.5,-10.2,-7.2,0.9,-8.6,2.6,-14.1,-12.8,-13.3,-11.0,-9.7,-8.4,-11.2,-5.3,-9.3,-8.7,-9.9,-7.1,-13.9,-11.2,-14.2,-8.9,-12.9,-12.6,-12.6,-10.9,-15.4,-13.8,-14.8,-11.4,-12.8,-11.6,-13.2,-10.3,-50.0,13.3,-50.0,15.2,-8.6,-7.0,-8.4,-4.8,-50.0,-3.0,-7.1,-0.1,-7.3,2.3,-8.7,3.9,],\n [-7.3,-6.3,-8.9,-5.5,2.9,0.2,1.5,1.2,-8.5,-2.3,-10.0,-1.7,-5.6,-10.5,-5.5,-9.6,-4.3,-7.9,-6.1,-7.2,2.3,-0.6,0.5,-0.0,-8.9,-11.0,-9.4,-9.3,-4.6,-9.4,-7.3,-8.1,-7.8,-9.8,-8.9,-9.2,2.8,0.1,1.2,0.8,-5.9,-6.8,-5.9,-6.3,-4.1,-7.2,-6.1,-6.2,-50.0,-9.9,-50.0,-8.6,12.5,9.4,11.0,9.8,-50.0,-4.8,-8.7,-3.5,-0.0,-8.6,-2.1,-7.0,],\n [-10.1,-4.3,-10.8,-5.8,0.1,2.3,0.7,0.6,-10.4,-0.2,-10.8,-2.0,-8.8,-9.2,-8.0,-9.7,-6.8,-5.9,-7.5,-7.0,-1.4,2.2,-0.9,-0.4,-10.8,-7.7,-9.8,-8.8,-8.9,-7.3,-9.6,-9.1,-10.5,-8.3,-10.2,-10.0,-0.0,2.5,0.7,0.5,-7.5,-5.1,-7.1,-6.7,-7.4,-5.7,-8.1,-7.0,-50.0,-5.8,-50.0,-7.0,9.4,12.7,10.1,10.0,-50.0,-1.5,-11.3,-3.3,-5.4,-4.2,-5.6,-6.8,],\n [-8.4,-6.2,-8.9,-5.9,1.8,0.4,2.7,1.2,-9.1,-1.2,-8.8,-1.5,-7.2,-10.5,-4.9,-9.6,-5.7,-7.4,-5.5,-7.4,0.3,-0.3,1.8,-0.4,-9.0,-8.7,-7.3,-8.9,-5.9,-9.4,-6.4,-8.7,-8.7,-9.1,-8.5,-9.4,1.4,0.7,3.5,0.7,-6.6,-5.3,-4.7,-5.8,-5.7,-7.5,-5.5,-7.1,-50.0,-8.9,-50.0,-8.4,11.0,10.1,13.2,10.2,-50.0,-4.2,-6.1,-3.6,-3.5,-8.4,-1.2,-6.8,],\n [-9.1,-5.4,-10.4,-4.2,1.0,0.5,0.6,2.4,-9.6,-1.5,-10.5,-0.5,-8.9,-10.5,-7.2,-8.3,-6.3,-6.9,-7.7,-5.1,-0.5,0.1,-0.6,2.3,-11.1,-10.2,-10.5,-7.0,-8.3,-9.4,-9.4,-6.6,-9.6,-9.7,-10.0,-7.9,0.7,0.6,0.8,2.3,-7.1,-6.5,-7.2,-5.0,-6.5,-7.4,-7.5,-5.4,-50.0,-7.6,-50.0,-4.8,9.8,10.0,10.2,12.1,-50.0,-3.1,-11.4,-0.7,-4.6,-6.6,-4.9,-3.9,],\n [-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,29.2,-50.0,28.5,-50.0,-50.0,-50.0,-50.0,-50.0,33.3,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,-50.0,],\n [-13.0,-7.0,-13.1,-8.3,-9.2,-6.5,-8.9,-7.6,-9.8,-0.7,-9.2,-2.1,-12.4,-10.3,-12.4,-11.6,-9.5,-4.6,-10.4,-5.7,-13.6,-10.1,-11.4,-10.9,-6.5,-1.5,-6.2,-3.6,-12.8,-8.0,-12.3,-9.7,-16.5,-12.7,-15.6,-14.3,-8.7,-6.0,-7.1,-7.5,-9.5,-4.1,-8.4,-6.1,-11.0,-8.6,-11.3,-9.3,-50.0,-1.5,-50.0,-3.0,-4.8,-1.5,-4.2,-3.1,-50.0,16.4,-5.1,14.2,-10.1,-4.3,-10.0,-5.4,],\n [-13.5,-16.3,-11.8,-15.5,-13.6,-15.3,-12.1,-16.1,-7.7,-13.3,-4.2,-12.6,-14.1,-16.2,-10.3,-15.4,-9.6,-11.6,-7.7,-9.8,-14.3,-17.5,-11.1,-17.2,-5.3,-7.1,-2.2,-7.1,-9.6,-11.9,-8.7,-11.4,-17.1,-20.6,-15.3,-19.9,-14.1,-14.8,-12.4,-16.5,-11.7,-12.8,-6.4,-13.4,-14.3,-15.7,-12.7,-14.0,-50.0,-7.8,-50.0,-7.1,-8.7,-11.3,-6.1,-11.4,-50.0,-5.1,18.6,-4.8,-8.6,-8.1,-4.5,-7.3,],\n [-12.4,-8.2,-13.0,-5.9,-7.7,-7.8,-7.4,-5.8,-8.8,-2.0,-9.3,-0.4,-11.6,-11.3,-11.6,-9.4,-8.9,-5.6,-10.0,-3.2,-11.5,-11.1,-10.5,-8.3,-6.3,-4.9,-6.7,-1.2,-10.6,-9.7,-11.3,-8.0,-14.8,-13.1,-15.5,-11.4,-7.5,-7.5,-7.1,-5.9,-8.4,-5.8,-8.1,-3.6,-9.9,-9.7,-10.1,-8.2,-50.0,-3.0,-50.0,-0.1,-3.5,-3.3,-3.6,-0.7,-50.0,14.2,-4.8,16.4,-8.9,-5.8,-8.9,-3.4,],\n [-10.7,-13.2,-12.4,-11.6,-4.8,-8.4,-6.1,-7.2,-10.3,-11.8,-11.0,-11.6,2.8,-1.7,0.7,-1.1,-6.2,-9.7,-7.3,-8.4,-5.3,-8.6,-6.1,-8.3,-10.5,-11.2,-9.8,-10.2,9.5,6.5,7.6,6.8,-12.1,-16.0,-13.0,-16.2,-5.2,-8.6,-7.1,-7.8,-12.5,-14.4,-12.1,-13.0,1.4,-3.0,-1.6,-2.4,-50.0,-8.1,-50.0,-7.3,-0.0,-5.4,-3.5,-4.6,-50.0,-10.1,-8.6,-8.9,13.2,-0.9,9.7,-0.3,],\n [-18.1,-12.3,-19.4,-14.2,-12.2,-9.5,-11.5,-10.8,-17.9,-11.9,-18.2,-13.9,-6.4,-3.7,-6.8,-5.4,-12.8,-5.9,-13.6,-7.4,-13.7,-9.9,-12.9,-12.7,-16.2,-11.6,-15.2,-12.7,-3.2,0.5,-3.3,-1.8,-18.9,-16.6,-18.8,-19.2,-12.5,-9.4,-10.6,-11.1,-17.3,-14.1,-16.2,-16.0,-7.9,-3.7,-7.8,-6.3,-50.0,3.6,-50.0,2.3,-8.6,-4.2,-8.4,-6.6,-50.0,-4.3,-8.1,-5.8,-0.9,14.2,-1.8,11.6,],\n [-11.8,-13.1,-11.5,-12.0,-6.2,-8.3,-5.4,-7.4,-11.8,-12.3,-11.1,-11.4,0.5,-2.5,2.4,-1.6,-6.8,-9.9,-6.4,-8.9,-6.1,-8.6,-5.0,-7.8,-10.4,-11.6,-8.5,-9.9,8.2,6.4,8.7,6.9,-12.4,-17.0,-12.6,-15.8,-6.5,-8.5,-5.0,-7.8,-13.2,-13.6,-10.3,-13.7,-0.7,-3.2,-0.3,-2.4,-50.0,-9.4,-50.0,-8.7,-2.1,-5.6,-1.2,-4.9,-50.0,-10.0,-4.5,-8.9,9.7,-1.8,11.3,-0.9,],\n [-17.2,-13.3,-17.8,-11.6,-11.0,-11.1,-10.4,-9.0,-16.0,-12.7,-16.1,-11.1,-5.2,-5.4,-6.0,-3.3,-11.8,-7.3,-13.3,-5.9,-12.7,-11.9,-11.9,-9.3,-15.2,-15.0,-14.9,-11.0,-2.8,-1.8,-2.9,0.4,-17.4,-18.4,-18.3,-15.9,-10.7,-11.2,-10.6,-9.0,-15.4,-14.8,-15.8,-13.3,-6.8,-5.9,-7.2,-3.9,-50.0,2.0,-50.0,3.9,-7.0,-6.8,-6.8,-3.9,-50.0,-5.4,-7.3,-3.4,-0.3,11.6,-0.9,14.1,]];\n\n private TRANS:Array<Array<number>> = [[5,0,0,4],\n [0,5,4,0],\n [0,4,5,0],\n [4,0,0,5]];\n\n private CONBLO: {[id:string]:number} = {'A':0,'R':1,'N':2,'D':3,'C':4,'Q':5,'E':6,'G':7,'H':8,'I':9,'L':10,'K':11,'M':12,'F':13,'P':14,'S':15,'T':16,'W':17,'Y':18,'V':19,'B':20,'Z':21,'X':22,'*':23};\n private CONNUCL: {[id:string]:number} = {'A':0,'T':1,'C':2,'G':3};\n private CONSCHN: {[id:string]:number} = {'AAA':0,'AAC':1,'AAG':2,'AAT':3,'ACA':4,'ACC':5,'ACG':6,'ACT':7,'AGA':8,'AGC':9,'AGG':10,'AGT':11,'ATA':12,'ATC':13,'ATG':14,'ATT':15,'CAA':16,'CAC':17,'CAG':18,'CAT':19,'CCA':20,'CCC':21,'CCG':22,'CCT':23,'CGA':24,'CGC':25,'CGG':26,'CGT':27,'CTA':28,'CTC':29,'CTG':30,'CTT':31,'GAA':32,'GAC':33,'GAG':34,'GAT':35,'GCA':36,'GCC':37,'GCG':38,'GCT':39,'GGA':40,'GGC':41,'GGG':42,'GGT':43,'GTA':44,'GTC':45,'GTG':46,'GTT':47,'TAA':48,'TAC':49,'TAG':50,'TAT':51,'TCA':52,'TCC':53,'TCG':54,'TCT':55,'TGA':56,'TGC':57,'TGG':58,'TGT':59,'TTA':60,'TTC':61,'TTG':62,'TTT':63};\n private fillNeedleman(){\n for(let i: number = 0; i<= this.len1; i++){\n this.dpGrid[i][0].value = -i*this.gap;\n this.dpGrid[i][0].parentI = i-1;\n this.dpGrid[i][0].parentJ = 0;\n }\n\n for(let i: number = 1; i<= this.len2; i++){\n this.dpGrid[0][i].value = -i*this.gap;\n this.dpGrid[0][i].parentI = 0;\n this.dpGrid[0][i].parentJ = i-1;\n }\n }\n\n private fillOne(i: number, j: number){\n this.dpGrid[i][j].value = Math.max(this.dpGrid[i-1][j-1].value+this.scores[i-1][j-1],Math.max(this.dpGrid[i-1][j].value-this.gap, this.dpGrid[i][j-1].value-this.gap));\n if(this.dpGrid[i][j].value == this.dpGrid[i-1][j-1].value+this.scores[i-1][j-1]){\n this.dpGrid[i][j].parentI = i-1;\n this.dpGrid[i][j].parentJ = j-1;\n }else if(this.dpGrid[i][j].value == this.dpGrid[i-1][j].value-this.gap){\n this.dpGrid[i][j].parentI = i-1;\n this.dpGrid[i][j].parentJ = j;\n }else{\n this.dpGrid[i][j].parentI = i;\n this.dpGrid[i][j].parentJ = j-1;\n }\n }\n\n private gridFromName (path: string){\n switch(path){\n case 'BLOSUM45':\n this.alignGrid = this.BLOSUM45;\n this.connections = this.CONBLO;\n this.step = 1;\n break;\n case 'BLOSUM50':\n this.alignGrid = this.BLOSUM50;\n this.connections = this.CONBLO;\n this.step = 1;\n break;\n case 'BLOSUM62':\n this.alignGrid = this.BLOSUM62;\n this.connections = this.CONBLO;\n this.step = 1;\n break;\n case 'BLOSUM80':\n this.alignGrid = this.BLOSUM80;\n this.connections = this.CONBLO;\n this.step = 1;\n break;\n case 'BLOSUM90':\n this.alignGrid = this.BLOSUM90;\n this.connections = this.CONBLO;\n this.step = 1;\n break;\n case 'PAM30':\n this.alignGrid = this.PAM30;\n this.connections = this.CONBLO;\n this.step = 1;\n break;\n case 'PAM70':\n this.alignGrid = this.PAM70;\n this.connections = this.CONBLO;\n this.step = 1;\n break;\n case 'PAM250':\n this.alignGrid = this.PAM250;\n this.connections = this.CONBLO;\n this.step = 1;\n break;\n case 'NUCLEOTIDES':\n this.alignGrid = this.NUCLEOTIDES;\n this.connections = this.CONNUCL;\n this.step = 1;\n break;\n case 'TRANS':\n this.alignGrid = this.TRANS;\n this.connections = this.CONNUCL;\n this.step = 1;\n break;\n case 'SCHNEIDER':\n this.alignGrid = this.SCHNEIDER;\n this.connections = this.CONSCHN;\n this.step = 3;\n break;\n \n }\n this.fillScores();\n \n }\n\n private constructResult(i: number, j: number): Aligned{\n let res1:string = \"\", res2:string =\"\",gapS:string =\"\";\n let total: number = this.dpGrid[i][j].value;\n for(let i:number = 0; i< this.step; i++){\n gapS+='|';\n }\n while(i>0 || j>0){\n if(this.dpGrid[i][j].parentI == i) {\n res1 = gapS+res1;\n res2 = this.seq2.substr((j-1)*this.step,this.step)+res2;\n }\n else if(this.dpGrid[i][j].parentJ == j){\n res2 = gapS+res2;\n res1 = this.seq1.substr((i-1)*this.step,this.step)+res1;\n }\n else{\n if(i-1>=0)res1 = this.seq1.substr((i-1)*this.step,this.step)+res1;\n else res1 = gapS+res1;\n if(j-1>=0)res2 = this.seq2.substr((j-1)*this.step,this.step)+res2;\n else res2 = gapS+res2;\n }\n let tempI: number = i;\n i=this.dpGrid[i][j].parentI;\n j=this.dpGrid[tempI][j].parentJ;\n }\n return new Aligned(res1,res2, total);\n }\n\n private fillScores(){\n this.scores = [];\n for(let i: number = 0; i < this.len1; i++){\n this.scores.push([]);\n for(let j:number = 0; j < this.len2; j++){\n\n this.scores[i].push(this.alignGrid[this.connections[this.seq1.substr(i*this.step,this.step)]][this.connections[this.seq2.substr(j*this.step,this.step)]]);\n }\n }\n }\n\n private typeRec():string{\n if(/[ATGC]*/.test(this.seq1) && /[ATGC]*/.test(this.seq2)) return \"NUCLEOTIDES\";\n if (/[ARNDCQEGHILKMFPSTWYVBZX*]*/.test(this.seq1) && /[ARNDCQEGHILKMFPSTWYVBZX*]*/.test(this.seq2)) return \"BLOSUM62\";\n throw Error(\"Can't recognize sequence type\");\n }\n\n\n public needlemanWunch():Aligned{\n this.dpGrid=[];\n for (let i:number = 0 ; i<this.len1+1;i++){\n let row : Cell[] =[]\n for(let j: number = 0; j<this.len2+1; j++)\n row.push(new Cell());\n this.dpGrid.push(row);\n }\n this.fillNeedleman();\n for(let i:number = 1; i<= this.len1; i++){\n for(let j: number =1; j<=this.len2;j++){\n this.fillOne(i,j);\n }\n }\n return this.constructResult(this.len1,this.len2);\n }\n\n public smithWaterman():Aligned{\n this.dpGrid=[]\n for (let i:number = 0 ; i<this.len1+1;i++){\n let row : Cell[] =[]\n for(let j: number = 0; j<this.len2+1; j++)\n row.push(new Cell());\n this.dpGrid.push(row);\n }\n let bestVal:number=0;\n let bestI:number=0, bestJ:number=0;\n for(let i:number = 1; i<= this.len1; i++){\n for(let j:number =1; j<=this.len2;j++){\n this.fillOne(i,j);\n if(this.dpGrid[i][j].value <= 0){\n this.dpGrid[i][j].value = 0;\n this.dpGrid[i][j].parentI = 0;\n this.dpGrid[i][j].parentJ = 0;\n }\n else if(this.dpGrid[this.dpGrid[i][j].parentI][this.dpGrid[i][j].parentJ].value == 0){\n this.dpGrid[i][j].parentI = 0;\n this.dpGrid[i][j].parentJ = 0;\n }\n if(this.dpGrid[i][j].value > bestVal){\n bestVal = this.dpGrid[i][j].value;\n bestI = i;\n bestJ = j;\n }\n }\n }\n return this.constructResult(bestI, bestJ);\n }\n\n public setSequences( seq1_: string, seq2_: string){\n this.seq1 = seq1_;\n this.seq2 = seq2_;\n this.len1 = this.seq1.length/this.step;\n this.len2 = this.seq2.length/this.step;\n this.fillScores();\n }\n\n public setGap( gap_:number){\n this.gap = gap_;\n }\n\n public setMethod( alignGrid_ : string= \"\"){\n if(alignGrid_ == \"AUTO\"){\n alignGrid_ = this.typeRec();\n }\n this.gridFromName(alignGrid_);\n }\n\n public constructor( seq1_:string, seq2_:string, gap_:number, alignGrid_:string = \"\"){\n this.setMethod(alignGrid_);\n this.setSequences(seq1_, seq2_);\n this.setGap(gap_);\n }\n}","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {getMonomericMols} from '../calculations/monomerLevelMols';\nimport {updateDivInnerHTML} from '../utils/ui-utils';\nimport {delay} from '@datagrok-libraries/utils/src/test';\nimport {TAGS as bioTAGS, NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\n\nexport const MONOMER_MOLS_COL = 'monomeric-mols';\n\nexport const enum MONOMERIC_COL_TAGS {\n MONOMERIC_MOLS = 'monomeric-mols',\n LAST_INVALIDATED_VERSION = 'last-invalidated-version',\n MONOMERS_DICT = 'monomers-dict'\n}\n\nconst SUBSTR_HELM_COL_NAME = 'substr_helm';\n\n/**\n * Searches substructure in each row of Macromolecule column\n *\n * @param {DG.column} col Column with 'Macromolecule' semantic type\n */\nexport function substructureSearchDialog(col: DG.Column<string>): void {\n const units = col.getTag(DG.TAGS.UNITS);\n const separator = col.getTag(bioTAGS.separator);\n // const notations = [NOTATION.FASTA, NOTATION.SEPARATOR, NOTATION.HELM];\n\n const substructureInput = ui.textInput('Substructure', '');\n\n const editHelmLink = ui.link('Edit helm', async () => {\n updateDivInnerHTML(inputsDiv, grid.root);\n await ui.tools.waitForElementInDom(grid.root);\n setTimeout(() => {\n grid.cell(SUBSTR_HELM_COL_NAME, 0).element.children[0].dispatchEvent(\n new KeyboardEvent('keydown', {key: 'Enter'}));\n }, 100);\n });\n\n const df = DG.DataFrame.create(1);\n df.columns.addNewString(SUBSTR_HELM_COL_NAME).init((i) => '');\n df.col(SUBSTR_HELM_COL_NAME)!.semType = col.semType;\n df.col(SUBSTR_HELM_COL_NAME)!.setTag(DG.TAGS.UNITS, NOTATION.HELM);\n const grid = df.plot.grid();\n const separatorInput = ui.textInput('Separator', separator);\n\n const inputsDiv = ui.div();\n\n const inputs = units === NOTATION.HELM ? ui.divV([editHelmLink]) :\n units === NOTATION.SEPARATOR ? ui.inputs([substructureInput, separatorInput]) :\n ui.inputs([substructureInput]);\n\n updateDivInnerHTML(inputsDiv, inputs);\n\n ui.dialog('Substructure Search')\n .add(ui.divV([\n ui.divText(`Notation: ${units}`),\n inputsDiv\n ]))\n .onOK(async () => {\n let substructure = units === NOTATION.HELM ? df.get(SUBSTR_HELM_COL_NAME, 0) : substructureInput.value;\n if (units === NOTATION.SEPARATOR && separatorInput.value !== separator && separatorInput.value !== '')\n substructure = substructure.replaceAll(separatorInput.value, separator);\n const matchesColName = `Matches: ${substructure}`;\n const colExists = col.dataFrame.columns.names()\n .filter((it) => it.toLocaleLowerCase() === matchesColName.toLocaleLowerCase()).length > 0;\n if (!colExists) {\n let matches: DG.BitSet;\n if (units === NOTATION.HELM)\n matches = await helmSubstructureSearch(substructure, col);\n else\n matches = linearSubstructureSearch(substructure, col);\n col.dataFrame.columns.add(DG.Column.fromBitSet(matchesColName, matches));\n } else { grok.shell.warning(`Search ${substructure} is already performed`); }\n })\n .show();\n}\n\nexport function linearSubstructureSearch(substructure: string, col: DG.Column<string>, separator?: string): DG.BitSet {\n const re = separator ? prepareSubstructureRegex(substructure, separator) : substructure;\n const resultArray = DG.BitSet.create(col.length);\n for (let i = 0; i < col.length; i++) {\n const macromolecule: string = col.get(i)!;\n if (macromolecule.match(re) || macromolecule === substructure)\n resultArray.set(i, true, false);\n }\n return resultArray;\n}\n\nfunction prepareSubstructureRegex(substructure: string, separator: string) {\n const char = `${separator}`.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\n const startsWithSep = substructure.charAt(0) === separator;\n const endsWithSep = substructure.charAt(substructure.length - 1) === separator;\n const substrWithoutSep = substructure.replace(new RegExp(`^${char}|${char}$`, 'g'), '');\n const re = startsWithSep ?\n endsWithSep ? `${char}${substrWithoutSep}${char}` :\n `${char}${substrWithoutSep}${char}|${char}${substrWithoutSep}$` :\n endsWithSep ? `^${substrWithoutSep}${char}|${char}${substrWithoutSep}${char}` :\n `^${substrWithoutSep}${char}|${char}${substrWithoutSep}${char}|${char}${substrWithoutSep}$`;\n return re;\n}\n\nexport async function helmSubstructureSearch(substructure: string, col: DG.Column<string>): Promise<DG.BitSet> {\n if (col.version !== col.temp[MONOMERIC_COL_TAGS.LAST_INVALIDATED_VERSION])\n await invalidateMols(col, true);\n const substructureCol: DG.Column<string> = DG.Column.string('helm', 1).init((i) => substructure);\n substructureCol.setTag(DG.TAGS.UNITS, NOTATION.HELM);\n const substructureMolsCol =\n await getMonomericMols(substructureCol, true, col.temp[MONOMERIC_COL_TAGS.MONOMERS_DICT]);\n const matchesCol = await grok.functions.call('Chem:searchSubstructure', {\n molStringsColumn: col.temp[MONOMERIC_COL_TAGS.MONOMERIC_MOLS],\n molString: substructureMolsCol.get(0),\n molBlockFailover: '',\n });\n return matchesCol.get(0);\n}\n\nexport async function invalidateMols(col: DG.Column<string>, pattern: boolean) {\n const progressBar = DG.TaskBarProgressIndicator.create(`Invalidating molfiles for ${col.name}`);\n await delay(10);\n const monomersDict = new Map();\n const monomericMolsCol = await getMonomericMols(col, pattern, monomersDict);\n col.temp[MONOMERIC_COL_TAGS.MONOMERIC_MOLS] = monomericMolsCol;\n col.temp[MONOMERIC_COL_TAGS.MONOMERS_DICT] = monomersDict;\n col.temp[MONOMERIC_COL_TAGS.LAST_INVALIDATED_VERSION] = col.version;\n progressBar.close();\n}\n","export enum COLUMNS_NAMES {\n SPLIT_COL = '~split',\n ACTIVITY = '~activity',\n ACTIVITY_SCALED = 'activity_scaled',\n ALIGNED_SEQUENCE = '~aligned_sequence',\n AMINO_ACID_RESIDUE = 'AAR',\n POSITION = 'Pos',\n P_VALUE = 'pValue',\n MEAN_DIFFERENCE = 'Mean difference',\n}\n\nexport enum TAGS {\n AAR = 'AAR',\n POSITION = 'Pos',\n SELECTION = 'selection',\n}\n\nexport enum SEM_TYPES {\n MONOMER = 'Monomer',\n MACROMOLECULE_DIFFERENCE = 'MacromoleculeDifference',\n ACTIVITY = 'activity',\n ACTIVITY_SCALED = 'activityScaled'\n}\n\nexport const MSA = 'MSA';\n\nexport const STATS = 'stats';\n\nexport const EMBEDDING_STATUS = 'embeddingStatus';\n\nexport const PEPTIDES_ANALYSIS = 'isPeptidesAnalysis';\n\nexport enum FLAGS {\n CELL_CHANGING = 'isCellChanging',\n}\n\nexport const aarGroups = {\n 'R': 'PC', 'H': 'PC', 'K': 'PC',\n 'D': 'NC', 'E': 'NC',\n 'S': 'U', 'T': 'U', 'N': 'U', 'Q': 'U',\n 'C': 'SC', 'U': 'SC', 'G': 'SC', 'P': 'SC',\n 'A': 'H', 'V': 'H', 'I': 'H', 'L': 'H', 'M': 'H', 'F': 'H', 'Y': 'H', 'W': 'H',\n '-': '-',\n};\n\nexport const groupDescription: { [key: string]: { 'description': string, aminoAcids: string[] } } = {\n 'PC': {'description': 'Positive Amino Acids, with Electrically Charged Side Chains', 'aminoAcids': ['R', 'H', 'K']},\n 'NC': {'description': 'Negative Amino Acids, with Electrically Charged Side Chains', 'aminoAcids': ['D', 'E']},\n 'U': {'description': 'Amino Acids with Polar Uncharged Side Chains', 'aminoAcids': ['S', 'T', 'N', 'Q']},\n 'SC': {'description': 'Special Cases', 'aminoAcids': ['C', 'U', 'G', 'P']},\n 'H': {\n 'description': 'Amino Acids with Hydrophobic Side Chain',\n 'aminoAcids': ['A', 'V', 'I', 'L', 'M', 'F', 'Y', 'W'],\n },\n '-': {'description': 'Unknown Amino Acid', 'aminoAcids': ['-']},\n};\n\nexport namespace PEPSEA {\n export const SEPARATOR = '.';\n}\n\n","const __WEBPACK_NAMESPACE_OBJECT__ = $;","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\n\nimport $ from 'cash-dom';\nimport {Subscription} from 'rxjs';\nimport {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {NotationConverter} from '@datagrok-libraries/bio/src/utils/notation-converter';\n\n\nlet convertDialog: DG.Dialog | null = null;\nlet convertDialogSubs: Subscription[] = [];\n\n/**\n * Converts notations of a Macromolecule column\n *\n * @param {DG.column} col Column with 'Macromolecule' semantic type\n */\nexport function convert(col: DG.Column): void {\n const converter = new NotationConverter(col);\n const currentNotation: NOTATION = converter.notation;\n //TODO: read all notations\n const notations = [\n NOTATION.FASTA,\n NOTATION.SEPARATOR,\n NOTATION.HELM\n ];\n const separatorArray = ['-', '.', '/'];\n const filteredNotations = notations.filter((e) => e !== currentNotation);\n const targetNotationInput = ui.choiceInput('Convert to', filteredNotations[0], filteredNotations);\n\n const separatorInput = ui.choiceInput('Separator', separatorArray[0], separatorArray);\n\n // hide the separator input for non-SEPARATOR target notations\n const toggleSeparator = () => {\n if (targetNotationInput.value !== NOTATION.SEPARATOR)\n $(separatorInput.root).hide();\n else\n $(separatorInput.root).show();\n };\n\n // set correct visibility on init\n toggleSeparator();\n\n targetNotationInput.onChanged(() => {\n toggleSeparator();\n });\n\n if (convertDialog == null) {\n convertDialog = ui.dialog('Convert Sequence Notation')\n .add(ui.div([\n ui.divText(\n 'Current notation: ' + currentNotation,\n {\n style: {\n 'text-align': 'center',\n 'font-weight': 'bold',\n 'font-size': '14px',\n 'padding': '5px',\n }\n }\n ),\n targetNotationInput.root,\n separatorInput.root\n ]))\n .onOK(async () => {\n const targetNotation = targetNotationInput.value as NOTATION;\n const separator: string | null = separatorInput.value;\n\n await convertDo(col, targetNotation, separator);\n })\n .show({x: 350, y: 100});\n\n convertDialogSubs.push(convertDialog.onClose.subscribe((value) => {\n convertDialogSubs.forEach((s) => { s.unsubscribe(); });\n convertDialogSubs = [];\n convertDialog = null;\n }));\n }\n}\n\n/** Creates a new column with converted sequences and detects its semantic type */\nexport async function convertDo(\n srcCol: DG.Column, targetNotation: NOTATION, separator: string | null\n): Promise<DG.Column> {\n const converter = new NotationConverter(srcCol);\n const newColumn = converter.convert(targetNotation, separator);\n srcCol.dataFrame.columns.add(newColumn);\n\n // Call detector directly to escape some error on detectSemanticTypes\n const semType = await grok.functions.call('Bio:detectMacromolecule', {col: newColumn});\n if (semType)\n newColumn.semType = semType;\n\n // call to calculate 'cell.renderer' tag\n await grok.data.detectSemanticTypes(srcCol.dataFrame);\n\n return newColumn;\n}\n","// import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\n\nimport {Observable, Subject} from 'rxjs';\nimport {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types/index';\nimport {\n createJsonMonomerLibFromSdf,\n expectedMonomerData,\n IMonomerLibHelper\n} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';\n\n// -- Monomer libraries --\nexport const LIB_STORAGE_NAME = 'Libraries';\nexport const LIB_PATH = 'System:AppData/Bio/libraries/';\nexport const LIB_DEFAULT: { [fileName: string]: string } = {'HELMCoreLibrary.json': 'HELMCoreLibrary.json'};\n\nexport class MonomerLib implements IMonomerLib {\n private _monomers: { [type: string]: { [name: string]: Monomer } } = {};\n private _onChanged = new Subject<any>();\n\n constructor(monomers: { [type: string]: { [name: string]: Monomer } }) {\n this._monomers = monomers;\n }\n\n getMonomer(monomerType: string, monomerName: string): Monomer | null {\n if (monomerType in this._monomers! && monomerName in this._monomers![monomerType])\n return this._monomers![monomerType][monomerName];\n else\n return null;\n }\n\n getTypes(): string[] {\n return Object.keys(this._monomers);\n }\n\n getMonomerMolsByType(type: string): { [symbol: string]: string } {\n const res: { [symbol: string]: string } = {};\n\n Object.keys(this._monomers[type]).forEach((monomerSymbol) => {\n res[monomerSymbol] = this._monomers[type][monomerSymbol].molfile;\n });\n\n return res;\n }\n\n getMonomerNamesByType(type: string): string[] {\n return Object.keys(this._monomers[type]);\n }\n\n get onChanged(): Observable<any> {\n return this._onChanged;\n }\n\n private _updateInt(lib: IMonomerLib): void {\n const typesNew = lib.getTypes();\n const types = this.getTypes();\n\n typesNew.forEach((type) => {\n //could possibly rewrite -> TODO: check duplicated monomer symbol\n\n if (!types.includes(type))\n this._monomers![type] = {};\n\n const monomers = lib.getMonomerNamesByType(type);\n monomers.forEach((monomerName) => {\n this._monomers[type][monomerName] = lib.getMonomer(type, monomerName)!;\n });\n });\n }\n\n public update(lib: IMonomerLib): void {\n this._updateInt(lib);\n this._onChanged.next();\n }\n\n public updateLibs(libList: IMonomerLib[], reload: boolean = false): void {\n if (reload) this._monomers = {};\n for (const lib of libList) this._updateInt(lib);\n this._onChanged.next();\n }\n\n public clear(): void {\n this._monomers = {};\n this._onChanged.next();\n }\n}\n\nexport class MonomerLibHelper implements IMonomerLibHelper {\n private readonly _monomerLib: MonomerLib = new MonomerLib({});\n\n /** Protect constructor to prevent multiple instantiation. */\n protected constructor() {}\n\n /** Singleton monomer library */\n getBioLib(): IMonomerLib {\n return this._monomerLib;\n }\n\n private loadLibrariesPromise: Promise<void> = Promise.resolve();\n\n /** Loads libraries based on settings in user storage {@link LIB_STORAGE_NAME}\n * @param {boolean} reload Clean {@link monomerLib} before load libraries [false]\n */\n async loadLibraries(reload: boolean = false): Promise<void> {\n return this.loadLibrariesPromise = this.loadLibrariesPromise.then(async () => {\n const userLibrariesSettings: string[] = Object.keys(await grok.dapi.userDataStorage.get(LIB_STORAGE_NAME, true));\n const libs: IMonomerLib[] = await Promise.all(userLibrariesSettings.map((libFileName) => {\n //TODO handle whether files are in place\n return this.readLibrary(LIB_PATH, libFileName);\n }));\n this._monomerLib.updateLibs(libs, reload);\n });\n }\n\n /** Reads library from file shares, handles .json and .sdf */\n async readLibrary(path: string, fileName: string): Promise<IMonomerLib> {\n let data: any[] = [];\n let file;\n let dfSdf;\n const fileSource = new DG.FileSource(path);\n if (fileName.endsWith('.sdf')) {\n const funcList: DG.Func[] = DG.Func.find({package: 'Chem', name: 'importSdf'});\n if (funcList.length === 1) {\n file = await fileSource.readAsBytes(fileName);\n dfSdf = await grok.functions.call('Chem:importSdf', {bytes: file});\n data = createJsonMonomerLibFromSdf(dfSdf[0]);\n } else {\n grok.shell.warning('Chem package is not installed');\n }\n } else {\n const file = await fileSource.readAsText(fileName);\n data = JSON.parse(file);\n }\n\n const monomers: { [type: string]: { [name: string]: Monomer } } = {};\n const types: string[] = [];\n //group monomers by their type\n data.forEach((monomer) => {\n const monomerAdd: Monomer = {\n 'symbol': monomer['symbol'],\n 'name': monomer['name'],\n 'naturalAnalog': monomer['naturalAnalog'],\n 'molfile': monomer['molfile'],\n 'rgroups': monomer['rgroups'],\n 'polymerType': monomer['polymerType'],\n 'monomerType': monomer['monomerType'],\n 'data': {}\n };\n\n Object.keys(monomer).forEach((prop) => {\n if (!expectedMonomerData.includes(prop))\n monomerAdd.data[prop] = monomer[prop];\n });\n\n if (!types.includes(monomer['polymerType'])) {\n monomers[monomer['polymerType']] = {};\n types.push(monomer['polymerType']);\n }\n\n monomers[monomer['polymerType']][monomer['symbol']] = monomerAdd;\n });\n\n return new MonomerLib(monomers);\n }\n\n // -- Instance singleton --\n private static _instance: MonomerLibHelper | null = null;\n\n public static get instance(): MonomerLibHelper {\n if (!MonomerLibHelper._instance) MonomerLibHelper._instance = new MonomerLibHelper();\n return MonomerLibHelper._instance;\n }\n}\n","const r = Symbol(\"Comlink.proxy\"), H = Symbol(\"Comlink.endpoint\"), C = Symbol(\"Comlink.releaseProxy\"), y = Symbol(\"Comlink.thrown\"), Y = (l) => typeof l == \"object\" && l !== null || typeof l == \"function\", k = {\n canHandle: (l) => Y(l) && l[r],\n serialize(l) {\n const { port1: c, port2: b } = new MessageChannel();\n return R(l, c), [b, [b]];\n },\n deserialize(l) {\n return l.start(), K(l);\n }\n}, I = {\n canHandle: (l) => Y(l) && y in l,\n serialize({ value: l }) {\n let c;\n return l instanceof Error ? c = {\n isError: !0,\n value: {\n message: l.message,\n name: l.name,\n stack: l.stack\n }\n } : c = { isError: !1, value: l }, [c, []];\n },\n deserialize(l) {\n throw l.isError ? Object.assign(new Error(l.value.message), l.value) : l.value;\n }\n}, S = /* @__PURE__ */ new Map([\n [\"proxy\", k],\n [\"throw\", I]\n]);\nfunction R(l, c = self) {\n c.addEventListener(\"message\", function b(t) {\n if (!t || !t.data)\n return;\n const { id: i, type: e, path: Z } = Object.assign({ path: [] }, t.data), d = (t.data.argumentList || []).map(u);\n let m;\n try {\n const n = Z.slice(0, -1).reduce((s, p) => s[p], l), a = Z.reduce((s, p) => s[p], l);\n switch (e) {\n case \"GET\":\n m = a;\n break;\n case \"SET\":\n n[Z.slice(-1)[0]] = u(t.data.value), m = !0;\n break;\n case \"APPLY\":\n m = a.apply(n, d);\n break;\n case \"CONSTRUCT\":\n {\n const s = new a(...d);\n m = z(s);\n }\n break;\n case \"ENDPOINT\":\n {\n const { port1: s, port2: p } = new MessageChannel();\n R(l, p), m = U(s, [s]);\n }\n break;\n case \"RELEASE\":\n m = void 0;\n break;\n default:\n return;\n }\n } catch (n) {\n m = { value: n, [y]: 0 };\n }\n Promise.resolve(m).catch((n) => ({ value: n, [y]: 0 })).then((n) => {\n const [a, s] = o(n);\n c.postMessage(Object.assign(Object.assign({}, a), { id: i }), s), e === \"RELEASE\" && (c.removeEventListener(\"message\", b), V(c));\n });\n }), c.start && c.start();\n}\nfunction N(l) {\n return l.constructor.name === \"MessagePort\";\n}\nfunction V(l) {\n N(l) && l.close();\n}\nfunction K(l, c) {\n return X(l, [], c);\n}\nfunction h(l) {\n if (l)\n throw new Error(\"Proxy has been released and is not useable\");\n}\nfunction X(l, c = [], b = function() {\n}) {\n let t = !1;\n const i = new Proxy(b, {\n get(e, Z) {\n if (h(t), Z === C)\n return () => G(l, {\n type: \"RELEASE\",\n path: c.map((d) => d.toString())\n }).then(() => {\n V(l), t = !0;\n });\n if (Z === \"then\") {\n if (c.length === 0)\n return { then: () => i };\n const d = G(l, {\n type: \"GET\",\n path: c.map((m) => m.toString())\n }).then(u);\n return d.then.bind(d);\n }\n return X(l, [...c, Z]);\n },\n set(e, Z, d) {\n h(t);\n const [m, n] = o(d);\n return G(l, {\n type: \"SET\",\n path: [...c, Z].map((a) => a.toString()),\n value: m\n }, n).then(u);\n },\n apply(e, Z, d) {\n h(t);\n const m = c[c.length - 1];\n if (m === H)\n return G(l, {\n type: \"ENDPOINT\"\n }).then(u);\n if (m === \"bind\")\n return X(l, c.slice(0, -1));\n const [n, a] = W(d);\n return G(l, {\n type: \"APPLY\",\n path: c.map((s) => s.toString()),\n argumentList: n\n }, a).then(u);\n },\n construct(e, Z) {\n h(t);\n const [d, m] = W(Z);\n return G(l, {\n type: \"CONSTRUCT\",\n path: c.map((n) => n.toString()),\n argumentList: d\n }, m).then(u);\n }\n });\n return i;\n}\nfunction J(l) {\n return Array.prototype.concat.apply([], l);\n}\nfunction W(l) {\n const c = l.map(o);\n return [c.map((b) => b[0]), J(c.map((b) => b[1]))];\n}\nconst g = /* @__PURE__ */ new WeakMap();\nfunction U(l, c) {\n return g.set(l, c), l;\n}\nfunction z(l) {\n return Object.assign(l, { [r]: !0 });\n}\nfunction o(l) {\n for (const [c, b] of S)\n if (b.canHandle(l)) {\n const [t, i] = b.serialize(l);\n return [\n {\n type: \"HANDLER\",\n name: c,\n value: t\n },\n i\n ];\n }\n return [\n {\n type: \"RAW\",\n value: l\n },\n g.get(l) || []\n ];\n}\nfunction u(l) {\n switch (l.type) {\n case \"HANDLER\":\n return S.get(l.name).deserialize(l.value);\n case \"RAW\":\n return l.value;\n }\n}\nfunction G(l, c, b) {\n return new Promise((t) => {\n const i = T();\n l.addEventListener(\"message\", function e(Z) {\n !Z.data || !Z.data.id || Z.data.id !== i || (l.removeEventListener(\"message\", e), t(Z.data));\n }), l.start && l.start(), l.postMessage(Object.assign({ id: i }, c), b);\n });\n}\nfunction T() {\n return new Array(4).fill(0).map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16)).join(\"-\");\n}\nconst x = \"KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NvbnN0ICQ9U3ltYm9sKCJDb21saW5rLnByb3h5IiksQT1TeW1ib2woIkNvbWxpbmsuZW5kcG9pbnQiKSxSPVN5bWJvbCgiQ29tbGluay5yZWxlYXNlUHJveHkiKSx5PVN5bWJvbCgiQ29tbGluay50aHJvd24iKSxfPWU9PnR5cGVvZiBlPT0ib2JqZWN0IiYmZSE9PW51bGx8fHR5cGVvZiBlPT0iZnVuY3Rpb24iLEw9e2NhbkhhbmRsZTplPT5fKGUpJiZlWyRdLHNlcmlhbGl6ZShlKXtjb25zdHtwb3J0MTpyLHBvcnQyOml9PW5ldyBNZXNzYWdlQ2hhbm5lbDtyZXR1cm4gdyhlLHIpLFtpLFtpXV19LGRlc2VyaWFsaXplKGUpe3JldHVybiBlLnN0YXJ0KCksQyhlKX19LE89e2NhbkhhbmRsZTplPT5fKGUpJiZ5IGluIGUsc2VyaWFsaXplKHt2YWx1ZTplfSl7bGV0IHI7cmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvcj9yPXtpc0Vycm9yOiEwLHZhbHVlOnttZXNzYWdlOmUubWVzc2FnZSxuYW1lOmUubmFtZSxzdGFjazplLnN0YWNrfX06cj17aXNFcnJvcjohMSx2YWx1ZTplfSxbcixbXV19LGRlc2VyaWFsaXplKGUpe3Rocm93IGUuaXNFcnJvcj9PYmplY3QuYXNzaWduKG5ldyBFcnJvcihlLnZhbHVlLm1lc3NhZ2UpLGUudmFsdWUpOmUudmFsdWV9fSxFPW5ldyBNYXAoW1sicHJveHkiLExdLFsidGhyb3ciLE9dXSk7ZnVuY3Rpb24gdyhlLHI9c2VsZil7ci5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiBpKHMpe2lmKCFzfHwhcy5kYXRhKXJldHVybjtjb25zdHtpZDpvLHR5cGU6YSxwYXRoOm59PU9iamVjdC5hc3NpZ24oe3BhdGg6W119LHMuZGF0YSksdT0ocy5kYXRhLmFyZ3VtZW50TGlzdHx8W10pLm1hcChtKTtsZXQgbDt0cnl7Y29uc3QgYz1uLnNsaWNlKDAsLTEpLnJlZHVjZSgoZCxoKT0+ZFtoXSxlKSxmPW4ucmVkdWNlKChkLGgpPT5kW2hdLGUpO3N3aXRjaChhKXtjYXNlIkdFVCI6bD1mO2JyZWFrO2Nhc2UiU0VUIjpjW24uc2xpY2UoLTEpWzBdXT1tKHMuZGF0YS52YWx1ZSksbD0hMDticmVhaztjYXNlIkFQUExZIjpsPWYuYXBwbHkoYyx1KTticmVhaztjYXNlIkNPTlNUUlVDVCI6e2NvbnN0IGQ9bmV3IGYoLi4udSk7bD16KGQpfWJyZWFrO2Nhc2UiRU5EUE9JTlQiOntjb25zdHtwb3J0MTpkLHBvcnQyOmh9PW5ldyBNZXNzYWdlQ2hhbm5lbDt3KGUsaCksbD1OKGQsW2RdKX1icmVhaztjYXNlIlJFTEVBU0UiOmw9dm9pZCAwO2JyZWFrO2RlZmF1bHQ6cmV0dXJufX1jYXRjaChjKXtsPXt2YWx1ZTpjLFt5XTowfX1Qcm9taXNlLnJlc29sdmUobCkuY2F0Y2goYz0+KHt2YWx1ZTpjLFt5XTowfSkpLnRoZW4oYz0+e2NvbnN0W2YsZF09UyhjKTtyLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxmKSx7aWQ6b30pLGQpLGE9PT0iUkVMRUFTRSImJihyLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGkpLEYocikpfSl9KSxyLnN0YXJ0JiZyLnN0YXJ0KCl9ZnVuY3Rpb24gVChlKXtyZXR1cm4gZS5jb25zdHJ1Y3Rvci5uYW1lPT09Ik1lc3NhZ2VQb3J0In1mdW5jdGlvbiBGKGUpe1QoZSkmJmUuY2xvc2UoKX1mdW5jdGlvbiBDKGUscil7cmV0dXJuIGIoZSxbXSxyKX1mdW5jdGlvbiBwKGUpe2lmKGUpdGhyb3cgbmV3IEVycm9yKCJQcm94eSBoYXMgYmVlbiByZWxlYXNlZCBhbmQgaXMgbm90IHVzZWFibGUiKX1mdW5jdGlvbiBiKGUscj1bXSxpPWZ1bmN0aW9uKCl7fSl7bGV0IHM9ITE7Y29uc3Qgbz1uZXcgUHJveHkoaSx7Z2V0KGEsbil7aWYocChzKSxuPT09UilyZXR1cm4oKT0+ZyhlLHt0eXBlOiJSRUxFQVNFIixwYXRoOnIubWFwKHU9PnUudG9TdHJpbmcoKSl9KS50aGVuKCgpPT57RihlKSxzPSEwfSk7aWYobj09PSJ0aGVuIil7aWYoci5sZW5ndGg9PT0wKXJldHVybnt0aGVuOigpPT5vfTtjb25zdCB1PWcoZSx7dHlwZToiR0VUIixwYXRoOnIubWFwKGw9PmwudG9TdHJpbmcoKSl9KS50aGVuKG0pO3JldHVybiB1LnRoZW4uYmluZCh1KX1yZXR1cm4gYihlLFsuLi5yLG5dKX0sc2V0KGEsbix1KXtwKHMpO2NvbnN0W2wsY109Uyh1KTtyZXR1cm4gZyhlLHt0eXBlOiJTRVQiLHBhdGg6Wy4uLnIsbl0ubWFwKGY9PmYudG9TdHJpbmcoKSksdmFsdWU6bH0sYykudGhlbihtKX0sYXBwbHkoYSxuLHUpe3Aocyk7Y29uc3QgbD1yW3IubGVuZ3RoLTFdO2lmKGw9PT1BKXJldHVybiBnKGUse3R5cGU6IkVORFBPSU5UIn0pLnRoZW4obSk7aWYobD09PSJiaW5kIilyZXR1cm4gYihlLHIuc2xpY2UoMCwtMSkpO2NvbnN0W2MsZl09TSh1KTtyZXR1cm4gZyhlLHt0eXBlOiJBUFBMWSIscGF0aDpyLm1hcChkPT5kLnRvU3RyaW5nKCkpLGFyZ3VtZW50TGlzdDpjfSxmKS50aGVuKG0pfSxjb25zdHJ1Y3QoYSxuKXtwKHMpO2NvbnN0W3UsbF09TShuKTtyZXR1cm4gZyhlLHt0eXBlOiJDT05TVFJVQ1QiLHBhdGg6ci5tYXAoYz0+Yy50b1N0cmluZygpKSxhcmd1bWVudExpc3Q6dX0sbCkudGhlbihtKX19KTtyZXR1cm4gb31mdW5jdGlvbiBEKGUpe3JldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGUpfWZ1bmN0aW9uIE0oZSl7Y29uc3Qgcj1lLm1hcChTKTtyZXR1cm5bci5tYXAoaT0+aVswXSksRChyLm1hcChpPT5pWzFdKSldfWNvbnN0IFA9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gTihlLHIpe3JldHVybiBQLnNldChlLHIpLGV9ZnVuY3Rpb24geihlKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihlLHtbJF06ITB9KX1mdW5jdGlvbiBTKGUpe2Zvcihjb25zdFtyLGldb2YgRSlpZihpLmNhbkhhbmRsZShlKSl7Y29uc3RbcyxvXT1pLnNlcmlhbGl6ZShlKTtyZXR1cm5be3R5cGU6IkhBTkRMRVIiLG5hbWU6cix2YWx1ZTpzfSxvXX1yZXR1cm5be3R5cGU6IlJBVyIsdmFsdWU6ZX0sUC5nZXQoZSl8fFtdXX1mdW5jdGlvbiBtKGUpe3N3aXRjaChlLnR5cGUpe2Nhc2UiSEFORExFUiI6cmV0dXJuIEUuZ2V0KGUubmFtZSkuZGVzZXJpYWxpemUoZS52YWx1ZSk7Y2FzZSJSQVciOnJldHVybiBlLnZhbHVlfX1mdW5jdGlvbiBnKGUscixpKXtyZXR1cm4gbmV3IFByb21pc2Uocz0+e2NvbnN0IG89VSgpO2UuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24gYShuKXshbi5kYXRhfHwhbi5kYXRhLmlkfHxuLmRhdGEuaWQhPT1vfHwoZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixhKSxzKG4uZGF0YSkpfSksZS5zdGFydCYmZS5zdGFydCgpLGUucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbih7aWQ6b30sciksaSl9KX1mdW5jdGlvbiBVKCl7cmV0dXJuIG5ldyBBcnJheSg0KS5maWxsKDApLm1hcCgoKT0+TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKS50b1N0cmluZygxNikpLmpvaW4oIi0iKX1jb25zdCBXPWFzeW5jKCk9PldlYkFzc2VtYmx5LnZhbGlkYXRlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDUsMSw5NiwwLDEsMTIzLDMsMiwxLDAsMTAsMTAsMSw4LDAsNjUsMCwyNTMsMTUsMjUzLDk4LDExXSkpLHg9ImVhZ2VyIixrPSJsYXp5IixqPXtzc3c6WyJzaW1kIl0sbWluaW1hcDI6WyJzaW1kIl19LHQ9e3Rvb2xzOltdLGNvbmZpZzp7fSxmaWxlczpbXSxiYXNlOnt9LGZzOnt9LGFzeW5jIGluaXQoKXtpZih0LnRvb2xzLmxlbmd0aD09PTApdGhyb3ciRXhwZWN0aW5nIGF0IGxlYXN0IDEgdG9vbC4iO2lmKG5ldyBTZXQodC50b29scy5tYXAocj0+YCR7ci50b29sfS8ke3IucHJvZ3JhbXx8ci50b29sfWApKS5zaXplIT09dC50b29scy5sZW5ndGgpdGhyb3ciRm91bmQgZHVwbGljYXRlIHRvb2xzOyBjYW4gb25seSBoYXZlIGVhY2ggdG9vbC9wcm9ncmFtIGNvbWJpbmF0aW9uIGF0IG1vc3Qgb25jZS4iO2lmKHQuYmFzZT10LnRvb2xzLmZpbmQocj0+ci5yZWluaXQhPT0hMCksIXQuYmFzZSl0aHJvdyJDb3VsZCBub3QgZmluZCBhIHRvb2wgd2l0aCBgcmVpbml0OiBmYWxzZWAgdG8gdXNlIGFzIHRoZSBiYXNlIG1vZHVsZS4gVG8gZml4IHRoaXMgaXNzdWUsIGluY2x1ZGUgdGhlIHRvb2wgYGJhc2UvMS4wLjBgIHdoZW4gaW5pdGlhbGl6aW5nIEFpb2xpLiI7cmV0dXJuIHQuYmFzZS5pc0Jhc2VNb2R1bGU9ITAsYXdhaXQgdGhpcy5fc2V0dXAodC5iYXNlKSxhd2FpdCB0aGlzLl9pbml0TW9kdWxlcygpLHQuX2xvZygiUmVhZHkiKSwhMH0sYXN5bmMgX2luaXRNb2R1bGVzKCl7YXdhaXQgUHJvbWlzZS5hbGwodC50b29scy5tYXAodGhpcy5fc2V0dXApKSxhd2FpdCB0aGlzLl9zZXR1cEZTKCl9LG1vdW50KGU9W10pe2NvbnN0IHI9YCR7dC5jb25maWcuZGlyU2hhcmVkfSR7dC5jb25maWcuZGlyRGF0YX1gLGk9YCR7dC5jb25maWcuZGlyU2hhcmVkfSR7dC5jb25maWcuZGlyTW91bnRlZH1gO2xldCBzPVtdLG89W10sYT1bXTshQXJyYXkuaXNBcnJheShlKSYmIShlIGluc3RhbmNlb2YgRmlsZUxpc3QpJiYoZT1bZV0pLHQuX2xvZyhgTW91bnRpbmcgJHtlLmxlbmd0aH0gZmlsZXNgKTtmb3IobGV0IG4gb2YgZSl7aWYobiBpbnN0YW5jZW9mIEZpbGV8fChuPT1udWxsP3ZvaWQgMDpuLmRhdGEpaW5zdGFuY2VvZiBCbG9iJiZuLm5hbWV8fHR5cGVvZihuPT1udWxsP3ZvaWQgMDpuLmRhdGEpPT0ic3RyaW5nIiYmbi5uYW1lKXR5cGVvZihuPT1udWxsP3ZvaWQgMDpuLmRhdGEpPT0ic3RyaW5nIiYmKG4uZGF0YT1uZXcgQmxvYihbbi5kYXRhXSx7dHlwZToidGV4dC9wbGFpbiJ9KSkscy5wdXNoKG4pO2Vsc2UgaWYobi5uYW1lJiZuLnVybClvLnB1c2gobik7ZWxzZSBpZih0eXBlb2Ygbj09InN0cmluZyImJm4uc3RhcnRzV2l0aCgiaHR0cCIpKW49e3VybDpuLG5hbWU6bi5zcGxpdCgiLy8iKS5wb3AoKS5yZXBsYWNlKC9cLy9nLCItIil9LG8ucHVzaChuKTtlbHNlIHRocm93J0Nhbm5vdCBtb3VudCBmaWxlKHMpIHNwZWNpZmllZC4gTXVzdCBiZSBhIEZpbGUsIEJsb2IsIGEgVVJMIHN0cmluZywgb3IgeyBuYW1lOiAiZmlsZS50eHQiLCBkYXRhOiAic3RyaW5nIiB9Lic7YS5wdXNoKG4ubmFtZSl9dHJ5e3QuZnMudW5tb3VudChpKX1jYXRjaHt9Zm9yKGxldCBuIG9mIG8pdC5mcy5jcmVhdGVMYXp5RmlsZShyLG4ubmFtZSxuLnVybCwhMCwhMCk7cmV0dXJuIHQuZmlsZXM9dC5maWxlcy5jb25jYXQocyksdC5iYXNlLm1vZHVsZS5GUy5tb3VudCh0LmJhc2UubW9kdWxlLldPUktFUkZTLHtmaWxlczp0LmZpbGVzLmZpbHRlcihuPT5uIGluc3RhbmNlb2YgRmlsZSksYmxvYnM6dC5maWxlcy5maWx0ZXIobj0+KG49PW51bGw/dm9pZCAwOm4uZGF0YSlpbnN0YW5jZW9mIEJsb2IpfSxpKSxzLm1hcChuPT57Y29uc3QgdT1gJHtpfS8ke24ubmFtZX1gLGw9YCR7cn0vJHtuLm5hbWV9YDt0cnl7dC5mcy51bmxpbmsobCl9Y2F0Y2h7fXQuX2xvZyhgQ3JlYXRpbmcgc3ltbGluazogJHtsfSAtLT4gJHt1fWApLHQuZnMuc3ltbGluayh1LGwpfSksYS5tYXAobj0+YCR7cn0vJHtufWApfSxhc3luYyBleGVjKGUscj1udWxsKXtpZih0Ll9sb2coYEV4ZWN1dGluZyAlYyR7ZX0lYyBhcmdzPSR7cn1gLCJjb2xvcjpkYXJrYmx1ZTsgZm9udC13ZWlnaHQ6Ym9sZCIsIiIpLCFlKXRocm93IkV4cGVjdGluZyBhIGNvbW1hbmQiO2xldCBpPWU7cj09bnVsbCYmKHI9ZS5zcGxpdCgiICIpLGk9ci5zaGlmdCgpKTtjb25zdCBzPXQudG9vbHMuZmluZChhPT57dmFyIHU7bGV0IG49aTtyZXR1cm4oKHU9YT09bnVsbD92b2lkIDA6YS5mZWF0dXJlcyk9PW51bGw/dm9pZCAwOnUuc2ltZCk9PT0hMCYmKG49YCR7bn0tc2ltZGApLGEucHJvZ3JhbT09bn0pO2lmKHM9PW51bGwpdGhyb3dgUHJvZ3JhbSAke2l9IG5vdCBmb3VuZC5gO3Muc3Rkb3V0PSIiLHMuc3RkZXJyPSIiLHMubG9hZGluZz09ayYmKHMubG9hZGluZz14LGF3YWl0IHRoaXMuX2luaXRNb2R1bGVzKCkpO3RyeXtzLm1vZHVsZS5jYWxsTWFpbihyKX1jYXRjaChhKXtjb25zb2xlLmVycm9yKGEpfXRyeXtzLm1vZHVsZS5GUy5jbG9zZShzLm1vZHVsZS5GUy5zdHJlYW1zWzFdKSxzLm1vZHVsZS5GUy5jbG9zZShzLm1vZHVsZS5GUy5zdHJlYW1zWzJdKX1jYXRjaHt9cy5tb2R1bGUuRlMuc3RyZWFtc1sxXT1zLm1vZHVsZS5GUy5vcGVuKCIvZGV2L3N0ZG91dCIsInciKSxzLm1vZHVsZS5GUy5zdHJlYW1zWzJdPXMubW9kdWxlLkZTLm9wZW4oIi9kZXYvc3RkZXJyIiwidyIpO2xldCBvPXtzdGRvdXQ6cy5zdGRvdXQsc3RkZXJyOnMuc3RkZXJyfTtpZih0LmNvbmZpZy5wcmludEludGVybGVhdmVkJiYobz1zLnN0ZG91dCkscy5yZWluaXQ9PT0hMCl7Y29uc3QgYT10LmJhc2UubW9kdWxlLkZTLmN3ZCgpO09iamVjdC5hc3NpZ24ocyxzLmNvbmZpZykscy5yZWFkeT0hMSxhd2FpdCB0aGlzLmluaXQoKSxzLmlzQmFzZU1vZHVsZSYmdGhpcy5tb3VudCgpLHRoaXMuY2QoYSl9cmV0dXJuIG99LGNhdChlKXtyZXR1cm4gdC5fZmlsZW9wKCJjYXQiLGUpfSxscyhlKXtyZXR1cm4gdC5fZmlsZW9wKCJscyIsZSl9LGRvd25sb2FkKGUpe3JldHVybiB0Ll9maWxlb3AoImRvd25sb2FkIixlKX0scHdkKCl7cmV0dXJuIHQuZnMuY3dkKCl9LGNkKGUpe2ZvcihsZXQgciBvZiB0LnRvb2xzKSFyLm1vZHVsZXx8ci5tb2R1bGUuRlMuY2hkaXIoZSl9LG1rZGlyKGUpe3JldHVybiB0LmZzLm1rZGlyKGUpLCEwfSxyZWFkKHtwYXRoOmUsbGVuZ3RoOnIsZmxhZzppPSJyIixvZmZzZXQ6cz0wLHBvc2l0aW9uOm89MH0pe2NvbnN0IGE9dC5mcy5vcGVuKGUsaSksbj1uZXcgVWludDhBcnJheShyKTtyZXR1cm4gdC5mcy5yZWFkKGEsbixzLHIsbyksdC5mcy5jbG9zZShhKSxufSx3cml0ZSh7cGF0aDplLGJ1ZmZlcjpyLGZsYWc6aT0idysiLG9mZnNldDpzPTAscG9zaXRpb246bz0wfSl7Y29uc3QgYT10LmZzLm9wZW4oZSxpKTt0LmZzLndyaXRlKGEscixzLHIubGVuZ3RoLG8pLHQuZnMuY2xvc2UoYSl9LF9zdGRpblR4dDoiIixfc3RkaW5QdHI6MCxnZXQgc3RkaW4oKXtyZXR1cm4gdC5fc3RkaW5UeHR9LHNldCBzdGRpbihlPSIiKXt0Ll9sb2coYFNldHRpbmcgc3RkaW4gdG8gJWMke2V9JWNgLCJjb2xvcjpkYXJrYmx1ZSIsIiIpLHQuX3N0ZGluVHh0PWUsdC5fc3RkaW5QdHI9MH0sYXN5bmMgX3NldHVwKGUpe2lmKGUucmVhZHkpcmV0dXJuO2lmKHQuX2xvZyhgU2V0dGluZyB1cCAke2UudG9vbH0gKGJhc2UgPSAke2UuaXNCYXNlTW9kdWxlPT09ITB9KS4uLmApLGUuY29uZmlnPU9iamVjdC5hc3NpZ24oe30sZSksZS51cmxQcmVmaXh8fChlLnVybFByZWZpeD1gJHt0LmNvbmZpZy51cmxDRE59LyR7ZS50b29sfS8ke2UudmVyc2lvbn1gKSxlLnByb2dyYW18fChlLnByb2dyYW09ZS50b29sKSxlLmZlYXR1cmVzfHwoZS5mZWF0dXJlcz17fSwoaltlLnByb2dyYW1dfHxbXSkuaW5jbHVkZXMoInNpbWQiKSYmKGF3YWl0IFcoKT8oZS5wcm9ncmFtKz0iLXNpbWQiLGUuZmVhdHVyZXMuc2ltZD0hMCk6dC5fbG9nKGBXZWJBc3NlbWJseSBTSU1EIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyOyB3aWxsIGxvYWQgbm9uLVNJTUQgdmVyc2lvbiBvZiAke2UucHJvZ3JhbX0uYCkpKSxlLmlzQmFzZU1vZHVsZSYmKGUubG9hZGluZz14KSxlLmxvYWRpbmc9PT1rKXt0Ll9sb2coYFdpbGwgbGF6eS1sb2FkICR7ZS50b29sfTsgc2tpcHBpbmcgaW5pdGlhbGl6YXRpb24uYCk7cmV0dXJufXNlbGYuaW1wb3J0U2NyaXB0cyhgJHtlLnVybFByZWZpeH0vJHtlLnByb2dyYW19LmpzYCksZS5tb2R1bGU9YXdhaXQgTW9kdWxlKHt0aGlzUHJvZ3JhbTplLnByb2dyYW0sbG9jYXRlRmlsZTooaSxzKT0+YCR7ZS51cmxQcmVmaXh9LyR7aX1gLHN0ZGluOigpPT50Ll9zdGRpblB0cjx0LnN0ZGluLmxlbmd0aD90LnN0ZGluLmNoYXJDb2RlQXQodC5fc3RkaW5QdHIrKyk6KHQuc3RkaW49IiIsbnVsbCkscHJpbnQ6aT0+ZS5zdGRvdXQrPWAke2l9CmAscHJpbnRFcnI6dC5jb25maWcucHJpbnRJbnRlcmxlYXZlZD9pPT5lLnN0ZG91dCs9YCR7aX0KYDppPT5lLnN0ZGVycis9YCR7aX0KYH0pO2NvbnN0IHI9ZS5tb2R1bGUuRlM7ZS5pc0Jhc2VNb2R1bGU/KHQuX2xvZyhgU2V0dGluZyB1cCAke2UudG9vbH0gd2l0aCBiYXNlIG1vZHVsZSBmaWxlc3lzdGVtLi4uYCksci5ta2Rpcih0LmNvbmZpZy5kaXJTaGFyZWQsNTExKSxyLm1rZGlyKGAke3QuY29uZmlnLmRpclNoYXJlZH0vJHt0LmNvbmZpZy5kaXJEYXRhfWAsNTExKSxyLm1rZGlyKGAke3QuY29uZmlnLmRpclNoYXJlZH0vJHt0LmNvbmZpZy5kaXJNb3VudGVkfWAsNTExKSxyLmNoZGlyKGAke3QuY29uZmlnLmRpclNoYXJlZH0vJHt0LmNvbmZpZy5kaXJEYXRhfWApLHQuZnM9cik6KHQuX2xvZyhgU2V0dGluZyB1cCAke2UudG9vbH0gd2l0aCBmaWxlc3lzdGVtLi4uYCksci5ta2Rpcih0LmNvbmZpZy5kaXJTaGFyZWQpLHIubW91bnQoZS5tb2R1bGUuUFJPWFlGUyx7cm9vdDp0LmNvbmZpZy5kaXJTaGFyZWQsZnM6dC5mc30sdC5jb25maWcuZGlyU2hhcmVkKSxyLmNoZGlyKHQuZnMuY3dkKCkpKSxlLnN0ZG91dD0iIixlLnN0ZGVycj0iIixlLnJlYWR5PSEwfSxhc3luYyBfc2V0dXBGUygpe2NvbnN0IGU9dC5mcztmb3IobGV0IHIgb2YgdC50b29scyl7aWYoIXIucmVhZHkpY29udGludWU7Y29uc3QgaT1yLm1vZHVsZS5GUyxzPWAvJHtyLnRvb2x9YCxvPWAke3QuY29uZmlnLmRpclNoYXJlZH0ke3N9YDshaS5hbmFseXplUGF0aChzKS5leGlzdHN8fGUuYW5hbHl6ZVBhdGgobykuZXhpc3RzfHwodC5fbG9nKGBNb3VudGluZyAke3N9IG9udG8gJHt0LmJhc2UudG9vbH0gZmlsZXN5c3RlbSBhdCAke299YCksZS5ta2RpcihvKSxlLm1vdW50KHQuYmFzZS5tb2R1bGUuUFJPWFlGUyx7cm9vdDpzLGZzOml9LG8pKX19LF9maWxlb3AoZSxyKXt0Ll9sb2coYFJ1bm5pbmcgJHtlfSAke3J9YCk7Y29uc3QgaT10LmZzLmFuYWx5emVQYXRoKHIpO2lmKCFpLmV4aXN0cylyZXR1cm4gdC5fbG9nKGBGaWxlICR7cn0gbm90IGZvdW5kLmApLCExO3N3aXRjaChlKXtjYXNlImNhdCI6cmV0dXJuIHQuZnMucmVhZEZpbGUocix7ZW5jb2Rpbmc6InV0ZjgifSk7Y2FzZSJscyI6cmV0dXJuIHQuZnMuaXNGaWxlKGkub2JqZWN0Lm1vZGUpP3QuZnMuc3RhdChyKTp0LmZzLnJlYWRkaXIocik7Y2FzZSJkb3dubG9hZCI6Y29uc3Qgcz1uZXcgQmxvYihbdGhpcy5jYXQocildKTtyZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChzKX1yZXR1cm4hMX0sX2xvZyhlKXtpZighdC5jb25maWcuZGVidWcpcmV0dXJuO2xldCByPVsuLi5hcmd1bWVudHNdO3Iuc2hpZnQoKSxjb25zb2xlLmxvZyhgJWNbV2ViV29ya2VyXSVjICR7ZX1gLCJmb250LXdlaWdodDpib2xkIiwiIiwuLi5yKX19O3codCl9KSgpOwo=\", L = typeof window < \"u\" && window.Blob && new Blob([atob(x)], { type: \"text/javascript;charset=utf-8\" });\nfunction v() {\n const l = L && (window.URL || window.webkitURL).createObjectURL(L);\n try {\n return l ? new Worker(l) : new Worker(\"data:application/javascript;base64,\" + x);\n } finally {\n l && (window.URL || window.webkitURL).revokeObjectURL(l);\n }\n}\nconst f = \"https://biowasm.com/cdn/v3\", F = \"https://stg.biowasm.com/cdn/v3\", w = {\n urlCDN: f,\n urlCDNStg: F,\n dirShared: \"/shared\",\n dirMounted: \"/mnt\",\n dirData: \"/data\",\n printInterleaved: !0,\n callback: null,\n debug: !1,\n env: \"prd\"\n};\nclass B {\n constructor(c, b = {}) {\n if (c == null)\n throw \"Expecting array of tools as input to Aioli constructor.\";\n return Array.isArray(c) || (c = [c]), b = Object.assign({}, w, b), c = c.map(this._parseTool), b.env === \"stg\" && (b.urlCDN = b.urlCDNStg), this.tools = c, this.config = b, this.config.callback != null && (this.callback = this.config.callback), delete this.config.callback, this.init();\n }\n async init() {\n const c = new v();\n this.callback && (c.onmessage = (t) => {\n t.data.type === \"biowasm\" && this.callback(t.data.value);\n });\n const b = K(c);\n return b.tools = this.tools, b.config = this.config, await b.init(), b;\n }\n _parseTool(c) {\n if (typeof c != \"string\")\n return c;\n const b = c.split(\"/\");\n if (b.length != 2 && b.length != 3)\n throw \"Expecting '<tool>/<version>' or '<tool>/<program>/<version>'\";\n return {\n tool: b[0],\n program: b.length == 3 ? b[1] : b[0],\n version: b[b.length - 1]\n };\n }\n}\nexport {\n B as default\n};\n","import { assert } from '@datagrok-libraries/utils/src/vector-operations';\nclass SideChainScales {\n static getAvailableScales() {\n return Object.entries(this.scales).map(([k, _]) => k);\n }\n static getScale(name) {\n assert(!(this.scales[name] === undefined), `Scale '${name}' was not found.`);\n return this.scales[name];\n }\n}\nSideChainScales.scales = {\n // Wimley-White interfacial hydrophobicity scale\n 'WimleyWhite': {\n '-': 0,\n 'A': 0.17,\n 'C': -0.24,\n 'D': -0.07,\n 'E': -0.01,\n 'F': -1.13,\n 'G': 0.01,\n 'H': 0.17,\n 'I': -0.31,\n 'K': 0.99,\n 'L': -0.56,\n 'M': -0.23,\n 'N': 0.42,\n 'P': 0.45,\n 'Q': 0.58,\n 'R': 0.81,\n 'S': 0.13,\n 'T': 0.14,\n 'V': 0.07,\n 'W': -1.85,\n 'Y': -0.94,\n },\n 'categorial': {\n '-': 0,\n 'A': 1,\n 'C': 2,\n 'D': 3,\n 'E': 4,\n 'F': 5,\n 'G': 6,\n 'H': 7,\n 'I': 8,\n 'K': 9,\n 'L': 10,\n 'M': 11,\n 'N': 12,\n 'P': 13,\n 'Q': 14,\n 'R': 15,\n 'S': 16,\n 'T': 17,\n 'V': 18,\n 'W': 19,\n 'Y': 20,\n },\n};\n/**\n * Class to categorial encode/decode aligned amino acid residues sequence.\n *\n * @export\n * @class AlignedSequenceEncoder\n */\nexport class AlignedSequenceEncoder {\n constructor(scale = 'categorial') {\n this.aa2num = SideChainScales.getScale(scale);\n this.num2aa = {};\n Object.entries(this.aa2num).forEach(([k, v]) => (this.num2aa[v] = k));\n }\n /**\n * Truncate NH2 and -COOH terminals of the given sequence.\n *\n * @static\n * @param {string} seq The sequence provided.\n * @return {string} Truncated sequence.\n * @memberof AlignedSequenceEncoder\n */\n static _truncateSequence(seq) {\n let start = 0;\n let end = seq.length;\n const termina = ['NH2', 'COOH'];\n if (seq.startsWith(termina[0])) {\n const l = termina[0].length; // Cut only 'NH2' without following '-'.\n assert(seq[l] == '-', `Wrong sequence format: ${termina[0]} without following '-' in '${seq}'.`);\n start = l;\n }\n if (seq.endsWith(termina[1])) {\n const l = termina[1].length + 1; // Cut both 'COOH' and precending '-'.\n assert(seq[end - l] == '-', `Wrong sequence format: ${termina[1]} without '-' precending in '${seq}'.`);\n end -= l;\n }\n return seq.substring(start, end);\n }\n /**\n * Cuts auxiliary defises before a residue.\n *\n * @static\n * @param {string} seq The sequence to process.\n * @return {string} Processed sequence.\n * @memberof AlignedSequenceEncoder\n */\n static _dropDefises(seq) {\n return seq.replace(/(-)([^-]+)/g, '$2');\n }\n /**\n * Performs truncation and cutting auxiliary defises.\n *\n * @static\n * @param {string} sequence The sequence work under process.\n * @return {string} Result of cleaning.\n * @memberof AlignedSequenceEncoder\n */\n static clean(sequence) {\n return AlignedSequenceEncoder._dropDefises(AlignedSequenceEncoder._truncateSequence(sequence));\n }\n /**\n * Categorial encode of the sequence provided.\n *\n * @param {string} sequence The sequence.\n * @return {number[]} Encoded vector.\n * @memberof AlignedSequenceEncoder\n */\n encode(sequence) {\n const nItems = sequence.length;\n const values = new Array(nItems).fill(0);\n for (let i = 0; i < nItems; ++i) {\n const char = sequence[i];\n assert(char in this.aa2num, `Unknown char '${char}' found in sequence '${sequence}'`);\n values[i] = this.encodeLettter(char);\n }\n return values;\n }\n encodeLettter(letter) {\n return this.aa2num[letter];\n }\n /**\n * Decode the encoded vector into the sequence back.\n *\n * @param {number[]} value The vector encoded.\n * @return {string} Decoded sequence.\n * @memberof AlignedSequenceEncoder\n */\n decode(value) {\n let s = '';\n for (let i = 0; i < value.length; ++i) {\n const code = value[i];\n assert(code in this.num2aa, `Unknown code '${code}' found in vector '${value}'`);\n s += this.num2aa[code];\n }\n return s;\n }\n}\n//# sourceMappingURL=sequence-encoder.js.map","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as DG from 'datagrok-api/dg';\n\nimport {FastaFileHandler} from '@datagrok-libraries/bio/src/utils/fasta-handler';\nimport {TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';\n//@ts-ignore: there are no types for this library\nimport Aioli from '@biowasm/aioli';\n\nimport {AlignedSequenceEncoder} from '@datagrok-libraries/bio/src/sequence-encoder';\nconst fastaInputFilename = 'input.fa';\nconst fastaOutputFilename = 'result.fasta';\n\n/**\n * Converts array of sequences into simple fasta string.\n *\n * @param {string[]} sequences Input list of sequences.\n * @return {string} Fasta-formatted string.\n */\nfunction _stringsToFasta(sequences: string[]): string {\n return sequences.reduce((a, v, i) => a + `>sample${i + 1}\\n${v}\\n`, '');\n}\n\n/**\n * Runs Aioli environment with kalign tool.\n *\n * @param {DG.Column} srcCol Column with sequences.\n * @param {boolean} isAligned Whether the column is aligned.\n * @param {string} unUsedName\n * @return {Promise<DG.Column>} Aligned sequences.\n */\nexport async function runKalign(srcCol: DG.Column<string>, isAligned: boolean = false, unUsedName: string = '',\n clustersCol: DG.Column | null = null): Promise<DG.Column> {\n let sequences: string[] = srcCol.toList();\n\n if (isAligned)\n sequences = sequences.map((v: string) => AlignedSequenceEncoder.clean(v).replace(/\\-/g, ''));\n\n const sequencesLength = srcCol.length;\n clustersCol ??= DG.Column.string('Clusters', sequencesLength).init('0');\n if (clustersCol.type != DG.COLUMN_TYPE.STRING)\n clustersCol = clustersCol.convertTo(DG.TYPE.STRING);\n clustersCol.compact();\n \n //TODO: use fixed-size inner arrays, but first need to expose the method to get each category count\n const clustersColCategories = clustersCol.categories;\n const clustersColData = clustersCol.getRawData();\n const fastaSequences: string[][] = new Array(clustersColCategories.length);\n const clusterIndexes: number[][] = new Array(clustersColCategories.length);\n for (let rowIdx = 0; rowIdx < sequencesLength; ++rowIdx) {\n const clusterCategoryIdx = clustersColData[rowIdx];\n (fastaSequences[clusterCategoryIdx] ??= []).push(sequences[rowIdx]);\n (clusterIndexes[clusterCategoryIdx] ??= []).push(rowIdx);\n }\n\n const CLI = await new Aioli([\n 'base/1.0.0',\n {tool: 'kalign', version: '3.3.1', reinit: true}\n ]);\n const tgtCol = DG.Column.string(unUsedName, sequencesLength);\n\n for (let clusterIdx = 0; clusterIdx < clustersColCategories.length; ++clusterIdx) {\n const clusterSequences = fastaSequences[clusterIdx];\n const fasta = _stringsToFasta(clusterSequences);\n \n console.log(['fasta.length =', fasta.length]);\n\n await CLI.fs.writeFile(fastaInputFilename, fasta);\n const output = await CLI.exec(`kalign ${fastaInputFilename} -f fasta -o ${fastaOutputFilename}`);\n console.warn(output);\n\n const buf = await CLI.cat(fastaOutputFilename);\n if (!buf)\n throw new Error(`kalign output no result`);\n\n const ffh = new FastaFileHandler(buf);\n const aligned = ffh.sequencesArray; // array of sequences extracted from FASTA\n const clusterRowIds = clusterIndexes[clusterIdx];\n for (let clusterRowIdIdx = 0; clusterRowIdIdx < aligned.length; ++clusterRowIdIdx)\n tgtCol.set(clusterRowIds[clusterRowIdIdx], aligned[clusterRowIdIdx]);\n }\n\n // units\n const srcUnits = srcCol.getTag(DG.TAGS.UNITS);\n //aligned\n const srcAligned = srcCol.getTag(bioTAGS.aligned);\n const tgtAligned = srcAligned + '.MSA';\n //alphabet\n const srcAlphabet = srcCol.getTag(bioTAGS.alphabet);\n\n tgtCol.setTag(DG.TAGS.UNITS, srcUnits);\n tgtCol.setTag(bioTAGS.aligned, tgtAligned);\n tgtCol.setTag(bioTAGS.alphabet, srcAlphabet);\n tgtCol.semType = DG.SEMTYPE.MACROMOLECULE;\n return tgtCol;\n}\n\nexport async function testMSAEnoughMemory(col: DG.Column<string>): Promise<void> {\n const sequencesCount = col.length;\n const delta = sequencesCount / 100;\n\n for (let i = delta; i < sequencesCount; i += delta) {\n try {\n await runKalign(DG.Column.fromStrings(col.name, col.toList().slice(0, Math.round(i))));\n console.log(`runKalign succeeded on ${i}`);\n } catch (error) {\n console.log(`runKalign failed on ${i} with '${error}'`);\n }\n }\n}\n","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nimport {NOTATION, TAGS as bioTAGS, ALIGNMENT, ALPHABET} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport * as C from './constants';\n\nexport const pepseaMethods = ['mafft --auto', 'mafft', 'linsi', 'ginsi', 'einsi', 'fftns', 'fftnsi', 'nwns', 'nwnsi'];\nconst alignmentObjectMetaKeys = ['AlignedSeq', 'AlignedSubpeptide', 'HELM', 'ID', 'PolymerID'];\ntype PepseaRepsonse = {\n Alignment: {\n PolymerID: string, AlignedSubpeptide: string, HELM: string, ID: string, AlignedSeq: string, [key: string]: string,\n }[],\n AlignmentScore: {[key: string]: number | null},\n};\ntype PepseaBodyUnit = {ID: string, HELM: string};\n\nexport async function runPepsea(srcCol: DG.Column<string>, unUsedName: string,\n method: typeof pepseaMethods[number] = 'ginsi', gapOpen: number = 1.53, gapExtend: number = 0.0,\n clustersCol: DG.Column<string | number> | null = null,\n ): Promise<DG.Column<string>> {\n const peptideCount = srcCol.length;\n clustersCol ??= DG.Column.int('Clusters', peptideCount).init(0);\n if (clustersCol.type != DG.COLUMN_TYPE.STRING)\n clustersCol = clustersCol.convertTo(DG.TYPE.STRING);\n\n const clusters = clustersCol.categories;\n const bodies: PepseaBodyUnit[][] = new Array(clusters.length);\n\n // Grouping data by clusters\n for (let rowIndex = 0; rowIndex < peptideCount; ++rowIndex) {\n const cluster = clustersCol.get(rowIndex) as string;\n if (cluster === '')\n continue;\n\n const clusterId = clusters.indexOf(cluster);\n const helmSeq = srcCol.get(rowIndex);\n if (helmSeq)\n (bodies[clusterId] ??= []).push({ID: rowIndex.toString(), HELM: helmSeq});\n }\n\n //@ts-ignore: this is a temporary workaround for the issue with docker containers. This will be fixed in 1.14.0\n const pepseaContainer = await (grok.dapi.docker !== undefined ? grok.dapi.docker.dockerContainers : grok.dapi.dockerfiles).filter('bio').first();\n const alignedSequences: string[] = new Array(peptideCount);\n for (const body of bodies) { // getting aligned sequences for each cluster\n const alignedObject = await requestAlignedObjects(pepseaContainer.id, body, method, gapOpen, gapExtend);\n const alignments = alignedObject.Alignment;\n\n for (const alignment of alignments) { // filling alignedSequencesCol\n alignedSequences[parseInt(alignment.ID)] = Object.entries(alignment)\n .filter((v) => !alignmentObjectMetaKeys.includes(v[0]))\n .map((v) => v[1] !== '-' ? v[1] : '')\n .join(C.PEPSEA.SEPARATOR);\n }\n }\n\n const alignedSequencesCol: DG.Column<string> = DG.Column.fromStrings(unUsedName, alignedSequences);\n alignedSequencesCol.setTag(DG.TAGS.UNITS, NOTATION.SEPARATOR);\n alignedSequencesCol.setTag(bioTAGS.separator, C.PEPSEA.SEPARATOR);\n alignedSequencesCol.setTag(bioTAGS.aligned, ALIGNMENT.SEQ_MSA);\n alignedSequencesCol.setTag(bioTAGS.alphabet, ALPHABET.UN);\n alignedSequencesCol.semType = DG.SEMTYPE.MACROMOLECULE;\n\n return alignedSequencesCol;\n}\n\nasync function requestAlignedObjects(dockerfileId: string, body: PepseaBodyUnit[], method: string, gapOpen: number,\n gapExtend: number): Promise<PepseaRepsonse> {\n const params = {\n method: 'POST',\n headers: {'Accept': 'application/json', 'Content-Type': 'application/json'},\n body: JSON.stringify(body),\n };\n const path = `/align?method=${method}&gap_open=${gapOpen}&gap_extend=${gapExtend}`;\n //@ts-ignore: this is a temporary workaround for the issue with docker containers\n const response = await (grok.dapi.docker !== undefined ? grok.dapi.docker.dockerContainers : grok.dapi.dockerfiles)\n .request(dockerfileId, path, params);\n return JSON.parse(response ?? '{}');\n}\n","import * as DG from 'datagrok-api/dg';\nimport * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\n\nimport wu from 'wu';\nimport {splitterAsFasta, SplitterFunc} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {UnitsHandler} from '@datagrok-libraries/bio/src/utils/units-handler';\n\nconst FASTA_LINE_WIDTH = 60;\n\n/** Shows dialog to select id columns list and seq column, builds and downloads FASTA content */\nexport function saveAsFastaUI() {\n // Use grid for column order adjusted by user\n const grid: DG.Grid = grok.shell.tv.grid;\n\n const idGColList: DG.GridColumn[] = wu.count(0).take(grid.columns.length)\n .map((colI: number) => grid.columns.byIndex(colI)!)\n .filter((gcol: DG.GridColumn) => gcol.column ? gcol.column.semType !== DG.SEMTYPE.MACROMOLECULE : false).toArray();\n const defaultIdGCol: DG.GridColumn | undefined = idGColList\n .find((gcol: DG.GridColumn) => gcol.name.toLowerCase().indexOf('id') !== -1);\n const idDefaultValue = defaultIdGCol ? [defaultIdGCol.name] : [];\n\n const idGColListInput = ui.multiChoiceInput('Seq id columns', idDefaultValue,\n idGColList.map((gcol: DG.GridColumn) => gcol.name));\n\n const seqGColList: DG.GridColumn[] = wu.count(0).take(grid.columns.length)/* range rom 0 to grid.columns.length */\n .map((colI: number) => grid.columns.byIndex(colI)!)\n .filter((gc: DG.GridColumn) => {\n const col: DG.Column | null = gc.column;\n if (col && col.semType === DG.SEMTYPE.MACROMOLECULE) {\n const uh = new UnitsHandler(col);\n return uh.isFasta();\n }\n return false;\n }).toArray();\n\n const seqDefaultValue = seqGColList.length > 0 ? seqGColList[0].name : [];\n const seqColInput = ui.choiceInput('Seq column', seqDefaultValue,\n seqGColList.map((gCol: DG.GridColumn) => gCol.name));\n\n const lineWidthInput = ui.intInput('FASTA line width', FASTA_LINE_WIDTH);\n\n ui.dialog({title: 'Save as FASTA'})\n .add(ui.inputs([\n idGColListInput,\n seqColInput,\n lineWidthInput\n ]))\n .onOK(() => {\n const valueIdColList: DG.Column[] = idGColListInput.value ?\n idGColListInput.value.map((colName: string) => grid.columns.byName(colName)!.column!) : [];\n const valueSeqCol: DG.Column | null = seqColInput.value ?\n grid.columns.byName(seqColInput.value as string)!.column : null;\n const valueLineWidth = lineWidthInput.value ?? FASTA_LINE_WIDTH;\n\n if (!valueSeqCol)\n grok.shell.warning(`Seq column is mandatory to save as FASTA.`);\n\n const resFastaTxt: string = saveAsFastaDo(valueIdColList, valueSeqCol!, valueLineWidth);\n\n const aEl: HTMLAnchorElement = document.createElement('a');\n aEl.setAttribute('href', `data:text/plain;charset=utf-8,${encodeURIComponent(resFastaTxt)}`);\n aEl.setAttribute('download', `${grid.dataFrame.name}.fasta`);\n aEl.click();\n })\n .show();\n}\n\n/** */\nexport function saveAsFastaDo(\n idColList: DG.Column[], seqCol: DG.Column, lineWidth: number = FASTA_LINE_WIDTH, lineSeparator: string = '\\n'\n): string {\n const splitter: SplitterFunc = splitterAsFasta;\n\n const fastaLines: string[] = [];\n\n for (let rowI: number = 0; rowI < seqCol.length; rowI++) {\n // multiple identifiers separated by vertical bars\n // https://en.wikipedia.org/wiki/FASTA_format\n\n const seqId: string = idColList.map((col) => col.get(rowI).toString()).join('|');\n const seq: string = seqCol.get(rowI);\n const seqLineList: string[] = wrapSequence(seq, splitter, lineWidth);\n\n fastaLines.push(`>${seqId}${lineSeparator}`);\n for (const line of seqLineList)\n fastaLines.push(`${line}${lineSeparator}`);\n }\n\n //return fastaLines.join(lineSeparator);\n return ''.concat(...fastaLines);\n}\n\n/* split sequence for monomers to prevent wrapping monomer partially */\nexport function wrapSequence(seq: string, splitter: SplitterFunc, lineWidth: number = FASTA_LINE_WIDTH): string[] {\n const seqMonomerList = splitter(seq);\n let seqPos: number = 0;\n const seqLength: number = seqMonomerList.length;\n\n const seqLineList: string[] = [];\n while (seqPos < seqLength) {\n /* join sliced monomer into line */\n const seqLine: string[] = seqMonomerList.slice(seqPos, seqPos + lineWidth);\n const seqLineTxt: string = seqLine.map((m) => m.length > 1 ? `[${m}]` : m).join('');\n seqLineList.push(seqLineTxt);\n seqPos += seqLine.length;\n }\n\n return seqLineList;\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\n\nexport function getMacromoleculeColumn(): DG.Column | any {\n const col = grok.shell.t.columns.bySemType(DG.SEMTYPE.MACROMOLECULE);\n if (col === null) {\n grok.shell.error('Current table does not contain macromolecules');\n return;\n }\n return col;\n}\n\nexport function updateDivInnerHTML(div: HTMLElement, content: string | Node): void {\n div.innerHTML = '';\n div.append(content);\n}","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport wu from 'wu';\nimport * as rxjs from 'rxjs';\n\nimport {SliderOptions} from 'datagrok-api/dg';\nimport {UnitsHandler} from '@datagrok-libraries/bio/src/utils/units-handler';\nimport {SeqPalette} from '@datagrok-libraries/bio/src/seq-palettes';\nimport {\n getSplitter, monomerToShort, pickUpPalette, pickUpSeqCol, SplitterFunc,\n TAGS as bioTAGS\n} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {\n WebLogoPropsDefault, WebLogoProps, IWebLogoViewer,\n PositionHeight,\n positionSeparator,\n} from '@datagrok-libraries/bio/src/viewers/web-logo';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\nimport {TAGS as wlTAGS} from '@datagrok-libraries/bio/src/viewers/web-logo';\n\ndeclare global {\n interface HTMLCanvasElement {\n getCursorPosition(event: MouseEvent, r: number): DG.Point;\n }\n}\n\n/**@param {MouseEvent} event\n * @param {number} r devicePixelRation\n * @return {DG.Point} canvas related cursor position\n */\nHTMLCanvasElement.prototype.getCursorPosition = function(event: MouseEvent, r: number): DG.Point {\n const rect = this.getBoundingClientRect();\n return new DG.Point((event.clientX - rect.left) * r, (event.clientY - rect.top) * r);\n};\n\nDG.Rect.prototype.contains = function(x: number, y: number): boolean {\n return this.left <= x && x <= this.right && this.top <= y && y <= this.bottom;\n};\n\nexport class PositionMonomerInfo {\n /** Sequences count with monomer in position */\n count: number;\n\n /** Remember screen coords rect */\n bounds: DG.Rect;\n\n constructor(count: number = 0, bounds: DG.Rect = new DG.Rect(0, 0, 0, 0)) {\n this.count = count;\n this.bounds = bounds;\n }\n}\n\nexport class PositionInfo {\n /** Position in sequence */\n public readonly pos: number;\n\n /** Position name from column tag*/\n public readonly name: string;\n\n freq: { [m: string]: PositionMonomerInfo };\n rowCount: number;\n sumForHeightCalc: number;\n\n /** freq = {}, rowCount = 0\n * @param {string} name Name of position ('111A', '111.1', etc)\n * @param {number} sumForHeightCalc Sum of all monomer counts for height calculation\n * @param {number} rowCount Count of elements in column\n * @param {string[]} freq frequency of monomers in position\n */\n constructor(pos: number, name: string,\n freq: { [m: string]: PositionMonomerInfo } = {}, rowCount: number = 0, sumForHeightCalc: number = 0\n ) {\n this.pos = pos;\n this.name = name;\n this.freq = freq;\n this.rowCount = rowCount;\n this.sumForHeightCalc = sumForHeightCalc;\n }\n}\n\nexport enum VerticalAlignments {\n TOP = 'top',\n MIDDLE = 'middle',\n BOTTOM = 'bottom',\n}\n\nexport enum HorizontalAlignments {\n LEFT = 'left',\n CENTER = 'center',\n RIGHT = 'right',\n}\n\nexport enum PositionMarginStates {\n AUTO = 'auto',\n ON = 'on',\n OFF = 'off',\n}\n\nexport enum FilterSources {\n Filtered = 'Filtered',\n Selected = 'Selected',\n}\n\nexport enum PROPS_CATS {\n STYLE = 'Style',\n BEHAVIOR = 'Behavior',\n LAYOUT = 'Layout',\n DATA = 'Data',\n}\n\nexport enum PROPS {\n // -- Data --\n sequenceColumnName = 'sequenceColumnName',\n startPositionName = 'startPositionName',\n endPositionName = 'endPositionName',\n skipEmptySequences = 'skipEmptySequences',\n skipEmptyPositions = 'skipEmptyPositions',\n shrinkEmptyTail = 'shrinkEmptyTail',\n\n // -- Style --\n backgroundColor = 'backgroundColor',\n positionHeight = 'positionHeight',\n positionWidth = 'positionWidth',\n\n // -- Layout --\n verticalAlignment = 'verticalAlignment',\n horizontalAlignment = 'horizontalAlignment',\n fixWidth = 'fixWidth',\n fitArea = 'fitArea',\n minHeight = 'minHeight',\n maxHeight = 'maxHeight',\n positionMarginState = 'positionMarginState',\n positionMargin = 'positionMargin',\n\n // -- Behavior --\n filterSource = 'filterSource',\n}\n\nexport class WebLogoViewer extends DG.JsViewer {\n public static residuesSet = 'nucleotides';\n private static viewerCount: number = -1;\n\n private readonly viewerId: number = -1;\n private unitsHandler: UnitsHandler | null;\n private initialized: boolean = false;\n\n // private readonly colorScheme: ColorScheme = ColorSchemes[NucleotidesWebLogo.residuesSet];\n protected cp: SeqPalette | null = null;\n\n private host?: HTMLDivElement;\n private msgHost?: HTMLElement;\n private canvas: HTMLCanvasElement;\n private slider: DG.RangeSlider;\n private readonly textBaseline: CanvasTextBaseline;\n\n private axisHeight: number = 12;\n\n private seqCol: DG.Column<string> | null = null;\n private splitter: SplitterFunc | null = null;\n // private maxLength: number = 100;\n private positions: PositionInfo[] = [];\n\n private rowsMasked: number = 0;\n private rowsNull: number = 0;\n private visibleSlider: boolean = false;\n private allowResize: boolean = true;\n private turnOfResizeForOneSetValue: boolean = false;\n\n // Viewer's properties (likely they should be public so that they can be set outside)\n // -- Data --\n public sequenceColumnName: string | null;\n public skipEmptySequences: boolean;\n public skipEmptyPositions: boolean;\n\n // -- Style --\n private _positionWidth: number;\n public positionWidth: number;\n public minHeight: number;\n public backgroundColor: number = 0xFFFFFFFF;\n public maxHeight: number;\n public positionMarginState: string;\n public positionMargin: number = 0;\n public startPositionName: string | null;\n public endPositionName: string | null;\n public fixWidth: boolean;\n public verticalAlignment: string | null;\n public horizontalAlignment: string | null;\n public fitArea: boolean;\n public shrinkEmptyTail: boolean;\n public positionHeight: string;\n\n // -- Behavior --\n public filterSource: FilterSources;\n\n private positionNames: string[] = [];\n private startPosition: number = -1;\n private endPosition: number = -1;\n\n private get filter(): DG.BitSet {\n let res: DG.BitSet;\n switch (this.filterSource) {\n case FilterSources.Filtered:\n res = this.dataFrame.filter;\n break;\n case FilterSources.Selected:\n res = this.dataFrame.selection;\n break;\n }\n return res;\n }\n\n /** For startPosition equals to endPosition Length is 1 */\n private get Length(): number {\n if (this.skipEmptyPositions) {\n return this.positions.length;\n }\n return this.startPosition <= this.endPosition ? this.endPosition - this.startPosition + 1 : 0;\n }\n\n /** Calculate new position data basic on {@link positionMarginState} and {@link positionMargin} */\n private get positionWidthWithMargin() {\n return this._positionWidth + this.positionMarginValue;\n }\n\n private get positionMarginValue() {\n if ((this.positionMarginState === 'auto') && (this.unitsHandler?.getAlphabetIsMultichar() === true)) {\n return this.positionMargin;\n }\n if (this.positionMarginState === 'enable') {\n return this.positionMargin;\n }\n\n return 0;\n }\n\n /** Count of position rendered for calculations countOfRenderPositions */\n private get countOfRenderPositions() {\n if (this.host == null) {\n return 0;\n }\n const r = window.devicePixelRatio;\n if (r > 1) {\n return this.canvasWidthWithRatio / this.positionWidthWithMargin;\n } else {\n return this.canvas.width / (this.positionWidthWithMargin * r);\n }\n }\n\n private get canvasWidthWithRatio() {\n return this.canvas.width * window.devicePixelRatio;\n }\n\n\n /** Position of start rendering */\n private get firstVisibleIndex(): number {\n return (this.visibleSlider) ? Math.floor(this.slider.min) : 0;\n }\n\n private viewSubs: rxjs.Unsubscribable[] = [];\n\n constructor() {\n super();\n\n this.viewerId = WebLogoViewer.viewerCount;\n WebLogoViewer.viewerCount += 1;\n\n this.textBaseline = 'top';\n this.unitsHandler = null;\n\n // -- Data --\n this.sequenceColumnName = this.string(PROPS.sequenceColumnName, null,\n {category: PROPS_CATS.DATA});\n this.startPositionName = this.string(PROPS.startPositionName, null,\n {category: PROPS_CATS.DATA});\n this.endPositionName = this.string(PROPS.endPositionName, null,\n {category: PROPS_CATS.DATA});\n this.skipEmptySequences = this.bool(PROPS.skipEmptySequences, true,\n {category: PROPS_CATS.DATA});\n this.skipEmptyPositions = this.bool(PROPS.skipEmptyPositions, false,\n {category: PROPS_CATS.DATA});\n this.shrinkEmptyTail = this.bool(PROPS.shrinkEmptyTail, true,\n {category: PROPS_CATS.DATA});\n\n\n // -- Style --\n this.backgroundColor = this.int(PROPS.backgroundColor, 0xFFFFFFFF,\n {category: PROPS_CATS.STYLE});\n this.positionHeight = this.string(PROPS.positionHeight, PositionHeight.full,\n {category: PROPS_CATS.STYLE, choices: Object.values(PositionHeight)});\n this._positionWidth = this.positionWidth = this.float(PROPS.positionWidth, 16,\n {category: PROPS_CATS.STYLE/* editor: 'slider', min: 4, max: 64, postfix: 'px' */});\n\n\n // -- Layout --\n this.verticalAlignment = this.string(PROPS.verticalAlignment, VerticalAlignments.MIDDLE,\n {category: PROPS_CATS.LAYOUT, choices: Object.values(VerticalAlignments)});\n this.horizontalAlignment = this.string(PROPS.horizontalAlignment, HorizontalAlignments.CENTER,\n {category: PROPS_CATS.LAYOUT, choices: Object.values(HorizontalAlignments)});\n this.fixWidth = this.bool(PROPS.fixWidth, false,\n {category: PROPS_CATS.LAYOUT});\n this.fitArea = this.bool(PROPS.fitArea, true,\n {category: PROPS_CATS.LAYOUT});\n this.minHeight = this.float(PROPS.minHeight, 50,\n {category: PROPS_CATS.LAYOUT/*, editor: 'slider', min: 25, max: 250, postfix: 'px'*/});\n this.maxHeight = this.float(PROPS.maxHeight, 100,\n {category: PROPS_CATS.LAYOUT/*, editor: 'slider', min: 25, max: 500, postfix: 'px'*/});\n this.positionMarginState = this.string(PROPS.positionMarginState, PositionMarginStates.AUTO,\n {category: PROPS_CATS.LAYOUT, choices: Object.values(PositionMarginStates)});\n let defaultValueForPositionMargin = 0;\n if (this.positionMarginState === 'auto') defaultValueForPositionMargin = 4;\n this.positionMargin = this.int(PROPS.positionMargin, defaultValueForPositionMargin,\n {category: PROPS_CATS.LAYOUT, min: 0, max: 16});\n\n // -- Behavior --\n this.filterSource = this.string(PROPS.filterSource, FilterSources.Filtered,\n {category: PROPS_CATS.BEHAVIOR, choices: Object.values(FilterSources)}) as FilterSources;\n\n const style: SliderOptions = {style: 'barbell'};\n this.slider = ui.rangeSlider(0, 100, 0, 20, false, style);\n this.canvas = ui.canvas();\n this.canvas.style.width = '100%';\n }\n\n private init(): void {\n if (this.initialized) {\n console.error('Bio: WebLogoViewer.init() second initialization!');\n return;\n }\n\n this.initialized = true;\n this.helpUrl = '/help/visualize/viewers/web-logo.md';\n\n this.msgHost = ui.div('No message');\n this.msgHost.style.display = 'none';\n\n this.canvas = ui.canvas();\n this.canvas.style.width = '100%';\n\n //this.slider.setShowHandles(false);\n this.slider.root.style.position = 'absolute';\n this.slider.root.style.zIndex = '999';\n this.slider.root.style.display = 'none';\n this.slider.root.style.height = '0.7em';\n\n this.visibleSlider = false;\n\n this.subs.push(this.slider.onValuesChanged.subscribe(this.sliderOnValuesChanged.bind(this)));\n\n this.host = ui.div([this.msgHost, this.canvas]);\n\n this.host.style.justifyContent = 'center';\n this.host.style.alignItems = 'center';\n this.host.style.position = 'relative';\n this.host.style.setProperty('overflow', 'hidden', 'important');\n\n this.subs.push(\n rxjs.fromEvent<MouseEvent>(this.canvas, 'mousemove').subscribe(this.canvasOnMouseMove.bind(this)));\n this.subs.push(\n rxjs.fromEvent<MouseEvent>(this.canvas, 'mousedown').subscribe(this.canvasOnMouseDown.bind(this)));\n\n this.subs.push(rxjs.fromEvent<WheelEvent>(this.canvas, 'wheel').subscribe(this.canvasOnWheel.bind(this)));\n\n this.subs.push(ui.onSizeChanged(this.root).subscribe(this.rootOnSizeChanged.bind(this)));\n\n this.root.append(this.host);\n this.root.append(this.slider.root);\n\n this._calculate(window.devicePixelRatio);\n this.updateSlider();\n this.render(true);\n }\n\n /** Handler of changing size WebLogo */\n private rootOnSizeChanged(): void {\n this._calculate(window.devicePixelRatio);\n this.updateSlider();\n this.render(true);\n }\n\n /** Assigns {@link seqCol} and {@link cp} based on {@link sequenceColumnName} and calls {@link render}().\n */\n private updateSeqCol(): void {\n if (this.dataFrame) {\n this.seqCol = this.sequenceColumnName ? this.dataFrame.col(this.sequenceColumnName) : null;\n if (this.seqCol == null) {\n this.seqCol = pickUpSeqCol(this.dataFrame);\n this.sequenceColumnName = this.seqCol ? this.seqCol.name : null;\n }\n if (this.seqCol) {\n const units: string = this.seqCol!.getTag(DG.TAGS.UNITS);\n const separator: string = this.seqCol!.getTag(bioTAGS.separator);\n this.splitter = getSplitter(units, separator);\n this.unitsHandler = new UnitsHandler(this.seqCol);\n\n this.updatePositions();\n this.cp = pickUpPalette(this.seqCol);\n } else {\n this.splitter = null;\n this.positionNames = [];\n this.startPosition = -1;\n this.endPosition = -1;\n this.cp = null;\n }\n }\n this.render();\n }\n\n /** Updates {@link positionNames} and calculates {@link startPosition} and {@link endPosition}.\n */\n private updatePositions(): void {\n if (!this.seqCol)\n return;\n\n let categories: (string | null) [];\n if (this.shrinkEmptyTail) {\n const indices: Int32Array = this.dataFrame.filter.getSelectedIndexes();\n categories = Array.from(new Set(\n Array.from(Array(indices.length).keys()).map((i: number) => this.seqCol!.get(indices[i]))));\n } else {\n categories = this.seqCol.categories;\n }\n const maxLength = categories.length > 0 ? Math.max(...categories.map(\n (s) => s !== null ? this.splitter!(s).length : 0)) : 0;\n\n // Get position names from data column tag 'positionNames'\n const positionNamesTxt = this.seqCol.getTag(wlTAGS.positionNames);\n // Fallback if 'positionNames' tag is not provided\n this.positionNames = positionNamesTxt ? positionNamesTxt.split(positionSeparator).map((n) => n.trim()) :\n [...Array(maxLength).keys()].map((jPos) => `${jPos + 1}`);\n\n this.startPosition = (this.startPositionName && this.positionNames &&\n this.positionNames.includes(this.startPositionName)) ?\n this.positionNames.indexOf(this.startPositionName) : 0;\n this.endPosition = (this.endPositionName && this.positionNames &&\n this.positionNames.includes(this.endPositionName)) ?\n this.positionNames.indexOf(this.endPositionName) : (maxLength - 1);\n }\n\n private get widthArea() {\n return this.Length * this.positionWidth / window.devicePixelRatio;\n }\n\n private get heightArea() {\n return Math.min(this.maxHeight, Math.max(this.minHeight, this.root.clientHeight));\n }\n\n private get xScale() {\n return this.widthArea > 0 ? (this.root.clientWidth - this.Length * this.positionMarginValue) / this.widthArea : 0;\n }\n\n private get yScale() {\n return this.root.clientHeight / this.heightArea;\n }\n\n private checkIsHideSlider(): boolean {\n let showSliderWithFitArea = true;\n const minScale = Math.min(this.xScale, this.yScale);\n\n if (((minScale == this.xScale) || (minScale <= 1)) && (this.fitArea)) {\n showSliderWithFitArea = false;\n }\n return ((this.fixWidth || Math.ceil(this.canvas.width / this.positionWidthWithMargin) >= this.Length) || (showSliderWithFitArea));\n }\n\n setSliderVisibility(visible: boolean): void {\n if (visible) {\n this.slider.root.style.display = 'inherit';\n this.visibleSlider = true;\n } else {\n this.slider.root.style.display = 'none';\n this.visibleSlider = false;\n }\n }\n\n /** Updates {@link slider}, needed to set slider options and to update slider position. */\n private updateSlider(): void {\n if (this.checkIsHideSlider()) {\n this.setSliderVisibility(false);\n } else {\n this.setSliderVisibility(true);\n }\n if ((this.slider != null) && (this.canvas != null)) {\n const diffEndScrollAndSliderMin = Math.max(0,\n Math.floor(this.slider.min + this.canvas.width / this.positionWidthWithMargin) - this.Length);\n let newMin = Math.floor(this.slider.min - diffEndScrollAndSliderMin);\n let newMax = Math.floor(this.slider.min - diffEndScrollAndSliderMin) + Math.floor(this.canvas.width / this.positionWidthWithMargin);\n if (this.checkIsHideSlider()) {\n newMin = 0;\n newMax = Math.max(newMin, this.Length - 1);\n }\n this.turnOfResizeForOneSetValue = true;\n this.slider.setValues(0, this.Length,\n newMin, newMax);\n }\n }\n\n /** Handler of property change events. */\n public override onPropertyChanged(property: DG.Property): void {\n super.onPropertyChanged(property);\n\n switch (property.name) {\n case PROPS.sequenceColumnName:\n case PROPS.startPositionName:\n case PROPS.endPositionName:\n case PROPS.filterSource:\n this.updateSeqCol();\n break;\n case PROPS.positionWidth:\n this._positionWidth = this.positionWidth;\n this.updateSlider();\n break;\n case PROPS.fixWidth:\n case PROPS.fitArea:\n case PROPS.positionMargin:\n this.updateSlider();\n break;\n case PROPS.shrinkEmptyTail:\n case PROPS.skipEmptyPositions:\n this.updatePositions();\n break;\n }\n\n this.render(true);\n }\n\n /** Add filter handlers when table is a attached */\n public override onTableAttached() {\n super.onTableAttached();\n\n const dataFrameTxt: string = this.dataFrame ? 'data' : 'null';\n console.debug(`Bio: WebLogoViewer<${this.viewerId}>.onTableAttached( dataFrame = ${dataFrameTxt} ) start`);\n\n this.updateSeqCol();\n\n if (this.dataFrame !== undefined) {\n this.viewSubs.push(this.dataFrame.filter.onChanged.subscribe(this.dataFrameFilterOnChanged.bind(this)));\n this.viewSubs.push(this.dataFrame.selection.onChanged.subscribe(this.dataFrameSelectionOnChanged.bind(this)));\n }\n\n this.init();\n console.debug(`Bio: WebLogoViewer<${this.viewerId}>.onTableAttached() end`);\n }\n\n /** Remove all handlers when table is a detach */\n public override async detach() {\n const dataFrameTxt = `${this.dataFrame ? 'data' : 'null'}`;\n console.debug(`Bio: WebLogoViewer<${this.viewerId}>.onTableAttached( dataFrame = ${dataFrameTxt} ) start`);\n super.detach();\n\n this.viewSubs.forEach((sub) => sub.unsubscribe());\n this.host!.remove();\n this.msgHost = undefined;\n this.host = undefined;\n\n this.initialized = false;\n console.debug(`Bio: WebLogoViewer<${this.viewerId}>.onTableAttached() end`);\n }\n\n // -- Routines --\n\n getMonomer(p: DG.Point): [number, string | null, PositionMonomerInfo | null] {\n const calculatedX = p.x + this.firstVisibleIndex * this.positionWidthWithMargin;\n const jPos = Math.floor(p.x / this.positionWidthWithMargin + this.firstVisibleIndex);\n const position = this.positions[jPos];\n\n if (position == undefined)\n return [jPos, null, null];\n\n const monomer: string | undefined = Object.keys(position.freq)\n .find((m) => position.freq[m].bounds.contains(calculatedX, p.y));\n if (monomer === undefined)\n return [jPos, null, null];\n\n return [jPos, monomer, position.freq[monomer]];\n };\n\n /** Helper function for rendering */\n protected _nullSequence(fillerResidue = 'X'): string {\n if (!this.skipEmptySequences)\n return new Array(this.Length).fill(fillerResidue).join('');\n\n return '';\n }\n\n /** Helper function for remove empty positions */\n // TODO: use this function in from core\n protected removeWhere(array: Array<any>, predicate: (T: any) => boolean): Array<any> {\n const length = array.length;\n let updateIterator = 0;\n for (let deleteIterator = 0; deleteIterator < length; deleteIterator++) {\n if (!predicate(array[deleteIterator])) {\n array[updateIterator] = array[deleteIterator];\n updateIterator++;\n }\n }\n array.length = updateIterator;\n return array;\n }\n\n /** Function for removing empty positions */\n protected _removeEmptyPositions() {\n if (this.skipEmptyPositions) {\n this.removeWhere(this.positions, (item) => item?.freq['-']?.count === item.rowCount);\n }\n }\n\n protected _calculate(r: number) {\n if (!this.host || !this.seqCol || !this.dataFrame)\n return;\n this.unitsHandler = new UnitsHandler(this.seqCol);\n\n this.calcSize();\n\n const posCount: number = this.startPosition <= this.endPosition ? this.endPosition - this.startPosition + 1 : 0;\n this.positions = new Array(posCount);\n for (let jPos = 0; jPos < this.Length; jPos++) {\n const posName: string = this.positionNames[this.startPosition + jPos];\n this.positions[jPos] = new PositionInfo(this.startPosition + jPos, posName);\n }\n\n // 2022-05-05 askalkin instructed to show WebLogo based on filter (not selection)\n const indices = this.filter.getSelectedIndexes();\n // const indices = this.dataFrame.selection.trueCount > 0 ? this.dataFrame.selection.getSelectedIndexes() :\n // this.dataFrame.filter.getSelectedIndexes();\n\n this.rowsMasked = indices.length;\n this.rowsNull = 0;\n\n for (const i of indices) {\n let s: string = <string>(this.seqCol.get(i));\n\n if (!s) {\n s = this._nullSequence();\n ++this.rowsNull;\n }\n\n const seqM: string[] = this.splitter!(s);\n for (let jPos = 0; jPos < this.Length; jPos++) {\n const pmInfo = this.positions[jPos].freq;\n const m: string = seqM[this.startPosition + jPos] || '-';\n if (!(m in pmInfo))\n pmInfo[m] = new PositionMonomerInfo();\n pmInfo[m].count++;\n }\n }\n\n //#region Polish freq counts\n for (let jPos = 0; jPos < this.Length; jPos++) {\n // delete this.positions[jPos].freq['-'];\n\n this.positions[jPos].rowCount = 0;\n for (const m in this.positions[jPos].freq)\n this.positions[jPos].rowCount += this.positions[jPos].freq[m].count;\n if (this.positionHeight == PositionHeight.Entropy) {\n this.positions[jPos].sumForHeightCalc = 0;\n for (const m in this.positions[jPos].freq) {\n const pn = this.positions[jPos].freq[m].count / this.positions[jPos].rowCount;\n this.positions[jPos].sumForHeightCalc += -pn * Math.log2(pn);\n }\n }\n }\n //#endregion\n this._removeEmptyPositions();\n\n const absoluteMaxHeight = this.canvas.height - this.axisHeight * r;\n\n //#region Calculate screen\n for (let jPos = 0; jPos < this.Length; jPos++) {\n const freq: { [c: string]: PositionMonomerInfo } = this.positions[jPos].freq;\n const rowCount = this.positions[jPos].rowCount;\n const alphabetSize = this.getAlphabetSize();\n if ((this.positionHeight == PositionHeight.Entropy) && (alphabetSize == null)) {\n grok.shell.error('WebLogo: alphabet is undefined.');\n }\n\n const alphabetSizeLog = Math.log2(alphabetSize);\n const maxHeight = (this.positionHeight == PositionHeight.Entropy) ?\n (absoluteMaxHeight * (alphabetSizeLog - (this.positions[jPos].sumForHeightCalc)) / alphabetSizeLog) :\n absoluteMaxHeight;\n\n let y: number = this.axisHeight * r + (absoluteMaxHeight - maxHeight - 1);\n\n const entries = Object.entries(freq).sort((a, b) => {\n if (a[0] !== '-' && b[0] !== '-')\n return b[1].count - a[1].count;\n else if (a[0] === '-' && b[0] === '-')\n return 0;\n else if (a[0] === '-')\n return -1;\n else /* (b[0] === '-') */\n return +1;\n });\n for (const entry of entries) {\n const pmInfo: PositionMonomerInfo = entry[1];\n // const m: string = entry[0];\n const h: number = maxHeight * pmInfo.count / rowCount;\n\n pmInfo.bounds = new DG.Rect(jPos * this.positionWidthWithMargin, y, this._positionWidth, h);\n y += h;\n }\n }\n //#endregion\n }\n\n /** Render WebLogo sensitive to changes in params of rendering\n *@param {boolean} recalc - indicates that need to recalculate data for rendering\n */\n render(recalc = true) {\n if (this.msgHost) {\n if (this.seqCol && !this.cp) {\n this.msgHost!.innerText = `Unknown palette (column semType: '${this.seqCol.semType}').`;\n this.msgHost!.style.display = '';\n } else {\n this.msgHost!.style.display = 'none';\n }\n }\n\n if (!this.seqCol || !this.dataFrame || !this.cp || this.startPosition === -1 || this.endPosition === -1 || this.host == null || this.slider == null)\n return;\n\n const g = this.canvas.getContext('2d');\n if (!g) return;\n\n this.slider.root.style.width = `${this.host.clientWidth}px`;\n\n const r = window.devicePixelRatio;\n\n if (recalc)\n this._calculate(r);\n\n g.resetTransform();\n g.fillStyle = DG.Color.toHtml(this.backgroundColor);\n g.fillRect(0, 0, this.canvas.width, this.canvas.height);\n g.textBaseline = this.textBaseline;\n\n const maxCountOfRowsRendered = this.countOfRenderPositions + 1;\n const firstVisibleIndex = (this.visibleSlider) ? Math.floor(this.slider.min) : 0;\n const lastVisibleIndex = Math.min(this.Length, firstVisibleIndex + maxCountOfRowsRendered);\n\n //#region Plot positionNames\n const positionFontSize = 10 * r;\n g.resetTransform();\n g.fillStyle = 'black';\n g.textAlign = 'center';\n g.font = `${positionFontSize.toFixed(1)}px Roboto, Roboto Local, sans-serif`;\n const posNameMaxWidth = Math.max(...this.positions.map((pos) => g.measureText(pos.name).width));\n const hScale = posNameMaxWidth < (this._positionWidth - 2) ? 1 : (this._positionWidth - 2) / posNameMaxWidth;\n\n for (let jPos = this.firstVisibleIndex; jPos < lastVisibleIndex; jPos++) {\n const pos: PositionInfo = this.positions[jPos];\n g.resetTransform();\n g.setTransform(\n hScale, 0, 0, 1,\n jPos * this.positionWidthWithMargin + this._positionWidth / 2 - this.positionWidthWithMargin * firstVisibleIndex, 0);\n g.fillText(pos.name, 0, 0);\n }\n //#endregion Plot positionNames\n const fontStyle = '16px Roboto, Roboto Local, sans-serif';\n // Hacks to scale uppercase characters to target rectangle\n const uppercaseLetterAscent = 0.25;\n const uppercaseLetterHeight = 12.2;\n for (let jPos = this.firstVisibleIndex; jPos < lastVisibleIndex; jPos++) {\n for (const [monomer, pmInfo] of Object.entries(this.positions[jPos].freq)) {\n if (monomer !== '-') {\n const monomerTxt = monomerToShort(monomer, 5);\n const b = pmInfo.bounds;\n const left = b.left - this.positionWidthWithMargin * this.firstVisibleIndex;\n\n g.resetTransform();\n g.strokeStyle = 'lightgray';\n g.lineWidth = 1;\n g.rect(left, b.top, b.width, b.height);\n g.fillStyle = this.cp.get(monomer) ?? this.cp.get('other');\n g.textAlign = 'left';\n g.font = fontStyle;\n //g.fillRect(b.left, b.top, b.width, b.height);\n const mTm: TextMetrics = g.measureText(monomerTxt);\n\n g.setTransform(\n b.width / mTm.width, 0, 0, b.height / uppercaseLetterHeight,\n left, b.top);\n g.fillText(monomerTxt, 0, -uppercaseLetterAscent);\n }\n }\n }\n }\n\n /** Calculate canvas size an positionWidth and updates properties */\n private calcSize() {\n if (!this.host)\n return;\n\n const r: number = window.devicePixelRatio;\n\n let width: number = this.widthArea;\n let height = this.heightArea;\n\n if ((this.fitArea) && (!this.visibleSlider)) {\n const scale = Math.max(1, Math.min(this.xScale, this.yScale));\n width = width * scale;\n height = height * scale;\n this._positionWidth = this.positionWidth * scale;\n }\n\n width = this.Length * this.positionWidthWithMargin / r;\n\n this.canvas.width = this.root.clientWidth * r;\n this.canvas.style.width = `${this.root.clientWidth}px`;\n\n // const canvasHeight: number = width > this.root.clientWidth ? height - 8 : height;\n this.host.style.setProperty('height', `${height}px`);\n const canvasHeight: number = this.host.clientHeight;\n this.canvas.height = canvasHeight * r;\n\n // Adjust host and root width\n if (this.fixWidth) {\n // full width for canvas host and root\n this.root.style.width = this.host.style.width = `${width}px`;\n this.root.style.height = `${height}px`;\n this.root.style.overflow = 'hidden';\n this.host.style.setProperty('overflow-y', 'hidden', 'important');\n } else {\n // allow scroll canvas in root\n this.root.style.width = this.host.style.width = '100%';\n this.host.style.overflowX = 'auto!important';\n this.host.style.setProperty('text-align', this.horizontalAlignment);\n\n const sliderHeight = this.visibleSlider ? 10 : 0;\n\n // vertical alignment\n let hostTopMargin = 0;\n switch (this.verticalAlignment) {\n case 'top':\n hostTopMargin = 0;\n break;\n case 'middle':\n hostTopMargin = Math.max(0, (this.root.clientHeight - height) / 2);\n break;\n case 'bottom':\n hostTopMargin = Math.max(0, this.root.clientHeight - height - sliderHeight);\n break;\n }\n // horizontal alignment\n let hostLeftMargin = 0;\n switch (this.horizontalAlignment) {\n case 'left':\n hostLeftMargin = 0;\n break;\n case 'center':\n hostLeftMargin = Math.max(0, (this.root.clientWidth - width) / 2);\n break;\n case 'right':\n hostLeftMargin = Math.max(0, this.root.clientWidth - width);\n break;\n }\n this.host.style.setProperty('margin-top', `${hostTopMargin}px`, 'important');\n this.host.style.setProperty('margin-left', `${hostLeftMargin}px`, 'important');\n if (this.slider != null) {\n this.slider.root.style.setProperty('margin-top', `${hostTopMargin + canvasHeight}px`, 'important');\n }\n\n if (this.root.clientHeight <= height) {\n this.host.style.setProperty('height', `${this.root.clientHeight}px`);\n this.host.style.setProperty('overflow-y', null);\n } else {\n this.host.style.setProperty('overflow-y', 'hidden', 'important');\n }\n }\n }\n\n public getAlphabetSize(): number {\n return this.unitsHandler?.getAlphabetSize() ?? 0;\n }\n\n // -- Handle events --\n\n private sliderOnValuesChanged(value: any): void {\n if ((this.host == null)) return;\n\n try {\n /* Resize slider if we can resize do that */\n if ((this.allowResize) && (!this.turnOfResizeForOneSetValue) &&\n (this.visibleSlider)) {\n const countOfPositions = Math.ceil(this.slider.max - this.slider.min);\n const calculatedWidth = (this.canvas.width / countOfPositions) - this.positionMarginValue;\n // saving positionWidth value global (even if slider is not visible)\n this.positionWidth = calculatedWidth;\n this._positionWidth = calculatedWidth;\n }\n this.turnOfResizeForOneSetValue = false;\n this.render(true);\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Bio: WebLogoViewer.sliderOnValuesChanged() error:\\n' + errMsg);\n //throw err; // Do not throw to prevent disabling event handler\n }\n }\n\n private dataFrameFilterOnChanged(value: any): void {\n console.debug('Bio: WebLogoViewer.dataFrameFilterChanged()');\n try {\n this.updatePositions();\n this.render();\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Bio: WebLogoViewer.dataFrameFilterOnChanged() error:\\n' + errMsg);\n //throw err; // Do not throw to prevent disabling event handler\n }\n }\n\n private dataFrameSelectionOnChanged(value: any): void {\n console.debug('Bio: WebLogoViewer.dataFrameSelectionOnChanged()');\n try {\n this.render();\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Bio: WebLogoViewer.dataFrameSelectionOnChanged() error:\\n' + errMsg);\n //throw err; // Do not throw to prevent disabling event handler\n }\n }\n\n private canvasOnMouseMove(e: MouseEvent) {\n try {\n const args = e as MouseEvent;\n\n const dpr: number = window.devicePixelRatio;\n const cursorP: DG.Point = this.canvas.getCursorPosition(args, dpr);\n const [jPos, monomer] = this.getMonomer(cursorP);\n // if (jPos != undefined && monomer == undefined) {\n // const preEl = ui.element('pre');\n // preEl.innerHTML = jPos < this.positions.length ?\n // JSON.stringify(this.positions[jPos].freq, undefined, 2) : 'NO jPos';\n // const tooltipEl = ui.div([ui.div(`pos: ${jPos}`), preEl]);\n // ui.tooltip.show(tooltipEl, args.x + 16, args.y + 16);\n // } else\n if (this.dataFrame && this.seqCol && this.splitter && monomer) {\n const atPI: PositionInfo = this.positions[jPos];\n const monomerAtPosSeqCount = countForMonomerAtPosition(\n this.dataFrame, this.seqCol, this.filter, this.splitter, monomer, atPI);\n\n const tooltipEl = ui.div([\n // ui.div(`pos ${jPos}`),\n ui.div(`${monomer}`),\n ui.div(`${monomerAtPosSeqCount} rows`)]);\n ui.tooltip.show(tooltipEl, args.x + 16, args.y + 16);\n } else {\n ui.tooltip.hide();\n }\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Bio: WebLogoViewer.canvasOnMouseMove() error:\\n' + errMsg);\n //throw err; // Do not throw to prevent disabling event handler\n }\n }\n\n private canvasOnMouseDown(e: MouseEvent): void {\n try {\n const args = e as MouseEvent;\n const r: number = window.devicePixelRatio;\n const [jPos, monomer] = this.getMonomer(this.canvas.getCursorPosition(args, r));\n\n // prevents deselect all rows if we miss monomer bounds\n if (this.dataFrame && this.seqCol && this.splitter && monomer) {\n const atPI: PositionInfo = this.positions[jPos];\n\n // this.dataFrame.selection.init((rowI: number) => {\n // return checkSeqForMonomerAtPos(\n // this.dataFrame, this.seqCol!, this.filter, rowI, this.splitter!, monomer, atPI);\n // });\n // Calculate a new BitSet object for selection to prevent interfering with existing\n const selBS: DG.BitSet = DG.BitSet.create(this.dataFrame.selection.length, (rowI: number) => {\n return checkSeqForMonomerAtPos(\n this.dataFrame, this.seqCol!, this.filter, rowI, this.splitter!, monomer, atPI);\n });\n this.dataFrame.selection.init((i) => selBS.get(i));\n }\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Bio: WebLogoViewer.canvasOnMouseDown() error:\\n' + errMsg);\n //throw err; // Do not throw to prevent disabling event handler\n }\n }\n\n private canvasOnWheel(e: WheelEvent) {\n try {\n if (!this.visibleSlider)\n return;\n const countOfScrollPositions = (e.deltaY / 100) * Math.max(Math.floor((this.countOfRenderPositions) / 2), 1);\n this.slider.scrollBy(this.slider.min + countOfScrollPositions);\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Bio: WebLogoViewer.canvasOnWheel() error:\\n' + errMsg);\n //throw err; // Do not throw to prevent disabling event handler\n }\n }\n}\n\nexport function checkSeqForMonomerAtPos(\n df: DG.DataFrame, seqCol: DG.Column, filter: DG.BitSet, rowI: number,\n splitter: SplitterFunc, monomer: string, at: PositionInfo\n): boolean {\n // if (!filter.get(rowI)) return false;\n // TODO: Use BitSet.get(idx)\n if (!filter.getSelectedIndexes().includes(rowI)) return false;\n\n const seq = seqCol!.get(rowI);\n const seqM = seq ? splitter!(seq)[at.pos] : null;\n return ((seqM === monomer) || (seqM === '' && monomer === '-'));\n}\n\nexport function countForMonomerAtPosition(\n df: DG.DataFrame, seqCol: DG.Column, filter: DG.BitSet,\n splitter: SplitterFunc, monomer: string, at: PositionInfo\n): number {\n const posMList: (string | null)[] = wu.count(0).take(df.rowCount)\n .filter((rowI) => filter.get(rowI))\n .map((rowI) => {\n const seq: string | null = seqCol!.get(rowI);\n const seqMList: string[] = seq ? splitter!(seq) : [];\n const seqMPos: number = at.pos;\n const seqM: string | null = seqMPos < seqMList.length ? seqMList[seqMPos] : null;\n return seqM;\n }).toArray();\n // wu.count().take(this.dataFrame.rowCount).filter(function(iRow) {\n // return correctMonomerFilter(iRow, monomer, jPos);\n // }).reduce<number>((count, iRow) => count + 1, 0);\n const monomerAtPosRowCount = posMList.filter((m) => m == monomer).reduce((count, m) => count + 1, 0);\n return monomerAtPosRowCount;\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = rxjs.operators;","/**\n * Macromolecules substructure filter that uses Datagrok's collaborative filtering.\n * 1. On onRowsFiltering event, only FILTER OUT rows that do not satisfy this filter's criteria\n * 2. Call dataFrame.rows.requestFilter when filtering criteria changes.\n * */\n\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport * as grok from 'datagrok-api/grok';\nimport wu from 'wu';\nimport {helmSubstructureSearch, linearSubstructureSearch} from '../substructure-search/substructure-search';\nimport {Subject, Subscription} from 'rxjs';\nimport * as C from '../utils/constants';\nimport {updateDivInnerHTML} from '../utils/ui-utils';\nimport {TAGS as bioTAGS, NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {delay} from '@datagrok-libraries/utils/src/test';\nimport {debounceTime} from 'rxjs/operators';\n\nexport class BioSubstructureFilter extends DG.Filter {\n bioFilter: FastaFilter | SeparatorFilter | HelmFilter | null = null;\n bitset: DG.BitSet | null = null;\n loader: HTMLDivElement = ui.loader();\n onBioFilterChangedSubs?: Subscription;\n notation: string | undefined = undefined;\n\n get calculating(): boolean { return this.loader.style.display == 'initial'; }\n\n set calculating(value: boolean) { this.loader.style.display = value ? 'initial' : 'none'; }\n\n get filterSummary(): string {\n return this.bioFilter!.substructure;\n }\n\n get isFiltering(): boolean {\n return super.isFiltering && this.bioFilter!.substructure !== '';\n }\n\n get isReadyToApplyFilter(): boolean {\n return !this.calculating && this.bitset != null;\n }\n\n get _debounceTime(): number {\n if (this.column == null)\n return 1000;\n const length = this.column.length;\n const minLength = 500;\n const maxLength = 10000;\n const msecMax = 1000;\n if (length < minLength) return 0;\n if (length > maxLength) return msecMax;\n return Math.floor(msecMax * ((length - minLength) / (maxLength - minLength)));\n }\n\n //column name setter overload\n\n constructor() {\n super();\n this.root = ui.divV([]);\n this.calculating = false;\n }\n\n attach(dataFrame: DG.DataFrame): void {\n super.attach(dataFrame);\n this.column = dataFrame.columns.bySemType(DG.SEMTYPE.MACROMOLECULE);\n this.columnName ??= this.column?.name;\n this.notation ??= this.column?.getTag(DG.TAGS.UNITS);\n this.bioFilter = this.notation === NOTATION.FASTA ?\n new FastaFilter() : this.notation === NOTATION.SEPARATOR ?\n new SeparatorFilter(this.column!.getTag(bioTAGS.separator)) : new HelmFilter();\n this.root.appendChild(this.bioFilter!.filterPanel);\n this.root.appendChild(this.loader);\n\n this.onBioFilterChangedSubs?.unsubscribe();\n\n let onChangedEvent: any = this.bioFilter.onChanged;\n onChangedEvent = onChangedEvent.pipe(debounceTime(this._debounceTime));\n this.onBioFilterChangedSubs = onChangedEvent.subscribe(async (_: any) => await this._onInputChanged());\n }\n\n detach() {\n super.detach();\n }\n\n applyFilter(): void {\n if (this.bitset && !this.isDetached)\n this.dataFrame?.filter.and(this.bitset);\n }\n\n /** Override to save filter state. */\n saveState(): any {\n const state = super.saveState();\n state.bioSubstructure = this.bioFilter?.substructure;\n return state;\n }\n\n /** Override to load filter state. */\n applyState(state: any): void {\n super.applyState(state); //column, columnName\n if (state.bioSubstructure)\n this.bioFilter!.substructure = state.bioSubstructure;\n\n const that = this;\n if (state.bioSubstructure)\n setTimeout(function() { that._onInputChanged(); }, 1000);\n }\n\n /**\n * Performs the actual filtering\n * When the results are ready, triggers `rows.requestFilter`, which in turn triggers `applyFilter`\n * that would simply apply the bitset synchronously.\n */\n async _onInputChanged(): Promise<void> {\n if (!this.isFiltering) {\n this.bitset = null;\n this.dataFrame?.rows.requestFilter();\n } else if (wu(this.dataFrame!.rows.filters).has(`${this.columnName}: ${this.filterSummary}`)) {\n // some other filter is already filtering for the exact same thing\n return;\n } else {\n this.calculating = true;\n try {\n this.bitset = await this.bioFilter?.substrucrureSearch(this.column!)!;\n this.calculating = false;\n this.dataFrame?.rows.requestFilter();\n } finally {\n this.calculating = false;\n }\n }\n }\n}\n\nabstract class BioFilterBase {\n onChanged: Subject<any> = new Subject<any>();\n\n get filterPanel() {\n return new HTMLElement();\n }\n\n get substructure() {\n return '';\n }\n\n set substructure(s: string) {\n }\n\n async substrucrureSearch(column: DG.Column): Promise<DG.BitSet | null> {\n return null;\n }\n}\n\nclass FastaFilter extends BioFilterBase {\n readonly substructureInput: DG.InputBase<string>;\n\n constructor() {\n super();\n\n this.substructureInput = ui.stringInput('', '', () => {\n this.onChanged.next();\n }, {placeholder: 'Substructure'});\n }\n\n get filterPanel() {\n return this.substructureInput.root;\n }\n\n get substructure() {\n return this.substructureInput.value;\n }\n\n set substructure(s: string) {\n this.substructureInput.value = s;\n }\n\n async substrucrureSearch(column: DG.Column): Promise<DG.BitSet | null> {\n return await linearSubstructureSearch(this.substructure, column);\n }\n}\n\nexport class SeparatorFilter extends FastaFilter {\n readonly separatorInput: DG.InputBase<string>;\n colSeparator = '';\n\n constructor(separator: string) {\n super();\n\n this.separatorInput = ui.stringInput('', '', () => {\n this.onChanged.next();\n }, {placeholder: 'Separator'});\n this.colSeparator = separator;\n this.separatorInput.value = separator;\n }\n\n get filterPanel() {\n return ui.divV([\n this.substructureInput.root,\n this.separatorInput.root\n ]);\n }\n\n get substructure() {\n return this.separatorInput.value && this.separatorInput.value !== this.colSeparator ?\n this.substructureInput.value.replaceAll(this.separatorInput.value, this.colSeparator) :\n this.substructureInput.value;\n }\n\n set substructure(s: string) {\n this.substructureInput.value = s;\n }\n\n async substrucrureSearch(column: DG.Column): Promise<DG.BitSet | null> {\n return await linearSubstructureSearch(this.substructure, column, this.colSeparator);\n }\n}\n\nexport class HelmFilter extends BioFilterBase {\n helmEditor: any;\n _filterPanel = ui.div('', {style: {cursor: 'pointer'}});\n helmSubstructure = '';\n\n constructor() {\n super();\n this.init();\n }\n\n async init() {\n this.helmEditor = await grok.functions.call('HELM:helmWebEditor');\n await ui.tools.waitForElementInDom(this._filterPanel);\n this.updateFilterPanel();\n this._filterPanel.addEventListener('click', (event: MouseEvent) => {\n const {editorDiv, webEditor} = this.helmEditor.createWebEditor(this.helmSubstructure);\n //@ts-ignore\n ui.dialog({showHeader: false, showFooter: true})\n .add(editorDiv)\n .onOK(() => {\n const helmString = webEditor.canvas.getHelm(true)\n .replace(/<\\/span>/g, '').replace(/<span style='background:#bbf;'>/g, '');\n this.helmSubstructure = helmString;\n this.updateFilterPanel(this.substructure);\n setTimeout(() => { this.onChanged.next(); }, 10);\n }).show({modal: true, fullScreen: true});\n });\n ui.onSizeChanged(this._filterPanel).subscribe((_) => {\n const helmString = this.helmEditor\n .webEditor.canvas.getHelm(true).replace(/<\\/span>/g, '').replace(/<span style='background:#bbf;'>/g, '');\n this.updateFilterPanel(helmString);\n });\n }\n\n get filterPanel() {\n return this._filterPanel;\n }\n\n get substructure() {\n return this.helmSubstructure;\n }\n\n set substructure(s: string) {\n this.helmEditor.editor.setHelm(s);\n }\n\n updateFilterPanel(helmString?: string) {\n const width = this._filterPanel.parentElement!.clientWidth < 100 ? 100 :\n this._filterPanel.parentElement!.clientWidth;\n const height = width / 2;\n if (!helmString) {\n const editDiv = ui.divText('Click to edit', 'helm-substructure-filter');\n updateDivInnerHTML(this._filterPanel, editDiv);\n } else {\n updateDivInnerHTML(this._filterPanel, this.helmEditor.host);\n this.helmEditor.editor.setHelm(helmString);\n this.helmEditor.resizeEditor(width, height);\n }\n }\n\n async substrucrureSearch(column: DG.Column): Promise<DG.BitSet | null> {\n ui.setUpdateIndicator(this._filterPanel, true);\n await delay(10);\n const res = await helmSubstructureSearch(this.substructure, column);\n ui.setUpdateIndicator(this._filterPanel, false);\n return res;\n }\n}\n","\"use strict\";\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils = __importStar(require(\"./utils\"));\nfunction makeHeap(nPoints, size) {\n var makeArrays = function (fillValue) {\n return utils.empty(nPoints).map(function () {\n return utils.filled(size, fillValue);\n });\n };\n var heap = [];\n heap.push(makeArrays(-1));\n heap.push(makeArrays(Infinity));\n heap.push(makeArrays(0));\n return heap;\n}\nexports.makeHeap = makeHeap;\nfunction rejectionSample(nSamples, poolSize, random) {\n var result = utils.zeros(nSamples);\n for (var i = 0; i < nSamples; i++) {\n var rejectSample = true;\n var j = 0;\n while (rejectSample) {\n j = utils.tauRandInt(poolSize, random);\n var broken = false;\n for (var k = 0; k < i; k++) {\n if (j === result[k]) {\n broken = true;\n break;\n }\n }\n if (!broken)\n rejectSample = false;\n }\n result[i] = j;\n }\n return result;\n}\nexports.rejectionSample = rejectionSample;\nfunction heapPush(heap, row, weight, index, flag) {\n row = Math.floor(row);\n var indices = heap[0][row];\n var weights = heap[1][row];\n var isNew = heap[2][row];\n if (weight >= weights[0]) {\n return 0;\n }\n for (var i = 0; i < indices.length; i++) {\n if (index === indices[i]) {\n return 0;\n }\n }\n return uncheckedHeapPush(heap, row, weight, index, flag);\n}\nexports.heapPush = heapPush;\nfunction uncheckedHeapPush(heap, row, weight, index, flag) {\n var indices = heap[0][row];\n var weights = heap[1][row];\n var isNew = heap[2][row];\n if (weight >= weights[0]) {\n return 0;\n }\n weights[0] = weight;\n indices[0] = index;\n isNew[0] = flag;\n var i = 0;\n var iSwap = 0;\n while (true) {\n var ic1 = 2 * i + 1;\n var ic2 = ic1 + 1;\n var heapShape2 = heap[0][0].length;\n if (ic1 >= heapShape2) {\n break;\n }\n else if (ic2 >= heapShape2) {\n if (weights[ic1] > weight) {\n iSwap = ic1;\n }\n else {\n break;\n }\n }\n else if (weights[ic1] >= weights[ic2]) {\n if (weight < weights[ic1]) {\n iSwap = ic1;\n }\n else {\n break;\n }\n }\n else {\n if (weight < weights[ic2]) {\n iSwap = ic2;\n }\n else {\n break;\n }\n }\n weights[i] = weights[iSwap];\n indices[i] = indices[iSwap];\n isNew[i] = isNew[iSwap];\n i = iSwap;\n }\n weights[i] = weight;\n indices[i] = index;\n isNew[i] = flag;\n return 1;\n}\nexports.uncheckedHeapPush = uncheckedHeapPush;\nfunction buildCandidates(currentGraph, nVertices, nNeighbors, maxCandidates, random) {\n var candidateNeighbors = makeHeap(nVertices, maxCandidates);\n for (var i = 0; i < nVertices; i++) {\n for (var j = 0; j < nNeighbors; j++) {\n if (currentGraph[0][i][j] < 0) {\n continue;\n }\n var idx = currentGraph[0][i][j];\n var isn = currentGraph[2][i][j];\n var d = utils.tauRand(random);\n heapPush(candidateNeighbors, i, d, idx, isn);\n heapPush(candidateNeighbors, idx, d, i, isn);\n currentGraph[2][i][j] = 0;\n }\n }\n return candidateNeighbors;\n}\nexports.buildCandidates = buildCandidates;\nfunction deheapSort(heap) {\n var indices = heap[0];\n var weights = heap[1];\n for (var i = 0; i < indices.length; i++) {\n var indHeap = indices[i];\n var distHeap = weights[i];\n for (var j = 0; j < indHeap.length - 1; j++) {\n var indHeapIndex = indHeap.length - j - 1;\n var distHeapIndex = distHeap.length - j - 1;\n var temp1 = indHeap[0];\n indHeap[0] = indHeap[indHeapIndex];\n indHeap[indHeapIndex] = temp1;\n var temp2 = distHeap[0];\n distHeap[0] = distHeap[distHeapIndex];\n distHeap[distHeapIndex] = temp2;\n siftDown(distHeap, indHeap, distHeapIndex, 0);\n }\n }\n return { indices: indices, weights: weights };\n}\nexports.deheapSort = deheapSort;\nfunction siftDown(heap1, heap2, ceiling, elt) {\n while (elt * 2 + 1 < ceiling) {\n var leftChild = elt * 2 + 1;\n var rightChild = leftChild + 1;\n var swap = elt;\n if (heap1[swap] < heap1[leftChild]) {\n swap = leftChild;\n }\n if (rightChild < ceiling && heap1[swap] < heap1[rightChild]) {\n swap = rightChild;\n }\n if (swap === elt) {\n break;\n }\n else {\n var temp1 = heap1[elt];\n heap1[elt] = heap1[swap];\n heap1[swap] = temp1;\n var temp2 = heap2[elt];\n heap2[elt] = heap2[swap];\n heap2[swap] = temp2;\n elt = swap;\n }\n }\n}\nfunction smallestFlagged(heap, row) {\n var ind = heap[0][row];\n var dist = heap[1][row];\n var flag = heap[2][row];\n var minDist = Infinity;\n var resultIndex = -1;\n for (var i = 0; i > ind.length; i++) {\n if (flag[i] === 1 && dist[i] < minDist) {\n minDist = dist[i];\n resultIndex = i;\n }\n }\n if (resultIndex >= 0) {\n flag[resultIndex] = 0;\n return Math.floor(ind[resultIndex]);\n }\n else {\n return -1;\n }\n}\nexports.smallestFlagged = smallestFlagged;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar umap_1 = require(\"./umap\");\nexports.UMAP = umap_1.UMAP;\n","\"use strict\";\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar _a;\nvar utils = __importStar(require(\"./utils\"));\nvar SparseMatrix = (function () {\n function SparseMatrix(rows, cols, values, dims) {\n this.entries = new Map();\n this.nRows = 0;\n this.nCols = 0;\n if (rows.length !== cols.length || rows.length !== values.length) {\n throw new Error('rows, cols and values arrays must all have the same length');\n }\n this.nRows = dims[0];\n this.nCols = dims[1];\n for (var i = 0; i < values.length; i++) {\n var row = rows[i];\n var col = cols[i];\n this.checkDims(row, col);\n var key = this.makeKey(row, col);\n this.entries.set(key, { value: values[i], row: row, col: col });\n }\n }\n SparseMatrix.prototype.makeKey = function (row, col) {\n return row + \":\" + col;\n };\n SparseMatrix.prototype.checkDims = function (row, col) {\n var withinBounds = row < this.nRows && col < this.nCols;\n if (!withinBounds) {\n throw new Error('row and/or col specified outside of matrix dimensions');\n }\n };\n SparseMatrix.prototype.set = function (row, col, value) {\n this.checkDims(row, col);\n var key = this.makeKey(row, col);\n if (!this.entries.has(key)) {\n this.entries.set(key, { value: value, row: row, col: col });\n }\n else {\n this.entries.get(key).value = value;\n }\n };\n SparseMatrix.prototype.get = function (row, col, defaultValue) {\n if (defaultValue === void 0) { defaultValue = 0; }\n this.checkDims(row, col);\n var key = this.makeKey(row, col);\n if (this.entries.has(key)) {\n return this.entries.get(key).value;\n }\n else {\n return defaultValue;\n }\n };\n SparseMatrix.prototype.getAll = function (ordered) {\n if (ordered === void 0) { ordered = true; }\n var rowColValues = [];\n this.entries.forEach(function (value) {\n rowColValues.push(value);\n });\n if (ordered) {\n rowColValues.sort(function (a, b) {\n if (a.row === b.row) {\n return a.col - b.col;\n }\n else {\n return a.row - b.row;\n }\n });\n }\n return rowColValues;\n };\n SparseMatrix.prototype.getDims = function () {\n return [this.nRows, this.nCols];\n };\n SparseMatrix.prototype.getRows = function () {\n return Array.from(this.entries, function (_a) {\n var _b = __read(_a, 2), key = _b[0], value = _b[1];\n return value.row;\n });\n };\n SparseMatrix.prototype.getCols = function () {\n return Array.from(this.entries, function (_a) {\n var _b = __read(_a, 2), key = _b[0], value = _b[1];\n return value.col;\n });\n };\n SparseMatrix.prototype.getValues = function () {\n return Array.from(this.entries, function (_a) {\n var _b = __read(_a, 2), key = _b[0], value = _b[1];\n return value.value;\n });\n };\n SparseMatrix.prototype.forEach = function (fn) {\n this.entries.forEach(function (value) { return fn(value.value, value.row, value.col); });\n };\n SparseMatrix.prototype.map = function (fn) {\n var vals = [];\n this.entries.forEach(function (value) {\n vals.push(fn(value.value, value.row, value.col));\n });\n var dims = [this.nRows, this.nCols];\n return new SparseMatrix(this.getRows(), this.getCols(), vals, dims);\n };\n SparseMatrix.prototype.toArray = function () {\n var _this = this;\n var rows = utils.empty(this.nRows);\n var output = rows.map(function () {\n return utils.zeros(_this.nCols);\n });\n this.entries.forEach(function (value) {\n output[value.row][value.col] = value.value;\n });\n return output;\n };\n return SparseMatrix;\n}());\nexports.SparseMatrix = SparseMatrix;\nfunction transpose(matrix) {\n var cols = [];\n var rows = [];\n var vals = [];\n matrix.forEach(function (value, row, col) {\n cols.push(row);\n rows.push(col);\n vals.push(value);\n });\n var dims = [matrix.nCols, matrix.nRows];\n return new SparseMatrix(rows, cols, vals, dims);\n}\nexports.transpose = transpose;\nfunction identity(size) {\n var _a = __read(size, 1), rows = _a[0];\n var matrix = new SparseMatrix([], [], [], size);\n for (var i = 0; i < rows; i++) {\n matrix.set(i, i, 1);\n }\n return matrix;\n}\nexports.identity = identity;\nfunction pairwiseMultiply(a, b) {\n return elementWise(a, b, function (x, y) { return x * y; });\n}\nexports.pairwiseMultiply = pairwiseMultiply;\nfunction add(a, b) {\n return elementWise(a, b, function (x, y) { return x + y; });\n}\nexports.add = add;\nfunction subtract(a, b) {\n return elementWise(a, b, function (x, y) { return x - y; });\n}\nexports.subtract = subtract;\nfunction maximum(a, b) {\n return elementWise(a, b, function (x, y) { return (x > y ? x : y); });\n}\nexports.maximum = maximum;\nfunction multiplyScalar(a, scalar) {\n return a.map(function (value) {\n return value * scalar;\n });\n}\nexports.multiplyScalar = multiplyScalar;\nfunction eliminateZeros(m) {\n var zeroIndices = new Set();\n var values = m.getValues();\n var rows = m.getRows();\n var cols = m.getCols();\n for (var i = 0; i < values.length; i++) {\n if (values[i] === 0) {\n zeroIndices.add(i);\n }\n }\n var removeByZeroIndex = function (_, index) { return !zeroIndices.has(index); };\n var nextValues = values.filter(removeByZeroIndex);\n var nextRows = rows.filter(removeByZeroIndex);\n var nextCols = cols.filter(removeByZeroIndex);\n return new SparseMatrix(nextRows, nextCols, nextValues, m.getDims());\n}\nexports.eliminateZeros = eliminateZeros;\nfunction normalize(m, normType) {\n if (normType === void 0) { normType = \"l2\"; }\n var e_1, _a;\n var normFn = normFns[normType];\n var colsByRow = new Map();\n m.forEach(function (_, row, col) {\n var cols = colsByRow.get(row) || [];\n cols.push(col);\n colsByRow.set(row, cols);\n });\n var nextMatrix = new SparseMatrix([], [], [], m.getDims());\n var _loop_1 = function (row) {\n var cols = colsByRow.get(row).sort();\n var vals = cols.map(function (col) { return m.get(row, col); });\n var norm = normFn(vals);\n for (var i = 0; i < norm.length; i++) {\n nextMatrix.set(row, cols[i], norm[i]);\n }\n };\n try {\n for (var _b = __values(colsByRow.keys()), _c = _b.next(); !_c.done; _c = _b.next()) {\n var row = _c.value;\n _loop_1(row);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return nextMatrix;\n}\nexports.normalize = normalize;\nvar normFns = (_a = {},\n _a[\"max\"] = function (xs) {\n var max = -Infinity;\n for (var i = 0; i < xs.length; i++) {\n max = xs[i] > max ? xs[i] : max;\n }\n return xs.map(function (x) { return x / max; });\n },\n _a[\"l1\"] = function (xs) {\n var sum = 0;\n for (var i = 0; i < xs.length; i++) {\n sum += xs[i];\n }\n return xs.map(function (x) { return x / sum; });\n },\n _a[\"l2\"] = function (xs) {\n var sum = 0;\n for (var i = 0; i < xs.length; i++) {\n sum += Math.pow(xs[i], 2);\n }\n return xs.map(function (x) { return Math.sqrt(Math.pow(x, 2) / sum); });\n },\n _a);\nfunction elementWise(a, b, op) {\n var visited = new Set();\n var rows = [];\n var cols = [];\n var vals = [];\n var operate = function (row, col) {\n rows.push(row);\n cols.push(col);\n var nextValue = op(a.get(row, col), b.get(row, col));\n vals.push(nextValue);\n };\n var valuesA = a.getValues();\n var rowsA = a.getRows();\n var colsA = a.getCols();\n for (var i = 0; i < valuesA.length; i++) {\n var row = rowsA[i];\n var col = colsA[i];\n var key = row + \":\" + col;\n visited.add(key);\n operate(row, col);\n }\n var valuesB = b.getValues();\n var rowsB = b.getRows();\n var colsB = b.getCols();\n for (var i = 0; i < valuesB.length; i++) {\n var row = rowsB[i];\n var col = colsB[i];\n var key = row + \":\" + col;\n if (visited.has(key))\n continue;\n operate(row, col);\n }\n var dims = [a.nRows, a.nCols];\n return new SparseMatrix(rows, cols, vals, dims);\n}\nfunction getCSR(x) {\n var entries = [];\n x.forEach(function (value, row, col) {\n entries.push({ value: value, row: row, col: col });\n });\n entries.sort(function (a, b) {\n if (a.row === b.row) {\n return a.col - b.col;\n }\n else {\n return a.row - b.row;\n }\n });\n var indices = [];\n var values = [];\n var indptr = [];\n var currentRow = -1;\n for (var i = 0; i < entries.length; i++) {\n var _a = entries[i], row = _a.row, col = _a.col, value = _a.value;\n if (row !== currentRow) {\n currentRow = row;\n indptr.push(i);\n }\n indices.push(col);\n values.push(value);\n }\n return { indices: indices, values: values, indptr: indptr };\n}\nexports.getCSR = getCSR;\n","\"use strict\";\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar heap = __importStar(require(\"./heap\"));\nvar matrix = __importStar(require(\"./matrix\"));\nvar tree = __importStar(require(\"./tree\"));\nvar utils = __importStar(require(\"./utils\"));\nfunction makeNNDescent(distanceFn, random) {\n return function nNDescent(data, leafArray, nNeighbors, nIters, maxCandidates, delta, rho, rpTreeInit) {\n if (nIters === void 0) { nIters = 10; }\n if (maxCandidates === void 0) { maxCandidates = 50; }\n if (delta === void 0) { delta = 0.001; }\n if (rho === void 0) { rho = 0.5; }\n if (rpTreeInit === void 0) { rpTreeInit = true; }\n var nVertices = data.length;\n var currentGraph = heap.makeHeap(data.length, nNeighbors);\n for (var i = 0; i < data.length; i++) {\n var indices = heap.rejectionSample(nNeighbors, data.length, random);\n for (var j = 0; j < indices.length; j++) {\n var d = distanceFn(data[i], data[indices[j]]);\n heap.heapPush(currentGraph, i, d, indices[j], 1);\n heap.heapPush(currentGraph, indices[j], d, i, 1);\n }\n }\n if (rpTreeInit) {\n for (var n = 0; n < leafArray.length; n++) {\n for (var i = 0; i < leafArray[n].length; i++) {\n if (leafArray[n][i] < 0) {\n break;\n }\n for (var j = i + 1; j < leafArray[n].length; j++) {\n if (leafArray[n][j] < 0) {\n break;\n }\n var d = distanceFn(data[leafArray[n][i]], data[leafArray[n][j]]);\n heap.heapPush(currentGraph, leafArray[n][i], d, leafArray[n][j], 1);\n heap.heapPush(currentGraph, leafArray[n][j], d, leafArray[n][i], 1);\n }\n }\n }\n }\n for (var n = 0; n < nIters; n++) {\n var candidateNeighbors = heap.buildCandidates(currentGraph, nVertices, nNeighbors, maxCandidates, random);\n var c = 0;\n for (var i = 0; i < nVertices; i++) {\n for (var j = 0; j < maxCandidates; j++) {\n var p = Math.floor(candidateNeighbors[0][i][j]);\n if (p < 0 || utils.tauRand(random) < rho) {\n continue;\n }\n for (var k = 0; k < maxCandidates; k++) {\n var q = Math.floor(candidateNeighbors[0][i][k]);\n var cj = candidateNeighbors[2][i][j];\n var ck = candidateNeighbors[2][i][k];\n if (q < 0 || (!cj && !ck)) {\n continue;\n }\n var d = distanceFn(data[p], data[q]);\n c += heap.heapPush(currentGraph, p, d, q, 1);\n c += heap.heapPush(currentGraph, q, d, p, 1);\n }\n }\n }\n if (c <= delta * nNeighbors * data.length) {\n break;\n }\n }\n var sorted = heap.deheapSort(currentGraph);\n return sorted;\n };\n}\nexports.makeNNDescent = makeNNDescent;\nfunction makeInitializations(distanceFn) {\n function initFromRandom(nNeighbors, data, queryPoints, _heap, random) {\n for (var i = 0; i < queryPoints.length; i++) {\n var indices = utils.rejectionSample(nNeighbors, data.length, random);\n for (var j = 0; j < indices.length; j++) {\n if (indices[j] < 0) {\n continue;\n }\n var d = distanceFn(data[indices[j]], queryPoints[i]);\n heap.heapPush(_heap, i, d, indices[j], 1);\n }\n }\n }\n function initFromTree(_tree, data, queryPoints, _heap, random) {\n for (var i = 0; i < queryPoints.length; i++) {\n var indices = tree.searchFlatTree(queryPoints[i], _tree, random);\n for (var j = 0; j < indices.length; j++) {\n if (indices[j] < 0) {\n return;\n }\n var d = distanceFn(data[indices[j]], queryPoints[i]);\n heap.heapPush(_heap, i, d, indices[j], 1);\n }\n }\n return;\n }\n return { initFromRandom: initFromRandom, initFromTree: initFromTree };\n}\nexports.makeInitializations = makeInitializations;\nfunction makeInitializedNNSearch(distanceFn) {\n return function nnSearchFn(data, graph, initialization, queryPoints) {\n var e_1, _a;\n var _b = matrix.getCSR(graph), indices = _b.indices, indptr = _b.indptr;\n for (var i = 0; i < queryPoints.length; i++) {\n var tried = new Set(initialization[0][i]);\n while (true) {\n var vertex = heap.smallestFlagged(initialization, i);\n if (vertex === -1) {\n break;\n }\n var candidates = indices.slice(indptr[vertex], indptr[vertex + 1]);\n try {\n for (var candidates_1 = __values(candidates), candidates_1_1 = candidates_1.next(); !candidates_1_1.done; candidates_1_1 = candidates_1.next()) {\n var candidate = candidates_1_1.value;\n if (candidate === vertex ||\n candidate === -1 ||\n tried.has(candidate)) {\n continue;\n }\n var d = distanceFn(data[candidate], queryPoints[i]);\n heap.uncheckedHeapPush(initialization, i, d, candidate, 1);\n tried.add(candidate);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (candidates_1_1 && !candidates_1_1.done && (_a = candidates_1.return)) _a.call(candidates_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n }\n }\n return initialization;\n };\n}\nexports.makeInitializedNNSearch = makeInitializedNNSearch;\nfunction initializeSearch(forest, data, queryPoints, nNeighbors, initFromRandom, initFromTree, random) {\n var e_2, _a;\n var results = heap.makeHeap(queryPoints.length, nNeighbors);\n initFromRandom(nNeighbors, data, queryPoints, results, random);\n if (forest) {\n try {\n for (var forest_1 = __values(forest), forest_1_1 = forest_1.next(); !forest_1_1.done; forest_1_1 = forest_1.next()) {\n var tree_1 = forest_1_1.value;\n initFromTree(tree_1, data, queryPoints, results, random);\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (forest_1_1 && !forest_1_1.done && (_a = forest_1.return)) _a.call(forest_1);\n }\n finally { if (e_2) throw e_2.error; }\n }\n }\n return results;\n}\nexports.initializeSearch = initializeSearch;\n","\"use strict\";\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __spread = (this && this.__spread) || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));\n return ar;\n};\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils = __importStar(require(\"./utils\"));\nvar FlatTree = (function () {\n function FlatTree(hyperplanes, offsets, children, indices) {\n this.hyperplanes = hyperplanes;\n this.offsets = offsets;\n this.children = children;\n this.indices = indices;\n }\n return FlatTree;\n}());\nexports.FlatTree = FlatTree;\nfunction makeForest(data, nNeighbors, nTrees, random) {\n var leafSize = Math.max(10, nNeighbors);\n var trees = utils\n .range(nTrees)\n .map(function (_, i) { return makeTree(data, leafSize, i, random); });\n var forest = trees.map(function (tree) { return flattenTree(tree, leafSize); });\n return forest;\n}\nexports.makeForest = makeForest;\nfunction makeTree(data, leafSize, n, random) {\n if (leafSize === void 0) { leafSize = 30; }\n var indices = utils.range(data.length);\n var tree = makeEuclideanTree(data, indices, leafSize, n, random);\n return tree;\n}\nfunction makeEuclideanTree(data, indices, leafSize, q, random) {\n if (leafSize === void 0) { leafSize = 30; }\n if (indices.length > leafSize) {\n var splitResults = euclideanRandomProjectionSplit(data, indices, random);\n var indicesLeft = splitResults.indicesLeft, indicesRight = splitResults.indicesRight, hyperplane = splitResults.hyperplane, offset = splitResults.offset;\n var leftChild = makeEuclideanTree(data, indicesLeft, leafSize, q + 1, random);\n var rightChild = makeEuclideanTree(data, indicesRight, leafSize, q + 1, random);\n var node = { leftChild: leftChild, rightChild: rightChild, isLeaf: false, hyperplane: hyperplane, offset: offset };\n return node;\n }\n else {\n var node = { indices: indices, isLeaf: true };\n return node;\n }\n}\nfunction euclideanRandomProjectionSplit(data, indices, random) {\n var dim = data[0].length;\n var leftIndex = utils.tauRandInt(indices.length, random);\n var rightIndex = utils.tauRandInt(indices.length, random);\n rightIndex += leftIndex === rightIndex ? 1 : 0;\n rightIndex = rightIndex % indices.length;\n var left = indices[leftIndex];\n var right = indices[rightIndex];\n var hyperplaneOffset = 0;\n var hyperplaneVector = utils.zeros(dim);\n for (var i = 0; i < hyperplaneVector.length; i++) {\n hyperplaneVector[i] = data[left][i] - data[right][i];\n hyperplaneOffset -=\n (hyperplaneVector[i] * (data[left][i] + data[right][i])) / 2.0;\n }\n var nLeft = 0;\n var nRight = 0;\n var side = utils.zeros(indices.length);\n for (var i = 0; i < indices.length; i++) {\n var margin = hyperplaneOffset;\n for (var d = 0; d < dim; d++) {\n margin += hyperplaneVector[d] * data[indices[i]][d];\n }\n if (margin === 0) {\n side[i] = utils.tauRandInt(2, random);\n if (side[i] === 0) {\n nLeft += 1;\n }\n else {\n nRight += 1;\n }\n }\n else if (margin > 0) {\n side[i] = 0;\n nLeft += 1;\n }\n else {\n side[i] = 1;\n nRight += 1;\n }\n }\n var indicesLeft = utils.zeros(nLeft);\n var indicesRight = utils.zeros(nRight);\n nLeft = 0;\n nRight = 0;\n for (var i = 0; i < side.length; i++) {\n if (side[i] === 0) {\n indicesLeft[nLeft] = indices[i];\n nLeft += 1;\n }\n else {\n indicesRight[nRight] = indices[i];\n nRight += 1;\n }\n }\n return {\n indicesLeft: indicesLeft,\n indicesRight: indicesRight,\n hyperplane: hyperplaneVector,\n offset: hyperplaneOffset,\n };\n}\nfunction flattenTree(tree, leafSize) {\n var nNodes = numNodes(tree);\n var nLeaves = numLeaves(tree);\n var hyperplanes = utils\n .range(nNodes)\n .map(function () { return utils.zeros(tree.hyperplane ? tree.hyperplane.length : 0); });\n var offsets = utils.zeros(nNodes);\n var children = utils.range(nNodes).map(function () { return [-1, -1]; });\n var indices = utils\n .range(nLeaves)\n .map(function () { return utils.range(leafSize).map(function () { return -1; }); });\n recursiveFlatten(tree, hyperplanes, offsets, children, indices, 0, 0);\n return new FlatTree(hyperplanes, offsets, children, indices);\n}\nfunction recursiveFlatten(tree, hyperplanes, offsets, children, indices, nodeNum, leafNum) {\n var _a;\n if (tree.isLeaf) {\n children[nodeNum][0] = -leafNum;\n (_a = indices[leafNum]).splice.apply(_a, __spread([0, tree.indices.length], tree.indices));\n leafNum += 1;\n return { nodeNum: nodeNum, leafNum: leafNum };\n }\n else {\n hyperplanes[nodeNum] = tree.hyperplane;\n offsets[nodeNum] = tree.offset;\n children[nodeNum][0] = nodeNum + 1;\n var oldNodeNum = nodeNum;\n var res = recursiveFlatten(tree.leftChild, hyperplanes, offsets, children, indices, nodeNum + 1, leafNum);\n nodeNum = res.nodeNum;\n leafNum = res.leafNum;\n children[oldNodeNum][1] = nodeNum + 1;\n res = recursiveFlatten(tree.rightChild, hyperplanes, offsets, children, indices, nodeNum + 1, leafNum);\n return { nodeNum: res.nodeNum, leafNum: res.leafNum };\n }\n}\nfunction numNodes(tree) {\n if (tree.isLeaf) {\n return 1;\n }\n else {\n return 1 + numNodes(tree.leftChild) + numNodes(tree.rightChild);\n }\n}\nfunction numLeaves(tree) {\n if (tree.isLeaf) {\n return 1;\n }\n else {\n return numLeaves(tree.leftChild) + numLeaves(tree.rightChild);\n }\n}\nfunction makeLeafArray(rpForest) {\n var e_1, _a;\n if (rpForest.length > 0) {\n var output = [];\n try {\n for (var rpForest_1 = __values(rpForest), rpForest_1_1 = rpForest_1.next(); !rpForest_1_1.done; rpForest_1_1 = rpForest_1.next()) {\n var tree = rpForest_1_1.value;\n output.push.apply(output, __spread(tree.indices));\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (rpForest_1_1 && !rpForest_1_1.done && (_a = rpForest_1.return)) _a.call(rpForest_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return output;\n }\n else {\n return [[-1]];\n }\n}\nexports.makeLeafArray = makeLeafArray;\nfunction selectSide(hyperplane, offset, point, random) {\n var margin = offset;\n for (var d = 0; d < point.length; d++) {\n margin += hyperplane[d] * point[d];\n }\n if (margin === 0) {\n var side = utils.tauRandInt(2, random);\n return side;\n }\n else if (margin > 0) {\n return 0;\n }\n else {\n return 1;\n }\n}\nfunction searchFlatTree(point, tree, random) {\n var node = 0;\n while (tree.children[node][0] > 0) {\n var side = selectSide(tree.hyperplanes[node], tree.offsets[node], point, random);\n if (side === 0) {\n node = tree.children[node][0];\n }\n else {\n node = tree.children[node][1];\n }\n }\n var index = -1 * tree.children[node][0];\n return tree.indices[index];\n}\nexports.searchFlatTree = searchFlatTree;\n","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __spread = (this && this.__spread) || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));\n return ar;\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar heap = __importStar(require(\"./heap\"));\nvar matrix = __importStar(require(\"./matrix\"));\nvar nnDescent = __importStar(require(\"./nn_descent\"));\nvar tree = __importStar(require(\"./tree\"));\nvar utils = __importStar(require(\"./utils\"));\nvar ml_levenberg_marquardt_1 = __importDefault(require(\"ml-levenberg-marquardt\"));\nvar SMOOTH_K_TOLERANCE = 1e-5;\nvar MIN_K_DIST_SCALE = 1e-3;\nvar UMAP = (function () {\n function UMAP(params) {\n if (params === void 0) { params = {}; }\n var _this = this;\n this.learningRate = 1.0;\n this.localConnectivity = 1.0;\n this.minDist = 0.1;\n this.nComponents = 2;\n this.nEpochs = 0;\n this.nNeighbors = 15;\n this.negativeSampleRate = 5;\n this.random = Math.random;\n this.repulsionStrength = 1.0;\n this.setOpMixRatio = 1.0;\n this.spread = 1.0;\n this.transformQueueSize = 4.0;\n this.targetMetric = \"categorical\";\n this.targetWeight = 0.5;\n this.targetNNeighbors = this.nNeighbors;\n this.distanceFn = euclidean;\n this.isInitialized = false;\n this.rpForest = [];\n this.embedding = [];\n this.optimizationState = new OptimizationState();\n var setParam = function (key) {\n if (params[key] !== undefined)\n _this[key] = params[key];\n };\n setParam('distanceFn');\n setParam('learningRate');\n setParam('localConnectivity');\n setParam('minDist');\n setParam('nComponents');\n setParam('nEpochs');\n setParam('nNeighbors');\n setParam('negativeSampleRate');\n setParam('random');\n setParam('repulsionStrength');\n setParam('setOpMixRatio');\n setParam('spread');\n setParam('transformQueueSize');\n }\n UMAP.prototype.fit = function (X) {\n this.initializeFit(X);\n this.optimizeLayout();\n return this.embedding;\n };\n UMAP.prototype.fitAsync = function (X, callback) {\n if (callback === void 0) { callback = function () { return true; }; }\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n this.initializeFit(X);\n return [4, this.optimizeLayoutAsync(callback)];\n case 1:\n _a.sent();\n return [2, this.embedding];\n }\n });\n });\n };\n UMAP.prototype.setSupervisedProjection = function (Y, params) {\n if (params === void 0) { params = {}; }\n this.Y = Y;\n this.targetMetric = params.targetMetric || this.targetMetric;\n this.targetWeight = params.targetWeight || this.targetWeight;\n this.targetNNeighbors = params.targetNNeighbors || this.targetNNeighbors;\n };\n UMAP.prototype.setPrecomputedKNN = function (knnIndices, knnDistances) {\n this.knnIndices = knnIndices;\n this.knnDistances = knnDistances;\n };\n UMAP.prototype.initializeFit = function (X) {\n if (X.length <= this.nNeighbors) {\n throw new Error(\"Not enough data points (\" + X.length + \") to create nNeighbors: \" + this.nNeighbors + \". Add more data points or adjust the configuration.\");\n }\n if (this.X === X && this.isInitialized) {\n return this.getNEpochs();\n }\n this.X = X;\n if (!this.knnIndices && !this.knnDistances) {\n var knnResults = this.nearestNeighbors(X);\n this.knnIndices = knnResults.knnIndices;\n this.knnDistances = knnResults.knnDistances;\n }\n this.graph = this.fuzzySimplicialSet(X, this.nNeighbors, this.setOpMixRatio);\n this.makeSearchFns();\n this.searchGraph = this.makeSearchGraph(X);\n this.processGraphForSupervisedProjection();\n var _a = this.initializeSimplicialSetEmbedding(), head = _a.head, tail = _a.tail, epochsPerSample = _a.epochsPerSample;\n this.optimizationState.head = head;\n this.optimizationState.tail = tail;\n this.optimizationState.epochsPerSample = epochsPerSample;\n this.initializeOptimization();\n this.prepareForOptimizationLoop();\n this.isInitialized = true;\n return this.getNEpochs();\n };\n UMAP.prototype.makeSearchFns = function () {\n var _a = nnDescent.makeInitializations(this.distanceFn), initFromTree = _a.initFromTree, initFromRandom = _a.initFromRandom;\n this.initFromTree = initFromTree;\n this.initFromRandom = initFromRandom;\n this.search = nnDescent.makeInitializedNNSearch(this.distanceFn);\n };\n UMAP.prototype.makeSearchGraph = function (X) {\n var knnIndices = this.knnIndices;\n var knnDistances = this.knnDistances;\n var dims = [X.length, X.length];\n var searchGraph = new matrix.SparseMatrix([], [], [], dims);\n for (var i = 0; i < knnIndices.length; i++) {\n var knn = knnIndices[i];\n var distances = knnDistances[i];\n for (var j = 0; j < knn.length; j++) {\n var neighbor = knn[j];\n var distance = distances[j];\n if (distance > 0) {\n searchGraph.set(i, neighbor, distance);\n }\n }\n }\n var transpose = matrix.transpose(searchGraph);\n return matrix.maximum(searchGraph, transpose);\n };\n UMAP.prototype.transform = function (toTransform) {\n var _this = this;\n var rawData = this.X;\n if (rawData === undefined || rawData.length === 0) {\n throw new Error('No data has been fit.');\n }\n var nNeighbors = Math.floor(this.nNeighbors * this.transformQueueSize);\n nNeighbors = Math.min(rawData.length, nNeighbors);\n var init = nnDescent.initializeSearch(this.rpForest, rawData, toTransform, nNeighbors, this.initFromRandom, this.initFromTree, this.random);\n var result = this.search(rawData, this.searchGraph, init, toTransform);\n var _a = heap.deheapSort(result), indices = _a.indices, distances = _a.weights;\n indices = indices.map(function (x) { return x.slice(0, _this.nNeighbors); });\n distances = distances.map(function (x) { return x.slice(0, _this.nNeighbors); });\n var adjustedLocalConnectivity = Math.max(0, this.localConnectivity - 1);\n var _b = this.smoothKNNDistance(distances, this.nNeighbors, adjustedLocalConnectivity), sigmas = _b.sigmas, rhos = _b.rhos;\n var _c = this.computeMembershipStrengths(indices, distances, sigmas, rhos), rows = _c.rows, cols = _c.cols, vals = _c.vals;\n var size = [toTransform.length, rawData.length];\n var graph = new matrix.SparseMatrix(rows, cols, vals, size);\n var normed = matrix.normalize(graph, \"l1\");\n var csrMatrix = matrix.getCSR(normed);\n var nPoints = toTransform.length;\n var eIndices = utils.reshape2d(csrMatrix.indices, nPoints, this.nNeighbors);\n var eWeights = utils.reshape2d(csrMatrix.values, nPoints, this.nNeighbors);\n var embedding = initTransform(eIndices, eWeights, this.embedding);\n var nEpochs = this.nEpochs\n ? this.nEpochs / 3\n : graph.nRows <= 10000\n ? 100\n : 30;\n var graphMax = graph\n .getValues()\n .reduce(function (max, val) { return (val > max ? val : max); }, 0);\n graph = graph.map(function (value) { return (value < graphMax / nEpochs ? 0 : value); });\n graph = matrix.eliminateZeros(graph);\n var epochsPerSample = this.makeEpochsPerSample(graph.getValues(), nEpochs);\n var head = graph.getRows();\n var tail = graph.getCols();\n this.assignOptimizationStateParameters({\n headEmbedding: embedding,\n tailEmbedding: this.embedding,\n head: head,\n tail: tail,\n currentEpoch: 0,\n nEpochs: nEpochs,\n nVertices: graph.getDims()[1],\n epochsPerSample: epochsPerSample,\n });\n this.prepareForOptimizationLoop();\n return this.optimizeLayout();\n };\n UMAP.prototype.processGraphForSupervisedProjection = function () {\n var _a = this, Y = _a.Y, X = _a.X;\n if (Y) {\n if (Y.length !== X.length) {\n throw new Error('Length of X and y must be equal');\n }\n if (this.targetMetric === \"categorical\") {\n var lt = this.targetWeight < 1.0;\n var farDist = lt ? 2.5 * (1.0 / (1.0 - this.targetWeight)) : 1.0e12;\n this.graph = this.categoricalSimplicialSetIntersection(this.graph, Y, farDist);\n }\n }\n };\n UMAP.prototype.step = function () {\n var currentEpoch = this.optimizationState.currentEpoch;\n if (currentEpoch < this.getNEpochs()) {\n this.optimizeLayoutStep(currentEpoch);\n }\n return this.optimizationState.currentEpoch;\n };\n UMAP.prototype.getEmbedding = function () {\n return this.embedding;\n };\n UMAP.prototype.nearestNeighbors = function (X) {\n var _a = this, distanceFn = _a.distanceFn, nNeighbors = _a.nNeighbors;\n var log2 = function (n) { return Math.log(n) / Math.log(2); };\n var metricNNDescent = nnDescent.makeNNDescent(distanceFn, this.random);\n var round = function (n) {\n return n === 0.5 ? 0 : Math.round(n);\n };\n var nTrees = 5 + Math.floor(round(Math.pow(X.length, 0.5) / 20.0));\n var nIters = Math.max(5, Math.floor(Math.round(log2(X.length))));\n this.rpForest = tree.makeForest(X, nNeighbors, nTrees, this.random);\n var leafArray = tree.makeLeafArray(this.rpForest);\n var _b = metricNNDescent(X, leafArray, nNeighbors, nIters), indices = _b.indices, weights = _b.weights;\n return { knnIndices: indices, knnDistances: weights };\n };\n UMAP.prototype.fuzzySimplicialSet = function (X, nNeighbors, setOpMixRatio) {\n if (setOpMixRatio === void 0) { setOpMixRatio = 1.0; }\n var _a = this, _b = _a.knnIndices, knnIndices = _b === void 0 ? [] : _b, _c = _a.knnDistances, knnDistances = _c === void 0 ? [] : _c, localConnectivity = _a.localConnectivity;\n var _d = this.smoothKNNDistance(knnDistances, nNeighbors, localConnectivity), sigmas = _d.sigmas, rhos = _d.rhos;\n var _e = this.computeMembershipStrengths(knnIndices, knnDistances, sigmas, rhos), rows = _e.rows, cols = _e.cols, vals = _e.vals;\n var size = [X.length, X.length];\n var sparseMatrix = new matrix.SparseMatrix(rows, cols, vals, size);\n var transpose = matrix.transpose(sparseMatrix);\n var prodMatrix = matrix.pairwiseMultiply(sparseMatrix, transpose);\n var a = matrix.subtract(matrix.add(sparseMatrix, transpose), prodMatrix);\n var b = matrix.multiplyScalar(a, setOpMixRatio);\n var c = matrix.multiplyScalar(prodMatrix, 1.0 - setOpMixRatio);\n var result = matrix.add(b, c);\n return result;\n };\n UMAP.prototype.categoricalSimplicialSetIntersection = function (simplicialSet, target, farDist, unknownDist) {\n if (unknownDist === void 0) { unknownDist = 1.0; }\n var intersection = fastIntersection(simplicialSet, target, unknownDist, farDist);\n intersection = matrix.eliminateZeros(intersection);\n return resetLocalConnectivity(intersection);\n };\n UMAP.prototype.smoothKNNDistance = function (distances, k, localConnectivity, nIter, bandwidth) {\n if (localConnectivity === void 0) { localConnectivity = 1.0; }\n if (nIter === void 0) { nIter = 64; }\n if (bandwidth === void 0) { bandwidth = 1.0; }\n var target = (Math.log(k) / Math.log(2)) * bandwidth;\n var rho = utils.zeros(distances.length);\n var result = utils.zeros(distances.length);\n for (var i = 0; i < distances.length; i++) {\n var lo = 0.0;\n var hi = Infinity;\n var mid = 1.0;\n var ithDistances = distances[i];\n var nonZeroDists = ithDistances.filter(function (d) { return d > 0.0; });\n if (nonZeroDists.length >= localConnectivity) {\n var index = Math.floor(localConnectivity);\n var interpolation = localConnectivity - index;\n if (index > 0) {\n rho[i] = nonZeroDists[index - 1];\n if (interpolation > SMOOTH_K_TOLERANCE) {\n rho[i] +=\n interpolation * (nonZeroDists[index] - nonZeroDists[index - 1]);\n }\n }\n else {\n rho[i] = interpolation * nonZeroDists[0];\n }\n }\n else if (nonZeroDists.length > 0) {\n rho[i] = utils.max(nonZeroDists);\n }\n for (var n = 0; n < nIter; n++) {\n var psum = 0.0;\n for (var j = 1; j < distances[i].length; j++) {\n var d = distances[i][j] - rho[i];\n if (d > 0) {\n psum += Math.exp(-(d / mid));\n }\n else {\n psum += 1.0;\n }\n }\n if (Math.abs(psum - target) < SMOOTH_K_TOLERANCE) {\n break;\n }\n if (psum > target) {\n hi = mid;\n mid = (lo + hi) / 2.0;\n }\n else {\n lo = mid;\n if (hi === Infinity) {\n mid *= 2;\n }\n else {\n mid = (lo + hi) / 2.0;\n }\n }\n }\n result[i] = mid;\n if (rho[i] > 0.0) {\n var meanIthDistances = utils.mean(ithDistances);\n if (result[i] < MIN_K_DIST_SCALE * meanIthDistances) {\n result[i] = MIN_K_DIST_SCALE * meanIthDistances;\n }\n }\n else {\n var meanDistances = utils.mean(distances.map(utils.mean));\n if (result[i] < MIN_K_DIST_SCALE * meanDistances) {\n result[i] = MIN_K_DIST_SCALE * meanDistances;\n }\n }\n }\n return { sigmas: result, rhos: rho };\n };\n UMAP.prototype.computeMembershipStrengths = function (knnIndices, knnDistances, sigmas, rhos) {\n var nSamples = knnIndices.length;\n var nNeighbors = knnIndices[0].length;\n var rows = utils.zeros(nSamples * nNeighbors);\n var cols = utils.zeros(nSamples * nNeighbors);\n var vals = utils.zeros(nSamples * nNeighbors);\n for (var i = 0; i < nSamples; i++) {\n for (var j = 0; j < nNeighbors; j++) {\n var val = 0;\n if (knnIndices[i][j] === -1) {\n continue;\n }\n if (knnIndices[i][j] === i) {\n val = 0.0;\n }\n else if (knnDistances[i][j] - rhos[i] <= 0.0) {\n val = 1.0;\n }\n else {\n val = Math.exp(-((knnDistances[i][j] - rhos[i]) / sigmas[i]));\n }\n rows[i * nNeighbors + j] = i;\n cols[i * nNeighbors + j] = knnIndices[i][j];\n vals[i * nNeighbors + j] = val;\n }\n }\n return { rows: rows, cols: cols, vals: vals };\n };\n UMAP.prototype.initializeSimplicialSetEmbedding = function () {\n var _this = this;\n var nEpochs = this.getNEpochs();\n var nComponents = this.nComponents;\n var graphValues = this.graph.getValues();\n var graphMax = 0;\n for (var i = 0; i < graphValues.length; i++) {\n var value = graphValues[i];\n if (graphMax < graphValues[i]) {\n graphMax = value;\n }\n }\n var graph = this.graph.map(function (value) {\n if (value < graphMax / nEpochs) {\n return 0;\n }\n else {\n return value;\n }\n });\n this.embedding = utils.zeros(graph.nRows).map(function () {\n return utils.zeros(nComponents).map(function () {\n return utils.tauRand(_this.random) * 20 + -10;\n });\n });\n var weights = [];\n var head = [];\n var tail = [];\n var rowColValues = graph.getAll();\n for (var i = 0; i < rowColValues.length; i++) {\n var entry = rowColValues[i];\n if (entry.value) {\n weights.push(entry.value);\n tail.push(entry.row);\n head.push(entry.col);\n }\n }\n var epochsPerSample = this.makeEpochsPerSample(weights, nEpochs);\n return { head: head, tail: tail, epochsPerSample: epochsPerSample };\n };\n UMAP.prototype.makeEpochsPerSample = function (weights, nEpochs) {\n var result = utils.filled(weights.length, -1.0);\n var max = utils.max(weights);\n var nSamples = weights.map(function (w) { return (w / max) * nEpochs; });\n nSamples.forEach(function (n, i) {\n if (n > 0)\n result[i] = nEpochs / nSamples[i];\n });\n return result;\n };\n UMAP.prototype.assignOptimizationStateParameters = function (state) {\n Object.assign(this.optimizationState, state);\n };\n UMAP.prototype.prepareForOptimizationLoop = function () {\n var _a = this, repulsionStrength = _a.repulsionStrength, learningRate = _a.learningRate, negativeSampleRate = _a.negativeSampleRate;\n var _b = this.optimizationState, epochsPerSample = _b.epochsPerSample, headEmbedding = _b.headEmbedding, tailEmbedding = _b.tailEmbedding;\n var dim = headEmbedding[0].length;\n var moveOther = headEmbedding.length === tailEmbedding.length;\n var epochsPerNegativeSample = epochsPerSample.map(function (e) { return e / negativeSampleRate; });\n var epochOfNextNegativeSample = __spread(epochsPerNegativeSample);\n var epochOfNextSample = __spread(epochsPerSample);\n this.assignOptimizationStateParameters({\n epochOfNextSample: epochOfNextSample,\n epochOfNextNegativeSample: epochOfNextNegativeSample,\n epochsPerNegativeSample: epochsPerNegativeSample,\n moveOther: moveOther,\n initialAlpha: learningRate,\n alpha: learningRate,\n gamma: repulsionStrength,\n dim: dim,\n });\n };\n UMAP.prototype.initializeOptimization = function () {\n var headEmbedding = this.embedding;\n var tailEmbedding = this.embedding;\n var _a = this.optimizationState, head = _a.head, tail = _a.tail, epochsPerSample = _a.epochsPerSample;\n var nEpochs = this.getNEpochs();\n var nVertices = this.graph.nCols;\n var _b = findABParams(this.spread, this.minDist), a = _b.a, b = _b.b;\n this.assignOptimizationStateParameters({\n headEmbedding: headEmbedding,\n tailEmbedding: tailEmbedding,\n head: head,\n tail: tail,\n epochsPerSample: epochsPerSample,\n a: a,\n b: b,\n nEpochs: nEpochs,\n nVertices: nVertices,\n });\n };\n UMAP.prototype.optimizeLayoutStep = function (n) {\n var optimizationState = this.optimizationState;\n var head = optimizationState.head, tail = optimizationState.tail, headEmbedding = optimizationState.headEmbedding, tailEmbedding = optimizationState.tailEmbedding, epochsPerSample = optimizationState.epochsPerSample, epochOfNextSample = optimizationState.epochOfNextSample, epochOfNextNegativeSample = optimizationState.epochOfNextNegativeSample, epochsPerNegativeSample = optimizationState.epochsPerNegativeSample, moveOther = optimizationState.moveOther, initialAlpha = optimizationState.initialAlpha, alpha = optimizationState.alpha, gamma = optimizationState.gamma, a = optimizationState.a, b = optimizationState.b, dim = optimizationState.dim, nEpochs = optimizationState.nEpochs, nVertices = optimizationState.nVertices;\n var clipValue = 4.0;\n for (var i = 0; i < epochsPerSample.length; i++) {\n if (epochOfNextSample[i] > n) {\n continue;\n }\n var j = head[i];\n var k = tail[i];\n var current = headEmbedding[j];\n var other = tailEmbedding[k];\n var distSquared = rDist(current, other);\n var gradCoeff = 0;\n if (distSquared > 0) {\n gradCoeff = -2.0 * a * b * Math.pow(distSquared, b - 1.0);\n gradCoeff /= a * Math.pow(distSquared, b) + 1.0;\n }\n for (var d = 0; d < dim; d++) {\n var gradD = clip(gradCoeff * (current[d] - other[d]), clipValue);\n current[d] += gradD * alpha;\n if (moveOther) {\n other[d] += -gradD * alpha;\n }\n }\n epochOfNextSample[i] += epochsPerSample[i];\n var nNegSamples = Math.floor((n - epochOfNextNegativeSample[i]) / epochsPerNegativeSample[i]);\n for (var p = 0; p < nNegSamples; p++) {\n var k_1 = utils.tauRandInt(nVertices, this.random);\n var other_1 = tailEmbedding[k_1];\n var distSquared_1 = rDist(current, other_1);\n var gradCoeff_1 = 0.0;\n if (distSquared_1 > 0.0) {\n gradCoeff_1 = 2.0 * gamma * b;\n gradCoeff_1 /=\n (0.001 + distSquared_1) * (a * Math.pow(distSquared_1, b) + 1);\n }\n else if (j === k_1) {\n continue;\n }\n for (var d = 0; d < dim; d++) {\n var gradD = 4.0;\n if (gradCoeff_1 > 0.0) {\n gradD = clip(gradCoeff_1 * (current[d] - other_1[d]), clipValue);\n }\n current[d] += gradD * alpha;\n }\n }\n epochOfNextNegativeSample[i] += nNegSamples * epochsPerNegativeSample[i];\n }\n optimizationState.alpha = initialAlpha * (1.0 - n / nEpochs);\n optimizationState.currentEpoch += 1;\n return headEmbedding;\n };\n UMAP.prototype.optimizeLayoutAsync = function (epochCallback) {\n var _this = this;\n if (epochCallback === void 0) { epochCallback = function () { return true; }; }\n return new Promise(function (resolve, reject) {\n var step = function () { return __awaiter(_this, void 0, void 0, function () {\n var _a, nEpochs, currentEpoch, epochCompleted, shouldStop, isFinished;\n return __generator(this, function (_b) {\n try {\n _a = this.optimizationState, nEpochs = _a.nEpochs, currentEpoch = _a.currentEpoch;\n this.embedding = this.optimizeLayoutStep(currentEpoch);\n epochCompleted = this.optimizationState.currentEpoch;\n shouldStop = epochCallback(epochCompleted) === false;\n isFinished = epochCompleted === nEpochs;\n if (!shouldStop && !isFinished) {\n setTimeout(function () { return step(); }, 0);\n }\n else {\n return [2, resolve(isFinished)];\n }\n }\n catch (err) {\n reject(err);\n }\n return [2];\n });\n }); };\n setTimeout(function () { return step(); }, 0);\n });\n };\n UMAP.prototype.optimizeLayout = function (epochCallback) {\n if (epochCallback === void 0) { epochCallback = function () { return true; }; }\n var isFinished = false;\n var embedding = [];\n while (!isFinished) {\n var _a = this.optimizationState, nEpochs = _a.nEpochs, currentEpoch = _a.currentEpoch;\n embedding = this.optimizeLayoutStep(currentEpoch);\n var epochCompleted = this.optimizationState.currentEpoch;\n var shouldStop = epochCallback(epochCompleted) === false;\n isFinished = epochCompleted === nEpochs || shouldStop;\n }\n return embedding;\n };\n UMAP.prototype.getNEpochs = function () {\n var graph = this.graph;\n if (this.nEpochs > 0) {\n return this.nEpochs;\n }\n var length = graph.nRows;\n if (length <= 2500) {\n return 500;\n }\n else if (length <= 5000) {\n return 400;\n }\n else if (length <= 7500) {\n return 300;\n }\n else {\n return 200;\n }\n };\n return UMAP;\n}());\nexports.UMAP = UMAP;\nfunction euclidean(x, y) {\n var result = 0;\n for (var i = 0; i < x.length; i++) {\n result += Math.pow((x[i] - y[i]), 2);\n }\n return Math.sqrt(result);\n}\nexports.euclidean = euclidean;\nfunction cosine(x, y) {\n var result = 0.0;\n var normX = 0.0;\n var normY = 0.0;\n for (var i = 0; i < x.length; i++) {\n result += x[i] * y[i];\n normX += Math.pow(x[i], 2);\n normY += Math.pow(y[i], 2);\n }\n if (normX === 0 && normY === 0) {\n return 0;\n }\n else if (normX === 0 || normY === 0) {\n return 1.0;\n }\n else {\n return 1.0 - result / Math.sqrt(normX * normY);\n }\n}\nexports.cosine = cosine;\nvar OptimizationState = (function () {\n function OptimizationState() {\n this.currentEpoch = 0;\n this.headEmbedding = [];\n this.tailEmbedding = [];\n this.head = [];\n this.tail = [];\n this.epochsPerSample = [];\n this.epochOfNextSample = [];\n this.epochOfNextNegativeSample = [];\n this.epochsPerNegativeSample = [];\n this.moveOther = true;\n this.initialAlpha = 1.0;\n this.alpha = 1.0;\n this.gamma = 1.0;\n this.a = 1.5769434603113077;\n this.b = 0.8950608779109733;\n this.dim = 2;\n this.nEpochs = 500;\n this.nVertices = 0;\n }\n return OptimizationState;\n}());\nfunction clip(x, clipValue) {\n if (x > clipValue)\n return clipValue;\n else if (x < -clipValue)\n return -clipValue;\n else\n return x;\n}\nfunction rDist(x, y) {\n var result = 0.0;\n for (var i = 0; i < x.length; i++) {\n result += Math.pow(x[i] - y[i], 2);\n }\n return result;\n}\nfunction findABParams(spread, minDist) {\n var curve = function (_a) {\n var _b = __read(_a, 2), a = _b[0], b = _b[1];\n return function (x) {\n return 1.0 / (1.0 + a * Math.pow(x, (2 * b)));\n };\n };\n var xv = utils\n .linear(0, spread * 3, 300)\n .map(function (val) { return (val < minDist ? 1.0 : val); });\n var yv = utils.zeros(xv.length).map(function (val, index) {\n var gte = xv[index] >= minDist;\n return gte ? Math.exp(-(xv[index] - minDist) / spread) : val;\n });\n var initialValues = [0.5, 0.5];\n var data = { x: xv, y: yv };\n var options = {\n damping: 1.5,\n initialValues: initialValues,\n gradientDifference: 10e-2,\n maxIterations: 100,\n errorTolerance: 10e-3,\n };\n var parameterValues = ml_levenberg_marquardt_1.default(data, curve, options).parameterValues;\n var _a = __read(parameterValues, 2), a = _a[0], b = _a[1];\n return { a: a, b: b };\n}\nexports.findABParams = findABParams;\nfunction fastIntersection(graph, target, unknownDist, farDist) {\n if (unknownDist === void 0) { unknownDist = 1.0; }\n if (farDist === void 0) { farDist = 5.0; }\n return graph.map(function (value, row, col) {\n if (target[row] === -1 || target[col] === -1) {\n return value * Math.exp(-unknownDist);\n }\n else if (target[row] !== target[col]) {\n return value * Math.exp(-farDist);\n }\n else {\n return value;\n }\n });\n}\nexports.fastIntersection = fastIntersection;\nfunction resetLocalConnectivity(simplicialSet) {\n simplicialSet = matrix.normalize(simplicialSet, \"max\");\n var transpose = matrix.transpose(simplicialSet);\n var prodMatrix = matrix.pairwiseMultiply(transpose, simplicialSet);\n simplicialSet = matrix.add(simplicialSet, matrix.subtract(transpose, prodMatrix));\n return matrix.eliminateZeros(simplicialSet);\n}\nexports.resetLocalConnectivity = resetLocalConnectivity;\nfunction initTransform(indices, weights, embedding) {\n var result = utils\n .zeros(indices.length)\n .map(function (z) { return utils.zeros(embedding[0].length); });\n for (var i = 0; i < indices.length; i++) {\n for (var j = 0; j < indices[0].length; j++) {\n for (var d = 0; d < embedding[0].length; d++) {\n var a = indices[i][j];\n result[i][d] += weights[i][j] * embedding[a][d];\n }\n }\n }\n return result;\n}\nexports.initTransform = initTransform;\n","\"use strict\";\nvar __values = (this && this.__values) || function (o) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\n if (m) return m.call(o);\n return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction tauRandInt(n, random) {\n return Math.floor(random() * n);\n}\nexports.tauRandInt = tauRandInt;\nfunction tauRand(random) {\n return random();\n}\nexports.tauRand = tauRand;\nfunction norm(vec) {\n var e_1, _a;\n var result = 0;\n try {\n for (var vec_1 = __values(vec), vec_1_1 = vec_1.next(); !vec_1_1.done; vec_1_1 = vec_1.next()) {\n var item = vec_1_1.value;\n result += Math.pow(item, 2);\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (vec_1_1 && !vec_1_1.done && (_a = vec_1.return)) _a.call(vec_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return Math.sqrt(result);\n}\nexports.norm = norm;\nfunction empty(n) {\n var output = [];\n for (var i = 0; i < n; i++) {\n output.push(undefined);\n }\n return output;\n}\nexports.empty = empty;\nfunction range(n) {\n return empty(n).map(function (_, i) { return i; });\n}\nexports.range = range;\nfunction filled(n, v) {\n return empty(n).map(function () { return v; });\n}\nexports.filled = filled;\nfunction zeros(n) {\n return filled(n, 0);\n}\nexports.zeros = zeros;\nfunction ones(n) {\n return filled(n, 1);\n}\nexports.ones = ones;\nfunction linear(a, b, len) {\n return empty(len).map(function (_, i) {\n return a + i * ((b - a) / (len - 1));\n });\n}\nexports.linear = linear;\nfunction sum(input) {\n return input.reduce(function (sum, val) { return sum + val; });\n}\nexports.sum = sum;\nfunction mean(input) {\n return sum(input) / input.length;\n}\nexports.mean = mean;\nfunction max(input) {\n var max = 0;\n for (var i = 0; i < input.length; i++) {\n max = input[i] > max ? input[i] : max;\n }\n return max;\n}\nexports.max = max;\nfunction max2d(input) {\n var max = 0;\n for (var i = 0; i < input.length; i++) {\n for (var j = 0; j < input[i].length; j++) {\n max = input[i][j] > max ? input[i][j] : max;\n }\n }\n return max;\n}\nexports.max2d = max2d;\nfunction rejectionSample(nSamples, poolSize, random) {\n var result = zeros(nSamples);\n for (var i = 0; i < nSamples; i++) {\n var rejectSample = true;\n while (rejectSample) {\n var j = tauRandInt(poolSize, random);\n var broken = false;\n for (var k = 0; k < i; k++) {\n if (j === result[k]) {\n broken = true;\n break;\n }\n }\n if (!broken) {\n rejectSample = false;\n }\n result[i] = j;\n }\n }\n return result;\n}\nexports.rejectionSample = rejectionSample;\nfunction reshape2d(x, a, b) {\n var rows = [];\n var count = 0;\n var index = 0;\n if (x.length !== a * b) {\n throw new Error('Array dimensions must match input length.');\n }\n for (var i = 0; i < a; i++) {\n var col = [];\n for (var j = 0; j < b; j++) {\n col.push(x[index]);\n index += 1;\n }\n rows.push(col);\n count += 1;\n }\n return rows;\n}\nexports.reshape2d = reshape2d;\n","module.exports = DG;","module.exports = grok;","module.exports = rxjs;","module.exports = ui;","module.exports = wu;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(8997);\n"],"names":["AminoacidsPalettes","Lesk","this","lesk","makePalette","GrokGroups","grokGroups","RasMol","rasMol","get","m","resM","aaSynonyms","super","Aminoacids","static","scheme","Error","c","isInner","inner","outer","char","isNaN","parseInt","monomer","_a","_b","_c","chemPaletteInstance","getPalette","outerMonomer","innerMonomer","getInnerOuter","length","slice","amino","toUpperCase","undefinedColor","substring","AAFullNames","toLowerCase","SemType","SemTypeMultipleAlignment","Names","AASmiles","AASmilesTruncated","expectedMonomerData","getMolfilesFromSingleSeq","cell","monomersLibObject","units","column","tags","sep","getTag","splitterFunc","monomersDict","lib","dict","forEach","it","monomerObject","field","createMomomersMolDict","molFiles","monomers","value","molFilesForSeq","j","push","JSON","parse","stringify","createJsonMonomerLibFromSdf","table","resultLib","i","rowCount","Object","keys","key","monomerSymbol","rgroups","split","jsonRgroups","g","rgroup","altAtom","lastIndexOf","radicalNum","match","NucleotidesPalettes","Chromatogram","chromatogram","Nucleotides","SeqPaletteBase","dt","simplified","PaletteType","palette","cp","objList","colour","obj","ind","colourPalette","constructor","_palette","StringUtils","s","hash","charCodeAt","UnknownSeqPalette","GrayAllPalette","UnknownColorPalette","concat","values","pI","hashCode","color","dgColor","r","b","distToBlack","Math","sqrt","pow","correctColor","buildPalette","UnknownSeqPalettes","Gray","gray","Color","HELM_CORE_LIB_FILENAME","HELM_CORE_FIELDS","SDF_MONOMER_NAME","jsonSdfMonomerLibDict","FastaFileHandler","descriptionsArray","_descriptionsArray","sequencesArray","_sequencesArray","parseMacromolecule","startOfSequence","endOfSequence","_fileContent","join","parseColumns","regex","exec","description","index","lastIndex","importFasta","descriptionsArrayCol","sequenceCol","semType","fileContent","getStats","seqCol","minLength","splitter","freq","sameLength","firstLength","seq","categories","mSeq","monomerRe","splitterAsFasta","toString","matchAll","map","ma","mRes","toArray","helmRe","helmPp1Re","splitterAsHelm","ea","inSeq","mm","pp1M","getSplitter","separator","limit","undefined","startsWith","getSplitterWithSeparator","getSplitterForColumn","col","longMonomerPartRe","monomerToShort","maxLengthOfMonomer","shortAminoMatch","needAddDots","shortAmino","detectAlphabet","stats","alphabetCandidates","alphabetCandidatesSim","alphabet","gapSymbol","Set","delete","freqA","alphabetA","has","freqV","alphabetV","getAlphabetSimilarity","maxCos","max","indexOf","pickUpPalette","getPaletteByType","paletteType","pickUpSeqCol","df","semTypeColList","columns","bySemTypeAll","resCol","find","NotationConverter","_splitter","toFasta","targetNotation","toSeparator","toHelm","convertFastaToSeparator","fastaGapSymbol","defaultGapSymbol","newColumn","getNewColumn","init","idx","fastaPolymer","fastaMonomersArray","setTag","getHelmWrappers","prefix","isDna","isRna","isPeptide","convertToHelmHelper","sourcePolymer","sourceGapSymbol","leftWrapper","rightWrapper","postfix","convertStringToHelm","convertToHelm","convertSeparatorToFasta","separatorPolymer","separatorItemsArray","item","convertHelmToFastaSeparator","helmPolymer","tgtNotation","tgtSeparator","tgtGapSymbol","helmWrappersRe","isNucleotide","helmItemsArray","tgtMonomersArray","replace","convertHelm","aligned","convertHelmToSeparator","convert","notation","isFasta","isSeparator","isHelm","UnitsHandler","_units","_column","_notation","_defaultGapSymbol","name","getAlphabetSize","alphabetSizeStr","alphabetSize","console","warn","getAlphabetIsMultichar","isMsa","includes","getNotation","len","newColName","dataFrame","getUnusedName","Array","fill","srcAligned","srcAlphabet","srcAlphabetSize","srcAlphabetIsMultichar","templateCol","some","p","unitsStringIsValid","_defaultGapSymbolsDict","FASTA","HELM","SEPARATOR","PeptideFastaAlphabet","DnaFastaAlphabet","RnaFastaAlphabet","PositionHeight","positionSeparator","TAGS","randomFloat","range","random","randomInt","floor","assure","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","e","rejected","result","done","then","apply","delay","ms","setTimeout","notNull","errorToConsole","err","String","stack","message","Vector","Float32Array","assert","condition","initCoordinates","dimension1","dimension2","vectorAdd","q","multiplier","nItems","total","vectorLength","v","sqrSum","vectorDotProduct","v1","v2","prod","fillRandomMatrix","scale","matrix","calculateEuclideanDistance","sqdiffSumm","itemsSum","vectorSquare","calcDistanceMatrix","data","distance","d","exports","tsne_1","defineProperty","enumerable","TSNE","opt","returnV","vValue","iter","perplexity","getopt","dim","epsilon","defaultval","hasOwnProperty","gaussRandom","u","log","randn","mu","std","zeros","n","ArrayBuffer","arr","Float64Array","randn2d","uses","x","xhere","L2","x1","x2","D","x1i","x2i","xtod","X","N","dist","d2p","tol","nf","hTarget","prow","betamin","betamax","Infinity","beta","maxtries","num","psum","pj","exp","nHere","abs","pOut","N2","sign","initDataRaw","dists","initSolution","initDataDist","Y","gains","ystep","getSolution","cg","costGrad","cost","grad","ymean","gid","sid","gainid","newgain","newsid","debugGrad","yold","cg0","cg1","analytic","numerical","pmul","quArr","qsum","dsum","dhere","qu","NN","Q","gsum","premult","___CSS_LOADER_EXPORT___","module","id","cssWithMappingToString","list","content","needLayer","modules","media","dedupe","supports","layer","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","sourceMapping","__esModule","digestLength","blockSize","K","Uint32Array","hashBlocks","w","pos","a","f","h","t1","t2","Hash","state","Int32Array","temp","buffer","Uint8Array","bufferLength","bytesHashed","finished","reset","prototype","clean","update","dataLength","dataPos","finish","out","left","bitLenHi","bitLenLo","padLength","digest","_saveState","_restoreState","from","HMAC","pad","istate","ostate","hmac","fillBuffer","info","counter","hkdfSalt","hkdf","salt","okm","hmac_","bufpos","pbkdf2","password","iterations","dkLen","prf","ctr","t","dk","factory","sha256","str1","str2","options","jaroDist","caseSensitive","len1","len2","window","str1Hash","str2Hash","min","point","charAt","jaro","minIndex","isAnyArray","object","call","endsWith","errorCalculation","parameters","parameterizedFunction","error","func","y","rescale","input","output","arguments","TypeError","currentMin","_options$fromIndex","fromIndex","_options$toIndex","toIndex","Number","isInteger","minValue","currentMax","maxValue","RangeError","_options$min","autoMinMax","_options$max","factor","indent","repeat","indentData","inspectMatrixWithOptions","maxRows","maxColumns","maxNumSize","padMinus","rows","maxI","maxJ","loop","line","formatNumber","inspectData","formatNumber2","padEnd","str","fix","toFixed","toExponential","checkRowIndex","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRange","startRow","endRow","startColumn","endColumn","checkNumber","newArray","array","checkNonEmpty","isEmpty","AbstractMatrix","newRows","newColumns","newData","newMatrix","Matrix","row","set","interval","round","l","matrix1","matrix2","checkMatrix","isMatrix","klass","size","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","echelonForm","clone","iMax","swapRows","tmp","reducedEchelonForm","maxRow","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","by","NaN","NEGATIVE_INFINITY","maxIndex","POSITIVE_INFINITY","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","norm","type","cumulativeSum","sum","dot","vector2","vector1","mmul","other","Bcolj","strassen2x2","a11","b11","a12","b12","a21","b21","a22","b22","m1","m2","m3","m4","m5","c00","c01","c10","c11","strassen3x3","a00","a01","a02","a10","a20","b00","b01","b02","b10","b20","m6","m7","m8","m9","m12","m13","m14","m15","m16","m17","m18","c02","c12","c20","c21","c22","mmulStrassen","r1","c1","r2","c2","embed","mat","cols","resultat","blockMult","halfRows","halfCols","subMatrix","add","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","ceil","first","last","flipColumns","kroneckerProduct","kroneckerSum","AxI","eye","IxB","transpose","sortRows","compareFunction","compareNumbers","sort","sortColumns","subMatrixRow","indices","subMatrixColumn","selection","rowIndices","columnIndices","checkRowIndices","checkColumnIndices","rowIndex","columnIndex","trace","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","mean","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","center","centerByRow","centerByColumn","centerAll","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","Symbol","for","rand","randInt","diagonal","identity","negate","tensorProduct","nRows","nColumns","arrayData","every","element","removeRow","splice","addRow","removeColumn","newRow","addColumn","addS","addM","subS","subM","subtract","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","expm1","fround","log1p","log10","log2","sin","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","WrapperMatrix2D","LuDecomposition","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","solve","count","determinant","lowerTriangularMatrix","upperTriangularMatrix","pivotPermutationVector","hypotenuse","QrDecomposition","qr","rdiag","nrm","QR","Rdiag","isFullRank","orthogonalMatrix","SingularValueDecomposition","computeLeftSingularVectors","computeRightSingularVectors","autoTranspose","wantu","Boolean","wantv","swapped","aux","nu","ni","U","V","work","si","nct","nrt","mrc","pp","eps","EPSILON","kase","alpha","MIN_VALUE","ks","cs","sn","sp","spm1","epm1","sk","ek","shift","threshold","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","ucols","norm2","rank","ii","leftSingularVectors","diagonalMatrix","params","damping","gradientDifference","evaluatedData","gradientFunc","paramFunction","ans","param","auxParams","funcParam","gradientFunction","matrixFunc","matrixFunction","inverseMatrix","useSVD","leftHandSide","rightHandSide","levenbergMarquardt","maxIterations","errorTolerance","minValues","maxValues","initialValues","parLen","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","iteration","converged","parameterValues","parameterError","stylesInDOM","getIndexByIdentifier","identifier","modulesToDom","idCountMap","identifiers","base","indexByIdentifier","css","sourceMap","references","updater","addElementStyle","byIndex","api","domAPI","newObj","remove","lastIdentifiers","newList","newLastIdentifiers","_i","_index","memo","insert","style","target","styleTarget","document","querySelector","HTMLIFrameElement","contentDocument","head","getTarget","appendChild","createElement","setAttributes","attributes","styleElement","nonce","setAttribute","insertStyleElement","styleTagTransform","parentNode","removeChild","removeStyleElement","styleSheet","cssText","firstChild","createTextNode","V2000_ATOM_NAME_POS","getMonomericMols","mcol","pattern","molV3000Array","Map","getHelmMonomers","filter","mols","molsArray","curPos","endPos","molV3000","mol","atomMonomerCounts","bondMonomerCounts","atomRowI","monomerName","bondRowI","firstMonomer","trim","secondMonomer","changeV2000ToV3000","molV3000FromNonHelmSequence","monomerToShortFunction","DrawStyle","printLeftOrCentered","transparencyRate","drawStyle","classic","maxWord","wordIdx","gridCell","referenceSequence","textAlign","colorPart","grayPart","MSA","colorCode","compareWithCurrent","highlightDifference","currentMonomer","textSize","measureText","maxColorTextSize","width","colorTextSize","dy","fontBoundingBoxAscent","fontBoundingBoxDescent","draw","dx1","dx2","drawColor","fillStyle","globalAlpha","fillText","dx","getUpdatedWidth","grid","canvas","processSequence","subParts","text","gap","MacromoleculeSequenceCellRenderer","cellType","defaultHeight","defaultWidth","onClick","invalidate","onMouseMove","colTemp","maxLengthWordsSum","argsX","offsetX","gridColumn","bounds","right","found","mid","render","cellStyle","gridRow","save","beginPath","rect","clip","font","textBaseline","splitLimit","tempReferenceSequence","tempCurrentWord","tempMonomerWidth","gapRenderer","maxLengthWords","samples","maxLengthWordSum","restore","MonomerCellRenderer","_cellStyle","MacromoleculeDifferenceCellRenderer","tableColumn","s1","s2","drawMoleculeDifferenceOnCanvas","subParts1","subParts2","fullStringLength","molDifferences","sequences","numIdenticalStart","numIdenticalEnd","longerSeq","shorterSeq","lengthDiff","emptyMonomersArray","concatWithEmptyVals","subparts","fillShorterSequence","textSize1","textSize2","textWidth","updatedX","updatedY","amino1","amino2","color1","color2","subX0","subX1","createDifferenceCanvas","context","getContext","width1","width2","height","VdRegionType","vrt","VdRegionsViewer","viewed","regionsFg","regionsRoot","isOpened","panelNode","regions","viewPromise","host","filterSourceInput","mainLayout","logos","viewSubs","regionTypes","stringList","CDR","choices","Unknown","chains","skipEmptyPositions","bool","positionWidth","float","positionHeight","string","subs","root","subscribe","rootOnSizeChanged","bind","rootOnMouseMove","onTableAttached","superOnTableAttached","buildView","onPropertyChanged","property","setData","mlbDf","debug","destroyView","detach","superDetach","purpose","unsubscribe","regionsFiltered","orderList","order","orderI","regionChains","chain","region","plot","fromType","sequenceColumnName","startPositionName","positionStartName","endPositionName","positionEndName","fixWidth","transform","marginTop","marginLeft","wl","marginBottom","className","filterSourceInputOnValueChanged","position","top","overflowX","calcSize","logoHeight","clientHeight","maxHeight","wlDict","chainI","args","filterSource","setOptions","sequenceSpaceByFingerprints","spaceParams","version","methodName","similarityMetric","xAxis","embedAxesNames","yAxis","getEmbeddingColsNames","axes","colNameInd","names","CHEM_SIMILARITY_METRICS","SEQ_SPACE_SIMILARITY_METRICS","getDistanceFromSimilarity","similarity","removeEmptyStringRows","emptyRawInd","val","rawData","getRawData","emptyRawsIndexes","removedRowsCounter","removeAt","filterCliffsSubj","Subject","nonNormalizedDistances","LINES_DF_ACT_DIFF_COL_NAME","LINES_DF_SALI_COL_NAME","LINES_DF_SIM_COL_NAME","LINES_DF_LINE_IND_COL_NAME","LINES_DF_MOL_COLS_NAMES","CLIFFS_FILTER_APPLIED","createCliffsOnlyFilter","colName","raw","checkCursorOnLine","event","lines","getBoundingClientRect","clientX","clientY","closestLine","minDist","hypot","peq","VectorMetricsNames","BitArrayMetricsNames","StringMetricsNames","vectorDistanceMetricsMethods","Euclidean","stringDistanceMetricsMethods","Levenshtein","lst","pv","mv","sc","eq","xv","myers_32","mhc","phc","hsize","vsize","start","vlen","pb","mb","xh","ph","mh","score","myers_x","JaroWinkler","Manhattan","bitArrayDistanceMetricsMethods","Tanimoto","trueCount","common","andWithCountBits","tanimotoSimilarity","Dice","diceSimilarity","Asymmetric","asymmetricSimilarity","BraunBlanquet","braunBlanquetSimilarity","Cosine","cosineSimilarity","Kulczynski","totalProd","kulczynskiSimilarity","McConnaughey","mcConnaugheySimilarity","RogotGoldberg","countBits","diff","rogotGoldbergSimilarity","Russel","russelSimilarity","Sokal","sokalSimilarity","Hamming","AvailableMetricsTypes","BitArray","reduce","ret","getChemSimilaritiesMatrix","simArr","fpDf","addNewString","createTooltipElement","tooltipElement","columnNames","activityCol","fontWeight","display","justifyContent","append","molIdx","activity","paddingLeft","createPropPanelElement","propPanel","activitiesArray","overflow","createDifferencesWithPositions","createPropPanelField","sali","paddingRight","paddingTop","diffsPanel","borderBottom","createLinesGrid","colNames","seqDiffCol","visible","V2K_RGP_SHIFT","V2K_RGP_LINE","V2K_A_LINE","V3K_COUNTS_SHIFT","V3K_IDX_SHIFT","V3K_HEADER_FIRST_LINE","V3K_HEADER_SECOND_LINE","V3K_BEGIN_CTAB_BLOCK","V3K_END_CTAB_BLOCK","V3K_BEGIN_COUNTS_LINE","V3K_COUNTS_LINE_ENDING","V3K_BEGIN_ATOM_BLOCK","V3K_END_ATOM_BLOCK","V3K_BEGIN_BOND_BLOCK","V3K_END_BOND_BLOCK","V3K_BOND_CONFIG","V3K_BEGIN_DATA_LINE","V3K_END","PRECISION_FACTOR","DEOXYRIBOSE","RIBOSE","PHOSPHATE","OXYGEN","HYDROGEN","addMonomerToDict","sym","formattedMonomerLib","moduleRdkit","polymerType","pointerToBranchAngle","monomerData","libObject","capGroups","rGroupObjList","capGroupsArray","capGroup","parseCapGroups","capGroupIdxMap","molfileV2K","begin","end","rNode","rgpIndicesArray","replaceAll","el","parseCapGroupIdxMap","molfileV3K","molObj","get_mol","get_v3Kmolblock","convertMolfileToV3K","removeRGroupLines","counts","numOfAtoms","atomCount","bondCount","parseAtomAndBondCounts","atoms","atomTypes","kwargs","coordinate","parseFloat","parseAtomBlock","bonds","bondTypes","atomPairs","bondConfiguration","parsedValues","endOfLine","lineRemainder","beginCfg","endCfg","bondConfig","removedSubstring","parseBondBlock","monomerGraph","meta","getMonomerMetadata","centeredNode","terminalNodes","rotatedNode","rNodes","shiftCoordinates","angle","findAngleWithOY","rotateCenteredGraph","flipMolGraph","flipMonomerAroundOY","doubleBondedOxygen","bondsMap","constructBondsMap","node","findDoubleBondedCarbonylOxygen","flipMonomerAroundOX","PI","findAngleWithOX","flipCarboxylAndRadical","nodeOne","nodeTwo","nodeOneIdx","nodeTwoIdx","tmpX","tmpY","swapNodes","flipHydroxilGroup","adjustPeptideMonomerGraph","molGraph","terminalNode","xShift","yShift","getAngleBetweenSugarBranchAndOY","adjustSugarMonomerGraph","adjustPhosphateMonomerGraph","baseBranchToOYAngle","sugarBranchToOYAngle","bondLength","p1","p2","keepPrecision","getEuclideanDistance","adjustBaseMonomerGraph","setShifts","removeNodeAndBonds","setTerminalNodes","setShiftsAndTerminalNodes","removeHydrogen","getMolGraph","backboneShift","branchShift","capIdx","substituteCapGroups","setRNodes","getShiftBetweenNodes","rightNodeIdx","leftNodeIdx","removedNode","removedNodeIdx","spliceTypedArray","firstAtom","secondAtom","TConstructor","typedArray","axis","orientation","newValue","monomerSeqToMolfile","monomerSeq","mode","getAtomAndBondCounts","getResultingAtomBondCounts","getResultingAtomBondCountsST","molfileAtomBlock","molfileBondBlock","addMonomerToMolblock","sugar","phosphate","addAminoAcidToMolblock","addNucleotideToMolblock","addMonomerToMolblockST","nodeShift","bondShift","backbonePositionShift","branchPositionShift","backboneAttachNode","branchAttachNode","flipFactor","C","seqLength","atomIdx","capResultingMolblock","addBackboneMonomerToMolblock","addBranchMonomerToMolblock","fillAtomLines","fillBondLines","bondIdx","fillChainExtendingBond","updateBranchVariables","updateChainExtendingVariables","nucleobase","fillBranchAtomLines","branchMonomer","fillBackboneToBranchBond","bondCfg","SequenceSearchBaseViewer","metricsProperties","fingerprintChoices","initialized","fingerprint","int","distanceMetric","moleculeColumnName","onRowsRemoved","_","compute","onCurrentRowChanged","onChanged","moleculeColumn","bySemType","getProperty","fromOptions","computeData","beforeRender","SequenceSimilarityViewer","sketchedMolecule","curIdx","molCol","idxs","scores","gridSelect","targetMoleculeIdx","computeCompleted","cutoff","hotSearch","currentRowIdx","monomericMols","molecule","metricName","minScore","getCol","tag","resDf","createPropertyPanel","targetMolRow","findIndex","paddingBottom","acc","accIcon","addTitle","addPane","SequenceDiversityViewer","renderMolIds","SPEBase","_d","_e","_f","_g","steps","cycles","lambda","dlambda","lambda2","dlambda2","distanceFunction","initDistance","vectors","calcDistance","index1","index2","coordinates","dimension","cycle","rowi","rowj","diffIJ","arg","defaultValue","_length","_version","_updateLevel","_selectedCount","_selectedCountVersion","_selectedIndexesVersion","_versionedName","_versionedNameVersion","SHRINK_THRESHOLD","buff","_createBuffer","_data","assureGoez","argName","assureInRange","src","dst","copyFrom","lengthInInts","incrementVersion","notify","versionedName","self","setLength","nIntsNeeded","set1","set2","flag","setBit","fromSeq","bytes","num1","num2","equals","getBit","bitArray","setAll","invert","flags","setIndexes","indexes","clear","setFast","everyIndex","anyIndex","setWhere","check","allowClear","getRange","to","fromValues","getRangeAsList","setRange","setTrue","setFalse","setRandom","andNot","notAnd","insertAt","oldlength","contains","removeByMask","mask","dstIdx","srcIdx","findNext","bit","falseCount","_onBitCount","remainingBits","countWhere","second","allTrue","allFalse","anyTrue","anyFalse","unusedBits","numInts","_firstOnBit","findPrev","_lastOnBit","Int8Array","UMAP","T_SNE","UMAPOptions","learningRate","uiName","tooltip","nComponents","nEpochs","nNeighbors","spread","TSNEOptions","SEQ_COL_NAMES","SequenceSpaceBaseFuncEditor","semtype","methodSettingsDiv","moleculesColDiv","methodsParams","tableInput","onTableInputChanged","molColInput","methodInput","settingsOpened","createAlgorithmSettingsDiv","captionLabel","methodSettingsIcon","lineHeight","fontSize","algorithmOptions","algorithmParams","paramsForm","SequenceSpaceFunctionEditor","similarityMetricInput","plotEmbeddingsInput","funcParamsDiv","funcParams","molecules","plotEmbeddings","paramsUI","ActivityCliffsFunctionEditor","activitiesColDiv","activitiesInput","similarityInput","activities","_package","getMonomerLibHelper","hydrophobPalette","SeqPaletteCustom","initBio","monomerLib","logPs","series","getMonomerMolsByType","symbol","block","logP","get_descriptors","CrippenClogP","avg","sequenceTooltip","tv","viewer","backgroundColor","fitArea","getBioLib","manageFiles","title","path","addButton","close","show","libraryPanel","seqColumn","filesButton","divInputs","libFileNameList","fileName","librariesUserSettingsSet","userStoragePromise","libFileName","libInput","fastaSequenceCellRenderer","macroMolColumnPropertyPanel","molColumn","columnsList","monomerWidth","fireValuesChanged","setTooltip","rdKitInputs","getMacroMolColumnPropertyPanel","separatorSequenceCellRenderer","macromoleculeDifferenceCellRenderer","checkInputColumnUi","allowedNotations","allowedAlphabets","res","msg","checkInputColumn","uh","sequenceAlignment","alignType","alignTable","seq1","seq2","toAlign","smithWaterman","needlemanWunch","webLogoViewer","vdRegionViewer","SeqActivityCliffsEditor","funcEditor","onOK","prepare","activityCliffs","macroMolecule","axesNames","encodedCol","scatterTitle","seqSpaceFunc","simMatrixFunc","tooltipFunc","propertyPanelFunc","linesGridFunc","seqSpaceOptions","similarityLimit","dimensionalityReduceCol","zoom","ignoreSelectionChange","cashedLinesData","timer","withoutEmptyValues","emptyValsIdxs","seqSpaceParams","coordsWithInsertedEmptyVals","listValues","toList","getEmbeddingColsWithInsertedEmptyVals","countFromDistance","cats","newCol","dfSeq","distances","similarityArr","getSimilaritiesFromDistances","createSimilaritiesMatrix","cliffsMetrics","simVals","saliVals","n1","n2","cliffsMolIds","sim","getActivityCliffsMetrics","saliCount","getSaliCountCol","cliffCol","ids","colname","getCliffsBooleanCol","saliMinMax","saliValsWithoutInfinity","saliMin","getSaliMinMax","saliOpacityCoef","view","byName","addViewer","xColumnName","yColumnName","showXSelector","showYSelector","showSizeSelector","showColorSelector","markerMinSize","markerMaxSize","getInfo","linesRes","selected","linesDf","setTags","addNewFloat","addNewInt","createLines","linesDfGrid","listCliffsLink","dockManager","dock","classList","filterCliffsButton","enabled","viewerClosedSub","onCurrentCellChanged","currentMolIdx","currentCol","cashedData","propPanelFunc","panel","getPane","panelElement","updatePropertyPanel","getSortedOrder","sortByColumns","sortTypes","scrollToCell","onSelectionChanged","mouseOverRowIdx","addEventListener","clearTimeout","ctrlKey","onEvent","ctx","pointFrom","worldToScreen","pointTo","Path2D","moveTo","opacity","strokeStyle","lineWidth","lineTo","stroke","renderLines","currentLine","zoomLeft","zoomRight","zoomTop","zoomBottom","W0","H0","y1","y2","W1","H1","scaleW","scaleH","W2","H2","getZoomCoordinates","viewport","addProperty","createPopertyPanel","getActivityCliffs","SequenceSpaceEditor","sequenceSpaceTopMenu","embedColsNames","chemSpaceParams","embeddings","scatterPlot","toAtomicLevel","package","monomersLibFile","files","readAsText","macroMolCol","monomersLibList","converter","monomerSequencesArray","columnLength","colUnits","getMonomerSequencesArray","getFormattedMonomerLib","symbols","errTxt","getMonomersDictFromLib","reconstructed","_toAtomicLevel","multipleSequenceAlignmentAny","performAlignment","pepsea","gapOpenInput","gapExtendInput","inputRootStyles","colInput","potentialCol","unusedName","inputRootStyle","clustersColInput","fireChanged","nullable","msaCol","compositionAnalysis","colList","handler","wlViewer","colListNames","selectedCol","helpUrl","sdfToJsonLib","peptideMolecule","pi","widgetHost","molBlock3D","molBlock2D","stringBlob","Blob","nglHost","classes","stage","NGL","Stage","loadFile","ext","comp","setSize","addRepresentation","autoView","sketch","representationsWidget","convertDialog","monomerCellRenderer","testDetectMacromolecule","fileListToTest","fi","readyCount","fileInfo","csv","fullPath","file","splitToMonomers","tempDf","sequenceColumn","createCol","positionCol","resultDf","columnList","sequence","positionIndex","splitAlignedSequences","originalDf","tempCol","similaritySearchViewer","similaritySearchTopMenu","diversitySearchViewer","diversitySearchTopMenu","bioSubstructureSearch","saveAsFasta","bioSubstructureFilter","Cell","parentI","parentJ","Aligned","seq1_","seq2_","score_","SequenceAlignment","fillNeedleman","dpGrid","fillOne","gridFromName","alignGrid","BLOSUM45","connections","CONBLO","BLOSUM50","BLOSUM62","BLOSUM80","BLOSUM90","PAM30","PAM70","PAM250","NUCLEOTIDES","CONNUCL","TRANS","SCHNEIDER","CONSCHN","fillScores","constructResult","res1","res2","gapS","substr","tempI","typeRec","test","bestVal","bestI","bestJ","setSequences","setGap","gap_","setMethod","alignGrid_","SUBSTR_HELM_COL_NAME","substructureSearchDialog","substructureInput","editHelmLink","inputsDiv","children","dispatchEvent","KeyboardEvent","separatorInput","inputs","substructure","matchesColName","toLocaleLowerCase","matches","helmSubstructureSearch","linearSubstructureSearch","re","startsWithSep","endsWithSep","substrWithoutSep","RegExp","prepareSubstructureRegex","resultArray","macromolecule","invalidateMols","substructureCol","substructureMolsCol","molStringsColumn","molString","molBlockFailover","progressBar","monomericMolsCol","COLUMNS_NAMES","SEM_TYPES","FLAGS","PEPSEA","$","convertDialogSubs","currentNotation","separatorArray","filteredNotations","targetNotationInput","toggleSeparator","hide","srcCol","convertDo","onClose","LIB_STORAGE_NAME","LIB_PATH","MonomerLib","_monomers","_onChanged","getMonomer","monomerType","getTypes","molfile","getMonomerNamesByType","_updateInt","typesNew","types","updateLibs","libList","reload","MonomerLibHelper","_monomerLib","loadLibrariesPromise","loadLibraries","userLibrariesSettings","libs","all","readLibrary","dfSdf","fileSource","readAsBytes","monomerAdd","prop","instance","_instance","H","S","canHandle","serialize","port1","port2","MessageChannel","R","deserialize","isError","assign","Z","argumentList","z","catch","o","postMessage","removeEventListener","Proxy","G","W","construct","J","WeakMap","L","atob","URL","webkitURL","createObjectURL","Worker","revokeObjectURL","urlCDN","urlCDNStg","dirShared","dirMounted","dirData","printInterleaved","env","B","isArray","_parseTool","tools","config","async","onmessage","tool","program","SideChainScales","entries","scales","AlignedSequenceEncoder","aa2num","getScale","num2aa","termina","_dropDefises","_truncateSequence","encode","encodeLettter","letter","decode","code","fastaInputFilename","fastaOutputFilename","_stringsToFasta","runKalign","isAligned","unUsedName","clustersCol","sequencesLength","convertTo","compact","clustersColCategories","clustersColData","fastaSequences","clusterIndexes","rowIdx","clusterCategoryIdx","CLI","reinit","tgtCol","clusterIdx","fasta","fs","writeFile","buf","cat","clusterRowIds","clusterRowIdIdx","srcUnits","tgtAligned","pepseaMethods","alignmentObjectMetaKeys","runPepsea","method","gapOpen","gapExtend","peptideCount","clusters","bodies","cluster","clusterId","helmSeq","ID","pepseaContainer","alignedSequences","body","alignments","requestAlignedObjects","Alignment","alignment","alignedSequencesCol","dockerfileId","headers","response","request","FASTA_LINE_WIDTH","saveAsFastaUI","idGColList","take","colI","gcol","defaultIdGCol","idDefaultValue","idGColListInput","seqGColList","gc","seqDefaultValue","seqColInput","gCol","lineWidthInput","valueIdColList","valueSeqCol","valueLineWidth","resFastaTxt","idColList","lineSeparator","fastaLines","rowI","seqId","seqLineList","wrapSequence","saveAsFastaDo","aEl","click","seqMonomerList","seqPos","seqLine","seqLineTxt","getMacromoleculeColumn","updateDivInnerHTML","innerHTML","VerticalAlignments","HorizontalAlignments","PositionMarginStates","FilterSources","PROPS_CATS","PROPS","HTMLCanvasElement","getCursorPosition","bottom","PositionMonomerInfo","PositionInfo","sumForHeightCalc","WebLogoViewer","Filtered","Selected","Length","positions","startPosition","endPosition","positionWidthWithMargin","_positionWidth","positionMarginValue","positionMarginState","unitsHandler","positionMargin","countOfRenderPositions","devicePixelRatio","canvasWidthWithRatio","firstVisibleIndex","slider","viewerId","axisHeight","rowsMasked","rowsNull","visibleSlider","allowResize","turnOfResizeForOneSetValue","positionNames","viewerCount","category","DATA","skipEmptySequences","shrinkEmptyTail","STYLE","verticalAlignment","MIDDLE","LAYOUT","horizontalAlignment","CENTER","minHeight","AUTO","defaultValueForPositionMargin","BEHAVIOR","msgHost","zIndex","onValuesChanged","sliderOnValuesChanged","alignItems","setProperty","canvasOnMouseMove","canvasOnMouseDown","canvasOnWheel","_calculate","updateSlider","updateSeqCol","updatePositions","getSelectedIndexes","maxLength","positionNamesTxt","jPos","widthArea","heightArea","xScale","clientWidth","yScale","checkIsHideSlider","showSliderWithFitArea","minScale","setSliderVisibility","diffEndScrollAndSliderMin","newMin","newMax","setValues","dataFrameTxt","dataFrameFilterOnChanged","dataFrameSelectionOnChanged","calculatedX","_nullSequence","fillerResidue","removeWhere","predicate","updateIterator","deleteIterator","_removeEmptyPositions","posCount","posName","seqM","pmInfo","pn","absoluteMaxHeight","alphabetSizeLog","entry","recalc","innerText","resetTransform","fillRect","maxCountOfRowsRendered","lastVisibleIndex","positionFontSize","posNameMaxWidth","hScale","setTransform","monomerTxt","mTm","canvasHeight","sliderHeight","hostTopMargin","hostLeftMargin","countOfPositions","calculatedWidth","errMsg","dpr","cursorP","atPI","monomerAtPosSeqCount","at","seqMList","seqMPos","countForMonomerAtPosition","tooltipEl","selBS","checkSeqForMonomerAtPos","countOfScrollPositions","deltaY","scrollBy","residuesSet","rxjs","operators","BioSubstructureFilter","calculating","loader","filterSummary","bioFilter","isFiltering","isReadyToApplyFilter","bitset","_debounceTime","attach","columnName","FastaFilter","SeparatorFilter","HelmFilter","filterPanel","onBioFilterChangedSubs","onChangedEvent","pipe","debounceTime","_onInputChanged","applyFilter","isDetached","saveState","bioSubstructure","applyState","that","filters","substrucrureSearch","requestFilter","BioFilterBase","HTMLElement","placeholder","colSeparator","_filterPanel","cursor","helmSubstructure","helmEditor","updateFilterPanel","editorDiv","webEditor","createWebEditor","showHeader","showFooter","helmString","getHelm","modal","fullScreen","editor","setHelm","parentElement","resizeEditor","editDiv","__importStar","utils","makeHeap","nPoints","makeArrays","fillValue","empty","filled","heap","heapPush","weight","weights","uncheckedHeapPush","isNew","iSwap","ic1","ic2","heapShape2","siftDown","heap1","heap2","ceiling","elt","leftChild","rightChild","swap","temp1","temp2","rejectionSample","nSamples","poolSize","rejectSample","tauRandInt","broken","buildCandidates","currentGraph","nVertices","maxCandidates","candidateNeighbors","isn","tauRand","deheapSort","indHeap","distHeap","indHeapIndex","distHeapIndex","smallestFlagged","resultIndex","umap_1","__read","iterator","ar","__values","SparseMatrix","dims","nCols","checkDims","makeKey","getAll","ordered","rowColValues","getDims","getRows","getCols","getValues","fn","vals","_this","pairwiseMultiply","elementWise","maximum","multiplyScalar","scalar","eliminateZeros","zeroIndices","removeByZeroIndex","nextValues","nextRows","nextCols","normalize","normType","e_1","normFn","normFns","colsByRow","nextMatrix","_loop_1","e_1_1","return","xs","op","visited","operate","nextValue","valuesA","rowsA","colsA","valuesB","rowsB","colsB","getCSR","indptr","currentRow","tree","makeNNDescent","distanceFn","leafArray","nIters","delta","rho","rpTreeInit","cj","ck","makeInitializations","initFromRandom","queryPoints","_heap","initFromTree","_tree","searchFlatTree","makeInitializedNNSearch","graph","initialization","tried","vertex","candidates","candidates_1","candidates_1_1","candidate","initializeSearch","forest","e_2","results","forest_1","forest_1_1","e_2_1","__spread","FlatTree","hyperplanes","offsets","makeEuclideanTree","leafSize","splitResults","leftIndex","rightIndex","hyperplaneOffset","hyperplaneVector","nLeft","nRight","side","margin","indicesLeft","indicesRight","hyperplane","offset","euclideanRandomProjectionSplit","isLeaf","recursiveFlatten","nodeNum","leafNum","oldNodeNum","numNodes","numLeaves","selectSide","makeForest","nTrees","makeTree","nNodes","nLeaves","flattenTree","makeLeafArray","rpForest","rpForest_1","rpForest_1_1","__generator","label","sent","trys","ops","verb","pop","__importDefault","nnDescent","ml_levenberg_marquardt_1","SMOOTH_K_TOLERANCE","MIN_K_DIST_SCALE","localConnectivity","negativeSampleRate","repulsionStrength","setOpMixRatio","transformQueueSize","targetMetric","targetWeight","targetNNeighbors","euclidean","isInitialized","embedding","optimizationState","OptimizationState","setParam","fit","initializeFit","optimizeLayout","fitAsync","optimizeLayoutAsync","setSupervisedProjection","setPrecomputedKNN","knnIndices","knnDistances","getNEpochs","knnResults","nearestNeighbors","fuzzySimplicialSet","makeSearchFns","searchGraph","makeSearchGraph","processGraphForSupervisedProjection","initializeSimplicialSetEmbedding","tail","epochsPerSample","initializeOptimization","prepareForOptimizationLoop","search","knn","neighbor","toTransform","adjustedLocalConnectivity","smoothKNNDistance","sigmas","rhos","computeMembershipStrengths","normed","csrMatrix","initTransform","reshape2d","graphMax","makeEpochsPerSample","assignOptimizationStateParameters","headEmbedding","tailEmbedding","currentEpoch","farDist","categoricalSimplicialSetIntersection","optimizeLayoutStep","getEmbedding","metricNNDescent","sparseMatrix","prodMatrix","simplicialSet","unknownDist","intersection","fastIntersection","resetLocalConnectivity","nIter","bandwidth","lo","hi","ithDistances","nonZeroDists","interpolation","meanIthDistances","meanDistances","graphValues","moveOther","epochsPerNegativeSample","epochOfNextNegativeSample","epochOfNextSample","initialAlpha","gamma","findABParams","current","distSquared","rDist","gradCoeff","gradD","nNegSamples","k_1","other_1","distSquared_1","gradCoeff_1","epochCallback","epochCompleted","shouldStop","isFinished","cosine","normX","normY","clipValue","linear","yv","default","vec","vec_1","vec_1_1","ones","max2d","DG","grok","ui","wu","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","definition","globalThis","Function","toStringTag","nc","__webpack_exports__"],"sourceRoot":""}