@datagrok/sequence-translator 1.2.5 → 1.2.7

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-test.js","mappings":"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","sources":["webpack://sequencetranslator/./node_modules/@datagrok-libraries/utils/src/test.js","webpack://sequencetranslator/./src/view/style/colored-text-input.css","webpack://sequencetranslator/./src/view/style/structure-app.css","webpack://sequencetranslator/./src/view/style/translator-app.css","webpack://sequencetranslator/./node_modules/css-loader/dist/runtime/api.js","webpack://sequencetranslator/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://sequencetranslator/./node_modules/save-svg-as-png/lib/saveSvgAsPng.js","webpack://sequencetranslator/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://sequencetranslator/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://sequencetranslator/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://sequencetranslator/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://sequencetranslator/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://sequencetranslator/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://sequencetranslator/./src/model/const.ts","webpack://sequencetranslator/./src/model/data-loading-utils/const.ts","webpack://sequencetranslator/./src/model/data-loading-utils/json-loader.ts","webpack://sequencetranslator/./src/model/helpers.ts","webpack://sequencetranslator/./src/model/monomer-lib/lib-wrapper.ts","webpack://sequencetranslator/./src/model/parsing-validation/sequence-validator.ts","webpack://sequencetranslator/./src/model/translator-app/const.ts","webpack://sequencetranslator/./src/model/translator-app/conversion-utils.ts","webpack://sequencetranslator/./src/model/parsing-validation/format-handler.ts","webpack://sequencetranslator/./src/model/translator-app/format-converter.ts","webpack://sequencetranslator/external var \"ui\"","webpack://sequencetranslator/external var \"rxjs\"","webpack://sequencetranslator/./src/view/style/translator-app.css?3282","webpack://sequencetranslator/external var \"$\"","webpack://sequencetranslator/./node_modules/@datagrok-libraries/chem-meta/src/formats/molfile-v2k-const.js","webpack://sequencetranslator/./src/view/style/colored-text-input.css?0e07","webpack://sequencetranslator/./src/view/utils/molecule-img.ts","webpack://sequencetranslator/./src/view/style/structure-app.css?9992","webpack://sequencetranslator/./src/model/pattern-app/helpers.ts","webpack://sequencetranslator/./src/model/pattern-app/draw-svg.ts","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/consts.js","webpack://sequencetranslator/external var \"wu\"","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/types.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/seq-palettes.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/aminoacids.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/nucleotides.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/unknown.js","webpack://sequencetranslator/./node_modules/fastest-levenshtein/esm/mod.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/macromolecule-distance-functions.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/utils/units-handler.js","webpack://sequencetranslator/./src/package.ts","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/monomer-works/monomer-utils.js","webpack://sequencetranslator/external var \"DG\"","webpack://sequencetranslator/external var \"grok\"","webpack://sequencetranslator/webpack/bootstrap","webpack://sequencetranslator/webpack/runtime/compat get default export","webpack://sequencetranslator/webpack/runtime/define property getters","webpack://sequencetranslator/webpack/runtime/hasOwnProperty shorthand","webpack://sequencetranslator/webpack/runtime/make namespace object","webpack://sequencetranslator/webpack/runtime/nonce","webpack://sequencetranslator/./src/tests/const.ts","webpack://sequencetranslator/./src/tests/formats-to-helm.ts","webpack://sequencetranslator/./src/tests/helm-to-nucleotides.ts","webpack://sequencetranslator/./src/tests/formats-support.ts","webpack://sequencetranslator/./src/package-test.ts"],"sourcesContent":["var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nexport const tests = {};\nexport let currentCategory;\nexport var assure;\n(function (assure) {\n function notNull(value, name) {\n if (value == null)\n throw new Error(`${name == null ? 'Value' : name} not defined`);\n }\n assure.notNull = notNull;\n})(assure || (assure = {}));\nexport class TestContext {\n constructor(catchUnhandled, report) {\n this.catchUnhandled = true;\n this.report = false;\n if (catchUnhandled !== undefined)\n this.catchUnhandled = catchUnhandled;\n if (report !== undefined)\n this.report = report;\n }\n ;\n}\nexport class Test {\n constructor(category, name, test, options) {\n var _a;\n this.category = category;\n this.name = name;\n options !== null && options !== void 0 ? options : (options = {});\n (_a = options.timeout) !== null && _a !== void 0 ? _a : (options.timeout = 30000);\n this.options = options;\n this.test = () => __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n let result = '';\n try {\n result = yield test();\n }\n catch (e) {\n reject(e);\n }\n resolve(result);\n }));\n });\n }\n}\nexport function testEvent(event, handler, trigger, ms = 0) {\n return __awaiter(this, void 0, void 0, function* () {\n let sub;\n return new Promise((resolve, reject) => {\n sub = event.subscribe((args) => {\n try {\n handler(args);\n }\n catch (e) {\n reject(e);\n }\n sub.unsubscribe();\n resolve('OK');\n });\n setTimeout(() => {\n sub.unsubscribe();\n // eslint-disable-next-line prefer-promise-reject-errors\n reject('timeout');\n }, ms);\n trigger();\n });\n });\n}\nexport function test(name, test, options) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n if (tests[currentCategory].tests == undefined)\n tests[currentCategory].tests = [];\n tests[currentCategory].tests.push(new Test(currentCategory, name, test, options));\n}\n/* Tests two objects for equality, throws an exception if they are not equal. */\nexport function expect(actual, expected) {\n if (actual !== expected)\n throw new Error(`Expected \"${expected}\", got \"${actual}\"`);\n}\nexport function expectFloat(actual, expected, tolerance = 0.001) {\n const areEqual = Math.abs(actual - expected) < tolerance;\n if (!areEqual)\n throw new Error(`Expected ${expected}, got ${actual} (tolerance = ${tolerance})`);\n}\nexport function expectObject(actual, expected) {\n for (const [expectedKey, expectedValue] of Object.entries(expected)) {\n if (!actual.hasOwnProperty(expectedKey))\n throw new Error(`Expected property \"${expectedKey}\" not found`);\n const actualValue = actual[expectedKey];\n if (actualValue instanceof Array && expectedValue instanceof Array)\n expectArray(actualValue, expectedValue);\n else if (actualValue instanceof Object && expectedValue instanceof Object)\n expectObject(actualValue, expectedValue);\n else if (Number.isFinite(actualValue) && Number.isFinite(expectedValue))\n expectFloat(actualValue, expectedValue);\n else if (actualValue != expectedValue)\n throw new Error(`Expected (${expectedValue}) for key '${expectedKey}', got (${actualValue})`);\n }\n}\nexport function expectArray(actual, expected) {\n const actualLength = actual.length;\n const expectedLength = expected.length;\n if (actualLength != expectedLength) {\n throw new Error(`Arrays are of different length: actual array length is ${actualLength} ` +\n `and expected array length is ${expectedLength}`);\n }\n for (let i = 0; i < actualLength; i++) {\n if (actual[i] instanceof Array && expected[i] instanceof Array)\n expectArray(actual[i], expected[i]);\n else if (actual[i] instanceof Object && expected[i] instanceof Object)\n expectObject(actual[i], expected[i]);\n else if (actual[i] != expected[i])\n throw new Error(`Expected ${expected[i]} at position ${i}, got ${actual[i]}`);\n }\n}\n/* Defines a test suite. */\nexport function category(category, tests) {\n currentCategory = category;\n tests();\n}\n/* Defines a function to be executed before the tests in this category are executed. */\nexport function before(before) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].before = before;\n}\n/* Defines a function to be executed after the tests in this category are executed. */\nexport function after(after) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].after = after;\n}\nexport function runTests(options) {\n var _a, _b, _c, _d;\n var _e;\n return __awaiter(this, void 0, void 0, function* () {\n const results = [];\n const packageName = (_b = (_a = grok.functions.getCurrentCall()) === null || _a === void 0 ? void 0 : _a.func) === null || _b === void 0 ? void 0 : _b.package;\n console.log(`Running tests`);\n options !== null && options !== void 0 ? options : (options = {});\n (_c = (_e = options).testContext) !== null && _c !== void 0 ? _c : (_e.testContext = new TestContext());\n grok.shell.lastError = '';\n for (const [key, value] of Object.entries(tests)) {\n if ((options === null || options === void 0 ? void 0 : options.category) != undefined) {\n if (!key.toLowerCase().startsWith(options === null || options === void 0 ? void 0 : options.category.toLowerCase()))\n continue;\n }\n console.log(`Started ${key} category`);\n try {\n if (value.before)\n yield value.before();\n }\n catch (x) {\n value.beforeStatus = x.toString();\n }\n const t = (_d = value.tests) !== null && _d !== void 0 ? _d : [];\n const res = [];\n for (let i = 0; i < t.length; i++)\n res.push(yield execTest(t[i], options === null || options === void 0 ? void 0 : options.test));\n const data = (yield Promise.all(res)).filter((d) => d.result != 'skipped');\n try {\n if (value.after)\n yield value.after();\n }\n catch (x) {\n value.afterStatus = x.toString();\n }\n if (value.afterStatus)\n data.push({ category: key, name: 'init', result: value.afterStatus, success: false, ms: 0, skipped: false });\n if (value.beforeStatus)\n data.push({ category: key, name: 'init', result: value.beforeStatus, success: false, ms: 0, skipped: false });\n results.push(...data);\n }\n if (options.testContext.catchUnhandled) {\n yield delay(1000);\n if (grok.shell.lastError.length > 0) {\n results.push({\n category: 'Unhandled exceptions',\n name: 'exceptions',\n result: grok.shell.lastError, success: false, ms: 0, skipped: false\n });\n }\n }\n if (options.testContext.report) {\n const logger = new DG.Logger();\n const successful = results.filter((r) => r.success).length;\n const skipped = results.filter((r) => r.skipped).length;\n const failed = results.filter((r) => !r.success);\n const description = 'Package @package tested: @successful successful, @skipped skipped, @failed failed tests';\n const params = {\n successful: successful,\n skipped: skipped,\n failed: failed.length,\n package: packageName\n };\n for (const r of failed)\n Object.assign(params, { [`${r.category} | ${r.name}`]: r.result });\n logger.log(description, params, 'package-tested');\n }\n return results;\n });\n}\nfunction execTest(t, predicate) {\n var _a, _b, _c;\n return __awaiter(this, void 0, void 0, function* () {\n let r;\n const filter = predicate != undefined && (!t.name.toLowerCase().startsWith(predicate.toLowerCase()));\n const skip = ((_a = t.options) === null || _a === void 0 ? void 0 : _a.skipReason) || filter;\n const skipReason = filter ? 'skipped' : (_b = t.options) === null || _b === void 0 ? void 0 : _b.skipReason;\n if (!skip)\n console.log(`Started ${t.category} ${t.name}`);\n const start = new Date();\n try {\n if (skip)\n r = { success: true, result: skipReason, ms: 0, skipped: true };\n else\n r = { success: true, result: (_c = yield t.test()) !== null && _c !== void 0 ? _c : 'OK', ms: 0, skipped: false };\n }\n catch (x) {\n r = { success: false, result: x.toString(), ms: 0, skipped: false };\n }\n const stop = new Date();\n // @ts-ignore\n r.ms = stop - start;\n if (!skip)\n console.log(`Finished ${t.category} ${t.name} for ${r.ms} ms`);\n r.category = t.category;\n r.name = t.name;\n return r;\n });\n}\n/* Waits [ms] milliseconds */\nexport function delay(ms) {\n return __awaiter(this, void 0, void 0, function* () {\n yield new Promise((r) => setTimeout(r, ms));\n });\n}\nexport function awaitCheck(checkHandler, error = 'Timeout exceeded', wait = 500) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n clearInterval(interval);\n reject(new Error(error));\n }, wait);\n // @ts-ignore\n const interval = setInterval(() => {\n if (checkHandler()) {\n clearInterval(interval);\n resolve();\n }\n }, 50);\n });\n });\n}\nexport function isDialogPresent(dialogTitle) {\n for (let i = 0; i < DG.Dialog.getOpenDialogs().length; i++) {\n if (DG.Dialog.getOpenDialogs()[i].title == dialogTitle)\n return true;\n }\n return false;\n}\nexport function testViewer(v, df, detectSemanticTypes = false) {\n return __awaiter(this, void 0, void 0, function* () {\n if (detectSemanticTypes)\n yield grok.data.detectSemanticTypes(df);\n const tv = grok.shell.addTableView(df);\n const viewerName = `[name=viewer-${v.replace(/\\s+/g, '-')} i]`;\n const selector = `${viewerName} canvas,${viewerName} svg,${viewerName} img,\n ${viewerName} input,${viewerName} h1,${viewerName} a`;\n const res = [];\n try {\n let viewer = tv.addViewer(v);\n yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer', 3000);\n res.push(Array.from(tv.viewers).length);\n Array.from(df.row(0).cells).forEach((c) => c.value = null);\n df.rows.select((row) => row.idx > 1 && row.idx < 7);\n for (let i = 7; i < 12; i++)\n df.filter.set(i, false);\n df.currentRowIdx = 1;\n const props = viewer.getOptions(true).look;\n const newProps = {};\n Object.keys(props).filter((k) => typeof props[k] === 'boolean').forEach((k) => newProps[k] = !props[k]);\n viewer.setOptions(newProps);\n yield delay(250);\n const layout = tv.saveLayout();\n const oldProps = viewer.getOptions().look;\n tv.resetLayout();\n res.push(Array.from(tv.viewers).length);\n tv.loadLayout(layout);\n yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer from layout', 3000);\n yield delay(250);\n res.push(Array.from(tv.viewers).length);\n viewer = Array.from(tv.viewers).find((v) => v.type !== 'Grid');\n expectArray(res, [2, 1, 2]);\n expect(JSON.stringify(viewer.getOptions().look), JSON.stringify(oldProps));\n }\n finally {\n tv.close();\n grok.shell.closeTable(df);\n }\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSXRDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FLZCxFQUFFLENBQUM7QUFFUCxNQUFNLENBQUMsSUFBSSxlQUF1QixDQUFDO0FBRW5DLE1BQU0sS0FBVyxNQUFNLENBTXRCO0FBTkQsV0FBaUIsTUFBTTtJQUVyQixTQUFnQixPQUFPLENBQUMsS0FBVSxFQUFFLElBQWE7UUFDL0MsSUFBSSxLQUFLLElBQUksSUFBSTtZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUhlLGNBQU8sVUFHdEIsQ0FBQTtBQUNILENBQUMsRUFOZ0IsTUFBTSxLQUFOLE1BQU0sUUFNdEI7QUFRRCxNQUFNLE9BQU8sV0FBVztJQUl0QixZQUFZLGNBQXdCLEVBQUUsTUFBZ0I7UUFIdEQsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUdiLElBQUksY0FBYyxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUN2RSxJQUFJLE1BQU0sS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDakQsQ0FBQztJQUFBLENBQUM7Q0FDSDtBQUVELE1BQU0sT0FBTyxJQUFJO0lBTWYsWUFBWSxRQUFnQixFQUFFLElBQVksRUFBRSxJQUF3QixFQUFFLE9BQXFCOztRQUN6RixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFH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SyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEMsTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUUsQ0FBQztZQUNoRSxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDNUU7Z0JBQVM7WUFDUixFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMzQjtJQUNILENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCBUaW1lb3V0ID0gTm9kZUpTLlRpbWVvdXQ7XG5cbmV4cG9ydCBjb25zdCB0ZXN0czoge1xuICBba2V5OiBzdHJpbmddOiB7XG4gICAgdGVzdHM/OiBUZXN0W10sIGJlZm9yZT86ICgpID0+IFByb21pc2U8dm9pZD4sIGFmdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBiZWZvcmVTdGF0dXM/OiBzdHJpbmcsIGFmdGVyU3RhdHVzPzogc3RyaW5nXG4gIH1cbn0gPSB7fTtcblxuZXhwb3J0IGxldCBjdXJyZW50Q2F0ZWdvcnk6IHN0cmluZztcblxuZXhwb3J0IG5hbWVzcGFjZSBhc3N1cmUge1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBub3ROdWxsKHZhbHVlOiBhbnksIG5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lID09IG51bGwgPyAnVmFsdWUnIDogbmFtZX0gbm90IGRlZmluZWRgKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RPcHRpb25zIHtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgdW5oYW5kbGVkRXhjZXB0aW9uVGltZW91dD86IG51bWJlcjtcbiAgc2tpcFJlYXNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFRlc3RDb250ZXh0IHtcbiAgY2F0Y2hVbmhhbmRsZWQgPSB0cnVlO1xuICByZXBvcnQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihjYXRjaFVuaGFuZGxlZD86IGJvb2xlYW4sIHJlcG9ydD86IGJvb2xlYW4pIHtcbiAgICBpZiAoY2F0Y2hVbmhhbmRsZWQgIT09IHVuZGVmaW5lZCkgdGhpcy5jYXRjaFVuaGFuZGxlZCA9IGNhdGNoVW5oYW5kbGVkO1xuICAgIGlmIChyZXBvcnQgIT09IHVuZGVmaW5lZCkgdGhpcy5yZXBvcnQgPSByZXBvcnQ7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBUZXN0IHtcbiAgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBUZXN0T3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihjYXRlZ29yeTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHRlc3Q6ICgpID0+IFByb21pc2U8YW55Piwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSB7XG4gICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgb3B0aW9ucyA/Pz0ge307XG4gICAgb3B0aW9ucy50aW1lb3V0ID8/PSAzMDAwMDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMudGVzdCA9IGFzeW5jICgpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRlc3QoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RFdmVudDxUPihldmVudDogT2JzZXJ2YWJsZTxUPixcbiAgaGFuZGxlcjogKGFyZ3M6IFQpID0+IHZvaWQsIHRyaWdnZXI6ICgpID0+IHZvaWQsIG1zOiBudW1iZXIgPSAwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IHN1YjogU3Vic2NyaXB0aW9uO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHN1YiA9IGV2ZW50LnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcihhcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICByZXNvbHZlKCdPSycpO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgfSwgbXMpO1xuICAgIHRyaWdnZXIoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0KG5hbWU6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+LCBvcHRpb25zPzogVGVzdE9wdGlvbnMpOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPSBbXTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyEucHVzaChuZXcgVGVzdChjdXJyZW50Q2F0ZWdvcnksIG5hbWUsIHRlc3QsIG9wdGlvbnMpKTtcbn1cblxuLyogVGVzdHMgdHdvIG9iamVjdHMgZm9yIGVxdWFsaXR5LCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3QoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkpOiB2b2lkIHtcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBcIiR7ZXhwZWN0ZWR9XCIsIGdvdCBcIiR7YWN0dWFsfVwiYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RGbG9hdChhY3R1YWw6IG51bWJlciwgZXhwZWN0ZWQ6IG51bWJlciwgdG9sZXJhbmNlID0gMC4wMDEpOiB2b2lkIHtcbiAgY29uc3QgYXJlRXF1YWwgPSBNYXRoLmFicyhhY3R1YWwgLSBleHBlY3RlZCkgPCB0b2xlcmFuY2U7XG4gIGlmICghYXJlRXF1YWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2V4cGVjdGVkfSwgZ290ICR7YWN0dWFsfSAodG9sZXJhbmNlID0gJHt0b2xlcmFuY2V9KWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0T2JqZWN0KGFjdHVhbDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgZXhwZWN0ZWQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHtcbiAgZm9yIChjb25zdCBbZXhwZWN0ZWRLZXksIGV4cGVjdGVkVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV4cGVjdGVkKSkge1xuICAgIGlmICghYWN0dWFsLmhhc093blByb3BlcnR5KGV4cGVjdGVkS2V5KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcHJvcGVydHkgXCIke2V4cGVjdGVkS2V5fVwiIG5vdCBmb3VuZGApO1xuXG4gICAgY29uc3QgYWN0dWFsVmFsdWUgPSBhY3R1YWxbZXhwZWN0ZWRLZXldO1xuICAgIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIEFycmF5ICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgIGV4cGVjdEFycmF5KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiBleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgZXhwZWN0T2JqZWN0KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChOdW1iZXIuaXNGaW5pdGUoYWN0dWFsVmFsdWUpICYmIE51bWJlci5pc0Zpbml0ZShleHBlY3RlZFZhbHVlKSlcbiAgICAgIGV4cGVjdEZsb2F0KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChhY3R1YWxWYWx1ZSAhPSBleHBlY3RlZFZhbHVlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAoJHtleHBlY3RlZFZhbHVlfSkgZm9yIGtleSAnJHtleHBlY3RlZEtleX0nLCBnb3QgKCR7YWN0dWFsVmFsdWV9KWApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheShhY3R1YWw6IEFycmF5TGlrZTxhbnk+LCBleHBlY3RlZDogQXJyYXlMaWtlPGFueT4pIHtcbiAgY29uc3QgYWN0dWFsTGVuZ3RoID0gYWN0dWFsLmxlbmd0aDtcbiAgY29uc3QgZXhwZWN0ZWRMZW5ndGggPSBleHBlY3RlZC5sZW5ndGg7XG5cbiAgaWYgKGFjdHVhbExlbmd0aCAhPSBleHBlY3RlZExlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQXJyYXlzIGFyZSBvZiBkaWZmZXJlbnQgbGVuZ3RoOiBhY3R1YWwgYXJyYXkgbGVuZ3RoIGlzICR7YWN0dWFsTGVuZ3RofSBgICtcbiAgICAgIGBhbmQgZXhwZWN0ZWQgYXJyYXkgbGVuZ3RoIGlzICR7ZXhwZWN0ZWRMZW5ndGh9YCk7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdHVhbExlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGFjdHVhbFtpXSBpbnN0YW5jZW9mIEFycmF5ICYmIGV4cGVjdGVkW2ldIGluc3RhbmNlb2YgQXJyYXkpXG4gICAgICBleHBlY3RBcnJheShhY3R1YWxbaV0sIGV4cGVjdGVkW2ldKTtcbiAgICBlbHNlIGlmIChhY3R1YWxbaV0gaW5zdGFuY2VvZiBPYmplY3QgJiYgZXhwZWN0ZWRbaV0gaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICBleHBlY3RPYmplY3QoYWN0dWFsW2ldLCBleHBlY3RlZFtpXSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsW2ldICE9IGV4cGVjdGVkW2ldKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2V4cGVjdGVkW2ldfSBhdCBwb3NpdGlvbiAke2l9LCBnb3QgJHthY3R1YWxbaV19YCk7XG4gIH1cbn1cblxuLyogRGVmaW5lcyBhIHRlc3Qgc3VpdGUuICovXG5leHBvcnQgZnVuY3Rpb24gY2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZywgdGVzdHM6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgY3VycmVudENhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gIHRlc3RzKCk7XG59XG5cbi8qIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZShiZWZvcmU6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5iZWZvcmUgPSBiZWZvcmU7XG59XG5cbi8qIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgdGVzdHMgaW4gdGhpcyBjYXRlZ29yeSBhcmUgZXhlY3V0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXIoYWZ0ZXI6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5hZnRlciA9IGFmdGVyO1xufVxuXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5UZXN0cyhvcHRpb25zPzogeyBjYXRlZ29yeT86IHN0cmluZywgdGVzdD86IHN0cmluZywgdGVzdENvbnRleHQ/OiBUZXN0Q29udGV4dCB9KSB7XG4gIGNvbnN0IHJlc3VsdHM6IHsgY2F0ZWdvcnk/OiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgcmVzdWx0OiBzdHJpbmcsIG1zOiBudW1iZXIsIHNraXBwZWQ6IGJvb2xlYW4gfVtdID0gW107XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gZ3Jvay5mdW5jdGlvbnMuZ2V0Q3VycmVudENhbGwoKT8uZnVuYz8ucGFja2FnZTtcbiAgY29uc29sZS5sb2coYFJ1bm5pbmcgdGVzdHNgKTtcbiAgb3B0aW9ucyA/Pz0ge307XG4gIG9wdGlvbnMhLnRlc3RDb250ZXh0ID8/PSBuZXcgVGVzdENvbnRleHQoKTtcbiAgZ3Jvay5zaGVsbC5sYXN0RXJyb3IgPSAnJztcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGVzdHMpKSB7XG4gICAgaWYgKG9wdGlvbnM/LmNhdGVnb3J5ICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG9wdGlvbnM/LmNhdGVnb3J5LnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYFN0YXJ0ZWQgJHtrZXl9IGNhdGVnb3J5YCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5iZWZvcmUpXG4gICAgICAgIGF3YWl0IHZhbHVlLmJlZm9yZSgpO1xuICAgIH0gY2F0Y2ggKHg6IGFueSkge1xuICAgICAgdmFsdWUuYmVmb3JlU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBjb25zdCB0ID0gdmFsdWUudGVzdHMgPz8gW107XG4gICAgY29uc3QgcmVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKVxuICAgICAgcmVzLnB1c2goYXdhaXQgZXhlY1Rlc3QodFtpXSwgb3B0aW9ucz8udGVzdCkpO1xuXG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCBQcm9taXNlLmFsbChyZXMpKS5maWx0ZXIoKGQpID0+IGQucmVzdWx0ICE9ICdza2lwcGVkJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5hZnRlcilcbiAgICAgICAgYXdhaXQgdmFsdWUuYWZ0ZXIoKTtcbiAgICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICAgIHZhbHVlLmFmdGVyU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAodmFsdWUuYWZ0ZXJTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5hZnRlclN0YXR1cywgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZX0pO1xuICAgIGlmICh2YWx1ZS5iZWZvcmVTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5iZWZvcmVTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlLCBtczogMCwgc2tpcHBlZDogZmFsc2V9KTtcbiAgICByZXN1bHRzLnB1c2goLi4uZGF0YSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMudGVzdENvbnRleHQuY2F0Y2hVbmhhbmRsZWQpIHtcbiAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICBpZiAoZ3Jvay5zaGVsbC5sYXN0RXJyb3IubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgY2F0ZWdvcnk6ICdVbmhhbmRsZWQgZXhjZXB0aW9ucycsXG4gICAgICAgIG5hbWU6ICdleGNlcHRpb25zJyxcbiAgICAgICAgcmVzdWx0OiBncm9rLnNoZWxsLmxhc3RFcnJvciwgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChvcHRpb25zLnRlc3RDb250ZXh0LnJlcG9ydCkge1xuICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBERy5Mb2dnZXIoKTtcbiAgICBjb25zdCBzdWNjZXNzZnVsID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuc3VjY2VzcykubGVuZ3RoO1xuICAgIGNvbnN0IHNraXBwZWQgPSByZXN1bHRzLmZpbHRlcigocikgPT4gci5za2lwcGVkKS5sZW5ndGg7XG4gICAgY29uc3QgZmFpbGVkID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+ICFyLnN1Y2Nlc3MpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gJ1BhY2thZ2UgQHBhY2thZ2UgdGVzdGVkOiBAc3VjY2Vzc2Z1bCBzdWNjZXNzZnVsLCBAc2tpcHBlZCBza2lwcGVkLCBAZmFpbGVkIGZhaWxlZCB0ZXN0cyc7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgc3VjY2Vzc2Z1bDogc3VjY2Vzc2Z1bCxcbiAgICAgIHNraXBwZWQ6IHNraXBwZWQsXG4gICAgICBmYWlsZWQ6IGZhaWxlZC5sZW5ndGgsXG4gICAgICBwYWNrYWdlOiBwYWNrYWdlTmFtZVxuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIGZhaWxlZCkgT2JqZWN0LmFzc2lnbihwYXJhbXMsIHtbYCR7ci5jYXRlZ29yeX0gfCAke3IubmFtZX1gXTogci5yZXN1bHR9KTtcbiAgICBsb2dnZXIubG9nKGRlc2NyaXB0aW9uLCBwYXJhbXMsICdwYWNrYWdlLXRlc3RlZCcpO1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjVGVzdCh0OiBUZXN0LCBwcmVkaWNhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICBsZXQgcjogeyBjYXRlZ29yeT86IHN0cmluZywgbmFtZT86IHN0cmluZywgc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIG1zOiBudW1iZXIsIHNraXBwZWQ6IGJvb2xlYW4gfTtcbiAgY29uc3QgZmlsdGVyID0gcHJlZGljYXRlICE9IHVuZGVmaW5lZCAmJiAoIXQubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocHJlZGljYXRlLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc2tpcCA9IHQub3B0aW9ucz8uc2tpcFJlYXNvbiB8fCBmaWx0ZXI7XG4gIGNvbnN0IHNraXBSZWFzb24gPSBmaWx0ZXIgPyAnc2tpcHBlZCcgOiB0Lm9wdGlvbnM/LnNraXBSZWFzb247XG4gIGlmICghc2tpcClcbiAgICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke3QuY2F0ZWdvcnl9ICR7dC5uYW1lfWApO1xuICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCk7XG5cbiAgdHJ5IHtcbiAgICBpZiAoc2tpcClcbiAgICAgIHIgPSB7c3VjY2VzczogdHJ1ZSwgcmVzdWx0OiBza2lwUmVhc29uISwgbXM6IDAsIHNraXBwZWQ6IHRydWV9O1xuICAgIGVsc2VcbiAgICAgIHIgPSB7c3VjY2VzczogdHJ1ZSwgcmVzdWx0OiBhd2FpdCB0LnRlc3QoKSA/PyAnT0snLCBtczogMCwgc2tpcHBlZDogZmFsc2V9O1xuICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICByID0ge3N1Y2Nlc3M6IGZhbHNlLCByZXN1bHQ6IHgudG9TdHJpbmcoKSwgbXM6IDAsIHNraXBwZWQ6IGZhbHNlfTtcbiAgfVxuICBjb25zdCBzdG9wID0gbmV3IERhdGUoKTtcbiAgLy8gQHRzLWlnbm9yZVxuICByLm1zID0gc3RvcCAtIHN0YXJ0O1xuICBpZiAoIXNraXApXG4gICAgY29uc29sZS5sb2coYEZpbmlzaGVkICR7dC5jYXRlZ29yeX0gJHt0Lm5hbWV9IGZvciAke3IubXN9IG1zYCk7XG5cbiAgci5jYXRlZ29yeSA9IHQuY2F0ZWdvcnk7XG4gIHIubmFtZSA9IHQubmFtZTtcbiAgcmV0dXJuIHI7XG59XG5cbi8qIFdhaXRzIFttc10gbWlsbGlzZWNvbmRzICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcikge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRDaGVjayhjaGVja0hhbmRsZXI6ICgpID0+IGJvb2xlYW4sXG4gIGVycm9yOiBzdHJpbmcgPSAnVGltZW91dCBleGNlZWRlZCcsIHdhaXQ6IG51bWJlciA9IDUwMCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICByZWplY3QobmV3IEVycm9yKGVycm9yKSk7XG4gICAgfSwgd2FpdCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGludGVydmFsOiBUaW1lb3V0ID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKGNoZWNrSGFuZGxlcigpKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSwgNTApO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGlhbG9nUHJlc2VudChkaWFsb2dUaXRsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgREcuRGlhbG9nLmdldE9wZW5EaWFsb2dzKCkubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoREcuRGlhbG9nLmdldE9wZW5EaWFsb2dzKClbaV0udGl0bGUgPT0gZGlhbG9nVGl0bGUpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0Vmlld2VyKHY6IHN0cmluZywgZGY6IERHLkRhdGFGcmFtZSwgZGV0ZWN0U2VtYW50aWNUeXBlczogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChkZXRlY3RTZW1hbnRpY1R5cGVzKSBhd2FpdCBncm9rLmRhdGEuZGV0ZWN0U2VtYW50aWNUeXBlcyhkZik7XG4gIGNvbnN0IHR2ID0gZ3Jvay5zaGVsbC5hZGRUYWJsZVZpZXcoZGYpO1xuICBjb25zdCB2aWV3ZXJOYW1lID0gYFtuYW1lPXZpZXdlci0ke3YucmVwbGFjZSgvXFxzKy9nLCAnLScpfSBpXWA7XG4gIGNvbnN0IHNlbGVjdG9yID0gYCR7dmlld2VyTmFtZX0gY2FudmFzLCR7dmlld2VyTmFtZX0gc3ZnLCR7dmlld2VyTmFtZX0gaW1nLFxuICAgICR7dmlld2VyTmFtZX0gaW5wdXQsJHt2aWV3ZXJOYW1lfSBoMSwke3ZpZXdlck5hbWV9IGFgO1xuICBjb25zdCByZXMgPSBbXTtcbiAgdHJ5IHtcbiAgICBsZXQgdmlld2VyID0gdHYuYWRkVmlld2VyKHYpO1xuICAgIGF3YWl0IGF3YWl0Q2hlY2soKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgIT09IG51bGwsXG4gICAgICAnY2Fubm90IGxvYWQgdmlld2VyJywgMzAwMCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIEFycmF5LmZyb20oZGYucm93KDApLmNlbGxzKS5mb3JFYWNoKChjKSA9PiBjLnZhbHVlID0gbnVsbCk7XG4gICAgZGYucm93cy5zZWxlY3QoKHJvdykgPT4gcm93LmlkeCA+IDEgJiYgcm93LmlkeCA8IDcpO1xuICAgIGZvciAobGV0IGkgPSA3OyBpIDwgMTI7IGkrKykgZGYuZmlsdGVyLnNldChpLCBmYWxzZSk7XG4gICAgZGYuY3VycmVudFJvd0lkeCA9IDE7XG4gICAgY29uc3QgcHJvcHMgPSB2aWV3ZXIuZ2V0T3B0aW9ucyh0cnVlKS5sb29rO1xuICAgIGNvbnN0IG5ld1Byb3BzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHByb3BzKS5maWx0ZXIoKGspID0+IHR5cGVvZiBwcm9wc1trXSA9PT0gJ2Jvb2xlYW4nKS5mb3JFYWNoKChrKSA9PiBuZXdQcm9wc1trXSA9ICFwcm9wc1trXSk7XG4gICAgdmlld2VyLnNldE9wdGlvbnMobmV3UHJvcHMpO1xuICAgIGF3YWl0IGRlbGF5KDI1MCk7XG4gICAgY29uc3QgbGF5b3V0ID0gdHYuc2F2ZUxheW91dCgpO1xuICAgIGNvbnN0IG9sZFByb3BzID0gdmlld2VyLmdldE9wdGlvbnMoKS5sb29rO1xuICAgIHR2LnJlc2V0TGF5b3V0KCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIHR2LmxvYWRMYXlvdXQobGF5b3V0KTtcbiAgICBhd2FpdCBhd2FpdENoZWNrKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpICE9PSBudWxsLFxuICAgICAgJ2Nhbm5vdCBsb2FkIHZpZXdlciBmcm9tIGxheW91dCcsIDMwMDApO1xuICAgIGF3YWl0IGRlbGF5KDI1MCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIHZpZXdlciA9IEFycmF5LmZyb20odHYudmlld2VycykuZmluZCgodikgPT4gdi50eXBlICE9PSAnR3JpZCcpITtcbiAgICBleHBlY3RBcnJheShyZXMsIFsyLCAxLCAyXSk7XG4gICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KHZpZXdlci5nZXRPcHRpb25zKCkubG9vayksIEpTT04uc3RyaW5naWZ5KG9sZFByb3BzKSk7XG4gIH0gZmluYWxseSB7XG4gICAgdHYuY2xvc2UoKTtcbiAgICBncm9rLnNoZWxsLmNsb3NlVGFibGUoZGYpO1xuICB9XG59XG4iXX0=","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".colored-text-input > textarea {\\n width: 100%;\\n -webkit-text-fill-color: transparent;\\n background-color: transparent;\\n position: relative;\\n z-index: 1;\\n resize: none;\\n height: 22px; /* Fine tuned value to avoid \\\"jumping\\\" of the textarea upon autoresize */\\n}\\n\\n.colored-text-input > div {\\n /* The values here are fine tuned to those of the ui.input textarea in order\\n * to achieve precise overlap */\\n overflow: auto;\\n position: absolute;\\n pointer-events: none;\\n cursor: text;\\n z-index: 0;\\n max-width: 100%;\\n padding: 2px;\\n line-height: normal;\\n font-family: 'Roboto Mono', 'Roboto Mono Local', monospace;\\n font-size: 12px;\\n color: transparent;\\n white-space: pre-wrap;\\n word-wrap: break-word;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/view/style/colored-text-input.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,WAAW;EACX,oCAAoC;EACpC,6BAA6B;EAC7B,kBAAkB;EAClB,UAAU;EACV,YAAY;EACZ,YAAY,EAAE,wEAAwE;AACxF;;AAEA;EACE;iCAC+B;EAC/B,cAAc;EACd,kBAAkB;EAClB,oBAAoB;EACpB,YAAY;EACZ,UAAU;EACV,eAAe;EACf,YAAY;EACZ,mBAAmB;EACnB,0DAA0D;EAC1D,eAAe;EACf,kBAAkB;EAClB,qBAAqB;EACrB,qBAAqB;AACvB\",\"sourcesContent\":[\".colored-text-input > textarea {\\n width: 100%;\\n -webkit-text-fill-color: transparent;\\n background-color: transparent;\\n position: relative;\\n z-index: 1;\\n resize: none;\\n height: 22px; /* Fine tuned value to avoid \\\"jumping\\\" of the textarea upon autoresize */\\n}\\n\\n.colored-text-input > div {\\n /* The values here are fine tuned to those of the ui.input textarea in order\\n * to achieve precise overlap */\\n overflow: auto;\\n position: absolute;\\n pointer-events: none;\\n cursor: text;\\n z-index: 0;\\n max-width: 100%;\\n padding: 2px;\\n line-height: normal;\\n font-family: 'Roboto Mono', 'Roboto Mono Local', monospace;\\n font-size: 12px;\\n color: transparent;\\n white-space: pre-wrap;\\n word-wrap: break-word;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* Naming convention: class names should begin with st and app name to avoid naming collitions */\\n\\n.st-structure-body {\\n padding-right: 20px;\\n}\\n\\n.st-structure-input-form {\\n text-align: right;\\n vertical-align: top;\\n min-width: 95px;\\n}\\n\\n.st-structure-direction-choice label {\\n min-width: 100px;\\n float: right;\\n}\\n\\n.st-structure-direction-choice div {\\n justify-content: right;\\n}\\n\\n.st-structure-text-input-td { /* Style for td containing textarea */\\n width: 100%;\\n}\\n\\n.st-structure-mol-img {\\n margin-right: 30px;\\n float: right;\\n}\\n\\n.st-structure-bool-button-block {\\n justify-content: right;\\n margin-bottom: 10px;\\n}\\n\\n.st-structure-bottom {\\n flex-direction: row-reverse;\\n padding-top: 20px;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/view/style/structure-app.css\"],\"names\":[],\"mappings\":\"AAAA,gGAAgG;;AAEhG;EACE,mBAAmB;AACrB;;AAEA;EACE,iBAAiB;EACjB,mBAAmB;EACnB,eAAe;AACjB;;AAEA;EACE,gBAAgB;EAChB,YAAY;AACd;;AAEA;EACE,sBAAsB;AACxB;;AAEA,8BAA8B,qCAAqC;EACjE,WAAW;AACb;;AAEA;EACE,kBAAkB;EAClB,YAAY;AACd;;AAEA;EACE,sBAAsB;EACtB,mBAAmB;AACrB;;AAEA;EACE,2BAA2B;EAC3B,iBAAiB;AACnB\",\"sourcesContent\":[\"/* Naming convention: class names should begin with st and app name to avoid naming collitions */\\n\\n.st-structure-body {\\n padding-right: 20px;\\n}\\n\\n.st-structure-input-form {\\n text-align: right;\\n vertical-align: top;\\n min-width: 95px;\\n}\\n\\n.st-structure-direction-choice label {\\n min-width: 100px;\\n float: right;\\n}\\n\\n.st-structure-direction-choice div {\\n justify-content: right;\\n}\\n\\n.st-structure-text-input-td { /* Style for td containing textarea */\\n width: 100%;\\n}\\n\\n.st-structure-mol-img {\\n margin-right: 30px;\\n float: right;\\n}\\n\\n.st-structure-bool-button-block {\\n justify-content: right;\\n margin-bottom: 10px;\\n}\\n\\n.st-structure-bottom {\\n flex-direction: row-reverse;\\n padding-top: 20px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* Naming convention: class names should begin with st and app name to avoid naming collitions */\\n.st-translator-input-table {\\n /* width: 100%; */\\n margin-right: 20px;\\n}\\n\\n.st-translator-input-table td:has(textarea) {\\n width: 100%;\\n}\\n\\n.st-translator-input-table td:has(select) {\\n min-width: 120px;\\n vertical-align: top;\\n}\\n\\n.st-translator-output-table {\\n margin-top: 20px;\\n margin-right: 20px;\\n margin-bottom: 10px;\\n}\\n\\n.st-translator-output-table table {\\n width: 100%;\\n table-layout: fixed;\\n}\\n\\n/* .st-translator-output-table table tbody tr td { */\\n/* max-width: 20%; */\\n/* } */\\n\\n.st-translator-output-table td {\\n padding-top: 6px;\\n padding-bottom: 6px;\\n}\\n.st-translator-output-table tr:nth-child(even) {\\n background-color: var(--grey-1);\\n}\\n\\n.st-translator-output-table td:nth-child(odd) {\\n width: 120px;\\n vertical-align: top;\\n}\\n\\n.st-translator-output-table td a {\\n overflow-wrap: break-word;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/view/style/translator-app.css\"],\"names\":[],\"mappings\":\"AAAA,gGAAgG;AAChG;EACE,iBAAiB;EACjB,kBAAkB;AACpB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,kBAAkB;EAClB,mBAAmB;AACrB;;AAEA;EACE,WAAW;EACX,mBAAmB;AACrB;;AAEA,oDAAoD;AACpD,sBAAsB;AACtB,MAAM;;AAEN;EACE,gBAAgB;EAChB,mBAAmB;AACrB;AACA;EACE,+BAA+B;AACjC;;AAEA;EACE,YAAY;EACZ,mBAAmB;AACrB;;AAEA;EACE,yBAAyB;AAC3B\",\"sourcesContent\":[\"/* Naming convention: class names should begin with st and app name to avoid naming collitions */\\n.st-translator-input-table {\\n /* width: 100%; */\\n margin-right: 20px;\\n}\\n\\n.st-translator-input-table td:has(textarea) {\\n width: 100%;\\n}\\n\\n.st-translator-input-table td:has(select) {\\n min-width: 120px;\\n vertical-align: top;\\n}\\n\\n.st-translator-output-table {\\n margin-top: 20px;\\n margin-right: 20px;\\n margin-bottom: 10px;\\n}\\n\\n.st-translator-output-table table {\\n width: 100%;\\n table-layout: fixed;\\n}\\n\\n/* .st-translator-output-table table tbody tr td { */\\n/* max-width: 20%; */\\n/* } */\\n\\n.st-translator-output-table td {\\n padding-top: 6px;\\n padding-bottom: 6px;\\n}\\n.st-translator-output-table tr:nth-child(even) {\\n background-color: var(--grey-1);\\n}\\n\\n.st-translator-output-table td:nth-child(odd) {\\n width: 120px;\\n vertical-align: top;\\n}\\n\\n.st-translator-output-table td a {\\n overflow-wrap: break-word;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","'use strict';\n\n(function () {\n var out$ = typeof exports != 'undefined' && exports || typeof define != 'undefined' && {} || this || window;\n if (typeof define !== 'undefined') define('save-svg-as-png', [], function () {\n return out$;\n });\n out$.default = out$;\n\n var xmlNs = 'http://www.w3.org/2000/xmlns/';\n var xhtmlNs = 'http://www.w3.org/1999/xhtml';\n var svgNs = 'http://www.w3.org/2000/svg';\n var doctype = '<?xml version=\"1.0\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\" [<!ENTITY nbsp \"&#160;\">]>';\n var urlRegex = /url\\([\"']?(.+?)[\"']?\\)/;\n var fontFormats = {\n woff2: 'font/woff2',\n woff: 'font/woff',\n otf: 'application/x-font-opentype',\n ttf: 'application/x-font-ttf',\n eot: 'application/vnd.ms-fontobject',\n sfnt: 'application/font-sfnt',\n svg: 'image/svg+xml'\n };\n\n var isElement = function isElement(obj) {\n return obj instanceof HTMLElement || obj instanceof SVGElement;\n };\n var requireDomNode = function requireDomNode(el) {\n if (!isElement(el)) throw new Error('an HTMLElement or SVGElement is required; got ' + el);\n };\n var requireDomNodePromise = function requireDomNodePromise(el) {\n return new Promise(function (resolve, reject) {\n if (isElement(el)) resolve(el);else reject(new Error('an HTMLElement or SVGElement is required; got ' + el));\n });\n };\n var isExternal = function isExternal(url) {\n return url && url.lastIndexOf('http', 0) === 0 && url.lastIndexOf(window.location.host) === -1;\n };\n\n var getFontMimeTypeFromUrl = function getFontMimeTypeFromUrl(fontUrl) {\n var formats = Object.keys(fontFormats).filter(function (extension) {\n return fontUrl.indexOf('.' + extension) > 0;\n }).map(function (extension) {\n return fontFormats[extension];\n });\n if (formats) return formats[0];\n console.error('Unknown font format for ' + fontUrl + '. Fonts may not be working correctly.');\n return 'application/octet-stream';\n };\n\n var arrayBufferToBase64 = function arrayBufferToBase64(buffer) {\n var binary = '';\n var bytes = new Uint8Array(buffer);\n for (var i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }return window.btoa(binary);\n };\n\n var getDimension = function getDimension(el, clone, dim) {\n var v = el.viewBox && el.viewBox.baseVal && el.viewBox.baseVal[dim] || clone.getAttribute(dim) !== null && !clone.getAttribute(dim).match(/%$/) && parseInt(clone.getAttribute(dim)) || el.getBoundingClientRect()[dim] || parseInt(clone.style[dim]) || parseInt(window.getComputedStyle(el).getPropertyValue(dim));\n return typeof v === 'undefined' || v === null || isNaN(parseFloat(v)) ? 0 : v;\n };\n\n var getDimensions = function getDimensions(el, clone, width, height) {\n if (el.tagName === 'svg') return {\n width: width || getDimension(el, clone, 'width'),\n height: height || getDimension(el, clone, 'height')\n };else if (el.getBBox) {\n var _el$getBBox = el.getBBox(),\n x = _el$getBBox.x,\n y = _el$getBBox.y,\n _width = _el$getBBox.width,\n _height = _el$getBBox.height;\n\n return {\n width: x + _width,\n height: y + _height\n };\n }\n };\n\n var reEncode = function reEncode(data) {\n return decodeURIComponent(encodeURIComponent(data).replace(/%([0-9A-F]{2})/g, function (match, p1) {\n var c = String.fromCharCode('0x' + p1);\n return c === '%' ? '%25' : c;\n }));\n };\n\n var uriToBlob = function uriToBlob(uri) {\n var byteString = window.atob(uri.split(',')[1]);\n var mimeString = uri.split(',')[0].split(':')[1].split(';')[0];\n var buffer = new ArrayBuffer(byteString.length);\n var intArray = new Uint8Array(buffer);\n for (var i = 0; i < byteString.length; i++) {\n intArray[i] = byteString.charCodeAt(i);\n }\n return new Blob([buffer], { type: mimeString });\n };\n\n var query = function query(el, selector) {\n if (!selector) return;\n try {\n return el.querySelector(selector) || el.parentNode && el.parentNode.querySelector(selector);\n } catch (err) {\n console.warn('Invalid CSS selector \"' + selector + '\"', err);\n }\n };\n\n var detectCssFont = function detectCssFont(rule, href) {\n // Match CSS font-face rules to external links.\n // @font-face {\n // src: local('Abel'), url(https://fonts.gstatic.com/s/abel/v6/UzN-iejR1VoXU2Oc-7LsbvesZW2xOQ-xsNqO47m55DA.woff2);\n // }\n var match = rule.cssText.match(urlRegex);\n var url = match && match[1] || '';\n if (!url || url.match(/^data:/) || url === 'about:blank') return;\n var fullUrl = url.startsWith('../') ? href + '/../' + url : url.startsWith('./') ? href + '/.' + url : url;\n return {\n text: rule.cssText,\n format: getFontMimeTypeFromUrl(fullUrl),\n url: fullUrl\n };\n };\n\n var inlineImages = function inlineImages(el) {\n return Promise.all(Array.from(el.querySelectorAll('image')).map(function (image) {\n var href = image.getAttributeNS('http://www.w3.org/1999/xlink', 'href') || image.getAttribute('href');\n if (!href) return Promise.resolve(null);\n if (isExternal(href)) {\n href += (href.indexOf('?') === -1 ? '?' : '&') + 't=' + new Date().valueOf();\n }\n return new Promise(function (resolve, reject) {\n var canvas = document.createElement('canvas');\n var img = new Image();\n img.crossOrigin = 'anonymous';\n img.src = href;\n img.onerror = function () {\n return reject(new Error('Could not load ' + href));\n };\n img.onload = function () {\n canvas.width = img.width;\n canvas.height = img.height;\n canvas.getContext('2d').drawImage(img, 0, 0);\n image.setAttributeNS('http://www.w3.org/1999/xlink', 'href', canvas.toDataURL('image/png'));\n resolve(true);\n };\n });\n }));\n };\n\n var cachedFonts = {};\n var inlineFonts = function inlineFonts(fonts) {\n return Promise.all(fonts.map(function (font) {\n return new Promise(function (resolve, reject) {\n if (cachedFonts[font.url]) return resolve(cachedFonts[font.url]);\n\n var req = new XMLHttpRequest();\n req.addEventListener('load', function () {\n // TODO: it may also be worth it to wait until fonts are fully loaded before\n // attempting to rasterize them. (e.g. use https://developer.mozilla.org/en-US/docs/Web/API/FontFaceSet)\n var fontInBase64 = arrayBufferToBase64(req.response);\n var fontUri = font.text.replace(urlRegex, 'url(\"data:' + font.format + ';base64,' + fontInBase64 + '\")') + '\\n';\n cachedFonts[font.url] = fontUri;\n resolve(fontUri);\n });\n req.addEventListener('error', function (e) {\n console.warn('Failed to load font from: ' + font.url, e);\n cachedFonts[font.url] = null;\n resolve(null);\n });\n req.addEventListener('abort', function (e) {\n console.warn('Aborted loading font from: ' + font.url, e);\n resolve(null);\n });\n req.open('GET', font.url);\n req.responseType = 'arraybuffer';\n req.send();\n });\n })).then(function (fontCss) {\n return fontCss.filter(function (x) {\n return x;\n }).join('');\n });\n };\n\n var cachedRules = null;\n var styleSheetRules = function styleSheetRules() {\n if (cachedRules) return cachedRules;\n return cachedRules = Array.from(document.styleSheets).map(function (sheet) {\n try {\n return { rules: sheet.cssRules, href: sheet.href };\n } catch (e) {\n console.warn('Stylesheet could not be loaded: ' + sheet.href, e);\n return {};\n }\n });\n };\n\n var inlineCss = function inlineCss(el, options) {\n var _ref = options || {},\n selectorRemap = _ref.selectorRemap,\n modifyStyle = _ref.modifyStyle,\n modifyCss = _ref.modifyCss,\n fonts = _ref.fonts,\n excludeUnusedCss = _ref.excludeUnusedCss;\n\n var generateCss = modifyCss || function (selector, properties) {\n var sel = selectorRemap ? selectorRemap(selector) : selector;\n var props = modifyStyle ? modifyStyle(properties) : properties;\n return sel + '{' + props + '}\\n';\n };\n var css = [];\n var detectFonts = typeof fonts === 'undefined';\n var fontList = fonts || [];\n styleSheetRules().forEach(function (_ref2) {\n var rules = _ref2.rules,\n href = _ref2.href;\n\n if (!rules) return;\n Array.from(rules).forEach(function (rule) {\n if (typeof rule.style != 'undefined') {\n if (query(el, rule.selectorText)) css.push(generateCss(rule.selectorText, rule.style.cssText));else if (detectFonts && rule.cssText.match(/^@font-face/)) {\n var font = detectCssFont(rule, href);\n if (font) fontList.push(font);\n } else if (!excludeUnusedCss) {\n css.push(rule.cssText);\n }\n }\n });\n });\n\n return inlineFonts(fontList).then(function (fontCss) {\n return css.join('\\n') + fontCss;\n });\n };\n\n var downloadOptions = function downloadOptions() {\n if (!navigator.msSaveOrOpenBlob && !('download' in document.createElement('a'))) {\n return { popup: window.open() };\n }\n };\n\n out$.prepareSvg = function (el, options, done) {\n requireDomNode(el);\n\n var _ref3 = options || {},\n _ref3$left = _ref3.left,\n left = _ref3$left === undefined ? 0 : _ref3$left,\n _ref3$top = _ref3.top,\n top = _ref3$top === undefined ? 0 : _ref3$top,\n w = _ref3.width,\n h = _ref3.height,\n _ref3$scale = _ref3.scale,\n scale = _ref3$scale === undefined ? 1 : _ref3$scale,\n _ref3$responsive = _ref3.responsive,\n responsive = _ref3$responsive === undefined ? false : _ref3$responsive,\n _ref3$excludeCss = _ref3.excludeCss,\n excludeCss = _ref3$excludeCss === undefined ? false : _ref3$excludeCss;\n\n return inlineImages(el).then(function () {\n var clone = el.cloneNode(true);\n clone.style.backgroundColor = (options || {}).backgroundColor || el.style.backgroundColor;\n\n var _getDimensions = getDimensions(el, clone, w, h),\n width = _getDimensions.width,\n height = _getDimensions.height;\n\n if (el.tagName !== 'svg') {\n if (el.getBBox) {\n if (clone.getAttribute('transform') != null) {\n clone.setAttribute('transform', clone.getAttribute('transform').replace(/translate\\(.*?\\)/, ''));\n }\n var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.appendChild(clone);\n clone = svg;\n } else {\n console.error('Attempted to render non-SVG element', el);\n return;\n }\n }\n\n clone.setAttribute('version', '1.1');\n clone.setAttribute('viewBox', [left, top, width, height].join(' '));\n if (!clone.getAttribute('xmlns')) clone.setAttributeNS(xmlNs, 'xmlns', svgNs);\n if (!clone.getAttribute('xmlns:xlink')) clone.setAttributeNS(xmlNs, 'xmlns:xlink', 'http://www.w3.org/1999/xlink');\n\n if (responsive) {\n clone.removeAttribute('width');\n clone.removeAttribute('height');\n clone.setAttribute('preserveAspectRatio', 'xMinYMin meet');\n } else {\n clone.setAttribute('width', width * scale);\n clone.setAttribute('height', height * scale);\n }\n\n Array.from(clone.querySelectorAll('foreignObject > *')).forEach(function (foreignObject) {\n foreignObject.setAttributeNS(xmlNs, 'xmlns', foreignObject.tagName === 'svg' ? svgNs : xhtmlNs);\n });\n\n if (excludeCss) {\n var outer = document.createElement('div');\n outer.appendChild(clone);\n var src = outer.innerHTML;\n if (typeof done === 'function') done(src, width, height);else return { src: src, width: width, height: height };\n } else {\n return inlineCss(el, options).then(function (css) {\n var style = document.createElement('style');\n style.setAttribute('type', 'text/css');\n style.innerHTML = '<![CDATA[\\n' + css + '\\n]]>';\n\n var defs = document.createElement('defs');\n defs.appendChild(style);\n clone.insertBefore(defs, clone.firstChild);\n\n var outer = document.createElement('div');\n outer.appendChild(clone);\n var src = outer.innerHTML.replace(/NS\\d+:href/gi, 'xmlns:xlink=\"http://www.w3.org/1999/xlink\" xlink:href');\n\n if (typeof done === 'function') done(src, width, height);else return { src: src, width: width, height: height };\n });\n }\n });\n };\n\n out$.svgAsDataUri = function (el, options, done) {\n requireDomNode(el);\n return out$.prepareSvg(el, options).then(function (_ref4) {\n var src = _ref4.src,\n width = _ref4.width,\n height = _ref4.height;\n\n var svgXml = 'data:image/svg+xml;base64,' + window.btoa(reEncode(doctype + src));\n if (typeof done === 'function') {\n done(svgXml, width, height);\n }\n return svgXml;\n });\n };\n\n out$.svgAsPngUri = function (el, options, done) {\n requireDomNode(el);\n\n var _ref5 = options || {},\n _ref5$encoderType = _ref5.encoderType,\n encoderType = _ref5$encoderType === undefined ? 'image/png' : _ref5$encoderType,\n _ref5$encoderOptions = _ref5.encoderOptions,\n encoderOptions = _ref5$encoderOptions === undefined ? 0.8 : _ref5$encoderOptions,\n canvg = _ref5.canvg;\n\n var convertToPng = function convertToPng(_ref6) {\n var src = _ref6.src,\n width = _ref6.width,\n height = _ref6.height;\n\n var canvas = document.createElement('canvas');\n var context = canvas.getContext('2d');\n var pixelRatio = window.devicePixelRatio || 1;\n\n canvas.width = width * pixelRatio;\n canvas.height = height * pixelRatio;\n canvas.style.width = canvas.width + 'px';\n canvas.style.height = canvas.height + 'px';\n context.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n\n if (canvg) canvg(canvas, src);else context.drawImage(src, 0, 0);\n\n var png = void 0;\n try {\n png = canvas.toDataURL(encoderType, encoderOptions);\n } catch (e) {\n if (typeof SecurityError !== 'undefined' && e instanceof SecurityError || e.name === 'SecurityError') {\n console.error('Rendered SVG images cannot be downloaded in this browser.');\n return;\n } else throw e;\n }\n if (typeof done === 'function') done(png, canvas.width, canvas.height);\n return Promise.resolve(png);\n };\n\n if (canvg) return out$.prepareSvg(el, options).then(convertToPng);else return out$.svgAsDataUri(el, options).then(function (uri) {\n return new Promise(function (resolve, reject) {\n var image = new Image();\n image.onload = function () {\n return resolve(convertToPng({\n src: image,\n width: image.width,\n height: image.height\n }));\n };\n image.onerror = function () {\n reject('There was an error loading the data URI as an image on the following SVG\\n' + window.atob(uri.slice(26)) + 'Open the following link to see browser\\'s diagnosis\\n' + uri);\n };\n image.src = uri;\n });\n });\n };\n\n out$.download = function (name, uri, options) {\n if (navigator.msSaveOrOpenBlob) navigator.msSaveOrOpenBlob(uriToBlob(uri), name);else {\n var saveLink = document.createElement('a');\n if ('download' in saveLink) {\n saveLink.download = name;\n saveLink.style.display = 'none';\n document.body.appendChild(saveLink);\n try {\n var blob = uriToBlob(uri);\n var url = URL.createObjectURL(blob);\n saveLink.href = url;\n saveLink.onclick = function () {\n return requestAnimationFrame(function () {\n return URL.revokeObjectURL(url);\n });\n };\n } catch (e) {\n console.error(e);\n console.warn('Error while getting object URL. Falling back to string URL.');\n saveLink.href = uri;\n }\n saveLink.click();\n document.body.removeChild(saveLink);\n } else if (options && options.popup) {\n options.popup.document.title = name;\n options.popup.location.replace(uri);\n }\n }\n };\n\n out$.saveSvg = function (el, name, options) {\n var downloadOpts = downloadOptions(); // don't inline, can't be async\n return requireDomNodePromise(el).then(function (el) {\n return out$.svgAsDataUri(el, options || {});\n }).then(function (uri) {\n return out$.download(name, uri, downloadOpts);\n });\n };\n\n out$.saveSvgAsPng = function (el, name, options) {\n var downloadOpts = downloadOptions(); // don't inline, can't be async\n return requireDomNodePromise(el).then(function (el) {\n return out$.svgAsPngUri(el, options || {});\n }).then(function (uri) {\n return out$.download(name, uri, downloadOpts);\n });\n };\n})();","\"use strict\";\n\nvar stylesInDOM = [];\n\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n\n return result;\n}\n\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n\n identifiers.push(identifier);\n }\n\n return identifiers;\n}\n\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n\n return updater;\n}\n\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n\n var newLastIdentifiers = modulesToDom(newList, options);\n\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n\n var _index = getIndexByIdentifier(_identifier);\n\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n\n stylesInDOM.splice(_index, 1);\n }\n }\n\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n/* istanbul ignore next */\n\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n\n memo[target] = styleTarget;\n }\n\n return memo[target];\n}\n/* istanbul ignore next */\n\n\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n\n target.appendChild(style);\n}\n\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\n\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\n\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n\n var needLayer = typeof obj.layer !== \"undefined\";\n\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n\n css += obj.css;\n\n if (needLayer) {\n css += \"}\";\n }\n\n if (obj.media) {\n css += \"}\";\n }\n\n if (obj.supports) {\n css += \"}\";\n }\n\n var sourceMap = obj.sourceMap;\n\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n } // For old IE\n\n /* istanbul ignore if */\n\n\n options.styleTagTransform(css, styleElement, options.options);\n}\n\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n\n styleElement.parentNode.removeChild(styleElement);\n}\n/* istanbul ignore next */\n\n\nfunction domAPI(options) {\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\n\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n\n styleElement.appendChild(document.createTextNode(css));\n }\n}\n\nmodule.exports = styleTagTransform;","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nexport const NUCLEOTIDES = ['A', 'G', 'C', 'U', 'T'];\n\nexport const TECHNOLOGIES = {\n DNA: 'DNA',\n RNA: 'RNA',\n ASO_GAPMERS: 'ASOGapmers',\n SI_RNA: 'siRNA',\n};\n\nexport enum DEFAULT_FORMATS {\n HELM = 'HELM',\n AXOLABS = 'Axolabs',\n}\n","export const LIB_PATH = 'System:AppData/SequenceTranslator';\nexport const DEFAULT_LIB_FILENAME = 'monomer-lib.json';\n\nexport const APP_PATH = 'System:AppData/SequenceTranslator';\nexport const AXOLABS_STYLE_FILENAME = 'axolabs-style.json';\nexport const CODES_TO_HELM_DICT_FILENAME = 'formats-to-helm.json';\nexport const CODES_TO_SYMBOLS_FILENAME = 'codes-to-symbols.json';\nexport const MONOMERS_WITH_PHOSPHATE_LINKERS = 'linkers.json';\n","/* 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 {APP_PATH, AXOLABS_STYLE_FILENAME, CODES_TO_HELM_DICT_FILENAME, CODES_TO_SYMBOLS_FILENAME, MONOMERS_WITH_PHOSPHATE_LINKERS} from './const';\nimport {AxolabsStyle, FormatToHELMDict, CodeToSymbol} from './types';\n\nconst fileSource = new DG.FileSource(APP_PATH);\n\nexport let axolabsStyleMap: AxolabsStyle;\nexport let codesToHelmDictionary: FormatToHELMDict;\nexport let codesToSymbolsDictionary: CodeToSymbol;\nexport let monomersWithPhosphateLinkers: {[key: string]: string[]};\n\nexport async function getJsonData(): Promise<void> {\n const data = [axolabsStyleMap, codesToHelmDictionary, codesToSymbolsDictionary, monomersWithPhosphateLinkers];\n\n if (data.every((item) => item !== undefined))\n return;\n\n axolabsStyleMap = await parse(AXOLABS_STYLE_FILENAME);\n codesToHelmDictionary = await parse(CODES_TO_HELM_DICT_FILENAME);\n codesToSymbolsDictionary = await parse(CODES_TO_SYMBOLS_FILENAME);\n monomersWithPhosphateLinkers = await parse(MONOMERS_WITH_PHOSPHATE_LINKERS);\n}\n\nasync function parse(path: string): Promise<any> {\n let parsedJson: string;\n try {\n parsedJson = JSON.parse(await fileSource.readAsText(path))\n } catch (err: any) {\n const errMsg: string = err.hasOwnProperty('message') ? err.message : err.toString();\n throw new Error(`Error loading json from ${path}:` + errMsg);\n }\n return parsedJson;\n}\n\n","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nexport function sortByReverseLength(array: string[]): string[] {\n return array.sort((a, b) => b.length - a.length);\n}\n\nexport function download(name: string, href: string): void {\n const element = document.createElement('a');\n element.setAttribute('href', 'data:text/plain;charset=utf-8,' + href);\n element.setAttribute('download', name);\n element.click();\n}\n\nexport async function tryCatch<T>(func: () => Promise<T>, finallyFunc?: () => any, callbackName: string = 'Oligo app'): Promise<T> {\n try {\n return await func();\n } catch (err: any) {\n const errMsg: string = err.hasOwnProperty('message') ? err.message : err.toString();\n grok.shell.error(`${callbackName} error: ` + errMsg);\n throw err;\n } finally {\n if (finallyFunc)\n finallyFunc();\n }\n};\n\n","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {_package} from '../../package';\nimport {DEFAULT_FORMATS} from '../const';\n\nimport {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types';\n\nimport {HELM_REQUIRED_FIELDS as REQ, HELM_OPTIONAL_FIELDS as OPT} from '@datagrok-libraries/bio/src/utils/const';\nimport {META_FIELDS as MET} from './const';\nimport {codesToSymbolsDictionary} from '../../model/data-loading-utils/json-loader';\n\nexport class MonomerLibWrapper {\n private constructor() {\n const lib = _package.monomerLib;\n if (lib === null)\n throw new Error('SequenceTranslator: monomer library is null');\n this.lib = lib!;\n this.allMonomers = this.getAllMonomers();\n }\n\n private lib: IMonomerLib;\n private static instance?: MonomerLibWrapper;\n private allMonomers: Monomer[];\n\n private formatMonomerForViewer(sourceObj: Monomer): {[key: string]: string} {\n const formattedObject: {[key: string]: string} = {};\n formattedObject[REQ.NAME] = sourceObj[REQ.SYMBOL];\n formattedObject[REQ.SYMBOL] = sourceObj[REQ.SYMBOL];\n formattedObject[REQ.MOLFILE] = sourceObj[REQ.MOLFILE];\n const formats = this.getAllFormats();\n formats.forEach((format) => {\n if (format === DEFAULT_FORMATS.HELM)\n return;\n const map = codesToSymbolsDictionary[format];\n const codes = Object.keys(map).filter((code) => map[code] === sourceObj.symbol);\n formattedObject[format] = codes.join(', ');\n })\n\n return formattedObject;\n }\n\n private getAllMonomers(): Monomer[] {\n const polymerTypes = this.lib.getPolymerTypes();\n let result: Monomer[] = [];\n for (const polymerType of polymerTypes) {\n const monomerSymbols = this.lib.getMonomerSymbolsByType(polymerType);\n const monomersByType: Monomer[] = monomerSymbols\n .map((monomerSymbol) => this.lib.getMonomer(polymerType, monomerSymbol))\n .filter((monomer): monomer is Monomer => monomer !== null);\n result = result.concat(monomersByType);\n }\n return result;\n }\n\n private getMonomer(monomerSymbol: string): Monomer {\n const monomer = this.lib.getMonomer('RNA', monomerSymbol);\n if (monomer === undefined)\n throw new Error(`SequenceTranslator: no monomer with symbol ${monomerSymbol}`);\n return monomer!;\n }\n\n static getInstance(): MonomerLibWrapper {\n if (MonomerLibWrapper.instance === undefined)\n MonomerLibWrapper.instance = new MonomerLibWrapper();\n return MonomerLibWrapper.instance!;\n }\n\n getMolfileBySymbol(monomerSymbol: string): string {\n const monomer = this.getMonomer(monomerSymbol);\n return monomer.molfile;\n }\n\n getNaturalAnalogBySymbol(monomerSymbol: string): string {\n const monomer = this.getMonomer(monomerSymbol);\n const naturalAnalog = monomer.naturalAnalog;\n if (!naturalAnalog)\n throw new Error(`ST: no natural analog for ${monomerSymbol}`);\n return naturalAnalog!;\n }\n\n // todo: a better criterion\n isModification(monomerSymbol: string): boolean {\n const molfile = this.getMolfileBySymbol(monomerSymbol);\n return (molfile.includes('MODIFICATION')) ? true : false;\n }\n\n getCodeToSymbolMap(format: string): Map<string, string> {\n return new Map<string, string>(Object.entries(codesToSymbolsDictionary[format]));\n }\n\n getCodesByFormat(format: string): string[] {\n return Object.keys(codesToSymbolsDictionary[format]);\n }\n\n getAllFormats(): string[] {\n return Object.keys(codesToSymbolsDictionary);\n }\n\n getTableForViewer(): DG.DataFrame {\n const formattedObjects = this.allMonomers.map((monomer) => this.formatMonomerForViewer(monomer));\n const df = DG.DataFrame.fromObjects(formattedObjects)!;\n return df;\n }\n\n getCodesToWeightsMap(): Map<string, number> {\n const codesToWeightsMap = new Map<string, number>();\n Object.entries(codesToSymbolsDictionary).forEach(([_, dict]) => {\n Object.entries(dict).forEach(([code, monomerSymbol]) => {\n const monomer = this.getMonomer(monomerSymbol);\n const weight = monomer[OPT.META]?.[MET.MOLWEIGHT];\n codesToWeightsMap.set(code, weight);\n });\n });\n return codesToWeightsMap;\n }\n}\n","import {NUCLEOTIDES} from '../const';\nimport {MonomerLibWrapper} from '../monomer-lib/lib-wrapper';\nimport {sortByReverseLength} from '../helpers';\nimport {DEFAULT_FORMATS} from '../const';\n\nexport class SequenceValidator {\n constructor(private sequence: string) {\n this.libWrapper = MonomerLibWrapper.getInstance();\n };\n private libWrapper: MonomerLibWrapper;\n\n getInvalidCodeIndex(format: string): number {\n if (format === DEFAULT_FORMATS.HELM)\n return this.sequence.length;\n const firstUniqueCharacters = ['r', 'd']; // what for?\n const codes = sortByReverseLength(\n this.libWrapper.getCodesByFormat(format)\n );\n let indexOfFirstInvalidChar = 0;\n while (indexOfFirstInvalidChar < this.sequence.length) {\n const matchedCode = codes.find((code) => {\n const subSequence = this.sequence.substring(indexOfFirstInvalidChar, indexOfFirstInvalidChar + code.length);\n return code === subSequence;\n });\n\n if (!matchedCode) break;\n\n // todo: refactor the vague condition\n if ( // for mistake pattern 'rAA'\n indexOfFirstInvalidChar > 1 &&\n NUCLEOTIDES.includes(this.sequence[indexOfFirstInvalidChar]) &&\n firstUniqueCharacters.includes(this.sequence[indexOfFirstInvalidChar - 2])\n ) break;\n\n if ( // for mistake pattern 'ArA'\n firstUniqueCharacters.includes(this.sequence[indexOfFirstInvalidChar + 1]) &&\n NUCLEOTIDES.includes(this.sequence[indexOfFirstInvalidChar])\n ) {\n indexOfFirstInvalidChar++;\n break;\n }\n indexOfFirstInvalidChar += matchedCode.length;\n }\n if (indexOfFirstInvalidChar === this.sequence.length)\n indexOfFirstInvalidChar = -1\n return indexOfFirstInvalidChar;\n }\n\n isValidSequence(format: string): boolean {\n return this.getInvalidCodeIndex(format) === -1;\n }\n}\n","export const GROUP_TYPE = {\n NUCLEOSIDE: 'nucleoside',\n LINKAGE: 'phosphateBackbone',\n} as const;\n\nexport const PHOSPHATE_SYMBOL = 'p';\n\nexport const UNKNOWN_SYMBOL = '<?>';\n","import {DEFAULT_FORMATS, NUCLEOTIDES} from '../const';\nimport {UNKNOWN_SYMBOL} from './const';\nimport {FormatConverter} from './format-converter';\nimport {codesToHelmDictionary} from '../data-loading-utils/json-loader';\nimport {MonomerLibWrapper} from '../monomer-lib/lib-wrapper';\n\nexport function getTranslatedSequences(sequence: string, indexOfFirstInvalidChar: number, sourceFormat: string): {[key: string]: string} {\n const supportedFormats = Object.keys(codesToHelmDictionary).concat([DEFAULT_FORMATS.HELM]) as string[];\n\n if (!sequence || (indexOfFirstInvalidChar !== -1 && sourceFormat !== DEFAULT_FORMATS.HELM))\n return {};\n\n if (!supportedFormats.includes(sourceFormat))\n throw new Error(`${sourceFormat} format is not supported by SequenceTranslator`)\n\n const outputFormats = supportedFormats.filter((el) => el != sourceFormat)\n .sort((a, b) => a.localeCompare(b));\n const converter = new FormatConverter(sequence, sourceFormat);\n const result = Object.fromEntries(\n outputFormats.map((format) => {\n let translation;\n try {\n translation = converter.convertTo(format);\n } catch {\n translation = null;\n }\n return [format, translation];\n }).filter(([format, translation]) => translation)\n )\n const helm = (sourceFormat === DEFAULT_FORMATS.HELM) ? sequence : result[DEFAULT_FORMATS.HELM];\n const nucleotides = getNucleotidesSequence(helm, MonomerLibWrapper.getInstance());\n if (nucleotides)\n result['Nucleotides'] = nucleotides;\n return result;\n}\n\nexport function getNucleotidesSequence(helmString: string, monomerLib: MonomerLibWrapper): string | null {\n const re = new RegExp('\\\\([^()]*\\\\)', 'g');\n const branches = helmString.match(re);\n if (!branches)\n return null;\n const nucleotides = branches!.map((branch) => {\n const stripped = branch.replace(/[\\[\\]()]/g, '');\n if (NUCLEOTIDES.includes(stripped))\n return stripped;\n return monomerLib.getNaturalAnalogBySymbol(stripped);\n }).map((el) => el ? el : UNKNOWN_SYMBOL).join('');\n return nucleotides;\n}\n","/* 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 {codesToHelmDictionary} from '../data-loading-utils/json-loader';\nimport {CodesInfo} from '../data-loading-utils/types';\nimport {DEFAULT_FORMATS} from '../const';\nimport {GROUP_TYPE, PHOSPHATE_SYMBOL} from '../translator-app/const';\n\nconst inverseLengthComparator = (a: string, b: string) => b.length - a.length;\n\nexport class FormatHandler {\n constructor() {\n this.formats = this.getFormats();\n }\n\n /** Includes all formats except HELM (the \"default\" one) */\n private formats: string[];\n\n /** All format names except HELM (the \"default\" one) */\n getFormatNames(): string[] {\n return this.formats.sort();\n };\n\n getCodesByFormat(format: string): string[] {\n this.validateFormat(format);\n\n if (this.isHelm(format))\n throw new Error(`Codes cannot be obtained for HELM`);\n return this.getFormatCodes(format);\n }\n\n getHelmToFormatDict(format: string): {[key: string]: string} {\n this.validateFormat(format);\n\n const codesInfoObject = codesToHelmDictionary[format] as CodesInfo;\n const dict = getHelmToCodeDict(codesInfoObject);\n return dict;\n }\n\n getFormatToHelmDict(format: string): {[key: string]: string} {\n this.validateFormat(format);\n\n const codesInfoObject = codesToHelmDictionary[format] as CodesInfo;\n const dict = Object.assign({}, ...Object.values(codesInfoObject)) as {[code: string]: string};\n return dict;\n }\n\n /** Get helm codes for the specified format */\n getTargetFormatHelmCodes(format: string): string[] {\n this.validateFormat(format);\n\n const dict = this.getHelmToFormatDict(format);\n const helmCodes = Object.keys(dict).sort(inverseLengthComparator);\n return helmCodes;\n }\n\n getTargetFormatHelmCodesRegExp(format: string): RegExp {\n this.validateFormat(format);\n\n const helmCodes = this.getTargetFormatHelmCodes(format);\n const helmRegExp = new RegExp(getRegExpPattern(helmCodes) + '|.', 'g');\n return helmRegExp;\n }\n\n getFormatRegExp(format: string): RegExp {\n this.validateFormat(format);\n\n if (this.isHelm(format))\n throw new Error(`Helm RegExp can be built for non-HELM target formats`);\n return this.getNonHelmFormatRegExp(format);\n }\n\n getPhosphateHelmCodesRegExp(format: string): RegExp {\n this.validateFormat(format);\n\n const codesInfoObject = codesToHelmDictionary[format] as CodesInfo;\n const phosphateHELMCodes = Array.from(\n new Set(Object.values(codesInfoObject[GROUP_TYPE.LINKAGE]))\n ).sort(inverseLengthComparator);\n const phosphateHELMPattern = getRegExpPattern(phosphateHELMCodes);\n const phosphateRegExp = new RegExp(`${PHOSPHATE_SYMBOL}\\.(${phosphateHELMPattern})`, 'g');\n return phosphateRegExp;\n }\n\n isValidFormat(format: string): boolean {\n return this.formats.includes(format);\n }\n\n private getFormats(): string[] {\n return Object.keys(codesToHelmDictionary);\n }\n\n private validateFormat(format: string) {\n if (!this.isValidFormat(format))\n throw new Error(`Invalid format: ${format}`);\n }\n\n private isHelm(format: string): boolean {\n return format === DEFAULT_FORMATS.HELM;\n }\n\n private getFormatCodes(format: string): string[] {\n const dict = this.getFormatToHelmDict(format);\n const formatCodes = Object.keys(dict).sort(inverseLengthComparator);\n return formatCodes;\n }\n \n private getNonHelmFormatRegExp(format: string): RegExp {\n const formatCodes = this.getCodesByFormat(format);\n const formatRegExp = new RegExp(getRegExpPattern(formatCodes) + '|\\\\([^()]*\\\\)|.', 'g'); // the added group before '|.' is to avoid mismatch inside parenths\n return formatRegExp;\n }\n}\n\nexport function getRegExpPattern(arr: string[]): string {\n const negativeLookBehind = '(?<!\\\\([^()]*)'; // not '(' followed by non-parenths\n const negativeLookAhead = '(?![^()]*\\\\))'; // not ')' preceded by non-parenths\n const escaped = arr.map((key) => key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .map((key) => {\n if (!key.includes('(') && !key.includes(')'))\n return `${negativeLookBehind}${key}${negativeLookAhead}`;\n return key;\n });\n const result = escaped.join('|');\n return result;\n}\n\nfunction getHelmToCodeDict(infoObj: CodesInfo) {\n const result: {[key: string]: string | string[]} = {};\n Object.values(infoObj).forEach((obj: {[code: string]: string}) => {\n Object.entries(obj).forEach(([code, helm]) => {\n const key = helm.replace(/\\)p/g, ')').replace(/\\]p/g, ']');\n if (result[key] === undefined) {\n result[key] = [code];\n } else {\n (result[key] as string[]).push(code);\n }\n })\n });\n Object.entries(result).forEach(([key, value]) => {\n const sorted = (value as string[]).sort(inverseLengthComparator);\n result[key] = sorted[0] as string;\n })\n return result as {[key: string]: string};\n}\n","import * as DG from 'datagrok-api/dg';\nimport {DEFAULT_FORMATS} from '../const';\nimport {PHOSPHATE_SYMBOL, UNKNOWN_SYMBOL} from './const';\nimport {FormatHandler, getRegExpPattern} from '../parsing-validation/format-handler';\n\nconst HELM_WRAPPER = {\n LEFT: 'RNA1{',\n RIGHT: '}$$$$',\n};\n\nexport class FormatConverter {\n constructor(private readonly sequence: string, private readonly sourceFormat: string) { };\n\n private formats = new FormatHandler();\n\n convertTo(targetFormat: string): string {\n const formats = this.formats.getFormatNames();\n\n if (this.sourceFormat === DEFAULT_FORMATS.HELM && formats.includes(targetFormat))\n return this.helmToFormat(this.sequence, targetFormat);\n else if (formats.includes(this.sourceFormat) && targetFormat === DEFAULT_FORMATS.HELM)\n return this.formatToHelm(this.sequence, this.sourceFormat);\n else if ([this.sourceFormat, targetFormat].every((el) => formats.includes(el))) {\n const helm = this.formatToHelm(this.sequence, this.sourceFormat);\n return this.helmToFormat(helm, targetFormat);\n }\n else {\n throw new Error (`ST: unsupported translation direction ${this.sourceFormat} -> ${targetFormat}`);\n }\n }\n\n private helmToFormat(helmSequence: string, targetFormat: string): string {\n const wrapperRegExp = new RegExp(getRegExpPattern(Object.values(HELM_WRAPPER)), 'g')\n let result = helmSequence.replace(wrapperRegExp, '');\n\n const dict = this.formats.getHelmToFormatDict(targetFormat);\n const helmCodes = this.formats.getTargetFormatHelmCodes(targetFormat);\n const helmRegExp = this.formats.getTargetFormatHelmCodesRegExp(targetFormat);\n\n result = result.replace(helmRegExp, (match) => {\n return helmCodes.includes(match) ? dict[match] :\n (match === 'p' || match === '.') ? match : '?';\n }).replace(/\\?+/g, UNKNOWN_SYMBOL).replace(/p\\.|\\./g, '');\n result = result.replace(/<empty>/g, '');\n // remove double slash in LCMS codes\n result = result.replace(/\\/\\//g, '/');\n return result;\n }\n\n private formatToHelm(sequence: string, sourceFormat: string): string {\n const dict = this.formats.getFormatToHelmDict(sourceFormat);\n const formatCodes = this.formats.getCodesByFormat(sourceFormat);\n const formatRegExp = this.formats.getFormatRegExp(sourceFormat);\n const phosphateRegExp = this.formats.getPhosphateHelmCodesRegExp(sourceFormat);\n\n let helm = sequence.replace(formatRegExp, (match) => {\n const result = formatCodes.includes(match) ? dict[match] + '.' : '?';\n return result;\n });\n helm = helm.replace(/\\?+/g, `${UNKNOWN_SYMBOL}.`);\n helm = helm.slice(0, -1); // strip last dot\n if (helm[helm.length - 1] === PHOSPHATE_SYMBOL)\n helm = helm.slice(0, -1);\n helm = helm.replace(phosphateRegExp, (match, group) => group);\n helm = helm.replace(/<empty>/g, '');\n return `${HELM_WRAPPER.LEFT + helm + HELM_WRAPPER.RIGHT}`;\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = ui;","const __WEBPACK_NAMESPACE_OBJECT__ = rxjs;","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./translator-app.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./translator-app.css\";\n export default content && content.locals ? content.locals : undefined;\n","const __WEBPACK_NAMESPACE_OBJECT__ = $;","/** Constants related to the structure of Molfile V2K */\nexport var V2K_CONST;\n(function (V2K_CONST) {\n V2K_CONST[\"HEADER\"] = \"V2000\";\n V2K_CONST[V2K_CONST[\"NUM_OF_HEADER_LINES\"] = 3] = \"NUM_OF_HEADER_LINES\";\n V2K_CONST[V2K_CONST[\"NUM_OF_COUNTS_DIGITS\"] = 3] = \"NUM_OF_COUNTS_DIGITS\";\n V2K_CONST[V2K_CONST[\"ATOM_TYPE_COL\"] = 4] = \"ATOM_TYPE_COL\";\n V2K_CONST[V2K_CONST[\"FIRST_BONDED_ATOM_COL\"] = 1] = \"FIRST_BONDED_ATOM_COL\";\n V2K_CONST[V2K_CONST[\"BOND_TYPE_COL\"] = 3] = \"BOND_TYPE_COL\";\n V2K_CONST[V2K_CONST[\"RGP_SHIFT\"] = 8] = \"RGP_SHIFT\";\n V2K_CONST[\"RGP_LINE\"] = \"M RGP\";\n V2K_CONST[\"A_LINE\"] = \"A \";\n V2K_CONST[\"END\"] = \"M END\";\n})(V2K_CONST || (V2K_CONST = {}));\nexport const MALFORMED_MOL_V2000 = `\nMalformed\n\n 0 0 0 0 0 0 0 0 0 0999 V2000\nM END`;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS12MmstY29uc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtb2xmaWxlLXYyay1jb25zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3REFBd0Q7QUFDeEQsTUFBTSxDQUFOLElBQVksU0FlWDtBQWZELFdBQVksU0FBUztJQUNuQiw2QkFBZ0IsQ0FBQTtJQUNoQix1RUFBdUIsQ0FBQTtJQUV2Qix5RUFBd0IsQ0FBQTtJQUN4QiwyREFBaUIsQ0FBQTtJQUNqQiwyRUFBeUIsQ0FBQTtJQUN6QiwyREFBaUIsQ0FBQTtJQUdqQixtREFBYSxDQUFBO0lBQ2IsZ0NBQW1CLENBQUE7SUFDbkIsMkJBQWMsQ0FBQTtJQUVkLDJCQUFjLENBQUE7QUFDaEIsQ0FBQyxFQWZXLFNBQVMsS0FBVCxTQUFTLFFBZXBCO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7Ozs7T0FJNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBDb25zdGFudHMgcmVsYXRlZCB0byB0aGUgc3RydWN0dXJlIG9mIE1vbGZpbGUgVjJLICovXG5leHBvcnQgZW51bSBWMktfQ09OU1Qge1xuICBIRUFERVIgPSAnVjIwMDAnLFxuICBOVU1fT0ZfSEVBREVSX0xJTkVTID0gMyxcblxuICBOVU1fT0ZfQ09VTlRTX0RJR0lUUyA9IDMsXG4gIEFUT01fVFlQRV9DT0wgPSA0LFxuICBGSVJTVF9CT05ERURfQVRPTV9DT0wgPSAxLFxuICBCT05EX1RZUEVfQ09MID0gMyxcblxuXG4gIFJHUF9TSElGVCA9IDgsXG4gIFJHUF9MSU5FID0gJ00gIFJHUCcsXG4gIEFfTElORSA9ICdBICAnLFxuXG4gIEVORCA9ICdNICBFTkQnLFxufVxuXG5leHBvcnQgY29uc3QgTUFMRk9STUVEX01PTF9WMjAwMCA9IGBcbk1hbGZvcm1lZFxuXG4gIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDA5OTkgVjIwMDBcbk0gIEVORGA7XG4iXX0=","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./colored-text-input.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./colored-text-input.css\";\n export default content && content.locals ? content.locals : undefined;\n","/* 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 {MolfileHandler} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\n\nimport $ from 'cash-dom';\n\nconst InvalidMolfileError = class extends Error {\n constructor(message: string) { super(message); }\n};\n\nexport class MoleculeImage {\n constructor(molblok: string) {\n this.molblock = molblok;\n }\n\n private _validMolBlock: string;\n get molblock(): string { return this._validMolBlock; }\n\n set molblock(value: string) {\n if (value === '') {\n this._validMolBlock = value;\n return;\n }\n\n try {\n this.validateMolBlock(value);\n } catch (error) {\n if (error instanceof InvalidMolfileError)\n value = '';\n const errorMessage = errorToConsole(error);\n console.error(errorMessage);\n }\n this._validMolBlock = value;\n }\n\n private validateMolBlock(molblock: string): void {\n // todo: add a sound criterion\n if (molblock === '')\n throw new InvalidMolfileError('MoleculeImage: invalid molblock');\n }\n\n private async drawMolBlockOnCanvas(canvas: HTMLCanvasElement): Promise<void> {\n try {\n await grok.functions.call('Chem:canvasMol', {\n x: 0, y: 0, w: canvas.width, h: canvas.height, canvas: canvas,\n molString: this.molblock, scaffoldMolString: '',\n options: {normalizeDepiction: false, straightenDepiction: false}\n });\n } catch (err) {\n const errStr = errorToConsole(err);\n console.error(errStr);\n }\n };\n\n private getMoleculeDimensions(): {height: number, width: number} {\n const molData = MolfileHandler.getInstance(this.molblock);\n const width: number = Math.max(...molData.x) - Math.min(...molData.x);\n const height: number = Math.max(...molData.y) - Math.min(...molData.y);\n return {height: height, width: width};\n }\n\n private async zoomIn(): Promise<void> {\n const dialog = ui.dialog({title: 'Molecule', showFooter:false});\n const dialogDivStyle = {\n overflowX: 'scroll',\n };\n\n const height = $(window).height() * 0.7;\n const molDimensions = this.getMoleculeDimensions();\n\n const zoomRatio = height / molDimensions.height;\n\n const dialogCanvasHeight = height;\n const dialogCanvasWidth = molDimensions.width * zoomRatio;\n\n const dialogCanvas = ui.canvas(dialogCanvasWidth, dialogCanvasHeight);\n await this.drawMolBlockOnCanvas(dialogCanvas);\n \n const dialogDiv = ui.block([dialogCanvas], {style: dialogDivStyle});\n dialog.add(dialogDiv).showModal(true);\n\n $(dialog.root).find('.d4-dialog-contents').removeClass('ui-form');\n $(dialog.root).find('.d4-dialog-contents').removeClass('ui-panel');\n $(dialog.root).find('.d4-dialog-contents').addClass('ui-box');\n $(dialog.root).find('.d4-dialog-contents').css('padding', '0');\n }\n\n public async drawMolecule(\n moleculeImgDiv: HTMLDivElement,\n canvasWidth: number, canvasHeight: number\n ): Promise<void> {\n moleculeImgDiv.innerHTML = '';\n\n const canvas = ui.canvas(canvasWidth * window.devicePixelRatio, canvasHeight * window.devicePixelRatio);\n\n // Draw zoomed-out molecule\n canvas.style.width = `${canvasWidth}px`;\n canvas.style.height = `${canvasHeight}px`;\n canvas.style.cursor = 'zoom-in';\n /*\n canvas.style.borderStyle = 'solid';\n canvas.style.borderRadius = '1px';\n canvas.style.borderColor = 'var(--grey-2)';\n canvas.style.borderWidth = 'thin';\n */\n this.drawMolBlockOnCanvas(canvas);\n\n // Dialog with zoomed-in molecule\n canvas.addEventListener('click', async () => {\n await this.zoomIn();\n });\n //$(canvas).on('click', async () => { await this.zoomIn(); });\n //$(canvas).on('mouseover', () => $(canvas).css('cursor', 'grab')); // for some reason 'zoom-in' value wouldn't work\n //$(canvas).on('mouseout', () => $(canvas).css('cursor', 'default'));\n\n moleculeImgDiv.append(ui.tooltip.bind(canvas,'Click to zoom'));\n }\n}\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./structure-app.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./structure-app.css\";\n export default content && content.locals ? content.locals : undefined;\n","import {NUCLEOTIDES} from '../const';\nimport {axolabsStyleMap} from '../data-loading-utils/json-loader';\n\nexport function isOverhang(modification: string): boolean {\n return modification.slice(-3) === '(o)';\n}\n\nexport function isOneDigitNumber(n: number): boolean {\n return n < 10;\n}\n\n// https://uxdesign.cc/star-rating-make-svg-great-again-d4ce4731347e\nexport function getPointsToDrawStar(centerX: number, centerY: number): string {\n const innerCirclePoints = 5; // a 5 point star\n const innerRadius = 15 / innerCirclePoints;\n const innerOuterRadiusRatio = 2; // outter circle is x2 the inner\n const outerRadius = innerRadius * innerOuterRadiusRatio;\n const angle = Math.PI / innerCirclePoints;\n const angleOffsetToCenterStar = 60;\n const totalNumberOfPoints = innerCirclePoints * 2; // 10 in a 5-points star\n\n let points = '';\n for (let i = 0; i < totalNumberOfPoints; i++) {\n const r = (i % 2 === 0) ? outerRadius : innerRadius;\n const currentX = centerX + Math.cos(i * angle + angleOffsetToCenterStar) * r;\n const currentY = centerY + Math.sin(i * angle + angleOffsetToCenterStar) * r;\n points += `${currentX},${currentY} `;\n }\n return points;\n}\n\nexport function countOverhangsOnTheRightEdge(modifications: string[]): number {\n let i = 0;\n while (i < modifications.length && isOverhang(modifications[i]))\n i++;\n return (i === modifications.length - 1) ? 0 : i;\n}\n\nexport function textWidth(text: string, font: number): number {\n const context = document.createElement('canvas').getContext('2d');\n // @ts-ignore\n context.font = String(font);\n // @ts-ignore\n return 2 * context.measureText(text).width;\n}\n\nexport function textInsideCircle(bases: string[], index: number): string {\n return (isOverhang(bases[index]) || !NUCLEOTIDES.includes(bases[index])) ? '' : bases[index];\n}\n\nexport function fontColorVisibleOnBackground(base: string): string {\n const AXOLABS_MAP = axolabsStyleMap;\n const rgbIntList = AXOLABS_MAP[base].color.match(/\\d+/g)!.map((e) => Number(e));\n return (rgbIntList[0] * 0.299 + rgbIntList[1] * 0.587 + rgbIntList[2] * 0.114) > 186 ? '#33333' : '#ffffff';\n}\n\nexport function baseColor(base: string): string {\n const AXOLABS_MAP = axolabsStyleMap;\n return AXOLABS_MAP[base].color;\n}\n\nexport const svg = {\n xmlns: 'http://www.w3.org/2000/svg',\n render: function(width: number, height: number): Element {\n const e = document.createElementNS(this.xmlns, 'svg');\n e.setAttribute('id', 'mySvg');\n e.setAttribute('width', String(width));\n e.setAttribute('height', String(height));\n return e;\n },\n circle: function(x: number, y: number, radius: number, color: string): Element {\n const e = document.createElementNS(this.xmlns, 'circle');\n e.setAttribute('cx', String(x));\n e.setAttribute('cy', String(y));\n e.setAttribute('r', String(radius));\n e.setAttribute('fill', color);\n return e;\n },\n text: function(text: string, x: number, y: number, fontSize: number, color: string): Element {\n const e = document.createElementNS(this.xmlns, 'text');\n e.setAttribute('x', String(x));\n e.setAttribute('y', String(y));\n e.setAttribute('font-size', String(fontSize));\n e.setAttribute('font-weight', 'normal');\n e.setAttribute('font-family', 'Arial');\n e.setAttribute('fill', color);\n e.innerHTML = text;\n return e;\n },\n star: function(x: number, y: number, fill: string): Element {\n const e = document.createElementNS(this.xmlns, 'polygon');\n e.setAttribute('points', getPointsToDrawStar(x, y));\n e.setAttribute('fill', fill);\n return e;\n },\n};\n","import {NUCLEOTIDES} from '../const';\nimport {isOverhang, svg, textWidth, countOverhangsOnTheRightEdge, baseColor, textInsideCircle,\n fontColorVisibleOnBackground, isOneDigitNumber} from './helpers';\n\nconst BASE_RADIUS = 15;\nconst BASE_DIAMETER = 2 * BASE_RADIUS;\nconst shiftToAlignTwoDigitNumberNearCircle = -10;\nconst shiftToAlignOneDigitNumberNearCircle = -5;\nconst LEGEND_RADIUS = 6;\nconst PS_LINKAGE_RADIUS = 5;\nconst BASE_FONT_SIZE = 17;\nconst LEGEND_FONT_SIZE = 14;\nconst PS_LINKAGE_COLOR = 'red';\nconst FONT_COLOR = 'var(--grey-6)';\nconst TITLE_FONT_COLOR = 'black';\nconst MODIFICATIONS_COLOR = 'red';\nconst SS_LEFT_TEXT = 'SS: 5\\'';\nconst AS_LEFT_TEXT = 'AS: 3\\'';\nconst SS_RIGHT_TEXT = '3\\'';\nconst AS_RIGHT_TEXT = '5\\'';\n\nconst WIDTH_OF_LEFT_TEXT = Math.max(\n textWidth(SS_LEFT_TEXT, BASE_FONT_SIZE),\n textWidth(AS_LEFT_TEXT, BASE_FONT_SIZE),\n);\n\nconst WIDTH_OF_RIGHT_TEXT = Math.max(\n textWidth(SS_RIGHT_TEXT, BASE_FONT_SIZE),\n textWidth(AS_RIGHT_TEXT, BASE_FONT_SIZE),\n);\n\nconst X = {\n TITLE: BASE_RADIUS, // Math.round(width / 4),\n LEFT_TEXTS: 0,\n};\nconst X_OF_LEFT_MODIFICATIONS = X.LEFT_TEXTS + WIDTH_OF_LEFT_TEXT - 5;\n\nconst Y = {\n TITLE: BASE_RADIUS,\n SS_INDICES: 2 * BASE_RADIUS,\n SS_CIRCLES: 3.5 * BASE_RADIUS,\n SS_TEXTS: 4 * BASE_RADIUS,\n AS_CIRCLES: 6.5 * BASE_RADIUS,\n AS_TEXTS: 7 * BASE_RADIUS,\n AS_INDICES: 8.5 * BASE_RADIUS,\n comment: (asExists: boolean) => (asExists) ? 11 * BASE_RADIUS : 8.5 * BASE_RADIUS,\n circlesInLegends: (asExists: boolean) => (asExists) ? 9.5 * BASE_RADIUS : 6 * BASE_RADIUS,\n textLegend: (asExists: boolean) => (asExists) ? 10 * BASE_RADIUS - 3 : Y.AS_CIRCLES - 3,\n svgHeight: (asExists: boolean) => (asExists) ? 11 * BASE_RADIUS : 9 * BASE_RADIUS,\n};\n\nexport function drawAxolabsPattern(\n patternName: string, asExists: boolean, ssBases: string[],\n asBases: string[], ssPtoStatuses: boolean[], asPtoStatuses: boolean[],\n ss3Modification: string, ss5Modification: string,\n as3Modification: string, as5Modification: string, comment: string,\n enumerateModifications: string[],\n): Element {\n function equidistantXForLegend(index: number): number {\n return Math.round((index + startFrom) * width / (uniqueBases.length + startFrom) + LEGEND_RADIUS);\n }\n\n function xOfBaseCircles(index: number, rightOverhangs: number): number {\n return widthOfRightModification +\n (resultingNumberOfNucleotidesInStrands - index + rightOverhangs + 1) * BASE_DIAMETER;\n }\n\n function shiftToAlignNumberNearCircle(bases: string[], generalIndex: number, nucleotideIndex: number): number {\n return (isOneDigitNumber(nucleotideIndex) || NUCLEOTIDES.includes(bases[generalIndex])) ?\n shiftToAlignOneDigitNumberNearCircle : shiftToAlignTwoDigitNumberNearCircle;\n }\n\n ssBases = ssBases.reverse();\n ssPtoStatuses = ssPtoStatuses.reverse();\n\n const ssRightOverhangs = countOverhangsOnTheRightEdge(ssBases);\n const asRightOverhangs = countOverhangsOnTheRightEdge(asBases);\n\n const resultingNumberOfNucleotidesInStrands = Math.max(\n ssBases.length - ssRightOverhangs,\n asBases.length - asRightOverhangs,\n );\n\n const widthOfRightOverhangs = Math.max(ssRightOverhangs, asRightOverhangs);\n const widthOfBases = BASE_DIAMETER * (resultingNumberOfNucleotidesInStrands + widthOfRightOverhangs);\n\n const widthOfLeftModification = Math.max(\n textWidth(ss3Modification, BASE_FONT_SIZE),\n textWidth(as5Modification, BASE_FONT_SIZE),\n );\n\n const widthOfRightModification = Math.max(\n textWidth(ss5Modification, BASE_FONT_SIZE),\n textWidth(as3Modification, BASE_FONT_SIZE),\n );\n\n const uniqueBases = asExists ?\n [...new Set(ssBases.concat(asBases))] :\n [...new Set(ssBases)];\n\n const isPtoExist = asExists ?\n ssPtoStatuses.concat(asPtoStatuses).includes(true) :\n ssPtoStatuses.includes(true);\n\n const startFrom = isPtoExist ? 1 : 0;\n\n const xOfSsRightModifications = ssRightOverhangs * BASE_DIAMETER + xOfBaseCircles(-0.5, 0);\n const xOfAsRightModifications = asRightOverhangs * BASE_DIAMETER + xOfBaseCircles(-0.5, 0);\n\n const xOfRightTexts = Math.max(xOfSsRightModifications, xOfAsRightModifications) + widthOfLeftModification +\n BASE_DIAMETER * widthOfRightOverhangs;\n\n const width = WIDTH_OF_LEFT_TEXT + widthOfLeftModification + widthOfBases + widthOfRightModification +\n WIDTH_OF_RIGHT_TEXT + BASE_DIAMETER;\n const image = svg.render(width, Y.svgHeight(asExists));\n\n image.append(\n svg.text(SS_LEFT_TEXT, X.LEFT_TEXTS, Y.SS_TEXTS, BASE_FONT_SIZE, FONT_COLOR),\n asExists ? svg.text(AS_LEFT_TEXT, X.LEFT_TEXTS, Y.AS_TEXTS, BASE_FONT_SIZE, FONT_COLOR) : '',\n svg.text(SS_RIGHT_TEXT, xOfRightTexts, Y.SS_TEXTS, BASE_FONT_SIZE, FONT_COLOR),\n asExists ? svg.text(AS_RIGHT_TEXT, xOfRightTexts, Y.AS_TEXTS, BASE_FONT_SIZE, FONT_COLOR) : '',\n svg.text(ss5Modification, X_OF_LEFT_MODIFICATIONS, Y.SS_TEXTS, BASE_FONT_SIZE, MODIFICATIONS_COLOR),\n asExists ? svg.text(as3Modification, X_OF_LEFT_MODIFICATIONS, Y.AS_TEXTS, BASE_FONT_SIZE, MODIFICATIONS_COLOR) : '',\n svg.text(ss3Modification, xOfSsRightModifications, Y.SS_TEXTS, BASE_FONT_SIZE, MODIFICATIONS_COLOR),\n asExists ? svg.text(as5Modification, xOfAsRightModifications, Y.AS_TEXTS, BASE_FONT_SIZE, MODIFICATIONS_COLOR) : '',\n svg.text(comment, X.LEFT_TEXTS, Y.comment(asExists), LEGEND_FONT_SIZE, FONT_COLOR),\n isPtoExist ? svg.star(BASE_RADIUS, Y.circlesInLegends(asExists), PS_LINKAGE_COLOR) : '',\n isPtoExist ? svg.text('ps linkage', 2 * BASE_RADIUS - 8, Y.textLegend(asExists), LEGEND_FONT_SIZE, FONT_COLOR) : '',\n );\n\n const numberOfSsNucleotides = ssBases.filter((value) => !isOverhang(value)).length;\n let nucleotideCounter = numberOfSsNucleotides;\n for (let i = ssBases.length - 1; i > -1; i--) {\n const xOfNumbers = xOfBaseCircles(i, ssRightOverhangs) +\n shiftToAlignNumberNearCircle(ssBases, ssBases.length - i, numberOfSsNucleotides - nucleotideCounter);\n if (!isOverhang(ssBases[i]))\n nucleotideCounter--;\n const n = (!isOverhang(ssBases[i]) && enumerateModifications.includes(ssBases[i])) ?\n String(numberOfSsNucleotides - nucleotideCounter) : '';\n image.append(\n svg.text(n, xOfNumbers, Y.SS_INDICES, LEGEND_FONT_SIZE, FONT_COLOR),\n svg.circle(xOfBaseCircles(i, ssRightOverhangs), Y.SS_CIRCLES, BASE_RADIUS, baseColor(ssBases[i])),\n svg.text(textInsideCircle(ssBases, i), xOfNumbers, Y.SS_TEXTS, BASE_FONT_SIZE,\n fontColorVisibleOnBackground(ssBases[i])),\n ssPtoStatuses[i] ?\n svg.star(xOfBaseCircles(i, ssRightOverhangs) + BASE_RADIUS, Y.SS_TEXTS + PS_LINKAGE_RADIUS, PS_LINKAGE_COLOR) :\n '',\n );\n }\n image.append(\n ssPtoStatuses[ssBases.length] ?\n svg.star(xOfBaseCircles(ssBases.length, ssRightOverhangs) +\n BASE_RADIUS, Y.SS_TEXTS + PS_LINKAGE_RADIUS, PS_LINKAGE_COLOR) : '',\n );\n\n const numberOfAsNucleotides = asBases.filter((value) => !isOverhang(value)).length;\n if (asExists) {\n let nucleotideCounter = numberOfAsNucleotides;\n for (let i = asBases.length - 1; i > -1; i--) {\n if (!isOverhang(asBases[i]))\n nucleotideCounter--;\n const xOfNumbers = xOfBaseCircles(i, asRightOverhangs) +\n shiftToAlignNumberNearCircle(asBases, i, nucleotideCounter + 1);\n const n = (!isOverhang(asBases[i]) && enumerateModifications.includes(asBases[i])) ?\n String(nucleotideCounter + 1) : '';\n image.append(\n svg.text(n, xOfNumbers, Y.AS_INDICES, LEGEND_FONT_SIZE, FONT_COLOR),\n svg.circle(xOfBaseCircles(i, asRightOverhangs), Y.AS_CIRCLES, BASE_RADIUS, baseColor(asBases[i])),\n svg.text(textInsideCircle(asBases, i),\n xOfBaseCircles(i, asRightOverhangs) + shiftToAlignNumberNearCircle(asBases, i, nucleotideCounter + 1),\n Y.AS_TEXTS, BASE_FONT_SIZE, fontColorVisibleOnBackground(asBases[i])),\n asPtoStatuses[i] ? svg.star(xOfBaseCircles(i, asRightOverhangs) +\n BASE_RADIUS, Y.AS_TEXTS + PS_LINKAGE_RADIUS, PS_LINKAGE_COLOR) : '',\n );\n }\n image.append(\n asPtoStatuses[asBases.length] ?\n svg.star(xOfBaseCircles(asBases.length, asRightOverhangs) + BASE_RADIUS, Y.AS_TEXTS + PS_LINKAGE_RADIUS,\n PS_LINKAGE_COLOR) : '',\n );\n }\n\n const title = `${patternName} for ${numberOfSsNucleotides}${(asExists ? `/${numberOfAsNucleotides}` : '')}mer`;\n image.append(svg.text(title, X.TITLE, Y.TITLE, BASE_FONT_SIZE, TITLE_FONT_COLOR));\n for (let i = 0; i < uniqueBases.length; i++) {\n image.append(\n svg.circle(equidistantXForLegend(i), Y.circlesInLegends(asExists), LEGEND_RADIUS, baseColor(uniqueBases[i])),\n svg.text(uniqueBases[i], equidistantXForLegend(i) + LEGEND_RADIUS + 4, Y.textLegend(asExists), LEGEND_FONT_SIZE,\n FONT_COLOR),\n );\n }\n return image;\n}\n","import { CandidateType } from './types';\n/** enum type to simplify setting \"user-friendly\" notation if necessary */\nexport var NOTATION;\n(function (NOTATION) {\n NOTATION[\"FASTA\"] = \"fasta\";\n NOTATION[\"SEPARATOR\"] = \"separator\";\n NOTATION[\"HELM\"] = \"helm\";\n})(NOTATION || (NOTATION = {}));\nexport const positionSeparator = ', ';\nexport const monomerRe = /(?:\\[([A-Za-z0-9_\\-,()]+)\\])|([A-Za-z\\-])/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 __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","/**\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","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 { 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","import * as DG from 'datagrok-api/dg';\nimport wu from 'wu';\nimport { NOTATION, candidateAlphabets, positionSeparator } from './macromolecule';\nimport { detectAlphabet, getSplitterForColumn, getSplitterWithSeparator, splitterAsFasta, splitterAsFastaSimple, splitterAsHelm } 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}();\nexport const GapSymbols = {\n [NOTATION.FASTA]: '-',\n [NOTATION.SEPARATOR]: '',\n [NOTATION.HELM]: '*',\n};\n/** Class for handling notation units in Macromolecule columns and\n * conversion of notation systems in Macromolecule columns\n */\nexport class UnitsHandler {\n static setUnitsToFastaColumn(uh) {\n if (uh.column.semType !== DG.SEMTYPE.MACROMOLECULE || uh.column.getTag(DG.TAGS.UNITS) !== NOTATION.FASTA)\n throw new Error(`The column of notation '${NOTATION.FASTA}' must be '${DG.SEMTYPE.MACROMOLECULE}'.`);\n uh.column.setTag(DG.TAGS.UNITS, 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) !== NOTATION.SEPARATOR)\n throw new Error(`The column of notation '${NOTATION.SEPARATOR}' must be '${DG.SEMTYPE.MACROMOLECULE}'.`);\n if (!separator)\n throw new Error(`The column of notation '${NOTATION.SEPARATOR}' must have the separator tag.`);\n uh.column.setTag(DG.TAGS.UNITS, 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 '${NOTATION.HELM}' must be '${DG.SEMTYPE.MACROMOLECULE}'`);\n uh.column.setTag(DG.TAGS.UNITS, 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 ([NOTATION.FASTA, 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 === 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 == 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 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 === 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 get maxLength() {\n if (this._maxLength === null)\n this._maxLength = Math.max(...this.splitted.map((seqS) => seqS.length));\n return this._maxLength;\n }\n get posList() {\n if (this._posList === null) {\n const posListTxt = this.column.getTag(\".positionNames\" /* TAGS.positionNames */);\n this._posList = posListTxt ? posListTxt.split(positionSeparator).map((p) => p.trim()) :\n wu.count(1).take(this.maxLength).map((pos) => pos.toString()).toArray();\n }\n return this._posList;\n }\n isFasta() { return this.notation === NOTATION.FASTA; }\n isSeparator() { return this.notation === NOTATION.SEPARATOR; }\n isHelm() { return this.notation === 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 isGap(m) {\n return !m || (this.units === NOTATION.FASTA && m === GapSymbols[NOTATION.FASTA]) ||\n (this.units === NOTATION.HELM && m === GapSymbols[NOTATION.HELM]);\n }\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(NOTATION.FASTA))\n return NOTATION.FASTA;\n else if (this.units.toLowerCase().startsWith(NOTATION.SEPARATOR))\n return NOTATION.SEPARATOR;\n else if (this.units.toLowerCase().startsWith(NOTATION.HELM))\n return NOTATION.HELM;\n else\n throw new Error(`Column '${this.column.name}' has unexpected notation '${this.units}'.`);\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 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 /**\n * Create a new empty column of the specified notation type and the same\n * length as column\n *\n * @param {NOTATION} tgtNotation\n * @return {DG.Column}\n */\n getNewColumn(tgtNotation, tgtSeparator) {\n const col = this.column;\n const len = col.length;\n const name = tgtNotation.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, tgtNotation);\n if (tgtNotation === NOTATION.SEPARATOR) {\n if (!tgtSeparator)\n throw new Error(`Notation \\'${NOTATION.SEPARATOR}\\' requires separator value.`);\n newColumn.setTag(\"separator\" /* TAGS.separator */, tgtSeparator);\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 != null)\n newColumn.setTag(\"alphabet\" /* TAGS.alphabet */, srcAlphabet);\n let srcAlphabetSize = col.getTag(\".alphabetSize\" /* TAGS.alphabetSize */);\n if (srcAlphabet != null && srcAlphabetSize)\n newColumn.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, srcAlphabetSize);\n const srcAlphabetIsMultichar = col.getTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */);\n if (srcAlphabet != null && srcAlphabetIsMultichar !== undefined)\n newColumn.setTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */, srcAlphabetIsMultichar);\n if (tgtNotation == 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 = [NOTATION.FASTA, NOTATION.SEPARATOR, 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(limit) {\n if (this.units.toLowerCase().startsWith(NOTATION.FASTA)) {\n const alphabet = this.column.getTag(\"alphabet\" /* TAGS.alphabet */);\n if (alphabet !== null && !this.getAlphabetIsMultichar())\n return splitterAsFastaSimple;\n else\n return splitterAsFasta;\n }\n else if (this.units.toLowerCase().startsWith(NOTATION.SEPARATOR))\n return getSplitterWithSeparator(this.separator, limit);\n else if (this.units.toLowerCase().startsWith(NOTATION.HELM))\n return splitterAsHelm;\n else\n throw new Error(`Unexpected units ${this.units} .`);\n // TODO: Splitter for HELM\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 // -- Notation Converter --\n get splitter() {\n if (this._splitter === null)\n this._splitter = getSplitterForColumn(this.column);\n return this._splitter;\n }\n toFasta(targetNotation) { return targetNotation === NOTATION.FASTA; }\n toSeparator(targetNotation) { return targetNotation === NOTATION.SEPARATOR; }\n toHelm(targetNotation) { return targetNotation === NOTATION.HELM; }\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 GapSymbols[NOTATION.FASTA] :\n GapSymbols[NOTATION.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 === GapSymbols[NOTATION.HELM])\n tgtMonomersArray.push(tgtGapSymbol);\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 return tgtMonomersArray.join(tgtSeparator);\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) {\n const convert = this.getConverter(tgtNotation, tgtSeparator);\n const newColumn = this.getNewColumn(tgtNotation, tgtSeparator);\n // assign the values to the newly created empty column\n newColumn.init((rowI) => { return convert(this.column.get(rowI)); });\n // newColumn.setTag(DG.TAGS.UNITS, NOTATION.SEPARATOR);\n return newColumn;\n }\n /**\n * @param name\n * @param startIdx Start position index of the region (0-based)\n * @param endIdx End position index of the region (0-based, inclusive)\n */\n getRegion(startIdx, endIdx, name) {\n const regCol = this.getNewColumn(this.notation, this.separator);\n regCol.name = name;\n const maxLength = Math.max(...this.splitted.map((seqS) => seqS.length));\n const startIdxVal = startIdx ?? 0;\n const endIdxVal = endIdx ?? this.maxLength - 1;\n const join = this.getJoiner();\n const regLength = endIdxVal - startIdxVal + 1;\n regCol.init((rowI) => {\n const seqS = this.splitted[rowI];\n // Custom slicing instead of array method to maintain gaps\n const regMList = new Array(regLength);\n for (let regJPos = 0; regJPos < regLength; ++regJPos) {\n const seqJPos = startIdxVal + regJPos;\n regMList[regJPos] = seqJPos < seqS.length ? seqS[seqJPos] : GapSymbols[this.notation];\n }\n return join(regMList);\n });\n const getRegionOfPositionNames = (str) => {\n const srcPosList = str.split(',').map((p) => p.trim());\n const regPosList = new Array(regLength);\n for (let regJPos = 0; regJPos < regLength; ++regJPos) {\n const srcJPos = startIdxVal + regJPos;\n regPosList[regJPos] = srcJPos < srcPosList.length ? srcPosList[srcJPos] : '?';\n }\n return regPosList.join(positionSeparator);\n };\n const srcPositionNamesStr = this.column.getTag(\".positionNames\" /* TAGS.positionNames */);\n if (srcPositionNamesStr)\n regCol.setTag(\".positionNames\" /* TAGS.positionNames */, getRegionOfPositionNames(srcPositionNamesStr));\n const srcPositionLabelsStr = this.column.getTag(\".positionLabels\" /* TAGS.positionLabels */);\n if (srcPositionLabelsStr)\n regCol.setTag(\".positionLabels\" /* TAGS.positionLabels */, getRegionOfPositionNames(srcPositionLabelsStr));\n return regCol;\n }\n getJoiner() {\n const srcUh = this;\n if (this.notation === NOTATION.FASTA)\n return function (srcS) { return joinToFasta(srcUh, srcS); };\n else if (this.notation === NOTATION.SEPARATOR)\n return function (srcS) { return joinToSeparator(srcUh, srcS, srcUh.separator); };\n else if (this.notation === NOTATION.HELM) {\n const isDnaOrRna = srcUh.alphabet === \"DNA\" /* ALPHABET.DNA */ || srcUh.alphabet === \"RNA\" /* ALPHABET.RNA */;\n return function (srcS) { return joinToHelm(srcUh, srcS, isDnaOrRna); };\n }\n else\n throw new Error();\n }\n getConverter(tgtUnits, tgtSeparator = undefined) {\n if (tgtUnits === NOTATION.SEPARATOR && !tgtSeparator)\n throw new Error(`Target separator is not specified for target units '${NOTATION.SEPARATOR}'.`);\n const srcUh = this;\n if (tgtUnits === NOTATION.FASTA)\n return function (src) { return convertToFasta(srcUh, src); };\n if (tgtUnits === NOTATION.HELM)\n return function (src) { return convertToHelm(srcUh, src); };\n else if (tgtUnits === NOTATION.SEPARATOR)\n return function (src) { return convertToSeparator(srcUh, src, tgtSeparator); };\n else\n throw new Error();\n }\n constructor(col) {\n this._splitter = null;\n this._splitted = null;\n this._stats = null;\n this._maxLength = null;\n this._posList = 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()) ? GapSymbols[NOTATION.FASTA] :\n (this.isHelm()) ? GapSymbols[NOTATION.HELM] :\n GapSymbols[NOTATION.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 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 else\n throw new Error(`Unexpected units '${this.column.getTag(DG.TAGS.UNITS)}'.`);\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 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}\nconst helmWrappersRe = /[RD]\\((\\w)\\)P?/g;\nfunction joinToFasta(srcUh, seqS) {\n const resMList = new Array(seqS.length);\n for (const [srcM, mI] of wu.enumerate(seqS)) {\n let m = srcM;\n if (srcUh.isHelm())\n m = srcM.replace(helmWrappersRe, '$1');\n if (srcUh.isGap(m))\n m = GapSymbols[NOTATION.FASTA];\n else if (m.length > 1)\n m = '[' + seqS[mI] + ']';\n resMList[mI] = m;\n }\n return resMList.join('');\n}\nfunction convertToFasta(srcUh, src) {\n const srcMList = srcUh.isHelm() ? splitterAsHelmNucl(srcUh, src) : srcUh.getSplitter()(src);\n return joinToFasta(srcUh, srcMList);\n}\nfunction joinToSeparator(srcUh, seqS, tgtSeparator) {\n const resMList = new Array(seqS.length);\n for (const [srcM, mI] of wu.enumerate(seqS)) {\n let m = srcM;\n if (srcUh.isGap(m))\n m = GapSymbols[NOTATION.SEPARATOR];\n resMList[mI] = m;\n }\n return resMList.map((m) => m ?? '').join(tgtSeparator);\n}\nfunction convertToSeparator(srcUh, src, tgtSeparator) {\n const srcMList = srcUh.isHelm() ? splitterAsHelmNucl(srcUh, src) : srcUh.getSplitter()(src);\n return joinToSeparator(srcUh, srcMList, tgtSeparator);\n}\nfunction joinToHelm(srcUh, seqS, isDnaOrRna) {\n const [prefix, leftWrapper, rightWrapper, postfix] = srcUh.getHelmWrappers();\n const resMList = wu(seqS).map((srcM) => {\n let m = srcM;\n if (srcUh.isGap(m))\n m = GapSymbols[NOTATION.HELM];\n else if (isDnaOrRna)\n m = m.replace(helmWrappersRe, '$1');\n else\n m = srcM.length == 1 ? `${leftWrapper}${srcM}${rightWrapper}` : `${leftWrapper}[${srcM}]${rightWrapper}`;\n return m;\n }).toArray();\n return `${prefix}${resMList.join('.')}${postfix}`;\n}\nfunction convertToHelm(srcUh, src) {\n const isDnaOrRna = src.startsWith('DNA') || src.startsWith('RNA');\n const srcS = srcUh.getSplitter()(src);\n return joinToHelm(srcUh, srcS, isDnaOrRna);\n}\n/** Splits Helm sequence adjusting nucleotides to single char symbols. (!) Removes lone phosphorus. */\nfunction splitterAsHelmNucl(srcUh, src) {\n const srcMList = srcUh.getSplitter()(src);\n const tgtMList = new Array(srcMList.length);\n const isDna = src.startsWith('DNA');\n const isRna = src.startsWith('RNA');\n for (const [srcM, mI] of wu.enumerate(srcMList)) {\n let m = srcM;\n if (isDna || isRna) {\n m = m.replace(helmWrappersRe, '$1');\n m = m === 'P' ? null : m;\n }\n tgtMList[mI] = m;\n }\n return tgtMList.filter((m) => m !== null);\n}\n//# sourceMappingURL=units-handler.js.map","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {AppUIFactory, CombinedAppUI} from './view/app-ui';\nimport {tryCatch} from './model/helpers';\nimport {LIB_PATH, DEFAULT_LIB_FILENAME} from './model/data-loading-utils/const';\nimport {IMonomerLib} from '@datagrok-libraries/bio/src/types';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';\nimport {getJsonData} from './model/data-loading-utils/json-loader';\nimport {SequenceToMolfileConverter} from './model/structure-app/sequence-to-molfile';\nimport {linkStrandsV3000} from './model/structure-app/mol-transformations';\nimport {MonomerLibWrapper} from './model/monomer-lib/lib-wrapper';\nimport {FormatDetector} from './model/parsing-validation/format-detector';\nimport {SequenceValidator} from './model/parsing-validation/sequence-validator';\nimport {demoOligoTranslatorUI, demoOligoPatternUI, demoOligoStructureUI} from './demo/demo-st-ui';\nimport {FormatConverter} from './model/translator-app/format-converter';\nimport {APP} from './view/const/ui';\nimport {getExternalAppViewFactories} from './plugins/mermade';\n\nclass StPackage extends DG.Package {\n private _monomerLib?: IMonomerLib;\n\n get monomerLib(): IMonomerLib {\n if (!this._monomerLib)\n throw new Error ('Monomer lib not loaded')\n return this._monomerLib!;\n }\n\n public async initMonomerLib(): Promise<void> {\n if (this._monomerLib !== undefined)\n return;\n\n const pi: DG.TaskBarProgressIndicator = DG.TaskBarProgressIndicator.create(\n `Initializing ${APP.COMBINED} monomer library ...`);\n await tryCatch(async () => {\n const libHelper: IMonomerLibHelper = await getMonomerLibHelper();\n this._monomerLib = await libHelper.readLibrary(LIB_PATH, DEFAULT_LIB_FILENAME);\n }, () => pi.close());\n }\n}\n\nexport const _package: StPackage = new StPackage();\n\nasync function buildLayout(appName: string): Promise<void> {\n await initSequenceTranslatorLibData();\n const appUI = AppUIFactory.getUI(appName);\n await appUI.createAppLayout();\n}\n\n\n//name: Oligo Toolkit\n//meta.icon: img/icons/toolkit.png\n//meta.browsePath: Oligo\n//tags: app\nexport async function oligoToolkitApp(): Promise<void> {\n await initSequenceTranslatorLibData();\n const externalViewFactories = await getExternalAppViewFactories();\n if (!externalViewFactories)\n throw new Error('External app view factories not loaded');\n const appUI = new CombinedAppUI(externalViewFactories!);\n await appUI.createAppLayout();\n}\n\n//name: Oligo Translator\n//meta.icon: img/icons/translator.png\n//meta.browsePath: Oligo\n//tags: app\nexport async function oligoTranslatorApp(): Promise<void> {\n await buildLayout(APP.TRANSLATOR);\n}\n\n//name: Oligo Pattern\n//meta.icon: img/icons/pattern.png\n//meta.browsePath: Oligo\n//tags: app\nexport async function oligoPatternApp(): Promise<void> {\n await buildLayout(APP.PATTERN);\n}\n\n//name: Oligo Structure\n//meta.icon: img/icons/structure.png\n//meta.browsePath: Oligo\n//tags: app\nexport async function oligoStructureApp(): Promise<void> {\n await buildLayout(APP.STRUCTRE);\n}\n\n//name: initSequenceTranslatorLibData\nexport async function initSequenceTranslatorLibData(): Promise<void> {\n await getJsonData();\n await _package.initMonomerLib();\n}\n\n//name: getCodeToWeightsMap\n//output: object result\nexport function getCodeToWeightsMap(): {[key: string]: number} {\n const map = MonomerLibWrapper.getInstance().getCodesToWeightsMap();\n return Object.fromEntries(map);\n}\n\n//name: validateSequence\n//input: string sequence\n//output: bool result\nexport function validateSequence(sequence: string): boolean {\n const validator = new SequenceValidator(sequence);\n const format = (new FormatDetector(sequence).getFormat());\n return (format === null) ? false : validator.isValidSequence(format!);\n}\n\n//name: validateSequence\n//input: string sequence\n//input: bool invert\n//output: string result\nexport function getMolfileFromGcrsSequence(sequence: string, invert: boolean): string {\n return (new SequenceToMolfileConverter(sequence, invert, 'GCRS')).convert();\n}\n\n//name: linkStrands\n//input: object strands\n//output: string result\nexport function linkStrands(strands: { senseStrands: string[], antiStrands: string[] }): string {\n return linkStrandsV3000(strands, true);\n}\n\n//name: demoOligoTranslator\n//meta.demoPath: Bioinformatics | Oligo Toolkit | Translator\n//description: Translate oligonucleotide sequences across various formats accepted by different synthesizers\n//meta.path: /apps/Tutorials/Demo/Bioinformatics/Oligonucleotide%20Sequence:%20Translate\nexport async function demoTranslateSequence(): Promise<void> {\n await demoOligoTranslatorUI();\n}\n\n//name: demoOligoPattern\n//meta.demoPath: Bioinformatics | Oligo Toolkit | Pattern\n//description: Design a modification pattern for an oligonucleotide sequence\n//meta.path:%20/apps/Tutorials/Demo/Bioinformatics/Oligonucleotide%20Sequence:%20Visualize%20duplex\nexport async function demoOligoPattern(): Promise<void> {\n await demoOligoPatternUI();\n}\n\n//name: demoOligoStructure\n//meta.demoPath: Bioinformatics | Oligo Toolkit | Structure\n//description: Visualize duplex and save SDF\n//meta.path:%20/apps/Tutorials/Demo/Bioinformatics/Oligonucleotide%20Sequence:%20Visualize%20duplex\nexport async function demoOligoStructure(): Promise<void> {\n await demoOligoStructureUI();\n}\n\n//name: translateOligonucleotideSequence\n//input: string sequence\n//input: string sourceFormat\n//input: string targetFormat\n//output: string result\nexport async function translateOligonucleotideSequence(sequence: string, sourceFormat: string, targetFormat: string): Promise<string> {\n await initSequenceTranslatorLibData();\n return (new FormatConverter(sequence, sourceFormat)).convertTo(targetFormat);\n}\n","// import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\nimport { HELM_CORE_FIELDS, jsonSdfMonomerLibDict, MONOMER_ENCODE_MAX, MONOMER_ENCODE_MIN, SDF_MONOMER_NAME } from '../utils/const';\nimport { UnitsHandler } from '../utils/units-handler';\nimport { splitAlignedSequences } from '../utils/splitter';\nexport function encodeMonomers(col) {\n let encodeSymbol = MONOMER_ENCODE_MIN;\n const monomerSymbolDict = {};\n const uh = UnitsHandler.getOrCreate(col);\n const splitterFunc = uh.getSplitter();\n const encodedStringArray = [];\n for (let i = 0; i < col.length; ++i) {\n let encodedMonomerStr = '';\n const monomers = splitterFunc(col.get(i));\n for (const m of monomers) {\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 uh = UnitsHandler.getOrCreate(col);\n const splitter = uh.getSplitter();\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 = splitter(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 uh = UnitsHandler.getOrCreate(cell.column);\n const splitterFunc = uh.getSplitter();\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}\nexport async function sequenceChemSimilarity(positionColumns, referenceSequence) {\n if (positionColumns instanceof DG.Column)\n positionColumns = splitAlignedSequences(positionColumns).columns.toList();\n const libHelper = await getMonomerLibHelper();\n const monomerLib = libHelper.getBioLib();\n // const smilesCols: DG.Column<string>[] = new Array(monomerCols.length);\n const rawCols = new Array(positionColumns.length);\n const rowCount = positionColumns[0].length;\n const totalSimilarity = new Float32Array(rowCount);\n // Calculate base similarity\n for (let position = 0; position < positionColumns.length; ++position) {\n const referenceMonomer = referenceSequence[position];\n const referenceMol = monomerLib.getMonomer('PEPTIDE', referenceMonomer)?.smiles ?? '';\n const monomerCol = positionColumns[position];\n const monomerColData = monomerCol.getRawData();\n const monomerColCategories = monomerCol.categories;\n const emptyCategoryIdx = monomerColCategories.indexOf('');\n rawCols[position] = { categories: monomerColCategories, data: monomerColData, emptyIndex: emptyCategoryIdx };\n if (typeof referenceMonomer === 'undefined')\n continue;\n // Calculating similarity for \n const molCol = DG.Column.fromStrings('smiles', monomerColCategories.map((cat) => monomerLib.getMonomer('PEPTIDE', cat)?.smiles ?? ''));\n const _df = DG.DataFrame.fromColumns([molCol]); // getSimilarities expects that column is in dataframe\n const similarityCol = (await grok.chem.getSimilarities(molCol, referenceMol));\n const similarityColData = similarityCol.getRawData();\n for (let rowIdx = 0; rowIdx < rowCount; ++rowIdx) {\n const monomerCategoryIdx = monomerColData[rowIdx];\n totalSimilarity[rowIdx] += referenceMonomer !== '' && monomerCategoryIdx !== emptyCategoryIdx ?\n similarityColData[monomerCategoryIdx] :\n referenceMonomer === '' && monomerCategoryIdx === emptyCategoryIdx ? 1 : 0;\n }\n }\n for (let similarityIndex = 0; similarityIndex < totalSimilarity.length; ++similarityIndex) {\n let updatedSimilarity = totalSimilarity[similarityIndex] / referenceSequence.length;\n for (let position = 0; position < positionColumns.length; ++position) {\n const currentRawCol = rawCols[position];\n if ((position >= referenceSequence.length && currentRawCol.data[similarityIndex] !== currentRawCol.emptyIndex) ||\n (currentRawCol.data[similarityIndex] === currentRawCol.emptyIndex && position < referenceSequence.length)) {\n updatedSimilarity = DG.FLOAT_NULL;\n break;\n }\n }\n totalSimilarity[similarityIndex] = updatedSimilarity;\n }\n const similarityCol = DG.Column.fromFloat32Array('Similarity', totalSimilarity);\n return similarityCol;\n}\n//# sourceMappingURL=monomer-utils.js.map","module.exports = DG;","module.exports = grok;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nc = undefined;","type Dict = {[key: string]: string};\n\nexport const formatsToHelm: {[key: string]: Dict} = {\n 'Axolabs': {\n 'UfAfsCfsGfuacg': 'RNA1{[fR](U)p.[fR](A)[sp].[fR](C)[sp].[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)}$$$$'\n },\n 'BioSpring': {\n 'AT*GC*123456789': 'RNA1{r(A)p.r(T)[sp].r(G)p.r(C)[sp].[fR](U)p.[fR](A)p.[fR](C)p.[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)p.d([m5C])}$$$$'\n },\n 'Mermade12': {\n 'hefglijkLIJKHEFG': 'RNA1{[25r](U)[sp].[25r](A)[sp].[25r](C)[sp].[25r](G)[sp].[fR](U)[sp].[fR](A)[sp].[fR](C)[sp].[fR](G)[sp].[fR](U)p.[fR](A)p.[fR](C)p.[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)}$$$$'\n }\n}\n\nexport const helmToNucleotides: Dict = {\n 'RNA1{[fR](U)p.[fR](A)[sp].[fR](C)[sp].[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)}$$$$': 'UACGUACG',\n\n 'RNA1{r(A)p.r(T)[sp].r(G)p.r(C)[sp].[fR](U)p.[fR](A)p.[fR](C)p.[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)p.d([m5C])}$$$$': 'ATGCUACGUACGC',\n\n 'RNA1{[25r](U)[sp].[25r](A)[sp].[25r](C)[sp].[25r](G)[sp].[fR](U)[sp].[fR](A)[sp].[fR](C)[sp].[fR](G)[sp].[fR](U)p.[fR](A)p.[fR](C)p.[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)}$$$$': 'UACGUACGUACGUACG'\n}\n\nexport const helmToMolfile: Dict = {\n}\n","/* 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 {before, category, expect, test} from '@datagrok-libraries/utils/src/test';\nimport {DEFAULT_FORMATS} from '../model/const';\nimport {FormatConverter} from '../model/translator-app/format-converter';\nimport {getJsonData} from '../model/data-loading-utils/json-loader';\nimport {formatsToHelm} from './const';\nimport {_package} from '../package';\n\nfunction getHelm(strand: string, format: string): string {\n return (new FormatConverter(strand, format).convertTo(DEFAULT_FORMATS.HELM));\n}\n\nfunction getFromat(helm: string, format: string): string {\n return (new FormatConverter(helm, DEFAULT_FORMATS.HELM).convertTo(format));\n}\n\ncategory('Formats to HELM', () => {\n before(async () => {\n await getJsonData();\n await _package.initMonomerLib();\n });\n\n for (const format of Object.keys(formatsToHelm)) {\n for (const [strand, helm] of Object.entries(formatsToHelm[format])) {\n test(`${format} to HELM`, async () => {\n const expected = helm;\n const result = getHelm(strand, format);\n expect(result, expected);\n });\n }\n }\n});\n\ncategory('HELM to Formats', () => {\n before(async () => {\n await getJsonData();\n await _package.initMonomerLib();\n });\n\n for (const format of Object.keys(formatsToHelm)) {\n for (const [strand, helm] of Object.entries(formatsToHelm[format])) {\n test(`${format} to HELM`, async () => {\n const expected = strand;\n const result = getFromat(helm, format);\n expect(result, expected);\n });\n }\n }\n});\n","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {before, category, expect, test} from '@datagrok-libraries/utils/src/test';\nimport {getNucleotidesSequence} from '../model/translator-app/conversion-utils';\nimport {getJsonData} from '../model/data-loading-utils/json-loader';\nimport {helmToNucleotides} from './const';\nimport {_package} from '../package';\nimport {MonomerLibWrapper} from '../model/monomer-lib/lib-wrapper';\n\ncategory('HELM to Nucleotides', () => {\n before(async () => {\n await getJsonData();\n await _package.initMonomerLib();\n });\n\n Object.entries(helmToNucleotides).forEach(([helm, nucleotide], idx) => {\n test(`Sequence ${idx + 1} to nucleotides`, async () => {\n const expected = nucleotide;\n const result = getNucleotidesSequence(helm, MonomerLibWrapper.getInstance());\n expect(result, expected);\n });\n })\n});\n","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {before, category, expect, test} from '@datagrok-libraries/utils/src/test';\nimport {DEFAULT_FORMATS} from '../model/const';\nimport {getJsonData} from '../model/data-loading-utils/json-loader';\nimport {formatsToHelm} from './const';\nimport {SequenceValidator} from '../model/parsing-validation/sequence-validator';\nimport {getTranslatedSequences} from '../model/translator-app/conversion-utils';\nimport {_package} from '../package';\n\nfunction getTranslationObject(sequence: string, format: string): {[format: string]: string} {\n const indexOfInvalidChar = (new SequenceValidator(sequence)).getInvalidCodeIndex(format);\n return getTranslatedSequences(sequence, indexOfInvalidChar, format);\n}\n\nconst inputs = {\n [DEFAULT_FORMATS.AXOLABS]: 'Afcgacsu',\n [DEFAULT_FORMATS.HELM]: 'RNA1{[fR](A)p.[25r](C)p.[25r](G)p.[25r](A)p.[25r](C)[sp].[25r](U)}$$$$'\n}\n\ncategory('Formats support', () => {\n before(async () => {\n await getJsonData();\n await _package.initMonomerLib();\n });\n\n Object.entries(inputs).forEach(([format, sequence]) => {\n test(`All formats for ${format}`, async () => {\n const output = getTranslationObject(sequence, format);\n const result = Object.keys(output).length;\n // +1 due to nucleotides\n const expected = Object.keys(formatsToHelm).length + 1;\n expect(true, expected <= result);\n });\n });\n});\n","import * as DG from 'datagrok-api/dg';\nimport {runTests, tests, TestContext} from '@datagrok-libraries/utils/src/test';\nimport './tests/formats-to-helm';\nimport './tests/helm-to-nucleotides';\nimport './tests/formats-support';\n\nexport const _package = new DG.Package();\nexport {tests};\n\n//name: test\n//input: string category {optional: true}\n//input: string test {optional: true}\n//input: object testContext {optional: true}\n//output: dataframe result\nexport async function test(category: string, test: string, testContext: TestContext): Promise<DG.DataFrame> {\n const data = await runTests({category, test, testContext});\n return DG.DataFrame.fromObjects(data)!;\n}\n"],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","tests","currentCategory","assure","notNull","name","Error","TestContext","constructor","catchUnhandled","report","this","undefined","Test","category","test","options","_a","timeout","push","expect","actual","expected","before","runTests","_b","_c","_d","_e","results","packageName","func","package","console","log","testContext","key","Object","entries","toLowerCase","startsWith","x","beforeStatus","toString","t","res","i","length","execTest","data","all","filter","d","after","afterStatus","success","ms","skipped","r","setTimeout","delay","logger","successful","failed","description","params","assign","predicate","skip","skipReason","start","Date","stop","___CSS_LOADER_EXPORT___","module","id","exports","cssWithMappingToString","list","map","item","content","needLayer","concat","join","modules","media","dedupe","supports","layer","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","sourceMapping","out$","window","default","xmlNs","svgNs","urlRegex","fontFormats","woff2","woff","otf","ttf","eot","sfnt","svg","isElement","obj","HTMLElement","SVGElement","requireDomNode","el","requireDomNodePromise","getDimension","clone","dim","v","viewBox","baseVal","getAttribute","match","parseInt","getBoundingClientRect","style","getComputedStyle","getPropertyValue","isNaN","parseFloat","uriToBlob","uri","byteString","atob","split","mimeString","buffer","ArrayBuffer","intArray","Uint8Array","charCodeAt","Blob","type","cachedFonts","cachedRules","inlineCss","_ref","selectorRemap","modifyStyle","modifyCss","fonts","excludeUnusedCss","generateCss","selector","properties","css","detectFonts","fontList","Array","from","document","styleSheets","sheet","rules","cssRules","href","warn","forEach","_ref2","rule","querySelector","parentNode","err","query","selectorText","cssText","font","url","fontUrl","formats","fullUrl","text","format","keys","extension","indexOf","error","detectCssFont","req","XMLHttpRequest","addEventListener","fontInBase64","binary","bytes","byteLength","String","fromCharCode","arrayBufferToBase64","response","fontUri","replace","open","responseType","send","fontCss","inlineFonts","downloadOptions","navigator","msSaveOrOpenBlob","createElement","popup","prepareSvg","_ref3","_ref3$left","left","_ref3$top","top","w","width","h","height","_ref3$scale","scale","_ref3$responsive","responsive","_ref3$excludeCss","excludeCss","querySelectorAll","image","getAttributeNS","lastIndexOf","location","host","valueOf","canvas","img","Image","crossOrigin","src","onerror","onload","getContext","drawImage","setAttributeNS","toDataURL","inlineImages","cloneNode","backgroundColor","_getDimensions","tagName","getBBox","_el$getBBox","y","getDimensions","setAttribute","createElementNS","appendChild","removeAttribute","foreignObject","innerHTML","defs","insertBefore","firstChild","outer","svgAsDataUri","_ref4","svgXml","decodeURIComponent","p1","c","svgAsPngUri","_ref5","_ref5$encoderType","encoderType","_ref5$encoderOptions","encoderOptions","canvg","convertToPng","_ref6","context","pixelRatio","devicePixelRatio","setTransform","png","SecurityError","slice","download","saveLink","display","body","blob","URL","createObjectURL","onclick","requestAnimationFrame","revokeObjectURL","click","removeChild","title","saveSvg","downloadOpts","saveSvgAsPng","stylesInDOM","getIndexByIdentifier","identifier","modulesToDom","idCountMap","identifiers","base","count","indexByIdentifier","sourceMap","references","updater","addElementStyle","byIndex","splice","api","domAPI","update","newObj","remove","lastIdentifiers","newList","index","newLastIdentifiers","_i","_index","memo","insert","target","styleTarget","HTMLIFrameElement","contentDocument","head","getTarget","element","setAttributes","attributes","styleElement","nonce","insertStyleElement","styleTagTransform","removeStyleElement","styleSheet","createTextNode","NUCLEOTIDES","DEFAULT_FORMATS","LIB_PATH","DEFAULT_LIB_FILENAME","APP_PATH","AXOLABS_STYLE_FILENAME","CODES_TO_HELM_DICT_FILENAME","CODES_TO_SYMBOLS_FILENAME","MONOMERS_WITH_PHOSPHATE_LINKERS","fileSource","axolabsStyleMap","codesToHelmDictionary","codesToSymbolsDictionary","monomersWithPhosphateLinkers","async","getJsonData","every","parse","path","parsedJson","readAsText","errMsg","hasOwnProperty","message","sortByReverseLength","array","sort","a","b","tryCatch","finallyFunc","callbackName","MonomerLibWrapper","lib","_package","allMonomers","getAllMonomers","static","formatMonomerForViewer","sourceObj","formattedObject","getAllFormats","codes","code","symbol","polymerTypes","getPolymerTypes","polymerType","monomersByType","getMonomerSymbolsByType","monomerSymbol","getMonomer","monomer","instance","getMolfileBySymbol","molfile","getNaturalAnalogBySymbol","naturalAnalog","isModification","includes","getCodeToSymbolMap","Map","getCodesByFormat","getTableForViewer","formattedObjects","getCodesToWeightsMap","codesToWeightsMap","_","dict","weight","set","SequenceValidator","sequence","libWrapper","getInvalidCodeIndex","firstUniqueCharacters","indexOfFirstInvalidChar","matchedCode","find","substring","isValidSequence","GROUP_TYPE","NUCLEOSIDE","LINKAGE","PHOSPHATE_SYMBOL","UNKNOWN_SYMBOL","getTranslatedSequences","sourceFormat","supportedFormats","outputFormats","localeCompare","converter","fromEntries","translation","convertTo","nucleotides","getNucleotidesSequence","helmString","monomerLib","re","RegExp","branches","branch","stripped","inverseLengthComparator","FormatHandler","getFormats","getFormatNames","validateFormat","isHelm","getFormatCodes","getHelmToFormatDict","infoObj","values","helm","sorted","getHelmToCodeDict","getFormatToHelmDict","codesInfoObject","getTargetFormatHelmCodes","getTargetFormatHelmCodesRegExp","helmCodes","getRegExpPattern","getFormatRegExp","getNonHelmFormatRegExp","getPhosphateHelmCodesRegExp","phosphateHELMPattern","Set","isValidFormat","formatCodes","arr","HELM_WRAPPER","LEFT","RIGHT","FormatConverter","targetFormat","helmToFormat","formatToHelm","helmSequence","wrapperRegExp","helmRegExp","formatRegExp","phosphateRegExp","group","ui","rxjs","$","V2K_CONST","measureText","Math","max","NOTATION","wu","CandidateType","alphabet","cutoff","fasta","peptide","dna","rna","Float32Array","dt","simplified","PaletteType","palette","cp","objList","colour","ind","colourPalette","_palette","get","m","undefinedColor","Lesk","lesk","makePalette","GrokGroups","grokGroups","RasMol","rasMol","resM","aaSynonyms","super","Aminoacids","scheme","isInner","inner","char","chemPaletteInstance","getPalette","outerMonomer","innerMonomer","getInnerOuter","amino","toUpperCase","AAFullNames","SemType","SemTypeMultipleAlignment","Names","AASmiles","AASmilesTruncated","Nucleotides","StringUtils","s","hash","UnknownSeqPalette","UnknownColorPalette","pI","hashCode","color","dgColor","g","distToBlack","sqrt","pow","correctColor","buildPalette","Uint32Array","MmDistanceFunctionsNames","HAMMING","LEVENSHTEIN","NEEDLEMANN_WUNSCH","uhTemp","StPackage","_monomerLib","pi","libHelper","funcList","prepare","call","getOutputParamValue","readLibrary","close","DG","grok","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","n","getter","__esModule","definition","o","defineProperty","enumerable","prop","prototype","Symbol","toStringTag","nc","formatsToHelm","helmToNucleotides","getHelm","strand","getFromat","nucleotide","idx","inputs","output","indexOfInvalidChar","getTranslationObject"],"sourceRoot":""}
1
+ {"version":3,"file":"package-test.js","mappings":"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","sources":["webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/types.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/utils/src/test.js","webpack://sequencetranslator/./src/view/style/colored-text-input.css","webpack://sequencetranslator/./src/view/style/structure-app.css","webpack://sequencetranslator/./src/view/style/translator-app.css","webpack://sequencetranslator/./node_modules/css-loader/dist/runtime/api.js","webpack://sequencetranslator/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://sequencetranslator/./node_modules/save-svg-as-png/lib/saveSvgAsPng.js","webpack://sequencetranslator/./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack://sequencetranslator/./node_modules/style-loader/dist/runtime/insertBySelector.js","webpack://sequencetranslator/./node_modules/style-loader/dist/runtime/insertStyleElement.js","webpack://sequencetranslator/./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js","webpack://sequencetranslator/./node_modules/style-loader/dist/runtime/styleDomAPI.js","webpack://sequencetranslator/./node_modules/style-loader/dist/runtime/styleTagTransform.js","webpack://sequencetranslator/./src/model/const.ts","webpack://sequencetranslator/./src/model/data-loading-utils/const.ts","webpack://sequencetranslator/./src/model/data-loading-utils/json-loader.ts","webpack://sequencetranslator/./src/model/helpers.ts","webpack://sequencetranslator/./src/model/monomer-lib/lib-wrapper.ts","webpack://sequencetranslator/./src/model/parsing-validation/sequence-validator.ts","webpack://sequencetranslator/./src/model/translator-app/const.ts","webpack://sequencetranslator/./src/model/translator-app/conversion-utils.ts","webpack://sequencetranslator/./src/model/parsing-validation/format-handler.ts","webpack://sequencetranslator/./src/model/translator-app/format-converter.ts","webpack://sequencetranslator/external var \"ui\"","webpack://sequencetranslator/external var \"wu\"","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/consts.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/seq-palettes.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/aminoacids.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/nucleotides.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/unknown.js","webpack://sequencetranslator/./node_modules/fastest-levenshtein/esm/mod.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/macromolecule-distance-functions.js","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/utils/units-handler.js","webpack://sequencetranslator/external var \"rxjs\"","webpack://sequencetranslator/./src/view/style/translator-app.css?3282","webpack://sequencetranslator/external var \"$\"","webpack://sequencetranslator/./node_modules/@datagrok-libraries/chem-meta/src/formats/molfile-v2k-const.js","webpack://sequencetranslator/./src/view/style/colored-text-input.css?0e07","webpack://sequencetranslator/./src/view/utils/molecule-img.ts","webpack://sequencetranslator/./src/view/style/structure-app.css?9992","webpack://sequencetranslator/./src/model/pattern-app/helpers.ts","webpack://sequencetranslator/./src/model/pattern-app/draw-svg.ts","webpack://sequencetranslator/./src/package.ts","webpack://sequencetranslator/./node_modules/@datagrok-libraries/bio/src/monomer-works/monomer-utils.js","webpack://sequencetranslator/external var \"DG\"","webpack://sequencetranslator/external var \"grok\"","webpack://sequencetranslator/webpack/bootstrap","webpack://sequencetranslator/webpack/runtime/compat get default export","webpack://sequencetranslator/webpack/runtime/define property getters","webpack://sequencetranslator/webpack/runtime/hasOwnProperty shorthand","webpack://sequencetranslator/webpack/runtime/make namespace object","webpack://sequencetranslator/webpack/runtime/nonce","webpack://sequencetranslator/./src/tests/const.ts","webpack://sequencetranslator/./src/tests/formats-to-helm.ts","webpack://sequencetranslator/./src/tests/helm-to-nucleotides.ts","webpack://sequencetranslator/./src/tests/formats-support.ts","webpack://sequencetranslator/./src/package-test.ts"],"sourcesContent":["/** 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","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nexport const tests = {};\nexport let currentCategory;\nexport var assure;\n(function (assure) {\n function notNull(value, name) {\n if (value == null)\n throw new Error(`${name == null ? 'Value' : name} not defined`);\n }\n assure.notNull = notNull;\n})(assure || (assure = {}));\nexport class TestContext {\n constructor(catchUnhandled, report) {\n this.catchUnhandled = true;\n this.report = false;\n if (catchUnhandled !== undefined)\n this.catchUnhandled = catchUnhandled;\n if (report !== undefined)\n this.report = report;\n }\n ;\n}\nexport class Test {\n constructor(category, name, test, options) {\n var _a;\n this.category = category;\n this.name = name;\n options !== null && options !== void 0 ? options : (options = {});\n (_a = options.timeout) !== null && _a !== void 0 ? _a : (options.timeout = 30000);\n this.options = options;\n this.test = () => __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n let result = '';\n try {\n result = yield test();\n }\n catch (e) {\n reject(e);\n }\n resolve(result);\n }));\n });\n }\n}\nexport function testEvent(event, handler, trigger, ms = 0) {\n return __awaiter(this, void 0, void 0, function* () {\n let sub;\n return new Promise((resolve, reject) => {\n sub = event.subscribe((args) => {\n try {\n handler(args);\n }\n catch (e) {\n reject(e);\n }\n sub.unsubscribe();\n resolve('OK');\n });\n setTimeout(() => {\n sub.unsubscribe();\n // eslint-disable-next-line prefer-promise-reject-errors\n reject('timeout');\n }, ms);\n trigger();\n });\n });\n}\nexport function test(name, test, options) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n if (tests[currentCategory].tests == undefined)\n tests[currentCategory].tests = [];\n tests[currentCategory].tests.push(new Test(currentCategory, name, test, options));\n}\n/* Tests two objects for equality, throws an exception if they are not equal. */\nexport function expect(actual, expected) {\n if (actual !== expected)\n throw new Error(`Expected \"${expected}\", got \"${actual}\"`);\n}\nexport function expectFloat(actual, expected, tolerance = 0.001) {\n const areEqual = Math.abs(actual - expected) < tolerance;\n if (!areEqual)\n throw new Error(`Expected ${expected}, got ${actual} (tolerance = ${tolerance})`);\n}\nexport function expectObject(actual, expected) {\n for (const [expectedKey, expectedValue] of Object.entries(expected)) {\n if (!actual.hasOwnProperty(expectedKey))\n throw new Error(`Expected property \"${expectedKey}\" not found`);\n const actualValue = actual[expectedKey];\n if (actualValue instanceof Array && expectedValue instanceof Array)\n expectArray(actualValue, expectedValue);\n else if (actualValue instanceof Object && expectedValue instanceof Object)\n expectObject(actualValue, expectedValue);\n else if (Number.isFinite(actualValue) && Number.isFinite(expectedValue))\n expectFloat(actualValue, expectedValue);\n else if (actualValue != expectedValue)\n throw new Error(`Expected (${expectedValue}) for key '${expectedKey}', got (${actualValue})`);\n }\n}\nexport function expectArray(actual, expected) {\n const actualLength = actual.length;\n const expectedLength = expected.length;\n if (actualLength != expectedLength) {\n throw new Error(`Arrays are of different length: actual array length is ${actualLength} ` +\n `and expected array length is ${expectedLength}`);\n }\n for (let i = 0; i < actualLength; i++) {\n if (actual[i] instanceof Array && expected[i] instanceof Array)\n expectArray(actual[i], expected[i]);\n else if (actual[i] instanceof Object && expected[i] instanceof Object)\n expectObject(actual[i], expected[i]);\n else if (actual[i] != expected[i])\n throw new Error(`Expected ${expected[i]} at position ${i}, got ${actual[i]}`);\n }\n}\n/* Defines a test suite. */\nexport function category(category, tests) {\n currentCategory = category;\n tests();\n}\n/* Defines a function to be executed before the tests in this category are executed. */\nexport function before(before) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].before = before;\n}\n/* Defines a function to be executed after the tests in this category are executed. */\nexport function after(after) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].after = after;\n}\nexport function runTests(options) {\n var _a, _b, _c, _d;\n var _e;\n return __awaiter(this, void 0, void 0, function* () {\n const results = [];\n const packageName = (_b = (_a = grok.functions.getCurrentCall()) === null || _a === void 0 ? void 0 : _a.func) === null || _b === void 0 ? void 0 : _b.package;\n console.log(`Running tests`);\n options !== null && options !== void 0 ? options : (options = {});\n (_c = (_e = options).testContext) !== null && _c !== void 0 ? _c : (_e.testContext = new TestContext());\n grok.shell.lastError = '';\n for (const [key, value] of Object.entries(tests)) {\n if ((options === null || options === void 0 ? void 0 : options.category) != undefined) {\n if (!key.toLowerCase().startsWith(options === null || options === void 0 ? void 0 : options.category.toLowerCase()))\n continue;\n }\n console.log(`Started ${key} category`);\n try {\n if (value.before)\n yield value.before();\n }\n catch (x) {\n value.beforeStatus = x.toString();\n }\n const t = (_d = value.tests) !== null && _d !== void 0 ? _d : [];\n const res = [];\n for (let i = 0; i < t.length; i++)\n res.push(yield execTest(t[i], options === null || options === void 0 ? void 0 : options.test));\n const data = (yield Promise.all(res)).filter((d) => d.result != 'skipped');\n try {\n if (value.after)\n yield value.after();\n }\n catch (x) {\n value.afterStatus = x.toString();\n }\n if (value.afterStatus)\n data.push({ category: key, name: 'init', result: value.afterStatus, success: false, ms: 0, skipped: false });\n if (value.beforeStatus)\n data.push({ category: key, name: 'init', result: value.beforeStatus, success: false, ms: 0, skipped: false });\n results.push(...data);\n }\n if (options.testContext.catchUnhandled) {\n yield delay(1000);\n if (grok.shell.lastError.length > 0) {\n results.push({\n category: 'Unhandled exceptions',\n name: 'exceptions',\n result: grok.shell.lastError, success: false, ms: 0, skipped: false\n });\n }\n }\n if (options.testContext.report) {\n const logger = new DG.Logger();\n const successful = results.filter((r) => r.success).length;\n const skipped = results.filter((r) => r.skipped).length;\n const failed = results.filter((r) => !r.success);\n const description = 'Package @package tested: @successful successful, @skipped skipped, @failed failed tests';\n const params = {\n successful: successful,\n skipped: skipped,\n failed: failed.length,\n package: packageName\n };\n for (const r of failed)\n Object.assign(params, { [`${r.category} | ${r.name}`]: r.result });\n logger.log(description, params, 'package-tested');\n }\n return results;\n });\n}\nfunction execTest(t, predicate) {\n var _a, _b, _c;\n return __awaiter(this, void 0, void 0, function* () {\n let r;\n const filter = predicate != undefined && (!t.name.toLowerCase().startsWith(predicate.toLowerCase()));\n const skip = ((_a = t.options) === null || _a === void 0 ? void 0 : _a.skipReason) || filter;\n const skipReason = filter ? 'skipped' : (_b = t.options) === null || _b === void 0 ? void 0 : _b.skipReason;\n if (!skip)\n console.log(`Started ${t.category} ${t.name}`);\n const start = new Date();\n try {\n if (skip)\n r = { success: true, result: skipReason, ms: 0, skipped: true };\n else\n r = { success: true, result: (_c = yield t.test()) !== null && _c !== void 0 ? _c : 'OK', ms: 0, skipped: false };\n }\n catch (x) {\n r = { success: false, result: x.toString(), ms: 0, skipped: false };\n }\n const stop = new Date();\n // @ts-ignore\n r.ms = stop - start;\n if (!skip)\n console.log(`Finished ${t.category} ${t.name} for ${r.ms} ms`);\n r.category = t.category;\n r.name = t.name;\n return r;\n });\n}\n/* Waits [ms] milliseconds */\nexport function delay(ms) {\n return __awaiter(this, void 0, void 0, function* () {\n yield new Promise((r) => setTimeout(r, ms));\n });\n}\nexport function awaitCheck(checkHandler, error = 'Timeout exceeded', wait = 500) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n clearInterval(interval);\n reject(new Error(error));\n }, wait);\n // @ts-ignore\n const interval = setInterval(() => {\n if (checkHandler()) {\n clearInterval(interval);\n resolve();\n }\n }, 50);\n });\n });\n}\nexport function isDialogPresent(dialogTitle) {\n for (let i = 0; i < DG.Dialog.getOpenDialogs().length; i++) {\n if (DG.Dialog.getOpenDialogs()[i].title == dialogTitle)\n return true;\n }\n return false;\n}\nexport function testViewer(v, df, detectSemanticTypes = false) {\n return __awaiter(this, void 0, void 0, function* () {\n if (detectSemanticTypes)\n yield grok.data.detectSemanticTypes(df);\n const tv = grok.shell.addTableView(df);\n const viewerName = `[name=viewer-${v.replace(/\\s+/g, '-')} i]`;\n const selector = `${viewerName} canvas,${viewerName} svg,${viewerName} img,\n ${viewerName} input,${viewerName} h1,${viewerName} a`;\n const res = [];\n try {\n let viewer = tv.addViewer(v);\n yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer', 3000);\n res.push(Array.from(tv.viewers).length);\n Array.from(df.row(0).cells).forEach((c) => c.value = null);\n df.rows.select((row) => row.idx > 1 && row.idx < 7);\n for (let i = 7; i < 12; i++)\n df.filter.set(i, false);\n df.currentRowIdx = 1;\n const props = viewer.getOptions(true).look;\n const newProps = {};\n Object.keys(props).filter((k) => typeof props[k] === 'boolean').forEach((k) => newProps[k] = !props[k]);\n viewer.setOptions(newProps);\n yield delay(250);\n const layout = tv.saveLayout();\n const oldProps = viewer.getOptions().look;\n tv.resetLayout();\n res.push(Array.from(tv.viewers).length);\n tv.loadLayout(layout);\n yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer from layout', 3000);\n yield delay(250);\n res.push(Array.from(tv.viewers).length);\n viewer = Array.from(tv.viewers).find((v) => v.type !== 'Grid');\n expectArray(res, [2, 1, 2]);\n expect(JSON.stringify(viewer.getOptions().look), JSON.stringify(oldProps));\n }\n finally {\n tv.close();\n grok.shell.closeTable(df);\n }\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSXRDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FLZCxFQUFFLENBQUM7QUFFUCxNQUFNLENBQUMsSUFBSSxlQUF1QixDQUFDO0FBRW5DLE1BQU0sS0FBVyxNQUFNLENBTXRCO0FBTkQsV0FBaUIsTUFBTTtJQUVyQixTQUFnQixPQUFPLENBQUMsS0FBVSxFQUFFLElBQWE7UUFDL0MsSUFBSSxLQUFLLElBQUksSUFBSTtZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUhlLGNBQU8sVUFHdEIsQ0FBQTtBQUNILENBQUMsRUFOZ0IsTUFBTSxLQUFOLE1BQU0sUUFNdEI7QUFRRCxNQUFNLE9BQU8sV0FBVztJQUl0QixZQUFZLGNBQXdCLEVBQUUsTUFBZ0I7UUFIdEQsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUdiLElBQUksY0FBYyxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUN2RSxJQUFJLE1BQU0sS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDakQsQ0FBQztJQUFBLENBQUM7Q0FDSDtBQUVELE1BQU0sT0FBTyxJQUFJO0lBTWYsWUFBWSxRQUFnQixFQUFFLElBQVksRUFBRSxJQUF3QixFQUFFLE9BQXFCOztRQUN6RixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFH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SyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEMsTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUUsQ0FBQztZQUNoRSxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDNUU7Z0JBQVM7WUFDUixFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMzQjtJQUNILENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCBUaW1lb3V0ID0gTm9kZUpTLlRpbWVvdXQ7XG5cbmV4cG9ydCBjb25zdCB0ZXN0czoge1xuICBba2V5OiBzdHJpbmddOiB7XG4gICAgdGVzdHM/OiBUZXN0W10sIGJlZm9yZT86ICgpID0+IFByb21pc2U8dm9pZD4sIGFmdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBiZWZvcmVTdGF0dXM/OiBzdHJpbmcsIGFmdGVyU3RhdHVzPzogc3RyaW5nXG4gIH1cbn0gPSB7fTtcblxuZXhwb3J0IGxldCBjdXJyZW50Q2F0ZWdvcnk6IHN0cmluZztcblxuZXhwb3J0IG5hbWVzcGFjZSBhc3N1cmUge1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBub3ROdWxsKHZhbHVlOiBhbnksIG5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lID09IG51bGwgPyAnVmFsdWUnIDogbmFtZX0gbm90IGRlZmluZWRgKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RPcHRpb25zIHtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgdW5oYW5kbGVkRXhjZXB0aW9uVGltZW91dD86IG51bWJlcjtcbiAgc2tpcFJlYXNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFRlc3RDb250ZXh0IHtcbiAgY2F0Y2hVbmhhbmRsZWQgPSB0cnVlO1xuICByZXBvcnQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihjYXRjaFVuaGFuZGxlZD86IGJvb2xlYW4sIHJlcG9ydD86IGJvb2xlYW4pIHtcbiAgICBpZiAoY2F0Y2hVbmhhbmRsZWQgIT09IHVuZGVmaW5lZCkgdGhpcy5jYXRjaFVuaGFuZGxlZCA9IGNhdGNoVW5oYW5kbGVkO1xuICAgIGlmIChyZXBvcnQgIT09IHVuZGVmaW5lZCkgdGhpcy5yZXBvcnQgPSByZXBvcnQ7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBUZXN0IHtcbiAgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBUZXN0T3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihjYXRlZ29yeTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHRlc3Q6ICgpID0+IFByb21pc2U8YW55Piwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSB7XG4gICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgb3B0aW9ucyA/Pz0ge307XG4gICAgb3B0aW9ucy50aW1lb3V0ID8/PSAzMDAwMDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMudGVzdCA9IGFzeW5jICgpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRlc3QoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RFdmVudDxUPihldmVudDogT2JzZXJ2YWJsZTxUPixcbiAgaGFuZGxlcjogKGFyZ3M6IFQpID0+IHZvaWQsIHRyaWdnZXI6ICgpID0+IHZvaWQsIG1zOiBudW1iZXIgPSAwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IHN1YjogU3Vic2NyaXB0aW9uO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHN1YiA9IGV2ZW50LnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcihhcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICByZXNvbHZlKCdPSycpO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgfSwgbXMpO1xuICAgIHRyaWdnZXIoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0KG5hbWU6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+LCBvcHRpb25zPzogVGVzdE9wdGlvbnMpOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPSBbXTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyEucHVzaChuZXcgVGVzdChjdXJyZW50Q2F0ZWdvcnksIG5hbWUsIHRlc3QsIG9wdGlvbnMpKTtcbn1cblxuLyogVGVzdHMgdHdvIG9iamVjdHMgZm9yIGVxdWFsaXR5LCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3QoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkpOiB2b2lkIHtcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBcIiR7ZXhwZWN0ZWR9XCIsIGdvdCBcIiR7YWN0dWFsfVwiYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RGbG9hdChhY3R1YWw6IG51bWJlciwgZXhwZWN0ZWQ6IG51bWJlciwgdG9sZXJhbmNlID0gMC4wMDEpOiB2b2lkIHtcbiAgY29uc3QgYXJlRXF1YWwgPSBNYXRoLmFicyhhY3R1YWwgLSBleHBlY3RlZCkgPCB0b2xlcmFuY2U7XG4gIGlmICghYXJlRXF1YWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2V4cGVjdGVkfSwgZ290ICR7YWN0dWFsfSAodG9sZXJhbmNlID0gJHt0b2xlcmFuY2V9KWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0T2JqZWN0KGFjdHVhbDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgZXhwZWN0ZWQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHtcbiAgZm9yIChjb25zdCBbZXhwZWN0ZWRLZXksIGV4cGVjdGVkVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV4cGVjdGVkKSkge1xuICAgIGlmICghYWN0dWFsLmhhc093blByb3BlcnR5KGV4cGVjdGVkS2V5KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcHJvcGVydHkgXCIke2V4cGVjdGVkS2V5fVwiIG5vdCBmb3VuZGApO1xuXG4gICAgY29uc3QgYWN0dWFsVmFsdWUgPSBhY3R1YWxbZXhwZWN0ZWRLZXldO1xuICAgIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIEFycmF5ICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgIGV4cGVjdEFycmF5KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiBleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgZXhwZWN0T2JqZWN0KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChOdW1iZXIuaXNGaW5pdGUoYWN0dWFsVmFsdWUpICYmIE51bWJlci5pc0Zpbml0ZShleHBlY3RlZFZhbHVlKSlcbiAgICAgIGV4cGVjdEZsb2F0KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChhY3R1YWxWYWx1ZSAhPSBleHBlY3RlZFZhbHVlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAoJHtleHBlY3RlZFZhbHVlfSkgZm9yIGtleSAnJHtleHBlY3RlZEtleX0nLCBnb3QgKCR7YWN0dWFsVmFsdWV9KWApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheShhY3R1YWw6IEFycmF5TGlrZTxhbnk+LCBleHBlY3RlZDogQXJyYXlMaWtlPGFueT4pIHtcbiAgY29uc3QgYWN0dWFsTGVuZ3RoID0gYWN0dWFsLmxlbmd0aDtcbiAgY29uc3QgZXhwZWN0ZWRMZW5ndGggPSBleHBlY3RlZC5sZW5ndGg7XG5cbiAgaWYgKGFjdHVhbExlbmd0aCAhPSBleHBlY3RlZExlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQXJyYXlzIGFyZSBvZiBkaWZmZXJlbnQgbGVuZ3RoOiBhY3R1YWwgYXJyYXkgbGVuZ3RoIGlzICR7YWN0dWFsTGVuZ3RofSBgICtcbiAgICAgIGBhbmQgZXhwZWN0ZWQgYXJyYXkgbGVuZ3RoIGlzICR7ZXhwZWN0ZWRMZW5ndGh9YCk7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdHVhbExlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGFjdHVhbFtpXSBpbnN0YW5jZW9mIEFycmF5ICYmIGV4cGVjdGVkW2ldIGluc3RhbmNlb2YgQXJyYXkpXG4gICAgICBleHBlY3RBcnJheShhY3R1YWxbaV0sIGV4cGVjdGVkW2ldKTtcbiAgICBlbHNlIGlmIChhY3R1YWxbaV0gaW5zdGFuY2VvZiBPYmplY3QgJiYgZXhwZWN0ZWRbaV0gaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICBleHBlY3RPYmplY3QoYWN0dWFsW2ldLCBleHBlY3RlZFtpXSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsW2ldICE9IGV4cGVjdGVkW2ldKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2V4cGVjdGVkW2ldfSBhdCBwb3NpdGlvbiAke2l9LCBnb3QgJHthY3R1YWxbaV19YCk7XG4gIH1cbn1cblxuLyogRGVmaW5lcyBhIHRlc3Qgc3VpdGUuICovXG5leHBvcnQgZnVuY3Rpb24gY2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZywgdGVzdHM6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgY3VycmVudENhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gIHRlc3RzKCk7XG59XG5cbi8qIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZShiZWZvcmU6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5iZWZvcmUgPSBiZWZvcmU7XG59XG5cbi8qIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgdGVzdHMgaW4gdGhpcyBjYXRlZ29yeSBhcmUgZXhlY3V0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXIoYWZ0ZXI6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5hZnRlciA9IGFmdGVyO1xufVxuXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5UZXN0cyhvcHRpb25zPzogeyBjYXRlZ29yeT86IHN0cmluZywgdGVzdD86IHN0cmluZywgdGVzdENvbnRleHQ/OiBUZXN0Q29udGV4dCB9KSB7XG4gIGNvbnN0IHJlc3VsdHM6IHsgY2F0ZWdvcnk/OiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgcmVzdWx0OiBzdHJpbmcsIG1zOiBudW1iZXIsIHNraXBwZWQ6IGJvb2xlYW4gfVtdID0gW107XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gZ3Jvay5mdW5jdGlvbnMuZ2V0Q3VycmVudENhbGwoKT8uZnVuYz8ucGFja2FnZTtcbiAgY29uc29sZS5sb2coYFJ1bm5pbmcgdGVzdHNgKTtcbiAgb3B0aW9ucyA/Pz0ge307XG4gIG9wdGlvbnMhLnRlc3RDb250ZXh0ID8/PSBuZXcgVGVzdENvbnRleHQoKTtcbiAgZ3Jvay5zaGVsbC5sYXN0RXJyb3IgPSAnJztcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGVzdHMpKSB7XG4gICAgaWYgKG9wdGlvbnM/LmNhdGVnb3J5ICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG9wdGlvbnM/LmNhdGVnb3J5LnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYFN0YXJ0ZWQgJHtrZXl9IGNhdGVnb3J5YCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5iZWZvcmUpXG4gICAgICAgIGF3YWl0IHZhbHVlLmJlZm9yZSgpO1xuICAgIH0gY2F0Y2ggKHg6IGFueSkge1xuICAgICAgdmFsdWUuYmVmb3JlU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBjb25zdCB0ID0gdmFsdWUudGVzdHMgPz8gW107XG4gICAgY29uc3QgcmVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKVxuICAgICAgcmVzLnB1c2goYXdhaXQgZXhlY1Rlc3QodFtpXSwgb3B0aW9ucz8udGVzdCkpO1xuXG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCBQcm9taXNlLmFsbChyZXMpKS5maWx0ZXIoKGQpID0+IGQucmVzdWx0ICE9ICdza2lwcGVkJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5hZnRlcilcbiAgICAgICAgYXdhaXQgdmFsdWUuYWZ0ZXIoKTtcbiAgICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICAgIHZhbHVlLmFmdGVyU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAodmFsdWUuYWZ0ZXJTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5hZnRlclN0YXR1cywgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZX0pO1xuICAgIGlmICh2YWx1ZS5iZWZvcmVTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5iZWZvcmVTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlLCBtczogMCwgc2tpcHBlZDogZmFsc2V9KTtcbiAgICByZXN1bHRzLnB1c2goLi4uZGF0YSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMudGVzdENvbnRleHQuY2F0Y2hVbmhhbmRsZWQpIHtcbiAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICBpZiAoZ3Jvay5zaGVsbC5sYXN0RXJyb3IubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgY2F0ZWdvcnk6ICdVbmhhbmRsZWQgZXhjZXB0aW9ucycsXG4gICAgICAgIG5hbWU6ICdleGNlcHRpb25zJyxcbiAgICAgICAgcmVzdWx0OiBncm9rLnNoZWxsLmxhc3RFcnJvciwgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChvcHRpb25zLnRlc3RDb250ZXh0LnJlcG9ydCkge1xuICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBERy5Mb2dnZXIoKTtcbiAgICBjb25zdCBzdWNjZXNzZnVsID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuc3VjY2VzcykubGVuZ3RoO1xuICAgIGNvbnN0IHNraXBwZWQgPSByZXN1bHRzLmZpbHRlcigocikgPT4gci5za2lwcGVkKS5sZW5ndGg7XG4gICAgY29uc3QgZmFpbGVkID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+ICFyLnN1Y2Nlc3MpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gJ1BhY2thZ2UgQHBhY2thZ2UgdGVzdGVkOiBAc3VjY2Vzc2Z1bCBzdWNjZXNzZnVsLCBAc2tpcHBlZCBza2lwcGVkLCBAZmFpbGVkIGZhaWxlZCB0ZXN0cyc7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgc3VjY2Vzc2Z1bDogc3VjY2Vzc2Z1bCxcbiAgICAgIHNraXBwZWQ6IHNraXBwZWQsXG4gICAgICBmYWlsZWQ6IGZhaWxlZC5sZW5ndGgsXG4gICAgICBwYWNrYWdlOiBwYWNrYWdlTmFtZVxuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIGZhaWxlZCkgT2JqZWN0LmFzc2lnbihwYXJhbXMsIHtbYCR7ci5jYXRlZ29yeX0gfCAke3IubmFtZX1gXTogci5yZXN1bHR9KTtcbiAgICBsb2dnZXIubG9nKGRlc2NyaXB0aW9uLCBwYXJhbXMsICdwYWNrYWdlLXRlc3RlZCcpO1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjVGVzdCh0OiBUZXN0LCBwcmVkaWNhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICBsZXQgcjogeyBjYXRlZ29yeT86IHN0cmluZywgbmFtZT86IHN0cmluZywgc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIG1zOiBudW1iZXIsIHNraXBwZWQ6IGJvb2xlYW4gfTtcbiAgY29uc3QgZmlsdGVyID0gcHJlZGljYXRlICE9IHVuZGVmaW5lZCAmJiAoIXQubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocHJlZGljYXRlLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc2tpcCA9IHQub3B0aW9ucz8uc2tpcFJlYXNvbiB8fCBmaWx0ZXI7XG4gIGNvbnN0IHNraXBSZWFzb24gPSBmaWx0ZXIgPyAnc2tpcHBlZCcgOiB0Lm9wdGlvbnM/LnNraXBSZWFzb247XG4gIGlmICghc2tpcClcbiAgICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke3QuY2F0ZWdvcnl9ICR7dC5uYW1lfWApO1xuICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCk7XG5cbiAgdHJ5IHtcbiAgICBpZiAoc2tpcClcbiAgICAgIHIgPSB7c3VjY2VzczogdHJ1ZSwgcmVzdWx0OiBza2lwUmVhc29uISwgbXM6IDAsIHNraXBwZWQ6IHRydWV9O1xuICAgIGVsc2VcbiAgICAgIHIgPSB7c3VjY2VzczogdHJ1ZSwgcmVzdWx0OiBhd2FpdCB0LnRlc3QoKSA/PyAnT0snLCBtczogMCwgc2tpcHBlZDogZmFsc2V9O1xuICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICByID0ge3N1Y2Nlc3M6IGZhbHNlLCByZXN1bHQ6IHgudG9TdHJpbmcoKSwgbXM6IDAsIHNraXBwZWQ6IGZhbHNlfTtcbiAgfVxuICBjb25zdCBzdG9wID0gbmV3IERhdGUoKTtcbiAgLy8gQHRzLWlnbm9yZVxuICByLm1zID0gc3RvcCAtIHN0YXJ0O1xuICBpZiAoIXNraXApXG4gICAgY29uc29sZS5sb2coYEZpbmlzaGVkICR7dC5jYXRlZ29yeX0gJHt0Lm5hbWV9IGZvciAke3IubXN9IG1zYCk7XG5cbiAgci5jYXRlZ29yeSA9IHQuY2F0ZWdvcnk7XG4gIHIubmFtZSA9IHQubmFtZTtcbiAgcmV0dXJuIHI7XG59XG5cbi8qIFdhaXRzIFttc10gbWlsbGlzZWNvbmRzICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcikge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRDaGVjayhjaGVja0hhbmRsZXI6ICgpID0+IGJvb2xlYW4sXG4gIGVycm9yOiBzdHJpbmcgPSAnVGltZW91dCBleGNlZWRlZCcsIHdhaXQ6IG51bWJlciA9IDUwMCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICByZWplY3QobmV3IEVycm9yKGVycm9yKSk7XG4gICAgfSwgd2FpdCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGludGVydmFsOiBUaW1lb3V0ID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKGNoZWNrSGFuZGxlcigpKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSwgNTApO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGlhbG9nUHJlc2VudChkaWFsb2dUaXRsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgREcuRGlhbG9nLmdldE9wZW5EaWFsb2dzKCkubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoREcuRGlhbG9nLmdldE9wZW5EaWFsb2dzKClbaV0udGl0bGUgPT0gZGlhbG9nVGl0bGUpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0Vmlld2VyKHY6IHN0cmluZywgZGY6IERHLkRhdGFGcmFtZSwgZGV0ZWN0U2VtYW50aWNUeXBlczogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChkZXRlY3RTZW1hbnRpY1R5cGVzKSBhd2FpdCBncm9rLmRhdGEuZGV0ZWN0U2VtYW50aWNUeXBlcyhkZik7XG4gIGNvbnN0IHR2ID0gZ3Jvay5zaGVsbC5hZGRUYWJsZVZpZXcoZGYpO1xuICBjb25zdCB2aWV3ZXJOYW1lID0gYFtuYW1lPXZpZXdlci0ke3YucmVwbGFjZSgvXFxzKy9nLCAnLScpfSBpXWA7XG4gIGNvbnN0IHNlbGVjdG9yID0gYCR7dmlld2VyTmFtZX0gY2FudmFzLCR7dmlld2VyTmFtZX0gc3ZnLCR7dmlld2VyTmFtZX0gaW1nLFxuICAgICR7dmlld2VyTmFtZX0gaW5wdXQsJHt2aWV3ZXJOYW1lfSBoMSwke3ZpZXdlck5hbWV9IGFgO1xuICBjb25zdCByZXMgPSBbXTtcbiAgdHJ5IHtcbiAgICBsZXQgdmlld2VyID0gdHYuYWRkVmlld2VyKHYpO1xuICAgIGF3YWl0IGF3YWl0Q2hlY2soKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgIT09IG51bGwsXG4gICAgICAnY2Fubm90IGxvYWQgdmlld2VyJywgMzAwMCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIEFycmF5LmZyb20oZGYucm93KDApLmNlbGxzKS5mb3JFYWNoKChjKSA9PiBjLnZhbHVlID0gbnVsbCk7XG4gICAgZGYucm93cy5zZWxlY3QoKHJvdykgPT4gcm93LmlkeCA+IDEgJiYgcm93LmlkeCA8IDcpO1xuICAgIGZvciAobGV0IGkgPSA3OyBpIDwgMTI7IGkrKykgZGYuZmlsdGVyLnNldChpLCBmYWxzZSk7XG4gICAgZGYuY3VycmVudFJvd0lkeCA9IDE7XG4gICAgY29uc3QgcHJvcHMgPSB2aWV3ZXIuZ2V0T3B0aW9ucyh0cnVlKS5sb29rO1xuICAgIGNvbnN0IG5ld1Byb3BzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHByb3BzKS5maWx0ZXIoKGspID0+IHR5cGVvZiBwcm9wc1trXSA9PT0gJ2Jvb2xlYW4nKS5mb3JFYWNoKChrKSA9PiBuZXdQcm9wc1trXSA9ICFwcm9wc1trXSk7XG4gICAgdmlld2VyLnNldE9wdGlvbnMobmV3UHJvcHMpO1xuICAgIGF3YWl0IGRlbGF5KDI1MCk7XG4gICAgY29uc3QgbGF5b3V0ID0gdHYuc2F2ZUxheW91dCgpO1xuICAgIGNvbnN0IG9sZFByb3BzID0gdmlld2VyLmdldE9wdGlvbnMoKS5sb29rO1xuICAgIHR2LnJlc2V0TGF5b3V0KCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIHR2LmxvYWRMYXlvdXQobGF5b3V0KTtcbiAgICBhd2FpdCBhd2FpdENoZWNrKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpICE9PSBudWxsLFxuICAgICAgJ2Nhbm5vdCBsb2FkIHZpZXdlciBmcm9tIGxheW91dCcsIDMwMDApO1xuICAgIGF3YWl0IGRlbGF5KDI1MCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIHZpZXdlciA9IEFycmF5LmZyb20odHYudmlld2VycykuZmluZCgodikgPT4gdi50eXBlICE9PSAnR3JpZCcpITtcbiAgICBleHBlY3RBcnJheShyZXMsIFsyLCAxLCAyXSk7XG4gICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KHZpZXdlci5nZXRPcHRpb25zKCkubG9vayksIEpTT04uc3RyaW5naWZ5KG9sZFByb3BzKSk7XG4gIH0gZmluYWxseSB7XG4gICAgdHYuY2xvc2UoKTtcbiAgICBncm9rLnNoZWxsLmNsb3NlVGFibGUoZGYpO1xuICB9XG59XG4iXX0=","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".colored-text-input > textarea {\\n width: 100%;\\n -webkit-text-fill-color: transparent;\\n background-color: transparent;\\n position: relative;\\n z-index: 1;\\n resize: none;\\n height: 22px; /* Fine tuned value to avoid \\\"jumping\\\" of the textarea upon autoresize */\\n}\\n\\n.colored-text-input > div {\\n /* The values here are fine tuned to those of the ui.input textarea in order\\n * to achieve precise overlap */\\n overflow: auto;\\n position: absolute;\\n pointer-events: none;\\n cursor: text;\\n z-index: 0;\\n max-width: 100%;\\n padding: 2px;\\n line-height: normal;\\n font-family: 'Roboto Mono', 'Roboto Mono Local', monospace;\\n font-size: 12px;\\n color: transparent;\\n white-space: pre-wrap;\\n word-wrap: break-word;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/view/style/colored-text-input.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,WAAW;EACX,oCAAoC;EACpC,6BAA6B;EAC7B,kBAAkB;EAClB,UAAU;EACV,YAAY;EACZ,YAAY,EAAE,wEAAwE;AACxF;;AAEA;EACE;iCAC+B;EAC/B,cAAc;EACd,kBAAkB;EAClB,oBAAoB;EACpB,YAAY;EACZ,UAAU;EACV,eAAe;EACf,YAAY;EACZ,mBAAmB;EACnB,0DAA0D;EAC1D,eAAe;EACf,kBAAkB;EAClB,qBAAqB;EACrB,qBAAqB;AACvB\",\"sourcesContent\":[\".colored-text-input > textarea {\\n width: 100%;\\n -webkit-text-fill-color: transparent;\\n background-color: transparent;\\n position: relative;\\n z-index: 1;\\n resize: none;\\n height: 22px; /* Fine tuned value to avoid \\\"jumping\\\" of the textarea upon autoresize */\\n}\\n\\n.colored-text-input > div {\\n /* The values here are fine tuned to those of the ui.input textarea in order\\n * to achieve precise overlap */\\n overflow: auto;\\n position: absolute;\\n pointer-events: none;\\n cursor: text;\\n z-index: 0;\\n max-width: 100%;\\n padding: 2px;\\n line-height: normal;\\n font-family: 'Roboto Mono', 'Roboto Mono Local', monospace;\\n font-size: 12px;\\n color: transparent;\\n white-space: pre-wrap;\\n word-wrap: break-word;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* Naming convention: class names should begin with st and app name to avoid naming collitions */\\n\\n.st-structure-body {\\n padding-right: 20px;\\n}\\n\\n.st-structure-input-form {\\n text-align: right;\\n vertical-align: top;\\n min-width: 95px;\\n}\\n\\n.st-structure-direction-choice label {\\n min-width: 100px;\\n float: right;\\n}\\n\\n.st-structure-direction-choice div {\\n justify-content: right;\\n}\\n\\n.st-structure-text-input-td { /* Style for td containing textarea */\\n width: 100%;\\n}\\n\\n.st-structure-mol-img {\\n margin-right: 30px;\\n float: right;\\n}\\n\\n.st-structure-bool-button-block {\\n justify-content: right;\\n margin-bottom: 10px;\\n}\\n\\n.st-structure-bottom {\\n flex-direction: row-reverse;\\n padding-top: 20px;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/view/style/structure-app.css\"],\"names\":[],\"mappings\":\"AAAA,gGAAgG;;AAEhG;EACE,mBAAmB;AACrB;;AAEA;EACE,iBAAiB;EACjB,mBAAmB;EACnB,eAAe;AACjB;;AAEA;EACE,gBAAgB;EAChB,YAAY;AACd;;AAEA;EACE,sBAAsB;AACxB;;AAEA,8BAA8B,qCAAqC;EACjE,WAAW;AACb;;AAEA;EACE,kBAAkB;EAClB,YAAY;AACd;;AAEA;EACE,sBAAsB;EACtB,mBAAmB;AACrB;;AAEA;EACE,2BAA2B;EAC3B,iBAAiB;AACnB\",\"sourcesContent\":[\"/* Naming convention: class names should begin with st and app name to avoid naming collitions */\\n\\n.st-structure-body {\\n padding-right: 20px;\\n}\\n\\n.st-structure-input-form {\\n text-align: right;\\n vertical-align: top;\\n min-width: 95px;\\n}\\n\\n.st-structure-direction-choice label {\\n min-width: 100px;\\n float: right;\\n}\\n\\n.st-structure-direction-choice div {\\n justify-content: right;\\n}\\n\\n.st-structure-text-input-td { /* Style for td containing textarea */\\n width: 100%;\\n}\\n\\n.st-structure-mol-img {\\n margin-right: 30px;\\n float: right;\\n}\\n\\n.st-structure-bool-button-block {\\n justify-content: right;\\n margin-bottom: 10px;\\n}\\n\\n.st-structure-bottom {\\n flex-direction: row-reverse;\\n padding-top: 20px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* Naming convention: class names should begin with st and app name to avoid naming collitions */\\n.st-translator-input-table {\\n /* width: 100%; */\\n margin-right: 20px;\\n}\\n\\n.st-translator-input-table td:has(textarea) {\\n width: 100%;\\n}\\n\\n.st-translator-input-table td:has(select) {\\n min-width: 120px;\\n vertical-align: top;\\n}\\n\\n.st-translator-output-table {\\n margin-top: 20px;\\n margin-right: 20px;\\n margin-bottom: 10px;\\n}\\n\\n.st-translator-output-table table {\\n width: 100%;\\n table-layout: fixed;\\n}\\n\\n/* .st-translator-output-table table tbody tr td { */\\n/* max-width: 20%; */\\n/* } */\\n\\n.st-translator-output-table td {\\n padding-top: 6px;\\n padding-bottom: 6px;\\n}\\n.st-translator-output-table tr:nth-child(even) {\\n background-color: var(--grey-1);\\n}\\n\\n.st-translator-output-table td:nth-child(odd) {\\n width: 120px;\\n vertical-align: top;\\n}\\n\\n.st-translator-output-table td a {\\n overflow-wrap: break-word;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/view/style/translator-app.css\"],\"names\":[],\"mappings\":\"AAAA,gGAAgG;AAChG;EACE,iBAAiB;EACjB,kBAAkB;AACpB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,kBAAkB;EAClB,mBAAmB;AACrB;;AAEA;EACE,WAAW;EACX,mBAAmB;AACrB;;AAEA,oDAAoD;AACpD,sBAAsB;AACtB,MAAM;;AAEN;EACE,gBAAgB;EAChB,mBAAmB;AACrB;AACA;EACE,+BAA+B;AACjC;;AAEA;EACE,YAAY;EACZ,mBAAmB;AACrB;;AAEA;EACE,yBAAyB;AAC3B\",\"sourcesContent\":[\"/* Naming convention: class names should begin with st and app name to avoid naming collitions */\\n.st-translator-input-table {\\n /* width: 100%; */\\n margin-right: 20px;\\n}\\n\\n.st-translator-input-table td:has(textarea) {\\n width: 100%;\\n}\\n\\n.st-translator-input-table td:has(select) {\\n min-width: 120px;\\n vertical-align: top;\\n}\\n\\n.st-translator-output-table {\\n margin-top: 20px;\\n margin-right: 20px;\\n margin-bottom: 10px;\\n}\\n\\n.st-translator-output-table table {\\n width: 100%;\\n table-layout: fixed;\\n}\\n\\n/* .st-translator-output-table table tbody tr td { */\\n/* max-width: 20%; */\\n/* } */\\n\\n.st-translator-output-table td {\\n padding-top: 6px;\\n padding-bottom: 6px;\\n}\\n.st-translator-output-table tr:nth-child(even) {\\n background-color: var(--grey-1);\\n}\\n\\n.st-translator-output-table td:nth-child(odd) {\\n width: 120px;\\n vertical-align: top;\\n}\\n\\n.st-translator-output-table td a {\\n overflow-wrap: break-word;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","'use strict';\n\n(function () {\n var out$ = typeof exports != 'undefined' && exports || typeof define != 'undefined' && {} || this || window;\n if (typeof define !== 'undefined') define('save-svg-as-png', [], function () {\n return out$;\n });\n out$.default = out$;\n\n var xmlNs = 'http://www.w3.org/2000/xmlns/';\n var xhtmlNs = 'http://www.w3.org/1999/xhtml';\n var svgNs = 'http://www.w3.org/2000/svg';\n var doctype = '<?xml version=\"1.0\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\" [<!ENTITY nbsp \"&#160;\">]>';\n var urlRegex = /url\\([\"']?(.+?)[\"']?\\)/;\n var fontFormats = {\n woff2: 'font/woff2',\n woff: 'font/woff',\n otf: 'application/x-font-opentype',\n ttf: 'application/x-font-ttf',\n eot: 'application/vnd.ms-fontobject',\n sfnt: 'application/font-sfnt',\n svg: 'image/svg+xml'\n };\n\n var isElement = function isElement(obj) {\n return obj instanceof HTMLElement || obj instanceof SVGElement;\n };\n var requireDomNode = function requireDomNode(el) {\n if (!isElement(el)) throw new Error('an HTMLElement or SVGElement is required; got ' + el);\n };\n var requireDomNodePromise = function requireDomNodePromise(el) {\n return new Promise(function (resolve, reject) {\n if (isElement(el)) resolve(el);else reject(new Error('an HTMLElement or SVGElement is required; got ' + el));\n });\n };\n var isExternal = function isExternal(url) {\n return url && url.lastIndexOf('http', 0) === 0 && url.lastIndexOf(window.location.host) === -1;\n };\n\n var getFontMimeTypeFromUrl = function getFontMimeTypeFromUrl(fontUrl) {\n var formats = Object.keys(fontFormats).filter(function (extension) {\n return fontUrl.indexOf('.' + extension) > 0;\n }).map(function (extension) {\n return fontFormats[extension];\n });\n if (formats) return formats[0];\n console.error('Unknown font format for ' + fontUrl + '. Fonts may not be working correctly.');\n return 'application/octet-stream';\n };\n\n var arrayBufferToBase64 = function arrayBufferToBase64(buffer) {\n var binary = '';\n var bytes = new Uint8Array(buffer);\n for (var i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }return window.btoa(binary);\n };\n\n var getDimension = function getDimension(el, clone, dim) {\n var v = el.viewBox && el.viewBox.baseVal && el.viewBox.baseVal[dim] || clone.getAttribute(dim) !== null && !clone.getAttribute(dim).match(/%$/) && parseInt(clone.getAttribute(dim)) || el.getBoundingClientRect()[dim] || parseInt(clone.style[dim]) || parseInt(window.getComputedStyle(el).getPropertyValue(dim));\n return typeof v === 'undefined' || v === null || isNaN(parseFloat(v)) ? 0 : v;\n };\n\n var getDimensions = function getDimensions(el, clone, width, height) {\n if (el.tagName === 'svg') return {\n width: width || getDimension(el, clone, 'width'),\n height: height || getDimension(el, clone, 'height')\n };else if (el.getBBox) {\n var _el$getBBox = el.getBBox(),\n x = _el$getBBox.x,\n y = _el$getBBox.y,\n _width = _el$getBBox.width,\n _height = _el$getBBox.height;\n\n return {\n width: x + _width,\n height: y + _height\n };\n }\n };\n\n var reEncode = function reEncode(data) {\n return decodeURIComponent(encodeURIComponent(data).replace(/%([0-9A-F]{2})/g, function (match, p1) {\n var c = String.fromCharCode('0x' + p1);\n return c === '%' ? '%25' : c;\n }));\n };\n\n var uriToBlob = function uriToBlob(uri) {\n var byteString = window.atob(uri.split(',')[1]);\n var mimeString = uri.split(',')[0].split(':')[1].split(';')[0];\n var buffer = new ArrayBuffer(byteString.length);\n var intArray = new Uint8Array(buffer);\n for (var i = 0; i < byteString.length; i++) {\n intArray[i] = byteString.charCodeAt(i);\n }\n return new Blob([buffer], { type: mimeString });\n };\n\n var query = function query(el, selector) {\n if (!selector) return;\n try {\n return el.querySelector(selector) || el.parentNode && el.parentNode.querySelector(selector);\n } catch (err) {\n console.warn('Invalid CSS selector \"' + selector + '\"', err);\n }\n };\n\n var detectCssFont = function detectCssFont(rule, href) {\n // Match CSS font-face rules to external links.\n // @font-face {\n // src: local('Abel'), url(https://fonts.gstatic.com/s/abel/v6/UzN-iejR1VoXU2Oc-7LsbvesZW2xOQ-xsNqO47m55DA.woff2);\n // }\n var match = rule.cssText.match(urlRegex);\n var url = match && match[1] || '';\n if (!url || url.match(/^data:/) || url === 'about:blank') return;\n var fullUrl = url.startsWith('../') ? href + '/../' + url : url.startsWith('./') ? href + '/.' + url : url;\n return {\n text: rule.cssText,\n format: getFontMimeTypeFromUrl(fullUrl),\n url: fullUrl\n };\n };\n\n var inlineImages = function inlineImages(el) {\n return Promise.all(Array.from(el.querySelectorAll('image')).map(function (image) {\n var href = image.getAttributeNS('http://www.w3.org/1999/xlink', 'href') || image.getAttribute('href');\n if (!href) return Promise.resolve(null);\n if (isExternal(href)) {\n href += (href.indexOf('?') === -1 ? '?' : '&') + 't=' + new Date().valueOf();\n }\n return new Promise(function (resolve, reject) {\n var canvas = document.createElement('canvas');\n var img = new Image();\n img.crossOrigin = 'anonymous';\n img.src = href;\n img.onerror = function () {\n return reject(new Error('Could not load ' + href));\n };\n img.onload = function () {\n canvas.width = img.width;\n canvas.height = img.height;\n canvas.getContext('2d').drawImage(img, 0, 0);\n image.setAttributeNS('http://www.w3.org/1999/xlink', 'href', canvas.toDataURL('image/png'));\n resolve(true);\n };\n });\n }));\n };\n\n var cachedFonts = {};\n var inlineFonts = function inlineFonts(fonts) {\n return Promise.all(fonts.map(function (font) {\n return new Promise(function (resolve, reject) {\n if (cachedFonts[font.url]) return resolve(cachedFonts[font.url]);\n\n var req = new XMLHttpRequest();\n req.addEventListener('load', function () {\n // TODO: it may also be worth it to wait until fonts are fully loaded before\n // attempting to rasterize them. (e.g. use https://developer.mozilla.org/en-US/docs/Web/API/FontFaceSet)\n var fontInBase64 = arrayBufferToBase64(req.response);\n var fontUri = font.text.replace(urlRegex, 'url(\"data:' + font.format + ';base64,' + fontInBase64 + '\")') + '\\n';\n cachedFonts[font.url] = fontUri;\n resolve(fontUri);\n });\n req.addEventListener('error', function (e) {\n console.warn('Failed to load font from: ' + font.url, e);\n cachedFonts[font.url] = null;\n resolve(null);\n });\n req.addEventListener('abort', function (e) {\n console.warn('Aborted loading font from: ' + font.url, e);\n resolve(null);\n });\n req.open('GET', font.url);\n req.responseType = 'arraybuffer';\n req.send();\n });\n })).then(function (fontCss) {\n return fontCss.filter(function (x) {\n return x;\n }).join('');\n });\n };\n\n var cachedRules = null;\n var styleSheetRules = function styleSheetRules() {\n if (cachedRules) return cachedRules;\n return cachedRules = Array.from(document.styleSheets).map(function (sheet) {\n try {\n return { rules: sheet.cssRules, href: sheet.href };\n } catch (e) {\n console.warn('Stylesheet could not be loaded: ' + sheet.href, e);\n return {};\n }\n });\n };\n\n var inlineCss = function inlineCss(el, options) {\n var _ref = options || {},\n selectorRemap = _ref.selectorRemap,\n modifyStyle = _ref.modifyStyle,\n modifyCss = _ref.modifyCss,\n fonts = _ref.fonts,\n excludeUnusedCss = _ref.excludeUnusedCss;\n\n var generateCss = modifyCss || function (selector, properties) {\n var sel = selectorRemap ? selectorRemap(selector) : selector;\n var props = modifyStyle ? modifyStyle(properties) : properties;\n return sel + '{' + props + '}\\n';\n };\n var css = [];\n var detectFonts = typeof fonts === 'undefined';\n var fontList = fonts || [];\n styleSheetRules().forEach(function (_ref2) {\n var rules = _ref2.rules,\n href = _ref2.href;\n\n if (!rules) return;\n Array.from(rules).forEach(function (rule) {\n if (typeof rule.style != 'undefined') {\n if (query(el, rule.selectorText)) css.push(generateCss(rule.selectorText, rule.style.cssText));else if (detectFonts && rule.cssText.match(/^@font-face/)) {\n var font = detectCssFont(rule, href);\n if (font) fontList.push(font);\n } else if (!excludeUnusedCss) {\n css.push(rule.cssText);\n }\n }\n });\n });\n\n return inlineFonts(fontList).then(function (fontCss) {\n return css.join('\\n') + fontCss;\n });\n };\n\n var downloadOptions = function downloadOptions() {\n if (!navigator.msSaveOrOpenBlob && !('download' in document.createElement('a'))) {\n return { popup: window.open() };\n }\n };\n\n out$.prepareSvg = function (el, options, done) {\n requireDomNode(el);\n\n var _ref3 = options || {},\n _ref3$left = _ref3.left,\n left = _ref3$left === undefined ? 0 : _ref3$left,\n _ref3$top = _ref3.top,\n top = _ref3$top === undefined ? 0 : _ref3$top,\n w = _ref3.width,\n h = _ref3.height,\n _ref3$scale = _ref3.scale,\n scale = _ref3$scale === undefined ? 1 : _ref3$scale,\n _ref3$responsive = _ref3.responsive,\n responsive = _ref3$responsive === undefined ? false : _ref3$responsive,\n _ref3$excludeCss = _ref3.excludeCss,\n excludeCss = _ref3$excludeCss === undefined ? false : _ref3$excludeCss;\n\n return inlineImages(el).then(function () {\n var clone = el.cloneNode(true);\n clone.style.backgroundColor = (options || {}).backgroundColor || el.style.backgroundColor;\n\n var _getDimensions = getDimensions(el, clone, w, h),\n width = _getDimensions.width,\n height = _getDimensions.height;\n\n if (el.tagName !== 'svg') {\n if (el.getBBox) {\n if (clone.getAttribute('transform') != null) {\n clone.setAttribute('transform', clone.getAttribute('transform').replace(/translate\\(.*?\\)/, ''));\n }\n var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.appendChild(clone);\n clone = svg;\n } else {\n console.error('Attempted to render non-SVG element', el);\n return;\n }\n }\n\n clone.setAttribute('version', '1.1');\n clone.setAttribute('viewBox', [left, top, width, height].join(' '));\n if (!clone.getAttribute('xmlns')) clone.setAttributeNS(xmlNs, 'xmlns', svgNs);\n if (!clone.getAttribute('xmlns:xlink')) clone.setAttributeNS(xmlNs, 'xmlns:xlink', 'http://www.w3.org/1999/xlink');\n\n if (responsive) {\n clone.removeAttribute('width');\n clone.removeAttribute('height');\n clone.setAttribute('preserveAspectRatio', 'xMinYMin meet');\n } else {\n clone.setAttribute('width', width * scale);\n clone.setAttribute('height', height * scale);\n }\n\n Array.from(clone.querySelectorAll('foreignObject > *')).forEach(function (foreignObject) {\n foreignObject.setAttributeNS(xmlNs, 'xmlns', foreignObject.tagName === 'svg' ? svgNs : xhtmlNs);\n });\n\n if (excludeCss) {\n var outer = document.createElement('div');\n outer.appendChild(clone);\n var src = outer.innerHTML;\n if (typeof done === 'function') done(src, width, height);else return { src: src, width: width, height: height };\n } else {\n return inlineCss(el, options).then(function (css) {\n var style = document.createElement('style');\n style.setAttribute('type', 'text/css');\n style.innerHTML = '<![CDATA[\\n' + css + '\\n]]>';\n\n var defs = document.createElement('defs');\n defs.appendChild(style);\n clone.insertBefore(defs, clone.firstChild);\n\n var outer = document.createElement('div');\n outer.appendChild(clone);\n var src = outer.innerHTML.replace(/NS\\d+:href/gi, 'xmlns:xlink=\"http://www.w3.org/1999/xlink\" xlink:href');\n\n if (typeof done === 'function') done(src, width, height);else return { src: src, width: width, height: height };\n });\n }\n });\n };\n\n out$.svgAsDataUri = function (el, options, done) {\n requireDomNode(el);\n return out$.prepareSvg(el, options).then(function (_ref4) {\n var src = _ref4.src,\n width = _ref4.width,\n height = _ref4.height;\n\n var svgXml = 'data:image/svg+xml;base64,' + window.btoa(reEncode(doctype + src));\n if (typeof done === 'function') {\n done(svgXml, width, height);\n }\n return svgXml;\n });\n };\n\n out$.svgAsPngUri = function (el, options, done) {\n requireDomNode(el);\n\n var _ref5 = options || {},\n _ref5$encoderType = _ref5.encoderType,\n encoderType = _ref5$encoderType === undefined ? 'image/png' : _ref5$encoderType,\n _ref5$encoderOptions = _ref5.encoderOptions,\n encoderOptions = _ref5$encoderOptions === undefined ? 0.8 : _ref5$encoderOptions,\n canvg = _ref5.canvg;\n\n var convertToPng = function convertToPng(_ref6) {\n var src = _ref6.src,\n width = _ref6.width,\n height = _ref6.height;\n\n var canvas = document.createElement('canvas');\n var context = canvas.getContext('2d');\n var pixelRatio = window.devicePixelRatio || 1;\n\n canvas.width = width * pixelRatio;\n canvas.height = height * pixelRatio;\n canvas.style.width = canvas.width + 'px';\n canvas.style.height = canvas.height + 'px';\n context.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n\n if (canvg) canvg(canvas, src);else context.drawImage(src, 0, 0);\n\n var png = void 0;\n try {\n png = canvas.toDataURL(encoderType, encoderOptions);\n } catch (e) {\n if (typeof SecurityError !== 'undefined' && e instanceof SecurityError || e.name === 'SecurityError') {\n console.error('Rendered SVG images cannot be downloaded in this browser.');\n return;\n } else throw e;\n }\n if (typeof done === 'function') done(png, canvas.width, canvas.height);\n return Promise.resolve(png);\n };\n\n if (canvg) return out$.prepareSvg(el, options).then(convertToPng);else return out$.svgAsDataUri(el, options).then(function (uri) {\n return new Promise(function (resolve, reject) {\n var image = new Image();\n image.onload = function () {\n return resolve(convertToPng({\n src: image,\n width: image.width,\n height: image.height\n }));\n };\n image.onerror = function () {\n reject('There was an error loading the data URI as an image on the following SVG\\n' + window.atob(uri.slice(26)) + 'Open the following link to see browser\\'s diagnosis\\n' + uri);\n };\n image.src = uri;\n });\n });\n };\n\n out$.download = function (name, uri, options) {\n if (navigator.msSaveOrOpenBlob) navigator.msSaveOrOpenBlob(uriToBlob(uri), name);else {\n var saveLink = document.createElement('a');\n if ('download' in saveLink) {\n saveLink.download = name;\n saveLink.style.display = 'none';\n document.body.appendChild(saveLink);\n try {\n var blob = uriToBlob(uri);\n var url = URL.createObjectURL(blob);\n saveLink.href = url;\n saveLink.onclick = function () {\n return requestAnimationFrame(function () {\n return URL.revokeObjectURL(url);\n });\n };\n } catch (e) {\n console.error(e);\n console.warn('Error while getting object URL. Falling back to string URL.');\n saveLink.href = uri;\n }\n saveLink.click();\n document.body.removeChild(saveLink);\n } else if (options && options.popup) {\n options.popup.document.title = name;\n options.popup.location.replace(uri);\n }\n }\n };\n\n out$.saveSvg = function (el, name, options) {\n var downloadOpts = downloadOptions(); // don't inline, can't be async\n return requireDomNodePromise(el).then(function (el) {\n return out$.svgAsDataUri(el, options || {});\n }).then(function (uri) {\n return out$.download(name, uri, downloadOpts);\n });\n };\n\n out$.saveSvgAsPng = function (el, name, options) {\n var downloadOpts = downloadOptions(); // don't inline, can't be async\n return requireDomNodePromise(el).then(function (el) {\n return out$.svgAsPngUri(el, options || {});\n }).then(function (uri) {\n return out$.download(name, uri, downloadOpts);\n });\n };\n})();","\"use strict\";\n\nvar stylesInDOM = [];\n\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n\n return result;\n}\n\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n\n identifiers.push(identifier);\n }\n\n return identifiers;\n}\n\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n\n return updater;\n}\n\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n\n var newLastIdentifiers = modulesToDom(newList, options);\n\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n\n var _index = getIndexByIdentifier(_identifier);\n\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n\n stylesInDOM.splice(_index, 1);\n }\n }\n\n lastIdentifiers = newLastIdentifiers;\n };\n};","\"use strict\";\n\nvar memo = {};\n/* istanbul ignore next */\n\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n\n memo[target] = styleTarget;\n }\n\n return memo[target];\n}\n/* istanbul ignore next */\n\n\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n\n target.appendChild(style);\n}\n\nmodule.exports = insertBySelector;","\"use strict\";\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\n\nmodule.exports = insertStyleElement;","\"use strict\";\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = typeof __webpack_nonce__ !== \"undefined\" ? __webpack_nonce__ : null;\n\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\n\nmodule.exports = setAttributesWithoutAttributes;","\"use strict\";\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n\n var needLayer = typeof obj.layer !== \"undefined\";\n\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n\n css += obj.css;\n\n if (needLayer) {\n css += \"}\";\n }\n\n if (obj.media) {\n css += \"}\";\n }\n\n if (obj.supports) {\n css += \"}\";\n }\n\n var sourceMap = obj.sourceMap;\n\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n } // For old IE\n\n /* istanbul ignore if */\n\n\n options.styleTagTransform(css, styleElement, options.options);\n}\n\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n\n styleElement.parentNode.removeChild(styleElement);\n}\n/* istanbul ignore next */\n\n\nfunction domAPI(options) {\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\n\nmodule.exports = domAPI;","\"use strict\";\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n\n styleElement.appendChild(document.createTextNode(css));\n }\n}\n\nmodule.exports = styleTagTransform;","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nexport const NUCLEOTIDES = ['A', 'G', 'C', 'U', 'T'];\n\nexport const TECHNOLOGIES = {\n DNA: 'DNA',\n RNA: 'RNA',\n ASO_GAPMERS: 'ASOGapmers',\n SI_RNA: 'siRNA',\n};\n\nexport enum DEFAULT_FORMATS {\n HELM = 'HELM',\n AXOLABS = 'Axolabs',\n}\n","export const LIB_PATH = 'System:AppData/SequenceTranslator';\nexport const DEFAULT_LIB_FILENAME = 'monomer-lib.json';\n\nexport const APP_PATH = 'System:AppData/SequenceTranslator';\nexport const AXOLABS_STYLE_FILENAME = 'axolabs-style.json';\nexport const CODES_TO_HELM_DICT_FILENAME = 'formats-to-helm.json';\nexport const CODES_TO_SYMBOLS_FILENAME = 'codes-to-symbols.json';\nexport const MONOMERS_WITH_PHOSPHATE_LINKERS = 'linkers.json';\n","/* 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 {APP_PATH, AXOLABS_STYLE_FILENAME, CODES_TO_HELM_DICT_FILENAME, CODES_TO_SYMBOLS_FILENAME, MONOMERS_WITH_PHOSPHATE_LINKERS} from './const';\nimport {AxolabsStyle, FormatToHELMDict, CodeToSymbol} from './types';\n\nconst fileSource = new DG.FileSource(APP_PATH);\n\nexport let axolabsStyleMap: AxolabsStyle;\nexport let codesToHelmDictionary: FormatToHELMDict;\nexport let codesToSymbolsDictionary: CodeToSymbol;\nexport let monomersWithPhosphateLinkers: {[key: string]: string[]};\n\nexport async function getJsonData(): Promise<void> {\n const data = [axolabsStyleMap, codesToHelmDictionary, codesToSymbolsDictionary, monomersWithPhosphateLinkers];\n\n if (data.every((item) => item !== undefined))\n return;\n\n axolabsStyleMap = await parse(AXOLABS_STYLE_FILENAME);\n codesToHelmDictionary = await parse(CODES_TO_HELM_DICT_FILENAME);\n codesToSymbolsDictionary = await parse(CODES_TO_SYMBOLS_FILENAME);\n monomersWithPhosphateLinkers = await parse(MONOMERS_WITH_PHOSPHATE_LINKERS);\n}\n\nasync function parse(path: string): Promise<any> {\n let parsedJson: string;\n try {\n parsedJson = JSON.parse(await fileSource.readAsText(path))\n } catch (err: any) {\n const errMsg: string = err.hasOwnProperty('message') ? err.message : err.toString();\n throw new Error(`Error loading json from ${path}:` + errMsg);\n }\n return parsedJson;\n}\n\n","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nexport function sortByReverseLength(array: string[]): string[] {\n return array.sort((a, b) => b.length - a.length);\n}\n\nexport function download(name: string, href: string): void {\n const element = document.createElement('a');\n element.setAttribute('href', 'data:text/plain;charset=utf-8,' + href);\n element.setAttribute('download', name);\n element.click();\n}\n\nexport async function tryCatch<T>(func: () => Promise<T>, finallyFunc?: () => any, callbackName: string = 'Oligo app'): Promise<T> {\n try {\n return await func();\n } catch (err: any) {\n const errMsg: string = err.hasOwnProperty('message') ? err.message : err.toString();\n grok.shell.error(`${callbackName} error: ` + errMsg);\n throw err;\n } finally {\n if (finallyFunc)\n finallyFunc();\n }\n};\n\n","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {_package} from '../../package';\nimport {DEFAULT_FORMATS} from '../const';\n\nimport {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types';\n\nimport {HELM_REQUIRED_FIELDS as REQ, HELM_OPTIONAL_FIELDS as OPT} from '@datagrok-libraries/bio/src/utils/const';\nimport {META_FIELDS as MET} from './const';\nimport {codesToSymbolsDictionary} from '../../model/data-loading-utils/json-loader';\n\nexport class MonomerLibWrapper {\n private constructor() {\n const lib = _package.monomerLib;\n if (lib === null)\n throw new Error('SequenceTranslator: monomer library is null');\n this.lib = lib!;\n this.allMonomers = this.getAllMonomers();\n }\n\n private lib: IMonomerLib;\n private static instance?: MonomerLibWrapper;\n private allMonomers: Monomer[];\n\n private formatMonomerForViewer(sourceObj: Monomer): {[key: string]: string} {\n const formattedObject: {[key: string]: string} = {};\n formattedObject[REQ.NAME] = sourceObj[REQ.SYMBOL];\n formattedObject[REQ.SYMBOL] = sourceObj[REQ.SYMBOL];\n formattedObject[REQ.MOLFILE] = sourceObj[REQ.MOLFILE];\n const formats = this.getAllFormats();\n formats.forEach((format) => {\n if (format === DEFAULT_FORMATS.HELM)\n return;\n const map = codesToSymbolsDictionary[format];\n const codes = Object.keys(map).filter((code) => map[code] === sourceObj.symbol);\n formattedObject[format] = codes.join(', ');\n })\n\n return formattedObject;\n }\n\n private getAllMonomers(): Monomer[] {\n const polymerTypes = this.lib.getPolymerTypes();\n let result: Monomer[] = [];\n for (const polymerType of polymerTypes) {\n const monomerSymbols = this.lib.getMonomerSymbolsByType(polymerType);\n const monomersByType: Monomer[] = monomerSymbols\n .map((monomerSymbol) => this.lib.getMonomer(polymerType, monomerSymbol))\n .filter((monomer): monomer is Monomer => monomer !== null);\n result = result.concat(monomersByType);\n }\n return result;\n }\n\n private getMonomer(monomerSymbol: string): Monomer {\n const monomer = this.lib.getMonomer('RNA', monomerSymbol);\n if (monomer === undefined)\n throw new Error(`SequenceTranslator: no monomer with symbol ${monomerSymbol}`);\n return monomer!;\n }\n\n static getInstance(): MonomerLibWrapper {\n if (MonomerLibWrapper.instance === undefined)\n MonomerLibWrapper.instance = new MonomerLibWrapper();\n return MonomerLibWrapper.instance!;\n }\n\n getMolfileBySymbol(monomerSymbol: string): string {\n const monomer = this.getMonomer(monomerSymbol);\n return monomer.molfile;\n }\n\n getNaturalAnalogBySymbol(monomerSymbol: string): string {\n const monomer = this.getMonomer(monomerSymbol);\n const naturalAnalog = monomer.naturalAnalog;\n if (!naturalAnalog)\n throw new Error(`ST: no natural analog for ${monomerSymbol}`);\n return naturalAnalog!;\n }\n\n // todo: a better criterion\n isModification(monomerSymbol: string): boolean {\n const molfile = this.getMolfileBySymbol(monomerSymbol);\n return (molfile.includes('MODIFICATION')) ? true : false;\n }\n\n getCodeToSymbolMap(format: string): Map<string, string> {\n return new Map<string, string>(Object.entries(codesToSymbolsDictionary[format]));\n }\n\n getCodesByFormat(format: string): string[] {\n return Object.keys(codesToSymbolsDictionary[format]);\n }\n\n getAllFormats(): string[] {\n return Object.keys(codesToSymbolsDictionary);\n }\n\n getTableForViewer(): DG.DataFrame {\n const formattedObjects = this.allMonomers.map((monomer) => this.formatMonomerForViewer(monomer));\n const df = DG.DataFrame.fromObjects(formattedObjects)!;\n return df;\n }\n\n getCodesToWeightsMap(): Map<string, number> {\n const codesToWeightsMap = new Map<string, number>();\n Object.entries(codesToSymbolsDictionary).forEach(([_, dict]) => {\n Object.entries(dict).forEach(([code, monomerSymbol]) => {\n const monomer = this.getMonomer(monomerSymbol);\n const weight = monomer[OPT.META]?.[MET.MOLWEIGHT];\n codesToWeightsMap.set(code, weight);\n });\n });\n return codesToWeightsMap;\n }\n}\n","import {NUCLEOTIDES} from '../const';\nimport {MonomerLibWrapper} from '../monomer-lib/lib-wrapper';\nimport {sortByReverseLength} from '../helpers';\nimport {DEFAULT_FORMATS} from '../const';\n\nexport class SequenceValidator {\n constructor(private sequence: string) {\n this.libWrapper = MonomerLibWrapper.getInstance();\n };\n private libWrapper: MonomerLibWrapper;\n\n getInvalidCodeIndex(format: string): number {\n if (format === DEFAULT_FORMATS.HELM)\n return this.sequence.length;\n const firstUniqueCharacters = ['r', 'd']; // what for?\n const codes = sortByReverseLength(\n this.libWrapper.getCodesByFormat(format)\n );\n let indexOfFirstInvalidChar = 0;\n while (indexOfFirstInvalidChar < this.sequence.length) {\n const matchedCode = codes.find((code) => {\n const subSequence = this.sequence.substring(indexOfFirstInvalidChar, indexOfFirstInvalidChar + code.length);\n return code === subSequence;\n });\n\n if (!matchedCode) break;\n\n // todo: refactor the vague condition\n if ( // for mistake pattern 'rAA'\n indexOfFirstInvalidChar > 1 &&\n NUCLEOTIDES.includes(this.sequence[indexOfFirstInvalidChar]) &&\n firstUniqueCharacters.includes(this.sequence[indexOfFirstInvalidChar - 2])\n ) break;\n\n if ( // for mistake pattern 'ArA'\n firstUniqueCharacters.includes(this.sequence[indexOfFirstInvalidChar + 1]) &&\n NUCLEOTIDES.includes(this.sequence[indexOfFirstInvalidChar])\n ) {\n indexOfFirstInvalidChar++;\n break;\n }\n indexOfFirstInvalidChar += matchedCode.length;\n }\n if (indexOfFirstInvalidChar === this.sequence.length)\n indexOfFirstInvalidChar = -1\n return indexOfFirstInvalidChar;\n }\n\n isValidSequence(format: string): boolean {\n return this.getInvalidCodeIndex(format) === -1;\n }\n}\n","export const GROUP_TYPE = {\n NUCLEOSIDE: 'nucleoside',\n LINKAGE: 'phosphateBackbone',\n} as const;\n\nexport const PHOSPHATE_SYMBOL = 'p';\n\nexport const UNKNOWN_SYMBOL = '<?>';\n","import {DEFAULT_FORMATS, NUCLEOTIDES} from '../const';\nimport {UNKNOWN_SYMBOL} from './const';\nimport {FormatConverter} from './format-converter';\nimport {codesToHelmDictionary} from '../data-loading-utils/json-loader';\nimport {MonomerLibWrapper} from '../monomer-lib/lib-wrapper';\n\nexport function getTranslatedSequences(sequence: string, indexOfFirstInvalidChar: number, sourceFormat: string): {[key: string]: string} {\n const supportedFormats = Object.keys(codesToHelmDictionary).concat([DEFAULT_FORMATS.HELM]) as string[];\n\n if (!sequence || (indexOfFirstInvalidChar !== -1 && sourceFormat !== DEFAULT_FORMATS.HELM))\n return {};\n\n if (!supportedFormats.includes(sourceFormat))\n throw new Error(`${sourceFormat} format is not supported by SequenceTranslator`)\n\n const outputFormats = supportedFormats.filter((el) => el != sourceFormat)\n .sort((a, b) => a.localeCompare(b));\n const converter = new FormatConverter(sequence, sourceFormat);\n const result = Object.fromEntries(\n outputFormats.map((format) => {\n let translation;\n try {\n translation = converter.convertTo(format);\n } catch {\n translation = null;\n }\n return [format, translation];\n }).filter(([format, translation]) => translation)\n )\n const helm = (sourceFormat === DEFAULT_FORMATS.HELM) ? sequence : result[DEFAULT_FORMATS.HELM];\n const nucleotides = getNucleotidesSequence(helm, MonomerLibWrapper.getInstance());\n if (nucleotides)\n result['Nucleotides'] = nucleotides;\n return result;\n}\n\nexport function getNucleotidesSequence(helmString: string, monomerLib: MonomerLibWrapper): string | null {\n const re = new RegExp('\\\\([^()]*\\\\)', 'g');\n const branches = helmString.match(re);\n if (!branches)\n return null;\n const nucleotides = branches!.map((branch) => {\n const stripped = branch.replace(/[\\[\\]()]/g, '');\n if (NUCLEOTIDES.includes(stripped))\n return stripped;\n return monomerLib.getNaturalAnalogBySymbol(stripped);\n }).map((el) => el ? el : UNKNOWN_SYMBOL).join('');\n return nucleotides;\n}\n","/* 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 {codesToHelmDictionary} from '../data-loading-utils/json-loader';\nimport {CodesInfo} from '../data-loading-utils/types';\nimport {DEFAULT_FORMATS} from '../const';\nimport {GROUP_TYPE, PHOSPHATE_SYMBOL} from '../translator-app/const';\n\nconst inverseLengthComparator = (a: string, b: string) => b.length - a.length;\n\nexport class FormatHandler {\n constructor() {\n this.formats = this.getFormats();\n }\n\n /** Includes all formats except HELM (the \"default\" one) */\n private formats: string[];\n\n /** All format names except HELM (the \"default\" one) */\n getFormatNames(): string[] {\n return this.formats.sort();\n };\n\n getCodesByFormat(format: string): string[] {\n this.validateFormat(format);\n\n if (this.isHelm(format))\n throw new Error(`Codes cannot be obtained for HELM`);\n return this.getFormatCodes(format);\n }\n\n getHelmToFormatDict(format: string): {[key: string]: string} {\n this.validateFormat(format);\n\n const codesInfoObject = codesToHelmDictionary[format] as CodesInfo;\n const dict = getHelmToCodeDict(codesInfoObject);\n return dict;\n }\n\n getFormatToHelmDict(format: string): {[key: string]: string} {\n this.validateFormat(format);\n\n const codesInfoObject = codesToHelmDictionary[format] as CodesInfo;\n const dict = Object.assign({}, ...Object.values(codesInfoObject)) as {[code: string]: string};\n return dict;\n }\n\n /** Get helm codes for the specified format */\n getTargetFormatHelmCodes(format: string): string[] {\n this.validateFormat(format);\n\n const dict = this.getHelmToFormatDict(format);\n const helmCodes = Object.keys(dict).sort(inverseLengthComparator);\n return helmCodes;\n }\n\n getTargetFormatHelmCodesRegExp(format: string): RegExp {\n this.validateFormat(format);\n\n const helmCodes = this.getTargetFormatHelmCodes(format);\n const helmRegExp = new RegExp(getRegExpPattern(helmCodes) + '|.', 'g');\n return helmRegExp;\n }\n\n getFormatRegExp(format: string): RegExp {\n this.validateFormat(format);\n\n if (this.isHelm(format))\n throw new Error(`Helm RegExp can be built for non-HELM target formats`);\n return this.getNonHelmFormatRegExp(format);\n }\n\n getPhosphateHelmCodesRegExp(format: string): RegExp {\n this.validateFormat(format);\n\n const codesInfoObject = codesToHelmDictionary[format] as CodesInfo;\n const phosphateHELMCodes = Array.from(\n new Set(Object.values(codesInfoObject[GROUP_TYPE.LINKAGE]))\n ).sort(inverseLengthComparator);\n const phosphateHELMPattern = getRegExpPattern(phosphateHELMCodes);\n const phosphateRegExp = new RegExp(`${PHOSPHATE_SYMBOL}\\.(${phosphateHELMPattern})`, 'g');\n return phosphateRegExp;\n }\n\n isValidFormat(format: string): boolean {\n return this.formats.includes(format);\n }\n\n private getFormats(): string[] {\n return Object.keys(codesToHelmDictionary);\n }\n\n private validateFormat(format: string) {\n if (!this.isValidFormat(format))\n throw new Error(`Invalid format: ${format}`);\n }\n\n private isHelm(format: string): boolean {\n return format === DEFAULT_FORMATS.HELM;\n }\n\n private getFormatCodes(format: string): string[] {\n const dict = this.getFormatToHelmDict(format);\n const formatCodes = Object.keys(dict).sort(inverseLengthComparator);\n return formatCodes;\n }\n \n private getNonHelmFormatRegExp(format: string): RegExp {\n const formatCodes = this.getCodesByFormat(format);\n const formatRegExp = new RegExp(getRegExpPattern(formatCodes) + '|\\\\([^()]*\\\\)|.', 'g'); // the added group before '|.' is to avoid mismatch inside parenths\n return formatRegExp;\n }\n}\n\nexport function getRegExpPattern(arr: string[]): string {\n const negativeLookBehind = '(?<!\\\\([^()]*)'; // not '(' followed by non-parenths\n const negativeLookAhead = '(?![^()]*\\\\))'; // not ')' preceded by non-parenths\n const escaped = arr.map((key) => key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .map((key) => {\n if (!key.includes('(') && !key.includes(')'))\n return `${negativeLookBehind}${key}${negativeLookAhead}`;\n return key;\n });\n const result = escaped.join('|');\n return result;\n}\n\nfunction getHelmToCodeDict(infoObj: CodesInfo) {\n const result: {[key: string]: string | string[]} = {};\n Object.values(infoObj).forEach((obj: {[code: string]: string}) => {\n Object.entries(obj).forEach(([code, helm]) => {\n const key = helm.replace(/\\)p/g, ')').replace(/\\]p/g, ']');\n if (result[key] === undefined) {\n result[key] = [code];\n } else {\n (result[key] as string[]).push(code);\n }\n })\n });\n Object.entries(result).forEach(([key, value]) => {\n const sorted = (value as string[]).sort(inverseLengthComparator);\n result[key] = sorted[0] as string;\n })\n return result as {[key: string]: string};\n}\n","import * as DG from 'datagrok-api/dg';\nimport {DEFAULT_FORMATS} from '../const';\nimport {PHOSPHATE_SYMBOL, UNKNOWN_SYMBOL} from './const';\nimport {FormatHandler, getRegExpPattern} from '../parsing-validation/format-handler';\n\nconst HELM_WRAPPER = {\n LEFT: 'RNA1{',\n RIGHT: '}$$$$',\n};\n\nexport class FormatConverter {\n constructor(private readonly sequence: string, private readonly sourceFormat: string) { };\n\n private formats = new FormatHandler();\n\n convertTo(targetFormat: string): string {\n const formats = this.formats.getFormatNames();\n\n if (this.sourceFormat === DEFAULT_FORMATS.HELM && formats.includes(targetFormat))\n return this.helmToFormat(this.sequence, targetFormat);\n else if (formats.includes(this.sourceFormat) && targetFormat === DEFAULT_FORMATS.HELM)\n return this.formatToHelm(this.sequence, this.sourceFormat);\n else if ([this.sourceFormat, targetFormat].every((el) => formats.includes(el))) {\n const helm = this.formatToHelm(this.sequence, this.sourceFormat);\n return this.helmToFormat(helm, targetFormat);\n }\n else {\n throw new Error (`ST: unsupported translation direction ${this.sourceFormat} -> ${targetFormat}`);\n }\n }\n\n private helmToFormat(helmSequence: string, targetFormat: string): string {\n const wrapperRegExp = new RegExp(getRegExpPattern(Object.values(HELM_WRAPPER)), 'g')\n let result = helmSequence.replace(wrapperRegExp, '');\n\n const dict = this.formats.getHelmToFormatDict(targetFormat);\n const helmCodes = this.formats.getTargetFormatHelmCodes(targetFormat);\n const helmRegExp = this.formats.getTargetFormatHelmCodesRegExp(targetFormat);\n\n result = result.replace(helmRegExp, (match) => {\n return helmCodes.includes(match) ? dict[match] :\n (match === 'p' || match === '.') ? match : '?';\n }).replace(/\\?+/g, UNKNOWN_SYMBOL).replace(/p\\.|\\./g, '');\n result = result.replace(/<empty>/g, '');\n // remove double slash in LCMS codes\n result = result.replace(/\\/\\//g, '/');\n return result;\n }\n\n private formatToHelm(sequence: string, sourceFormat: string): string {\n const dict = this.formats.getFormatToHelmDict(sourceFormat);\n const formatCodes = this.formats.getCodesByFormat(sourceFormat);\n const formatRegExp = this.formats.getFormatRegExp(sourceFormat);\n const phosphateRegExp = this.formats.getPhosphateHelmCodesRegExp(sourceFormat);\n\n let helm = sequence.replace(formatRegExp, (match) => {\n const result = formatCodes.includes(match) ? dict[match] + '.' : '?';\n return result;\n });\n helm = helm.replace(/\\?+/g, `${UNKNOWN_SYMBOL}.`);\n helm = helm.slice(0, -1); // strip last dot\n if (helm[helm.length - 1] === PHOSPHATE_SYMBOL)\n helm = helm.slice(0, -1);\n helm = helm.replace(phosphateRegExp, (match, group) => group);\n helm = helm.replace(/<empty>/g, '');\n return `${HELM_WRAPPER.LEFT + helm + HELM_WRAPPER.RIGHT}`;\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = ui;","const __WEBPACK_NAMESPACE_OBJECT__ = wu;","import { CandidateType } from './types';\n/** enum type to simplify setting \"user-friendly\" notation if necessary */\nexport var NOTATION;\n(function (NOTATION) {\n NOTATION[\"FASTA\"] = \"fasta\";\n NOTATION[\"SEPARATOR\"] = \"separator\";\n NOTATION[\"HELM\"] = \"helm\";\n})(NOTATION || (NOTATION = {}));\nexport const positionSeparator = ', ';\nexport const monomerRe = /(?:\\[([A-Za-z0-9_\\-,()]+)\\])|([A-Za-z\\-])/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","/**\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","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 { 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","import * as DG from 'datagrok-api/dg';\nimport wu from 'wu';\nimport { NOTATION, candidateAlphabets, positionSeparator } from './macromolecule';\nimport { detectAlphabet, getSplitterForColumn, getSplitterWithSeparator, splitterAsFasta, splitterAsFastaSimple, splitterAsHelm } 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}();\nexport const GapSymbols = {\n [NOTATION.FASTA]: '-',\n [NOTATION.SEPARATOR]: '',\n [NOTATION.HELM]: '*',\n};\n/** Class for handling notation units in Macromolecule columns and\n * conversion of notation systems in Macromolecule columns\n */\nexport class UnitsHandler {\n static setUnitsToFastaColumn(uh) {\n if (uh.column.semType !== DG.SEMTYPE.MACROMOLECULE || uh.column.getTag(DG.TAGS.UNITS) !== NOTATION.FASTA)\n throw new Error(`The column of notation '${NOTATION.FASTA}' must be '${DG.SEMTYPE.MACROMOLECULE}'.`);\n uh.column.setTag(DG.TAGS.UNITS, 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) !== NOTATION.SEPARATOR)\n throw new Error(`The column of notation '${NOTATION.SEPARATOR}' must be '${DG.SEMTYPE.MACROMOLECULE}'.`);\n if (!separator)\n throw new Error(`The column of notation '${NOTATION.SEPARATOR}' must have the separator tag.`);\n uh.column.setTag(DG.TAGS.UNITS, 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 '${NOTATION.HELM}' must be '${DG.SEMTYPE.MACROMOLECULE}'`);\n uh.column.setTag(DG.TAGS.UNITS, 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 ([NOTATION.FASTA, 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 === 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 == 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 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 === 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 get maxLength() {\n if (this._maxLength === null)\n this._maxLength = Math.max(...this.splitted.map((seqS) => seqS.length));\n return this._maxLength;\n }\n get posList() {\n if (this._posList === null) {\n const posListTxt = this.column.getTag(\".positionNames\" /* TAGS.positionNames */);\n this._posList = posListTxt ? posListTxt.split(positionSeparator).map((p) => p.trim()) :\n wu.count(1).take(this.maxLength).map((pos) => pos.toString()).toArray();\n }\n return this._posList;\n }\n isFasta() { return this.notation === NOTATION.FASTA; }\n isSeparator() { return this.notation === NOTATION.SEPARATOR; }\n isHelm() { return this.notation === 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 isGap(m) {\n return !m || (this.units === NOTATION.FASTA && m === GapSymbols[NOTATION.FASTA]) ||\n (this.units === NOTATION.HELM && m === GapSymbols[NOTATION.HELM]);\n }\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(NOTATION.FASTA))\n return NOTATION.FASTA;\n else if (this.units.toLowerCase().startsWith(NOTATION.SEPARATOR))\n return NOTATION.SEPARATOR;\n else if (this.units.toLowerCase().startsWith(NOTATION.HELM))\n return NOTATION.HELM;\n else\n throw new Error(`Column '${this.column.name}' has unexpected notation '${this.units}'.`);\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 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 /**\n * Create a new empty column of the specified notation type and the same\n * length as column\n *\n * @param {NOTATION} tgtNotation\n * @return {DG.Column}\n */\n getNewColumn(tgtNotation, tgtSeparator) {\n const col = this.column;\n const len = col.length;\n const name = tgtNotation.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, tgtNotation);\n if (tgtNotation === NOTATION.SEPARATOR) {\n if (!tgtSeparator)\n throw new Error(`Notation \\'${NOTATION.SEPARATOR}\\' requires separator value.`);\n newColumn.setTag(\"separator\" /* TAGS.separator */, tgtSeparator);\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 != null)\n newColumn.setTag(\"alphabet\" /* TAGS.alphabet */, srcAlphabet);\n let srcAlphabetSize = col.getTag(\".alphabetSize\" /* TAGS.alphabetSize */);\n if (srcAlphabet != null && srcAlphabetSize)\n newColumn.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, srcAlphabetSize);\n const srcAlphabetIsMultichar = col.getTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */);\n if (srcAlphabet != null && srcAlphabetIsMultichar !== undefined)\n newColumn.setTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */, srcAlphabetIsMultichar);\n if (tgtNotation == 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 = [NOTATION.FASTA, NOTATION.SEPARATOR, 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(limit) {\n if (this.units.toLowerCase().startsWith(NOTATION.FASTA)) {\n const alphabet = this.column.getTag(\"alphabet\" /* TAGS.alphabet */);\n if (alphabet !== null && !this.getAlphabetIsMultichar())\n return splitterAsFastaSimple;\n else\n return splitterAsFasta;\n }\n else if (this.units.toLowerCase().startsWith(NOTATION.SEPARATOR))\n return getSplitterWithSeparator(this.separator, limit);\n else if (this.units.toLowerCase().startsWith(NOTATION.HELM))\n return splitterAsHelm;\n else\n throw new Error(`Unexpected units ${this.units} .`);\n // TODO: Splitter for HELM\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 // -- Notation Converter --\n get splitter() {\n if (this._splitter === null)\n this._splitter = getSplitterForColumn(this.column);\n return this._splitter;\n }\n toFasta(targetNotation) { return targetNotation === NOTATION.FASTA; }\n toSeparator(targetNotation) { return targetNotation === NOTATION.SEPARATOR; }\n toHelm(targetNotation) { return targetNotation === NOTATION.HELM; }\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 GapSymbols[NOTATION.FASTA] :\n GapSymbols[NOTATION.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 === GapSymbols[NOTATION.HELM])\n tgtMonomersArray.push(tgtGapSymbol);\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 return tgtMonomersArray.join(tgtSeparator);\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) {\n const convert = this.getConverter(tgtNotation, tgtSeparator);\n const newColumn = this.getNewColumn(tgtNotation, tgtSeparator);\n // assign the values to the newly created empty column\n newColumn.init((rowI) => { return convert(this.column.get(rowI)); });\n // newColumn.setTag(DG.TAGS.UNITS, NOTATION.SEPARATOR);\n return newColumn;\n }\n /**\n * @param name\n * @param startIdx Start position index of the region (0-based)\n * @param endIdx End position index of the region (0-based, inclusive)\n */\n getRegion(startIdx, endIdx, name) {\n const regCol = this.getNewColumn(this.notation, this.separator);\n regCol.name = name;\n const maxLength = Math.max(...this.splitted.map((seqS) => seqS.length));\n const startIdxVal = startIdx ?? 0;\n const endIdxVal = endIdx ?? this.maxLength - 1;\n const join = this.getJoiner();\n const regLength = endIdxVal - startIdxVal + 1;\n regCol.init((rowI) => {\n const seqS = this.splitted[rowI];\n // Custom slicing instead of array method to maintain gaps\n const regMList = new Array(regLength);\n for (let regJPos = 0; regJPos < regLength; ++regJPos) {\n const seqJPos = startIdxVal + regJPos;\n regMList[regJPos] = seqJPos < seqS.length ? seqS[seqJPos] : GapSymbols[this.notation];\n }\n return join(regMList);\n });\n const getRegionOfPositionNames = (str) => {\n const srcPosList = str.split(',').map((p) => p.trim());\n const regPosList = new Array(regLength);\n for (let regJPos = 0; regJPos < regLength; ++regJPos) {\n const srcJPos = startIdxVal + regJPos;\n regPosList[regJPos] = srcJPos < srcPosList.length ? srcPosList[srcJPos] : '?';\n }\n return regPosList.join(positionSeparator);\n };\n const srcPositionNamesStr = this.column.getTag(\".positionNames\" /* TAGS.positionNames */);\n if (srcPositionNamesStr)\n regCol.setTag(\".positionNames\" /* TAGS.positionNames */, getRegionOfPositionNames(srcPositionNamesStr));\n const srcPositionLabelsStr = this.column.getTag(\".positionLabels\" /* TAGS.positionLabels */);\n if (srcPositionLabelsStr)\n regCol.setTag(\".positionLabels\" /* TAGS.positionLabels */, getRegionOfPositionNames(srcPositionLabelsStr));\n return regCol;\n }\n getJoiner() {\n const srcUh = this;\n if (this.notation === NOTATION.FASTA)\n return function (srcS) { return joinToFasta(srcUh, srcS); };\n else if (this.notation === NOTATION.SEPARATOR)\n return function (srcS) { return joinToSeparator(srcUh, srcS, srcUh.separator); };\n else if (this.notation === NOTATION.HELM) {\n const isDnaOrRna = srcUh.alphabet === \"DNA\" /* ALPHABET.DNA */ || srcUh.alphabet === \"RNA\" /* ALPHABET.RNA */;\n return function (srcS) { return joinToHelm(srcUh, srcS, isDnaOrRna); };\n }\n else\n throw new Error();\n }\n getConverter(tgtUnits, tgtSeparator = undefined) {\n if (tgtUnits === NOTATION.SEPARATOR && !tgtSeparator)\n throw new Error(`Target separator is not specified for target units '${NOTATION.SEPARATOR}'.`);\n const srcUh = this;\n if (tgtUnits === NOTATION.FASTA)\n return function (src) { return convertToFasta(srcUh, src); };\n if (tgtUnits === NOTATION.HELM)\n return function (src) { return convertToHelm(srcUh, src); };\n else if (tgtUnits === NOTATION.SEPARATOR)\n return function (src) { return convertToSeparator(srcUh, src, tgtSeparator); };\n else\n throw new Error();\n }\n constructor(col) {\n this._splitter = null;\n this._splitted = null;\n this._stats = null;\n this._maxLength = null;\n this._posList = 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()) ? GapSymbols[NOTATION.FASTA] :\n (this.isHelm()) ? GapSymbols[NOTATION.HELM] :\n GapSymbols[NOTATION.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 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 else\n throw new Error(`Unexpected units '${this.column.getTag(DG.TAGS.UNITS)}'.`);\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 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}\nconst helmWrappersRe = /[RD]\\((\\w)\\)P?/g;\nfunction joinToFasta(srcUh, seqS) {\n const resMList = new Array(seqS.length);\n for (const [srcM, mI] of wu.enumerate(seqS)) {\n let m = srcM;\n if (srcUh.isHelm())\n m = srcM.replace(helmWrappersRe, '$1');\n if (srcUh.isGap(m))\n m = GapSymbols[NOTATION.FASTA];\n else if (m.length > 1)\n m = '[' + seqS[mI] + ']';\n resMList[mI] = m;\n }\n return resMList.join('');\n}\nfunction convertToFasta(srcUh, src) {\n const srcMList = srcUh.isHelm() ? splitterAsHelmNucl(srcUh, src) : srcUh.getSplitter()(src);\n return joinToFasta(srcUh, srcMList);\n}\nfunction joinToSeparator(srcUh, seqS, tgtSeparator) {\n const resMList = new Array(seqS.length);\n for (const [srcM, mI] of wu.enumerate(seqS)) {\n let m = srcM;\n if (srcUh.isGap(m))\n m = GapSymbols[NOTATION.SEPARATOR];\n resMList[mI] = m;\n }\n return resMList.map((m) => m ?? '').join(tgtSeparator);\n}\nfunction convertToSeparator(srcUh, src, tgtSeparator) {\n const srcMList = srcUh.isHelm() ? splitterAsHelmNucl(srcUh, src) : srcUh.getSplitter()(src);\n return joinToSeparator(srcUh, srcMList, tgtSeparator);\n}\nfunction joinToHelm(srcUh, seqS, isDnaOrRna) {\n const [prefix, leftWrapper, rightWrapper, postfix] = srcUh.getHelmWrappers();\n const resMList = wu(seqS).map((srcM) => {\n let m = srcM;\n if (srcUh.isGap(m))\n m = GapSymbols[NOTATION.HELM];\n else if (isDnaOrRna)\n m = m.replace(helmWrappersRe, '$1');\n else\n m = srcM.length == 1 ? `${leftWrapper}${srcM}${rightWrapper}` : `${leftWrapper}[${srcM}]${rightWrapper}`;\n return m;\n }).toArray();\n return `${prefix}${resMList.join('.')}${postfix}`;\n}\nfunction convertToHelm(srcUh, src) {\n const isDnaOrRna = src.startsWith('DNA') || src.startsWith('RNA');\n const srcS = srcUh.getSplitter()(src);\n return joinToHelm(srcUh, srcS, isDnaOrRna);\n}\n/** Splits Helm sequence adjusting nucleotides to single char symbols. (!) Removes lone phosphorus. */\nfunction splitterAsHelmNucl(srcUh, src) {\n const srcMList = srcUh.getSplitter()(src);\n const tgtMList = new Array(srcMList.length);\n const isDna = src.startsWith('DNA');\n const isRna = src.startsWith('RNA');\n for (const [srcM, mI] of wu.enumerate(srcMList)) {\n let m = srcM;\n if (isDna || isRna) {\n m = m.replace(helmWrappersRe, '$1');\n m = m === 'P' ? null : m;\n }\n tgtMList[mI] = m;\n }\n return tgtMList.filter((m) => m !== null);\n}\n//# sourceMappingURL=units-handler.js.map","const __WEBPACK_NAMESPACE_OBJECT__ = rxjs;","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./translator-app.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./translator-app.css\";\n export default content && content.locals ? content.locals : undefined;\n","const __WEBPACK_NAMESPACE_OBJECT__ = $;","/** Constants related to the structure of Molfile V2K */\nexport var V2K_CONST;\n(function (V2K_CONST) {\n V2K_CONST[\"HEADER\"] = \"V2000\";\n V2K_CONST[V2K_CONST[\"NUM_OF_HEADER_LINES\"] = 3] = \"NUM_OF_HEADER_LINES\";\n V2K_CONST[V2K_CONST[\"NUM_OF_COUNTS_DIGITS\"] = 3] = \"NUM_OF_COUNTS_DIGITS\";\n V2K_CONST[V2K_CONST[\"ATOM_TYPE_COL\"] = 4] = \"ATOM_TYPE_COL\";\n V2K_CONST[V2K_CONST[\"FIRST_BONDED_ATOM_COL\"] = 1] = \"FIRST_BONDED_ATOM_COL\";\n V2K_CONST[V2K_CONST[\"BOND_TYPE_COL\"] = 3] = \"BOND_TYPE_COL\";\n V2K_CONST[V2K_CONST[\"RGP_SHIFT\"] = 8] = \"RGP_SHIFT\";\n V2K_CONST[\"RGP_LINE\"] = \"M RGP\";\n V2K_CONST[\"A_LINE\"] = \"A \";\n V2K_CONST[\"END\"] = \"M END\";\n})(V2K_CONST || (V2K_CONST = {}));\nexport const MALFORMED_MOL_V2000 = `\nMalformed\n\n 0 0 0 0 0 0 0 0 0 0999 V2000\nM END`;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS12MmstY29uc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtb2xmaWxlLXYyay1jb25zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3REFBd0Q7QUFDeEQsTUFBTSxDQUFOLElBQVksU0FlWDtBQWZELFdBQVksU0FBUztJQUNuQiw2QkFBZ0IsQ0FBQTtJQUNoQix1RUFBdUIsQ0FBQTtJQUV2Qix5RUFBd0IsQ0FBQTtJQUN4QiwyREFBaUIsQ0FBQTtJQUNqQiwyRUFBeUIsQ0FBQTtJQUN6QiwyREFBaUIsQ0FBQTtJQUdqQixtREFBYSxDQUFBO0lBQ2IsZ0NBQW1CLENBQUE7SUFDbkIsMkJBQWMsQ0FBQTtJQUVkLDJCQUFjLENBQUE7QUFDaEIsQ0FBQyxFQWZXLFNBQVMsS0FBVCxTQUFTLFFBZXBCO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7Ozs7T0FJNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBDb25zdGFudHMgcmVsYXRlZCB0byB0aGUgc3RydWN0dXJlIG9mIE1vbGZpbGUgVjJLICovXG5leHBvcnQgZW51bSBWMktfQ09OU1Qge1xuICBIRUFERVIgPSAnVjIwMDAnLFxuICBOVU1fT0ZfSEVBREVSX0xJTkVTID0gMyxcblxuICBOVU1fT0ZfQ09VTlRTX0RJR0lUUyA9IDMsXG4gIEFUT01fVFlQRV9DT0wgPSA0LFxuICBGSVJTVF9CT05ERURfQVRPTV9DT0wgPSAxLFxuICBCT05EX1RZUEVfQ09MID0gMyxcblxuXG4gIFJHUF9TSElGVCA9IDgsXG4gIFJHUF9MSU5FID0gJ00gIFJHUCcsXG4gIEFfTElORSA9ICdBICAnLFxuXG4gIEVORCA9ICdNICBFTkQnLFxufVxuXG5leHBvcnQgY29uc3QgTUFMRk9STUVEX01PTF9WMjAwMCA9IGBcbk1hbGZvcm1lZFxuXG4gIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDA5OTkgVjIwMDBcbk0gIEVORGA7XG4iXX0=","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./colored-text-input.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./colored-text-input.css\";\n export default content && content.locals ? content.locals : undefined;\n","/* 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 {MolfileHandler} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\n\nimport $ from 'cash-dom';\n\nconst InvalidMolfileError = class extends Error {\n constructor(message: string) { super(message); }\n};\n\nexport class MoleculeImage {\n constructor(molblok: string) {\n this.molblock = molblok;\n }\n\n private _validMolBlock: string;\n get molblock(): string { return this._validMolBlock; }\n\n set molblock(value: string) {\n if (value === '') {\n this._validMolBlock = value;\n return;\n }\n\n try {\n this.validateMolBlock(value);\n } catch (error) {\n if (error instanceof InvalidMolfileError)\n value = '';\n const errorMessage = errorToConsole(error);\n console.error(errorMessage);\n }\n this._validMolBlock = value;\n }\n\n private validateMolBlock(molblock: string): void {\n // todo: add a sound criterion\n if (molblock === '')\n throw new InvalidMolfileError('MoleculeImage: invalid molblock');\n }\n\n private async drawMolBlockOnCanvas(canvas: HTMLCanvasElement): Promise<void> {\n try {\n await grok.functions.call('Chem:canvasMol', {\n x: 0, y: 0, w: canvas.width, h: canvas.height, canvas: canvas,\n molString: this.molblock, scaffoldMolString: '',\n options: {normalizeDepiction: false, straightenDepiction: false}\n });\n } catch (err) {\n const errStr = errorToConsole(err);\n console.error(errStr);\n }\n };\n\n private getMoleculeDimensions(): {height: number, width: number} {\n const molData = MolfileHandler.getInstance(this.molblock);\n const width: number = Math.max(...molData.x) - Math.min(...molData.x);\n const height: number = Math.max(...molData.y) - Math.min(...molData.y);\n return {height: height, width: width};\n }\n\n private async zoomIn(): Promise<void> {\n const dialog = ui.dialog({title: 'Molecule', showFooter:false});\n const dialogDivStyle = {\n overflowX: 'scroll',\n };\n\n const height = $(window).height() * 0.7;\n const molDimensions = this.getMoleculeDimensions();\n\n const zoomRatio = height / molDimensions.height;\n\n const dialogCanvasHeight = height;\n const dialogCanvasWidth = molDimensions.width * zoomRatio;\n\n const dialogCanvas = ui.canvas(dialogCanvasWidth, dialogCanvasHeight);\n await this.drawMolBlockOnCanvas(dialogCanvas);\n \n const dialogDiv = ui.block([dialogCanvas], {style: dialogDivStyle});\n dialog.add(dialogDiv).showModal(true);\n\n $(dialog.root).find('.d4-dialog-contents').removeClass('ui-form');\n $(dialog.root).find('.d4-dialog-contents').removeClass('ui-panel');\n $(dialog.root).find('.d4-dialog-contents').addClass('ui-box');\n $(dialog.root).find('.d4-dialog-contents').css('padding', '0');\n }\n\n public async drawMolecule(\n moleculeImgDiv: HTMLDivElement,\n canvasWidth: number, canvasHeight: number\n ): Promise<void> {\n moleculeImgDiv.innerHTML = '';\n\n const canvas = ui.canvas(canvasWidth * window.devicePixelRatio, canvasHeight * window.devicePixelRatio);\n\n // Draw zoomed-out molecule\n canvas.style.width = `${canvasWidth}px`;\n canvas.style.height = `${canvasHeight}px`;\n canvas.style.cursor = 'zoom-in';\n /*\n canvas.style.borderStyle = 'solid';\n canvas.style.borderRadius = '1px';\n canvas.style.borderColor = 'var(--grey-2)';\n canvas.style.borderWidth = 'thin';\n */\n this.drawMolBlockOnCanvas(canvas);\n\n // Dialog with zoomed-in molecule\n canvas.addEventListener('click', async () => {\n await this.zoomIn();\n });\n //$(canvas).on('click', async () => { await this.zoomIn(); });\n //$(canvas).on('mouseover', () => $(canvas).css('cursor', 'grab')); // for some reason 'zoom-in' value wouldn't work\n //$(canvas).on('mouseout', () => $(canvas).css('cursor', 'default'));\n\n moleculeImgDiv.append(ui.tooltip.bind(canvas,'Click to zoom'));\n }\n}\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./structure-app.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!./structure-app.css\";\n export default content && content.locals ? content.locals : undefined;\n","import {NUCLEOTIDES} from '../const';\nimport {axolabsStyleMap} from '../data-loading-utils/json-loader';\n\nexport function isOverhang(modification: string): boolean {\n return modification.slice(-3) === '(o)';\n}\n\nexport function isOneDigitNumber(n: number): boolean {\n return n < 10;\n}\n\n// https://uxdesign.cc/star-rating-make-svg-great-again-d4ce4731347e\nexport function getPointsToDrawStar(centerX: number, centerY: number): string {\n const innerCirclePoints = 5; // a 5 point star\n const innerRadius = 15 / innerCirclePoints;\n const innerOuterRadiusRatio = 2; // outter circle is x2 the inner\n const outerRadius = innerRadius * innerOuterRadiusRatio;\n const angle = Math.PI / innerCirclePoints;\n const angleOffsetToCenterStar = 60;\n const totalNumberOfPoints = innerCirclePoints * 2; // 10 in a 5-points star\n\n let points = '';\n for (let i = 0; i < totalNumberOfPoints; i++) {\n const r = (i % 2 === 0) ? outerRadius : innerRadius;\n const currentX = centerX + Math.cos(i * angle + angleOffsetToCenterStar) * r;\n const currentY = centerY + Math.sin(i * angle + angleOffsetToCenterStar) * r;\n points += `${currentX},${currentY} `;\n }\n return points;\n}\n\nexport function countOverhangsOnTheRightEdge(modifications: string[]): number {\n let i = 0;\n while (i < modifications.length && isOverhang(modifications[i]))\n i++;\n return (i === modifications.length - 1) ? 0 : i;\n}\n\nexport function textWidth(text: string, font: number): number {\n const context = document.createElement('canvas').getContext('2d');\n // @ts-ignore\n context.font = String(font);\n // @ts-ignore\n return 2 * context.measureText(text).width;\n}\n\nexport function textInsideCircle(bases: string[], index: number): string {\n return (isOverhang(bases[index]) || !NUCLEOTIDES.includes(bases[index])) ? '' : bases[index];\n}\n\nexport function fontColorVisibleOnBackground(base: string): string {\n const AXOLABS_MAP = axolabsStyleMap;\n const rgbIntList = AXOLABS_MAP[base].color.match(/\\d+/g)!.map((e) => Number(e));\n return (rgbIntList[0] * 0.299 + rgbIntList[1] * 0.587 + rgbIntList[2] * 0.114) > 186 ? '#33333' : '#ffffff';\n}\n\nexport function baseColor(base: string): string {\n const AXOLABS_MAP = axolabsStyleMap;\n return AXOLABS_MAP[base].color;\n}\n\nexport const svg = {\n xmlns: 'http://www.w3.org/2000/svg',\n render: function(width: number, height: number): Element {\n const e = document.createElementNS(this.xmlns, 'svg');\n e.setAttribute('id', 'mySvg');\n e.setAttribute('width', String(width));\n e.setAttribute('height', String(height));\n return e;\n },\n circle: function(x: number, y: number, radius: number, color: string): Element {\n const e = document.createElementNS(this.xmlns, 'circle');\n e.setAttribute('cx', String(x));\n e.setAttribute('cy', String(y));\n e.setAttribute('r', String(radius));\n e.setAttribute('fill', color);\n return e;\n },\n text: function(text: string, x: number, y: number, fontSize: number, color: string): Element {\n const e = document.createElementNS(this.xmlns, 'text');\n e.setAttribute('x', String(x));\n e.setAttribute('y', String(y));\n e.setAttribute('font-size', String(fontSize));\n e.setAttribute('font-weight', 'normal');\n e.setAttribute('font-family', 'Arial');\n e.setAttribute('fill', color);\n e.innerHTML = text;\n return e;\n },\n star: function(x: number, y: number, fill: string): Element {\n const e = document.createElementNS(this.xmlns, 'polygon');\n e.setAttribute('points', getPointsToDrawStar(x, y));\n e.setAttribute('fill', fill);\n return e;\n },\n};\n","import {NUCLEOTIDES} from '../const';\nimport {isOverhang, svg, textWidth, countOverhangsOnTheRightEdge, baseColor, textInsideCircle,\n fontColorVisibleOnBackground, isOneDigitNumber} from './helpers';\n\nconst BASE_RADIUS = 15;\nconst BASE_DIAMETER = 2 * BASE_RADIUS;\nconst shiftToAlignTwoDigitNumberNearCircle = -10;\nconst shiftToAlignOneDigitNumberNearCircle = -5;\nconst LEGEND_RADIUS = 6;\nconst PS_LINKAGE_RADIUS = 5;\nconst BASE_FONT_SIZE = 17;\nconst LEGEND_FONT_SIZE = 14;\nconst PS_LINKAGE_COLOR = 'red';\nconst FONT_COLOR = 'var(--grey-6)';\nconst TITLE_FONT_COLOR = 'black';\nconst MODIFICATIONS_COLOR = 'red';\nconst SS_LEFT_TEXT = 'SS: 5\\'';\nconst AS_LEFT_TEXT = 'AS: 3\\'';\nconst SS_RIGHT_TEXT = '3\\'';\nconst AS_RIGHT_TEXT = '5\\'';\n\nconst WIDTH_OF_LEFT_TEXT = Math.max(\n textWidth(SS_LEFT_TEXT, BASE_FONT_SIZE),\n textWidth(AS_LEFT_TEXT, BASE_FONT_SIZE),\n);\n\nconst WIDTH_OF_RIGHT_TEXT = Math.max(\n textWidth(SS_RIGHT_TEXT, BASE_FONT_SIZE),\n textWidth(AS_RIGHT_TEXT, BASE_FONT_SIZE),\n);\n\nconst X = {\n TITLE: BASE_RADIUS, // Math.round(width / 4),\n LEFT_TEXTS: 0,\n};\nconst X_OF_LEFT_MODIFICATIONS = X.LEFT_TEXTS + WIDTH_OF_LEFT_TEXT - 5;\n\nconst Y = {\n TITLE: BASE_RADIUS,\n SS_INDICES: 2 * BASE_RADIUS,\n SS_CIRCLES: 3.5 * BASE_RADIUS,\n SS_TEXTS: 4 * BASE_RADIUS,\n AS_CIRCLES: 6.5 * BASE_RADIUS,\n AS_TEXTS: 7 * BASE_RADIUS,\n AS_INDICES: 8.5 * BASE_RADIUS,\n comment: (asExists: boolean) => (asExists) ? 11 * BASE_RADIUS : 8.5 * BASE_RADIUS,\n circlesInLegends: (asExists: boolean) => (asExists) ? 9.5 * BASE_RADIUS : 6 * BASE_RADIUS,\n textLegend: (asExists: boolean) => (asExists) ? 10 * BASE_RADIUS - 3 : Y.AS_CIRCLES - 3,\n svgHeight: (asExists: boolean) => (asExists) ? 11 * BASE_RADIUS : 9 * BASE_RADIUS,\n};\n\nexport function drawAxolabsPattern(\n patternName: string, asExists: boolean, ssBases: string[],\n asBases: string[], ssPtoStatuses: boolean[], asPtoStatuses: boolean[],\n ss3Modification: string, ss5Modification: string,\n as3Modification: string, as5Modification: string, comment: string,\n enumerateModifications: string[],\n): Element {\n function equidistantXForLegend(index: number): number {\n return Math.round((index + startFrom) * width / (uniqueBases.length + startFrom) + LEGEND_RADIUS);\n }\n\n function xOfBaseCircles(index: number, rightOverhangs: number): number {\n return widthOfRightModification +\n (resultingNumberOfNucleotidesInStrands - index + rightOverhangs + 1) * BASE_DIAMETER;\n }\n\n function shiftToAlignNumberNearCircle(bases: string[], generalIndex: number, nucleotideIndex: number): number {\n return (isOneDigitNumber(nucleotideIndex) || NUCLEOTIDES.includes(bases[generalIndex])) ?\n shiftToAlignOneDigitNumberNearCircle : shiftToAlignTwoDigitNumberNearCircle;\n }\n\n ssBases = ssBases.reverse();\n ssPtoStatuses = ssPtoStatuses.reverse();\n\n const ssRightOverhangs = countOverhangsOnTheRightEdge(ssBases);\n const asRightOverhangs = countOverhangsOnTheRightEdge(asBases);\n\n const resultingNumberOfNucleotidesInStrands = Math.max(\n ssBases.length - ssRightOverhangs,\n asBases.length - asRightOverhangs,\n );\n\n const widthOfRightOverhangs = Math.max(ssRightOverhangs, asRightOverhangs);\n const widthOfBases = BASE_DIAMETER * (resultingNumberOfNucleotidesInStrands + widthOfRightOverhangs);\n\n const widthOfLeftModification = Math.max(\n textWidth(ss3Modification, BASE_FONT_SIZE),\n textWidth(as5Modification, BASE_FONT_SIZE),\n );\n\n const widthOfRightModification = Math.max(\n textWidth(ss5Modification, BASE_FONT_SIZE),\n textWidth(as3Modification, BASE_FONT_SIZE),\n );\n\n const uniqueBases = asExists ?\n [...new Set(ssBases.concat(asBases))] :\n [...new Set(ssBases)];\n\n const isPtoExist = asExists ?\n ssPtoStatuses.concat(asPtoStatuses).includes(true) :\n ssPtoStatuses.includes(true);\n\n const startFrom = isPtoExist ? 1 : 0;\n\n const xOfSsRightModifications = ssRightOverhangs * BASE_DIAMETER + xOfBaseCircles(-0.5, 0);\n const xOfAsRightModifications = asRightOverhangs * BASE_DIAMETER + xOfBaseCircles(-0.5, 0);\n\n const xOfRightTexts = Math.max(xOfSsRightModifications, xOfAsRightModifications) + widthOfLeftModification +\n BASE_DIAMETER * widthOfRightOverhangs;\n\n const width = WIDTH_OF_LEFT_TEXT + widthOfLeftModification + widthOfBases + widthOfRightModification +\n WIDTH_OF_RIGHT_TEXT + BASE_DIAMETER;\n const image = svg.render(width, Y.svgHeight(asExists));\n\n image.append(\n svg.text(SS_LEFT_TEXT, X.LEFT_TEXTS, Y.SS_TEXTS, BASE_FONT_SIZE, FONT_COLOR),\n asExists ? svg.text(AS_LEFT_TEXT, X.LEFT_TEXTS, Y.AS_TEXTS, BASE_FONT_SIZE, FONT_COLOR) : '',\n svg.text(SS_RIGHT_TEXT, xOfRightTexts, Y.SS_TEXTS, BASE_FONT_SIZE, FONT_COLOR),\n asExists ? svg.text(AS_RIGHT_TEXT, xOfRightTexts, Y.AS_TEXTS, BASE_FONT_SIZE, FONT_COLOR) : '',\n svg.text(ss5Modification, X_OF_LEFT_MODIFICATIONS, Y.SS_TEXTS, BASE_FONT_SIZE, MODIFICATIONS_COLOR),\n asExists ? svg.text(as3Modification, X_OF_LEFT_MODIFICATIONS, Y.AS_TEXTS, BASE_FONT_SIZE, MODIFICATIONS_COLOR) : '',\n svg.text(ss3Modification, xOfSsRightModifications, Y.SS_TEXTS, BASE_FONT_SIZE, MODIFICATIONS_COLOR),\n asExists ? svg.text(as5Modification, xOfAsRightModifications, Y.AS_TEXTS, BASE_FONT_SIZE, MODIFICATIONS_COLOR) : '',\n svg.text(comment, X.LEFT_TEXTS, Y.comment(asExists), LEGEND_FONT_SIZE, FONT_COLOR),\n isPtoExist ? svg.star(BASE_RADIUS, Y.circlesInLegends(asExists), PS_LINKAGE_COLOR) : '',\n isPtoExist ? svg.text('ps linkage', 2 * BASE_RADIUS - 8, Y.textLegend(asExists), LEGEND_FONT_SIZE, FONT_COLOR) : '',\n );\n\n const numberOfSsNucleotides = ssBases.filter((value) => !isOverhang(value)).length;\n let nucleotideCounter = numberOfSsNucleotides;\n for (let i = ssBases.length - 1; i > -1; i--) {\n const xOfNumbers = xOfBaseCircles(i, ssRightOverhangs) +\n shiftToAlignNumberNearCircle(ssBases, ssBases.length - i, numberOfSsNucleotides - nucleotideCounter);\n if (!isOverhang(ssBases[i]))\n nucleotideCounter--;\n const n = (!isOverhang(ssBases[i]) && enumerateModifications.includes(ssBases[i])) ?\n String(numberOfSsNucleotides - nucleotideCounter) : '';\n image.append(\n svg.text(n, xOfNumbers, Y.SS_INDICES, LEGEND_FONT_SIZE, FONT_COLOR),\n svg.circle(xOfBaseCircles(i, ssRightOverhangs), Y.SS_CIRCLES, BASE_RADIUS, baseColor(ssBases[i])),\n svg.text(textInsideCircle(ssBases, i), xOfNumbers, Y.SS_TEXTS, BASE_FONT_SIZE,\n fontColorVisibleOnBackground(ssBases[i])),\n ssPtoStatuses[i] ?\n svg.star(xOfBaseCircles(i, ssRightOverhangs) + BASE_RADIUS, Y.SS_TEXTS + PS_LINKAGE_RADIUS, PS_LINKAGE_COLOR) :\n '',\n );\n }\n image.append(\n ssPtoStatuses[ssBases.length] ?\n svg.star(xOfBaseCircles(ssBases.length, ssRightOverhangs) +\n BASE_RADIUS, Y.SS_TEXTS + PS_LINKAGE_RADIUS, PS_LINKAGE_COLOR) : '',\n );\n\n const numberOfAsNucleotides = asBases.filter((value) => !isOverhang(value)).length;\n if (asExists) {\n let nucleotideCounter = numberOfAsNucleotides;\n for (let i = asBases.length - 1; i > -1; i--) {\n if (!isOverhang(asBases[i]))\n nucleotideCounter--;\n const xOfNumbers = xOfBaseCircles(i, asRightOverhangs) +\n shiftToAlignNumberNearCircle(asBases, i, nucleotideCounter + 1);\n const n = (!isOverhang(asBases[i]) && enumerateModifications.includes(asBases[i])) ?\n String(nucleotideCounter + 1) : '';\n image.append(\n svg.text(n, xOfNumbers, Y.AS_INDICES, LEGEND_FONT_SIZE, FONT_COLOR),\n svg.circle(xOfBaseCircles(i, asRightOverhangs), Y.AS_CIRCLES, BASE_RADIUS, baseColor(asBases[i])),\n svg.text(textInsideCircle(asBases, i),\n xOfBaseCircles(i, asRightOverhangs) + shiftToAlignNumberNearCircle(asBases, i, nucleotideCounter + 1),\n Y.AS_TEXTS, BASE_FONT_SIZE, fontColorVisibleOnBackground(asBases[i])),\n asPtoStatuses[i] ? svg.star(xOfBaseCircles(i, asRightOverhangs) +\n BASE_RADIUS, Y.AS_TEXTS + PS_LINKAGE_RADIUS, PS_LINKAGE_COLOR) : '',\n );\n }\n image.append(\n asPtoStatuses[asBases.length] ?\n svg.star(xOfBaseCircles(asBases.length, asRightOverhangs) + BASE_RADIUS, Y.AS_TEXTS + PS_LINKAGE_RADIUS,\n PS_LINKAGE_COLOR) : '',\n );\n }\n\n const title = `${patternName} for ${numberOfSsNucleotides}${(asExists ? `/${numberOfAsNucleotides}` : '')}mer`;\n image.append(svg.text(title, X.TITLE, Y.TITLE, BASE_FONT_SIZE, TITLE_FONT_COLOR));\n for (let i = 0; i < uniqueBases.length; i++) {\n image.append(\n svg.circle(equidistantXForLegend(i), Y.circlesInLegends(asExists), LEGEND_RADIUS, baseColor(uniqueBases[i])),\n svg.text(uniqueBases[i], equidistantXForLegend(i) + LEGEND_RADIUS + 4, Y.textLegend(asExists), LEGEND_FONT_SIZE,\n FONT_COLOR),\n );\n }\n return image;\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 {AppUIFactory, CombinedAppUI} from './view/app-ui';\nimport {tryCatch} from './model/helpers';\nimport {LIB_PATH, DEFAULT_LIB_FILENAME} from './model/data-loading-utils/const';\nimport {IMonomerLib} from '@datagrok-libraries/bio/src/types';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';\nimport {getJsonData} from './model/data-loading-utils/json-loader';\nimport {SequenceToMolfileConverter} from './model/structure-app/sequence-to-molfile';\nimport {linkStrandsV3000} from './model/structure-app/mol-transformations';\nimport {MonomerLibWrapper} from './model/monomer-lib/lib-wrapper';\nimport {FormatDetector} from './model/parsing-validation/format-detector';\nimport {SequenceValidator} from './model/parsing-validation/sequence-validator';\nimport {demoOligoTranslatorUI, demoOligoPatternUI, demoOligoStructureUI} from './demo/demo-st-ui';\nimport {FormatConverter} from './model/translator-app/format-converter';\nimport {APP} from './view/const/ui';\nimport {getExternalAppViewFactories} from './plugins/mermade';\n\nclass StPackage extends DG.Package {\n private _monomerLib?: IMonomerLib;\n\n get monomerLib(): IMonomerLib {\n if (!this._monomerLib)\n throw new Error ('Monomer lib not loaded')\n return this._monomerLib!;\n }\n\n public async initMonomerLib(): Promise<void> {\n if (this._monomerLib !== undefined)\n return;\n\n const pi: DG.TaskBarProgressIndicator = DG.TaskBarProgressIndicator.create(\n `Initializing ${APP.COMBINED} monomer library ...`);\n await tryCatch(async () => {\n const libHelper: IMonomerLibHelper = await getMonomerLibHelper();\n this._monomerLib = await libHelper.readLibrary(LIB_PATH, DEFAULT_LIB_FILENAME);\n }, () => pi.close());\n }\n}\n\nexport const _package: StPackage = new StPackage();\n\nasync function buildLayout(appName: string): Promise<void> {\n await initSequenceTranslatorLibData();\n const appUI = AppUIFactory.getUI(appName);\n await appUI.createAppLayout();\n}\n\n\n//name: Oligo Toolkit\n//meta.icon: img/icons/toolkit.png\n//meta.browsePath: Oligo\n//tags: app\nexport async function oligoToolkitApp(): Promise<void> {\n await initSequenceTranslatorLibData();\n const externalViewFactories = await getExternalAppViewFactories();\n if (!externalViewFactories)\n throw new Error('External app view factories not loaded');\n const appUI = new CombinedAppUI(externalViewFactories!);\n await appUI.createAppLayout();\n}\n\n//name: Oligo Translator\n//meta.icon: img/icons/translator.png\n//meta.browsePath: Oligo\n//tags: app\nexport async function oligoTranslatorApp(): Promise<void> {\n await buildLayout(APP.TRANSLATOR);\n}\n\n//name: Oligo Pattern\n//meta.icon: img/icons/pattern.png\n//meta.browsePath: Oligo\n//tags: app\nexport async function oligoPatternApp(): Promise<void> {\n await buildLayout(APP.PATTERN);\n}\n\n//name: Oligo Structure\n//meta.icon: img/icons/structure.png\n//meta.browsePath: Oligo\n//tags: app\nexport async function oligoStructureApp(): Promise<void> {\n await buildLayout(APP.STRUCTRE);\n}\n\n//name: initSequenceTranslatorLibData\nexport async function initSequenceTranslatorLibData(): Promise<void> {\n await getJsonData();\n await _package.initMonomerLib();\n}\n\n//name: getCodeToWeightsMap\n//output: object result\nexport function getCodeToWeightsMap(): {[key: string]: number} {\n const map = MonomerLibWrapper.getInstance().getCodesToWeightsMap();\n return Object.fromEntries(map);\n}\n\n//name: validateSequence\n//input: string sequence\n//output: bool result\nexport function validateSequence(sequence: string): boolean {\n const validator = new SequenceValidator(sequence);\n const format = (new FormatDetector(sequence).getFormat());\n return (format === null) ? false : validator.isValidSequence(format!);\n}\n\n//name: validateSequence\n//input: string sequence\n//input: bool invert\n//output: string result\nexport function getMolfileFromGcrsSequence(sequence: string, invert: boolean): string {\n return (new SequenceToMolfileConverter(sequence, invert, 'GCRS')).convert();\n}\n\n//name: linkStrands\n//input: object strands\n//output: string result\nexport function linkStrands(strands: { senseStrands: string[], antiStrands: string[] }): string {\n return linkStrandsV3000(strands, true);\n}\n\n//name: demoOligoTranslator\n//meta.demoPath: Bioinformatics | Oligo Toolkit | Translator\n//description: Translate oligonucleotide sequences across various formats accepted by different synthesizers\n//meta.path: /apps/Tutorials/Demo/Bioinformatics/Oligonucleotide%20Sequence:%20Translate\nexport async function demoTranslateSequence(): Promise<void> {\n await demoOligoTranslatorUI();\n}\n\n//name: demoOligoPattern\n//meta.demoPath: Bioinformatics | Oligo Toolkit | Pattern\n//description: Design a modification pattern for an oligonucleotide sequence\n//meta.path:%20/apps/Tutorials/Demo/Bioinformatics/Oligonucleotide%20Sequence:%20Visualize%20duplex\nexport async function demoOligoPattern(): Promise<void> {\n await demoOligoPatternUI();\n}\n\n//name: demoOligoStructure\n//meta.demoPath: Bioinformatics | Oligo Toolkit | Structure\n//description: Visualize duplex and save SDF\n//meta.path:%20/apps/Tutorials/Demo/Bioinformatics/Oligonucleotide%20Sequence:%20Visualize%20duplex\nexport async function demoOligoStructure(): Promise<void> {\n await demoOligoStructureUI();\n}\n\n//name: translateOligonucleotideSequence\n//input: string sequence\n//input: string sourceFormat\n//input: string targetFormat\n//output: string result\nexport async function translateOligonucleotideSequence(sequence: string, sourceFormat: string, targetFormat: string): Promise<string> {\n await initSequenceTranslatorLibData();\n return (new FormatConverter(sequence, sourceFormat)).convertTo(targetFormat);\n}\n","// import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\nimport { HELM_CORE_FIELDS, jsonSdfMonomerLibDict, MONOMER_ENCODE_MAX, MONOMER_ENCODE_MIN, SDF_MONOMER_NAME } from '../utils/const';\nimport { UnitsHandler } from '../utils/units-handler';\nimport { splitAlignedSequences } from '../utils/splitter';\nexport function encodeMonomers(col) {\n let encodeSymbol = MONOMER_ENCODE_MIN;\n const monomerSymbolDict = {};\n const uh = UnitsHandler.getOrCreate(col);\n const splitterFunc = uh.getSplitter();\n const encodedStringArray = [];\n for (let i = 0; i < col.length; ++i) {\n let encodedMonomerStr = '';\n const monomers = splitterFunc(col.get(i));\n for (const m of monomers) {\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 uh = UnitsHandler.getOrCreate(col);\n const splitter = uh.getSplitter();\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 = splitter(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 uh = UnitsHandler.getOrCreate(cell.column);\n const splitterFunc = uh.getSplitter();\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}\nexport async function sequenceChemSimilarity(positionColumns, referenceSequence) {\n if (positionColumns instanceof DG.Column)\n positionColumns = splitAlignedSequences(positionColumns).columns.toList();\n const libHelper = await getMonomerLibHelper();\n const monomerLib = libHelper.getBioLib();\n // const smilesCols: DG.Column<string>[] = new Array(monomerCols.length);\n const rawCols = new Array(positionColumns.length);\n const rowCount = positionColumns[0].length;\n const totalSimilarity = new Float32Array(rowCount);\n // Calculate base similarity\n for (let position = 0; position < positionColumns.length; ++position) {\n const referenceMonomer = referenceSequence[position];\n const referenceMol = monomerLib.getMonomer('PEPTIDE', referenceMonomer)?.smiles ?? '';\n const monomerCol = positionColumns[position];\n const monomerColData = monomerCol.getRawData();\n const monomerColCategories = monomerCol.categories;\n const emptyCategoryIdx = monomerColCategories.indexOf('');\n rawCols[position] = { categories: monomerColCategories, data: monomerColData, emptyIndex: emptyCategoryIdx };\n if (typeof referenceMonomer === 'undefined')\n continue;\n // Calculating similarity for \n const molCol = DG.Column.fromStrings('smiles', monomerColCategories.map((cat) => monomerLib.getMonomer('PEPTIDE', cat)?.smiles ?? ''));\n const _df = DG.DataFrame.fromColumns([molCol]); // getSimilarities expects that column is in dataframe\n const similarityCol = (await grok.chem.getSimilarities(molCol, referenceMol));\n const similarityColData = similarityCol.getRawData();\n for (let rowIdx = 0; rowIdx < rowCount; ++rowIdx) {\n const monomerCategoryIdx = monomerColData[rowIdx];\n totalSimilarity[rowIdx] += referenceMonomer !== '' && monomerCategoryIdx !== emptyCategoryIdx ?\n similarityColData[monomerCategoryIdx] :\n referenceMonomer === '' && monomerCategoryIdx === emptyCategoryIdx ? 1 : 0;\n }\n }\n for (let similarityIndex = 0; similarityIndex < totalSimilarity.length; ++similarityIndex) {\n let updatedSimilarity = totalSimilarity[similarityIndex] / referenceSequence.length;\n for (let position = 0; position < positionColumns.length; ++position) {\n const currentRawCol = rawCols[position];\n if ((position >= referenceSequence.length && currentRawCol.data[similarityIndex] !== currentRawCol.emptyIndex) ||\n (currentRawCol.data[similarityIndex] === currentRawCol.emptyIndex && position < referenceSequence.length)) {\n updatedSimilarity = DG.FLOAT_NULL;\n break;\n }\n }\n totalSimilarity[similarityIndex] = updatedSimilarity;\n }\n const similarityCol = DG.Column.fromFloat32Array('Similarity', totalSimilarity);\n return similarityCol;\n}\n//# sourceMappingURL=monomer-utils.js.map","module.exports = DG;","module.exports = grok;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nc = undefined;","type Dict = {[key: string]: string};\n\nexport const formatsToHelm: {[key: string]: Dict} = {\n 'Axolabs': {\n 'UfAfsCfsGfuacg': 'RNA1{[fR](U)p.[fR](A)[sp].[fR](C)[sp].[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)}$$$$'\n },\n 'BioSpring': {\n 'AT*GC*123456789': 'RNA1{r(A)p.r(T)[sp].r(G)p.r(C)[sp].[fR](U)p.[fR](A)p.[fR](C)p.[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)p.d([m5C])}$$$$'\n },\n 'Mermade12': {\n 'hefglijkLIJKHEFG': 'RNA1{[25r](U)[sp].[25r](A)[sp].[25r](C)[sp].[25r](G)[sp].[fR](U)[sp].[fR](A)[sp].[fR](C)[sp].[fR](G)[sp].[fR](U)p.[fR](A)p.[fR](C)p.[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)}$$$$'\n }\n}\n\nexport const helmToNucleotides: Dict = {\n 'RNA1{[fR](U)p.[fR](A)[sp].[fR](C)[sp].[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)}$$$$': 'UACGUACG',\n\n 'RNA1{r(A)p.r(T)[sp].r(G)p.r(C)[sp].[fR](U)p.[fR](A)p.[fR](C)p.[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)p.d([m5C])}$$$$': 'ATGCUACGUACGC',\n\n 'RNA1{[25r](U)[sp].[25r](A)[sp].[25r](C)[sp].[25r](G)[sp].[fR](U)[sp].[fR](A)[sp].[fR](C)[sp].[fR](G)[sp].[fR](U)p.[fR](A)p.[fR](C)p.[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)}$$$$': 'UACGUACGUACGUACG'\n}\n\nexport const helmToMolfile: Dict = {\n}\n","/* 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 {before, category, expect, test} from '@datagrok-libraries/utils/src/test';\nimport {DEFAULT_FORMATS} from '../model/const';\nimport {FormatConverter} from '../model/translator-app/format-converter';\nimport {getJsonData} from '../model/data-loading-utils/json-loader';\nimport {formatsToHelm} from './const';\nimport {_package} from '../package';\n\nfunction getHelm(strand: string, format: string): string {\n return (new FormatConverter(strand, format).convertTo(DEFAULT_FORMATS.HELM));\n}\n\nfunction getFromat(helm: string, format: string): string {\n return (new FormatConverter(helm, DEFAULT_FORMATS.HELM).convertTo(format));\n}\n\ncategory('Formats to HELM', () => {\n before(async () => {\n await getJsonData();\n await _package.initMonomerLib();\n });\n\n for (const format of Object.keys(formatsToHelm)) {\n for (const [strand, helm] of Object.entries(formatsToHelm[format])) {\n test(`${format} to HELM`, async () => {\n const expected = helm;\n const result = getHelm(strand, format);\n expect(result, expected);\n });\n }\n }\n});\n\ncategory('HELM to Formats', () => {\n before(async () => {\n await getJsonData();\n await _package.initMonomerLib();\n });\n\n for (const format of Object.keys(formatsToHelm)) {\n for (const [strand, helm] of Object.entries(formatsToHelm[format])) {\n test(`${format} to HELM`, async () => {\n const expected = strand;\n const result = getFromat(helm, format);\n expect(result, expected);\n });\n }\n }\n});\n","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {before, category, expect, test} from '@datagrok-libraries/utils/src/test';\nimport {getNucleotidesSequence} from '../model/translator-app/conversion-utils';\nimport {getJsonData} from '../model/data-loading-utils/json-loader';\nimport {helmToNucleotides} from './const';\nimport {_package} from '../package';\nimport {MonomerLibWrapper} from '../model/monomer-lib/lib-wrapper';\n\ncategory('HELM to Nucleotides', () => {\n before(async () => {\n await getJsonData();\n await _package.initMonomerLib();\n });\n\n Object.entries(helmToNucleotides).forEach(([helm, nucleotide], idx) => {\n test(`Sequence ${idx + 1} to nucleotides`, async () => {\n const expected = nucleotide;\n const result = getNucleotidesSequence(helm, MonomerLibWrapper.getInstance());\n expect(result, expected);\n });\n })\n});\n","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {before, category, expect, test} from '@datagrok-libraries/utils/src/test';\nimport {DEFAULT_FORMATS} from '../model/const';\nimport {getJsonData} from '../model/data-loading-utils/json-loader';\nimport {formatsToHelm} from './const';\nimport {SequenceValidator} from '../model/parsing-validation/sequence-validator';\nimport {getTranslatedSequences} from '../model/translator-app/conversion-utils';\nimport {_package} from '../package';\n\nfunction getTranslationObject(sequence: string, format: string): {[format: string]: string} {\n const indexOfInvalidChar = (new SequenceValidator(sequence)).getInvalidCodeIndex(format);\n return getTranslatedSequences(sequence, indexOfInvalidChar, format);\n}\n\nconst inputs = {\n [DEFAULT_FORMATS.AXOLABS]: 'Afcgacsu',\n [DEFAULT_FORMATS.HELM]: 'RNA1{[fR](A)p.[25r](C)p.[25r](G)p.[25r](A)p.[25r](C)[sp].[25r](U)}$$$$'\n}\n\ncategory('Formats support', () => {\n before(async () => {\n await getJsonData();\n await _package.initMonomerLib();\n });\n\n Object.entries(inputs).forEach(([format, sequence]) => {\n test(`All formats for ${format}`, async () => {\n const output = getTranslationObject(sequence, format);\n const result = Object.keys(output).length;\n // +1 due to nucleotides\n const expected = Object.keys(formatsToHelm).length + 1;\n expect(true, expected <= result);\n });\n });\n});\n","import * as DG from 'datagrok-api/dg';\nimport {runTests, tests, TestContext} from '@datagrok-libraries/utils/src/test';\nimport './tests/formats-to-helm';\nimport './tests/helm-to-nucleotides';\nimport './tests/formats-support';\n\nexport const _package = new DG.Package();\nexport {tests};\n\n//name: test\n//input: string category {optional: true}\n//input: string test {optional: true}\n//input: object testContext {optional: true}\n//output: dataframe result\nexport async function test(category: string, test: string, testContext: TestContext): Promise<DG.DataFrame> {\n const data = await runTests({category, test, testContext});\n return DG.DataFrame.fromObjects(data)!;\n}\n"],"names":["CandidateType","constructor","name","alphabet","cutoff","this","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","tests","currentCategory","assure","notNull","Error","TestContext","catchUnhandled","report","undefined","Test","category","test","options","_a","timeout","push","expect","actual","expected","before","runTests","_b","_c","_d","_e","results","packageName","func","package","console","log","testContext","key","Object","entries","toLowerCase","startsWith","x","beforeStatus","toString","t","res","i","length","execTest","data","all","filter","d","after","afterStatus","success","ms","skipped","r","setTimeout","delay","logger","successful","failed","description","params","assign","predicate","skip","skipReason","start","Date","stop","___CSS_LOADER_EXPORT___","module","id","exports","cssWithMappingToString","list","map","item","content","needLayer","concat","join","modules","media","dedupe","supports","layer","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","sourceMapping","out$","window","default","xmlNs","svgNs","urlRegex","fontFormats","woff2","woff","otf","ttf","eot","sfnt","svg","isElement","obj","HTMLElement","SVGElement","requireDomNode","el","requireDomNodePromise","getDimension","clone","dim","v","viewBox","baseVal","getAttribute","match","parseInt","getBoundingClientRect","style","getComputedStyle","getPropertyValue","isNaN","parseFloat","uriToBlob","uri","byteString","atob","split","mimeString","buffer","ArrayBuffer","intArray","Uint8Array","charCodeAt","Blob","type","cachedFonts","cachedRules","inlineCss","_ref","selectorRemap","modifyStyle","modifyCss","fonts","excludeUnusedCss","generateCss","selector","properties","css","detectFonts","fontList","Array","from","document","styleSheets","sheet","rules","cssRules","href","warn","forEach","_ref2","rule","querySelector","parentNode","err","query","selectorText","cssText","font","url","fontUrl","formats","fullUrl","text","format","keys","extension","indexOf","error","detectCssFont","req","XMLHttpRequest","addEventListener","fontInBase64","binary","bytes","byteLength","String","fromCharCode","arrayBufferToBase64","response","fontUri","replace","open","responseType","send","fontCss","inlineFonts","downloadOptions","navigator","msSaveOrOpenBlob","createElement","popup","prepareSvg","_ref3","_ref3$left","left","_ref3$top","top","w","width","h","height","_ref3$scale","scale","_ref3$responsive","responsive","_ref3$excludeCss","excludeCss","querySelectorAll","image","getAttributeNS","lastIndexOf","location","host","valueOf","canvas","img","Image","crossOrigin","src","onerror","onload","getContext","drawImage","setAttributeNS","toDataURL","inlineImages","cloneNode","backgroundColor","_getDimensions","tagName","getBBox","_el$getBBox","y","getDimensions","setAttribute","createElementNS","appendChild","removeAttribute","foreignObject","innerHTML","defs","insertBefore","firstChild","outer","svgAsDataUri","_ref4","svgXml","decodeURIComponent","p1","c","svgAsPngUri","_ref5","_ref5$encoderType","encoderType","_ref5$encoderOptions","encoderOptions","canvg","convertToPng","_ref6","context","pixelRatio","devicePixelRatio","setTransform","png","SecurityError","slice","download","saveLink","display","body","blob","URL","createObjectURL","onclick","requestAnimationFrame","revokeObjectURL","click","removeChild","title","saveSvg","downloadOpts","saveSvgAsPng","stylesInDOM","getIndexByIdentifier","identifier","modulesToDom","idCountMap","identifiers","base","count","indexByIdentifier","sourceMap","references","updater","addElementStyle","byIndex","splice","api","domAPI","update","newObj","remove","lastIdentifiers","newList","index","newLastIdentifiers","_i","_index","memo","insert","target","styleTarget","HTMLIFrameElement","contentDocument","head","getTarget","element","setAttributes","attributes","styleElement","nonce","insertStyleElement","styleTagTransform","removeStyleElement","styleSheet","createTextNode","NUCLEOTIDES","DEFAULT_FORMATS","LIB_PATH","DEFAULT_LIB_FILENAME","APP_PATH","AXOLABS_STYLE_FILENAME","CODES_TO_HELM_DICT_FILENAME","CODES_TO_SYMBOLS_FILENAME","MONOMERS_WITH_PHOSPHATE_LINKERS","fileSource","axolabsStyleMap","codesToHelmDictionary","codesToSymbolsDictionary","monomersWithPhosphateLinkers","async","getJsonData","every","parse","path","parsedJson","readAsText","errMsg","hasOwnProperty","message","sortByReverseLength","array","sort","a","b","tryCatch","finallyFunc","callbackName","MonomerLibWrapper","lib","_package","allMonomers","getAllMonomers","static","formatMonomerForViewer","sourceObj","formattedObject","getAllFormats","codes","code","symbol","polymerTypes","getPolymerTypes","polymerType","monomersByType","getMonomerSymbolsByType","monomerSymbol","getMonomer","monomer","instance","getMolfileBySymbol","molfile","getNaturalAnalogBySymbol","naturalAnalog","isModification","includes","getCodeToSymbolMap","Map","getCodesByFormat","getTableForViewer","formattedObjects","getCodesToWeightsMap","codesToWeightsMap","_","dict","weight","set","SequenceValidator","sequence","libWrapper","getInvalidCodeIndex","firstUniqueCharacters","indexOfFirstInvalidChar","matchedCode","find","substring","isValidSequence","GROUP_TYPE","NUCLEOSIDE","LINKAGE","PHOSPHATE_SYMBOL","UNKNOWN_SYMBOL","getTranslatedSequences","sourceFormat","supportedFormats","outputFormats","localeCompare","converter","fromEntries","translation","convertTo","nucleotides","getNucleotidesSequence","helmString","monomerLib","re","RegExp","branches","branch","stripped","inverseLengthComparator","FormatHandler","getFormats","getFormatNames","validateFormat","isHelm","getFormatCodes","getHelmToFormatDict","infoObj","values","helm","sorted","getHelmToCodeDict","getFormatToHelmDict","codesInfoObject","getTargetFormatHelmCodes","getTargetFormatHelmCodesRegExp","helmCodes","getRegExpPattern","getFormatRegExp","getNonHelmFormatRegExp","getPhosphateHelmCodesRegExp","phosphateHELMPattern","Set","isValidFormat","formatCodes","arr","HELM_WRAPPER","LEFT","RIGHT","FormatConverter","targetFormat","helmToFormat","formatToHelm","helmSequence","wrapperRegExp","helmRegExp","formatRegExp","phosphateRegExp","group","ui","wu","NOTATION","fasta","peptide","dna","rna","Float32Array","dt","simplified","PaletteType","palette","cp","objList","colour","ind","colourPalette","_palette","get","m","undefinedColor","Lesk","lesk","makePalette","GrokGroups","grokGroups","RasMol","rasMol","resM","aaSynonyms","super","Aminoacids","scheme","isInner","inner","char","chemPaletteInstance","getPalette","outerMonomer","innerMonomer","getInnerOuter","amino","toUpperCase","AAFullNames","SemType","SemTypeMultipleAlignment","Names","AASmiles","AASmilesTruncated","Nucleotides","StringUtils","s","hash","UnknownSeqPalette","UnknownColorPalette","pI","hashCode","color","dgColor","g","distToBlack","Math","sqrt","pow","correctColor","buildPalette","Uint32Array","MmDistanceFunctionsNames","HAMMING","LEVENSHTEIN","NEEDLEMANN_WUNSCH","uhTemp","rxjs","$","V2K_CONST","measureText","max","StPackage","_monomerLib","pi","libHelper","funcList","prepare","call","getOutputParamValue","readLibrary","close","DG","grok","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","n","getter","__esModule","definition","o","defineProperty","enumerable","prop","prototype","Symbol","toStringTag","nc","formatsToHelm","helmToNucleotides","getHelm","strand","getFromat","nucleotide","idx","inputs","output","indexOfInvalidChar","getTranslationObject"],"sourceRoot":""}