@datagrok/helm 2.1.15 → 2.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"package.js","mappings":"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","sources":["webpack://helm/webpack/bootstrap","webpack://helm/webpack/runtime/compat get default export","webpack://helm/webpack/runtime/define property getters","webpack://helm/webpack/runtime/hasOwnProperty shorthand","webpack://helm/webpack/runtime/make namespace object","webpack://helm/external var \"grok\"","webpack://helm/external var \"ui\"","webpack://helm/external var \"DG\"","webpack://helm/./src/helm-web-editor.ts","webpack://helm/external var \"wu\"","webpack://helm/types.ts","webpack://helm/consts.ts","webpack://helm/./node_modules/fastest-levenshtein/esm/mod.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/needleman-wunsch.ts","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/macromolecule-distance-functions.ts","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/hamming.ts","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/levenstein.ts","webpack://helm/units-handler.ts","webpack://helm/utils.ts","webpack://helm/./node_modules/@datagrok-libraries/utils/src/vector-operations.ts","webpack://helm/monomer-utils.ts","webpack://helm/./node_modules/@datagrok-libraries/utils/src/type-declarations.ts","webpack://helm/seq-palettes.ts","webpack://helm/aminoacids.ts","webpack://helm/nucleotides.ts","webpack://helm/unknown.ts","webpack://helm/cell-renderer.ts","webpack://helm/./node_modules/@datagrok-libraries/utils/src/to-console.ts","webpack://helm/./src/utils.ts","webpack://helm/./src/helm-monomer-placer.ts","webpack://helm/./src/cell-renderer.ts","webpack://helm/notation-converter.ts","webpack://helm/./src/package.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\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__.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};","const __WEBPACK_NAMESPACE_OBJECT__ = grok;","const __WEBPACK_NAMESPACE_OBJECT__ = ui;","const __WEBPACK_NAMESPACE_OBJECT__ = DG;","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nexport class HelmWebEditor {\n host: any;\n editor: any;\n w = 200;\n h = 100;\n constructor() {\n this.host = ui.div([], {style: {width: `${this.w}px`, height: `${this.h}px`}});\n this.editor = new JSDraw2.Editor(this.host, {width: this.w, height: this.h, viewonly: true});\n }\n\n resizeEditor(w: number, h: number) {\n this.editor.setSize(w, h);\n }\n\n createWebEditor(value: string) {\n const editorView = ui.div();\n org.helm.webeditor.MolViewer.molscale = 0.8;\n const webEditor = new scil.helm.App(editorView, {\n showabout: false,\n mexfontsize: '90%',\n mexrnapinontab: true,\n topmargin: 20,\n mexmonomerstab: true,\n sequenceviewonly: false,\n mexfavoritefirst: true,\n mexfilter: true\n });\n const sizes = webEditor.calculateSizes();\n webEditor.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);\n let s = {width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px'};\n //@ts-ignore\n scil.apply(webEditor.sequence.style, s);\n //@ts-ignore\n scil.apply(webEditor.notation.style, s);\n s = {width: sizes.rightwidth + 'px', height: (sizes.bottomheight + webEditor.toolbarheight) + 'px'};\n //@ts-ignore\n scil.apply(webEditor.properties.parent.style, s);\n webEditor.structureview.resize(sizes.rightwidth, sizes.bottomheight + webEditor.toolbarheight);\n webEditor.mex.resize(sizes.topheight - 80);\n setTimeout(function() {\n webEditor.canvas.helm.setSequence(value, 'HELM');\n }, 200);\n return {editorDiv: editorView, webEditor: webEditor};\n }\n}\n\n","const __WEBPACK_NAMESPACE_OBJECT__ = wu;",null,null,"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 {mmDistanceFunctionType} from './types';\n\n// Blosum 62 matrix for protein sequences\nconst BLOSUM62:Array<Array<number>> =\n[[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// Protein indexes for BLOSUM matrix\nconst ProtIndexes: {[id:string]:number} = {\n 'A': 0, 'R': 1, 'N': 2, 'D': 3, 'C': 4, 'Q': 5, 'E': 6, 'G': 7, 'H': 8,\n 'I': 9, 'L': 10, 'K': 11, 'M': 12, 'F': 13, 'P': 14, 'S': 15, 'T': 16,\n 'W': 17, 'Y': 18, 'V': 19, 'B': 20, 'Z': 21, 'X': 22, '*': 23\n};\n\ninterface NeedlemanWunchArgs {\n gapOpen: number;\n gapExtend: number;\n scoringMatrix: number[][];\n alphabetIndexes: {[id:string]:number};\n}\n\nconst defaultArgs: NeedlemanWunchArgs = {\n gapOpen: 8,\n gapExtend: 2,\n scoringMatrix: BLOSUM62,\n alphabetIndexes: ProtIndexes\n};\n\n/** Returns a function that calculates the distance between two sequences based on gap penalty and matrix\n * @param {Partial<NeedlemanWunchArgs>}args - arguments for Needleman-Wunch algorithm like gap penalty, Scoring matrix..\n * @return {mmDistanceFunctionType} - function that calculates the distance between two sequences\n*/\nexport function needlemanWunch(args: Partial<NeedlemanWunchArgs>): mmDistanceFunctionType {\n return (seq1: string, seq2: string) : number => {\n const {gapOpen, gapExtend, scoringMatrix, alphabetIndexes} = {...defaultArgs, ...args};\n // As we don't need traceback, no need to store the whole matrix\n // Intead, we will store only the last two rows\n const matrix: number[][] = [\n new Array<number>(seq1.length + 1).fill(0),\n new Array<number>(seq1.length + 1).fill(0)\n ];\n // similarly, we need to keep track of what operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n const verticalGaps: boolean[] = new Array<boolean>(seq1.length + 1).fill(false);\n const horizontalGaps: boolean[] = new Array<boolean>(seq1.length + 1).fill(false);\n\n //variables to keep track which row we are in\n // they will swap places on each iteration\n let prevRow = 0;\n let currRow = 1;\n // Initialize first row\n for (let i = 1; i < seq1.length + 1; i++)\n matrix[0][i] = -gapOpen - (i - 1) * gapExtend;\n\n // Calculate the rest of the matrix\n for (let i = 1; i < seq2.length + 1; i++) {\n matrix[currRow][0] = -gapOpen - (i - 1) * gapExtend;\n for (let j = 1; j < seq1.length + 1; j++) {\n const diagonal =\n matrix[prevRow][j - 1] + scoringMatrix[alphabetIndexes[seq1[j - 1]]][alphabetIndexes[seq2[i - 1]]];\n const top = matrix[prevRow][j] - (verticalGaps[j] ? gapExtend : gapOpen );\n const left = matrix[currRow][j - 1] - (horizontalGaps[j - 1] ? gapExtend : gapOpen);\n matrix[currRow][j] = Math.max(\n diagonal, left, top\n );\n // update gap arrays\n if (matrix[currRow][j] === diagonal) {\n verticalGaps[j] = false;\n horizontalGaps[j] = false;\n } else if (matrix[currRow][j] === left) {\n verticalGaps[j] = false;\n horizontalGaps[j] = true;\n } else {\n verticalGaps[j] = true;\n horizontalGaps[j] = false;\n }\n }\n // Swap rows\n prevRow = currRow;\n currRow = (currRow + 1) % 2;\n }\n // as the matrix is the similarity matrix, but we are interested in distance,\n // we need compare it to perfect match score to get reasonable distance\n const perfectMatchSeq1 = seq1.split('').map((c) => scoringMatrix[alphabetIndexes[c]][alphabetIndexes[c]])\n .reduce((a, b) => a + b, 0);\n const perfectMatchSeq2 = seq2.split('').map((c) => scoringMatrix[alphabetIndexes[c]][alphabetIndexes[c]])\n .reduce((a, b) => a + b, 0);\n const maxScore = Math.max(perfectMatchSeq1, perfectMatchSeq2);\n return (maxScore - matrix[prevRow][seq1.length]) / maxScore;\n };\n}\n","import {hamming} from './hamming';\nimport {levenstein} from './levenstein';\nimport {needlemanWunch} from './needleman-wunsch';\nimport {mmDistanceFunctionType} from './types';\n\n/** Enum containing currently supported macromolecule distance functions\n * Hamming distance will be used if the sequences are already aligned\n * Needleman distance will be used for protein sequences with known BLOSUM62 matrix\n * Levenshtein distance will be used for nucleotide sequences as for them substitution matrix is same as identity matrix\n */\nexport enum MmDistanceFunctionsNames {\n HAMMING = 'Hamming',\n LEVENSHTEIN = 'Levenshtein',\n NEEDLEMANN_WUNSCH = 'Needlemann-Wunsch'\n};\n\nexport const mmDistanceFunctions: Record<MmDistanceFunctionsNames, (value?: any) => mmDistanceFunctionType> = {\n [MmDistanceFunctionsNames.HAMMING]: hamming,\n [MmDistanceFunctionsNames.LEVENSHTEIN]: levenstein,\n [MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH]: needlemanWunch\n};\n","import {mmDistanceFunctionType} from './types';\n\nexport function hamming(): mmDistanceFunctionType {\n return (seq1: string, seq2: string) => {\n // hamming distance should only be used with same size strings,\n // but still, lets add a check and if they are not same length add the difference to the result\n let diff = 0;\n if (seq1.length !== seq2.length)\n diff = Math.abs(seq1.length - seq2.length);\n\n let result = 0;\n for (let i = 0; i < Math.min(seq1.length, seq2.length); i++) {\n if (seq1[i] !== seq2[i])\n result++;\n }\n result += diff;\n result /= Math.max(seq1.length, seq2.length);\n return result;\n };\n}\n","import {distance} from 'fastest-levenshtein';\nimport {mmDistanceFunctionType} from './types';\n\nexport function levenstein(): mmDistanceFunctionType {\n return (seq1: string, seq2: string) => {\n return distance(seq1, seq2) / Math.max(seq1.length, seq2.length);\n };\n}\n",null,null,"import {Matrix, Vector, Coordinates, Vectors, DistanceMetric} from './type-declarations';\nimport {randomFloat, randomInt} from './random';\n\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: boolean = false, message: string = 'Assertion error.') {\n if (!condition)\n throw new Error(message);\n}\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: number, dimension2: number, fill: number = 0): Coordinates {\n return new Array(dimension1).fill(fill).map(() => (new Vector(dimension2).fill(fill)));\n}\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: Matrix): 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/**\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: Vector, q: Vector, multiplier: number = 1): Vector {\n const nItems = p.length;\n\n assert(nItems == q.length, 'Vector lengths do not match.');\n\n const total = new Vector(nItems);\n\n for (let i = 0; i < p.length; ++i)\n total[i] = p[i] + multiplier * q[i];\n\n return total;\n}\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: Vector): number {\n let total = 0;\n\n for (let i = 0; i < v.length; ++i)\n total += v[i];\n\n return total;\n}\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: Vector): Vector {\n const nItems = v.length;\n const total = new Vector(nItems);\n\n for (let i = 0; i < v.length; ++i)\n total[i] = v[i] * v[i];\n\n return total;\n}\n\nexport function vectorLength(v: Vector): number {\n let sqrSum: number = 0;\n for (let i: number = 0; i < v.length; i++)\n sqrSum += v[i] * v[i];\n return Math.sqrt(sqrSum);\n}\n\nexport function vectorDotProduct(v1: Vector, v2: Vector): number {\n if (v1.length != v2.length)\n throw new Error('The dimensionality of the vectors must match');\n let prod: number = 0;\n for (let i: number = 0; i < v1.length; i++)\n prod += v1[i] * v2[i];\n return prod;\n}\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: number, dimension2: number, scale: number = 1.): Matrix {\n const matrix = initCoordinates(dimension1, dimension2);\n\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/**\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: Vector, q: Vector): number {\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/**\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: Vectors, distance: DistanceMetric): Matrix {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j) {\n const d: number = (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\n/** Generates array from a range [begin; end] or [begin; end) if endExclusive. **/\nexport function genRange(begin: number, end: number, endExclusive = false): Int32Array {\n const nItems = end - begin + (endExclusive ? 0 : 1);\n const series = new Int32Array(nItems);\n\n for (let i = 0; i < nItems; ++i)\n series[i] = begin + i;\n\n return series;\n}\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: any[], reverse = false): number[] {\n const sortfn = reverse ? (a: any[], b: any[]) => (b[0] - a[0]) : (a: any[], b: any[]) => (a[0] - b[0]);\n const decor = (v: any, i: number) => [v, i]; // set index to value\n const undecor = (a: any[]) => a[1]; // leave only index\n const _argsort = (arr: any[]) => arr.map(decor).sort(sortfn).map(undecor);\n return _argsort(values);\n}\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: number, n: number, dist: (i1: number, i2: number) => number): number[] {\n function maxBy(values: IterableIterator<number>, orderBy: (i: number) => number) {\n let maxValue = null;\n let maxOrderBy = null;\n\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\n const subset = [randomInt(length - 1)];\n const complement = new Set();\n\n for (let i = 0; i < length; ++i) {\n if (!subset.includes(i))\n complement.add(i);\n }\n\n while (subset.length < n) {\n const idx = maxBy(\n complement.values() as IterableIterator<number>,\n (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/**\n * Returns normalized vector\n * @param {Vector} data numerical array\n */\nexport function normalize(data: Vector): Vector {\n let mean = 0;\n let std = 0;\n\n for (let i = 0; i < data.length; ++i)\n mean += data[i];\n\n mean /= data.length;\n\n for (let i = 0; i < data.length; ++i)\n std += (data[i] - mean) * (data[i] - mean);\n\n std = Math.sqrt(std / data.length);\n\n for (let i = 0; i < data.length; ++i)\n data[i] = (data[i] - mean) / std;\n\n return data;\n}\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: any[], b: any[]): any[] {\n const bSet = new Set(b);\n return Array.from(new Set(a.filter((x) => !bSet.has(x))).values());\n}\n",null,"/**\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<Vector> {}\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<any> {}\n\n/**\n * Denotes a dictionary containing function options.\n *\n * @export\n * @type Options\n */\nexport type Options = {[name: string]: any};\n\n/**\n * Denotes custom distance metric between the two given vectors.\n *\n * @export\n * @type DistanceMetric\n * @param {any} v1 The first vector.\n * @param {any} v2 The second vector.\n * @return {number} Distance between these two vectors.\n */\nexport type DistanceMetric = (v1: any, v2: any) => (number);\n\n/**\n * Denotes a simple string to string dictionary.\n *\n * @export\n * @type StringDictionary\n */\nexport type StringDictionary = {[key: string]: string};\n",null,null,null,null,null,"import * as ui from 'datagrok-api/ui';\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\n\n\nexport function errorToConsole(err: any): string {\n if (typeof err === 'string' || err instanceof String) {\n return err as string;\n } else if ((typeof err == 'object' || err instanceof Object) && '$thrownJsError' in err) {\n return errorToConsole(err['$thrownJsError']);\n } else if (err instanceof Error) {\n return (err as Error).stack ?? (err as Error).message;\n } else {\n return err.toString();\n }\n}\n\nexport function rectToConsole(rect: DG.Rect): string {\n return `(x=${rect.x}, y=${rect.y}, w=${rect.width}, h=${rect.height})`;\n}\n","import * as DG from 'datagrok-api/dg';\nimport {\n RGROUP_CAP_GROUP_NAME,\n RGROUP_CAP_GROUP_SMILES,\n jsonSdfMonomerLibDict,\n MONOMER_SYMBOL,\n RGROUP_ALTER_ID,\n RGROUPS,\n RGROUP_LABEL,\n SDF_MONOMER_NAME\n} from './constants';\n\nexport function getParts(subParts: string[], s: string): string[] {\n const j = 0;\n const allParts: string[] = [];\n for (let k = 0; k < subParts.length; ++k) {\n const indexOfMonomer = s.indexOf(subParts[k]);\n const helmBeforeMonomer = s.slice(j, indexOfMonomer);\n allParts.push(helmBeforeMonomer);\n allParts.push(subParts[k]);\n s = s.substring(indexOfMonomer + subParts[k].length);\n }\n allParts.push(s);\n return allParts;\n}\n\nexport function parseHelm(s: string) {\n const sections = split(s, '$');\n s = sections[0];\n const monomers = [];\n //@ts-ignore\n if (!scil.Utils.isNullOrEmpty(s)) {\n const seqs = split(s, '|');\n for (let i = 0; i < seqs.length; ++i) {\n const e = detachAnnotation(seqs[i]);\n s = e.str;\n\n let p = s.indexOf('{');\n\n s = s.substring(p + 1);\n p = s.indexOf('}');\n s = s.substring(0, p);\n\n const ss = split(s, '.');\n for (const monomer of ss) {\n if (!monomer || monomer === '') continue;\n if (monomer.startsWith('[') && monomer.includes(']')) {\n const element = monomer.substring(1, monomer.indexOf(']'));\n monomers.push(element);\n const residue = monomer.substring(monomer.indexOf(']') + 1);\n ss.push(residue);\n } else if (monomer.includes('[') && monomer.endsWith(']')) {\n const element = monomer.substring(monomer.lastIndexOf('[') + 1, monomer.length - 1);\n monomers.push(element);\n const residue = monomer.substring(0, monomer.lastIndexOf('['));\n ss.push(residue);\n } else if (monomer.includes('(') && monomer.includes(')')) {\n // here we only want to split the string at first '(' and last ')'\n // because entries like [L-hArg(Et,Et)]([L-hArg(Et,Et)]) where L-hArg(Et,Et) is a single monomer\n const firstPiece = monomer.substring(0, monomer.indexOf('('));\n const thirdPiece = monomer.substring(monomer.lastIndexOf(')') + 1);\n const secondPiece = monomer.substring(firstPiece.length + 1, monomer.length - thirdPiece.length - 1);\n const elements = [firstPiece, secondPiece, thirdPiece];\n for (const el of elements)\n ss.push(el);\n } else {\n monomers.push(monomer);\n }\n }\n }\n }\n return monomers;\n}\n\n// /** Find monomers missed in Helm monomer library configured and\n// * used in org.helm.webeditor / scil.helm.Monomers / org.helm.webeditor.Monomers .\n// */\n// export function findMonomers(helmString: string) {\n// //@ts-ignore\n// const types: string[] = Object.keys(org.helm.webeditor.monomerTypeList());\n// const monomerNameList: any[] = [];\n// const monomerNameI: number = 0;\n// const weMonomers = org.helm.webeditor.Monomers;\n// for (let typeI = 0; typeI < types.length; typeI++) {\n// //@ts-ignore\n// const ofTypeMonomers: {} = weMonomers.getMonomerSet(types[typeI]) ?? {};\n// Object.keys(ofTypeMonomers).forEach((key) => {\n// const monomer: any = ofTypeMonomers[key];\n// monomerNameList[monomerNameI] = monomer.id;\n// monomerNameI += 1;\n// });\n// }\n// const helmPartList = parseHelm(helmString);\n// return new Set(helmPartList.filter((val) => !monomerNameList.includes(val)));\n// }\n\n/** Searches monomers of {@link helmString} for missed. */\nexport function findMonomers(monomerSymbolList: string[]): Set<string> {\n //@ts-ignore\n const types = Object.keys(org.helm.webeditor.monomerTypeList());\n const monomers: any = [];\n const monomerNames: any = [];\n for (let i = 0; i < types.length; i++) {\n //@ts-ignore\n // eslint-disable-next-line new-cap\n monomers.push(new scil.helm.Monomers.getMonomerSet(types[i]));\n Object.keys(monomers[i]).forEach((k) => {\n monomerNames.push(monomers[i][k].id);\n });\n }\n return new Set(monomerSymbolList.filter((val) => !monomerNames.includes(val)));\n}\n\nfunction split(s: string, sep: string) {\n const ret = [];\n let frag = '';\n let parentheses = 0;\n let bracket = 0;\n let braces = 0;\n let quote = 0;\n for (let i = 0; i < s.length; ++i) {\n let c = s.substring(i, i + 1);\n if (c == sep && bracket == 0 && parentheses == 0 && braces == 0 && quote == 0) {\n ret.push(frag);\n frag = '';\n } else {\n frag += c;\n if (quote > 0) {\n if (c == '\\\\' && i + 1 < s.length) {\n ++i;\n const c2 = s.substring(i, i + 1);\n frag += c2;\n c += c2;\n }\n }\n if (c == '\\\"') {\n if (!(i > 0 && s.substring(i - 1, i) == '\\\\'))\n quote = quote == 0 ? 1 : 0;\n } else if (c == '[') {\n ++bracket;\n } else if (c == ']') {\n --bracket;\n } else if (c == '(') {\n ++parentheses;\n } else if (c == ')') {\n --parentheses;\n } else if (c == '{') {\n ++braces;\n } else if (c == '}') {\n --braces;\n }\n }\n }\n ret.push(frag);\n return ret;\n}\n\nfunction detachAnnotation(s: string) {\n const ret = _detachAppendix(s, '\\\"');\n if (ret.tag != null)\n return ret;\n\n const r = _detachAppendix(s, '\\'');\n return {tag: ret.tag, repeat: r.tag, str: r.str};\n}\n\nfunction _detachAppendix(s: string, c: string) {\n let tag = null;\n //@ts-ignore\n if (scil.Utils.endswith(s, c)) {\n let p = s.length - 1;\n while (p > 0) {\n p = s.lastIndexOf(c, p - 1);\n if (p <= 0 || s.substring(p - 1, p) != '\\\\')\n break;\n }\n\n if (p > 0 && p < s.length - 1) {\n tag = s.substring(p + 1, s.length - 1);\n s = s.substring(0, p);\n }\n }\n if (tag != null)\n tag = tag.replace(new RegExp('\\\\' + c, 'g'), c);\n return {tag: unescape(tag), str: s};\n}\n\nfunction unescape(s: string) {\n //@ts-ignore\n if (scil.Utils.isNullOrEmpty(s))\n return s;\n\n return s.replace(/[\\\\]./g, function(m) {\n switch (m) {\n case '\\\\r':\n return '\\r';\n case '\\\\n':\n return '\\n';\n case '\\\\t':\n return '\\t';\n default:\n return m.substring(1);\n }\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 wu from 'wu';\n\nimport {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types/index';\n\nimport {getParts, parseHelm} from './utils';\nimport {getMonomerLib} from './package';\n\nexport const enum Temps {\n helmMonomerPlacer = 'bio-helmMonomerPlacer',\n}\n\nexport class HelmMonomerPlacer {\n private _allPartsList: string[][] = null;\n private _lengthsList: number[][] = null;\n\n private monomerLib: IMonomerLib;\n\n public monomerCharWidth: number = 7;\n public leftPadding: number = 5;\n\n constructor(public readonly col: DG.Column<string>) {\n this.col.dataFrame.onDataChanged.subscribe();\n this.monomerLib = getMonomerLib();\n }\n\n /** @param rowIdx Row index of the table {@link DG.DataFrame}, HelmMonomerPlacer is {@link DG.Column} based */\n public getCellAllPartsLengths(rowIdx: number): [string[], number[], number[]] {\n if (this._allPartsList === null)\n this._allPartsList = new Array<string[]>(this.col.length).fill(null);\n\n if (this._lengthsList === null)\n this._lengthsList = new Array<number[]>(this.col.length).fill(null);\n\n const [allParts, lengths] = this.getCellMonomerLengthsForSeq(rowIdx);\n\n const sumLengths: number[] = new Array<number>(lengths.length + 1);\n sumLengths[0] = this.leftPadding; // padding\n for (let pos: number = 1; pos < sumLengths.length; pos++)\n sumLengths[pos] = sumLengths[pos - 1] + lengths[pos - 1];\n return [allParts, lengths, sumLengths];\n }\n\n private getCellMonomerLengthsForSeq(rowIdx: number): [string[], number[]] {\n const allParts: string[] = this._allPartsList[rowIdx] = this.getAllParts(rowIdx);\n const lengths: number[] = this._lengthsList[rowIdx] = new Array<number>(allParts.length);\n\n for (const [part, partI] of wu.enumerate(allParts)) {\n const partWidth: number = part.length * this.monomerCharWidth;\n lengths[partI] = partWidth;\n }\n\n return [allParts, lengths];\n }\n\n getAllParts(rowIdx: number): string[] {\n const seq: string | null = this.col.get(rowIdx);\n const subParts: string[] = parseHelm(seq);\n return seq ? getParts(subParts, seq) : [];\n }\n\n getMonomer(monomerSymbol: any): Monomer | null {\n let res: Monomer = null;\n for (const polymerType of this.monomerLib.getPolymerTypes()) {\n res = this.monomerLib.getMonomer(polymerType, monomerSymbol);\n if (res) break;\n }\n return res ?? null;\n }\n\n public static getOrCreate(col: DG.Column<string>): HelmMonomerPlacer {\n if (!(Temps.helmMonomerPlacer in col.temp)) col.temp[Temps.helmMonomerPlacer] = new HelmMonomerPlacer(col);\n return col.temp[Temps.helmMonomerPlacer];\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 wu from 'wu';\n\nimport {printLeftOrCentered} from '@datagrok-libraries/bio/src/utils/cell-renderer';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\n\nimport {findMonomers, parseHelm} from './utils';\nimport {HelmMonomerPlacer} from './helm-monomer-placer';\nimport {TAGS as helmTAGS} from './constants';\n\nconst enum tempTAGS {\n helmSumMaxLengthWords = 'helm-sum-maxLengthWords',\n helmMaxLengthWords = 'helm-maxLengthWords',\n\n helmPlacer = 'bio-helmPlacer',\n}\n\n// Global flag is for replaceAll\nconst helmGapStartRe = /\\{(\\*\\.)+/g;\nconst helmGapIntRe = /\\.(\\*\\.)+/g;\nconst helmGapEndRe = /(\\.\\*)+\\}/g;\n\ntype TempType = { [tagName: string]: any };\n\n/** Helm cell renderer in case of no missed monomer draws with JSDraw2.Editor (webeditor),\n * in case of missed monomers presented, draws linear sequences aligned in width per monomer.\n */\nexport class HelmCellRenderer extends DG.GridCellRenderer {\n get name() { return 'helm'; }\n\n get cellType() { return 'helm'; }\n\n get defaultWidth(): number | null { return 400; }\n\n get defaultHeight(): number | null { return 100; }\n\n onMouseMove(gridCell: DG.GridCell, e: MouseEvent): void {\n try {\n /* Can not do anything without tableColumn containing temp */\n let tableCol: DG.Column | null = null;\n try { tableCol = gridCell.tableColumn; } catch { }\n if (!tableCol) return;\n\n const helmPlacer = HelmMonomerPlacer.getOrCreate(tableCol);\n const [allParts, lengths, sumLengths] = helmPlacer.getCellAllPartsLengths(gridCell.tableRowIndex);\n\n const maxIndex = Object.values(lengths).length - 1;\n const argsX = e.offsetX - gridCell.bounds.x;\n let left = 0;\n let right = maxIndex;\n let found = false;\n let iterCount: number = 0;\n\n let mid = 0;\n if (argsX > sumLengths[0]) {\n while (!found && iterCount < sumLengths.length) {\n mid = Math.floor((right + left) / 2);\n if (argsX >= sumLengths[mid] && argsX <= sumLengths[mid + 1]) {\n left = mid;\n found = true;\n } else if (argsX < sumLengths[mid]) {\n right = mid - 1;\n } else if (argsX > sumLengths[mid + 1]) {\n left = mid + 1;\n }\n if (left == right)\n found = true;\n\n iterCount++;\n }\n }\n left = (argsX >= sumLengths[left]) ? left : left - 1; // correct left to between sumLengths\n\n const seq: string = gridCell.cell.value;\n const monomerList = parseHelm(seq);\n const monomers = new Set<string>(monomerList);\n const missedMonomers = findMonomers(monomerList);\n\n const tooltipMessage: HTMLElement[] = [];\n for (const [part, partI] of wu.enumerate(allParts)) {\n if (missedMonomers.has(part)) {\n tooltipMessage[partI] = ui.divV([\n ui.divText(`Monomer ${allParts[partI]} not found.`),\n ui.divText('Open the Context Panel, then expand Manage Libraries')\n ]);\n } else if (monomers.has(part)) {\n const elList = [ui.div(part)];\n const monomer = helmPlacer.getMonomer(part);\n if (monomer) {\n const options = {autoCrop: true, autoCropMargin: 0, suppressChiralText: true};\n const monomerSvg = grok.chem.svgMol(monomer.smiles, undefined, undefined, options);\n elList.push(monomerSvg);\n }\n tooltipMessage[partI] = ui.divV(elList);\n }\n }\n\n (((tooltipMessage[left]?.childNodes.length ?? 0) > 0)) ?\n ui.tooltip.show(tooltipMessage[left], e.x + 16, e.y + 16) :\n ui.tooltip.hide();\n } catch (err: any) {\n const errMsg: string = errorToConsole(err);\n console.error('Helm: HelmCellRenderer.onMouseMove() error:\\n' + errMsg);\n }\n }\n\n render(g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number,\n gridCell: DG.GridCell, cellStyle: DG.GridCellStyle\n ) {\n /* Can not do anything without tableColumn containing temp */\n let tableCol: DG.Column | null = null;\n try { tableCol = gridCell.tableColumn; } catch { }\n if (!tableCol) return;\n\n g.save();\n try {\n const grid = gridCell.gridRow !== -1 ? gridCell.grid : undefined;\n const missedColor = 'red';\n const monomerColor: string = '#404040';\n const frameColor: string = '#C0C0C0';\n\n const seq = gridCell.cell.value;\n const monomerList: string[] = parseHelm(seq);\n const monomers: Set<string> = new Set<string>(monomerList);\n const missedMonomers: Set<string> = findMonomers(monomerList);\n\n if (missedMonomers.size == 0) {\n const host = ui.div([], {style: {width: `${w}px`, height: `${h}px`}});\n host.setAttribute('dataformat', 'helm');\n host.setAttribute('data', gridCell.cell.value);\n gridCell.element = host;\n //@ts-ignore\n const canvas = new JSDraw2.Editor(host, {width: w, height: h, skin: 'w8', viewonly: true});\n return;\n }\n\n if (missedMonomers.size > 0) {\n if (!grid) {\n const r = window.devicePixelRatio;\n h = 28;\n g.canvas.height = h * r;\n g.canvas.style.height = `${h}px`;\n }\n\n w = grid ? Math.min(grid.canvas.width - x, w) : g.canvas.width - x;\n g.save();\n g.beginPath();\n g.rect(x, y, w, h);\n g.clip();\n g.transform(1, 0, 0, 1, x, y);\n g.font = '12px monospace';\n g.textBaseline = 'top';\n const helmPlacer = HelmMonomerPlacer.getOrCreate(tableCol);\n const [allParts, lengths, sumLengths] = helmPlacer.getCellAllPartsLengths(gridCell.tableRow.idx);\n\n for (let i = 0; i < allParts.length; ++i) {\n const part: string = allParts[i];\n const color: string =\n part === '.' || part.endsWith('{') || part.startsWith('}') ? frameColor :\n missedMonomers.has(part) ? missedColor :\n monomers.has(part) ? monomerColor :\n frameColor;\n g.fillStyle = color;\n printLeftOrCentered(sumLengths[i], 0, w, h, g, allParts[i], color, 0, true, 1.0);\n }\n }\n } catch (err: any) {\n const errMsg = err instanceof Error ? err.message : err.toString();\n const errStack = err instanceof Error ? err.stack : undefined;\n tableCol.setTag(helmTAGS.cellRendererRenderError, JSON.stringify({message: errMsg, stack: errStack}));\n throw err;\n } finally {\n g.restore();\n }\n }\n}\n",null,"/* 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\nimport {WebEditorMonomer, RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from './constants';\nimport {HelmWebEditor} from './helm-web-editor';\nimport {HelmCellRenderer} from './cell-renderer';\nimport {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types';\nimport {NotationConverter} from '@datagrok-libraries/bio/src/utils/notation-converter';\nimport {findMonomers} from './utils';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\nimport {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\n\nexport const _package = new DG.Package();\nlet monomerLib: IMonomerLib | null = null;\n\n//tags: init\nexport async function initHelm(): Promise<void> {\n return Promise.all([\n new Promise((resolve, reject) => {\n // @ts-ignore\n dojo.ready(function() { resolve(null); });\n }),\n grok.functions.call('Bio:getBioLib'),\n ])\n .then(([_, lib]: [void, IMonomerLib]) => {\n monomerLib = lib;\n rewriteLibraries(); // initHelm()\n monomerLib.onChanged.subscribe((_) => {\n try {\n rewriteLibraries(); // initHelm()\n\n const monTypeList: string[] = monomerLib.getPolymerTypes();\n const msgStr: string = 'Monomer lib updated:<br />' + (\n monTypeList.length == 0 ? 'empty' : monTypeList.map((monType) => {\n return `${monType} ${monomerLib.getMonomerSymbolsByType(monType).length}`;\n }).join('<br />'));\n\n grok.shell.info(msgStr);\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Helm: initHelm monomerLib.onChanged() error:\\n' + errMsg);\n // throw err; // Prevent disabling event handler\n }\n });\n })\n .catch((err: any) => {\n const errMsg: string = err instanceof Error ? err.message : !!err ? err.toString() : 'Exception \\'undefined\\'';\n grok.shell.error(`Package \\'Helm\\' init initHelm() error: ${errMsg}`);\n const errRes = new Error(errMsg);\n errRes.stack = err.stack;\n throw errRes;\n });\n}\n\nexport function getMonomerLib(): IMonomerLib {\n return monomerLib;\n}\n\nfunction rewriteLibraries() {\n org.helm.webeditor.Monomers.clear();\n monomerLib.getPolymerTypes().forEach((polymerType) => {\n const monomerSymbols = monomerLib.getMonomerSymbolsByType(polymerType);\n monomerSymbols.forEach((monomerSymbol) => {\n let isBroken = false;\n const monomer: Monomer = monomerLib.getMonomer(polymerType, monomerSymbol);\n const webEditorMonomer: WebEditorMonomer = {\n id: monomerSymbol,\n m: monomer.molfile,\n n: monomer.name,\n na: monomer.naturalAnalog,\n rs: monomer.rgroups.length,\n type: monomer.polymerType,\n mt: monomer.monomerType,\n at: {}\n };\n\n if (monomer.rgroups.length > 0) {\n webEditorMonomer.rs = monomer.rgroups.length;\n const at = {};\n monomer.rgroups.forEach((it) => {\n at[it[RGROUP_LABEL]] = it[RGROUP_CAP_GROUP_NAME];\n });\n webEditorMonomer.at = at;\n } else if (monomer[SMILES] != null) {\n webEditorMonomer.rs = Object.keys(getRS(monomer[SMILES].toString())).length;\n webEditorMonomer.at = getRS(monomer[SMILES].toString());\n } else {\n isBroken = true;\n }\n\n if (!isBroken)\n org.helm.webeditor.Monomers.addOneMonomer(webEditorMonomer);\n });\n });\n\n // Obsolete\n const grid: DG.Grid = grok.shell.tv.grid;\n if (grid) grid.invalidate();\n}\n\n//name: helmCellRenderer\n//tags: cellRenderer\n//meta.cellType: helm\n//meta.columnTags: units=helm\n//output: grid_cell_renderer result\nexport function helmCellRenderer(): HelmCellRenderer {\n return new HelmCellRenderer();\n}\n\nfunction checkMonomersAndOpenWebEditor(cell?: DG.Cell, value?: string, units?: string) {\n const cellValue = typeof units === 'undefined' ? cell.value : value;\n const monomers = findMonomers(cellValue);\n if (monomers.size == 0) { webEditor(cell, value, units); } else {\n grok.shell.warning(`Monomers ${Array.from(monomers).join(', ')} are absent! <br/>` +\n `Please, upload the monomer library! <br/>` +\n `<a href=\"https://datagrok.ai/help/domains/bio/macromolecules\" target=\"_blank\">Learn more</a>`);\n }\n}\n\n//tags: cellEditor\n//description: Macromolecule\n//input: grid_cell cell\n//meta.columnTags: quality=Macromolecule, units=helm\nexport function editMoleculeCell(cell: DG.GridCell): void {\n checkMonomersAndOpenWebEditor(cell.cell, undefined, undefined);\n}\n\n//name: Open Helm Web Editor\n//description: Adds editor\n//meta.action: Open Helm Web Editor\n//input: string mol { semType: Macromolecule }\nexport function openEditor(mol: string): void {\n const df = grok.shell.tv.grid.dataFrame;\n const col = df.columns.bySemType('Macromolecule');\n const colUnits = col.getTag(DG.TAGS.UNITS);\n if (colUnits === NOTATION.HELM)\n checkMonomersAndOpenWebEditor(df.currentCell, undefined, undefined);\n const converter = new NotationConverter(col);\n const resStr = converter.convertStringToHelm(mol, '/');\n checkMonomersAndOpenWebEditor(df.currentCell, resStr, col.getTag(DG.TAGS.UNITS));\n}\n\n//name: Properties\n//tags: panel, widgets\n//input: string helmString {semType: Macromolecule}\n//output: widget result\nexport async function propertiesPanel(helmString: string) {\n const grid = grok.shell.tv.grid;\n const parent = grid.root.parentElement;\n const host = ui.div([]);\n parent.appendChild(host);\n const editor = new JSDraw2.Editor(host, {viewonly: true});\n host.style.width = '0px';\n host.style.height = '0px';\n editor.setHelm(helmString);\n const formula = editor.getFormula(true);\n const molWeight = Math.round(editor.getMolWeight() * 100) / 100;\n const coef = Math.round(editor.getExtinctionCoefficient(true) * 100) / 100;\n parent.lastChild.remove();\n return new DG.Widget(\n ui.tableFromMap({\n 'formula': formula.replace(/<sub>/g, '').replace(/<\\/sub>/g, ''),\n 'molecular weight': molWeight,\n 'extinction coefficient': coef,\n })\n );\n}\n\nfunction webEditor(cell?: DG.Cell, value?: string, units?: string) {\n const view = ui.div();\n const df = grok.shell.tv.grid.dataFrame;\n const converter = new NotationConverter(df.columns.bySemType('Macromolecule'));\n org.helm.webeditor.MolViewer.molscale = 0.8;\n const app = new scil.helm.App(view, {\n showabout: false,\n mexfontsize: '90%',\n mexrnapinontab: true,\n topmargin: 20,\n mexmonomerstab: true,\n sequenceviewonly: false,\n mexfavoritefirst: true,\n mexfilter: true\n });\n const sizes = app.calculateSizes();\n app.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);\n let s = {width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px'};\n //@ts-ignore\n scil.apply(app.sequence.style, s);\n //@ts-ignore\n scil.apply(app.notation.style, s);\n s = {width: sizes.rightwidth + 'px', height: (sizes.bottomheight + app.toolbarheight) + 'px'};\n //@ts-ignore\n scil.apply(app.properties.parent.style, s);\n app.structureview.resize(sizes.rightwidth, sizes.bottomheight + app.toolbarheight);\n app.mex.resize(sizes.topheight - 80);\n setTimeout(() => {\n if (typeof units === 'undefined')\n app.canvas.helm.setSequence(cell.value, 'HELM');\n else\n app.canvas.helm.setSequence(value, 'HELM');\n }, 200);\n //@ts-ignore\n ui.dialog({showHeader: false, showFooter: true})\n .add(view)\n .onOK(() => {\n const helmValue = app.canvas.getHelm(true).replace(/<\\/span>/g, '')\n .replace(/<span style='background:#bbf;'>/g, '');\n if (typeof units === 'undefined') {\n cell.value = helmValue;\n } else {\n const convertedRes = converter.convertHelmToFastaSeparator(helmValue, units);\n cell.value = convertedRes;\n }\n }).show({modal: true, fullScreen: true});\n}\n\nfunction getRS(smiles: string) {\n const newS = smiles.match(/(?<=\\[)[^\\][]*(?=])/gm);\n const res = {};\n let el = '';\n let digit;\n for (let i = 0; i < newS.length; i++) {\n if (newS[i] != null) {\n if (/\\d/.test(newS[i])) {\n digit = newS[i][newS[i].length - 1];\n newS[i] = newS[i].replace(/[0-9]/g, '');\n for (let j = 0; j < newS[i].length; j++) {\n if (newS[i][j] != ':')\n el += newS[i][j];\n }\n res['R' + digit] = el;\n el = '';\n }\n }\n }\n return res;\n}\n\n//name: getMolfiles\n//input: column col {semType: Macromolecule}\n//output: column res\nexport function getMolfiles(col: DG.Column): DG.Column {\n const grid = grok.shell.tv.grid;\n const parent = grid.root.parentElement;\n const res = DG.Column.string('mols', col.length);\n const host = ui.div([]);\n parent.appendChild(host);\n const editor = new JSDraw2.Editor(host, {viewonly: true});\n host.style.width = '0px';\n host.style.height = '0px';\n res.init((i) => {\n editor.setHelm(col.get(i));\n const mol = editor.getMolfile();\n return mol;\n });\n parent.lastChild.remove();\n return res;\n}\n\n//name: helmWebEditor\n//output: object\nexport function helmWebEditor(): HelmWebEditor {\n return new HelmWebEditor();\n}\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","grok","ui","DG","HelmWebEditor","constructor","w","h","this","host","style","width","height","editor","JSDraw2","Editor","viewonly","resizeEditor","setSize","createWebEditor","editorView","org","helm","webeditor","MolViewer","molscale","webEditor","scil","App","showabout","mexfontsize","mexrnapinontab","topmargin","mexmonomerstab","sequenceviewonly","mexfavoritefirst","mexfilter","sizes","calculateSizes","canvas","resize","rightwidth","topheight","s","bottomheight","apply","sequence","notation","toolbarheight","properties","parent","structureview","mex","setTimeout","setSequence","editorDiv","wu","peq","Uint32Array","defaultArgs","gapOpen","gapExtend","scoringMatrix","alphabetIndexes","MmDistanceFunctionsNames","mmDistanceFunctions","HAMMING","seq1","seq2","diff","length","Math","abs","result","i","min","max","LEVENSHTEIN","b","tmp","n","m","lst","pv","mv","sc","charCodeAt","eq","xv","myers_32","mhc","phc","hsize","ceil","vsize","j","start","vlen","k","pb","mb","xh","ph","mh","score","myers_x","distance","NEEDLEMANN_WUNSCH","args","matrix","Array","fill","verticalGaps","horizontalGaps","prevRow","currRow","diagonal","top","left","perfectMatchSeq1","split","map","c","reduce","perfectMatchSeq2","maxScore","v1","v2","Error","prod","Float32Array","vectorLength","v","sqrSum","sqrt","errorToConsole","err","String","stack","message","toString","parseHelm","monomers","Utils","isNullOrEmpty","seqs","p","detachAnnotation","str","indexOf","substring","ss","monomer","startsWith","includes","element","push","residue","endsWith","lastIndexOf","firstPiece","thirdPiece","elements","el","findMonomers","monomerSymbolList","types","keys","monomerTypeList","monomerNames","Monomers","getMonomerSet","forEach","id","Set","filter","val","sep","ret","frag","parentheses","bracket","braces","quote","c2","_detachAppendix","tag","r","repeat","endswith","replace","RegExp","HelmMonomerPlacer","col","_allPartsList","_lengthsList","monomerCharWidth","leftPadding","dataFrame","onDataChanged","subscribe","monomerLib","getMonomerLib","getCellAllPartsLengths","rowIdx","allParts","lengths","getCellMonomerLengthsForSeq","sumLengths","pos","getAllParts","part","partI","partWidth","seq","subParts","indexOfMonomer","helmBeforeMonomer","slice","getParts","getMonomer","monomerSymbol","res","polymerType","getPolymerTypes","static","temp","HelmCellRenderer","name","cellType","defaultWidth","defaultHeight","onMouseMove","gridCell","e","tableCol","tableColumn","helmPlacer","getOrCreate","tableRowIndex","maxIndex","values","argsX","offsetX","bounds","x","right","found","iterCount","mid","floor","monomerList","cell","missedMonomers","tooltipMessage","has","elList","options","autoCrop","autoCropMargin","suppressChiralText","monomerSvg","smiles","undefined","childNodes","y","errMsg","console","error","render","g","cellStyle","save","grid","gridRow","missedColor","monomerColor","frameColor","size","setAttribute","skin","window","devicePixelRatio","beginPath","rect","clip","transform","font","textBaseline","tableRow","idx","color","fillStyle","printLeftOrCentered","errStack","setTag","JSON","stringify","restore","_package","initHelm","Promise","all","resolve","reject","dojo","ready","then","_","lib","rewriteLibraries","onChanged","monTypeList","msgStr","monType","getMonomerSymbolsByType","join","catch","errRes","clear","isBroken","webEditorMonomer","molfile","na","naturalAnalog","rs","rgroups","type","mt","monomerType","at","it","getRS","addOneMonomer","invalidate","helmCellRenderer","checkMonomersAndOpenWebEditor","units","view","df","converter","NotationConverter","columns","bySemType","app","showHeader","showFooter","add","onOK","helmValue","getHelm","convertedRes","convertHelmToFastaSeparator","show","modal","fullScreen","from","editMoleculeCell","openEditor","mol","getTag","currentCell","resStr","convertStringToHelm","propertiesPanel","helmString","root","parentElement","appendChild","setHelm","formula","getFormula","molWeight","round","getMolWeight","coef","getExtinctionCoefficient","lastChild","remove","newS","match","digit","test","getMolfiles","init","getMolfile","helmWebEditor"],"sourceRoot":""}
1
+ {"version":3,"file":"package.js","mappings":"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","sources":["webpack://helm/webpack/bootstrap","webpack://helm/webpack/runtime/compat get default export","webpack://helm/webpack/runtime/define property getters","webpack://helm/webpack/runtime/hasOwnProperty shorthand","webpack://helm/webpack/runtime/make namespace object","webpack://helm/external var \"grok\"","webpack://helm/external var \"ui\"","webpack://helm/external var \"DG\"","webpack://helm/./src/helm-web-editor.ts","webpack://helm/external var \"wu\"","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/types.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/consts.js","webpack://helm/./node_modules/fastest-levenshtein/esm/mod.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/needleman-wunsch.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/macromolecule-distance-functions.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/hamming.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/levenstein.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/units-handler.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/utils.js","webpack://helm/./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/monomer-works/monomer-utils.js","webpack://helm/./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/seq-palettes.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/aminoacids.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/nucleotides.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/unknown.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/cell-renderer.js","webpack://helm/./node_modules/@datagrok-libraries/utils/src/to-console.js","webpack://helm/./src/utils.ts","webpack://helm/./src/helm-monomer-placer.ts","webpack://helm/./src/cell-renderer.ts","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/notation-converter.js","webpack://helm/./src/package.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\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__.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};","const __WEBPACK_NAMESPACE_OBJECT__ = grok;","const __WEBPACK_NAMESPACE_OBJECT__ = ui;","const __WEBPACK_NAMESPACE_OBJECT__ = DG;","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nexport class HelmWebEditor {\n host: any;\n editor: any;\n w = 200;\n h = 100;\n\n constructor() {\n this.host = ui.div([], {style: {width: `${this.w}px`, height: `${this.h}px`}});\n this.editor = new JSDraw2.Editor(this.host, {width: this.w, height: this.h, viewonly: true});\n }\n\n resizeEditor(w: number, h: number) {\n this.editor.setSize(w, h);\n }\n\n createWebEditor(value: string) {\n const editorView = ui.div();\n // @ts-ignore\n org.helm.webeditor.MolViewer.molscale = 0.8;\n // @ts-ignore\n const webEditor = new scil.helm.App(editorView, {\n showabout: false,\n mexfontsize: '90%',\n mexrnapinontab: true,\n topmargin: 20,\n mexmonomerstab: true,\n sequenceviewonly: false,\n mexfavoritefirst: true,\n mexfilter: true\n });\n const sizes = webEditor.calculateSizes();\n webEditor.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);\n let s = {width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px'};\n //@ts-ignore\n scil.apply(webEditor.sequence.style, s);\n //@ts-ignore\n scil.apply(webEditor.notation.style, s);\n s = {width: sizes.rightwidth + 'px', height: (sizes.bottomheight + webEditor.toolbarheight) + 'px'};\n //@ts-ignore\n scil.apply(webEditor.properties.parent.style, s);\n webEditor.structureview.resize(sizes.rightwidth, sizes.bottomheight + webEditor.toolbarheight);\n webEditor.mex.resize(sizes.topheight - 80);\n setTimeout(function() {\n webEditor.canvas.helm.setSequence(value, 'HELM');\n }, 200);\n return {editorDiv: editorView, webEditor: webEditor};\n }\n}\n\n","const __WEBPACK_NAMESPACE_OBJECT__ = wu;","/** Alphabet candidate type */\nexport class CandidateType {\n constructor(name, alphabet, cutoff) {\n this.name = name;\n this.alphabet = alphabet;\n this.cutoff = cutoff;\n }\n}\n/** Alphabet candidate similarity type */\nexport class CandidateSimType extends CandidateType {\n constructor(candidate, freq, similarity) {\n super(candidate.name, candidate.alphabet, candidate.cutoff);\n this.freq = freq;\n this.similarity = similarity;\n }\n}\n//# sourceMappingURL=types.js.map","import { CandidateType } from './types';\nexport const monomerRe = /(\\[[A-Za-z0-9-_]+\\]|.)/g;\nexport const Alphabets = new class {\n constructor() {\n this.fasta = {\n peptide: 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 ]),\n dna: new Set(['A', 'C', 'G', 'T']),\n rna: new Set(['A', 'C', 'G', 'U']),\n };\n }\n}();\nexport const candidateAlphabets = [\n new CandidateType(\"PT\" /* ALPHABET.PT */, Alphabets.fasta.peptide, 0.50),\n new CandidateType(\"DNA\" /* ALPHABET.DNA */, Alphabets.fasta.dna, 0.55),\n new CandidateType(\"RNA\" /* ALPHABET.RNA */, Alphabets.fasta.rna, 0.55),\n];\n//# sourceMappingURL=consts.js.map","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","// Blosum 62 matrix for protein sequences\nconst BLOSUM62 = [[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// Protein indexes for BLOSUM matrix\nconst ProtIndexes = {\n 'A': 0, 'R': 1, 'N': 2, 'D': 3, 'C': 4, 'Q': 5, 'E': 6, 'G': 7, 'H': 8,\n 'I': 9, 'L': 10, 'K': 11, 'M': 12, 'F': 13, 'P': 14, 'S': 15, 'T': 16,\n 'W': 17, 'Y': 18, 'V': 19, 'B': 20, 'Z': 21, 'X': 22, '*': 23\n};\nconst defaultArgs = {\n gapOpen: 8,\n gapExtend: 2,\n scoringMatrix: BLOSUM62,\n alphabetIndexes: ProtIndexes\n};\n/** Returns a function that calculates the distance between two sequences based on gap penalty and matrix\n * @param {Partial<NeedlemanWunchArgs>}args - arguments for Needleman-Wunch algorithm like gap penalty, Scoring matrix..\n * @return {mmDistanceFunctionType} - function that calculates the distance between two sequences\n*/\nexport function needlemanWunch(args) {\n return (seq1, seq2) => {\n const { gapOpen, gapExtend, scoringMatrix, alphabetIndexes } = { ...defaultArgs, ...args };\n // As we don't need traceback, no need to store the whole matrix\n // Intead, we will store only the last two rows\n const matrix = [\n new Array(seq1.length + 1).fill(0),\n new Array(seq1.length + 1).fill(0)\n ];\n // similarly, we need to keep track of what operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n const verticalGaps = new Array(seq1.length + 1).fill(false);\n const horizontalGaps = new Array(seq1.length + 1).fill(false);\n //variables to keep track which row we are in\n // they will swap places on each iteration\n let prevRow = 0;\n let currRow = 1;\n // Initialize first row\n for (let i = 1; i < seq1.length + 1; i++)\n matrix[0][i] = -gapOpen - (i - 1) * gapExtend;\n // Calculate the rest of the matrix\n for (let i = 1; i < seq2.length + 1; i++) {\n matrix[currRow][0] = -gapOpen - (i - 1) * gapExtend;\n for (let j = 1; j < seq1.length + 1; j++) {\n const diagonal = matrix[prevRow][j - 1] + scoringMatrix[alphabetIndexes[seq1[j - 1]]][alphabetIndexes[seq2[i - 1]]];\n const top = matrix[prevRow][j] - (verticalGaps[j] ? gapExtend : gapOpen);\n const left = matrix[currRow][j - 1] - (horizontalGaps[j - 1] ? gapExtend : gapOpen);\n matrix[currRow][j] = Math.max(diagonal, left, top);\n // update gap arrays\n if (matrix[currRow][j] === diagonal) {\n verticalGaps[j] = false;\n horizontalGaps[j] = false;\n }\n else if (matrix[currRow][j] === left) {\n verticalGaps[j] = false;\n horizontalGaps[j] = true;\n }\n else {\n verticalGaps[j] = true;\n horizontalGaps[j] = false;\n }\n }\n // Swap rows\n prevRow = currRow;\n currRow = (currRow + 1) % 2;\n }\n // as the matrix is the similarity matrix, but we are interested in distance,\n // we need compare it to perfect match score to get reasonable distance\n const perfectMatchSeq1 = seq1.split('').map((c) => scoringMatrix[alphabetIndexes[c]][alphabetIndexes[c]])\n .reduce((a, b) => a + b, 0);\n const perfectMatchSeq2 = seq2.split('').map((c) => scoringMatrix[alphabetIndexes[c]][alphabetIndexes[c]])\n .reduce((a, b) => a + b, 0);\n const maxScore = Math.max(perfectMatchSeq1, perfectMatchSeq2);\n return (maxScore - matrix[prevRow][seq1.length]) / maxScore;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVlZGxlbWFuLXd1bnNjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5lZWRsZW1hbi13dW5zY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEseUNBQXlDO0FBQ3pDLE1BQU0sUUFBUSxHQUNkLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUYsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFD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QUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUM7SUFDOUQsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7bW1EaXN0YW5jZUZ1bmN0aW9uVHlwZX0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIEJsb3N1bSA2MiBtYXRyaXggZm9yIHByb3RlaW4gc2VxdWVuY2VzXG5jb25zdCBCTE9TVU02MjpBcnJheTxBcnJheTxudW1iZXI+PiA9XG5bWzQsIC0xLCAtMiwgLTIsIDAsIC0xLCAtMSwgMCwgLTIsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTEsIDEsIDAsIC0zLCAtMiwgMCwgLTIsIC0xLCAwLCAtNF0sXG4gIFstMSwgNSwgMCwgLTIsIC0zLCAxLCAwLCAtMiwgMCwgLTMsIC0yLCAyLCAtMSwgLTMsIC0yLCAtMSwgLTEsIC0zLCAtMiwgLTMsIC0xLCAwLCAtMSwgLTRdLFxuICBbLTIsIDAsIDYsIDEsIC0zLCAwLCAwLCAwLCAxLCAtMywgLTMsIDAsIC0yLCAtMywgLTIsIDEsIDAsIC00LCAtMiwgLTMsIDMsIDAsIC0xLCAtNF0sXG4gIFstMiwgLTIsIDEsIDYsIC0zLCAwLCAyLCAtMSwgLTEsIC0zLCAtNCwgLTEsIC0zLCAtMywgLTEsIDAsIC0xLCAtNCwgLTMsIC0zLCA0LCAxLCAtMSwgLTRdLFxuICBbMCwgLTMsIC0zLCAtMywgOSwgLTMsIC00LCAtMywgLTMsIC0xLCAtMSwgLTMsIC0xLCAtMiwgLTMsIC0xLCAtMSwgLTIsIC0yLCAtMSwgLTMsIC0zLCAtMiwgLTRdLFxuICBbLTEsIDEsIDAsIDAsIC0zLCA1LCAyLCAtMiwgMCwgLTMsIC0yLCAxLCAwLCAtMywgLTEsIDAsIC0xLCAtMiwgLTEsIC0yLCAwLCAzLCAtMSwgLTRdLFxuICBbLTEsIDAsIDAsIDIsIC00LCAyLCA1LCAtMiwgMCwgLTMsIC0zLCAxLCAtMiwgLTMsIC0xLCAwLCAtMSwgLTMsIC0yLCAtMiwgMSwgNCwgLTEsIC00XSxcbiAgWzAsIC0yLCAwLCAtMSwgLTMsIC0yLCAtMiwgNiwgLTIsIC00LCAtNCwgLTIsIC0zLCAtMywgLTIsIDAsIC0yLCAtMiwgLTMsIC0zLCAtMSwgLTIsIC0xLCAtNF0sXG4gIFstMiwgMCwgMSwgLTEsIC0zLCAwLCAwLCAtMiwgOCwgLTMsIC0zLCAtMSwgLTIsIC0xLCAtMiwgLTEsIC0yLCAtMiwgMiwgLTMsIDAsIDAsIC0xLCAtNF0sXG4gIFstMSwgLTMsIC0zLCAtMywgLTEsIC0zLCAtMywgLTQsIC0zLCA0LCAyLCAtMywgMSwgMCwgLTMsIC0yLCAtMSwgLTMsIC0xLCAzLCAtMywgLTMsIC0xLCAtNF0sXG4gIFstMSwgLTIsIC0zLCAtNCwgLTEsIC0yLCAtMywgLTQsIC0zLCAyLCA0LCAtMiwgMiwgMCwgLTMsIC0yLCAtMSwgLTIsIC0xLCAxLCAtNCwgLTMsIC0xLCAtNF0sXG4gIFstMSwgMiwgMCwgLTEsIC0zLCAxLCAxLCAtMiwgLTEsIC0zLCAtMiwgNSwgLTEsIC0zLCAtMSwgMCwgLTEsIC0zLCAtMiwgLTIsIDAsIDEsIC0xLCAtNF0sXG4gIFstMSwgLTEsIC0yLCAtMywgLTEsIDAsIC0yLCAtMywgLTIsIDEsIDIsIC0xLCA1LCAwLCAtMiwgLTEsIC0xLCAtMSwgLTEsIDEsIC0zLCAtMSwgLTEsIC00XSxcbiAgWy0yLCAtMywgLTMsIC0zLCAtMiwgLTMsIC0zLCAtMywgLTEsIDAsIDAsIC0zLCAwLCA2LCAtNCwgLTIsIC0yLCAxLCAzLCAtMSwgLTMsIC0zLCAtMSwgLTRdLFxuICBbLTEsIC0yLCAtMiwgLTEsIC0zLCAtMSwgLTEsIC0yLCAtMiwgLTMsIC0zLCAtMSwgLTIsIC00LCA3LCAtMSwgLTEsIC00LCAtMywgLTIsIC0yLCAtMSwgLTIsIC00XSxcbiAgWzEsIC0xLCAxLCAwLCAtMSwgMCwgMCwgMCwgLTEsIC0yLCAtMiwgMCwgLTEsIC0yLCAtMSwgNCwgMSwgLTMsIC0yLCAtMiwgMCwgMCwgMCwgLTRdLFxuICBbMCwgLTEsIDAsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTIsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTEsIDEsIDUsIC0yLCAtMiwgMCwgLTEsIC0xLCAwLCAtNF0sXG4gIFstMywgLTMsIC00LCAtNCwgLTIsIC0yLCAtMywgLTIsIC0yLCAtMywgLTIsIC0zLCAtMSwgMSwgLTQsIC0zLCAtMiwgMTEsIDIsIC0zLCAtNCwgLTMsIC0yLCAtNF0sXG4gIFstMiwgLTIsIC0yLCAtMywgLTIsIC0xLCAtMiwgLTMsIDIsIC0xLCAtMSwgLTIsIC0xLCAzLCAtMywgLTIsIC0yLCAyLCA3LCAtMSwgLTMsIC0yLCAtMSwgLTRdLFxuICBbMCwgLTMsIC0zLCAtMywgLTEsIC0yLCAtMiwgLTMsIC0zLCAzLCAxLCAtMiwgMSwgLTEsIC0yLCAtMiwgMCwgLTMsIC0xLCA0LCAtMywgLTIsIC0xLCAtNF0sXG4gIFstMiwgLTEsIDMsIDQsIC0zLCAwLCAxLCAtMSwgMCwgLTMsIC00LCAwLCAtMywgLTMsIC0yLCAwLCAtMSwgLTQsIC0zLCAtMywgNCwgMSwgLTEsIC00XSxcbiAgWy0xLCAwLCAwLCAxLCAtMywgMywgNCwgLTIsIDAsIC0zLCAtMywgMSwgLTEsIC0zLCAtMSwgMCwgLTEsIC0zLCAtMiwgLTIsIDEsIDQsIC0xLCAtNF0sXG4gIFswLCAtMSwgLTEsIC0xLCAtMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTIsIDAsIDAsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC00XSxcbiAgWy00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgMV1dO1xuXG4vLyBQcm90ZWluIGluZGV4ZXMgZm9yIEJMT1NVTSBtYXRyaXhcbmNvbnN0IFByb3RJbmRleGVzOiB7W2lkOnN0cmluZ106bnVtYmVyfSA9IHtcbiAgJ0EnOiAwLCAnUic6IDEsICdOJzogMiwgJ0QnOiAzLCAnQyc6IDQsICdRJzogNSwgJ0UnOiA2LCAnRyc6IDcsICdIJzogOCxcbiAgJ0knOiA5LCAnTCc6IDEwLCAnSyc6IDExLCAnTSc6IDEyLCAnRic6IDEzLCAnUCc6IDE0LCAnUyc6IDE1LCAnVCc6IDE2LFxuICAnVyc6IDE3LCAnWSc6IDE4LCAnVic6IDE5LCAnQic6IDIwLCAnWic6IDIxLCAnWCc6IDIyLCAnKic6IDIzXG59O1xuXG5pbnRlcmZhY2UgTmVlZGxlbWFuV3VuY2hBcmdzIHtcbiAgZ2FwT3BlbjogbnVtYmVyO1xuICBnYXBFeHRlbmQ6IG51bWJlcjtcbiAgc2NvcmluZ01hdHJpeDogbnVtYmVyW11bXTtcbiAgYWxwaGFiZXRJbmRleGVzOiB7W2lkOnN0cmluZ106bnVtYmVyfTtcbn1cblxuY29uc3QgZGVmYXVsdEFyZ3M6IE5lZWRsZW1hbld1bmNoQXJncyA9IHtcbiAgZ2FwT3BlbjogOCxcbiAgZ2FwRXh0ZW5kOiAyLFxuICBzY29yaW5nTWF0cml4OiBCTE9TVU02MixcbiAgYWxwaGFiZXRJbmRleGVzOiBQcm90SW5kZXhlc1xufTtcblxuLyoqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNhbGN1bGF0ZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNlcXVlbmNlcyBiYXNlZCBvbiBnYXAgcGVuYWx0eSBhbmQgbWF0cml4XG4gKiBAcGFyYW0ge1BhcnRpYWw8TmVlZGxlbWFuV3VuY2hBcmdzPn1hcmdzIC0gYXJndW1lbnRzIGZvciBOZWVkbGVtYW4tV3VuY2ggYWxnb3JpdGhtIGxpa2UgZ2FwIHBlbmFsdHksIFNjb3JpbmcgbWF0cml4Li5cbiAqIEByZXR1cm4ge21tRGlzdGFuY2VGdW5jdGlvblR5cGV9IC0gZnVuY3Rpb24gdGhhdCBjYWxjdWxhdGVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzZXF1ZW5jZXNcbiovXG5leHBvcnQgZnVuY3Rpb24gbmVlZGxlbWFuV3VuY2goYXJnczogUGFydGlhbDxOZWVkbGVtYW5XdW5jaEFyZ3M+KTogbW1EaXN0YW5jZUZ1bmN0aW9uVHlwZSB7XG4gIHJldHVybiAoc2VxMTogc3RyaW5nLCBzZXEyOiBzdHJpbmcpIDogbnVtYmVyID0+IHtcbiAgICBjb25zdCB7Z2FwT3BlbiwgZ2FwRXh0ZW5kLCBzY29yaW5nTWF0cml4LCBhbHBoYWJldEluZGV4ZXN9ID0gey4uLmRlZmF1bHRBcmdzLCAuLi5hcmdzfTtcbiAgICAvLyBBcyB3ZSBkb24ndCBuZWVkIHRyYWNlYmFjaywgbm8gbmVlZCB0byBzdG9yZSB0aGUgd2hvbGUgbWF0cml4XG4gICAgLy8gSW50ZWFkLCB3ZSB3aWxsIHN0b3JlIG9ubHkgdGhlIGxhc3QgdHdvIHJvd3NcbiAgICBjb25zdCBtYXRyaXg6IG51bWJlcltdW10gPSBbXG4gICAgICBuZXcgQXJyYXk8bnVtYmVyPihzZXExLmxlbmd0aCArIDEpLmZpbGwoMCksXG4gICAgICBuZXcgQXJyYXk8bnVtYmVyPihzZXExLmxlbmd0aCArIDEpLmZpbGwoMClcbiAgICBdO1xuICAgIC8vIHNpbWlsYXJseSwgd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHdoYXQgb3BlcmF0aW9uIGxlZCB0byB0aGUgY3VycmVudCBjZWxsXG4gICAgLy8gaS5lLiB3aGV0aGVyIHdlIGNhbWUgZnJvbSB0aGUgbGVmdCwgdG9wIG9yIGRpYWdvbmFsIHRvIGFzc2lnbiBnYXAgb3Blbi9nYXAgZXh0ZW5kIHBlbmFsdHlcbiAgICBjb25zdCB2ZXJ0aWNhbEdhcHM6IGJvb2xlYW5bXSA9IG5ldyBBcnJheTxib29sZWFuPihzZXExLmxlbmd0aCArIDEpLmZpbGwoZmFsc2UpO1xuICAgIGNvbnN0IGhvcml6b250YWxHYXBzOiBib29sZWFuW10gPSBuZXcgQXJyYXk8Ym9vbGVhbj4oc2VxMS5sZW5ndGggKyAxKS5maWxsKGZhbHNlKTtcblxuICAgIC8vdmFyaWFibGVzIHRvIGtlZXAgdHJhY2sgd2hpY2ggcm93IHdlIGFyZSBpblxuICAgIC8vIHRoZXkgd2lsbCBzd2FwIHBsYWNlcyBvbiBlYWNoIGl0ZXJhdGlvblxuICAgIGxldCBwcmV2Um93ID0gMDtcbiAgICBsZXQgY3VyclJvdyA9IDE7XG4gICAgLy8gSW5pdGlhbGl6ZSBmaXJzdCByb3dcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNlcTEubGVuZ3RoICsgMTsgaSsrKVxuICAgICAgbWF0cml4WzBdW2ldID0gLWdhcE9wZW4gLSAoaSAtIDEpICogZ2FwRXh0ZW5kO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSByZXN0IG9mIHRoZSBtYXRyaXhcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNlcTIubGVuZ3RoICsgMTsgaSsrKSB7XG4gICAgICBtYXRyaXhbY3VyclJvd11bMF0gPSAtZ2FwT3BlbiAtIChpIC0gMSkgKiBnYXBFeHRlbmQ7XG4gICAgICBmb3IgKGxldCBqID0gMTsgaiA8IHNlcTEubGVuZ3RoICsgMTsgaisrKSB7XG4gICAgICAgIGNvbnN0IGRpYWdvbmFsID1cbiAgICAgICAgICBtYXRyaXhbcHJldlJvd11baiAtIDFdICsgc2NvcmluZ01hdHJpeFthbHBoYWJldEluZGV4ZXNbc2VxMVtqIC0gMV1dXVthbHBoYWJldEluZGV4ZXNbc2VxMltpIC0gMV1dXTtcbiAgICAgICAgY29uc3QgdG9wID0gbWF0cml4W3ByZXZSb3ddW2pdIC0gKHZlcnRpY2FsR2Fwc1tqXSA/IGdhcEV4dGVuZCA6IGdhcE9wZW4gKTtcbiAgICAgICAgY29uc3QgbGVmdCA9IG1hdHJpeFtjdXJyUm93XVtqIC0gMV0gLSAoaG9yaXpvbnRhbEdhcHNbaiAtIDFdID8gZ2FwRXh0ZW5kIDogZ2FwT3Blbik7XG4gICAgICAgIG1hdHJpeFtjdXJyUm93XVtqXSA9IE1hdGgubWF4KFxuICAgICAgICAgIGRpYWdvbmFsLCBsZWZ0LCB0b3BcbiAgICAgICAgKTtcbiAgICAgICAgLy8gdXBkYXRlIGdhcCBhcnJheXNcbiAgICAgICAgaWYgKG1hdHJpeFtjdXJyUm93XVtqXSA9PT0gZGlhZ29uYWwpIHtcbiAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSBmYWxzZTtcbiAgICAgICAgICBob3Jpem9udGFsR2Fwc1tqXSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKG1hdHJpeFtjdXJyUm93XVtqXSA9PT0gbGVmdCkge1xuICAgICAgICAgIHZlcnRpY2FsR2Fwc1tqXSA9IGZhbHNlO1xuICAgICAgICAgIGhvcml6b250YWxHYXBzW2pdID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSB0cnVlO1xuICAgICAgICAgIGhvcml6b250YWxHYXBzW2pdID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFN3YXAgcm93c1xuICAgICAgcHJldlJvdyA9IGN1cnJSb3c7XG4gICAgICBjdXJyUm93ID0gKGN1cnJSb3cgKyAxKSAlIDI7XG4gICAgfVxuICAgIC8vIGFzIHRoZSBtYXRyaXggaXMgdGhlIHNpbWlsYXJpdHkgbWF0cml4LCBidXQgd2UgYXJlIGludGVyZXN0ZWQgaW4gZGlzdGFuY2UsXG4gICAgLy8gd2UgbmVlZCBjb21wYXJlIGl0IHRvIHBlcmZlY3QgbWF0Y2ggc2NvcmUgdG8gZ2V0IHJlYXNvbmFibGUgZGlzdGFuY2VcbiAgICBjb25zdCBwZXJmZWN0TWF0Y2hTZXExID0gc2VxMS5zcGxpdCgnJykubWFwKChjKSA9PiBzY29yaW5nTWF0cml4W2FscGhhYmV0SW5kZXhlc1tjXV1bYWxwaGFiZXRJbmRleGVzW2NdXSlcbiAgICAgIC5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICBjb25zdCBwZXJmZWN0TWF0Y2hTZXEyID0gc2VxMi5zcGxpdCgnJykubWFwKChjKSA9PiBzY29yaW5nTWF0cml4W2FscGhhYmV0SW5kZXhlc1tjXV1bYWxwaGFiZXRJbmRleGVzW2NdXSlcbiAgICAgIC5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICBjb25zdCBtYXhTY29yZSA9IE1hdGgubWF4KHBlcmZlY3RNYXRjaFNlcTEsIHBlcmZlY3RNYXRjaFNlcTIpO1xuICAgIHJldHVybiAobWF4U2NvcmUgLSBtYXRyaXhbcHJldlJvd11bc2VxMS5sZW5ndGhdKSAvIG1heFNjb3JlO1xuICB9O1xufVxuIl19","import { hamming } from './hamming';\nimport { levenstein } from './levenstein';\nimport { needlemanWunch } from './needleman-wunsch';\n/** Enum containing currently supported macromolecule distance functions\n * Hamming distance will be used if the sequences are already aligned\n * Needleman distance will be used for protein sequences with known BLOSUM62 matrix\n * Levenshtein distance will be used for nucleotide sequences as for them substitution matrix is same as identity matrix\n */\nexport var MmDistanceFunctionsNames;\n(function (MmDistanceFunctionsNames) {\n MmDistanceFunctionsNames[\"HAMMING\"] = \"Hamming\";\n MmDistanceFunctionsNames[\"LEVENSHTEIN\"] = \"Levenshtein\";\n MmDistanceFunctionsNames[\"NEEDLEMANN_WUNSCH\"] = \"Needlemann-Wunsch\";\n})(MmDistanceFunctionsNames || (MmDistanceFunctionsNames = {}));\n;\nexport const mmDistanceFunctions = {\n [MmDistanceFunctionsNames.HAMMING]: hamming,\n [MmDistanceFunctionsNames.LEVENSHTEIN]: levenstein,\n [MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH]: needlemanWunch\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjcm9tb2xlY3VsZS1kaXN0YW5jZS1mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNyb21vbGVjdWxlLWRpc3RhbmNlLWZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR2xEOzs7O0dBSUc7QUFDSCxNQUFNLENBQU4sSUFBWSx3QkFJWDtBQUpELFdBQVksd0JBQXdCO0lBQ2hDLCtDQUFtQixDQUFBO0lBQ25CLHVEQUEyQixDQUFBO0lBQzNCLG1FQUF1QyxDQUFBO0FBQzNDLENBQUMsRUFKVyx3QkFBd0IsS0FBeEIsd0JBQXdCLFFBSW5DO0FBQUEsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUE4RTtJQUM1RyxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU87SUFDM0MsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxVQUFVO0lBQ2xELENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxjQUFjO0NBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2hhbW1pbmd9IGZyb20gJy4vaGFtbWluZyc7XG5pbXBvcnQge2xldmVuc3RlaW59IGZyb20gJy4vbGV2ZW5zdGVpbic7XG5pbXBvcnQge25lZWRsZW1hbld1bmNofSBmcm9tICcuL25lZWRsZW1hbi13dW5zY2gnO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSBmcm9tICcuL3R5cGVzJztcblxuLyoqIEVudW0gY29udGFpbmluZyBjdXJyZW50bHkgc3VwcG9ydGVkIG1hY3JvbW9sZWN1bGUgZGlzdGFuY2UgZnVuY3Rpb25zXG4gKiBIYW1taW5nIGRpc3RhbmNlIHdpbGwgYmUgdXNlZCBpZiB0aGUgc2VxdWVuY2VzIGFyZSBhbHJlYWR5IGFsaWduZWRcbiAqIE5lZWRsZW1hbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIHByb3RlaW4gc2VxdWVuY2VzIHdpdGgga25vd24gQkxPU1VNNjIgbWF0cml4XG4gKiBMZXZlbnNodGVpbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIG51Y2xlb3RpZGUgc2VxdWVuY2VzIGFzIGZvciB0aGVtIHN1YnN0aXR1dGlvbiBtYXRyaXggaXMgc2FtZSBhcyBpZGVudGl0eSBtYXRyaXhcbiAqL1xuZXhwb3J0IGVudW0gTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzIHtcbiAgICBIQU1NSU5HID0gJ0hhbW1pbmcnLFxuICAgIExFVkVOU0hURUlOID0gJ0xldmVuc2h0ZWluJyxcbiAgICBORUVETEVNQU5OX1dVTlNDSCA9ICdOZWVkbGVtYW5uLVd1bnNjaCdcbn07XG5cbmV4cG9ydCBjb25zdCBtbURpc3RhbmNlRnVuY3Rpb25zOiBSZWNvcmQ8TW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLCAodmFsdWU/OiBhbnkpID0+IG1tRGlzdGFuY2VGdW5jdGlvblR5cGU+ID0ge1xuICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkhBTU1JTkddOiBoYW1taW5nLFxuICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkxFVkVOU0hURUlOXTogbGV2ZW5zdGVpbixcbiAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5ORUVETEVNQU5OX1dVTlNDSF06IG5lZWRsZW1hbld1bmNoXG59O1xuIl19","export function hamming() {\n return (seq1, seq2) => {\n // hamming distance should only be used with same size strings,\n // but still, lets add a check and if they are not same length add the difference to the result\n let diff = 0;\n if (seq1.length !== seq2.length)\n diff = Math.abs(seq1.length - seq2.length);\n let result = 0;\n for (let i = 0; i < Math.min(seq1.length, seq2.length); i++) {\n if (seq1[i] !== seq2[i])\n result++;\n }\n result += diff;\n result /= Math.max(seq1.length, seq2.length);\n return result;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFtbWluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhhbW1pbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLE9BQU87SUFDckIsT0FBTyxDQUFDLElBQVksRUFBRSxJQUFZLEVBQUUsRUFBRTtRQUNwQywrREFBK0Q7UUFDL0QsK0ZBQStGO1FBQy9GLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNiLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTTtZQUM3QixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3QyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzRCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixNQUFNLEVBQUUsQ0FBQztTQUNaO1FBQ0QsTUFBTSxJQUFJLElBQUksQ0FBQztRQUNmLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge21tRGlzdGFuY2VGdW5jdGlvblR5cGV9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFtbWluZygpOiBtbURpc3RhbmNlRnVuY3Rpb25UeXBlIHtcbiAgcmV0dXJuIChzZXExOiBzdHJpbmcsIHNlcTI6IHN0cmluZykgPT4ge1xuICAgIC8vIGhhbW1pbmcgZGlzdGFuY2Ugc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHNhbWUgc2l6ZSBzdHJpbmdzLFxuICAgIC8vIGJ1dCBzdGlsbCwgbGV0cyBhZGQgYSBjaGVjayBhbmQgaWYgdGhleSBhcmUgbm90IHNhbWUgbGVuZ3RoIGFkZCB0aGUgZGlmZmVyZW5jZSB0byB0aGUgcmVzdWx0XG4gICAgbGV0IGRpZmYgPSAwO1xuICAgIGlmIChzZXExLmxlbmd0aCAhPT0gc2VxMi5sZW5ndGgpXG4gICAgICBkaWZmID0gTWF0aC5hYnMoc2VxMS5sZW5ndGggLSBzZXEyLmxlbmd0aCk7XG5cbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKHNlcTEubGVuZ3RoLCBzZXEyLmxlbmd0aCk7IGkrKykge1xuICAgICAgaWYgKHNlcTFbaV0gIT09IHNlcTJbaV0pXG4gICAgICAgIHJlc3VsdCsrO1xuICAgIH1cbiAgICByZXN1bHQgKz0gZGlmZjtcbiAgICByZXN1bHQgLz0gTWF0aC5tYXgoc2VxMS5sZW5ndGgsIHNlcTIubGVuZ3RoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuIl19","import { distance } from 'fastest-levenshtein';\nexport function levenstein() {\n return (seq1, seq2) => {\n return distance(seq1, seq2) / Math.max(seq1.length, seq2.length);\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV2ZW5zdGVpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxldmVuc3RlaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRzdDLE1BQU0sVUFBVSxVQUFVO0lBQ3hCLE9BQU8sQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLEVBQUU7UUFDcEMsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZGlzdGFuY2V9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGxldmVuc3RlaW4oKTogbW1EaXN0YW5jZUZ1bmN0aW9uVHlwZSB7XG4gIHJldHVybiAoc2VxMTogc3RyaW5nLCBzZXEyOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gZGlzdGFuY2Uoc2VxMSwgc2VxMikgLyBNYXRoLm1heChzZXExLmxlbmd0aCwgc2VxMi5sZW5ndGgpO1xuICB9O1xufVxuIl19","import * as DG from 'datagrok-api/dg';\nimport { candidateAlphabets } from './macromolecule/consts';\nimport { detectAlphabet, getSplitterForColumn, getSplitterWithSeparator } from './macromolecule/utils';\nimport { mmDistanceFunctions, MmDistanceFunctionsNames } from '@datagrok-libraries/ml/src/macromolecule-distance-functions';\nimport { getMonomerLibHelper } from '../monomer-works/monomer-utils';\nexport const Tags = new class {\n constructor() {\n /** Column's temp slot name for a UnitsHandler object */\n this.uhTemp = `units-handler.${DG.SEMTYPE.MACROMOLECULE}`;\n }\n}();\n/** Class for handling notation units in Macromolecule columns */\nexport class UnitsHandler {\n static setUnitsToFastaColumn(uh) {\n if (uh.column.semType !== DG.SEMTYPE.MACROMOLECULE || uh.column.getTag(DG.TAGS.UNITS) !== \"fasta\" /* NOTATION.FASTA */)\n throw new Error(`The column of notation '${\"fasta\" /* NOTATION.FASTA */}' must be '${DG.SEMTYPE.MACROMOLECULE}'.`);\n uh.column.setTag(DG.TAGS.UNITS, \"fasta\" /* NOTATION.FASTA */);\n UnitsHandler.setTags(uh);\n }\n static setUnitsToSeparatorColumn(uh, separator) {\n if (uh.column.semType !== DG.SEMTYPE.MACROMOLECULE || uh.column.getTag(DG.TAGS.UNITS) !== \"separator\" /* NOTATION.SEPARATOR */)\n throw new Error(`The column of notation '${\"separator\" /* NOTATION.SEPARATOR */}' must be '${DG.SEMTYPE.MACROMOLECULE}'.`);\n if (!separator)\n throw new Error(`The column of notation '${\"separator\" /* NOTATION.SEPARATOR */}' must have the separator tag.`);\n uh.column.setTag(DG.TAGS.UNITS, \"separator\" /* NOTATION.SEPARATOR */);\n uh.column.setTag(\"separator\" /* TAGS.separator */, separator);\n UnitsHandler.setTags(uh);\n }\n static setUnitsToHelmColumn(uh) {\n if (uh.column.semType !== DG.SEMTYPE.MACROMOLECULE)\n throw new Error(`The column of notation '${\"helm\" /* NOTATION.HELM */}' must be '${DG.SEMTYPE.MACROMOLECULE}'`);\n uh.column.setTag(DG.TAGS.UNITS, \"helm\" /* NOTATION.HELM */);\n UnitsHandler.setTags(uh);\n }\n /** From detectMacromolecule */\n static setTags(uh) {\n const units = uh.column.getTag(DG.TAGS.UNITS);\n const stats = uh.stats;\n const alphabetIsMultichar = Object.keys(stats.freq).some((m) => m.length > 1);\n if ([\"fasta\" /* NOTATION.FASTA */, \"separator\" /* NOTATION.SEPARATOR */].includes(units)) {\n // Empty monomer alphabet is not allowed\n if (Object.keys(stats.freq).length === 0)\n throw new Error('Alphabet is empty');\n const aligned = stats.sameLength ? \"SEQ.MSA\" /* ALIGNMENT.SEQ_MSA */ : \"SEQ\" /* ALIGNMENT.SEQ */;\n uh.column.setTag(\"aligned\" /* TAGS.aligned */, aligned);\n const alphabet = detectAlphabet(stats.freq, candidateAlphabets);\n uh.column.setTag(\"alphabet\" /* TAGS.alphabet */, alphabet);\n if (alphabet === \"UN\" /* ALPHABET.UN */) {\n const alphabetSize = Object.keys(stats.freq).length;\n const alphabetIsMultichar = Object.keys(stats.freq).some((m) => m.length > 1);\n uh.column.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, alphabetSize.toString());\n uh.column.setTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */, alphabetIsMultichar ? 'true' : 'false');\n }\n }\n }\n get column() { return this._column; }\n get units() { return this._units; }\n get notation() { return this._notation; }\n get defaultGapSymbol() { return this._defaultGapSymbol; }\n get separator() {\n const separator = this.column.getTag(\"separator\" /* TAGS.separator */) ?? 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 get helmCompatible() {\n return this.column.getTag(\".isHelmCompatible\" /* TAGS.isHelmCompatible */);\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 stats = this.stats;\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 */)\n return true;\n else if (this.alphabet !== \"UN\" /* ALPHABET.UN */)\n return false;\n else\n return this.column.getTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */) === 'true';\n }\n /** */\n get splitted() {\n if (this._splitted === null) {\n const splitter = this.getSplitter();\n const colLength = this._column.length;\n this._splitted = new Array(colLength);\n const catIdxList = this._column.getRawData();\n const catList = this._column.categories;\n for (let rowI = 0; rowI < colLength; rowI++) {\n const seq = catList[catIdxList[rowI]];\n this._splitted[rowI] = splitter(seq);\n }\n }\n return this._splitted;\n }\n get stats() {\n if (this._stats === null) {\n const freq = {};\n let sameLength = true;\n let firstLength = null;\n for (const mSeq of this.splitted) {\n if (firstLength == null)\n firstLength = mSeq.length;\n else if (mSeq.length !== firstLength)\n sameLength = false;\n for (const m of mSeq) {\n if (!(m in freq))\n freq[m] = 0;\n freq[m] += 1;\n }\n }\n this._stats = { freq: freq, sameLength: sameLength };\n }\n return this._stats;\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 isHelmCompatible() { return this.helmCompatible === 'true'; }\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, separator) {\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 if (targetNotation === \"separator\" /* NOTATION.SEPARATOR */) {\n if (!separator)\n throw new Error(`Notation \\'${\"separator\" /* NOTATION.SEPARATOR */}\\' requires separator value.`);\n newColumn.setTag(\"separator\" /* TAGS.separator */, separator);\n }\n newColumn.setTag(DG.TAGS.CELL_RENDERER, 'Macromolecule'); // cell.renderer\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 = UnitsHandler.getOrCreate(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 /** Gets function to split seq value to monomers */\n getSplitter() {\n return getSplitterForColumn(this._column);\n }\n getDistanceFunctionName() {\n // TODO add support for helm and separator notation\n if (!this.isFasta())\n throw new Error('Only FASTA notation is supported');\n if (this.isMsa())\n return MmDistanceFunctionsNames.HAMMING;\n switch (this.alphabet) {\n // As DNA and RNA scoring matrices are same as identity matrices(mostly),\n // we can use very fast and optimized Levenshtein distance library\n case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\n return MmDistanceFunctionsNames.LEVENSHTEIN;\n case \"PT\" /* ALPHABET.PT */:\n return MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH;\n // For default case, let's use Levenshtein distance\n default:\n return MmDistanceFunctionsNames.LEVENSHTEIN;\n }\n }\n getDistanceFunction() {\n return mmDistanceFunctions[this.getDistanceFunctionName()]();\n }\n // checks if the separator notation is compatible with helm library\n async checkHelmCompatibility() {\n // check first for the column tag to avoid extra processing\n if (this.column.tags.has(\".isHelmCompatible\" /* TAGS.isHelmCompatible */))\n return this.column.getTag(\".isHelmCompatible\" /* TAGS.isHelmCompatible */) === 'true';\n // get the monolmer lib and check against the column\n const monomerLibHelper = await getMonomerLibHelper();\n const bioLib = monomerLibHelper.getBioLib();\n // retrieve peptides\n const peptides = bioLib.getMonomerSymbolsByType(\"PEPTIDE\" /* HELM_POLYMER_TYPE.PEPTIDE */.toString());\n // convert the peptides list to a set for faster lookup\n const peptidesSet = new Set(peptides);\n // get splitter for given separator and check if all monomers are in the lib\n const splitterFunc = getSplitterWithSeparator(this.separator);\n // iterate over the columns, split them and check if all monomers are in the lib\n //TODO maybe add missing threshhold so that if there are not too many missing monomers\n // the column is still considered helm compatible\n for (const row of this.column.categories) {\n const monomers = splitterFunc(row);\n for (const monomer of monomers) {\n if (!peptidesSet.has(monomer)) {\n this.column.setTag(\".isHelmCompatible\" /* TAGS.isHelmCompatible */, 'false');\n return false;\n }\n }\n }\n this.column.setTag(\".isHelmCompatible\" /* TAGS.isHelmCompatible */, 'true');\n return true;\n }\n constructor(col) {\n this._splitted = null;\n this._stats = null;\n if (col.type != DG.TYPE.STRING)\n throw new Error(`Unexpected column type '${col.type}', must be '${DG.TYPE.STRING}'.`);\n this._column = col;\n const units = this._column.getTag(DG.TAGS.UNITS);\n if (units !== null && units !== undefined)\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 */) || !this.column.tags.has(\"alphabet\" /* TAGS.alphabet */) ||\n (!this.column.tags.has(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */) && !this.isHelm() && this.alphabet === \"UN\" /* ALPHABET.UN */)) {\n // The following detectors and setters are to be called because the column is likely\n // as the UnitsHandler constructor was called on the column.\n if (this.isFasta()) {\n UnitsHandler.setUnitsToFastaColumn(this);\n }\n else if (this.isSeparator()) {\n const separator = col.getTag(\"separator\" /* TAGS.separator */);\n UnitsHandler.setUnitsToSeparatorColumn(this, separator);\n }\n else if (this.isHelm()) {\n UnitsHandler.setUnitsToHelmColumn(this);\n }\n else {\n throw new Error(`Unexpected units '${this.column.getTag(DG.TAGS.UNITS)}'.`);\n }\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 this.column.setTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */, 'true');\n }\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 }\n /** Gets a column's UnitsHandler object from temp slot or creates a new and stores it to the temp slot. */\n static getOrCreate(col) {\n if (!(Tags.uhTemp in col.temp))\n col.temp[Tags.uhTemp] = new UnitsHandler(col);\n return col.temp[Tags.uhTemp];\n }\n}\nUnitsHandler._defaultGapSymbolsDict = {\n HELM: '*',\n SEPARATOR: '',\n FASTA: '-',\n};\n//# sourceMappingURL=units-handler.js.map","import * as DG from 'datagrok-api/dg';\nimport wu from 'wu';\nimport { CandidateSimType } from './types';\nimport { Alphabets, candidateAlphabets, monomerRe } from './consts';\nimport { UnitsHandler } from '../units-handler';\nimport { Vector } from '@datagrok-libraries/utils/src/type-declarations';\nimport { vectorDotProduct, vectorLength } from '@datagrok-libraries/utils/src/vector-operations';\nimport { AminoacidsPalettes } from '../../aminoacids';\nimport { NucleotidesPalettes } from '../../nucleotides';\nimport { UnknownSeqPalettes } from '../../unknown';\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 getStatsForCol(seqCol, minLength, splitter) {\n const cats = seqCol.categories;\n const splitted = wu(seqCol.getRawData())\n .map((catI) => splitter(seqCol.categories[catI]));\n return getStats(splitted, minLength);\n}\nfunction getStats(splitted, minLength) {\n const freq = {};\n let sameLength = true;\n let firstLength = null;\n for (const mSeq of splitted) {\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}\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 seq.toString().replace(monomerRe, '.$1').slice(1).split('.').map((monomer) => {\n if (monomer.startsWith('[') && monomer.endsWith(']'))\n return monomer.slice(1, -1);\n else if (monomer === '-')\n return '';\n else\n return monomer;\n });\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 if (amino.length <= maxLengthOfMonomer)\n return amino;\n const shortAminoMatch = amino.match(longMonomerPartRe);\n const needAddDots = amino.length > maxLengthOfMonomer || (shortAminoMatch?.length ?? 0) > 1;\n const shortAmino = shortAminoMatch?.[0] ?? ' ';\n return !needAddDots ? shortAmino : shortAmino.substring(0, maxLengthOfMonomer) + '…';\n}\n/** */\nexport function getAlphabet(alphabet) {\n switch (alphabet) {\n case \"DNA\" /* ALPHABET.DNA */:\n return Alphabets.fasta.dna;\n case \"RNA\" /* ALPHABET.RNA */:\n return Alphabets.fasta.rna;\n case \"PT\" /* ALPHABET.PT */:\n return Alphabets.fasta.peptide;\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}\n/** From detectMacromolecule */\nexport function detectAlphabet(freq, candidates, gapSymbol = '-') {\n const candidatesSims = candidates.map((c) => {\n const sim = getAlphabetSimilarity(freq, c.alphabet, gapSymbol);\n return new CandidateSimType(c, freq, sim);\n });\n let alphabetName;\n const maxSim = Math.max(...candidatesSims.map((cs) => cs.similarity > cs.cutoff ? cs.similarity : -1));\n if (maxSim > 0) {\n const sim = candidatesSims.find((cs) => cs.similarity === maxSim);\n alphabetName = sim.name;\n }\n else {\n alphabetName = \"UN\" /* ALPHABET.UN */;\n }\n return alphabetName;\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 = UnitsHandler.getOrCreate(seqCol);\n alphabet = uh.alphabet;\n }\n else {\n const stats = getStatsForCol(seqCol, minLength, splitterAsFasta);\n alphabet = detectAlphabet(stats.freq, candidateAlphabets);\n }\n const res = getPaletteByType(alphabet);\n return res;\n}\nexport function getPaletteByType(paletteType) {\n switch (paletteType) {\n case \"PT\" /* ALPHABET.PT */:\n return AminoacidsPalettes.GrokGroups;\n case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\n return NucleotidesPalettes.Chromatogram;\n // other\n default:\n return UnknownSeqPalettes.Color;\n }\n}\nexport function pickUpSeqCol(df) {\n const semTypeColList = df.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);\n let resCol = semTypeColList.find((col) => {\n const units = col.getTag(DG.TAGS.UNITS);\n return units ? units.indexOf('MSA') !== -1 : false;\n }) ?? null;\n if (!resCol && semTypeColList.length > 0)\n resCol = semTypeColList[0];\n return resCol;\n}\n//# sourceMappingURL=utils.js.map","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==","// 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/utils';\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\" /* HELM_RGROUP_FIELDS.CAP_GROUP_SMILES */] = altAtom === 'H' ? `[*:${radicalNum}][H]` : `O[*:${radicalNum}]`;\n rgroup[\"alternateId\" /* HELM_RGROUP_FIELDS.ALTERNATE_ID */] = altAtom === 'H' ? `R${radicalNum}-H` : `R${radicalNum}-OH`;\n rgroup[\"capGroupName\" /* HELM_RGROUP_FIELDS.CAP_GROUP_NAME */] = altAtom === 'H' ? `H` : `OH`;\n rgroup[\"label\" /* HELM_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 async function getMonomerLibHelper() {\n const funcList = DG.Func.find({ package: 'Bio', name: 'getMonomerLibHelper' });\n if (funcList.length === 0)\n throw new Error('Package \"Bio\" must be installed for MonomerLibHelper.');\n const res = (await funcList[0].prepare().call()).getOutputParamValue();\n return res;\n}\n//# sourceMappingURL=monomer-utils.js.map","/**\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==","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 { 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 //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 = monomer[0]?.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 = monomer[1]?.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 (monomer[0]?.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","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","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","import { monomerToShort } from './macromolecule/utils';\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/** A function that prints a string aligned to left or centered.\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 String color.\n * @param {number}pivot Pirvot.\n * @param {boolean}left Is left aligned.\n * @param {number}transparencyRate Transparency rate where 1.0 is fully transparent\n * @param {string}separator Is separator for sequence.\n * @param {boolean}last Is checker if element last or not.\n * @param {DrawStyle}drawStyle Is draw style. MSA - for multicharSeq, classic - for other seq.\n * @param {number[]}maxWord {{[pos: number]: number}} Max word lengths per position.\n * @param {number}wordIdx Is index of word we currently draw.\n * @param {DG.GridCell}gridCell Is grid cell.\n * @param {string[]}referenceSequence Is reference sequence for diff mode.\n * @param {number}maxLengthOfMonomer Is max length of monomer.\n * @param {{[key: string]: TextMetrics}}monomerTextSizeMap Is map of monomer text sizes.\n * @return {number} x coordinate to start printing at.*/\nexport function 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, monomerTextSizeMap = {}) {\n g.textAlign = 'start';\n let colorPart = s.substring(0);\n let grayPart = last ? '' : separator;\n if (drawStyle === DrawStyle.MSA)\n grayPart = '';\n let colorCode = true;\n let compareWithCurrent = true;\n let highlightDifference = 'difference';\n if ((gridCell != null) && (gridCell.cell.column != null)) {\n colorCode = gridCell.cell.column.temp['color-code'] ?? true;\n compareWithCurrent = gridCell.cell.column.temp['compare-with-current'] ?? true;\n highlightDifference = gridCell.cell.column.temp['highlight-difference'] ?? 'difference';\n }\n const currentMonomer = referenceSequence[wordIdx];\n if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'difference'))\n transparencyRate = (colorPart == currentMonomer) ? 0.3 : transparencyRate;\n if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'equal'))\n transparencyRate = (colorPart != currentMonomer) ? 0.3 : transparencyRate;\n if (maxLengthOfMonomer != null)\n colorPart = monomerToShortFunction(colorPart, maxLengthOfMonomer);\n const fullText = colorPart + grayPart;\n monomerTextSizeMap[fullText] ?? (monomerTextSizeMap[fullText] = g.measureText(fullText));\n let textSize = monomerTextSizeMap[fullText];\n monomerTextSizeMap[colorPart] ?? (monomerTextSizeMap[colorPart] = g.measureText(colorPart));\n let maxColorTextSize = monomerTextSizeMap[colorPart].width;\n monomerTextSizeMap[grayPart] ?? (monomerTextSizeMap[grayPart] = g.measureText(grayPart));\n const grayPartSize = monomerTextSizeMap[grayPart].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 /** Draw color part at {@link dx1}, and gray part at {@link dx2}. */\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.fillText(colorPart, x + dx1, y + dy);\n }\n const placeX = (maxWord[wordIdx] ?? 0) - (maxWord[0] ?? 0);\n if (left || textSize > w) {\n draw(placeX, placeX + maxColorTextSize);\n return x + placeX + maxColorTextSize + grayPartSize;\n }\n else {\n const dx = (w - textSize) / 2;\n draw(dx, dx + maxColorTextSize);\n return x + placeX + dx + maxColorTextSize;\n }\n}\n;\n//# sourceMappingURL=cell-renderer.js.map","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=","import * as DG from 'datagrok-api/dg';\nimport {\n RGROUP_CAP_GROUP_NAME,\n RGROUP_CAP_GROUP_SMILES,\n jsonSdfMonomerLibDict,\n MONOMER_SYMBOL,\n RGROUP_ALTER_ID,\n RGROUPS,\n RGROUP_LABEL,\n SDF_MONOMER_NAME\n} from './constants';\n\nexport function getParts(subParts: string[], s: string): string[] {\n const j = 0;\n const allParts: string[] = [];\n for (let k = 0; k < subParts.length; ++k) {\n const indexOfMonomer = s.indexOf(subParts[k]);\n const helmBeforeMonomer = s.slice(j, indexOfMonomer);\n allParts.push(helmBeforeMonomer);\n allParts.push(subParts[k]);\n s = s.substring(indexOfMonomer + subParts[k].length);\n }\n allParts.push(s);\n return allParts;\n}\n\nexport function parseHelm(s: string): string[] {\n const sections = split(s, '$');\n s = sections[0];\n const monomers = [];\n //@ts-ignore\n if (!scil.Utils.isNullOrEmpty(s)) {\n const seqs = split(s, '|');\n for (let i = 0; i < seqs.length; ++i) {\n const e = detachAnnotation(seqs[i]);\n s = e.str;\n\n let p = s.indexOf('{');\n\n s = s.substring(p + 1);\n p = s.indexOf('}');\n s = s.substring(0, p);\n\n const ss = split(s, '.');\n for (const monomer of ss) {\n if (!monomer || monomer === '') continue;\n if (monomer.startsWith('[') && monomer.includes(']')) {\n const element = monomer.substring(1, monomer.indexOf(']'));\n monomers.push(element);\n const residue = monomer.substring(monomer.indexOf(']') + 1);\n ss.push(residue);\n } else if (monomer.includes('[') && monomer.endsWith(']')) {\n const element = monomer.substring(monomer.lastIndexOf('[') + 1, monomer.length - 1);\n monomers.push(element);\n const residue = monomer.substring(0, monomer.lastIndexOf('['));\n ss.push(residue);\n } else if (monomer.includes('(') && monomer.includes(')')) {\n // here we only want to split the string at first '(' and last ')'\n // because entries like [L-hArg(Et,Et)]([L-hArg(Et,Et)]) where L-hArg(Et,Et) is a single monomer\n const firstPiece = monomer.substring(0, monomer.indexOf('('));\n const thirdPiece = monomer.substring(monomer.lastIndexOf(')') + 1);\n const secondPiece = monomer.substring(firstPiece.length + 1, monomer.length - thirdPiece.length - 1);\n const elements = [firstPiece, secondPiece, thirdPiece];\n for (const el of elements)\n ss.push(el);\n } else {\n monomers.push(monomer);\n }\n }\n }\n }\n return monomers;\n}\n\n// /** Find monomers missed in Helm monomer library configured and\n// * used in org.helm.webeditor / scil.helm.Monomers / org.helm.webeditor.Monomers .\n// */\n// export function findMonomers(helmString: string) {\n// //@ts-ignore\n// const types: string[] = Object.keys(org.helm.webeditor.monomerTypeList());\n// const monomerNameList: any[] = [];\n// const monomerNameI: number = 0;\n// const weMonomers = org.helm.webeditor.Monomers;\n// for (let typeI = 0; typeI < types.length; typeI++) {\n// //@ts-ignore\n// const ofTypeMonomers: {} = weMonomers.getMonomerSet(types[typeI]) ?? {};\n// Object.keys(ofTypeMonomers).forEach((key) => {\n// const monomer: any = ofTypeMonomers[key];\n// monomerNameList[monomerNameI] = monomer.id;\n// monomerNameI += 1;\n// });\n// }\n// const helmPartList = parseHelm(helmString);\n// return new Set(helmPartList.filter((val) => !monomerNameList.includes(val)));\n// }\n\n/** Searches monomers of {@link helmString} for missed. */\nexport function findMonomers(monomerSymbolList: string[]): Set<string> {\n //@ts-ignore\n const types = Object.keys(org.helm.webeditor.monomerTypeList());\n const monomers: any = [];\n const monomerNames: any = [];\n for (let i = 0; i < types.length; i++) {\n //@ts-ignore\n // eslint-disable-next-line new-cap\n monomers.push(new scil.helm.Monomers.getMonomerSet(types[i]));\n Object.keys(monomers[i]).forEach((k) => {\n monomerNames.push(monomers[i][k].id);\n });\n }\n return new Set(monomerSymbolList.filter((val) => !monomerNames.includes(val)));\n}\n\nfunction split(s: string, sep: string) {\n const ret = [];\n let frag = '';\n let parentheses = 0;\n let bracket = 0;\n let braces = 0;\n let quote = 0;\n for (let i = 0; i < s.length; ++i) {\n let c = s.substring(i, i + 1);\n if (c == sep && bracket == 0 && parentheses == 0 && braces == 0 && quote == 0) {\n ret.push(frag);\n frag = '';\n } else {\n frag += c;\n if (quote > 0) {\n if (c == '\\\\' && i + 1 < s.length) {\n ++i;\n const c2 = s.substring(i, i + 1);\n frag += c2;\n c += c2;\n }\n }\n if (c == '\\\"') {\n if (!(i > 0 && s.substring(i - 1, i) == '\\\\'))\n quote = quote == 0 ? 1 : 0;\n } else if (c == '[') {\n ++bracket;\n } else if (c == ']') {\n --bracket;\n } else if (c == '(') {\n ++parentheses;\n } else if (c == ')') {\n --parentheses;\n } else if (c == '{') {\n ++braces;\n } else if (c == '}') {\n --braces;\n }\n }\n }\n ret.push(frag);\n return ret;\n}\n\nfunction detachAnnotation(s: string) {\n const ret = _detachAppendix(s, '\\\"');\n if (ret.tag != null)\n return ret;\n\n const r = _detachAppendix(s, '\\'');\n return {tag: ret.tag, repeat: r.tag, str: r.str};\n}\n\nfunction _detachAppendix(s: string, c: string) {\n let tag = null;\n //@ts-ignore\n if (scil.Utils.endswith(s, c)) {\n let p = s.length - 1;\n while (p > 0) {\n p = s.lastIndexOf(c, p - 1);\n if (p <= 0 || s.substring(p - 1, p) != '\\\\')\n break;\n }\n\n if (p > 0 && p < s.length - 1) {\n tag = s.substring(p + 1, s.length - 1);\n s = s.substring(0, p);\n }\n }\n if (tag != null)\n tag = unescape(tag.replace(new RegExp('\\\\' + c, 'g'), c));\n return {tag: tag, str: s};\n}\n\nfunction unescape(s: string) {\n //@ts-ignore\n if (scil.Utils.isNullOrEmpty(s))\n return s;\n\n return s.replace(/[\\\\]./g, function(m) {\n switch (m) {\n case '\\\\r':\n return '\\r';\n case '\\\\n':\n return '\\n';\n case '\\\\t':\n return '\\t';\n default:\n return m.substring(1);\n }\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 wu from 'wu';\n\nimport {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types/index';\n\nimport {getParts, parseHelm} from './utils';\nimport {getMonomerLib} from './package';\n\nexport const enum Temps {\n helmMonomerPlacer = 'bio-helmMonomerPlacer',\n}\n\nexport class HelmMonomerPlacer {\n private _allPartsList: (string[] | null)[] | null = null;\n private _lengthsList: (number[] | null) [] | null = null;\n\n private monomerLib: IMonomerLib;\n\n public monomerCharWidth: number = 7;\n public leftPadding: number = 5;\n\n constructor(public readonly col: DG.Column<string>) {\n this.col.dataFrame.onDataChanged.subscribe();\n this.monomerLib = getMonomerLib();\n }\n\n /** @param rowIdx Row index of the table {@link DG.DataFrame}, HelmMonomerPlacer is {@link DG.Column} based */\n public getCellAllPartsLengths(rowIdx: number): [string[], number[], number[]] {\n if (this._allPartsList === null)\n this._allPartsList = new Array<string[] | null>(this.col.length).fill(null);\n\n if (this._lengthsList === null)\n this._lengthsList = new Array<number[] | null>(this.col.length).fill(null);\n\n const [allParts, lengths] = this.getCellMonomerLengthsForSeq(rowIdx);\n\n const sumLengths: number[] = new Array<number>(lengths.length + 1);\n sumLengths[0] = this.leftPadding; // padding\n for (let pos: number = 1; pos < sumLengths.length; pos++)\n sumLengths[pos] = sumLengths[pos - 1] + lengths[pos - 1];\n return [allParts, lengths, sumLengths];\n }\n\n private getCellMonomerLengthsForSeq(rowIdx: number): [string[], number[]] {\n const allParts: string[] = this._allPartsList![rowIdx] = this.getAllParts(rowIdx);\n const lengths: number[] = this._lengthsList![rowIdx] = new Array<number>(allParts.length);\n\n for (const [part, partI] of wu.enumerate(allParts)) {\n const partWidth: number = part.length * this.monomerCharWidth;\n lengths[partI] = partWidth;\n }\n\n return [allParts, lengths];\n }\n\n getAllParts(rowIdx: number): string[] {\n const seq: string | null = this.col.get(rowIdx);\n const monomerList: string[] = seq ? parseHelm(seq) : [];\n return seq ? getParts(monomerList, seq) : [];\n }\n\n getMonomer(monomerSymbol: any): Monomer | null {\n let res: Monomer | null = null;\n for (const polymerType of this.monomerLib.getPolymerTypes()) {\n res = this.monomerLib.getMonomer(polymerType, monomerSymbol);\n if (res) break;\n }\n return res;\n }\n\n public static getOrCreate(col: DG.Column<string>): HelmMonomerPlacer {\n if (!(Temps.helmMonomerPlacer in col.temp)) col.temp[Temps.helmMonomerPlacer] = new HelmMonomerPlacer(col);\n return col.temp[Temps.helmMonomerPlacer];\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 wu from 'wu';\n\nimport {printLeftOrCentered} from '@datagrok-libraries/bio/src/utils/cell-renderer';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\n\nimport {findMonomers, parseHelm} from './utils';\nimport {HelmMonomerPlacer} from './helm-monomer-placer';\n\nconst enum tempTAGS {\n helmSumMaxLengthWords = 'helm-sum-maxLengthWords',\n helmMaxLengthWords = 'helm-maxLengthWords',\n\n helmPlacer = 'bio-helmPlacer',\n}\n\n// Global flag is for replaceAll\nconst helmGapStartRe = /\\{(\\*\\.)+/g;\nconst helmGapIntRe = /\\.(\\*\\.)+/g;\nconst helmGapEndRe = /(\\.\\*)+\\}/g;\n\ntype TempType = { [tagName: string]: any };\n\n/** Helm cell renderer in case of no missed monomer draws with JSDraw2.Editor (webeditor),\n * in case of missed monomers presented, draws linear sequences aligned in width per monomer.\n */\nexport class HelmCellRenderer extends DG.GridCellRenderer {\n get name() { return 'helm'; }\n\n get cellType() { return 'helm'; }\n\n get defaultWidth(): number | null { return 400; }\n\n get defaultHeight(): number | null { return 100; }\n\n onMouseMove(gridCell: DG.GridCell, e: MouseEvent): void {\n try {\n /* Can not do anything without tableColumn containing temp */\n let tableCol: DG.Column | null = null;\n try { tableCol = gridCell.tableColumn; } catch { }\n if (!tableCol) return;\n\n const helmPlacer = HelmMonomerPlacer.getOrCreate(tableCol);\n const [allParts, lengths, sumLengths] = helmPlacer.getCellAllPartsLengths(gridCell.tableRowIndex!);\n\n const maxIndex = Object.values(lengths).length - 1;\n const argsX = e.offsetX - gridCell.bounds.x;\n let left = 0;\n let right = maxIndex;\n let found = false;\n let iterCount: number = 0;\n\n let mid = 0;\n if (argsX > sumLengths[0]) {\n while (!found && iterCount < sumLengths.length) {\n mid = Math.floor((right + left) / 2);\n if (argsX >= sumLengths[mid] && argsX <= sumLengths[mid + 1]) {\n left = mid;\n found = true;\n } else if (argsX < sumLengths[mid]) {\n right = mid - 1;\n } else if (argsX > sumLengths[mid + 1]) {\n left = mid + 1;\n }\n if (left == right)\n found = true;\n\n iterCount++;\n }\n }\n left = (argsX >= sumLengths[left]) ? left : left - 1; // correct left to between sumLengths\n\n const seq: string = gridCell.cell.value;\n const monomerList = parseHelm(seq);\n const monomers = new Set<string>(monomerList);\n const missedMonomers = findMonomers(monomerList);\n\n const tooltipMessage: HTMLElement[] = [];\n for (const [part, partI] of wu.enumerate(allParts)) {\n if (missedMonomers.has(part)) {\n tooltipMessage[partI] = ui.divV([\n ui.divText(`Monomer ${allParts[partI]} not found.`),\n ui.divText('Open the Context Panel, then expand Manage Libraries')\n ]);\n } else if (monomers.has(part)) {\n const elList = [ui.div(part)];\n const monomer = helmPlacer.getMonomer(part);\n if (monomer) {\n const options = {autoCrop: true, autoCropMargin: 0, suppressChiralText: true};\n const monomerSvg = grok.chem.svgMol(monomer.smiles, undefined, undefined, options);\n elList.push(monomerSvg);\n }\n tooltipMessage[partI] = ui.divV(elList);\n }\n }\n\n (((tooltipMessage[left]?.childNodes.length ?? 0) > 0)) ?\n ui.tooltip.show(tooltipMessage[left], e.x + 16, e.y + 16) :\n ui.tooltip.hide();\n } catch (err: any) {\n const errMsg: string = errorToConsole(err);\n console.error('Helm: HelmCellRenderer.onMouseMove() error:\\n' + errMsg);\n }\n }\n\n render(g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number,\n gridCell: DG.GridCell, cellStyle: DG.GridCellStyle\n ) {\n g.save();\n try {\n /* Can not do anything without tableColumn containing temp */\n let tableCol: DG.Column | null = null;\n try { tableCol = gridCell.tableColumn; } catch { }\n if (!tableCol) return;\n\n const grid = gridCell.gridRow !== -1 ? gridCell.grid : undefined;\n const missedColor = 'red';\n const monomerColor: string = '#404040';\n const frameColor: string = '#C0C0C0';\n\n const seq = gridCell.cell.value;\n const monomerList = parseHelm(seq);\n const monomers: Set<string> = new Set<string>(monomerList);\n const missedMonomers: Set<string> = findMonomers(monomerList);\n\n if (missedMonomers.size == 0) {\n const host = ui.div([], {style: {width: `${w}px`, height: `${h}px`}});\n host.setAttribute('dataformat', 'helm');\n host.setAttribute('data', gridCell.cell.value);\n gridCell.element = host;\n //@ts-ignore\n const canvas = new JSDraw2.Editor(host, {width: w, height: h, skin: 'w8', viewonly: true});\n return;\n }\n\n if (missedMonomers.size > 0) {\n if (!grid) {\n const r = window.devicePixelRatio;\n h = 28;\n g.canvas.height = h * r;\n g.canvas.style.height = `${h}px`;\n }\n\n w = grid ? Math.min(grid.canvas.width - x, w) : g.canvas.width - x;\n g.save();\n g.beginPath();\n g.rect(x, y, w, h);\n g.clip();\n g.transform(1, 0, 0, 1, x, y);\n g.font = '12px monospace';\n g.textBaseline = 'top';\n const helmPlacer = HelmMonomerPlacer.getOrCreate(tableCol);\n const [allParts, lengths, sumLengths] = helmPlacer.getCellAllPartsLengths(gridCell.tableRowIndex!);\n\n for (let i = 0; i < allParts.length; ++i) {\n const part: string = allParts[i];\n const color: string =\n part === '.' || part.endsWith('{') || part.startsWith('}') ? frameColor :\n missedMonomers.has(part) ? missedColor :\n monomers.has(part) ? monomerColor :\n frameColor;\n g.fillStyle = color;\n printLeftOrCentered(sumLengths[i], 0, w, h, g, allParts[i], color, 0, true, 1.0);\n }\n }\n } finally {\n g.restore();\n }\n }\n}\n","import * as DG from 'datagrok-api/dg';\nimport { UnitsHandler } from './units-handler';\nimport { getSplitterForColumn } from './macromolecule/utils';\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 */, 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 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() || this.isHelmCompatible()) ? 'RNA1{' : 'PEPTIDE1{';\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 || mm === sourceGapSymbol) {\n return UnitsHandler._defaultGapSymbolsDict.HELM;\n }\n else {\n return mm.length == 1 ? `${leftWrapper}${mm}${rightWrapper}` :\n `${leftWrapper}[${mm}]${rightWrapper}`;\n }\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 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, tgtSeparator);\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 aligned = this.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 }\n else if ((this.isFasta() || this.isSeparator()) && this.toHelm(tgtNotation)) {\n return this.convertToHelm();\n }\n else if (this.isSeparator() && this.toFasta(tgtNotation)) {\n return this.convertSeparatorToFasta();\n }\n else if (this.isHelm() && this.toFasta(tgtNotation)) { // the case of HELM\n return this.convertHelm(tgtNotation);\n }\n else if (this.isHelm() && this.toSeparator(tgtNotation)) {\n return this.convertHelm(tgtNotation, tgtSeparator);\n }\n else {\n throw new Error('Not supported conversion ' +\n `from source notation '${this.notation}' to target notation '${tgtNotation}'.`);\n }\n }\n constructor(col) {\n super(col);\n this._splitter = null;\n }\n}\n//# sourceMappingURL=notation-converter.js.map","/* 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\nimport {WebEditorMonomer, RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from './constants';\nimport {HelmWebEditor} from './helm-web-editor';\nimport {HelmCellRenderer} from './cell-renderer';\nimport {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types';\nimport {NotationConverter} from '@datagrok-libraries/bio/src/utils/notation-converter';\nimport {findMonomers, parseHelm} from './utils';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\nimport {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\n\nexport const _package = new DG.Package();\nlet monomerLib: IMonomerLib | null = null;\n\n//tags: init\nexport async function initHelm(): Promise<void> {\n return Promise.all([\n new Promise((resolve, reject) => {\n // @ts-ignore\n dojo.ready(function() { resolve(null); });\n }),\n grok.functions.call('Bio:getBioLib'),\n ])\n .then(([_, lib]: [unknown, IMonomerLib]) => {\n monomerLib = lib;\n rewriteLibraries(); // initHelm()\n monomerLib.onChanged.subscribe((_) => {\n try {\n rewriteLibraries(); // initHelm()\n\n const monTypeList: string[] = monomerLib!.getPolymerTypes();\n const msgStr: string = 'Monomer lib updated:<br />' + (\n monTypeList.length == 0 ? 'empty' : monTypeList.map((monType) => {\n return `${monType} ${monomerLib!.getMonomerSymbolsByType(monType).length}`;\n }).join('<br />'));\n\n grok.shell.info(msgStr);\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Helm: initHelm monomerLib.onChanged() error:\\n' + errMsg);\n // throw err; // Prevent disabling event handler\n }\n });\n })\n .catch((err: any) => {\n const errMsg: string = err instanceof Error ? err.message : !!err ? err.toString() : 'Exception \\'undefined\\'';\n grok.shell.error(`Package \\'Helm\\' init initHelm() error: ${errMsg}`);\n const errRes = new Error(errMsg);\n errRes.stack = err.stack;\n throw errRes;\n });\n}\n\nexport function getMonomerLib(): IMonomerLib {\n return monomerLib!;\n}\n\nfunction rewriteLibraries() {\n // @ts-ignore\n org.helm.webeditor.Monomers.clear();\n monomerLib!.getPolymerTypes().forEach((polymerType) => {\n const monomerSymbols = monomerLib!.getMonomerSymbolsByType(polymerType);\n monomerSymbols.forEach((monomerSymbol) => {\n let isBroken = false;\n const monomer: Monomer = monomerLib!.getMonomer(polymerType, monomerSymbol)!;\n const webEditorMonomer: WebEditorMonomer = {\n id: monomerSymbol,\n m: monomer.molfile,\n n: monomer.name,\n na: monomer.naturalAnalog,\n rs: monomer.rgroups.length,\n type: monomer.polymerType,\n mt: monomer.monomerType,\n at: {}\n };\n\n if (monomer.rgroups.length > 0) {\n webEditorMonomer.rs = monomer.rgroups.length;\n const at: { [prop: string]: any } = {};\n monomer.rgroups.forEach((it) => {\n at[it[RGROUP_LABEL]] = it[RGROUP_CAP_GROUP_NAME];\n });\n webEditorMonomer.at = at;\n } else if (monomer[SMILES] != null) {\n webEditorMonomer.rs = Object.keys(getRS(monomer[SMILES].toString())).length;\n webEditorMonomer.at = getRS(monomer[SMILES].toString());\n } else {\n isBroken = true;\n }\n\n if (!isBroken) {\n // @ts-ignore\n org.helm.webeditor.Monomers.addOneMonomer(webEditorMonomer);\n }\n });\n });\n\n // Obsolete\n const grid: DG.Grid = grok.shell.tv.grid;\n if (grid) grid.invalidate();\n}\n\n//name: helmCellRenderer\n//tags: cellRenderer\n//meta.cellType: helm\n//meta.columnTags: units=helm\n//output: grid_cell_renderer result\nexport function helmCellRenderer(): HelmCellRenderer {\n return new HelmCellRenderer();\n}\n\nfunction checkMonomersAndOpenWebEditor(cell?: DG.Cell, value?: string, units?: string) {\n const cellValue: string = !!cell && units === undefined ? cell.value : value;\n const monomerList: string[] = parseHelm(cellValue);\n const monomers = findMonomers(monomerList);\n if (monomers.size == 0) { webEditor(cell, value, units); } else {\n grok.shell.warning(`Monomers ${Array.from(monomers).join(', ')} are absent! <br/>` +\n `Please, upload the monomer library! <br/>` +\n `<a href=\"https://datagrok.ai/help/domains/bio/macromolecules\" target=\"_blank\">Learn more</a>`);\n }\n}\n\n//tags: cellEditor\n//description: Macromolecule\n//input: grid_cell cell\n//meta.columnTags: quality=Macromolecule, units=helm\nexport function editMoleculeCell(cell: DG.GridCell): void {\n checkMonomersAndOpenWebEditor(cell.cell, undefined, undefined);\n}\n\n//name: Open Helm Web Editor\n//description: Adds editor\n//meta.action: Open Helm Web Editor\n//input: string mol { semType: Macromolecule }\nexport function openEditor(mol: string): void {\n const df = grok.shell.tv.grid.dataFrame;\n const col = df.columns.bySemType('Macromolecule')!;\n const colUnits = col.getTag(DG.TAGS.UNITS);\n if (colUnits === NOTATION.HELM)\n checkMonomersAndOpenWebEditor(df.currentCell, undefined, undefined);\n const converter = new NotationConverter(col);\n const resStr = converter.convertStringToHelm(mol, '/');\n checkMonomersAndOpenWebEditor(df.currentCell, resStr, col.getTag(DG.TAGS.UNITS));\n}\n\n//name: Properties\n//tags: panel, widgets\n//input: string helmString {semType: Macromolecule}\n//output: widget result\nexport async function propertiesPanel(helmString: string) {\n const grid = grok.shell.tv.grid;\n const parent = grid.root.parentElement!;\n const host = ui.div([]);\n parent.appendChild(host);\n const editor = new JSDraw2.Editor(host, {viewonly: true});\n host.style.width = '0px';\n host.style.height = '0px';\n editor.setHelm(helmString);\n const formula = editor.getFormula(true);\n const molWeight = Math.round(editor.getMolWeight() * 100) / 100;\n const coef = Math.round(editor.getExtinctionCoefficient(true) * 100) / 100;\n parent.lastChild!.remove();\n return new DG.Widget(\n ui.tableFromMap({\n 'formula': formula.replace(/<sub>/g, '').replace(/<\\/sub>/g, ''),\n 'molecular weight': molWeight,\n 'extinction coefficient': coef,\n })\n );\n}\n\nfunction webEditor(cell?: DG.Cell, value?: string, units?: string) {\n const view = ui.div();\n const df = grok.shell.tv.grid.dataFrame;\n const converter = new NotationConverter(df.columns.bySemType('Macromolecule')!);\n // @ts-ignore\n org.helm.webeditor.MolViewer.molscale = 0.8;\n // @ts-ignore\n const app = new scil.helm.App(view, {\n showabout: false,\n mexfontsize: '90%',\n mexrnapinontab: true,\n topmargin: 20,\n mexmonomerstab: true,\n sequenceviewonly: false,\n mexfavoritefirst: true,\n mexfilter: true\n });\n const sizes = app.calculateSizes();\n app.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);\n let s = {width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px'};\n //@ts-ignore\n scil.apply(app.sequence.style, s);\n //@ts-ignore\n scil.apply(app.notation.style, s);\n s = {width: sizes.rightwidth + 'px', height: (sizes.bottomheight + app.toolbarheight) + 'px'};\n //@ts-ignore\n scil.apply(app.properties.parent.style, s);\n app.structureview.resize(sizes.rightwidth, sizes.bottomheight + app.toolbarheight);\n app.mex.resize(sizes.topheight - 80);\n setTimeout(() => {\n if (!!cell && units === undefined)\n app.canvas.helm.setSequence(cell.value, 'HELM');\n else\n app.canvas.helm.setSequence(value, 'HELM');\n }, 200);\n //@ts-ignore\n ui.dialog({showHeader: false, showFooter: true})\n .add(view)\n .onOK(() => {\n const helmValue = app.canvas.getHelm(true).replace(/<\\/span>/g, '')\n .replace(/<span style='background:#bbf;'>/g, '');\n if (!!cell) {\n if (units === undefined) {\n cell.value = helmValue;\n } else {\n const convertedRes = converter.convertHelmToFastaSeparator(helmValue, units!);\n cell.value = convertedRes;\n }\n }\n }).show({modal: true, fullScreen: true});\n}\n\nfunction getRS(smiles: string) {\n const newS = smiles.match(/(?<=\\[)[^\\][]*(?=])/gm);\n const res: { [name: string]: string } = {};\n let el = '';\n let digit;\n if (!!newS) {\n for (let i = 0; i < newS.length; i++) {\n if (newS[i] != null) {\n if (/\\d/.test(newS[i])) {\n digit = newS[i][newS[i].length - 1];\n newS[i] = newS[i].replace(/[0-9]/g, '');\n for (let j = 0; j < newS[i].length; j++) {\n if (newS[i][j] != ':')\n el += newS[i][j];\n }\n res['R' + digit] = el;\n el = '';\n }\n }\n }\n }\n return res;\n}\n\n//name: getMolfiles\n//input: column col {semType: Macromolecule}\n//output: column res\nexport function getMolfiles(col: DG.Column): DG.Column {\n const grid = grok.shell.tv.grid;\n const parent = grid.root.parentElement!;\n const res = DG.Column.string('mols', col.length);\n const host = ui.div([]);\n parent.appendChild(host);\n const editor = new JSDraw2.Editor(host, {viewonly: true});\n host.style.width = '0px';\n host.style.height = '0px';\n res.init((i) => {\n editor.setHelm(col.get(i));\n const mol = editor.getMolfile();\n return mol;\n });\n parent.lastChild!.remove();\n return res;\n}\n\n//name: helmWebEditor\n//output: object\nexport function helmWebEditor(): HelmWebEditor {\n return new HelmWebEditor();\n}\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","grok","ui","DG","HelmWebEditor","constructor","w","h","this","host","style","width","height","editor","JSDraw2","Editor","viewonly","resizeEditor","setSize","createWebEditor","editorView","org","helm","webeditor","MolViewer","molscale","webEditor","scil","App","showabout","mexfontsize","mexrnapinontab","topmargin","mexmonomerstab","sequenceviewonly","mexfavoritefirst","mexfilter","sizes","calculateSizes","canvas","resize","rightwidth","topheight","s","bottomheight","apply","sequence","notation","toolbarheight","properties","parent","structureview","mex","setTimeout","setSequence","editorDiv","wu","CandidateType","name","alphabet","cutoff","CandidateSimType","candidate","freq","similarity","super","monomerRe","fasta","peptide","Set","dna","rna","peq","Uint32Array","defaultArgs","gapOpen","gapExtend","scoringMatrix","alphabetIndexes","MmDistanceFunctionsNames","mmDistanceFunctions","HAMMING","seq1","seq2","diff","length","Math","abs","result","i","min","max","LEVENSHTEIN","b","tmp","n","m","lst","pv","mv","sc","charCodeAt","eq","xv","myers_32","mhc","phc","hsize","ceil","vsize","j","start","vlen","k","pb","mb","xh","ph","mh","score","myers_x","distance","NEEDLEMANN_WUNSCH","args","matrix","Array","fill","verticalGaps","horizontalGaps","prevRow","currRow","diagonal","top","left","perfectMatchSeq1","split","map","c","reduce","perfectMatchSeq2","maxScore","Tags","uhTemp","static","uh","column","semType","getTag","Error","setTag","setTags","separator","units","stats","keys","some","includes","aligned","sameLength","candidates","gapSymbol","candidatesSims","sim","delete","freqA","alphabetA","push","has","freqV","alphabetV","v1","v2","prod","vectorDotProduct","vectorLength","getAlphabetSimilarity","alphabetName","maxSim","cs","find","detectAlphabet","alphabetSize","alphabetIsMultichar","toString","_column","_units","_notation","defaultGapSymbol","_defaultGapSymbol","undefined","isFasta","isSeparator","helmCompatible","getAlphabetSize","alphabetSizeStr","parseInt","console","warn","getAlphabetIsMultichar","splitted","_splitted","splitter","getSplitter","colLength","catIdxList","getRawData","catList","categories","rowI","seq","_stats","firstLength","mSeq","isHelm","isRna","isDna","isPeptide","isMsa","toUpperCase","isHelmCompatible","getNotation","toLowerCase","startsWith","getNewColumn","targetNotation","col","len","newColName","dataFrame","columns","getUnusedName","newColumn","srcAligned","srcAlphabet","srcAlphabetSize","srcAlphabetIsMultichar","templateCol","getOrCreate","p","unitsStringIsValid","getSplitterForColumn","getDistanceFunctionName","getDistanceFunction","async","tags","peptides","funcList","package","prepare","getOutputParamValue","getMonomerLibHelper","getBioLib","getMonomerSymbolsByType","peptidesSet","splitterFunc","getSplitterWithSeparator","row","monomers","monomer","type","_defaultGapSymbolsDict","FASTA","HELM","SEPARATOR","setUnitsToFastaColumn","setUnitsToSeparatorColumn","setUnitsToHelmColumn","temp","Float32Array","v","sqrSum","sqrt","dt","simplified","PaletteType","palette","forEach","cp","objList","colour","ind","colourPalette","_palette","undefinedColor","Lesk","lesk","makePalette","GrokGroups","grokGroups","RasMol","rasMol","resM","aaSynonyms","Aminoacids","scheme","isInner","inner","outer","char","isNaN","chemPaletteInstance","getPalette","outerMonomer","innerMonomer","getInnerOuter","slice","amino","substring","AAFullNames","SemType","SemTypeMultipleAlignment","Names","AASmiles","AASmilesTruncated","Nucleotides","UnknownColorPalette","concat","values","pI","hash","hashCode","color","dgColor","g","r","distToBlack","pow","correctColor","splitterAsFasta","replace","endsWith","limit","buildPalette","helmRe","helmPp1Re","splitterAsHelm","lastIndex","ea","exec","inSeq","mm","pp1M","longMonomerPartRe","DrawStyle","printLeftOrCentered","x","y","pivot","transparencyRate","last","drawStyle","classic","maxWord","wordIdx","gridCell","referenceSequence","maxLengthOfMonomer","monomerTextSizeMap","textAlign","colorPart","grayPart","MSA","colorCode","compareWithCurrent","highlightDifference","cell","currentMonomer","shortAminoMatch","match","needAddDots","shortAmino","monomerToShortFunction","fullText","measureText","textSize","maxColorTextSize","grayPartSize","dy","fontBoundingBoxAscent","fontBoundingBoxDescent","draw","dx1","dx2","drawColor","fillStyle","globalAlpha","fillText","placeX","dx","errorToConsole","err","_a","String","stack","message","parseHelm","Utils","isNullOrEmpty","seqs","detachAnnotation","str","indexOf","ss","element","residue","lastIndexOf","firstPiece","thirdPiece","elements","el","findMonomers","monomerSymbolList","types","monomerTypeList","monomerNames","Monomers","getMonomerSet","id","filter","val","sep","ret","frag","parentheses","bracket","braces","quote","c2","_detachAppendix","tag","repeat","endswith","RegExp","HelmMonomerPlacer","_allPartsList","_lengthsList","monomerCharWidth","leftPadding","onDataChanged","subscribe","monomerLib","getMonomerLib","getCellAllPartsLengths","rowIdx","allParts","lengths","getCellMonomerLengthsForSeq","sumLengths","pos","getAllParts","part","partI","partWidth","monomerList","subParts","indexOfMonomer","helmBeforeMonomer","getParts","getMonomer","monomerSymbol","res","polymerType","getPolymerTypes","HelmCellRenderer","cellType","defaultWidth","defaultHeight","onMouseMove","e","tableCol","tableColumn","helmPlacer","tableRowIndex","maxIndex","argsX","offsetX","bounds","right","found","iterCount","mid","floor","missedMonomers","tooltipMessage","elList","options","autoCrop","autoCropMargin","suppressChiralText","monomerSvg","smiles","childNodes","errMsg","error","render","cellStyle","save","grid","gridRow","missedColor","monomerColor","frameColor","size","setAttribute","skin","window","devicePixelRatio","beginPath","rect","clip","transform","font","textBaseline","restore","NotationConverter","_splitter","toFasta","toSeparator","toHelm","convertFastaToSeparator","fastaGapSymbol","init","idx","fastaPolymer","fastaMonomersArray","join","getHelmWrappers","convertToHelmHelper","sourcePolymer","sourceGapSymbol","prefix","leftWrapper","rightWrapper","postfix","convertStringToHelm","convertToHelm","convertSeparatorToFasta","separatorPolymer","separatorItemsArray","item","convertHelmToFastaSeparator","helmPolymer","tgtNotation","tgtSeparator","tgtGapSymbol","helmWrappersRe","isNucleotide","helmItemsArray","tgtMonomersArray","convertHelm","convertHelmToSeparator","convert","_package","initHelm","Promise","all","resolve","reject","dojo","ready","then","_","lib","rewriteLibraries","onChanged","monTypeList","msgStr","monType","catch","errRes","clear","isBroken","webEditorMonomer","molfile","na","naturalAnalog","rs","rgroups","mt","monomerType","at","it","getRS","addOneMonomer","invalidate","helmCellRenderer","checkMonomersAndOpenWebEditor","view","df","converter","bySemType","app","showHeader","showFooter","add","onOK","helmValue","getHelm","convertedRes","show","modal","fullScreen","from","editMoleculeCell","openEditor","mol","currentCell","resStr","propertiesPanel","helmString","root","parentElement","appendChild","setHelm","formula","getFormula","molWeight","round","getMolWeight","coef","getExtinctionCoefficient","lastChild","remove","newS","digit","test","getMolfiles","getMolfile","helmWebEditor"],"sourceRoot":""}