@datagrok/helm 2.1.31 → 2.1.33

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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AAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAEjD,GAASqsB,YAAcc,UAAUntB,KAAK,EACjC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC9C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAEjD,GAASusB,WAAaY,UAAUntB,KAAK,EAChC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC9C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EA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","sources":["webpack://helm/./node_modules/fast-sha256/sha256.js","webpack://helm/webpack/bootstrap","webpack://helm/webpack/runtime/compat get default export","webpack://helm/webpack/runtime/define property getters","webpack://helm/webpack/runtime/hasOwnProperty shorthand","webpack://helm/webpack/runtime/make namespace object","webpack://helm/external var \"DG\"","webpack://helm/external var \"grok\"","webpack://helm/./node_modules/@datagrok-libraries/utils/src/dataframe-utils.js","webpack://helm/./node_modules/@datagrok-libraries/utils/src/test.js","webpack://helm/./src/utils/index.ts","webpack://helm/./src/tests/helm-tests.ts","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/const.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/types.js","webpack://helm/external var \"wu\"","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/consts.js","webpack://helm/./node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://helm/./node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/seq-palettes.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/aminoacids.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/nucleotides.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/unknown.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/utils.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/hamming.js","webpack://helm/./node_modules/fastest-levenshtein/esm/mod.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/needleman-wunsch.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/macromolecule-distance-functions.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/levenstein.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/seq-handler.js","webpack://helm/./node_modules/@datagrok-libraries/utils/src/bit-array.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/typed-metrics/consts.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/monomer-works/monomer-utils.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/distance-metrics-methods.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/monomer-works/lib-settings.js","webpack://helm/./src/tests/findMonomers-tests.ts","webpack://helm/external var \"$\"","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/formats/molfile-v2k-const.js","webpack://helm/./src/tests/renderers-tests.ts","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/chemical-table-parser-base.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler-base.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/const.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/utils.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/molfile-v2k-handler.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/molfile-v3k-handler.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler.js","webpack://helm/./src/tests/utils.ts","webpack://helm/./src/tests/get-molfiles.ts","webpack://helm/external var \"ui\"","webpack://helm/./src/tests/properties-widget-tests.ts","webpack://helm/./src/widgets/properties-widget.ts","webpack://helm/./src/package-test.ts"],"sourcesContent":["(function (root, factory) {\n // Hack to make all exports of this module sha256 function object properties.\n var exports = {};\n factory(exports);\n var sha256 = exports[\"default\"];\n for (var k in exports) {\n sha256[k] = exports[k];\n }\n \n if (typeof module === 'object' && typeof module.exports === 'object') {\n module.exports = sha256;\n } else if (typeof define === 'function' && define.amd) {\n define(function() { return sha256; }); \n } else {\n root.sha256 = sha256;\n }\n})(this, function(exports) {\n\"use strict\";\nexports.__esModule = true;\n// SHA-256 (+ HMAC and PBKDF2) for JavaScript.\n//\n// Written in 2014-2016 by Dmitry Chestnykh.\n// Public domain, no warranty.\n//\n// Functions (accept and return Uint8Arrays):\n//\n// sha256(message) -> hash\n// sha256.hmac(key, message) -> mac\n// sha256.pbkdf2(password, salt, rounds, dkLen) -> dk\n//\n// Classes:\n//\n// new sha256.Hash()\n// new sha256.HMAC(key)\n//\nexports.digestLength = 32;\nexports.blockSize = 64;\n// SHA-256 constants\nvar K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b,\n 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01,\n 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7,\n 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152,\n 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc,\n 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819,\n 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08,\n 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f,\n 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\nfunction hashBlocks(w, v, p, pos, len) {\n var a, b, c, d, e, f, g, h, u, i, j, t1, t2;\n while (len >= 64) {\n a = v[0];\n b = v[1];\n c = v[2];\n d = v[3];\n e = v[4];\n f = v[5];\n g = v[6];\n h = v[7];\n for (i = 0; i < 16; i++) {\n j = pos + i * 4;\n w[i] = (((p[j] & 0xff) << 24) | ((p[j + 1] & 0xff) << 16) |\n ((p[j + 2] & 0xff) << 8) | (p[j + 3] & 0xff));\n }\n for (i = 16; i < 64; i++) {\n u = w[i - 2];\n t1 = (u >>> 17 | u << (32 - 17)) ^ (u >>> 19 | u << (32 - 19)) ^ (u >>> 10);\n u = w[i - 15];\n t2 = (u >>> 7 | u << (32 - 7)) ^ (u >>> 18 | u << (32 - 18)) ^ (u >>> 3);\n w[i] = (t1 + w[i - 7] | 0) + (t2 + w[i - 16] | 0);\n }\n for (i = 0; i < 64; i++) {\n t1 = (((((e >>> 6 | e << (32 - 6)) ^ (e >>> 11 | e << (32 - 11)) ^\n (e >>> 25 | e << (32 - 25))) + ((e & f) ^ (~e & g))) | 0) +\n ((h + ((K[i] + w[i]) | 0)) | 0)) | 0;\n t2 = (((a >>> 2 | a << (32 - 2)) ^ (a >>> 13 | a << (32 - 13)) ^\n (a >>> 22 | a << (32 - 22))) + ((a & b) ^ (a & c) ^ (b & c))) | 0;\n h = g;\n g = f;\n f = e;\n e = (d + t1) | 0;\n d = c;\n c = b;\n b = a;\n a = (t1 + t2) | 0;\n }\n v[0] += a;\n v[1] += b;\n v[2] += c;\n v[3] += d;\n v[4] += e;\n v[5] += f;\n v[6] += g;\n v[7] += h;\n pos += 64;\n len -= 64;\n }\n return pos;\n}\n// Hash implements SHA256 hash algorithm.\nvar Hash = /** @class */ (function () {\n function Hash() {\n this.digestLength = exports.digestLength;\n this.blockSize = exports.blockSize;\n // Note: Int32Array is used instead of Uint32Array for performance reasons.\n this.state = new Int32Array(8); // hash state\n this.temp = new Int32Array(64); // temporary state\n this.buffer = new Uint8Array(128); // buffer for data to hash\n this.bufferLength = 0; // number of bytes in buffer\n this.bytesHashed = 0; // number of total bytes hashed\n this.finished = false; // indicates whether the hash was finalized\n this.reset();\n }\n // Resets hash state making it possible\n // to re-use this instance to hash other data.\n Hash.prototype.reset = function () {\n this.state[0] = 0x6a09e667;\n this.state[1] = 0xbb67ae85;\n this.state[2] = 0x3c6ef372;\n this.state[3] = 0xa54ff53a;\n this.state[4] = 0x510e527f;\n this.state[5] = 0x9b05688c;\n this.state[6] = 0x1f83d9ab;\n this.state[7] = 0x5be0cd19;\n this.bufferLength = 0;\n this.bytesHashed = 0;\n this.finished = false;\n return this;\n };\n // Cleans internal buffers and re-initializes hash state.\n Hash.prototype.clean = function () {\n for (var i = 0; i < this.buffer.length; i++) {\n this.buffer[i] = 0;\n }\n for (var i = 0; i < this.temp.length; i++) {\n this.temp[i] = 0;\n }\n this.reset();\n };\n // Updates hash state with the given data.\n //\n // Optionally, length of the data can be specified to hash\n // fewer bytes than data.length.\n //\n // Throws error when trying to update already finalized hash:\n // instance must be reset to use it again.\n Hash.prototype.update = function (data, dataLength) {\n if (dataLength === void 0) { dataLength = data.length; }\n if (this.finished) {\n throw new Error(\"SHA256: can't update because hash was finished.\");\n }\n var dataPos = 0;\n this.bytesHashed += dataLength;\n if (this.bufferLength > 0) {\n while (this.bufferLength < 64 && dataLength > 0) {\n this.buffer[this.bufferLength++] = data[dataPos++];\n dataLength--;\n }\n if (this.bufferLength === 64) {\n hashBlocks(this.temp, this.state, this.buffer, 0, 64);\n this.bufferLength = 0;\n }\n }\n if (dataLength >= 64) {\n dataPos = hashBlocks(this.temp, this.state, data, dataPos, dataLength);\n dataLength %= 64;\n }\n while (dataLength > 0) {\n this.buffer[this.bufferLength++] = data[dataPos++];\n dataLength--;\n }\n return this;\n };\n // Finalizes hash state and puts hash into out.\n //\n // If hash was already finalized, puts the same value.\n Hash.prototype.finish = function (out) {\n if (!this.finished) {\n var bytesHashed = this.bytesHashed;\n var left = this.bufferLength;\n var bitLenHi = (bytesHashed / 0x20000000) | 0;\n var bitLenLo = bytesHashed << 3;\n var padLength = (bytesHashed % 64 < 56) ? 64 : 128;\n this.buffer[left] = 0x80;\n for (var i = left + 1; i < padLength - 8; i++) {\n this.buffer[i] = 0;\n }\n this.buffer[padLength - 8] = (bitLenHi >>> 24) & 0xff;\n this.buffer[padLength - 7] = (bitLenHi >>> 16) & 0xff;\n this.buffer[padLength - 6] = (bitLenHi >>> 8) & 0xff;\n this.buffer[padLength - 5] = (bitLenHi >>> 0) & 0xff;\n this.buffer[padLength - 4] = (bitLenLo >>> 24) & 0xff;\n this.buffer[padLength - 3] = (bitLenLo >>> 16) & 0xff;\n this.buffer[padLength - 2] = (bitLenLo >>> 8) & 0xff;\n this.buffer[padLength - 1] = (bitLenLo >>> 0) & 0xff;\n hashBlocks(this.temp, this.state, this.buffer, 0, padLength);\n this.finished = true;\n }\n for (var i = 0; i < 8; i++) {\n out[i * 4 + 0] = (this.state[i] >>> 24) & 0xff;\n out[i * 4 + 1] = (this.state[i] >>> 16) & 0xff;\n out[i * 4 + 2] = (this.state[i] >>> 8) & 0xff;\n out[i * 4 + 3] = (this.state[i] >>> 0) & 0xff;\n }\n return this;\n };\n // Returns the final hash digest.\n Hash.prototype.digest = function () {\n var out = new Uint8Array(this.digestLength);\n this.finish(out);\n return out;\n };\n // Internal function for use in HMAC for optimization.\n Hash.prototype._saveState = function (out) {\n for (var i = 0; i < this.state.length; i++) {\n out[i] = this.state[i];\n }\n };\n // Internal function for use in HMAC for optimization.\n Hash.prototype._restoreState = function (from, bytesHashed) {\n for (var i = 0; i < this.state.length; i++) {\n this.state[i] = from[i];\n }\n this.bytesHashed = bytesHashed;\n this.finished = false;\n this.bufferLength = 0;\n };\n return Hash;\n}());\nexports.Hash = Hash;\n// HMAC implements HMAC-SHA256 message authentication algorithm.\nvar HMAC = /** @class */ (function () {\n function HMAC(key) {\n this.inner = new Hash();\n this.outer = new Hash();\n this.blockSize = this.inner.blockSize;\n this.digestLength = this.inner.digestLength;\n var pad = new Uint8Array(this.blockSize);\n if (key.length > this.blockSize) {\n (new Hash()).update(key).finish(pad).clean();\n }\n else {\n for (var i = 0; i < key.length; i++) {\n pad[i] = key[i];\n }\n }\n for (var i = 0; i < pad.length; i++) {\n pad[i] ^= 0x36;\n }\n this.inner.update(pad);\n for (var i = 0; i < pad.length; i++) {\n pad[i] ^= 0x36 ^ 0x5c;\n }\n this.outer.update(pad);\n this.istate = new Uint32Array(8);\n this.ostate = new Uint32Array(8);\n this.inner._saveState(this.istate);\n this.outer._saveState(this.ostate);\n for (var i = 0; i < pad.length; i++) {\n pad[i] = 0;\n }\n }\n // Returns HMAC state to the state initialized with key\n // to make it possible to run HMAC over the other data with the same\n // key without creating a new instance.\n HMAC.prototype.reset = function () {\n this.inner._restoreState(this.istate, this.inner.blockSize);\n this.outer._restoreState(this.ostate, this.outer.blockSize);\n return this;\n };\n // Cleans HMAC state.\n HMAC.prototype.clean = function () {\n for (var i = 0; i < this.istate.length; i++) {\n this.ostate[i] = this.istate[i] = 0;\n }\n this.inner.clean();\n this.outer.clean();\n };\n // Updates state with provided data.\n HMAC.prototype.update = function (data) {\n this.inner.update(data);\n return this;\n };\n // Finalizes HMAC and puts the result in out.\n HMAC.prototype.finish = function (out) {\n if (this.outer.finished) {\n this.outer.finish(out);\n }\n else {\n this.inner.finish(out);\n this.outer.update(out, this.digestLength).finish(out);\n }\n return this;\n };\n // Returns message authentication code.\n HMAC.prototype.digest = function () {\n var out = new Uint8Array(this.digestLength);\n this.finish(out);\n return out;\n };\n return HMAC;\n}());\nexports.HMAC = HMAC;\n// Returns SHA256 hash of data.\nfunction hash(data) {\n var h = (new Hash()).update(data);\n var digest = h.digest();\n h.clean();\n return digest;\n}\nexports.hash = hash;\n// Function hash is both available as module.hash and as default export.\nexports[\"default\"] = hash;\n// Returns HMAC-SHA256 of data under the key.\nfunction hmac(key, data) {\n var h = (new HMAC(key)).update(data);\n var digest = h.digest();\n h.clean();\n return digest;\n}\nexports.hmac = hmac;\n// Fills hkdf buffer like this:\n// T(1) = HMAC-Hash(PRK, T(0) | info | 0x01)\nfunction fillBuffer(buffer, hmac, info, counter) {\n // Counter is a byte value: check if it overflowed.\n var num = counter[0];\n if (num === 0) {\n throw new Error(\"hkdf: cannot expand more\");\n }\n // Prepare HMAC instance for new data with old key.\n hmac.reset();\n // Hash in previous output if it was generated\n // (i.e. counter is greater than 1).\n if (num > 1) {\n hmac.update(buffer);\n }\n // Hash in info if it exists.\n if (info) {\n hmac.update(info);\n }\n // Hash in the counter.\n hmac.update(counter);\n // Output result to buffer and clean HMAC instance.\n hmac.finish(buffer);\n // Increment counter inside typed array, this works properly.\n counter[0]++;\n}\nvar hkdfSalt = new Uint8Array(exports.digestLength); // Filled with zeroes.\nfunction hkdf(key, salt, info, length) {\n if (salt === void 0) { salt = hkdfSalt; }\n if (length === void 0) { length = 32; }\n var counter = new Uint8Array([1]);\n // HKDF-Extract uses salt as HMAC key, and key as data.\n var okm = hmac(salt, key);\n // Initialize HMAC for expanding with extracted key.\n // Ensure no collisions with `hmac` function.\n var hmac_ = new HMAC(okm);\n // Allocate buffer.\n var buffer = new Uint8Array(hmac_.digestLength);\n var bufpos = buffer.length;\n var out = new Uint8Array(length);\n for (var i = 0; i < length; i++) {\n if (bufpos === buffer.length) {\n fillBuffer(buffer, hmac_, info, counter);\n bufpos = 0;\n }\n out[i] = buffer[bufpos++];\n }\n hmac_.clean();\n buffer.fill(0);\n counter.fill(0);\n return out;\n}\nexports.hkdf = hkdf;\n// Derives a key from password and salt using PBKDF2-HMAC-SHA256\n// with the given number of iterations.\n//\n// The number of bytes returned is equal to dkLen.\n//\n// (For better security, avoid dkLen greater than hash length - 32 bytes).\nfunction pbkdf2(password, salt, iterations, dkLen) {\n var prf = new HMAC(password);\n var len = prf.digestLength;\n var ctr = new Uint8Array(4);\n var t = new Uint8Array(len);\n var u = new Uint8Array(len);\n var dk = new Uint8Array(dkLen);\n for (var i = 0; i * len < dkLen; i++) {\n var c = i + 1;\n ctr[0] = (c >>> 24) & 0xff;\n ctr[1] = (c >>> 16) & 0xff;\n ctr[2] = (c >>> 8) & 0xff;\n ctr[3] = (c >>> 0) & 0xff;\n prf.reset();\n prf.update(salt);\n prf.update(ctr);\n prf.finish(u);\n for (var j = 0; j < len; j++) {\n t[j] = u[j];\n }\n for (var j = 2; j <= iterations; j++) {\n prf.reset();\n prf.update(u).finish(u);\n for (var k = 0; k < len; k++) {\n t[k] ^= u[k];\n }\n }\n for (var j = 0; j < len && i * len + j < dkLen; j++) {\n dk[i * len + j] = t[j];\n }\n }\n for (var i = 0; i < len; i++) {\n t[i] = u[i] = 0;\n }\n for (var i = 0; i < 4; i++) {\n ctr[i] = 0;\n }\n prf.clean();\n return dk;\n}\nexports.pbkdf2 = pbkdf2;\n});\n","// 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\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = DG;","const __WEBPACK_NAMESPACE_OBJECT__ = grok;","/* eslint-disable max-len */\nimport * as DG from 'datagrok-api/dg';\nimport * as sha256 from 'fast-sha256';\n/**\n * For columns of string type. Checks whether column contains empty values and removes corresponding rows in case user selects to remove.\n *\n */\nexport function removeEmptyStringRows(table, col) {\n const cats = col.categories;\n const emptyRawInd = cats.map((val, ind) => !val ? ind : null).filter((it) => it !== null);\n const rawData = [...col.getRawData()];\n const emptyRawsIndexes = [];\n let removedRowsCounter = 0;\n for (let i = 0; i < table.rowCount; i++) {\n if (emptyRawInd.includes(rawData[i])) {\n table.rows.removeAt(i - removedRowsCounter);\n emptyRawsIndexes.push(i);\n removedRowsCounter += 1;\n }\n }\n return emptyRawsIndexes;\n}\nexport function hashDataFrame(table, names) {\n names !== null && names !== void 0 ? names : (names = table.columns.names());\n const hasher = new sha256.Hash();\n const order = table.getSortedOrder(names);\n const encoder = new TextEncoder();\n for (const name of names) {\n const column = table.columns.byName(name);\n const dataArray = column.getRawData();\n const isString = column.type == DG.TYPE.STRING;\n const cats = column.categories;\n for (let i = 0; i < dataArray.length; i++) {\n if (isString) {\n const data = cats[dataArray[order[i]]];\n hasher.update(encoder.encode(data));\n }\n else {\n const data = dataArray[order[i]];\n hasher.update(Uint8Array.from([data]));\n }\n }\n }\n return hasher.digest();\n}\nexport const testData = DG.DataFrame.fromCsv(`countries,fasta,smiles,molregno,LON,Zip Code,Street Address Line 1,ImageUrl,user_id,error_message,xray,flag,magnitude,CS-id,pdb_id,accel_a,time_offset,chart,fit,Questions,empty_number,empty_string\nBelgium,MSNFHNEHVMQFYRNNLKTKGVFGRQ,CC(C(=O)OCCCc1cccnc1)c2cccc(c2)C(=O)c3ccccc3,1480014,36.276729583740234,995042300,14016 ROUTE 31W,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,1,1,1QBS,1,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.497360340644872, 1.7058694986686864, 5.278052678195135, 0.16000320889028383],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":2.374499797821045},{\"\"x\"\":0.6000000238418579,\"\"y\"\":2.6242473125457764},{\"\"x\"\":1.100000023841858,\"\"y\"\":2.367267608642578},{\"\"x\"\":1.600000023841858,\"\"y\"\":2.6723148822784424},{\"\"x\"\":2.0999999046325684,\"\"y\"\":2.6537344455718994},{\"\"x\"\":2.5999999046325684,\"\"y\"\":2.3651671409606934},{\"\"x\"\":3.0999999046325684,\"\"y\"\":2.5654284954071045},{\"\"x\"\":3.5999999046325684,\"\"y\"\":2.4160959720611572},{\"\"x\"\":4.099999904632568,\"\"y\"\":2.286726713180542},{\"\"x\"\":4.599999904632568,\"\"y\"\":2.5100042819976807},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.6676985025405884},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.680136501789093},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.3391543924808502},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.09038983285427094},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.19802775979042053}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[7.525235855508179, 1.3186911876809984, 5.335672608564294, 0.7860743343958098],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":7.988070487976074},{\"\"x\"\":0.6000000238418579,\"\"y\"\":7.018453121185303},{\"\"x\"\":1.100000023841858,\"\"y\"\":8.115279197692871},{\"\"x\"\":1.600000023841858,\"\"y\"\":7.486658096313477},{\"\"x\"\":2.0999999046325684,\"\"y\"\":7.396438121795654},{\"\"x\"\":2.5999999046325684,\"\"y\"\":7.477052211761475},{\"\"x\"\":3.0999999046325684,\"\"y\"\":6.913095474243164},{\"\"x\"\":3.5999999046325684,\"\"y\"\":8.01385498046875},{\"\"x\"\":4.099999904632568,\"\"y\"\":6.985900402069092},{\"\"x\"\":4.599999904632568,\"\"y\"\":6.970335960388184},{\"\"x\"\":5.099999904632568,\"\"y\"\":5.448817253112793},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.5534818172454834},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.893947958946228},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6340042352676392},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.8403874039649963}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,100,abc\nBurundi,MDYKETLLMPKTDFPMRGGLPNKEPQIQEKW,COc1ccc2cc(ccc2c1)C(C)C(=O)Oc3ccc(C)cc3OC,1480015,36.276729583740234,995073444,80 STATE HIGHWAY 310,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,2,2,1ZP8,2,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[4.431460753103398, 2.1691498799246745, 5.266445597102774, 0.7825762827017926],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":4.751083850860596},{\"\"x\"\":0.6000000238418579,\"\"y\"\":4.203000068664551},{\"\"x\"\":1.100000023841858,\"\"y\"\":4.415858745574951},{\"\"x\"\":1.600000023841858,\"\"y\"\":4.68414306640625},{\"\"x\"\":2.0999999046325684,\"\"y\"\":4.198400974273682},{\"\"x\"\":2.5999999046325684,\"\"y\"\":4.179222106933594},{\"\"x\"\":3.0999999046325684,\"\"y\"\":4.638473987579346},{\"\"x\"\":3.5999999046325684,\"\"y\"\":4.708553314208984},{\"\"x\"\":4.099999904632568,\"\"y\"\":4.291589260101318},{\"\"x\"\":4.599999904632568,\"\"y\"\":4.038082599639893},{\"\"x\"\":5.099999904632568,\"\"y\"\":3.4349939823150635},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.2194708585739136},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.1920831203460693},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.5352635979652405},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.3346920311450958}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.339458017970126, -1.0734184310171178, 4.746332950550934, 0.2482416857595658],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.2139337658882141},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.4269562065601349},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.2441573292016983},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.146635964512825},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.08818462491035461},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.2560656666755676},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.42434045672416687},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.37111231684684753},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.5581737160682678},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.183590054512024},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.5629843473434448},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.3211288452148438},{\"\"x\"\":6.099999904632568,\"\"y\"\":2.229961633682251},{\"\"x\"\":6.599999904632568,\"\"y\"\":2.2560226917266846},{\"\"x\"\":7.099999904632568,\"\"y\"\":2.2142398357391357}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCameroon,MIEVFLFGIVLGLIPITLAGLFVTAYLQYRRGDQLDL,COc1ccc2cc(ccc2c1)C(C)C(=O)OCCCc3cccnc3,1480016,36.26095962524414,995153596,30-56 WHITESTONE EXPY,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,3,3,2BDJ,3,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[4.6760652578642325, 0.9046956320756703, 5.651408971856738, 0.07738846012184185],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":4.32425594329834},{\"\"x\"\":0.6000000238418579,\"\"y\"\":4.668442249298096},{\"\"x\"\":1.100000023841858,\"\"y\"\":4.379785060882568},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.0345139503479},{\"\"x\"\":2.0999999046325684,\"\"y\"\":4.878653526306152},{\"\"x\"\":2.5999999046325684,\"\"y\"\":4.3451313972473145},{\"\"x\"\":3.0999999046325684,\"\"y\"\":4.336992263793945},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.037430286407471},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.0092692375183105},{\"\"x\"\":4.599999904632568,\"\"y\"\":4.151902675628662},{\"\"x\"\":5.099999904632568,\"\"y\"\":3.4066951274871826},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.3732759952545166},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.673728108406067},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.48574790358543396},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.2783052325248718}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.938395863010111, -1.4658480661392117, 5.462702751996584, 0.3473139023615039],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.4941710829734802},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.15323974192142487},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.46373432874679565},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.3370431363582611},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.5179030299186707},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.27899765968322754},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.22075064480304718},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.5789918899536133},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.21169911324977875},{\"\"x\"\":4.599999904632568,\"\"y\"\":0.27857646346092224},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.0906332731246948},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.8520300388336182},{\"\"x\"\":6.099999904632568,\"\"y\"\":2.7177059650421143},{\"\"x\"\":6.599999904632568,\"\"y\"\":2.8680918216705322},{\"\"x\"\":7.099999904632568,\"\"y\"\":3.2413077354431152}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCanada,MMELVLKTIIGPIVVGVVLRIVDKWLNKDK,CC(C(=O)NCCS)c1cccc(c1)C(=O)c2ccccc2,1480017,36.26095962524414,99515,30-56 WHITESTONE EXPY,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,4,4,1IAN,4,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[0.8597390975430008, 1.0957625732481946, 5.260537067987958, 0.07974187998177736],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.8190152645111084},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.8421689867973328},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.8740922212600708},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.8924275040626526},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.8249067664146423},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.9327669143676758},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.8522974252700806},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.8174492716789246},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.8394647240638733},{\"\"x\"\":4.599999904632568,\"\"y\"\":0.7139387726783752},{\"\"x\"\":5.099999904632568,\"\"y\"\":0.5561167597770691},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.3276226818561554},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.12479474395513535},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.13006797432899475},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.059702079743146896}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.760930219582546, 1.6591793293833013, 4.667155929720851, 0.7858109544121652],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":6.156993389129639},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.236701965332031},{\"\"x\"\":1.100000023841858,\"\"y\"\":6.010560512542725},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.495512962341309},{\"\"x\"\":2.0999999046325684,\"\"y\"\":6.087770462036133},{\"\"x\"\":2.5999999046325684,\"\"y\"\":5.79986572265625},{\"\"x\"\":3.0999999046325684,\"\"y\"\":5.597546577453613},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.520902156829834},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.360654354095459},{\"\"x\"\":4.599999904632568,\"\"y\"\":3.5539746284484863},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.577236294746399},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.0001264810562134},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.9305797815322876},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6033638715744019},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.4203685522079468}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nColombia,MDRTDEVSNHTHDKPTLTWFEEIFEEYHSPFHN,FC(F)(F)c1ccc(OC2CCNCC2)cc1,1480029,36.3309440612793,995152050,1 COURT HOUSE SQUARE,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,5,5,4UJ1,5,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[6.4995088314153655, 2.4270351004539914, 5.178659535348579, 0.625653346241577],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":6.496231555938721},{\"\"x\"\":0.6000000238418579,\"\"y\"\":6.42543363571167},{\"\"x\"\":1.100000023841858,\"\"y\"\":7.040063858032227},{\"\"x\"\":1.600000023841858,\"\"y\"\":6.1115403175354},{\"\"x\"\":2.0999999046325684,\"\"y\"\":6.680728435516357},{\"\"x\"\":2.5999999046325684,\"\"y\"\":6.406774520874023},{\"\"x\"\":3.0999999046325684,\"\"y\"\":6.611269474029541},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.889094352722168},{\"\"x\"\":4.099999904632568,\"\"y\"\":6.75344705581665},{\"\"x\"\":4.599999904632568,\"\"y\"\":6.361435890197754},{\"\"x\"\":5.099999904632568,\"\"y\"\":4.1666975021362305},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.172118902206421},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.801048994064331},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.4640021026134491},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.0010357667924836278}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[1.4734381347446401, 1.1649805188074196, 4.82958608866421, 0.09500545496710007],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":1.5279096364974976},{\"\"x\"\":0.6000000238418579,\"\"y\"\":1.3559974431991577},{\"\"x\"\":1.100000023841858,\"\"y\"\":1.5246378183364868},{\"\"x\"\":1.600000023841858,\"\"y\"\":1.5567657947540283},{\"\"x\"\":2.0999999046325684,\"\"y\"\":1.4114240407943726},{\"\"x\"\":2.5999999046325684,\"\"y\"\":1.4045010805130005},{\"\"x\"\":3.0999999046325684,\"\"y\"\":1.4769829511642456},{\"\"x\"\":3.5999999046325684,\"\"y\"\":1.4875500202178955},{\"\"x\"\":4.099999904632568,\"\"y\"\":1.2991987466812134},{\"\"x\"\":4.599999904632568,\"\"y\"\":0.922961413860321},{\"\"x\"\":5.099999904632568,\"\"y\"\":0.6520044803619385},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.15350978076457977},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.1078903079032898},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.17276449501514435},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.14066608250141144}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCosta Rica,MKSTKEEIQTIKTLLKDSRTAKYHKRLQIVL,CC(C)Cc1ccc(cc1)C(C)C(=O)N2CCCC2C(=O)OCCCc3ccccc3,1480018,36.3309440612793,995084218,4041 SOUTHWESTERN BLVD,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,6,6,2BPW,6,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.4833641843311227, -1.8945978742090062, 4.671127708092568, 0.24159861311815153],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.0969524160027504},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.028483040630817413},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.22087176144123077},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.0068915546871721745},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.4305879771709442},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.44774115085601807},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.45346319675445557},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.2370593100786209},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.4657953977584839},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.155200719833374},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.2294070720672607},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.4311530590057373},{\"\"x\"\":6.099999904632568,\"\"y\"\":2.33846116065979},{\"\"x\"\":6.599999904632568,\"\"y\"\":2.608201026916504},{\"\"x\"\":7.099999904632568,\"\"y\"\":2.8136143684387207}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.224573521642033, 1.4454033924198528, 5.6014197746076535, 0.2823216054197577],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":4.95027494430542},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.1754679679870605},{\"\"x\"\":1.100000023841858,\"\"y\"\":5.276752948760986},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.589294910430908},{\"\"x\"\":2.0999999046325684,\"\"y\"\":5.616994857788086},{\"\"x\"\":2.5999999046325684,\"\"y\"\":5.120813846588135},{\"\"x\"\":3.0999999046325684,\"\"y\"\":5.340766906738281},{\"\"x\"\":3.5999999046325684,\"\"y\"\":4.876471042633057},{\"\"x\"\":4.099999904632568,\"\"y\"\":4.94999361038208},{\"\"x\"\":4.599999904632568,\"\"y\"\":5.162564754486084},{\"\"x\"\":5.099999904632568,\"\"y\"\":4.399557590484619},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.7977969646453857},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.0229872465133667},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.48275601863861084},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.10408931970596313}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCuba,MHAILRYFIRRLFYHIFYKIYSLISKKHQSLPSDVRQF,COc1ccc2c(c1)c(CC(=O)N3CCCC3C(=O)Oc4ccc(C)cc4OC)c(C)n2C(=O)c5ccc(Cl)cc5,1480019,36.33115768432617,995081928,1227 US HIGHWAY 11,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,7,7,1QBS,7,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.320838679713925, -1.2421619987316728, 4.831325425225256, 0.3236011098403072],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.3727470338344574},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.12365014106035233},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.48422467708587646},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.2264465093612671},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.16821794211864471},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.3879014551639557},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.5470244884490967},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.3419053554534912},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.7655120491981506},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.2346516847610474},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.453336715698242},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.9565491676330566},{\"\"x\"\":6.099999904632568,\"\"y\"\":3.335299491882324},{\"\"x\"\":6.599999904632568,\"\"y\"\":3.240290880203247},{\"\"x\"\":7.099999904632568,\"\"y\"\":3.1107218265533447}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.6401853521511094, 1.26211588875013, 5.399028074402744, 0.5089580830068091],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":3.8585598468780518},{\"\"x\"\":0.6000000238418579,\"\"y\"\":3.6077206134796143},{\"\"x\"\":1.100000023841858,\"\"y\"\":3.855252265930176},{\"\"x\"\":1.600000023841858,\"\"y\"\":3.619039297103882},{\"\"x\"\":2.0999999046325684,\"\"y\"\":3.839388370513916},{\"\"x\"\":2.5999999046325684,\"\"y\"\":3.335283041000366},{\"\"x\"\":3.0999999046325684,\"\"y\"\":3.571141481399536},{\"\"x\"\":3.5999999046325684,\"\"y\"\":3.4155046939849854},{\"\"x\"\":4.099999904632568,\"\"y\"\":3.7316646575927734},{\"\"x\"\":4.599999904632568,\"\"y\"\":3.0680155754089355},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.891066551208496},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.6022753715515137},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.7652576565742493},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6875326037406921},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.5828871726989746}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nItaly,MSNFHNEHVMQFYRNNLKTKGVFGRQ,CC(C)Cc1ccc(cc1)C(C)C(=O)N2CCCC2C(=O)OCCO[N+](=O)[O-],1480020,36.33115768432617,99502,\"168-46 91ST AVE., 2ND FLR\",https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,8,8,1ZP8,8,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.293592105923809, 1.3781586549141835, 5.1025898038676605, 0.03493851245291291],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":2.1287283897399902},{\"\"x\"\":0.6000000238418579,\"\"y\"\":2.267972230911255},{\"\"x\"\":1.100000023841858,\"\"y\"\":2.398442506790161},{\"\"x\"\":1.600000023841858,\"\"y\"\":2.5130622386932373},{\"\"x\"\":2.0999999046325684,\"\"y\"\":2.3255116939544678},{\"\"x\"\":2.5999999046325684,\"\"y\"\":2.127340793609619},{\"\"x\"\":3.0999999046325684,\"\"y\"\":2.47259783744812},{\"\"x\"\":3.5999999046325684,\"\"y\"\":2.131181478500366},{\"\"x\"\":4.099999904632568,\"\"y\"\":2.090421438217163},{\"\"x\"\":4.599999904632568,\"\"y\"\":2.02299165725708},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.1105059385299683},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.4494485855102539},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.1375635862350464},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.036351121962070465},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.1619771122932434}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.953125499439879, 1.2528620255306528, 5.187637440149802, 0.3110348753260886],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":5.6585283279418945},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.911152362823486},{\"\"x\"\":1.100000023841858,\"\"y\"\":5.924920082092285},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.8469438552856445},{\"\"x\"\":2.0999999046325684,\"\"y\"\":5.929472923278809},{\"\"x\"\":2.5999999046325684,\"\"y\"\":6.190037727355957},{\"\"x\"\":3.0999999046325684,\"\"y\"\":6.236179828643799},{\"\"x\"\":3.5999999046325684,\"\"y\"\":6.141019344329834},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.295210838317871},{\"\"x\"\":4.599999904632568,\"\"y\"\":5.265801906585693},{\"\"x\"\":5.099999904632568,\"\"y\"\":3.3722851276397705},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.8299226760864258},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.32690900564193726},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6274543404579163},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.8441857099533081}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nRwanda,MPNSEPASLLELFNSIATQGELVRSLKAGNASK,CC(C)Cc1ccc(cc1)C(C)C(=O)N2CCCC2C(=O)OCCO,1480021,36.33137130737305,995037247,\"168-46 91ST AVE., 2ND FLR\",https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,9,9,2BDJ,9,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.8209972202654474, 1.3779216716448506, 5.299882228439686, 0.06040645519069608],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":3.7821109294891357},{\"\"x\"\":0.6000000238418579,\"\"y\"\":3.542433023452759},{\"\"x\"\":1.100000023841858,\"\"y\"\":3.7008674144744873},{\"\"x\"\":1.600000023841858,\"\"y\"\":3.717301607131958},{\"\"x\"\":2.0999999046325684,\"\"y\"\":4.024452209472656},{\"\"x\"\":2.5999999046325684,\"\"y\"\":4.013899326324463},{\"\"x\"\":3.0999999046325684,\"\"y\"\":3.945094347000122},{\"\"x\"\":3.5999999046325684,\"\"y\"\":3.866621971130371},{\"\"x\"\":4.099999904632568,\"\"y\"\":3.7461626529693604},{\"\"x\"\":4.599999904632568,\"\"y\"\":3.3454740047454834},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.61944317817688},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.999405026435852},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.46259793639183044},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.054134611040353775},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.05711187422275543}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.6318079657726035, 1.8495493770000595, 5.391793312471116, 0.17060707587348442],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":5.458079814910889},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.554427146911621},{\"\"x\"\":1.100000023841858,\"\"y\"\":5.799983024597168},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.364140033721924},{\"\"x\"\":2.0999999046325684,\"\"y\"\":5.864485740661621},{\"\"x\"\":2.5999999046325684,\"\"y\"\":5.4509806632995605},{\"\"x\"\":3.0999999046325684,\"\"y\"\":5.702574729919434},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.7314534187316895},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.5123443603515625},{\"\"x\"\":4.599999904632568,\"\"y\"\":5.724395751953125},{\"\"x\"\":5.099999904632568,\"\"y\"\":4.354506969451904},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.7307666540145874},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.6305936574935913},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.035183437168598175},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.7575169205665588}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nSwitzerland,IRVVGRYLIEVWKAAGMDMDKVLFLWSSDEI,CN1CCC(CC1)Oc2ccc(cc2)C(F)(F)F,1480028,36.33137130737305,99504,92-11 179TH PLACE,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,9,10,1IAN,10,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[1.1190255865097471, 2.3163895161544437, 5.4968866182279195, 0.2035204047289052],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":1.1057683229446411},{\"\"x\"\":0.6000000238418579,\"\"y\"\":1.1019697189331055},{\"\"x\"\":1.100000023841858,\"\"y\"\":1.0818607807159424},{\"\"x\"\":1.600000023841858,\"\"y\"\":1.062997817993164},{\"\"x\"\":2.0999999046325684,\"\"y\"\":1.046447515487671},{\"\"x\"\":2.5999999046325684,\"\"y\"\":1.1217249631881714},{\"\"x\"\":3.0999999046325684,\"\"y\"\":1.2166996002197266},{\"\"x\"\":3.5999999046325684,\"\"y\"\":1.215477705001831},{\"\"x\"\":4.099999904632568,\"\"y\"\":1.0581893920898438},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.1747995615005493},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.0181127786636353},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.5344523191452026},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.2569526433944702},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.1912207305431366},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.15060538053512573}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.1038581025805785, 2.0032224204185245, 5.087602825989163, 0.13277988512492753],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":3.0498509407043457},{\"\"x\"\":0.6000000238418579,\"\"y\"\":2.805217742919922},{\"\"x\"\":1.100000023841858,\"\"y\"\":3.3415253162384033},{\"\"x\"\":1.600000023841858,\"\"y\"\":3.0549843311309814},{\"\"x\"\":2.0999999046325684,\"\"y\"\":3.250074863433838},{\"\"x\"\":2.5999999046325684,\"\"y\"\":3.0432586669921875},{\"\"x\"\":3.0999999046325684,\"\"y\"\":3.265852451324463},{\"\"x\"\":3.5999999046325684,\"\"y\"\":2.9475724697113037},{\"\"x\"\":4.099999904632568,\"\"y\"\":3.1929898262023926},{\"\"x\"\":4.599999904632568,\"\"y\"\":2.7460060119628906},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.6175861358642578},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.3006608486175537},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.3444803059101105},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.015537971630692482},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.5527358055114746}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\n,,,,,,,,,,,,,,,,,,,,,`);\ntestData.columns.add(DG.Column.fromList(DG.TYPE.BYTE_ARRAY, 'BinaryImage', Array.from(new Uint8Array(11))));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZyYW1lLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGF0YWZyYW1lLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUM1QixPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxLQUFtQixFQUFFLEdBQWM7SUFDdkUsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztJQUM1QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDMUYsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0lBQzVCLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3ZDLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNwQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztZQUM1QyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsa0JBQWtCLElBQUksQ0FBQyxDQUFDO1NBQ3pCO0tBQ0Y7SUFDRCxPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQW1CLEVBQUUsS0FBZ0I7SUFDakUsS0FBSyxhQUFMLEtBQUssY0FBTCxLQUFLLElBQUwsS0FBSyxHQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUM7SUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQy9DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekMsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzthQUNyQztpQkFBTTtnQkFDTCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN4QztTQUNGO0tBQ0Y7SUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3NCQStCdkIsQ0FBQyxDQUFDO0FBQ3hCLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCAqIGFzIHNoYTI1NiBmcm9tICdmYXN0LXNoYTI1Nic7XG4vKipcbiAqIEZvciBjb2x1bW5zIG9mIHN0cmluZyB0eXBlLiBDaGVja3Mgd2hldGhlciBjb2x1bW4gY29udGFpbnMgZW1wdHkgdmFsdWVzIGFuZCByZW1vdmVzIGNvcnJlc3BvbmRpbmcgcm93cyBpbiBjYXNlIHVzZXIgc2VsZWN0cyB0byByZW1vdmUuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRW1wdHlTdHJpbmdSb3dzKHRhYmxlOiBERy5EYXRhRnJhbWUsIGNvbDogREcuQ29sdW1uKTogbnVtYmVyW10ge1xuICBjb25zdCBjYXRzID0gY29sLmNhdGVnb3JpZXM7XG4gIGNvbnN0IGVtcHR5UmF3SW5kID0gY2F0cy5tYXAoKHZhbCwgaW5kKSA9PiAhdmFsID8gaW5kIDogbnVsbCkuZmlsdGVyKChpdCkgPT4gaXQgIT09IG51bGwpO1xuICBjb25zdCByYXdEYXRhID0gWy4uLmNvbC5nZXRSYXdEYXRhKCldO1xuICBjb25zdCBlbXB0eVJhd3NJbmRleGVzID0gW107XG4gIGxldCByZW1vdmVkUm93c0NvdW50ZXIgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLnJvd0NvdW50OyBpKyspIHtcbiAgICBpZiAoZW1wdHlSYXdJbmQuaW5jbHVkZXMocmF3RGF0YVtpXSkpIHtcbiAgICAgIHRhYmxlLnJvd3MucmVtb3ZlQXQoaSAtIHJlbW92ZWRSb3dzQ291bnRlcik7XG4gICAgICBlbXB0eVJhd3NJbmRleGVzLnB1c2goaSk7XG4gICAgICByZW1vdmVkUm93c0NvdW50ZXIgKz0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVtcHR5UmF3c0luZGV4ZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNoRGF0YUZyYW1lKHRhYmxlOiBERy5EYXRhRnJhbWUsIG5hbWVzPzogc3RyaW5nW10pOiBVaW50OEFycmF5IHtcbiAgbmFtZXMgPz89IHRhYmxlLmNvbHVtbnMubmFtZXMoKTtcbiAgY29uc3QgaGFzaGVyID0gbmV3IHNoYTI1Ni5IYXNoKCk7XG4gIGNvbnN0IG9yZGVyID0gdGFibGUuZ2V0U29ydGVkT3JkZXIobmFtZXMpO1xuICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRhYmxlLmNvbHVtbnMuYnlOYW1lKG5hbWUpO1xuICAgIGNvbnN0IGRhdGFBcnJheSA9IGNvbHVtbi5nZXRSYXdEYXRhKCk7XG4gICAgY29uc3QgaXNTdHJpbmcgPSBjb2x1bW4udHlwZSA9PSBERy5UWVBFLlNUUklORztcbiAgICBjb25zdCBjYXRzID0gY29sdW1uLmNhdGVnb3JpZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpc1N0cmluZykge1xuICAgICAgICBjb25zdCBkYXRhID0gY2F0c1tkYXRhQXJyYXlbb3JkZXJbaV1dXTtcbiAgICAgICAgaGFzaGVyLnVwZGF0ZShlbmNvZGVyLmVuY29kZShkYXRhKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkYXRhID0gZGF0YUFycmF5W29yZGVyW2ldXTtcbiAgICAgICAgaGFzaGVyLnVwZGF0ZShVaW50OEFycmF5LmZyb20oW2RhdGFdKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBoYXNoZXIuZGlnZXN0KCk7XG59XG5cbmV4cG9ydCBjb25zdCB0ZXN0RGF0YSA9IERHLkRhdGFGcmFtZS5mcm9tQ3N2KGBjb3VudHJpZXMsZmFzdGEsc21pbGVzLG1vbHJlZ25vLExPTixaaXAgQ29kZSxTdHJlZXQgQWRkcmVzcyBMaW5lIDEsSW1hZ2VVcmwsdXNlcl9pZCxlcnJvcl9tZXNzYWdlLHhyYXksZmxhZyxtYWduaXR1ZGUsQ1MtaWQscGRiX2lkLGFjY2VsX2EsdGltZV9vZmZzZXQsY2hhcnQsZml0LFF1ZXN0aW9ucyxlbXB0eV9udW1iZXIsZW1wdHlfc3RyaW5nXG5CZWxnaXVtLE1TTkZITkVIVk1RRllSTk5MS1RLR1ZGR1JRLENDKEMoPU8pT0NDQ2MxY2NjbmMxKWMyY2NjYyhjMilDKD1PKWMzY2NjY2MzLDE0ODAwMTQsMzYuMjc2NzI5NTgzNzQwMjM0LDk5NTA0MjMwMCwxNDAxNiBST1VURSAzMVcsaHR0cHM6Ly9kYXRhZ3Jvay5haS9pbWcvc2xpZGVzL2FjY2Vzcy1kYi1jb25uZWN0LnBuZyxpZCxFcnJvck1lc3NhZ2UsXCJDT01QTkQgXG5BVE9NIFxuRU5EXCIsZmxhZywxLDEsMVFCUywxLDEuMjMsPGNoYXJ0PjwvY2hhcnQ+LFwie1wiXCJzZXJpZXNcIlwiOlt7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdEZ1bmN0aW9uXCJcIjpcIlwic2lnbW9pZFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMi40OTczNjAzNDA2NDQ4NzIsIDEuNzA1ODY5NDk4NjY4Njg2NCwgNS4yNzgwNTI2NzgxOTUxMzUsIDAuMTYwMDAzMjA4ODkwMjgzODNdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjIuMzc0NDk5Nzk3ODIxMDQ1fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6Mi42MjQyNDczMTI1NDU3NzY0fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjoyLjM2NzI2NzYwODY0MjU3OH0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6Mi42NzIzMTQ4ODIyNzg0NDI0fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Mi42NTM3MzQ0NDU1NzE4OTk0fSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Mi4zNjUxNjcxNDA5NjA2OTM0fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Mi41NjU0Mjg0OTU0MDcxMDQ1fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Mi40MTYwOTU5NzIwNjExNTcyfSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjI4NjcyNjcxMzE4MDU0Mn0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi41MTAwMDQyODE5OTc2ODA3fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjY2NzY5ODUwMjU0MDU4ODR9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNjgwMTM2NTAxNzg5MDkzfSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjMzOTE1NDM5MjQ4MDg1MDJ9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMDkwMzg5ODMyODU0MjcwOTR9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTk4MDI3NzU5NzkwNDIwNTN9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzcuNTI1MjM1ODU1NTA4MTc5LCAxLjMxODY5MTE4NzY4MDk5ODQsIDUuMzM1NjcyNjA4NTY0Mjk0LCAwLjc4NjA3NDMzNDM5NTgwOThdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjcuOTg4MDcwNDg3OTc2MDc0fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6Ny4wMTg0NTMxMjExODUzMDN9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjguMTE1Mjc5MTk3NjkyODcxfSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo3LjQ4NjY1ODA5NjMxMzQ3N30se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjcuMzk2NDM4MTIxNzk1NjU0fSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Ny40NzcwNTIyMTE3NjE0NzV9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo2LjkxMzA5NTQ3NDI0MzE2NH0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjguMDEzODU0OTgwNDY4NzV9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjYuOTg1OTAwNDAyMDY5MDkyfSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo2Ljk3MDMzNTk2MDM4ODE4NH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NS40NDg4MTcyNTMxMTI3OTN9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuNTUzNDgxODE3MjQ1NDgzNH0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS44OTM5NDc5NTg5NDYyMjh9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNjM0MDA0MjM1MjY3NjM5Mn0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC44NDAzODc0MDM5NjQ5OTYzfV19XSxcIlwiY2hhcnRPcHRpb25zXCJcIjp7XCJcInhBeGlzTmFtZVwiXCI6XCJcIkNvbmMuXCJcIixcIlwieUF4aXNOYW1lXCJcIjpcIlwiQWN0aXZpdHlcIlwiLFwiXCJ0aXRsZVwiXCI6XCJcIkRvc2UtUmVzcG9uc2UgY3VydmVzXCJcIn19XCIsdGV4dCwxMDAsYWJjXG5CdXJ1bmRpLE1EWUtFVExMTVBLVERGUE1SR0dMUE5LRVBRSVFFS1csQ09jMWNjYzJjYyhjY2MyYzEpQyhDKUMoPU8pT2MzY2NjKEMpY2MzT0MsMTQ4MDAxNSwzNi4yNzY3Mjk1ODM3NDAyMzQsOTk1MDczNDQ0LDgwIFNUQVRFIEhJR0hXQVkgMzEwLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsMiwyLDFaUDgsMiwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzQuNDMxNDYwNzUzMTAzMzk4LCAyLjE2OTE0OTg3OTkyNDY3NDUsIDUuMjY2NDQ1NTk3MTAyNzc0LCAwLjc4MjU3NjI4MjcwMTc5MjZdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjQuNzUxMDgzODUwODYwNTk2fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6NC4yMDMwMDAwNjg2NjQ1NTF9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjQuNDE1ODU4NzQ1NTc0OTUxfSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo0LjY4NDE0MzA2NjQwNjI1fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC4xOTg0MDA5NzQyNzM2ODJ9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo0LjE3OTIyMjEwNjkzMzU5NH0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjQuNjM4NDczOTg3NTc5MzQ2fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC43MDg1NTMzMTQyMDg5ODR9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjQuMjkxNTg5MjYwMTAxMzE4fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo0LjAzODA4MjU5OTYzOTg5M30se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My40MzQ5OTM5ODIzMTUwNjM1fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjIxOTQ3MDg1ODU3MzkxMzZ9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMTkyMDgzMTIwMzQ2MDY5M30se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC41MzUyNjM1OTc5NjUyNDA1fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjMzNDY5MjAzMTE0NTA5NTh9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzIuMzM5NDU4MDE3OTcwMTI2LCAtMS4wNzM0MTg0MzEwMTcxMTc4LCA0Ljc0NjMzMjk1MDU1MDkzNCwgMC4yNDgyNDE2ODU3NTk1NjU4XSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjowLjIxMzkzMzc2NTg4ODIxNDF9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjowLjQyNjk1NjIwNjU2MDEzNDl9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjAuMjQ0MTU3MzI5MjAxNjk4M30se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6MC4xNDY2MzU5NjQ1MTI4MjV9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjA4ODE4NDYyNDkxMDM1NDYxfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC4yNTYwNjU2NjY2NzU1Njc2fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC40MjQzNDA0NTY3MjQxNjY4N30se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuMzcxMTEyMzE2ODQ2ODQ3NTN9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNTU4MTczNzE2MDY4MjY3OH0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4xODM1OTAwNTQ1MTIwMjR9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuNTYyOTg0MzQ3MzQzNDQ0OH0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi4zMjExMjg4NDUyMTQ4NDM4fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjIyOTk2MTYzMzY4MjI1MX0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi4yNTYwMjI2OTE3MjY2ODQ2fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjIxNDIzOTgzNTczOTEzNTd9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcbkNhbWVyb29uLE1JRVZGTEZHSVZMR0xJUElUTEFHTEZWVEFZTFFZUlJHRFFMREwsQ09jMWNjYzJjYyhjY2MyYzEpQyhDKUMoPU8pT0NDQ2MzY2NjbmMzLDE0ODAwMTYsMzYuMjYwOTU5NjI1MjQ0MTQsOTk1MTUzNTk2LDMwLTU2IFdISVRFU1RPTkUgRVhQWSxodHRwczovL2RhdGFncm9rLmFpL2ltZy9zbGlkZXMvYWNjZXNzLWRiLWNvbm5lY3QucG5nLGlkLEVycm9yTWVzc2FnZSxcIkNPTVBORCBcbkFUT00gXG5FTkRcIixmbGFnLDMsMywyQkRKLDMsMS4yMyw8Y2hhcnQ+PC9jaGFydD4sXCJ7XCJcInNlcmllc1wiXCI6W3tcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0RnVuY3Rpb25cIlwiOlwiXCJzaWdtb2lkXCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOls0LjY3NjA2NTI1Nzg2NDIzMjUsIDAuOTA0Njk1NjMyMDc1NjcwMywgNS42NTE0MDg5NzE4NTY3MzgsIDAuMDc3Mzg4NDYwMTIxODQxODVdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjQuMzI0MjU1OTQzMjk4MzR9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjo0LjY2ODQ0MjI0OTI5ODA5Nn0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NC4zNzk3ODUwNjA4ODI1Njh9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjUuMDM0NTEzOTUwMzQ3OX0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjQuODc4NjUzNTI2MzA2MTUyfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC4zNDUxMzEzOTcyNDczMTQ1fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC4zMzY5OTIyNjM3OTM5NDV9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1LjAzNzQzMDI4NjQwNzQ3MX0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NS4wMDkyNjkyMzc1MTgzMTA1fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo0LjE1MTkwMjY3NTYyODY2Mn0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My40MDY2OTUxMjc0ODcxODI2fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjM3MzI3NTk5NTI1NDUxNjZ9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuNjczNzI4MTA4NDA2MDY3fSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjQ4NTc0NzkwMzU4NTQzMzk2fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjI3ODMwNTIzMjUyNDg3MTh9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzIuOTM4Mzk1ODYzMDEwMTExLCAtMS40NjU4NDgwNjYxMzkyMTE3LCA1LjQ2MjcwMjc1MTk5NjU4NCwgMC4zNDczMTM5MDIzNjE1MDM5XSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjowLjQ5NDE3MTA4Mjk3MzQ4MDJ9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjowLjE1MzIzOTc0MTkyMTQyNDg3fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjQ2MzczNDMyODc0Njc5NTY1fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjMzNzA0MzEzNjM1ODI2MTF9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjUxNzkwMzAyOTkxODY3MDd9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjI3ODk5NzY1OTY4MzIyNzU0fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC4yMjA3NTA2NDQ4MDMwNDcxOH0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuNTc4OTkxODg5OTUzNjEzM30se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4yMTE2OTkxMTMyNDk3Nzg3NX0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4yNzg1NzY0NjM0NjA5MjIyNH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4wOTA2MzMyNzMxMjQ2OTQ4fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjg1MjAzMDAzODgzMzYxODJ9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuNzE3NzA1OTY1MDQyMTE0M30se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi44NjgwOTE4MjE2NzA1MzIyfSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjI0MTMwNzczNTQ0MzExNTJ9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcbkNhbmFkYSxNTUVMVkxLVElJR1BJVlZHVlZMUklWREtXTE5LREssQ0MoQyg9TylOQ0NTKWMxY2NjYyhjMSlDKD1PKWMyY2NjY2MyLDE0ODAwMTcsMzYuMjYwOTU5NjI1MjQ0MTQsOTk1MTUsMzAtNTYgV0hJVEVTVE9ORSBFWFBZLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsNCw0LDFJQU4sNCwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzAuODU5NzM5MDk3NTQzMDAwOCwgMS4wOTU3NjI1NzMyNDgxOTQ2LCA1LjI2MDUzNzA2Nzk4Nzk1OCwgMC4wNzk3NDE4Nzk5ODE3NzczNl0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6MC44MTkwMTUyNjQ1MTExMDg0fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6MC44NDIxNjg5ODY3OTczMzI4fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjg3NDA5MjIyMTI2MDA3MDh9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjAuODkyNDI3NTA0MDYyNjUyNn0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuODI0OTA2NzY2NDE0NjQyM30se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuOTMyNzY2OTE0MzY3Njc1OH0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuODUyMjk3NDI1MjcwMDgwNn0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuODE3NDQ5MjcxNjc4OTI0Nn0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC44Mzk0NjQ3MjQwNjM4NzMzfSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjcxMzkzODc3MjY3ODM3NTJ9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNTU2MTE2NzU5Nzc3MDY5MX0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4zMjc2MjI2ODE4NTYxNTU0fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjEyNDc5NDc0Mzk1NTEzNTM1fSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjEzMDA2Nzk3NDMyODk5NDc1fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjA1OTcwMjA3OTc0MzE0Njg5Nn1dfSx7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbNS43NjA5MzAyMTk1ODI1NDYsIDEuNjU5MTc5MzI5MzgzMzAxMywgNC42NjcxNTU5Mjk3MjA4NTEsIDAuNzg1ODEwOTU0NDEyMTY1Ml0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6Ni4xNTY5OTMzODkxMjk2Mzl9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjo1LjIzNjcwMTk2NTMzMjAzMX0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6Ni4wMTA1NjA1MTI1NDI3MjV9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjUuNDk1NTEyOTYyMzQxMzA5fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Ni4wODc3NzA0NjIwMzYxMzN9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1Ljc5OTg2NTcyMjY1NjI1fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS41OTc1NDY1Nzc0NTM2MTN9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1LjUyMDkwMjE1NjgyOTgzNH0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NS4zNjA2NTQzNTQwOTU0NTl9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjMuNTUzOTc0NjI4NDQ4NDg2M30se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS41NzcyMzYyOTQ3NDYzOTl9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMDAwMTI2NDgxMDU2MjEzNH0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC45MzA1Nzk3ODE1MzIyODc2fSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjYwMzM2Mzg3MTU3NDQwMTl9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNDIwMzY4NTUyMjA3OTQ2OH1dfV0sXCJcImNoYXJ0T3B0aW9uc1wiXCI6e1wiXCJ4QXhpc05hbWVcIlwiOlwiXCJDb25jLlwiXCIsXCJcInlBeGlzTmFtZVwiXCI6XCJcIkFjdGl2aXR5XCJcIixcIlwidGl0bGVcIlwiOlwiXCJEb3NlLVJlc3BvbnNlIGN1cnZlc1wiXCJ9fVwiLHRleHQsLFxuQ29sb21iaWEsTURSVERFVlNOSFRIREtQVExUV0ZFRUlGRUVZSFNQRkhOLEZDKEYpKEYpYzFjY2MoT0MyQ0NOQ0MyKWNjMSwxNDgwMDI5LDM2LjMzMDk0NDA2MTI3OTMsOTk1MTUyMDUwLDEgQ09VUlQgSE9VU0UgU1FVQVJFLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsNSw1LDRVSjEsNSwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzYuNDk5NTA4ODMxNDE1MzY1NSwgMi40MjcwMzUxMDA0NTM5OTE0LCA1LjE3ODY1OTUzNTM0ODU3OSwgMC42MjU2NTMzNDYyNDE1NzddLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjYuNDk2MjMxNTU1OTM4NzIxfSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6Ni40MjU0MzM2MzU3MTE2N30se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6Ny4wNDAwNjM4NTgwMzIyMjd9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjYuMTExNTQwMzE3NTM1NH0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjYuNjgwNzI4NDM1NTE2MzU3fSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Ni40MDY3NzQ1MjA4NzQwMjN9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo2LjYxMTI2OTQ3NDAyOTU0MX0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuODg5MDk0MzUyNzIyMTY4fSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo2Ljc1MzQ0NzA1NTgxNjY1fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo2LjM2MTQzNTg5MDE5Nzc1NH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NC4xNjY2OTc1MDIxMzYyMzA1fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjE3MjExODkwMjIwNjQyMX0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC44MDEwNDg5OTQwNjQzMzF9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNDY0MDAyMTAyNjEzNDQ5MX0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4wMDEwMzU3NjY3OTI0ODM2Mjc4fV19LHtcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOlsxLjQ3MzQzODEzNDc0NDY0MDEsIDEuMTY0OTgwNTE4ODA3NDE5NiwgNC44Mjk1ODYwODg2NjQyMSwgMC4wOTUwMDU0NTQ5NjcxMDAwN10sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6MS41Mjc5MDk2MzY0OTc0OTc2fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6MS4zNTU5OTc0NDMxOTkxNTc3fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjoxLjUyNDYzNzgxODMzNjQ4Njh9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjEuNTU2NzY1Nzk0NzU0MDI4M30se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjEuNDExNDI0MDQwNzk0MzcyNn0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjEuNDA0NTAxMDgwNTEzMDAwNX0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjEuNDc2OTgyOTUxMTY0MjQ1Nn0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjEuNDg3NTUwMDIwMjE3ODk1NX0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4yOTkxOTg3NDY2ODEyMTM0fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjkyMjk2MTQxMzg2MDMyMX0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC42NTIwMDQ0ODAzNjE5Mzg1fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjE1MzUwOTc4MDc2NDU3OTc3fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjEwNzg5MDMwNzkwMzI4OTh9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTcyNzY0NDk1MDE1MTQ0MzV9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTQwNjY2MDgyNTAxNDExNDR9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcbkNvc3RhIFJpY2EsTUtTVEtFRUlRVElLVExMS0RTUlRBS1lIS1JMUUlWTCxDQyhDKUNjMWNjYyhjYzEpQyhDKUMoPU8pTjJDQ0NDMkMoPU8pT0NDQ2MzY2NjY2MzLDE0ODAwMTgsMzYuMzMwOTQ0MDYxMjc5Myw5OTUwODQyMTgsNDA0MSBTT1VUSFdFU1RFUk4gQkxWRCxodHRwczovL2RhdGFncm9rLmFpL2ltZy9zbGlkZXMvYWNjZXNzLWRiLWNvbm5lY3QucG5nLGlkLEVycm9yTWVzc2FnZSxcIkNPTVBORCBcbkFUT00gXG5FTkRcIixmbGFnLDYsNiwyQlBXLDYsMS4yMyw8Y2hhcnQ+PC9jaGFydD4sXCJ7XCJcInNlcmllc1wiXCI6W3tcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0RnVuY3Rpb25cIlwiOlwiXCJzaWdtb2lkXCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOlsyLjQ4MzM2NDE4NDMzMTEyMjcsIC0xLjg5NDU5Nzg3NDIwOTAwNjIsIDQuNjcxMTI3NzA4MDkyNTY4LCAwLjI0MTU5ODYxMzExODE1MTUzXSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjowLjA5Njk1MjQxNjAwMjc1MDR9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjowLjAyODQ4MzA0MDYzMDgxNzQxM30se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6MC4yMjA4NzE3NjE0NDEyMzA3N30se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6MC4wMDY4OTE1NTQ2ODcxNzIxNzQ1fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC40MzA1ODc5NzcxNzA5NDQyfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC40NDc3NDExNTA4NTYwMTgwN30se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuNDUzNDYzMTk2NzU0NDU1NTd9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjIzNzA1OTMxMDA3ODYyMDl9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNDY1Nzk1Mzk3NzU4NDgzOX0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4xNTUyMDA3MTk4MzMzNzR9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuMjI5NDA3MDcyMDY3MjYwN30se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi40MzExNTMwNTkwMDU3MzczfSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjMzODQ2MTE2MDY1OTc5fSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjYwODIwMTAyNjkxNjUwNH0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi44MTM2MTQzNjg0Mzg3MjA3fV19LHtcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOls1LjIyNDU3MzUyMTY0MjAzMywgMS40NDU0MDMzOTI0MTk4NTI4LCA1LjYwMTQxOTc3NDYwNzY1MzUsIDAuMjgyMzIxNjA1NDE5NzU3N10sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6NC45NTAyNzQ5NDQzMDU0Mn0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjUuMTc1NDY3OTY3OTg3MDYwNX0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NS4yNzY3NTI5NDg3NjA5ODZ9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjUuNTg5Mjk0OTEwNDMwOTA4fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS42MTY5OTQ4NTc3ODgwODZ9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1LjEyMDgxMzg0NjU4ODEzNX0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuMzQwNzY2OTA2NzM4MjgxfSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC44NzY0NzEwNDI2MzMwNTd9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjQuOTQ5OTkzNjEwMzgyMDh9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjUuMTYyNTY0NzU0NDg2MDg0fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo0LjM5OTU1NzU5MDQ4NDYxOX0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi43OTc3OTY5NjQ2NDUzODU3fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjAyMjk4NzI0NjUxMzM2Njd9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNDgyNzU2MDE4NjM4NjEwODR9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTA0MDg5MzE5NzA1OTYzMTN9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcbkN1YmEsTUhBSUxSWUZJUlJMRllISUZZS0lZU0xJU0tLSFFTTFBTRFZSUUYsQ09jMWNjYzJjKGMxKWMoQ0MoPU8pTjNDQ0NDM0MoPU8pT2M0Y2NjKEMpY2M0T0MpYyhDKW4yQyg9TyljNWNjYyhDbCljYzUsMTQ4MDAxOSwzNi4zMzExNTc2ODQzMjYxNyw5OTUwODE5MjgsMTIyNyBVUyBISUdIV0FZIDExLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsNyw3LDFRQlMsNywxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzMuMzIwODM4Njc5NzEzOTI1LCAtMS4yNDIxNjE5OTg3MzE2NzI4LCA0LjgzMTMyNTQyNTIyNTI1NiwgMC4zMjM2MDExMDk4NDAzMDcyXSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjowLjM3Mjc0NzAzMzgzNDQ1NzR9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjowLjEyMzY1MDE0MTA2MDM1MjMzfSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjQ4NDIyNDY3NzA4NTg3NjQ2fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjIyNjQ0NjUwOTM2MTI2NzF9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjE2ODIxNzk0MjExODY0NDcxfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC4zODc5MDE0NTUxNjM5NTU3fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC41NDcwMjQ0ODg0NDkwOTY3fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC4zNDE5MDUzNTU0NTM0OTEyfSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjc2NTUxMjA0OTE5ODE1MDZ9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMjM0NjUxNjg0NzYxMDQ3NH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi40NTMzMzY3MTU2OTgyNDJ9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuOTU2NTQ5MTY3NjMzMDU2Nn0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My4zMzUyOTk0OTE4ODIzMjR9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjMuMjQwMjkwODgwMjAzMjQ3fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjExMDcyMTgyNjU1MzM0NDd9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzMuNjQwMTg1MzUyMTUxMTA5NCwgMS4yNjIxMTU4ODg3NTAxMywgNS4zOTkwMjgwNzQ0MDI3NDQsIDAuNTA4OTU4MDgzMDA2ODA5MV0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6My44NTg1NTk4NDY4NzgwNTE4fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6My42MDc3MjA2MTM0Nzk2MTQzfSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjozLjg1NTI1MjI2NTkzMDE3Nn0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6My42MTkwMzkyOTcxMDM4ODJ9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjgzOTM4ODM3MDUxMzkxNn0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjMuMzM1MjgzMDQxMDAwMzY2fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6My41NzExNDE0ODEzOTk1MzZ9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjQxNTUwNDY5Mzk4NDk4NTR9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjMuNzMxNjY0NjU3NTkyNzczNH0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My4wNjgwMTU1NzU0MDg5MzU1fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjg5MTA2NjU1MTIwODQ5Nn0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS42MDIyNzUzNzE1NTE1MTM3fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjc2NTI1NzY1NjU3NDI0OTN9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNjg3NTMyNjAzNzQwNjkyMX0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC41ODI4ODcxNzI2OTg5NzQ2fV19XSxcIlwiY2hhcnRPcHRpb25zXCJcIjp7XCJcInhBeGlzTmFtZVwiXCI6XCJcIkNvbmMuXCJcIixcIlwieUF4aXNOYW1lXCJcIjpcIlwiQWN0aXZpdHlcIlwiLFwiXCJ0aXRsZVwiXCI6XCJcIkRvc2UtUmVzcG9uc2UgY3VydmVzXCJcIn19XCIsdGV4dCwsXG5JdGFseSxNU05GSE5FSFZNUUZZUk5OTEtUS0dWRkdSUSxDQyhDKUNjMWNjYyhjYzEpQyhDKUMoPU8pTjJDQ0NDMkMoPU8pT0NDT1tOK10oPU8pW08tXSwxNDgwMDIwLDM2LjMzMTE1NzY4NDMyNjE3LDk5NTAyLFwiMTY4LTQ2IDkxU1QgQVZFLiwgMk5EIEZMUlwiLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsOCw4LDFaUDgsOCwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzIuMjkzNTkyMTA1OTIzODA5LCAxLjM3ODE1ODY1NDkxNDE4MzUsIDUuMTAyNTg5ODAzODY3NjYwNSwgMC4wMzQ5Mzg1MTI0NTI5MTI5MV0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6Mi4xMjg3MjgzODk3Mzk5OTAyfSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6Mi4yNjc5NzIyMzA5MTEyNTV9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjIuMzk4NDQyNTA2NzkwMTYxfSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjoyLjUxMzA2MjIzODY5MzIzNzN9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoyLjMyNTUxMTY5Mzk1NDQ2Nzh9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoyLjEyNzM0MDc5MzYwOTYxOX0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjIuNDcyNTk3ODM3NDQ4MTJ9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoyLjEzMTE4MTQ3ODUwMDM2Nn0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi4wOTA0MjE0MzgyMTcxNjN9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuMDIyOTkxNjU3MjU3MDh9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMTEwNTA1OTM4NTI5OTY4M30se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC40NDk0NDg1ODU1MTAyNTM5fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjEzNzU2MzU4NjIzNTA0NjR9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMDM2MzUxMTIxOTYyMDcwNDY1fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjE2MTk3NzExMjI5MzI0MzR9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzUuOTUzMTI1NDk5NDM5ODc5LCAxLjI1Mjg2MjAyNTUzMDY1MjgsIDUuMTg3NjM3NDQwMTQ5ODAyLCAwLjMxMTAzNDg3NTMyNjA4ODZdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjUuNjU4NTI4MzI3OTQxODk0NX0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjUuOTExMTUyMzYyODIzNDg2fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo1LjkyNDkyMDA4MjA5MjI4NX0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NS44NDY5NDM4NTUyODU2NDQ1fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS45Mjk0NzI5MjMyNzg4MDl9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo2LjE5MDAzNzcyNzM1NTk1N30se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjYuMjM2MTc5ODI4NjQzNzk5fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Ni4xNDEwMTkzNDQzMjk4MzR9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjUuMjk1MjEwODM4MzE3ODcxfSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo1LjI2NTgwMTkwNjU4NTY5M30se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My4zNzIyODUxMjc2Mzk3NzA1fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjgyOTkyMjY3NjA4NjQyNTh9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMzI2OTA5MDA1NjQxOTM3MjZ9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNjI3NDU0MzQwNDU3OTE2M30se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC44NDQxODU3MDk5NTMzMDgxfV19XSxcIlwiY2hhcnRPcHRpb25zXCJcIjp7XCJcInhBeGlzTmFtZVwiXCI6XCJcIkNvbmMuXCJcIixcIlwieUF4aXNOYW1lXCJcIjpcIlwiQWN0aXZpdHlcIlwiLFwiXCJ0aXRsZVwiXCI6XCJcIkRvc2UtUmVzcG9uc2UgY3VydmVzXCJcIn19XCIsdGV4dCwsXG5Sd2FuZGEsTVBOU0VQQVNMTEVMRk5TSUFUUUdFTFZSU0xLQUdOQVNLLENDKEMpQ2MxY2NjKGNjMSlDKEMpQyg9TylOMkNDQ0MyQyg9TylPQ0NPLDE0ODAwMjEsMzYuMzMxMzcxMzA3MzczMDUsOTk1MDM3MjQ3LFwiMTY4LTQ2IDkxU1QgQVZFLiwgMk5EIEZMUlwiLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsOSw5LDJCREosOSwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzMuODIwOTk3MjIwMjY1NDQ3NCwgMS4zNzc5MjE2NzE2NDQ4NTA2LCA1LjI5OTg4MjIyODQzOTY4NiwgMC4wNjA0MDY0NTUxOTA2OTYwOF0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6My43ODIxMTA5Mjk0ODkxMzU3fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6My41NDI0MzMwMjM0NTI3NTl9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjMuNzAwODY3NDE0NDc0NDg3M30se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6My43MTczMDE2MDcxMzE5NTh9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo0LjAyNDQ1MjIwOTQ3MjY1Nn0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjQuMDEzODk5MzI2MzI0NDYzfSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6My45NDUwOTQzNDcwMDAxMjJ9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjg2NjYyMTk3MTEzMDM3MX0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My43NDYxNjI2NTI5NjkzNjA0fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjM0NTQ3NDAwNDc0NTQ4MzR9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuNjE5NDQzMTc4MTc2ODh9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuOTk5NDA1MDI2NDM1ODUyfSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjQ2MjU5NzkzNjM5MTgzMDQ0fSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjA1NDEzNDYxMTA0MDM1Mzc3NX0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4wNTcxMTE4NzQyMjI3NTU0M31dfSx7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbNS42MzE4MDc5NjU3NzI2MDM1LCAxLjg0OTU0OTM3NzAwMDA1OTUsIDUuMzkxNzkzMzEyNDcxMTE2LCAwLjE3MDYwNzA3NTg3MzQ4NDQyXSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjo1LjQ1ODA3OTgxNDkxMDg4OX0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjUuNTU0NDI3MTQ2OTExNjIxfSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo1Ljc5OTk4MzAyNDU5NzE2OH0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NS4zNjQxNDAwMzM3MjE5MjR9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1Ljg2NDQ4NTc0MDY2MTYyMX0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuNDUwOTgwNjYzMjk5NTYwNX0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuNzAyNTc0NzI5OTE5NDM0fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS43MzE0NTM0MTg3MzE2ODk1fSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo1LjUxMjM0NDM2MDM1MTU2MjV9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjUuNzI0Mzk1NzUxOTUzMTI1fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo0LjM1NDUwNjk2OTQ1MTkwNH0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS43MzA3NjY2NTQwMTQ1ODc0fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjYzMDU5MzY1NzQ5MzU5MTN9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMDM1MTgzNDM3MTY4NTk4MTc1fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjc1NzUxNjkyMDU2NjU1ODh9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcblN3aXR6ZXJsYW5kLElSVlZHUllMSUVWV0tBQUdNRE1ES1ZMRkxXU1NERUksQ04xQ0NDKENDMSlPYzJjY2MoY2MyKUMoRikoRilGLDE0ODAwMjgsMzYuMzMxMzcxMzA3MzczMDUsOTk1MDQsOTItMTEgMTc5VEggUExBQ0UsaHR0cHM6Ly9kYXRhZ3Jvay5haS9pbWcvc2xpZGVzL2FjY2Vzcy1kYi1jb25uZWN0LnBuZyxpZCxFcnJvck1lc3NhZ2UsXCJDT01QTkQgXG5BVE9NIFxuRU5EXCIsZmxhZyw5LDEwLDFJQU4sMTAsMS4yMyw8Y2hhcnQ+PC9jaGFydD4sXCJ7XCJcInNlcmllc1wiXCI6W3tcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0RnVuY3Rpb25cIlwiOlwiXCJzaWdtb2lkXCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOlsxLjExOTAyNTU4NjUwOTc0NzEsIDIuMzE2Mzg5NTE2MTU0NDQzNywgNS40OTY4ODY2MTgyMjc5MTk1LCAwLjIwMzUyMDQwNDcyODkwNTJdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjEuMTA1NzY4MzIyOTQ0NjQxMX0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjEuMTAxOTY5NzE4OTMzMTA1NX0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6MS4wODE4NjA3ODA3MTU5NDI0fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjoxLjA2Mjk5NzgxNzk5MzE2NH0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjEuMDQ2NDQ3NTE1NDg3NjcxfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS4xMjE3MjQ5NjMxODgxNzE0fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS4yMTY2OTk2MDAyMTk3MjY2fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS4yMTU0Nzc3MDUwMDE4MzF9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMDU4MTg5MzkyMDg5ODQzOH0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4xNzQ3OTk1NjE1MDA1NDkzfSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjAxODExMjc3ODY2MzYzNTN9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNTM0NDUyMzE5MTQ1MjAyNn0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4yNTY5NTI2NDMzOTQ0NzAyfSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjE5MTIyMDczMDU0MzEzNjZ9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTUwNjA1MzgwNTM1MTI1NzN9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzMuMTAzODU4MTAyNTgwNTc4NSwgMi4wMDMyMjI0MjA0MTg1MjQ1LCA1LjA4NzYwMjgyNTk4OTE2MywgMC4xMzI3Nzk4ODUxMjQ5Mjc1M10sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6My4wNDk4NTA5NDA3MDQzNDU3fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6Mi44MDUyMTc3NDI5MTk5MjJ9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjMuMzQxNTI1MzE2MjM4NDAzM30se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6My4wNTQ5ODQzMzExMzA5ODE0fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6My4yNTAwNzQ4NjM0MzM4Mzh9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjA0MzI1ODY2Njk5MjE4NzV9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjI2NTg1MjQ1MTMyNDQ2M30se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjIuOTQ3NTcyNDY5NzExMzAzN30se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My4xOTI5ODk4MjYyMDIzOTI2fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjc0NjAwNjAxMTk2Mjg5MDZ9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuNjE3NTg2MTM1ODY0MjU3OH0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4zMDA2NjA4NDg2MTc1NTM3fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjM0NDQ4MDMwNTkxMDExMDV9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMDE1NTM3OTcxNjMwNjkyNDgyfSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjU1MjczNTgwNTUxMTQ3NDZ9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcbiwsLCwsLCwsLCwsLCwsLCwsLCwsLGApO1xudGVzdERhdGEuY29sdW1ucy5hZGQoREcuQ29sdW1uLmZyb21MaXN0KERHLlRZUEUuQllURV9BUlJBWSwgJ0JpbmFyeUltYWdlJywgQXJyYXkuZnJvbShuZXcgVWludDhBcnJheSgxMSkpKSk7XG4iXX0=","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nimport { testData } from './dataframe-utils';\nconst STANDART_TIMEOUT = 30000;\nconst BENCHMARK_TIMEOUT = 10800000;\nconst stdLog = console.log.bind(console);\nconst stdInfo = console.info.bind(console);\nconst stdWarn = console.warn.bind(console);\nconst stdError = console.error.bind(console);\nexport const tests = {};\nconst autoTestsCatName = 'Auto Tests';\nconst demoCatName = 'Demo';\nconst detectorsCatName = 'Detectors';\nconst coreCatName = 'Core';\nconst wasRegistered = {};\nexport let currentCategory;\nexport var assure;\n(function (assure) {\n function notNull(value, name) {\n if (value == null)\n throw new Error(`${name == null ? 'Value' : name} not defined`);\n }\n assure.notNull = notNull;\n})(assure || (assure = {}));\nexport class TestContext {\n constructor(catchUnhandled, report) {\n this.catchUnhandled = true;\n this.report = false;\n if (catchUnhandled !== undefined)\n this.catchUnhandled = catchUnhandled;\n if (report !== undefined)\n this.report = report;\n }\n ;\n}\nexport class Test {\n constructor(category, name, test, options) {\n var _a;\n this.category = category;\n this.name = name;\n options !== null && options !== void 0 ? options : (options = {});\n (_a = options.timeout) !== null && _a !== void 0 ? _a : (options.timeout = STANDART_TIMEOUT);\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, reason = `timeout`) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n const sub = event.subscribe((args) => {\n try {\n handler(args);\n resolve('OK');\n }\n catch (e) {\n reject(e);\n }\n // Do not clearTimeout or event sub if handler fails\n sub.unsubscribe();\n clearTimeout(timeout);\n });\n const timeout = setTimeout(() => {\n sub.unsubscribe();\n // eslint-disable-next-line prefer-promise-reject-errors\n reject(reason);\n }, ms);\n trigger();\n });\n });\n}\nexport function test(name, test, options) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n if (tests[currentCategory].tests == undefined)\n tests[currentCategory].tests = [];\n tests[currentCategory].tests.push(new Test(currentCategory, name, test, options));\n}\n/* Tests two objects for equality, throws an exception if they are not equal. */\nexport function expect(actual, expected = true, error) {\n if (error)\n error = `${error}, `;\n else\n error = '';\n if (actual !== expected)\n throw new Error(`${error}Expected \"${expected}\", got \"${actual}\"`);\n}\nexport function expectFloat(actual, expected, tolerance = 0.001, error) {\n if ((actual === Number.POSITIVE_INFINITY && expected === Number.POSITIVE_INFINITY) ||\n (actual === Number.NEGATIVE_INFINITY && expected === Number.NEGATIVE_INFINITY) ||\n (actual === Number.NaN && expected === Number.NaN) || (isNaN(actual) && isNaN(expected)))\n return;\n const areEqual = Math.abs(actual - expected) < tolerance;\n expect(areEqual, true, `${error !== null && error !== void 0 ? error : ''} (tolerance = ${tolerance})`);\n if (!areEqual)\n throw new Error(`Expected ${expected}, got ${actual} (tolerance = ${tolerance})`);\n}\nexport function expectTable(actual, expected, error) {\n const expectedRowCount = expected.rowCount;\n const actualRowCount = actual.rowCount;\n expect(actualRowCount, expectedRowCount, `${error !== null && error !== void 0 ? error : ''}, row count`);\n for (const column of expected.columns) {\n const actualColumn = actual.columns.byName(column.name);\n if (actualColumn == null)\n throw new Error(`Column ${column.name} not found`);\n if (actualColumn.type != column.type)\n throw new Error(`Column ${column.name} type expected ${column.type} got ${actualColumn.type}`);\n for (let i = 0; i < expectedRowCount; i++) {\n const value = column.get(i);\n const actualValue = actualColumn.get(i);\n if (column.type == DG.TYPE.FLOAT)\n expectFloat(actualValue, value, 0.0001, error);\n else if (column.type == DG.TYPE.DATE_TIME)\n expect(actualValue.isSame(value), true, error);\n else\n expect(actualValue, value, error);\n }\n }\n}\nexport function expectObject(actual, expected) {\n for (const [expectedKey, expectedValue] of Object.entries(expected)) {\n if (!actual.hasOwnProperty(expectedKey))\n throw new Error(`Expected property \"${expectedKey}\" not found`);\n const actualValue = actual[expectedKey];\n if (actualValue instanceof Array && expectedValue instanceof Array)\n expectArray(actualValue, expectedValue);\n else if (actualValue instanceof Object && expectedValue instanceof Object)\n expectObject(actualValue, expectedValue);\n else if (Number.isFinite(actualValue) && Number.isFinite(expectedValue))\n expectFloat(actualValue, expectedValue);\n else if (actualValue != expectedValue)\n throw new Error(`Expected (${expectedValue}) for key '${expectedKey}', got (${actualValue})`);\n }\n}\nexport function expectArray(actual, expected) {\n const actualLength = actual.length;\n const expectedLength = expected.length;\n if (actualLength != expectedLength) {\n throw new Error(`Arrays are of different length: actual array length is ${actualLength} ` +\n `and expected array length is ${expectedLength}`);\n }\n for (let i = 0; i < actualLength; i++) {\n if (actual[i] instanceof Array && expected[i] instanceof Array)\n expectArray(actual[i], expected[i]);\n else if (actual[i] instanceof Object && expected[i] instanceof Object)\n expectObject(actual[i], expected[i]);\n else if (actual[i] != expected[i])\n throw new Error(`Expected ${expected[i]} at position ${i}, got ${actual[i]}`);\n }\n}\n/* Defines a test suite. */\nexport function category(category, tests_, options) {\n var _a;\n currentCategory = category;\n tests_();\n if (tests[currentCategory]) {\n tests[currentCategory].clear = (_a = options === null || options === void 0 ? void 0 : options.clear) !== null && _a !== void 0 ? _a : true;\n tests[currentCategory].timeout = options === null || options === void 0 ? void 0 : options.timeout;\n }\n}\n/* Defines a function to be executed before the tests in this category are executed. */\nexport function before(before) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].before = before;\n}\n/* Defines a function to be executed after the tests in this category are executed. */\nexport function after(after) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].after = after;\n}\nfunction addNamespace(s, f) {\n return s.replace(new RegExp(f.name, 'gi'), f.nqName);\n}\nexport function initAutoTests(package_, module) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const packageId = package_.id;\n if (wasRegistered[packageId])\n return;\n const moduleTests = module ? module.tests : tests;\n if (moduleTests[autoTestsCatName] !== undefined ||\n moduleTests[demoCatName] !== undefined ||\n Object.keys(moduleTests).find((c) => c.startsWith(autoTestsCatName) || c.startsWith(coreCatName))) {\n wasRegistered[packageId] = true;\n return;\n }\n if (package_.name === 'DevTools' || (!!module && module._package.name === 'DevTools')) {\n const testFunctions = DG.Func.find({ tags: ['dartTest'] });\n for (const f of testFunctions) {\n const arr = f.name.split(/\\s*\\|\\s*/g);\n const name = (_a = arr.pop()) !== null && _a !== void 0 ? _a : f.name;\n const cat = arr.length ? coreCatName + ': ' + arr.join(': ') : coreCatName;\n if (moduleTests[cat] === undefined)\n moduleTests[cat] = { tests: [], clear: true };\n moduleTests[cat].tests.push(new Test(cat, name, () => __awaiter(this, void 0, void 0, function* () { return yield f.apply(); }), { isAggregated: f.outputs.length > 0, timeout: 300000 }));\n }\n }\n const moduleAutoTests = [];\n const moduleDemo = [];\n const moduleDetectors = [];\n const packFunctions = yield grok.dapi.functions.filter(`package.id = \"${packageId}\"`).list();\n const reg = new RegExp(/skip:\\s*([^,\\s]+)|wait:\\s*(\\d+)|cat:\\s*([^,\\s]+)|timeout:\\s*(\\d+)/g);\n for (const f of packFunctions) {\n const tests = f.options['test'];\n const demo = f.options['demoPath'];\n if ((tests && Array.isArray(tests) && tests.length)) {\n for (let i = 0; i < tests.length; i++) {\n const res = tests[i].matchAll(reg);\n const map = {};\n Array.from(res).forEach((arr) => {\n if (arr[0].startsWith('skip'))\n map['skip'] = arr[1];\n else if (arr[0].startsWith('wait'))\n map['wait'] = parseInt(arr[2]);\n else if (arr[0].startsWith('cat'))\n map['cat'] = arr[3];\n else if (arr[0].startsWith('timeout'))\n map['timeout'] = parseInt(arr[4]);\n });\n const test = new Test(autoTestsCatName, tests.length === 1 ? f.name : `${f.name} ${i + 1}`, () => __awaiter(this, void 0, void 0, function* () {\n const res = yield grok.functions.eval(addNamespace(tests[i], f));\n if (map.wait)\n yield delay(map.wait);\n // eslint-disable-next-line no-throw-literal\n if (typeof res === 'boolean' && !res)\n throw `Failed: ${tests[i]}, expected true, got ${res}`;\n }), { skipReason: map.skip, timeout: map.timeout });\n if (map.cat) {\n const cat = autoTestsCatName + ': ' + map.cat;\n test.category = cat;\n if (moduleTests[cat] === undefined)\n moduleTests[cat] = { tests: [], clear: true };\n moduleTests[cat].tests.push(test);\n }\n else\n moduleAutoTests.push(test);\n }\n }\n if (demo) {\n const wait = f.options['demoWait'] ? parseInt(f.options['demoWait']) : undefined;\n const test = new Test(demoCatName, f.friendlyName, () => __awaiter(this, void 0, void 0, function* () {\n grok.shell.lastError = '';\n yield f.apply();\n yield delay(wait ? wait : 2000);\n if (grok.shell.lastError)\n throw new Error(grok.shell.lastError);\n }), { skipReason: f.options['demoSkip'] });\n moduleDemo.push(test);\n }\n if (f.hasTag('semTypeDetector')) {\n const test = new Test(detectorsCatName, f.friendlyName, () => __awaiter(this, void 0, void 0, function* () {\n const arr = [];\n for (const col of testData.clone().columns) {\n const res = yield f.apply([col]);\n arr.push(res || col.semType);\n }\n expect(arr.filter((i) => i).length, 1);\n }), { skipReason: f.options['skipTest'] });\n moduleDetectors.push(test);\n }\n }\n wasRegistered[packageId] = true;\n if (moduleAutoTests.length)\n moduleTests[autoTestsCatName] = { tests: moduleAutoTests, clear: true };\n if (moduleDemo.length)\n moduleTests[demoCatName] = { tests: moduleDemo, clear: true };\n if (moduleDetectors.length)\n moduleTests[detectorsCatName] = { tests: moduleDetectors, clear: false };\n });\n}\nfunction redefineConsole() {\n const logs = [];\n console.log = (...args) => {\n logs.push(...args);\n stdLog(...args);\n };\n console.info = (...args) => {\n logs.push(...args);\n stdInfo(...args);\n };\n console.warn = (...args) => {\n logs.push(...args);\n stdWarn(...args);\n };\n console.error = (...args) => {\n logs.push(...args);\n stdError(...args);\n };\n return logs;\n}\nfunction resetConsole() {\n console.log = stdLog;\n console.info = stdInfo;\n console.warn = stdWarn;\n console.error = stdError;\n}\nexport function runTests(options) {\n var _a, _b, _c, _d, _e, _f;\n var _g;\n return __awaiter(this, void 0, void 0, function* () {\n const package_ = (_b = (_a = grok.functions.getCurrentCall()) === null || _a === void 0 ? void 0 : _a.func) === null || _b === void 0 ? void 0 : _b.package;\n yield initAutoTests(package_);\n const results = [];\n console.log(`Running tests`);\n options !== null && options !== void 0 ? options : (options = {});\n (_c = (_g = options).testContext) !== null && _c !== void 0 ? _c : (_g.testContext = new TestContext());\n grok.shell.lastError = '';\n const categories = [];\n const logs = redefineConsole();\n try {\n for (const [key, value] of Object.entries(tests)) {\n if ((!!(options === null || options === void 0 ? void 0 : options.category) && !key.toLowerCase().startsWith(options === null || options === void 0 ? void 0 : options.category.toLowerCase())) ||\n ((_d = options.exclude) === null || _d === void 0 ? void 0 : _d.some((c) => key.startsWith(c))))\n continue;\n stdLog(`Started ${key} category`);\n categories.push(key);\n const skipped = (_e = value.tests) === null || _e === void 0 ? void 0 : _e.every((t) => { var _a; return (_a = t.options) === null || _a === void 0 ? void 0 : _a.skipReason; });\n try {\n if (value.before && !skipped)\n yield value.before();\n }\n catch (x) {\n value.beforeStatus = getResult(x);\n }\n const t = (_f = value.tests) !== null && _f !== void 0 ? _f : [];\n const res = [];\n if (value.clear) {\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, logs, value.timeout, package_.name, options.verbose));\n grok.shell.closeAll();\n DG.Balloon.closeAll();\n }\n }\n else {\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, logs, value.timeout, package_.name, options.verbose));\n }\n const data = res.filter((d) => d.result != 'skipped');\n try {\n if (value.after && !skipped)\n yield value.after();\n }\n catch (x) {\n value.afterStatus = getResult(x);\n }\n // Clear after category\n // grok.shell.closeAll();\n // DG.Balloon.closeAll();\n if (value.afterStatus)\n data.push({ category: key, name: 'after', result: value.afterStatus, success: false, ms: 0, skipped: false });\n if (value.beforeStatus)\n data.push({ category: key, name: 'before', result: value.beforeStatus, success: false, ms: 0, skipped: false });\n results.push(...data);\n }\n }\n finally {\n resetConsole();\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.test && results.length) {\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 packageName = package_.name;\n for (const cat of categories) {\n const res = results.filter((r) => r.category === cat);\n const failed_ = res.filter((r) => !r.success).length;\n const params = { success: failed_ === 0,\n passed: res.filter((r) => r.success).length,\n skipped: res.filter((r) => r.skipped).length,\n failed: failed_,\n type: 'package', packageName, category: cat };\n grok.log.usage(`${packageName}: ${cat}`, params, `category-package ${packageName}: ${cat}`);\n }\n if (!options.category) {\n const params = { success: failed.length === 0, passed: successful, skipped, failed: failed.length,\n type: 'package', packageName };\n grok.log.usage(packageName, params, `package-package ${packageName}`);\n }\n if (options.testContext.report) {\n const logger = new DG.Logger();\n const description = 'Package @package tested: @successful successful, @skipped skipped, @failed failed tests';\n const params = {\n successful: successful,\n skipped: skipped,\n failed: failed.length,\n package: package_\n };\n for (const r of failed)\n Object.assign(params, { [`${r.category} | ${r.name}`]: r.result });\n logger.log(description, params, 'package-tested');\n }\n }\n return results;\n });\n}\nfunction getResult(x) {\n return `${x.toString()}\\n${x.stack ? DG.Logger.translateStackTrace(x.stack) : ''}`;\n}\nfunction execTest(t, predicate, logs, categoryTimeout, packageName, verbose) {\n var _a, _b, _c, _d, _e, _f;\n return __awaiter(this, void 0, void 0, function* () {\n logs.length = 0;\n let r;\n let type = 'package';\n const filter = predicate != undefined && (t.name.toLowerCase() !== 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 stdLog(`Started ${t.category} ${t.name}`);\n const start = Date.now();\n try {\n if (skip)\n r = { success: true, result: skipReason, ms: 0, skipped: true };\n else {\n let timeout_ = ((_c = t.options) === null || _c === void 0 ? void 0 : _c.timeout) === STANDART_TIMEOUT &&\n categoryTimeout ? categoryTimeout : (_d = t.options) === null || _d === void 0 ? void 0 : _d.timeout;\n timeout_ = DG.Test.isInBenchmark && timeout_ === STANDART_TIMEOUT ? BENCHMARK_TIMEOUT : timeout_;\n r = { success: true, result: (_e = yield timeout(t.test, timeout_)) !== null && _e !== void 0 ? _e : 'OK', ms: 0, skipped: false };\n }\n }\n catch (x) {\n r = { success: false, result: getResult(x), ms: 0, skipped: false };\n }\n if (((_f = t.options) === null || _f === void 0 ? void 0 : _f.isAggregated) && r.result.constructor === DG.DataFrame) {\n const col = r.result.col('success');\n type = 'core';\n if (col)\n r.success = col.stats.sum === col.length;\n if (!verbose) {\n const df = r.result;\n df.columns.remove('stack');\n df.rows.removeWhere((r) => r.get('success'));\n r.result = df;\n }\n r.result = r.result.toCsv();\n }\n r.logs = logs.join('\\n');\n r.ms = Date.now() - start;\n if (!skip)\n stdLog(`Finished ${t.category} ${t.name} for ${r.ms} ms`);\n r.category = t.category;\n r.name = t.name;\n if (!filter) {\n let params = { 'success': r.success, 'result': r.result, 'ms': r.ms, 'skipped': r.skipped,\n 'type': type, packageName, 'category': t.category, 'test': t.name, 'logs': r.logs };\n if (r.result.constructor == Object) {\n const res = Object.keys(r.result).reduce((acc, k) => (Object.assign(Object.assign({}, acc), { ['result.' + k]: r.result[k] })), {});\n params = Object.assign(Object.assign({}, params), res);\n }\n grok.log.usage(`${packageName}: ${t.category}: ${t.name}`, params, `test-${type} ${packageName}: ${t.category}: ${t.name}`);\n }\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, interval = 50) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n clearInterval(intervalId);\n reject(new Error(error));\n }, wait);\n // @ts-ignore\n const intervalId = setInterval(() => {\n if (checkHandler()) {\n clearInterval(intervalId);\n resolve();\n }\n }, interval);\n });\n });\n}\n// Returns test execution result or an error in case of timeout\nfunction timeout(func, testTimeout) {\n return __awaiter(this, void 0, void 0, function* () {\n let timeout = null;\n const timeoutPromise = new Promise((_, reject) => {\n timeout = setTimeout(() => {\n // eslint-disable-next-line prefer-promise-reject-errors\n reject('EXECUTION TIMEOUT');\n }, testTimeout);\n });\n try {\n return yield Promise.race([func(), timeoutPromise]);\n }\n finally {\n if (timeout)\n clearTimeout(timeout);\n }\n });\n}\nexport function isDialogPresent(dialogTitle) {\n const dialogs = DG.Dialog.getOpenDialogs();\n for (let i = 0; i < dialogs.length; i++) {\n if (dialogs[i].title == dialogTitle)\n return true;\n }\n return false;\n}\n/** Expects an asynchronous {@link action} to throw an exception. Use {@link check} to perform\n * deeper inspection of the exception if necessary.\n * @param {function(): Promise<void>} action\n * @param {function(any): boolean} check\n * @return {Promise<void>}\n */\nexport function expectExceptionAsync(action, check) {\n return __awaiter(this, void 0, void 0, function* () {\n let caught = false;\n let checked = false;\n try {\n yield action();\n }\n catch (e) {\n caught = true;\n checked = !check || check(e);\n }\n finally {\n if (!caught)\n throw new Error('An exception is expected but not thrown');\n if (!checked)\n throw new Error('An expected exception is thrown, but it does not satisfy the condition');\n }\n });\n}\nconst catDF = DG.DataFrame.fromColumns([DG.Column.fromStrings('col', ['val1', 'val2', 'val3'])]);\n/**\n * Universal test for viewers. It search viewers in DOM by tags: canvas, svg, img, input, h1, a\n * @param {string} v Viewer name\n * @param {DG.DataFrame} df Dataframe to use. Should have at least 3 rows\n * @param {boolean} options.detectSemanticTypes Specify whether to detect semantic types or not\n * @param {boolean} options.readOnly If set to true, the dataframe will not be modified during the test\n * @param {boolean} options.arbitraryDfTest If set to false, test on arbitrary dataframe\n * (one categorical column) will not be performed\n * @param {object} options List of options (optional)\n * @return {Promise<void>} The test is considered successful if it completes without errors\n */\nexport function testViewer(v, df, options) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const createViewer = (tv, v, packageName) => __awaiter(this, void 0, void 0, function* () {\n let res;\n if (packageName) {\n res = (yield tv.dataFrame.plot.fromType(v));\n tv.dockManager.dock(res);\n }\n else\n res = tv.addViewer(v);\n return res;\n });\n if (options === null || options === void 0 ? void 0 : options.detectSemanticTypes)\n yield grok.data.detectSemanticTypes(df);\n let 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,${viewerName} .d4-viewer-error`;\n const selector = ['div.ui-box' /* root */, 'canvas', 'svg', 'img', 'input', 'h1', 'a', '.d4-viewer-error']\n .map((selTag) => `${viewerName} ${selTag}`).join(', ');\n const res = [];\n try {\n let viewer = yield createViewer(tv, v, options === null || options === void 0 ? void 0 : options.packageName);\n yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer', 3000);\n const tag = (_a = document.querySelector(selector)) === null || _a === void 0 ? void 0 : _a.tagName;\n res.push(Array.from(tv.viewers).length);\n if (!(options === null || options === void 0 ? void 0 : options.readOnly)) {\n Array.from(df.row(0).cells).forEach((c) => c.value = null);\n const num = df.rowCount < 20 ? Math.floor(df.rowCount / 2) : 10;\n df.rows.select((row) => row.idx >= 0 && row.idx < num);\n yield delay(50);\n for (let i = num; i < num * 2; i++)\n df.filter.set(i, false);\n yield delay(50);\n df.currentRowIdx = 1;\n const df1 = df.clone();\n df.columns.names().slice(0, Math.ceil(df.columns.length / 2)).forEach((c) => df.columns.remove(c));\n yield delay(100);\n tv.dataFrame = df1;\n }\n let optns;\n try {\n optns = viewer.getOptions(true).look;\n }\n catch (err) {\n throw new Error(`Viewer's .getOptions() error.`, { cause: err });\n }\n let props;\n try {\n props = viewer.getProperties();\n }\n catch (err) {\n throw new Error(`Viewer's .getProperties() error.`, { cause: err });\n }\n const newProps = {};\n Object.keys(optns).filter((k) => typeof optns[k] === 'boolean').forEach((k) => newProps[k] = !optns[k]);\n props.filter((p) => p.choices !== null)\n .forEach((p) => newProps[p.name] = p.choices.find((c) => c !== optns[p.name]));\n viewer.setOptions(newProps);\n yield delay(300);\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 const selector1 = `${viewerName} ${tag}`;\n yield awaitCheck(() => document.querySelector(selector1) !== null, 'cannot load viewer from layout', 3000);\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 if ((options === null || options === void 0 ? void 0 : options.arbitraryDfTest) !== false) {\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield options.awaitViewer(viewer);\n grok.shell.closeAll();\n yield delay(100);\n tv = grok.shell.addTableView(catDF);\n try {\n viewer = yield createViewer(tv, v, options === null || options === void 0 ? void 0 : options.packageName);\n }\n catch (e) {\n grok.shell.closeAll();\n DG.Balloon.closeAll();\n return;\n }\n yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer on arbitrary dataset', 3000);\n }\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield options.awaitViewer(viewer);\n }\n finally {\n // closeAll() is handling by common test workflow\n // grok.shell.closeAll();\n // DG.Balloon.closeAll();\n }\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUczQyxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUMvQixNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQztBQUVuQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMzQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMzQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUU3QyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBS2QsRUFBRSxDQUFDO0FBRVAsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7QUFDdEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDO0FBQzNCLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO0FBQ3JDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQztBQUMzQixNQUFNLGFBQWEsR0FBNkIsRUFBRSxDQUFDO0FBQ25ELE1BQU0sQ0FBQyxJQUFJLGVBQXVCLENBQUM7QUFFbkMsTUFBTSxLQUFXLE1BQU0sQ0FLdEI7QUFMRCxXQUFpQixNQUFNO0lBQ3JCLFNBQWdCLE9BQU8sQ0FBQyxLQUFVLEVBQUUsSUFBYTtRQUMvQyxJQUFJLEtBQUssSUFBSSxJQUFJO1lBQ2YsTUFBTSxJQUFJ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R0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ25ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNyQyxNQUFNLEdBQUcsR0FBSSxLQUFLLENBQUMsQ0FBQyxDQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUMvQyxNQUFNLEdBQUcsR0FBbUUsRUFBRSxDQUFDO29CQUMvRSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUM5QixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDOzRCQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7NkJBQy9DLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7NEJBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs2QkFDOUQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQzs0QkFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzZCQUNsRCxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDOzRCQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzNFLENBQUMsQ0FBQyxDQUFDO29CQUNILE1BQU0s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QztnQkFFdEIsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pCLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDcEMsSUFBSTtvQkFDRixNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsV0FBVyxDQUFDLENBQUM7aUJBQzFEO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3RCLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3RCLE9BQU87aUJBQ1I7Z0JBQ0QsTUFBTSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQzlELHlDQUF5QyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ3BEO1lBQ0QsSUFBSSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsV0FBVztnQkFBRSxNQUFNLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0Q7Z0JBQVM7WUFDUixpREFBaUQ7WUFDakQseUJBQXlCO1lBQ3pCLHlCQUF5QjtTQUMxQjs7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge3Rlc3REYXRhfSBmcm9tICcuL2RhdGFmcmFtZS11dGlscyc7XG5pbXBvcnQgVGltZW91dCA9IE5vZGVKUy5UaW1lb3V0O1xuXG5jb25zdCBTVEFOREFSVF9USU1FT1VUID0gMzAwMDA7XG5jb25zdCBCRU5DSE1BUktfVElNRU9VVCA9IDEwODAwMDAwO1xuXG5jb25zdCBzdGRMb2cgPSBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO1xuY29uc3Qgc3RkSW5mbyA9IGNvbnNvbGUuaW5mby5iaW5kKGNvbnNvbGUpO1xuY29uc3Qgc3RkV2FybiA9IGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpO1xuY29uc3Qgc3RkRXJyb3IgPSBjb25zb2xlLmVycm9yLmJpbmQoY29uc29sZSk7XG5cbmV4cG9ydCBjb25zdCB0ZXN0czoge1xuICBba2V5OiBzdHJpbmddOiB7XG4gICAgdGVzdHM/OiBUZXN0W10sIGJlZm9yZT86ICgpID0+IFByb21pc2U8dm9pZD4sIGFmdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBiZWZvcmVTdGF0dXM/OiBzdHJpbmcsIGFmdGVyU3RhdHVzPzogc3RyaW5nLCBjbGVhcj86IGJvb2xlYW4sIHRpbWVvdXQ/OiBudW1iZXJcbiAgfVxufSA9IHt9O1xuXG5jb25zdCBhdXRvVGVzdHNDYXROYW1lID0gJ0F1dG8gVGVzdHMnO1xuY29uc3QgZGVtb0NhdE5hbWUgPSAnRGVtbyc7XG5jb25zdCBkZXRlY3RvcnNDYXROYW1lID0gJ0RldGVjdG9ycyc7XG5jb25zdCBjb3JlQ2F0TmFtZSA9ICdDb3JlJztcbmNvbnN0IHdhc1JlZ2lzdGVyZWQ6IHtba2V5OiBzdHJpbmddOiBib29sZWFufSA9IHt9O1xuZXhwb3J0IGxldCBjdXJyZW50Q2F0ZWdvcnk6IHN0cmluZztcblxuZXhwb3J0IG5hbWVzcGFjZSBhc3N1cmUge1xuICBleHBvcnQgZnVuY3Rpb24gbm90TnVsbCh2YWx1ZTogYW55LCBuYW1lPzogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZSA9PSBudWxsID8gJ1ZhbHVlJyA6IG5hbWV9IG5vdCBkZWZpbmVkYCk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXN0T3B0aW9ucyB7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIHVuaGFuZGxlZEV4Y2VwdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gIHNraXBSZWFzb24/OiBzdHJpbmc7XG4gIGlzQWdncmVnYXRlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcnlPcHRpb25zIHtcbiAgY2xlYXI/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgVGVzdENvbnRleHQge1xuICBjYXRjaFVuaGFuZGxlZCA9IHRydWU7XG4gIHJlcG9ydCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGNhdGNoVW5oYW5kbGVkPzogYm9vbGVhbiwgcmVwb3J0PzogYm9vbGVhbikge1xuICAgIGlmIChjYXRjaFVuaGFuZGxlZCAhPT0gdW5kZWZpbmVkKSB0aGlzLmNhdGNoVW5oYW5kbGVkID0gY2F0Y2hVbmhhbmRsZWQ7XG4gICAgaWYgKHJlcG9ydCAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlcG9ydCA9IHJlcG9ydDtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFRlc3Qge1xuICB0ZXN0OiAoKSA9PiBQcm9taXNlPGFueT47XG4gIG5hbWU6IHN0cmluZztcbiAgY2F0ZWdvcnk6IHN0cmluZztcbiAgb3B0aW9ucz86IFRlc3RPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKGNhdGVnb3J5OiBzdHJpbmcsIG5hbWU6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+LCBvcHRpb25zPzogVGVzdE9wdGlvbnMpIHtcbiAgICB0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICBvcHRpb25zID8/PSB7fTtcbiAgICBvcHRpb25zLnRpbWVvdXQgPz89IFNUQU5EQVJUX1RJTUVPVVQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnRlc3QgPSBhc3luYyAoKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0ZXN0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0RXZlbnQ8VD4oZXZlbnQ6IE9ic2VydmFibGU8VD4sXG4gIGhhbmRsZXI6IChhcmdzOiBUKSA9PiB2b2lkLCB0cmlnZ2VyOiAoKSA9PiB2b2lkLCBtczogbnVtYmVyID0gMCwgcmVhc29uOiBzdHJpbmcgPSBgdGltZW91dGBcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc3ViID0gZXZlbnQuc3Vic2NyaWJlKChhcmdzOiBUKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBoYW5kbGVyKGFyZ3MpO1xuICAgICAgICByZXNvbHZlKCdPSycpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgICAvLyBEbyBub3QgY2xlYXJUaW1lb3V0IG9yIGV2ZW50IHN1YiBpZiBoYW5kbGVyIGZhaWxzXG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICB9KTtcbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QocmVhc29uKTtcbiAgICB9LCBtcyk7XG4gICAgdHJpZ2dlcigpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRlc3QobmFtZTogc3RyaW5nLCB0ZXN0OiAoKSA9PiBQcm9taXNlPGFueT4sIG9wdGlvbnM/OiBUZXN0T3B0aW9ucyk6IHZvaWQge1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XSA9PSB1bmRlZmluZWQpXG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyA9PSB1bmRlZmluZWQpXG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyA9IFtdO1xuICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLnRlc3RzIS5wdXNoKG5ldyBUZXN0KGN1cnJlbnRDYXRlZ29yeSwgbmFtZSwgdGVzdCwgb3B0aW9ucykpO1xufVxuXG4vKiBUZXN0cyB0d28gb2JqZWN0cyBmb3IgZXF1YWxpdHksIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhleSBhcmUgbm90IGVxdWFsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdChhY3R1YWw6IGFueSwgZXhwZWN0ZWQ6IGFueSA9IHRydWUsIGVycm9yPzogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChlcnJvcilcbiAgICBlcnJvciA9IGAke2Vycm9yfSwgYDtcbiAgZWxzZSBlcnJvciA9ICcnO1xuICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3J9RXhwZWN0ZWQgXCIke2V4cGVjdGVkfVwiLCBnb3QgXCIke2FjdHVhbH1cImApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0RmxvYXQoYWN0dWFsOiBudW1iZXIsIGV4cGVjdGVkOiBudW1iZXIsIHRvbGVyYW5jZSA9IDAuMDAxLCBlcnJvcj86IHN0cmluZyk6IHZvaWQge1xuICBpZiAoKGFjdHVhbCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZICYmIGV4cGVjdGVkID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHx8XG4gICAgICAoYWN0dWFsID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgJiYgZXhwZWN0ZWQgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSkgfHxcbiAgICAgIChhY3R1YWwgPT09IE51bWJlci5OYU4gJiYgZXhwZWN0ZWQgPT09IE51bWJlci5OYU4pIHx8IChpc05hTihhY3R1YWwpICYmIGlzTmFOKGV4cGVjdGVkKSkpXG4gICAgcmV0dXJuO1xuICBjb25zdCBhcmVFcXVhbCA9IE1hdGguYWJzKGFjdHVhbCAtIGV4cGVjdGVkKSA8IHRvbGVyYW5jZTtcbiAgZXhwZWN0KGFyZUVxdWFsLCB0cnVlLCBgJHtlcnJvciA/PyAnJ30gKHRvbGVyYW5jZSA9ICR7dG9sZXJhbmNlfSlgKTtcbiAgaWYgKCFhcmVFcXVhbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZXhwZWN0ZWR9LCBnb3QgJHthY3R1YWx9ICh0b2xlcmFuY2UgPSAke3RvbGVyYW5jZX0pYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RUYWJsZShhY3R1YWw6IERHLkRhdGFGcmFtZSwgZXhwZWN0ZWQ6IERHLkRhdGFGcmFtZSwgZXJyb3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZXhwZWN0ZWRSb3dDb3VudCA9IGV4cGVjdGVkLnJvd0NvdW50O1xuICBjb25zdCBhY3R1YWxSb3dDb3VudCA9IGFjdHVhbC5yb3dDb3VudDtcbiAgZXhwZWN0KGFjdHVhbFJvd0NvdW50LCBleHBlY3RlZFJvd0NvdW50LCBgJHtlcnJvciA/PyAnJ30sIHJvdyBjb3VudGApO1xuXG4gIGZvciAoY29uc3QgY29sdW1uIG9mIGV4cGVjdGVkLmNvbHVtbnMpIHtcbiAgICBjb25zdCBhY3R1YWxDb2x1bW4gPSBhY3R1YWwuY29sdW1ucy5ieU5hbWUoY29sdW1uLm5hbWUpO1xuICAgIGlmIChhY3R1YWxDb2x1bW4gPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uICR7Y29sdW1uLm5hbWV9IG5vdCBmb3VuZGApO1xuICAgIGlmIChhY3R1YWxDb2x1bW4udHlwZSAhPSBjb2x1bW4udHlwZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uICR7Y29sdW1uLm5hbWV9IHR5cGUgZXhwZWN0ZWQgJHtjb2x1bW4udHlwZX0gZ290ICR7YWN0dWFsQ29sdW1uLnR5cGV9YCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBlY3RlZFJvd0NvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29sdW1uLmdldChpKTtcbiAgICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gYWN0dWFsQ29sdW1uLmdldChpKTtcbiAgICAgIGlmIChjb2x1bW4udHlwZSA9PSBERy5UWVBFLkZMT0FUKVxuICAgICAgICBleHBlY3RGbG9hdChhY3R1YWxWYWx1ZSwgdmFsdWUsIDAuMDAwMSwgZXJyb3IpO1xuICAgICAgZWxzZSBpZiAoY29sdW1uLnR5cGUgPT0gREcuVFlQRS5EQVRFX1RJTUUpXG4gICAgICAgIGV4cGVjdChhY3R1YWxWYWx1ZS5pc1NhbWUodmFsdWUpLCB0cnVlLCBlcnJvcik7XG4gICAgICBlbHNlXG4gICAgICAgIGV4cGVjdChhY3R1YWxWYWx1ZSwgdmFsdWUsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdE9iamVjdChhY3R1YWw6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGV4cGVjdGVkOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7XG4gIGZvciAoY29uc3QgW2V4cGVjdGVkS2V5LCBleHBlY3RlZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhleHBlY3RlZCkpIHtcbiAgICBpZiAoIWFjdHVhbC5oYXNPd25Qcm9wZXJ0eShleHBlY3RlZEtleSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHByb3BlcnR5IFwiJHtleHBlY3RlZEtleX1cIiBub3QgZm91bmRgKTtcblxuICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gYWN0dWFsW2V4cGVjdGVkS2V5XTtcbiAgICBpZiAoYWN0dWFsVmFsdWUgaW5zdGFuY2VvZiBBcnJheSAmJiBleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgQXJyYXkpXG4gICAgICBleHBlY3RBcnJheShhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsVmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgIGV4cGVjdE9iamVjdChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7XG4gICAgZWxzZSBpZiAoTnVtYmVyLmlzRmluaXRlKGFjdHVhbFZhbHVlKSAmJiBOdW1iZXIuaXNGaW5pdGUoZXhwZWN0ZWRWYWx1ZSkpXG4gICAgICBleHBlY3RGbG9hdChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsVmFsdWUgIT0gZXhwZWN0ZWRWYWx1ZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgKCR7ZXhwZWN0ZWRWYWx1ZX0pIGZvciBrZXkgJyR7ZXhwZWN0ZWRLZXl9JywgZ290ICgke2FjdHVhbFZhbHVlfSlgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0QXJyYXkoYWN0dWFsOiBBcnJheUxpa2U8YW55PiwgZXhwZWN0ZWQ6IEFycmF5TGlrZTxhbnk+KSB7XG4gIGNvbnN0IGFjdHVhbExlbmd0aCA9IGFjdHVhbC5sZW5ndGg7XG4gIGNvbnN0IGV4cGVjdGVkTGVuZ3RoID0gZXhwZWN0ZWQubGVuZ3RoO1xuXG4gIGlmIChhY3R1YWxMZW5ndGggIT0gZXhwZWN0ZWRMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEFycmF5cyBhcmUgb2YgZGlmZmVyZW50IGxlbmd0aDogYWN0dWFsIGFycmF5IGxlbmd0aCBpcyAke2FjdHVhbExlbmd0aH0gYCArXG4gICAgICBgYW5kIGV4cGVjdGVkIGFycmF5IGxlbmd0aCBpcyAke2V4cGVjdGVkTGVuZ3RofWApO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhY3R1YWxMZW5ndGg7IGkrKykge1xuICAgIGlmIChhY3R1YWxbaV0gaW5zdGFuY2VvZiBBcnJheSAmJiBleHBlY3RlZFtpXSBpbnN0YW5jZW9mIEFycmF5KVxuICAgICAgZXhwZWN0QXJyYXkoYWN0dWFsW2ldLCBleHBlY3RlZFtpXSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsW2ldIGluc3RhbmNlb2YgT2JqZWN0ICYmIGV4cGVjdGVkW2ldIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgZXhwZWN0T2JqZWN0KGFjdHVhbFtpXSwgZXhwZWN0ZWRbaV0pO1xuICAgIGVsc2UgaWYgKGFjdHVhbFtpXSAhPSBleHBlY3RlZFtpXSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtleHBlY3RlZFtpXX0gYXQgcG9zaXRpb24gJHtpfSwgZ290ICR7YWN0dWFsW2ldfWApO1xuICB9XG59XG5cbi8qIERlZmluZXMgYSB0ZXN0IHN1aXRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcsIHRlc3RzXzogKCkgPT4gdm9pZCwgb3B0aW9ucz86IENhdGVnb3J5T3B0aW9ucyk6IHZvaWQge1xuICBjdXJyZW50Q2F0ZWdvcnkgPSBjYXRlZ29yeTtcbiAgdGVzdHNfKCk7XG4gIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldKSB7XG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5jbGVhciA9IG9wdGlvbnM/LmNsZWFyID8/IHRydWU7XG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dDtcbiAgfVxufVxuXG4vKiBEZWZpbmVzIGEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYmVmb3JlIHRoZSB0ZXN0cyBpbiB0aGlzIGNhdGVnb3J5IGFyZSBleGVjdXRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiZWZvcmUoYmVmb3JlOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogdm9pZCB7XG4gIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID0ge307XG4gIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uYmVmb3JlID0gYmVmb3JlO1xufVxuXG4vKiBEZWZpbmVzIGEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyKGFmdGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogdm9pZCB7XG4gIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID0ge307XG4gIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uYWZ0ZXIgPSBhZnRlcjtcbn1cblxuZnVuY3Rpb24gYWRkTmFtZXNwYWNlKHM6IHN0cmluZywgZjogREcuRnVuYyk6IHN0cmluZyB7XG4gIHJldHVybiBzLnJlcGxhY2UobmV3IFJlZ0V4cChmLm5hbWUsICdnaScpLCBmLm5xTmFtZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0QXV0b1Rlc3RzKHBhY2thZ2VfOiBERy5QYWNrYWdlLCBtb2R1bGU/OiBhbnkpIHtcbiAgY29uc3QgcGFja2FnZUlkID0gcGFja2FnZV8uaWQ7XG4gIGlmICh3YXNSZWdpc3RlcmVkW3BhY2thZ2VJZF0pIHJldHVybjtcbiAgY29uc3QgbW9kdWxlVGVzdHMgPSBtb2R1bGUgPyBtb2R1bGUudGVzdHMgOiB0ZXN0cztcbiAgaWYgKG1vZHVsZVRlc3RzW2F1dG9UZXN0c0NhdE5hbWVdICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIG1vZHVsZVRlc3RzW2RlbW9DYXROYW1lXSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBPYmplY3Qua2V5cyhtb2R1bGVUZXN0cykuZmluZCgoYykgPT4gYy5zdGFydHNXaXRoKGF1dG9UZXN0c0NhdE5hbWUpIHx8IGMuc3RhcnRzV2l0aChjb3JlQ2F0TmFtZSkpKSB7XG4gICAgd2FzUmVnaXN0ZXJlZFtwYWNrYWdlSWRdID0gdHJ1ZTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHBhY2thZ2VfLm5hbWUgPT09ICdEZXZUb29scycgfHwgKCEhbW9kdWxlICYmIG1vZHVsZS5fcGFja2FnZS5uYW1lID09PSAnRGV2VG9vbHMnKSkge1xuICAgIGNvbnN0IHRlc3RGdW5jdGlvbnM6IERHLkZ1bmNbXSA9IERHLkZ1bmMuZmluZCh7dGFnczogWydkYXJ0VGVzdCddfSk7XG4gICAgZm9yIChjb25zdCBmIG9mIHRlc3RGdW5jdGlvbnMpIHtcbiAgICAgIGNvbnN0IGFyciA9IGYubmFtZS5zcGxpdCgvXFxzKlxcfFxccyovZyk7XG4gICAgICBjb25zdCBuYW1lID0gYXJyLnBvcCgpID8/IGYubmFtZTtcbiAgICAgIGNvbnN0IGNhdCA9IGFyci5sZW5ndGggPyBjb3JlQ2F0TmFtZSArICc6ICcgKyBhcnIuam9pbignOiAnKSA6IGNvcmVDYXROYW1lO1xuICAgICAgaWYgKG1vZHVsZVRlc3RzW2NhdF0gPT09IHVuZGVmaW5lZClcbiAgICAgICAgbW9kdWxlVGVzdHNbY2F0XSA9IHt0ZXN0czogW10sIGNsZWFyOiB0cnVlfTtcbiAgICAgIG1vZHVsZVRlc3RzW2NhdF0udGVzdHMucHVzaChuZXcgVGVzdChjYXQsIG5hbWUsXG4gICAgICAgIGFzeW5jICgpID0+IGF3YWl0IGYuYXBwbHkoKSwge2lzQWdncmVnYXRlZDogZi5vdXRwdXRzLmxlbmd0aCA+IDAsIHRpbWVvdXQ6IDMwMDAwMH0pKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbW9kdWxlQXV0b1Rlc3RzID0gW107XG4gIGNvbnN0IG1vZHVsZURlbW8gPSBbXTtcbiAgY29uc3QgbW9kdWxlRGV0ZWN0b3JzID0gW107XG4gIGNvbnN0IHBhY2tGdW5jdGlvbnMgPSBhd2FpdCBncm9rLmRhcGkuZnVuY3Rpb25zLmZpbHRlcihgcGFja2FnZS5pZCA9IFwiJHtwYWNrYWdlSWR9XCJgKS5saXN0KCk7XG4gIGNvbnN0IHJlZyA9IG5ldyBSZWdFeHAoL3NraXA6XFxzKihbXixcXHNdKyl8d2FpdDpcXHMqKFxcZCspfGNhdDpcXHMqKFteLFxcc10rKXx0aW1lb3V0OlxccyooXFxkKykvZyk7XG4gIGZvciAoY29uc3QgZiBvZiBwYWNrRnVuY3Rpb25zKSB7XG4gICAgY29uc3QgdGVzdHMgPSBmLm9wdGlvbnNbJ3Rlc3QnXTtcbiAgICBjb25zdCBkZW1vID0gZi5vcHRpb25zWydkZW1vUGF0aCddO1xuICAgIGlmICgodGVzdHMgJiYgQXJyYXkuaXNBcnJheSh0ZXN0cykgJiYgdGVzdHMubGVuZ3RoKSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByZXMgPSAodGVzdHNbaV0gYXMgc3RyaW5nKS5tYXRjaEFsbChyZWcpO1xuICAgICAgICBjb25zdCBtYXA6IHtza2lwPzogc3RyaW5nLCB3YWl0PzogbnVtYmVyLCBjYXQ/OiBzdHJpbmcsIHRpbWVvdXQ/OiBudW1iZXJ9ID0ge307XG4gICAgICAgIEFycmF5LmZyb20ocmVzKS5mb3JFYWNoKChhcnIpID0+IHtcbiAgICAgICAgICBpZiAoYXJyWzBdLnN0YXJ0c1dpdGgoJ3NraXAnKSkgbWFwWydza2lwJ10gPSBhcnJbMV07XG4gICAgICAgICAgZWxzZSBpZiAoYXJyWzBdLnN0YXJ0c1dpdGgoJ3dhaXQnKSkgbWFwWyd3YWl0J10gPSBwYXJzZUludChhcnJbMl0pO1xuICAgICAgICAgIGVsc2UgaWYgKGFyclswXS5zdGFydHNXaXRoKCdjYXQnKSkgbWFwWydjYXQnXSA9IGFyclszXTtcbiAgICAgICAgICBlbHNlIGlmIChhcnJbMF0uc3RhcnRzV2l0aCgndGltZW91dCcpKSBtYXBbJ3RpbWVvdXQnXSA9IHBhcnNlSW50KGFycls0XSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0ZXN0ID0gbmV3IFRlc3QoYXV0b1Rlc3RzQ2F0TmFtZSwgdGVzdHMubGVuZ3RoID09PSAxID8gZi5uYW1lIDogYCR7Zi5uYW1lfSAke2kgKyAxfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBncm9rLmZ1bmN0aW9ucy5ldmFsKGFkZE5hbWVzcGFjZSh0ZXN0c1tpXSwgZikpO1xuICAgICAgICAgIGlmIChtYXAud2FpdCkgYXdhaXQgZGVsYXkobWFwLndhaXQpO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsXG4gICAgICAgICAgaWYgKHR5cGVvZiByZXMgPT09ICdib29sZWFuJyAmJiAhcmVzKSB0aHJvdyBgRmFpbGVkOiAke3Rlc3RzW2ldfSwgZXhwZWN0ZWQgdHJ1ZSwgZ290ICR7cmVzfWA7XG4gICAgICAgIH0sIHtza2lwUmVhc29uOiBtYXAuc2tpcCwgdGltZW91dDogbWFwLnRpbWVvdXR9KTtcbiAgICAgICAgaWYgKG1hcC5jYXQpIHtcbiAgICAgICAgICBjb25zdCBjYXQ6IHN0cmluZyA9IGF1dG9UZXN0c0NhdE5hbWUgKyAnOiAnICsgbWFwLmNhdDtcbiAgICAgICAgICB0ZXN0LmNhdGVnb3J5ID0gY2F0O1xuICAgICAgICAgIGlmIChtb2R1bGVUZXN0c1tjYXRdID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBtb2R1bGVUZXN0c1tjYXRdID0ge3Rlc3RzOiBbXSwgY2xlYXI6IHRydWV9O1xuICAgICAgICAgIG1vZHVsZVRlc3RzW2NhdF0udGVzdHMucHVzaCh0ZXN0KTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgbW9kdWxlQXV0b1Rlc3RzLnB1c2godGVzdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZW1vKSB7XG4gICAgICBjb25zdCB3YWl0ID0gZi5vcHRpb25zWydkZW1vV2FpdCddID8gcGFyc2VJbnQoZi5vcHRpb25zWydkZW1vV2FpdCddKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHRlc3QgPSBuZXcgVGVzdChkZW1vQ2F0TmFtZSwgZi5mcmllbmRseU5hbWUsIGFzeW5jICgpID0+IHtcbiAgICAgICAgZ3Jvay5zaGVsbC5sYXN0RXJyb3IgPSAnJztcbiAgICAgICAgYXdhaXQgZi5hcHBseSgpO1xuICAgICAgICBhd2FpdCBkZWxheSh3YWl0ID8gd2FpdCA6IDIwMDApO1xuICAgICAgICBpZiAoZ3Jvay5zaGVsbC5sYXN0RXJyb3IpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGdyb2suc2hlbGwubGFzdEVycm9yKTtcbiAgICAgIH0sIHtza2lwUmVhc29uOiBmLm9wdGlvbnNbJ2RlbW9Ta2lwJ119KTtcbiAgICAgIG1vZHVsZURlbW8ucHVzaCh0ZXN0KTtcbiAgICB9XG4gICAgaWYgKGYuaGFzVGFnKCdzZW1UeXBlRGV0ZWN0b3InKSkge1xuICAgICAgY29uc3QgdGVzdCA9IG5ldyBUZXN0KGRldGVjdG9yc0NhdE5hbWUsIGYuZnJpZW5kbHlOYW1lLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFyciA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiB0ZXN0RGF0YS5jbG9uZSgpLmNvbHVtbnMpIHtcbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmLmFwcGx5KFtjb2xdKTtcbiAgICAgICAgICBhcnIucHVzaChyZXMgfHwgY29sLnNlbVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGV4cGVjdChhcnIuZmlsdGVyKChpKSA9PiBpKS5sZW5ndGgsIDEpO1xuICAgICAgfSwge3NraXBSZWFzb246IGYub3B0aW9uc1snc2tpcFRlc3QnXX0pO1xuICAgICAgbW9kdWxlRGV0ZWN0b3JzLnB1c2godGVzdCk7XG4gICAgfVxuICB9XG4gIHdhc1JlZ2lzdGVyZWRbcGFja2FnZUlkXSA9IHRydWU7XG4gIGlmIChtb2R1bGVBdXRvVGVzdHMubGVuZ3RoKVxuICAgIG1vZHVsZVRlc3RzW2F1dG9UZXN0c0NhdE5hbWVdID0ge3Rlc3RzOiBtb2R1bGVBdXRvVGVzdHMsIGNsZWFyOiB0cnVlfTtcbiAgaWYgKG1vZHVsZURlbW8ubGVuZ3RoKVxuICAgIG1vZHVsZVRlc3RzW2RlbW9DYXROYW1lXSA9IHt0ZXN0czogbW9kdWxlRGVtbywgY2xlYXI6IHRydWV9O1xuICBpZiAobW9kdWxlRGV0ZWN0b3JzLmxlbmd0aClcbiAgICBtb2R1bGVUZXN0c1tkZXRlY3RvcnNDYXROYW1lXSA9IHt0ZXN0czogbW9kdWxlRGV0ZWN0b3JzLCBjbGVhcjogZmFsc2V9O1xufVxuXG5mdW5jdGlvbiByZWRlZmluZUNvbnNvbGUoKTogYW55W10ge1xuICBjb25zdCBsb2dzOiBhbnlbXSA9IFtdO1xuICBjb25zb2xlLmxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgbG9ncy5wdXNoKC4uLmFyZ3MpO1xuICAgIHN0ZExvZyguLi5hcmdzKTtcbiAgfTtcbiAgY29uc29sZS5pbmZvID0gKC4uLmFyZ3MpID0+IHtcbiAgICBsb2dzLnB1c2goLi4uYXJncyk7XG4gICAgc3RkSW5mbyguLi5hcmdzKTtcbiAgfTtcbiAgY29uc29sZS53YXJuID0gKC4uLmFyZ3MpID0+IHtcbiAgICBsb2dzLnB1c2goLi4uYXJncyk7XG4gICAgc3RkV2FybiguLi5hcmdzKTtcbiAgfTtcbiAgY29uc29sZS5lcnJvciA9ICguLi5hcmdzKSA9PiB7XG4gICAgbG9ncy5wdXNoKC4uLmFyZ3MpO1xuICAgIHN0ZEVycm9yKC4uLmFyZ3MpO1xuICB9O1xuICByZXR1cm4gbG9ncztcbn1cblxuZnVuY3Rpb24gcmVzZXRDb25zb2xlKCk6IHZvaWQge1xuICBjb25zb2xlLmxvZyA9IHN0ZExvZztcbiAgY29uc29sZS5pbmZvID0gc3RkSW5mbztcbiAgY29uc29sZS53YXJuID0gc3RkV2FybjtcbiAgY29uc29sZS5lcnJvciA9IHN0ZEVycm9yO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuVGVzdHMob3B0aW9ucz86XG4gIHtjYXRlZ29yeT86IHN0cmluZywgdGVzdD86IHN0cmluZywgdGVzdENvbnRleHQ/OiBUZXN0Q29udGV4dCwgZXhjbHVkZT86IHN0cmluZ1tdLCB2ZXJib3NlPzogYm9vbGVhbn0pIHtcbiAgY29uc3QgcGFja2FnZV8gPSBncm9rLmZ1bmN0aW9ucy5nZXRDdXJyZW50Q2FsbCgpPy5mdW5jPy5wYWNrYWdlO1xuICBhd2FpdCBpbml0QXV0b1Rlc3RzKHBhY2thZ2VfKTtcbiAgY29uc3QgcmVzdWx0czogeyBjYXRlZ29yeT86IHN0cmluZywgbmFtZT86IHN0cmluZywgc3VjY2VzczogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHN0cmluZywgbXM6IG51bWJlciwgc2tpcHBlZDogYm9vbGVhbiB9W10gPSBbXTtcbiAgY29uc29sZS5sb2coYFJ1bm5pbmcgdGVzdHNgKTtcbiAgb3B0aW9ucyA/Pz0ge307XG4gIG9wdGlvbnMhLnRlc3RDb250ZXh0ID8/PSBuZXcgVGVzdENvbnRleHQoKTtcbiAgZ3Jvay5zaGVsbC5sYXN0RXJyb3IgPSAnJztcbiAgY29uc3QgY2F0ZWdvcmllcyA9IFtdO1xuICBjb25zdCBsb2dzID0gcmVkZWZpbmVDb25zb2xlKCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGVzdHMpKSB7XG4gICAgICBpZiAoKCEhb3B0aW9ucz8uY2F0ZWdvcnkgJiYgIWtleS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgob3B0aW9ucz8uY2F0ZWdvcnkudG9Mb3dlckNhc2UoKSkpIHx8XG4gICAgICAgIG9wdGlvbnMuZXhjbHVkZT8uc29tZSgoYykgPT4ga2V5LnN0YXJ0c1dpdGgoYykpKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIHN0ZExvZyhgU3RhcnRlZCAke2tleX0gY2F0ZWdvcnlgKTtcbiAgICAgIGNhdGVnb3JpZXMucHVzaChrZXkpO1xuICAgICAgY29uc3Qgc2tpcHBlZCA9IHZhbHVlLnRlc3RzPy5ldmVyeSgodCkgPT4gdC5vcHRpb25zPy5za2lwUmVhc29uKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh2YWx1ZS5iZWZvcmUgJiYgIXNraXBwZWQpXG4gICAgICAgICAgYXdhaXQgdmFsdWUuYmVmb3JlKCk7XG4gICAgICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICAgICAgdmFsdWUuYmVmb3JlU3RhdHVzID0gZ2V0UmVzdWx0KHgpO1xuICAgICAgfVxuICAgICAgY29uc3QgdCA9IHZhbHVlLnRlc3RzID8/IFtdO1xuICAgICAgY29uc3QgcmVzID0gW107XG4gICAgICBpZiAodmFsdWUuY2xlYXIpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcmVzLnB1c2goYXdhaXQgZXhlY1Rlc3QodFtpXSwgb3B0aW9ucz8udGVzdCwgbG9ncywgdmFsdWUudGltZW91dCwgcGFja2FnZV8ubmFtZSwgb3B0aW9ucy52ZXJib3NlKSk7XG4gICAgICAgICAgZ3Jvay5zaGVsbC5jbG9zZUFsbCgpO1xuICAgICAgICAgIERHLkJhbGxvb24uY2xvc2VBbGwoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgIHJlcy5wdXNoKGF3YWl0IGV4ZWNUZXN0KHRbaV0sIG9wdGlvbnM/LnRlc3QsIGxvZ3MsIHZhbHVlLnRpbWVvdXQsIHBhY2thZ2VfLm5hbWUsIG9wdGlvbnMudmVyYm9zZSkpO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0YSA9IHJlcy5maWx0ZXIoKGQpID0+IGQucmVzdWx0ICE9ICdza2lwcGVkJyk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodmFsdWUuYWZ0ZXIgJiYgIXNraXBwZWQpXG4gICAgICAgICAgYXdhaXQgdmFsdWUuYWZ0ZXIoKTtcbiAgICAgIH0gY2F0Y2ggKHg6IGFueSkge1xuICAgICAgICB2YWx1ZS5hZnRlclN0YXR1cyA9IGdldFJlc3VsdCh4KTtcbiAgICAgIH1cbiAgICAgIC8vIENsZWFyIGFmdGVyIGNhdGVnb3J5XG4gICAgICAvLyBncm9rLnNoZWxsLmNsb3NlQWxsKCk7XG4gICAgICAvLyBERy5CYWxsb29uLmNsb3NlQWxsKCk7XG4gICAgICBpZiAodmFsdWUuYWZ0ZXJTdGF0dXMpXG4gICAgICAgIGRhdGEucHVzaCh7Y2F0ZWdvcnk6IGtleSwgbmFtZTogJ2FmdGVyJywgcmVzdWx0OiB2YWx1ZS5hZnRlclN0YXR1cywgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZX0pO1xuICAgICAgaWYgKHZhbHVlLmJlZm9yZVN0YXR1cylcbiAgICAgICAgZGF0YS5wdXNoKHtjYXRlZ29yeToga2V5LCBuYW1lOiAnYmVmb3JlJywgcmVzdWx0OiB2YWx1ZS5iZWZvcmVTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlLCBtczogMCwgc2tpcHBlZDogZmFsc2V9KTtcbiAgICAgIHJlc3VsdHMucHVzaCguLi5kYXRhKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVzZXRDb25zb2xlKCk7XG4gIH1cbiAgaWYgKG9wdGlvbnMudGVzdENvbnRleHQuY2F0Y2hVbmhhbmRsZWQpIHtcbiAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICBpZiAoZ3Jvay5zaGVsbC5sYXN0RXJyb3IubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgY2F0ZWdvcnk6ICdVbmhhbmRsZWQgZXhjZXB0aW9ucycsXG4gICAgICAgIG5hbWU6ICdleGNlcHRpb25zJyxcbiAgICAgICAgcmVzdWx0OiBncm9rLnNoZWxsLmxhc3RFcnJvciwgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmICghb3B0aW9ucy50ZXN0ICYmIHJlc3VsdHMubGVuZ3RoKSB7XG4gICAgY29uc3Qgc3VjY2Vzc2Z1bCA9IHJlc3VsdHMuZmlsdGVyKChyKSA9PiByLnN1Y2Nlc3MpLmxlbmd0aDtcbiAgICBjb25zdCBza2lwcGVkID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuc2tpcHBlZCkubGVuZ3RoO1xuICAgIGNvbnN0IGZhaWxlZCA9IHJlc3VsdHMuZmlsdGVyKChyKSA9PiAhci5zdWNjZXNzKTtcbiAgICBjb25zdCBwYWNrYWdlTmFtZSA9IHBhY2thZ2VfLm5hbWU7XG4gICAgZm9yIChjb25zdCBjYXQgb2YgY2F0ZWdvcmllcykge1xuICAgICAgY29uc3QgcmVzID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuY2F0ZWdvcnkgPT09IGNhdCk7XG4gICAgICBjb25zdCBmYWlsZWRfID0gcmVzLmZpbHRlcigocikgPT4gIXIuc3VjY2VzcykubGVuZ3RoO1xuICAgICAgY29uc3QgcGFyYW1zID0ge3N1Y2Nlc3M6IGZhaWxlZF8gPT09IDAsXG4gICAgICAgIHBhc3NlZDogcmVzLmZpbHRlcigocikgPT4gci5zdWNjZXNzKS5sZW5ndGgsXG4gICAgICAgIHNraXBwZWQ6IHJlcy5maWx0ZXIoKHIpID0+IHIuc2tpcHBlZCkubGVuZ3RoLFxuICAgICAgICBmYWlsZWQ6IGZhaWxlZF8sXG4gICAgICAgIHR5cGU6ICdwYWNrYWdlJywgcGFja2FnZU5hbWUsIGNhdGVnb3J5OiBjYXR9O1xuICAgICAgZ3Jvay5sb2cudXNhZ2UoYCR7cGFja2FnZU5hbWV9OiAke2NhdH1gLFxuICAgICAgICBwYXJhbXMsIGBjYXRlZ29yeS1wYWNrYWdlICR7cGFja2FnZU5hbWV9OiAke2NhdH1gKTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmNhdGVnb3J5KSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7c3VjY2VzczogZmFpbGVkLmxlbmd0aCA9PT0gMCwgcGFzc2VkOiBzdWNjZXNzZnVsLCBza2lwcGVkLCBmYWlsZWQ6IGZhaWxlZC5sZW5ndGgsXG4gICAgICAgIHR5cGU6ICdwYWNrYWdlJywgcGFja2FnZU5hbWV9O1xuICAgICAgZ3Jvay5sb2cudXNhZ2UocGFja2FnZU5hbWUsIHBhcmFtcywgYHBhY2thZ2UtcGFja2FnZSAke3BhY2thZ2VOYW1lfWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50ZXN0Q29udGV4dC5yZXBvcnQpIHtcbiAgICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBERy5Mb2dnZXIoKTtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gJ1BhY2thZ2UgQHBhY2thZ2UgdGVzdGVkOiBAc3VjY2Vzc2Z1bCBzdWNjZXNzZnVsLCBAc2tpcHBlZCBza2lwcGVkLCBAZmFpbGVkIGZhaWxlZCB0ZXN0cyc7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIHN1Y2Nlc3NmdWw6IHN1Y2Nlc3NmdWwsXG4gICAgICAgIHNraXBwZWQ6IHNraXBwZWQsXG4gICAgICAgIGZhaWxlZDogZmFpbGVkLmxlbmd0aCxcbiAgICAgICAgcGFja2FnZTogcGFja2FnZV9cbiAgICAgIH07XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgZmFpbGVkKSBPYmplY3QuYXNzaWduKHBhcmFtcywge1tgJHtyLmNhdGVnb3J5fSB8ICR7ci5uYW1lfWBdOiByLnJlc3VsdH0pO1xuICAgICAgbG9nZ2VyLmxvZyhkZXNjcmlwdGlvbiwgcGFyYW1zLCAncGFja2FnZS10ZXN0ZWQnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIGdldFJlc3VsdCh4OiBhbnkpIHtcbiAgcmV0dXJuIGAke3gudG9TdHJpbmcoKX1cXG4ke3guc3RhY2sgPyBERy5Mb2dnZXIudHJhbnNsYXRlU3RhY2tUcmFjZSh4LnN0YWNrKSA6ICcnfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWNUZXN0KHQ6IFRlc3QsIHByZWRpY2F0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBsb2dzOiBhbnlbXSxcbiAgY2F0ZWdvcnlUaW1lb3V0PzogbnVtYmVyLCBwYWNrYWdlTmFtZT86IHN0cmluZywgdmVyYm9zZT86IGJvb2xlYW4pIHtcbiAgbG9ncy5sZW5ndGggPSAwO1xuICBsZXQgcjoge2NhdGVnb3J5Pzogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBzdWNjZXNzOiBib29sZWFuLCByZXN1bHQ6IGFueSwgbXM6IG51bWJlciwgc2tpcHBlZDogYm9vbGVhbiwgbG9ncz86IHN0cmluZ307XG4gIGxldCB0eXBlOiBzdHJpbmcgPSAncGFja2FnZSc7XG4gIGNvbnN0IGZpbHRlciA9IHByZWRpY2F0ZSAhPSB1bmRlZmluZWQgJiYgKHQubmFtZS50b0xvd2VyQ2FzZSgpICE9PSBwcmVkaWNhdGUudG9Mb3dlckNhc2UoKSk7XG4gIGNvbnN0IHNraXAgPSB0Lm9wdGlvbnM/LnNraXBSZWFzb24gfHwgZmlsdGVyO1xuICBjb25zdCBza2lwUmVhc29uID0gZmlsdGVyID8gJ3NraXBwZWQnIDogdC5vcHRpb25zPy5za2lwUmVhc29uO1xuICBpZiAoIXNraXApXG4gICAgc3RkTG9nKGBTdGFydGVkICR7dC5jYXRlZ29yeX0gJHt0Lm5hbWV9YCk7XG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgdHJ5IHtcbiAgICBpZiAoc2tpcClcbiAgICAgIHIgPSB7c3VjY2VzczogdHJ1ZSwgcmVzdWx0OiBza2lwUmVhc29uISwgbXM6IDAsIHNraXBwZWQ6IHRydWV9O1xuICAgIGVsc2Uge1xuICAgICAgbGV0IHRpbWVvdXRfID0gdC5vcHRpb25zPy50aW1lb3V0ID09PSBTVEFOREFSVF9USU1FT1VUICYmXG4gICAgICAgIGNhdGVnb3J5VGltZW91dCA/IGNhdGVnb3J5VGltZW91dCA6IHQub3B0aW9ucz8udGltZW91dCE7XG4gICAgICB0aW1lb3V0XyA9IERHLlRlc3QuaXNJbkJlbmNobWFyayAmJiB0aW1lb3V0XyA9PT0gU1RBTkRBUlRfVElNRU9VVCA/IEJFTkNITUFSS19USU1FT1VUIDogdGltZW91dF87XG4gICAgICByID0ge3N1Y2Nlc3M6IHRydWUsIHJlc3VsdDogYXdhaXQgdGltZW91dCh0LnRlc3QsIHRpbWVvdXRfKSA/PyAnT0snLCBtczogMCwgc2tpcHBlZDogZmFsc2V9O1xuICAgIH1cbiAgfSBjYXRjaCAoeDogYW55KSB7XG4gICAgciA9IHtzdWNjZXNzOiBmYWxzZSwgcmVzdWx0OiBnZXRSZXN1bHQoeCksIG1zOiAwLCBza2lwcGVkOiBmYWxzZX07XG4gIH1cbiAgaWYgKHQub3B0aW9ucz8uaXNBZ2dyZWdhdGVkICYmIHIucmVzdWx0LmNvbnN0cnVjdG9yID09PSBERy5EYXRhRnJhbWUpIHtcbiAgICBjb25zdCBjb2wgPSByLnJlc3VsdC5jb2woJ3N1Y2Nlc3MnKTtcbiAgICB0eXBlID0gJ2NvcmUnO1xuICAgIGlmIChjb2wpXG4gICAgICByLnN1Y2Nlc3MgPSBjb2wuc3RhdHMuc3VtID09PSBjb2wubGVuZ3RoO1xuICAgIGlmICghdmVyYm9zZSkge1xuICAgICAgY29uc3QgZGYgPSByLnJlc3VsdDtcbiAgICAgIGRmLmNvbHVtbnMucmVtb3ZlKCdzdGFjaycpO1xuICAgICAgZGYucm93cy5yZW1vdmVXaGVyZSgocikgPT4gci5nZXQoJ3N1Y2Nlc3MnKSk7XG4gICAgICByLnJlc3VsdCA9IGRmO1xuICAgIH1cbiAgICByLnJlc3VsdCA9IHIucmVzdWx0LnRvQ3N2KCk7XG4gIH1cbiAgci5sb2dzID0gbG9ncy5qb2luKCdcXG4nKTtcbiAgci5tcyA9IERhdGUubm93KCkgLSBzdGFydDtcbiAgaWYgKCFza2lwKVxuICAgIHN0ZExvZyhgRmluaXNoZWQgJHt0LmNhdGVnb3J5fSAke3QubmFtZX0gZm9yICR7ci5tc30gbXNgKTtcbiAgci5jYXRlZ29yeSA9IHQuY2F0ZWdvcnk7XG4gIHIubmFtZSA9IHQubmFtZTtcbiAgaWYgKCFmaWx0ZXIpIHtcbiAgICBsZXQgcGFyYW1zID0geydzdWNjZXNzJzogci5zdWNjZXNzLCAncmVzdWx0Jzogci5yZXN1bHQsICdtcyc6IHIubXMsICdza2lwcGVkJzogci5za2lwcGVkLFxuICAgICAgJ3R5cGUnOiB0eXBlLCBwYWNrYWdlTmFtZSwgJ2NhdGVnb3J5JzogdC5jYXRlZ29yeSwgJ3Rlc3QnOiB0Lm5hbWUsICdsb2dzJzogci5sb2dzfTtcbiAgICBpZiAoci5yZXN1bHQuY29uc3RydWN0b3IgPT0gT2JqZWN0KSB7XG4gICAgICBjb25zdCByZXMgPSBPYmplY3Qua2V5cyhyLnJlc3VsdCkucmVkdWNlKChhY2MsIGspID0+ICh7Li4uYWNjLCBbJ3Jlc3VsdC4nICsga106IHIucmVzdWx0W2tdfSksIHt9KTtcbiAgICAgIHBhcmFtcyA9IHsuLi5wYXJhbXMsIC4uLnJlc307XG4gICAgfVxuICAgIGdyb2subG9nLnVzYWdlKGAke3BhY2thZ2VOYW1lfTogJHt0LmNhdGVnb3J5fTogJHt0Lm5hbWV9YCxcbiAgICAgIHBhcmFtcywgYHRlc3QtJHt0eXBlfSAke3BhY2thZ2VOYW1lfTogJHt0LmNhdGVnb3J5fTogJHt0Lm5hbWV9YCk7XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5cbi8qIFdhaXRzIFttc10gbWlsbGlzZWNvbmRzICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcikge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRDaGVjayhjaGVja0hhbmRsZXI6ICgpID0+IGJvb2xlYW4sXG4gIGVycm9yOiBzdHJpbmcgPSAnVGltZW91dCBleGNlZWRlZCcsIHdhaXQ6IG51bWJlciA9IDUwMCwgaW50ZXJ2YWw6IG51bWJlciA9IDUwKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihlcnJvcikpO1xuICAgIH0sIHdhaXQpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBpbnRlcnZhbElkOiBUaW1lb3V0ID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKGNoZWNrSGFuZGxlcigpKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9LCBpbnRlcnZhbCk7XG4gIH0pO1xufVxuXG4vLyBSZXR1cm5zIHRlc3QgZXhlY3V0aW9uIHJlc3VsdCBvciBhbiBlcnJvciBpbiBjYXNlIG9mIHRpbWVvdXRcbmFzeW5jIGZ1bmN0aW9uIHRpbWVvdXQoZnVuYzogKCkgPT4gUHJvbWlzZTxhbnk+LCB0ZXN0VGltZW91dDogbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcbiAgbGV0IHRpbWVvdXQ6IGFueSA9IG51bGw7XG4gIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8YW55PigoXywgcmVqZWN0KSA9PiB7XG4gICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdCgnRVhFQ1VUSU9OIFRJTUVPVVQnKTtcbiAgICB9LCB0ZXN0VGltZW91dCk7XG4gIH0pO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UoW2Z1bmMoKSwgdGltZW91dFByb21pc2VdKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAodGltZW91dClcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEaWFsb2dQcmVzZW50KGRpYWxvZ1RpdGxlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZGlhbG9ncyA9IERHLkRpYWxvZy5nZXRPcGVuRGlhbG9ncygpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpYWxvZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZGlhbG9nc1tpXS50aXRsZSA9PSBkaWFsb2dUaXRsZSlcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqIEV4cGVjdHMgYW4gYXN5bmNocm9ub3VzIHtAbGluayBhY3Rpb259IHRvIHRocm93IGFuIGV4Y2VwdGlvbi4gVXNlIHtAbGluayBjaGVja30gdG8gcGVyZm9ybVxuICogZGVlcGVyIGluc3BlY3Rpb24gb2YgdGhlIGV4Y2VwdGlvbiBpZiBuZWNlc3NhcnkuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbigpOiBQcm9taXNlPHZvaWQ+fSBhY3Rpb25cbiAqIEBwYXJhbSAge2Z1bmN0aW9uKGFueSk6IGJvb2xlYW59IGNoZWNrXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwZWN0RXhjZXB0aW9uQXN5bmMoYWN0aW9uOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICBjaGVjaz86IChleGNlcHRpb246IGFueSkgPT4gYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgY2F1Z2h0OiBib29sZWFuID0gZmFsc2U7XG4gIGxldCBjaGVja2VkOiBib29sZWFuID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgYXdhaXQgYWN0aW9uKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjYXVnaHQgPSB0cnVlO1xuICAgIGNoZWNrZWQgPSAhY2hlY2sgfHwgY2hlY2soZSk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKCFjYXVnaHQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIGV4Y2VwdGlvbiBpcyBleHBlY3RlZCBidXQgbm90IHRocm93bicpO1xuICAgIGlmICghY2hlY2tlZClcbiAgICAgIHRocm93IG5ldyBFcnJvcignQW4gZXhwZWN0ZWQgZXhjZXB0aW9uIGlzIHRocm93biwgYnV0IGl0IGRvZXMgbm90IHNhdGlzZnkgdGhlIGNvbmRpdGlvbicpO1xuICB9XG59XG5cbmNvbnN0IGNhdERGID0gREcuRGF0YUZyYW1lLmZyb21Db2x1bW5zKFtERy5Db2x1bW4uZnJvbVN0cmluZ3MoJ2NvbCcsIFsndmFsMScsICd2YWwyJywgJ3ZhbDMnXSldKTtcblxuLyoqXG4gKiBVbml2ZXJzYWwgdGVzdCBmb3Igdmlld2Vycy4gSXQgc2VhcmNoIHZpZXdlcnMgaW4gRE9NIGJ5IHRhZ3M6IGNhbnZhcywgc3ZnLCBpbWcsIGlucHV0LCBoMSwgYVxuICogQHBhcmFtICB7c3RyaW5nfSB2IFZpZXdlciBuYW1lXG4gKiBAcGFyYW0gIHtERy5EYXRhRnJhbWV9IGRmIERhdGFmcmFtZSB0byB1c2UuIFNob3VsZCBoYXZlIGF0IGxlYXN0IDMgcm93c1xuICogQHBhcmFtICB7Ym9vbGVhbn0gb3B0aW9ucy5kZXRlY3RTZW1hbnRpY1R5cGVzIFNwZWNpZnkgd2hldGhlciB0byBkZXRlY3Qgc2VtYW50aWMgdHlwZXMgb3Igbm90XG4gKiBAcGFyYW0gIHtib29sZWFufSBvcHRpb25zLnJlYWRPbmx5IElmIHNldCB0byB0cnVlLCB0aGUgZGF0YWZyYW1lIHdpbGwgbm90IGJlIG1vZGlmaWVkIGR1cmluZyB0aGUgdGVzdFxuICogQHBhcmFtICB7Ym9vbGVhbn0gb3B0aW9ucy5hcmJpdHJhcnlEZlRlc3QgSWYgc2V0IHRvIGZhbHNlLCB0ZXN0IG9uIGFyYml0cmFyeSBkYXRhZnJhbWVcbiAqIChvbmUgY2F0ZWdvcmljYWwgY29sdW1uKSB3aWxsIG5vdCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSAge29iamVjdH0gb3B0aW9ucyBMaXN0IG9mIG9wdGlvbnMgKG9wdGlvbmFsKVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gVGhlIHRlc3QgaXMgY29uc2lkZXJlZCBzdWNjZXNzZnVsIGlmIGl0IGNvbXBsZXRlcyB3aXRob3V0IGVycm9yc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdFZpZXdlcih2OiBzdHJpbmcsIGRmOiBERy5EYXRhRnJhbWUsIG9wdGlvbnM/OiB7XG4gIGRldGVjdFNlbWFudGljVHlwZXM/OiBib29sZWFuLCByZWFkT25seT86IGJvb2xlYW4sIGFyYml0cmFyeURmVGVzdD86IGJvb2xlYW4sXG4gIHBhY2thZ2VOYW1lPzogc3RyaW5nLCBhd2FpdFZpZXdlcj86ICh2aWV3ZXI6IERHLlZpZXdlcikgPT4gUHJvbWlzZTx2b2lkPlxufSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjcmVhdGVWaWV3ZXIgPSBhc3luYyAodHY6IERHLlRhYmxlVmlldywgdjogc3RyaW5nLCBwYWNrYWdlTmFtZT86IHN0cmluZyk6IFByb21pc2U8REcuVmlld2VyPiA9PiB7XG4gICAgbGV0IHJlczogREcuVmlld2VyO1xuICAgIGlmIChwYWNrYWdlTmFtZSkge1xuICAgICAgcmVzID0gYXdhaXQgdHYuZGF0YUZyYW1lLnBsb3QuZnJvbVR5cGUodikgYXMgREcuVmlld2VyO1xuICAgICAgdHYuZG9ja01hbmFnZXIuZG9jayhyZXMpO1xuICAgIH0gZWxzZVxuICAgICAgcmVzID0gdHYuYWRkVmlld2VyKHYpO1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgaWYgKG9wdGlvbnM/LmRldGVjdFNlbWFudGljVHlwZXMpIGF3YWl0IGdyb2suZGF0YS5kZXRlY3RTZW1hbnRpY1R5cGVzKGRmKTtcbiAgbGV0IHR2ID0gZ3Jvay5zaGVsbC5hZGRUYWJsZVZpZXcoZGYpO1xuICBjb25zdCB2aWV3ZXJOYW1lID0gYFtuYW1lPXZpZXdlci0ke3YucmVwbGFjZSgvXFxzKy9nLCAnLScpfSBpXWA7XG4gIC8vIGNvbnN0IHNlbGVjdG9yID0gYCR7dmlld2VyTmFtZX0gY2FudmFzLCR7dmlld2VyTmFtZX0gc3ZnLCR7dmlld2VyTmFtZX0gaW1nLFxuICAvLyAgICR7dmlld2VyTmFtZX0gaW5wdXQsJHt2aWV3ZXJOYW1lfSBoMSwke3ZpZXdlck5hbWV9IGEsJHt2aWV3ZXJOYW1lfSAuZDQtdmlld2VyLWVycm9yYDtcbiAgY29uc3Qgc2VsZWN0b3IgPSBbJ2Rpdi51aS1ib3gnIC8qIHJvb3QgKi8sICdjYW52YXMnLCAnc3ZnJywgJ2ltZycsICdpbnB1dCcsICdoMScsICdhJywgJy5kNC12aWV3ZXItZXJyb3InXVxuICAgIC5tYXAoKHNlbFRhZykgPT4gYCR7dmlld2VyTmFtZX0gJHtzZWxUYWd9YCkuam9pbignLCAnKTtcbiAgY29uc3QgcmVzID0gW107XG4gIHRyeSB7XG4gICAgbGV0IHZpZXdlciA9IGF3YWl0IGNyZWF0ZVZpZXdlcih0diwgdiwgb3B0aW9ucz8ucGFja2FnZU5hbWUpO1xuICAgIGF3YWl0IGF3YWl0Q2hlY2soKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgIT09IG51bGwsXG4gICAgICAnY2Fubm90IGxvYWQgdmlld2VyJywgMzAwMCk7XG4gICAgY29uc3QgdGFnID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik/LnRhZ05hbWU7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIGlmICghb3B0aW9ucz8ucmVhZE9ubHkpIHtcbiAgICAgIEFycmF5LmZyb20oZGYucm93KDApLmNlbGxzKS5mb3JFYWNoKChjOmFueSkgPT4gYy52YWx1ZSA9IG51bGwpO1xuICAgICAgY29uc3QgbnVtID0gZGYucm93Q291bnQgPCAyMCA/IE1hdGguZmxvb3IoZGYucm93Q291bnQgLyAyKSA6IDEwO1xuICAgICAgZGYucm93cy5zZWxlY3QoKHJvdzogREcuUm93KSA9PiByb3cuaWR4ID49IDAgJiYgcm93LmlkeCA8IG51bSk7XG4gICAgICBhd2FpdCBkZWxheSg1MCk7XG4gICAgICBmb3IgKGxldCBpID0gbnVtOyBpIDwgbnVtICogMjsgaSsrKSBkZi5maWx0ZXIuc2V0KGksIGZhbHNlKTtcbiAgICAgIGF3YWl0IGRlbGF5KDUwKTtcbiAgICAgIGRmLmN1cnJlbnRSb3dJZHggPSAxO1xuICAgICAgY29uc3QgZGYxID0gZGYuY2xvbmUoKTtcbiAgICAgIGRmLmNvbHVtbnMubmFtZXMoKS5zbGljZSgwLCBNYXRoLmNlaWwoZGYuY29sdW1ucy5sZW5ndGggLyAyKSkuZm9yRWFjaCgoYzogYW55KSA9PiBkZi5jb2x1bW5zLnJlbW92ZShjKSk7XG4gICAgICBhd2FpdCBkZWxheSgxMDApO1xuICAgICAgdHYuZGF0YUZyYW1lID0gZGYxO1xuICAgIH1cbiAgICBsZXQgb3B0bnM6IHsgW3A6IHN0cmluZ106IGFueSB9O1xuICAgIHRyeSB7XG4gICAgICBvcHRucyA9IHZpZXdlci5nZXRPcHRpb25zKHRydWUpLmxvb2s7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVmlld2VyJ3MgLmdldE9wdGlvbnMoKSBlcnJvci5gLCB7Y2F1c2U6IGVycn0pO1xuICAgIH1cbiAgICBsZXQgcHJvcHM6IERHLlByb3BlcnR5W107XG4gICAgdHJ5IHtcbiAgICAgIHByb3BzID0gdmlld2VyLmdldFByb3BlcnRpZXMoKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBWaWV3ZXIncyAuZ2V0UHJvcGVydGllcygpIGVycm9yLmAsIHtjYXVzZTogZXJyfSk7XG4gICAgfVxuICAgIGNvbnN0IG5ld1Byb3BzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuPiA9IHt9O1xuICAgIE9iamVjdC5rZXlzKG9wdG5zKS5maWx0ZXIoKGspID0+IHR5cGVvZiBvcHRuc1trXSA9PT0gJ2Jvb2xlYW4nKS5mb3JFYWNoKChrKSA9PiBuZXdQcm9wc1trXSA9ICFvcHRuc1trXSk7XG4gICAgcHJvcHMuZmlsdGVyKChwOiBERy5Qcm9wZXJ0eSkgPT4gcC5jaG9pY2VzICE9PSBudWxsKVxuICAgICAgLmZvckVhY2goKHA6IERHLlByb3BlcnR5KSA9PiBuZXdQcm9wc1twLm5hbWVdID0gcC5jaG9pY2VzLmZpbmQoKGM6IGFueSkgPT4gYyAhPT0gb3B0bnNbcC5uYW1lXSkhKTtcbiAgICB2aWV3ZXIuc2V0T3B0aW9ucyhuZXdQcm9wcyk7XG4gICAgYXdhaXQgZGVsYXkoMzAwKTtcbiAgICBjb25zdCBsYXlvdXQgPSB0di5zYXZlTGF5b3V0KCk7XG4gICAgY29uc3Qgb2xkUHJvcHMgPSB2aWV3ZXIuZ2V0T3B0aW9ucygpLmxvb2s7XG4gICAgdHYucmVzZXRMYXlvdXQoKTtcbiAgICByZXMucHVzaChBcnJheS5mcm9tKHR2LnZpZXdlcnMpLmxlbmd0aCk7XG4gICAgdHYubG9hZExheW91dChsYXlvdXQpO1xuICAgIGNvbnN0IHNlbGVjdG9yMSA9IGAke3ZpZXdlck5hbWV9ICR7dGFnfWA7XG4gICAgYXdhaXQgYXdhaXRDaGVjaygoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yMSkgIT09IG51bGwsXG4gICAgICAnY2Fubm90IGxvYWQgdmlld2VyIGZyb20gbGF5b3V0JywgMzAwMCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIHZpZXdlciA9IEFycmF5LmZyb20odHYudmlld2VycykuZmluZCgodjogYW55KSA9PiB2LnR5cGUgIT09ICdHcmlkJykhO1xuICAgIGV4cGVjdEFycmF5KHJlcywgWzIsIDEsIDJdKTtcbiAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkodmlld2VyLmdldE9wdGlvbnMoKS5sb29rKSwgSlNPTi5zdHJpbmdpZnkob2xkUHJvcHMpKTtcbiAgICBpZiAob3B0aW9ucz8uYXJiaXRyYXJ5RGZUZXN0ICE9PSBmYWxzZSkge1xuICAgICAgaWYgKG9wdGlvbnM/LmF3YWl0Vmlld2VyKSBhd2FpdCBvcHRpb25zLmF3YWl0Vmlld2VyKHZpZXdlcik7XG4gICAgICBncm9rLnNoZWxsLmNsb3NlQWxsKCk7XG5cbiAgICAgIGF3YWl0IGRlbGF5KDEwMCk7XG4gICAgICB0diA9IGdyb2suc2hlbGwuYWRkVGFibGVWaWV3KGNhdERGKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZpZXdlciA9IGF3YWl0IGNyZWF0ZVZpZXdlcih0diwgdiwgb3B0aW9ucz8ucGFja2FnZU5hbWUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBncm9rLnNoZWxsLmNsb3NlQWxsKCk7XG4gICAgICAgIERHLkJhbGxvb24uY2xvc2VBbGwoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXdhaXQgYXdhaXRDaGVjaygoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSAhPT0gbnVsbCxcbiAgICAgICAgJ2Nhbm5vdCBsb2FkIHZpZXdlciBvbiBhcmJpdHJhcnkgZGF0YXNldCcsIDMwMDApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucz8uYXdhaXRWaWV3ZXIpIGF3YWl0IG9wdGlvbnMuYXdhaXRWaWV3ZXIodmlld2VyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBjbG9zZUFsbCgpIGlzIGhhbmRsaW5nIGJ5IGNvbW1vbiB0ZXN0IHdvcmtmbG93XG4gICAgLy8gZ3Jvay5zaGVsbC5jbG9zZUFsbCgpO1xuICAgIC8vIERHLkJhbGxvb24uY2xvc2VBbGwoKTtcbiAgfVxufVxuIl19","import * as DG from 'datagrok-api/dg';\n\nimport {\n RGROUP_CAP_GROUP_NAME,\n RGROUP_CAP_GROUP_SMILES,\n jsonSdfMonomerLibDict,\n MONOMER_SYMBOL,\n RGROUP_ALTER_ID,\n RGROUPS,\n RGROUP_LABEL,\n SDF_MONOMER_NAME\n} from '../constants';\n\n// Global flag is for replaceAll\nconst helmGapStartRe = /\\{(\\*\\.)+/g;\nconst helmGapIntRe = /\\.(\\*\\.)+/g;\nconst helmGapEndRe = /(\\.\\*)+\\}/g;\n\nexport function removeGapsFromHelm(srcHelm: string): string {\n return srcHelm.replaceAll(helmGapStartRe, '{').replaceAll(helmGapIntRe, '.')\n .replaceAll(helmGapEndRe, '}').replace('{*}', '{}');\n}\n\nexport function getParts(subParts: string[], s: string): string[] {\n const j = 0;\n const allParts: string[] = [];\n for (let k = 0; k < subParts.length; ++k) {\n const indexOfMonomer = s.indexOf(subParts[k]);\n const helmBeforeMonomer = s.slice(j, indexOfMonomer);\n allParts.push(helmBeforeMonomer);\n allParts.push(subParts[k]);\n s = s.substring(indexOfMonomer + subParts[k].length);\n }\n allParts.push(s);\n return allParts;\n}\n\nexport function parseHelm(s: string): string[] {\n const sections = split(s, '$');\n s = sections[0];\n const monomers = [];\n //@ts-ignore\n if (!scil.Utils.isNullOrEmpty(s)) {\n const seqs = split(s, '|');\n for (let i = 0; i < seqs.length; ++i) {\n const e = detachAnnotation(seqs[i]);\n s = e.str;\n\n let p = s.indexOf('{');\n\n s = s.substring(p + 1);\n p = s.indexOf('}');\n s = s.substring(0, p);\n\n const ss = split(s, '.');\n for (const monomer of ss) {\n if (!monomer || monomer === '') continue;\n if (monomer.startsWith('[') && monomer.includes(']')) {\n const closingIndex = findClosing(monomer, 1, '[', ']');\n const element = monomer.substring(1, closingIndex);\n monomers.push(element);\n const residue = monomer.substring(closingIndex + 1);\n ss.push(residue);\n } else if (monomer.includes('[') && monomer.endsWith(']')) {\n const openingIndex = findOpening(monomer, monomer.length - 2, '[', ']');\n const element = monomer.substring(openingIndex + 1, monomer.length - 1);\n monomers.push(element);\n const residue = monomer.substring(0, openingIndex);\n ss.push(residue);\n } else if (monomer.includes('(') && monomer.includes(')')) {\n // here we only want to split the string at first '(' and last ')'\n // because entries like [L-hArg(Et,Et)]([L-hArg(Et,Et)]) where L-hArg(Et,Et) is a single monomer\n const firstPiece = monomer.substring(0, monomer.indexOf('('));\n const thirdPiece = monomer.substring(monomer.lastIndexOf(')') + 1);\n const secondPiece = monomer.substring(firstPiece.length + 1, monomer.length - thirdPiece.length - 1);\n const elements = [firstPiece, secondPiece, thirdPiece];\n for (const el of elements)\n ss.push(el);\n } else\n monomers.push(monomer);\n }\n }\n }\n return monomers;\n}\n\n// /** Find monomers missed in Helm monomer library configured and\n// * used in org.helm.webeditor / scil.helm.Monomers / org.helm.webeditor.Monomers .\n// */\n// export function findMonomers(helmString: string) {\n// //@ts-ignore\n// const types: string[] = Object.keys(org.helm.webeditor.monomerTypeList());\n// const monomerNameList: any[] = [];\n// const monomerNameI: number = 0;\n// const weMonomers = org.helm.webeditor.Monomers;\n// for (let typeI = 0; typeI < types.length; typeI++) {\n// //@ts-ignore\n// const ofTypeMonomers: {} = weMonomers.getMonomerSet(types[typeI]) ?? {};\n// Object.keys(ofTypeMonomers).forEach((key) => {\n// const monomer: any = ofTypeMonomers[key];\n// monomerNameList[monomerNameI] = monomer.id;\n// monomerNameI += 1;\n// });\n// }\n// const helmPartList = parseHelm(helmString);\n// return new Set(helmPartList.filter((val) => !monomerNameList.includes(val)));\n// }\n\n/** Searches monomers of helmString for missed. */\nexport function findMonomers(monomerSymbolList: string[]): Set<string> {\n const types = Object.keys(org.helm.webeditor.monomerTypeList());\n const monomers: any = [];\n const monomerNames: any = [];\n for (let i = 0; i < types.length; i++) {\n //@ts-ignore\n // eslint-disable-next-line new-cap\n monomers.push(new scil.helm.Monomers.getMonomerSet(types[i]));\n Object.keys(monomers[i]).forEach((k) => {\n monomerNames.push(monomers[i][k].id);\n });\n }\n return new Set(monomerSymbolList.filter((val) => !monomerNames.includes(val)));\n}\n\nfunction findClosing(s: string, start: number, open: string, close: string) {\n let i = start;\n let count = 0;\n while (i < s.length) {\n if (s[i] === open)\n count++;\n\n if (s[i] === close) {\n if (count === 0)\n return i;\n count--;\n }\n i++;\n }\n return -1;\n}\n\nfunction findOpening(s: string, start: number, open: string, close: string) {\n let i = start;\n let count = 0;\n while (i >= 0) {\n if (s[i] === close)\n count++;\n\n if (s[i] === open) {\n if (count === 0)\n return i;\n count--;\n }\n i--;\n }\n return -1;\n}\n\nfunction split(s: string, sep: string) {\n const ret = [];\n let frag = '';\n let parentheses = 0;\n let bracket = 0;\n let braces = 0;\n let quote = 0;\n for (let i = 0; i < s.length; ++i) {\n let c = s.substring(i, i + 1);\n if (c == sep && bracket == 0 && parentheses == 0 && braces == 0 && quote == 0) {\n ret.push(frag);\n frag = '';\n } else {\n frag += c;\n if (quote > 0) {\n if (c == '\\\\' && i + 1 < s.length) {\n ++i;\n const c2 = s.substring(i, i + 1);\n frag += c2;\n c += c2;\n }\n }\n if (c == '\\\"') {\n if (!(i > 0 && s.substring(i - 1, i) == '\\\\'))\n quote = quote == 0 ? 1 : 0;\n } else if (c == '[')\n ++bracket;\n else if (c == ']')\n --bracket;\n else if (c == '(')\n ++parentheses;\n else if (c == ')')\n --parentheses;\n else if (c == '{')\n ++braces;\n else if (c == '}')\n --braces;\n }\n }\n ret.push(frag);\n return ret;\n}\n\nfunction detachAnnotation(s: string) {\n const ret = _detachAppendix(s, '\\\"');\n if (ret.tag != null)\n return ret;\n\n const r = _detachAppendix(s, '\\'');\n return {tag: ret.tag, repeat: r.tag, str: r.str};\n}\n\nfunction _detachAppendix(s: string, c: string) {\n let tag = null;\n //@ts-ignore\n if (scil.Utils.endswith(s, c)) {\n let p = s.length - 1;\n while (p > 0) {\n p = s.lastIndexOf(c, p - 1);\n if (p <= 0 || s.substring(p - 1, p) != '\\\\')\n break;\n }\n\n if (p > 0 && p < s.length - 1) {\n tag = s.substring(p + 1, s.length - 1);\n s = s.substring(0, p);\n }\n }\n if (tag != null)\n tag = unescape(tag.replace(new RegExp('\\\\' + c, 'g'), c));\n return {tag: tag, str: s};\n}\n\nfunction unescape(s: string) {\n //@ts-ignore\n if (scil.Utils.isNullOrEmpty(s))\n return s;\n\n return s.replace(/[\\\\]./g, function(m) {\n switch (m) {\n case '\\\\r':\n return '\\r';\n case '\\\\n':\n return '\\n';\n case '\\\\t':\n return '\\t';\n default:\n return m.substring(1);\n }\n });\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {after, before, category, delay, expect, test, expectArray} from '@datagrok-libraries/utils/src/test';\n//import {findMonomers, helmToFasta, helmToPeptide, helmToRNA, initHelm} from '../package';\nimport {parseHelm} from '../utils';\n\nimport {_package} from '../package-test';\n\ncategory('Helm', () => {\n //These tests require webservice that is not present on test stand\n // test('helmToFasta', async () => {\n // expect(await helmToFasta('RNA1{R(U)P.R(T)P.R(G)P.R(C)P.R(A)}$$$$'), '>RNA1UTGCA');\n // expect(await helmToFasta('RNA1{P.R(U).P.R(T)}$$$$'), '>RNA1UT');\n // expect(await helmToFasta('PEPTIDE1{A.G}$$$$V2.0'), '>PEPTIDE1AG');\n // });\n //\n // test('helmToRNA', async () => {\n // expect(await helmToRNA('RNA1{R(U)P.R(T)P.R(G)P.R(C)P.R(A)}$$$$'), 'UTGCA');\n // expect(await helmToRNA('RNA1{P.R(U).P.R(T)}$$$$'), 'UT');\n // // eslint-disable-next-line max-len\n // expect(\n // await helmToRNA('RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$'), 'UT AA'\n // );\n // });\n //\n // test('helmToPeptide', async () => {\n // expect(await helmToPeptide('PEPTIDE1{A.G}$$$$V2.0'), 'AG');\n // expect(await helmToPeptide('PEPTIDE1{L.V.A}|PEPTIDE2{L.V.A}$$$$'), 'LVA LVA');\n // // eslint-disable-next-line max-len\n // expect(await helmToPeptide('PEPTIDE1{A.R.C.A.A.K.T.C.D.A}$PEPTIDE1,PEPTIDE1,8:R3-3:R3$$$'), 'ARCAAKTCDA');\n // });\n\n // detectMacromolecule is a function of Bio package\n // test('detectMacromolecule', async () => {\n // const file = await _package.files.readAsText('tests/test.csv');\n // const df = DG.DataFrame.fromCsv(file);\n // const col = df.columns.byName('HELM string');\n // await grok.data.detectSemanticTypes(df);\n // expect(col.semType, DG.SEMTYPE.MACROMOLECULE);\n // });\n\n // semType and units tags are detecting by Bio package function detectMacromolecule\n // test('detectHelm', async () => {\n // const file = await _package.files.readAsText('tests/test.csv');\n // const df = DG.DataFrame.fromCsv(file);\n // const col = df.columns.byName('HELM string');\n // await grok.data.detectSemanticTypes(df);\n // expect(col.tags[DG.TAGS.UNITS], 'HELM');\n // });\n\n const complexMonomers = [\n // tests parsing of complex monomemer in square brackets like [L-hArg(Et,Et)]\n 'PEPTIDE1{[L-hArg(Et,Et)].E.F.G}|PEPTIDE2{C.E}$PEPTIDE1,PEPTIDE2,2:R3-1:R1$$$V2.0',\n // tests parsing of complex monomer and one as a side chain as well\n 'PEPTIDE1{[L-hArg(Et,Et)]([L-hArg(Et,Et)]).E.F.G}$$$$',\n // tests parsing of complex monomer and one as a side chain as well\n 'RNA1{[dhp]([m1A])p.r(T)p.r(T)p.r(G)p}$$$$V2.0',\n // tests complex monomer as side chain\n 'RNA1{r([mo6pur])p.r(T)p.r(T)p.r(G)p}$$$$V2.0',\n // test complex monomer, side chain and linker\n 'RNA1{[afhna]([mo6pur])[36SS].r(T)p}$$$$V2.0'\n ];\n\n const complexMonomersExpected = [\n ['L-hArg(Et,Et)', 'E', 'F', 'G', 'C', 'E'],\n ['L-hArg(Et,Et)', 'L-hArg(Et,Et)', 'E', 'F', 'G'],\n ['dhp', 'm1A', 'p', 'r', 'T', 'p', 'r', 'T', 'p', 'r', 'G', 'p'],\n ['r', 'mo6pur', 'p', 'r', 'T', 'p', 'r', 'T', 'p', 'r', 'G', 'p'],\n ['afhna', 'mo6pur', '36SS', 'r', 'T', 'p']\n ];\n\n const complexTestNames = [\n 'comples-monomer', 'complex-monomer+side-chain', 'complex-monomer+side-chain-RNA',\n 'complex-side-chain', 'complex+side-chain+linker'\n ];\n test('parseHelm', async () => {\n const expectedResults = [\n ['meI', 'hHis', 'Aca', 'N', 'T', 'dK', 'Thr_PO3H2', 'D-Tyr_Et', 'Aze', 'dV', 'E', 'Phe_4Me'],\n ['A', 'C', 'T', 'G', 'W', 'E', 'Q'],\n ['R', 'U', 'P', 'T', 'A'],\n ['A', '*', 'G', 'C']\n ];\n const helmStrings = [\n 'PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2.Aca.D-Tyr_Et.Aze.dV.E.N.dV.Phe_4Me}$$$',\n // eslint-disable-next-line max-len\n 'PEPTIDE1{A.C.T.G.C.T.W.G.T.W.E.C.W.C.Q.W}|PEPTIDE2{A.C.T.G.C.T.W.G.T.W.E.Q}$PEPTIDE1,PEPTIDE1,5:R3-14:R3|PEPTIDE2,PEPTIDE1,2:R3-12:R3$$$',\n 'RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$',\n 'PEPTIDE1{A.*.G.C}$$$$V2.0'\n ];\n for (let idx = 0; idx < helmStrings.length; ++idx) {\n const monomerSet = new Set(parseHelm(helmStrings[idx]));\n const monomerArray = Array.from(monomerSet);\n expect(JSON.stringify(monomerArray), JSON.stringify(expectedResults[idx]));\n }\n });\n complexMonomers.forEach((helm, i) => {\n test(complexTestNames[i], async () => {\n const monomersArray = parseHelm(helm);\n monomersArray.sort();\n const expected = complexMonomersExpected[i];\n expected.sort();\n expectArray(monomersArray, expected);\n });\n });\n});\n","// core fields of HELM library object used in toAtomicLevel function\nexport const HELM_CORE_FIELDS = [\n \"symbol\" /* HELM_FIELDS.SYMBOL */,\n \"molfile\" /* HELM_FIELDS.MOLFILE */,\n \"rgroups\" /* HELM_FIELDS.RGROUPS */,\n \"name\" /* HELM_FIELDS.NAME */,\n // HELM_FIELDS.MONOMER_TYPE, // add if terminal monomers for PEPTIDEs to be\n // supported\n];\nexport const SDF_MONOMER_NAME = 'MonomerName';\n// todo: ideally, keys should be expressed via constants\nexport const jsonSdfMonomerLibDict = {\n 'monomerType': null,\n 'smiles': null,\n 'name': 'MonomerName',\n 'author': null,\n 'molfile': 'molecule',\n 'naturalAnalog': 'MonomerNaturalAnalogCode',\n 'rgroups': 'MonomerCaps',\n 'createDate': null,\n 'id': null,\n 'polymerType': 'MonomerType',\n 'symbol': 'MonomerCode'\n};\nexport const DUMMY_MONOMER = {\n 'monomerType': 'Backbone',\n 'smiles': '',\n 'name': '',\n 'author': 'Datagrok',\n 'molfile': '',\n 'naturalAnalog': '',\n 'rgroups': [],\n 'createDate': null,\n 'id': 0,\n 'polymerType': 'PEPTIDE',\n 'symbol': ''\n};\n// range of hex nubers used in PepSea library to endode monomers\nexport const MONOMER_ENCODE_MIN = 0x100;\nexport const MONOMER_ENCODE_MAX = 0x40A;\nexport const RIBOSE_SYMBOL = 'r';\nexport const DEOXYRIBOSE_SYMBOL = 'd';\nexport const PHOSPHATE_SYMBOL = 'p';\nexport const HELM_WRAPPERS_REGEXP = new RegExp(`[${RIBOSE_SYMBOL}${DEOXYRIBOSE_SYMBOL}]\\\\((\\\\w)\\\\)${PHOSPHATE_SYMBOL}?`, 'g');\n//# sourceMappingURL=const.js.map","/** Canonical gap symbol */\nexport const GAP_SYMBOL = '';\n/** 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","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 helmRe = /(PEPTIDE1|DNA1|RNA1)\\{([^}]+)}/g;\nexport const helmPp1Re = /\\[([^\\[\\]]+)]/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLWRlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbi8qKlxuICogRGVub3RlcyBhIHZlY3RvciBvZiBmbG9hdGluZyBwb2l0IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVmVjdG9yXG4gKiBAZXh0ZW5kcyB7RmxvYXQzMkFycmF5fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yIGV4dGVuZHMgRmxvYXQzMkFycmF5IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIHR3by1kaW1lbnNpb25hbCBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE1hdHJpeFxuICogQGV4dGVuZHMge0FycmF5PFZlY3Rvcj59XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBcnJheTxWZWN0b3I+IHt9XG5cbi8qKlxuICogRGVub3RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvb3JkaW5hdGVzXG4gKiBAZXh0ZW5kcyB7TWF0cml4fVxuICovXG5leHBvcnQgY2xhc3MgQ29vcmRpbmF0ZXMgZXh0ZW5kcyBNYXRyaXgge31cblxuLyoqXG4gKiBEZW5vdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeS10eXBlZCB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBWZWN0b3JzXG4gKiBAZXh0ZW5kcyB7QXJyYXk8YW55Pn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcnMgZXh0ZW5kcyBBcnJheTxhbnk+IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBmdW5jdGlvbiBvcHRpb25zLlxuICpcbiAqIEBleHBvcnRcbiAqIEB0eXBlIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcbiAqIEBwYXJhbSB7YW55fSB2MSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHthbnl9IHYyIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBEaXN0YW5jZU1ldHJpYyA9ICh2MTogYW55LCB2MjogYW55KSA9PiAobnVtYmVyKTtcblxuLyoqXG4gKiBEZW5vdGVzIGEgc2ltcGxlIHN0cmluZyB0byBzdHJpbmcgZGljdGlvbmFyeS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdHlwZSBTdHJpbmdEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0RpY3Rpb25hcnkgPSB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcblxuXG5leHBvcnQgdHlwZSBDb2x1bW5JbnB1dE9wdGlvbnMgPSB7XG4gICAgZmlsdGVyPzogKGNvbDogREcuQ29sdW1uKSA9PiBib29sZWFuIHwgbnVsbDtcbn07XG4iXX0=","import { Vector } from './type-declarations';\nimport { randomFloat, randomInt } from './random';\n/**\n * Asserts a condition by throwing an Error.\n *\n * @export\n * @param {boolean} [condition=false] Condition to assert.\n * @param {string} [message='Assertion error.'] Message to output.\n * @throws {Error}\n */\nexport function assert(condition = false, message = 'Assertion error.') {\n if (!condition)\n throw new Error(message);\n}\n/**\n * Creates new two-dimensional array and fills it with the value given.\n *\n * @param {number} dimension1 The first dimension of the coordinates (number of rows).\n * @param {number} dimension2 The second dimension of the coordinates (number of columns).\n * @param {number} [fill=0] A value to fill the coordinates with.\n * @return {Coordinates} A two-dimensional filled with the value given.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function initCoordinates(dimension1, dimension2, fill = 0) {\n return new Array(dimension1).fill(fill).map(() => (new Vector(dimension2).fill(fill)));\n}\n/**\n * Transpose matrix.\n *\n * @export\n * @param {Matrix} matrix The matrix to be transposed.\n * @return {Matrix} Transposed matrix.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function transposeMatrix(matrix) {\n return new Array(matrix[0].length).fill(0)\n .map((_, i) => (new Vector(matrix.length).fill(0).map((_, j) => (matrix[j][i]))));\n}\n/**\n * Adds two vectors with the second one to be multiplied by the given ratio.\n *\n * @export\n * @param {Vector} p The first vector to add.\n * @param {Vector} q The second vector to add.\n * @param {number} [multiplier=1] A multiplier to be used before the second vector is added.\n * @return {Vector} New vector contained the result of operation p+multiplier*q.\n */\nexport function vectorAdd(p, q, multiplier = 1) {\n const nItems = p.length;\n assert(nItems == q.length, 'Vector lengths do not match.');\n const total = new Vector(nItems);\n for (let i = 0; i < p.length; ++i)\n total[i] = p[i] + multiplier * q[i];\n return total;\n}\n/**\n * Sums the vector's items.\n *\n * @param {Vector} v The vector to be summed.\n * @return {number} The vector's items sum.\n */\nfunction itemsSum(v) {\n let total = 0;\n for (let i = 0; i < v.length; ++i)\n total += v[i];\n return total;\n}\n/**\n * Suqares the vector's items.\n *\n * @param {Vector} v The vector to square.\n * @return {Vector} A new vector containing the original's items squared.\n */\nfunction vectorSquare(v) {\n const nItems = v.length;\n const total = new Vector(nItems);\n for (let i = 0; i < v.length; ++i)\n total[i] = v[i] * v[i];\n return total;\n}\nexport function vectorLength(v) {\n let sqrSum = 0;\n for (let i = 0; i < v.length; i++)\n sqrSum += v[i] * v[i];\n return Math.sqrt(sqrSum);\n}\nexport function vectorDotProduct(v1, v2) {\n if (v1.length != v2.length)\n throw new Error('The dimensionality of the vectors must match');\n let prod = 0;\n for (let i = 0; i < v1.length; i++)\n prod += v1[i] * v2[i];\n return prod;\n}\n/**\n * Creates a matrix filled with random floating point values.\n *\n * @export\n * @param {number} dimension1 The first dimension of the matrix.\n * @param {number} dimension2 The second dimension of the matrix.\n * @param {number} [scale=1.] Max value given by random generator.\n * @return {Matrix} A new matrix filled with random floating point values.\n */\nexport function fillRandomMatrix(dimension1, dimension2, scale = 1.) {\n const matrix = initCoordinates(dimension1, dimension2);\n for (let i = 0; i < dimension1; ++i) {\n for (let j = 0; j < dimension2; ++j)\n matrix[i][j] = randomFloat(scale);\n }\n return matrix;\n}\n/**\n * Calculates Euclidean distance between two vectors.\n *\n * @export\n * @param {Vector} p The first vector.\n * @param {Vector} q The second vector.\n * @return {number} Euclidean distance between the given vectors.\n */\nexport function calculateEuclideanDistance(p, q) {\n let result = 0;\n const len = p.length;\n if (len !== q.length)\n throw new Error('The dimensionality of the vectors must match');\n for (let i = 0; i < len; ++i)\n result += Math.pow((p[i] - q[i]), 2);\n return Math.sqrt(result);\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n }\n }\n return matrix;\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcNormalizedDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n let max = Number.MIN_VALUE;\n let min = Number.MAX_VALUE;\n for (let i = 0; i < nItems; ++i) {\n for (let j = i; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null || i === j) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n if (d > max)\n max = d;\n if (d < min)\n min = d;\n }\n }\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j)\n matrix[i][j] = matrix[j][i] = (matrix[i][j] - min) / (max - min);\n }\n return matrix;\n}\n/** Generates array from a range [begin; end] or [begin; end) if endExclusive. **/\nexport function genRange(begin, end, endExclusive = false) {\n const nItems = end - begin + (endExclusive ? 0 : 1);\n const series = new Int32Array(nItems);\n for (let i = 0; i < nItems; ++i)\n series[i] = begin + i;\n return series;\n}\n/**\n * Returns order of values as if they are sorted.\n *\n * @export\n * @param {any[]} values Input array.\n * @param {boolean} [reverse=false] Whether to return reversed order.\n * @return {number[]} The order computed.\n */\nexport function argSort(values, reverse = false) {\n const sortfn = reverse ? (a, b) => (b[0] - a[0]) : (a, b) => (a[0] - b[0]);\n const decor = (v, i) => [v, i]; // set index to value\n const undecor = (a) => a[1]; // leave only index\n const _argsort = (arr) => arr.map(decor).sort(sortfn).map(undecor);\n return _argsort(values);\n}\n/**\n * Returns the indexes of the most diverse objects according to the dist function\n * @param {number} length total number of objects\n * @param {number} n number of diverse elements to find\n * @param {(i1: number, i2: number) => number} dist a function which calculates distance between\n * two objects using their indexes\n * @returns {number[]} The indexes of the most diverse objects\n */\nexport function getDiverseSubset(length, n, dist) {\n function maxBy(values, orderBy) {\n let maxValue = null;\n let maxOrderBy = null;\n for (const element of values) {\n const elementOrderBy = orderBy(element);\n if (maxOrderBy == null || elementOrderBy > maxOrderBy) {\n maxValue = element;\n maxOrderBy = elementOrderBy;\n }\n }\n return maxValue;\n }\n const subset = [randomInt(length - 1)];\n const complement = new Set();\n for (let i = 0; i < length; ++i) {\n if (!subset.includes(i))\n complement.add(i);\n }\n while (subset.length < n) {\n const idx = maxBy(complement.values(), (i) => Math.min.apply(Math, subset.map(function (val, index) {\n return dist(i, val);\n })));\n if (idx) {\n subset.push(idx);\n complement.delete(idx);\n }\n }\n return subset;\n}\n/**\n * Returns normalized vector.\n *\n * @export\n * @param {Vector} data numerical array\n */\nexport function normalize(data) {\n const len = data.length;\n let sum = 0;\n let sumOfSquares = 0;\n for (let i = 0; i < len; ++i) {\n sum += data[i];\n sumOfSquares += Math.pow(data[i], 2);\n }\n const mean = sum / len;\n const stdDevInverse = 1.0 / Math.sqrt(sumOfSquares / len - Math.pow(mean, 2));\n for (let i = 0; i < len; ++i)\n data[i] = (data[i] - mean) * stdDevInverse;\n return data;\n}\n/**\n * Finds set difference between two lists.\n * @param {any[]} a The first list.\n * @param {any[]} b The second list.\n * @return {any[]}\n */\nexport function setDifference(a, b) {\n const bSet = new Set(b);\n return Array.from(new Set(a.filter((x) => !bSet.has(x))).values());\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsVUFBa0IsRUFBRSxVQUFrQixFQUFFLE9BQWUsQ0FBQztJQUN0RixPQUFPLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFjO0lBQzVDLE9BQU8sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDdkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENB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QUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNYXRyaXgsIFZlY3RvciwgQ29vcmRpbmF0ZXMsIFZlY3RvcnMsIERpc3RhbmNlTWV0cmljfSBmcm9tICcuL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7cmFuZG9tRmxvYXQsIHJhbmRvbUludH0gZnJvbSAnLi9yYW5kb20nO1xuXG4vKipcbiAqIEFzc2VydHMgYSBjb25kaXRpb24gYnkgdGhyb3dpbmcgYW4gRXJyb3IuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtib29sZWFufSBbY29uZGl0aW9uPWZhbHNlXSBDb25kaXRpb24gdG8gYXNzZXJ0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPSdBc3NlcnRpb24gZXJyb3IuJ10gTWVzc2FnZSB0byBvdXRwdXQuXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb246IGJvb2xlYW4gPSBmYWxzZSwgbWVzc2FnZTogc3RyaW5nID0gJ0Fzc2VydGlvbiBlcnJvci4nKSB7XG4gIGlmICghY29uZGl0aW9uKVxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIG5ldyB0d28tZGltZW5zaW9uYWwgYXJyYXkgYW5kIGZpbGxzIGl0IHdpdGggdGhlIHZhbHVlIGdpdmVuLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBkaW1lbnNpb24xIFRoZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhlIGNvb3JkaW5hdGVzIChudW1iZXIgb2Ygcm93cykuXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgY29vcmRpbmF0ZXMgKG51bWJlciBvZiBjb2x1bW5zKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbD0wXSBBIHZhbHVlIHRvIGZpbGwgdGhlIGNvb3JkaW5hdGVzIHdpdGguXG4gKiBAcmV0dXJuIHtDb29yZGluYXRlc30gQSB0d28tZGltZW5zaW9uYWwgZmlsbGVkIHdpdGggdGhlIHZhbHVlIGdpdmVuLlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIGZpbGw6IG51bWJlciA9IDApOiBDb29yZGluYXRlcyB7XG4gIHJldHVybiBuZXcgQXJyYXkoZGltZW5zaW9uMSkuZmlsbChmaWxsKS5tYXAoKCkgPT4gKG5ldyBWZWN0b3IoZGltZW5zaW9uMikuZmlsbChmaWxsKSkpO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBNYXRyaXgge1xuICByZXR1cm4gbmV3IEFycmF5KG1hdHJpeFswXS5sZW5ndGgpLmZpbGwoMClcbiAgICAubWFwKChfLCBpKSA9PiAobmV3IFZlY3RvcihtYXRyaXgubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaikgPT4gKG1hdHJpeFtqXVtpXSkpKSk7XG59XG5cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocDogVmVjdG9yLCBxOiBWZWN0b3IsIG11bHRpcGxpZXI6IG51bWJlciA9IDEpOiBWZWN0b3Ige1xuICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcblxuICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuXG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHBbaV0gKyBtdWx0aXBsaWVyICogcVtpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbi8qKlxuICogU3VtcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBiZSBzdW1tZWQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2ZWN0b3IncyBpdGVtcyBzdW0uXG4gKi9cbmZ1bmN0aW9uIGl0ZW1zU3VtKHY6IFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgIHRvdGFsICs9IHZbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1cWFyZXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gc3F1YXJlLlxuICogQHJldHVybiB7VmVjdG9yfSBBIG5ldyB2ZWN0b3IgY29udGFpbmluZyB0aGUgb3JpZ2luYWwncyBpdGVtcyBzcXVhcmVkLlxuICovXG5mdW5jdGlvbiB2ZWN0b3JTcXVhcmUodjogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3Rvckxlbmd0aCh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgc3FyU3VtOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICBzcXJTdW0gKz0gdltpXSAqIHZbaV07XG4gIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvckRvdFByb2R1Y3QodjE6IFZlY3RvciwgdjI6IFZlY3Rvcik6IG51bWJlciB7XG4gIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSB2ZWN0b3JzIG11c3QgbWF0Y2gnKTtcbiAgbGV0IHByb2Q6IG51bWJlciA9IDA7XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKylcbiAgICBwcm9kICs9IHYxW2ldICogdjJbaV07XG4gIHJldHVybiBwcm9kO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xLl0gTWF4IHZhbHVlIGdpdmVuIGJ5IHJhbmRvbSBnZW5lcmF0b3IuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IEEgbmV3IG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSYW5kb21NYXRyaXgoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIHNjYWxlOiBudW1iZXIgPSAxLik6IE1hdHJpeCB7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhkaW1lbnNpb24xLCBkaW1lbnNpb24yKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbWVuc2lvbjE7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UocDogVmVjdG9yLCBxOiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgcmVzdWx0ID0gMDtcbiAgY29uc3QgbGVuID0gcC5sZW5ndGg7XG5cbiAgaWYgKGxlbiAhPT0gcS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZGltZW5zaW9uYWxpdHkgb2YgdGhlIHZlY3RvcnMgbXVzdCBtYXRjaCcpO1xuICBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICByZXN1bHQgKz0gKHBbaV0gLSBxW2ldKSAqKiAyO1xuICBcbiAgcmV0dXJuIE1hdGguc3FydChyZXN1bHQpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgYSBjdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3JzfSBkYXRhIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy5cbiAqIEBwYXJhbSB7RGlzdGFuY2VNZXRyaWN9IGRpc3RhbmNlIEN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge01hdHJpeH0gQ2FsY3VsYXRlZCBjdXN0b20gZGlzdGFuY2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY0Rpc3RhbmNlTWF0cml4KGRhdGE6IFZlY3RvcnMsIGRpc3RhbmNlOiBEaXN0YW5jZU1ldHJpYyk6IE1hdHJpeCB7XG4gIGNvbnN0IG5JdGVtcyA9IGRhdGEubGVuZ3RoO1xuICBjb25zdCBtYXRyaXggPSBpbml0Q29vcmRpbmF0ZXMobkl0ZW1zLCBuSXRlbXMsIDApO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBuSXRlbXM7ICsraikge1xuICAgICAgY29uc3QgZDogbnVtYmVyID0gKGRhdGFbaV0gPT0gbnVsbCkgfHwgKGRhdGFbal0gPT0gbnVsbCkgPyAwIDogZGlzdGFuY2UoZGF0YVtpXSwgZGF0YVtqXSk7XG4gICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbal1baV0gPSBkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWF0cml4O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgYSBjdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3JzfSBkYXRhIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy5cbiAqIEBwYXJhbSB7RGlzdGFuY2VNZXRyaWN9IGRpc3RhbmNlIEN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge01hdHJpeH0gQ2FsY3VsYXRlZCBjdXN0b20gZGlzdGFuY2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY05vcm1hbGl6ZWREaXN0YW5jZU1hdHJpeChkYXRhOiBWZWN0b3JzLCBkaXN0YW5jZTogRGlzdGFuY2VNZXRyaWMpOiBNYXRyaXgge1xuICBjb25zdCBuSXRlbXMgPSBkYXRhLmxlbmd0aDtcbiAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcbiAgbGV0IG1heCA9IE51bWJlci5NSU5fVkFMVUU7XG4gIGxldCBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGk7IGogPCBuSXRlbXM7ICsraikge1xuICAgICAgY29uc3QgZDogbnVtYmVyID0gKGRhdGFbaV0gPT0gbnVsbCkgfHwgKGRhdGFbal0gPT0gbnVsbCB8fCBpID09PSBqKSA/IDAgOiBkaXN0YW5jZShkYXRhW2ldLCBkYXRhW2pdKTtcbiAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtqXVtpXSA9IGQ7XG4gICAgICBpZiAoZCA+IG1heCkgbWF4ID0gZDtcbiAgICAgIGlmIChkIDwgbWluKSBtaW4gPSBkO1xuICAgIH1cbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbkl0ZW1zOyArK2opXG4gICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbal1baV0gPSAobWF0cml4W2ldW2pdIC0gbWluKSAvIChtYXggLSBtaW4pO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKiBHZW5lcmF0ZXMgYXJyYXkgZnJvbSBhIHJhbmdlIFtiZWdpbjsgZW5kXSBvciBbYmVnaW47IGVuZCkgaWYgZW5kRXhjbHVzaXZlLiAqKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5SYW5nZShiZWdpbjogbnVtYmVyLCBlbmQ6IG51bWJlciwgZW5kRXhjbHVzaXZlID0gZmFsc2UpOiBJbnQzMkFycmF5IHtcbiAgY29uc3Qgbkl0ZW1zID0gZW5kIC0gYmVnaW4gKyAoZW5kRXhjbHVzaXZlID8gMCA6IDEpO1xuICBjb25zdCBzZXJpZXMgPSBuZXcgSW50MzJBcnJheShuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpXG4gICAgc2VyaWVzW2ldID0gYmVnaW4gKyBpO1xuXG4gIHJldHVybiBzZXJpZXM7XG59XG5cbi8qKlxuICogUmV0dXJucyBvcmRlciBvZiB2YWx1ZXMgYXMgaWYgdGhleSBhcmUgc29ydGVkLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7YW55W119IHZhbHVlcyBJbnB1dCBhcnJheS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldmVyc2U9ZmFsc2VdIFdoZXRoZXIgdG8gcmV0dXJuIHJldmVyc2VkIG9yZGVyLlxuICogQHJldHVybiB7bnVtYmVyW119IFRoZSBvcmRlciBjb21wdXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFyZ1NvcnQodmFsdWVzOiBhbnlbXSwgcmV2ZXJzZSA9IGZhbHNlKTogbnVtYmVyW10ge1xuICBjb25zdCBzb3J0Zm4gPSByZXZlcnNlID8gKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGJbMF0gLSBhWzBdKSA6IChhOiBhbnlbXSwgYjogYW55W10pID0+IChhWzBdIC0gYlswXSk7XG4gIGNvbnN0IGRlY29yID0gKHY6IGFueSwgaTogbnVtYmVyKSA9PiBbdiwgaV07IC8vIHNldCBpbmRleCB0byB2YWx1ZVxuICBjb25zdCB1bmRlY29yID0gKGE6IGFueVtdKSA9PiBhWzFdOyAvLyBsZWF2ZSBvbmx5IGluZGV4XG4gIGNvbnN0IF9hcmdzb3J0ID0gKGFycjogYW55W10pID0+IGFyci5tYXAoZGVjb3IpLnNvcnQoc29ydGZuKS5tYXAodW5kZWNvcik7XG4gIHJldHVybiBfYXJnc29ydCh2YWx1ZXMpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4ZXMgb2YgdGhlIG1vc3QgZGl2ZXJzZSBvYmplY3RzIGFjY29yZGluZyB0byB0aGUgZGlzdCBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCB0b3RhbCBudW1iZXIgb2Ygb2JqZWN0c1xuICogQHBhcmFtIHtudW1iZXJ9IG4gbnVtYmVyIG9mIGRpdmVyc2UgZWxlbWVudHMgdG8gZmluZFxuICogQHBhcmFtIHsoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyfSBkaXN0IGEgZnVuY3Rpb24gd2hpY2ggY2FsY3VsYXRlcyBkaXN0YW5jZSBiZXR3ZWVuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvIG9iamVjdHMgdXNpbmcgdGhlaXIgaW5kZXhlc1xuICogQHJldHVybnMge251bWJlcltdfSBUaGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpdmVyc2VTdWJzZXQobGVuZ3RoOiBudW1iZXIsIG46IG51bWJlciwgZGlzdDogKGkxOiBudW1iZXIsIGkyOiBudW1iZXIpID0+IG51bWJlcik6IG51bWJlcltdIHtcbiAgZnVuY3Rpb24gbWF4QnkodmFsdWVzOiBJdGVyYWJsZUl0ZXJhdG9yPG51bWJlcj4sIG9yZGVyQnk6IChpOiBudW1iZXIpID0+IG51bWJlcikge1xuICAgIGxldCBtYXhWYWx1ZSA9IG51bGw7XG4gICAgbGV0IG1heE9yZGVyQnkgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHZhbHVlcykge1xuICAgICAgY29uc3QgZWxlbWVudE9yZGVyQnkgPSBvcmRlckJ5KGVsZW1lbnQpO1xuICAgICAgaWYgKG1heE9yZGVyQnkgPT0gbnVsbCB8fCBlbGVtZW50T3JkZXJCeSA+IG1heE9yZGVyQnkpIHtcbiAgICAgICAgbWF4VmFsdWUgPSBlbGVtZW50O1xuICAgICAgICBtYXhPcmRlckJ5ID0gZWxlbWVudE9yZGVyQnk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXhWYWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHN1YnNldCA9IFtyYW5kb21JbnQobGVuZ3RoIC0gMSldO1xuICBjb25zdCBjb21wbGVtZW50ID0gbmV3IFNldCgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoIXN1YnNldC5pbmNsdWRlcyhpKSlcbiAgICAgIGNvbXBsZW1lbnQuYWRkKGkpO1xuICB9XG5cbiAgd2hpbGUgKHN1YnNldC5sZW5ndGggPCBuKSB7XG4gICAgY29uc3QgaWR4ID0gbWF4QnkoXG4gICAgICBjb21wbGVtZW50LnZhbHVlcygpIGFzIEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPixcbiAgICAgIChpKSA9PiBNYXRoLm1pbi5hcHBseShNYXRoLCBzdWJzZXQubWFwKGZ1bmN0aW9uKHZhbCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGRpc3QoaSwgdmFsKTtcbiAgICAgIH0pKSk7XG4gICAgaWYgKGlkeCkge1xuICAgICAgc3Vic2V0LnB1c2goaWR4KTtcbiAgICAgIGNvbXBsZW1lbnQuZGVsZXRlKGlkeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdWJzZXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBub3JtYWxpemVkIHZlY3Rvci5cbiAqIFxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3J9IGRhdGEgbnVtZXJpY2FsIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUoZGF0YTogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGg7XG4gIGxldCBzdW0gPSAwO1xuICBsZXQgc3VtT2ZTcXVhcmVzID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgc3VtICs9IGRhdGFbaV07XG4gICAgc3VtT2ZTcXVhcmVzICs9IGRhdGFbaV0gKiogMjtcbiAgfVxuXG4gIGNvbnN0IG1lYW4gPSBzdW0gLyBsZW47XG4gIGNvbnN0IHN0ZERldkludmVyc2UgPSAxLjAgLyBNYXRoLnNxcnQoc3VtT2ZTcXVhcmVzIC8gbGVuIC0gbWVhbiAqKiAyKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pICogc3RkRGV2SW52ZXJzZTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBGaW5kcyBzZXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBsaXN0cy5cbiAqIEBwYXJhbSB7YW55W119IGEgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge2FueVtdfSBiIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge2FueVtdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGlmZmVyZW5jZShhOiBhbnlbXSwgYjogYW55W10pOiBhbnlbXSB7XG4gIGNvbnN0IGJTZXQgPSBuZXcgU2V0KGIpO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGEuZmlsdGVyKCh4KSA9PiAhYlNldC5oYXMoeCkpKS52YWx1ZXMoKSk7XG59XG4iXX0=","export class SeqPaletteBase {\n static makePalette(dt, simplified = false, PaletteType = SeqPaletteBase) {\n const palette = {};\n dt.forEach((cp) => {\n const objList = cp[0];\n const colour = cp[1];\n objList.forEach((obj, ind) => {\n palette[obj] = this.colourPalette[colour][simplified ? 0 : ind];\n });\n });\n return new PaletteType(palette);\n }\n constructor(palette) {\n this._palette = palette;\n }\n get(m) {\n return this._palette[m];\n }\n}\nSeqPaletteBase.undefinedColor = 'rgb(100,100,100)';\n/** Palette with shades of primary colors */\nSeqPaletteBase.colourPalette = {\n 'orange': ['rgb(255,187,120)', 'rgb(245,167,100)', 'rgb(235,137,70)', 'rgb(205, 111, 71)'],\n 'all_green': ['rgb(44,160,44)', 'rgb(74,160,74)', 'rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)',\n 'rgb(24,110,79)', 'rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'all_blue': ['rgb(31,119,180)', 'rgb(23,190,207)', 'rgb(122, 102, 189)', 'rgb(158,218,229)', 'rgb(141, 124, 217)',\n 'rgb(31, 120, 150)'],\n 'magenta': ['rgb(162,106,192)', 'rgb(197,165,224)', 'rgb(208,113,218)'],\n 'red': ['rgb(214,39,40)', 'rgb(255,152,150)'],\n 'st_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(31,119,180)'],\n 'dark_blue': ['rgb(31,119,180)', 'rgb(31, 120, 150)'],\n 'light_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(108, 218, 229)', 'rgb(23,190,227)'],\n 'lilac_blue': ['rgb(124,102,211)', 'rgb(149,134,217)', 'rgb(97, 81, 150)'],\n 'dark_green': ['rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)', 'rgb(24,110,79)'],\n 'green': ['rgb(44,160,44)', 'rgb(74,160,74)'],\n 'light_green': ['rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'st_green': ['rgb(44,160,44)', 'rgb(152,223,138)', 'rgb(39, 174, 96)', 'rgb(74,160,74)'],\n 'pink': ['rgb(247,182,210)'],\n 'brown': ['rgb(140,86,75)', 'rgb(102, 62, 54)'],\n 'gray': ['rgb(127,127,127)', 'rgb(199,199,199)', 'rgb(196,156,148)', 'rgb(222, 222, 180)'],\n 'yellow': ['rgb(188,189,34)'],\n 'white': ['rgb(230,230,230)'],\n};\n//# sourceMappingURL=seq-palettes.js.map","import { SeqPaletteBase } from './seq-palettes';\nexport class AminoacidsPalettes extends SeqPaletteBase {\n static get Lesk() {\n if (this.lesk === void 0) {\n this.lesk = this.makePalette([\n [['G', 'A', 'S', 'T'], 'orange'],\n [['C', 'V', 'I', 'L', 'P', 'F', 'Y', 'M', 'W'], 'all_green'],\n [['N', 'Q', 'H'], 'magenta'],\n [['D', 'E'], 'red'],\n [['K', 'R'], 'all_blue'],\n ], false, AminoacidsPalettes);\n }\n return this.lesk;\n }\n static get GrokGroups() {\n if (this.grokGroups === void 0) {\n this.grokGroups = this.makePalette([\n [['C', 'U'], 'yellow'],\n [['G', 'P'], 'red'],\n [['A', 'V', 'I', 'L', 'M', 'F', 'Y', 'W'], 'all_green'],\n [['R', 'H', 'K'], 'light_blue'],\n [['D', 'E'], 'dark_blue'],\n [['S', 'T', 'N', 'Q'], 'orange'],\n ], false, AminoacidsPalettes);\n }\n return this.grokGroups;\n }\n static get RasMol() {\n if (this.rasMol === void 0) {\n this.rasMol = new AminoacidsPalettes({\n // http://acces.ens-lyon.fr/biotic/rastop/help/colour.htm\n 'D': '#E60A0A',\n 'E': '#E60A0A',\n 'C': '#E6E600',\n 'M': '#E6E600',\n 'K': '#145AFF',\n 'R': '#145AFF',\n 'S': '#FA9600',\n 'T': '#FA9600',\n 'F': '#3232AA',\n 'Y': '#3232AA',\n 'N': '#00DCDC',\n 'Q': '#00DCDC',\n 'G': '#EBEBEB',\n 'L': '#0F820F',\n 'V': '#0F820F',\n 'I': '#0F820F',\n 'A': '#C8C8C8',\n 'W': '#B45AB4',\n 'H': '#8282D2',\n 'P': '#DC9682',\n 'others': '#BEA06E',\n });\n }\n return this.rasMol;\n }\n get(m) {\n const resM = m in AminoacidsPalettes.aaSynonyms ? AminoacidsPalettes.aaSynonyms[m] : m;\n const res = super.get(resM);\n return res;\n }\n}\n/** Only some of the synonyms. These were obtained from the clustered oligopeptide dataset. */\nAminoacidsPalettes.aaSynonyms = {\n 'MeNle': 'L',\n 'MeA': 'A',\n 'MeG': 'G',\n 'MeF': 'F',\n};\nexport class Aminoacids {\n static getPalette(scheme = 'grok') {\n switch (scheme) {\n case 'grok':\n return AminoacidsPalettes.GrokGroups;\n case 'lesk':\n return AminoacidsPalettes.Lesk;\n default:\n throw new Error(`ChemPalette: scheme \\`${scheme}\\` does not exist`);\n }\n }\n /**\n * Returns divided amino acid with its content in the bracket, if the content is number, then its omitted\n *\n * @param {string} c raw amino\n * @return {[string, string]} outer and inner content\n */\n static getInnerOuter(c) {\n let isInner = 0;\n let inner = '';\n let outer = '';\n for (const char of c) {\n if (char == '(')\n isInner++;\n else if (char == ')')\n isInner--;\n else if (isInner)\n inner += char;\n else\n outer += char;\n }\n return !isNaN(parseInt(inner)) ? [outer, ''] : [outer, inner];\n }\n static getColorAAPivot(monomer = '', scheme = 'grok') {\n //const chemPaletteInstance = AAPalettes.GrokGroups();\n const chemPaletteInstance = this.getPalette(scheme);\n let [outerMonomer, innerMonomer] = this.getInnerOuter(monomer);\n outerMonomer = (outerMonomer.length > 6 ? `${outerMonomer.slice(0, 3)}...` : outerMonomer);\n innerMonomer = (innerMonomer.length > 6 ? `${innerMonomer.slice(0, 3)}...` : innerMonomer);\n if (monomer.length == 1 || monomer[1] == '(') {\n const amino = monomer[0]?.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 1] :\n [this.undefinedColor, outerMonomer, innerMonomer, 1];\n }\n if (monomer[0] == 'd' && monomer[1] in chemPaletteInstance) {\n if (monomer.length == 2 || monomer[2] == '(') {\n const amino = monomer[1]?.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 2] :\n [this.undefinedColor, outerMonomer, innerMonomer, 2];\n }\n }\n if (monomer.substring(0, 3) in this.AAFullNames) {\n if (monomer.length == 3 || monomer[3] == '(') {\n const amino = this.AAFullNames[monomer.substring(0, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 3] :\n [this.undefinedColor, outerMonomer, innerMonomer, 3];\n }\n }\n if (monomer[0]?.toLowerCase() == monomer[0]) {\n if (monomer.substring(1, 3) in this.AAFullNames) {\n if (monomer.length == 4 || monomer[4] == '(') {\n const amino = this.AAFullNames[monomer.substring(1, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 4] :\n [this.undefinedColor, outerMonomer, innerMonomer, 4];\n }\n }\n }\n return [this.undefinedColor, outerMonomer, innerMonomer, 0];\n }\n}\nAminoacids.SemType = 'Aminoacids';\nAminoacids.SemTypeMultipleAlignment = 'AminoacidsMultipleAlignment';\nAminoacids.undefinedColor = 'rgb(100,100,100)';\nAminoacids.Names = {\n 'G': 'Glycine',\n 'L': 'Leucine',\n 'Y': 'Tyrosine',\n 'S': 'Serine',\n 'E': 'Glutamic acid',\n 'Q': 'Glutamine',\n 'D': 'Aspartic acid',\n 'N': 'Asparagine',\n 'F': 'Phenylalanine',\n 'A': 'Alanine',\n 'K': 'Lysine',\n 'R': 'Arginine',\n 'H': 'Histidine',\n 'C': 'Cysteine',\n 'V': 'Valine',\n 'P': 'Proline',\n 'W': 'Tryptophan',\n 'I': 'Isoleucine',\n 'M': 'Methionine',\n 'T': 'Threonine',\n};\nAminoacids.AASmiles = {\n 'G': 'NCC(=O)O',\n 'L': 'N[C@H](CC(C)C)C(=O)O',\n 'Y': 'NC(CC1=CC=C(O)C=C1)C(=O)O',\n 'S': 'NC(CO)C(=O)O',\n 'E': 'N[C@@H](CCC(O)=O)C(=O)O',\n 'Q': 'N[C@@H](CCC(N)=O)C(=O)O',\n 'D': 'N[C@@H](CC(O)=O)C(=O)O',\n 'N': 'N[C@@H](CC(N)=O)C(=O)O',\n 'F': 'NC(CC1=CC=CC=C1)C(=O)O',\n 'A': 'N[C@H](C)C(=O)O',\n 'K': 'NC(CCCCN)C(=O)O',\n 'R': 'N[C@H](CCCNC(=N)C)C(=O)O',\n 'H': 'NC(CC1=CN=C[N]1)C(=O)O',\n 'C': 'N[C@@H](CS)C(=O)O',\n 'V': 'NC(C(C)C)C(=O)O',\n 'P': 'N(CCC1)C1C(=O)O',\n 'W': 'N[C@@H](Cc1c2ccccc2n([H])c1)C(=O)O',\n 'I': 'N[C@H]([C@H](C)CC)C(=O)O',\n 'M': 'NC(CCSC)C(=O)O',\n 'T': 'NC(C(O)C)C(=O)O',\n};\nAminoacids.AASmilesTruncated = {\n 'G': '*C*',\n 'L': 'CC(C)C[C@H](*)*',\n 'Y': 'C1=CC(=CC=C1CC(*)*)O',\n 'S': 'OCC(*)C*',\n 'E': '*[C@@H](CCC(O)=O)*',\n 'Q': '*N[C@@H](CCC(N)=O)*',\n 'D': '*[C@@H](CC(O)=O)*',\n 'N': '*[C@@H](CC(N)=O)*',\n 'F': 'C1=CC=C(C=C1)CC(*)*',\n 'A': 'C[C@H](*)*',\n 'K': 'C(CCN)CC(*)*',\n 'R': '*[C@H](CCCNC(=N)C)*',\n 'H': 'C1=C(NC=N1)CC(*)*',\n 'C': 'C([C@@H](*)*)S',\n 'V': 'CC(C)C(*)*',\n 'P': 'C1CCN(*)C1*',\n 'W': '*[C@@H](Cc1c2ccccc2n([H])c1)*',\n 'I': 'CC[C@H](C)[C@H](*)*',\n 'M': 'CSCCC(*)*',\n 'T': 'CC(O)C(*)*',\n};\n/** TODO: Full?\n */\nAminoacids.AAFullNames = {\n 'Ala': 'A',\n 'Arg': 'R',\n 'Asn': 'N',\n 'Asp': 'D',\n 'Cys': 'C',\n 'Gln': 'Q',\n 'Glu': 'E',\n 'Gly': 'G',\n 'His': 'H',\n 'Ile': 'I',\n 'Leu': 'L',\n 'Lys': 'K',\n 'Met': 'M',\n 'Phe': 'F',\n 'Pro': 'P',\n 'Ser': 'S',\n 'Thr': 'T',\n 'Trp': 'W',\n 'Tyr': 'Y',\n 'Val': 'V',\n};\n//# sourceMappingURL=aminoacids.js.map","import { SeqPaletteBase } from './seq-palettes';\nexport class NucleotidesPalettes extends SeqPaletteBase {\n static get Chromatogram() {\n if (this.chromatogram === void 0) {\n this.chromatogram = new NucleotidesPalettes({\n 'A': 'green',\n 'C': 'blue',\n 'G': 'black',\n 'T': 'red',\n 'U': 'red',\n 'others': 'gray',\n });\n }\n return this.chromatogram;\n }\n}\nexport class Nucleotides {\n}\nNucleotides.SemType = 'Nucleotides';\nNucleotides.SemTypeMultipleAlignment = 'NucleotidesMultipleAlignment';\nNucleotides.Names = {\n 'A': 'Adenine',\n 'C': 'Cytosine',\n 'G': 'Guanine',\n 'T': 'Thymine',\n 'U': 'Uracil',\n};\n//# sourceMappingURL=nucleotides.js.map","import * as DG from 'datagrok-api/dg';\n/** makes the color less white, makes the transparency effect always perceptible\n * @param {string} color x coordinate.\n * */\nfunction correctColor(color) {\n if (color == null)\n return 'rgb(100,100,100)';\n const dgColor = DG.Color.fromHtml(color);\n const g = DG.Color.g(dgColor);\n const r = DG.Color.r(dgColor);\n const b = DG.Color.b(dgColor);\n // calculate euclidean distance to white\n const distToBlack = Math.sqrt(Math.pow(0 - r, 2) + Math.pow(0 - g, 2) + Math.pow(0 - b, 2));\n // normalize vector r g b\n const normR = r / distToBlack;\n const normG = g / distToBlack;\n const normB = b / distToBlack;\n if (distToBlack > 210) {\n return `rgb(${normR * 210},${normG * 210},${normB * 210})`;\n }\n return DG.Color.toRgb(dgColor);\n}\nexport class StringUtils {\n static hashCode(s) {\n let hash = 0;\n if (s.length === 0)\n return hash;\n for (let i = 0; i < s.length; i++) {\n const chr = s.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n }\n}\nimport { SeqPaletteBase } from './seq-palettes';\nexport class UnknownSeqPalette {\n}\nexport class GrayAllPalette extends UnknownSeqPalette {\n get(m) {\n return '#666666';\n }\n}\nexport class UnknownColorPalette extends UnknownSeqPalette {\n static buildPalette() {\n const res = [].concat(...Object.values(SeqPaletteBase.colourPalette));\n return res;\n }\n get(m) {\n const hash = StringUtils.hashCode(m);\n const pI = hash % UnknownColorPalette.palette.length;\n return correctColor(UnknownColorPalette.palette[pI]);\n }\n}\nUnknownColorPalette.palette = UnknownColorPalette.buildPalette();\nexport class UnknownSeqPalettes extends SeqPaletteBase {\n static get Gray() {\n if (this.gray === void 0)\n this.gray = new GrayAllPalette();\n return this.gray;\n }\n static get Color() {\n if (this.color === void 0)\n this.color = new UnknownColorPalette();\n return this.color;\n }\n}\n//# sourceMappingURL=unknown.js.map","import * as DG from 'datagrok-api/dg';\nimport wu from 'wu';\nimport { CandidateSimType, GAP_SYMBOL } from './types';\nimport { Alphabets, candidateAlphabets, monomerRe, NOTATION } from './consts';\nimport { GapOriginals, SeqHandler } from '../seq-handler';\nimport { Vector } from '@datagrok-libraries/utils/src/type-declarations';\nimport { vectorDotProduct, vectorLength } from '@datagrok-libraries/utils/src/vector-operations';\nimport { AminoacidsPalettes } from '../../aminoacids';\nimport { NucleotidesPalettes } from '../../nucleotides';\nimport { UnknownSeqPalettes } from '../../unknown';\nexport class StringListSeqSplitted {\n get length() { return this.mList.length; }\n get canonicals() { return this.mList; }\n get originals() { return this.mList; }\n isGap(posIdx) {\n return this.getOriginal(posIdx) === this.gapOriginalMonomer;\n }\n getCanonical(posIdx) { return this.mList[posIdx]; }\n getOriginal(posIdx) { return this.mList[posIdx]; }\n constructor(mList, gapOriginalMonomer) {\n this.mList = mList;\n this.gapOriginalMonomer = gapOriginalMonomer;\n }\n}\nexport class FastaSimpleSeqSplitted {\n get length() { return this.seqS.length; }\n get canonicals() { return this.seqS; }\n get originals() { return this.seqS; }\n isGap(posIdx) {\n return this.getOriginal(posIdx) === GapOriginals[NOTATION.FASTA];\n }\n getCanonical(posIdx) {\n if (this.isGap(posIdx))\n return GAP_SYMBOL;\n return this.seqS[posIdx];\n }\n getOriginal(posIdx) { return this.seqS[posIdx]; }\n constructor(seqS) {\n this.seqS = seqS;\n }\n}\n/** Stats of sequences with specified splitter func, returns { freq, sameLength }.\n * @param {DG.Column} seqCol\n * @param {number} minLength\n * @param {SplitterFunc} splitter\n * @return { SeqColStats }, sameLength: boolean } stats of column sequences\n */\nexport function getStatsForCol(seqCol, minLength, splitter) {\n const cats = seqCol.categories;\n const splitted = wu.enumerate(seqCol.getRawData())\n .map(([catI, rowIdx]) => splitter(cats[catI]));\n return getStats(splitted, minLength);\n}\nfunction getStats(splitted, minLength) {\n const freq = {};\n let sameLength = true;\n let firstLength = null;\n for (const mSeq of splitted) {\n if (firstLength == null)\n firstLength = mSeq.length;\n else if (mSeq.length !== firstLength)\n sameLength = false;\n if (mSeq.length >= minLength) {\n for (const cm of mSeq.canonicals) {\n if (!(cm in freq))\n freq[cm] = 0;\n freq[cm] += 1;\n }\n }\n }\n return { freq: freq, sameLength: sameLength };\n}\n/** Split sequence for single character monomers, square brackets multichar monomer names or gap symbol.\n * @param seq object with sequence\n * @param getMonomer Source of the {@link seq} string\n * @return {string[]} array of monomers\n */\nexport const splitterAsFasta = (seq) => {\n const mmList = wu(seq.toString().matchAll(monomerRe))\n .map((ma) => {\n return ma[2] ?? ma[1]; // preserve '-' as gap symbol for compatibility with simpleAsFastaSimple\n }).toArray();\n return new StringListSeqSplitted(mmList, GapOriginals[NOTATION.FASTA]);\n // return new Proxy(splittedList as object, {\n // get(target: string[], p: string | symbol, receiver: any): any {\n // const k = 11;\n // }\n // }) as ISeqSplitted;\n};\nexport const splitterAsFastaSimple = (seq) => {\n return !!seq ? new FastaSimpleSeqSplitted(seq) : new StringListSeqSplitted([], GapOriginals[NOTATION.FASTA]);\n};\n/** Gets method to split sequence by separator\n * @param separator Monomer separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitterWithSeparator(separator, limit = undefined) {\n return (seq) => {\n if (!seq)\n return new StringListSeqSplitted([], GapOriginals[NOTATION.SEPARATOR]);\n else {\n const mmList = seq.replaceAll('\\\"-\\\"', '').replaceAll('\\'-\\'', '').split(separator, limit);\n return new StringListSeqSplitted(mmList, GapOriginals[NOTATION.SEPARATOR]);\n }\n };\n}\nconst helmRe = /(PEPTIDE1|DNA1|RNA1)\\{([^}]+)}/g;\nconst helmPp1Re = /\\[([^\\[\\]]+)]/g;\n/** Splits Helm string to monomers, but does not replace monomer names to other notation (e.g. for RNA).\n * Only for linear polymers, does not split RNA for ribose and phosphate monomers.\n * @param {string} seq Source string of HELM notation\n * @param {ISeqSource} src Source of the {@link seq} string\n * @return {string[]}\n */\nexport const splitterAsHelm = (seq) => {\n helmRe.lastIndex = 0;\n const ea = helmRe.exec(seq.toString());\n const inSeq = ea ? ea[2] : null;\n const mmPostProcess = (mm) => {\n helmPp1Re.lastIndex = 0;\n const pp1M = helmPp1Re.exec(mm);\n if (pp1M && pp1M.length >= 2)\n return pp1M[1];\n else\n return mm;\n };\n const mmList = inSeq ? inSeq.split('.') : [];\n return new StringListSeqSplitted(mmList.map(mmPostProcess), GapOriginals[NOTATION.HELM]);\n};\n/** Get splitter method to split sequences to monomers (required for MacromoleculeDifferenceCellRenderer)\n * @param {string} units\n * @param {string} separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitter(units, separator, limit = undefined) {\n if (units.toLowerCase().startsWith(NOTATION.FASTA))\n return splitterAsFasta;\n else if (units.toLowerCase().startsWith(NOTATION.SEPARATOR))\n return getSplitterWithSeparator(separator, limit);\n else if (units.toLowerCase().startsWith(NOTATION.HELM))\n return splitterAsHelm;\n else\n throw new Error(`Unexpected units ${units} .`);\n // TODO: Splitter for HELM\n}\nconst longMonomerPartRe = /([^\\W_]+)/g;\n/** Convert long monomer names to short ones */\nexport function monomerToShort(amino, maxLengthOfMonomer) {\n if (amino.length <= maxLengthOfMonomer)\n return amino;\n //const kebabAmino = amino.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $);\n const shortAminoMatch = amino.match(longMonomerPartRe);\n const needAddDots = amino.length > maxLengthOfMonomer || (shortAminoMatch?.length ?? 0) > 1;\n const shortAmino = shortAminoMatch?.[0] ?? ' ';\n return !needAddDots ? shortAmino : shortAmino.substring(0, maxLengthOfMonomer - 1) + '…';\n}\n/** */\nexport function getAlphabet(alphabet) {\n switch (alphabet) {\n case \"DNA\" /* ALPHABET.DNA */:\n return Alphabets.fasta.dna;\n case \"RNA\" /* ALPHABET.RNA */:\n return Alphabets.fasta.rna;\n case \"PT\" /* ALPHABET.PT */:\n return Alphabets.fasta.peptide;\n default:\n throw new Error(`Unsupported alphabet '${alphabet}'.`);\n }\n}\n/** Calculate similarity in current sequence and alphabet.\n * @param {MonomerFreqs} freq\n * @param {Set<string>} alphabet\n * @param {string} gapSymbol\n * @return {number} Cosine similarity\n */\nexport function getAlphabetSimilarity(freq, alphabet, gapSymbol = '-') {\n const keys = new Set([...new Set(Object.keys(freq)), ...alphabet]);\n keys.delete(gapSymbol);\n const freqA = [];\n const alphabetA = [];\n for (const m of keys) {\n freqA.push(m in freq ? freq[m] : 0);\n alphabetA.push(alphabet.has(m) ? 1 : 0);\n }\n /* There were a few ideas: chi-squared, pearson correlation (variance?), scalar product */\n const freqV = new Vector(freqA);\n const alphabetV = new Vector(alphabetA);\n return vectorDotProduct(freqV, alphabetV) / (vectorLength(freqV) * vectorLength(alphabetV));\n}\n/** From detectMacromolecule */\nexport function detectAlphabet(freq, candidates, gapSymbol = '-') {\n const candidatesSims = candidates.map((c) => {\n const sim = getAlphabetSimilarity(freq, c.alphabet, gapSymbol);\n return new CandidateSimType(c, freq, sim);\n });\n let alphabetName;\n const maxSim = Math.max(...candidatesSims.map((cs) => cs.similarity > cs.cutoff ? cs.similarity : -1));\n if (maxSim > 0) {\n const sim = candidatesSims.find((cs) => cs.similarity === maxSim);\n alphabetName = sim.name;\n }\n else\n alphabetName = \"UN\" /* ALPHABET.UN */;\n return alphabetName;\n}\n/** Selects a suitable palette based on column data\n * @param {DG.Column} seqCol Column to look for a palette\n * @param {number} minLength minimum length of sequence to detect palette (empty strings are allowed)\n * @return {SeqPalette} Palette corresponding to the alphabet of the sequences in the column\n */\nexport function pickUpPalette(seqCol, minLength = 5) {\n let alphabet;\n if (seqCol.semType == DG.SEMTYPE.MACROMOLECULE) {\n const sh = SeqHandler.forColumn(seqCol);\n alphabet = sh.alphabet;\n }\n else {\n const stats = getStatsForCol(seqCol, minLength, splitterAsFasta);\n alphabet = detectAlphabet(stats.freq, candidateAlphabets);\n }\n const res = getPaletteByType(alphabet);\n return res;\n}\nexport function getPaletteByType(paletteType) {\n switch (paletteType) {\n case \"PT\" /* ALPHABET.PT */:\n return AminoacidsPalettes.GrokGroups;\n case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\n return NucleotidesPalettes.Chromatogram;\n // other\n default:\n return UnknownSeqPalettes.Color;\n }\n}\nexport function pickUpSeqCol(df) {\n const semTypeColList = df.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);\n let resCol = semTypeColList.find((col) => {\n const units = col.getTag(DG.TAGS.UNITS);\n return units ? units.indexOf('MSA') !== -1 : false;\n }) ?? null;\n if (!resCol && semTypeColList.length > 0)\n resCol = semTypeColList[0];\n return resCol;\n}\n//# sourceMappingURL=utils.js.map","export function hamming(args = {}) {\n function getDistanceF() {\n if (!args || !args.scoringMatrix || !args.alphabetIndexes)\n return (a, b) => a === b ? 0 : 1;\n if (args.scoringMatrix.length !== Object.keys(args.alphabetIndexes).length)\n throw new Error('Scoring matrix and alphabet indexes should have the same length');\n const indexes = args.alphabetIndexes;\n const matrix = args.scoringMatrix;\n //const matrixMap = new Map<string, Map<string, number>>();\n //const map2: any = {};\n const minCharCode = Math.min(...Object.keys(indexes).map((k) => k.charCodeAt(0))) + 1;\n const scorringArray = new Float32Array((matrix.length + minCharCode) * (matrix.length + minCharCode));\n Object.entries(indexes).forEach(([key, index]) => {\n //matrixMap.set(key, new Map<string, number>());\n //map2[key] = {};\n const matrixRow = matrix[index];\n Object.entries(indexes).forEach(([key2, index2]) => {\n //matrixMap.get(key)!.set(key2, matrixRow[index2]);\n scorringArray[key.charCodeAt(0) * matrix.length + key2.charCodeAt(0)] = matrixRow[index2];\n //map2[key][key2] = matrixRow[index2];\n });\n });\n return (a, b) => {\n return scorringArray[a.charCodeAt(0) * matrix.length + b.charCodeAt(0)];\n };\n }\n const distanceF = getDistanceF();\n const threshold = args?.threshold ?? 0;\n return (seq1, seq2) => {\n // hamming distance should only be used with same size strings,\n // but still, lets add a check and if they are not same length add the difference to the result\n let diff = 0;\n const s1l = seq1.length;\n const s2l = seq2.length;\n const thresholdLimit = Math.max(s1l, s2l) * (1 - threshold);\n if (s1l !== s2l)\n diff = Math.abs(s1l - s2l);\n let result = 0;\n for (let i = 0; i < Math.min(s1l, s2l); i++) {\n if (seq1[i] !== seq2[i]) {\n result += distanceF(seq1[i], seq2[i]);\n if (result > thresholdLimit)\n return 1;\n }\n }\n result += diff;\n result /= Math.max(s1l, s2l);\n return result;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFtbWluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhhbW1pbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLE9BQU8sQ0FBQyxPQUF3QyxFQUFFO0lBQ2hFLFNBQVMsWUFBWTtRQUNuQixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlO1lBQ3ZELE9BQU8sQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU07WUFDeEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNsQywyREFBMkQ7UUFDM0QsdUJBQXVCO1FBQ3ZCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXRGLE1BQU0sYUFBYSxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUN0RyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDL0MsZ0RBQWdEO1lBQ2hELGlCQUFpQjtZQUNqQixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFO2dCQUNqRCxtREFBbUQ7Z0JBQ25ELGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDMUYsc0NBQXNDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFO1lBQzlCLE9BQU8sYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLFlBQVksRUFBRSxDQUFDO0lBRWpDLE1BQU0sU0FBUyxHQUFHLElBQUksRUFBRSxTQUFTLElBQUksQ0FBQyxDQUFDO0lBRXZDLE9BQU8sQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLEVBQUU7UUFDcEMsK0RBQStEO1FBQy9ELCtGQUErRjtRQUMvRixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDeEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7UUFDNUQsSUFBSSxHQUFHLEtBQUssR0FBRztZQUNiLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUU3QixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDM0MsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN2QixNQUFNLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxNQUFNLEdBQUcsY0FBYztvQkFDekIsT0FBTyxDQUFDLENBQUM7YUFDWjtTQUNGO1FBQ0QsTUFBTSxJQUFJLElBQUksQ0FBQztRQUNmLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM3QixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25BcmdzLCBtbURpc3RhbmNlRnVuY3Rpb25UeXBlfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGhhbW1pbmcoYXJnczogUGFydGlhbDxtbURpc3RhbmNlRnVuY3Rpb25BcmdzPiA9IHt9KTogbW1EaXN0YW5jZUZ1bmN0aW9uVHlwZSB7XG4gIGZ1bmN0aW9uIGdldERpc3RhbmNlRigpOiAoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IG51bWJlciB7XG4gICAgaWYgKCFhcmdzIHx8ICFhcmdzLnNjb3JpbmdNYXRyaXggfHwgIWFyZ3MuYWxwaGFiZXRJbmRleGVzKVxuICAgICAgcmV0dXJuIChhOiBzdHJpbmcsIGI6IHN0cmluZykgPT4gYSA9PT0gYiA/IDAgOiAxO1xuICAgIGlmIChhcmdzLnNjb3JpbmdNYXRyaXgubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhhcmdzLmFscGhhYmV0SW5kZXhlcykubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTY29yaW5nIG1hdHJpeCBhbmQgYWxwaGFiZXQgaW5kZXhlcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGgnKTtcbiAgICBjb25zdCBpbmRleGVzID0gYXJncy5hbHBoYWJldEluZGV4ZXM7XG4gICAgY29uc3QgbWF0cml4ID0gYXJncy5zY29yaW5nTWF0cml4O1xuICAgIC8vY29uc3QgbWF0cml4TWFwID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlcj4+KCk7XG4gICAgLy9jb25zdCBtYXAyOiBhbnkgPSB7fTtcbiAgICBjb25zdCBtaW5DaGFyQ29kZSA9IE1hdGgubWluKC4uLk9iamVjdC5rZXlzKGluZGV4ZXMpLm1hcCgoaykgPT4gay5jaGFyQ29kZUF0KDApKSkgKyAxO1xuXG4gICAgY29uc3Qgc2NvcnJpbmdBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoKG1hdHJpeC5sZW5ndGggKyBtaW5DaGFyQ29kZSkgKiAobWF0cml4Lmxlbmd0aCArIG1pbkNoYXJDb2RlKSk7XG4gICAgT2JqZWN0LmVudHJpZXMoaW5kZXhlcykuZm9yRWFjaCgoW2tleSwgaW5kZXhdKSA9PiB7XG4gICAgICAvL21hdHJpeE1hcC5zZXQoa2V5LCBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpKTtcbiAgICAgIC8vbWFwMltrZXldID0ge307XG4gICAgICBjb25zdCBtYXRyaXhSb3cgPSBtYXRyaXhbaW5kZXhdO1xuICAgICAgT2JqZWN0LmVudHJpZXMoaW5kZXhlcykuZm9yRWFjaCgoW2tleTIsIGluZGV4Ml0pID0+IHtcbiAgICAgICAgLy9tYXRyaXhNYXAuZ2V0KGtleSkhLnNldChrZXkyLCBtYXRyaXhSb3dbaW5kZXgyXSk7XG4gICAgICAgIHNjb3JyaW5nQXJyYXlba2V5LmNoYXJDb2RlQXQoMCkgKiBtYXRyaXgubGVuZ3RoICsga2V5Mi5jaGFyQ29kZUF0KDApXSA9IG1hdHJpeFJvd1tpbmRleDJdO1xuICAgICAgICAvL21hcDJba2V5XVtrZXkyXSA9IG1hdHJpeFJvd1tpbmRleDJdO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIChhOiBzdHJpbmcsIGI6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIHNjb3JyaW5nQXJyYXlbYS5jaGFyQ29kZUF0KDApICogbWF0cml4Lmxlbmd0aCArIGIuY2hhckNvZGVBdCgwKV07XG4gICAgfTtcbiAgfVxuICBjb25zdCBkaXN0YW5jZUYgPSBnZXREaXN0YW5jZUYoKTtcblxuICBjb25zdCB0aHJlc2hvbGQgPSBhcmdzPy50aHJlc2hvbGQgPz8gMDtcblxuICByZXR1cm4gKHNlcTE6IHN0cmluZywgc2VxMjogc3RyaW5nKSA9PiB7XG4gICAgLy8gaGFtbWluZyBkaXN0YW5jZSBzaG91bGQgb25seSBiZSB1c2VkIHdpdGggc2FtZSBzaXplIHN0cmluZ3MsXG4gICAgLy8gYnV0IHN0aWxsLCBsZXRzIGFkZCBhIGNoZWNrIGFuZCBpZiB0aGV5IGFyZSBub3Qgc2FtZSBsZW5ndGggYWRkIHRoZSBkaWZmZXJlbmNlIHRvIHRoZSByZXN1bHRcbiAgICBsZXQgZGlmZiA9IDA7XG4gICAgY29uc3QgczFsID0gc2VxMS5sZW5ndGg7XG4gICAgY29uc3QgczJsID0gc2VxMi5sZW5ndGg7XG4gICAgY29uc3QgdGhyZXNob2xkTGltaXQgPSBNYXRoLm1heChzMWwsIHMybCkgKiAoMSAtIHRocmVzaG9sZCk7XG4gICAgaWYgKHMxbCAhPT0gczJsKVxuICAgICAgZGlmZiA9IE1hdGguYWJzKHMxbCAtIHMybCk7XG5cbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKHMxbCwgczJsKTsgaSsrKSB7XG4gICAgICBpZiAoc2VxMVtpXSAhPT0gc2VxMltpXSkge1xuICAgICAgICByZXN1bHQgKz0gZGlzdGFuY2VGKHNlcTFbaV0sIHNlcTJbaV0pO1xuICAgICAgICBpZiAocmVzdWx0ID4gdGhyZXNob2xkTGltaXQpXG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdCArPSBkaWZmO1xuICAgIHJlc3VsdCAvPSBNYXRoLm1heChzMWwsIHMybCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cbiJdfQ==","const peq = new Uint32Array(0x10000);\nconst myers_32 = (a, b) => {\n const n = a.length;\n const m = b.length;\n const lst = 1 << (n - 1);\n let pv = -1;\n let mv = 0;\n let sc = n;\n let i = n;\n while (i--) {\n peq[a.charCodeAt(i)] |= 1 << i;\n }\n for (i = 0; i < m; i++) {\n let eq = peq[b.charCodeAt(i)];\n const xv = eq | mv;\n eq |= ((eq & pv) + pv) ^ pv;\n mv |= ~(eq | pv);\n pv &= eq;\n if (mv & lst) {\n sc++;\n }\n if (pv & lst) {\n sc--;\n }\n mv = (mv << 1) | 1;\n pv = (pv << 1) | ~(xv | mv);\n mv &= xv;\n }\n i = n;\n while (i--) {\n peq[a.charCodeAt(i)] = 0;\n }\n return sc;\n};\nconst myers_x = (b, a) => {\n const n = a.length;\n const m = b.length;\n const mhc = [];\n const phc = [];\n const hsize = Math.ceil(n / 32);\n const vsize = Math.ceil(m / 32);\n for (let i = 0; i < hsize; i++) {\n phc[i] = -1;\n mhc[i] = 0;\n }\n let j = 0;\n for (; j < vsize - 1; j++) {\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] |= 1 << k;\n }\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)];\n const pb = (phc[(i / 32) | 0] >>> i) & 1;\n const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0] ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0] ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n }\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m - start) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] |= 1 << k;\n }\n let score = m;\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)];\n const pb = (phc[(i / 32) | 0] >>> i) & 1;\n const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n score += (ph >>> (m - 1)) & 1;\n score -= (mh >>> (m - 1)) & 1;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0] ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0] ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n return score;\n};\nconst distance = (a, b) => {\n if (a.length < b.length) {\n const tmp = b;\n b = a;\n a = tmp;\n }\n if (b.length === 0) {\n return a.length;\n }\n if (a.length <= 32) {\n return myers_32(a, b);\n }\n return myers_x(a, b);\n};\nconst closest = (str, arr) => {\n let min_distance = Infinity;\n let min_index = 0;\n for (let i = 0; i < arr.length; i++) {\n const dist = distance(str, arr[i]);\n if (dist < min_distance) {\n min_distance = dist;\n min_index = i;\n }\n }\n return arr[min_index];\n};\nexport { closest, distance };\n","// Blosum 62 matrix for protein sequences\nconst BLOSUM62 = [[4, -1, -2, -2, 0, -1, -1, 0, -2, -1, -1, -1, -1, -2, -1, 1, 0, -3, -2, 0, -2, -1, 0, -4],\n [-1, 5, 0, -2, -3, 1, 0, -2, 0, -3, -2, 2, -1, -3, -2, -1, -1, -3, -2, -3, -1, 0, -1, -4],\n [-2, 0, 6, 1, -3, 0, 0, 0, 1, -3, -3, 0, -2, -3, -2, 1, 0, -4, -2, -3, 3, 0, -1, -4],\n [-2, -2, 1, 6, -3, 0, 2, -1, -1, -3, -4, -1, -3, -3, -1, 0, -1, -4, -3, -3, 4, 1, -1, -4],\n [0, -3, -3, -3, 9, -3, -4, -3, -3, -1, -1, -3, -1, -2, -3, -1, -1, -2, -2, -1, -3, -3, -2, -4],\n [-1, 1, 0, 0, -3, 5, 2, -2, 0, -3, -2, 1, 0, -3, -1, 0, -1, -2, -1, -2, 0, 3, -1, -4],\n [-1, 0, 0, 2, -4, 2, 5, -2, 0, -3, -3, 1, -2, -3, -1, 0, -1, -3, -2, -2, 1, 4, -1, -4],\n [0, -2, 0, -1, -3, -2, -2, 6, -2, -4, -4, -2, -3, -3, -2, 0, -2, -2, -3, -3, -1, -2, -1, -4],\n [-2, 0, 1, -1, -3, 0, 0, -2, 8, -3, -3, -1, -2, -1, -2, -1, -2, -2, 2, -3, 0, 0, -1, -4],\n [-1, -3, -3, -3, -1, -3, -3, -4, -3, 4, 2, -3, 1, 0, -3, -2, -1, -3, -1, 3, -3, -3, -1, -4],\n [-1, -2, -3, -4, -1, -2, -3, -4, -3, 2, 4, -2, 2, 0, -3, -2, -1, -2, -1, 1, -4, -3, -1, -4],\n [-1, 2, 0, -1, -3, 1, 1, -2, -1, -3, -2, 5, -1, -3, -1, 0, -1, -3, -2, -2, 0, 1, -1, -4],\n [-1, -1, -2, -3, -1, 0, -2, -3, -2, 1, 2, -1, 5, 0, -2, -1, -1, -1, -1, 1, -3, -1, -1, -4],\n [-2, -3, -3, -3, -2, -3, -3, -3, -1, 0, 0, -3, 0, 6, -4, -2, -2, 1, 3, -1, -3, -3, -1, -4],\n [-1, -2, -2, -1, -3, -1, -1, -2, -2, -3, -3, -1, -2, -4, 7, -1, -1, -4, -3, -2, -2, -1, -2, -4],\n [1, -1, 1, 0, -1, 0, 0, 0, -1, -2, -2, 0, -1, -2, -1, 4, 1, -3, -2, -2, 0, 0, 0, -4],\n [0, -1, 0, -1, -1, -1, -1, -2, -2, -1, -1, -1, -1, -2, -1, 1, 5, -2, -2, 0, -1, -1, 0, -4],\n [-3, -3, -4, -4, -2, -2, -3, -2, -2, -3, -2, -3, -1, 1, -4, -3, -2, 11, 2, -3, -4, -3, -2, -4],\n [-2, -2, -2, -3, -2, -1, -2, -3, 2, -1, -1, -2, -1, 3, -3, -2, -2, 2, 7, -1, -3, -2, -1, -4],\n [0, -3, -3, -3, -1, -2, -2, -3, -3, 3, 1, -2, 1, -1, -2, -2, 0, -3, -1, 4, -3, -2, -1, -4],\n [-2, -1, 3, 4, -3, 0, 1, -1, 0, -3, -4, 0, -3, -3, -2, 0, -1, -4, -3, -3, 4, 1, -1, -4],\n [-1, 0, 0, 1, -3, 3, 4, -2, 0, -3, -3, 1, -1, -3, -1, 0, -1, -3, -2, -2, 1, 4, -1, -4],\n [0, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, 0, 0, -2, -1, -1, -1, -1, -1, -4],\n [-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, 1]];\n// Protein indexes for BLOSUM matrix\nconst ProtIndexes = {\n 'A': 0, 'R': 1, 'N': 2, 'D': 3, 'C': 4, 'Q': 5, 'E': 6, 'G': 7, 'H': 8,\n 'I': 9, 'L': 10, 'K': 11, 'M': 12, 'F': 13, 'P': 14, 'S': 15, 'T': 16,\n 'W': 17, 'Y': 18, 'V': 19, 'B': 20, 'Z': 21, 'X': 22, '*': 23\n};\nconst defaultArgs = {\n gapOpen: 1,\n gapExtend: 0.6,\n scoringMatrix: BLOSUM62,\n alphabetIndexes: ProtIndexes\n};\n/** Returns a function that calculates the distance between two sequences based on gap penalty and matrix\n * @param {Partial<NeedlemanWunchArgs>}args - arguments for Needleman-Wunch algorithm like gap penalty, Scoring matrix..\n * @return {mmDistanceFunctionType} - function that calculates the distance between two sequences\n*/\nexport function needlemanWunch(args) {\n const maxLen = 10000;\n const charCodeArray = new Uint16Array(0x10000);\n const { gapOpen, gapExtend, scoringMatrix, alphabetIndexes } = { ...defaultArgs, ...args };\n Object.entries(alphabetIndexes).forEach(([k, v]) => charCodeArray[k.charCodeAt(0)] = v);\n // As we don't need traceback, no need to store the whole matrix\n // Intead, we will store only the last two rows\n const matrix = [\n new Float32Array(maxLen),\n new Float32Array(maxLen)\n ];\n return (seq1, seq2) => {\n // similarly, we need to keep track of what operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n const verticalGaps = new Array(seq1.length + 1).fill(false);\n const horizontalGaps = new Array(seq1.length + 1).fill(false);\n //variables to keep track which row we are in\n // they will swap places on each iteration\n let prevRow = 0;\n let currRow = 1;\n // Initialize first row\n for (let i = 1; i < seq1.length + 1; i++) {\n matrix[0][i] = -gapOpen - (i - 1) * gapExtend;\n matrix[1][i] = 0;\n }\n matrix[0][0] = 0;\n // Calculate the rest of the matrix\n for (let i = 1; i < seq2.length + 1; i++) {\n matrix[currRow][0] = -gapOpen - (i - 1) * gapExtend;\n for (let j = 1; j < seq1.length + 1; j++) {\n const diagonal = matrix[prevRow][j - 1] +\n scoringMatrix[charCodeArray[seq1.charCodeAt(j - 1)]][charCodeArray[seq2.charCodeAt(i - 1)]];\n const top = matrix[prevRow][j] - (verticalGaps[j] ? gapExtend : gapOpen);\n const left = matrix[currRow][j - 1] - (horizontalGaps[j - 1] ? gapExtend : gapOpen);\n matrix[currRow][j] = Math.max(diagonal, left, top);\n // update gap arrays\n if (matrix[currRow][j] === diagonal) {\n verticalGaps[j] = false;\n horizontalGaps[j] = false;\n }\n else if (matrix[currRow][j] === left) {\n verticalGaps[j] = false;\n horizontalGaps[j] = true;\n }\n else {\n verticalGaps[j] = true;\n horizontalGaps[j] = false;\n }\n }\n // Swap rows\n prevRow = currRow;\n currRow = (currRow + 1) % 2;\n }\n // as the matrix is the similarity matrix, but we are interested in distance,\n // we need compare it to perfect match score to get reasonable distance\n // const perfectMatchSeq1 = seq1.split('').map((c) => scoringMatrix[alphabetIndexes[c]][alphabetIndexes[c]])\n // .reduce((a, b) => a + b, 0);\n // const perfectMatchSeq2 = seq2.split('').map((c) => scoringMatrix[alphabetIndexes[c]][alphabetIndexes[c]])\n // .reduce((a, b) => a + b, 0);\n // const maxScore = Math.max(perfectMatchSeq1, perfectMatchSeq2);\n const maxScore = Math.max(seq1.length, seq2.length);\n return (maxScore - matrix[prevRow][seq1.length]) / maxScore;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVlZGxlbWFuLXd1bnNjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5lZWRsZW1hbi13dW5zY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEseUNBQXlDO0FBQ3pDLE1BQU0sUUFBUSxHQUNkLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUYsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFD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TUFBTSxDQUFDLENBQUM7UUFDcEQsT0FBTyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBQzlELENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge21tRGlzdGFuY2VGdW5jdGlvbkFyZ3MsIG1tRGlzdGFuY2VGdW5jdGlvblR5cGV9IGZyb20gJy4vdHlwZXMnO1xuXG4vLyBCbG9zdW0gNjIgbWF0cml4IGZvciBwcm90ZWluIHNlcXVlbmNlc1xuY29uc3QgQkxPU1VNNjI6QXJyYXk8QXJyYXk8bnVtYmVyPj4gPVxuW1s0LCAtMSwgLTIsIC0yLCAwLCAtMSwgLTEsIDAsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTIsIC0xLCAxLCAwLCAtMywgLTIsIDAsIC0yLCAtMSwgMCwgLTRdLFxuICBbLTEsIDUsIDAsIC0yLCAtMywgMSwgMCwgLTIsIDAsIC0zLCAtMiwgMiwgLTEsIC0zLCAtMiwgLTEsIC0xLCAtMywgLTIsIC0zLCAtMSwgMCwgLTEsIC00XSxcbiAgWy0yLCAwLCA2LCAxLCAtMywgMCwgMCwgMCwgMSwgLTMsIC0zLCAwLCAtMiwgLTMsIC0yLCAxLCAwLCAtNCwgLTIsIC0zLCAzLCAwLCAtMSwgLTRdLFxuICBbLTIsIC0yLCAxLCA2LCAtMywgMCwgMiwgLTEsIC0xLCAtMywgLTQsIC0xLCAtMywgLTMsIC0xLCAwLCAtMSwgLTQsIC0zLCAtMywgNCwgMSwgLTEsIC00XSxcbiAgWzAsIC0zLCAtMywgLTMsIDksIC0zLCAtNCwgLTMsIC0zLCAtMSwgLTEsIC0zLCAtMSwgLTIsIC0zLCAtMSwgLTEsIC0yLCAtMiwgLTEsIC0zLCAtMywgLTIsIC00XSxcbiAgWy0xLCAxLCAwLCAwLCAtMywgNSwgMiwgLTIsIDAsIC0zLCAtMiwgMSwgMCwgLTMsIC0xLCAwLCAtMSwgLTIsIC0xLCAtMiwgMCwgMywgLTEsIC00XSxcbiAgWy0xLCAwLCAwLCAyLCAtNCwgMiwgNSwgLTIsIDAsIC0zLCAtMywgMSwgLTIsIC0zLCAtMSwgMCwgLTEsIC0zLCAtMiwgLTIsIDEsIDQsIC0xLCAtNF0sXG4gIFswLCAtMiwgMCwgLTEsIC0zLCAtMiwgLTIsIDYsIC0yLCAtNCwgLTQsIC0yLCAtMywgLTMsIC0yLCAwLCAtMiwgLTIsIC0zLCAtMywgLTEsIC0yLCAtMSwgLTRdLFxuICBbLTIsIDAsIDEsIC0xLCAtMywgMCwgMCwgLTIsIDgsIC0zLCAtMywgLTEsIC0yLCAtMSwgLTIsIC0xLCAtMiwgLTIsIDIsIC0zLCAwLCAwLCAtMSwgLTRdLFxuICBbLTEsIC0zLCAtMywgLTMsIC0xLCAtMywgLTMsIC00LCAtMywgNCwgMiwgLTMsIDEsIDAsIC0zLCAtMiwgLTEsIC0zLCAtMSwgMywgLTMsIC0zLCAtMSwgLTRdLFxuICBbLTEsIC0yLCAtMywgLTQsIC0xLCAtMiwgLTMsIC00LCAtMywgMiwgNCwgLTIsIDIsIDAsIC0zLCAtMiwgLTEsIC0yLCAtMSwgMSwgLTQsIC0zLCAtMSwgLTRdLFxuICBbLTEsIDIsIDAsIC0xLCAtMywgMSwgMSwgLTIsIC0xLCAtMywgLTIsIDUsIC0xLCAtMywgLTEsIDAsIC0xLCAtMywgLTIsIC0yLCAwLCAxLCAtMSwgLTRdLFxuICBbLTEsIC0xLCAtMiwgLTMsIC0xLCAwLCAtMiwgLTMsIC0yLCAxLCAyLCAtMSwgNSwgMCwgLTIsIC0xLCAtMSwgLTEsIC0xLCAxLCAtMywgLTEsIC0xLCAtNF0sXG4gIFstMiwgLTMsIC0zLCAtMywgLTIsIC0zLCAtMywgLTMsIC0xLCAwLCAwLCAtMywgMCwgNiwgLTQsIC0yLCAtMiwgMSwgMywgLTEsIC0zLCAtMywgLTEsIC00XSxcbiAgWy0xLCAtMiwgLTIsIC0xLCAtMywgLTEsIC0xLCAtMiwgLTIsIC0zLCAtMywgLTEsIC0yLCAtNCwgNywgLTEsIC0xLCAtNCwgLTMsIC0yLCAtMiwgLTEsIC0yLCAtNF0sXG4gIFsxLCAtMSwgMSwgMCwgLTEsIDAsIDAsIDAsIC0xLCAtMiwgLTIsIDAsIC0xLCAtMiwgLTEsIDQsIDEsIC0zLCAtMiwgLTIsIDAsIDAsIDAsIC00XSxcbiAgWzAsIC0xLCAwLCAtMSwgLTEsIC0xLCAtMSwgLTIsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTIsIC0xLCAxLCA1LCAtMiwgLTIsIDAsIC0xLCAtMSwgMCwgLTRdLFxuICBbLTMsIC0zLCAtNCwgLTQsIC0yLCAtMiwgLTMsIC0yLCAtMiwgLTMsIC0yLCAtMywgLTEsIDEsIC00LCAtMywgLTIsIDExLCAyLCAtMywgLTQsIC0zLCAtMiwgLTRdLFxuICBbLTIsIC0yLCAtMiwgLTMsIC0yLCAtMSwgLTIsIC0zLCAyLCAtMSwgLTEsIC0yLCAtMSwgMywgLTMsIC0yLCAtMiwgMiwgNywgLTEsIC0zLCAtMiwgLTEsIC00XSxcbiAgWzAsIC0zLCAtMywgLTMsIC0xLCAtMiwgLTIsIC0zLCAtMywgMywgMSwgLTIsIDEsIC0xLCAtMiwgLTIsIDAsIC0zLCAtMSwgNCwgLTMsIC0yLCAtMSwgLTRdLFxuICBbLTIsIC0xLCAzLCA0LCAtMywgMCwgMSwgLTEsIDAsIC0zLCAtNCwgMCwgLTMsIC0zLCAtMiwgMCwgLTEsIC00LCAtMywgLTMsIDQsIDEsIC0xLCAtNF0sXG4gIFstMSwgMCwgMCwgMSwgLTMsIDMsIDQsIC0yLCAwLCAtMywgLTMsIDEsIC0xLCAtMywgLTEsIDAsIC0xLCAtMywgLTIsIC0yLCAxLCA0LCAtMSwgLTRdLFxuICBbMCwgLTEsIC0xLCAtMSwgLTIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0yLCAwLCAwLCAtMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtNF0sXG4gIFstNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIDFdXTtcblxuLy8gUHJvdGVpbiBpbmRleGVzIGZvciBCTE9TVU0gbWF0cml4XG5jb25zdCBQcm90SW5kZXhlczoge1tpZDpzdHJpbmddOm51bWJlcn0gPSB7XG4gICdBJzogMCwgJ1InOiAxLCAnTic6IDIsICdEJzogMywgJ0MnOiA0LCAnUSc6IDUsICdFJzogNiwgJ0cnOiA3LCAnSCc6IDgsXG4gICdJJzogOSwgJ0wnOiAxMCwgJ0snOiAxMSwgJ00nOiAxMiwgJ0YnOiAxMywgJ1AnOiAxNCwgJ1MnOiAxNSwgJ1QnOiAxNixcbiAgJ1cnOiAxNywgJ1knOiAxOCwgJ1YnOiAxOSwgJ0InOiAyMCwgJ1onOiAyMSwgJ1gnOiAyMiwgJyonOiAyM1xufTtcblxudHlwZSBOZWVkbGVtYW5XdW5jaEFyZ3MgPSBtbURpc3RhbmNlRnVuY3Rpb25BcmdzICYge1xuICBnYXBPcGVuOiBudW1iZXI7XG4gIGdhcEV4dGVuZDogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0QXJnczogTmVlZGxlbWFuV3VuY2hBcmdzID0ge1xuICBnYXBPcGVuOiAxLFxuICBnYXBFeHRlbmQ6IDAuNixcbiAgc2NvcmluZ01hdHJpeDogQkxPU1VNNjIsXG4gIGFscGhhYmV0SW5kZXhlczogUHJvdEluZGV4ZXNcbn07XG5cbi8qKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYWxjdWxhdGVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzZXF1ZW5jZXMgYmFzZWQgb24gZ2FwIHBlbmFsdHkgYW5kIG1hdHJpeFxuICogQHBhcmFtIHtQYXJ0aWFsPE5lZWRsZW1hbld1bmNoQXJncz59YXJncyAtIGFyZ3VtZW50cyBmb3IgTmVlZGxlbWFuLVd1bmNoIGFsZ29yaXRobSBsaWtlIGdhcCBwZW5hbHR5LCBTY29yaW5nIG1hdHJpeC4uXG4gKiBAcmV0dXJuIHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSAtIGZ1bmN0aW9uIHRoYXQgY2FsY3VsYXRlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gc2VxdWVuY2VzXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIG5lZWRsZW1hbld1bmNoKGFyZ3M6IFBhcnRpYWw8TmVlZGxlbWFuV3VuY2hBcmdzPik6IG1tRGlzdGFuY2VGdW5jdGlvblR5cGUge1xuICBjb25zdCBtYXhMZW4gPSAxMDAwMDtcbiAgY29uc3QgY2hhckNvZGVBcnJheSA9IG5ldyBVaW50MTZBcnJheSgweDEwMDAwKTtcblxuICBjb25zdCB7Z2FwT3BlbiwgZ2FwRXh0ZW5kLCBzY29yaW5nTWF0cml4LCBhbHBoYWJldEluZGV4ZXN9ID0gey4uLmRlZmF1bHRBcmdzLCAuLi5hcmdzfTtcbiAgT2JqZWN0LmVudHJpZXMoYWxwaGFiZXRJbmRleGVzKS5mb3JFYWNoKChbaywgdl0pID0+IGNoYXJDb2RlQXJyYXlbay5jaGFyQ29kZUF0KDApXSA9IHYpO1xuICAvLyBBcyB3ZSBkb24ndCBuZWVkIHRyYWNlYmFjaywgbm8gbmVlZCB0byBzdG9yZSB0aGUgd2hvbGUgbWF0cml4XG4gIC8vIEludGVhZCwgd2Ugd2lsbCBzdG9yZSBvbmx5IHRoZSBsYXN0IHR3byByb3dzXG4gIGNvbnN0IG1hdHJpeDogQXJyYXk8RmxvYXQzMkFycmF5PiA9IFtcbiAgICBuZXcgRmxvYXQzMkFycmF5KG1heExlbiksXG4gICAgbmV3IEZsb2F0MzJBcnJheShtYXhMZW4pXG4gIF07XG4gIHJldHVybiAoc2VxMTogc3RyaW5nLCBzZXEyOiBzdHJpbmcpIDogbnVtYmVyID0+IHtcbiAgICAvLyBzaW1pbGFybHksIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGF0IG9wZXJhdGlvbiBsZWQgdG8gdGhlIGN1cnJlbnQgY2VsbFxuICAgIC8vIGkuZS4gd2hldGhlciB3ZSBjYW1lIGZyb20gdGhlIGxlZnQsIHRvcCBvciBkaWFnb25hbCB0byBhc3NpZ24gZ2FwIG9wZW4vZ2FwIGV4dGVuZCBwZW5hbHR5XG5cbiAgICBjb25zdCB2ZXJ0aWNhbEdhcHM6IGJvb2xlYW5bXSA9IG5ldyBBcnJheTxib29sZWFuPihzZXExLmxlbmd0aCArMSkuZmlsbChmYWxzZSk7XG4gICAgY29uc3QgaG9yaXpvbnRhbEdhcHM6IGJvb2xlYW5bXSA9IG5ldyBBcnJheTxib29sZWFuPihzZXExLmxlbmd0aCArMSkuZmlsbChmYWxzZSk7XG4gICAgLy92YXJpYWJsZXMgdG8ga2VlcCB0cmFjayB3aGljaCByb3cgd2UgYXJlIGluXG4gICAgLy8gdGhleSB3aWxsIHN3YXAgcGxhY2VzIG9uIGVhY2ggaXRlcmF0aW9uXG4gICAgbGV0IHByZXZSb3cgPSAwO1xuICAgIGxldCBjdXJyUm93ID0gMTtcbiAgICAvLyBJbml0aWFsaXplIGZpcnN0IHJvd1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc2VxMS5sZW5ndGggKyAxOyBpKyspIHtcbiAgICAgIG1hdHJpeFswXVtpXSA9IC1nYXBPcGVuIC0gKGkgLSAxKSAqIGdhcEV4dGVuZDtcbiAgICAgIG1hdHJpeFsxXVtpXSA9IDA7XG4gICAgfVxuICAgIG1hdHJpeFswXVswXSA9IDA7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIHJlc3Qgb2YgdGhlIG1hdHJpeFxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc2VxMi5sZW5ndGggKyAxOyBpKyspIHtcbiAgICAgIG1hdHJpeFtjdXJyUm93XVswXSA9IC1nYXBPcGVuIC0gKGkgLSAxKSAqIGdhcEV4dGVuZDtcbiAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgc2VxMS5sZW5ndGggKyAxOyBqKyspIHtcbiAgICAgICAgY29uc3QgZGlhZ29uYWwgPVxuICAgICAgICAgIG1hdHJpeFtwcmV2Um93XVtqIC0gMV0gK1xuICAgICAgICAgICAgc2NvcmluZ01hdHJpeFtjaGFyQ29kZUFycmF5W3NlcTEuY2hhckNvZGVBdChqIC0gMSldXVtjaGFyQ29kZUFycmF5W3NlcTIuY2hhckNvZGVBdChpIC0gMSldXTtcbiAgICAgICAgY29uc3QgdG9wID0gbWF0cml4W3ByZXZSb3ddW2pdIC0gKHZlcnRpY2FsR2Fwc1tqXSA/IGdhcEV4dGVuZCA6IGdhcE9wZW4gKTtcbiAgICAgICAgY29uc3QgbGVmdCA9IG1hdHJpeFtjdXJyUm93XVtqIC0gMV0gLSAoaG9yaXpvbnRhbEdhcHNbaiAtIDFdID8gZ2FwRXh0ZW5kIDogZ2FwT3Blbik7XG4gICAgICAgIG1hdHJpeFtjdXJyUm93XVtqXSA9IE1hdGgubWF4KFxuICAgICAgICAgIGRpYWdvbmFsLCBsZWZ0LCB0b3BcbiAgICAgICAgKTtcbiAgICAgICAgLy8gdXBkYXRlIGdhcCBhcnJheXNcbiAgICAgICAgaWYgKG1hdHJpeFtjdXJyUm93XVtqXSA9PT0gZGlhZ29uYWwpIHtcbiAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSBmYWxzZTtcbiAgICAgICAgICBob3Jpem9udGFsR2Fwc1tqXSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKG1hdHJpeFtjdXJyUm93XVtqXSA9PT0gbGVmdCkge1xuICAgICAgICAgIHZlcnRpY2FsR2Fwc1tqXSA9IGZhbHNlO1xuICAgICAgICAgIGhvcml6b250YWxHYXBzW2pdID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSB0cnVlO1xuICAgICAgICAgIGhvcml6b250YWxHYXBzW2pdID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFN3YXAgcm93c1xuICAgICAgcHJldlJvdyA9IGN1cnJSb3c7XG4gICAgICBjdXJyUm93ID0gKGN1cnJSb3cgKyAxKSAlIDI7XG4gICAgfVxuICAgIC8vIGFzIHRoZSBtYXRyaXggaXMgdGhlIHNpbWlsYXJpdHkgbWF0cml4LCBidXQgd2UgYXJlIGludGVyZXN0ZWQgaW4gZGlzdGFuY2UsXG4gICAgLy8gd2UgbmVlZCBjb21wYXJlIGl0IHRvIHBlcmZlY3QgbWF0Y2ggc2NvcmUgdG8gZ2V0IHJlYXNvbmFibGUgZGlzdGFuY2VcbiAgICAvLyBjb25zdCBwZXJmZWN0TWF0Y2hTZXExID0gc2VxMS5zcGxpdCgnJykubWFwKChjKSA9PiBzY29yaW5nTWF0cml4W2FscGhhYmV0SW5kZXhlc1tjXV1bYWxwaGFiZXRJbmRleGVzW2NdXSlcbiAgICAvLyAgIC5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICAvLyBjb25zdCBwZXJmZWN0TWF0Y2hTZXEyID0gc2VxMi5zcGxpdCgnJykubWFwKChjKSA9PiBzY29yaW5nTWF0cml4W2FscGhhYmV0SW5kZXhlc1tjXV1bYWxwaGFiZXRJbmRleGVzW2NdXSlcbiAgICAvLyAgIC5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICAvLyBjb25zdCBtYXhTY29yZSA9IE1hdGgubWF4KHBlcmZlY3RNYXRjaFNlcTEsIHBlcmZlY3RNYXRjaFNlcTIpO1xuICAgIGNvbnN0IG1heFNjb3JlID0gTWF0aC5tYXgoc2VxMS5sZW5ndGgsIHNlcTIubGVuZ3RoKTtcbiAgICByZXR1cm4gKG1heFNjb3JlIC0gbWF0cml4W3ByZXZSb3ddW3NlcTEubGVuZ3RoXSkgLyBtYXhTY29yZTtcbiAgfTtcbn1cbiJdfQ==","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[\"MONOMER_CHEMICAL_DISTANCE\"] = \"Monomer chemical distance\";\n})(MmDistanceFunctionsNames || (MmDistanceFunctionsNames = {}));\n;\nexport const mmDistanceFunctions = {\n [MmDistanceFunctionsNames.HAMMING]: hamming,\n [MmDistanceFunctionsNames.LEVENSHTEIN]: levenstein,\n [MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH]: needlemanWunch,\n [MmDistanceFunctionsNames.MONOMER_CHEMICAL_DISTANCE]: hamming\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjcm9tb2xlY3VsZS1kaXN0YW5jZS1mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNyb21vbGVjdWxlLWRpc3RhbmNlLWZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR2xEOzs7O0dBSUc7QUFDSCxNQUFNLENBQU4sSUFBWSx3QkFLWDtBQUxELFdBQVksd0JBQXdCO0lBQ2hDLCtDQUFtQixDQUFBO0lBQ25CLHVEQUEyQixDQUFBO0lBQzNCLG1FQUF1QyxDQUFBO0lBQ3ZDLG1GQUF1RCxDQUFBO0FBQzNELENBQUMsRUFMVyx3QkFBd0IsS0FBeEIsd0JBQXdCLFFBS25DO0FBQUEsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUE4RTtJQUM1RyxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU87SUFDM0MsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxVQUFVO0lBQ2xELENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxjQUFjO0lBQzVELENBQUMsd0JBQXdCLENBQUMseUJBQXlCLENBQUMsRUFBRSxPQUFPO0NBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2hhbW1pbmd9IGZyb20gJy4vaGFtbWluZyc7XG5pbXBvcnQge2xldmVuc3RlaW59IGZyb20gJy4vbGV2ZW5zdGVpbic7XG5pbXBvcnQge25lZWRsZW1hbld1bmNofSBmcm9tICcuL25lZWRsZW1hbi13dW5zY2gnO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSBmcm9tICcuL3R5cGVzJztcblxuLyoqIEVudW0gY29udGFpbmluZyBjdXJyZW50bHkgc3VwcG9ydGVkIG1hY3JvbW9sZWN1bGUgZGlzdGFuY2UgZnVuY3Rpb25zXG4gKiBIYW1taW5nIGRpc3RhbmNlIHdpbGwgYmUgdXNlZCBpZiB0aGUgc2VxdWVuY2VzIGFyZSBhbHJlYWR5IGFsaWduZWRcbiAqIE5lZWRsZW1hbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIHByb3RlaW4gc2VxdWVuY2VzIHdpdGgga25vd24gQkxPU1VNNjIgbWF0cml4XG4gKiBMZXZlbnNodGVpbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIG51Y2xlb3RpZGUgc2VxdWVuY2VzIGFzIGZvciB0aGVtIHN1YnN0aXR1dGlvbiBtYXRyaXggaXMgc2FtZSBhcyBpZGVudGl0eSBtYXRyaXhcbiAqL1xuZXhwb3J0IGVudW0gTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzIHtcbiAgICBIQU1NSU5HID0gJ0hhbW1pbmcnLFxuICAgIExFVkVOU0hURUlOID0gJ0xldmVuc2h0ZWluJyxcbiAgICBORUVETEVNQU5OX1dVTlNDSCA9ICdOZWVkbGVtYW5uLVd1bnNjaCcsXG4gICAgTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRSA9ICdNb25vbWVyIGNoZW1pY2FsIGRpc3RhbmNlJ1xufTtcblxuZXhwb3J0IGNvbnN0IG1tRGlzdGFuY2VGdW5jdGlvbnM6IFJlY29yZDxNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMsICh2YWx1ZT86IGFueSkgPT4gbW1EaXN0YW5jZUZ1bmN0aW9uVHlwZT4gPSB7XG4gIFtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuSEFNTUlOR106IGhhbW1pbmcsXG4gIFtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTEVWRU5TSFRFSU5dOiBsZXZlbnN0ZWluLFxuICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLk5FRURMRU1BTk5fV1VOU0NIXTogbmVlZGxlbWFuV3VuY2gsXG4gIFtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRV06IGhhbW1pbmdcbn07XG4iXX0=","import { distance } from 'fastest-levenshtein';\nexport function levenstein() {\n return (seq1, seq2) => {\n return distance(seq1, seq2) / Math.max(seq1.length, seq2.length);\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV2ZW5zdGVpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxldmVuc3RlaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRzdDLE1BQU0sVUFBVSxVQUFVO0lBQ3hCLE9BQU8sQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLEVBQUU7UUFDcEMsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZGlzdGFuY2V9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGxldmVuc3RlaW4oKTogbW1EaXN0YW5jZUZ1bmN0aW9uVHlwZSB7XG4gIHJldHVybiAoc2VxMTogc3RyaW5nLCBzZXEyOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gZGlzdGFuY2Uoc2VxMSwgc2VxMikgLyBNYXRoLm1heChzZXExLmxlbmd0aCwgc2VxMi5sZW5ndGgpO1xuICB9O1xufVxuIl19","import * as DG from 'datagrok-api/dg';\nimport wu from 'wu';\nimport { NOTATION, candidateAlphabets, positionSeparator, splitterAsFasta, getSplitterWithSeparator, splitterAsHelm, } from './macromolecule';\nimport { GAP_SYMBOL, } from './macromolecule/types';\nimport { detectAlphabet, splitterAsFastaSimple, StringListSeqSplitted } from './macromolecule/utils';\nimport { mmDistanceFunctions, MmDistanceFunctionsNames } from '@datagrok-libraries/ml/src/macromolecule-distance-functions';\nimport { getMonomerLibHelper } from '../monomer-works/monomer-utils';\nimport { HELM_WRAPPERS_REGEXP, PHOSPHATE_SYMBOL } from './const';\nexport const Temps = new class {\n constructor() {\n /** Column's temp slot name for a UnitsHandler object */\n this.uh = `units-handler.${DG.SEMTYPE.MACROMOLECULE}`;\n }\n}();\nexport const GapOriginals = {\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 SeqHandler {\n constructor(col) {\n this._splitter = null;\n this.cached = true;\n this._splitted = null;\n this.columnVersion = null;\n this._stats = null;\n this._maxLength = null;\n this._posList = null;\n this._joiner = undefined;\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 this._columnVersion = col.version;\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._defaultGapOriginal = (this.isFasta()) ? GapOriginals[NOTATION.FASTA] :\n (this.isHelm()) ? GapOriginals[NOTATION.HELM] :\n GapOriginals[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 SeqHandler.setUnitsToFastaColumn(this);\n else if (this.isSeparator()) {\n const separator = col.getTag(\"separator\" /* TAGS.separator */);\n SeqHandler.setUnitsToSeparatorColumn(this, separator);\n }\n else if (this.isHelm())\n SeqHandler.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 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 SeqHandler.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 SeqHandler.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 SeqHandler.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 allowed, only if alphabet tag is annotated\n if (!uh.column.getTag(\"alphabet\" /* TAGS.alphabet */) && Object.keys(stats.freq).length === 0)\n throw new Error('Alphabet is empty and not annotated.');\n let aligned = uh.column.getTag(\"aligned\" /* TAGS.aligned */);\n if (aligned === null) {\n aligned = stats.sameLength ? \"SEQ.MSA\" /* ALIGNMENT.SEQ_MSA */ : \"SEQ\" /* ALIGNMENT.SEQ */;\n uh.column.setTag(\"aligned\" /* TAGS.aligned */, aligned);\n }\n let alphabet = uh.column.getTag(\"alphabet\" /* TAGS.alphabet */);\n if (alphabet === null) {\n alphabet = detectAlphabet(stats.freq, candidateAlphabets);\n uh.column.setTag(\"alphabet\" /* TAGS.alphabet */, alphabet);\n }\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 length() { return this._column.length; }\n get units() { return this._units; }\n get notation() { return this._notation; }\n get defaultGapOriginal() { return this._defaultGapOriginal; }\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 // public get splitted(): ISeqSplitted[] {\n // // TODO: Disable cache or invalidate on changing data\n // if (this._splitted === null) {\n // const splitter = this.splitter;\n // const colLength: number = this._column.length;\n // this._splitted = new Array(colLength);\n // const catIdxList = this._column.getRawData();\n // const catList: string[] = this._column.categories;\n // for (let rowIdx: number = 0; rowIdx < colLength; rowIdx++) {\n // const seq: string = catList[catIdxList[rowIdx]];\n // this._splitted[rowIdx] = splitter(seq);\n // }\n // }\n // return this._splitted;\n // }\n getSplitted(rowIdx) {\n if (!this.cached) {\n const seq = this.column.get(rowIdx);\n return this.splitter(seq);\n }\n else {\n if (this.column.version !== this.columnVersion || this._splitted === null) {\n this.columnVersion = this.column.version;\n this._splitted = new Array(this.column.length);\n }\n let resSS = this._splitted[rowIdx] ? this._splitted[rowIdx].deref() : undefined;\n if (!resSS) {\n const seq = this.column.get(rowIdx);\n resSS = this.splitter(seq);\n this._splitted[rowIdx] = new WeakRef(resSS);\n }\n return resSS;\n }\n }\n get stats() {\n if (this._stats === null) {\n const freq = {};\n let sameLength = true;\n let firstLength = null;\n const colLen = this.column.length;\n for (let rowIdx = 0; rowIdx < colLen; ++rowIdx) {\n const mSeq = this.getSplitted(rowIdx);\n if (firstLength == null)\n firstLength = mSeq.length;\n else if (mSeq.length !== firstLength)\n sameLength = false;\n for (const cm of mSeq.canonicals) {\n if (!(cm in freq))\n freq[cm] = 0;\n freq[cm] += 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 = this.column.length === 0 ? 0 :\n Math.max(...wu.count(0).take(this.column.length).map((rowIdx) => this.getSplitted(rowIdx).length));\n }\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 /** Checks {@link om} for being a gap\n * @param {string} om Original monomer of sequence symbol\n * @return {boolean}\n */\n isGap(om) {\n return !om || om === this._defaultGapOriginal;\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()) ? 'RNA1{' :\n (this.isRna() || this.isHelmCompatible()) ? 'RNA1{' : 'PEPTIDE1{';\n const postfix = '}$$$$';\n const leftWrapper = (this.isDna()) ? 'd(' :\n (this.isRna()) ? 'r(' : '';\n const rightWrapper = (this.isDna() || this.isRna()) ? ')p' : '';\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, colName, data) {\n const col = this.column;\n const name = tgtNotation.toLowerCase() + '(' + col.name + ')';\n const newColName = colName ?? col.dataFrame.columns.getUnusedName(name);\n const newColumn = DG.Column.fromList('string', newColName, data ?? new Array(this.column.length).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, 'sequence'); // cell.renderer\n const srcAligned = col.getTag(\"aligned\" /* TAGS.aligned */);\n if (srcAligned)\n newColumn.setTag(\"aligned\" /* TAGS.aligned */, srcAligned);\n let srcAlphabet = col.getTag(\"alphabet\" /* TAGS.alphabet */);\n if (!srcAlphabet && this.notation === NOTATION.HELM && tgtNotation !== NOTATION.HELM)\n srcAlphabet = \"UN\" /* ALPHABET.UN */;\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 /** Creates a new column on data of {@link seqList} with the same tags */\n getNewColumnFromList(name, seqList) {\n return this.getNewColumn(this.notation, this.separator, name, seqList);\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 = SeqHandler.forColumn(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 (!SeqHandler.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 split(seq) {\n return this.splitter(seq);\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 case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\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 return MmDistanceFunctionsNames.LEVENSHTEIN;\n case \"PT\" /* ALPHABET.PT */:\n return MmDistanceFunctionsNames.LEVENSHTEIN;\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 monomer 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 threshold so that if there are not too many missing monomers\n // the column is still considered helm compatible\n const catIdxSet = new Set();\n const rowCount = this.column.length;\n const colRawData = this.column.getRawData();\n for (let rowIdx = 0; rowIdx < rowCount; ++rowIdx) {\n const catI = colRawData[rowIdx];\n if (!(catI in catIdxSet)) {\n catIdxSet.add(catI);\n const monomers = this.getSplitted(rowIdx);\n for (const cm of monomers.canonicals) {\n if (!peptidesSet.has(cm)) {\n this.column.setTag(\".isHelmCompatible\" /* TAGS.isHelmCompatible */, 'false');\n return false;\n }\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 = this.getSplitter();\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} srcSeq 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} tgtGapOriginal Optional target gap symbol\n * SEPARATOR)\n * @return {string} Converted string\n */\n convertHelmToFastaSeparator(srcSeq, tgtNotation, tgtSeparator, tgtGapOriginal) {\n if (!tgtGapOriginal) {\n tgtGapOriginal = (this.toFasta(tgtNotation)) ?\n GapOriginals[NOTATION.FASTA] :\n GapOriginals[NOTATION.SEPARATOR];\n }\n if (!tgtSeparator)\n tgtSeparator = (this.toFasta(tgtNotation)) ? '' : this.separator;\n const isNucleotide = srcSeq.startsWith('RNA');\n // items can be monomers or helms\n const helmItemsArray = this.splitter(srcSeq);\n const tgtMonomersArray = [];\n for (let posIdx = 0; posIdx < helmItemsArray.length; ++posIdx) {\n let om = helmItemsArray.getOriginal(posIdx);\n if (isNucleotide)\n om = om.replace(HELM_WRAPPERS_REGEXP, '');\n if (om === GapOriginals[NOTATION.HELM])\n tgtMonomersArray.push(tgtGapOriginal);\n else if (this.toFasta(tgtNotation) && om.length > 1) {\n // the case of a multi-character monomer converted to FASTA\n const monomer = '[' + om + ']';\n tgtMonomersArray.push(monomer);\n }\n else\n tgtMonomersArray.push(om);\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 // Get joiner from the source column units handler (this) knowing about the source sequence.\n // For example, converting DNA Helm to fasta requires removing the r(X)p decoration.\n const joiner = this.getJoiner({ notation: tgtNotation, separator: tgtSeparator });\n const newColumn = this.getNewColumn(tgtNotation, tgtSeparator);\n // assign the values to the newly created empty column\n newColumn.init((rowIdx) => {\n const srcSS = this.getSplitted(rowIdx);\n return joiner(srcSS);\n });\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 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.getSplitted(rowI);\n // Custom slicing instead of array method to maintain gaps\n const regOMList = new Array(regLength);\n for (let regJPos = 0; regJPos < regLength; ++regJPos) {\n const seqJPos = startIdxVal + regJPos;\n const seqOM = seqS.getOriginal(seqJPos);\n regOMList[regJPos] = seqJPos < seqS.length ? seqOM : GapOriginals[this.notation];\n }\n return join(new StringListSeqSplitted(regOMList, GapOriginals[this.notation]));\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 get joiner() {\n if (!this._joiner)\n this._joiner = this.getJoiner();\n return this._joiner;\n }\n getJoiner(opts) {\n const notation = opts ? opts.notation : this.notation;\n const separator = opts ? opts.separator : this.separator;\n let res;\n const srcSh = this;\n switch (notation) {\n case NOTATION.FASTA: {\n res = function (srcSS) { return srcSh.joinToFasta(srcSS, srcSh.isHelm()); };\n break;\n }\n case NOTATION.SEPARATOR: {\n if (!separator)\n throw new Error(`Separator is mandatory for notation '${notation}'.`);\n res = function (srcSS) { return joinToSeparator(srcSS, separator, srcSh.isHelm()); };\n break;\n }\n case NOTATION.HELM: {\n const isDnaOrRna = srcSh.alphabet === \"DNA\" /* ALPHABET.DNA */ || srcSh.alphabet === \"RNA\" /* ALPHABET.RNA */;\n const wrappers = srcSh.getHelmWrappers();\n res = function (srcSS) { return joinToHelm(srcSS, wrappers, isDnaOrRna); };\n break;\n }\n default:\n throw new Error(`Unexpected notation '${notation}'.`);\n }\n return res;\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 srcSh = this;\n if (tgtUnits === NOTATION.FASTA)\n return function (srcSeq) { return srcSh.convertToFasta(srcSeq); };\n if (tgtUnits === NOTATION.HELM)\n return function (srcSeq) { return srcSh.convertToHelm(srcSeq); };\n else if (tgtUnits === NOTATION.SEPARATOR)\n return function (srcSeq) { return srcSh.convertToSeparator(srcSeq, tgtSeparator); };\n else\n throw new Error();\n }\n /** Gets a column's UnitsHandler object from temp slot or creates a new and stores it to the temp slot. */\n static forColumn(col) {\n // TODO: Invalidate col.temp[Temps.uh] checking column's metadata\n let res = col.temp[Temps.uh];\n if (!res || res.columnVersion !== col.version)\n res = col.temp[Temps.uh] = new SeqHandler(col);\n return res;\n }\n // -- joiners & converters --\n joinToFasta(seqS, isHelm) {\n const resMList = new Array(seqS.length);\n for (let posIdx = 0; posIdx < seqS.length; ++posIdx) {\n const cm = seqS.getOriginal(posIdx);\n let om = seqS.getOriginal(posIdx);\n if (isHelm)\n om = om.replace(HELM_WRAPPERS_REGEXP, '$1');\n if (cm === GAP_SYMBOL)\n om = GapOriginals[NOTATION.FASTA];\n else if (cm === PHOSPHATE_SYMBOL)\n om = '';\n else if (om.length > 1)\n om = '[' + om + ']';\n resMList[posIdx] = om;\n }\n return resMList.join('');\n }\n convertToFasta(src) {\n const srcUhSplitter = this.splitter;\n const srcSS = this.isHelm() ? this.splitterAsHelmNucl(src) : srcUhSplitter(src);\n return this.joinToFasta(srcSS, this.isHelm());\n }\n convertToSeparator(src, tgtSeparator) {\n const srcSS = this.isHelm() ? this.splitterAsHelmNucl(src) : this.splitter(src);\n return joinToSeparator(srcSS, tgtSeparator, this.isHelm());\n }\n convertToHelm(src) {\n const wrappers = this.getHelmWrappers();\n const isDnaOrRna = src.startsWith('DNA') || src.startsWith('RNA');\n const srcSS = this.splitter(src);\n return joinToHelm(srcSS, wrappers, isDnaOrRna);\n }\n /** Splits Helm sequence adjusting nucleotides to single char symbols. (!) Removes lone phosphorus. */\n splitterAsHelmNucl(src) {\n const srcMList = this.splitter(src);\n const tgtMList = new Array(srcMList.length);\n const isDna = src.startsWith('DNA');\n const isRna = src.startsWith('RNA');\n for (let posIdx = 0; posIdx < srcMList.length; ++posIdx) {\n let om = srcMList.getOriginal(posIdx);\n if (isDna || isRna) {\n om = om.replace(HELM_WRAPPERS_REGEXP, '$1');\n om = om === PHOSPHATE_SYMBOL ? null : om;\n }\n tgtMList[posIdx] = om ? om : null;\n }\n return new StringListSeqSplitted(tgtMList.filter((om) => !!om), GapOriginals[NOTATION.HELM]);\n }\n}\n// -- joiners --\nfunction joinToSeparator(seqS, tgtSeparator, isHelm) {\n const resMList = new Array(seqS.length);\n for (let posIdx = 0; posIdx < seqS.length; ++posIdx) {\n const cm = seqS.getCanonical(posIdx);\n let om = seqS.getOriginal(posIdx);\n if (isHelm)\n om = om.replace(HELM_WRAPPERS_REGEXP, '$1');\n if (cm === GAP_SYMBOL)\n om = GapOriginals[NOTATION.SEPARATOR];\n else if (cm === PHOSPHATE_SYMBOL)\n om = '';\n resMList[posIdx] = om;\n }\n return resMList.join(tgtSeparator);\n}\nfunction joinToHelm(srcSS, wrappers, isDnaOrRna) {\n const [prefix, leftWrapper, rightWrapper, postfix] = wrappers;\n const resOMList = new Array(srcSS.length);\n for (let posIdx = 0; posIdx < srcSS.length; ++posIdx) {\n const cm = srcSS.getCanonical(posIdx);\n let om = srcSS.getOriginal(posIdx);\n if (cm === GAP_SYMBOL)\n om = GapOriginals[NOTATION.HELM];\n else {\n if (isDnaOrRna)\n om = om.replace(HELM_WRAPPERS_REGEXP, '$1');\n om = om.length === 1 ? `${leftWrapper}${om}${rightWrapper}` : `${leftWrapper}[${om}]${rightWrapper}`;\n }\n resOMList[posIdx] = om;\n }\n return `${prefix}${resOMList.join('.')}${postfix}`;\n}\n//# sourceMappingURL=seq-handler.js.map","export default class BitArray {\n constructor(arg, defaultValue = false) {\n this._length = 0;\n this._version = 0;\n this._updateLevel = 0;\n this._selectedCount = 0;\n this._selectedCountVersion = -1;\n this._selectedIndexesVersion = -1;\n this._versionedName = '';\n this._versionedNameVersion = -1;\n this.SHRINK_THRESHOLD = 0x100;\n if (typeof arg === 'number') {\n const length = arg;\n const buff = BitArray._createBuffer(length);\n if (defaultValue) {\n for (let i = 0; i < buff.length; i++)\n buff[i] = -1;\n }\n this._data = buff;\n this._length = length;\n }\n else if (arg instanceof Uint32Array) {\n this._data = arg;\n this._length = defaultValue;\n }\n else {\n throw new Error('Invalid constructor');\n }\n }\n getRawData() { return this._data; }\n assureGoez(num, argName) {\n if (num < 0)\n throw new Error(`${argName} should be greater than zero`);\n }\n assureInRange(value, min, max, argName) {\n if ((value < min) || (value > max))\n throw new Error(`Argument ${argName} (${value}) out of range (${min}, ${max})`);\n }\n copy(src, dst, count) {\n for (let i = 0; i < count; i++)\n dst[i] = src[i];\n }\n copyFrom(other) {\n if (this._length != other._length)\n throw new Error(`Lengths differ (${this._length} != ${other._length})`);\n this.copy(other._data, this._data, this.lengthInInts);\n this._version++;\n }\n get length() {\n return this._length;\n }\n get buffer() {\n return this._data;\n }\n set buffer(data) {\n this._data = data;\n this._version++;\n }\n get version() {\n return this._version;\n }\n set version(value) {\n this._version = value;\n }\n incrementVersion(notify = true) {\n this._version++;\n }\n get lengthInInts() {\n return Math.floor((this._length + 0x1f) / 0x20);\n }\n get versionedName() {\n return this._version == this._versionedNameVersion ? this._versionedName : '';\n }\n set versionedName(name) {\n this._versionedName = name;\n this._versionedNameVersion = this._version;\n }\n get self() {\n return this;\n }\n setLength(value) {\n if (value < 0)\n throw new Error('should be >= 0');\n if (value == this._length)\n return;\n const nIntsNeeded = Math.floor((value + 0x1f) / 0x20);\n if ((nIntsNeeded > this._data.length) || ((nIntsNeeded + this.SHRINK_THRESHOLD) < this._data.length)) {\n const newData = new Uint32Array(nIntsNeeded);\n this.copy(this._data, newData, (nIntsNeeded > this._data.length) ? this._data.length : nIntsNeeded);\n this._data = newData;\n }\n if (value > this._length) {\n if (this._length % 0x20 > 0)\n this._data[this.lengthInInts - 1] &= (1 << ((this._length % 0x20) & 0x1f)) - 1;\n this._data.fill(0, this.lengthInInts, nIntsNeeded);\n }\n this._length = value;\n this._version++;\n }\n static fromAnd(set1, set2) {\n if (set1._length != set2._length)\n throw new Error(`Lengths differ (${set1._length} != ${set2._length})`);\n const temp = new BitArray(set1._length);\n temp._length = set1._length;\n temp._data = BitArray._createBuffer(temp._length);\n temp._version = 0;\n const len = set1.lengthInInts;\n for (let i = 0; i < len; i++)\n temp._data[i] = set1._data[i] & set2._data[i];\n return temp;\n }\n static _createBuffer(length) {\n return new Uint32Array(Math.floor((length + 0x1f) / 0x20));\n }\n static fromValues(values) {\n const temp = new BitArray(values.length);\n temp._version = 0;\n for (let i = 0; i < temp._length; i++) {\n if (values[i])\n temp._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);\n }\n return temp;\n }\n /// Constructs a [BitSet] of length [count], where idx-th bit is determined by a call to [flag] (idx).\n static fromSeq(count, flag) {\n const temp = new BitArray(count);\n for (let i = 0; i < count; ++i)\n temp.setBit(i, flag(i));\n temp._version = 0;\n return temp;\n }\n /// Constructs a [BitSet] from a string [s] containing '0' or '1'.\n static fromString(s) {\n return BitArray.fromSeq(s.length, (i) => s.charAt(i) == '1');\n }\n /// Constructs a [BitSet], based on length [_length] and byte array [_data].\n static fromUint32Array(_length, _data) {\n const temp = new BitArray(_length);\n temp._data = _data;\n return temp;\n }\n /// Deserializes a [BitSet] from [bytes].\n static fromBytes(bytes) {\n const len = bytes.length;\n const temp = new BitArray(len * 8);\n temp._data = new Uint32Array(Math.floor((len + 3) / 4));\n temp._length = len * 8;\n let num1 = 0;\n let num2 = 0;\n while ((len - num2) >= 4) {\n temp._data[num1++] = (((bytes[num2] & 0xff) | ((bytes[num2 + 1] & 0xff) << 8)) |\n ((bytes[num2 + 2] & 0xff) << 0x10)) | ((bytes[num2 + 3] & 0xff) << 0x18);\n num2 += 4;\n }\n if (len - num2 == 3)\n temp._data[num1] = (bytes[num2 + 2] & 0xff) << 0x10;\n if (len - num2 == 2)\n temp._data[num1] |= (bytes[num2 + 1] & 0xff) << 8;\n if (len - num2 == 1)\n temp._data[num1] |= bytes[num2] & 0xff;\n temp._version = 0;\n return temp;\n }\n toString() {\n return `${this._length} bits, ${this.countBits(true)} set`;\n }\n /// Performs deep comparison of two bitsets.\n equals(other) {\n if (this == other)\n return true;\n if (other == null)\n return false;\n if (this._length != other._length)\n return false;\n if (this._length == 0)\n return true;\n for (let i = 0; i < this._data.length - 1; i++)\n if (this._data[i] != other._data[i])\n return false;\n for (let i = (this._data.length - 1) * 8; i < this._length; i++) {\n if (this.getBit(i) != other.getBit(i))\n return false;\n }\n return true;\n }\n /** Clones a bitset. */\n clone() {\n const bitArray = new BitArray(0, false);\n bitArray._data = Uint32Array.from(this._data); // effective length: (lengthInInts)\n bitArray._length = this._length;\n bitArray._version = this._version;\n return bitArray;\n }\n /** Initializes a bitset. */\n init(flag, notify) {\n this.setAll(false, false);\n for (let i = 0; i < this._length; i++) {\n if (flag(i))\n this._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);\n }\n this.incrementVersion(notify);\n return this;\n }\n /// Inverts a bitset.\n invert(notify = true) {\n for (let i = 0; i < this._data.length; i++)\n this._data[i] ^= -1;\n this.incrementVersion(notify);\n }\n /// Sets all bits to [value], optionally suppressing notifications.\n setAll(value, notify = false) {\n const flags = value ? -1 : 0;\n const len = this.lengthInInts;\n for (let i = 0; i < len; i++) //todo: optimize\n this._data[i] = flags;\n this.incrementVersion(notify);\n }\n /// Sets bits at [indexes] position to [value].\n /// Clears the bitset if [clear] flag is true.\n /// Change notification is raised when [notify] is true.\n setIndexes(indexes, value = true, clear = true, notify = true) {\n if (clear)\n this.setAll(!value, false);\n for (const i of indexes)\n this.setFast(i, value);\n this.incrementVersion(notify);\n }\n everyIndex(indexes, value = true) {\n for (const index of indexes) {\n if (this.getBit(index) != value)\n return false;\n }\n return true;\n }\n anyIndex(indexes, value = true) {\n for (const index of indexes) {\n if (this.getBit(index) == value)\n return true;\n }\n return false;\n }\n setWhere(check, value = true, clear = true, notify = true, allowClear = true) {\n if (clear && allowClear)\n this.setAll(!value, false);\n if (allowClear) {\n for (let i = 0; i < this._length; i++) {\n if (check(i))\n this.setFast(i, value);\n }\n }\n else {\n for (let i = 0; i < this._length; i++)\n this.setFast(i, check(i) ? value : !value);\n }\n this.incrementVersion(notify);\n }\n getRange(from, to) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length, 'to');\n const arr = [];\n for (let i = from; i < to; ++i)\n arr.push(this.getBit(i));\n return BitArray.fromValues(arr);\n }\n getRangeAsList(from, to) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length, 'to');\n const arr = [];\n for (let i = from; i < to; ++i)\n arr.push(this.getBit(i));\n return arr;\n }\n setRange(from, to, value, notify = true) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length - 1, 'to');\n const start = Math.min(from, to);\n const end = Math.max(from, to);\n //todo: optimize\n if (value) {\n for (let i = start; i <= end; i++)\n this.setTrue(i);\n }\n else {\n for (let i = start; i <= end; i++)\n this.setFalse(i);\n }\n this.incrementVersion(notify);\n return this;\n }\n /// Sets n randomly chosen bits to value, remaining bits to !value.\n setRandom(n, value, notify = true) {\n if (n < 0 || n > this._length)\n throw new Error('n must be >= 0 && <= Count');\n if (n > this._length / 2)\n this.setRandom(this._length - n, !value);\n this.setAll(!value);\n for (let k = 0; k < n;) {\n const i = Math.floor(Math.random() * this._length);\n if (this.getBit(i) == value)\n continue;\n this.setFast(i, value);\n k++;\n }\n this.incrementVersion(notify);\n }\n /// Modifies current bitset by performing the bitwise AND operation against the\n /// corresponding elements in the specified bitset.\n and(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] &= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise AND NOT operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n andNot(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n const len = this.lengthInInts;\n for (let num2 = 0; num2 < len; num2++)\n this._data[num2] &= ~value._data[num2];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise NOT AND operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n notAnd(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] = (~this._data[i]) & value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Inverts all bit values in the current bitset\n not(notify = true) {\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] = ~this._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise OR operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n or(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] |= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise exclusive OR operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n xor(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] ^= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Inserts n 0-bits at position pos, resizing self and shifting bits appropriately.\n insertAt(pos, n, flag = false) {\n this.assureInRange(pos, 0, this._length, 'pos');\n if (n == 0)\n return;\n //TODO: optimize\n //the most primitive implementation, optimize it later!\n // beginUpdate();\n const oldlength = this._length;\n this.setLength(this._length + n);\n //if (!contains(!flag)) return; // nothing to do\n for (let i = oldlength - 1; i >= pos; i--)\n this.setBit(i + n, this.getBit(i));\n for (let i = pos; i < pos + n; i++)\n this.setBit(i, flag);\n // endUpdate();\n }\n /// Deletes n bits beginning at position pos, resizing self and shifting remaining\n /// bits appropriately.\n removeAt(pos, n = 1) {\n // the most primitive implementation, optimize it later!\n if (n < 0)\n throw new Error('n cannot be negative');\n this.assureInRange(pos, 0, this._length - n, 'pos');\n if (this.contains(true)) {\n for (let i = pos; i < this._length - n; i++)\n this.setBit(i, this.getBit(i + n));\n }\n this.setLength(this._length - n);\n }\n removeByMask(mask, flag = true) {\n if (this._length != mask.length)\n throw new Error('length != mask.length');\n if (mask == this) { // no need to iterate\n this.setLength(mask.countBits(!flag));\n this.setAll(!flag);\n }\n else {\n let dstIdx = 0;\n for (let srcIdx = -1; (srcIdx = mask.findNext(srcIdx, !flag)) != -1;)\n this.setFast(dstIdx++, this.getBit(srcIdx));\n this._length = dstIdx;\n this._version++;\n }\n return this;\n }\n /// Similar to the [] operator.\n getBit(pos) {\n return (this._data[Math.floor(pos / 0x20)] & (1 << (pos & 0x1f))) != 0;\n }\n /// Similar to the [] operator.\n setBit(pos, bit, notify = true) {\n this.setFast(pos, bit);\n if (notify)\n this._version++;\n else\n this._version++;\n }\n /// Sets [i]-th bit to [value], does not check bounds, does not increment version\n setFast(i, value) {\n if (value)\n this._data[Math.floor(i / 0x20)] |= 1 << (i & 0x1f);\n else\n this._data[Math.floor(i / 0x20)] &= ~(1 << (i & 0x1f));\n }\n setTrue(pos) {\n this._data[Math.floor(pos / 0x20)] |= 1 << (pos & 0x1f);\n }\n setFalse(pos) {\n this._data[Math.floor(pos / 0x20)] &= ~(1 << (pos & 0x1f));\n }\n trueCount() {\n return this.countBits(true);\n }\n falseCount() {\n return this.countBits(false);\n }\n /// Counts bits of the specified value.\n countBits(value) {\n if (this._length == 0)\n return 0;\n if (this._selectedCountVersion != this._version) {\n this._selectedCount = 0;\n const len = this.lengthInInts;\n let i = 0;\n for (; i < len - 1; i++) {\n for (let k = this._data[i]; k != 0; k >>>= 8) { //todo: cast data[i] to uint\n this._selectedCount += BitArray._onBitCount[k & 0xff];\n }\n }\n // The last int.\n let k = this._data[i];\n const remainingBits = this._length & 0x1f;\n if (remainingBits != 0) /* if remainingBits == 0, the last int is fully used and ALL bits should be left as is */\n k &= ~((4294967295) << remainingBits);\n for (; k != 0; k >>>= 8)\n this._selectedCount += BitArray._onBitCount[k & 0xff];\n this._selectedCountVersion = this._version;\n }\n return (value ? this._selectedCount : this._length - this._selectedCount);\n }\n /// Returns a number of set bits where also [check] is true\n countWhere(check) {\n let result = 0;\n if (this.trueCount() == this._length) {\n for (let i = 0; i < this._length; i++)\n result += check(i) ? 1 : 0;\n }\n else {\n for (let i = -1; (i = this.findNext(i, true)) != -1;)\n result += check(i) ? 1 : 0;\n }\n return result;\n }\n /// Performs bit \"and\" and counts bits of the specified value, without bitset modification.\n andWithCountBits(second, value) {\n if (this._length == 0)\n return 0;\n let count = 0;\n const len = this.lengthInInts;\n let i = 0;\n for (; i < len - 1; i++) {\n for (let k = this._data[i] & second._data[i]; k != 0; k >>>= 8)\n count += BitArray._onBitCount[k & 0xff];\n }\n // The last int.\n let k = this._data[i] & second._data[i];\n const remainingBits = this._length & 0x1f;\n if (remainingBits != 0)\n k &= ~((4294967295) << remainingBits);\n for (; k != 0; k >>>= 8)\n count += BitArray._onBitCount[k & 0xff];\n return (value ? count : this._length - count);\n }\n clear() {\n this.setLength(0);\n }\n contains(value) {\n return this.findNext(-1, value) >= 0;\n }\n get allTrue() {\n return this.countBits(true) == this._length;\n }\n get allFalse() {\n return this.countBits(false) == this._length;\n }\n get anyTrue() {\n return this.countBits(true) > 0;\n }\n get anyFalse() {\n return this.countBits(false) > 0;\n }\n /// Returns the position of the next bit of the specified value, starting from the specified position.\n /// Returns -1, if there are no such bits.\n findNext(index, value = true) {\n this.assureInRange(index, -1, this._length, 'index');\n if (index >= this._length - 1)\n return -1;\n index = index < 0 ? 0 : index + 1; // skip start\n let unusedBits = index & 0x1f;\n const numInts = this.lengthInInts;\n for (let i = Math.floor(index / 32); i < numInts; i++) {\n let k = (value ? this._data[i] : ~this._data[i]); // uint cast\n if (unusedBits != 0) {\n k &= ((0xffffffff << unusedBits) & 0xffffffff);\n unusedBits = 0;\n }\n else if (!value && k == -4294967296) /* looking for false, all bits are set */ {\n continue;\n }\n for (let j = 0; k != 0; j += 8, k >>>= 8) {\n const p = BitArray._firstOnBit[k & 0xff];\n if (p >= 0) {\n index = p + (i * 32) + j;\n if (index >= this._length)\n return -1;\n return index;\n }\n }\n }\n return -1;\n }\n /// Finds previous bit of the specified value in the bitset.\n findPrev(index, value = true) {\n if (index == 0)\n return -1;\n this.assureInRange(index, -1, this._length, 'index');\n index = index < 0 ? this._length - 1 : index - 1; // skip start\n const lastIntIdx = Math.floor(index / 0x20);\n let remainingBits = (index + 1) & 0x1f;\n for (let i = lastIntIdx; i >= 0; i--) {\n let k = (value ? this._data[i] : ~this._data[i]); // cast\n if (remainingBits != 0) {\n k &= ~((4294967295) << remainingBits);\n remainingBits = 0;\n }\n for (let j = 24; k != 0; j -= 8, k <<= 8) {\n const p = BitArray._lastOnBit[k >>> 0x18];\n if (p >= 0)\n return p + (i * 32) + j;\n }\n }\n return -1;\n }\n}\nBitArray._onBitCount = Int8Array.from([\n 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8\n]);\nBitArray._firstOnBit = Int8Array.from([\n -1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0\n]);\nBitArray._lastOnBit = Int8Array.from([\n -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,\n 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7\n]);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0LWFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYml0LWFycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUTtJQW9FM0IsWUFBWSxHQUF5QixFQUFFLGVBQWlDLEtBQUs7UUFackUsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQiw0QkFBdUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFLdkIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDM0IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ25CLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUMsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtvQkFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7U0FDdkI7YUFBTSxJQUFJLEdBQUcsWUFBWSxXQUFXLEVBQUU7WUFDckMsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFrQixDQUFDO1lBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBc0IsQ0FBQztTQUN2QzthQUFNO1lBQ0wsTUFBTSxJ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QUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FBQyxDQUFDLENBQUM7QUFFNUMsb0JBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMvQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUFDLENBQUMsQ0FBQztBQUU1QyxtQkFBVSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDakMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQy9DLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQml0QXJyYXkge1xuICBzdGF0aWMgX29uQml0Q291bnQgPSBJbnQ4QXJyYXkuZnJvbShbXG4gICAgMCwgMSwgMSwgMiwgMSwgMiwgMiwgMywgMSwgMiwgMiwgMywgMiwgMywgMywgNCxcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxuICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LFxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXG4gICAgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywgNSwgNiwgNiwgNywgNiwgNywgNywgOF0pO1xuXG4gIHN0YXRpYyBfZmlyc3RPbkJpdCA9IEludDhBcnJheS5mcm9tKFtcbiAgICAtMSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA2LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDcsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA1LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNiwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMF0pO1xuXG4gIHN0YXRpYyBfbGFzdE9uQml0ID0gSW50OEFycmF5LmZyb20oW1xuICAgIC0xLCAwLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLFxuICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSxcbiAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LFxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXG4gICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNixcbiAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LFxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3XSk7XG5cbiAgcHJpdmF0ZSBfZGF0YTogVWludDMyQXJyYXk7XG4gIHByaXZhdGUgX2xlbmd0aCA9IDA7XG4gIHByaXZhdGUgX3ZlcnNpb24gPSAwO1xuICBwcml2YXRlIF91cGRhdGVMZXZlbCA9IDA7XG4gIHByaXZhdGUgX3NlbGVjdGVkQ291bnQgPSAwO1xuICBwcml2YXRlIF9zZWxlY3RlZENvdW50VmVyc2lvbiA9IC0xO1xuICBwcml2YXRlIF9zZWxlY3RlZEluZGV4ZXNWZXJzaW9uID0gLTE7XG4gIHByaXZhdGUgX3ZlcnNpb25lZE5hbWUgPSAnJztcbiAgcHJpdmF0ZSBfdmVyc2lvbmVkTmFtZVZlcnNpb24gPSAtMTtcbiAgU0hSSU5LX1RIUkVTSE9MRCA9IDB4MTAwO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFVpbnQzMkFycmF5LCBsZW5ndGg6IG51bWJlcilcbiAgY29uc3RydWN0b3IobGVuZ3RoOiBudW1iZXIsIGRlZmF1bHRWYWx1ZT86IGJvb2xlYW4pXG4gIGNvbnN0cnVjdG9yKGFyZzogbnVtYmVyIHwgVWludDMyQXJyYXksIGRlZmF1bHRWYWx1ZTogYm9vbGVhbiB8IG51bWJlciA9IGZhbHNlKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBhcmc7XG4gICAgICBjb25zdCBidWZmID0gQml0QXJyYXkuX2NyZWF0ZUJ1ZmZlcihsZW5ndGgpO1xuICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmYubGVuZ3RoOyBpKyspXG4gICAgICAgICAgYnVmZltpXSA9IC0xO1xuICAgICAgfVxuICAgICAgdGhpcy5fZGF0YSA9IGJ1ZmY7XG4gICAgICB0aGlzLl9sZW5ndGggPSBsZW5ndGg7XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBVaW50MzJBcnJheSkge1xuICAgICAgdGhpcy5fZGF0YSA9IGFyZyBhcyBVaW50MzJBcnJheTtcbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRlZmF1bHRWYWx1ZSBhcyBudW1iZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb25zdHJ1Y3RvcicpO1xuICAgIH1cbiAgfVxuXG5cbiAgZ2V0UmF3RGF0YSgpIHsgcmV0dXJuIHRoaXMuX2RhdGE7IH1cblxuICBhc3N1cmVHb2V6KG51bTogbnVtYmVyLCBhcmdOYW1lOiBTdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobnVtIDwgMCkgdGhyb3cgbmV3IEVycm9yKGAke2FyZ05hbWV9IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gemVyb2ApO1xuICB9XG5cbiAgYXNzdXJlSW5SYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIsIGFyZ05hbWU6IFN0cmluZyk6IHZvaWQge1xuICAgIGlmICgodmFsdWUgPCBtaW4pIHx8ICh2YWx1ZSA+IG1heCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFyZ3VtZW50ICR7YXJnTmFtZX0gKCR7dmFsdWV9KSBvdXQgb2YgcmFuZ2UgKCR7bWlufSwgJHttYXh9KWApO1xuICB9XG5cbiAgY29weShzcmM6IFVpbnQzMkFycmF5LCBkc3Q6IFVpbnQzMkFycmF5LCBjb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKVxuICAgICAgZHN0W2ldID0gc3JjW2ldO1xuICB9XG5cbiAgY29weUZyb20ob3RoZXI6IEJpdEFycmF5KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSBvdGhlci5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMZW5ndGhzIGRpZmZlciAoJHt0aGlzLl9sZW5ndGh9ICE9ICR7b3RoZXIuX2xlbmd0aH0pYCk7XG4gICAgdGhpcy5jb3B5KG90aGVyLl9kYXRhLCB0aGlzLl9kYXRhLCB0aGlzLmxlbmd0aEluSW50cyk7XG4gICAgdGhpcy5fdmVyc2lvbisrO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGJ1ZmZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHNldCBidWZmZXIoZGF0YTogVWludDMyQXJyYXkpIHtcbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBnZXQgdmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgfVxuXG4gIHNldCB2ZXJzaW9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92ZXJzaW9uID0gdmFsdWU7XG4gIH1cblxuICBpbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBnZXQgbGVuZ3RoSW5JbnRzKCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKCh0aGlzLl9sZW5ndGggKyAweDFmKSAvIDB4MjApO1xuICB9XG5cbiAgZ2V0IHZlcnNpb25lZE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb24gPT0gdGhpcy5fdmVyc2lvbmVkTmFtZVZlcnNpb24gPyB0aGlzLl92ZXJzaW9uZWROYW1lIDogJyc7XG4gIH1cblxuICBzZXQgdmVyc2lvbmVkTmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lID0gbmFtZTtcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lVmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XG4gIH1cblxuICBnZXQgc2VsZigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldExlbmd0aCh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlIDwgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hvdWxkIGJlID49IDAnKTtcblxuICAgIGlmICh2YWx1ZSA9PSB0aGlzLl9sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuSW50c05lZWRlZCA9IE1hdGguZmxvb3IoKHZhbHVlICsgMHgxZikgLyAweDIwKTtcbiAgICBpZiAoKG5JbnRzTmVlZGVkID4gdGhpcy5fZGF0YS5sZW5ndGgpIHx8ICgobkludHNOZWVkZWQgKyB0aGlzLlNIUklOS19USFJFU0hPTEQpIDwgdGhpcy5fZGF0YS5sZW5ndGgpKSB7XG4gICAgICBjb25zdCBuZXdEYXRhID0gbmV3IFVpbnQzMkFycmF5KG5JbnRzTmVlZGVkKTtcbiAgICAgIHRoaXMuY29weSh0aGlzLl9kYXRhLCBuZXdEYXRhLCAobkludHNOZWVkZWQgPiB0aGlzLl9kYXRhLmxlbmd0aCkgPyB0aGlzLl9kYXRhLmxlbmd0aCA6IG5JbnRzTmVlZGVkKTtcbiAgICAgIHRoaXMuX2RhdGEgPSBuZXdEYXRhO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA+IHRoaXMuX2xlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuX2xlbmd0aCAlIDB4MjAgPiAwKVxuICAgICAgICB0aGlzLl9kYXRhW3RoaXMubGVuZ3RoSW5JbnRzIC0gMV0gJj0gKDEgPDwgKCh0aGlzLl9sZW5ndGggJSAweDIwKSAmIDB4MWYpKSAtIDE7XG5cbiAgICAgIHRoaXMuX2RhdGEuZmlsbCgwLCB0aGlzLmxlbmd0aEluSW50cywgbkludHNOZWVkZWQpO1xuICAgIH1cbiAgICB0aGlzLl9sZW5ndGggPSB2YWx1ZTtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBzdGF0aWMgZnJvbUFuZChzZXQxOiBCaXRBcnJheSwgc2V0MjogQml0QXJyYXkpOiBCaXRBcnJheSB7XG4gICAgaWYgKHNldDEuX2xlbmd0aCAhPSBzZXQyLl9sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExlbmd0aHMgZGlmZmVyICgke3NldDEuX2xlbmd0aH0gIT0gJHtzZXQyLl9sZW5ndGh9KWApO1xuXG4gICAgY29uc3QgdGVtcCA9IG5ldyBCaXRBcnJheShzZXQxLl9sZW5ndGgpO1xuICAgIHRlbXAuX2xlbmd0aCA9IHNldDEuX2xlbmd0aDtcbiAgICB0ZW1wLl9kYXRhID0gQml0QXJyYXkuX2NyZWF0ZUJ1ZmZlcih0ZW1wLl9sZW5ndGgpO1xuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuXG4gICAgY29uc3QgbGVuID0gc2V0MS5sZW5ndGhJbkludHM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIHRlbXAuX2RhdGFbaV0gPSBzZXQxLl9kYXRhW2ldICYgc2V0Mi5fZGF0YVtpXTtcblxuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2NyZWF0ZUJ1ZmZlcihsZW5ndGg6IG51bWJlcik6IFVpbnQzMkFycmF5IHtcbiAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KE1hdGguZmxvb3IoKGxlbmd0aCArIDB4MWYpIC8gMHgyMCkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21WYWx1ZXModmFsdWVzOiBBcnJheTxib29sZWFuPik6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wLl9sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlc1tpXSlcbiAgICAgICAgdGVtcC5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcDtcbiAgfVxuXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0gb2YgbGVuZ3RoIFtjb3VudF0sIHdoZXJlIGlkeC10aCBiaXQgaXMgZGV0ZXJtaW5lZCBieSBhIGNhbGwgdG8gW2ZsYWddIChpZHgpLlxuICBzdGF0aWMgZnJvbVNlcShjb3VudDogbnVtYmVyLCBmbGFnOiBGdW5jdGlvbik6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KGNvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpXG4gICAgICB0ZW1wLnNldEJpdChpLCBmbGFnKGkpKTtcblxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgLy8vIENvbnN0cnVjdHMgYSBbQml0U2V0XSBmcm9tIGEgc3RyaW5nIFtzXSBjb250YWluaW5nICcwJyBvciAnMScuXG4gIHN0YXRpYyBmcm9tU3RyaW5nKHM6IHN0cmluZyk6IEJpdEFycmF5IHtcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVNlcShzLmxlbmd0aCwgKGk6IG51bWJlcikgPT4gcy5jaGFyQXQoaSkgPT0gJzEnKTtcbiAgfVxuXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0sIGJhc2VkIG9uIGxlbmd0aCBbX2xlbmd0aF0gYW5kIGJ5dGUgYXJyYXkgW19kYXRhXS5cbiAgc3RhdGljIGZyb21VaW50MzJBcnJheShfbGVuZ3RoOiBudW1iZXIsIF9kYXRhOiBVaW50MzJBcnJheSk6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KF9sZW5ndGgpO1xuICAgIHRlbXAuX2RhdGEgPSBfZGF0YTtcbiAgICByZXR1cm4gdGVtcDtcbiAgfVxuXG4gIC8vLyBEZXNlcmlhbGl6ZXMgYSBbQml0U2V0XSBmcm9tIFtieXRlc10uXG4gIHN0YXRpYyBmcm9tQnl0ZXMoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBCaXRBcnJheSB7XG4gICAgY29uc3QgbGVuID0gYnl0ZXMubGVuZ3RoO1xuICAgIGNvbnN0IHRlbXAgPSBuZXcgQml0QXJyYXkobGVuICogOCk7XG4gICAgdGVtcC5fZGF0YSA9IG5ldyBVaW50MzJBcnJheShNYXRoLmZsb29yKChsZW4gKyAzKSAvIDQpKTtcbiAgICB0ZW1wLl9sZW5ndGggPSBsZW4gKiA4O1xuICAgIGxldCBudW0xID0gMDtcbiAgICBsZXQgbnVtMiA9IDA7XG5cbiAgICB3aGlsZSAoKGxlbiAtIG51bTIpID49IDQpIHtcbiAgICAgIHRlbXAuX2RhdGFbbnVtMSsrXSA9IChcbiAgICAgICAgKChieXRlc1tudW0yXSAmIDB4ZmYpIHwgKChieXRlc1tudW0yICsgMV0gJiAweGZmKSA8PCA4KSkgfFxuICAgICAgICAoKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTApXG4gICAgICApIHwgKChieXRlc1tudW0yICsgM10gJiAweGZmKSA8PCAweDE4KTtcblxuICAgICAgbnVtMiArPSA0O1xuICAgIH1cblxuICAgIGlmIChsZW4gLSBudW0yID09IDMpXG4gICAgICB0ZW1wLl9kYXRhW251bTFdID0gKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTA7XG5cbiAgICBpZiAobGVuIC0gbnVtMiA9PSAyKVxuICAgICAgdGVtcC5fZGF0YVtudW0xXSB8PSAoYnl0ZXNbbnVtMiArIDFdICYgMHhmZikgPDwgODtcblxuICAgIGlmIChsZW4gLSBudW0yID09IDEpXG4gICAgICB0ZW1wLl9kYXRhW251bTFdIHw9IGJ5dGVzW251bTJdICYgMHhmZjtcblxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5fbGVuZ3RofSBiaXRzLCAke3RoaXMuY291bnRCaXRzKHRydWUpfSBzZXRgO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIGRlZXAgY29tcGFyaXNvbiBvZiB0d28gYml0c2V0cy5cbiAgZXF1YWxzKG90aGVyOiBCaXRBcnJheSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gb3RoZXIuX2xlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl9sZW5ndGggPT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoIC0gMTsgaSsrKVxuICAgICAgaWYgKHRoaXMuX2RhdGFbaV0gIT0gb3RoZXIuX2RhdGFbaV0pIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAobGV0IGkgPSAodGhpcy5fZGF0YS5sZW5ndGggLSAxKSAqIDg7IGkgPCB0aGlzLl9sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZ2V0Qml0KGkpICE9IG90aGVyLmdldEJpdChpKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBDbG9uZXMgYSBiaXRzZXQuICovXG4gIGNsb25lKCk6IEJpdEFycmF5IHtcbiAgICBjb25zdCBiaXRBcnJheSA9IG5ldyBCaXRBcnJheSgwLCBmYWxzZSk7XG4gICAgYml0QXJyYXkuX2RhdGEgPSBVaW50MzJBcnJheS5mcm9tKHRoaXMuX2RhdGEpOyAvLyBlZmZlY3RpdmUgbGVuZ3RoOiAobGVuZ3RoSW5JbnRzKVxuICAgIGJpdEFycmF5Ll9sZW5ndGggPSB0aGlzLl9sZW5ndGg7XG4gICAgYml0QXJyYXkuX3ZlcnNpb24gPSB0aGlzLl92ZXJzaW9uO1xuICAgIHJldHVybiBiaXRBcnJheTtcbiAgfVxuXG4gIC8qKiBJbml0aWFsaXplcyBhIGJpdHNldC4gKi9cbiAgaW5pdChmbGFnOiBGdW5jdGlvbiwgbm90aWZ5OiBib29sZWFuKTogQml0QXJyYXkge1xuICAgIHRoaXMuc2V0QWxsKGZhbHNlLCBmYWxzZSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZmxhZyhpKSlcbiAgICAgICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xuICAgIH1cblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIEludmVydHMgYSBiaXRzZXQuXG4gIGludmVydChub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9kYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSBePSAtMTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICB9XG5cbiAgLy8vIFNldHMgYWxsIGJpdHMgdG8gW3ZhbHVlXSwgb3B0aW9uYWxseSBzdXBwcmVzc2luZyBub3RpZmljYXRpb25zLlxuICBzZXRBbGwodmFsdWU6IGJvb2xlYW4sIG5vdGlmeSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgZmxhZ3MgPSB2YWx1ZSA/IC0xIDogMDtcbiAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIC8vdG9kbzogb3B0aW1pemVcbiAgICAgIHRoaXMuX2RhdGFbaV0gPSBmbGFncztcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICB9XG5cbiAgLy8vIFNldHMgYml0cyBhdCBbaW5kZXhlc10gcG9zaXRpb24gdG8gW3ZhbHVlXS5cbiAgLy8vIENsZWFycyB0aGUgYml0c2V0IGlmIFtjbGVhcl0gZmxhZyBpcyB0cnVlLlxuICAvLy8gQ2hhbmdlIG5vdGlmaWNhdGlvbiBpcyByYWlzZWQgd2hlbiBbbm90aWZ5XSBpcyB0cnVlLlxuICBzZXRJbmRleGVzKGluZGV4ZXM6IEFycmF5PG51bWJlcj4sIHZhbHVlID0gdHJ1ZSwgY2xlYXIgPSB0cnVlLCBub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKGNsZWFyKVxuICAgICAgdGhpcy5zZXRBbGwoIXZhbHVlLCBmYWxzZSk7XG5cbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kZXhlcylcbiAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIGV2ZXJ5SW5kZXgoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWUgPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaW5kZXgpICE9IHZhbHVlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYW55SW5kZXgoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWUgPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaW5kZXgpID09IHZhbHVlKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc2V0V2hlcmUoY2hlY2s6IEZ1bmN0aW9uLCB2YWx1ZSA9IHRydWUsIGNsZWFyID0gdHJ1ZSwgbm90aWZ5ID0gdHJ1ZSwgYWxsb3dDbGVhciA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoY2xlYXIgJiYgYWxsb3dDbGVhcilcbiAgICAgIHRoaXMuc2V0QWxsKCF2YWx1ZSwgZmFsc2UpO1xuXG4gICAgaWYgKGFsbG93Q2xlYXIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNoZWNrKGkpKVxuICAgICAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspXG4gICAgICAgIHRoaXMuc2V0RmFzdChpLCBjaGVjayhpKSA/IHZhbHVlIDogIXZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIGdldFJhbmdlKGZyb206IG51bWJlciwgdG86IG51bWJlcik6IEJpdEFycmF5IHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCwgJ3RvJyk7XG4gICAgY29uc3QgYXJyOiBBcnJheTxib29sZWFuPiA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87ICsraSlcbiAgICAgIGFyci5wdXNoKHRoaXMuZ2V0Qml0KGkpKTtcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVZhbHVlcyhhcnIpO1xuICB9XG5cbiAgZ2V0UmFuZ2VBc0xpc3QoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKTogYm9vbGVhbltdIHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCwgJ3RvJyk7XG4gICAgY29uc3QgYXJyOiBib29sZWFuW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOyArK2kpXG4gICAgICBhcnIucHVzaCh0aGlzLmdldEJpdChpKSk7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG5cbiAgc2V0UmFuZ2UoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbiwgbm90aWZ5ID0gdHJ1ZSk6IEJpdEFycmF5IHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCAtIDEsICd0bycpO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbihmcm9tLCB0byk7XG4gICAgY29uc3QgZW5kID0gTWF0aC5tYXgoZnJvbSwgdG8pO1xuXG4gICAgLy90b2RvOiBvcHRpbWl6ZVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKVxuICAgICAgICB0aGlzLnNldFRydWUoaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKylcbiAgICAgICAgdGhpcy5zZXRGYWxzZShpKTtcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBTZXRzIG4gcmFuZG9tbHkgY2hvc2VuIGJpdHMgdG8gdmFsdWUsIHJlbWFpbmluZyBiaXRzIHRvICF2YWx1ZS5cbiAgc2V0UmFuZG9tKG46IG51bWJlciwgdmFsdWU6IGJvb2xlYW4sIG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAobiA8IDAgfHwgbiA+IHRoaXMuX2xlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBtdXN0IGJlID49IDAgJiYgPD0gQ291bnQnKTtcblxuICAgIGlmIChuID4gdGhpcy5fbGVuZ3RoIC8gMilcbiAgICAgIHRoaXMuc2V0UmFuZG9tKHRoaXMuX2xlbmd0aCAtIG4sICF2YWx1ZSk7XG5cbiAgICB0aGlzLnNldEFsbCghdmFsdWUpO1xuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBuOykge1xuICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMuX2xlbmd0aCk7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaSkgPT0gdmFsdWUpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5zZXRGYXN0KGksIHZhbHVlKTtcbiAgICAgIGsrKztcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIC8vLyBNb2RpZmllcyBjdXJyZW50IGJpdHNldCBieSBwZXJmb3JtaW5nIHRoZSBiaXR3aXNlIEFORCBvcGVyYXRpb24gYWdhaW5zdCB0aGVcbiAgLy8vIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIGFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSAmPSB2YWx1ZS5fZGF0YVtpXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIEFORCBOT1Qgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIGFuZE5vdCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xuICAgIGZvciAobGV0IG51bTIgPSAwOyBudW0yIDwgbGVuOyBudW0yKyspXG4gICAgICB0aGlzLl9kYXRhW251bTJdICY9IH52YWx1ZS5fZGF0YVtudW0yXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIE5PVCBBTkQgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIG5vdEFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9ICh+dGhpcy5fZGF0YVtpXSkgJiB2YWx1ZS5fZGF0YVtpXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIEludmVydHMgYWxsIGJpdCB2YWx1ZXMgaW4gdGhlIGN1cnJlbnQgYml0c2V0XG4gIG5vdChub3RpZnkgPSB0cnVlKTogQml0QXJyYXkge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9IH50aGlzLl9kYXRhW2ldO1xuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLy8gUGVyZm9ybXMgdGhlIGJpdHdpc2UgT1Igb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIG9yKHZhbHVlOiBCaXRBcnJheSwgbm90aWZ5ID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gdmFsdWUuX2xlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbGVuZ3RocyBkaWZmZXIuJyk7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7IGkgPCBsZW47IGkrKylcbiAgICAgIHRoaXMuX2RhdGFbaV0gfD0gdmFsdWUuX2RhdGFbaV07XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBQZXJmb3JtcyB0aGUgYml0d2lzZSBleGNsdXNpdmUgT1Igb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIHhvcih2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IHZhbHVlLl9sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IGxlbmd0aHMgZGlmZmVyLicpO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzOyBpIDwgbGVuOyBpKyspXG4gICAgICB0aGlzLl9kYXRhW2ldIF49IHZhbHVlLl9kYXRhW2ldO1xuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLy8gSW5zZXJ0cyBuIDAtYml0cyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIGJpdHMgYXBwcm9wcmlhdGVseS5cbiAgaW5zZXJ0QXQocG9zOiBudW1iZXIsIG46IG51bWJlciwgZmxhZyA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKHBvcywgMCwgdGhpcy5fbGVuZ3RoLCAncG9zJyk7XG5cbiAgICBpZiAobiA9PSAwKSByZXR1cm47XG5cbiAgICAvL1RPRE86IG9wdGltaXplXG4gICAgLy90aGUgbW9zdCBwcmltaXRpdmUgaW1wbGVtZW50YXRpb24sIG9wdGltaXplIGl0IGxhdGVyIVxuXG4gICAgLy8gYmVnaW5VcGRhdGUoKTtcbiAgICBjb25zdCBvbGRsZW5ndGggPSB0aGlzLl9sZW5ndGg7XG4gICAgdGhpcy5zZXRMZW5ndGgodGhpcy5fbGVuZ3RoICsgbik7XG5cbiAgICAvL2lmICghY29udGFpbnMoIWZsYWcpKSByZXR1cm47IC8vIG5vdGhpbmcgdG8gZG9cblxuICAgIGZvciAobGV0IGkgPSBvbGRsZW5ndGggLSAxOyBpID49IHBvczsgaS0tKVxuICAgICAgdGhpcy5zZXRCaXQoaSArIG4sIHRoaXMuZ2V0Qml0KGkpKTtcblxuICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCBwb3MgKyBuOyBpKyspXG4gICAgICB0aGlzLnNldEJpdChpLCBmbGFnKTtcblxuICAgIC8vIGVuZFVwZGF0ZSgpO1xuICB9XG5cbiAgLy8vIERlbGV0ZXMgbiBiaXRzIGJlZ2lubmluZyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIHJlbWFpbmluZ1xuICAvLy8gYml0cyBhcHByb3ByaWF0ZWx5LlxuICByZW1vdmVBdChwb3M6IG51bWJlciwgbiA9IDEpOiB2b2lkIHtcbiAgICAvLyB0aGUgbW9zdCBwcmltaXRpdmUgaW1wbGVtZW50YXRpb24sIG9wdGltaXplIGl0IGxhdGVyIVxuICAgIGlmIChuIDwgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBjYW5ub3QgYmUgbmVnYXRpdmUnKTtcblxuICAgIHRoaXMuYXNzdXJlSW5SYW5nZShwb3MsIDAsIHRoaXMuX2xlbmd0aCAtIG4sICdwb3MnKTtcblxuICAgIGlmICh0aGlzLmNvbnRhaW5zKHRydWUpKSB7XG4gICAgICBmb3IgKGxldCBpID0gcG9zOyBpIDwgdGhpcy5fbGVuZ3RoIC0gbjsgaSsrKVxuICAgICAgICB0aGlzLnNldEJpdChpLCB0aGlzLmdldEJpdChpICsgbikpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0TGVuZ3RoKHRoaXMuX2xlbmd0aCAtIG4pO1xuICB9XG5cbiAgcmVtb3ZlQnlNYXNrKG1hc2s6IEJpdEFycmF5LCBmbGFnID0gdHJ1ZSk6IEJpdEFycmF5IHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IG1hc2subGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsZW5ndGggIT0gbWFzay5sZW5ndGgnKTtcblxuICAgIGlmIChtYXNrID09IHRoaXMpIHsgLy8gbm8gbmVlZCB0byBpdGVyYXRlXG4gICAgICB0aGlzLnNldExlbmd0aChtYXNrLmNvdW50Qml0cyghZmxhZykpO1xuICAgICAgdGhpcy5zZXRBbGwoIWZsYWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZHN0SWR4ID0gMDtcblxuICAgICAgZm9yIChsZXQgc3JjSWR4ID0gLTE7IChzcmNJZHggPSBtYXNrLmZpbmROZXh0KHNyY0lkeCwgIWZsYWcpKSAhPSAtMTspXG4gICAgICAgIHRoaXMuc2V0RmFzdChkc3RJZHgrKywgdGhpcy5nZXRCaXQoc3JjSWR4KSk7XG5cbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRzdElkeDtcbiAgICAgIHRoaXMuX3ZlcnNpb24rKztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cbiAgZ2V0Qml0KHBvczogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLl9kYXRhW01hdGguZmxvb3IocG9zIC8gMHgyMCldICYgKDEgPDwgKHBvcyAmIDB4MWYpKSkgIT0gMDtcbiAgfVxuXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cbiAgc2V0Qml0KHBvczogbnVtYmVyLCBiaXQ6IGJvb2xlYW4sIG5vdGlmeSA9IHRydWUpIHtcbiAgICB0aGlzLnNldEZhc3QocG9zLCBiaXQpO1xuICAgIGlmIChub3RpZnkpXG4gICAgICB0aGlzLl92ZXJzaW9uKys7XG4gICAgZWxzZVxuICAgICAgdGhpcy5fdmVyc2lvbisrO1xuICB9XG5cbiAgLy8vIFNldHMgW2ldLXRoIGJpdCB0byBbdmFsdWVdLCBkb2VzIG5vdCBjaGVjayBib3VuZHMsIGRvZXMgbm90IGluY3JlbWVudCB2ZXJzaW9uXG4gIHNldEZhc3QoaTogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSlcbiAgICAgIHRoaXMuX2RhdGFbTWF0aC5mbG9vcihpIC8gMHgyMCldIHw9IDEgPDwgKGkgJiAweDFmKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLl9kYXRhW01hdGguZmxvb3IoaSAvIDB4MjApXSAmPSB+KDEgPDwgKGkgJiAweDFmKSk7XG4gIH1cblxuICBzZXRUcnVlKHBvczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSB8PSAxIDw8IChwb3MgJiAweDFmKTtcbiAgfVxuXG4gIHNldEZhbHNlKHBvczogbnVtYmVyKSB7XG4gICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSAmPSB+KDEgPDwgKHBvcyAmIDB4MWYpKTtcbiAgfVxuXG4gIHRydWVDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyh0cnVlKTtcbiAgfVxuXG4gIGZhbHNlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHMoZmFsc2UpO1xuICB9XG5cbiAgLy8vIENvdW50cyBiaXRzIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuXG4gIGNvdW50Qml0cyh2YWx1ZTogYm9vbGVhbik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCA9PSAwKSByZXR1cm4gMDtcblxuICAgIGlmICh0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZENvdW50ID0gMDtcbiAgICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgayA9IHRoaXMuX2RhdGFbaV07IGsgIT0gMDsgayA+Pj49IDgpIHsgLy90b2RvOiBjYXN0IGRhdGFbaV0gdG8gdWludFxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBsYXN0IGludC5cbiAgICAgIGxldCBrID0gdGhpcy5fZGF0YVtpXTtcbiAgICAgIGNvbnN0IHJlbWFpbmluZ0JpdHMgPSB0aGlzLl9sZW5ndGggJiAweDFmO1xuICAgICAgaWYgKHJlbWFpbmluZ0JpdHMgIT0gMCkgLyogaWYgcmVtYWluaW5nQml0cyA9PSAwLCB0aGUgbGFzdCBpbnQgaXMgZnVsbHkgdXNlZCBhbmQgQUxMIGJpdHMgc2hvdWxkIGJlIGxlZnQgYXMgaXMgKi9cbiAgICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcblxuICAgICAgZm9yICg7IGsgIT0gMDsgayA+Pj49IDgpXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xuXG4gICAgICB0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XG4gICAgfVxuXG4gICAgcmV0dXJuICh2YWx1ZSA/IHRoaXMuX3NlbGVjdGVkQ291bnQgOiB0aGlzLl9sZW5ndGggLSB0aGlzLl9zZWxlY3RlZENvdW50KTtcbiAgfVxuXG4gIC8vLyBSZXR1cm5zIGEgbnVtYmVyIG9mIHNldCBiaXRzIHdoZXJlIGFsc28gW2NoZWNrXSBpcyB0cnVlXG4gIGNvdW50V2hlcmUoY2hlY2s6IEZ1bmN0aW9uKTogbnVtYmVyIHtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBpZiAodGhpcy50cnVlQ291bnQoKSA9PSB0aGlzLl9sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspXG4gICAgICAgIHJlc3VsdCArPSBjaGVjayhpKSA/IDEgOiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gLTE7IChpID0gdGhpcy5maW5kTmV4dChpLCB0cnVlKSkgIT0gLTE7KVxuICAgICAgICByZXN1bHQgKz0gY2hlY2soaSkgPyAxIDogMDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vLyBQZXJmb3JtcyBiaXQgXCJhbmRcIiBhbmQgY291bnRzIGJpdHMgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgd2l0aG91dCBiaXRzZXQgbW9kaWZpY2F0aW9uLlxuICBhbmRXaXRoQ291bnRCaXRzKHNlY29uZDogQml0QXJyYXksIHZhbHVlOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoID09IDApIHJldHVybiAwO1xuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGsgPSB0aGlzLl9kYXRhW2ldICYgc2Vjb25kLl9kYXRhW2ldOyBrICE9IDA7IGsgPj4+PSA4KVxuICAgICAgICBjb3VudCArPSBCaXRBcnJheS5fb25CaXRDb3VudFtrICYgMHhmZl07XG4gICAgfVxuXG4gICAgLy8gVGhlIGxhc3QgaW50LlxuICAgIGxldCBrID0gdGhpcy5fZGF0YVtpXSAmIHNlY29uZC5fZGF0YVtpXTtcbiAgICBjb25zdCByZW1haW5pbmdCaXRzID0gdGhpcy5fbGVuZ3RoICYgMHgxZjtcbiAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKVxuICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcbiAgICBmb3IgKDsgayAhPSAwOyBrID4+Pj0gOClcbiAgICAgIGNvdW50ICs9IEJpdEFycmF5Ll9vbkJpdENvdW50W2sgJiAweGZmXTtcblxuICAgIHJldHVybiAodmFsdWUgPyBjb3VudCA6IHRoaXMuX2xlbmd0aCAtIGNvdW50KTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0TGVuZ3RoKDApO1xuICB9XG5cbiAgY29udGFpbnModmFsdWU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maW5kTmV4dCgtMSwgdmFsdWUpID49IDA7XG4gIH1cblxuICBnZXQgYWxsVHJ1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHModHJ1ZSkgPT0gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFsbEZhbHNlKCkge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyhmYWxzZSkgPT0gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFueVRydWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKHRydWUpID4gMDtcbiAgfVxuXG4gIGdldCBhbnlGYWxzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHMoZmFsc2UpID4gMDtcbiAgfVxuXG4gIC8vLyBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbmV4dCBiaXQgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLlxuICAvLy8gUmV0dXJucyAtMSwgaWYgdGhlcmUgYXJlIG5vIHN1Y2ggYml0cy5cbiAgZmluZE5leHQoaW5kZXg6IG51bWJlciwgdmFsdWUgPSB0cnVlKTogbnVtYmVyIHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoaW5kZXgsIC0xLCB0aGlzLl9sZW5ndGgsICdpbmRleCcpO1xuXG4gICAgaWYgKGluZGV4ID49IHRoaXMuX2xlbmd0aCAtIDEpIHJldHVybiAtMTtcbiAgICBpbmRleCA9IGluZGV4IDwgMCA/IDAgOiBpbmRleCArIDE7IC8vIHNraXAgc3RhcnRcbiAgICBsZXQgdW51c2VkQml0cyA9IGluZGV4ICYgMHgxZjtcbiAgICBjb25zdCBudW1JbnRzID0gdGhpcy5sZW5ndGhJbkludHM7XG5cbiAgICBmb3IgKGxldCBpID0gTWF0aC5mbG9vcihpbmRleCAvIDMyKTsgaSA8IG51bUludHM7IGkrKykge1xuICAgICAgbGV0IGsgPSAodmFsdWUgPyB0aGlzLl9kYXRhW2ldIDogfnRoaXMuX2RhdGFbaV0pOyAvLyB1aW50IGNhc3RcbiAgICAgIGlmICh1bnVzZWRCaXRzICE9IDApIHtcbiAgICAgICAgayAmPSAoKDB4ZmZmZmZmZmYgPDwgdW51c2VkQml0cykgJiAweGZmZmZmZmZmKTtcbiAgICAgICAgdW51c2VkQml0cyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKCF2YWx1ZSAmJiBrID09IC00Mjk0OTY3Mjk2KSAvKiBsb29raW5nIGZvciBmYWxzZSwgYWxsIGJpdHMgYXJlIHNldCAqL3tcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGogPSAwOyBrICE9IDA7IGogKz0gOCwgayA+Pj49IDgpIHtcbiAgICAgICAgY29uc3QgcCA9IEJpdEFycmF5Ll9maXJzdE9uQml0W2sgJiAweGZmXTtcbiAgICAgICAgaWYgKHAgPj0gMCkge1xuICAgICAgICAgIGluZGV4ID0gcCArIChpICogMzIpICsgajtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gdGhpcy5fbGVuZ3RoKSByZXR1cm4gLTE7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vLyBGaW5kcyBwcmV2aW91cyBiaXQgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSBpbiB0aGUgYml0c2V0LlxuICBmaW5kUHJldihpbmRleDogbnVtYmVyLCB2YWx1ZSA9IHRydWUpOiBudW1iZXIge1xuICAgIGlmIChpbmRleCA9PSAwKSByZXR1cm4gLTE7XG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKGluZGV4LCAtMSwgdGhpcy5fbGVuZ3RoLCAnaW5kZXgnKTtcblxuICAgIGluZGV4ID0gaW5kZXggPCAwID8gdGhpcy5fbGVuZ3RoIC0gMSA6IGluZGV4IC0gMTsgLy8gc2tpcCBzdGFydFxuXG4gICAgY29uc3QgbGFzdEludElkeCA9IE1hdGguZmxvb3IoaW5kZXggLyAweDIwKTtcbiAgICBsZXQgcmVtYWluaW5nQml0cyA9IChpbmRleCArIDEpICYgMHgxZjtcblxuICAgIGZvciAobGV0IGkgPSBsYXN0SW50SWR4OyBpID49IDA7IGktLSkge1xuICAgICAgbGV0IGsgPSAodmFsdWUgPyB0aGlzLl9kYXRhW2ldIDogfnRoaXMuX2RhdGFbaV0pOyAvLyBjYXN0XG4gICAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKSB7XG4gICAgICAgIGsgJj0gfigoNDI5NDk2NzI5NSkgPDwgcmVtYWluaW5nQml0cyk7XG4gICAgICAgIHJlbWFpbmluZ0JpdHMgPSAwO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaiA9IDI0OyBrICE9IDA7IGogLT0gOCwgayA8PD0gOCkge1xuICAgICAgICBjb25zdCBwID0gQml0QXJyYXkuX2xhc3RPbkJpdFtrID4+PiAweDE4XTtcbiAgICAgICAgaWYgKHAgPj0gMClcbiAgICAgICAgICByZXR1cm4gcCArIChpICogMzIpICsgajtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG4iXX0=","export var StringMetricsNames;\n(function (StringMetricsNames) {\n StringMetricsNames[\"Levenshtein\"] = \"Levenshtein\";\n StringMetricsNames[\"JaroWinkler\"] = \"Jaro-Winkler\";\n StringMetricsNames[\"Manhattan\"] = \"Manhattan\";\n StringMetricsNames[\"Onehot\"] = \"One-Hot\";\n})(StringMetricsNames || (StringMetricsNames = {}));\nexport var VectorMetricsNames;\n(function (VectorMetricsNames) {\n VectorMetricsNames[\"Euclidean\"] = \"Euclidean\";\n})(VectorMetricsNames || (VectorMetricsNames = {}));\nexport var BitArrayMetricsNames;\n(function (BitArrayMetricsNames) {\n BitArrayMetricsNames[\"Tanimoto\"] = \"Tanimoto\";\n BitArrayMetricsNames[\"Dice\"] = \"Dice\";\n BitArrayMetricsNames[\"Asymmetric\"] = \"Asymmetric\";\n BitArrayMetricsNames[\"BraunBlanquet\"] = \"Braun-Blanquet\";\n BitArrayMetricsNames[\"Cosine\"] = \"Cosine\";\n BitArrayMetricsNames[\"Kulczynski\"] = \"Kulczynski\";\n BitArrayMetricsNames[\"McConnaughey\"] = \"Mc-Connaughey\";\n BitArrayMetricsNames[\"RogotGoldberg\"] = \"Rogot-Goldberg\";\n BitArrayMetricsNames[\"Russel\"] = \"Russel\";\n BitArrayMetricsNames[\"Sokal\"] = \"Sokal\";\n BitArrayMetricsNames[\"Hamming\"] = \"Hamming\";\n BitArrayMetricsNames[\"Euclidean\"] = \"Euclidean\";\n})(BitArrayMetricsNames || (BitArrayMetricsNames = {}));\nexport var IntArrayMetricsNames;\n(function (IntArrayMetricsNames) {\n IntArrayMetricsNames[\"TanimotoIntArray\"] = \"TanimotoIntArray\";\n})(IntArrayMetricsNames || (IntArrayMetricsNames = {}));\nexport var DistanceMetricsSubjects;\n(function (DistanceMetricsSubjects) {\n DistanceMetricsSubjects[\"Vector\"] = \"Vector\";\n DistanceMetricsSubjects[\"String\"] = \"String\";\n DistanceMetricsSubjects[\"BitArray\"] = \"BitArray\";\n DistanceMetricsSubjects[\"MacroMolecule\"] = \"MacroMolecule\";\n DistanceMetricsSubjects[\"Number\"] = \"Number\";\n DistanceMetricsSubjects[\"IntArray\"] = \"IntArray\";\n DistanceMetricsSubjects[\"NumberArray\"] = \"NumberArray\";\n})(DistanceMetricsSubjects || (DistanceMetricsSubjects = {}));\nexport var NumberMetricsNames;\n(function (NumberMetricsNames) {\n NumberMetricsNames[\"Difference\"] = \"Difference\";\n})(NumberMetricsNames || (NumberMetricsNames = {}));\nexport var NumberArrayMetricsNames;\n(function (NumberArrayMetricsNames) {\n NumberArrayMetricsNames[\"CommonItems\"] = \"Common Items\";\n})(NumberArrayMetricsNames || (NumberArrayMetricsNames = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29uc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLGtCQUtUO0FBTEgsV0FBWSxrQkFBa0I7SUFDMUIsaURBQTJCLENBQUE7SUFDM0Isa0RBQTRCLENBQUE7SUFDNUIsNkNBQXVCLENBQUE7SUFDdkIsd0NBQWtCLENBQUE7QUFDcEIsQ0FBQyxFQUxTLGtCQUFrQixLQUFsQixrQkFBa0IsUUFLM0I7QUFFSCxNQUFNLENBQU4sSUFBWSxrQkFFVDtBQUZILFdBQVksa0JBQWtCO0lBQzFCLDZDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFGUyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRTNCO0FBRUgsTUFBTSxDQUFOLElBQVksb0JBYVQ7QUFiSCxXQUFZLG9CQUFvQjtJQUM1Qiw2Q0FBcUIsQ0FBQTtJQUNyQixxQ0FBYSxDQUFBO0lBQ2IsaURBQXlCLENBQUE7SUFDekIsd0RBQWdDLENBQUE7SUFDaEMseUNBQWlCLENBQUE7SUFDakIsaURBQXlCLENBQUE7SUFDekIsc0RBQThCLENBQUE7SUFDOUIsd0RBQWdDLENBQUE7SUFDaEMseUNBQWlCLENBQUE7SUFDakIsdUNBQWUsQ0FBQTtJQUNmLDJDQUFtQixDQUFBO0lBQ25CLCtDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFiUyxvQkFBb0IsS0FBcEIsb0JBQW9CLFFBYTdCO0FBRUgsTUFBTSxDQUFOLElBQVksb0JBRVg7QUFGRCxXQUFZLG9CQUFvQjtJQUM5Qiw2REFBcUMsQ0FBQTtBQUN2QyxDQUFDLEVBRlcsb0JBQW9CLEtBQXBCLG9CQUFvQixRQUUvQjtBQUVELE1BQU0sQ0FBTixJQUFZLHVCQVFUO0FBUkgsV0FBWSx1QkFBdUI7SUFDL0IsNENBQWlCLENBQUE7SUFDakIsNENBQWlCLENBQUE7SUFDakIsZ0RBQXFCLENBQUE7SUFDckIsMERBQStCLENBQUE7SUFDL0IsNENBQWlCLENBQUE7SUFDakIsZ0RBQXFCLENBQUE7SUFDckIsc0RBQTJCLENBQUE7QUFDN0IsQ0FBQyxFQVJTLHVCQUF1QixLQUF2Qix1QkFBdUIsUUFRaEM7QUFFSCxNQUFNLENBQU4sSUFBWSxrQkFFWDtBQUZELFdBQVksa0JBQWtCO0lBQzVCLCtDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFGVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRTdCO0FBRUQsTUFBTSxDQUFOLElBQVksdUJBRVg7QUFGRCxXQUFZLHVCQUF1QjtJQUNqQyx1REFBNEIsQ0FBQTtBQUM5QixDQUFDLEVBRlcsdUJBQXVCLEtBQXZCLHVCQUF1QixRQUVsQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIFN0cmluZ01ldHJpY3NOYW1lcyB7XG4gICAgTGV2ZW5zaHRlaW4gPSAnTGV2ZW5zaHRlaW4nLFxuICAgIEphcm9XaW5rbGVyID0gJ0phcm8tV2lua2xlcicsXG4gICAgTWFuaGF0dGFuID0gJ01hbmhhdHRhbicsXG4gICAgT25laG90ID0gJ09uZS1Ib3QnLFxuICB9XG5cbmV4cG9ydCBlbnVtIFZlY3Rvck1ldHJpY3NOYW1lcyB7XG4gICAgRXVjbGlkZWFuID0gJ0V1Y2xpZGVhbicsXG4gIH1cblxuZXhwb3J0IGVudW0gQml0QXJyYXlNZXRyaWNzTmFtZXMge1xuICAgIFRhbmltb3RvID0gJ1Rhbmltb3RvJyxcbiAgICBEaWNlID0gJ0RpY2UnLFxuICAgIEFzeW1tZXRyaWMgPSAnQXN5bW1ldHJpYycsXG4gICAgQnJhdW5CbGFucXVldCA9ICdCcmF1bi1CbGFucXVldCcsXG4gICAgQ29zaW5lID0gJ0Nvc2luZScsXG4gICAgS3VsY3p5bnNraSA9ICdLdWxjenluc2tpJyxcbiAgICBNY0Nvbm5hdWdoZXkgPSAnTWMtQ29ubmF1Z2hleScsXG4gICAgUm9nb3RHb2xkYmVyZyA9ICdSb2dvdC1Hb2xkYmVyZycsXG4gICAgUnVzc2VsID0gJ1J1c3NlbCcsXG4gICAgU29rYWwgPSAnU29rYWwnLFxuICAgIEhhbW1pbmcgPSAnSGFtbWluZycsXG4gICAgRXVjbGlkZWFuID0gJ0V1Y2xpZGVhbicsXG4gIH1cblxuZXhwb3J0IGVudW0gSW50QXJyYXlNZXRyaWNzTmFtZXMge1xuICBUYW5pbW90b0ludEFycmF5ID0gJ1Rhbmltb3RvSW50QXJyYXknLFxufVxuXG5leHBvcnQgZW51bSBEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cyB7XG4gICAgVmVjdG9yID0gJ1ZlY3RvcicsXG4gICAgU3RyaW5nID0gJ1N0cmluZycsXG4gICAgQml0QXJyYXkgPSAnQml0QXJyYXknLFxuICAgIE1hY3JvTW9sZWN1bGUgPSAnTWFjcm9Nb2xlY3VsZScsXG4gICAgTnVtYmVyID0gJ051bWJlcicsXG4gICAgSW50QXJyYXkgPSAnSW50QXJyYXknLFxuICAgIE51bWJlckFycmF5ID0gJ051bWJlckFycmF5JyxcbiAgfVxuXG5leHBvcnQgZW51bSBOdW1iZXJNZXRyaWNzTmFtZXMge1xuICBEaWZmZXJlbmNlID0gJ0RpZmZlcmVuY2UnLFxufVxuXG5leHBvcnQgZW51bSBOdW1iZXJBcnJheU1ldHJpY3NOYW1lcyB7XG4gIENvbW1vbkl0ZW1zID0gJ0NvbW1vbiBJdGVtcycsXG59XG4iXX0=","// 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 { GAP_SYMBOL } from '../utils/macromolecule/types';\nimport { SeqHandler } from '../utils/seq-handler';\nimport { splitAlignedSequences } from '../utils/splitter';\nimport { tanimotoSimilarity } from '@datagrok-libraries/ml/src/distance-metrics-methods';\nexport function encodeMonomers(col) {\n let encodeSymbol = MONOMER_ENCODE_MIN;\n const monomerSymbolDict = {};\n const sh = SeqHandler.forColumn(col);\n const encodedStringArray = [];\n const rowCount = col.length;\n for (let rowIdx = 0; rowIdx < rowCount; ++rowIdx) {\n let encodedMonomerStr = '';\n const monomers = sh.getSplitted(rowIdx);\n for (const cm of monomers.canonicals) {\n if (!monomerSymbolDict[cm]) {\n if (encodeSymbol > MONOMER_ENCODE_MAX) {\n grok.shell.error(`Not enough symbols to encode monomers`);\n return null;\n }\n monomerSymbolDict[cm] = encodeSymbol;\n encodeSymbol++;\n }\n encodedMonomerStr += String.fromCodePoint(monomerSymbolDict[cm]);\n }\n encodedStringArray.push(encodedMonomerStr);\n }\n return DG.Column.fromStrings('encodedMolecules', encodedStringArray);\n}\nexport function getMolfilesFromSeq(col, monomersLibObject) {\n const sh = SeqHandler.forColumn(col);\n const monomersDict = createMomomersMolDict(monomersLibObject);\n const molFiles = [];\n const rowCount = col.length;\n for (let rowIdx = 0; rowIdx < rowCount; ++rowIdx) {\n const monomers = sh.getSplitted(rowIdx);\n const molFilesForSeq = [];\n for (let j = 0; j < monomers.length; ++j) {\n const cm = monomers.getCanonical(j);\n if (cm) {\n if (!monomersDict[cm]) {\n grok.shell.warning(`Monomer ${cm} 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[cm])));\n }\n }\n molFiles.push(molFilesForSeq);\n }\n return molFiles;\n}\nexport function getMolfilesFromSingleSeq(cell, monomersLibObject) {\n const sh = SeqHandler.forColumn(cell.column);\n const monomersDict = createMomomersMolDict(monomersLibObject);\n const molFiles = [];\n const monomers = sh.getSplitted(cell.rowIndex);\n const molFilesForSeq = [];\n for (let j = 0; j < monomers.length; ++j) {\n const cm = monomers.getCanonical(j);\n if (cm) {\n if (!monomersDict[cm]) {\n grok.shell.warning(`Monomer ${cm} is missing in HELM library. Structure cannot be created`);\n return null;\n }\n molFilesForSeq.push(JSON.parse(JSON.stringify(monomersDict[cm])));\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 /* eslint-enable max-len */\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 referenceMonomerCanonical = referenceSequence.getCanonical(position);\n const referenceMol = monomerLib.getMonomer('PEPTIDE', referenceMonomerCanonical)?.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 referenceMonomerCanonical === '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] += referenceMonomerCanonical !== GAP_SYMBOL && monomerCategoryIdx !== emptyCategoryIdx ?\n similarityColData[monomerCategoryIdx] :\n referenceMonomerCanonical === GAP_SYMBOL && 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/* eslint-disable max-len */\n/** Calculates chemical similarity between each pair of monomers.\n * @param {string[]} monomerSet Set of unique monomers.\n * @returns {Promise<{scoringMatrix: number[][], alphabetIndexes: {[monomerId: string]: number}}>} Ojbect containing similarity scoring matrix and monomer to index mapping. */\nexport async function calculateMonomerSimilarity(monomerSet) {\n /* eslint-enable max-len */\n const libHelper = await getMonomerLibHelper();\n const monomerLib = libHelper.getBioLib();\n const scoringMatrix = [];\n const alphabetIndexes = {};\n const monomerMolecules = monomerSet.map((monomer) => monomerLib.getMonomer('PEPTIDE', monomer)?.smiles ?? '');\n const monomerMoleculesCol = DG.Column.fromStrings('smiles', monomerMolecules);\n for (let monomerIndex = 0; monomerIndex < monomerMolecules.length; ++monomerIndex) {\n const monomer = monomerSet[monomerIndex];\n alphabetIndexes[monomer] = monomerIndex;\n const monomerMol = monomerMolecules[monomerIndex];\n const similarityScores = monomerMol === '' ? new Array(monomerMolecules.length).fill(0) :\n (await grok.chem.getSimilarities(monomerMoleculesCol, monomerMol)).getRawData();\n similarityScores[monomerIndex] = 1;\n scoringMatrix[monomerIndex] = Array.from(similarityScores);\n }\n return { scoringMatrix, alphabetIndexes };\n}\nexport async function getMonomerSubstitutionMatrix(monomerSet, fingerprintType = 'Morgan') {\n const libHelper = await getMonomerLibHelper();\n const monomerLib = libHelper.getBioLib();\n const scoringMatrix = new Array(monomerSet.length).fill(0).map(() => new Array(monomerSet.length).fill(0));\n const alphabetIndexes = {};\n const monomerMolecules = monomerSet.map((monomer) => monomerLib.getMonomer('PEPTIDE', monomer)?.smiles ?? '');\n const fingerprintsFunc = DG.Func.find({ package: 'Chem', name: 'getFingerprints' })[0];\n if (!fingerprintsFunc) {\n console.warn('Function \"Chem:getFingerprints\" is not found in chem package. falling back to Morgan fingerprints');\n return await calculateMonomerSimilarity(monomerSet);\n }\n const monomerMoleculesCol = DG.Column.fromStrings('smiles', monomerMolecules);\n // needed for function to work\n const _unusedMolDf = DG.DataFrame.fromColumns([monomerMoleculesCol]);\n const fingerPrints = (await fingerprintsFunc.apply({ col: monomerMoleculesCol, fingerprintType: fingerprintType }))?.entries;\n if (!fingerPrints) {\n console.warn(`${fingerprintType} Fingerprints could not be calculated for monomers from chem package.\n falling back to Morgan fingerprints`);\n return await calculateMonomerSimilarity(monomerSet);\n }\n for (let i = 0; i < fingerPrints.length; ++i) {\n scoringMatrix[i][i] = 1;\n alphabetIndexes[monomerSet[i]] = i;\n if (!fingerPrints[i])\n continue;\n for (let j = i + 1; j < fingerPrints.length; ++j) {\n if (!fingerPrints[j])\n continue;\n scoringMatrix[i][j] = scoringMatrix[j][i] = tanimotoSimilarity(fingerPrints[i], fingerPrints[j]);\n }\n }\n return { scoringMatrix, alphabetIndexes };\n}\n;\n//# sourceMappingURL=monomer-utils.js.map","import BitArray from '@datagrok-libraries/utils/src/bit-array';\nimport { BitArrayMetricsNames } from './typed-metrics/consts';\nimport { MmDistanceFunctionsNames } from './macromolecule-distance-functions';\nexport const similarityMetric = {\n [BitArrayMetricsNames.Tanimoto]: tanimotoSimilarity,\n [BitArrayMetricsNames.Dice]: diceSimilarity,\n [BitArrayMetricsNames.Asymmetric]: asymmetricSimilarity,\n [BitArrayMetricsNames.BraunBlanquet]: braunBlanquetSimilarity,\n [BitArrayMetricsNames.Cosine]: cosineSimilarity,\n [BitArrayMetricsNames.Kulczynski]: kulczynskiSimilarity,\n [BitArrayMetricsNames.McConnaughey]: mcConnaugheySimilarity,\n [BitArrayMetricsNames.RogotGoldberg]: rogotGoldbergSimilarity,\n [BitArrayMetricsNames.Russel]: russelSimilarity,\n [BitArrayMetricsNames.Sokal]: sokalSimilarity,\n [BitArrayMetricsNames.Hamming]: hammingSimilarity,\n [BitArrayMetricsNames.Euclidean]: euclideanSimilarity,\n};\nexport const distanceMetrics = {\n [BitArrayMetricsNames.Tanimoto]: tanimotoDistance,\n [BitArrayMetricsNames.Dice]: diceDistance,\n [BitArrayMetricsNames.Asymmetric]: asymmetricDistance,\n [BitArrayMetricsNames.BraunBlanquet]: braunBlanquetDistance,\n [BitArrayMetricsNames.Cosine]: cosineDistance,\n [BitArrayMetricsNames.Kulczynski]: kulczynskiDistance,\n [BitArrayMetricsNames.McConnaughey]: mcConnaugheyDistance,\n [BitArrayMetricsNames.RogotGoldberg]: rogotGoldbergDistance,\n [BitArrayMetricsNames.Russel]: russelDistance,\n [BitArrayMetricsNames.Sokal]: sokalDistance,\n [BitArrayMetricsNames.Hamming]: hammingDistance,\n [BitArrayMetricsNames.Euclidean]: euclideanDistance,\n};\nexport const CHEM_SIMILARITY_METRICS = [\n BitArrayMetricsNames.Tanimoto,\n BitArrayMetricsNames.Dice,\n BitArrayMetricsNames.Cosine\n];\nexport const SEQ_SPACE_SIMILARITY_METRICS = [\n BitArrayMetricsNames.Tanimoto,\n BitArrayMetricsNames.Asymmetric,\n BitArrayMetricsNames.Cosine,\n BitArrayMetricsNames.Sokal\n];\nexport const MACROMOLECULE_SIMILARITY_METRICS = [\n MmDistanceFunctionsNames.HAMMING,\n MmDistanceFunctionsNames.LEVENSHTEIN,\n MmDistanceFunctionsNames.MONOMER_CHEMICAL_DISTANCE,\n MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH\n];\nexport function tanimotoSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n if (total == 0)\n return 1.0;\n const common = x.andWithCountBits(y, true);\n return common / (total - common);\n}\nexport function tanimotoDistance(x, y) {\n return 1 - tanimotoSimilarity(x, y);\n}\nexport function tanimotoDistanceIntArray(x, y) {\n const xb = new BitArray(x, x.length * 32);\n const yb = new BitArray(y, y.length * 32);\n return getDistanceFromSimilarity(tanimotoSimilarity(xb, yb));\n}\nexport function diceSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n if (total == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return 2 * common / total;\n}\nexport function diceDistance(x, y) {\n return 1 - diceSimilarity(x, y);\n}\nexport function cosineSimilarity(x, y) {\n const total = x.trueCount() * y.trueCount();\n if (total == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / Math.sqrt(total);\n}\nexport function cosineDistance(x, y) {\n return 1 - cosineSimilarity(x, y);\n}\nexport function euclideanSimilarity(x, y) {\n return getSimilarityFromDistance(euclideanDistance(x, y));\n}\nexport function euclideanDistance(x, y) {\n return Math.sqrt(x.trueCount() + y.trueCount() - 2 * x.andWithCountBits(y, true));\n}\nexport function hammingSimilarity(x, y) {\n return getSimilarityFromDistance(hammingDistance(x, y));\n}\nexport function hammingDistance(x, y) {\n return x.trueCount() + y.trueCount() - 2 * x.andWithCountBits(y, true);\n}\nexport function sokalSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const common = x.andWithCountBits(y, true);\n return common / (2 * total - 3 * common);\n}\nexport function sokalDistance(x, y) {\n return 1 - sokalSimilarity(x, y);\n}\nexport function kulczynskiSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const totalProd = x.trueCount() * y.trueCount();\n if (totalProd == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return (common * total) / (2 * totalProd);\n}\nexport function kulczynskiDistance(x, y) {\n return getDistanceFromSimilarity(kulczynskiSimilarity(x, y));\n}\nexport function mcConnaugheySimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const totalProd = x.trueCount() * y.trueCount();\n if (totalProd == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return (common * total - totalProd) / totalProd;\n}\nexport function mcConnaugheyDistance(x, y) {\n return getDistanceFromSimilarity(mcConnaugheySimilarity(x, y));\n}\nexport function asymmetricSimilarity(x, y) {\n const min = Math.min(x.trueCount(), y.trueCount());\n if (min == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / min;\n}\nexport function asymmetricDistance(x, y) {\n return 1 - asymmetricSimilarity(x, y);\n}\nexport function braunBlanquetSimilarity(x, y) {\n const max = Math.max(x.trueCount(), y.trueCount());\n if (max == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / max;\n}\nexport function braunBlanquetDistance(x, y) {\n return getDistanceFromSimilarity(braunBlanquetSimilarity(x, y));\n}\nexport function russelSimilarity(x, y) {\n if (x.length == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / x.length;\n}\nexport function russelDistance(x, y) {\n return getDistanceFromSimilarity(russelSimilarity(x, y));\n}\nexport function rogotGoldbergSimilarity(x, y) {\n const common = x.andWithCountBits(y, true);\n const total = x.countBits(true) + y.countBits(true);\n const len = x.length;\n const diff = len - total + common;\n if ((common == len) || (diff == len))\n return 1.0;\n else\n return common / total + diff / (2 * len - total);\n}\nexport function rogotGoldbergDistance(x, y) {\n return getDistanceFromSimilarity(rogotGoldbergSimilarity(x, y));\n}\nexport function getSimilarityFromDistance(distance) {\n return 1 / (1 + distance);\n}\nexport function getDistanceFromSimilarity(similarity) {\n return similarity === 0 ? 3.402823E+38 : (1 / similarity) - 1;\n}\nexport function numericDistance(args) {\n if (args && args.range != undefined && args.range > 0) {\n const range = args.range;\n return (a, b) => Math.abs(a - b) / range;\n }\n return (a, b) => Math.abs(a - b);\n}\nexport function commonItemsCount(args) {\n const mostCommon = args?.mostCommon ?? new Set();\n return (arr1, arr2) => {\n const len1 = arr1.length;\n const len2 = arr2.length;\n let count = 0;\n let i1 = 0;\n let i2 = 0;\n while ((i1 < len1) && (i2 < len2)) {\n if (arr1[i1] === arr2[i2]) {\n if (!mostCommon?.has(arr1[i1]))\n ++count;\n ++i1;\n ++i2;\n }\n else if (arr1[i1] < arr2[i2]) {\n ++i1;\n }\n else {\n ++i2;\n }\n }\n return count;\n };\n}\nexport function inverseCommonItemsCount(args) {\n const f = commonItemsCount(args);\n return (arr1, arr2) => {\n if (arr2.length === 0 || arr1.length === 0)\n return 10000;\n return Math.min(arr1.length, arr2.length) / (f(arr1, arr2) + 0.0001);\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sUUFBUSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9ELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRTVFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE2RDtJQUN4RixDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxFQUFFLGtCQUFrQjtJQUNuRCxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLGNBQWM7SUFDM0MsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxvQkFBb0I7SUFDdkQsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBRSx1QkFBdUI7SUFDN0QsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDL0MsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxvQkFBb0I7SUFDdkQsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxzQkFBc0I7SUFDM0QsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBRSx1QkFBdUI7SUFDN0QsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDL0MsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxlQUFlO0lBQzdDLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUUsaUJBQWlCO0lBQ2pELENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEVBQUUsbUJBQW1CO0NBQ3RELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQTZEO0lBQ3ZGLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEVB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Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDTjtpQkFBTSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQUUsRUFBRSxFQUFFLENBQUM7YUFBRTtpQkFBTTtnQkFBRSxFQUFFLEVBQUUsQ0FBQzthQUFFO1NBQ3pEO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLHVCQUF1QixDQUFDLElBQWlDO0lBQ3ZFLE1BQU0sQ0FBQyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sQ0FBQyxJQUF1QixFQUFFLElBQXVCLEVBQUUsRUFBRTtRQUMxRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUN4QyxPQUFPLEtBQUssQ0FBQztRQUVmLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDdkUsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaXRBcnJheSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy9iaXQtYXJyYXknO1xuaW1wb3J0IHtCaXRBcnJheU1ldHJpY3NOYW1lc30gZnJvbSAnLi90eXBlZC1tZXRyaWNzL2NvbnN0cyc7XG5pbXBvcnQge01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lc30gZnJvbSAnLi9tYWNyb21vbGVjdWxlLWRpc3RhbmNlLWZ1bmN0aW9ucyc7XG5cbmV4cG9ydCBjb25zdCBzaW1pbGFyaXR5TWV0cmljOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KSA9PiBudW1iZXIgfSA9IHtcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvXTogdGFuaW1vdG9TaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuRGljZV06IGRpY2VTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQXN5bW1ldHJpY106IGFzeW1tZXRyaWNTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQnJhdW5CbGFucXVldF06IGJyYXVuQmxhbnF1ZXRTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lXTogY29zaW5lU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkt1bGN6eW5za2ldOiBrdWxjenluc2tpU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV06IG1jQ29ubmF1Z2hleVNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Sb2dvdEdvbGRiZXJnXTogcm9nb3RHb2xkYmVyZ1NpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5SdXNzZWxdOiBydXNzZWxTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuU29rYWxdOiBzb2thbFNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5IYW1taW5nXTogaGFtbWluZ1NpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5FdWNsaWRlYW5dOiBldWNsaWRlYW5TaW1pbGFyaXR5LFxufTtcblxuZXhwb3J0IGNvbnN0IGRpc3RhbmNlTWV0cmljczogeyBbbmFtZTogc3RyaW5nXTogKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSkgPT4gbnVtYmVyIH0gPSB7XG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b106IHRhbmltb3RvRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5EaWNlXTogZGljZURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQXN5bW1ldHJpY106IGFzeW1tZXRyaWNEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkJyYXVuQmxhbnF1ZXRdOiBicmF1bkJsYW5xdWV0RGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdOiBjb3NpbmVEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkt1bGN6eW5za2ldOiBrdWxjenluc2tpRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5NY0Nvbm5hdWdoZXldOiBtY0Nvbm5hdWdoZXlEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJvZ290R29sZGJlcmddOiByb2dvdEdvbGRiZXJnRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5SdXNzZWxdOiBydXNzZWxEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlNva2FsXTogc29rYWxEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkhhbW1pbmddOiBoYW1taW5nRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5FdWNsaWRlYW5dOiBldWNsaWRlYW5EaXN0YW5jZSxcbn07XG5cbmV4cG9ydCBjb25zdCBDSEVNX1NJTUlMQVJJVFlfTUVUUklDUyA9IFtcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG8sXG4gIEJpdEFycmF5TWV0cmljc05hbWVzLkRpY2UsXG4gIEJpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV07XG5leHBvcnQgY29uc3QgU0VRX1NQQUNFX1NJTUlMQVJJVFlfTUVUUklDUyA9IFtcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG8sXG4gIEJpdEFycmF5TWV0cmljc05hbWVzLkFzeW1tZXRyaWMsXG4gIEJpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZSxcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuU29rYWxdO1xuZXhwb3J0IGNvbnN0IE1BQ1JPTU9MRUNVTEVfU0lNSUxBUklUWV9NRVRSSUNTID0gW1xuICBNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuSEFNTUlORyxcbiAgTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkxFVkVOU0hURUlOLFxuICBNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRSxcbiAgTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLk5FRURMRU1BTk5fV1VOU0NIXG5dO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiB0YW5pbW90b1NpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsID09IDApIHJldHVybiAxLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvICh0b3RhbCAtIGNvbW1vbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0YW5pbW90b0Rpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiAxIC0gdGFuaW1vdG9TaW1pbGFyaXR5KHgsIHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFuaW1vdG9EaXN0YW5jZUludEFycmF5KHg6IFVpbnQzMkFycmF5LCB5OiBVaW50MzJBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHhiID0gbmV3IEJpdEFycmF5KHgsIHgubGVuZ3RoICogMzIpO1xuICBjb25zdCB5YiA9IG5ldyBCaXRBcnJheSh5LCB5Lmxlbmd0aCAqIDMyKTtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkodGFuaW1vdG9TaW1pbGFyaXR5KHhiLCB5YikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGljZVNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIDIgKiBjb21tb24gLyB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpY2VEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gMSAtIGRpY2VTaW1pbGFyaXR5KHgsIHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29zaW5lU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKiB5LnRydWVDb3VudCgpO1xuICBpZiAodG90YWwgPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gTWF0aC5zcXJ0KHRvdGFsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvc2luZURpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiAxIC0gY29zaW5lU2ltaWxhcml0eSh4LCB5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV1Y2xpZGVhblNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldFNpbWlsYXJpdHlGcm9tRGlzdGFuY2UoZXVjbGlkZWFuRGlzdGFuY2UoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXVjbGlkZWFuRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguc3FydCh4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKSAtIDIgKiB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFtbWluZ1NpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldFNpbWlsYXJpdHlGcm9tRGlzdGFuY2UoaGFtbWluZ0Rpc3RhbmNlKHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbW1pbmdEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCkgLSAyICogeC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29rYWxTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCk7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvICgyICogdG90YWwgLSAzICogY29tbW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNva2FsRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIDEgLSBzb2thbFNpbWlsYXJpdHkoeCwgeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBrdWxjenluc2tpU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBjb25zdCB0b3RhbFByb2QgPSB4LnRydWVDb3VudCgpICogeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsUHJvZCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiAoY29tbW9uICogdG90YWwpIC8gKDIgKiB0b3RhbFByb2QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga3VsY3p5bnNraURpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KGt1bGN6eW5za2lTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1jQ29ubmF1Z2hleVNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgY29uc3QgdG90YWxQcm9kID0geC50cnVlQ291bnQoKSAqIHkudHJ1ZUNvdW50KCk7XG4gIGlmICh0b3RhbFByb2QgPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gKGNvbW1vbiAqIHRvdGFsIC0gdG90YWxQcm9kKSAvIHRvdGFsUHJvZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1jQ29ubmF1Z2hleURpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KG1jQ29ubmF1Z2hleVNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXN5bW1ldHJpY1NpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgbWluID0gTWF0aC5taW4oeC50cnVlQ291bnQoKSwgeS50cnVlQ291bnQoKSk7XG4gIGlmIChtaW4gPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gbWluO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXN5bW1ldHJpY0Rpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiAxIC0gYXN5bW1ldHJpY1NpbWlsYXJpdHkoeCwgeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBicmF1bkJsYW5xdWV0U2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCBtYXggPSBNYXRoLm1heCh4LnRydWVDb3VudCgpLCB5LnRydWVDb3VudCgpKTtcbiAgaWYgKG1heCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyBtYXg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBicmF1bkJsYW5xdWV0RGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkoYnJhdW5CbGFucXVldFNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVzc2VsU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBpZiAoeC5sZW5ndGggPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8geC5sZW5ndGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydXNzZWxEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShydXNzZWxTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJvZ290R29sZGJlcmdTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgY29uc3QgdG90YWwgPSB4LmNvdW50Qml0cyh0cnVlKSArIHkuY291bnRCaXRzKHRydWUpO1xuICBjb25zdCBsZW4gPSB4Lmxlbmd0aDtcbiAgY29uc3QgZGlmZiA9IGxlbiAtIHRvdGFsICsgY29tbW9uO1xuICBpZiAoKGNvbW1vbiA9PSBsZW4pIHx8IChkaWZmID09IGxlbikpIHJldHVybiAxLjA7XG4gIGVsc2UgcmV0dXJuIGNvbW1vbiAvIHRvdGFsICsgZGlmZiAvICgyICogbGVuIC0gdG90YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcm9nb3RHb2xkYmVyZ0Rpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KHJvZ290R29sZGJlcmdTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpbWlsYXJpdHlGcm9tRGlzdGFuY2UoZGlzdGFuY2U6IG51bWJlcikge1xuICByZXR1cm4gMSAvICgxICsgZGlzdGFuY2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShzaW1pbGFyaXR5OiBudW1iZXIpIHsgLy9pbiBjYXNlIHNpbWlsYXJpdHkgaXMgMCwgdXNlIG1heCBudW1iZXIgZm9yIGZsb2F0MzJcbiAgcmV0dXJuIHNpbWlsYXJpdHkgPT09IDAgPyAzLjQwMjgyM0UrMzggOiAoMSAvIHNpbWlsYXJpdHkpIC0gMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG51bWVyaWNEaXN0YW5jZShhcmdzPzoge3JhbmdlPzogbnVtYmVyfSkge1xuICBpZiAoYXJncyAmJiBhcmdzLnJhbmdlICE9IHVuZGVmaW5lZCAmJiBhcmdzLnJhbmdlID4gMCkge1xuICAgIGNvbnN0IHJhbmdlID0gYXJncy5yYW5nZTtcbiAgICByZXR1cm4gKGE6IG51bWJlciwgYjogbnVtYmVyKSA9PiBNYXRoLmFicyhhIC0gYikgLyByYW5nZTtcbiAgfVxuXG4gIHJldHVybiAoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IE1hdGguYWJzKGEgLSBiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbW1vbkl0ZW1zQ291bnQoYXJncz86IHttb3N0Q29tbW9uPzogU2V0PG51bWJlcj59KSB7XG4gIGNvbnN0IG1vc3RDb21tb24gPSBhcmdzPy5tb3N0Q29tbW9uID8/IG5ldyBTZXQ8bnVtYmVyPigpO1xuICByZXR1cm4gKGFycjE6IEFycmF5TGlrZTxudW1iZXI+LCBhcnIyOiBBcnJheUxpa2U8bnVtYmVyPikgPT4ge1xuICAgIGNvbnN0IGxlbjEgPSBhcnIxLmxlbmd0aDtcbiAgICBjb25zdCBsZW4yID0gYXJyMi5sZW5ndGg7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBsZXQgaTEgPSAwO1xuICAgIGxldCBpMiA9IDA7XG5cbiAgICB3aGlsZSAoKGkxIDwgbGVuMSkgJiYgKGkyIDwgbGVuMikpIHtcbiAgICAgIGlmIChhcnIxW2kxXSA9PT0gYXJyMltpMl0pIHtcbiAgICAgICAgaWYgKCFtb3N0Q29tbW9uPy5oYXMoYXJyMVtpMV0pKVxuICAgICAgICAgICsrY291bnQ7XG4gICAgICAgICsraTE7XG4gICAgICAgICsraTI7XG4gICAgICB9IGVsc2UgaWYgKGFycjFbaTFdIDwgYXJyMltpMl0pIHsgKytpMTsgfSBlbHNlIHsgKytpMjsgfVxuICAgIH1cblxuICAgIHJldHVybiBjb3VudDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2VDb21tb25JdGVtc0NvdW50KGFyZ3M/OiB7bW9zdENvbW1vbj86IFNldDxudW1iZXI+fSkge1xuICBjb25zdCBmID0gY29tbW9uSXRlbXNDb3VudChhcmdzKTtcbiAgcmV0dXJuIChhcnIxOiBBcnJheUxpa2U8bnVtYmVyPiwgYXJyMjogQXJyYXlMaWtlPG51bWJlcj4pID0+IHtcbiAgICBpZiAoYXJyMi5sZW5ndGggPT09IDAgfHwgYXJyMS5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gMTAwMDA7XG5cbiAgICByZXR1cm4gTWF0aC5taW4oYXJyMS5sZW5ndGgsIGFycjIubGVuZ3RoKSAvIChmKGFycjEsIGFycjIpICsgMC4wMDAxKTtcbiAgfTtcbn1cbiJdfQ==","import * as grok from 'datagrok-api/grok';\n// -- Monomer libraries --\nexport const LIB_STORAGE_NAME = 'Libraries';\nexport const LIB_PATH = 'System:AppData/Bio/monomer-libraries/';\nconst LIB_SETTINGS_FOR_TESTS = { explicit: ['HELMCoreLibrary.json'], exclude: [] };\nlet userLibSettingsPromise = Promise.resolve();\nexport async function getUserLibSettings() {\n let res;\n userLibSettingsPromise = userLibSettingsPromise.then(async () => {\n const resStr = await grok.dapi.userDataStorage.getValue(LIB_STORAGE_NAME, 'Settings', true);\n res = resStr ? JSON.parse(resStr) : { exclude: [], explicit: [] };\n // Fix empty object returned in case there is no settings stored for user\n res.exclude = res.exclude instanceof Array ? res.exclude : [];\n res.explicit = res.explicit instanceof Array ? res.explicit : [];\n console.debug(`Bio: getUserLibSettings()\\n${JSON.stringify(res, undefined, 2)}`);\n });\n await userLibSettingsPromise;\n return res;\n}\nexport async function setUserLibSettings(value) {\n userLibSettingsPromise = userLibSettingsPromise.then(async () => {\n console.debug(`Bio: setUserLibSettings()\\n${JSON.stringify(value, undefined, 2)}`);\n await grok.dapi.userDataStorage.postValue(LIB_STORAGE_NAME, 'Settings', JSON.stringify(value), true);\n });\n await userLibSettingsPromise;\n}\n/** Set only HELMCoreLibrary.json */\nexport async function setUserLibSettingsForTests() {\n await setUserLibSettings(LIB_SETTINGS_FOR_TESTS);\n}\n//# sourceMappingURL=lib-settings.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 {after, before, category, delay, expect, expectObject, test} from '@datagrok-libraries/utils/src/test';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';\nimport {\n getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\n\nimport {findMonomers, parseHelm} from '../utils';\n\n\n/** Tests with default monomer library */\ncategory('findMonomers', () => {\n let monomerLibHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibSettings: UserLibSettings;\n\n before(async () => {\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n // Tests 'findMonomers' requires default monomer library loaded\n await setUserLibSettingsForTests();\n await monomerLibHelper.loadLibraries(true); // load default libraries for tests\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadLibraries(true);\n });\n\n const tests: { [testName: string]: { test: string, tgt: Set<string> } } = {\n 'withoutMissed': {\n test: 'PEPTIDE1{meI.hHis.Aca.N.T.dE.Thr_PO3H2.Aca.D-Tyr_Et}$$$$',\n tgt: new Set<string>(),\n },\n 'withMissed':\n {\n test: 'PEPTIDE1{meI.missed2.Aca.N.T.dE.Thr_PO3H2.Aca.D-Tyr_Et}$$$$',\n tgt: new Set<string>(['missed2'])\n }\n };\n\n for (const [testName, testData] of Object.entries(tests)) {\n test(testName, async () => {\n _testFindMonomers(testData.test, testData.tgt);\n });\n }\n\n function _testFindMonomers(testHelmValue: string, tgtMissedSet: Set<string>): void {\n const monomerSymbolList: string[] = parseHelm(testHelmValue);\n const resMissedSet: Set<string> = findMonomers(monomerSymbolList);\n expectObject(resMissedSet, tgtMissedSet);\n }\n});\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=","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport $ from 'cash-dom';\n\nimport {category, expect, test, awaitCheck, delay} from '@datagrok-libraries/utils/src/test';\nimport {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {TAGS as helmTAGS} from '../constants';\n\ncategory('renderers', () => {\n test('missedInLib', async () => { await _testMissedInLib(); });\n});\n\nasync function _testMissedInLib() {\n const df: DG.DataFrame = await grok.dapi.files.readCsv('System:AppData/Helm/tests/sample_HELM-missedInLib.csv');\n const helmCol: DG.Column<string> = df.getCol('HELM');\n\n const tv: DG.TableView = grok.shell.addTableView(df);\n await awaitCheck(() => {\n return $(tv.root).find('.d4-grid canvas').length > 0;\n }, 'Table view canvas not found', 100);\n\n expect(helmCol.semType, DG.SEMTYPE.MACROMOLECULE);\n expect(helmCol.getTag(DG.TAGS.UNITS), NOTATION.HELM);\n expect(helmCol.getTag(DG.TAGS.CELL_RENDERER), 'helm');\n\n const cellRendererErrorJson: string = helmCol.getTag(helmTAGS.cellRendererRenderError);\n if (!!cellRendererErrorJson) {\n const cellRendererError: any = JSON.parse(cellRendererErrorJson);\n const err = new Error(cellRendererError['message']);\n err.stack = cellRendererError['stack'];\n throw err;\n }\n}\n","/** Base for Molfile or Mol2 parser/handler */\nexport class ChemicalTableParserBase {\n constructor(fileContent) {\n this.init(fileContent);\n }\n ;\n init(fileContent) {\n this.fileContent = fileContent.replace(/\\r/g, '');\n this._atomCount = undefined;\n this._atomTypes = undefined;\n this._bondCount = undefined;\n this._bondTypes = undefined;\n this.xyzAtomCoordinates = undefined;\n this._pairsOfBondedAtoms = undefined;\n }\n /** Total number of atoms in a molecule */\n get atomCount() {\n if (this._atomCount === undefined)\n this.setAtomAndBondCounts();\n return this._atomCount;\n }\n /** Number of bonds in a molecule */\n get bondCount() {\n if (this._bondCount === undefined)\n this.setAtomAndBondCounts();\n return this._bondCount;\n }\n /** X coordinates of all atoms in a molecule */\n get x() {\n var _a;\n (_a = this.xyzAtomCoordinates) !== null && _a !== void 0 ? _a : (this.xyzAtomCoordinates = this.parseAtomCoordinates());\n return this.xyzAtomCoordinates.x;\n }\n ;\n /** Y coordinates of all atoms in a molecule */\n get y() {\n var _a;\n (_a = this.xyzAtomCoordinates) !== null && _a !== void 0 ? _a : (this.xyzAtomCoordinates = this.parseAtomCoordinates());\n return this.xyzAtomCoordinates.y;\n }\n ;\n /** Z coordinates of all atoms in a molecule */\n get z() {\n var _a;\n (_a = this.xyzAtomCoordinates) !== null && _a !== void 0 ? _a : (this.xyzAtomCoordinates = this.parseAtomCoordinates());\n return this.xyzAtomCoordinates.z;\n }\n ;\n get atomTypes() {\n var _a;\n (_a = this._atomTypes) !== null && _a !== void 0 ? _a : (this._atomTypes = this.parseAtomTypes());\n return this._atomTypes;\n }\n get pairsOfBondedAtoms() {\n var _a;\n (_a = this._pairsOfBondedAtoms) !== null && _a !== void 0 ? _a : (this._pairsOfBondedAtoms = this.parseBondedAtomPairs());\n return this._pairsOfBondedAtoms;\n }\n get bondTypes() {\n var _a;\n (_a = this._bondTypes) !== null && _a !== void 0 ? _a : (this._bondTypes = this.parseBondTypes());\n return this._bondTypes;\n }\n setAtomAndBondCounts() {\n const { atomCount, bondCount } = this.parseAtomAndBondCounts();\n this._atomCount = atomCount;\n this._bondCount = bondCount;\n }\n getNextColumnIdx(idx) {\n // skip non-whitespace, if necessary\n while (!this.isWhitespace(idx))\n ++idx;\n // skip whitespace\n while (this.isWhitespace(idx))\n ++idx;\n return idx;\n }\n shiftIdxToSpecifiedColumn(lineStartIdx, columnNumber) {\n let idx = lineStartIdx;\n const numberOfJumps = this.isWhitespace(idx) ? columnNumber : columnNumber - 1;\n for (let i = 0; i < numberOfJumps; i++)\n idx = this.getNextColumnIdx(idx);\n return idx;\n }\n parseAtomTypes() {\n const atomCount = this.atomCount;\n const atomTypes = new Array(atomCount);\n let idx = this.getAtomBlockIdx();\n for (let i = 0; i < atomCount; i++) {\n idx = this.shiftIdxToAtomType(idx);\n atomTypes[i] = this.parseAtomType(idx);\n idx = this.getNextLineIdx(idx);\n }\n return atomTypes;\n }\n ;\n parseAtomCoordinates() {\n const x = new Float32Array(this.atomCount);\n const y = new Float32Array(this.atomCount);\n const z = new Float32Array(this.atomCount);\n let idx = this.getAtomBlockIdx();\n for (let i = 0; i < this.atomCount; i++) {\n idx = this.shiftIdxToXColumn(idx);\n for (const item of [x, y, z]) {\n item[i] = this.parseFloatValue(idx);\n idx = this.getNextColumnIdx(idx);\n }\n idx = this.getNextLineIdx(idx);\n }\n return { x: x, y: y, z: z };\n }\n parseBondedAtomPairs() {\n const bondedAtomPairs = new Array(this.bondCount);\n let idx = this.getBondBlockIdx();\n for (let i = 0; i < this.bondCount; i++) {\n idx = this.shiftIdxToBondedAtomsPair(idx);\n const pair = new Uint16Array(2);\n pair[0] = this.parseIntValue(idx);\n idx = this.getNextColumnIdx(idx);\n pair[1] = this.parseIntValue(idx);\n bondedAtomPairs[i] = pair;\n idx = this.getNextLineIdx(idx);\n }\n return bondedAtomPairs;\n }\n parseBondTypes() {\n const bondCount = this.bondCount;\n const bondTypes = new Uint16Array(bondCount);\n let idx = this.getBondBlockIdx();\n for (let i = 0; i < bondCount; i++) {\n idx = this.shiftIdxToBondType(idx);\n bondTypes[i] = this.parseIntValue(idx);\n idx = this.getNextLineIdx(idx);\n }\n return bondTypes;\n }\n ;\n isWhitespace(idx) {\n const symbol = this.fileContent[idx];\n return symbol === ' ' || symbol === '\\t';\n }\n getNextLineIdx(idx) {\n if (this.fileContent[idx] !== '\\n')\n return this.fileContent.indexOf('\\n', idx) + 1;\n else\n return idx + 1;\n }\n parseFloatValue(idxOfNumber) {\n return this.parseNumericValue(parseFloat, idxOfNumber);\n }\n parseIntValue(idxOfNumber) {\n return this.parseNumericValue(parseInt, idxOfNumber);\n }\n parseNumericValue(parserFunction, idxOfNumber) {\n let end = idxOfNumber + 1;\n while (!this.isWhitespace(end))\n ++end;\n const value = parserFunction(this.fileContent.substring(idxOfNumber, end));\n return value;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlbWljYWwtdGFibGUtcGFyc2VyLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjaGVtaWNhbC10YWJsZS1wYXJzZXItYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXQSw4Q0FBOEM7QUFDOUMsTUFBTSxPQUFnQix1QkFBdUI7SUFDM0MsWUFBWSxXQUFtQjtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFBQSxDQUFDO0lBVVEsSUFBSSxDQUFDLFdBQW1CO1FBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztRQUNwQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsSUFBSSxTQUFTO1FBQ1gsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVM7WUFDL0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsVUFBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsSUFBSSxTQUFTO1FBQ1gsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVM7WUFDL0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsVUFBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsSUFBSSxDQUFDOztRQUNILE1BQUEsSUFBSSxDQUFDLGtC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QVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQXRvbUFuZEJvbmRDb3VudHMgPSB7XG4gIGF0b21Db3VudDogbnVtYmVyLFxuICBib25kQ291bnQ6IG51bWJlclxufVxuXG50eXBlIENvb3JkaW5hdGVBcnJheXMgPSB7XG4gIHg6IEZsb2F0MzJBcnJheSxcbiAgeTogRmxvYXQzMkFycmF5LFxuICB6OiBGbG9hdDMyQXJyYXksXG59XG5cbi8qKiBCYXNlIGZvciBNb2xmaWxlIG9yIE1vbDIgcGFyc2VyL2hhbmRsZXIgKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDaGVtaWNhbFRhYmxlUGFyc2VyQmFzZSB7XG4gIGNvbnN0cnVjdG9yKGZpbGVDb250ZW50OiBzdHJpbmcpIHtcbiAgICB0aGlzLmluaXQoZmlsZUNvbnRlbnQpO1xuICB9O1xuXG4gIHByb3RlY3RlZCBmaWxlQ29udGVudCE6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9hdG9tQ291bnQ/OiBudW1iZXI7XG4gIHByb3RlY3RlZCBfYm9uZENvdW50PzogbnVtYmVyO1xuICBwcm90ZWN0ZWQgeHl6QXRvbUNvb3JkaW5hdGVzPzogQ29vcmRpbmF0ZUFycmF5cztcbiAgcHJvdGVjdGVkIF9hdG9tVHlwZXM/OiBzdHJpbmdbXTtcbiAgcHJvdGVjdGVkIF9wYWlyc09mQm9uZGVkQXRvbXM/OiBVaW50MTZBcnJheVtdO1xuICBwcm90ZWN0ZWQgX2JvbmRUeXBlcz86IFVpbnQxNkFycmF5O1xuXG4gIHByb3RlY3RlZCBpbml0KGZpbGVDb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmZpbGVDb250ZW50ID0gZmlsZUNvbnRlbnQucmVwbGFjZSgvXFxyL2csICcnKTtcbiAgICB0aGlzLl9hdG9tQ291bnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fYXRvbVR5cGVzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2JvbmRDb3VudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9ib25kVHlwZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy54eXpBdG9tQ29vcmRpbmF0ZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcGFpcnNPZkJvbmRlZEF0b21zID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFRvdGFsIG51bWJlciBvZiBhdG9tcyBpbiBhIG1vbGVjdWxlICovXG4gIGdldCBhdG9tQ291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fYXRvbUNvdW50ID09PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLnNldEF0b21BbmRCb25kQ291bnRzKCk7XG4gICAgcmV0dXJuIHRoaXMuX2F0b21Db3VudCE7XG4gIH1cblxuICAvKiogTnVtYmVyIG9mIGJvbmRzIGluIGEgbW9sZWN1bGUgICovXG4gIGdldCBib25kQ291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fYm9uZENvdW50ID09PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLnNldEF0b21BbmRCb25kQ291bnRzKCk7XG4gICAgcmV0dXJuIHRoaXMuX2JvbmRDb3VudCE7XG4gIH1cblxuICAvKiogWCBjb29yZGluYXRlcyBvZiBhbGwgYXRvbXMgaW4gYSBtb2xlY3VsZSAgKi9cbiAgZ2V0IHgoKTogRmxvYXQzMkFycmF5IHtcbiAgICB0aGlzLnh5ekF0b21Db29yZGluYXRlcyA/Pz0gdGhpcy5wYXJzZUF0b21Db29yZGluYXRlcygpO1xuICAgIHJldHVybiB0aGlzLnh5ekF0b21Db29yZGluYXRlcy54O1xuICB9O1xuXG4gIC8qKiBZIGNvb3JkaW5hdGVzIG9mIGFsbCBhdG9tcyBpbiBhIG1vbGVjdWxlICAqL1xuICBnZXQgeSgpOiBGbG9hdDMyQXJyYXkge1xuICAgIHRoaXMueHl6QXRvbUNvb3JkaW5hdGVzID8/PSB0aGlzLnBhcnNlQXRvbUNvb3JkaW5hdGVzKCk7XG4gICAgcmV0dXJuIHRoaXMueHl6QXRvbUNvb3JkaW5hdGVzIS55O1xuICB9O1xuXG4gIC8qKiBaIGNvb3JkaW5hdGVzIG9mIGFsbCBhdG9tcyBpbiBhIG1vbGVjdWxlICAqL1xuICBnZXQgeigpOiBGbG9hdDMyQXJyYXkge1xuICAgIHRoaXMueHl6QXRvbUNvb3JkaW5hdGVzID8/PSB0aGlzLnBhcnNlQXRvbUNvb3JkaW5hdGVzKCk7XG4gICAgcmV0dXJuIHRoaXMueHl6QXRvbUNvb3JkaW5hdGVzIS56O1xuICB9O1xuXG4gIGdldCBhdG9tVHlwZXMoKTogc3RyaW5nW10ge1xuICAgIHRoaXMuX2F0b21UeXBlcyA/Pz0gdGhpcy5wYXJzZUF0b21UeXBlcygpO1xuICAgIHJldHVybiB0aGlzLl9hdG9tVHlwZXM7XG4gIH1cblxuICBnZXQgcGFpcnNPZkJvbmRlZEF0b21zKCk6IFVpbnQxNkFycmF5W10ge1xuICAgIHRoaXMuX3BhaXJzT2ZCb25kZWRBdG9tcyA/Pz0gdGhpcy5wYXJzZUJvbmRlZEF0b21QYWlycygpO1xuICAgIHJldHVybiB0aGlzLl9wYWlyc09mQm9uZGVkQXRvbXMhO1xuICB9XG5cbiAgZ2V0IGJvbmRUeXBlcygpOiBVaW50MTZBcnJheSB7XG4gICAgdGhpcy5fYm9uZFR5cGVzID8/PSB0aGlzLnBhcnNlQm9uZFR5cGVzKCk7XG4gICAgcmV0dXJuIHRoaXMuX2JvbmRUeXBlcyE7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VBdG9tQW5kQm9uZENvdW50cygpOiBBdG9tQW5kQm9uZENvdW50cztcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldENvdW50c0xpbmVJZHgoKTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0QXRvbUJsb2NrSWR4KCk6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldEJvbmRCbG9ja0lkeCgpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzaGlmdElkeFRvWENvbHVtbihsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHNoaWZ0SWR4VG9BdG9tVHlwZShsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHNoaWZ0SWR4VG9Cb25kZWRBdG9tc1BhaXIobGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzaGlmdElkeFRvQm9uZFR5cGUobGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZUF0b21UeXBlKGlkeDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBzZXRBdG9tQW5kQm9uZENvdW50cygpOiB2b2lkIHtcbiAgICBjb25zdCB7YXRvbUNvdW50LCBib25kQ291bnR9ID0gdGhpcy5wYXJzZUF0b21BbmRCb25kQ291bnRzKCk7XG4gICAgdGhpcy5fYXRvbUNvdW50ID0gYXRvbUNvdW50O1xuICAgIHRoaXMuX2JvbmRDb3VudCA9IGJvbmRDb3VudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXROZXh0Q29sdW1uSWR4KGlkeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBza2lwIG5vbi13aGl0ZXNwYWNlLCBpZiBuZWNlc3NhcnlcbiAgICB3aGlsZSAoIXRoaXMuaXNXaGl0ZXNwYWNlKGlkeCkpXG4gICAgICArK2lkeDtcbiAgICAvLyBza2lwIHdoaXRlc3BhY2VcbiAgICB3aGlsZSAodGhpcy5pc1doaXRlc3BhY2UoaWR4KSlcbiAgICAgICsraWR4O1xuICAgIHJldHVybiBpZHg7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hpZnRJZHhUb1NwZWNpZmllZENvbHVtbihsaW5lU3RhcnRJZHg6IG51bWJlciwgY29sdW1uTnVtYmVyOiBudW1iZXIpIHtcbiAgICBsZXQgaWR4ID0gbGluZVN0YXJ0SWR4O1xuICAgIGNvbnN0IG51bWJlck9mSnVtcHMgPSB0aGlzLmlzV2hpdGVzcGFjZShpZHgpID8gY29sdW1uTnVtYmVyIDogY29sdW1uTnVtYmVyIC0gMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mSnVtcHM7IGkrKylcbiAgICAgIGlkeCA9IHRoaXMuZ2V0TmV4dENvbHVtbklkeChpZHgpO1xuICAgIHJldHVybiBpZHg7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VBdG9tVHlwZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGF0b21Db3VudCA9IHRoaXMuYXRvbUNvdW50O1xuICAgIGNvbnN0IGF0b21UeXBlcyA9IG5ldyBBcnJheTxzdHJpbmc+KGF0b21Db3VudCk7XG4gICAgbGV0IGlkeCA9IHRoaXMuZ2V0QXRvbUJsb2NrSWR4KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdG9tQ291bnQ7IGkrKykge1xuICAgICAgaWR4ID0gdGhpcy5zaGlmdElkeFRvQXRvbVR5cGUoaWR4KTtcbiAgICAgIGF0b21UeXBlc1tpXSA9IHRoaXMucGFyc2VBdG9tVHlwZShpZHgpO1xuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4gYXRvbVR5cGVzO1xuICB9O1xuXG4gIHByb3RlY3RlZCBwYXJzZUF0b21Db29yZGluYXRlcygpOiBDb29yZGluYXRlQXJyYXlzIHtcbiAgICBjb25zdCB4ID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmF0b21Db3VudCk7XG4gICAgY29uc3QgeSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hdG9tQ291bnQpO1xuICAgIGNvbnN0IHogPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXRvbUNvdW50KTtcbiAgICBsZXQgaWR4ID0gdGhpcy5nZXRBdG9tQmxvY2tJZHgoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXRvbUNvdW50OyBpKyspIHtcbiAgICAgIGlkeCA9IHRoaXMuc2hpZnRJZHhUb1hDb2x1bW4oaWR4KTtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBbeCwgeSwgel0pIHtcbiAgICAgICAgaXRlbVtpXSA9IHRoaXMucGFyc2VGbG9hdFZhbHVlKGlkeCk7XG4gICAgICAgIGlkeCA9IHRoaXMuZ2V0TmV4dENvbHVtbklkeChpZHgpO1xuICAgICAgfVxuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4ge3g6IHgsIHk6IHksIHo6IHp9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlQm9uZGVkQXRvbVBhaXJzKCk6IFVpbnQxNkFycmF5W10ge1xuICAgIGNvbnN0IGJvbmRlZEF0b21QYWlycyA9IG5ldyBBcnJheTxVaW50MTZBcnJheT4odGhpcy5ib25kQ291bnQpO1xuICAgIGxldCBpZHggPSB0aGlzLmdldEJvbmRCbG9ja0lkeCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ib25kQ291bnQ7IGkrKykge1xuICAgICAgaWR4ID0gdGhpcy5zaGlmdElkeFRvQm9uZGVkQXRvbXNQYWlyKGlkeCk7XG4gICAgICBjb25zdCBwYWlyID0gbmV3IFVpbnQxNkFycmF5KDIpO1xuICAgICAgcGFpclswXSA9IHRoaXMucGFyc2VJbnRWYWx1ZShpZHgpO1xuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0Q29sdW1uSWR4KGlkeCk7XG4gICAgICBwYWlyWzFdID0gdGhpcy5wYXJzZUludFZhbHVlKGlkeCk7XG4gICAgICBib25kZWRBdG9tUGFpcnNbaV0gPSBwYWlyO1xuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4gYm9uZGVkQXRvbVBhaXJzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlQm9uZFR5cGVzKCk6IFVpbnQxNkFycmF5IHtcbiAgICBjb25zdCBib25kQ291bnQgPSB0aGlzLmJvbmRDb3VudDtcbiAgICBjb25zdCBib25kVHlwZXMgPSBuZXcgVWludDE2QXJyYXkoYm9uZENvdW50KTtcbiAgICBsZXQgaWR4ID0gdGhpcy5nZXRCb25kQmxvY2tJZHgoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJvbmRDb3VudDsgaSsrKSB7XG4gICAgICBpZHggPSB0aGlzLnNoaWZ0SWR4VG9Cb25kVHlwZShpZHgpO1xuICAgICAgYm9uZFR5cGVzW2ldID0gdGhpcy5wYXJzZUludFZhbHVlKGlkeCk7XG4gICAgICBpZHggPSB0aGlzLmdldE5leHRMaW5lSWR4KGlkeCk7XG4gICAgfVxuICAgIHJldHVybiBib25kVHlwZXM7XG4gIH07XG5cbiAgcHJvdGVjdGVkIGlzV2hpdGVzcGFjZShpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN5bWJvbCA9IHRoaXMuZmlsZUNvbnRlbnRbaWR4XTtcbiAgICByZXR1cm4gc3ltYm9sID09PSAnICcgfHwgc3ltYm9sID09PSAnXFx0JztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXROZXh0TGluZUlkeChpZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuZmlsZUNvbnRlbnRbaWR4XSAhPT0gJ1xcbicpXG4gICAgICByZXR1cm4gdGhpcy5maWxlQ29udGVudC5pbmRleE9mKCdcXG4nLCBpZHgpICsgMTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gaWR4ICsgMTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUZsb2F0VmFsdWUoaWR4T2ZOdW1iZXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VOdW1lcmljVmFsdWUocGFyc2VGbG9hdCwgaWR4T2ZOdW1iZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlSW50VmFsdWUoaWR4T2ZOdW1iZXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VOdW1lcmljVmFsdWUocGFyc2VJbnQsIGlkeE9mTnVtYmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZU51bWVyaWNWYWx1ZShcbiAgICBwYXJzZXJGdW5jdGlvbjogKHN0cjogc3RyaW5nKSA9PiBudW1iZXIsXG4gICAgaWR4T2ZOdW1iZXI6IG51bWJlclxuICApOiBudW1iZXIge1xuICAgIGxldCBlbmQgPSBpZHhPZk51bWJlciArIDE7XG4gICAgd2hpbGUgKCF0aGlzLmlzV2hpdGVzcGFjZShlbmQpKVxuICAgICAgKytlbmQ7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZXJGdW5jdGlvbih0aGlzLmZpbGVDb250ZW50LnN1YnN0cmluZyhpZHhPZk51bWJlciwgZW5kKSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4iXX0=","import { ChemicalTableParserBase } from './chemical-table-parser-base';\nimport { ASTERISK, D_QUOTE, L, R, S_QUOTE } from './const';\nimport { isAlpha } from './utils';\nexport class MolfileHandlerBase extends ChemicalTableParserBase {\n constructor(molfile) {\n super(molfile);\n this.init(molfile);\n }\n init(molfile) {\n super.init(molfile);\n }\n parseAtomType(idx) {\n let begin = idx;\n let end = begin;\n if (this.isQuote(begin)) {\n end = this.getNextIdenticalChar(begin);\n begin++;\n }\n else {\n end = this.fileContent.indexOf(' ', end);\n }\n return this.fileContent.substring(begin, end);\n }\n isQuote(idx) {\n const letter = this.fileContent[idx].charCodeAt(0);\n return letter === S_QUOTE || letter === D_QUOTE;\n }\n getNextIdenticalChar(idx) {\n const sym = this.fileContent[idx];\n return sym ? this.fileContent.indexOf(sym, idx + 1) : -1;\n }\n isQuery() {\n return this.isQueryOrFragment((char, idx) => {\n return char === S_QUOTE || char === D_QUOTE ||\n (char === L && !isAlpha(this.fileContent.charCodeAt(idx + 1)));\n });\n }\n ;\n isFragment() {\n return this.isQueryOrFragment((char) => {\n return char === R || char === ASTERISK;\n });\n }\n ;\n isQueryOrFragment(condition) {\n const atomCount = this.atomCount;\n let idx = this.getAtomBlockIdx();\n for (let i = 0; i < atomCount; i++) {\n idx = this.shiftIdxToAtomType(idx);\n const char = this.fileContent.charCodeAt(idx);\n if (condition(char, idx))\n return true;\n idx = this.getNextLineIdx(idx);\n }\n return false;\n }\n ;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS1oYW5kbGVyLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtb2xmaWxlLWhhbmRsZXItYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsdUJBQXVCLEVBQW9CLE1BQU0sOEJBQThCLENBQUM7QUFDeEYsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVsQyxNQUFNLE9BQWdCLGtCQUFtQixTQUFRLHVCQUF1QjtJQUN0RSxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRVMsSUFBSSxDQUFDLE9BQWU7UUFDNUIsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBV1MsYUFBYSxDQUFDLEdBQVc7UUFDakMsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdkIsR0FBRyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxLQUFLLEVBQUUsQ0FBQztTQUNUO2FBQU07WUFDTCxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQzFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVTLE9BQU8sQ0FBQyxHQUFXO1FBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sTUFBTSxLQUFLLE9BQU8sSUFBSSxNQUFNLEtBQUssT0FBTyxDQUFDO0lBQ2xELENBQUM7SUFFUyxvQkFBb0IsQ0FBQyxHQUFXO1FBQ3hDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFZLEVBQUUsR0FBVyxFQUFFLEVBQUU7WUFDMUQsT0FBTyxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksS0FBSyxPQUFPO2dCQUMzQyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNoRSxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFBQSxDQUFDO0lBRUssVUFBVTtRQUNmLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUU7WUFDN0MsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxRQUFRLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBQUEsQ0FBQztJQUVRLGlCQUFpQixDQUFDLFNBQWlEO1FBQzNFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDakMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEMsR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO2dCQUN0QixPQUFPLElBQUksQ0FBQztZQUNkLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQUEsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGVtaWNhbFRhYmxlUGFyc2VyQmFzZSwgQXRvbUFuZEJvbmRDb3VudHN9IGZyb20gJy4vY2hlbWljYWwtdGFibGUtcGFyc2VyLWJhc2UnO1xuaW1wb3J0IHsgQVNURVJJU0ssIERfUVVPVEUsIEwsIFIsIFNfUVVPVEUgfSBmcm9tICcuL2NvbnN0JztcbmltcG9ydCB7IGlzQWxwaGEgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1vbGZpbGVIYW5kbGVyQmFzZSBleHRlbmRzIENoZW1pY2FsVGFibGVQYXJzZXJCYXNlIHtcbiAgY29uc3RydWN0b3IobW9sZmlsZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobW9sZmlsZSk7XG4gICAgdGhpcy5pbml0KG1vbGZpbGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluaXQobW9sZmlsZTogc3RyaW5nKSB7XG4gICAgc3VwZXIuaW5pdChtb2xmaWxlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZUF0b21BbmRCb25kQ291bnRzKCk6IEF0b21BbmRCb25kQ291bnRzO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0Q291bnRzTGluZUlkeCgpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRBdG9tQmxvY2tJZHgoKTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2hpZnRJZHhUb1hDb2x1bW4obGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzaGlmdElkeFRvQXRvbVR5cGUobGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRCb25kQmxvY2tJZHgoKTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2hpZnRJZHhUb0JvbmRlZEF0b21zUGFpcihsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHNoaWZ0SWR4VG9Cb25kVHlwZShsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlcjtcblxuICBwcm90ZWN0ZWQgcGFyc2VBdG9tVHlwZShpZHg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgbGV0IGJlZ2luID0gaWR4O1xuICAgIGxldCBlbmQgPSBiZWdpbjtcbiAgICBpZiAodGhpcy5pc1F1b3RlKGJlZ2luKSkge1xuICAgICAgZW5kID0gdGhpcy5nZXROZXh0SWRlbnRpY2FsQ2hhcihiZWdpbik7XG4gICAgICBiZWdpbisrO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmQgPSB0aGlzLmZpbGVDb250ZW50LmluZGV4T2YoJyAnLCBlbmQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maWxlQ29udGVudC5zdWJzdHJpbmcoYmVnaW4sIGVuZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNRdW90ZShpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGxldHRlciA9IHRoaXMuZmlsZUNvbnRlbnRbaWR4XS5jaGFyQ29kZUF0KDApO1xuICAgIHJldHVybiBsZXR0ZXIgPT09IFNfUVVPVEUgfHwgbGV0dGVyID09PSBEX1FVT1RFO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldE5leHRJZGVudGljYWxDaGFyKGlkeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzeW0gPSB0aGlzLmZpbGVDb250ZW50W2lkeF07XG4gICAgcmV0dXJuIHN5bSA/IHRoaXMuZmlsZUNvbnRlbnQuaW5kZXhPZihzeW0sIGlkeCArIDEpIDogLTE7XG4gIH1cblxuICBwdWJsaWMgaXNRdWVyeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1F1ZXJ5T3JGcmFnbWVudCgoY2hhcjogbnVtYmVyLCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgcmV0dXJuIGNoYXIgPT09IFNfUVVPVEUgfHwgY2hhciA9PT0gRF9RVU9URSB8fFxuICAgICAgKGNoYXIgPT09IEwgJiYgIWlzQWxwaGEodGhpcy5maWxlQ29udGVudC5jaGFyQ29kZUF0KGlkeCArIDEpKSlcbiAgICB9KVxuICB9O1xuXG4gIHB1YmxpYyBpc0ZyYWdtZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUXVlcnlPckZyYWdtZW50KChjaGFyOiBudW1iZXIpID0+IHtcbiAgICAgIHJldHVybiBjaGFyID09PSBSIHx8IGNoYXIgPT09IEFTVEVSSVNLO1xuICAgIH0pXG4gIH07XG5cbiAgcHJvdGVjdGVkIGlzUXVlcnlPckZyYWdtZW50KGNvbmRpdGlvbjogKGNoYXI6IG51bWJlciwgaWR4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBjb25zdCBhdG9tQ291bnQgPSB0aGlzLmF0b21Db3VudDtcbiAgICBsZXQgaWR4ID0gdGhpcy5nZXRBdG9tQmxvY2tJZHgoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0b21Db3VudDsgaSsrKSB7XG4gICAgICBpZHggPSB0aGlzLnNoaWZ0SWR4VG9BdG9tVHlwZShpZHgpO1xuICAgICAgY29uc3QgY2hhciA9IHRoaXMuZmlsZUNvbnRlbnQuY2hhckNvZGVBdChpZHgpO1xuICAgICAgaWYgKGNvbmRpdGlvbihjaGFyLCBpZHgpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGlkeCA9IHRoaXMuZ2V0TmV4dExpbmVJZHgoaWR4KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xufVxuIl19","export const R = 82;\nexport const L = 76;\nexport const D_QUOTE = 34;\nexport const S_QUOTE = 39;\nexport const ASTERISK = 42;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb25zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEIsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUMxQixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQzFCLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgUiA9IDgyO1xuZXhwb3J0IGNvbnN0IEwgPSA3NjtcbmV4cG9ydCBjb25zdCBEX1FVT1RFID0gMzQ7XG5leHBvcnQgY29uc3QgU19RVU9URSA9IDM5O1xuZXhwb3J0IGNvbnN0IEFTVEVSSVNLID0gNDI7XG4iXX0=","export function isAlpha(charCode) {\n return (charCode > 64 && charCode < 91) ||\n (charCode > 96 && charCode < 123);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFVBQVUsT0FBTyxDQUFDLFFBQWdCO0lBQ3BDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsRUFBRSxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkMsQ0FBQyxRQUFRLEdBQUcsRUFBRSxJQUFJLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGlzQWxwaGEoY2hhckNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoY2hhckNvZGUgPiA2NCAmJiBjaGFyQ29kZSA8IDkxKSB8fFxuICAgICAgICAoY2hhckNvZGUgPiA5NiAmJiBjaGFyQ29kZSA8IDEyMyk7XG59XG4iXX0=","import { MolfileHandlerBase } from './molfile-handler-base';\nimport { V2K_CONST } from '../formats/molfile-v2k-const';\nexport class MolfileV2KHandler extends MolfileHandlerBase {\n constructor(molfile) {\n super(molfile);\n }\n static validate(molfile) {\n return (molfile.indexOf(V2K_CONST.HEADER) !== -1 &&\n molfile.indexOf(V2K_CONST.END) !== -1);\n }\n shiftIdxToAtomType(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, V2K_CONST.ATOM_TYPE_COL);\n }\n getCountsLineIdx() {\n let idx = 0;\n for (let i = 0; i < V2K_CONST.NUM_OF_HEADER_LINES; ++i)\n idx = this.getNextLineIdx(idx);\n return idx;\n }\n getAtomBlockIdx() {\n let idx = this.getCountsLineIdx();\n idx = this.getNextLineIdx(idx);\n return idx;\n }\n shiftIdxToXColumn(lineStartIdx) {\n return this.getNextColumnIdx(lineStartIdx);\n }\n shiftIdxToBondedAtomsPair(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, V2K_CONST.FIRST_BONDED_ATOM_COL);\n }\n shiftIdxToBondType(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, V2K_CONST.BOND_TYPE_COL);\n }\n getBondBlockIdx() {\n let idx = this.getAtomBlockIdx();\n for (let i = 0; i < this.atomCount; i++)\n idx = this.getNextLineIdx(idx);\n return idx;\n }\n parseAtomAndBondCounts() {\n let begin = this.getCountsLineIdx();\n let end = begin + V2K_CONST.NUM_OF_COUNTS_DIGITS;\n const atomCount = parseInt(this.fileContent.substring(begin, end));\n begin = end;\n end += V2K_CONST.NUM_OF_COUNTS_DIGITS;\n const bondCount = parseInt(this.fileContent.substring(begin, end));\n return { atomCount: atomCount, bondCount: bondCount };\n }\n ;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS12MmstaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1vbGZpbGUtdjJrLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBSXZELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxrQkFBa0I7SUFDdkQsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBRU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFlO1FBQ3BDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRVMsa0JBQWtCLENBQUMsWUFBb0I7UUFDL0MsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRVMsZ0JBQWdCO1FBQ3hCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDO1lBQ3BELEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVTLGVBQWU7UUFDdkIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDbEMsR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRVMsaUJBQWlCLENBQUMsWUFBb0I7UUFDOUMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVTLHlCQUF5QixDQUFDLFlBQW9CO1FBQ3RELE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRVMsa0JBQWtCLENBQUMsWUFBb0I7UUFDL0MsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRVMsZUFBZTtRQUN2QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDakMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFO1lBQ3JDLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVTLHNCQUFzQjtRQUM5QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNwQyxJQUFJLEdBQUcsR0FBRyxLQUFLLEdBQUcsU0FBUyxDQUFDLG9CQUFvQixDQUFDO1FBQ2pELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRSxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ1osR0FBRyxJQUFJLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQztRQUN0QyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkUsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBQ3RELENBQUM7SUFBQSxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0F0b21BbmRCb25kQ291bnRzfSBmcm9tICcuL2NoZW1pY2FsLXRhYmxlLXBhcnNlci1iYXNlJztcbmltcG9ydCB7TW9sZmlsZUhhbmRsZXJCYXNlfSBmcm9tICcuL21vbGZpbGUtaGFuZGxlci1iYXNlJztcbmltcG9ydCB7VjJLX0NPTlNUfSBmcm9tICcuLi9mb3JtYXRzL21vbGZpbGUtdjJrLWNvbnN0JztcbmltcG9ydCB7IEwsIFIgfSBmcm9tICcuL2NvbnN0JztcbmltcG9ydCB7IGlzQWxwaGEgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIE1vbGZpbGVWMktIYW5kbGVyIGV4dGVuZHMgTW9sZmlsZUhhbmRsZXJCYXNlIHtcbiAgY29uc3RydWN0b3IobW9sZmlsZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobW9sZmlsZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHZhbGlkYXRlKG1vbGZpbGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAobW9sZmlsZS5pbmRleE9mKFYyS19DT05TVC5IRUFERVIpICE9PSAtMSAmJlxuICAgIG1vbGZpbGUuaW5kZXhPZihWMktfQ09OU1QuRU5EKSAhPT0gLTEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNoaWZ0SWR4VG9BdG9tVHlwZShsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hpZnRJZHhUb1NwZWNpZmllZENvbHVtbihsaW5lU3RhcnRJZHgsIFYyS19DT05TVC5BVE9NX1RZUEVfQ09MKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDb3VudHNMaW5lSWR4KCk6IG51bWJlciB7XG4gICAgbGV0IGlkeCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBWMktfQ09OU1QuTlVNX09GX0hFQURFUl9MSU5FUzsgKytpKVxuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIHJldHVybiBpZHg7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QXRvbUJsb2NrSWR4KCk6IG51bWJlciB7XG4gICAgbGV0IGlkeCA9IHRoaXMuZ2V0Q291bnRzTGluZUlkeCgpO1xuICAgIGlkeCA9IHRoaXMuZ2V0TmV4dExpbmVJZHgoaWR4KTtcbiAgICByZXR1cm4gaWR4O1xuICB9XG5cbiAgcHJvdGVjdGVkIHNoaWZ0SWR4VG9YQ29sdW1uKGxpbmVTdGFydElkeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXROZXh0Q29sdW1uSWR4KGxpbmVTdGFydElkeCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hpZnRJZHhUb0JvbmRlZEF0b21zUGFpcihsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hpZnRJZHhUb1NwZWNpZmllZENvbHVtbihsaW5lU3RhcnRJZHgsIFYyS19DT05TVC5GSVJTVF9CT05ERURfQVRPTV9DT0wpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNoaWZ0SWR4VG9Cb25kVHlwZShsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hpZnRJZHhUb1NwZWNpZmllZENvbHVtbihsaW5lU3RhcnRJZHgsIFYyS19DT05TVC5CT05EX1RZUEVfQ09MKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRCb25kQmxvY2tJZHgoKTogbnVtYmVyIHtcbiAgICBsZXQgaWR4ID0gdGhpcy5nZXRBdG9tQmxvY2tJZHgoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXRvbUNvdW50OyBpKyspXG4gICAgICBpZHggPSB0aGlzLmdldE5leHRMaW5lSWR4KGlkeCk7XG4gICAgcmV0dXJuIGlkeDtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUF0b21BbmRCb25kQ291bnRzKCk6IEF0b21BbmRCb25kQ291bnRzIHtcbiAgICBsZXQgYmVnaW4gPSB0aGlzLmdldENvdW50c0xpbmVJZHgoKTtcbiAgICBsZXQgZW5kID0gYmVnaW4gKyBWMktfQ09OU1QuTlVNX09GX0NPVU5UU19ESUdJVFM7XG4gICAgY29uc3QgYXRvbUNvdW50ID0gcGFyc2VJbnQodGhpcy5maWxlQ29udGVudC5zdWJzdHJpbmcoYmVnaW4sIGVuZCkpO1xuICAgIGJlZ2luID0gZW5kO1xuICAgIGVuZCArPSBWMktfQ09OU1QuTlVNX09GX0NPVU5UU19ESUdJVFM7XG4gICAgY29uc3QgYm9uZENvdW50ID0gcGFyc2VJbnQodGhpcy5maWxlQ29udGVudC5zdWJzdHJpbmcoYmVnaW4sIGVuZCkpO1xuICAgIHJldHVybiB7YXRvbUNvdW50OiBhdG9tQ291bnQsIGJvbmRDb3VudDogYm9uZENvdW50fTtcbiAgfTtcbn1cbiJdfQ==","import { MolfileHandlerBase } from './molfile-handler-base';\nexport class MolfileV3KHandler extends MolfileHandlerBase {\n constructor(molfile) {\n super(molfile);\n this.init(molfile);\n }\n shiftIdxToAtomType(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, 4 /* V3K_CONST.ATOM_TYPE_COL */);\n }\n getCountsLineIdx() {\n return this.fileContent.indexOf(\"M V30 COUNTS \" /* V3K_CONST.BEGIN_COUNTS_LINE */);\n }\n getAtomBlockIdx() {\n let idx = this.fileContent.indexOf(\"M V30 BEGIN ATOM\" /* V3K_CONST.BEGIN_ATOM_BLOCK */);\n idx = this.getNextLineIdx(idx);\n return idx;\n }\n shiftIdxToXColumn(lineStartIdx) {\n let idx = this.shiftIdxToAtomType(lineStartIdx);\n if (this.isQuote(idx)) {\n idx = this.getNextIdenticalChar(idx);\n idx = this.getNextColumnIdx(idx);\n return idx;\n }\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, 5 /* V3K_CONST.X_COL */);\n }\n shiftIdxToBondedAtomsPair(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, 5 /* V3K_CONST.FIRST_BONDED_ATOM_COL */);\n }\n shiftIdxToBondType(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, 4 /* V3K_CONST.BOND_TYPE_COL */);\n }\n getBondBlockIdx() {\n return this.getNextLineIdx(this.fileContent.indexOf(\"M V30 BEGIN BOND\" /* V3K_CONST.BEGIN_BOND_BLOCK */));\n }\n static validate(molfile) {\n return (molfile.indexOf(\"V3000\" /* V3K_CONST.HEADER */) !== -1 &&\n molfile.indexOf(\"M END\" /* V3K_CONST.END */) !== -1);\n }\n parseAtomAndBondCounts() {\n // parse atom count\n let begin = this.fileContent.indexOf(\"M V30 COUNTS \" /* V3K_CONST.BEGIN_COUNTS_LINE */) + 14 /* V3K_CONST.COUNTS_SHIFT */;\n let end = this.fileContent.indexOf(' ', begin + 1);\n const numOfAtoms = parseInt(this.fileContent.substring(begin, end));\n // parse bond count\n begin = end + 1;\n end = this.fileContent.indexOf(' ', begin + 1);\n const numOfBonds = parseInt(this.fileContent.substring(begin, end));\n return { atomCount: numOfAtoms, bondCount: numOfBonds };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS12M2staGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1vbGZpbGUtdjNrLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFLMUQsTUFBTSxPQUFPLGlCQUFrQixTQUFRLGtCQUFrQjtJQUN2RCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRVMsa0JBQWtCLENBQUMsWUFBb0I7UUFDL0MsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsWUFBWSxrQ0FBMEIsQ0FBQztJQUMvRSxDQUFDO0lBRVMsZ0JBQWdCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLG9EQUE2QixDQUFDO0lBQy9ELENBQUM7SUFFUyxlQUFlO1FBQ3ZCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxzREFBNEIsQ0FBQztRQUMvRCxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxZQUFvQjtRQUM5QyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3JCLEdBQUcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckMsR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxPQUFPLEdBQUcsQ0FBQztTQUNaO1FBQ0QsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsWUFBWSwwQkFBa0IsQ0FBQztJQUN2RSxDQUFDO0lBRVMseUJBQXlCLENBQUMsWUFBb0I7UUFDdEQsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsWUFBWSwwQ0FBa0MsQ0FBQztJQUN2RixDQUFDO0lBRVMsa0JBQWtCLENBQUMsWUFBb0I7UUFDL0MsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsWUFBWSxrQ0FBMEIsQ0FBQztJQUMvRSxDQUFDO0lBRVMsZUFBZTtRQUN2QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLHNEQUE0QixDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVNLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBZTtRQUNwQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sZ0NBQWtCLEtBQUssQ0FBQyxDQUFDO1lBQ2hELE9BQU8sQ0FBQyxPQUFPLDhCQUFlLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRVMsc0JBQXNCO1FBQzlCLG1CQUFtQjtRQUNuQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sb0RBQTZCLGtDQUF5QixDQUFDO1FBQzNGLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXBFLG1CQUFtQjtRQUNuQixLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNoQixHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMvQyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFcEUsT0FBTyxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBQyxDQUFDO0lBQ3hELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXRvbUFuZEJvbmRDb3VudHN9IGZyb20gJy4vY2hlbWljYWwtdGFibGUtcGFyc2VyLWJhc2UnO1xuaW1wb3J0IHtNb2xmaWxlSGFuZGxlckJhc2V9IGZyb20gJy4vbW9sZmlsZS1oYW5kbGVyLWJhc2UnO1xuaW1wb3J0IHtWM0tfQ09OU1R9IGZyb20gJy4uL2Zvcm1hdHMvbW9sZmlsZS12M2stY29uc3QnO1xuaW1wb3J0IHsgTCwgUiB9IGZyb20gJy4vY29uc3QnO1xuaW1wb3J0IHsgaXNBbHBoYSB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgTW9sZmlsZVYzS0hhbmRsZXIgZXh0ZW5kcyBNb2xmaWxlSGFuZGxlckJhc2Uge1xuICBjb25zdHJ1Y3Rvcihtb2xmaWxlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtb2xmaWxlKTtcbiAgICB0aGlzLmluaXQobW9sZmlsZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hpZnRJZHhUb0F0b21UeXBlKGxpbmVTdGFydElkeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zaGlmdElkeFRvU3BlY2lmaWVkQ29sdW1uKGxpbmVTdGFydElkeCwgVjNLX0NPTlNULkFUT01fVFlQRV9DT0wpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENvdW50c0xpbmVJZHgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5maWxlQ29udGVudC5pbmRleE9mKFYzS19DT05TVC5CRUdJTl9DT1VOVFNfTElORSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QXRvbUJsb2NrSWR4KCk6IG51bWJlciB7XG4gICAgbGV0IGlkeCA9IHRoaXMuZmlsZUNvbnRlbnQuaW5kZXhPZihWM0tfQ09OU1QuQkVHSU5fQVRPTV9CTE9DSyk7XG4gICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIHJldHVybiBpZHg7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hpZnRJZHhUb1hDb2x1bW4obGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCBpZHggPSB0aGlzLnNoaWZ0SWR4VG9BdG9tVHlwZShsaW5lU3RhcnRJZHgpO1xuICAgIGlmICh0aGlzLmlzUXVvdGUoaWR4KSkge1xuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0SWRlbnRpY2FsQ2hhcihpZHgpO1xuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0Q29sdW1uSWR4KGlkeCk7XG4gICAgICByZXR1cm4gaWR4O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaGlmdElkeFRvU3BlY2lmaWVkQ29sdW1uKGxpbmVTdGFydElkeCwgVjNLX0NPTlNULlhfQ09MKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaGlmdElkeFRvQm9uZGVkQXRvbXNQYWlyKGxpbmVTdGFydElkeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zaGlmdElkeFRvU3BlY2lmaWVkQ29sdW1uKGxpbmVTdGFydElkeCwgVjNLX0NPTlNULkZJUlNUX0JPTkRFRF9BVE9NX0NPTCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hpZnRJZHhUb0JvbmRUeXBlKGxpbmVTdGFydElkeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zaGlmdElkeFRvU3BlY2lmaWVkQ29sdW1uKGxpbmVTdGFydElkeCwgVjNLX0NPTlNULkJPTkRfVFlQRV9DT0wpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEJvbmRCbG9ja0lkeCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldE5leHRMaW5lSWR4KHRoaXMuZmlsZUNvbnRlbnQuaW5kZXhPZihWM0tfQ09OU1QuQkVHSU5fQk9ORF9CTE9DSykpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB2YWxpZGF0ZShtb2xmaWxlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKG1vbGZpbGUuaW5kZXhPZihWM0tfQ09OU1QuSEVBREVSKSAhPT0gLTEgJiZcbiAgICBtb2xmaWxlLmluZGV4T2YoVjNLX0NPTlNULkVORCkgIT09IC0xKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUF0b21BbmRCb25kQ291bnRzKCk6IEF0b21BbmRCb25kQ291bnRzIHtcbiAgICAvLyBwYXJzZSBhdG9tIGNvdW50XG4gICAgbGV0IGJlZ2luID0gdGhpcy5maWxlQ29udGVudC5pbmRleE9mKFYzS19DT05TVC5CRUdJTl9DT1VOVFNfTElORSkgKyBWM0tfQ09OU1QuQ09VTlRTX1NISUZUO1xuICAgIGxldCBlbmQgPSB0aGlzLmZpbGVDb250ZW50LmluZGV4T2YoJyAnLCBiZWdpbiArIDEpO1xuICAgIGNvbnN0IG51bU9mQXRvbXMgPSBwYXJzZUludCh0aGlzLmZpbGVDb250ZW50LnN1YnN0cmluZyhiZWdpbiwgZW5kKSk7XG5cbiAgICAvLyBwYXJzZSBib25kIGNvdW50XG4gICAgYmVnaW4gPSBlbmQgKyAxO1xuICAgIGVuZCA9IHRoaXMuZmlsZUNvbnRlbnQuaW5kZXhPZignICcsIGJlZ2luICsgMSk7XG4gICAgY29uc3QgbnVtT2ZCb25kcyA9IHBhcnNlSW50KHRoaXMuZmlsZUNvbnRlbnQuc3Vic3RyaW5nKGJlZ2luLCBlbmQpKTtcblxuICAgIHJldHVybiB7YXRvbUNvdW50OiBudW1PZkF0b21zLCBib25kQ291bnQ6IG51bU9mQm9uZHN9O1xuICB9XG59XG4iXX0=","import { MolfileV2KHandler } from './molfile-v2k-handler';\nimport { MolfileV3KHandler } from './molfile-v3k-handler';\n/** Defines the proper handler based on the molfile type */\nexport class MolfileHandler {\n constructor() { }\n static getInstance(molfile) {\n if (MolfileV2KHandler.validate(molfile))\n return new MolfileV2KHandler(molfile);\n else if (MolfileV3KHandler.validate(molfile))\n return new MolfileV3KHandler(molfile);\n else\n throw new Error('Malformed molfile');\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibW9sZmlsZS1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELDREQUE0RDtBQUM1RCxNQUFNLE9BQU8sY0FBYztJQUN6QixnQkFBdUIsQ0FBQztJQUV4QixNQUFNLENBQUMsV0FBVyxDQUFDLE9BQWU7UUFDaEMsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNuQyxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDMUMsT0FBTyxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDOztZQUV0QyxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDekMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNb2xmaWxlSGFuZGxlckJhc2V9IGZyb20gJy4vbW9sZmlsZS1oYW5kbGVyLWJhc2UnO1xuaW1wb3J0IHtNb2xmaWxlVjJLSGFuZGxlcn0gZnJvbSAnLi9tb2xmaWxlLXYyay1oYW5kbGVyJztcbmltcG9ydCB7TW9sZmlsZVYzS0hhbmRsZXJ9IGZyb20gJy4vbW9sZmlsZS12M2staGFuZGxlcic7XG5cbi8qKiBEZWZpbmVzIHRoZSBwcm9wZXIgaGFuZGxlciBiYXNlZCBvbiB0aGUgbW9sZmlsZSB0eXBlICAqL1xuZXhwb3J0IGNsYXNzIE1vbGZpbGVIYW5kbGVyIHtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhdGljIGdldEluc3RhbmNlKG1vbGZpbGU6IHN0cmluZyk6IE1vbGZpbGVIYW5kbGVyQmFzZSB7XG4gICAgaWYgKE1vbGZpbGVWMktIYW5kbGVyLnZhbGlkYXRlKG1vbGZpbGUpKVxuICAgICAgcmV0dXJuIG5ldyBNb2xmaWxlVjJLSGFuZGxlcihtb2xmaWxlKTtcbiAgICBlbHNlIGlmIChNb2xmaWxlVjNLSGFuZGxlci52YWxpZGF0ZShtb2xmaWxlKSlcbiAgICAgIHJldHVybiBuZXcgTW9sZmlsZVYzS0hhbmRsZXIobW9sZmlsZSk7XG4gICAgZWxzZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYWxmb3JtZWQgbW9sZmlsZScpO1xuICB9XG59XG4iXX0=","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {delay, testEvent} from '@datagrok-libraries/utils/src/test';\n\nexport async function awaitGrid(grid: DG.Grid, timeout: number = 5000): Promise<void> {\n await delay(100);\n await testEvent(grid.onAfterDrawContent, () => {},\n () => { grid.invalidate(); }, timeout);\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 {after, before, category, delay, expect, test, expectArray, testEvent} from '@datagrok-libraries/utils/src/test';\nimport {\n getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';\nimport {MolfileHandler} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler';\nimport {MolfileHandlerBase} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler-base';\n\nimport {awaitGrid} from './utils';\n\nimport {_package} from '../package-test';\n\ncategory('getMolfiles', () => {\n let monomerLibHelper: IMonomerLibHelper;\n let userLibSettings: UserLibSettings;\n\n before(async () => {\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n await setUserLibSettingsForTests();\n await monomerLibHelper.loadLibraries(true);\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadLibraries(true);\n });\n\n const csv = `Helm, atoms, bonds\nPEPTIDE1{meI.hHis.Aca.N.T.dE.Thr_PO3H2.Aca.D-Tyr_Et.Tyr_ab-dehydroMe.dV}$$$$,11,10\nPEPTIDE1{meI.hHis.Aca.Cys_SEt.T.dK.Thr_PO3H2.Aca.Tyr_PO3H2.D-Chg.dV}$$$$,11,10\nPEPTIDE1{Lys_Boc.hHis.Aca.Cys_SEt.T.dK.Thr_PO3H2.Aca.Tyr_PO3H2}$$$$,9,8`;\n\n test('linear1', async () => {\n const df = DG.DataFrame.fromCsv(csv);\n const helmCol = df.getCol('Helm');\n const view = grok.shell.addTableView(df);\n\n _package.logger.debug('Helm/getMolfiles/linear1, grid awaiting 1');\n await awaitGrid(view.grid, 5000);\n _package.logger.debug('Helm/getMolfiles/linear1, grid awaited 1');\n\n const resCol: DG.Column<string> = await grok.functions.call('Helm:getMolfiles', {col: helmCol});\n expect(resCol.length, helmCol.length);\n const resMolfileList: MolfileHandlerBase[] = resCol.toList().map((molfile) => MolfileHandler.getInstance(molfile));\n expectArray(resMolfileList.map((mf) => mf.atomCount), df.getCol('atoms').toList());\n expectArray(resMolfileList.map((mf) => mf.bondCount), df.getCol('bonds').toList());\n\n _package.logger.debug('Helm/getMolfiles/linear1, grid awaiting 2');\n await awaitGrid(view.grid, 5000);\n _package.logger.debug('Helm/getMolfiles/linear1, grid awaited 2');\n });\n});\n","const __WEBPACK_NAMESPACE_OBJECT__ = ui;","import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\n\nimport {category, expect, expectObject, test} from '@datagrok-libraries/utils/src/test';\nimport {ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';\n\nimport {getPropertiesDict} from '../widgets/properties-widget';\n\nconst enum MolProps {\n formula = 'formula',\n mw = 'molecular weight',\n extinctCoef = 'extinction coefficient',\n}\n\nconst enum Tests {\n helm = 'Helm',\n separator = 'separator',\n separator2 = 'separator2', // with a few gaps in a row\n separatorGaps = 'separator-gaps',\n fastaPt = 'fasta-PT',\n fastaPtMsa = 'fasta-PT-MSA',\n fastaDna = 'fasta-DNA',\n}\n\nconst TestsData: {\n [testName: string]: { seq: string, units: NOTATION, separator?: string, alphabet?: ALPHABET, res: {} }\n} = {\n [Tests.helm]: {\n seq: 'PEPTIDE1{I.H.A.C.T.[Thr_PO3H2].[Aca].[D-Tyr_Et]}|PEPTIDE2{E.A.[meG]}$PEPTIDE1,PEPTIDE2,4:R3-1:R1$$$V2.0',\n units: NOTATION.HELM,\n res: {[MolProps.formula]: 'C58H94N13O21SP', [MolProps.mw]: 1372.48, [MolProps.extinctCoef]: 1.55}\n },\n [Tests.separator]: {\n seq: 'I/H/A/C/T/Thr_PO3H2/Aca/D-Tyr_Et',\n units: NOTATION.SEPARATOR, separator: '/', alphabet: ALPHABET.UN,\n res: {[MolProps.formula]: 'C47H77N10O15SP', [MolProps.mw]: 1085.21, [MolProps.extinctCoef]: 1.55}\n },\n [Tests.separator2]: {\n seq: 'meI/hHis/Aca/N/T/dK/Thr_PO3H2/Aca/D-Tyr_Et/Aze/dV/E/N////Phe_4Me',\n units: NOTATION.SEPARATOR, separator: '/', alphabet: ALPHABET.UN,\n res: {[MolProps.formula]: 'C91H146N19O25P', [MolProps.mw]: 1937.21, [MolProps.extinctCoef]: 1.49},\n },\n [Tests.separatorGaps]: {\n seq: 'I/H/A//T/Thr_PO3H2/Aca/D-Tyr_Et',\n units: NOTATION.SEPARATOR, separator: '/', alphabet: ALPHABET.UN,\n res: {[MolProps.formula]: 'C44H72N9O14P', [MolProps.mw]: 982.07, [MolProps.extinctCoef]: 1.49},\n },\n [Tests.fastaPt]: {\n seq: 'IHACTTAY',\n units: NOTATION.FASTA, alphabet: ALPHABET.PT,\n res: {[MolProps.formula]: 'C38H58N10O12S', [MolProps.mw]: 878.99, [MolProps.extinctCoef]: 1.55}\n },\n [Tests.fastaDna]: {\n seq: 'ACGTATTCC',\n units: NOTATION.FASTA, alphabet: ALPHABET.DNA,\n res: {[MolProps.formula]: 'C87H113N30O56P9', [MolProps.mw]: 2753.76, [MolProps.extinctCoef]: 91.74}\n }\n};\n\ncategory('properties-widget', () => {\n for (const [testName, testData] of Object.entries(TestsData)) {\n test(testName, async () => {\n testPropertiesDict(testData.seq, testData.units, testData.separator, testData.alphabet, testData.res);\n });\n }\n});\n\nfunction testPropertiesDict(\n seq: string, units: NOTATION, separator: string | undefined, alphabet: ALPHABET | undefined, expPropDict: {}\n) {\n const col = DG.Column.fromList(DG.COLUMN_TYPE.STRING, 'seq', [seq]);\n col.semType = DG.SEMTYPE.MACROMOLECULE;\n col.setTag(DG.TAGS.UNITS, units);\n if (separator) col.setTag(bioTAGS.separator, separator);\n if (alphabet) col.setTag(bioTAGS.alphabet, alphabet);\n const uh = SeqHandler.forColumn(col);\n const actPropDict = getPropertiesDict(seq, uh);\n expectObject(actPropDict, expPropDict);\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 $ from 'cash-dom';\n\nimport {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';\nimport {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\n\nimport {removeGapsFromHelm} from '../utils';\n\nexport function getPropertiesDict(seq: string, sh: SeqHandler): {} {\n const helmString = sh.isHelm() ? seq : sh.getConverter(NOTATION.HELM)(seq);\n // Remove gap symbols for compatibility with WebEditor\n const helmString2 = removeGapsFromHelm(helmString);\n\n const host = ui.div([], {style: {width: '0', height: '0'}});\n document.documentElement.appendChild(host);\n try {\n const editor = new JSDraw2.Editor(host, {viewonly: true});\n editor.setHelm(helmString2);\n\n const formula = editor.getFormula(true);\n const molWeight = Math.round(editor.getMolWeight() * 100) / 100;\n const coef = Math.round(editor.getExtinctionCoefficient(true) * 100) / 100;\n return {\n 'formula': formula.replace(/<sub>/g, '').replace(/<\\/sub>/g, ''),\n 'molecular weight': molWeight,\n 'extinction coefficient': coef,\n };\n } finally {\n $(host).empty();\n host.remove();\n }\n}\n\n\nexport function getPropertiesWidget(value: DG.SemanticValue): DG.Widget {\n const sh = SeqHandler.forColumn(value.cell.column);\n const propDict = getPropertiesDict(value.value, sh);\n return new DG.Widget(\n ui.tableFromMap(propDict)\n );\n}\n","import * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\n\nimport {runTests, tests, TestContext} from '@datagrok-libraries/utils/src/test';\n\nimport './tests/helm-tests.ts';\nimport './tests/findMonomers-tests';\nimport './tests/renderers-tests';\nimport './tests/get-molfiles';\nimport './tests/properties-widget-tests';\n\nexport const _package = new DG.Package();\nexport {tests};\n\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":["exports","__esModule","digestLength","blockSize","K","Uint32Array","hashBlocks","w","v","p","pos","len","a","b","c","d","e","f","g","h","u","i","j","t1","t2","Hash","this","state","Int32Array","temp","buffer","Uint8Array","bufferLength","bytesHashed","finished","reset","prototype","clean","length","update","data","dataLength","Error","dataPos","finish","out","left","bitLenHi","bitLenLo","padLength","digest","_saveState","_restoreState","from","HMAC","key","inner","outer","pad","istate","ostate","hash","hmac","fillBuffer","info","counter","num","hkdfSalt","hkdf","salt","okm","hmac_","bufpos","fill","pbkdf2","password","iterations","dkLen","prf","ctr","t","dk","k","factory","sha256","module","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","call","n","getter","definition","o","Object","defineProperty","enumerable","get","obj","prop","hasOwnProperty","r","Symbol","toStringTag","value","DG","grok","testData","fromCsv","columns","add","fromList","BYTE_ARRAY","Array","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","result","done","then","apply","STANDART_TIMEOUT","BENCHMARK_TIMEOUT","stdLog","console","log","bind","stdInfo","stdWarn","warn","stdError","error","tests","autoTestsCatName","demoCatName","detectorsCatName","coreCatName","wasRegistered","currentCategory","assure","notNull","name","TestContext","constructor","catchUnhandled","report","Test","category","test","options","_a","timeout","push","expect","actual","expected","expectFloat","tolerance","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","NaN","isNaN","areEqual","Math","abs","expectObject","expectedKey","expectedValue","entries","actualValue","expectArray","isFinite","actualLength","expectedLength","tests_","clear","before","after","addNamespace","s","replace","RegExp","nqName","getResult","x","toString","stack","translateStackTrace","execTest","predicate","logs","categoryTimeout","packageName","verbose","_b","_c","_d","_e","_f","type","filter","toLowerCase","skip","skipReason","start","Date","now","success","ms","skipped","timeout_","isInBenchmark","isAggregated","col","stats","sum","df","remove","rows","removeWhere","toCsv","join","params","res","keys","reduce","acc","assign","usage","delay","setTimeout","func","testTimeout","timeoutPromise","_","race","clearTimeout","fromColumns","fromStrings","helmGapStartRe","helmGapIntRe","helmGapEndRe","parseHelm","split","monomers","scil","Utils","isNullOrEmpty","seqs","detachAnnotation","str","indexOf","substring","ss","monomer","startsWith","includes","closingIndex","findClosing","element","residue","endsWith","openingIndex","findOpening","firstPiece","thirdPiece","lastIndexOf","elements","el","open","close","count","sep","ret","frag","parentheses","bracket","braces","quote","c2","_detachAppendix","tag","repeat","endswith","m","complexMonomersExpected","complexTestNames","async","expectedResults","helmStrings","idx","monomerSet","Set","monomerArray","JSON","stringify","forEach","helm","monomersArray","sort","PHOSPHATE_SYMBOL","HELM_WRAPPERS_REGEXP","CandidateType","alphabet","cutoff","CandidateSimType","candidate","freq","similarity","super","wu","NOTATION","monomerRe","fasta","peptide","dna","rna","Float32Array","vectorLength","sqrSum","sqrt","makePalette","dt","simplified","PaletteType","palette","cp","objList","colour","ind","colourPalette","_palette","undefinedColor","Lesk","lesk","GrokGroups","grokGroups","RasMol","rasMol","resM","aaSynonyms","Aminoacids","getPalette","scheme","getInnerOuter","isInner","char","parseInt","getColorAAPivot","chemPaletteInstance","outerMonomer","innerMonomer","slice","amino","toUpperCase","AAFullNames","SemType","SemTypeMultipleAlignment","Names","AASmiles","AASmilesTruncated","Nucleotides","StringUtils","hashCode","charCodeAt","UnknownSeqPalette","UnknownColorPalette","buildPalette","concat","values","pI","color","dgColor","fromHtml","distToBlack","pow","toRgb","correctColor","StringListSeqSplitted","mList","canonicals","originals","isGap","posIdx","getOriginal","gapOriginalMonomer","getCanonical","FastaSimpleSeqSplitted","seqS","GapOriginals","FASTA","splitterAsFasta","seq","mmList","matchAll","map","ma","toArray","splitterAsFastaSimple","getSplitterWithSeparator","separator","limit","replaceAll","SEPARATOR","splitterAsHelm","lastIndex","ea","exec","inSeq","mm","pp1M","HELM","detectAlphabet","candidates","gapSymbol","candidatesSims","sim","delete","freqA","alphabetA","has","freqV","alphabetV","v1","v2","prod","vectorDotProduct","getAlphabetSimilarity","alphabetName","maxSim","max","cs","find","hamming","args","distanceF","scoringMatrix","alphabetIndexes","indexes","matrix","minCharCode","min","scorringArray","index","matrixRow","key2","index2","getDistanceF","threshold","seq1","seq2","diff","s1l","s2l","thresholdLimit","peq","defaultArgs","gapOpen","gapExtend","MmDistanceFunctionsNames","mmDistanceFunctions","HAMMING","LEVENSHTEIN","tmp","lst","pv","mv","sc","eq","xv","myers_32","mhc","phc","hsize","ceil","vsize","vlen","pb","mb","xh","ph","mh","score","myers_x","distance","NEEDLEMANN_WUNSCH","charCodeArray","Uint16Array","verticalGaps","horizontalGaps","prevRow","currRow","diagonal","top","maxScore","MONOMER_CHEMICAL_DISTANCE","Temps","uh","MACROMOLECULE","_splitter","cached","_splitted","columnVersion","_stats","_maxLength","_posList","_joiner","STRING","_column","_columnVersion","version","units","getTag","UNITS","_units","_notation","getNotation","_defaultGapOriginal","isFasta","isHelm","column","tags","setUnitsToFastaColumn","isSeparator","setUnitsToSeparatorColumn","setUnitsToHelmColumn","setTag","semType","setTags","some","aligned","sameLength","alphabetSize","alphabetIsMultichar","notation","defaultGapOriginal","helmCompatible","getAlphabetSize","alphabetSizeStr","getAlphabetIsMultichar","getSplitted","rowIdx","resSS","deref","splitter","WeakRef","firstLength","colLen","mSeq","cm","maxLength","take","posList","posListTxt","trim","isRna","isDna","isPeptide","isMsa","isHelmCompatible","om","getHelmWrappers","getNewColumn","tgtNotation","tgtSeparator","colName","newColName","dataFrame","getUnusedName","newColumn","CELL_RENDERER","srcAligned","srcAlphabet","srcAlphabetSize","srcAlphabetIsMultichar","getNewColumnFromList","seqList","templateCol","forColumn","targetNotation","unitsStringIsValid","getNewColumnFromParams","getSplitter","getDistanceFunctionName","getDistanceFunction","checkHelmCompatibility","peptides","getMonomerLibHelper","getBioLib","getMonomerSymbolsByType","peptidesSet","catIdxSet","rowCount","colRawData","getRawData","catI","toFasta","toSeparator","toHelm","convertHelmToFastaSeparator","srcSeq","tgtGapOriginal","isNucleotide","helmItemsArray","tgtMonomersArray","convert","joiner","getJoiner","init","srcSS","getRegion","startIdx","endIdx","regCol","startIdxVal","endIdxVal","regLength","rowI","regOMList","regJPos","seqJPos","seqOM","getRegionOfPositionNames","srcPosList","regPosList","srcJPos","srcPositionNamesStr","srcPositionLabelsStr","opts","srcSh","joinToFasta","joinToSeparator","isDnaOrRna","wrappers","joinToHelm","getConverter","tgtUnits","convertToFasta","convertToHelm","convertToSeparator","resMList","src","srcUhSplitter","splitterAsHelmNucl","srcMList","tgtMList","prefix","leftWrapper","rightWrapper","postfix","resOMList","arg","defaultValue","_length","_version","_updateLevel","_selectedCount","_selectedCountVersion","_selectedIndexesVersion","_versionedName","_versionedNameVersion","SHRINK_THRESHOLD","buff","_createBuffer","_data","assureGoez","argName","assureInRange","copy","dst","copyFrom","other","lengthInInts","incrementVersion","notify","floor","versionedName","self","setLength","nIntsNeeded","newData","fromAnd","set1","set2","fromValues","fromSeq","flag","setBit","fromString","charAt","fromUint32Array","fromBytes","bytes","num1","num2","countBits","equals","getBit","clone","bitArray","setAll","invert","flags","setIndexes","setFast","everyIndex","anyIndex","setWhere","check","allowClear","getRange","to","arr","getRangeAsList","setRange","end","setTrue","setFalse","setRandom","random","and","andNot","notAnd","not","or","xor","insertAt","oldlength","removeAt","contains","removeByMask","mask","dstIdx","srcIdx","findNext","bit","trueCount","falseCount","_onBitCount","remainingBits","countWhere","andWithCountBits","second","allTrue","allFalse","anyTrue","anyFalse","unusedBits","numInts","_firstOnBit","findPrev","_lastOnBit","StringMetricsNames","VectorMetricsNames","BitArrayMetricsNames","IntArrayMetricsNames","DistanceMetricsSubjects","NumberMetricsNames","NumberArrayMetricsNames","funcList","package","prepare","getOutputParamValue","Int8Array","Tanimoto","Dice","Asymmetric","BraunBlanquet","Cosine","Kulczynski","McConnaughey","RogotGoldberg","Russel","Sokal","Hamming","Euclidean","LIB_STORAGE_NAME","LIB_SETTINGS_FOR_TESTS","explicit","exclude","userLibSettingsPromise","getUserLibSettings","resStr","userDataStorage","getValue","parse","debug","setUserLibSettings","postValue","setUserLibSettingsForTests","monomerLibHelper","userLibSettings","loadLibraries","tgt","testName","_testFindMonomers","testHelmValue","tgtMissedSet","monomerSymbolList","types","org","webeditor","monomerTypeList","monomerNames","Monomers","getMonomerSet","id","val","findMonomers","$","V2K_CONST","files","readCsv","helmCol","getCol","tv","addTableView","checkHandler","wait","interval","clearInterval","intervalId","setInterval","awaitCheck","root","cellRendererErrorJson","cellRendererError","err","_testMissedInLib","ChemicalTableParserBase","fileContent","_atomCount","_atomTypes","_bondCount","_bondTypes","xyzAtomCoordinates","_pairsOfBondedAtoms","atomCount","setAtomAndBondCounts","bondCount","parseAtomCoordinates","y","z","atomTypes","parseAtomTypes","pairsOfBondedAtoms","parseBondedAtomPairs","bondTypes","parseBondTypes","parseAtomAndBondCounts","getNextColumnIdx","isWhitespace","shiftIdxToSpecifiedColumn","lineStartIdx","columnNumber","numberOfJumps","getAtomBlockIdx","shiftIdxToAtomType","parseAtomType","getNextLineIdx","shiftIdxToXColumn","item","parseFloatValue","bondedAtomPairs","getBondBlockIdx","shiftIdxToBondedAtomsPair","pair","parseIntValue","shiftIdxToBondType","symbol","idxOfNumber","parseNumericValue","parseFloat","parserFunction","MolfileHandlerBase","molfile","begin","isQuote","getNextIdenticalChar","letter","sym","isQuery","isQueryOrFragment","charCode","isFragment","condition","MolfileV2KHandler","validate","HEADER","END","ATOM_TYPE_COL","getCountsLineIdx","NUM_OF_HEADER_LINES","FIRST_BONDED_ATOM_COL","BOND_TYPE_COL","NUM_OF_COUNTS_DIGITS","MolfileV3KHandler","numOfAtoms","MolfileHandler","getInstance","awaitGrid","grid","event","handler","trigger","reason","sub","subscribe","unsubscribe","testEvent","onAfterDrawContent","invalidate","view","_package","logger","resCol","resMolfileList","toList","mf","ui","TestsData","testPropertiesDict","expPropDict","sh","helmString2","host","style","width","height","document","documentElement","appendChild","editor","JSDraw2","Editor","viewonly","setHelm","formula","getFormula","molWeight","round","getMolWeight","coef","getExtinctionCoefficient","empty","getPropertiesDict","testContext","_g","package_","getCurrentCall","packageId","moduleTests","testFunctions","pop","cat","outputs","moduleAutoTests","moduleDemo","moduleDetectors","packFunctions","functions","list","reg","demo","isArray","eval","friendlyName","lastError","hasTag","initAutoTests","results","categories","redefineConsole","every","beforeStatus","closeAll","afterStatus","successful","failed","failed_","passed","description","runTests","fromObjects"],"sourceRoot":""}
1
+ {"version":3,"file":"package-test.js","mappings":"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,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAEjD,EAAS8D,YAAcG,UAAUjE,KAAK,EACjC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC9C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAEjD,EAASgE,WAAaC,UAAUjE,KAAK,EAChC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC9C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,ID3mBjD,SAAWhF,GACPA,EAAgC,YAAI,cACpCA,EAAgC,YAAI,eACpCA,EAA8B,UAAI,YAClCA,EAA2B,OAAI,SAClC,CALD,CAKGA,IAAuBA,EAAqB,CAAC,IAEhD,SAAWC,GACPA,EAA8B,UAAI,WACrC,CAFD,CAEGA,IAAuBA,EAAqB,CAAC,IAEhD,SAAWC,GACPA,EAA+B,SAAI,WACnCA,EAA2B,KAAI,OAC/BA,EAAiC,WAAI,aACrCA,EAAoC,cAAI,iBACxCA,EAA6B,OAAI,SACjCA,EAAiC,WAAI,aACrCA,EAAmC,aAAI,gBACvCA,EAAoC,cAAI,iBACxCA,EAA6B,OAAI,SACjCA,EAA4B,MAAI,QAChCA,EAA8B,QAAI,UAClCA,EAAgC,UAAI,WACvC,CAbD,CAaGA,IAAyBA,EAAuB,CAAC,IAEpD,SAAWC,GACPA,EAAuC,iBAAI,kBAC9C,CAFD,CAEGA,IAAyBA,EAAuB,CAAC,IAEpD,SAAWC,GACPA,EAAgC,OAAI,SACpCA,EAAgC,OAAI,SACpCA,EAAkC,SAAI,WACtCA,EAAuC,cAAI,gBAC3CA,EAAgC,OAAI,SACpCA,EAAkC,SAAI,WACtCA,EAAqC,YAAI,aAC5C,CARD,CAQGA,IAA4BA,EAA0B,CAAC,IAE1D,SAAWC,GACPA,EAA+B,WAAI,YACtC,CAFD,CAEGA,IAAuBA,EAAqB,CAAC,IAEhD,SAAWC,GACPA,EAAqC,YAAI,cAC5C,CAFD,CAEGA,IAA4BA,EAA0B,CAAC,I,aE+EnD4I,eAAeC,IAClB,MAAMC,EAAW,OAAQC,KAAK,CAAEC,QAAS,MAAOpG,KAAM,wBACtD,GAAwB,IAApBkG,EAAShI,OACT,MAAM,IAAIM,MAAM,yDAEpB,aADmB0H,EAAS,GAAGG,UAAUC,QAAQC,qBAErD,CChIKvJ,EAAqBwJ,SACrBxJ,EAAqByJ,KACrBzJ,EAAqB0J,WACrB1J,EAAqB2J,cACrB3J,EAAqB4J,OACrB5J,EAAqB6J,WACrB7J,EAAqB8J,aACrB9J,EAAqB+J,cACrB/J,EAAqBgK,OACrBhK,EAAqBiK,MACrBjK,EAAqBkK,QACrBlK,EAAqBmK,UAGrBnK,EAAqBwJ,SACrBxJ,EAAqByJ,KACrBzJ,EAAqB0J,WACrB1J,EAAqB2J,cACrB3J,EAAqB4J,OACrB5J,EAAqB6J,WACrB7J,EAAqB8J,aACrB9J,EAAqB+J,cACrB/J,EAAqBgK,OACrBhK,EAAqBiK,MACrBjK,EAAqBkK,QACrBlK,EAAqBmK,UAGtBnK,EAAqBwJ,SACrBxJ,EAAqByJ,KACrBzJ,EAAqB4J,OAGrB5J,EAAqBwJ,SACrBxJ,EAAqB0J,WACrB1J,EAAqB4J,OACrB5J,EAAqBiK,MAGrB,IAAyBG,QACzB,IAAyBC,YACzB,IAAyBC,0BACzB,IAAyBC,iB,wDC7CtB,MAyCMC,EAAmB,IACnBC,EAAuB,IAAIC,OAAO,kBAAqDF,KAAqB,I,8ECzC9GG,E,UACX,SAAWA,GACPA,EAAgB,MAAI,QACpBA,EAAoB,UAAI,YACxBA,EAAe,KAAI,MACtB,CAJD,CAIGA,IAAaA,EAAW,CAAC,IACrB,MAAMC,EAAoB,KACpBC,EAAY,6CAGZC,EAAY,IAAI,MACzB,WAAAzK,GACIG,KAAKuK,MAAQ,CACTC,QAAS,IAAIC,IAAI,CACb,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC7C,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAEjDC,IAAK,IAAID,IAAI,CAAC,IAAK,IAAK,IAAK,MAC7BE,IAAK,IAAIF,IAAI,CAAC,IAAK,IAAK,IAAK,MAErC,GAESG,EAAqB,CAC9B,IAAI,KAAc,KAAwBN,EAAUC,MAAMC,QAAS,IACnE,IAAI,KAAc,MAA0BF,EAAUC,MAAMG,IAAK,KACjE,IAAI,KAAc,MAA0BJ,EAAUC,MAAMI,IAAK,K,oMC1B9D,MAAME,EAAa,GAEnB,MAAMC,EACT,WAAAjL,CAAY2C,EAAMuI,EAAUC,GACxBhL,KAAKwC,KAAOA,EACZxC,KAAK+K,SAAWA,EAChB/K,KAAKgL,OAASA,CAClB,EAGG,MAAMC,UAAyBH,EAClC,WAAAjL,CAAYqL,EAAWC,EAAMC,GACzBC,MAAMH,EAAU1I,KAAM0I,EAAUH,SAAUG,EAAUF,QACpDhL,KAAKmL,KAAOA,EACZnL,KAAKoL,WAAaA,CACtB,E,+JCTG,MAAM,UAAeE,cCyErB,SAASC,EAAaC,GACzB,IAAIC,EAAS,EACb,IAAK,IAAI5K,EAAI,EAAGA,EAAI2K,EAAE9K,OAAQG,IAC1B4K,GAAUD,EAAE3K,GAAK2K,EAAE3K,GACvB,OAAOwB,KAAKqJ,KAAKD,EACrB,CCrFO,MAAM,EACT,kBAAOE,CAAYC,EAAIC,GAAa,EAAOC,EAAc,GACrD,MAAMC,EAAU,CAAC,EAQjB,OAPAH,EAAGI,SAASC,IACR,MAAMC,EAAUD,EAAG,GACbE,EAASF,EAAG,GAClBC,EAAQF,SAAQ,CAACI,EAAKC,KAClBN,EAAQK,GAAOpM,KAAKsM,cAAcH,GAAQN,EAAa,EAAIQ,EAAI,GACjE,IAEC,IAAIP,EAAYC,EAC3B,CACA,WAAAlM,CAAYkM,GACR/L,KAAKuM,SAAWR,CACpB,CACA,GAAAS,CAAIC,GACA,OAAOzM,KAAKuM,SAASE,EACzB,EAEJ,EAAeC,eAAiB,mBAEhC,EAAeJ,cAAgB,CAC3B,OAAU,CAAC,mBAAoB,mBAAoB,kBAAmB,qBACtE,UAAa,CAAC,iBAAkB,iBAAkB,iBAAkB,iBAAkB,iBAClF,iBAAkB,mBAAoB,qBAAsB,sBAChE,SAAY,CAAC,kBAAmB,kBAAmB,qBAAsB,mBAAoB,qBACzF,qBACJ,QAAW,CAAC,mBAAoB,mBAAoB,oBACpD,IAAO,CAAC,iBAAkB,oBAC1B,QAAW,CAAC,kBAAmB,mBAAoB,mBACnD,UAAa,CAAC,kBAAmB,qBACjC,WAAc,CAAC,kBAAmB,mBAAoB,qBAAsB,mBAC5E,WAAc,CAAC,mBAAoB,mBAAoB,oBACvD,WAAc,CAAC,iBAAkB,iBAAkB,iBAAkB,kBACrE,MAAS,CAAC,iBAAkB,kBAC5B,YAAe,CAAC,mBAAoB,qBAAsB,sBAC1D,SAAY,CAAC,iBAAkB,mBAAoB,mBAAoB,kBACvE,KAAQ,CAAC,oBACT,MAAS,CAAC,iBAAkB,oBAC5B,KAAQ,CAAC,mBAAoB,mBAAoB,mBAAoB,sBACrE,OAAU,CAAC,mBACX,MAAS,CAAC,qBCxCP,MAAM,UAA2B,EACpC,eAAWK,GAUP,YATkB,IAAd3M,KAAK4M,OACL5M,KAAK4M,KAAO5M,KAAK2L,YAAY,CACzB,CAAC,CAAC,IAAK,IAAK,IAAK,KAAM,UACvB,CAAC,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,aAChD,CAAC,CAAC,IAAK,IAAK,KAAM,WAClB,CAAC,CAAC,IAAK,KAAM,OACb,CAAC,CAAC,IAAK,KAAM,cACd,EAAO,IAEP3L,KAAK4M,IAChB,CACA,qBAAWC,GAWP,YAVwB,IAApB7M,KAAK8M,aACL9M,KAAK8M,WAAa9M,KAAK2L,YAAY,CAC/B,CAAC,CAAC,IAAK,KAAM,UACb,CAAC,CAAC,IAAK,KAAM,OACb,CAAC,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,aAC3C,CAAC,CAAC,IAAK,IAAK,KAAM,cAClB,CAAC,CAAC,IAAK,KAAM,aACb,CAAC,CAAC,IAAK,IAAK,IAAK,KAAM,YACxB,EAAO,IAEP3L,KAAK8M,UAChB,CACA,iBAAWC,GA2BP,YA1BoB,IAAhB/M,KAAKgN,SACLhN,KAAKgN,OAAS,IAAI,EAAmB,CAEjC,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,EAAK,UACL,OAAU,aAGXhN,KAAKgN,MAChB,CACA,GAAAR,CAAIC,GACA,MAAMQ,EAAOR,KAAK,EAAmBS,WAAa,EAAmBA,WAAWT,GAAKA,EAErF,OADYpB,MAAMmB,IAAIS,EAE1B,EAGJ,EAAmBC,WAAa,CAC5B,MAAS,IACT,IAAO,IACP,IAAO,IACP,IAAO,KAEJ,MAAMC,EACT,iBAAOC,CAAWC,EAAS,QACvB,OAAQA,GACJ,IAAK,OACD,OAAO,EAAmBR,WAC9B,IAAK,OACD,OAAO,EAAmBF,KAC9B,QACI,MAAM,IAAI3L,MAAM,yBAAyBqM,sBAErD,CAOA,oBAAOC,CAAcC,GACjB,IAAIC,EAAU,EACVC,EAAQ,GACRC,EAAQ,GACZ,IAAK,MAAMC,KAAQJ,EACH,KAARI,EACAH,IACa,KAARG,EACLH,IACKA,EACLC,GAASE,EAETD,GAASC,EAEjB,OAAQC,MAAMC,SAASJ,IAAwB,CAACC,EAAOD,GAAtB,CAACC,EAAO,GAC7C,CACA,sBAAOI,CAAgBC,EAAU,GAAIV,EAAS,QAE1C,MAAMW,EAAsBhO,KAAKoN,WAAWC,GAC5C,IAAKY,EAAcC,GAAgBlO,KAAKsN,cAAcS,GAGtD,GAFAE,EAAgBA,EAAavN,OAAS,EAAI,GAAGuN,EAAaE,MAAM,EAAG,QAAUF,EAC7EC,EAAgBA,EAAaxN,OAAS,EAAI,GAAGwN,EAAaC,MAAM,EAAG,QAAUD,EACvD,GAAlBH,EAAQrN,QAA6B,KAAdqN,EAAQ,GAAW,CAC1C,MAAMK,EAAQL,EAAQ,IAAIM,cAC1B,OAAOD,KAASJ,EACZ,CAACA,EAAoBxB,IAAI4B,GAAQA,EAAOF,EAAc,GACtD,CAAClO,KAAK0M,eAAgBuB,EAAcC,EAAc,EAC1D,CACA,GAAkB,KAAdH,EAAQ,IAAaA,EAAQ,KAAMC,IACb,GAAlBD,EAAQrN,QAA6B,KAAdqN,EAAQ,IAAW,CAC1C,MAAMK,EAAQL,EAAQ,IAAIM,cAC1B,OAAOD,KAASJ,EACZ,CAACA,EAAoBxB,IAAI4B,GAAQA,EAAOF,EAAc,GACtD,CAAClO,KAAK0M,eAAgBuB,EAAcC,EAAc,EAC1D,CAEJ,GAAIH,EAAQO,UAAU,EAAG,KAAMtO,KAAKuO,cACV,GAAlBR,EAAQrN,QAA6B,KAAdqN,EAAQ,IAAW,CAC1C,MAAMK,EAAQpO,KAAKuO,YAAYR,EAAQO,UAAU,EAAG,IACpD,OAAOF,KAASJ,EACZ,CAACA,EAAoBxB,IAAI4B,GAAQA,EAAOF,EAAc,GACtD,CAAClO,KAAK0M,eAAgBuB,EAAcC,EAAc,EAC1D,CAEJ,GAAIH,EAAQ,IAAIS,eAAiBT,EAAQ,IACjCA,EAAQO,UAAU,EAAG,KAAMtO,KAAKuO,cACV,GAAlBR,EAAQrN,QAA6B,KAAdqN,EAAQ,IAAW,CAC1C,MAAMK,EAAQpO,KAAKuO,YAAYR,EAAQO,UAAU,EAAG,IACpD,OAAOF,KAASJ,EACZ,CAACA,EAAoBxB,IAAI4B,GAAQA,EAAOF,EAAc,GACtD,CAAClO,KAAK0M,eAAgBuB,EAAcC,EAAc,EAC1D,CAGR,MAAO,CAAClO,KAAK0M,eAAgBuB,EAAcC,EAAc,EAC7D,EAEJf,EAAWsB,QAAU,aACrBtB,EAAWuB,yBAA2B,8BACtCvB,EAAWT,eAAiB,mBAC5BS,EAAWwB,MAAQ,CACf,EAAK,UACL,EAAK,UACL,EAAK,WACL,EAAK,SACL,EAAK,gBACL,EAAK,YACL,EAAK,gBACL,EAAK,aACL,EAAK,gBACL,EAAK,UACL,EAAK,SACL,EAAK,WACL,EAAK,YACL,EAAK,WACL,EAAK,SACL,EAAK,UACL,EAAK,aACL,EAAK,aACL,EAAK,aACL,EAAK,aAETxB,EAAWyB,SAAW,CAClB,EAAK,WACL,EAAK,uBACL,EAAK,4BACL,EAAK,eACL,EAAK,0BACL,EAAK,0BACL,EAAK,yBACL,EAAK,yBACL,EAAK,yBACL,EAAK,kBACL,EAAK,kBACL,EAAK,2BACL,EAAK,yBACL,EAAK,oBACL,EAAK,kBACL,EAAK,kBACL,EAAK,qCACL,EAAK,2BACL,EAAK,iBACL,EAAK,mBAETzB,EAAW0B,kBAAoB,CAC3B,EAAK,MACL,EAAK,kBACL,EAAK,uBACL,EAAK,WACL,EAAK,qBACL,EAAK,sBACL,EAAK,oBACL,EAAK,oBACL,EAAK,sBACL,EAAK,aACL,EAAK,eACL,EAAK,sBACL,EAAK,oBACL,EAAK,iBACL,EAAK,aACL,EAAK,cACL,EAAK,gCACL,EAAK,sBACL,EAAK,YACL,EAAK,cAIT1B,EAAWoB,YAAc,CACrB,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,KC1NJ,MAAMO,GAEbA,EAAYL,QAAU,cACtBK,EAAYJ,yBAA2B,+BACvCI,EAAYH,MAAQ,CAChB,EAAK,UACL,EAAK,WACL,EAAK,UACL,EAAK,UACL,EAAK,UCHF,MAAMI,EACT,eAAOC,CAASvL,GACZ,IAAIwL,EAAO,EACX,GAAiB,IAAbxL,EAAE/C,OACF,OAAOuO,EACX,IAAK,IAAIpO,EAAI,EAAGA,EAAI4C,EAAE/C,OAAQG,IAE1BoO,GAASA,GAAQ,GAAKA,EADVxL,EAAEyL,WAAWrO,GAEzBoO,GAAQ,EAEZ,OAAOA,CACX,EAGG,MAAME,GAON,MAAMC,UAA4BD,EACrC,mBAAOE,GAEH,MADY,GAAGC,UAAUC,OAAOnM,OAAO,EAAekJ,eAE1D,CACA,GAAAE,CAAIC,GACA,MACM+C,EADOT,EAAYC,SAASvC,GAChB2C,EAAoBrD,QAAQrL,OAC9C,OA/CR,SAAsB+O,GAClB,GAAa,MAATA,EACA,MAAO,mBACX,MAAMC,EAAU,QAASC,SAASF,GAC5BG,EAAI,QAASA,EAAEF,GACfG,EAAI,QAASA,EAAEH,GACfI,EAAI,QAASA,EAAEJ,GAEfK,EAAc1N,KAAKqJ,KAAKrJ,KAAK2N,IAAI,EAAIH,EAAG,GAAKxN,KAAK2N,IAAI,EAAIJ,EAAG,GAAKvN,KAAK2N,IAAI,EAAIF,EAAG,IAKxF,OAAIC,EAAc,IACP,OAJGF,EAAIE,EAIQ,OAHZH,EAAIG,EAGuB,OAF3BD,EAAIC,EAEsC,OAEjD,QAASE,MAAMP,EAC1B,CA8BeQ,CAAad,EAAoBrD,QAAQyD,GACpD,EAEJJ,EAAoBrD,QAAUqD,EAAoBC,eC5C3C,MAAMc,EACT,UAAIzP,GAAW,OAAOV,KAAKoQ,MAAM1P,MAAQ,CACzC,cAAI2P,GAAe,OAAOrQ,KAAKoQ,KAAO,CACtC,aAAIE,GAAc,OAAOtQ,KAAKoQ,KAAO,CACrC,KAAAG,CAAMC,GACF,OAAOxQ,KAAKyQ,YAAYD,KAAYxQ,KAAK0Q,kBAC7C,CACA,YAAAC,CAAaH,GACT,GAAIxQ,KAAKU,QAAU8P,EACf,MAAM,IAAIxP,MAAM,uBACpB,OAAOhB,KAAKoQ,MAAMI,EACtB,CACA,WAAAC,CAAYD,GACR,GAAIxQ,KAAKU,QAAU8P,EACf,MAAM,IAAIxP,MAAM,uBACpB,OAAOhB,KAAKoQ,MAAMI,EACtB,CACA,WAAA3Q,CAAYuQ,EAAOM,GACf1Q,KAAKoQ,MAAQA,EACbpQ,KAAK0Q,mBAAqBA,CAC9B,EAEG,MAAME,EACT,UAAIlQ,GAAW,OAAOV,KAAK6Q,KAAKnQ,MAAQ,CACxC,cAAI2P,GAAe,OAAOrQ,KAAK6Q,IAAM,CACrC,aAAIP,GAAc,OAAOtQ,KAAK6Q,IAAM,CACpC,KAAAN,CAAMC,GACF,OAAOxQ,KAAKyQ,YAAYD,KAAY,KAAa,KAASM,MAC9D,CACA,YAAAH,CAAaH,GACT,GAAIxQ,KAAKU,QAAU8P,EACf,MAAM,IAAIxP,MAAM,uBACpB,OAAIhB,KAAKuQ,MAAMC,GACJ,KACJxQ,KAAK6Q,KAAKL,EACrB,CACA,WAAAC,CAAYD,GACR,GAAIxQ,KAAKU,QAAU8P,EACf,MAAM,IAAIxP,MAAM,uBACpB,OAAOhB,KAAK6Q,KAAKL,EACrB,CACA,WAAA3Q,CAAYgR,GACR7Q,KAAK6Q,KAAOA,CAChB,EAsCG,MAAME,EAAmBC,IAC5B,MAAMC,EAAS,IAAGD,EAAIhN,WAAWkN,SAAS,OACrCC,KAAKC,GACCA,EAAG,IAAMA,EAAG,KACpBC,UACH,OAAO,IAAIlB,EAAsBc,EAAQ,KAAa,KAASH,OAAO,EAO7DQ,EAAyBN,GACzBA,EAAM,IAAIJ,EAAuBI,GAAO,IAAIb,EAAsB,GAAI,KAAa,KAASW,QAOlG,SAASS,EAAyBC,EAAWC,OAAQC,GACxD,OAAQV,IACJ,GAAKA,EAEA,CACD,MAAMC,EAASD,EAAIW,WAAW,MAAS,IAAIA,WAAW,MAAS,IAAIC,MAAMJ,EAAWC,GACpF,OAAO,IAAItB,EAAsBc,EAAQ,KAAa,KAASY,WACnE,CAJI,OAAO,IAAI1B,EAAsB,GAAI,KAAa,KAAS0B,WAI/D,CAER,CACA,MAAMC,EAAS,kCACTC,EAAY,iBAOLC,EAAkBhB,IAC3Bc,EAAOG,UAAY,EACnB,MAAMC,EAAKJ,EAAOK,KAAKnB,EAAIhN,YACrBoO,EAAQF,EAAKA,EAAG,GAAK,KASrBjB,EAASmB,EAAQA,EAAMR,MAAM,KAAO,GAC1C,OAAO,IAAIzB,EAAsBc,EAAOE,KATjBkB,IACnBN,EAAUE,UAAY,EACtB,MAAMK,EAAOP,EAAUI,KAAKE,GAC5B,OAAIC,GAAQA,EAAK5R,QAAU,EAChB4R,EAAK,GAELD,CAAE,IAG2C,KAAa,KAASE,MAAM,EAmBtFC,EAAoB,aAEnB,SAASC,EAAerE,EAAOsE,GAClC,GAAItE,EAAM1N,QAAUgS,EAChB,OAAOtE,EAEX,MAAMuE,EAAkBvE,EAAMwE,MAAMJ,GAC9BK,EAAczE,EAAM1N,OAASgS,IAAuBC,GAAiBjS,QAAU,GAAK,EACpFoS,EAAaH,IAAkB,IAAM,IAC3C,OAAQE,EAA2BC,EAAWxE,UAAU,EAAGoE,EAAqB,GAAK,IAA/DI,CAC1B,CAmCO,SAASC,EAAe5H,EAAM6H,EAAYC,EAAY,KACzD,MAAMC,EAAiBF,EAAW7B,KAAK5D,IACnC,MAAM4F,EAjBP,SAA+BhI,EAAMJ,EAAUkI,EAAY,KAC9D,MAAMG,EAAO,IAAI3I,IAAI,IAAI,IAAIA,IAAI8E,OAAO6D,KAAKjI,OAAWJ,IACxDqI,EAAKC,OAAOJ,GACZ,MAAMK,EAAQ,GACRC,EAAY,GAClB,IAAK,MAAM9G,KAAK2G,EACZE,EAAM9N,KAAKiH,KAAKtB,EAAOA,EAAKsB,GAAK,GACjC8G,EAAU/N,KAAKuF,EAASyI,IAAI/G,GAAK,EAAI,GAGzC,MAAMgH,EAAQ,IAAI,EAAOH,GACnBI,EAAY,IAAI,EAAOH,GAC7B,OLrHG,SAA0BI,EAAIC,GACjC,GAAID,EAAGjT,QAAUkT,EAAGlT,OAChB,MAAM,IAAIM,MAAM,gDACpB,IAAI6S,EAAO,EACX,IAAK,IAAIhT,EAAI,EAAGA,EAAI8S,EAAGjT,OAAQG,IAC3BgT,GAAQF,EAAG9S,GAAK+S,EAAG/S,GACvB,OAAOgT,CACX,CK8GWC,CAAiBL,EAAOC,IAAcnI,EAAakI,GAASlI,EAAamI,GACpF,CAIoBK,CAAsB5I,EAAMoC,EAAExC,SAAUkI,GACpD,OAAO,IAAI,KAAiB1F,EAAGpC,EAAMgI,EAAI,IAE7C,IAAIa,EACJ,MAAMC,EAAS5R,KAAKb,OAAO0R,EAAe/B,KAAK+C,GAAOA,EAAG9I,WAAa8I,EAAGlJ,OAASkJ,EAAG9I,YAAc,KAOnG,OAJI4I,EAFAC,EAAS,EACGf,EAAevK,MAAMuL,GAAOA,EAAG9I,aAAe6I,IACvCzR,KAGJ,KACZwR,CACX,C,6ICpNO,MAAMG,EAAW,IAAI,MACxB,WAAAtU,GAEIG,KAAKoU,WAAa,cAClBpU,KAAKqU,iBAAmB,+BAC5B,GAESC,EAAe,CACxB,CAAC,KAASxD,OAAQ,IAClB,CAAC,KAASe,WAAY,GACtB,CAAC,KAASU,MAAO,KAKd,MAAMgC,EACT,WAAA1U,CAAY2U,GASR,GARAxU,KAAKyU,UAAY,KACjBzU,KAAK0U,QAAS,EACd1U,KAAK2U,UAAY,KACjB3U,KAAK4U,cAAgB,KACrB5U,KAAK6U,OAAS,KACd7U,KAAK8U,WAAa,KAClB9U,KAAK+U,SAAW,KAChB/U,KAAKgV,aAAUtD,EACX8C,EAAIS,OAAS,OAAQC,OACrB,MAAM,IAAIlU,MAAM,2BAA2BwT,EAAIS,mBAAmB,OAAQC,YAC9ElV,KAAKmV,QAAUX,EACf,MAAMY,EAAQpV,KAAKmV,QAAQE,OAAO,OAAQC,OAC1C,GAAIF,QAGA,MAAM,IAAIpU,MAAM,qCAKpB,GAPIhB,KAAKuV,OAASH,EAGlBpV,KAAKwV,UAAYxV,KAAKyV,cACtBzV,KAAK0V,oBAAuB1V,KAAK2V,UAAarB,EAAa,KAASxD,OAC/D9Q,KAAK4V,SAAYtB,EAAa,KAAS/B,MACpC+B,EAAa,KAASzC,YACzB7R,KAAK6V,OAAOC,KAAKtC,IAAI,aAAkCxT,KAAK6V,OAAOC,KAAKtC,IAAI,cAC3ExT,KAAK6V,OAAOC,KAAKtC,IAAI,0BAA2DxT,KAAK4V,UAA8B,OAAlB5V,KAAK+K,SAGxG,GAAI/K,KAAK2V,UACLpB,EAAWwB,sBAAsB/V,WAChC,GAAIA,KAAKgW,cAAe,CACzB,MAAMxE,EAAYgD,EAAIa,OAAO,aAC7Bd,EAAW0B,0BAA0BjW,KAAMwR,EAC/C,KACK,KAAIxR,KAAK4V,SAGV,MAAM,IAAI5U,MAAM,qBAAqBhB,KAAK6V,OAAOR,OAAO,OAAQC,YAFhEf,EAAW2B,qBAAqBlW,KAE2C,CAUnF,IAAKA,KAAK6V,OAAOC,KAAKtC,IAAI,wBACtB,GAAIxT,KAAK4V,SACL5V,KAAK6V,OAAOM,OAAO,uBAAuD,aACzE,GAAI,CAAC,MAAMC,SAASpW,KAAK+K,UAC1B,MAAM,IAAI/J,MAAM,eAAehB,KAAK6V,OAAOrT,sBAAsBxC,KAAK+K,sDAI9E/K,KAAKqU,iBAAmBrU,KAAK6V,OAAO5S,KAAKkR,EAASE,mBAAqB,KACvErU,KAAK4U,cAAgB5U,KAAK6V,OAAO3T,OACrC,CACA,4BAAO6T,CAAsBM,GACzB,GAAIA,EAAGR,OAAOS,UAAY,UAAWC,eAAiBF,EAAGR,OAAOR,OAAO,OAAQC,SAAW,KAASxE,MAC/F,MAAM,IAAI9P,MAAM,2BAA2B,KAAS8P,mBAAmB,UAAWyF,mBACtFF,EAAGR,OAAOM,OAAO,OAAQb,MAAO,KAASxE,OACzCyD,EAAWiC,QAAQH,EACvB,CACA,gCAAOJ,CAA0BI,EAAI7E,GACjC,GAAI6E,EAAGR,OAAOS,UAAY,UAAWC,eAAiBF,EAAGR,OAAOR,OAAO,OAAQC,SAAW,KAASzD,UAC/F,MAAM,IAAI7Q,MAAM,2BAA2B,KAAS6Q,uBAAuB,UAAW0E,mBAC1F,IAAK/E,EACD,MAAM,IAAIxQ,MAAM,2BAA2B,KAAS6Q,2CACxDwE,EAAGR,OAAOM,OAAO,OAAQb,MAAO,KAASzD,WACzCwE,EAAGR,OAAOM,OAAO,YAAkC3E,GACnD+C,EAAWiC,QAAQH,EACvB,CACA,2BAAOH,CAAqBG,GACxB,GAAIA,EAAGR,OAAOS,UAAY,UAAWC,cACjC,MAAM,IAAIvV,MAAM,2BAA2B,KAASuR,kBAAkB,UAAWgE,kBACrFF,EAAGR,OAAOM,OAAO,OAAQb,MAAO,KAAS/C,MACzCgC,EAAWiC,QAAQH,EACvB,CAEA,cAAOG,CAAQH,GACX,MAAMjB,EAAQiB,EAAGR,OAAOR,OAAO,OAAQC,OACjCmB,EAAQJ,EAAGI,MAEjB,GAD4BlH,OAAO6D,KAAKqD,EAAMtL,MAAMuL,MAAMjK,GAAMA,EAAE/L,OAAS,IACvE,CAAC,KAASoQ,MAAO,KAASe,WAAWuE,SAAShB,GAAQ,CAEtD,IAAKiB,EAAGR,OAAOR,OAAO,aAAsE,IAAnC9F,OAAO6D,KAAKqD,EAAMtL,MAAMzK,OAC7E,MAAM,IAAIM,MAAM,wCACpB,IAAI2V,EAAUN,EAAGR,OAAOR,OAAO,WACf,OAAZsB,IACAA,EAAUF,EAAMG,WAAa,UAAoC,MACjEP,EAAGR,OAAOM,OAAO,UAA8BQ,IAEnD,IAAI5L,EAAWsL,EAAGR,OAAOR,OAAO,YAKhC,GAJiB,OAAbtK,IACAA,GAAW,QAAe0L,EAAMtL,KAAM,MACtCkL,EAAGR,OAAOM,OAAO,WAAgCpL,IAEpC,OAAbA,EAAqC,CACrC,MAAM8L,EAAetH,OAAO6D,KAAKqD,EAAMtL,MAAMzK,OACvCoW,EAAsBvH,OAAO6D,KAAKqD,EAAMtL,MAAMuL,MAAMjK,GAAMA,EAAE/L,OAAS,IAC3E2V,EAAGR,OAAOM,OAAO,gBAAyCU,EAAa7S,YACvEqS,EAAGR,OAAOM,OAAO,uBAAuDW,EAAsB,OAAS,QAC3G,CACJ,CACJ,CACA,UAAIjB,GAAW,OAAO7V,KAAKmV,OAAS,CACpC,UAAIzU,GAAW,OAAOV,KAAKmV,QAAQzU,MAAQ,CAC3C,SAAI0U,GAAU,OAAOpV,KAAKuV,MAAQ,CAClC,YAAIwB,GAAa,OAAO/W,KAAKwV,SAAW,CACxC,sBAAIwB,GAAuB,OAAOhX,KAAK0V,mBAAqB,CAC5D,aAAIlE,GACA,MAAMA,EAAYxR,KAAK6V,OAAOR,OAAO,mBAAqC3D,EAC1E,GAAI1R,KAAK+W,WAAa,KAASlF,gBAA2BH,IAAdF,EACxC,MAAM,IAAIxQ,MAAM,uCAAuChB,KAAK6V,OAAOrT,sBAAsBxC,KAAK+W,cAClG,OAAOvF,CACX,CACA,WAAImF,GACA,MAAMA,EAAU3W,KAAK6V,OAAOR,OAAO,WAEnC,IAAKsB,IAAY3W,KAAK2V,WAAa3V,KAAKgW,eACpC,MAAM,IAAIhV,MAAM,uBACpB,OAAO2V,CACX,CAEA,YAAI5L,GACA,MAAMA,EAAW/K,KAAK6V,OAAOR,OAAO,YAEpC,IAAKtK,IAAa/K,KAAK2V,WAAa3V,KAAKgW,eACrC,MAAM,IAAIhV,MAAM,wBACpB,OAAO+J,CACX,CACA,kBAAIkM,GACA,OAAOjX,KAAK6V,OAAOR,OAAO,oBAC9B,CACA,eAAA6B,GACI,GAAIlX,KAAK+W,UAAY,KAASxE,MAAyB,MAAjBvS,KAAK+K,SAAoC,CAC3E,MAAMoM,EAAkBnX,KAAK6V,OAAOR,OAAO,iBAC3C,IAAIwB,EACJ,GAAIM,EACAN,EAAehJ,SAASsJ,OACvB,CAED,MAAMV,EAAQzW,KAAKyW,MACnBI,EAAetH,OAAO6D,KAAKqD,EAAMtL,MAAMzK,MAC3C,CACA,OAAOmW,CACX,CAEI,OAAQ7W,KAAK+K,UACT,IAAK,KACD,OAAO,GACX,IAAK,MACL,IAAK,MACD,OAAO,EACX,IAAK,KAED,OADAqM,QAAQC,KAAK,6BACN,EACX,QACI,MAAM,IAAIrW,MAAM,wBAAwBhB,KAAK+K,cAG7D,CACA,sBAAAuM,GACI,OAAItX,KAAK+W,WAAa,KAASxE,MAEJ,OAAlBvS,KAAK+K,UAG2E,SAA9E/K,KAAK6V,OAAOR,OAAO,uBAClC,CAiBA,WAAAkC,CAAYC,GACR,GAAKxX,KAAK0U,OAIL,CACG1U,KAAK6V,OAAO3T,UAAYlC,KAAK4U,eAAoC,OAAnB5U,KAAK2U,YACnD3U,KAAK4U,cAAgB5U,KAAK6V,OAAO3T,QACjClC,KAAK2U,UAAY,IAAI8C,MAAMzX,KAAK6V,OAAOnV,SAE3C,IAAIgX,EAAQ1X,KAAK2U,UAAU6C,GAAUxX,KAAK2U,UAAU6C,GAAQG,aAAUjG,EACtE,IAAKgG,EAAO,CACR,MAAM1G,EAAMhR,KAAK6V,OAAOrJ,IAAIgL,GAC5BE,EAAQ1X,KAAK4X,SAAS5G,GACtBhR,KAAK2U,UAAU6C,GAAU,IAAIK,QAAQH,EACzC,CACA,OAAOA,CACX,CAhBkB,CACd,MAAM1G,EAAMhR,KAAK6V,OAAOrJ,IAAIgL,GAC5B,OAAOxX,KAAK4X,SAAS5G,EACzB,CAcJ,CACA,SAAIyF,GACA,GAAoB,OAAhBzW,KAAK6U,OAAiB,CACtB,MAAM1J,EAAO,CAAC,EACd,IAAIyL,GAAa,EACbkB,EAAc,KAClB,MAAMC,EAAS/X,KAAK6V,OAAOnV,OAC3B,IAAK,IAAI8W,EAAS,EAAGA,EAASO,IAAUP,EAAQ,CAC5C,MAAMQ,EAAOhY,KAAKuX,YAAYC,GACX,MAAfM,EACAA,EAAcE,EAAKtX,OACdsX,EAAKtX,SAAWoX,IACrBlB,GAAa,GACjB,IAAK,MAAMqB,KAAMD,EAAK3H,WACZ4H,KAAM9M,IACRA,EAAK8M,GAAM,GACf9M,EAAK8M,IAAO,CAEpB,CACAjY,KAAK6U,OAAS,CAAE1J,KAAMA,EAAMyL,WAAYA,EAC5C,CACA,OAAO5W,KAAK6U,MAChB,CACA,aAAIqD,GAKA,OAJwB,OAApBlY,KAAK8U,aACL9U,KAAK8U,WAAoC,IAAvB9U,KAAK6V,OAAOnV,OAAe,EACzC2B,KAAKb,OAAO,UAAS,GAAG2W,KAAKnY,KAAK6V,OAAOnV,QAAQyQ,KAAKqG,GAAWxX,KAAKuX,YAAYC,GAAQ9W,WAE3FV,KAAK8U,UAChB,CACA,WAAIsD,GACA,GAAsB,OAAlBpY,KAAK+U,SAAmB,CACxB,MAAMsD,EAAarY,KAAK6V,OAAOR,OAAO,kBACtCrV,KAAK+U,SAAWsD,EAAaA,EAAWzG,MAAM,MAAmBT,KAAKhJ,GAAMA,EAAEmQ,SAC1E,UAAS,GAAGH,KAAKnY,KAAKkY,WAAW/G,KAAKzK,GAAQA,EAAI1C,aAAYqN,SACtE,CACA,OAAOrR,KAAK+U,QAChB,CACA,OAAAY,GAAY,OAAO3V,KAAK+W,WAAa,KAASjG,KAAO,CACrD,WAAAkF,GAAgB,OAAOhW,KAAK+W,WAAa,KAASlF,SAAW,CAC7D,MAAA+D,GAAW,OAAO5V,KAAK+W,WAAa,KAASxE,IAAM,CACnD,KAAAgG,GAAU,MAAyB,QAAlBvY,KAAK+K,QAAuC,CAC7D,KAAAyN,GAAU,MAAyB,QAAlBxY,KAAK+K,QAAuC,CAC7D,SAAA0N,GAAc,MAAyB,OAAlBzY,KAAK+K,QAAqC,CAC/D,KAAA2N,GAAU,QAAO1Y,KAAK2W,SAAU3W,KAAK2W,QAAQtI,cAAc+H,SAAS,MAAgB,CACpF,gBAAAuC,GAAqB,MAA+B,SAAxB3Y,KAAKiX,cAA2B,CAK5D,KAAA1G,CAAMqI,GACF,OAAQA,GAAMA,IAAO5Y,KAAK0V,mBAC9B,CAKA,WAAAD,GACI,GAAIzV,KAAKoV,MAAM5G,cAAcqK,WAAW,KAAS/H,OAC7C,OAAO,KAASA,MACf,GAAI9Q,KAAKoV,MAAM5G,cAAcqK,WAAW,KAAShH,WAClD,OAAO,KAASA,UACf,GAAI7R,KAAKoV,MAAM5G,cAAcqK,WAAW,KAAStG,MAClD,OAAO,KAASA,KAEhB,MAAM,IAAIvR,MAAM,WAAWhB,KAAK6V,OAAOrT,kCAAkCxC,KAAKoV,UACtF,CAOA,eAAA0D,GAOI,MAAO,CANS9Y,KAAKwY,SAChBxY,KAAKuY,SAAWvY,KAAK2Y,mBADM,QAC0B,YAErC3Y,KAAKwY,QAAW,KAChCxY,KAAKuY,QAAW,KAAO,GACNvY,KAAKwY,SAAWxY,KAAKuY,QAAW,KAAO,GAH7C,QAKpB,CAQA,YAAAQ,CAAaC,EAAaC,EAAcC,EAASjX,GAC7C,MAAMuS,EAAMxU,KAAK6V,OACXrT,EAAOwW,EAAYxK,cAAgB,IAAMgG,EAAIhS,KAAO,IACpD2W,EAAaD,GAAW1E,EAAI4E,UAAUC,QAAQC,cAAc9W,GAC5D+W,EAAY,SAAUC,SAAS,SAAUL,EAAYlX,GAAQ,IAAIwV,MAAMzX,KAAK6V,OAAOnV,QAAQmC,KAAK,KAGtG,GAFA0W,EAAUjD,QAAU,UAAWC,cAC/BgD,EAAUpD,OAAO,OAAQb,MAAO0D,GAC5BA,IAAgB,KAASnH,UAAW,CACpC,IAAKoH,EACD,MAAM,IAAIjY,MAAM,aAAc,KAAS6Q,wCAC3C0H,EAAUpD,OAAO,YAAkC8C,EACvD,CACAM,EAAUpD,OAAO,OAAQsD,cAAe,YACxC,MAAMC,EAAalF,EAAIa,OAAO,WAC1BqE,GACAH,EAAUpD,OAAO,UAA8BuD,GACnD,IAAIC,EAAcnF,EAAIa,OAAO,YACxBsE,GAAe3Z,KAAK+W,WAAa,KAASxE,MAAQyG,IAAgB,KAASzG,OAC5EoH,EAAc,MACC,MAAfA,GACAJ,EAAUpD,OAAO,WAAgCwD,GACrD,IAAIC,EAAkBpF,EAAIa,OAAO,iBACd,MAAfsE,GAAuBC,GACvBL,EAAUpD,OAAO,gBAAyCyD,GAC9D,MAAMC,EAAyBrF,EAAIa,OAAO,wBAO1C,OANmB,MAAfsE,QAAkDjI,IAA3BmI,GACvBN,EAAUpD,OAAO,uBAAuD0D,GACxEb,GAAe,KAASzG,OACxBqH,EAAkB5Z,KAAKkX,kBAAkBlT,WACzCuV,EAAUpD,OAAO,gBAAyCyD,IAEvDL,CACX,CAEA,oBAAAO,CAAqBtX,EAAMuX,GACvB,OAAO/Z,KAAK+Y,aAAa/Y,KAAK+W,SAAU/W,KAAKwR,UAAWhP,EAAMuX,EAClE,CAQA,mBAAOhB,CAAaiB,GAChB,MAAMxF,EAAMD,EAAW0F,UAAUD,GAC3BE,EAAiB1F,EAAIuC,SAC3B,OAAOvC,EAAIuE,aAAamB,EAC5B,CAOA,yBAAOC,CAAmB/E,GAKtB,OAJAA,EAAQA,EAAM5G,cACG,CAAC,KAASsC,MAAO,KAASe,UAAW,KAASU,MAE9BmE,MAAMvO,GAAMiN,EAAMyD,WAAW1Q,EAAEqG,gBAEpE,CAUA,6BAAO4L,CAAuBlX,EAAKV,EAAM4S,GAIrC,IAAKb,EAAW4F,mBAAmB/E,GAC/B,MAAM,IAAIpU,MAAM,uCACpB,MAAMuY,EAAY,SAAUC,SAAS,SAAUhX,EAAM,IAAIiV,MAAMvU,GAAKL,KAAK,KAGzE,OAFA0W,EAAUjD,QAAU,UAAWC,cAC/BgD,EAAUpD,OAAO,OAAQb,MAAOF,GACzBmE,CACX,CAEA,WAAAc,CAAY5I,GACR,IAAImG,EAAW,KAEf,GADAA,EAAW5X,KAAKqU,iBAAmBrU,KAAKqU,iBAAiBuD,SAAW,KAChEA,EACA,OAAOA,EACX,GAAI5X,KAAKoV,MAAM5G,cAAcqK,WAAW,KAAS/H,OAE7C,OAAiB,OADA9Q,KAAK6V,OAAOR,OAAO,aACVrV,KAAKsX,yBAGpB,KAFA,KAIV,GAAItX,KAAKoV,MAAM5G,cAAcqK,WAAW,KAAShH,WAClD,OAAO,QAAyB7R,KAAKwR,UAAWC,GAC/C,GAAIzR,KAAKoV,MAAM5G,cAAcqK,WAAW,KAAStG,MAClD,OAAO,KAEP,MAAM,IAAIvR,MAAM,oBAAoBhB,KAAKoV,UAEjD,CACA,KAAAxD,CAAMZ,GACF,OAAOhR,KAAK4X,SAAS5G,EACzB,CACA,uBAAAsJ,GAEI,IAAKta,KAAK2V,UACN,MAAM,IAAI3U,MAAM,oCACpB,OAAIhB,KAAK0Y,QACE,IAAyB9O,SAC5B5J,KAAK+K,SAUE,IAAyBlB,YAE5C,CACA,mBAAA0Q,GACI,OAAO,IAAoBva,KAAKsa,4BACpC,CAEA,4BAAME,GAEF,GAAIxa,KAAK6V,OAAOC,KAAKtC,IAAI,qBACrB,MAA+E,SAAxExT,KAAK6V,OAAOR,OAAO,qBAE9B,MAGMoF,SAHyB,WACCC,YAERC,wBAAwB,UAA0C3W,YAEpF4W,EAAc,IAAInQ,IAAIgQ,GAMtBI,IAJe,QAAyB7a,KAAKwR,WAIjC,IAAI/G,KAChBqQ,EAAW9a,KAAK6V,OAAOnV,OACvBqa,EAAa/a,KAAK6V,OAAO5U,aAC/B,IAAK,IAAIuW,EAAS,EAAGA,EAASsD,IAAYtD,EAAQ,CAC9C,MAAMwD,EAAOD,EAAWvD,GACxB,KAAMwD,KAAQH,GAAY,CACtBA,EAAUI,IAAID,GACd,MAAME,EAAWlb,KAAKuX,YAAYC,GAClC,IAAK,MAAMS,KAAMiD,EAAS7K,WACtB,IAAKuK,EAAYpH,IAAIyE,GAEjB,OADAjY,KAAK6V,OAAOM,OAAO,oBAAiD,UAC7D,CAGnB,CACJ,CAEA,OADAnW,KAAK6V,OAAOM,OAAO,oBAAiD,SAC7D,CACX,CAEA,YAAIyB,GAGA,OAFuB,OAAnB5X,KAAKyU,YACLzU,KAAKyU,UAAYzU,KAAKqa,eACnBra,KAAKyU,SAChB,CACA,OAAA0G,CAAQjB,GAAkB,OAAOA,IAAmB,KAASpJ,KAAO,CACpE,WAAAsK,CAAYlB,GAAkB,OAAOA,IAAmB,KAASrI,SAAW,CAC5E,MAAAwJ,CAAOnB,GAAkB,OAAOA,IAAmB,KAAS3H,IAAM,CAWlE,2BAAA+I,CAA4BC,EAAQvC,EAAaC,EAAcuC,GACtDA,IACDA,EAAkBxb,KAAKmb,QAAQnC,GAC3B1E,EAAa,KAASxD,OACtBwD,EAAa,KAASzC,YAEzBoH,IACDA,EAAgBjZ,KAAKmb,QAAQnC,GAAgB,GAAKhZ,KAAKwR,WAC3D,MAAMiK,EAAeF,EAAO1C,WAAW,OAEjC6C,EAAiB1b,KAAK4X,SAAS2D,GAC/BI,EAAmB,GACzB,IAAK,IAAInL,EAAS,EAAGA,EAASkL,EAAehb,SAAU8P,EAAQ,CAC3D,IAAIoI,EAAK8C,EAAejL,YAAYD,GAGpC,GAFIiL,IACA7C,EAAKA,EAAGgD,QAAQ,KAAsB,KACtChD,IAAOtE,EAAa,KAAS/B,MAC7BoJ,EAAiBnW,KAAKgW,QACrB,GAAIxb,KAAKmb,QAAQnC,IAAgBJ,EAAGlY,OAAS,EAAG,CAEjD,MAAMqN,EAAU,IAAM6K,EAAK,IAC3B+C,EAAiBnW,KAAKuI,EAC1B,MAEI4N,EAAiBnW,KAAKoT,EAC9B,CACA,OAAO+C,EAAiBE,KAAK5C,EACjC,CAOA,OAAA6C,CAAQ9C,EAAaC,GAGjB,MAAM8C,EAAS/b,KAAKgc,UAAU,CAAEjF,SAAUiC,EAAaxH,UAAWyH,IAC5DM,EAAYvZ,KAAK+Y,aAAaC,EAAaC,GAMjD,OAJAM,EAAUhV,MAAMiT,IACZ,MAAMyE,EAAQjc,KAAKuX,YAAYC,GAC/B,OAAOuE,EAAOE,EAAM,IAEjB1C,CACX,CAMA,SAAA2C,CAAUC,EAAUC,EAAQ5Z,GACxB,MAAM6Z,EAASrc,KAAK+Y,aAAa/Y,KAAK+W,SAAU/W,KAAKwR,WACrD6K,EAAO7Z,KAAOA,EACd,MAAM8Z,EAAcH,GAAY,EAC1BI,EAAYH,GAAUpc,KAAKkY,UAAY,EACvC6D,EAAS/b,KAAKgc,YACdQ,EAAYD,EAAYD,EAAc,EACtCG,EAAQnI,EAAatU,KAAK+W,UAChCsF,EAAO9X,MAAMmY,IACT,MAAM7L,EAAO7Q,KAAKuX,YAAYmF,GAExBC,EAAY,IAAIlF,MAAM+E,GAC5B,IAAK,IAAII,EAAU,EAAGA,EAAUJ,IAAaI,EAAS,CAClD,MAAMC,EAAUP,EAAcM,EAC9BD,EAAUC,GAAWC,EAAUhM,EAAKnQ,OAASmQ,EAAKJ,YAAYoM,GAAWJ,CAC7E,CACA,OAAOV,EAAO,IAAI,KAAsBY,EAAWF,GAAO,IAE9D,MAAMK,EAA4BC,IAC9B,MAAMC,EAAaD,EAAInL,MAAM,KAAKT,KAAKhJ,GAAMA,EAAEmQ,SACzC2E,EAAa,IAAIxF,MAAM+E,GAC7B,IAAK,IAAII,EAAU,EAAGA,EAAUJ,IAAaI,EAAS,CAClD,MAAMM,EAAUZ,EAAcM,EAC9BK,EAAWL,GAAWM,EAAUF,EAAWtc,OAASsc,EAAWE,GAAW,GAC9E,CACA,OAAOD,EAAWpB,KAAK,KAAkB,EAEvCsB,EAAsBnd,KAAK6V,OAAOR,OAAO,kBAC3C8H,GACAd,EAAOlG,OAAO,iBAA2C2G,EAAyBK,IACtF,MAAMC,EAAuBpd,KAAK6V,OAAOR,OAAO,mBAGhD,OAFI+H,GACAf,EAAOlG,OAAO,kBAA6C2G,EAAyBM,IACjFf,CACX,CACA,UAAIN,GAGA,OAFK/b,KAAKgV,UACNhV,KAAKgV,QAAUhV,KAAKgc,aACjBhc,KAAKgV,OAChB,CACA,SAAAgH,CAAUqB,GACN,MAAMtG,EAAWsG,EAAOA,EAAKtG,SAAW/W,KAAK+W,SACvCvF,EAAY6L,EAAOA,EAAK7L,UAAYxR,KAAKwR,UAC/C,IAAI8L,EACJ,MAAMC,EAAQvd,KACd,OAAQ+W,GACJ,KAAK,KAASjG,MACVwM,EAAM,SAAUrB,GAAS,OAAOsB,EAAMC,YAAYvB,EAAOsB,EAAM3H,SAAW,EAC1E,MAEJ,KAAK,KAAS/D,UACV,IAAKL,EACD,MAAM,IAAIxQ,MAAM,wCAAwC+V,OAC5DuG,EAAM,SAAUrB,GAAS,OAAOwB,EAAgBxB,EAAOzK,EAAW+L,EAAM3H,SAAW,EACnF,MAEJ,KAAK,KAASrD,KAAM,CAChB,MAAMmL,EAAgC,QAAnBH,EAAMxS,UAA4D,QAAnBwS,EAAMxS,SAClE4S,EAAWJ,EAAMzE,kBACvBwE,EAAM,SAAUrB,GAAS,OAAO2B,EAAW3B,EAAO0B,EAAUD,EAAa,EACzE,KACJ,CACA,QACI,MAAM,IAAI1c,MAAM,wBAAwB+V,OAEhD,OAAOuG,CACX,CACA,YAAAO,CAAaC,EAAU7E,OAAevH,GAClC,GAAIoM,IAAa,KAASjM,YAAcoH,EACpC,MAAM,IAAIjY,MAAM,uDAAuD,KAAS6Q,eACpF,MAAM0L,EAAQvd,KACd,GAAI8d,IAAa,KAAShN,MACtB,OAAO,SAAUyK,GAAU,OAAOgC,EAAMQ,eAAexC,EAAS,EACpE,GAAIuC,IAAa,KAASvL,KACtB,OAAO,SAAUgJ,GAAU,OAAOgC,EAAMS,cAAczC,EAAS,EAC9D,GAAIuC,IAAa,KAASjM,UAC3B,OAAO,SAAU0J,GAAU,OAAOgC,EAAMU,mBAAmB1C,EAAQtC,EAAe,EAElF,MAAM,IAAIjY,KAClB,CAEA,gBAAOiZ,CAAUzF,GAEb,IAAI8I,EAAM9I,EAAIvR,KAAKkR,EAASC,YAG5B,OAFKkJ,GAAOA,EAAI1I,gBAAkBJ,EAAItS,UAClCob,EAAM9I,EAAIvR,KAAKkR,EAASC,YAAc,IAAIG,EAAWC,IAClD8I,CACX,CAEA,WAAAE,CAAY3M,EAAM+E,GACd,MAAMsI,EAAW,IAAIzG,MAAM5G,EAAKnQ,QAChC,IAAK,IAAI8P,EAAS,EAAGA,EAASK,EAAKnQ,SAAU8P,EAAQ,CACjD,MAAMyH,EAAKpH,EAAKJ,YAAYD,GAC5B,IAAIoI,EAAK/H,EAAKJ,YAAYD,GACtBoF,IACAgD,EAAKA,EAAGgD,QAAQ,KAAsB,OACtC3D,IAAO,KACPW,EAAKtE,EAAa,KAASxD,OACtBmH,IAAO,KACZW,EAAK,GACAA,EAAGlY,OAAS,IACjBkY,EAAK,IAAMA,EAAK,KACpBsF,EAAS1N,GAAUoI,CACvB,CACA,OAAOsF,EAASrC,KAAK,GACzB,CACA,cAAAkC,CAAerc,GACX,MAAMyc,EAAgBne,KAAK4X,SACrBqE,EAAQjc,KAAK4V,SAAW5V,KAAKoe,mBAAmB1c,GAAOyc,EAAczc,GAC3E,OAAO1B,KAAKwd,YAAYvB,EAAOjc,KAAK4V,SACxC,CACA,kBAAAqI,CAAmBvc,EAAKuX,GAEpB,OAAOwE,EADOzd,KAAK4V,SAAW5V,KAAKoe,mBAAmB1c,GAAO1B,KAAK4X,SAASlW,GAC7CuX,EAAcjZ,KAAK4V,SACrD,CACA,aAAAoI,CAActc,GACV,MAAMic,EAAW3d,KAAK8Y,kBAChB4E,EAAahc,EAAImX,WAAW,QAAUnX,EAAImX,WAAW,OAE3D,OAAO+E,EADO5d,KAAK4X,SAASlW,GACHic,EAAUD,EACvC,CAEA,kBAAAU,CAAmB1c,GACf,MAAM2c,EAAWre,KAAK4X,SAASlW,GACzB4c,EAAW,IAAI7G,MAAM4G,EAAS3d,QAC9B8X,EAAQ9W,EAAImX,WAAW,OACvBN,EAAQ7W,EAAImX,WAAW,OAC7B,IAAK,IAAIrI,EAAS,EAAGA,EAAS6N,EAAS3d,SAAU8P,EAAQ,CACrD,IAAIoI,EAAKyF,EAAS5N,YAAYD,IAC1BgI,GAASD,KACTK,EAAKA,EAAGgD,QAAQ,KAAsB,MACtChD,EAAKA,IAAO,KAAmB,KAAOA,GAE1C0F,EAAS9N,GAAUoI,GAAU,IACjC,CACA,OAAO,IAAI,KAAsB0F,EAASC,QAAQ3F,KAASA,IAAKtE,EAAa,KAAS/B,MAC1F,EAGJ,SAASkL,EAAgB5M,EAAMoI,EAAcrD,GACzC,MAAMsI,EAAW,IAAIzG,MAAM5G,EAAKnQ,QAChC,IAAK,IAAI8P,EAAS,EAAGA,EAASK,EAAKnQ,SAAU8P,EAAQ,CACjD,MAAMyH,EAAKpH,EAAKF,aAAaH,GAC7B,IAAIoI,EAAK/H,EAAKJ,YAAYD,GACtBoF,IACAgD,EAAKA,EAAGgD,QAAQ,KAAsB,OACtC3D,IAAO,KACPW,EAAKtE,EAAa,KAASzC,WACtBoG,IAAO,OACZW,EAAK,IACTsF,EAAS1N,GAAUoI,CACvB,CACA,OAAOsF,EAASrC,KAAK5C,EACzB,CACA,SAAS2E,EAAW3B,EAAO0B,EAAUD,GACjC,MAAOc,EAAQC,EAAaC,EAAcC,GAAWhB,EAC/CiB,EAAY,IAAInH,MAAMwE,EAAMvb,QAClC,IAAK,IAAI8P,EAAS,EAAGA,EAASyL,EAAMvb,SAAU8P,EAAQ,CAClD,MAAMyH,EAAKgE,EAAMtL,aAAaH,GAC9B,IAAIoI,EAAKqD,EAAMxL,YAAYD,GACvByH,IAAO,KACPW,EAAKtE,EAAa,KAAS/B,OAEvBmL,IACA9E,EAAKA,EAAGgD,QAAQ,KAAsB,OAC1ChD,EAAmB,IAAdA,EAAGlY,OAAe,GAAG+d,IAAc7F,IAAK8F,IAAiB,GAAGD,KAAe7F,KAAM8F,KAE1FE,EAAUpO,GAAUoI,CACxB,CACA,MAAO,GAAG4F,IAASI,EAAU/C,KAAK,OAAO8C,GAC7C,C,6BC/sBO,SAASE,EAAQC,EAAO,CAAC,GA0B5B,MAAMC,EAzBN,WACI,IAAKD,IAASA,EAAKE,gBAAkBF,EAAKG,gBACtC,MAAO,CAACC,EAAGpP,IAAMoP,IAAMpP,EAAI,EAAI,EACnC,GAAIgP,EAAKE,cAActe,SAAW6O,OAAO6D,KAAK0L,EAAKG,iBAAiBve,OAChE,MAAM,IAAIM,MAAM,mEACpB,MAAM4D,EAAUka,EAAKG,gBACfE,EAASL,EAAKE,cAGdI,EAAc/c,KAAKd,OAAOgO,OAAO6D,KAAKxO,GAASuM,KAAKlL,GAAMA,EAAEiJ,WAAW,MAAO,EAC9EmQ,EAAgB,IAAI/T,cAAc6T,EAAOze,OAAS0e,IAAgBD,EAAOze,OAAS0e,IAWxF,OAVA7P,OAAO+P,QAAQ1a,GAASoH,SAAQ,EAAEuT,EAAKva,MAGnC,MAAMwa,EAAYL,EAAOna,GACzBuK,OAAO+P,QAAQ1a,GAASoH,SAAQ,EAAEyT,EAAMC,MAEpCL,EAAcE,EAAIrQ,WAAW,GAAKiQ,EAAOze,OAAS+e,EAAKvQ,WAAW,IAAMsQ,EAAUE,EAAO,GAE3F,IAEC,CAACR,EAAGpP,IACA,EAAIuP,EAAcH,EAAEhQ,WAAW,GAAKiQ,EAAOze,OAASoP,EAAEZ,WAAW,GAEhF,CACkByQ,GACZC,EAAYd,GAAMc,WAAa,EACrC,MAAO,CAACC,EAAMC,KAGV,IAAIC,EAAO,EACX,MAAMC,EAAMH,EAAKnf,OACXuf,EAAMH,EAAKpf,OACXwf,EAAiB7d,KAAKb,IAAIwe,EAAKC,IAAQ,EAAIL,GAC7CI,IAAQC,IACRF,EAAO1d,KAAK8d,IAAIH,EAAMC,IAC1B,IAAIxY,EAAS,EACb,IAAK,IAAI5G,EAAI,EAAGA,EAAIwB,KAAKd,IAAIye,EAAKC,GAAMpf,IACpC,GAAIgf,EAAKhf,KAAOif,EAAKjf,KACjB4G,GAAUsX,EAAUc,EAAKhf,GAAIif,EAAKjf,IAC9B4G,EAASyY,GACT,OAAO,EAKnB,OAFAzY,GAAUsY,EACVtY,GAAUpF,KAAKb,IAAIwe,EAAKC,GACjBxY,CAAM,CAErB,C,yBCjDA,MAAM2Y,EAAM,IAAIrf,YAAY,OC+BtBsf,EAAc,CAChBC,QAAS,EACTC,UAAW,GACXvB,cAjCa,CAAC,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,GACrG,EAAE,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GACvF,EAAE,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GAClF,EAAE,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GACvF,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5F,EAAE,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GACnF,EAAE,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GACpF,CAAC,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC1F,EAAE,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GACtF,EAAE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GACzF,EAAE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GACzF,EAAE,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GACtF,EAAE,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GACxF,EAAE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GACxF,EAAE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC7F,CAAC,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,GAClF,CAAC,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,GACxF,EAAE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC5F,EAAE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAC1F,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GACxF,EAAE,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GACrF,EAAE,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GACpF,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC3F,EAAE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,IAW7FC,gBATgB,CAChB,EAAK,EAAG,EAAK,EAAG,EAAK,EAAG,EAAK,EAAG,EAAK,EAAG,EAAK,EAAG,EAAK,EAAG,EAAK,EAAG,EAAK,EACrE,EAAK,EAAG,EAAK,GAAI,EAAK,GAAI,EAAK,GAAI,EAAK,GAAI,EAAK,GAAI,EAAK,GAAI,EAAK,GACnE,EAAK,GAAI,EAAK,GAAI,EAAK,GAAI,EAAK,GAAI,EAAK,GAAI,EAAK,GAAI,IAAK,KCrBxD,IAAIuB,GACX,SAAWA,GACPA,EAAkC,QAAI,UACtCA,EAAsC,YAAI,cAC1CA,EAA4C,kBAAI,oBAChDA,EAAoD,0BAAI,2BAC3D,CALD,CAKGA,IAA6BA,EAA2B,CAAC,IAErD,MAAMC,EAAsB,CAC/B,CAACD,EAAyB5W,SAAUiV,EACpC,CAAC2B,EAAyB3W,aCjBvB,WACH,MAAO,CAACgW,EAAMC,IH6GD,EAACZ,EAAGpP,KACjB,GAAIoP,EAAExe,OAASoP,EAAEpP,OAAQ,CACrB,MAAMggB,EAAM5Q,EACZA,EAAIoP,EACJA,EAAIwB,CACR,CACA,OAAiB,IAAb5Q,EAAEpP,OACKwe,EAAExe,OAETwe,EAAExe,QAAU,GAvHH,EAACwe,EAAGpP,KACjB,MAAM9J,EAAIkZ,EAAExe,OACN+L,EAAIqD,EAAEpP,OACNigB,EAAM,GAAM3a,EAAI,EACtB,IAAI4a,GAAM,EACNC,EAAK,EACLC,EAAK9a,EACLnF,EAAImF,EACR,KAAOnF,KACHuf,EAAIlB,EAAEhQ,WAAWrO,KAAO,GAAKA,EAEjC,IAAKA,EAAI,EAAGA,EAAI4L,EAAG5L,IAAK,CACpB,IAAIkgB,EAAKX,EAAItQ,EAAEZ,WAAWrO,IAC1B,MAAMmgB,EAAKD,EAAKF,EAChBE,IAAQA,EAAKH,GAAMA,EAAMA,EACzBC,KAAQE,EAAKH,GACbA,GAAMG,EACFF,EAAKF,GACLG,IAEAF,EAAKD,GACLG,IAEJD,EAAMA,GAAM,EAAK,EACjBD,EAAMA,GAAM,IAAOI,EAAKH,GACxBA,GAAMG,CACV,CAEA,IADAngB,EAAImF,EACGnF,KACHuf,EAAIlB,EAAEhQ,WAAWrO,IAAM,EAE3B,OAAOigB,CAAE,EAyFEG,CAAS/B,EAAGpP,GAvFX,EAACA,EAAGoP,KAChB,MAAMlZ,EAAIkZ,EAAExe,OACN+L,EAAIqD,EAAEpP,OACNwgB,EAAM,GACNC,EAAM,GACNC,EAAQ/e,KAAKgf,KAAKrb,EAAI,IACtBsb,EAAQjf,KAAKgf,KAAK5U,EAAI,IAC5B,IAAK,IAAI5L,EAAI,EAAGA,EAAIugB,EAAOvgB,IACvBsgB,EAAItgB,IAAM,EACVqgB,EAAIrgB,GAAK,EAEb,IAAIqH,EAAI,EACR,KAAOA,EAAIoZ,EAAQ,EAAGpZ,IAAK,CACvB,IAAI2Y,EAAK,EACLD,GAAM,EACV,MAAMjb,EAAY,GAAJuC,EACRqZ,EAAOlf,KAAKd,IAAI,GAAIkL,GAAK9G,EAC/B,IAAK,IAAIM,EAAIN,EAAOM,EAAIsb,EAAMtb,IAC1Bma,EAAItQ,EAAEZ,WAAWjJ,KAAO,GAAKA,EAEjC,IAAK,IAAIpF,EAAI,EAAGA,EAAImF,EAAGnF,IAAK,CACxB,MAAMkgB,EAAKX,EAAIlB,EAAEhQ,WAAWrO,IACtB2gB,EAAML,EAAKtgB,EAAI,GAAM,KAAOA,EAAK,EACjC4gB,EAAMP,EAAKrgB,EAAI,GAAM,KAAOA,EAAK,EACjCmgB,EAAKD,EAAKF,EACVa,IAASX,EAAKU,GAAMb,GAAMA,EAAMA,EAAMG,EAAKU,EACjD,IAAIE,EAAKd,IAAOa,EAAKd,GACjBgB,EAAKhB,EAAKc,EACTC,IAAO,GAAMH,IACdL,EAAKtgB,EAAI,GAAM,IAAM,GAAKA,GAEzB+gB,IAAO,GAAMH,IACdP,EAAKrgB,EAAI,GAAM,IAAM,GAAKA,GAE9B8gB,EAAMA,GAAM,EAAKH,EACjBI,EAAMA,GAAM,EAAKH,EACjBb,EAAKgB,IAAOZ,EAAKW,GACjBd,EAAKc,EAAKX,CACd,CACA,IAAK,IAAI/a,EAAIN,EAAOM,EAAIsb,EAAMtb,IAC1Bma,EAAItQ,EAAEZ,WAAWjJ,IAAM,CAE/B,CACA,IAAI4a,EAAK,EACLD,GAAM,EACV,MAAMjb,EAAY,GAAJuC,EACRqZ,EAAOlf,KAAKd,IAAI,GAAIkL,EAAI9G,GAASA,EACvC,IAAK,IAAIM,EAAIN,EAAOM,EAAIsb,EAAMtb,IAC1Bma,EAAItQ,EAAEZ,WAAWjJ,KAAO,GAAKA,EAEjC,IAAI4b,EAAQpV,EACZ,IAAK,IAAI5L,EAAI,EAAGA,EAAImF,EAAGnF,IAAK,CACxB,MAAMkgB,EAAKX,EAAIlB,EAAEhQ,WAAWrO,IACtB2gB,EAAML,EAAKtgB,EAAI,GAAM,KAAOA,EAAK,EACjC4gB,EAAMP,EAAKrgB,EAAI,GAAM,KAAOA,EAAK,EACjCmgB,EAAKD,EAAKF,EACVa,IAASX,EAAKU,GAAMb,GAAMA,EAAMA,EAAMG,EAAKU,EACjD,IAAIE,EAAKd,IAAOa,EAAKd,GACjBgB,EAAKhB,EAAKc,EACdG,GAAUF,IAAQlV,EAAI,EAAM,EAC5BoV,GAAUD,IAAQnV,EAAI,EAAM,EACvBkV,IAAO,GAAMH,IACdL,EAAKtgB,EAAI,GAAM,IAAM,GAAKA,GAEzB+gB,IAAO,GAAMH,IACdP,EAAKrgB,EAAI,GAAM,IAAM,GAAKA,GAE9B8gB,EAAMA,GAAM,EAAKH,EACjBI,EAAMA,GAAM,EAAKH,EACjBb,EAAKgB,IAAOZ,EAAKW,GACjBd,EAAKc,EAAKX,CACd,CACA,IAAK,IAAI/a,EAAIN,EAAOM,EAAIsb,EAAMtb,IAC1Bma,EAAItQ,EAAEZ,WAAWjJ,IAAM,EAE3B,OAAO4b,CAAK,EAcLC,CAAQ5C,EAAGpP,EAAE,EGxHTiS,CAASlC,EAAMC,GAAQzd,KAAKb,IAAIqe,EAAKnf,OAAQof,EAAKpf,OAEjE,EDcI,CAAC8f,EAAyBzW,mBDsBvB,SAAwB+U,GAC3B,MACMkD,EAAgB,IAAIC,YAAY,QAChC,QAAE3B,EAAO,UAAEC,EAAS,cAAEvB,EAAa,gBAAEC,GAAoB,IAAKoB,KAAgBvB,GACpFvP,OAAO+P,QAAQL,GAAiBjT,SAAQ,EAAE/F,EAAGuF,KAAOwW,EAAc/b,EAAEiJ,WAAW,IAAM1D,IAGrF,MAAM2T,EAAS,CACX,IAAI7T,aAPO,KAQX,IAAIA,aARO,MAUf,MAAO,CAACuU,EAAMC,KAGV,MAAMoC,EAAe,IAAIzK,MAAMoI,EAAKnf,OAAS,GAAGmC,MAAK,GAC/Csf,EAAiB,IAAI1K,MAAMoI,EAAKnf,OAAS,GAAGmC,MAAK,GAGvD,IAAIuf,EAAU,EACVC,EAAU,EAEd,IAAK,IAAIxhB,EAAI,EAAGA,EAAIgf,EAAKnf,OAAS,EAAGG,IACjCse,EAAO,GAAGte,IAAMyf,GAAWzf,EAAI,GAAK0f,EACpCpB,EAAO,GAAGte,GAAK,EAEnBse,EAAO,GAAG,GAAK,EAEf,IAAK,IAAIte,EAAI,EAAGA,EAAIif,EAAKpf,OAAS,EAAGG,IAAK,CACtCse,EAAOkD,GAAS,IAAM/B,GAAWzf,EAAI,GAAK0f,EAC1C,IAAK,IAAIrY,EAAI,EAAGA,EAAI2X,EAAKnf,OAAS,EAAGwH,IAAK,CACtC,MAAMoa,EAAWnD,EAAOiD,GAASla,EAAI,GACjC8W,EAAcgD,EAAcnC,EAAK3Q,WAAWhH,EAAI,KAAK8Z,EAAclC,EAAK5Q,WAAWrO,EAAI,KACrF0hB,EAAMpD,EAAOiD,GAASla,IAAMga,EAAaha,GAAKqY,EAAYD,GAC1DkC,EAAOrD,EAAOkD,GAASna,EAAI,IAAMia,EAAeja,EAAI,GAAKqY,EAAYD,GAC3EnB,EAAOkD,GAASna,GAAK7F,KAAKb,IAAI8gB,EAAUE,EAAMD,GAE1CpD,EAAOkD,GAASna,KAAOoa,GACvBJ,EAAaha,IAAK,EAClBia,EAAeja,IAAK,GAEfiX,EAAOkD,GAASna,KAAOsa,GAC5BN,EAAaha,IAAK,EAClBia,EAAeja,IAAK,IAGpBga,EAAaha,IAAK,EAClBia,EAAeja,IAAK,EAE5B,CAEAka,EAAUC,EACVA,GAAWA,EAAU,GAAK,CAC9B,CAQA,MAAMI,EAAWpgB,KAAKb,IAAIqe,EAAKnf,OAAQof,EAAKpf,QAC5C,OAAQ+hB,EAAWtD,EAAOiD,GAASvC,EAAKnf,SAAW+hB,CAAQ,CAEnE,ECpFI,CAACjC,EAAyB1W,2BAA4B+U,E,4BEpBnD,SAAS6D,EAAeC,GAC3B,IAAIC,EACJ,MAAmB,iBAARD,GAAoBA,aAAeE,OACnCF,GAEa,iBAAPA,GAAmBA,aAAepT,SAAW,mBAAoBoT,EACvED,EAAeC,EAAoB,gBAErCA,aAAe3hB,MACQ,QAApB4hB,EAAKD,EAAIG,aAA0B,IAAPF,EAAgBA,EAAKD,EAAII,QAGtDJ,EAAI3e,UAEnB,C,oCCdA,qBAEI,IAAIgf,EAAU,CAAC,GAcV,SAASA,GAClB,aACAA,EAAQC,YAAa,EAiBrBD,EAAQE,aAAe,GACvBF,EAAQG,UAAY,GAEpB,IAAIC,EAAI,IAAIriB,YAAY,CACpB,WAAY,WAAY,WAAY,WAAY,UAChD,WAAY,WAAY,WAAY,WAAY,UAChD,UAAY,WAAY,WAAY,WAAY,WAChD,WAAY,WAAY,WAAY,UAAY,UAChD,UAAY,WAAY,WAAY,WAAY,WAChD,WAAY,WAAY,WAAY,WAAY,WAChD,UAAY,UAAY,UAAY,UAAY,WAChD,WAAY,WAAY,WAAY,WAAY,WAChD,WAAY,WAAY,WAAY,WAAY,WAChD,WAAY,WAAY,UAAY,UAAY,UAChD,UAAY,UAAY,UAAY,WAAY,WAChD,WAAY,WAAY,WAAY,WAAY,WAChD,WAAY,WAAY,WAAY,aAExC,SAASsiB,EAAWC,EAAG9X,EAAGrD,EAAGzB,EAAKxD,GAE9B,IADA,IAAIgc,EAAGpP,EAAGvC,EAAGgW,EAAGC,EAAGC,EAAG7T,EAAG8T,EAAGC,EAAG9iB,EAAGqH,EAAG0b,EAAIC,EAClC3gB,GAAO,IAAI,CASd,IARAgc,EAAI1T,EAAE,GACNsE,EAAItE,EAAE,GACN+B,EAAI/B,EAAE,GACN+X,EAAI/X,EAAE,GACNgY,EAAIhY,EAAE,GACNiY,EAAIjY,EAAE,GACNoE,EAAIpE,EAAE,GACNkY,EAAIlY,EAAE,GACD3K,EAAI,EAAGA,EAAI,GAAIA,IAChBqH,EAAIxB,EAAU,EAAJ7F,EACVyiB,EAAEziB,IAAe,IAAPsH,EAAED,KAAc,IAAmB,IAAXC,EAAED,EAAI,KAAc,IACrC,IAAXC,EAAED,EAAI,KAAc,EAAiB,IAAXC,EAAED,EAAI,GAE1C,IAAKrH,EAAI,GAAIA,EAAI,GAAIA,IAEjB+iB,IADAD,EAAIL,EAAEziB,EAAI,MACE,GAAK8iB,GAAK,KAAcA,IAAM,GAAKA,GAAK,IAAcA,IAAM,GAExEE,IADAF,EAAIL,EAAEziB,EAAI,OACE,EAAI8iB,GAAK,KAAaA,IAAM,GAAKA,GAAK,IAAcA,IAAM,EACtEL,EAAEziB,IAAM+iB,EAAKN,EAAEziB,EAAI,GAAK,IAAMgjB,EAAKP,EAAEziB,EAAI,IAAM,GAEnD,IAAKA,EAAI,EAAGA,EAAI,GAAIA,IAChB+iB,KAAUJ,IAAM,EAAIA,GAAK,KAAaA,IAAM,GAAKA,GAAK,KACjDA,IAAM,GAAKA,GAAK,KAAgBA,EAAIC,GAAOD,EAAI5T,GAAO,IACrD8T,GAAMN,EAAEviB,GAAKyiB,EAAEziB,GAAM,GAAM,GAAM,EACvCgjB,IAAQ3E,IAAM,EAAIA,GAAK,KAAaA,IAAM,GAAKA,GAAK,KAC/CA,IAAM,GAAKA,GAAK,MAAgBA,EAAIpP,EAAMoP,EAAI3R,EAAMuC,EAAIvC,GAAO,EACpEmW,EAAI9T,EACJA,EAAI6T,EACJA,EAAID,EACJA,EAAKD,EAAIK,EAAM,EACfL,EAAIhW,EACJA,EAAIuC,EACJA,EAAIoP,EACJA,EAAK0E,EAAKC,EAAM,EAEpBrY,EAAE,IAAM0T,EACR1T,EAAE,IAAMsE,EACRtE,EAAE,IAAM+B,EACR/B,EAAE,IAAM+X,EACR/X,EAAE,IAAMgY,EACRhY,EAAE,IAAMiY,EACRjY,EAAE,IAAMoE,EACRpE,EAAE,IAAMkY,EACRhd,GAAO,GACPxD,GAAO,EACX,CACA,OAAOwD,CACX,CAEA,IAAIod,EAAsB,WACtB,SAASA,IACL9jB,KAAKkjB,aAAeF,EAAQE,aAC5BljB,KAAKmjB,UAAYH,EAAQG,UAEzBnjB,KAAK+jB,MAAQ,IAAIC,WAAW,GAC5BhkB,KAAKiD,KAAO,IAAI+gB,WAAW,IAC3BhkB,KAAKgC,OAAS,IAAIiiB,WAAW,KAC7BjkB,KAAKkkB,aAAe,EACpBlkB,KAAKmkB,YAAc,EACnBnkB,KAAKokB,UAAW,EAChBpkB,KAAKqkB,OACT,CAmHA,OAhHAP,EAAKQ,UAAUD,MAAQ,WAYnB,OAXArkB,KAAK+jB,MAAM,GAAK,WAChB/jB,KAAK+jB,MAAM,GAAK,WAChB/jB,KAAK+jB,MAAM,GAAK,WAChB/jB,KAAK+jB,MAAM,GAAK,WAChB/jB,KAAK+jB,MAAM,GAAK,WAChB/jB,KAAK+jB,MAAM,GAAK,WAChB/jB,KAAK+jB,MAAM,GAAK,UAChB/jB,KAAK+jB,MAAM,GAAK,WAChB/jB,KAAKkkB,aAAe,EACpBlkB,KAAKmkB,YAAc,EACnBnkB,KAAKokB,UAAW,EACTpkB,IACX,EAEA8jB,EAAKQ,UAAUC,MAAQ,WACnB,IAAK,IAAI1jB,EAAI,EAAGA,EAAIb,KAAKgC,OAAOtB,OAAQG,IACpCb,KAAKgC,OAAOnB,GAAK,EAErB,IAASA,EAAI,EAAGA,EAAIb,KAAKiD,KAAKvC,OAAQG,IAClCb,KAAKiD,KAAKpC,GAAK,EAEnBb,KAAKqkB,OACT,EAQAP,EAAKQ,UAAUE,OAAS,SAAUviB,EAAMwiB,GAEpC,QADmB,IAAfA,IAAyBA,EAAaxiB,EAAKvB,QAC3CV,KAAKokB,SACL,MAAM,IAAIpjB,MAAM,mDAEpB,IAAI0jB,EAAU,EAEd,GADA1kB,KAAKmkB,aAAeM,EAChBzkB,KAAKkkB,aAAe,EAAG,CACvB,KAAOlkB,KAAKkkB,aAAe,IAAMO,EAAa,GAC1CzkB,KAAKgC,OAAOhC,KAAKkkB,gBAAkBjiB,EAAKyiB,KACxCD,IAEsB,KAAtBzkB,KAAKkkB,eACLb,EAAWrjB,KAAKiD,KAAMjD,KAAK+jB,MAAO/jB,KAAKgC,OAAQ,EAAG,IAClDhC,KAAKkkB,aAAe,EAE5B,CAKA,IAJIO,GAAc,KACdC,EAAUrB,EAAWrjB,KAAKiD,KAAMjD,KAAK+jB,MAAO9hB,EAAMyiB,EAASD,GAC3DA,GAAc,IAEXA,EAAa,GAChBzkB,KAAKgC,OAAOhC,KAAKkkB,gBAAkBjiB,EAAKyiB,KACxCD,IAEJ,OAAOzkB,IACX,EAIA8jB,EAAKQ,UAAUK,OAAS,SAAUC,GAC9B,IAAK5kB,KAAKokB,SAAU,CAChB,IAAID,EAAcnkB,KAAKmkB,YACnB3B,EAAOxiB,KAAKkkB,aACZW,EAAYV,EAAc,UAAc,EACxCW,EAAWX,GAAe,EAC1BY,EAAaZ,EAAc,GAAK,GAAM,GAAK,IAC/CnkB,KAAKgC,OAAOwgB,GAAQ,IACpB,IAAK,IAAI3hB,EAAI2hB,EAAO,EAAG3hB,EAAIkkB,EAAY,EAAGlkB,IACtCb,KAAKgC,OAAOnB,GAAK,EAErBb,KAAKgC,OAAO+iB,EAAY,GAAMF,IAAa,GAAM,IACjD7kB,KAAKgC,OAAO+iB,EAAY,GAAMF,IAAa,GAAM,IACjD7kB,KAAKgC,OAAO+iB,EAAY,GAAMF,IAAa,EAAK,IAChD7kB,KAAKgC,OAAO+iB,EAAY,GAAMF,IAAa,EAAK,IAChD7kB,KAAKgC,OAAO+iB,EAAY,GAAMD,IAAa,GAAM,IACjD9kB,KAAKgC,OAAO+iB,EAAY,GAAMD,IAAa,GAAM,IACjD9kB,KAAKgC,OAAO+iB,EAAY,GAAMD,IAAa,EAAK,IAChD9kB,KAAKgC,OAAO+iB,EAAY,GAAMD,IAAa,EAAK,IAChDzB,EAAWrjB,KAAKiD,KAAMjD,KAAK+jB,MAAO/jB,KAAKgC,OAAQ,EAAG+iB,GAClD/kB,KAAKokB,UAAW,CACpB,CACA,IAASvjB,EAAI,EAAGA,EAAI,EAAGA,IACnB+jB,EAAQ,EAAJ/jB,EAAQ,GAAMb,KAAK+jB,MAAMljB,KAAO,GAAM,IAC1C+jB,EAAQ,EAAJ/jB,EAAQ,GAAMb,KAAK+jB,MAAMljB,KAAO,GAAM,IAC1C+jB,EAAQ,EAAJ/jB,EAAQ,GAAMb,KAAK+jB,MAAMljB,KAAO,EAAK,IACzC+jB,EAAQ,EAAJ/jB,EAAQ,GAAMb,KAAK+jB,MAAMljB,KAAO,EAAK,IAE7C,OAAOb,IACX,EAEA8jB,EAAKQ,UAAUU,OAAS,WACpB,IAAIJ,EAAM,IAAIX,WAAWjkB,KAAKkjB,cAE9B,OADAljB,KAAK2kB,OAAOC,GACLA,CACX,EAEAd,EAAKQ,UAAUW,WAAa,SAAUL,GAClC,IAAK,IAAI/jB,EAAI,EAAGA,EAAIb,KAAK+jB,MAAMrjB,OAAQG,IACnC+jB,EAAI/jB,GAAKb,KAAK+jB,MAAMljB,EAE5B,EAEAijB,EAAKQ,UAAUY,cAAgB,SAAU5gB,EAAM6f,GAC3C,IAAK,IAAItjB,EAAI,EAAGA,EAAIb,KAAK+jB,MAAMrjB,OAAQG,IACnCb,KAAK+jB,MAAMljB,GAAKyD,EAAKzD,GAEzBb,KAAKmkB,YAAcA,EACnBnkB,KAAKokB,UAAW,EAChBpkB,KAAKkkB,aAAe,CACxB,EACOJ,CACX,CAhIyB,GAiIzBd,EAAQc,KAAOA,EAEf,IAAIqB,EAAsB,WACtB,SAASA,EAAK5F,GACVvf,KAAKyN,MAAQ,IAAIqW,EACjB9jB,KAAK0N,MAAQ,IAAIoW,EACjB9jB,KAAKmjB,UAAYnjB,KAAKyN,MAAM0V,UAC5BnjB,KAAKkjB,aAAeljB,KAAKyN,MAAMyV,aAC/B,IAAIkC,EAAM,IAAInB,WAAWjkB,KAAKmjB,WAC9B,GAAI5D,EAAI7e,OAASV,KAAKmjB,WAClB,IAAKW,GAAQU,OAAOjF,GAAKoF,OAAOS,GAAKb,aAGrC,IAAK,IAAI1jB,EAAI,EAAGA,EAAI0e,EAAI7e,OAAQG,IAC5BukB,EAAIvkB,GAAK0e,EAAI1e,GAGrB,IAASA,EAAI,EAAGA,EAAIukB,EAAI1kB,OAAQG,IAC5BukB,EAAIvkB,IAAM,GAGd,IADAb,KAAKyN,MAAM+W,OAAOY,GACTvkB,EAAI,EAAGA,EAAIukB,EAAI1kB,OAAQG,IAC5BukB,EAAIvkB,IAAM,IAOd,IALAb,KAAK0N,MAAM8W,OAAOY,GAClBplB,KAAKqlB,OAAS,IAAItkB,YAAY,GAC9Bf,KAAKslB,OAAS,IAAIvkB,YAAY,GAC9Bf,KAAKyN,MAAMwX,WAAWjlB,KAAKqlB,QAC3BrlB,KAAK0N,MAAMuX,WAAWjlB,KAAKslB,QAClBzkB,EAAI,EAAGA,EAAIukB,EAAI1kB,OAAQG,IAC5BukB,EAAIvkB,GAAK,CAEjB,CAuCA,OAnCAskB,EAAKb,UAAUD,MAAQ,WAGnB,OAFArkB,KAAKyN,MAAMyX,cAAcllB,KAAKqlB,OAAQrlB,KAAKyN,MAAM0V,WACjDnjB,KAAK0N,MAAMwX,cAAcllB,KAAKslB,OAAQtlB,KAAK0N,MAAMyV,WAC1CnjB,IACX,EAEAmlB,EAAKb,UAAUC,MAAQ,WACnB,IAAK,IAAI1jB,EAAI,EAAGA,EAAIb,KAAKqlB,OAAO3kB,OAAQG,IACpCb,KAAKslB,OAAOzkB,GAAKb,KAAKqlB,OAAOxkB,GAAK,EAEtCb,KAAKyN,MAAM8W,QACXvkB,KAAK0N,MAAM6W,OACf,EAEAY,EAAKb,UAAUE,OAAS,SAAUviB,GAE9B,OADAjC,KAAKyN,MAAM+W,OAAOviB,GACXjC,IACX,EAEAmlB,EAAKb,UAAUK,OAAS,SAAUC,GAQ9B,OAPI5kB,KAAK0N,MAAM0W,SACXpkB,KAAK0N,MAAMiX,OAAOC,IAGlB5kB,KAAKyN,MAAMkX,OAAOC,GAClB5kB,KAAK0N,MAAM8W,OAAOI,EAAK5kB,KAAKkjB,cAAcyB,OAAOC,IAE9C5kB,IACX,EAEAmlB,EAAKb,UAAUU,OAAS,WACpB,IAAIJ,EAAM,IAAIX,WAAWjkB,KAAKkjB,cAE9B,OADAljB,KAAK2kB,OAAOC,GACLA,CACX,EACOO,CACX,CAtEyB,GAyEzB,SAASlW,EAAKhN,GACV,IAAIyhB,GAAI,IAAKI,GAAQU,OAAOviB,GACxB+iB,EAAStB,EAAEsB,SAEf,OADAtB,EAAEa,QACKS,CACX,CAKA,SAASO,EAAKhG,EAAKtd,GACf,IAAIyhB,EAAI,IAAKyB,EAAK5F,GAAMiF,OAAOviB,GAC3B+iB,EAAStB,EAAEsB,SAEf,OADAtB,EAAEa,QACKS,CACX,CAIA,SAASQ,EAAWxjB,EAAQujB,EAAME,EAAMC,GAEpC,IAAIvkB,EAAMukB,EAAQ,GAClB,GAAY,IAARvkB,EACA,MAAM,IAAIH,MAAM,4BAGpBukB,EAAKlB,QAGDljB,EAAM,GACNokB,EAAKf,OAAOxiB,GAGZyjB,GACAF,EAAKf,OAAOiB,GAGhBF,EAAKf,OAAOkB,GAEZH,EAAKZ,OAAO3iB,GAEZ0jB,EAAQ,IACZ,CA5CA1C,EAAQmC,KAAOA,EAQfnC,EAAQ/T,KAAOA,EAEf+T,EAAiB,QAAI/T,EAQrB+T,EAAQuC,KAAOA,EA2Bf,IAAII,EAAW,IAAI1B,WAAWjB,EAAQE,cA0BtCF,EAAQ4C,KAzBR,SAAcrG,EAAKsG,EAAMJ,EAAM/kB,QACd,IAATmlB,IAAmBA,EAAOF,QACf,IAAXjlB,IAAqBA,EAAS,IAWlC,IAVA,IAAIglB,EAAU,IAAIzB,WAAW,CAAC,IAE1B6B,EAAMP,EAAKM,EAAMtG,GAGjBwG,EAAQ,IAAIZ,EAAKW,GAEjB9jB,EAAS,IAAIiiB,WAAW8B,EAAM7C,cAC9B8C,EAAShkB,EAAOtB,OAChBkkB,EAAM,IAAIX,WAAWvjB,GAChBG,EAAI,EAAGA,EAAIH,EAAQG,IACpBmlB,IAAWhkB,EAAOtB,SAClB8kB,EAAWxjB,EAAQ+jB,EAAON,EAAMC,GAChCM,EAAS,GAEbpB,EAAI/jB,GAAKmB,EAAOgkB,KAKpB,OAHAD,EAAMxB,QACNviB,EAAOa,KAAK,GACZ6iB,EAAQ7iB,KAAK,GACN+hB,CACX,EAgDA5B,EAAQiD,OAxCR,SAAgBC,EAAUL,EAAMM,EAAYC,GAOxC,IANA,IAAIC,EAAM,IAAIlB,EAAKe,GACfhjB,EAAMmjB,EAAInD,aACVoD,EAAM,IAAIrC,WAAW,GACrBsC,EAAI,IAAItC,WAAW/gB,GACnBygB,EAAI,IAAIM,WAAW/gB,GACnBsjB,EAAK,IAAIvC,WAAWmC,GACfvlB,EAAI,EAAGA,EAAIqC,EAAMkjB,EAAOvlB,IAAK,CAClC,IAAI0M,EAAI1M,EAAI,EACZylB,EAAI,GAAM/Y,IAAM,GAAM,IACtB+Y,EAAI,GAAM/Y,IAAM,GAAM,IACtB+Y,EAAI,GAAM/Y,IAAM,EAAK,IACrB+Y,EAAI,GAAM/Y,IAAM,EAAK,IACrB8Y,EAAIhC,QACJgC,EAAI7B,OAAOqB,GACXQ,EAAI7B,OAAO8B,GACXD,EAAI1B,OAAOhB,GACX,IAAK,IAAIzb,EAAI,EAAGA,EAAIhF,EAAKgF,IACrBqe,EAAEre,GAAKyb,EAAEzb,GAEb,IAASA,EAAI,EAAGA,GAAKie,EAAYje,IAAK,CAClCme,EAAIhC,QACJgC,EAAI7B,OAAOb,GAAGgB,OAAOhB,GACrB,IAAK,IAAI1d,EAAI,EAAGA,EAAI/C,EAAK+C,IACrBsgB,EAAEtgB,IAAM0d,EAAE1d,EAElB,CACA,IAASiC,EAAI,EAAGA,EAAIhF,GAAOrC,EAAIqC,EAAMgF,EAAIke,EAAOle,IAC5Cse,EAAG3lB,EAAIqC,EAAMgF,GAAKqe,EAAEre,EAE5B,CACA,IAASrH,EAAI,EAAGA,EAAIqC,EAAKrC,IACrB0lB,EAAE1lB,GAAK8iB,EAAE9iB,GAAK,EAElB,IAASA,EAAI,EAAGA,EAAI,EAAGA,IACnBylB,EAAIzlB,GAAK,EAGb,OADAwlB,EAAI9B,QACGiC,CACX,CAEA,CAvaIC,CAAQzD,GACR,IAAI0D,EAAS1D,EAAiB,QAC9B,IAAK,IAAI/c,KAAK+c,EACV0D,EAAOzgB,GAAK+c,EAAQ/c,GAGoC,iBAAnB0gB,EAAO3D,QAC5C2D,EAAO3D,QAAU0D,OAEmB,KAApC,aAAoB,OAAOA,CAAS,+BAI3C,CAhBD,E,qGC4CO,MAAME,EAcX,YACkBC,EACArS,GADA,KAAAqS,QAAAA,EACA,KAAArS,IAAAA,EARX,KAAAsS,iBAA2B,EAC3B,KAAAC,YAAsB,EACtB,KAAAC,mBAAmD,CAAC,EAEnD,KAAAC,KAAyB,GAM/BjnB,KAAKknB,KAAOlnB,KAAK6mB,QAAU7mB,KAAK6mB,QAAQK,KAAO,KAC/ClnB,KAAKqkB,QACDrkB,KAAKknB,OACPlnB,KAAKinB,KAAKzhB,KAAKxF,KAAKwU,IAAI4E,UAAU+N,cAAcC,WAAU,KACxD,IACEpnB,KAAKqkB,O,CACL,MAAO1B,GACPvL,QAAQiQ,MAAM1E,E,MAGlB3iB,KAAKinB,KAAKzhB,KAAK,SAAY8hB,cAAcF,WAAWG,IAClD,IACMvnB,KAAKknB,MAAQlnB,KAAKknB,KAAKK,MAAMC,KAAOD,EAAKC,IAAIxnB,KAAKynB,S,CACtD,MAAO9E,GACPvL,QAAQiQ,MAAM1E,E,OAIpB3iB,KAAK0nB,YAAa,IAAAC,iBAClB3nB,KAAKinB,KAAKzhB,KAAKxF,KAAK0nB,WAAWE,UAAUR,UAAUpnB,KAAK6nB,oBAAoBC,KAAK9nB,OACnF,CAEQ,KAAAqkB,GACNrkB,KAAK+nB,cAAgB,IAAItQ,MAAuBzX,KAAKwU,IAAI9T,QAAQmC,KAAK,MACtE7C,KAAKgoB,aAAe,IAAIvQ,MAAuBzX,KAAKwU,IAAI9T,QAAQmC,KAAK,MACrE7C,KAAKioB,YAAc,IAAIxQ,MAAsBzX,KAAKwU,IAAI9T,QAAQmC,KAAK,KACrE,CAEQ,OAAA4kB,GACN,IAAK,MAAMS,KAAOloB,KAAKinB,KAAMiB,EAAIC,aACnC,CAGO,QAAAC,CAAS5Q,GACdxX,KAAK+nB,cAAcvQ,GAAU,GAC7BxX,KAAKgoB,aAAaxQ,GAAU,EAC9B,CAGO,sBAAA6Q,CAAuB7Q,GAC5B,MAAO8Q,EAAUC,GAAWvoB,KAAKwoB,4BAA4BhR,GAEvDiR,EAAuB,IAAIhR,MAAc8Q,EAAQ7nB,OAAS,GAChE+nB,EAAW,GAAKzoB,KAAK+mB,YACrB,IAAK,IAAIrgB,EAAc,EAAGA,EAAM+hB,EAAW/nB,OAAQgG,IACjD+hB,EAAW/hB,GAAO+hB,EAAW/hB,EAAM,GAAK6hB,EAAQ7hB,EAAM,GACxD,MAAO,CAAC4hB,EAAUC,EAASE,EAC7B,CAEQ,2BAAAD,CAA4BhR,GAClC,IAAI8Q,EAA4BtoB,KAAK+nB,cAAevQ,GACpD,GAAiB,OAAb8Q,EAAmB,CACrB,MAAMtX,EAAMhR,KAAKwU,IAAIhI,IAAIgL,GACzB8Q,EAAWtoB,KAAK+nB,cAAevQ,GAAUkR,EAAY1X,E,CAGvD,IAAIuX,EAA2BvoB,KAAKgoB,aAAcxQ,GAClD,GAAgB,OAAZ+Q,EAAkB,CACpBA,EAAUvoB,KAAKgoB,aAAcxQ,GAAU,IAAIC,MAAc6Q,EAAS5nB,QAClE,IAAK,MAAOioB,EAAMC,KAAU,cAAaN,GAAW,CAClD,MAAMO,EAAoBF,EAAKjoB,OAASV,KAAK8mB,iBAC7CyB,EAAQK,GAASC,C,EAIrB,MAAO,CAACP,EAAUC,EACpB,CAEA,UAAAO,CAAW/a,GACT,IAAIuP,EAAsB,KAC1B,GAAIvP,EAAQgb,YACVzL,EAAMtd,KAAK0nB,WAAWoB,WAAW/a,EAAQgb,YAAahb,EAAQib,aAE9D,IAAK,MAAMD,KAAe/oB,KAAK0nB,WAAWuB,kBAExC,GADA3L,EAAMtd,KAAK0nB,WAAWoB,WAAWC,EAAahb,EAAQib,QAClD1L,EAAK,MAGb,OAAOA,CACT,CAIQ,mBAAAuK,CAAoBqB,GAC1BlpB,KAAKqkB,QACDrkB,KAAKknB,MAAMlnB,KAAKknB,KAAKiC,YAC3B,CAEO,SAAAC,CAAUC,EAAuBC,GACtCtpB,KAAKioB,YAAaoB,GAAiBC,CACrC,CAEO,SAAAC,CAAUF,GACf,OAAOrpB,KAAKioB,YAAaoB,EAC3B,EAGK,SAASX,EAAY1X,GAC1B,MAAMwY,EAA0BxY,GAAM,QAAUA,GAAO,GACvD,OAASA,GAAM,QAASwY,EAAaxY,GAAO,EAC9C,C,2EC7JWyY,EAIAC,E,8CALoB,GAE/B,SAAWD,GACPA,EAAuB,iBAAI,mCAC9B,CAFD,CAEGA,IAASA,EAAO,CAAC,IAEpB,SAAWC,GACPA,EAAe,IAAI,MACnBA,EAAmB,QAAI,SAC1B,CAHD,CAGGA,IAAcA,EAAY,CAAC,I,mBCyJQ,mB,OCpJtC,IAAIhC,EAAiC,KAkF9B,SAASC,IACd,OAAOD,CACT,CAhFwB,IAAI,S,0ECR5B,MAAMiC,EAAiB,aACjBC,EAAe,aACfC,EAAe,aAEd,SAASC,EAAmBC,GACjC,OAAOA,EAAQpY,WAAWgY,EAAgB,KAAKhY,WAAWiY,EAAc,KACrEjY,WAAWkY,EAAc,KAAKjO,QAAQ,MAAO,KAClD,CAEO,SAASoO,EAASC,EAAoBxmB,GAC3C,MACM6kB,EAAqB,GAC3B,IAAK,IAAIriB,EAAI,EAAGA,GAAKgkB,GAAY,IAAIvpB,SAAUuF,EAAG,CAChD,MAAMikB,EAAiBzmB,EAAE0mB,QAAQF,EAAShkB,IACpCmkB,EAAoB3mB,EAAE0K,MAJpB,EAI6B+b,GACrC5B,EAAS9iB,KAAK4kB,GACd9B,EAAS9iB,KAAKykB,EAAShkB,IACvBxC,EAAIA,EAAE6K,UAAU4b,EAAiBD,EAAShkB,GAAGvF,O,CAG/C,OADA4nB,EAAS9iB,KAAK/B,GACP6kB,CACT,CAEO,SAAS+B,EAAU5mB,GAExBA,EADiBmO,EAAMnO,EAAG,KACb,GACb,MAAMyX,EAAW,GAEjB,IAAKoP,KAAKC,MAAMC,cAAc/mB,GAAI,CAChC,MAAMgnB,EAAO7Y,EAAMnO,EAAG,KACtB,IAAK,IAAI5C,EAAI,EAAGA,EAAI4pB,EAAK/pB,SAAUG,EAAG,CAIpC,IAAIsH,GAFJ1E,EADUinB,EAAiBD,EAAK5pB,IAC1Bkc,KAEIoN,QAAQ,KAGlBhiB,GADA1E,EAAIA,EAAE6K,UAAUnG,EAAI,IACdgiB,QAAQ,KAGd,MAAMQ,EAAK/Y,EAFXnO,EAAIA,EAAE6K,UAAU,EAAGnG,GAEC,KACpB,IAAK,MAAM4F,KAAW4c,EACpB,GAAK5c,GAAuB,KAAZA,EAChB,GAAIA,EAAQ8K,WAAW,MAAQ9K,EAAQqI,SAAS,KAAM,CACpD,MAAMwU,EAAeC,EAAY9c,EAAS,EAAG,IAAK,KAC5C+c,EAAU/c,EAAQO,UAAU,EAAGsc,GACrC1P,EAAS1V,KAAKslB,GACd,MAAMC,EAAUhd,EAAQO,UAAUsc,EAAe,GACjDD,EAAGnlB,KAAKulB,E,MACH,GAAIhd,EAAQqI,SAAS,MAAQrI,EAAQid,SAAS,KAAM,CACzD,MAAMC,EAAeC,EAAYnd,EAASA,EAAQrN,OAAS,EAAG,IAAK,KAC7DoqB,EAAU/c,EAAQO,UAAU2c,EAAe,EAAGld,EAAQrN,OAAS,GACrEwa,EAAS1V,KAAKslB,GACd,MAAMC,EAAUhd,EAAQO,UAAU,EAAG2c,GACrCN,EAAGnlB,KAAKulB,E,MACH,GAAIhd,EAAQqI,SAAS,MAAQrI,EAAQqI,SAAS,KAAM,CAGzD,MAAM+U,EAAapd,EAAQO,UAAU,EAAGP,EAAQoc,QAAQ,MAClDiB,EAAard,EAAQO,UAAUP,EAAQsd,YAAY,KAAO,GAE1DC,EAAW,CAACH,EADEpd,EAAQO,UAAU6c,EAAWzqB,OAAS,EAAGqN,EAAQrN,OAAS0qB,EAAW1qB,OAAS,GACvD0qB,GAC3C,IAAK,MAAMG,KAAMD,EACfX,EAAGnlB,KAAK+lB,E,MAEVrQ,EAAS1V,KAAKuI,E,EAItB,OAAOmN,CACT,CAyBO,SAASsQ,EAAaC,GAC3B,MAAMC,EAAQnc,OAAO6D,KAAKuY,IAAIC,KAAKC,UAAUC,mBACvC5Q,EAAgB,GAChB6Q,EAAoB,GAC1B,IAAK,IAAIlrB,EAAI,EAAGA,EAAI6qB,EAAMhrB,OAAQG,IAGhCqa,EAAS1V,KAAK,IAAI8kB,KAAKsB,KAAKI,SAASC,cAAcP,EAAM7qB,KACzD0O,OAAO6D,KAAK8H,EAASra,IAAImL,SAAS/F,IAChC8lB,EAAavmB,KAAK0V,EAASra,GAAGoF,GAAGuhB,GAAG,IAGxC,OAAO,IAAI/c,IAAIghB,EAAkBlN,QAAQ2N,IAASH,EAAa3V,SAAS8V,KAC1E,CAEA,SAASrB,EAAYpnB,EAAWkC,EAAewmB,EAAcC,GAC3D,IAAIvrB,EAAI8E,EACJ/D,EAAQ,EACZ,KAAOf,EAAI4C,EAAE/C,QAAQ,CAInB,GAHI+C,EAAE5C,KAAOsrB,GACXvqB,IAEE6B,EAAE5C,KAAOurB,EAAO,CAClB,GAAc,IAAVxqB,EACF,OAAOf,EACTe,G,CAEFf,G,CAEF,OAAQ,CACV,CAEA,SAASqqB,EAAYznB,EAAWkC,EAAewmB,EAAcC,GAC3D,IAAIvrB,EAAI8E,EACJ/D,EAAQ,EACZ,KAAOf,GAAK,GAAG,CAIb,GAHI4C,EAAE5C,KAAOurB,GACXxqB,IAEE6B,EAAE5C,KAAOsrB,EAAM,CACjB,GAAc,IAAVvqB,EACF,OAAOf,EACTe,G,CAEFf,G,CAEF,OAAQ,CACV,CAEA,SAAS+Q,EAAMnO,EAAW4oB,GACxB,MAAMC,EAAM,GACZ,IAAIC,EAAO,GACPC,EAAc,EACdC,EAAU,EACVC,EAAS,EACTC,EAAQ,EACZ,IAAK,IAAI9rB,EAAI,EAAGA,EAAI4C,EAAE/C,SAAUG,EAAG,CACjC,IAAI0M,EAAI9J,EAAE6K,UAAUzN,EAAGA,EAAI,GAC3B,GAAI0M,GAAK8e,GAAkB,GAAXI,GAA+B,GAAfD,GAA8B,GAAVE,GAAwB,GAATC,EACjEL,EAAI9mB,KAAK+mB,GACTA,EAAO,OACF,CAEL,GADAA,GAAQhf,EACJof,EAAQ,GACD,MAALpf,GAAa1M,EAAI,EAAI4C,EAAE/C,OAAQ,GAC/BG,EACF,MAAM+rB,EAAKnpB,EAAE6K,UAAUzN,EAAGA,EAAI,GAC9B0rB,GAAQK,EACRrf,GAAKqf,C,CAGA,KAALrf,EACI1M,EAAI,GAA8B,MAAzB4C,EAAE6K,UAAUzN,EAAI,EAAGA,KAChC8rB,EAAiB,GAATA,EAAa,EAAI,GACb,KAALpf,IACPkf,EACU,KAALlf,IACLkf,EACU,KAALlf,IACLif,EACU,KAALjf,IACLif,EACU,KAALjf,IACLmf,EACU,KAALnf,KACLmf,C,EAIR,OADAJ,EAAI9mB,KAAK+mB,GACFD,CACT,CAEA,SAAS5B,EAAiBjnB,GACxB,MAAM6oB,EAAMO,EAAgBppB,EAAG,KAC/B,GAAe,MAAX6oB,EAAIQ,IACN,OAAOR,EAET,MAAMzc,EAAIgd,EAAgBppB,EAAG,KAC7B,MAAO,CAACqpB,IAAKR,EAAIQ,IAAKC,OAAQld,EAAEid,IAAK/P,IAAKlN,EAAEkN,IAC9C,CAEA,SAAS8P,EAAgBppB,EAAW8J,GAClC,IAAIuf,EAAM,KAEV,GAAIxC,KAAKC,MAAMyC,SAASvpB,EAAG8J,GAAI,CAC7B,IAAIpF,EAAI1E,EAAE/C,OAAS,EACnB,KAAOyH,EAAI,IACTA,EAAI1E,EAAE4nB,YAAY9d,EAAGpF,EAAI,KACrBA,GAAK,GAA8B,MAAzB1E,EAAE6K,UAAUnG,EAAI,EAAGA,OAI/BA,EAAI,GAAKA,EAAI1E,EAAE/C,OAAS,IAC1BosB,EAAMrpB,EAAE6K,UAAUnG,EAAI,EAAG1E,EAAE/C,OAAS,GACpC+C,EAAIA,EAAE6K,UAAU,EAAGnG,G,CAKvB,OAFW,MAAP2kB,IACFA,EAIJ,SAAkBrpB,GAEhB,OAAI6mB,KAAKC,MAAMC,cAAc/mB,GACpBA,EAEFA,EAAEmY,QAAQ,UAAU,SAASnP,GAClC,OAAQA,GACR,IAAK,MACH,MAAO,KACT,IAAK,MACH,MAAO,KACT,IAAK,MACH,MAAO,KACT,QACE,OAAOA,EAAE6B,UAAU,GAEvB,GACF,CArBU2e,CAASH,EAAIlR,QAAQ,IAAI1R,OAAO,KAAOqD,EAAG,KAAMA,KACjD,CAACuf,IAAKA,EAAK/P,IAAKtZ,EACzB,C,iHC1NO,SAASypB,EAAkBlc,EAAamc,GAC7C,MAAMC,EAAaD,EAAGvX,SAAW5E,EAAMmc,EAAGtP,aAAa,KAAStL,KAAzB4a,CAA+Bnc,GAEhEqc,GAAc,QAAmBD,GAEjCE,EAAO,MAAO,GAAI,CAACC,MAAO,CAACC,MAAO,IAAKC,OAAQ,OACrDC,SAASC,gBAAgBC,YAAYN,GACrC,IACE,MAAMhE,EAAS,IAAIuE,QAAQC,OAAOR,EAAM,CAACS,UAAU,IACnDzE,EAAO0E,QAAQX,GAEf,MAAMY,EAAU3E,EAAO4E,YAAW,GAC5BC,EAAY9rB,KAAK+rB,MAA8B,IAAxB9E,EAAO+E,gBAAwB,IACtDC,EAAOjsB,KAAK+rB,MAA8C,IAAxC9E,EAAOiF,0BAAyB,IAAe,IACvE,MAAO,CACL,QAAWN,EAAQrS,QAAQ,SAAU,IAAIA,QAAQ,WAAY,IAC7D,mBAAoBuS,EACpB,yBAA0BG,E,SAG5B,IAAEhB,GAAMkB,QACRlB,EAAKmB,Q,CAET,C,uBClCA9H,EAAO3D,QAAU0L,C,uBCAjB/H,EAAO3D,QAAU2L,E,uBCAjBhI,EAAO3D,QAAU4L,I,uBCAjBjI,EAAO3D,QAAU6L,E,uBCAjBlI,EAAO3D,QAAU8L,E,GCCbC,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBvd,IAAjBwd,EACH,OAAOA,EAAalM,QAGrB,IAAI2D,EAASoI,EAAyBE,GAAY,CAGjDjM,QAAS,CAAC,GAOX,OAHAmM,EAAoBF,GAAUnmB,KAAK6d,EAAO3D,QAAS2D,EAAQA,EAAO3D,QAASgM,GAGpErI,EAAO3D,OACf,CCrBAgM,EAAoBhpB,EAAK2gB,IACxB,IAAIyI,EAASzI,GAAUA,EAAO1D,WAC7B,IAAO0D,EAAiB,QACxB,IAAM,EAEP,OADAqI,EAAoBzL,EAAE6L,EAAQ,CAAElQ,EAAGkQ,IAC5BA,CAAM,ECLdJ,EAAoBzL,EAAI,CAACP,EAASqM,KACjC,IAAI,IAAI9P,KAAO8P,EACXL,EAAoBM,EAAED,EAAY9P,KAASyP,EAAoBM,EAAEtM,EAASzD,IAC5EhQ,OAAOggB,eAAevM,EAASzD,EAAK,CAAEiQ,YAAY,EAAMhjB,IAAK6iB,EAAW9P,IAE1E,ECNDyP,EAAoBM,EAAI,CAACljB,EAAKqjB,IAAUlgB,OAAO+U,UAAUoL,eAAe5mB,KAAKsD,EAAKqjB,GCClFT,EAAoBnf,EAAKmT,IACH,oBAAX2M,QAA0BA,OAAOC,aAC1CrgB,OAAOggB,eAAevM,EAAS2M,OAAOC,YAAa,CAAEtuB,MAAO,WAE7DiO,OAAOggB,eAAevM,EAAS,aAAc,CAAE1hB,OAAO,GAAO,E,+GCwCvD,MAAMuuB,EAAW,YAAaC,QAAQ,msvBAgC7CD,EAASxW,QAAQ4B,IAAI,SAAUzB,SAAS,OAAQuW,WAAY,cAAetY,MAAMnT,KAAK,IAAI2f,WAAW,OC7ErG,IAAI+L,EAAwC,SAAUC,EAASC,EAAYC,EAAGC,GAE1E,OAAO,IAAKD,IAAMA,EAAIE,WAAU,SAAUC,EAASC,GAC/C,SAASC,EAAUlvB,GAAS,IAAMmvB,EAAKL,EAAUM,KAAKpvB,GAAS,CAAE,MAAOkiB,GAAK+M,EAAO/M,EAAI,CAAE,CAC1F,SAASmN,EAASrvB,GAAS,IAAMmvB,EAAKL,EAAiB,MAAE9uB,GAAS,CAAE,MAAOkiB,GAAK+M,EAAO/M,EAAI,CAAE,CAC7F,SAASiN,EAAKhpB,GAJlB,IAAenG,EAIamG,EAAOmpB,KAAON,EAAQ7oB,EAAOnG,QAJ1CA,EAIyDmG,EAAOnG,MAJhDA,aAAiB6uB,EAAI7uB,EAAQ,IAAI6uB,GAAE,SAAUG,GAAWA,EAAQhvB,EAAQ,KAIjBuvB,KAAKL,EAAWG,EAAW,CAC7GF,GAAML,EAAYA,EAAUU,MAAMb,EAASC,GAAc,KAAKQ,OAClE,GACJ,EAIA,MAAMK,EAAmB,IACnBC,EAAoB,MACpBC,EAAS7Z,QAAQ8Z,IAAIpJ,KAAK1Q,SAC1B+Z,EAAU/Z,QAAQqO,KAAKqC,KAAK1Q,SAC5Bga,EAAUha,QAAQC,KAAKyQ,KAAK1Q,SAC5Bia,EAAWja,QAAQiQ,MAAMS,KAAK1Q,SACvBka,EAAQ,CAAC,EAChBC,EAAmB,aACnBC,EAAc,OACdC,EAAmB,YACnBC,EAAc,OACdC,EAAgB,CAAC,EAChB,IAAIC,EACJ,IAAIC,GACX,SAAWA,GAKPA,EAAOC,QAJP,SAAiBxwB,EAAOkB,GACpB,GAAa,MAATlB,EACA,MAAM,IAAIN,MAAM,GAAW,MAARwB,EAAe,QAAUA,gBACpD,CAEH,CAND,CAMGqvB,IAAWA,EAAS,CAAC,IACjB,MAAME,EACT,WAAAlyB,CAAYmyB,EAAgBC,GACxBjyB,KAAKgyB,gBAAiB,EACtBhyB,KAAKiyB,QAAS,OACSvgB,IAAnBsgB,IACAhyB,KAAKgyB,eAAiBA,QACXtgB,IAAXugB,IACAjyB,KAAKiyB,OAASA,EACtB,EAGG,MAAMC,EACT,WAAAryB,CAAYsyB,EAAU3vB,EAAM4vB,EAAMC,GAC9B,IAAIzP,EACJ5iB,KAAKmyB,SAAWA,EAChBnyB,KAAKwC,KAAOA,EACZ6vB,UAAoDA,EAAU,CAAC,GACpC,QAA1BzP,EAAKyP,EAAQC,eAA4B,IAAP1P,IAAsByP,EAAQC,QAAUvB,GAC3E/wB,KAAKqyB,QAAUA,EACfryB,KAAKoyB,KAAO,IAAMpC,EAAUhwB,UAAM,OAAQ,GAAQ,YAC9C,OAAO,IAAIqwB,SAAQ,CAACC,EAASC,IAAWP,EAAUhwB,UAAM,OAAQ,GAAQ,YACpE,IAAIyH,EAAS,GACb,IACIA,QAAe2qB,GACnB,CACA,MAAO5O,GACH+M,EAAO/M,EACX,CACA8M,EAAQ7oB,EACZ,KACJ,GACJ,EA0BG,SAAS2qB,EAAK5vB,EAAM4vB,EAAMC,GACC3gB,MAA1B4f,EAAMM,KACNN,EAAMM,GAAmB,CAAC,GACMlgB,MAAhC4f,EAAMM,GAAiBN,QACvBA,EAAMM,GAAiBN,MAAQ,IACnCA,EAAMM,GAAiBN,MAAM9rB,KAAK,IAAI0sB,EAAKN,EAAiBpvB,EAAM4vB,EAAMC,GAC5E,CAEO,SAASE,EAAOC,EAAQC,GAAW,EAAMpL,GAK5C,GAHIA,EADAA,EACQ,GAAGA,MAEH,GACRmL,IAAWC,EACX,MAAM,IAAIzxB,MAAM,GAAGqmB,cAAkBoL,YAAmBD,KAChE,CACO,SAASE,EAAYF,EAAQC,EAAUE,EAAY,KAAOtL,GAC7D,GAAKmL,IAAWI,OAAOC,mBAAqBJ,IAAaG,OAAOC,mBAC3DL,IAAWI,OAAOE,mBAAqBL,IAAaG,OAAOE,mBAC3DN,IAAWI,OAAOG,KAAON,IAAaG,OAAOG,KAASnlB,MAAM4kB,IAAW5kB,MAAM6kB,GAC9E,OACJ,MAAMO,EAAW3wB,KAAK8d,IAAIqS,EAASC,GAAYE,EAE/C,GADAJ,EAAOS,GAAU,EAAM,GAAG3L,QAAqCA,EAAQ,mBAAmBsL,OACrFK,EACD,MAAM,IAAIhyB,MAAM,YAAYyxB,UAAiBD,kBAAuBG,KAC5E,CAuBO,SAASM,EAAaT,EAAQC,GACjC,IAAK,MAAOS,EAAaC,KAAkB5jB,OAAO+P,QAAQmT,GAAW,CACjE,IAAKD,EAAO9C,eAAewD,GACvB,MAAM,IAAIlyB,MAAM,sBAAsBkyB,gBAC1C,MAAME,EAAcZ,EAAOU,GAC3B,GAAIE,aAAuB3b,OAAS0b,aAAyB1b,MACzD4b,EAAYD,EAAaD,QACxB,GAAIC,aAAuB7jB,QAAU4jB,aAAyB5jB,OAC/D0jB,EAAaG,EAAaD,QACzB,GAAIP,OAAOU,SAASF,IAAgBR,OAAOU,SAASH,GACrDT,EAAYU,EAAaD,QACxB,GAAIC,GAAeD,EACpB,MAAM,IAAInyB,MAAM,aAAamyB,eAA2BD,YAAsBE,KACtF,CACJ,CACO,SAASC,EAAYb,EAAQC,GAChC,MAAMc,EAAef,EAAO9xB,OACtB8yB,EAAiBf,EAAS/xB,OAChC,GAAI6yB,GAAgBC,EAChB,MAAM,IAAIxyB,MAAM,0DAA0DuyB,kCACtCC,KAExC,IAAK,IAAI3yB,EAAI,EAAGA,EAAI0yB,EAAc1yB,IAC9B,GAAI2xB,EAAO3xB,aAAc4W,OAASgb,EAAS5xB,aAAc4W,MACrD4b,EAAYb,EAAO3xB,GAAI4xB,EAAS5xB,SAC/B,GAAI2xB,EAAO3xB,aAAc0O,QAAUkjB,EAAS5xB,aAAc0O,OAC3D0jB,EAAaT,EAAO3xB,GAAI4xB,EAAS5xB,SAChC,GAAI2xB,EAAO3xB,IAAM4xB,EAAS5xB,GAC3B,MAAM,IAAIG,MAAM,YAAYyxB,EAAS5xB,kBAAkBA,UAAU2xB,EAAO3xB,KAEpF,CAEO,SAASsxB,EAASA,EAAUsB,EAAQpB,GACvC,IAAIzP,EACJgP,EAAkBO,EAClBsB,IACInC,EAAMM,KACNN,EAAMM,GAAiB/sB,MAAmF,QAA1E+d,EAAKyP,aAAyC,EAASA,EAAQxtB,aAA0B,IAAP+d,GAAgBA,EAClI0O,EAAMM,GAAiBU,QAAUD,aAAyC,EAASA,EAAQC,QAEnG,CAEO,SAASoB,EAAOA,GACWhiB,MAA1B4f,EAAMM,KACNN,EAAMM,GAAmB,CAAC,GAC9BN,EAAMM,GAAiB8B,OAASA,CACpC,CAEO,SAASC,EAAMA,GACYjiB,MAA1B4f,EAAMM,KACNN,EAAMM,GAAmB,CAAC,GAC9BN,EAAMM,GAAiB+B,MAAQA,CACnC,CACA,SAASC,EAAanwB,EAAGggB,GACrB,OAAOhgB,EAAEmY,QAAQ,IAAI1R,OAAOuZ,EAAEjhB,KAAM,MAAOihB,EAAEoQ,OACjD,CAyOA,SAASC,EAAUC,GACf,MAAO,GAAGA,EAAE/vB,eAAe+vB,EAAEjR,MAAQ,SAAUkR,oBAAoBD,EAAEjR,OAAS,IAClF,CACA,SAASmR,EAAS1N,EAAG2N,EAAWC,EAAMC,EAAiBC,EAAaC,GAChE,IAAI1R,EAAI2R,EAAIC,EAAIC,EAAIC,EAAIC,EACxB,OAAO3E,EAAUhwB,UAAM,OAAQ,GAAQ,YAEnC,IAAI6P,EADJskB,EAAKzzB,OAAS,EAEd,IAAIuU,EAAO,UACX,MAAMsJ,EAAsB7M,MAAbwiB,GAA2B3N,EAAE/jB,KAAKgM,gBAAkB0lB,EAAU1lB,cACvEomB,GAA6B,QAApBhS,EAAK2D,EAAE8L,eAA4B,IAAPzP,OAAgB,EAASA,EAAGiS,aAAetW,EAChFsW,EAAatW,EAAS,UAAiC,QAApBgW,EAAKhO,EAAE8L,eAA4B,IAAPkC,OAAgB,EAASA,EAAGM,WAC5FD,GACD3D,EAAO,WAAW1K,EAAE4L,YAAY5L,EAAE/jB,QACtC,MAAMmD,EAAQmvB,KAAKC,MACnB,IACI,GAAIH,EACA/kB,EAAI,CAAEmlB,SAAS,EAAMvtB,OAAQotB,EAAYI,GAAI,EAAGC,SAAS,OACxD,CACD,IAAIC,GAAiC,QAApBX,EAAKjO,EAAE8L,eAA4B,IAAPmC,OAAgB,EAASA,EAAGlC,WAAavB,GAClFqD,EAAkBA,EAAuC,QAApBK,EAAKlO,EAAE8L,eAA4B,IAAPoC,OAAgB,EAASA,EAAGnC,QACjG6C,EAAW,OAAQC,eAAiBD,IAAapE,EAAmBC,EAAoBmE,EACxFtlB,EAAI,CAAEmlB,SAAS,EAAMvtB,OAAmD,QAA1CitB,QAAWpC,EAAQ/L,EAAE6L,KAAM+C,UAA8B,IAAPT,EAAgBA,EAAK,KAAMO,GAAI,EAAGC,SAAS,EAC/H,CACJ,CACA,MAAOnB,GACHlkB,EAAI,CAAEmlB,SAAS,EAAOvtB,OAAQqsB,EAAUC,GAAIkB,GAAI,EAAGC,SAAS,EAChE,CACA,IAA0B,QAApBP,EAAKpO,EAAE8L,eAA4B,IAAPsC,OAAgB,EAASA,EAAGU,eAAiBxlB,EAAEpI,OAAO5H,cAAgB,YAAc,CAClH,MAAM2U,EAAM3E,EAAEpI,OAAO+M,IAAI,WAIzB,GAHAS,EAAO,OACHT,IACA3E,EAAEmlB,QAAUxgB,EAAIiC,MAAM6e,MAAQ9gB,EAAI9T,SACjC4zB,EAAS,CACV,MAAMiB,EAAK1lB,EAAEpI,OACb8tB,EAAGlc,QAAQoV,OAAO,SAClB8G,EAAGC,KAAKC,aAAa5lB,GAAMA,EAAErD,IAAI,aACjCqD,EAAEpI,OAAS8tB,CACf,CACA1lB,EAAEpI,OAASoI,EAAEpI,OAAOiuB,OACxB,CAOA,GANA7lB,EAAEskB,KAAOA,EAAKtY,KAAK,MACnBhM,EAAEolB,GAAKH,KAAKC,MAAQpvB,EACfivB,GACD3D,EAAO,YAAY1K,EAAE4L,YAAY5L,EAAE/jB,YAAYqN,EAAEolB,SACrDplB,EAAEsiB,SAAW5L,EAAE4L,SACftiB,EAAErN,KAAO+jB,EAAE/jB,MACN+b,EAAQ,CACT,IAAIoX,EAAS,CAAE,QAAW9lB,EAAEmlB,QAAS,OAAUnlB,EAAEpI,OAAQ,GAAMoI,EAAEolB,GAAI,QAAWplB,EAAEqlB,QAC9E,KAAQjgB,EAAMof,cAAa,SAAY9N,EAAE4L,SAAU,KAAQ5L,EAAE/jB,KAAM,KAAQqN,EAAEskB,MACjF,GAAItkB,EAAEpI,OAAO5H,aAAe0P,OAAQ,CAChC,MAAM+N,EAAM/N,OAAO6D,KAAKvD,EAAEpI,QAAQmuB,QAAO,CAACC,EAAK5vB,IAAOsJ,OAAOumB,OAAOvmB,OAAOumB,OAAO,CAAC,EAAGD,GAAM,CAAE,CAAC,UAAY5vB,GAAI4J,EAAEpI,OAAOxB,MAAQ,CAAC,GACjI0vB,EAASpmB,OAAOumB,OAAOvmB,OAAOumB,OAAO,CAAC,EAAGH,GAASrY,EACtD,CACA,MAASyY,MAAM,GAAG1B,MAAgB9N,EAAE4L,aAAa5L,EAAE/jB,OAAQmzB,EAAQ,QAAQ1gB,KAAQof,MAAgB9N,EAAE4L,aAAa5L,EAAE/jB,OACxH,CACA,OAAOqN,CACX,GACJ,CAEO,SAASmmB,EAAMf,GAClB,OAAOjF,EAAUhwB,UAAM,OAAQ,GAAQ,kBAC7B,IAAIqwB,SAASxgB,GAAMomB,WAAWpmB,EAAGolB,IAC3C,GACJ,CAmBA,SAAS3C,EAAQ4D,EAAMC,GACnB,OAAOnG,EAAUhwB,UAAM,OAAQ,GAAQ,YACnC,IAAIsyB,EAAU,KACd,MAAM8D,EAAiB,IAAI/F,SAAQ,CAACgG,EAAG9F,KACnC+B,EAAU2D,YAAW,KAEjB1F,EAAO,oBAAoB,GAC5B4F,EAAY,IAEnB,IACI,aAAa9F,QAAQiG,KAAK,CAACJ,IAAQE,GACvC,CACA,QACQ9D,GACAiE,aAAajE,EACrB,CACJ,GACJ,CAkCc,YAAakE,YAAY,CAAC,SAAUC,YAAY,MAAO,CAAC,OAAQ,OAAQ,W,aCtiBtFtE,EAAS,QAAQ,KA0Cf,MAaMuE,EAA0B,CAC9B,CAAC,gBAAiB,IAAK,IAAK,IAAK,IAAK,KACtC,CAAC,gBAAiB,gBAAiB,IAAK,IAAK,KAC7C,CAAC,MAAO,MAAO,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAC5D,CAAC,IAAK,SAAU,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAC7D,CAAC,QAAS,SAAU,OAAQ,IAAK,IAAK,MAGlCC,EAAmB,CACvB,kBAAmB,6BAA8B,iCACjD,qBAAsB,6BAExBvE,EAAK,aAAa5pB,UAChB,MAAMouB,EAAkB,CACtB,CAAC,MAAO,OAAQ,MAAO,IAAK,IAAK,KAAM,YAAa,WAAY,MAAO,KAAM,IAAK,WAClF,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAC/B,CAAC,IAAK,IAAK,IAAK,IAAK,KACrB,CAAC,IAAK,IAAK,IAAK,MAEZC,EAAc,CAClB,gFAEA,2IACA,0FACA,6BAEF,IAAK,IAAIC,EAAM,EAAGA,EAAMD,EAAYn2B,SAAUo2B,EAAK,CACjD,MAAMC,EAAa,IAAItsB,KAAI,QAAUosB,EAAYC,KAC3CE,EAAevf,MAAMnT,KAAKyyB,GAChCxE,EAAO0E,KAAKC,UAAUF,GAAeC,KAAKC,UAAUN,EAAgBE,I,KA1ChD,CAEtB,mFAEA,uDAEA,gDAEA,+CAEA,+CAmCc9qB,SAAQ,CAAC4f,EAAM/qB,KAC7BuxB,EAAKuE,EAAiB91B,IAAI2H,UACxB,MAAM2uB,GAAgB,QAAUvL,GAChCuL,EAAcC,OACd,MAAM3E,EAAWiE,EAAwB71B,GACzC4xB,EAAS2E,OACT/D,EAAY8D,EAAe1E,EAAS,GACpC,GACF,I,aCvGG,MAAM4E,EAAmB,YAE1BC,EAAyB,CAAEC,SAAU,CAAC,wBAAyBC,QAAS,IAC9E,IAAIC,EAAyBpH,QAAQC,UAC9B9nB,eAAekvB,IAClB,IAAIpa,EAUJ,OATAma,EAAyBA,EAAuB5G,MAAKroB,UACjD,MAAMmvB,QAAe,OAAUC,gBAAgBC,SAASR,EAAkB,YAAY,GACtF/Z,EAAMqa,EAASV,KAAKa,MAAMH,GAAU,CAAEH,QAAS,GAAID,SAAU,IAE7Dja,EAAIka,QAAUla,EAAIka,mBAAmB/f,MAAQ6F,EAAIka,QAAU,GAC3Dla,EAAIia,SAAWja,EAAIia,oBAAoB9f,MAAQ6F,EAAIia,SAAW,GAC9DngB,QAAQ2gB,MAAM,8BAA8Bd,KAAKC,UAAU5Z,OAAK5L,EAAW,KAAK,UAE9E+lB,EACCna,CACX,CACO9U,eAAewvB,EAAmB12B,GACrCm2B,EAAyBA,EAAuB5G,MAAKroB,UACjD4O,QAAQ2gB,MAAM,8BAA8Bd,KAAKC,UAAU51B,OAAOoQ,EAAW,YACvE,OAAUkmB,gBAAgBK,UAAUZ,EAAkB,WAAYJ,KAAKC,UAAU51B,IAAQ,EAAK,UAElGm2B,CACV,CAEOjvB,eAAe0vB,UACZF,EAAmBV,EAC7B,CCdAnF,EAAS,gBAAgB,KACvB,IAAIgG,EAEAC,EAEJ1E,GAAOlrB,UACL2vB,QAAyB,UACzBC,QAAwBV,UAGlBQ,UACAC,EAAiBE,eAAc,EAAK,IAG5C1E,GAAMnrB,gBACEwvB,EAAmBI,SACnBD,EAAiBE,eAAc,EAAK,IAG5C,MAAM/G,EAAoE,CACxE,cAAiB,CACfc,KAAM,2DACNkG,IAAK,IAAI7tB,KAEX,WACE,CACE2nB,KAAM,8DACNkG,IAAK,IAAI7tB,IAAY,CAAC,cAI5B,IAAK,MAAO8tB,EAAU1I,KAAatgB,OAAO+P,QAAQgS,GAChDc,EAAKmG,GAAU/vB,UACbgwB,EAAkB3I,EAASuC,KAAMvC,EAASyI,IAAI,IAIlD,SAASE,EAAkBC,EAAuBC,GAChD,MAAMjN,GAA8B,QAAUgN,GAE9CxF,GADkC,QAAaxH,GACpBiN,EAC7B,K,ICtDSC,E,2BCQXxG,EAAS,aAAa,KACpBC,EAAK,eAAe5pB,gBAGtBA,iBACE,MAAM+sB,QAAyB,OAAUqD,MAAMC,QAAQ,yDACjDC,EAA6BvD,EAAGwD,OAAO,QAEvCC,EAAmB,QAAWC,aAAa1D,SLyd5C,SAAoB2D,EAAc7R,EAAQ,mBAAoB8R,EAAO,IAAKC,EAAW,IACxF,OAAOpJ,EAAUhwB,UAAM,OAAQ,GAAQ,YACnC,OAAO,IAAIqwB,SAAQ,CAACC,EAASC,KACzB0F,YAAW,KACPoD,cAAcC,GACd/I,EAAO,IAAIvvB,MAAMqmB,GAAO,GACzB8R,GAEH,MAAMG,EAAaC,aAAY,KACvBL,MACAG,cAAcC,GACdhJ,IACJ,GACD8I,EAAS,GAEpB,GACJ,CKxeQI,EAAW,IACR,IAAER,EAAGS,MAAM9wB,KAAK,mBAAmBjI,OAAS,GAClD,8BAA+B,KAElC6xB,EAAOuG,EAAQxiB,QAAS,UAAWC,eACnCgc,EAAOuG,EAAQzjB,OAAO,OAAQC,OAAQ,KAAS/C,MAC/CggB,EAAOuG,EAAQzjB,OAAO,OAAQoE,eAAgB,QAE9C,MAAMigB,EAAgCZ,EAAQzjB,OAAO,+BACrD,GAAMqkB,EAAuB,CAC3B,MAAMC,EAAyB1C,KAAKa,MAAM4B,GACpC/W,EAAM,IAAI3hB,MAAM24B,EAA2B,SAEjD,MADAhX,EAAIG,MAAQ6W,EAAyB,MAC/BhX,C,CAEV,CAvB0CiX,EAAkB,GAAI,IDRhE,SAAWjB,GACPA,EAAgB,KAAI,QACpBA,EAAUA,EAA+B,oBAAI,GAAK,sBAClDA,EAAUA,EAAgC,qBAAI,GAAK,uBACnDA,EAAUA,EAAyB,cAAI,GAAK,gBAC5CA,EAAUA,EAAiC,sBAAI,GAAK,wBACpDA,EAAUA,EAAyB,cAAI,GAAK,gBAC5CA,EAAUA,EAAqB,UAAI,GAAK,YACxCA,EAAUA,EAA0B,eAAI,KAAO,iBAC/CA,EAA0B,eAAI,SAC9BA,EAAiC,sBAAI,MACrCA,EAAe,IAAI,QACtB,CAZD,CAYGA,IAAcA,EAAY,CAAC,IEdvB,MAAMkB,EACT,WAAAh6B,CAAYi6B,GACR95B,KAAKuE,KAAKu1B,EACd,CAEA,IAAAv1B,CAAKu1B,GACD95B,KAAK85B,YAAcA,EAAYle,QAAQ,MAAO,IAC9C5b,KAAK+5B,gBAAaroB,EAClB1R,KAAKg6B,gBAAatoB,EAClB1R,KAAKi6B,gBAAavoB,EAClB1R,KAAKk6B,gBAAaxoB,EAClB1R,KAAKm6B,wBAAqBzoB,EAC1B1R,KAAKo6B,yBAAsB1oB,CAC/B,CAEA,aAAI2oB,GAGA,YAFwB3oB,IAApB1R,KAAK+5B,YACL/5B,KAAKs6B,uBACFt6B,KAAK+5B,UAChB,CAEA,aAAIQ,GAGA,YAFwB7oB,IAApB1R,KAAKi6B,YACLj6B,KAAKs6B,uBACFt6B,KAAKi6B,UAChB,CAEA,KAAIlG,GACA,IAAInR,EAEJ,OADmC,QAAlCA,EAAK5iB,KAAKm6B,0BAAuC,IAAPvX,IAAsB5iB,KAAKm6B,mBAAqBn6B,KAAKw6B,wBACzFx6B,KAAKm6B,mBAAmBpG,CACnC,CAGA,KAAI0G,GACA,IAAI7X,EAEJ,OADmC,QAAlCA,EAAK5iB,KAAKm6B,0BAAuC,IAAPvX,IAAsB5iB,KAAKm6B,mBAAqBn6B,KAAKw6B,wBACzFx6B,KAAKm6B,mBAAmBM,CACnC,CAGA,KAAIC,GACA,IAAI9X,EAEJ,OADmC,QAAlCA,EAAK5iB,KAAKm6B,0BAAuC,IAAPvX,IAAsB5iB,KAAKm6B,mBAAqBn6B,KAAKw6B,wBACzFx6B,KAAKm6B,mBAAmBO,CACnC,CAEA,aAAIC,GACA,IAAI/X,EAEJ,OAD2B,QAA1BA,EAAK5iB,KAAKg6B,kBAA+B,IAAPpX,IAAsB5iB,KAAKg6B,WAAah6B,KAAK46B,kBACzE56B,KAAKg6B,UAChB,CACA,sBAAIa,GACA,IAAIjY,EAEJ,OADoC,QAAnCA,EAAK5iB,KAAKo6B,2BAAwC,IAAPxX,IAAsB5iB,KAAKo6B,oBAAsBp6B,KAAK86B,wBAC3F96B,KAAKo6B,mBAChB,CACA,aAAIW,GACA,IAAInY,EAEJ,OAD2B,QAA1BA,EAAK5iB,KAAKk6B,kBAA+B,IAAPtX,IAAsB5iB,KAAKk6B,WAAal6B,KAAKg7B,kBACzEh7B,KAAKk6B,UAChB,CACA,oBAAAI,GACI,MAAM,UAAED,EAAS,UAAEE,GAAcv6B,KAAKi7B,yBACtCj7B,KAAK+5B,WAAaM,EAClBr6B,KAAKi6B,WAAaM,CACtB,CACA,gBAAAW,CAAiBpE,GAEb,MAAQ92B,KAAKm7B,aAAarE,MACpBA,EAEN,KAAO92B,KAAKm7B,aAAarE,MACnBA,EACN,OAAOA,CACX,CACA,yBAAAsE,CAA0BC,EAAcC,GACpC,IAAIxE,EAAMuE,EACV,MAAME,EAAgBv7B,KAAKm7B,aAAarE,GAAOwE,EAAeA,EAAe,EAC7E,IAAK,IAAIz6B,EAAI,EAAGA,EAAI06B,EAAe16B,IAC/Bi2B,EAAM92B,KAAKk7B,iBAAiBpE,GAChC,OAAOA,CACX,CACA,cAAA8D,GACI,MAAMP,EAAYr6B,KAAKq6B,UACjBM,EAAY,IAAIljB,MAAM4iB,GAC5B,IAAIvD,EAAM92B,KAAKw7B,kBACf,IAAK,IAAI36B,EAAI,EAAGA,EAAIw5B,EAAWx5B,IAC3Bi2B,EAAM92B,KAAKy7B,mBAAmB3E,GAC9B6D,EAAU95B,GAAKb,KAAK07B,cAAc5E,GAClCA,EAAM92B,KAAK27B,eAAe7E,GAE9B,OAAO6D,CACX,CAEA,oBAAAH,GACI,MAAMzG,EAAI,IAAIzoB,aAAatL,KAAKq6B,WAC1BI,EAAI,IAAInvB,aAAatL,KAAKq6B,WAC1BK,EAAI,IAAIpvB,aAAatL,KAAKq6B,WAChC,IAAIvD,EAAM92B,KAAKw7B,kBACf,IAAK,IAAI36B,EAAI,EAAGA,EAAIb,KAAKq6B,UAAWx5B,IAAK,CACrCi2B,EAAM92B,KAAK47B,kBAAkB9E,GAC7B,IAAK,MAAM+E,IAAQ,CAAC9H,EAAG0G,EAAGC,GACtBmB,EAAKh7B,GAAKb,KAAK87B,gBAAgBhF,GAC/BA,EAAM92B,KAAKk7B,iBAAiBpE,GAEhCA,EAAM92B,KAAK27B,eAAe7E,EAC9B,CACA,MAAO,CAAE/C,EAAGA,EAAG0G,EAAGA,EAAGC,EAAGA,EAC5B,CACA,oBAAAI,GACI,MAAMiB,EAAkB,IAAItkB,MAAMzX,KAAKu6B,WACvC,IAAIzD,EAAM92B,KAAKg8B,kBACf,IAAK,IAAIn7B,EAAI,EAAGA,EAAIb,KAAKu6B,UAAW15B,IAAK,CACrCi2B,EAAM92B,KAAKi8B,0BAA0BnF,GACrC,MAAMoF,EAAO,IAAIja,YAAY,GAC7Bia,EAAK,GAAKl8B,KAAKm8B,cAAcrF,GAC7BA,EAAM92B,KAAKk7B,iBAAiBpE,GAC5BoF,EAAK,GAAKl8B,KAAKm8B,cAAcrF,GAC7BiF,EAAgBl7B,GAAKq7B,EACrBpF,EAAM92B,KAAK27B,eAAe7E,EAC9B,CACA,OAAOiF,CACX,CACA,cAAAf,GACI,MAAMT,EAAYv6B,KAAKu6B,UACjBQ,EAAY,IAAI9Y,YAAYsY,GAClC,IAAIzD,EAAM92B,KAAKg8B,kBACf,IAAK,IAAIn7B,EAAI,EAAGA,EAAI05B,EAAW15B,IAC3Bi2B,EAAM92B,KAAKo8B,mBAAmBtF,GAC9BiE,EAAUl6B,GAAKb,KAAKm8B,cAAcrF,GAClCA,EAAM92B,KAAK27B,eAAe7E,GAE9B,OAAOiE,CACX,CAEA,YAAAI,CAAarE,GACT,MAAM9N,EAAShpB,KAAK85B,YAAYhD,GAChC,MAAkB,MAAX9N,GAA6B,OAAXA,CAC7B,CACA,cAAA2S,CAAe7E,GACX,MAA8B,OAA1B92B,KAAK85B,YAAYhD,GACV92B,KAAK85B,YAAY3P,QAAQ,KAAM2M,GAAO,EAEtCA,EAAM,CACrB,CACA,eAAAgF,CAAgBO,GACZ,OAAOr8B,KAAKs8B,kBAAkBC,WAAYF,EAC9C,CACA,aAAAF,CAAcE,GACV,OAAOr8B,KAAKs8B,kBAAkBzuB,SAAUwuB,EAC5C,CACA,iBAAAC,CAAkBE,EAAgBH,GAC9B,IAAIz2B,EAAMy2B,EAAc,EACxB,MAAQr8B,KAAKm7B,aAAav1B,MACpBA,EAEN,OADc42B,EAAex8B,KAAK85B,YAAYxrB,UAAU+tB,EAAaz2B,GAEzE,EC5JG,MAAM62B,UAA2B5C,EACpC,WAAAh6B,CAAY68B,GACRrxB,MAAMqxB,GACN18B,KAAKuE,KAAKm4B,EACd,CACA,IAAAn4B,CAAKm4B,GACDrxB,MAAM9G,KAAKm4B,EACf,CACA,aAAAhB,CAAc5E,GACV,IAAI6F,EAAQ7F,EACRlxB,EAAM+2B,EAQV,OAPI38B,KAAK48B,QAAQD,IACb/2B,EAAM5F,KAAK68B,qBAAqBF,GAChCA,KAGA/2B,EAAM5F,KAAK85B,YAAY3P,QAAQ,IAAKvkB,GAEjC5F,KAAK85B,YAAYxrB,UAAUquB,EAAO/2B,EAC7C,CACA,OAAAg3B,CAAQ9F,GACJ,MAAMgG,EAAS98B,KAAK85B,YAAYhD,GAAK5nB,WAAW,GAChD,OCtBe,KDsBR4tB,GCvBQ,KDuBcA,CACjC,CACA,oBAAAD,CAAqB/F,GACjB,MAAMiG,EAAM/8B,KAAK85B,YAAYhD,GAC7B,OAAOiG,EAAM/8B,KAAK85B,YAAY3P,QAAQ4S,EAAKjG,EAAM,IAAM,CAC3D,CACA,OAAAkG,GACI,OAAOh9B,KAAKi9B,mBAAkB,CAACtvB,EAAMmpB,KACjC,OC9BW,KD8BJnpB,GC/BI,KD+BgBA,GChCtB,KDiCAA,MElCOuvB,EFkCgBl9B,KAAK85B,YAAY5qB,WAAW4nB,EAAM,IEjCnD,IAAMoG,EAAW,IAC/BA,EAAW,IAAMA,EAAW,KAF9B,IAAiBA,CFkCsD,GAE1E,CAEA,UAAAC,GACI,OAAOn9B,KAAKi9B,mBAAmBtvB,GCvCtB,KDwCEA,GCpCK,KDoCSA,GAE7B,CAEA,iBAAAsvB,CAAkBG,GACd,MAAM/C,EAAYr6B,KAAKq6B,UACvB,IAAIvD,EAAM92B,KAAKw7B,kBACf,IAAK,IAAI36B,EAAI,EAAGA,EAAIw5B,EAAWx5B,IAAK,CAGhC,GAFAi2B,EAAM92B,KAAKy7B,mBAAmB3E,GAE1BsG,EADSp9B,KAAK85B,YAAY5qB,WAAW4nB,GACrBA,GAChB,OAAO,EACXA,EAAM92B,KAAK27B,eAAe7E,EAC9B,CACA,OAAO,CACX,EGrDG,MAAMuG,UAA0BZ,EACnC,WAAA58B,CAAY68B,GACRrxB,MAAMqxB,EACV,CACA,YAAAY,GACI,MAAMC,EAAev9B,KAAKw7B,kBACpB51B,EAAM5F,KAAKg8B,kBACjB,OAAOh8B,KAAK85B,YAAYxrB,UAAUivB,EAAc33B,GAAKgM,MAAM,MAAMzD,MAAM,EAAGnO,KAAKq6B,UACnF,CACA,YAAAmD,GACI,MAAMC,EAAez9B,KAAKg8B,kBAC1B,OAAOh8B,KAAK85B,YAAYxrB,UAAUmvB,GAAc7rB,MAAM,MAAMzD,MAAM,EAAGnO,KAAKu6B,UAC9E,CACA,yBAAAmD,GACI,MAAMvsB,EAAM,IAAIwsB,IACVC,EAAQ59B,KAAK85B,YAAYloB,MAAM,MACjBgsB,EAAMrf,QAAQsf,GAASA,EAAKhlB,WAAW8f,EAAUmF,kBACzD9xB,SAAS6xB,IACjB,MAAME,EAAsB/9B,KAAKg+B,uBAAuBH,GACxD,IAAK,MAAOte,EAAKje,KAAUy8B,EAAqB,CAC5C,GAAI5sB,EAAIqC,IAAI+L,GACR,MAAM,IAAIve,MAAM,WAAWue,2BAC/BpO,EAAI8sB,IAAI1e,EAAKje,EACjB,KAEJ,MAAM48B,EAAwBN,EAAMzsB,KAAI,CAAC0sB,EAAM/G,KAC3C,GAAI+G,EAAKhlB,WAAW8f,EAAUwF,uBAC1B,OAAOrH,CAAG,IACfvY,QAAQuY,QAAgBplB,IAARolB,IACbsH,EAAiBF,EAAsB/sB,KAAK2lB,GAAQ8G,EAAM9G,KAC1DuH,EAAqBH,EAAsB/sB,KAAK2lB,GAAQ8G,EAAM9G,EAAM,KAC1EsH,EAAepyB,SAAQ,CAAC6xB,EAAM/G,KAC1B,MAAMwH,EAAazwB,SAASgwB,EAAKjsB,MAAM,OAAO,IAAM,EAC9C2sB,EAAQ1wB,SAASwwB,EAAmBvH,GAAKxoB,UAAU,IACzD,GAAI6C,EAAIqC,IAAI+qB,GACR,MAAM,IAAIv9B,MAAM,WAAWu9B,2BAC/BptB,EAAI8sB,IAAIM,EAAOD,EAAW,IAE9B,MACME,EADsBx+B,KAAKy+B,yBACOlgB,QAAQuY,IAASrf,MAAMnT,KAAK6M,EAAI/N,UAAUgT,SAAS0gB,KAC3F,GAA2B,IAAvB0H,EAAY99B,OACZ,MAAM,IAAIM,MAAM,gCAAgCw9B,KACpD,OAAOrtB,CACX,CACA,sBAAA6sB,CAAuBU,GACnB,MAAMC,EAAUD,EAAQ9sB,MAAM,OAAO2M,QAAQsd,GAASA,IACjD1tB,MAAM,GAAGgD,KAAK0qB,GAAShuB,SAASguB,KAC/BkC,EAAsB,IAAItmB,MAAMknB,EAAQj+B,OAAS,GACvD,IAAK,IAAIG,EAAI,EAAGA,EAAI89B,EAAQj+B,OAAQG,GAAK,EACrCk9B,EAAoBl9B,EAAI,GAAK,CAAC89B,EAAQ99B,EAAI,GAAI89B,EAAQ99B,GAAK,GAC/D,OAAOk9B,CACX,CACA,sBAAAU,GACI,OAAOz+B,KAAK26B,UAAUxpB,KAAI,CAAC0sB,EAAM/G,KAC7B,GAAI+G,EAAKznB,SNxDiB,MMyDtB,OAAO0gB,CAAG,IACfvY,QAAQuY,QAAgBplB,IAARolB,GACvB,CACA,qBAAO8H,CAAelC,GAClB,OAA6C,IAArCA,EAAQvS,QAAQwO,EAAUkG,QACM,IAApCnC,EAAQvS,QAAQwO,EAAUmG,IAClC,CACA,kBAAArD,CAAmBJ,GACf,OAAOr7B,KAAKo7B,0BAA0BC,EAAc1C,EAAUoG,cAClE,CACA,gBAAAC,GACI,IAAIlI,EAAM,EACV,IAAK,IAAIj2B,EAAI,EAAGA,EAAI83B,EAAUsG,sBAAuBp+B,EACjDi2B,EAAM92B,KAAK27B,eAAe7E,GAC9B,OAAOA,CACX,CACA,eAAA0E,GACI,IAAI1E,EAAM92B,KAAKg/B,mBAEf,OADAlI,EAAM92B,KAAK27B,eAAe7E,GACnBA,CACX,CACA,iBAAA8E,CAAkBP,GACd,OAAOr7B,KAAKk7B,iBAAiBG,EACjC,CACA,yBAAAY,CAA0BZ,GACtB,OAAOr7B,KAAKo7B,0BAA0BC,EAAc1C,EAAUuG,sBAClE,CACA,kBAAA9C,CAAmBf,GACf,OAAOr7B,KAAKo7B,0BAA0BC,EAAc1C,EAAUwG,cAClE,CACA,eAAAnD,GACI,IAAIlF,EAAM92B,KAAKw7B,kBACf,IAAK,IAAI36B,EAAI,EAAGA,EAAIb,KAAKq6B,UAAWx5B,IAChCi2B,EAAM92B,KAAK27B,eAAe7E,GAC9B,OAAOA,CACX,CACA,sBAAAmE,GACI,IAAI0B,EAAQ38B,KAAKg/B,mBACbp5B,EAAM+2B,EAAQhE,EAAUyG,qBAC5B,MAAM/E,EAAYxsB,SAAS7N,KAAK85B,YAAYxrB,UAAUquB,EAAO/2B,IAI7D,OAHA+2B,EAAQ/2B,EACRA,GAAO+yB,EAAUyG,qBAEV,CAAE/E,UAAWA,EAAWE,UADb1sB,SAAS7N,KAAK85B,YAAYxrB,UAAUquB,EAAO/2B,IAEjE,ECpGG,MAAMy5B,UAA0B5C,EACnC,WAAA58B,CAAY68B,GACRrxB,MAAMqxB,GACN18B,KAAKuE,KAAKm4B,EACd,CACA,YAAAY,GACI,MAAMC,EAAev9B,KAAKw7B,kBACpB51B,EAAM5F,KAAKg8B,kBACjB,OAAOh8B,KAAK85B,YAAYxrB,UAAUivB,EAAc33B,GAAKgM,MAAM,MAAMzD,MAAM,EAAGnO,KAAKq6B,UACnF,CACA,YAAAmD,GACI,MAAMC,EAAez9B,KAAKg8B,kBAC1B,OAAOh8B,KAAK85B,YAAYxrB,UAAUmvB,GAAc7rB,MAAM,MAAMzD,MAAM,EAAGnO,KAAKu6B,UAC9E,CACA,yBAAAmD,GACI,MAAMvsB,EAAM,IAAIwsB,IAchB,OAbA39B,KAAKs9B,eAAetxB,SAAQ,CAAC6xB,EAAM/G,KAC/B,MAAMwI,EAAgBzB,EAAKjrB,MAAM,yBACjC,GAAI0sB,EAAe,CACf,MAAMC,EAAaD,EAAc,GAAG1tB,MAAM,OAAOT,KAAKquB,GAAS3xB,SAAS2xB,KAExE,GAAID,EAAW7+B,OAAS,EACpB,MAAM,IAAIM,MAAM,gBAAgBu+B,8BACpC,MAAME,EAAWF,EAAW,GAC5B,GAAIpuB,EAAIqC,IAAIisB,GACR,MAAM,IAAIz+B,MAAM,WAAWy+B,2BAC/BtuB,EAAI8sB,IAAIwB,EAAU3I,EACtB,KAEG3lB,CACX,CACA,kBAAAsqB,CAAmBJ,GACf,OAAOr7B,KAAKo7B,0BAA0BC,EAAc,EACxD,CACA,gBAAA2D,GACI,OAAOh/B,KAAK85B,YAAY3P,QAAQ,iBACpC,CACA,eAAAqR,GACI,IAAI1E,EAAM92B,KAAK85B,YAAY3P,QAAQ,qBAEnC,OADA2M,EAAM92B,KAAK27B,eAAe7E,GACnBA,CACX,CACA,iBAAA8E,CAAkBP,GACd,IAAIvE,EAAM92B,KAAKy7B,mBAAmBJ,GAClC,OAAIr7B,KAAK48B,QAAQ9F,IACbA,EAAM92B,KAAK68B,qBAAqB/F,GAChCA,EAAM92B,KAAKk7B,iBAAiBpE,GACrBA,GAEJ92B,KAAKo7B,0BAA0BC,EAAc,EACxD,CACA,yBAAAY,CAA0BZ,GACtB,OAAOr7B,KAAKo7B,0BAA0BC,EAAc,EACxD,CACA,kBAAAe,CAAmBf,GACf,OAAOr7B,KAAKo7B,0BAA0BC,EAAc,EACxD,CACA,eAAAW,GACI,OAAOh8B,KAAK27B,eAAe37B,KAAK85B,YAAY3P,QAAQ,qBACxD,CACA,qBAAOyU,CAAelC,GAClB,OAA2D,IAAnDA,EAAQvS,QAAQ,WAC+B,IAAnDuS,EAAQvS,QAAQ,SACxB,CACA,sBAAA8Q,GAEI,IAAI0B,EAAQ38B,KAAK85B,YAAY3P,QAAQ,kBAAsD,GACvFvkB,EAAM5F,KAAK85B,YAAY3P,QAAQ,IAAKwS,EAAQ,GAChD,MAAM+C,EAAa7xB,SAAS7N,KAAK85B,YAAYxrB,UAAUquB,EAAO/2B,IAK9D,OAHA+2B,EAAQ/2B,EAAM,EACdA,EAAM5F,KAAK85B,YAAY3P,QAAQ,IAAKwS,EAAQ,GAErC,CAAEtC,UAAWqF,EAAYnF,UADb1sB,SAAS7N,KAAK85B,YAAYxrB,UAAUquB,EAAO/2B,IAElE,ECxEG,MAAM+5B,EACT,WAAA9/B,GAAgB,CAChB,kBAAO+/B,CAAYlD,GACf,GAAIiD,EAAeE,aAAanD,GAC5B,OAAO,IAAIW,EAAkBX,GAC5B,GAAIiD,EAAeG,aAAapD,GACjC,OAAO,IAAI2C,EAAkB3C,GAE7B,MAAM,IAAI17B,MAAM,oBACxB,CACA,mBAAO6+B,CAAanD,GAChB,OAAOW,EAAkBuB,eAAelC,EAC5C,CACA,mBAAOoD,CAAapD,GAChB,OAAO2C,EAAkBT,eAAelC,EAC5C,ECZGl0B,eAAeu3B,EAAU7Y,EAAeoL,EAAkB,WACzD0D,EAAM,Wb2DP,SAAmBgK,EAAOC,EAASC,EAASjL,EAAK,EAAGkL,EAAS,WAChE,OAAOnQ,EAAUhwB,UAAM,OAAQ,GAAQ,YACnC,OAAO,IAAIqwB,SAAQ,CAACC,EAASC,KACzB,MAAMrI,EAAM8X,EAAM5Y,WAAWtI,IACzB,IACImhB,EAAQnhB,GACRwR,EAAQ,KACZ,CACA,MAAO9M,GACH+M,EAAO/M,EACX,CAEA0E,EAAIC,cACJoO,aAAajE,EAAQ,IAEnBA,EAAU2D,YAAW,KACvB/N,EAAIC,cAEJoI,EAAO4P,EAAO,GACflL,GACHiL,GAAS,GAEjB,GACJ,CajFQE,CAAUlZ,EAAKmZ,oBAAoB,SACvC,KAAQnZ,EAAKiC,YAAY,GAAKmJ,EAClC,CCOAH,EAAS,eAAe,KACtB,IAAIgG,EACAC,EAEJ1E,GAAOlrB,UACL2vB,QAAyB,UACzBC,QAAwBV,UAClBQ,UACAC,EAAiBE,eAAc,EAAK,IAG5C1E,GAAMnrB,gBACEwvB,EAAmBI,SACnBD,EAAiBE,eAAc,EAAK,IAQ5CjG,EAAK,WAAW5pB,UACd,MAAM+sB,EAAK,YAAazF,QANd,mQAOJgJ,EAAUvD,EAAGwD,OAAO,QACpBxR,EAAO,QAAW0R,aAAa1D,GAErC+K,GAASC,OAAOxI,MAAM,mDAChBgI,EAAUxY,EAAKL,KAAM,KAC3BoZ,GAASC,OAAOxI,MAAM,4CAEtB,MAAMyI,QAAkC,YAAe13B,KAAK,mBAAoB,CAAC0L,IAAKskB,IACtFvG,EAAOiO,EAAO9/B,OAAQo4B,EAAQp4B,QAC9B,MAAM+/B,EAAuCD,EAAOE,SAASvvB,KAAKurB,GAAYiD,EAAeC,YAAYlD,KACzGrJ,EAAYoN,EAAetvB,KAAKwvB,GAAOA,EAAGtG,YAAY9E,EAAGwD,OAAO,SAAS2H,UACzErN,EAAYoN,EAAetvB,KAAKwvB,GAAOA,EAAGpG,YAAYhF,EAAGwD,OAAO,SAAS2H,UAEzEJ,GAASC,OAAOxI,MAAM,mDAChBgI,EAAUxY,EAAKL,KAAM,KAC3BoZ,GAASC,OAAOxI,MAAM,2CAA2C,GACjE,I,uBC5BJ,MAAM6I,GAEF,CACF,KAAc,CACZ5vB,IAAK,0GACLoE,MAAO,KAAS7C,KAChB+K,IAAK,CAAC,QAAoB,iBAAkB,mBAAe,QAAS,yBAAwB,OAE9F,UAAmB,CACjBtM,IAAK,mCACLoE,MAAO,KAASvD,UAAWL,UAAW,IAAKzG,SAAU,KACrDuS,IAAK,CAAC,QAAoB,iBAAkB,mBAAe,QAAS,yBAAwB,OAE9F,WAAoB,CAClBtM,IAAK,mEACLoE,MAAO,KAASvD,UAAWL,UAAW,IAAKzG,SAAU,KACrDuS,IAAK,CAAC,QAAoB,iBAAkB,mBAAe,QAAS,yBAAwB,OAE9F,iBAAuB,CACrBtM,IAAK,kCACLoE,MAAO,KAASvD,UAAWL,UAAW,IAAKzG,SAAU,KACrDuS,IAAK,CAAC,QAAoB,eAAgB,mBAAe,OAAQ,yBAAwB,OAE3F,WAAiB,CACftM,IAAK,WACLoE,MAAO,KAAStE,MAAO/F,SAAU,KACjCuS,IAAK,CAAC,QAAoB,gBAAiB,mBAAe,OAAQ,yBAAwB,OAE5F,YAAkB,CAChBtM,IAAK,YACLoE,MAAO,KAAStE,MAAO/F,SAAU,MACjCuS,IAAK,CAAC,QAAoB,kBAAmB,mBAAe,QAAS,yBAAwB,SA4BjG,SAASujB,GACP7vB,EAAaoE,EAAiB5D,EAA+BzG,EAAgC+1B,GAE7F,MAAMtsB,EAAM,SAAUgF,SAAS,cAAetE,OAAQ,MAAO,CAAClE,IAC9DwD,EAAI8B,QAAU,UAAWC,cACzB/B,EAAI2B,OAAO,OAAQb,MAAOF,GACtB5D,GAAWgD,EAAI2B,OAAO,YAAmB3E,GACzCzG,GAAUyJ,EAAI2B,OAAO,WAAkBpL,GAC3C,MAAMsL,EAAK,KAAW4D,UAAUzF,GAEhCye,GADoB,QAAkBjiB,EAAKqF,GACjByqB,EAC5B,CAnCA3O,EAAS,qBAAqB,KAC5B,IAAIgG,EAEAC,EAAuB,KAE3B1E,GAAOlrB,UACL2vB,QAAyB,UACzBC,EAAkBV,UACZQ,UACAC,EAAiBE,eAAc,EAAK,IAG5C1E,GAAMnrB,gBACEwvB,EAAmBI,SACnBD,EAAiBE,eAAc,EAAK,IAG5C,IAAK,MAAOE,EAAU1I,KAAatgB,OAAO+P,QAAQshB,IAChDxO,EAAKmG,GAAU/vB,UACbq4B,GAAmBhR,EAAS7e,IAAK6e,EAASza,MAAOya,EAASre,UAAWqe,EAAS9kB,SAAU8kB,EAASvS,IAAI,G,iBCpD3G9U,eAAeu4B,GAAc/vB,EAAoBsnB,GAE/CjF,GADsB,QAAYriB,GACjBsnB,EACnB,CAzBAnG,EAAS,eAAe,KAGtB,MAAMb,EAAgE,CACpE,wBAA2B,CACzBtgB,IAAK,sBACLsnB,IAAK,CAAC,YAAa,IAAK,IAAK,IAAK,IAAK,IAAK,UAE9C,uBAA0B,CACxBtnB,IAAK,yBAELsnB,IAAK,CAAC,aAAc,KAAM,KAAM,IAAK,IAAK,IAAK,WAInD,IAAK,MAAOC,EAAU1I,KAAatgB,OAAO+P,QAAQgS,GAChDc,EAAK,GAAGmG,KAAY/vB,gBACZu4B,GAAclR,EAAS7e,IAAK6e,EAASyI,IAAI,G,ICb9C,MAAMgI,GAAW,IAAI,UASrB93B,eAAe,GAAK2pB,EAAkBC,EAAc4O,GACzD,MAAM/+B,QjBuSD,SAAkBowB,GACrB,IAAIzP,EAAI2R,EAAIC,EAAIC,EAAIC,EAAIC,EACpBsM,EACJ,OAAOjR,EAAUhwB,UAAM,OAAQ,GAAQ,YACnC,MAAMkhC,EAA0G,QAA9F3M,EAAgD,QAA1C3R,EAAK,YAAeue,wBAAqC,IAAPve,OAAgB,EAASA,EAAGsT,YAAyB,IAAP3B,OAAgB,EAASA,EAAG3rB,cA/HrJ,SAAuBs4B,EAAUva,GACpC,IAAI/D,EACJ,OAAOoN,EAAUhwB,UAAM,OAAQ,GAAQ,YACnC,MAAMohC,EAAYF,EAAS1Z,GAC3B,GAAImK,EAAcyP,GACd,OACJ,MAAMC,EAAsC/P,EAC5C,QAAsC5f,IAAlC2vB,EAAY9P,SACiB7f,IAA7B2vB,EAAY7P,IACZjiB,OAAO6D,KAAKiuB,GAAa14B,MAAM4E,GAAMA,EAAEsL,WAAW0Y,IAAqBhkB,EAAEsL,WAAW6Y,KAEpF,YADAC,EAAcyP,IAAa,GAG/B,GAAsB,aAAlBF,EAAS1+B,KAA0E,CACnF,MAAM8+B,EAAgB,OAAQ34B,KAAK,CAAEmN,KAAM,CAAC,cAC5C,IAAK,MAAM2N,KAAK6d,EAAe,CAC3B,MAAM/7B,EAAMke,EAAEjhB,KAAKoP,MAAM,aACnBpP,EAA4B,QAApBogB,EAAKrd,EAAIg8B,aAA0B,IAAP3e,EAAgBA,EAAKa,EAAEjhB,KAC3Dg/B,EAAMj8B,EAAI7E,OAASgxB,EAAc,KAAOnsB,EAAIsW,KAAK,MAAQ6V,OACtChgB,IAArB2vB,EAAYG,KACZH,EAAYG,GAAO,CAAElQ,MAAO,GAAIzsB,OAAO,IAC3Cw8B,EAAYG,GAAKlQ,MAAM9rB,KAAK,IAAI0sB,EAAKsP,EAAKh/B,GAAM,IAAMwtB,EAAUhwB,UAAM,OAAQ,GAAQ,YAAe,aAAayjB,EAAEqN,OAAS,KAAI,CAAEuE,aAAc5R,EAAEge,QAAQ/gC,OAAS,EAAG4xB,QAAS,MACpL,CACJ,CACA,MAAMoP,EAAkB,GAClBC,EAAa,GACbC,EAAkB,GAClBC,QAAsB,OAAUC,UAAUvjB,OAAO,iBAAiB6iB,MAAcW,OAChFC,EAAM,IAAI93B,OAAO,sEACvB,IAAK,MAAMuZ,KAAKoe,EAAe,CAC3B,MAAMvQ,EAAQ7N,EAAE4O,QAAc,KACxB4P,EAAOxe,EAAE4O,QAAkB,SACjC,GAAKf,GAAS7Z,MAAMyqB,QAAQ5Q,IAAUA,EAAM5wB,OACxC,IAAK,IAAIG,EAAI,EAAGA,EAAIywB,EAAM5wB,OAAQG,IAAK,CACnC,MAAMyc,EAAMgU,EAAMzwB,GAAGqQ,SAAS8wB,GACxB7wB,EAAM,CAAC,EACbsG,MAAMnT,KAAKgZ,GAAKtR,SAASzG,IACjBA,EAAI,GAAGsT,WAAW,QAClB1H,EAAU,KAAI5L,EAAI,GACbA,EAAI,GAAGsT,WAAW,QACvB1H,EAAU,KAAItD,SAAStI,EAAI,IACtBA,EAAI,GAAGsT,WAAW,OACvB1H,EAAS,IAAI5L,EAAI,GACZA,EAAI,GAAGsT,WAAW,aACvB1H,EAAa,QAAItD,SAAStI,EAAI,IAAG,IAEzC,MAAM6sB,EAAO,IAAIF,EAAKX,EAAmC,IAAjBD,EAAM5wB,OAAe+iB,EAAEjhB,KAAO,GAAGihB,EAAEjhB,QAAQ3B,EAAI,KAAK,IAAMmvB,EAAUhwB,UAAM,OAAQ,GAAQ,YAC9H,MAAMsd,QAAY,YAAe6kB,KAAKvO,EAAatC,EAAMzwB,GAAI4iB,IAI7D,GAHItS,EAAIgoB,aACEnD,EAAM7kB,EAAIgoB,OAED,kBAAR7b,IAAsBA,EAC7B,KAAM,WAAWgU,EAAMzwB,0BAA0Byc,GACzD,KAAI,CAAEuX,WAAY1jB,EAAIyjB,KAAMtC,QAASnhB,EAAImhB,UACzC,GAAInhB,EAAIqwB,IAAK,CACT,MAAMA,EAAMjQ,EAAmB,KAAOpgB,EAAIqwB,IAC1CpP,EAAKD,SAAWqP,OACS9vB,IAArB2vB,EAAYG,KACZH,EAAYG,GAAO,CAAElQ,MAAO,GAAIzsB,OAAO,IAC3Cw8B,EAAYG,GAAKlQ,MAAM9rB,KAAK4sB,EAChC,MAEIsP,EAAgBl8B,KAAK4sB,EAC7B,CAEJ,GAAI6P,EAAM,CACN,MAAM9I,EAAO1V,EAAE4O,QAAkB,SAAIxkB,SAAS4V,EAAE4O,QAAkB,eAAK3gB,EACjE0gB,EAAO,IAAIF,EAAKV,EAAa/N,EAAE2e,cAAc,IAAMpS,EAAUhwB,UAAM,OAAQ,GAAQ,YAIrF,GAHA,QAAWqiC,UAAY,SACjB5e,EAAEqN,cACFkF,EAAMmD,GAAc,KACtB,QAAWkJ,UACX,MAAM,IAAIrhC,MAAM,QAAWqhC,UACnC,KAAI,CAAExN,WAAYpR,EAAE4O,QAAkB,WACtCsP,EAAWn8B,KAAK4sB,EACpB,CACA,GAAI3O,EAAE6e,OAAO,mBAAoB,CAC7B,MAAMlQ,EAAO,IAAIF,EAAKT,EAAkBhO,EAAE2e,cAAc,IAAMpS,EAAUhwB,UAAM,OAAQ,GAAQ,YAC1F,MAAMuF,EAAM,GACZ,IAAK,MAAMiP,KAAOqb,EAASzrB,QAAQiV,QAAS,CACxC,MAAMiE,QAAYmG,EAAEqN,MAAM,CAACtc,IAC3BjP,EAAIC,KAAK8X,GAAO9I,EAAI8B,QACxB,CACAic,EAAOhtB,EAAIgZ,QAAQ1d,GAAMA,IAAGH,OAAQ,EACxC,KAAI,CAAEm0B,WAAYpR,EAAE4O,QAAkB,WACtCuP,EAAgBp8B,KAAK4sB,EACzB,CACJ,CACAT,EAAcyP,IAAa,EACvBM,EAAgBhhC,SAChB2gC,EAAY9P,GAAoB,CAAED,MAAOoQ,EAAiB78B,OAAO,IACjE88B,EAAWjhC,SACX2gC,EAAY7P,GAAe,CAAEF,MAAOqQ,EAAY98B,OAAO,IACvD+8B,EAAgBlhC,SAChB2gC,EAAY5P,GAAoB,CAAEH,MAAOsQ,EAAiB/8B,OAAO,GACzE,GACJ,CAgCc09B,CAAcrB,GACpB,MAAMsB,EAAU,GAChBprB,QAAQ8Z,IAAI,iBACZmB,UAAoDA,EAAU,CAAC,GACzB,QAArCmC,GAAMyM,EAAK5O,GAAS2O,mBAAgC,IAAPxM,IAAsByM,EAAGD,YAAc,IAAIjP,GACzF,QAAWsQ,UAAY,GACvB,MAAMI,EAAa,GACbtO,EAtCd,WACI,MAAMA,EAAO,GAiBb,OAhBA/c,QAAQ8Z,IAAM,IAAIpS,KACdqV,EAAK3uB,QAAQsZ,GACbmS,KAAUnS,EAAK,EAEnB1H,QAAQqO,KAAO,IAAI3G,KACfqV,EAAK3uB,QAAQsZ,GACbqS,KAAWrS,EAAK,EAEpB1H,QAAQC,KAAO,IAAIyH,KACfqV,EAAK3uB,QAAQsZ,GACbsS,KAAWtS,EAAK,EAEpB1H,QAAQiQ,MAAQ,IAAIvI,KAChBqV,EAAK3uB,QAAQsZ,GACbuS,KAAYvS,EAAK,EAEdqV,CACX,CAmBqBuO,GACb,IACI,IAAK,MAAOnjB,EAAKje,KAAUiO,OAAO+P,QAAQgS,GAAQ,CAC9C,IAAQe,aAAyC,EAASA,EAAQF,YAAc5S,EAAI/Q,cAAcqK,WAAWwZ,aAAyC,EAASA,EAAQF,SAAS3jB,iBAChJ,QAA1BimB,EAAKpC,EAAQmF,eAA4B,IAAP/C,OAAgB,EAASA,EAAG/d,MAAMnJ,GAAMgS,EAAI1G,WAAWtL,MAC3F,SACJ0jB,EAAO,WAAW1R,cAClBkjB,EAAWj9B,KAAK+Z,GAChB,MAAM2V,EAAiC,QAAtBR,EAAKpzB,EAAMgwB,aAA0B,IAAPoD,OAAgB,EAASA,EAAGiO,OAAOpc,IAAQ,IAAI3D,EAAI,OAA4B,QAApBA,EAAK2D,EAAE8L,eAA4B,IAAPzP,OAAgB,EAASA,EAAGiS,UAAU,IAC5K,IACQvzB,EAAMoyB,SAAWwB,UACX5zB,EAAMoyB,SACpB,CACA,MAAOK,GACHzyB,EAAMshC,aAAe9O,EAAUC,EACnC,CACA,MAAMxN,EAA2B,QAAtBoO,EAAKrzB,EAAMgwB,aAA0B,IAAPqD,EAAgBA,EAAK,GACxDrX,EAAM,GACZ,GAAIhc,EAAMuD,MACN,IAAK,IAAIhE,EAAI,EAAGA,EAAI0lB,EAAE7lB,OAAQG,IAC1Byc,EAAI9X,WAAWyuB,EAAS1N,EAAE1lB,GAAIwxB,aAAyC,EAASA,EAAQD,KAAM+B,EAAM7yB,EAAMgxB,QAAS4O,EAAS1+B,KAAM6vB,EAAQiC,UAC1I,QAAWuO,WACX,UAAWA,gBAIf,IAAK,IAAIhiC,EAAI,EAAGA,EAAI0lB,EAAE7lB,OAAQG,IAC1Byc,EAAI9X,WAAWyuB,EAAS1N,EAAE1lB,GAAIwxB,aAAyC,EAASA,EAAQD,KAAM+B,EAAM7yB,EAAMgxB,QAAS4O,EAAS1+B,KAAM6vB,EAAQiC,UAElJ,MAAMryB,EAAOqb,EAAIiB,QAAQgF,GAAkB,WAAZA,EAAE9b,SACjC,IACQnG,EAAMqyB,QAAUuB,UACV5zB,EAAMqyB,QACpB,CACA,MAAOI,GACHzyB,EAAMwhC,YAAchP,EAAUC,EAClC,CAIIzyB,EAAMwhC,aACN7gC,EAAKuD,KAAK,CAAE2sB,SAAU5S,EAAK/c,KAAM,QAASiF,OAAQnG,EAAMwhC,YAAa9N,SAAS,EAAOC,GAAI,EAAGC,SAAS,IACrG5zB,EAAMshC,cACN3gC,EAAKuD,KAAK,CAAE2sB,SAAU5S,EAAK/c,KAAM,SAAUiF,OAAQnG,EAAMshC,aAAc5N,SAAS,EAAOC,GAAI,EAAGC,SAAS,IAC3GsN,EAAQh9B,QAAQvD,EACpB,CACJ,CACA,QAhEJmV,QAAQ8Z,IAAMD,EACd7Z,QAAQqO,KAAO0L,EACf/Z,QAAQC,KAAO+Z,EACfha,QAAQiQ,MAAQgK,CA+DZ,CAWA,GAVIgB,EAAQ2O,YAAYhP,uBACdgE,EAAM,KACR,QAAWqM,UAAU3hC,OAAS,GAC9B8hC,EAAQh9B,KAAK,CACT2sB,SAAU,uBACV3vB,KAAM,aACNiF,OAAQ,QAAW46B,UAAWrN,SAAS,EAAOC,GAAI,EAAGC,SAAS,MAIrE7C,EAAQD,MAAQoQ,EAAQ9hC,OAAQ,CACjC,MAAMqiC,EAAaP,EAAQjkB,QAAQ1O,GAAMA,EAAEmlB,UAASt0B,OAC9Cw0B,EAAUsN,EAAQjkB,QAAQ1O,GAAMA,EAAEqlB,UAASx0B,OAC3CsiC,EAASR,EAAQjkB,QAAQ1O,IAAOA,EAAEmlB,UAClCX,EAAc6M,EAAS1+B,KAC7B,IAAK,MAAMg/B,KAAOiB,EAAY,CAC1B,MAAMnlB,EAAMklB,EAAQjkB,QAAQ1O,GAAMA,EAAEsiB,WAAaqP,IAC3CyB,EAAU3lB,EAAIiB,QAAQ1O,IAAOA,EAAEmlB,UAASt0B,OACxCi1B,EAAS,CAAEX,QAAqB,IAAZiO,EACtBC,OAAQ5lB,EAAIiB,QAAQ1O,GAAMA,EAAEmlB,UAASt0B,OACrCw0B,QAAS5X,EAAIiB,QAAQ1O,GAAMA,EAAEqlB,UAASx0B,OACtCsiC,OAAQC,EACRhuB,KAAM,UAAWof,cAAalC,SAAUqP,GAC5C,MAASzL,MAAM,GAAG1B,MAAgBmN,IAAO7L,EAAQ,oBAAoBtB,MAAgBmN,IACzF,CACA,IAAKnP,EAAQF,SAAU,CACnB,MAAMwD,EAAS,CAAEX,QAA2B,IAAlBgO,EAAOtiC,OAAcwiC,OAAQH,EAAY7N,UAAS8N,OAAQA,EAAOtiC,OACvFuU,KAAM,UAAWof,eACrB,MAAS0B,MAAM1B,EAAasB,EAAQ,mBAAmBtB,IAC3D,CACA,GAAIhC,EAAQ2O,YAAY/O,OAAQ,CAC5B,MAAMsO,EAAS,IAAI,SACb4C,EAAc,0FACdxN,EAAS,CACXoN,WAAYA,EACZ7N,QAASA,EACT8N,OAAQA,EAAOtiC,OACfkI,QAASs4B,GAEb,IAAK,MAAMrxB,KAAKmzB,EACZzzB,OAAOumB,OAAOH,EAAQ,CAAE,CAAC,GAAG9lB,EAAEsiB,cAActiB,EAAErN,QAASqN,EAAEpI,SAC7D84B,EAAOrP,IAAIiS,EAAaxN,EAAQ,iBACpC,CACJ,CACA,OAAO6M,CACX,GACJ,CiBnZqBY,CAAS,CAACjR,WAAUC,OAAM4O,gBAC7C,OAAO,YAAaqC,YAAYphC,EAClC,C","sources":["webpack://helm/./node_modules/@datagrok-libraries/ml/src/typed-metrics/consts.js","webpack://helm/./node_modules/@datagrok-libraries/utils/src/bit-array.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/monomer-works/monomer-utils.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/distance-metrics-methods.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/const.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/consts.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/types.js","webpack://helm/./node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://helm/./node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/seq-palettes.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/aminoacids.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/nucleotides.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/unknown.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/utils.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/seq-handler.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/hamming.js","webpack://helm/./node_modules/fastest-levenshtein/esm/mod.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/needleman-wunsch.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/macromolecule-distance-functions.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/levenstein.js","webpack://helm/./node_modules/@datagrok-libraries/utils/src/to-console.js","webpack://helm/./node_modules/fast-sha256/sha256.js","webpack://helm/./src/helm-monomer-placer.ts","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/cell-renderer.js","webpack://helm/./src/cell-renderer.ts","webpack://helm/./src/package.ts","webpack://helm/./src/utils/index.ts","webpack://helm/./src/widgets/properties-widget.ts","webpack://helm/external var \"$\"","webpack://helm/external var \"DG\"","webpack://helm/external var \"grok\"","webpack://helm/external var \"ui\"","webpack://helm/external var \"wu\"","webpack://helm/webpack/bootstrap","webpack://helm/webpack/runtime/compat get default export","webpack://helm/webpack/runtime/define property getters","webpack://helm/webpack/runtime/hasOwnProperty shorthand","webpack://helm/webpack/runtime/make namespace object","webpack://helm/./node_modules/@datagrok-libraries/utils/src/dataframe-utils.js","webpack://helm/./node_modules/@datagrok-libraries/utils/src/test.js","webpack://helm/./src/tests/helm-tests.ts","webpack://helm/./node_modules/@datagrok-libraries/bio/src/monomer-works/lib-settings.js","webpack://helm/./src/tests/findMonomers-tests.ts","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/formats/molfile-const.js","webpack://helm/./src/tests/renderers-tests.ts","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/chemical-table-parser-base.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler-base.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/const.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/utils.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/molfile-v2k-handler.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/molfile-v3k-handler.js","webpack://helm/./node_modules/@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler.js","webpack://helm/./src/tests/utils.ts","webpack://helm/./src/tests/get-molfiles.ts","webpack://helm/./src/tests/properties-widget-tests.ts","webpack://helm/./src/tests/get-all-parts-tests.ts","webpack://helm/./src/package-test.ts"],"sourcesContent":["export var StringMetricsNames;\n(function (StringMetricsNames) {\n StringMetricsNames[\"Levenshtein\"] = \"Levenshtein\";\n StringMetricsNames[\"JaroWinkler\"] = \"Jaro-Winkler\";\n StringMetricsNames[\"Manhattan\"] = \"Manhattan\";\n StringMetricsNames[\"Onehot\"] = \"One-Hot\";\n})(StringMetricsNames || (StringMetricsNames = {}));\nexport var VectorMetricsNames;\n(function (VectorMetricsNames) {\n VectorMetricsNames[\"Euclidean\"] = \"Euclidean\";\n})(VectorMetricsNames || (VectorMetricsNames = {}));\nexport var BitArrayMetricsNames;\n(function (BitArrayMetricsNames) {\n BitArrayMetricsNames[\"Tanimoto\"] = \"Tanimoto\";\n BitArrayMetricsNames[\"Dice\"] = \"Dice\";\n BitArrayMetricsNames[\"Asymmetric\"] = \"Asymmetric\";\n BitArrayMetricsNames[\"BraunBlanquet\"] = \"Braun-Blanquet\";\n BitArrayMetricsNames[\"Cosine\"] = \"Cosine\";\n BitArrayMetricsNames[\"Kulczynski\"] = \"Kulczynski\";\n BitArrayMetricsNames[\"McConnaughey\"] = \"Mc-Connaughey\";\n BitArrayMetricsNames[\"RogotGoldberg\"] = \"Rogot-Goldberg\";\n BitArrayMetricsNames[\"Russel\"] = \"Russel\";\n BitArrayMetricsNames[\"Sokal\"] = \"Sokal\";\n BitArrayMetricsNames[\"Hamming\"] = \"Hamming\";\n BitArrayMetricsNames[\"Euclidean\"] = \"Euclidean\";\n})(BitArrayMetricsNames || (BitArrayMetricsNames = {}));\nexport var IntArrayMetricsNames;\n(function (IntArrayMetricsNames) {\n IntArrayMetricsNames[\"TanimotoIntArray\"] = \"TanimotoIntArray\";\n})(IntArrayMetricsNames || (IntArrayMetricsNames = {}));\nexport var DistanceMetricsSubjects;\n(function (DistanceMetricsSubjects) {\n DistanceMetricsSubjects[\"Vector\"] = \"Vector\";\n DistanceMetricsSubjects[\"String\"] = \"String\";\n DistanceMetricsSubjects[\"BitArray\"] = \"BitArray\";\n DistanceMetricsSubjects[\"MacroMolecule\"] = \"MacroMolecule\";\n DistanceMetricsSubjects[\"Number\"] = \"Number\";\n DistanceMetricsSubjects[\"IntArray\"] = \"IntArray\";\n DistanceMetricsSubjects[\"NumberArray\"] = \"NumberArray\";\n})(DistanceMetricsSubjects || (DistanceMetricsSubjects = {}));\nexport var NumberMetricsNames;\n(function (NumberMetricsNames) {\n NumberMetricsNames[\"Difference\"] = \"Difference\";\n})(NumberMetricsNames || (NumberMetricsNames = {}));\nexport var NumberArrayMetricsNames;\n(function (NumberArrayMetricsNames) {\n NumberArrayMetricsNames[\"CommonItems\"] = \"Common Items\";\n})(NumberArrayMetricsNames || (NumberArrayMetricsNames = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29uc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLGtCQUtUO0FBTEgsV0FBWSxrQkFBa0I7SUFDMUIsaURBQTJCLENBQUE7SUFDM0Isa0RBQTRCLENBQUE7SUFDNUIsNkNBQXVCLENBQUE7SUFDdkIsd0NBQWtCLENBQUE7QUFDcEIsQ0FBQyxFQUxTLGtCQUFrQixLQUFsQixrQkFBa0IsUUFLM0I7QUFFSCxNQUFNLENBQU4sSUFBWSxrQkFFVDtBQUZILFdBQVksa0JBQWtCO0lBQzFCLDZDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFGUyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRTNCO0FBRUgsTUFBTSxDQUFOLElBQVksb0JBYVQ7QUFiSCxXQUFZLG9CQUFvQjtJQUM1Qiw2Q0FBcUIsQ0FBQTtJQUNyQixxQ0FBYSxDQUFBO0lBQ2IsaURBQXlCLENBQUE7SUFDekIsd0RBQWdDLENBQUE7SUFDaEMseUNBQWlCLENBQUE7SUFDakIsaURBQXlCLENBQUE7SUFDekIsc0RBQThCLENBQUE7SUFDOUIsd0RBQWdDLENBQUE7SUFDaEMseUNBQWlCLENBQUE7SUFDakIsdUNBQWUsQ0FBQTtJQUNmLDJDQUFtQixDQUFBO0lBQ25CLCtDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFiUyxvQkFBb0IsS0FBcEIsb0JBQW9CLFFBYTdCO0FBRUgsTUFBTSxDQUFOLElBQVksb0JBRVg7QUFGRCxXQUFZLG9CQUFvQjtJQUM5Qiw2REFBcUMsQ0FBQTtBQUN2QyxDQUFDLEVBRlcsb0JBQW9CLEtBQXBCLG9CQUFvQixRQUUvQjtBQUVELE1BQU0sQ0FBTixJQUFZLHVCQVFUO0FBUkgsV0FBWSx1QkFBdUI7SUFDL0IsNENBQWlCLENBQUE7SUFDakIsNENBQWlCLENBQUE7SUFDakIsZ0RBQXFCLENBQUE7SUFDckIsMERBQStCLENBQUE7SUFDL0IsNENBQWlCLENBQUE7SUFDakIsZ0RBQXFCLENBQUE7SUFDckIsc0RBQTJCLENBQUE7QUFDN0IsQ0FBQyxFQVJTLHVCQUF1QixLQUF2Qix1QkFBdUIsUUFRaEM7QUFFSCxNQUFNLENBQU4sSUFBWSxrQkFFWDtBQUZELFdBQVksa0JBQWtCO0lBQzVCLCtDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFGVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRTdCO0FBRUQsTUFBTSxDQUFOLElBQVksdUJBRVg7QUFGRCxXQUFZLHVCQUF1QjtJQUNqQyx1REFBNEIsQ0FBQTtBQUM5QixDQUFDLEVBRlcsdUJBQXVCLEtBQXZCLHVCQUF1QixRQUVsQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIFN0cmluZ01ldHJpY3NOYW1lcyB7XG4gICAgTGV2ZW5zaHRlaW4gPSAnTGV2ZW5zaHRlaW4nLFxuICAgIEphcm9XaW5rbGVyID0gJ0phcm8tV2lua2xlcicsXG4gICAgTWFuaGF0dGFuID0gJ01hbmhhdHRhbicsXG4gICAgT25laG90ID0gJ09uZS1Ib3QnLFxuICB9XG5cbmV4cG9ydCBlbnVtIFZlY3Rvck1ldHJpY3NOYW1lcyB7XG4gICAgRXVjbGlkZWFuID0gJ0V1Y2xpZGVhbicsXG4gIH1cblxuZXhwb3J0IGVudW0gQml0QXJyYXlNZXRyaWNzTmFtZXMge1xuICAgIFRhbmltb3RvID0gJ1Rhbmltb3RvJyxcbiAgICBEaWNlID0gJ0RpY2UnLFxuICAgIEFzeW1tZXRyaWMgPSAnQXN5bW1ldHJpYycsXG4gICAgQnJhdW5CbGFucXVldCA9ICdCcmF1bi1CbGFucXVldCcsXG4gICAgQ29zaW5lID0gJ0Nvc2luZScsXG4gICAgS3VsY3p5bnNraSA9ICdLdWxjenluc2tpJyxcbiAgICBNY0Nvbm5hdWdoZXkgPSAnTWMtQ29ubmF1Z2hleScsXG4gICAgUm9nb3RHb2xkYmVyZyA9ICdSb2dvdC1Hb2xkYmVyZycsXG4gICAgUnVzc2VsID0gJ1J1c3NlbCcsXG4gICAgU29rYWwgPSAnU29rYWwnLFxuICAgIEhhbW1pbmcgPSAnSGFtbWluZycsXG4gICAgRXVjbGlkZWFuID0gJ0V1Y2xpZGVhbicsXG4gIH1cblxuZXhwb3J0IGVudW0gSW50QXJyYXlNZXRyaWNzTmFtZXMge1xuICBUYW5pbW90b0ludEFycmF5ID0gJ1Rhbmltb3RvSW50QXJyYXknLFxufVxuXG5leHBvcnQgZW51bSBEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cyB7XG4gICAgVmVjdG9yID0gJ1ZlY3RvcicsXG4gICAgU3RyaW5nID0gJ1N0cmluZycsXG4gICAgQml0QXJyYXkgPSAnQml0QXJyYXknLFxuICAgIE1hY3JvTW9sZWN1bGUgPSAnTWFjcm9Nb2xlY3VsZScsXG4gICAgTnVtYmVyID0gJ051bWJlcicsXG4gICAgSW50QXJyYXkgPSAnSW50QXJyYXknLFxuICAgIE51bWJlckFycmF5ID0gJ051bWJlckFycmF5JyxcbiAgfVxuXG5leHBvcnQgZW51bSBOdW1iZXJNZXRyaWNzTmFtZXMge1xuICBEaWZmZXJlbmNlID0gJ0RpZmZlcmVuY2UnLFxufVxuXG5leHBvcnQgZW51bSBOdW1iZXJBcnJheU1ldHJpY3NOYW1lcyB7XG4gIENvbW1vbkl0ZW1zID0gJ0NvbW1vbiBJdGVtcycsXG59XG4iXX0=","export default class BitArray {\n constructor(arg, defaultValue = false) {\n this._length = 0;\n this._version = 0;\n this._updateLevel = 0;\n this._selectedCount = 0;\n this._selectedCountVersion = -1;\n this._selectedIndexesVersion = -1;\n this._versionedName = '';\n this._versionedNameVersion = -1;\n this.SHRINK_THRESHOLD = 0x100;\n if (typeof arg === 'number') {\n const length = arg;\n const buff = BitArray._createBuffer(length);\n if (defaultValue) {\n for (let i = 0; i < buff.length; i++)\n buff[i] = -1;\n }\n this._data = buff;\n this._length = length;\n }\n else if (arg instanceof Uint32Array) {\n this._data = arg;\n this._length = defaultValue;\n }\n else {\n throw new Error('Invalid constructor');\n }\n }\n getRawData() { return this._data; }\n assureGoez(num, argName) {\n if (num < 0)\n throw new Error(`${argName} should be greater than zero`);\n }\n assureInRange(value, min, max, argName) {\n if ((value < min) || (value > max))\n throw new Error(`Argument ${argName} (${value}) out of range (${min}, ${max})`);\n }\n copy(src, dst, count) {\n for (let i = 0; i < count; i++)\n dst[i] = src[i];\n }\n copyFrom(other) {\n if (this._length != other._length)\n throw new Error(`Lengths differ (${this._length} != ${other._length})`);\n this.copy(other._data, this._data, this.lengthInInts);\n this._version++;\n }\n get length() {\n return this._length;\n }\n get buffer() {\n return this._data;\n }\n set buffer(data) {\n this._data = data;\n this._version++;\n }\n get version() {\n return this._version;\n }\n set version(value) {\n this._version = value;\n }\n incrementVersion(notify = true) {\n this._version++;\n }\n get lengthInInts() {\n return Math.floor((this._length + 0x1f) / 0x20);\n }\n get versionedName() {\n return this._version == this._versionedNameVersion ? this._versionedName : '';\n }\n set versionedName(name) {\n this._versionedName = name;\n this._versionedNameVersion = this._version;\n }\n get self() {\n return this;\n }\n setLength(value) {\n if (value < 0)\n throw new Error('should be >= 0');\n if (value == this._length)\n return;\n const nIntsNeeded = Math.floor((value + 0x1f) / 0x20);\n if ((nIntsNeeded > this._data.length) || ((nIntsNeeded + this.SHRINK_THRESHOLD) < this._data.length)) {\n const newData = new Uint32Array(nIntsNeeded);\n this.copy(this._data, newData, (nIntsNeeded > this._data.length) ? this._data.length : nIntsNeeded);\n this._data = newData;\n }\n if (value > this._length) {\n if (this._length % 0x20 > 0)\n this._data[this.lengthInInts - 1] &= (1 << ((this._length % 0x20) & 0x1f)) - 1;\n this._data.fill(0, this.lengthInInts, nIntsNeeded);\n }\n this._length = value;\n this._version++;\n }\n static fromAnd(set1, set2) {\n if (set1._length != set2._length)\n throw new Error(`Lengths differ (${set1._length} != ${set2._length})`);\n const temp = new BitArray(set1._length);\n temp._length = set1._length;\n temp._data = BitArray._createBuffer(temp._length);\n temp._version = 0;\n const len = set1.lengthInInts;\n for (let i = 0; i < len; i++)\n temp._data[i] = set1._data[i] & set2._data[i];\n return temp;\n }\n static _createBuffer(length) {\n return new Uint32Array(Math.floor((length + 0x1f) / 0x20));\n }\n static fromValues(values) {\n const temp = new BitArray(values.length);\n temp._version = 0;\n for (let i = 0; i < temp._length; i++) {\n if (values[i])\n temp._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);\n }\n return temp;\n }\n /// Constructs a [BitSet] of length [count], where idx-th bit is determined by a call to [flag] (idx).\n static fromSeq(count, flag) {\n const temp = new BitArray(count);\n for (let i = 0; i < count; ++i)\n temp.setBit(i, flag(i));\n temp._version = 0;\n return temp;\n }\n /// Constructs a [BitSet] from a string [s] containing '0' or '1'.\n static fromString(s) {\n return BitArray.fromSeq(s.length, (i) => s.charAt(i) == '1');\n }\n /// Constructs a [BitSet], based on length [_length] and byte array [_data].\n static fromUint32Array(_length, _data) {\n const temp = new BitArray(_length);\n temp._data = _data;\n return temp;\n }\n /// Deserializes a [BitSet] from [bytes].\n static fromBytes(bytes) {\n const len = bytes.length;\n const temp = new BitArray(len * 8);\n temp._data = new Uint32Array(Math.floor((len + 3) / 4));\n temp._length = len * 8;\n let num1 = 0;\n let num2 = 0;\n while ((len - num2) >= 4) {\n temp._data[num1++] = (((bytes[num2] & 0xff) | ((bytes[num2 + 1] & 0xff) << 8)) |\n ((bytes[num2 + 2] & 0xff) << 0x10)) | ((bytes[num2 + 3] & 0xff) << 0x18);\n num2 += 4;\n }\n if (len - num2 == 3)\n temp._data[num1] = (bytes[num2 + 2] & 0xff) << 0x10;\n if (len - num2 == 2)\n temp._data[num1] |= (bytes[num2 + 1] & 0xff) << 8;\n if (len - num2 == 1)\n temp._data[num1] |= bytes[num2] & 0xff;\n temp._version = 0;\n return temp;\n }\n toString() {\n return `${this._length} bits, ${this.countBits(true)} set`;\n }\n /// Performs deep comparison of two bitsets.\n equals(other) {\n if (this == other)\n return true;\n if (other == null)\n return false;\n if (this._length != other._length)\n return false;\n if (this._length == 0)\n return true;\n for (let i = 0; i < this._data.length - 1; i++)\n if (this._data[i] != other._data[i])\n return false;\n for (let i = (this._data.length - 1) * 8; i < this._length; i++) {\n if (this.getBit(i) != other.getBit(i))\n return false;\n }\n return true;\n }\n /** Clones a bitset. */\n clone() {\n const bitArray = new BitArray(0, false);\n bitArray._data = Uint32Array.from(this._data); // effective length: (lengthInInts)\n bitArray._length = this._length;\n bitArray._version = this._version;\n return bitArray;\n }\n /** Initializes a bitset. */\n init(flag, notify) {\n this.setAll(false, false);\n for (let i = 0; i < this._length; i++) {\n if (flag(i))\n this._data[Math.floor(i / 0x20)] |= 1 << ((i % 0x20) & 0x1f);\n }\n this.incrementVersion(notify);\n return this;\n }\n /// Inverts a bitset.\n invert(notify = true) {\n for (let i = 0; i < this._data.length; i++)\n this._data[i] ^= -1;\n this.incrementVersion(notify);\n }\n /// Sets all bits to [value], optionally suppressing notifications.\n setAll(value, notify = false) {\n const flags = value ? -1 : 0;\n const len = this.lengthInInts;\n for (let i = 0; i < len; i++) //todo: optimize\n this._data[i] = flags;\n this.incrementVersion(notify);\n }\n /// Sets bits at [indexes] position to [value].\n /// Clears the bitset if [clear] flag is true.\n /// Change notification is raised when [notify] is true.\n setIndexes(indexes, value = true, clear = true, notify = true) {\n if (clear)\n this.setAll(!value, false);\n for (const i of indexes)\n this.setFast(i, value);\n this.incrementVersion(notify);\n }\n everyIndex(indexes, value = true) {\n for (const index of indexes) {\n if (this.getBit(index) != value)\n return false;\n }\n return true;\n }\n anyIndex(indexes, value = true) {\n for (const index of indexes) {\n if (this.getBit(index) == value)\n return true;\n }\n return false;\n }\n setWhere(check, value = true, clear = true, notify = true, allowClear = true) {\n if (clear && allowClear)\n this.setAll(!value, false);\n if (allowClear) {\n for (let i = 0; i < this._length; i++) {\n if (check(i))\n this.setFast(i, value);\n }\n }\n else {\n for (let i = 0; i < this._length; i++)\n this.setFast(i, check(i) ? value : !value);\n }\n this.incrementVersion(notify);\n }\n getRange(from, to) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length, 'to');\n const arr = [];\n for (let i = from; i < to; ++i)\n arr.push(this.getBit(i));\n return BitArray.fromValues(arr);\n }\n getRangeAsList(from, to) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length, 'to');\n const arr = [];\n for (let i = from; i < to; ++i)\n arr.push(this.getBit(i));\n return arr;\n }\n setRange(from, to, value, notify = true) {\n this.assureInRange(from, 0, this._length - 1, 'from');\n this.assureInRange(to, 0, this._length - 1, 'to');\n const start = Math.min(from, to);\n const end = Math.max(from, to);\n //todo: optimize\n if (value) {\n for (let i = start; i <= end; i++)\n this.setTrue(i);\n }\n else {\n for (let i = start; i <= end; i++)\n this.setFalse(i);\n }\n this.incrementVersion(notify);\n return this;\n }\n /// Sets n randomly chosen bits to value, remaining bits to !value.\n setRandom(n, value, notify = true) {\n if (n < 0 || n > this._length)\n throw new Error('n must be >= 0 && <= Count');\n if (n > this._length / 2)\n this.setRandom(this._length - n, !value);\n this.setAll(!value);\n for (let k = 0; k < n;) {\n const i = Math.floor(Math.random() * this._length);\n if (this.getBit(i) == value)\n continue;\n this.setFast(i, value);\n k++;\n }\n this.incrementVersion(notify);\n }\n /// Modifies current bitset by performing the bitwise AND operation against the\n /// corresponding elements in the specified bitset.\n and(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] &= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise AND NOT operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n andNot(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n const len = this.lengthInInts;\n for (let num2 = 0; num2 < len; num2++)\n this._data[num2] &= ~value._data[num2];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise NOT AND operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n notAnd(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] = (~this._data[i]) & value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Inverts all bit values in the current bitset\n not(notify = true) {\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] = ~this._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise OR operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n or(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] |= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Performs the bitwise exclusive OR operation on the elements in the current bitset\n /// against the corresponding elements in the specified bitset.\n xor(value, notify = true) {\n if (this._length != value._length)\n throw new Error('Array lengths differ.');\n for (let i = 0, len = this.lengthInInts; i < len; i++)\n this._data[i] ^= value._data[i];\n this.incrementVersion(notify);\n return this;\n }\n /// Inserts n 0-bits at position pos, resizing self and shifting bits appropriately.\n insertAt(pos, n, flag = false) {\n this.assureInRange(pos, 0, this._length, 'pos');\n if (n == 0)\n return;\n //TODO: optimize\n //the most primitive implementation, optimize it later!\n // beginUpdate();\n const oldlength = this._length;\n this.setLength(this._length + n);\n //if (!contains(!flag)) return; // nothing to do\n for (let i = oldlength - 1; i >= pos; i--)\n this.setBit(i + n, this.getBit(i));\n for (let i = pos; i < pos + n; i++)\n this.setBit(i, flag);\n // endUpdate();\n }\n /// Deletes n bits beginning at position pos, resizing self and shifting remaining\n /// bits appropriately.\n removeAt(pos, n = 1) {\n // the most primitive implementation, optimize it later!\n if (n < 0)\n throw new Error('n cannot be negative');\n this.assureInRange(pos, 0, this._length - n, 'pos');\n if (this.contains(true)) {\n for (let i = pos; i < this._length - n; i++)\n this.setBit(i, this.getBit(i + n));\n }\n this.setLength(this._length - n);\n }\n removeByMask(mask, flag = true) {\n if (this._length != mask.length)\n throw new Error('length != mask.length');\n if (mask == this) { // no need to iterate\n this.setLength(mask.countBits(!flag));\n this.setAll(!flag);\n }\n else {\n let dstIdx = 0;\n for (let srcIdx = -1; (srcIdx = mask.findNext(srcIdx, !flag)) != -1;)\n this.setFast(dstIdx++, this.getBit(srcIdx));\n this._length = dstIdx;\n this._version++;\n }\n return this;\n }\n /// Similar to the [] operator.\n getBit(pos) {\n return (this._data[Math.floor(pos / 0x20)] & (1 << (pos & 0x1f))) != 0;\n }\n /// Similar to the [] operator.\n setBit(pos, bit, notify = true) {\n this.setFast(pos, bit);\n if (notify)\n this._version++;\n else\n this._version++;\n }\n /// Sets [i]-th bit to [value], does not check bounds, does not increment version\n setFast(i, value) {\n if (value)\n this._data[Math.floor(i / 0x20)] |= 1 << (i & 0x1f);\n else\n this._data[Math.floor(i / 0x20)] &= ~(1 << (i & 0x1f));\n }\n setTrue(pos) {\n this._data[Math.floor(pos / 0x20)] |= 1 << (pos & 0x1f);\n }\n setFalse(pos) {\n this._data[Math.floor(pos / 0x20)] &= ~(1 << (pos & 0x1f));\n }\n trueCount() {\n return this.countBits(true);\n }\n falseCount() {\n return this.countBits(false);\n }\n /// Counts bits of the specified value.\n countBits(value) {\n if (this._length == 0)\n return 0;\n if (this._selectedCountVersion != this._version) {\n this._selectedCount = 0;\n const len = this.lengthInInts;\n let i = 0;\n for (; i < len - 1; i++) {\n for (let k = this._data[i]; k != 0; k >>>= 8) { //todo: cast data[i] to uint\n this._selectedCount += BitArray._onBitCount[k & 0xff];\n }\n }\n // The last int.\n let k = this._data[i];\n const remainingBits = this._length & 0x1f;\n if (remainingBits != 0) /* if remainingBits == 0, the last int is fully used and ALL bits should be left as is */\n k &= ~((4294967295) << remainingBits);\n for (; k != 0; k >>>= 8)\n this._selectedCount += BitArray._onBitCount[k & 0xff];\n this._selectedCountVersion = this._version;\n }\n return (value ? this._selectedCount : this._length - this._selectedCount);\n }\n /// Returns a number of set bits where also [check] is true\n countWhere(check) {\n let result = 0;\n if (this.trueCount() == this._length) {\n for (let i = 0; i < this._length; i++)\n result += check(i) ? 1 : 0;\n }\n else {\n for (let i = -1; (i = this.findNext(i, true)) != -1;)\n result += check(i) ? 1 : 0;\n }\n return result;\n }\n /// Performs bit \"and\" and counts bits of the specified value, without bitset modification.\n andWithCountBits(second, value) {\n if (this._length == 0)\n return 0;\n let count = 0;\n const len = this.lengthInInts;\n let i = 0;\n for (; i < len - 1; i++) {\n for (let k = this._data[i] & second._data[i]; k != 0; k >>>= 8)\n count += BitArray._onBitCount[k & 0xff];\n }\n // The last int.\n let k = this._data[i] & second._data[i];\n const remainingBits = this._length & 0x1f;\n if (remainingBits != 0)\n k &= ~((4294967295) << remainingBits);\n for (; k != 0; k >>>= 8)\n count += BitArray._onBitCount[k & 0xff];\n return (value ? count : this._length - count);\n }\n clear() {\n this.setLength(0);\n }\n contains(value) {\n return this.findNext(-1, value) >= 0;\n }\n get allTrue() {\n return this.countBits(true) == this._length;\n }\n get allFalse() {\n return this.countBits(false) == this._length;\n }\n get anyTrue() {\n return this.countBits(true) > 0;\n }\n get anyFalse() {\n return this.countBits(false) > 0;\n }\n /// Returns the position of the next bit of the specified value, starting from the specified position.\n /// Returns -1, if there are no such bits.\n findNext(index, value = true) {\n this.assureInRange(index, -1, this._length, 'index');\n if (index >= this._length - 1)\n return -1;\n index = index < 0 ? 0 : index + 1; // skip start\n let unusedBits = index & 0x1f;\n const numInts = this.lengthInInts;\n for (let i = Math.floor(index / 32); i < numInts; i++) {\n let k = (value ? this._data[i] : ~this._data[i]); // uint cast\n if (unusedBits != 0) {\n k &= ((0xffffffff << unusedBits) & 0xffffffff);\n unusedBits = 0;\n }\n else if (!value && k == -4294967296) /* looking for false, all bits are set */ {\n continue;\n }\n for (let j = 0; k != 0; j += 8, k >>>= 8) {\n const p = BitArray._firstOnBit[k & 0xff];\n if (p >= 0) {\n index = p + (i * 32) + j;\n if (index >= this._length)\n return -1;\n return index;\n }\n }\n }\n return -1;\n }\n /// Finds previous bit of the specified value in the bitset.\n findPrev(index, value = true) {\n if (index == 0)\n return -1;\n this.assureInRange(index, -1, this._length, 'index');\n index = index < 0 ? this._length - 1 : index - 1; // skip start\n const lastIntIdx = Math.floor(index / 0x20);\n let remainingBits = (index + 1) & 0x1f;\n for (let i = lastIntIdx; i >= 0; i--) {\n let k = (value ? this._data[i] : ~this._data[i]); // cast\n if (remainingBits != 0) {\n k &= ~((4294967295) << remainingBits);\n remainingBits = 0;\n }\n for (let j = 24; k != 0; j -= 8, k <<= 8) {\n const p = BitArray._lastOnBit[k >>> 0x18];\n if (p >= 0)\n return p + (i * 32) + j;\n }\n }\n return -1;\n }\n}\nBitArray._onBitCount = Int8Array.from([\n 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,\n 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8\n]);\nBitArray._firstOnBit = Int8Array.from([\n -1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,\n 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0\n]);\nBitArray._lastOnBit = Int8Array.from([\n -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,\n 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\n 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7\n]);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0LWFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYml0LWFycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUTtJQW9FM0IsWUFBWSxHQUF5QixFQUFFLGVBQWlDLEtBQUs7UUFackUsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQiw0QkFBdUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQiwwQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFLdkIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDM0IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ25CLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUMsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtvQkFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7U0FDdkI7YUFBTSxJQUFJLEdBQUcsWUFBWSxXQUFXLEVBQUU7WUFDckMsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFrQixDQUFDO1lBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBc0IsQ0FBQztTQUN2QzthQUFNO1lBQ0wsTUFBTSxJ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QUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FBQyxDQUFDLENBQUM7QUFFNUMsb0JBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMvQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUFDLENBQUMsQ0FBQztBQUU1QyxtQkFBVSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDakMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQy9DLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5QyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQml0QXJyYXkge1xuICBzdGF0aWMgX29uQml0Q291bnQgPSBJbnQ4QXJyYXkuZnJvbShbXG4gICAgMCwgMSwgMSwgMiwgMSwgMiwgMiwgMywgMSwgMiwgMiwgMywgMiwgMywgMywgNCxcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LFxuICAgIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxuICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsIDIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LFxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXG4gICAgMiwgMywgMywgNCwgMywgNCwgNCwgNSwgMywgNCwgNCwgNSwgNCwgNSwgNSwgNixcbiAgICAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LFxuICAgIDMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsIDQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsXG4gICAgNCwgNSwgNSwgNiwgNSwgNiwgNiwgNywgNSwgNiwgNiwgNywgNiwgNywgNywgOF0pO1xuXG4gIHN0YXRpYyBfZmlyc3RPbkJpdCA9IEludDhBcnJheS5mcm9tKFtcbiAgICAtMSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA2LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNSwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDcsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA1LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDQsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNiwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMCxcbiAgICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwLFxuICAgIDUsIDAsIDEsIDAsIDIsIDAsIDEsIDAsIDMsIDAsIDEsIDAsIDIsIDAsIDEsIDAsXG4gICAgNCwgMCwgMSwgMCwgMiwgMCwgMSwgMCwgMywgMCwgMSwgMCwgMiwgMCwgMSwgMF0pO1xuXG4gIHN0YXRpYyBfbGFzdE9uQml0ID0gSW50OEFycmF5LmZyb20oW1xuICAgIC0xLCAwLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLFxuICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSxcbiAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LFxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXG4gICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNixcbiAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LFxuICAgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LFxuICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsXG4gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNyxcbiAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3XSk7XG5cbiAgcHJpdmF0ZSBfZGF0YTogVWludDMyQXJyYXk7XG4gIHByaXZhdGUgX2xlbmd0aCA9IDA7XG4gIHByaXZhdGUgX3ZlcnNpb24gPSAwO1xuICBwcml2YXRlIF91cGRhdGVMZXZlbCA9IDA7XG4gIHByaXZhdGUgX3NlbGVjdGVkQ291bnQgPSAwO1xuICBwcml2YXRlIF9zZWxlY3RlZENvdW50VmVyc2lvbiA9IC0xO1xuICBwcml2YXRlIF9zZWxlY3RlZEluZGV4ZXNWZXJzaW9uID0gLTE7XG4gIHByaXZhdGUgX3ZlcnNpb25lZE5hbWUgPSAnJztcbiAgcHJpdmF0ZSBfdmVyc2lvbmVkTmFtZVZlcnNpb24gPSAtMTtcbiAgU0hSSU5LX1RIUkVTSE9MRCA9IDB4MTAwO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFVpbnQzMkFycmF5LCBsZW5ndGg6IG51bWJlcilcbiAgY29uc3RydWN0b3IobGVuZ3RoOiBudW1iZXIsIGRlZmF1bHRWYWx1ZT86IGJvb2xlYW4pXG4gIGNvbnN0cnVjdG9yKGFyZzogbnVtYmVyIHwgVWludDMyQXJyYXksIGRlZmF1bHRWYWx1ZTogYm9vbGVhbiB8IG51bWJlciA9IGZhbHNlKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBhcmc7XG4gICAgICBjb25zdCBidWZmID0gQml0QXJyYXkuX2NyZWF0ZUJ1ZmZlcihsZW5ndGgpO1xuICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmYubGVuZ3RoOyBpKyspXG4gICAgICAgICAgYnVmZltpXSA9IC0xO1xuICAgICAgfVxuICAgICAgdGhpcy5fZGF0YSA9IGJ1ZmY7XG4gICAgICB0aGlzLl9sZW5ndGggPSBsZW5ndGg7XG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBVaW50MzJBcnJheSkge1xuICAgICAgdGhpcy5fZGF0YSA9IGFyZyBhcyBVaW50MzJBcnJheTtcbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRlZmF1bHRWYWx1ZSBhcyBudW1iZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb25zdHJ1Y3RvcicpO1xuICAgIH1cbiAgfVxuXG5cbiAgZ2V0UmF3RGF0YSgpIHsgcmV0dXJuIHRoaXMuX2RhdGE7IH1cblxuICBhc3N1cmVHb2V6KG51bTogbnVtYmVyLCBhcmdOYW1lOiBTdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobnVtIDwgMCkgdGhyb3cgbmV3IEVycm9yKGAke2FyZ05hbWV9IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gemVyb2ApO1xuICB9XG5cbiAgYXNzdXJlSW5SYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIsIGFyZ05hbWU6IFN0cmluZyk6IHZvaWQge1xuICAgIGlmICgodmFsdWUgPCBtaW4pIHx8ICh2YWx1ZSA+IG1heCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFyZ3VtZW50ICR7YXJnTmFtZX0gKCR7dmFsdWV9KSBvdXQgb2YgcmFuZ2UgKCR7bWlufSwgJHttYXh9KWApO1xuICB9XG5cbiAgY29weShzcmM6IFVpbnQzMkFycmF5LCBkc3Q6IFVpbnQzMkFycmF5LCBjb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKVxuICAgICAgZHN0W2ldID0gc3JjW2ldO1xuICB9XG5cbiAgY29weUZyb20ob3RoZXI6IEJpdEFycmF5KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSBvdGhlci5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMZW5ndGhzIGRpZmZlciAoJHt0aGlzLl9sZW5ndGh9ICE9ICR7b3RoZXIuX2xlbmd0aH0pYCk7XG4gICAgdGhpcy5jb3B5KG90aGVyLl9kYXRhLCB0aGlzLl9kYXRhLCB0aGlzLmxlbmd0aEluSW50cyk7XG4gICAgdGhpcy5fdmVyc2lvbisrO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGJ1ZmZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHNldCBidWZmZXIoZGF0YTogVWludDMyQXJyYXkpIHtcbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBnZXQgdmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgfVxuXG4gIHNldCB2ZXJzaW9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92ZXJzaW9uID0gdmFsdWU7XG4gIH1cblxuICBpbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBnZXQgbGVuZ3RoSW5JbnRzKCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKCh0aGlzLl9sZW5ndGggKyAweDFmKSAvIDB4MjApO1xuICB9XG5cbiAgZ2V0IHZlcnNpb25lZE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb24gPT0gdGhpcy5fdmVyc2lvbmVkTmFtZVZlcnNpb24gPyB0aGlzLl92ZXJzaW9uZWROYW1lIDogJyc7XG4gIH1cblxuICBzZXQgdmVyc2lvbmVkTmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lID0gbmFtZTtcbiAgICB0aGlzLl92ZXJzaW9uZWROYW1lVmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XG4gIH1cblxuICBnZXQgc2VsZigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldExlbmd0aCh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlIDwgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hvdWxkIGJlID49IDAnKTtcblxuICAgIGlmICh2YWx1ZSA9PSB0aGlzLl9sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuSW50c05lZWRlZCA9IE1hdGguZmxvb3IoKHZhbHVlICsgMHgxZikgLyAweDIwKTtcbiAgICBpZiAoKG5JbnRzTmVlZGVkID4gdGhpcy5fZGF0YS5sZW5ndGgpIHx8ICgobkludHNOZWVkZWQgKyB0aGlzLlNIUklOS19USFJFU0hPTEQpIDwgdGhpcy5fZGF0YS5sZW5ndGgpKSB7XG4gICAgICBjb25zdCBuZXdEYXRhID0gbmV3IFVpbnQzMkFycmF5KG5JbnRzTmVlZGVkKTtcbiAgICAgIHRoaXMuY29weSh0aGlzLl9kYXRhLCBuZXdEYXRhLCAobkludHNOZWVkZWQgPiB0aGlzLl9kYXRhLmxlbmd0aCkgPyB0aGlzLl9kYXRhLmxlbmd0aCA6IG5JbnRzTmVlZGVkKTtcbiAgICAgIHRoaXMuX2RhdGEgPSBuZXdEYXRhO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA+IHRoaXMuX2xlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuX2xlbmd0aCAlIDB4MjAgPiAwKVxuICAgICAgICB0aGlzLl9kYXRhW3RoaXMubGVuZ3RoSW5JbnRzIC0gMV0gJj0gKDEgPDwgKCh0aGlzLl9sZW5ndGggJSAweDIwKSAmIDB4MWYpKSAtIDE7XG5cbiAgICAgIHRoaXMuX2RhdGEuZmlsbCgwLCB0aGlzLmxlbmd0aEluSW50cywgbkludHNOZWVkZWQpO1xuICAgIH1cbiAgICB0aGlzLl9sZW5ndGggPSB2YWx1ZTtcbiAgICB0aGlzLl92ZXJzaW9uKys7XG4gIH1cblxuICBzdGF0aWMgZnJvbUFuZChzZXQxOiBCaXRBcnJheSwgc2V0MjogQml0QXJyYXkpOiBCaXRBcnJheSB7XG4gICAgaWYgKHNldDEuX2xlbmd0aCAhPSBzZXQyLl9sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExlbmd0aHMgZGlmZmVyICgke3NldDEuX2xlbmd0aH0gIT0gJHtzZXQyLl9sZW5ndGh9KWApO1xuXG4gICAgY29uc3QgdGVtcCA9IG5ldyBCaXRBcnJheShzZXQxLl9sZW5ndGgpO1xuICAgIHRlbXAuX2xlbmd0aCA9IHNldDEuX2xlbmd0aDtcbiAgICB0ZW1wLl9kYXRhID0gQml0QXJyYXkuX2NyZWF0ZUJ1ZmZlcih0ZW1wLl9sZW5ndGgpO1xuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuXG4gICAgY29uc3QgbGVuID0gc2V0MS5sZW5ndGhJbkludHM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIHRlbXAuX2RhdGFbaV0gPSBzZXQxLl9kYXRhW2ldICYgc2V0Mi5fZGF0YVtpXTtcblxuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2NyZWF0ZUJ1ZmZlcihsZW5ndGg6IG51bWJlcik6IFVpbnQzMkFycmF5IHtcbiAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KE1hdGguZmxvb3IoKGxlbmd0aCArIDB4MWYpIC8gMHgyMCkpO1xuICB9XG5cbiAgc3RhdGljIGZyb21WYWx1ZXModmFsdWVzOiBBcnJheTxib29sZWFuPik6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wLl9sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlc1tpXSlcbiAgICAgICAgdGVtcC5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xuICAgIH1cbiAgICByZXR1cm4gdGVtcDtcbiAgfVxuXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0gb2YgbGVuZ3RoIFtjb3VudF0sIHdoZXJlIGlkeC10aCBiaXQgaXMgZGV0ZXJtaW5lZCBieSBhIGNhbGwgdG8gW2ZsYWddIChpZHgpLlxuICBzdGF0aWMgZnJvbVNlcShjb3VudDogbnVtYmVyLCBmbGFnOiBGdW5jdGlvbik6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KGNvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpXG4gICAgICB0ZW1wLnNldEJpdChpLCBmbGFnKGkpKTtcblxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgLy8vIENvbnN0cnVjdHMgYSBbQml0U2V0XSBmcm9tIGEgc3RyaW5nIFtzXSBjb250YWluaW5nICcwJyBvciAnMScuXG4gIHN0YXRpYyBmcm9tU3RyaW5nKHM6IHN0cmluZyk6IEJpdEFycmF5IHtcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVNlcShzLmxlbmd0aCwgKGk6IG51bWJlcikgPT4gcy5jaGFyQXQoaSkgPT0gJzEnKTtcbiAgfVxuXG4gIC8vLyBDb25zdHJ1Y3RzIGEgW0JpdFNldF0sIGJhc2VkIG9uIGxlbmd0aCBbX2xlbmd0aF0gYW5kIGJ5dGUgYXJyYXkgW19kYXRhXS5cbiAgc3RhdGljIGZyb21VaW50MzJBcnJheShfbGVuZ3RoOiBudW1iZXIsIF9kYXRhOiBVaW50MzJBcnJheSk6IEJpdEFycmF5IHtcbiAgICBjb25zdCB0ZW1wID0gbmV3IEJpdEFycmF5KF9sZW5ndGgpO1xuICAgIHRlbXAuX2RhdGEgPSBfZGF0YTtcbiAgICByZXR1cm4gdGVtcDtcbiAgfVxuXG4gIC8vLyBEZXNlcmlhbGl6ZXMgYSBbQml0U2V0XSBmcm9tIFtieXRlc10uXG4gIHN0YXRpYyBmcm9tQnl0ZXMoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBCaXRBcnJheSB7XG4gICAgY29uc3QgbGVuID0gYnl0ZXMubGVuZ3RoO1xuICAgIGNvbnN0IHRlbXAgPSBuZXcgQml0QXJyYXkobGVuICogOCk7XG4gICAgdGVtcC5fZGF0YSA9IG5ldyBVaW50MzJBcnJheShNYXRoLmZsb29yKChsZW4gKyAzKSAvIDQpKTtcbiAgICB0ZW1wLl9sZW5ndGggPSBsZW4gKiA4O1xuICAgIGxldCBudW0xID0gMDtcbiAgICBsZXQgbnVtMiA9IDA7XG5cbiAgICB3aGlsZSAoKGxlbiAtIG51bTIpID49IDQpIHtcbiAgICAgIHRlbXAuX2RhdGFbbnVtMSsrXSA9IChcbiAgICAgICAgKChieXRlc1tudW0yXSAmIDB4ZmYpIHwgKChieXRlc1tudW0yICsgMV0gJiAweGZmKSA8PCA4KSkgfFxuICAgICAgICAoKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTApXG4gICAgICApIHwgKChieXRlc1tudW0yICsgM10gJiAweGZmKSA8PCAweDE4KTtcblxuICAgICAgbnVtMiArPSA0O1xuICAgIH1cblxuICAgIGlmIChsZW4gLSBudW0yID09IDMpXG4gICAgICB0ZW1wLl9kYXRhW251bTFdID0gKGJ5dGVzW251bTIgKyAyXSAmIDB4ZmYpIDw8IDB4MTA7XG5cbiAgICBpZiAobGVuIC0gbnVtMiA9PSAyKVxuICAgICAgdGVtcC5fZGF0YVtudW0xXSB8PSAoYnl0ZXNbbnVtMiArIDFdICYgMHhmZikgPDwgODtcblxuICAgIGlmIChsZW4gLSBudW0yID09IDEpXG4gICAgICB0ZW1wLl9kYXRhW251bTFdIHw9IGJ5dGVzW251bTJdICYgMHhmZjtcblxuICAgIHRlbXAuX3ZlcnNpb24gPSAwO1xuICAgIHJldHVybiB0ZW1wO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5fbGVuZ3RofSBiaXRzLCAke3RoaXMuY291bnRCaXRzKHRydWUpfSBzZXRgO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIGRlZXAgY29tcGFyaXNvbiBvZiB0d28gYml0c2V0cy5cbiAgZXF1YWxzKG90aGVyOiBCaXRBcnJheSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gb3RoZXIuX2xlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLl9sZW5ndGggPT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoIC0gMTsgaSsrKVxuICAgICAgaWYgKHRoaXMuX2RhdGFbaV0gIT0gb3RoZXIuX2RhdGFbaV0pIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAobGV0IGkgPSAodGhpcy5fZGF0YS5sZW5ndGggLSAxKSAqIDg7IGkgPCB0aGlzLl9sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZ2V0Qml0KGkpICE9IG90aGVyLmdldEJpdChpKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBDbG9uZXMgYSBiaXRzZXQuICovXG4gIGNsb25lKCk6IEJpdEFycmF5IHtcbiAgICBjb25zdCBiaXRBcnJheSA9IG5ldyBCaXRBcnJheSgwLCBmYWxzZSk7XG4gICAgYml0QXJyYXkuX2RhdGEgPSBVaW50MzJBcnJheS5mcm9tKHRoaXMuX2RhdGEpOyAvLyBlZmZlY3RpdmUgbGVuZ3RoOiAobGVuZ3RoSW5JbnRzKVxuICAgIGJpdEFycmF5Ll9sZW5ndGggPSB0aGlzLl9sZW5ndGg7XG4gICAgYml0QXJyYXkuX3ZlcnNpb24gPSB0aGlzLl92ZXJzaW9uO1xuICAgIHJldHVybiBiaXRBcnJheTtcbiAgfVxuXG4gIC8qKiBJbml0aWFsaXplcyBhIGJpdHNldC4gKi9cbiAgaW5pdChmbGFnOiBGdW5jdGlvbiwgbm90aWZ5OiBib29sZWFuKTogQml0QXJyYXkge1xuICAgIHRoaXMuc2V0QWxsKGZhbHNlLCBmYWxzZSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZmxhZyhpKSlcbiAgICAgICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKGkgLyAweDIwKV0gfD0gMSA8PCAoKGkgJSAweDIwKSAmIDB4MWYpO1xuICAgIH1cblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIEludmVydHMgYSBiaXRzZXQuXG4gIGludmVydChub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9kYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSBePSAtMTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICB9XG5cbiAgLy8vIFNldHMgYWxsIGJpdHMgdG8gW3ZhbHVlXSwgb3B0aW9uYWxseSBzdXBwcmVzc2luZyBub3RpZmljYXRpb25zLlxuICBzZXRBbGwodmFsdWU6IGJvb2xlYW4sIG5vdGlmeSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgZmxhZ3MgPSB2YWx1ZSA/IC0xIDogMDtcbiAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIC8vdG9kbzogb3B0aW1pemVcbiAgICAgIHRoaXMuX2RhdGFbaV0gPSBmbGFncztcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICB9XG5cbiAgLy8vIFNldHMgYml0cyBhdCBbaW5kZXhlc10gcG9zaXRpb24gdG8gW3ZhbHVlXS5cbiAgLy8vIENsZWFycyB0aGUgYml0c2V0IGlmIFtjbGVhcl0gZmxhZyBpcyB0cnVlLlxuICAvLy8gQ2hhbmdlIG5vdGlmaWNhdGlvbiBpcyByYWlzZWQgd2hlbiBbbm90aWZ5XSBpcyB0cnVlLlxuICBzZXRJbmRleGVzKGluZGV4ZXM6IEFycmF5PG51bWJlcj4sIHZhbHVlID0gdHJ1ZSwgY2xlYXIgPSB0cnVlLCBub3RpZnkgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKGNsZWFyKVxuICAgICAgdGhpcy5zZXRBbGwoIXZhbHVlLCBmYWxzZSk7XG5cbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kZXhlcylcbiAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIGV2ZXJ5SW5kZXgoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWUgPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaW5kZXgpICE9IHZhbHVlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYW55SW5kZXgoaW5kZXhlczogQXJyYXk8bnVtYmVyPiwgdmFsdWUgPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaW5kZXgpID09IHZhbHVlKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc2V0V2hlcmUoY2hlY2s6IEZ1bmN0aW9uLCB2YWx1ZSA9IHRydWUsIGNsZWFyID0gdHJ1ZSwgbm90aWZ5ID0gdHJ1ZSwgYWxsb3dDbGVhciA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoY2xlYXIgJiYgYWxsb3dDbGVhcilcbiAgICAgIHRoaXMuc2V0QWxsKCF2YWx1ZSwgZmFsc2UpO1xuXG4gICAgaWYgKGFsbG93Q2xlYXIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNoZWNrKGkpKVxuICAgICAgICAgIHRoaXMuc2V0RmFzdChpLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspXG4gICAgICAgIHRoaXMuc2V0RmFzdChpLCBjaGVjayhpKSA/IHZhbHVlIDogIXZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIGdldFJhbmdlKGZyb206IG51bWJlciwgdG86IG51bWJlcik6IEJpdEFycmF5IHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCwgJ3RvJyk7XG4gICAgY29uc3QgYXJyOiBBcnJheTxib29sZWFuPiA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87ICsraSlcbiAgICAgIGFyci5wdXNoKHRoaXMuZ2V0Qml0KGkpKTtcbiAgICByZXR1cm4gQml0QXJyYXkuZnJvbVZhbHVlcyhhcnIpO1xuICB9XG5cbiAgZ2V0UmFuZ2VBc0xpc3QoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKTogYm9vbGVhbltdIHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCwgJ3RvJyk7XG4gICAgY29uc3QgYXJyOiBib29sZWFuW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOyArK2kpXG4gICAgICBhcnIucHVzaCh0aGlzLmdldEJpdChpKSk7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG5cbiAgc2V0UmFuZ2UoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbiwgbm90aWZ5ID0gdHJ1ZSk6IEJpdEFycmF5IHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoZnJvbSwgMCwgdGhpcy5fbGVuZ3RoIC0gMSwgJ2Zyb20nKTtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UodG8sIDAsIHRoaXMuX2xlbmd0aCAtIDEsICd0bycpO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbihmcm9tLCB0byk7XG4gICAgY29uc3QgZW5kID0gTWF0aC5tYXgoZnJvbSwgdG8pO1xuXG4gICAgLy90b2RvOiBvcHRpbWl6ZVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKVxuICAgICAgICB0aGlzLnNldFRydWUoaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKylcbiAgICAgICAgdGhpcy5zZXRGYWxzZShpKTtcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBTZXRzIG4gcmFuZG9tbHkgY2hvc2VuIGJpdHMgdG8gdmFsdWUsIHJlbWFpbmluZyBiaXRzIHRvICF2YWx1ZS5cbiAgc2V0UmFuZG9tKG46IG51bWJlciwgdmFsdWU6IGJvb2xlYW4sIG5vdGlmeSA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAobiA8IDAgfHwgbiA+IHRoaXMuX2xlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBtdXN0IGJlID49IDAgJiYgPD0gQ291bnQnKTtcblxuICAgIGlmIChuID4gdGhpcy5fbGVuZ3RoIC8gMilcbiAgICAgIHRoaXMuc2V0UmFuZG9tKHRoaXMuX2xlbmd0aCAtIG4sICF2YWx1ZSk7XG5cbiAgICB0aGlzLnNldEFsbCghdmFsdWUpO1xuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBuOykge1xuICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMuX2xlbmd0aCk7XG4gICAgICBpZiAodGhpcy5nZXRCaXQoaSkgPT0gdmFsdWUpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5zZXRGYXN0KGksIHZhbHVlKTtcbiAgICAgIGsrKztcbiAgICB9XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgfVxuXG4gIC8vLyBNb2RpZmllcyBjdXJyZW50IGJpdHNldCBieSBwZXJmb3JtaW5nIHRoZSBiaXR3aXNlIEFORCBvcGVyYXRpb24gYWdhaW5zdCB0aGVcbiAgLy8vIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIGFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSAmPSB2YWx1ZS5fZGF0YVtpXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIEFORCBOT1Qgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIGFuZE5vdCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xuICAgIGZvciAobGV0IG51bTIgPSAwOyBudW0yIDwgbGVuOyBudW0yKyspXG4gICAgICB0aGlzLl9kYXRhW251bTJdICY9IH52YWx1ZS5fZGF0YVtudW0yXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIFBlcmZvcm1zIHRoZSBiaXR3aXNlIE5PVCBBTkQgb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIG5vdEFuZCh2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpOiBCaXRBcnJheSB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCAhPSB2YWx1ZS5fbGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBsZW5ndGhzIGRpZmZlci4nKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9ICh+dGhpcy5fZGF0YVtpXSkgJiB2YWx1ZS5fZGF0YVtpXTtcblxuICAgIHRoaXMuaW5jcmVtZW50VmVyc2lvbihub3RpZnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8vIEludmVydHMgYWxsIGJpdCB2YWx1ZXMgaW4gdGhlIGN1cnJlbnQgYml0c2V0XG4gIG5vdChub3RpZnkgPSB0cnVlKTogQml0QXJyYXkge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxlbmd0aEluSW50czsgaSA8IGxlbjsgaSsrKVxuICAgICAgdGhpcy5fZGF0YVtpXSA9IH50aGlzLl9kYXRhW2ldO1xuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLy8gUGVyZm9ybXMgdGhlIGJpdHdpc2UgT1Igb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIG9yKHZhbHVlOiBCaXRBcnJheSwgbm90aWZ5ID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLl9sZW5ndGggIT0gdmFsdWUuX2xlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJyYXkgbGVuZ3RocyBkaWZmZXIuJyk7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5sZW5ndGhJbkludHM7IGkgPCBsZW47IGkrKylcbiAgICAgIHRoaXMuX2RhdGFbaV0gfD0gdmFsdWUuX2RhdGFbaV07XG5cbiAgICB0aGlzLmluY3JlbWVudFZlcnNpb24obm90aWZ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBQZXJmb3JtcyB0aGUgYml0d2lzZSBleGNsdXNpdmUgT1Igb3BlcmF0aW9uIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBiaXRzZXRcbiAgLy8vIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBiaXRzZXQuXG4gIHhvcih2YWx1ZTogQml0QXJyYXksIG5vdGlmeSA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IHZhbHVlLl9sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IGxlbmd0aHMgZGlmZmVyLicpO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzOyBpIDwgbGVuOyBpKyspXG4gICAgICB0aGlzLl9kYXRhW2ldIF49IHZhbHVlLl9kYXRhW2ldO1xuXG4gICAgdGhpcy5pbmNyZW1lbnRWZXJzaW9uKG5vdGlmeSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLy8gSW5zZXJ0cyBuIDAtYml0cyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIGJpdHMgYXBwcm9wcmlhdGVseS5cbiAgaW5zZXJ0QXQocG9zOiBudW1iZXIsIG46IG51bWJlciwgZmxhZyA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKHBvcywgMCwgdGhpcy5fbGVuZ3RoLCAncG9zJyk7XG5cbiAgICBpZiAobiA9PSAwKSByZXR1cm47XG5cbiAgICAvL1RPRE86IG9wdGltaXplXG4gICAgLy90aGUgbW9zdCBwcmltaXRpdmUgaW1wbGVtZW50YXRpb24sIG9wdGltaXplIGl0IGxhdGVyIVxuXG4gICAgLy8gYmVnaW5VcGRhdGUoKTtcbiAgICBjb25zdCBvbGRsZW5ndGggPSB0aGlzLl9sZW5ndGg7XG4gICAgdGhpcy5zZXRMZW5ndGgodGhpcy5fbGVuZ3RoICsgbik7XG5cbiAgICAvL2lmICghY29udGFpbnMoIWZsYWcpKSByZXR1cm47IC8vIG5vdGhpbmcgdG8gZG9cblxuICAgIGZvciAobGV0IGkgPSBvbGRsZW5ndGggLSAxOyBpID49IHBvczsgaS0tKVxuICAgICAgdGhpcy5zZXRCaXQoaSArIG4sIHRoaXMuZ2V0Qml0KGkpKTtcblxuICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCBwb3MgKyBuOyBpKyspXG4gICAgICB0aGlzLnNldEJpdChpLCBmbGFnKTtcblxuICAgIC8vIGVuZFVwZGF0ZSgpO1xuICB9XG5cbiAgLy8vIERlbGV0ZXMgbiBiaXRzIGJlZ2lubmluZyBhdCBwb3NpdGlvbiBwb3MsIHJlc2l6aW5nIHNlbGYgYW5kIHNoaWZ0aW5nIHJlbWFpbmluZ1xuICAvLy8gYml0cyBhcHByb3ByaWF0ZWx5LlxuICByZW1vdmVBdChwb3M6IG51bWJlciwgbiA9IDEpOiB2b2lkIHtcbiAgICAvLyB0aGUgbW9zdCBwcmltaXRpdmUgaW1wbGVtZW50YXRpb24sIG9wdGltaXplIGl0IGxhdGVyIVxuICAgIGlmIChuIDwgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignbiBjYW5ub3QgYmUgbmVnYXRpdmUnKTtcblxuICAgIHRoaXMuYXNzdXJlSW5SYW5nZShwb3MsIDAsIHRoaXMuX2xlbmd0aCAtIG4sICdwb3MnKTtcblxuICAgIGlmICh0aGlzLmNvbnRhaW5zKHRydWUpKSB7XG4gICAgICBmb3IgKGxldCBpID0gcG9zOyBpIDwgdGhpcy5fbGVuZ3RoIC0gbjsgaSsrKVxuICAgICAgICB0aGlzLnNldEJpdChpLCB0aGlzLmdldEJpdChpICsgbikpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0TGVuZ3RoKHRoaXMuX2xlbmd0aCAtIG4pO1xuICB9XG5cbiAgcmVtb3ZlQnlNYXNrKG1hc2s6IEJpdEFycmF5LCBmbGFnID0gdHJ1ZSk6IEJpdEFycmF5IHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoICE9IG1hc2subGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsZW5ndGggIT0gbWFzay5sZW5ndGgnKTtcblxuICAgIGlmIChtYXNrID09IHRoaXMpIHsgLy8gbm8gbmVlZCB0byBpdGVyYXRlXG4gICAgICB0aGlzLnNldExlbmd0aChtYXNrLmNvdW50Qml0cyghZmxhZykpO1xuICAgICAgdGhpcy5zZXRBbGwoIWZsYWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZHN0SWR4ID0gMDtcblxuICAgICAgZm9yIChsZXQgc3JjSWR4ID0gLTE7IChzcmNJZHggPSBtYXNrLmZpbmROZXh0KHNyY0lkeCwgIWZsYWcpKSAhPSAtMTspXG4gICAgICAgIHRoaXMuc2V0RmFzdChkc3RJZHgrKywgdGhpcy5nZXRCaXQoc3JjSWR4KSk7XG5cbiAgICAgIHRoaXMuX2xlbmd0aCA9IGRzdElkeDtcbiAgICAgIHRoaXMuX3ZlcnNpb24rKztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cbiAgZ2V0Qml0KHBvczogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLl9kYXRhW01hdGguZmxvb3IocG9zIC8gMHgyMCldICYgKDEgPDwgKHBvcyAmIDB4MWYpKSkgIT0gMDtcbiAgfVxuXG4gIC8vLyBTaW1pbGFyIHRvIHRoZSBbXSBvcGVyYXRvci5cbiAgc2V0Qml0KHBvczogbnVtYmVyLCBiaXQ6IGJvb2xlYW4sIG5vdGlmeSA9IHRydWUpIHtcbiAgICB0aGlzLnNldEZhc3QocG9zLCBiaXQpO1xuICAgIGlmIChub3RpZnkpXG4gICAgICB0aGlzLl92ZXJzaW9uKys7XG4gICAgZWxzZVxuICAgICAgdGhpcy5fdmVyc2lvbisrO1xuICB9XG5cbiAgLy8vIFNldHMgW2ldLXRoIGJpdCB0byBbdmFsdWVdLCBkb2VzIG5vdCBjaGVjayBib3VuZHMsIGRvZXMgbm90IGluY3JlbWVudCB2ZXJzaW9uXG4gIHNldEZhc3QoaTogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSlcbiAgICAgIHRoaXMuX2RhdGFbTWF0aC5mbG9vcihpIC8gMHgyMCldIHw9IDEgPDwgKGkgJiAweDFmKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLl9kYXRhW01hdGguZmxvb3IoaSAvIDB4MjApXSAmPSB+KDEgPDwgKGkgJiAweDFmKSk7XG4gIH1cblxuICBzZXRUcnVlKHBvczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSB8PSAxIDw8IChwb3MgJiAweDFmKTtcbiAgfVxuXG4gIHNldEZhbHNlKHBvczogbnVtYmVyKSB7XG4gICAgdGhpcy5fZGF0YVtNYXRoLmZsb29yKHBvcyAvIDB4MjApXSAmPSB+KDEgPDwgKHBvcyAmIDB4MWYpKTtcbiAgfVxuXG4gIHRydWVDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyh0cnVlKTtcbiAgfVxuXG4gIGZhbHNlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHMoZmFsc2UpO1xuICB9XG5cbiAgLy8vIENvdW50cyBiaXRzIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuXG4gIGNvdW50Qml0cyh2YWx1ZTogYm9vbGVhbik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuX2xlbmd0aCA9PSAwKSByZXR1cm4gMDtcblxuICAgIGlmICh0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZENvdW50ID0gMDtcbiAgICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoSW5JbnRzO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgayA9IHRoaXMuX2RhdGFbaV07IGsgIT0gMDsgayA+Pj49IDgpIHsgLy90b2RvOiBjYXN0IGRhdGFbaV0gdG8gdWludFxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBsYXN0IGludC5cbiAgICAgIGxldCBrID0gdGhpcy5fZGF0YVtpXTtcbiAgICAgIGNvbnN0IHJlbWFpbmluZ0JpdHMgPSB0aGlzLl9sZW5ndGggJiAweDFmO1xuICAgICAgaWYgKHJlbWFpbmluZ0JpdHMgIT0gMCkgLyogaWYgcmVtYWluaW5nQml0cyA9PSAwLCB0aGUgbGFzdCBpbnQgaXMgZnVsbHkgdXNlZCBhbmQgQUxMIGJpdHMgc2hvdWxkIGJlIGxlZnQgYXMgaXMgKi9cbiAgICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcblxuICAgICAgZm9yICg7IGsgIT0gMDsgayA+Pj49IDgpXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQ291bnQgKz0gQml0QXJyYXkuX29uQml0Q291bnRbayAmIDB4ZmZdO1xuXG4gICAgICB0aGlzLl9zZWxlY3RlZENvdW50VmVyc2lvbiA9IHRoaXMuX3ZlcnNpb247XG4gICAgfVxuXG4gICAgcmV0dXJuICh2YWx1ZSA/IHRoaXMuX3NlbGVjdGVkQ291bnQgOiB0aGlzLl9sZW5ndGggLSB0aGlzLl9zZWxlY3RlZENvdW50KTtcbiAgfVxuXG4gIC8vLyBSZXR1cm5zIGEgbnVtYmVyIG9mIHNldCBiaXRzIHdoZXJlIGFsc28gW2NoZWNrXSBpcyB0cnVlXG4gIGNvdW50V2hlcmUoY2hlY2s6IEZ1bmN0aW9uKTogbnVtYmVyIHtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBpZiAodGhpcy50cnVlQ291bnQoKSA9PSB0aGlzLl9sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGVuZ3RoOyBpKyspXG4gICAgICAgIHJlc3VsdCArPSBjaGVjayhpKSA/IDEgOiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gLTE7IChpID0gdGhpcy5maW5kTmV4dChpLCB0cnVlKSkgIT0gLTE7KVxuICAgICAgICByZXN1bHQgKz0gY2hlY2soaSkgPyAxIDogMDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vLyBQZXJmb3JtcyBiaXQgXCJhbmRcIiBhbmQgY291bnRzIGJpdHMgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgd2l0aG91dCBiaXRzZXQgbW9kaWZpY2F0aW9uLlxuICBhbmRXaXRoQ291bnRCaXRzKHNlY29uZDogQml0QXJyYXksIHZhbHVlOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fbGVuZ3RoID09IDApIHJldHVybiAwO1xuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aEluSW50cztcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGsgPSB0aGlzLl9kYXRhW2ldICYgc2Vjb25kLl9kYXRhW2ldOyBrICE9IDA7IGsgPj4+PSA4KVxuICAgICAgICBjb3VudCArPSBCaXRBcnJheS5fb25CaXRDb3VudFtrICYgMHhmZl07XG4gICAgfVxuXG4gICAgLy8gVGhlIGxhc3QgaW50LlxuICAgIGxldCBrID0gdGhpcy5fZGF0YVtpXSAmIHNlY29uZC5fZGF0YVtpXTtcbiAgICBjb25zdCByZW1haW5pbmdCaXRzID0gdGhpcy5fbGVuZ3RoICYgMHgxZjtcbiAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKVxuICAgICAgayAmPSB+KCg0Mjk0OTY3Mjk1KSA8PCByZW1haW5pbmdCaXRzKTtcbiAgICBmb3IgKDsgayAhPSAwOyBrID4+Pj0gOClcbiAgICAgIGNvdW50ICs9IEJpdEFycmF5Ll9vbkJpdENvdW50W2sgJiAweGZmXTtcblxuICAgIHJldHVybiAodmFsdWUgPyBjb3VudCA6IHRoaXMuX2xlbmd0aCAtIGNvdW50KTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0TGVuZ3RoKDApO1xuICB9XG5cbiAgY29udGFpbnModmFsdWU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maW5kTmV4dCgtMSwgdmFsdWUpID49IDA7XG4gIH1cblxuICBnZXQgYWxsVHJ1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHModHJ1ZSkgPT0gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFsbEZhbHNlKCkge1xuICAgIHJldHVybiB0aGlzLmNvdW50Qml0cyhmYWxzZSkgPT0gdGhpcy5fbGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGFueVRydWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY291bnRCaXRzKHRydWUpID4gMDtcbiAgfVxuXG4gIGdldCBhbnlGYWxzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudEJpdHMoZmFsc2UpID4gMDtcbiAgfVxuXG4gIC8vLyBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbmV4dCBiaXQgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgc3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLlxuICAvLy8gUmV0dXJucyAtMSwgaWYgdGhlcmUgYXJlIG5vIHN1Y2ggYml0cy5cbiAgZmluZE5leHQoaW5kZXg6IG51bWJlciwgdmFsdWUgPSB0cnVlKTogbnVtYmVyIHtcbiAgICB0aGlzLmFzc3VyZUluUmFuZ2UoaW5kZXgsIC0xLCB0aGlzLl9sZW5ndGgsICdpbmRleCcpO1xuXG4gICAgaWYgKGluZGV4ID49IHRoaXMuX2xlbmd0aCAtIDEpIHJldHVybiAtMTtcbiAgICBpbmRleCA9IGluZGV4IDwgMCA/IDAgOiBpbmRleCArIDE7IC8vIHNraXAgc3RhcnRcbiAgICBsZXQgdW51c2VkQml0cyA9IGluZGV4ICYgMHgxZjtcbiAgICBjb25zdCBudW1JbnRzID0gdGhpcy5sZW5ndGhJbkludHM7XG5cbiAgICBmb3IgKGxldCBpID0gTWF0aC5mbG9vcihpbmRleCAvIDMyKTsgaSA8IG51bUludHM7IGkrKykge1xuICAgICAgbGV0IGsgPSAodmFsdWUgPyB0aGlzLl9kYXRhW2ldIDogfnRoaXMuX2RhdGFbaV0pOyAvLyB1aW50IGNhc3RcbiAgICAgIGlmICh1bnVzZWRCaXRzICE9IDApIHtcbiAgICAgICAgayAmPSAoKDB4ZmZmZmZmZmYgPDwgdW51c2VkQml0cykgJiAweGZmZmZmZmZmKTtcbiAgICAgICAgdW51c2VkQml0cyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKCF2YWx1ZSAmJiBrID09IC00Mjk0OTY3Mjk2KSAvKiBsb29raW5nIGZvciBmYWxzZSwgYWxsIGJpdHMgYXJlIHNldCAqL3tcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGogPSAwOyBrICE9IDA7IGogKz0gOCwgayA+Pj49IDgpIHtcbiAgICAgICAgY29uc3QgcCA9IEJpdEFycmF5Ll9maXJzdE9uQml0W2sgJiAweGZmXTtcbiAgICAgICAgaWYgKHAgPj0gMCkge1xuICAgICAgICAgIGluZGV4ID0gcCArIChpICogMzIpICsgajtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gdGhpcy5fbGVuZ3RoKSByZXR1cm4gLTE7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vLyBGaW5kcyBwcmV2aW91cyBiaXQgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSBpbiB0aGUgYml0c2V0LlxuICBmaW5kUHJldihpbmRleDogbnVtYmVyLCB2YWx1ZSA9IHRydWUpOiBudW1iZXIge1xuICAgIGlmIChpbmRleCA9PSAwKSByZXR1cm4gLTE7XG4gICAgdGhpcy5hc3N1cmVJblJhbmdlKGluZGV4LCAtMSwgdGhpcy5fbGVuZ3RoLCAnaW5kZXgnKTtcblxuICAgIGluZGV4ID0gaW5kZXggPCAwID8gdGhpcy5fbGVuZ3RoIC0gMSA6IGluZGV4IC0gMTsgLy8gc2tpcCBzdGFydFxuXG4gICAgY29uc3QgbGFzdEludElkeCA9IE1hdGguZmxvb3IoaW5kZXggLyAweDIwKTtcbiAgICBsZXQgcmVtYWluaW5nQml0cyA9IChpbmRleCArIDEpICYgMHgxZjtcblxuICAgIGZvciAobGV0IGkgPSBsYXN0SW50SWR4OyBpID49IDA7IGktLSkge1xuICAgICAgbGV0IGsgPSAodmFsdWUgPyB0aGlzLl9kYXRhW2ldIDogfnRoaXMuX2RhdGFbaV0pOyAvLyBjYXN0XG4gICAgICBpZiAocmVtYWluaW5nQml0cyAhPSAwKSB7XG4gICAgICAgIGsgJj0gfigoNDI5NDk2NzI5NSkgPDwgcmVtYWluaW5nQml0cyk7XG4gICAgICAgIHJlbWFpbmluZ0JpdHMgPSAwO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaiA9IDI0OyBrICE9IDA7IGogLT0gOCwgayA8PD0gOCkge1xuICAgICAgICBjb25zdCBwID0gQml0QXJyYXkuX2xhc3RPbkJpdFtrID4+PiAweDE4XTtcbiAgICAgICAgaWYgKHAgPj0gMClcbiAgICAgICAgICByZXR1cm4gcCArIChpICogMzIpICsgajtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG4iXX0=","// import * as 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 { GAP_SYMBOL } from '../utils/macromolecule/types';\nimport { SeqHandler } from '../utils/seq-handler';\nimport { splitAlignedSequences } from '../utils/splitter';\nimport { tanimotoSimilarity } from '@datagrok-libraries/ml/src/distance-metrics-methods';\nexport function encodeMonomers(col) {\n let encodeSymbol = MONOMER_ENCODE_MIN;\n const monomerSymbolDict = {};\n const sh = SeqHandler.forColumn(col);\n const encodedStringArray = [];\n const rowCount = col.length;\n for (let rowIdx = 0; rowIdx < rowCount; ++rowIdx) {\n let encodedMonomerStr = '';\n const monomers = sh.getSplitted(rowIdx);\n for (const cm of monomers.canonicals) {\n if (!monomerSymbolDict[cm]) {\n if (encodeSymbol > MONOMER_ENCODE_MAX) {\n grok.shell.error(`Not enough symbols to encode monomers`);\n return null;\n }\n monomerSymbolDict[cm] = encodeSymbol;\n encodeSymbol++;\n }\n encodedMonomerStr += String.fromCodePoint(monomerSymbolDict[cm]);\n }\n encodedStringArray.push(encodedMonomerStr);\n }\n return DG.Column.fromStrings('encodedMolecules', encodedStringArray);\n}\nexport function getMolfilesFromSeq(col, monomersLibObject) {\n const sh = SeqHandler.forColumn(col);\n const monomersDict = createMomomersMolDict(monomersLibObject);\n const molFiles = [];\n const rowCount = col.length;\n for (let rowIdx = 0; rowIdx < rowCount; ++rowIdx) {\n const monomers = sh.getSplitted(rowIdx);\n const molFilesForSeq = [];\n for (let j = 0; j < monomers.length; ++j) {\n const cm = monomers.getCanonical(j);\n if (cm) {\n if (!monomersDict[cm]) {\n grok.shell.warning(`Monomer ${cm} 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[cm])));\n }\n }\n molFiles.push(molFilesForSeq);\n }\n return molFiles;\n}\nexport function getMolfilesFromSingleSeq(cell, monomersLibObject) {\n const sh = SeqHandler.forColumn(cell.column);\n const monomersDict = createMomomersMolDict(monomersLibObject);\n const molFiles = [];\n const monomers = sh.getSplitted(cell.rowIndex);\n const molFilesForSeq = [];\n for (let j = 0; j < monomers.length; ++j) {\n const cm = monomers.getCanonical(j);\n if (cm) {\n if (!monomersDict[cm]) {\n grok.shell.warning(`Monomer ${cm} is missing in HELM library. Structure cannot be created`);\n return null;\n }\n molFilesForSeq.push(JSON.parse(JSON.stringify(monomersDict[cm])));\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 var _a, _b, _c, _d, _e;\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 monomer[_a = \"author\" /* HELM_REQUIRED_FIELD.AUTHOR */] ?? (monomer[_a] = '');\n monomer[_b = \"id\" /* HELM_REQUIRED_FIELD.ID */] ?? (monomer[_b] = 0);\n monomer[_c = \"smiles\" /* HELM_REQUIRED_FIELD.SMILES */] ?? (monomer[_c] = '');\n monomer[_d = \"monomerType\" /* HELM_REQUIRED_FIELD.MONOMER_TYPE */] ?? (monomer[_d] = 'Backbone');\n monomer[_e = \"createDate\" /* HELM_REQUIRED_FIELD.CREATE_DATE */] ?? (monomer[_e] = null);\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 /* eslint-enable max-len */\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 referenceMonomerCanonical = referenceSequence.getCanonical(position);\n const referenceMol = monomerLib.getMonomer('PEPTIDE', referenceMonomerCanonical)?.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 referenceMonomerCanonical === '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] += referenceMonomerCanonical !== GAP_SYMBOL && monomerCategoryIdx !== emptyCategoryIdx ?\n similarityColData[monomerCategoryIdx] :\n referenceMonomerCanonical === GAP_SYMBOL && 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/* eslint-disable max-len */\n/** Calculates chemical similarity between each pair of monomers.\n * @param {string[]} monomerSet Set of unique monomers.\n * @returns {Promise<{scoringMatrix: number[][], alphabetIndexes: {[monomerId: string]: number}}>} Ojbect containing similarity scoring matrix and monomer to index mapping. */\nexport async function calculateMonomerSimilarity(monomerSet) {\n /* eslint-enable max-len */\n const libHelper = await getMonomerLibHelper();\n const monomerLib = libHelper.getBioLib();\n const scoringMatrix = [];\n const alphabetIndexes = {};\n const monomerMolecules = monomerSet.map((monomer) => monomerLib.getMonomer('PEPTIDE', monomer)?.smiles ?? '');\n const monomerMoleculesCol = DG.Column.fromStrings('smiles', monomerMolecules);\n for (let monomerIndex = 0; monomerIndex < monomerMolecules.length; ++monomerIndex) {\n const monomer = monomerSet[monomerIndex];\n alphabetIndexes[monomer] = monomerIndex;\n const monomerMol = monomerMolecules[monomerIndex];\n const similarityScores = monomerMol === '' ? new Array(monomerMolecules.length).fill(0) :\n (await grok.chem.getSimilarities(monomerMoleculesCol, monomerMol)).getRawData();\n similarityScores[monomerIndex] = 1;\n scoringMatrix[monomerIndex] = Array.from(similarityScores);\n }\n return { scoringMatrix, alphabetIndexes };\n}\nexport async function getMonomerSubstitutionMatrix(monomerSet, fingerprintType = 'Morgan') {\n const libHelper = await getMonomerLibHelper();\n const monomerLib = libHelper.getBioLib();\n const scoringMatrix = new Array(monomerSet.length).fill(0).map(() => new Array(monomerSet.length).fill(0));\n const alphabetIndexes = {};\n const monomerMolecules = monomerSet.map((monomer) => monomerLib.getMonomer('PEPTIDE', monomer)?.smiles ?? '');\n const fingerprintsFunc = DG.Func.find({ package: 'Chem', name: 'getFingerprints' })[0];\n if (!fingerprintsFunc) {\n console.warn('Function \"Chem:getFingerprints\" is not found in chem package. falling back to Morgan fingerprints');\n return await calculateMonomerSimilarity(monomerSet);\n }\n const monomerMoleculesCol = DG.Column.fromStrings('smiles', monomerMolecules);\n // needed for function to work\n const _unusedMolDf = DG.DataFrame.fromColumns([monomerMoleculesCol]);\n const fingerPrints = (await fingerprintsFunc.apply({ col: monomerMoleculesCol, fingerprintType: fingerprintType }))?.entries;\n if (!fingerPrints) {\n console.warn(`${fingerprintType} Fingerprints could not be calculated for monomers from chem package.\n falling back to Morgan fingerprints`);\n return await calculateMonomerSimilarity(monomerSet);\n }\n for (let i = 0; i < fingerPrints.length; ++i) {\n scoringMatrix[i][i] = 1;\n alphabetIndexes[monomerSet[i]] = i;\n if (!fingerPrints[i])\n continue;\n for (let j = i + 1; j < fingerPrints.length; ++j) {\n if (!fingerPrints[j])\n continue;\n scoringMatrix[i][j] = scoringMatrix[j][i] = tanimotoSimilarity(fingerPrints[i], fingerPrints[j]);\n }\n }\n return { scoringMatrix, alphabetIndexes };\n}\n;\n//# sourceMappingURL=monomer-utils.js.map","import BitArray from '@datagrok-libraries/utils/src/bit-array';\nimport { BitArrayMetricsNames } from './typed-metrics/consts';\nimport { MmDistanceFunctionsNames } from './macromolecule-distance-functions';\nexport const similarityMetric = {\n [BitArrayMetricsNames.Tanimoto]: tanimotoSimilarity,\n [BitArrayMetricsNames.Dice]: diceSimilarity,\n [BitArrayMetricsNames.Asymmetric]: asymmetricSimilarity,\n [BitArrayMetricsNames.BraunBlanquet]: braunBlanquetSimilarity,\n [BitArrayMetricsNames.Cosine]: cosineSimilarity,\n [BitArrayMetricsNames.Kulczynski]: kulczynskiSimilarity,\n [BitArrayMetricsNames.McConnaughey]: mcConnaugheySimilarity,\n [BitArrayMetricsNames.RogotGoldberg]: rogotGoldbergSimilarity,\n [BitArrayMetricsNames.Russel]: russelSimilarity,\n [BitArrayMetricsNames.Sokal]: sokalSimilarity,\n [BitArrayMetricsNames.Hamming]: hammingSimilarity,\n [BitArrayMetricsNames.Euclidean]: euclideanSimilarity,\n};\nexport const distanceMetrics = {\n [BitArrayMetricsNames.Tanimoto]: tanimotoDistance,\n [BitArrayMetricsNames.Dice]: diceDistance,\n [BitArrayMetricsNames.Asymmetric]: asymmetricDistance,\n [BitArrayMetricsNames.BraunBlanquet]: braunBlanquetDistance,\n [BitArrayMetricsNames.Cosine]: cosineDistance,\n [BitArrayMetricsNames.Kulczynski]: kulczynskiDistance,\n [BitArrayMetricsNames.McConnaughey]: mcConnaugheyDistance,\n [BitArrayMetricsNames.RogotGoldberg]: rogotGoldbergDistance,\n [BitArrayMetricsNames.Russel]: russelDistance,\n [BitArrayMetricsNames.Sokal]: sokalDistance,\n [BitArrayMetricsNames.Hamming]: hammingDistance,\n [BitArrayMetricsNames.Euclidean]: euclideanDistance,\n};\nexport const CHEM_SIMILARITY_METRICS = [\n BitArrayMetricsNames.Tanimoto,\n BitArrayMetricsNames.Dice,\n BitArrayMetricsNames.Cosine\n];\nexport const SEQ_SPACE_SIMILARITY_METRICS = [\n BitArrayMetricsNames.Tanimoto,\n BitArrayMetricsNames.Asymmetric,\n BitArrayMetricsNames.Cosine,\n BitArrayMetricsNames.Sokal\n];\nexport const MACROMOLECULE_SIMILARITY_METRICS = [\n MmDistanceFunctionsNames.HAMMING,\n MmDistanceFunctionsNames.LEVENSHTEIN,\n MmDistanceFunctionsNames.MONOMER_CHEMICAL_DISTANCE,\n MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH\n];\nexport function tanimotoSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n if (total == 0)\n return 1.0;\n const common = x.andWithCountBits(y, true);\n return common / (total - common);\n}\nexport function tanimotoDistance(x, y) {\n return 1 - tanimotoSimilarity(x, y);\n}\nexport function tanimotoDistanceIntArray(x, y) {\n const xb = new BitArray(x, x.length * 32);\n const yb = new BitArray(y, y.length * 32);\n return getDistanceFromSimilarity(tanimotoSimilarity(xb, yb));\n}\nexport function diceSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n if (total == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return 2 * common / total;\n}\nexport function diceDistance(x, y) {\n return 1 - diceSimilarity(x, y);\n}\nexport function cosineSimilarity(x, y) {\n const total = x.trueCount() * y.trueCount();\n if (total == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / Math.sqrt(total);\n}\nexport function cosineDistance(x, y) {\n return 1 - cosineSimilarity(x, y);\n}\nexport function euclideanSimilarity(x, y) {\n return getSimilarityFromDistance(euclideanDistance(x, y));\n}\nexport function euclideanDistance(x, y) {\n return Math.sqrt(x.trueCount() + y.trueCount() - 2 * x.andWithCountBits(y, true));\n}\nexport function hammingSimilarity(x, y) {\n return getSimilarityFromDistance(hammingDistance(x, y));\n}\nexport function hammingDistance(x, y) {\n return x.trueCount() + y.trueCount() - 2 * x.andWithCountBits(y, true);\n}\nexport function sokalSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const common = x.andWithCountBits(y, true);\n return common / (2 * total - 3 * common);\n}\nexport function sokalDistance(x, y) {\n return 1 - sokalSimilarity(x, y);\n}\nexport function kulczynskiSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const totalProd = x.trueCount() * y.trueCount();\n if (totalProd == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return (common * total) / (2 * totalProd);\n}\nexport function kulczynskiDistance(x, y) {\n return getDistanceFromSimilarity(kulczynskiSimilarity(x, y));\n}\nexport function mcConnaugheySimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const totalProd = x.trueCount() * y.trueCount();\n if (totalProd == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return (common * total - totalProd) / totalProd;\n}\nexport function mcConnaugheyDistance(x, y) {\n return getDistanceFromSimilarity(mcConnaugheySimilarity(x, y));\n}\nexport function asymmetricSimilarity(x, y) {\n const min = Math.min(x.trueCount(), y.trueCount());\n if (min == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / min;\n}\nexport function asymmetricDistance(x, y) {\n return 1 - asymmetricSimilarity(x, y);\n}\nexport function braunBlanquetSimilarity(x, y) {\n const max = Math.max(x.trueCount(), y.trueCount());\n if (max == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / max;\n}\nexport function braunBlanquetDistance(x, y) {\n return getDistanceFromSimilarity(braunBlanquetSimilarity(x, y));\n}\nexport function russelSimilarity(x, y) {\n if (x.length == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / x.length;\n}\nexport function russelDistance(x, y) {\n return getDistanceFromSimilarity(russelSimilarity(x, y));\n}\nexport function rogotGoldbergSimilarity(x, y) {\n const common = x.andWithCountBits(y, true);\n const total = x.countBits(true) + y.countBits(true);\n const len = x.length;\n const diff = len - total + common;\n if ((common == len) || (diff == len))\n return 1.0;\n else\n return common / total + diff / (2 * len - total);\n}\nexport function rogotGoldbergDistance(x, y) {\n return getDistanceFromSimilarity(rogotGoldbergSimilarity(x, y));\n}\nexport function getSimilarityFromDistance(distance) {\n return 1 / (1 + distance);\n}\nexport function getDistanceFromSimilarity(similarity) {\n return similarity === 0 ? 3.402823E+38 : (1 / similarity) - 1;\n}\nexport function numericDistance(args) {\n if (args && args.range != undefined && args.range > 0) {\n const range = args.range;\n return (a, b) => Math.abs(a - b) / range;\n }\n return (a, b) => Math.abs(a - b);\n}\nexport function commonItemsCount(args) {\n const mostCommon = args?.mostCommon ?? new Set();\n return (arr1, arr2) => {\n const len1 = arr1.length;\n const len2 = arr2.length;\n let count = 0;\n let i1 = 0;\n let i2 = 0;\n while ((i1 < len1) && (i2 < len2)) {\n if (arr1[i1] === arr2[i2]) {\n if (!mostCommon?.has(arr1[i1]))\n ++count;\n ++i1;\n ++i2;\n }\n else if (arr1[i1] < arr2[i2]) {\n ++i1;\n }\n else {\n ++i2;\n }\n }\n return count;\n };\n}\nexport function inverseCommonItemsCount(args) {\n const f = commonItemsCount(args);\n return (arr1, arr2) => {\n if (arr2.length === 0 || arr1.length === 0)\n return 10000;\n return Math.min(arr1.length, arr2.length) / (f(arr1, arr2) + 0.0001);\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sUUFBUSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9ELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRTVFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE2RDtJQUN4RixDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxFQUFFLGtCQUFrQjtJQUNuRCxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLGNBQWM7SUFDM0MsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxvQkFBb0I7SUFDdkQsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBRSx1QkFBdUI7SUFDN0QsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDL0MsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxvQkFBb0I7SUFDdkQsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxzQkFBc0I7SUFDM0QsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBRSx1QkFBdUI7SUFDN0QsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDL0MsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxlQUFlO0lBQzdDLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUUsaUJBQWlCO0lBQ2pELENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEVBQUUsbUJBQW1CO0NBQ3RELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQTZEO0lBQ3ZGLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEVB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Z0JBQ0wsRUFBRSxFQUFFLENBQUM7YUFDTjtpQkFBTSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQUUsRUFBRSxFQUFFLENBQUM7YUFBRTtpQkFBTTtnQkFBRSxFQUFFLEVBQUUsQ0FBQzthQUFFO1NBQ3pEO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLHVCQUF1QixDQUFDLElBQWlDO0lBQ3ZFLE1BQU0sQ0FBQyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sQ0FBQyxJQUF1QixFQUFFLElBQXVCLEVBQUUsRUFBRTtRQUMxRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUN4QyxPQUFPLEtBQUssQ0FBQztRQUVmLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDdkUsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaXRBcnJheSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy9iaXQtYXJyYXknO1xuaW1wb3J0IHtCaXRBcnJheU1ldHJpY3NOYW1lc30gZnJvbSAnLi90eXBlZC1tZXRyaWNzL2NvbnN0cyc7XG5pbXBvcnQge01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lc30gZnJvbSAnLi9tYWNyb21vbGVjdWxlLWRpc3RhbmNlLWZ1bmN0aW9ucyc7XG5cbmV4cG9ydCBjb25zdCBzaW1pbGFyaXR5TWV0cmljOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KSA9PiBudW1iZXIgfSA9IHtcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvXTogdGFuaW1vdG9TaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuRGljZV06IGRpY2VTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQXN5bW1ldHJpY106IGFzeW1tZXRyaWNTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQnJhdW5CbGFucXVldF06IGJyYXVuQmxhbnF1ZXRTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lXTogY29zaW5lU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkt1bGN6eW5za2ldOiBrdWxjenluc2tpU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV06IG1jQ29ubmF1Z2hleVNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Sb2dvdEdvbGRiZXJnXTogcm9nb3RHb2xkYmVyZ1NpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5SdXNzZWxdOiBydXNzZWxTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuU29rYWxdOiBzb2thbFNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5IYW1taW5nXTogaGFtbWluZ1NpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5FdWNsaWRlYW5dOiBldWNsaWRlYW5TaW1pbGFyaXR5LFxufTtcblxuZXhwb3J0IGNvbnN0IGRpc3RhbmNlTWV0cmljczogeyBbbmFtZTogc3RyaW5nXTogKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSkgPT4gbnVtYmVyIH0gPSB7XG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b106IHRhbmltb3RvRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5EaWNlXTogZGljZURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQXN5bW1ldHJpY106IGFzeW1tZXRyaWNEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkJyYXVuQmxhbnF1ZXRdOiBicmF1bkJsYW5xdWV0RGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdOiBjb3NpbmVEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkt1bGN6eW5za2ldOiBrdWxjenluc2tpRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5NY0Nvbm5hdWdoZXldOiBtY0Nvbm5hdWdoZXlEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJvZ290R29sZGJlcmddOiByb2dvdEdvbGRiZXJnRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5SdXNzZWxdOiBydXNzZWxEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlNva2FsXTogc29rYWxEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkhhbW1pbmddOiBoYW1taW5nRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5FdWNsaWRlYW5dOiBldWNsaWRlYW5EaXN0YW5jZSxcbn07XG5cbmV4cG9ydCBjb25zdCBDSEVNX1NJTUlMQVJJVFlfTUVUUklDUyA9IFtcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG8sXG4gIEJpdEFycmF5TWV0cmljc05hbWVzLkRpY2UsXG4gIEJpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV07XG5leHBvcnQgY29uc3QgU0VRX1NQQUNFX1NJTUlMQVJJVFlfTUVUUklDUyA9IFtcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG8sXG4gIEJpdEFycmF5TWV0cmljc05hbWVzLkFzeW1tZXRyaWMsXG4gIEJpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZSxcbiAgQml0QXJyYXlNZXRyaWNzTmFtZXMuU29rYWxdO1xuZXhwb3J0IGNvbnN0IE1BQ1JPTU9MRUNVTEVfU0lNSUxBUklUWV9NRVRSSUNTID0gW1xuICBNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuSEFNTUlORyxcbiAgTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkxFVkVOU0hURUlOLFxuICBNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRSxcbiAgTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLk5FRURMRU1BTk5fV1VOU0NIXG5dO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiB0YW5pbW90b1NpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsID09IDApIHJldHVybiAxLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvICh0b3RhbCAtIGNvbW1vbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0YW5pbW90b0Rpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiAxIC0gdGFuaW1vdG9TaW1pbGFyaXR5KHgsIHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFuaW1vdG9EaXN0YW5jZUludEFycmF5KHg6IFVpbnQzMkFycmF5LCB5OiBVaW50MzJBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHhiID0gbmV3IEJpdEFycmF5KHgsIHgubGVuZ3RoICogMzIpO1xuICBjb25zdCB5YiA9IG5ldyBCaXRBcnJheSh5LCB5Lmxlbmd0aCAqIDMyKTtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkodGFuaW1vdG9TaW1pbGFyaXR5KHhiLCB5YikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGljZVNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIDIgKiBjb21tb24gLyB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpY2VEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gMSAtIGRpY2VTaW1pbGFyaXR5KHgsIHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29zaW5lU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKiB5LnRydWVDb3VudCgpO1xuICBpZiAodG90YWwgPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gTWF0aC5zcXJ0KHRvdGFsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvc2luZURpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiAxIC0gY29zaW5lU2ltaWxhcml0eSh4LCB5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV1Y2xpZGVhblNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldFNpbWlsYXJpdHlGcm9tRGlzdGFuY2UoZXVjbGlkZWFuRGlzdGFuY2UoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXVjbGlkZWFuRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguc3FydCh4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKSAtIDIgKiB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFtbWluZ1NpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldFNpbWlsYXJpdHlGcm9tRGlzdGFuY2UoaGFtbWluZ0Rpc3RhbmNlKHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbW1pbmdEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCkgLSAyICogeC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29rYWxTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCk7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvICgyICogdG90YWwgLSAzICogY29tbW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNva2FsRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIDEgLSBzb2thbFNpbWlsYXJpdHkoeCwgeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBrdWxjenluc2tpU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBjb25zdCB0b3RhbFByb2QgPSB4LnRydWVDb3VudCgpICogeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsUHJvZCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiAoY29tbW9uICogdG90YWwpIC8gKDIgKiB0b3RhbFByb2QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga3VsY3p5bnNraURpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KGt1bGN6eW5za2lTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1jQ29ubmF1Z2hleVNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgY29uc3QgdG90YWxQcm9kID0geC50cnVlQ291bnQoKSAqIHkudHJ1ZUNvdW50KCk7XG4gIGlmICh0b3RhbFByb2QgPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gKGNvbW1vbiAqIHRvdGFsIC0gdG90YWxQcm9kKSAvIHRvdGFsUHJvZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1jQ29ubmF1Z2hleURpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KG1jQ29ubmF1Z2hleVNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXN5bW1ldHJpY1NpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgbWluID0gTWF0aC5taW4oeC50cnVlQ291bnQoKSwgeS50cnVlQ291bnQoKSk7XG4gIGlmIChtaW4gPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gbWluO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXN5bW1ldHJpY0Rpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiAxIC0gYXN5bW1ldHJpY1NpbWlsYXJpdHkoeCwgeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBicmF1bkJsYW5xdWV0U2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCBtYXggPSBNYXRoLm1heCh4LnRydWVDb3VudCgpLCB5LnRydWVDb3VudCgpKTtcbiAgaWYgKG1heCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyBtYXg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBicmF1bkJsYW5xdWV0RGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkoYnJhdW5CbGFucXVldFNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVzc2VsU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBpZiAoeC5sZW5ndGggPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8geC5sZW5ndGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydXNzZWxEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShydXNzZWxTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJvZ290R29sZGJlcmdTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgY29uc3QgdG90YWwgPSB4LmNvdW50Qml0cyh0cnVlKSArIHkuY291bnRCaXRzKHRydWUpO1xuICBjb25zdCBsZW4gPSB4Lmxlbmd0aDtcbiAgY29uc3QgZGlmZiA9IGxlbiAtIHRvdGFsICsgY29tbW9uO1xuICBpZiAoKGNvbW1vbiA9PSBsZW4pIHx8IChkaWZmID09IGxlbikpIHJldHVybiAxLjA7XG4gIGVsc2UgcmV0dXJuIGNvbW1vbiAvIHRvdGFsICsgZGlmZiAvICgyICogbGVuIC0gdG90YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcm9nb3RHb2xkYmVyZ0Rpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KHJvZ290R29sZGJlcmdTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpbWlsYXJpdHlGcm9tRGlzdGFuY2UoZGlzdGFuY2U6IG51bWJlcikge1xuICByZXR1cm4gMSAvICgxICsgZGlzdGFuY2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShzaW1pbGFyaXR5OiBudW1iZXIpIHsgLy9pbiBjYXNlIHNpbWlsYXJpdHkgaXMgMCwgdXNlIG1heCBudW1iZXIgZm9yIGZsb2F0MzJcbiAgcmV0dXJuIHNpbWlsYXJpdHkgPT09IDAgPyAzLjQwMjgyM0UrMzggOiAoMSAvIHNpbWlsYXJpdHkpIC0gMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG51bWVyaWNEaXN0YW5jZShhcmdzPzoge3JhbmdlPzogbnVtYmVyfSkge1xuICBpZiAoYXJncyAmJiBhcmdzLnJhbmdlICE9IHVuZGVmaW5lZCAmJiBhcmdzLnJhbmdlID4gMCkge1xuICAgIGNvbnN0IHJhbmdlID0gYXJncy5yYW5nZTtcbiAgICByZXR1cm4gKGE6IG51bWJlciwgYjogbnVtYmVyKSA9PiBNYXRoLmFicyhhIC0gYikgLyByYW5nZTtcbiAgfVxuXG4gIHJldHVybiAoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IE1hdGguYWJzKGEgLSBiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbW1vbkl0ZW1zQ291bnQoYXJncz86IHttb3N0Q29tbW9uPzogU2V0PG51bWJlcj59KSB7XG4gIGNvbnN0IG1vc3RDb21tb24gPSBhcmdzPy5tb3N0Q29tbW9uID8/IG5ldyBTZXQ8bnVtYmVyPigpO1xuICByZXR1cm4gKGFycjE6IEFycmF5TGlrZTxudW1iZXI+LCBhcnIyOiBBcnJheUxpa2U8bnVtYmVyPikgPT4ge1xuICAgIGNvbnN0IGxlbjEgPSBhcnIxLmxlbmd0aDtcbiAgICBjb25zdCBsZW4yID0gYXJyMi5sZW5ndGg7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBsZXQgaTEgPSAwO1xuICAgIGxldCBpMiA9IDA7XG5cbiAgICB3aGlsZSAoKGkxIDwgbGVuMSkgJiYgKGkyIDwgbGVuMikpIHtcbiAgICAgIGlmIChhcnIxW2kxXSA9PT0gYXJyMltpMl0pIHtcbiAgICAgICAgaWYgKCFtb3N0Q29tbW9uPy5oYXMoYXJyMVtpMV0pKVxuICAgICAgICAgICsrY291bnQ7XG4gICAgICAgICsraTE7XG4gICAgICAgICsraTI7XG4gICAgICB9IGVsc2UgaWYgKGFycjFbaTFdIDwgYXJyMltpMl0pIHsgKytpMTsgfSBlbHNlIHsgKytpMjsgfVxuICAgIH1cblxuICAgIHJldHVybiBjb3VudDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2VDb21tb25JdGVtc0NvdW50KGFyZ3M/OiB7bW9zdENvbW1vbj86IFNldDxudW1iZXI+fSkge1xuICBjb25zdCBmID0gY29tbW9uSXRlbXNDb3VudChhcmdzKTtcbiAgcmV0dXJuIChhcnIxOiBBcnJheUxpa2U8bnVtYmVyPiwgYXJyMjogQXJyYXlMaWtlPG51bWJlcj4pID0+IHtcbiAgICBpZiAoYXJyMi5sZW5ndGggPT09IDAgfHwgYXJyMS5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gMTAwMDA7XG5cbiAgICByZXR1cm4gTWF0aC5taW4oYXJyMS5sZW5ndGgsIGFycjIubGVuZ3RoKSAvIChmKGFycjEsIGFycjIpICsgMC4wMDAxKTtcbiAgfTtcbn1cbiJdfQ==","// core fields of HELM library object used in toAtomicLevel function\nexport const HELM_CORE_FIELDS = [\n \"symbol\" /* HELM_FIELDS.SYMBOL */,\n \"molfile\" /* HELM_FIELDS.MOLFILE */,\n \"rgroups\" /* HELM_FIELDS.RGROUPS */,\n \"name\" /* HELM_FIELDS.NAME */,\n // HELM_FIELDS.MONOMER_TYPE, // add if terminal monomers for PEPTIDEs to be\n // supported\n];\nexport const SDF_MONOMER_NAME = 'MonomerName';\n// todo: ideally, keys should be expressed via constants\nexport const jsonSdfMonomerLibDict = {\n 'monomerType': null,\n 'smiles': null,\n 'name': 'Name',\n 'author': null,\n 'molfile': 'molecule',\n 'naturalAnalog': 'MonomerNaturalAnalogCode',\n 'rgroups': 'MonomerCaps',\n 'createDate': null,\n 'id': null,\n 'polymerType': 'MonomerType',\n 'symbol': 'MonomerName'\n};\nexport const DUMMY_MONOMER = {\n 'monomerType': 'Backbone',\n 'smiles': '',\n 'name': '',\n 'author': 'Datagrok',\n 'molfile': '',\n 'naturalAnalog': '',\n 'rgroups': [],\n 'createDate': null,\n 'id': 0,\n 'polymerType': 'PEPTIDE',\n 'symbol': ''\n};\n// range of hex nubers used in PepSea library to endode monomers\nexport const MONOMER_ENCODE_MIN = 0x100;\nexport const MONOMER_ENCODE_MAX = 0x40A;\nexport const RIBOSE_SYMBOL = 'r';\nexport const DEOXYRIBOSE_SYMBOL = 'd';\nexport const PHOSPHATE_SYMBOL = 'p';\nexport const HELM_WRAPPERS_REGEXP = new RegExp(`[${RIBOSE_SYMBOL}${DEOXYRIBOSE_SYMBOL}]\\\\((\\\\w)\\\\)${PHOSPHATE_SYMBOL}?`, 'g');\n//# sourceMappingURL=const.js.map","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 helmRe = /(PEPTIDE1|DNA1|RNA1)\\{([^}]+)}/g;\nexport const helmPp1Re = /\\[([^\\[\\]]+)]/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","/** Canonical gap symbol */\nexport const GAP_SYMBOL = '';\n/** 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLWRlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbi8qKlxuICogRGVub3RlcyBhIHZlY3RvciBvZiBmbG9hdGluZyBwb2l0IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVmVjdG9yXG4gKiBAZXh0ZW5kcyB7RmxvYXQzMkFycmF5fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yIGV4dGVuZHMgRmxvYXQzMkFycmF5IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIHR3by1kaW1lbnNpb25hbCBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE1hdHJpeFxuICogQGV4dGVuZHMge0FycmF5PFZlY3Rvcj59XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBcnJheTxWZWN0b3I+IHt9XG5cbi8qKlxuICogRGVub3RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvb3JkaW5hdGVzXG4gKiBAZXh0ZW5kcyB7TWF0cml4fVxuICovXG5leHBvcnQgY2xhc3MgQ29vcmRpbmF0ZXMgZXh0ZW5kcyBNYXRyaXgge31cblxuLyoqXG4gKiBEZW5vdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeS10eXBlZCB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBWZWN0b3JzXG4gKiBAZXh0ZW5kcyB7QXJyYXk8YW55Pn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcnMgZXh0ZW5kcyBBcnJheTxhbnk+IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBmdW5jdGlvbiBvcHRpb25zLlxuICpcbiAqIEBleHBvcnRcbiAqIEB0eXBlIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcbiAqIEBwYXJhbSB7YW55fSB2MSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHthbnl9IHYyIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBEaXN0YW5jZU1ldHJpYyA9ICh2MTogYW55LCB2MjogYW55KSA9PiAobnVtYmVyKTtcblxuLyoqXG4gKiBEZW5vdGVzIGEgc2ltcGxlIHN0cmluZyB0byBzdHJpbmcgZGljdGlvbmFyeS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdHlwZSBTdHJpbmdEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0RpY3Rpb25hcnkgPSB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcblxuXG5leHBvcnQgdHlwZSBDb2x1bW5JbnB1dE9wdGlvbnMgPSB7XG4gICAgZmlsdGVyPzogKGNvbDogREcuQ29sdW1uKSA9PiBib29sZWFuIHwgbnVsbDtcbn07XG4iXX0=","import { Vector } from './type-declarations';\nimport { randomFloat, randomInt } from './random';\n/**\n * Asserts a condition by throwing an Error.\n *\n * @export\n * @param {boolean} [condition=false] Condition to assert.\n * @param {string} [message='Assertion error.'] Message to output.\n * @throws {Error}\n */\nexport function assert(condition = false, message = 'Assertion error.') {\n if (!condition)\n throw new Error(message);\n}\n/**\n * Creates new two-dimensional array and fills it with the value given.\n *\n * @param {number} dimension1 The first dimension of the coordinates (number of rows).\n * @param {number} dimension2 The second dimension of the coordinates (number of columns).\n * @param {number} [fill=0] A value to fill the coordinates with.\n * @return {Coordinates} A two-dimensional filled with the value given.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function initCoordinates(dimension1, dimension2, fill = 0) {\n return new Array(dimension1).fill(fill).map(() => (new Vector(dimension2).fill(fill)));\n}\n/**\n * Transpose matrix.\n *\n * @export\n * @param {Matrix} matrix The matrix to be transposed.\n * @return {Matrix} Transposed matrix.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function transposeMatrix(matrix) {\n return new Array(matrix[0].length).fill(0)\n .map((_, i) => (new Vector(matrix.length).fill(0).map((_, j) => (matrix[j][i]))));\n}\n/**\n * Adds two vectors with the second one to be multiplied by the given ratio.\n *\n * @export\n * @param {Vector} p The first vector to add.\n * @param {Vector} q The second vector to add.\n * @param {number} [multiplier=1] A multiplier to be used before the second vector is added.\n * @return {Vector} New vector contained the result of operation p+multiplier*q.\n */\nexport function vectorAdd(p, q, multiplier = 1) {\n const nItems = p.length;\n assert(nItems == q.length, 'Vector lengths do not match.');\n const total = new Vector(nItems);\n for (let i = 0; i < p.length; ++i)\n total[i] = p[i] + multiplier * q[i];\n return total;\n}\n/**\n * Sums the vector's items.\n *\n * @param {Vector} v The vector to be summed.\n * @return {number} The vector's items sum.\n */\nfunction itemsSum(v) {\n let total = 0;\n for (let i = 0; i < v.length; ++i)\n total += v[i];\n return total;\n}\n/**\n * Suqares the vector's items.\n *\n * @param {Vector} v The vector to square.\n * @return {Vector} A new vector containing the original's items squared.\n */\nfunction vectorSquare(v) {\n const nItems = v.length;\n const total = new Vector(nItems);\n for (let i = 0; i < v.length; ++i)\n total[i] = v[i] * v[i];\n return total;\n}\nexport function vectorLength(v) {\n let sqrSum = 0;\n for (let i = 0; i < v.length; i++)\n sqrSum += v[i] * v[i];\n return Math.sqrt(sqrSum);\n}\nexport function vectorDotProduct(v1, v2) {\n if (v1.length != v2.length)\n throw new Error('The dimensionality of the vectors must match');\n let prod = 0;\n for (let i = 0; i < v1.length; i++)\n prod += v1[i] * v2[i];\n return prod;\n}\n/**\n * Creates a matrix filled with random floating point values.\n *\n * @export\n * @param {number} dimension1 The first dimension of the matrix.\n * @param {number} dimension2 The second dimension of the matrix.\n * @param {number} [scale=1.] Max value given by random generator.\n * @return {Matrix} A new matrix filled with random floating point values.\n */\nexport function fillRandomMatrix(dimension1, dimension2, scale = 1.) {\n const matrix = initCoordinates(dimension1, dimension2);\n for (let i = 0; i < dimension1; ++i) {\n for (let j = 0; j < dimension2; ++j)\n matrix[i][j] = randomFloat(scale);\n }\n return matrix;\n}\n/**\n * Calculates Euclidean distance between two vectors.\n *\n * @export\n * @param {Vector} p The first vector.\n * @param {Vector} q The second vector.\n * @return {number} Euclidean distance between the given vectors.\n */\nexport function calculateEuclideanDistance(p, q) {\n let result = 0;\n const len = p.length;\n if (len !== q.length)\n throw new Error('The dimensionality of the vectors must match');\n for (let i = 0; i < len; ++i)\n result += Math.pow((p[i] - q[i]), 2);\n return Math.sqrt(result);\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n }\n }\n return matrix;\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcNormalizedDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n let max = Number.MIN_VALUE;\n let min = Number.MAX_VALUE;\n for (let i = 0; i < nItems; ++i) {\n for (let j = i; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null || i === j) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n if (d > max)\n max = d;\n if (d < min)\n min = d;\n }\n }\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j)\n matrix[i][j] = matrix[j][i] = (matrix[i][j] - min) / (max - min);\n }\n return matrix;\n}\n/** Generates array from a range [begin; end] or [begin; end) if endExclusive. **/\nexport function genRange(begin, end, endExclusive = false) {\n const nItems = end - begin + (endExclusive ? 0 : 1);\n const series = new Int32Array(nItems);\n for (let i = 0; i < nItems; ++i)\n series[i] = begin + i;\n return series;\n}\n/**\n * Returns order of values as if they are sorted.\n *\n * @export\n * @param {any[]} values Input array.\n * @param {boolean} [reverse=false] Whether to return reversed order.\n * @return {number[]} The order computed.\n */\nexport function argSort(values, reverse = false) {\n const sortfn = reverse ? (a, b) => (b[0] - a[0]) : (a, b) => (a[0] - b[0]);\n const decor = (v, i) => [v, i]; // set index to value\n const undecor = (a) => a[1]; // leave only index\n const _argsort = (arr) => arr.map(decor).sort(sortfn).map(undecor);\n return _argsort(values);\n}\n/**\n * Returns the indexes of the most diverse objects according to the dist function\n * @param {number} length total number of objects\n * @param {number} n number of diverse elements to find\n * @param {(i1: number, i2: number) => number} dist a function which calculates distance between\n * two objects using their indexes\n * @returns {number[]} The indexes of the most diverse objects\n */\nexport function getDiverseSubset(length, n, dist) {\n function maxBy(values, orderBy) {\n let maxValue = null;\n let maxOrderBy = null;\n for (const element of values) {\n const elementOrderBy = orderBy(element);\n if (maxOrderBy == null || elementOrderBy > maxOrderBy) {\n maxValue = element;\n maxOrderBy = elementOrderBy;\n }\n }\n return maxValue;\n }\n const subset = [randomInt(length - 1)];\n const complement = new Set();\n for (let i = 0; i < length; ++i) {\n if (!subset.includes(i))\n complement.add(i);\n }\n while (subset.length < n) {\n const idx = maxBy(complement.values(), (i) => Math.min.apply(Math, subset.map(function (val, index) {\n return dist(i, val);\n })));\n if (idx) {\n subset.push(idx);\n complement.delete(idx);\n }\n }\n return subset;\n}\n/**\n * Returns normalized vector.\n *\n * @export\n * @param {Vector} data numerical array\n */\nexport function normalize(data) {\n const len = data.length;\n let sum = 0;\n let sumOfSquares = 0;\n for (let i = 0; i < len; ++i) {\n sum += data[i];\n sumOfSquares += Math.pow(data[i], 2);\n }\n const mean = sum / len;\n const stdDevInverse = 1.0 / Math.sqrt(sumOfSquares / len - Math.pow(mean, 2));\n for (let i = 0; i < len; ++i)\n data[i] = (data[i] - mean) * stdDevInverse;\n return data;\n}\n/**\n * Finds set difference between two lists.\n * @param {any[]} a The first list.\n * @param {any[]} b The second list.\n * @return {any[]}\n */\nexport function setDifference(a, b) {\n const bSet = new Set(b);\n return Array.from(new Set(a.filter((x) => !bSet.has(x))).values());\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsVUFBa0IsRUFBRSxVQUFrQixFQUFFLE9BQWUsQ0FBQztJQUN0RixPQUFPLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFjO0lBQzVDLE9BQU8sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDdkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENB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QUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNYXRyaXgsIFZlY3RvciwgQ29vcmRpbmF0ZXMsIFZlY3RvcnMsIERpc3RhbmNlTWV0cmljfSBmcm9tICcuL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7cmFuZG9tRmxvYXQsIHJhbmRvbUludH0gZnJvbSAnLi9yYW5kb20nO1xuXG4vKipcbiAqIEFzc2VydHMgYSBjb25kaXRpb24gYnkgdGhyb3dpbmcgYW4gRXJyb3IuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtib29sZWFufSBbY29uZGl0aW9uPWZhbHNlXSBDb25kaXRpb24gdG8gYXNzZXJ0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPSdBc3NlcnRpb24gZXJyb3IuJ10gTWVzc2FnZSB0byBvdXRwdXQuXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb246IGJvb2xlYW4gPSBmYWxzZSwgbWVzc2FnZTogc3RyaW5nID0gJ0Fzc2VydGlvbiBlcnJvci4nKSB7XG4gIGlmICghY29uZGl0aW9uKVxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIG5ldyB0d28tZGltZW5zaW9uYWwgYXJyYXkgYW5kIGZpbGxzIGl0IHdpdGggdGhlIHZhbHVlIGdpdmVuLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBkaW1lbnNpb24xIFRoZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhlIGNvb3JkaW5hdGVzIChudW1iZXIgb2Ygcm93cykuXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgY29vcmRpbmF0ZXMgKG51bWJlciBvZiBjb2x1bW5zKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbD0wXSBBIHZhbHVlIHRvIGZpbGwgdGhlIGNvb3JkaW5hdGVzIHdpdGguXG4gKiBAcmV0dXJuIHtDb29yZGluYXRlc30gQSB0d28tZGltZW5zaW9uYWwgZmlsbGVkIHdpdGggdGhlIHZhbHVlIGdpdmVuLlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIGZpbGw6IG51bWJlciA9IDApOiBDb29yZGluYXRlcyB7XG4gIHJldHVybiBuZXcgQXJyYXkoZGltZW5zaW9uMSkuZmlsbChmaWxsKS5tYXAoKCkgPT4gKG5ldyBWZWN0b3IoZGltZW5zaW9uMikuZmlsbChmaWxsKSkpO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBNYXRyaXgge1xuICByZXR1cm4gbmV3IEFycmF5KG1hdHJpeFswXS5sZW5ndGgpLmZpbGwoMClcbiAgICAubWFwKChfLCBpKSA9PiAobmV3IFZlY3RvcihtYXRyaXgubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaikgPT4gKG1hdHJpeFtqXVtpXSkpKSk7XG59XG5cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocDogVmVjdG9yLCBxOiBWZWN0b3IsIG11bHRpcGxpZXI6IG51bWJlciA9IDEpOiBWZWN0b3Ige1xuICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcblxuICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuXG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHBbaV0gKyBtdWx0aXBsaWVyICogcVtpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbi8qKlxuICogU3VtcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBiZSBzdW1tZWQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2ZWN0b3IncyBpdGVtcyBzdW0uXG4gKi9cbmZ1bmN0aW9uIGl0ZW1zU3VtKHY6IFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgIHRvdGFsICs9IHZbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1cWFyZXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gc3F1YXJlLlxuICogQHJldHVybiB7VmVjdG9yfSBBIG5ldyB2ZWN0b3IgY29udGFpbmluZyB0aGUgb3JpZ2luYWwncyBpdGVtcyBzcXVhcmVkLlxuICovXG5mdW5jdGlvbiB2ZWN0b3JTcXVhcmUodjogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3Rvckxlbmd0aCh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgc3FyU3VtOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICBzcXJTdW0gKz0gdltpXSAqIHZbaV07XG4gIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvckRvdFByb2R1Y3QodjE6IFZlY3RvciwgdjI6IFZlY3Rvcik6IG51bWJlciB7XG4gIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSB2ZWN0b3JzIG11c3QgbWF0Y2gnKTtcbiAgbGV0IHByb2Q6IG51bWJlciA9IDA7XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKylcbiAgICBwcm9kICs9IHYxW2ldICogdjJbaV07XG4gIHJldHVybiBwcm9kO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xLl0gTWF4IHZhbHVlIGdpdmVuIGJ5IHJhbmRvbSBnZW5lcmF0b3IuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IEEgbmV3IG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSYW5kb21NYXRyaXgoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIHNjYWxlOiBudW1iZXIgPSAxLik6IE1hdHJpeCB7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhkaW1lbnNpb24xLCBkaW1lbnNpb24yKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbWVuc2lvbjE7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UocDogVmVjdG9yLCBxOiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgcmVzdWx0ID0gMDtcbiAgY29uc3QgbGVuID0gcC5sZW5ndGg7XG5cbiAgaWYgKGxlbiAhPT0gcS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZGltZW5zaW9uYWxpdHkgb2YgdGhlIHZlY3RvcnMgbXVzdCBtYXRjaCcpO1xuICBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICByZXN1bHQgKz0gKHBbaV0gLSBxW2ldKSAqKiAyO1xuICBcbiAgcmV0dXJuIE1hdGguc3FydChyZXN1bHQpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgYSBjdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3JzfSBkYXRhIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy5cbiAqIEBwYXJhbSB7RGlzdGFuY2VNZXRyaWN9IGRpc3RhbmNlIEN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge01hdHJpeH0gQ2FsY3VsYXRlZCBjdXN0b20gZGlzdGFuY2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY0Rpc3RhbmNlTWF0cml4KGRhdGE6IFZlY3RvcnMsIGRpc3RhbmNlOiBEaXN0YW5jZU1ldHJpYyk6IE1hdHJpeCB7XG4gIGNvbnN0IG5JdGVtcyA9IGRhdGEubGVuZ3RoO1xuICBjb25zdCBtYXRyaXggPSBpbml0Q29vcmRpbmF0ZXMobkl0ZW1zLCBuSXRlbXMsIDApO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBuSXRlbXM7ICsraikge1xuICAgICAgY29uc3QgZDogbnVtYmVyID0gKGRhdGFbaV0gPT0gbnVsbCkgfHwgKGRhdGFbal0gPT0gbnVsbCkgPyAwIDogZGlzdGFuY2UoZGF0YVtpXSwgZGF0YVtqXSk7XG4gICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbal1baV0gPSBkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWF0cml4O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgYSBjdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3JzfSBkYXRhIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy5cbiAqIEBwYXJhbSB7RGlzdGFuY2VNZXRyaWN9IGRpc3RhbmNlIEN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge01hdHJpeH0gQ2FsY3VsYXRlZCBjdXN0b20gZGlzdGFuY2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY05vcm1hbGl6ZWREaXN0YW5jZU1hdHJpeChkYXRhOiBWZWN0b3JzLCBkaXN0YW5jZTogRGlzdGFuY2VNZXRyaWMpOiBNYXRyaXgge1xuICBjb25zdCBuSXRlbXMgPSBkYXRhLmxlbmd0aDtcbiAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcbiAgbGV0IG1heCA9IE51bWJlci5NSU5fVkFMVUU7XG4gIGxldCBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGk7IGogPCBuSXRlbXM7ICsraikge1xuICAgICAgY29uc3QgZDogbnVtYmVyID0gKGRhdGFbaV0gPT0gbnVsbCkgfHwgKGRhdGFbal0gPT0gbnVsbCB8fCBpID09PSBqKSA/IDAgOiBkaXN0YW5jZShkYXRhW2ldLCBkYXRhW2pdKTtcbiAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtqXVtpXSA9IGQ7XG4gICAgICBpZiAoZCA+IG1heCkgbWF4ID0gZDtcbiAgICAgIGlmIChkIDwgbWluKSBtaW4gPSBkO1xuICAgIH1cbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbkl0ZW1zOyArK2opXG4gICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbal1baV0gPSAobWF0cml4W2ldW2pdIC0gbWluKSAvIChtYXggLSBtaW4pO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKiBHZW5lcmF0ZXMgYXJyYXkgZnJvbSBhIHJhbmdlIFtiZWdpbjsgZW5kXSBvciBbYmVnaW47IGVuZCkgaWYgZW5kRXhjbHVzaXZlLiAqKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5SYW5nZShiZWdpbjogbnVtYmVyLCBlbmQ6IG51bWJlciwgZW5kRXhjbHVzaXZlID0gZmFsc2UpOiBJbnQzMkFycmF5IHtcbiAgY29uc3Qgbkl0ZW1zID0gZW5kIC0gYmVnaW4gKyAoZW5kRXhjbHVzaXZlID8gMCA6IDEpO1xuICBjb25zdCBzZXJpZXMgPSBuZXcgSW50MzJBcnJheShuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpXG4gICAgc2VyaWVzW2ldID0gYmVnaW4gKyBpO1xuXG4gIHJldHVybiBzZXJpZXM7XG59XG5cbi8qKlxuICogUmV0dXJucyBvcmRlciBvZiB2YWx1ZXMgYXMgaWYgdGhleSBhcmUgc29ydGVkLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7YW55W119IHZhbHVlcyBJbnB1dCBhcnJheS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldmVyc2U9ZmFsc2VdIFdoZXRoZXIgdG8gcmV0dXJuIHJldmVyc2VkIG9yZGVyLlxuICogQHJldHVybiB7bnVtYmVyW119IFRoZSBvcmRlciBjb21wdXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFyZ1NvcnQodmFsdWVzOiBhbnlbXSwgcmV2ZXJzZSA9IGZhbHNlKTogbnVtYmVyW10ge1xuICBjb25zdCBzb3J0Zm4gPSByZXZlcnNlID8gKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGJbMF0gLSBhWzBdKSA6IChhOiBhbnlbXSwgYjogYW55W10pID0+IChhWzBdIC0gYlswXSk7XG4gIGNvbnN0IGRlY29yID0gKHY6IGFueSwgaTogbnVtYmVyKSA9PiBbdiwgaV07IC8vIHNldCBpbmRleCB0byB2YWx1ZVxuICBjb25zdCB1bmRlY29yID0gKGE6IGFueVtdKSA9PiBhWzFdOyAvLyBsZWF2ZSBvbmx5IGluZGV4XG4gIGNvbnN0IF9hcmdzb3J0ID0gKGFycjogYW55W10pID0+IGFyci5tYXAoZGVjb3IpLnNvcnQoc29ydGZuKS5tYXAodW5kZWNvcik7XG4gIHJldHVybiBfYXJnc29ydCh2YWx1ZXMpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4ZXMgb2YgdGhlIG1vc3QgZGl2ZXJzZSBvYmplY3RzIGFjY29yZGluZyB0byB0aGUgZGlzdCBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCB0b3RhbCBudW1iZXIgb2Ygb2JqZWN0c1xuICogQHBhcmFtIHtudW1iZXJ9IG4gbnVtYmVyIG9mIGRpdmVyc2UgZWxlbWVudHMgdG8gZmluZFxuICogQHBhcmFtIHsoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyfSBkaXN0IGEgZnVuY3Rpb24gd2hpY2ggY2FsY3VsYXRlcyBkaXN0YW5jZSBiZXR3ZWVuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvIG9iamVjdHMgdXNpbmcgdGhlaXIgaW5kZXhlc1xuICogQHJldHVybnMge251bWJlcltdfSBUaGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpdmVyc2VTdWJzZXQobGVuZ3RoOiBudW1iZXIsIG46IG51bWJlciwgZGlzdDogKGkxOiBudW1iZXIsIGkyOiBudW1iZXIpID0+IG51bWJlcik6IG51bWJlcltdIHtcbiAgZnVuY3Rpb24gbWF4QnkodmFsdWVzOiBJdGVyYWJsZUl0ZXJhdG9yPG51bWJlcj4sIG9yZGVyQnk6IChpOiBudW1iZXIpID0+IG51bWJlcikge1xuICAgIGxldCBtYXhWYWx1ZSA9IG51bGw7XG4gICAgbGV0IG1heE9yZGVyQnkgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHZhbHVlcykge1xuICAgICAgY29uc3QgZWxlbWVudE9yZGVyQnkgPSBvcmRlckJ5KGVsZW1lbnQpO1xuICAgICAgaWYgKG1heE9yZGVyQnkgPT0gbnVsbCB8fCBlbGVtZW50T3JkZXJCeSA+IG1heE9yZGVyQnkpIHtcbiAgICAgICAgbWF4VmFsdWUgPSBlbGVtZW50O1xuICAgICAgICBtYXhPcmRlckJ5ID0gZWxlbWVudE9yZGVyQnk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXhWYWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHN1YnNldCA9IFtyYW5kb21JbnQobGVuZ3RoIC0gMSldO1xuICBjb25zdCBjb21wbGVtZW50ID0gbmV3IFNldCgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoIXN1YnNldC5pbmNsdWRlcyhpKSlcbiAgICAgIGNvbXBsZW1lbnQuYWRkKGkpO1xuICB9XG5cbiAgd2hpbGUgKHN1YnNldC5sZW5ndGggPCBuKSB7XG4gICAgY29uc3QgaWR4ID0gbWF4QnkoXG4gICAgICBjb21wbGVtZW50LnZhbHVlcygpIGFzIEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPixcbiAgICAgIChpKSA9PiBNYXRoLm1pbi5hcHBseShNYXRoLCBzdWJzZXQubWFwKGZ1bmN0aW9uKHZhbCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGRpc3QoaSwgdmFsKTtcbiAgICAgIH0pKSk7XG4gICAgaWYgKGlkeCkge1xuICAgICAgc3Vic2V0LnB1c2goaWR4KTtcbiAgICAgIGNvbXBsZW1lbnQuZGVsZXRlKGlkeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdWJzZXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBub3JtYWxpemVkIHZlY3Rvci5cbiAqIFxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3J9IGRhdGEgbnVtZXJpY2FsIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUoZGF0YTogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGg7XG4gIGxldCBzdW0gPSAwO1xuICBsZXQgc3VtT2ZTcXVhcmVzID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgc3VtICs9IGRhdGFbaV07XG4gICAgc3VtT2ZTcXVhcmVzICs9IGRhdGFbaV0gKiogMjtcbiAgfVxuXG4gIGNvbnN0IG1lYW4gPSBzdW0gLyBsZW47XG4gIGNvbnN0IHN0ZERldkludmVyc2UgPSAxLjAgLyBNYXRoLnNxcnQoc3VtT2ZTcXVhcmVzIC8gbGVuIC0gbWVhbiAqKiAyKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pICogc3RkRGV2SW52ZXJzZTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBGaW5kcyBzZXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBsaXN0cy5cbiAqIEBwYXJhbSB7YW55W119IGEgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge2FueVtdfSBiIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge2FueVtdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGlmZmVyZW5jZShhOiBhbnlbXSwgYjogYW55W10pOiBhbnlbXSB7XG4gIGNvbnN0IGJTZXQgPSBuZXcgU2V0KGIpO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGEuZmlsdGVyKCh4KSA9PiAhYlNldC5oYXMoeCkpKS52YWx1ZXMoKSk7XG59XG4iXX0=","export class SeqPaletteBase {\n static makePalette(dt, simplified = false, PaletteType = SeqPaletteBase) {\n const palette = {};\n dt.forEach((cp) => {\n const objList = cp[0];\n const colour = cp[1];\n objList.forEach((obj, ind) => {\n palette[obj] = this.colourPalette[colour][simplified ? 0 : ind];\n });\n });\n return new PaletteType(palette);\n }\n constructor(palette) {\n this._palette = palette;\n }\n get(m) {\n return this._palette[m];\n }\n}\nSeqPaletteBase.undefinedColor = 'rgb(100,100,100)';\n/** Palette with shades of primary colors */\nSeqPaletteBase.colourPalette = {\n 'orange': ['rgb(255,187,120)', 'rgb(245,167,100)', 'rgb(235,137,70)', 'rgb(205, 111, 71)'],\n 'all_green': ['rgb(44,160,44)', 'rgb(74,160,74)', 'rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)',\n 'rgb(24,110,79)', 'rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'all_blue': ['rgb(31,119,180)', 'rgb(23,190,207)', 'rgb(122, 102, 189)', 'rgb(158,218,229)', 'rgb(141, 124, 217)',\n 'rgb(31, 120, 150)'],\n 'magenta': ['rgb(162,106,192)', 'rgb(197,165,224)', 'rgb(208,113,218)'],\n 'red': ['rgb(214,39,40)', 'rgb(255,152,150)'],\n 'st_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(31,119,180)'],\n 'dark_blue': ['rgb(31,119,180)', 'rgb(31, 120, 150)'],\n 'light_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(108, 218, 229)', 'rgb(23,190,227)'],\n 'lilac_blue': ['rgb(124,102,211)', 'rgb(149,134,217)', 'rgb(97, 81, 150)'],\n 'dark_green': ['rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)', 'rgb(24,110,79)'],\n 'green': ['rgb(44,160,44)', 'rgb(74,160,74)'],\n 'light_green': ['rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'st_green': ['rgb(44,160,44)', 'rgb(152,223,138)', 'rgb(39, 174, 96)', 'rgb(74,160,74)'],\n 'pink': ['rgb(247,182,210)'],\n 'brown': ['rgb(140,86,75)', 'rgb(102, 62, 54)'],\n 'gray': ['rgb(127,127,127)', 'rgb(199,199,199)', 'rgb(196,156,148)', 'rgb(222, 222, 180)'],\n 'yellow': ['rgb(188,189,34)'],\n 'white': ['rgb(230,230,230)'],\n};\n//# sourceMappingURL=seq-palettes.js.map","import { SeqPaletteBase } from './seq-palettes';\nexport class AminoacidsPalettes extends SeqPaletteBase {\n static get Lesk() {\n if (this.lesk === void 0) {\n this.lesk = this.makePalette([\n [['G', 'A', 'S', 'T'], 'orange'],\n [['C', 'V', 'I', 'L', 'P', 'F', 'Y', 'M', 'W'], 'all_green'],\n [['N', 'Q', 'H'], 'magenta'],\n [['D', 'E'], 'red'],\n [['K', 'R'], 'all_blue'],\n ], false, AminoacidsPalettes);\n }\n return this.lesk;\n }\n static get GrokGroups() {\n if (this.grokGroups === void 0) {\n this.grokGroups = this.makePalette([\n [['C', 'U'], 'yellow'],\n [['G', 'P'], 'red'],\n [['A', 'V', 'I', 'L', 'M', 'F', 'Y', 'W'], 'all_green'],\n [['R', 'H', 'K'], 'light_blue'],\n [['D', 'E'], 'dark_blue'],\n [['S', 'T', 'N', 'Q'], 'orange'],\n ], false, AminoacidsPalettes);\n }\n return this.grokGroups;\n }\n static get RasMol() {\n if (this.rasMol === void 0) {\n this.rasMol = new AminoacidsPalettes({\n // http://acces.ens-lyon.fr/biotic/rastop/help/colour.htm\n 'D': '#E60A0A',\n 'E': '#E60A0A',\n 'C': '#E6E600',\n 'M': '#E6E600',\n 'K': '#145AFF',\n 'R': '#145AFF',\n 'S': '#FA9600',\n 'T': '#FA9600',\n 'F': '#3232AA',\n 'Y': '#3232AA',\n 'N': '#00DCDC',\n 'Q': '#00DCDC',\n 'G': '#EBEBEB',\n 'L': '#0F820F',\n 'V': '#0F820F',\n 'I': '#0F820F',\n 'A': '#C8C8C8',\n 'W': '#B45AB4',\n 'H': '#8282D2',\n 'P': '#DC9682',\n 'others': '#BEA06E',\n });\n }\n return this.rasMol;\n }\n get(m) {\n const resM = m in AminoacidsPalettes.aaSynonyms ? AminoacidsPalettes.aaSynonyms[m] : m;\n const res = super.get(resM);\n return res;\n }\n}\n/** Only some of the synonyms. These were obtained from the clustered oligopeptide dataset. */\nAminoacidsPalettes.aaSynonyms = {\n 'MeNle': 'L',\n 'MeA': 'A',\n 'MeG': 'G',\n 'MeF': 'F',\n};\nexport class Aminoacids {\n static getPalette(scheme = 'grok') {\n switch (scheme) {\n case 'grok':\n return AminoacidsPalettes.GrokGroups;\n case 'lesk':\n return AminoacidsPalettes.Lesk;\n default:\n throw new Error(`ChemPalette: scheme \\`${scheme}\\` does not exist`);\n }\n }\n /**\n * Returns divided amino acid with its content in the bracket, if the content is number, then its omitted\n *\n * @param {string} c raw amino\n * @return {[string, string]} outer and inner content\n */\n static getInnerOuter(c) {\n let isInner = 0;\n let inner = '';\n let outer = '';\n for (const char of c) {\n if (char == '(')\n isInner++;\n else if (char == ')')\n isInner--;\n else if (isInner)\n inner += char;\n else\n outer += char;\n }\n return !isNaN(parseInt(inner)) ? [outer, ''] : [outer, inner];\n }\n static getColorAAPivot(monomer = '', scheme = 'grok') {\n //const chemPaletteInstance = AAPalettes.GrokGroups();\n const chemPaletteInstance = this.getPalette(scheme);\n let [outerMonomer, innerMonomer] = this.getInnerOuter(monomer);\n outerMonomer = (outerMonomer.length > 6 ? `${outerMonomer.slice(0, 3)}...` : outerMonomer);\n innerMonomer = (innerMonomer.length > 6 ? `${innerMonomer.slice(0, 3)}...` : innerMonomer);\n if (monomer.length == 1 || monomer[1] == '(') {\n const amino = monomer[0]?.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 1] :\n [this.undefinedColor, outerMonomer, innerMonomer, 1];\n }\n if (monomer[0] == 'd' && monomer[1] in chemPaletteInstance) {\n if (monomer.length == 2 || monomer[2] == '(') {\n const amino = monomer[1]?.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 2] :\n [this.undefinedColor, outerMonomer, innerMonomer, 2];\n }\n }\n if (monomer.substring(0, 3) in this.AAFullNames) {\n if (monomer.length == 3 || monomer[3] == '(') {\n const amino = this.AAFullNames[monomer.substring(0, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 3] :\n [this.undefinedColor, outerMonomer, innerMonomer, 3];\n }\n }\n if (monomer[0]?.toLowerCase() == monomer[0]) {\n if (monomer.substring(1, 3) in this.AAFullNames) {\n if (monomer.length == 4 || monomer[4] == '(') {\n const amino = this.AAFullNames[monomer.substring(1, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 4] :\n [this.undefinedColor, outerMonomer, innerMonomer, 4];\n }\n }\n }\n return [this.undefinedColor, outerMonomer, innerMonomer, 0];\n }\n}\nAminoacids.SemType = 'Aminoacids';\nAminoacids.SemTypeMultipleAlignment = 'AminoacidsMultipleAlignment';\nAminoacids.undefinedColor = 'rgb(100,100,100)';\nAminoacids.Names = {\n 'G': 'Glycine',\n 'L': 'Leucine',\n 'Y': 'Tyrosine',\n 'S': 'Serine',\n 'E': 'Glutamic acid',\n 'Q': 'Glutamine',\n 'D': 'Aspartic acid',\n 'N': 'Asparagine',\n 'F': 'Phenylalanine',\n 'A': 'Alanine',\n 'K': 'Lysine',\n 'R': 'Arginine',\n 'H': 'Histidine',\n 'C': 'Cysteine',\n 'V': 'Valine',\n 'P': 'Proline',\n 'W': 'Tryptophan',\n 'I': 'Isoleucine',\n 'M': 'Methionine',\n 'T': 'Threonine',\n};\nAminoacids.AASmiles = {\n 'G': 'NCC(=O)O',\n 'L': 'N[C@H](CC(C)C)C(=O)O',\n 'Y': 'NC(CC1=CC=C(O)C=C1)C(=O)O',\n 'S': 'NC(CO)C(=O)O',\n 'E': 'N[C@@H](CCC(O)=O)C(=O)O',\n 'Q': 'N[C@@H](CCC(N)=O)C(=O)O',\n 'D': 'N[C@@H](CC(O)=O)C(=O)O',\n 'N': 'N[C@@H](CC(N)=O)C(=O)O',\n 'F': 'NC(CC1=CC=CC=C1)C(=O)O',\n 'A': 'N[C@H](C)C(=O)O',\n 'K': 'NC(CCCCN)C(=O)O',\n 'R': 'N[C@H](CCCNC(=N)C)C(=O)O',\n 'H': 'NC(CC1=CN=C[N]1)C(=O)O',\n 'C': 'N[C@@H](CS)C(=O)O',\n 'V': 'NC(C(C)C)C(=O)O',\n 'P': 'N(CCC1)C1C(=O)O',\n 'W': 'N[C@@H](Cc1c2ccccc2n([H])c1)C(=O)O',\n 'I': 'N[C@H]([C@H](C)CC)C(=O)O',\n 'M': 'NC(CCSC)C(=O)O',\n 'T': 'NC(C(O)C)C(=O)O',\n};\nAminoacids.AASmilesTruncated = {\n 'G': '*C*',\n 'L': 'CC(C)C[C@H](*)*',\n 'Y': 'C1=CC(=CC=C1CC(*)*)O',\n 'S': 'OCC(*)C*',\n 'E': '*[C@@H](CCC(O)=O)*',\n 'Q': '*N[C@@H](CCC(N)=O)*',\n 'D': '*[C@@H](CC(O)=O)*',\n 'N': '*[C@@H](CC(N)=O)*',\n 'F': 'C1=CC=C(C=C1)CC(*)*',\n 'A': 'C[C@H](*)*',\n 'K': 'C(CCN)CC(*)*',\n 'R': '*[C@H](CCCNC(=N)C)*',\n 'H': 'C1=C(NC=N1)CC(*)*',\n 'C': 'C([C@@H](*)*)S',\n 'V': 'CC(C)C(*)*',\n 'P': 'C1CCN(*)C1*',\n 'W': '*[C@@H](Cc1c2ccccc2n([H])c1)*',\n 'I': 'CC[C@H](C)[C@H](*)*',\n 'M': 'CSCCC(*)*',\n 'T': 'CC(O)C(*)*',\n};\n/** TODO: Full?\n */\nAminoacids.AAFullNames = {\n 'Ala': 'A',\n 'Arg': 'R',\n 'Asn': 'N',\n 'Asp': 'D',\n 'Cys': 'C',\n 'Gln': 'Q',\n 'Glu': 'E',\n 'Gly': 'G',\n 'His': 'H',\n 'Ile': 'I',\n 'Leu': 'L',\n 'Lys': 'K',\n 'Met': 'M',\n 'Phe': 'F',\n 'Pro': 'P',\n 'Ser': 'S',\n 'Thr': 'T',\n 'Trp': 'W',\n 'Tyr': 'Y',\n 'Val': 'V',\n};\n//# sourceMappingURL=aminoacids.js.map","import { SeqPaletteBase } from './seq-palettes';\nexport class NucleotidesPalettes extends SeqPaletteBase {\n static get Chromatogram() {\n if (this.chromatogram === void 0) {\n this.chromatogram = new NucleotidesPalettes({\n 'A': 'green',\n 'C': 'blue',\n 'G': 'black',\n 'T': 'red',\n 'U': 'red',\n 'others': 'gray',\n });\n }\n return this.chromatogram;\n }\n}\nexport class Nucleotides {\n}\nNucleotides.SemType = 'Nucleotides';\nNucleotides.SemTypeMultipleAlignment = 'NucleotidesMultipleAlignment';\nNucleotides.Names = {\n 'A': 'Adenine',\n 'C': 'Cytosine',\n 'G': 'Guanine',\n 'T': 'Thymine',\n 'U': 'Uracil',\n};\n//# sourceMappingURL=nucleotides.js.map","import * as DG from 'datagrok-api/dg';\n/** makes the color less white, makes the transparency effect always perceptible\n * @param {string} color x coordinate.\n * */\nfunction correctColor(color) {\n if (color == null)\n return 'rgb(100,100,100)';\n const dgColor = DG.Color.fromHtml(color);\n const g = DG.Color.g(dgColor);\n const r = DG.Color.r(dgColor);\n const b = DG.Color.b(dgColor);\n // calculate euclidean distance to white\n const distToBlack = Math.sqrt(Math.pow(0 - r, 2) + Math.pow(0 - g, 2) + Math.pow(0 - b, 2));\n // normalize vector r g b\n const normR = r / distToBlack;\n const normG = g / distToBlack;\n const normB = b / distToBlack;\n if (distToBlack > 210) {\n return `rgb(${normR * 210},${normG * 210},${normB * 210})`;\n }\n return DG.Color.toRgb(dgColor);\n}\nexport class StringUtils {\n static hashCode(s) {\n let hash = 0;\n if (s.length === 0)\n return hash;\n for (let i = 0; i < s.length; i++) {\n const chr = s.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n }\n}\nimport { SeqPaletteBase } from './seq-palettes';\nexport class UnknownSeqPalette {\n}\nexport class GrayAllPalette extends UnknownSeqPalette {\n get(m) {\n return '#666666';\n }\n}\nexport class UnknownColorPalette extends UnknownSeqPalette {\n static buildPalette() {\n const res = [].concat(...Object.values(SeqPaletteBase.colourPalette));\n return res;\n }\n get(m) {\n const hash = StringUtils.hashCode(m);\n const pI = hash % UnknownColorPalette.palette.length;\n return correctColor(UnknownColorPalette.palette[pI]);\n }\n}\nUnknownColorPalette.palette = UnknownColorPalette.buildPalette();\nexport class UnknownSeqPalettes extends SeqPaletteBase {\n static get Gray() {\n if (this.gray === void 0)\n this.gray = new GrayAllPalette();\n return this.gray;\n }\n static get Color() {\n if (this.color === void 0)\n this.color = new UnknownColorPalette();\n return this.color;\n }\n}\n//# sourceMappingURL=unknown.js.map","import * as DG from 'datagrok-api/dg';\nimport wu from 'wu';\nimport { CandidateSimType, GAP_SYMBOL } from './types';\nimport { Alphabets, candidateAlphabets, monomerRe, NOTATION } from './consts';\nimport { GapOriginals, SeqHandler } from '../seq-handler';\nimport { Vector } from '@datagrok-libraries/utils/src/type-declarations';\nimport { vectorDotProduct, vectorLength } from '@datagrok-libraries/utils/src/vector-operations';\nimport { AminoacidsPalettes } from '../../aminoacids';\nimport { NucleotidesPalettes } from '../../nucleotides';\nimport { UnknownSeqPalettes } from '../../unknown';\nexport class StringListSeqSplitted {\n get length() { return this.mList.length; }\n get canonicals() { return this.mList; }\n get originals() { return this.mList; }\n isGap(posIdx) {\n return this.getOriginal(posIdx) === this.gapOriginalMonomer;\n }\n getCanonical(posIdx) {\n if (this.length <= posIdx)\n throw new Error('Index out of bounds');\n return this.mList[posIdx];\n }\n getOriginal(posIdx) {\n if (this.length <= posIdx)\n throw new Error('Index out of bounds');\n return this.mList[posIdx];\n }\n constructor(mList, gapOriginalMonomer) {\n this.mList = mList;\n this.gapOriginalMonomer = gapOriginalMonomer;\n }\n}\nexport class FastaSimpleSeqSplitted {\n get length() { return this.seqS.length; }\n get canonicals() { return this.seqS; }\n get originals() { return this.seqS; }\n isGap(posIdx) {\n return this.getOriginal(posIdx) === GapOriginals[NOTATION.FASTA];\n }\n getCanonical(posIdx) {\n if (this.length <= posIdx)\n throw new Error('Index out of bounds');\n if (this.isGap(posIdx))\n return GAP_SYMBOL;\n return this.seqS[posIdx];\n }\n getOriginal(posIdx) {\n if (this.length <= posIdx)\n throw new Error('Index out of bounds');\n return this.seqS[posIdx];\n }\n constructor(seqS) {\n this.seqS = seqS;\n }\n}\n/** Stats of sequences with specified splitter func, returns { freq, sameLength }.\n * @param {DG.Column} seqCol\n * @param {number} minLength\n * @param {SplitterFunc} splitter\n * @return { SeqColStats }, sameLength: boolean } stats of column sequences\n */\nexport function getStatsForCol(seqCol, minLength, splitter) {\n const cats = seqCol.categories;\n const splitted = wu.enumerate(seqCol.getRawData())\n .map(([catI, rowIdx]) => splitter(cats[catI]));\n return getStats(splitted, minLength);\n}\nfunction getStats(splitted, minLength) {\n const freq = {};\n let sameLength = true;\n let firstLength = null;\n for (const mSeq of splitted) {\n if (firstLength == null)\n firstLength = mSeq.length;\n else if (mSeq.length !== firstLength)\n sameLength = false;\n if (mSeq.length >= minLength) {\n for (const cm of mSeq.canonicals) {\n if (!(cm in freq))\n freq[cm] = 0;\n freq[cm] += 1;\n }\n }\n }\n return { freq: freq, sameLength: sameLength };\n}\n/** Split sequence for single character monomers, square brackets multichar monomer names or gap symbol.\n * @param seq object with sequence\n * @param getMonomer Source of the {@link seq} string\n * @return {string[]} array of monomers\n */\nexport const splitterAsFasta = (seq) => {\n const mmList = wu(seq.toString().matchAll(monomerRe))\n .map((ma) => {\n return ma[2] ?? ma[1]; // preserve '-' as gap symbol for compatibility with simpleAsFastaSimple\n }).toArray();\n return new StringListSeqSplitted(mmList, GapOriginals[NOTATION.FASTA]);\n // return new Proxy(splittedList as object, {\n // get(target: string[], p: string | symbol, receiver: any): any {\n // const k = 11;\n // }\n // }) as ISeqSplitted;\n};\nexport const splitterAsFastaSimple = (seq) => {\n return !!seq ? new FastaSimpleSeqSplitted(seq) : new StringListSeqSplitted([], GapOriginals[NOTATION.FASTA]);\n};\n/** Gets method to split sequence by separator\n * @param separator Monomer separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitterWithSeparator(separator, limit = undefined) {\n return (seq) => {\n if (!seq)\n return new StringListSeqSplitted([], GapOriginals[NOTATION.SEPARATOR]);\n else {\n const mmList = seq.replaceAll('\\\"-\\\"', '').replaceAll('\\'-\\'', '').split(separator, limit);\n return new StringListSeqSplitted(mmList, GapOriginals[NOTATION.SEPARATOR]);\n }\n };\n}\nconst helmRe = /(PEPTIDE1|DNA1|RNA1)\\{([^}]+)}/g;\nconst helmPp1Re = /\\[([^\\[\\]]+)]/g;\n/** Splits Helm string to monomers, but does not replace monomer names to other notation (e.g. for RNA).\n * Only for linear polymers, does not split RNA for ribose and phosphate monomers.\n * @param {string} seq Source string of HELM notation\n * @param {ISeqSource} src Source of the {@link seq} string\n * @return {string[]}\n */\nexport const splitterAsHelm = (seq) => {\n helmRe.lastIndex = 0;\n const ea = helmRe.exec(seq.toString());\n const inSeq = ea ? ea[2] : null;\n const mmPostProcess = (mm) => {\n helmPp1Re.lastIndex = 0;\n const pp1M = helmPp1Re.exec(mm);\n if (pp1M && pp1M.length >= 2)\n return pp1M[1];\n else\n return mm;\n };\n const mmList = inSeq ? inSeq.split('.') : [];\n return new StringListSeqSplitted(mmList.map(mmPostProcess), GapOriginals[NOTATION.HELM]);\n};\n/** Get splitter method to split sequences to monomers (required for MacromoleculeDifferenceCellRenderer)\n * @param {string} units\n * @param {string} separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitter(units, separator, limit = undefined) {\n if (units.toLowerCase().startsWith(NOTATION.FASTA))\n return splitterAsFasta;\n else if (units.toLowerCase().startsWith(NOTATION.SEPARATOR))\n return getSplitterWithSeparator(separator, limit);\n else if (units.toLowerCase().startsWith(NOTATION.HELM))\n return splitterAsHelm;\n else\n throw new Error(`Unexpected units ${units} .`);\n // TODO: Splitter for HELM\n}\nconst longMonomerPartRe = /([^\\W_]+)/g;\n/** Convert long monomer names to short ones */\nexport function monomerToShort(amino, maxLengthOfMonomer) {\n if (amino.length <= maxLengthOfMonomer)\n return amino;\n //const kebabAmino = amino.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $);\n const shortAminoMatch = amino.match(longMonomerPartRe);\n const needAddDots = amino.length > maxLengthOfMonomer || (shortAminoMatch?.length ?? 0) > 1;\n const shortAmino = shortAminoMatch?.[0] ?? ' ';\n return !needAddDots ? shortAmino : shortAmino.substring(0, maxLengthOfMonomer - 1) + '…';\n}\n/** */\nexport function getAlphabet(alphabet) {\n switch (alphabet) {\n case \"DNA\" /* ALPHABET.DNA */:\n return Alphabets.fasta.dna;\n case \"RNA\" /* ALPHABET.RNA */:\n return Alphabets.fasta.rna;\n case \"PT\" /* ALPHABET.PT */:\n return Alphabets.fasta.peptide;\n default:\n throw new Error(`Unsupported alphabet '${alphabet}'.`);\n }\n}\n/** Calculate similarity in current sequence and alphabet.\n * @param {MonomerFreqs} freq\n * @param {Set<string>} alphabet\n * @param {string} gapSymbol\n * @return {number} Cosine similarity\n */\nexport function getAlphabetSimilarity(freq, alphabet, gapSymbol = '-') {\n const keys = new Set([...new Set(Object.keys(freq)), ...alphabet]);\n keys.delete(gapSymbol);\n const freqA = [];\n const alphabetA = [];\n for (const m of keys) {\n freqA.push(m in freq ? freq[m] : 0);\n alphabetA.push(alphabet.has(m) ? 1 : 0);\n }\n /* There were a few ideas: chi-squared, pearson correlation (variance?), scalar product */\n const freqV = new Vector(freqA);\n const alphabetV = new Vector(alphabetA);\n return vectorDotProduct(freqV, alphabetV) / (vectorLength(freqV) * vectorLength(alphabetV));\n}\n/** From detectMacromolecule */\nexport function detectAlphabet(freq, candidates, gapSymbol = '-') {\n const candidatesSims = candidates.map((c) => {\n const sim = getAlphabetSimilarity(freq, c.alphabet, gapSymbol);\n return new CandidateSimType(c, freq, sim);\n });\n let alphabetName;\n const maxSim = Math.max(...candidatesSims.map((cs) => cs.similarity > cs.cutoff ? cs.similarity : -1));\n if (maxSim > 0) {\n const sim = candidatesSims.find((cs) => cs.similarity === maxSim);\n alphabetName = sim.name;\n }\n else\n alphabetName = \"UN\" /* ALPHABET.UN */;\n return alphabetName;\n}\n/** Selects a suitable palette based on column data\n * @param {DG.Column} seqCol Column to look for a palette\n * @param {number} minLength minimum length of sequence to detect palette (empty strings are allowed)\n * @return {SeqPalette} Palette corresponding to the alphabet of the sequences in the column\n */\nexport function pickUpPalette(seqCol, minLength = 5) {\n let alphabet;\n if (seqCol.semType == DG.SEMTYPE.MACROMOLECULE) {\n const sh = SeqHandler.forColumn(seqCol);\n alphabet = sh.alphabet;\n }\n else {\n const stats = getStatsForCol(seqCol, minLength, splitterAsFasta);\n alphabet = detectAlphabet(stats.freq, candidateAlphabets);\n }\n const res = getPaletteByType(alphabet);\n return res;\n}\nexport function getPaletteByType(paletteType) {\n switch (paletteType) {\n case \"PT\" /* ALPHABET.PT */:\n return AminoacidsPalettes.GrokGroups;\n case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\n return NucleotidesPalettes.Chromatogram;\n // other\n default:\n return UnknownSeqPalettes.Color;\n }\n}\nexport function pickUpSeqCol(df) {\n const semTypeColList = df.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);\n let resCol = semTypeColList.find((col) => {\n const units = col.getTag(DG.TAGS.UNITS);\n return units ? units.indexOf('MSA') !== -1 : false;\n }) ?? null;\n if (!resCol && semTypeColList.length > 0)\n resCol = semTypeColList[0];\n return resCol;\n}\n//# sourceMappingURL=utils.js.map","import * as DG from 'datagrok-api/dg';\nimport wu from 'wu';\nimport { NOTATION, candidateAlphabets, positionSeparator, splitterAsFasta, getSplitterWithSeparator, splitterAsHelm, } from './macromolecule';\nimport { GAP_SYMBOL, } from './macromolecule/types';\nimport { detectAlphabet, splitterAsFastaSimple, StringListSeqSplitted } from './macromolecule/utils';\nimport { mmDistanceFunctions, MmDistanceFunctionsNames } from '@datagrok-libraries/ml/src/macromolecule-distance-functions';\nimport { getMonomerLibHelper } from '../monomer-works/monomer-utils';\nimport { HELM_WRAPPERS_REGEXP, PHOSPHATE_SYMBOL } from './const';\nexport const SeqTemps = new class {\n constructor() {\n /** Column's temp slot name for a SeqHandler object */\n this.seqHandler = `seq-handler`;\n this.notationProvider = `seq-handler.notation-provider`;\n }\n}();\nexport const GapOriginals = {\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 SeqHandler {\n constructor(col) {\n this._splitter = null;\n this.cached = true;\n this._splitted = null;\n this.columnVersion = null;\n this._stats = null;\n this._maxLength = null;\n this._posList = null;\n this._joiner = undefined;\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._defaultGapOriginal = (this.isFasta()) ? GapOriginals[NOTATION.FASTA] :\n (this.isHelm()) ? GapOriginals[NOTATION.HELM] :\n GapOriginals[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 SeqHandler.setUnitsToFastaColumn(this);\n else if (this.isSeparator()) {\n const separator = col.getTag(\"separator\" /* TAGS.separator */);\n SeqHandler.setUnitsToSeparatorColumn(this, separator);\n }\n else if (this.isHelm())\n SeqHandler.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 this.notationProvider = this.column.temp[SeqTemps.notationProvider] ?? null;\n this.columnVersion = this.column.version;\n }\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 SeqHandler.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 SeqHandler.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 SeqHandler.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 allowed, only if alphabet tag is annotated\n if (!uh.column.getTag(\"alphabet\" /* TAGS.alphabet */) && Object.keys(stats.freq).length === 0)\n throw new Error('Alphabet is empty and not annotated.');\n let aligned = uh.column.getTag(\"aligned\" /* TAGS.aligned */);\n if (aligned === null) {\n aligned = stats.sameLength ? \"SEQ.MSA\" /* ALIGNMENT.SEQ_MSA */ : \"SEQ\" /* ALIGNMENT.SEQ */;\n uh.column.setTag(\"aligned\" /* TAGS.aligned */, aligned);\n }\n let alphabet = uh.column.getTag(\"alphabet\" /* TAGS.alphabet */);\n if (alphabet === null) {\n alphabet = detectAlphabet(stats.freq, candidateAlphabets);\n uh.column.setTag(\"alphabet\" /* TAGS.alphabet */, alphabet);\n }\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 length() { return this._column.length; }\n get units() { return this._units; }\n get notation() { return this._notation; }\n get defaultGapOriginal() { return this._defaultGapOriginal; }\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 // public get splitted(): ISeqSplitted[] {\n // // TODO: Disable cache or invalidate on changing data\n // if (this._splitted === null) {\n // const splitter = this.splitter;\n // const colLength: number = this._column.length;\n // this._splitted = new Array(colLength);\n // const catIdxList = this._column.getRawData();\n // const catList: string[] = this._column.categories;\n // for (let rowIdx: number = 0; rowIdx < colLength; rowIdx++) {\n // const seq: string = catList[catIdxList[rowIdx]];\n // this._splitted[rowIdx] = splitter(seq);\n // }\n // }\n // return this._splitted;\n // }\n getSplitted(rowIdx) {\n if (!this.cached) {\n const seq = this.column.get(rowIdx);\n return this.splitter(seq);\n }\n else {\n if (this.column.version !== this.columnVersion || this._splitted === null) {\n this.columnVersion = this.column.version;\n this._splitted = new Array(this.column.length);\n }\n let resSS = this._splitted[rowIdx] ? this._splitted[rowIdx].deref() : undefined;\n if (!resSS) {\n const seq = this.column.get(rowIdx);\n resSS = this.splitter(seq);\n this._splitted[rowIdx] = new WeakRef(resSS);\n }\n return resSS;\n }\n }\n get stats() {\n if (this._stats === null) {\n const freq = {};\n let sameLength = true;\n let firstLength = null;\n const colLen = this.column.length;\n for (let rowIdx = 0; rowIdx < colLen; ++rowIdx) {\n const mSeq = this.getSplitted(rowIdx);\n if (firstLength == null)\n firstLength = mSeq.length;\n else if (mSeq.length !== firstLength)\n sameLength = false;\n for (const cm of mSeq.canonicals) {\n if (!(cm in freq))\n freq[cm] = 0;\n freq[cm] += 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 = this.column.length === 0 ? 0 :\n Math.max(...wu.count(0).take(this.column.length).map((rowIdx) => this.getSplitted(rowIdx).length));\n }\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 /** Checks {@link om} for being a gap\n * @param {string} om Original monomer of sequence symbol\n * @return {boolean}\n */\n isGap(om) {\n return !om || om === this._defaultGapOriginal;\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()) ? 'RNA1{' :\n (this.isRna() || this.isHelmCompatible()) ? 'RNA1{' : 'PEPTIDE1{';\n const postfix = '}$$$$';\n const leftWrapper = (this.isDna()) ? 'd(' :\n (this.isRna()) ? 'r(' : '';\n const rightWrapper = (this.isDna() || this.isRna()) ? ')p' : '';\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, colName, data) {\n const col = this.column;\n const name = tgtNotation.toLowerCase() + '(' + col.name + ')';\n const newColName = colName ?? col.dataFrame.columns.getUnusedName(name);\n const newColumn = DG.Column.fromList('string', newColName, data ?? new Array(this.column.length).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, 'sequence'); // cell.renderer\n const srcAligned = col.getTag(\"aligned\" /* TAGS.aligned */);\n if (srcAligned)\n newColumn.setTag(\"aligned\" /* TAGS.aligned */, srcAligned);\n let srcAlphabet = col.getTag(\"alphabet\" /* TAGS.alphabet */);\n if (!srcAlphabet && this.notation === NOTATION.HELM && tgtNotation !== NOTATION.HELM)\n srcAlphabet = \"UN\" /* ALPHABET.UN */;\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 /** Creates a new column on data of {@link seqList} with the same tags */\n getNewColumnFromList(name, seqList) {\n return this.getNewColumn(this.notation, this.separator, name, seqList);\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 = SeqHandler.forColumn(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 (!SeqHandler.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 let splitter = null;\n splitter = this.notationProvider ? this.notationProvider.splitter : null;\n if (splitter)\n return splitter;\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 split(seq) {\n return this.splitter(seq);\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 case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\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 return MmDistanceFunctionsNames.LEVENSHTEIN;\n case \"PT\" /* ALPHABET.PT */:\n return MmDistanceFunctionsNames.LEVENSHTEIN;\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 monomer 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 threshold so that if there are not too many missing monomers\n // the column is still considered helm compatible\n const catIdxSet = new Set();\n const rowCount = this.column.length;\n const colRawData = this.column.getRawData();\n for (let rowIdx = 0; rowIdx < rowCount; ++rowIdx) {\n const catI = colRawData[rowIdx];\n if (!(catI in catIdxSet)) {\n catIdxSet.add(catI);\n const monomers = this.getSplitted(rowIdx);\n for (const cm of monomers.canonicals) {\n if (!peptidesSet.has(cm)) {\n this.column.setTag(\".isHelmCompatible\" /* TAGS.isHelmCompatible */, 'false');\n return false;\n }\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 = this.getSplitter();\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} srcSeq 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} tgtGapOriginal Optional target gap symbol\n * SEPARATOR)\n * @return {string} Converted string\n */\n convertHelmToFastaSeparator(srcSeq, tgtNotation, tgtSeparator, tgtGapOriginal) {\n if (!tgtGapOriginal) {\n tgtGapOriginal = (this.toFasta(tgtNotation)) ?\n GapOriginals[NOTATION.FASTA] :\n GapOriginals[NOTATION.SEPARATOR];\n }\n if (!tgtSeparator)\n tgtSeparator = (this.toFasta(tgtNotation)) ? '' : this.separator;\n const isNucleotide = srcSeq.startsWith('RNA');\n // items can be monomers or helms\n const helmItemsArray = this.splitter(srcSeq);\n const tgtMonomersArray = [];\n for (let posIdx = 0; posIdx < helmItemsArray.length; ++posIdx) {\n let om = helmItemsArray.getOriginal(posIdx);\n if (isNucleotide)\n om = om.replace(HELM_WRAPPERS_REGEXP, '');\n if (om === GapOriginals[NOTATION.HELM])\n tgtMonomersArray.push(tgtGapOriginal);\n else if (this.toFasta(tgtNotation) && om.length > 1) {\n // the case of a multi-character monomer converted to FASTA\n const monomer = '[' + om + ']';\n tgtMonomersArray.push(monomer);\n }\n else\n tgtMonomersArray.push(om);\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 // Get joiner from the source column units handler (this) knowing about the source sequence.\n // For example, converting DNA Helm to fasta requires removing the r(X)p decoration.\n const joiner = this.getJoiner({ notation: tgtNotation, separator: tgtSeparator });\n const newColumn = this.getNewColumn(tgtNotation, tgtSeparator);\n // assign the values to the newly created empty column\n newColumn.init((rowIdx) => {\n const srcSS = this.getSplitted(rowIdx);\n return joiner(srcSS);\n });\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 startIdxVal = startIdx ?? 0;\n const endIdxVal = endIdx ?? this.maxLength - 1;\n const joiner = this.getJoiner();\n const regLength = endIdxVal - startIdxVal + 1;\n const gapOM = GapOriginals[this.notation];\n regCol.init((rowI) => {\n const seqS = this.getSplitted(rowI);\n // Custom slicing instead of array method to maintain gaps\n const regOMList = new Array(regLength);\n for (let regJPos = 0; regJPos < regLength; ++regJPos) {\n const seqJPos = startIdxVal + regJPos;\n regOMList[regJPos] = seqJPos < seqS.length ? seqS.getOriginal(seqJPos) : gapOM;\n }\n return joiner(new StringListSeqSplitted(regOMList, gapOM));\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 get joiner() {\n if (!this._joiner)\n this._joiner = this.getJoiner();\n return this._joiner;\n }\n getJoiner(opts) {\n const notation = opts ? opts.notation : this.notation;\n const separator = opts ? opts.separator : this.separator;\n let res;\n const srcSh = this;\n switch (notation) {\n case NOTATION.FASTA: {\n res = function (srcSS) { return srcSh.joinToFasta(srcSS, srcSh.isHelm()); };\n break;\n }\n case NOTATION.SEPARATOR: {\n if (!separator)\n throw new Error(`Separator is mandatory for notation '${notation}'.`);\n res = function (srcSS) { return joinToSeparator(srcSS, separator, srcSh.isHelm()); };\n break;\n }\n case NOTATION.HELM: {\n const isDnaOrRna = srcSh.alphabet === \"DNA\" /* ALPHABET.DNA */ || srcSh.alphabet === \"RNA\" /* ALPHABET.RNA */;\n const wrappers = srcSh.getHelmWrappers();\n res = function (srcSS) { return joinToHelm(srcSS, wrappers, isDnaOrRna); };\n break;\n }\n default:\n throw new Error(`Unexpected notation '${notation}'.`);\n }\n return res;\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 srcSh = this;\n if (tgtUnits === NOTATION.FASTA)\n return function (srcSeq) { return srcSh.convertToFasta(srcSeq); };\n if (tgtUnits === NOTATION.HELM)\n return function (srcSeq) { return srcSh.convertToHelm(srcSeq); };\n else if (tgtUnits === NOTATION.SEPARATOR)\n return function (srcSeq) { return srcSh.convertToSeparator(srcSeq, tgtSeparator); };\n else\n throw new Error();\n }\n /** Gets a column's UnitsHandler object from temp slot or creates a new and stores it to the temp slot. */\n static forColumn(col) {\n // TODO: Invalidate col.temp[Temps.uh] checking column's metadata\n let res = col.temp[SeqTemps.seqHandler];\n if (!res || res.columnVersion !== col.version)\n res = col.temp[SeqTemps.seqHandler] = new SeqHandler(col);\n return res;\n }\n // -- joiners & converters --\n joinToFasta(seqS, isHelm) {\n const resMList = new Array(seqS.length);\n for (let posIdx = 0; posIdx < seqS.length; ++posIdx) {\n const cm = seqS.getOriginal(posIdx);\n let om = seqS.getOriginal(posIdx);\n if (isHelm)\n om = om.replace(HELM_WRAPPERS_REGEXP, '$1');\n if (cm === GAP_SYMBOL)\n om = GapOriginals[NOTATION.FASTA];\n else if (cm === PHOSPHATE_SYMBOL)\n om = '';\n else if (om.length > 1)\n om = '[' + om + ']';\n resMList[posIdx] = om;\n }\n return resMList.join('');\n }\n convertToFasta(src) {\n const srcUhSplitter = this.splitter;\n const srcSS = this.isHelm() ? this.splitterAsHelmNucl(src) : srcUhSplitter(src);\n return this.joinToFasta(srcSS, this.isHelm());\n }\n convertToSeparator(src, tgtSeparator) {\n const srcSS = this.isHelm() ? this.splitterAsHelmNucl(src) : this.splitter(src);\n return joinToSeparator(srcSS, tgtSeparator, this.isHelm());\n }\n convertToHelm(src) {\n const wrappers = this.getHelmWrappers();\n const isDnaOrRna = src.startsWith('DNA') || src.startsWith('RNA');\n const srcSS = this.splitter(src);\n return joinToHelm(srcSS, wrappers, isDnaOrRna);\n }\n /** Splits Helm sequence adjusting nucleotides to single char symbols. (!) Removes lone phosphorus. */\n splitterAsHelmNucl(src) {\n const srcMList = this.splitter(src);\n const tgtMList = new Array(srcMList.length);\n const isDna = src.startsWith('DNA');\n const isRna = src.startsWith('RNA');\n for (let posIdx = 0; posIdx < srcMList.length; ++posIdx) {\n let om = srcMList.getOriginal(posIdx);\n if (isDna || isRna) {\n om = om.replace(HELM_WRAPPERS_REGEXP, '$1');\n om = om === PHOSPHATE_SYMBOL ? null : om;\n }\n tgtMList[posIdx] = om ? om : null;\n }\n return new StringListSeqSplitted(tgtMList.filter((om) => !!om), GapOriginals[NOTATION.HELM]);\n }\n}\n// -- joiners --\nfunction joinToSeparator(seqS, tgtSeparator, isHelm) {\n const resMList = new Array(seqS.length);\n for (let posIdx = 0; posIdx < seqS.length; ++posIdx) {\n const cm = seqS.getCanonical(posIdx);\n let om = seqS.getOriginal(posIdx);\n if (isHelm)\n om = om.replace(HELM_WRAPPERS_REGEXP, '$1');\n if (cm === GAP_SYMBOL)\n om = GapOriginals[NOTATION.SEPARATOR];\n else if (cm === PHOSPHATE_SYMBOL)\n om = '';\n resMList[posIdx] = om;\n }\n return resMList.join(tgtSeparator);\n}\nfunction joinToHelm(srcSS, wrappers, isDnaOrRna) {\n const [prefix, leftWrapper, rightWrapper, postfix] = wrappers;\n const resOMList = new Array(srcSS.length);\n for (let posIdx = 0; posIdx < srcSS.length; ++posIdx) {\n const cm = srcSS.getCanonical(posIdx);\n let om = srcSS.getOriginal(posIdx);\n if (cm === GAP_SYMBOL)\n om = GapOriginals[NOTATION.HELM];\n else {\n if (isDnaOrRna)\n om = om.replace(HELM_WRAPPERS_REGEXP, '$1');\n om = om.length === 1 ? `${leftWrapper}${om}${rightWrapper}` : `${leftWrapper}[${om}]${rightWrapper}`;\n }\n resOMList[posIdx] = om;\n }\n return `${prefix}${resOMList.join('.')}${postfix}`;\n}\n//# sourceMappingURL=seq-handler.js.map","export function hamming(args = {}) {\n function getDistanceF() {\n if (!args || !args.scoringMatrix || !args.alphabetIndexes)\n return (a, b) => a === b ? 0 : 1;\n if (args.scoringMatrix.length !== Object.keys(args.alphabetIndexes).length)\n throw new Error('Scoring matrix and alphabet indexes should have the same length');\n const indexes = args.alphabetIndexes;\n const matrix = args.scoringMatrix;\n //const matrixMap = new Map<string, Map<string, number>>();\n //const map2: any = {};\n const minCharCode = Math.min(...Object.keys(indexes).map((k) => k.charCodeAt(0))) + 1;\n const scorringArray = new Float32Array((matrix.length + minCharCode) * (matrix.length + minCharCode));\n Object.entries(indexes).forEach(([key, index]) => {\n //matrixMap.set(key, new Map<string, number>());\n //map2[key] = {};\n const matrixRow = matrix[index];\n Object.entries(indexes).forEach(([key2, index2]) => {\n //matrixMap.get(key)!.set(key2, matrixRow[index2]);\n scorringArray[key.charCodeAt(0) * matrix.length + key2.charCodeAt(0)] = matrixRow[index2];\n //map2[key][key2] = matrixRow[index2];\n });\n });\n return (a, b) => {\n return 1 - scorringArray[a.charCodeAt(0) * matrix.length + b.charCodeAt(0)];\n };\n }\n const distanceF = getDistanceF();\n const threshold = args?.threshold ?? 0;\n return (seq1, seq2) => {\n // hamming distance should only be used with same size strings,\n // but still, lets add a check and if they are not same length add the difference to the result\n let diff = 0;\n const s1l = seq1.length;\n const s2l = seq2.length;\n const thresholdLimit = Math.max(s1l, s2l) * (1 - threshold);\n if (s1l !== s2l)\n diff = Math.abs(s1l - s2l);\n let result = 0;\n for (let i = 0; i < Math.min(s1l, s2l); i++) {\n if (seq1[i] !== seq2[i]) {\n result += distanceF(seq1[i], seq2[i]);\n if (result > thresholdLimit)\n return 1;\n }\n }\n result += diff;\n result /= Math.max(s1l, s2l);\n return result;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFtbWluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhhbW1pbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLE9BQU8sQ0FBQyxPQUF3QyxFQUFFO0lBQ2hFLFNBQVMsWUFBWTtRQUNuQixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlO1lBQ3ZELE9BQU8sQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU07WUFDeEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNsQywyREFBMkQ7UUFDM0QsdUJBQXVCO1FBQ3ZCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXRGLE1BQU0sYUFBYSxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUN0RyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDL0MsZ0RBQWdEO1lBQ2hELGlCQUFpQjtZQUNqQixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFO2dCQUNqRCxtREFBbUQ7Z0JBQ25ELGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDMUYsc0NBQXNDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFO1lBQzlCLE9BQU8sQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlFLENBQUMsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxZQUFZLEVBQUUsQ0FBQztJQUVqQyxNQUFNLFNBQVMsR0FBRyxJQUFJLEVBQUUsU0FBUyxJQUFJLENBQUMsQ0FBQztJQUV2QyxPQUFPLENBQUMsSUFBWSxFQUFFLElBQVksRUFBRSxFQUFFO1FBQ3BDLCtEQUErRDtRQUMvRCwrRkFBK0Y7UUFDL0YsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN4QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3hCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQzVELElBQUksR0FBRyxLQUFLLEdBQUc7WUFDYixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFFN0IsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDdkIsTUFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLElBQUksTUFBTSxHQUFHLGNBQWM7b0JBQ3pCLE9BQU8sQ0FBQyxDQUFDO2FBQ1o7U0FDRjtRQUNELE1BQU0sSUFBSSxJQUFJLENBQUM7UUFDZixNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDN0IsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7bW1EaXN0YW5jZUZ1bmN0aW9uQXJncywgbW1EaXN0YW5jZUZ1bmN0aW9uVHlwZX0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW1taW5nKGFyZ3M6IFBhcnRpYWw8bW1EaXN0YW5jZUZ1bmN0aW9uQXJncz4gPSB7fSk6IG1tRGlzdGFuY2VGdW5jdGlvblR5cGUge1xuICBmdW5jdGlvbiBnZXREaXN0YW5jZUYoKTogKGE6IHN0cmluZywgYjogc3RyaW5nKSA9PiBudW1iZXIge1xuICAgIGlmICghYXJncyB8fCAhYXJncy5zY29yaW5nTWF0cml4IHx8ICFhcmdzLmFscGhhYmV0SW5kZXhlcylcbiAgICAgIHJldHVybiAoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IGEgPT09IGIgPyAwIDogMTtcbiAgICBpZiAoYXJncy5zY29yaW5nTWF0cml4Lmxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYXJncy5hbHBoYWJldEluZGV4ZXMpLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2NvcmluZyBtYXRyaXggYW5kIGFscGhhYmV0IGluZGV4ZXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoJyk7XG4gICAgY29uc3QgaW5kZXhlcyA9IGFyZ3MuYWxwaGFiZXRJbmRleGVzO1xuICAgIGNvbnN0IG1hdHJpeCA9IGFyZ3Muc2NvcmluZ01hdHJpeDtcbiAgICAvL2NvbnN0IG1hdHJpeE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXI+PigpO1xuICAgIC8vY29uc3QgbWFwMjogYW55ID0ge307XG4gICAgY29uc3QgbWluQ2hhckNvZGUgPSBNYXRoLm1pbiguLi5PYmplY3Qua2V5cyhpbmRleGVzKS5tYXAoKGspID0+IGsuY2hhckNvZGVBdCgwKSkpICsgMTtcblxuICAgIGNvbnN0IHNjb3JyaW5nQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KChtYXRyaXgubGVuZ3RoICsgbWluQ2hhckNvZGUpICogKG1hdHJpeC5sZW5ndGggKyBtaW5DaGFyQ29kZSkpO1xuICAgIE9iamVjdC5lbnRyaWVzKGluZGV4ZXMpLmZvckVhY2goKFtrZXksIGluZGV4XSkgPT4ge1xuICAgICAgLy9tYXRyaXhNYXAuc2V0KGtleSwgbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKSk7XG4gICAgICAvL21hcDJba2V5XSA9IHt9O1xuICAgICAgY29uc3QgbWF0cml4Um93ID0gbWF0cml4W2luZGV4XTtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGluZGV4ZXMpLmZvckVhY2goKFtrZXkyLCBpbmRleDJdKSA9PiB7XG4gICAgICAgIC8vbWF0cml4TWFwLmdldChrZXkpIS5zZXQoa2V5MiwgbWF0cml4Um93W2luZGV4Ml0pO1xuICAgICAgICBzY29ycmluZ0FycmF5W2tleS5jaGFyQ29kZUF0KDApICogbWF0cml4Lmxlbmd0aCArIGtleTIuY2hhckNvZGVBdCgwKV0gPSBtYXRyaXhSb3dbaW5kZXgyXTtcbiAgICAgICAgLy9tYXAyW2tleV1ba2V5Ml0gPSBtYXRyaXhSb3dbaW5kZXgyXTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiAoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiAxIC0gc2NvcnJpbmdBcnJheVthLmNoYXJDb2RlQXQoMCkgKiBtYXRyaXgubGVuZ3RoICsgYi5jaGFyQ29kZUF0KDApXTtcbiAgICB9O1xuICB9XG4gIGNvbnN0IGRpc3RhbmNlRiA9IGdldERpc3RhbmNlRigpO1xuXG4gIGNvbnN0IHRocmVzaG9sZCA9IGFyZ3M/LnRocmVzaG9sZCA/PyAwO1xuXG4gIHJldHVybiAoc2VxMTogc3RyaW5nLCBzZXEyOiBzdHJpbmcpID0+IHtcbiAgICAvLyBoYW1taW5nIGRpc3RhbmNlIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCBzYW1lIHNpemUgc3RyaW5ncyxcbiAgICAvLyBidXQgc3RpbGwsIGxldHMgYWRkIGEgY2hlY2sgYW5kIGlmIHRoZXkgYXJlIG5vdCBzYW1lIGxlbmd0aCBhZGQgdGhlIGRpZmZlcmVuY2UgdG8gdGhlIHJlc3VsdFxuICAgIGxldCBkaWZmID0gMDtcbiAgICBjb25zdCBzMWwgPSBzZXExLmxlbmd0aDtcbiAgICBjb25zdCBzMmwgPSBzZXEyLmxlbmd0aDtcbiAgICBjb25zdCB0aHJlc2hvbGRMaW1pdCA9IE1hdGgubWF4KHMxbCwgczJsKSAqICgxIC0gdGhyZXNob2xkKTtcbiAgICBpZiAoczFsICE9PSBzMmwpXG4gICAgICBkaWZmID0gTWF0aC5hYnMoczFsIC0gczJsKTtcblxuICAgIGxldCByZXN1bHQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4oczFsLCBzMmwpOyBpKyspIHtcbiAgICAgIGlmIChzZXExW2ldICE9PSBzZXEyW2ldKSB7XG4gICAgICAgIHJlc3VsdCArPSBkaXN0YW5jZUYoc2VxMVtpXSwgc2VxMltpXSk7XG4gICAgICAgIGlmIChyZXN1bHQgPiB0aHJlc2hvbGRMaW1pdClcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0ICs9IGRpZmY7XG4gICAgcmVzdWx0IC89IE1hdGgubWF4KHMxbCwgczJsKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuIl19","const peq = new Uint32Array(0x10000);\nconst myers_32 = (a, b) => {\n const n = a.length;\n const m = b.length;\n const lst = 1 << (n - 1);\n let pv = -1;\n let mv = 0;\n let sc = n;\n let i = n;\n while (i--) {\n peq[a.charCodeAt(i)] |= 1 << i;\n }\n for (i = 0; i < m; i++) {\n let eq = peq[b.charCodeAt(i)];\n const xv = eq | mv;\n eq |= ((eq & pv) + pv) ^ pv;\n mv |= ~(eq | pv);\n pv &= eq;\n if (mv & lst) {\n sc++;\n }\n if (pv & lst) {\n sc--;\n }\n mv = (mv << 1) | 1;\n pv = (pv << 1) | ~(xv | mv);\n mv &= xv;\n }\n i = n;\n while (i--) {\n peq[a.charCodeAt(i)] = 0;\n }\n return sc;\n};\nconst myers_x = (b, a) => {\n const n = a.length;\n const m = b.length;\n const mhc = [];\n const phc = [];\n const hsize = Math.ceil(n / 32);\n const vsize = Math.ceil(m / 32);\n for (let i = 0; i < hsize; i++) {\n phc[i] = -1;\n mhc[i] = 0;\n }\n let j = 0;\n for (; j < vsize - 1; j++) {\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] |= 1 << k;\n }\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)];\n const pb = (phc[(i / 32) | 0] >>> i) & 1;\n const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0] ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0] ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n }\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m - start) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] |= 1 << k;\n }\n let score = m;\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)];\n const pb = (phc[(i / 32) | 0] >>> i) & 1;\n const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n score += (ph >>> (m - 1)) & 1;\n score -= (mh >>> (m - 1)) & 1;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0] ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0] ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n return score;\n};\nconst distance = (a, b) => {\n if (a.length < b.length) {\n const tmp = b;\n b = a;\n a = tmp;\n }\n if (b.length === 0) {\n return a.length;\n }\n if (a.length <= 32) {\n return myers_32(a, b);\n }\n return myers_x(a, b);\n};\nconst closest = (str, arr) => {\n let min_distance = Infinity;\n let min_index = 0;\n for (let i = 0; i < arr.length; i++) {\n const dist = distance(str, arr[i]);\n if (dist < min_distance) {\n min_distance = dist;\n min_index = i;\n }\n }\n return arr[min_index];\n};\nexport { closest, distance };\n","// Blosum 62 matrix for protein sequences\nconst BLOSUM62 = [[4, -1, -2, -2, 0, -1, -1, 0, -2, -1, -1, -1, -1, -2, -1, 1, 0, -3, -2, 0, -2, -1, 0, -4],\n [-1, 5, 0, -2, -3, 1, 0, -2, 0, -3, -2, 2, -1, -3, -2, -1, -1, -3, -2, -3, -1, 0, -1, -4],\n [-2, 0, 6, 1, -3, 0, 0, 0, 1, -3, -3, 0, -2, -3, -2, 1, 0, -4, -2, -3, 3, 0, -1, -4],\n [-2, -2, 1, 6, -3, 0, 2, -1, -1, -3, -4, -1, -3, -3, -1, 0, -1, -4, -3, -3, 4, 1, -1, -4],\n [0, -3, -3, -3, 9, -3, -4, -3, -3, -1, -1, -3, -1, -2, -3, -1, -1, -2, -2, -1, -3, -3, -2, -4],\n [-1, 1, 0, 0, -3, 5, 2, -2, 0, -3, -2, 1, 0, -3, -1, 0, -1, -2, -1, -2, 0, 3, -1, -4],\n [-1, 0, 0, 2, -4, 2, 5, -2, 0, -3, -3, 1, -2, -3, -1, 0, -1, -3, -2, -2, 1, 4, -1, -4],\n [0, -2, 0, -1, -3, -2, -2, 6, -2, -4, -4, -2, -3, -3, -2, 0, -2, -2, -3, -3, -1, -2, -1, -4],\n [-2, 0, 1, -1, -3, 0, 0, -2, 8, -3, -3, -1, -2, -1, -2, -1, -2, -2, 2, -3, 0, 0, -1, -4],\n [-1, -3, -3, -3, -1, -3, -3, -4, -3, 4, 2, -3, 1, 0, -3, -2, -1, -3, -1, 3, -3, -3, -1, -4],\n [-1, -2, -3, -4, -1, -2, -3, -4, -3, 2, 4, -2, 2, 0, -3, -2, -1, -2, -1, 1, -4, -3, -1, -4],\n [-1, 2, 0, -1, -3, 1, 1, -2, -1, -3, -2, 5, -1, -3, -1, 0, -1, -3, -2, -2, 0, 1, -1, -4],\n [-1, -1, -2, -3, -1, 0, -2, -3, -2, 1, 2, -1, 5, 0, -2, -1, -1, -1, -1, 1, -3, -1, -1, -4],\n [-2, -3, -3, -3, -2, -3, -3, -3, -1, 0, 0, -3, 0, 6, -4, -2, -2, 1, 3, -1, -3, -3, -1, -4],\n [-1, -2, -2, -1, -3, -1, -1, -2, -2, -3, -3, -1, -2, -4, 7, -1, -1, -4, -3, -2, -2, -1, -2, -4],\n [1, -1, 1, 0, -1, 0, 0, 0, -1, -2, -2, 0, -1, -2, -1, 4, 1, -3, -2, -2, 0, 0, 0, -4],\n [0, -1, 0, -1, -1, -1, -1, -2, -2, -1, -1, -1, -1, -2, -1, 1, 5, -2, -2, 0, -1, -1, 0, -4],\n [-3, -3, -4, -4, -2, -2, -3, -2, -2, -3, -2, -3, -1, 1, -4, -3, -2, 11, 2, -3, -4, -3, -2, -4],\n [-2, -2, -2, -3, -2, -1, -2, -3, 2, -1, -1, -2, -1, 3, -3, -2, -2, 2, 7, -1, -3, -2, -1, -4],\n [0, -3, -3, -3, -1, -2, -2, -3, -3, 3, 1, -2, 1, -1, -2, -2, 0, -3, -1, 4, -3, -2, -1, -4],\n [-2, -1, 3, 4, -3, 0, 1, -1, 0, -3, -4, 0, -3, -3, -2, 0, -1, -4, -3, -3, 4, 1, -1, -4],\n [-1, 0, 0, 1, -3, 3, 4, -2, 0, -3, -3, 1, -1, -3, -1, 0, -1, -3, -2, -2, 1, 4, -1, -4],\n [0, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, 0, 0, -2, -1, -1, -1, -1, -1, -4],\n [-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, 1]];\n// Protein indexes for BLOSUM matrix\nconst ProtIndexes = {\n 'A': 0, 'R': 1, 'N': 2, 'D': 3, 'C': 4, 'Q': 5, 'E': 6, 'G': 7, 'H': 8,\n 'I': 9, 'L': 10, 'K': 11, 'M': 12, 'F': 13, 'P': 14, 'S': 15, 'T': 16,\n 'W': 17, 'Y': 18, 'V': 19, 'B': 20, 'Z': 21, 'X': 22, '*': 23\n};\nconst defaultArgs = {\n gapOpen: 1,\n gapExtend: 0.6,\n scoringMatrix: BLOSUM62,\n alphabetIndexes: ProtIndexes\n};\n/** Returns a function that calculates the distance between two sequences based on gap penalty and matrix\n * @param {Partial<NeedlemanWunchArgs>}args - arguments for Needleman-Wunch algorithm like gap penalty, Scoring matrix..\n * @return {mmDistanceFunctionType} - function that calculates the distance between two sequences\n*/\nexport function needlemanWunch(args) {\n const maxLen = 10000;\n const charCodeArray = new Uint16Array(0x10000);\n const { gapOpen, gapExtend, scoringMatrix, alphabetIndexes } = { ...defaultArgs, ...args };\n Object.entries(alphabetIndexes).forEach(([k, v]) => charCodeArray[k.charCodeAt(0)] = v);\n // As we don't need traceback, no need to store the whole matrix\n // Intead, we will store only the last two rows\n const matrix = [\n new Float32Array(maxLen),\n new Float32Array(maxLen)\n ];\n return (seq1, seq2) => {\n // similarly, we need to keep track of what operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n const verticalGaps = new Array(seq1.length + 1).fill(false);\n const horizontalGaps = new Array(seq1.length + 1).fill(false);\n //variables to keep track which row we are in\n // they will swap places on each iteration\n let prevRow = 0;\n let currRow = 1;\n // Initialize first row\n for (let i = 1; i < seq1.length + 1; i++) {\n matrix[0][i] = -gapOpen - (i - 1) * gapExtend;\n matrix[1][i] = 0;\n }\n matrix[0][0] = 0;\n // Calculate the rest of the matrix\n for (let i = 1; i < seq2.length + 1; i++) {\n matrix[currRow][0] = -gapOpen - (i - 1) * gapExtend;\n for (let j = 1; j < seq1.length + 1; j++) {\n const diagonal = matrix[prevRow][j - 1] +\n scoringMatrix[charCodeArray[seq1.charCodeAt(j - 1)]][charCodeArray[seq2.charCodeAt(i - 1)]];\n const top = matrix[prevRow][j] - (verticalGaps[j] ? gapExtend : gapOpen);\n const left = matrix[currRow][j - 1] - (horizontalGaps[j - 1] ? gapExtend : gapOpen);\n matrix[currRow][j] = Math.max(diagonal, left, top);\n // update gap arrays\n if (matrix[currRow][j] === diagonal) {\n verticalGaps[j] = false;\n horizontalGaps[j] = false;\n }\n else if (matrix[currRow][j] === left) {\n verticalGaps[j] = false;\n horizontalGaps[j] = true;\n }\n else {\n verticalGaps[j] = true;\n horizontalGaps[j] = false;\n }\n }\n // Swap rows\n prevRow = currRow;\n currRow = (currRow + 1) % 2;\n }\n // as the matrix is the similarity matrix, but we are interested in distance,\n // we need compare it to perfect match score to get reasonable distance\n // const perfectMatchSeq1 = seq1.split('').map((c) => scoringMatrix[alphabetIndexes[c]][alphabetIndexes[c]])\n // .reduce((a, b) => a + b, 0);\n // const perfectMatchSeq2 = seq2.split('').map((c) => scoringMatrix[alphabetIndexes[c]][alphabetIndexes[c]])\n // .reduce((a, b) => a + b, 0);\n // const maxScore = Math.max(perfectMatchSeq1, perfectMatchSeq2);\n const maxScore = Math.max(seq1.length, seq2.length);\n return (maxScore - matrix[prevRow][seq1.length]) / maxScore;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVlZGxlbWFuLXd1bnNjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5lZWRsZW1hbi13dW5zY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEseUNBQXlDO0FBQ3pDLE1BQU0sUUFBUSxHQUNkLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUYsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFD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TUFBTSxDQUFDLENBQUM7UUFDcEQsT0FBTyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBQzlELENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge21tRGlzdGFuY2VGdW5jdGlvbkFyZ3MsIG1tRGlzdGFuY2VGdW5jdGlvblR5cGV9IGZyb20gJy4vdHlwZXMnO1xuXG4vLyBCbG9zdW0gNjIgbWF0cml4IGZvciBwcm90ZWluIHNlcXVlbmNlc1xuY29uc3QgQkxPU1VNNjI6QXJyYXk8QXJyYXk8bnVtYmVyPj4gPVxuW1s0LCAtMSwgLTIsIC0yLCAwLCAtMSwgLTEsIDAsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTIsIC0xLCAxLCAwLCAtMywgLTIsIDAsIC0yLCAtMSwgMCwgLTRdLFxuICBbLTEsIDUsIDAsIC0yLCAtMywgMSwgMCwgLTIsIDAsIC0zLCAtMiwgMiwgLTEsIC0zLCAtMiwgLTEsIC0xLCAtMywgLTIsIC0zLCAtMSwgMCwgLTEsIC00XSxcbiAgWy0yLCAwLCA2LCAxLCAtMywgMCwgMCwgMCwgMSwgLTMsIC0zLCAwLCAtMiwgLTMsIC0yLCAxLCAwLCAtNCwgLTIsIC0zLCAzLCAwLCAtMSwgLTRdLFxuICBbLTIsIC0yLCAxLCA2LCAtMywgMCwgMiwgLTEsIC0xLCAtMywgLTQsIC0xLCAtMywgLTMsIC0xLCAwLCAtMSwgLTQsIC0zLCAtMywgNCwgMSwgLTEsIC00XSxcbiAgWzAsIC0zLCAtMywgLTMsIDksIC0zLCAtNCwgLTMsIC0zLCAtMSwgLTEsIC0zLCAtMSwgLTIsIC0zLCAtMSwgLTEsIC0yLCAtMiwgLTEsIC0zLCAtMywgLTIsIC00XSxcbiAgWy0xLCAxLCAwLCAwLCAtMywgNSwgMiwgLTIsIDAsIC0zLCAtMiwgMSwgMCwgLTMsIC0xLCAwLCAtMSwgLTIsIC0xLCAtMiwgMCwgMywgLTEsIC00XSxcbiAgWy0xLCAwLCAwLCAyLCAtNCwgMiwgNSwgLTIsIDAsIC0zLCAtMywgMSwgLTIsIC0zLCAtMSwgMCwgLTEsIC0zLCAtMiwgLTIsIDEsIDQsIC0xLCAtNF0sXG4gIFswLCAtMiwgMCwgLTEsIC0zLCAtMiwgLTIsIDYsIC0yLCAtNCwgLTQsIC0yLCAtMywgLTMsIC0yLCAwLCAtMiwgLTIsIC0zLCAtMywgLTEsIC0yLCAtMSwgLTRdLFxuICBbLTIsIDAsIDEsIC0xLCAtMywgMCwgMCwgLTIsIDgsIC0zLCAtMywgLTEsIC0yLCAtMSwgLTIsIC0xLCAtMiwgLTIsIDIsIC0zLCAwLCAwLCAtMSwgLTRdLFxuICBbLTEsIC0zLCAtMywgLTMsIC0xLCAtMywgLTMsIC00LCAtMywgNCwgMiwgLTMsIDEsIDAsIC0zLCAtMiwgLTEsIC0zLCAtMSwgMywgLTMsIC0zLCAtMSwgLTRdLFxuICBbLTEsIC0yLCAtMywgLTQsIC0xLCAtMiwgLTMsIC00LCAtMywgMiwgNCwgLTIsIDIsIDAsIC0zLCAtMiwgLTEsIC0yLCAtMSwgMSwgLTQsIC0zLCAtMSwgLTRdLFxuICBbLTEsIDIsIDAsIC0xLCAtMywgMSwgMSwgLTIsIC0xLCAtMywgLTIsIDUsIC0xLCAtMywgLTEsIDAsIC0xLCAtMywgLTIsIC0yLCAwLCAxLCAtMSwgLTRdLFxuICBbLTEsIC0xLCAtMiwgLTMsIC0xLCAwLCAtMiwgLTMsIC0yLCAxLCAyLCAtMSwgNSwgMCwgLTIsIC0xLCAtMSwgLTEsIC0xLCAxLCAtMywgLTEsIC0xLCAtNF0sXG4gIFstMiwgLTMsIC0zLCAtMywgLTIsIC0zLCAtMywgLTMsIC0xLCAwLCAwLCAtMywgMCwgNiwgLTQsIC0yLCAtMiwgMSwgMywgLTEsIC0zLCAtMywgLTEsIC00XSxcbiAgWy0xLCAtMiwgLTIsIC0xLCAtMywgLTEsIC0xLCAtMiwgLTIsIC0zLCAtMywgLTEsIC0yLCAtNCwgNywgLTEsIC0xLCAtNCwgLTMsIC0yLCAtMiwgLTEsIC0yLCAtNF0sXG4gIFsxLCAtMSwgMSwgMCwgLTEsIDAsIDAsIDAsIC0xLCAtMiwgLTIsIDAsIC0xLCAtMiwgLTEsIDQsIDEsIC0zLCAtMiwgLTIsIDAsIDAsIDAsIC00XSxcbiAgWzAsIC0xLCAwLCAtMSwgLTEsIC0xLCAtMSwgLTIsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTIsIC0xLCAxLCA1LCAtMiwgLTIsIDAsIC0xLCAtMSwgMCwgLTRdLFxuICBbLTMsIC0zLCAtNCwgLTQsIC0yLCAtMiwgLTMsIC0yLCAtMiwgLTMsIC0yLCAtMywgLTEsIDEsIC00LCAtMywgLTIsIDExLCAyLCAtMywgLTQsIC0zLCAtMiwgLTRdLFxuICBbLTIsIC0yLCAtMiwgLTMsIC0yLCAtMSwgLTIsIC0zLCAyLCAtMSwgLTEsIC0yLCAtMSwgMywgLTMsIC0yLCAtMiwgMiwgNywgLTEsIC0zLCAtMiwgLTEsIC00XSxcbiAgWzAsIC0zLCAtMywgLTMsIC0xLCAtMiwgLTIsIC0zLCAtMywgMywgMSwgLTIsIDEsIC0xLCAtMiwgLTIsIDAsIC0zLCAtMSwgNCwgLTMsIC0yLCAtMSwgLTRdLFxuICBbLTIsIC0xLCAzLCA0LCAtMywgMCwgMSwgLTEsIDAsIC0zLCAtNCwgMCwgLTMsIC0zLCAtMiwgMCwgLTEsIC00LCAtMywgLTMsIDQsIDEsIC0xLCAtNF0sXG4gIFstMSwgMCwgMCwgMSwgLTMsIDMsIDQsIC0yLCAwLCAtMywgLTMsIDEsIC0xLCAtMywgLTEsIDAsIC0xLCAtMywgLTIsIC0yLCAxLCA0LCAtMSwgLTRdLFxuICBbMCwgLTEsIC0xLCAtMSwgLTIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0yLCAwLCAwLCAtMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtNF0sXG4gIFstNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIDFdXTtcblxuLy8gUHJvdGVpbiBpbmRleGVzIGZvciBCTE9TVU0gbWF0cml4XG5jb25zdCBQcm90SW5kZXhlczoge1tpZDpzdHJpbmddOm51bWJlcn0gPSB7XG4gICdBJzogMCwgJ1InOiAxLCAnTic6IDIsICdEJzogMywgJ0MnOiA0LCAnUSc6IDUsICdFJzogNiwgJ0cnOiA3LCAnSCc6IDgsXG4gICdJJzogOSwgJ0wnOiAxMCwgJ0snOiAxMSwgJ00nOiAxMiwgJ0YnOiAxMywgJ1AnOiAxNCwgJ1MnOiAxNSwgJ1QnOiAxNixcbiAgJ1cnOiAxNywgJ1knOiAxOCwgJ1YnOiAxOSwgJ0InOiAyMCwgJ1onOiAyMSwgJ1gnOiAyMiwgJyonOiAyM1xufTtcblxudHlwZSBOZWVkbGVtYW5XdW5jaEFyZ3MgPSBtbURpc3RhbmNlRnVuY3Rpb25BcmdzICYge1xuICBnYXBPcGVuOiBudW1iZXI7XG4gIGdhcEV4dGVuZDogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0QXJnczogTmVlZGxlbWFuV3VuY2hBcmdzID0ge1xuICBnYXBPcGVuOiAxLFxuICBnYXBFeHRlbmQ6IDAuNixcbiAgc2NvcmluZ01hdHJpeDogQkxPU1VNNjIsXG4gIGFscGhhYmV0SW5kZXhlczogUHJvdEluZGV4ZXNcbn07XG5cbi8qKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYWxjdWxhdGVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzZXF1ZW5jZXMgYmFzZWQgb24gZ2FwIHBlbmFsdHkgYW5kIG1hdHJpeFxuICogQHBhcmFtIHtQYXJ0aWFsPE5lZWRsZW1hbld1bmNoQXJncz59YXJncyAtIGFyZ3VtZW50cyBmb3IgTmVlZGxlbWFuLVd1bmNoIGFsZ29yaXRobSBsaWtlIGdhcCBwZW5hbHR5LCBTY29yaW5nIG1hdHJpeC4uXG4gKiBAcmV0dXJuIHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSAtIGZ1bmN0aW9uIHRoYXQgY2FsY3VsYXRlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gc2VxdWVuY2VzXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIG5lZWRsZW1hbld1bmNoKGFyZ3M6IFBhcnRpYWw8TmVlZGxlbWFuV3VuY2hBcmdzPik6IG1tRGlzdGFuY2VGdW5jdGlvblR5cGUge1xuICBjb25zdCBtYXhMZW4gPSAxMDAwMDtcbiAgY29uc3QgY2hhckNvZGVBcnJheSA9IG5ldyBVaW50MTZBcnJheSgweDEwMDAwKTtcblxuICBjb25zdCB7Z2FwT3BlbiwgZ2FwRXh0ZW5kLCBzY29yaW5nTWF0cml4LCBhbHBoYWJldEluZGV4ZXN9ID0gey4uLmRlZmF1bHRBcmdzLCAuLi5hcmdzfTtcbiAgT2JqZWN0LmVudHJpZXMoYWxwaGFiZXRJbmRleGVzKS5mb3JFYWNoKChbaywgdl0pID0+IGNoYXJDb2RlQXJyYXlbay5jaGFyQ29kZUF0KDApXSA9IHYpO1xuICAvLyBBcyB3ZSBkb24ndCBuZWVkIHRyYWNlYmFjaywgbm8gbmVlZCB0byBzdG9yZSB0aGUgd2hvbGUgbWF0cml4XG4gIC8vIEludGVhZCwgd2Ugd2lsbCBzdG9yZSBvbmx5IHRoZSBsYXN0IHR3byByb3dzXG4gIGNvbnN0IG1hdHJpeDogQXJyYXk8RmxvYXQzMkFycmF5PiA9IFtcbiAgICBuZXcgRmxvYXQzMkFycmF5KG1heExlbiksXG4gICAgbmV3IEZsb2F0MzJBcnJheShtYXhMZW4pXG4gIF07XG4gIHJldHVybiAoc2VxMTogc3RyaW5nLCBzZXEyOiBzdHJpbmcpIDogbnVtYmVyID0+IHtcbiAgICAvLyBzaW1pbGFybHksIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGF0IG9wZXJhdGlvbiBsZWQgdG8gdGhlIGN1cnJlbnQgY2VsbFxuICAgIC8vIGkuZS4gd2hldGhlciB3ZSBjYW1lIGZyb20gdGhlIGxlZnQsIHRvcCBvciBkaWFnb25hbCB0byBhc3NpZ24gZ2FwIG9wZW4vZ2FwIGV4dGVuZCBwZW5hbHR5XG5cbiAgICBjb25zdCB2ZXJ0aWNhbEdhcHM6IGJvb2xlYW5bXSA9IG5ldyBBcnJheTxib29sZWFuPihzZXExLmxlbmd0aCArMSkuZmlsbChmYWxzZSk7XG4gICAgY29uc3QgaG9yaXpvbnRhbEdhcHM6IGJvb2xlYW5bXSA9IG5ldyBBcnJheTxib29sZWFuPihzZXExLmxlbmd0aCArMSkuZmlsbChmYWxzZSk7XG4gICAgLy92YXJpYWJsZXMgdG8ga2VlcCB0cmFjayB3aGljaCByb3cgd2UgYXJlIGluXG4gICAgLy8gdGhleSB3aWxsIHN3YXAgcGxhY2VzIG9uIGVhY2ggaXRlcmF0aW9uXG4gICAgbGV0IHByZXZSb3cgPSAwO1xuICAgIGxldCBjdXJyUm93ID0gMTtcbiAgICAvLyBJbml0aWFsaXplIGZpcnN0IHJvd1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc2VxMS5sZW5ndGggKyAxOyBpKyspIHtcbiAgICAgIG1hdHJpeFswXVtpXSA9IC1nYXBPcGVuIC0gKGkgLSAxKSAqIGdhcEV4dGVuZDtcbiAgICAgIG1hdHJpeFsxXVtpXSA9IDA7XG4gICAgfVxuICAgIG1hdHJpeFswXVswXSA9IDA7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIHJlc3Qgb2YgdGhlIG1hdHJpeFxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc2VxMi5sZW5ndGggKyAxOyBpKyspIHtcbiAgICAgIG1hdHJpeFtjdXJyUm93XVswXSA9IC1nYXBPcGVuIC0gKGkgLSAxKSAqIGdhcEV4dGVuZDtcbiAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgc2VxMS5sZW5ndGggKyAxOyBqKyspIHtcbiAgICAgICAgY29uc3QgZGlhZ29uYWwgPVxuICAgICAgICAgIG1hdHJpeFtwcmV2Um93XVtqIC0gMV0gK1xuICAgICAgICAgICAgc2NvcmluZ01hdHJpeFtjaGFyQ29kZUFycmF5W3NlcTEuY2hhckNvZGVBdChqIC0gMSldXVtjaGFyQ29kZUFycmF5W3NlcTIuY2hhckNvZGVBdChpIC0gMSldXTtcbiAgICAgICAgY29uc3QgdG9wID0gbWF0cml4W3ByZXZSb3ddW2pdIC0gKHZlcnRpY2FsR2Fwc1tqXSA/IGdhcEV4dGVuZCA6IGdhcE9wZW4gKTtcbiAgICAgICAgY29uc3QgbGVmdCA9IG1hdHJpeFtjdXJyUm93XVtqIC0gMV0gLSAoaG9yaXpvbnRhbEdhcHNbaiAtIDFdID8gZ2FwRXh0ZW5kIDogZ2FwT3Blbik7XG4gICAgICAgIG1hdHJpeFtjdXJyUm93XVtqXSA9IE1hdGgubWF4KFxuICAgICAgICAgIGRpYWdvbmFsLCBsZWZ0LCB0b3BcbiAgICAgICAgKTtcbiAgICAgICAgLy8gdXBkYXRlIGdhcCBhcnJheXNcbiAgICAgICAgaWYgKG1hdHJpeFtjdXJyUm93XVtqXSA9PT0gZGlhZ29uYWwpIHtcbiAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSBmYWxzZTtcbiAgICAgICAgICBob3Jpem9udGFsR2Fwc1tqXSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKG1hdHJpeFtjdXJyUm93XVtqXSA9PT0gbGVmdCkge1xuICAgICAgICAgIHZlcnRpY2FsR2Fwc1tqXSA9IGZhbHNlO1xuICAgICAgICAgIGhvcml6b250YWxHYXBzW2pdID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSB0cnVlO1xuICAgICAgICAgIGhvcml6b250YWxHYXBzW2pdID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFN3YXAgcm93c1xuICAgICAgcHJldlJvdyA9IGN1cnJSb3c7XG4gICAgICBjdXJyUm93ID0gKGN1cnJSb3cgKyAxKSAlIDI7XG4gICAgfVxuICAgIC8vIGFzIHRoZSBtYXRyaXggaXMgdGhlIHNpbWlsYXJpdHkgbWF0cml4LCBidXQgd2UgYXJlIGludGVyZXN0ZWQgaW4gZGlzdGFuY2UsXG4gICAgLy8gd2UgbmVlZCBjb21wYXJlIGl0IHRvIHBlcmZlY3QgbWF0Y2ggc2NvcmUgdG8gZ2V0IHJlYXNvbmFibGUgZGlzdGFuY2VcbiAgICAvLyBjb25zdCBwZXJmZWN0TWF0Y2hTZXExID0gc2VxMS5zcGxpdCgnJykubWFwKChjKSA9PiBzY29yaW5nTWF0cml4W2FscGhhYmV0SW5kZXhlc1tjXV1bYWxwaGFiZXRJbmRleGVzW2NdXSlcbiAgICAvLyAgIC5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICAvLyBjb25zdCBwZXJmZWN0TWF0Y2hTZXEyID0gc2VxMi5zcGxpdCgnJykubWFwKChjKSA9PiBzY29yaW5nTWF0cml4W2FscGhhYmV0SW5kZXhlc1tjXV1bYWxwaGFiZXRJbmRleGVzW2NdXSlcbiAgICAvLyAgIC5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICAvLyBjb25zdCBtYXhTY29yZSA9IE1hdGgubWF4KHBlcmZlY3RNYXRjaFNlcTEsIHBlcmZlY3RNYXRjaFNlcTIpO1xuICAgIGNvbnN0IG1heFNjb3JlID0gTWF0aC5tYXgoc2VxMS5sZW5ndGgsIHNlcTIubGVuZ3RoKTtcbiAgICByZXR1cm4gKG1heFNjb3JlIC0gbWF0cml4W3ByZXZSb3ddW3NlcTEubGVuZ3RoXSkgLyBtYXhTY29yZTtcbiAgfTtcbn1cbiJdfQ==","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[\"MONOMER_CHEMICAL_DISTANCE\"] = \"Monomer chemical distance\";\n})(MmDistanceFunctionsNames || (MmDistanceFunctionsNames = {}));\n;\nexport const mmDistanceFunctions = {\n [MmDistanceFunctionsNames.HAMMING]: hamming,\n [MmDistanceFunctionsNames.LEVENSHTEIN]: levenstein,\n [MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH]: needlemanWunch,\n [MmDistanceFunctionsNames.MONOMER_CHEMICAL_DISTANCE]: hamming\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjcm9tb2xlY3VsZS1kaXN0YW5jZS1mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNyb21vbGVjdWxlLWRpc3RhbmNlLWZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR2xEOzs7O0dBSUc7QUFDSCxNQUFNLENBQU4sSUFBWSx3QkFLWDtBQUxELFdBQVksd0JBQXdCO0lBQ2hDLCtDQUFtQixDQUFBO0lBQ25CLHVEQUEyQixDQUFBO0lBQzNCLG1FQUF1QyxDQUFBO0lBQ3ZDLG1GQUF1RCxDQUFBO0FBQzNELENBQUMsRUFMVyx3QkFBd0IsS0FBeEIsd0JBQXdCLFFBS25DO0FBQUEsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUE4RTtJQUM1RyxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU87SUFDM0MsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxVQUFVO0lBQ2xELENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxjQUFjO0lBQzVELENBQUMsd0JBQXdCLENBQUMseUJBQXlCLENBQUMsRUFBRSxPQUFPO0NBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2hhbW1pbmd9IGZyb20gJy4vaGFtbWluZyc7XG5pbXBvcnQge2xldmVuc3RlaW59IGZyb20gJy4vbGV2ZW5zdGVpbic7XG5pbXBvcnQge25lZWRsZW1hbld1bmNofSBmcm9tICcuL25lZWRsZW1hbi13dW5zY2gnO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSBmcm9tICcuL3R5cGVzJztcblxuLyoqIEVudW0gY29udGFpbmluZyBjdXJyZW50bHkgc3VwcG9ydGVkIG1hY3JvbW9sZWN1bGUgZGlzdGFuY2UgZnVuY3Rpb25zXG4gKiBIYW1taW5nIGRpc3RhbmNlIHdpbGwgYmUgdXNlZCBpZiB0aGUgc2VxdWVuY2VzIGFyZSBhbHJlYWR5IGFsaWduZWRcbiAqIE5lZWRsZW1hbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIHByb3RlaW4gc2VxdWVuY2VzIHdpdGgga25vd24gQkxPU1VNNjIgbWF0cml4XG4gKiBMZXZlbnNodGVpbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIG51Y2xlb3RpZGUgc2VxdWVuY2VzIGFzIGZvciB0aGVtIHN1YnN0aXR1dGlvbiBtYXRyaXggaXMgc2FtZSBhcyBpZGVudGl0eSBtYXRyaXhcbiAqL1xuZXhwb3J0IGVudW0gTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzIHtcbiAgICBIQU1NSU5HID0gJ0hhbW1pbmcnLFxuICAgIExFVkVOU0hURUlOID0gJ0xldmVuc2h0ZWluJyxcbiAgICBORUVETEVNQU5OX1dVTlNDSCA9ICdOZWVkbGVtYW5uLVd1bnNjaCcsXG4gICAgTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRSA9ICdNb25vbWVyIGNoZW1pY2FsIGRpc3RhbmNlJ1xufTtcblxuZXhwb3J0IGNvbnN0IG1tRGlzdGFuY2VGdW5jdGlvbnM6IFJlY29yZDxNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMsICh2YWx1ZT86IGFueSkgPT4gbW1EaXN0YW5jZUZ1bmN0aW9uVHlwZT4gPSB7XG4gIFtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuSEFNTUlOR106IGhhbW1pbmcsXG4gIFtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTEVWRU5TSFRFSU5dOiBsZXZlbnN0ZWluLFxuICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLk5FRURMRU1BTk5fV1VOU0NIXTogbmVlZGxlbWFuV3VuY2gsXG4gIFtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRV06IGhhbW1pbmdcbn07XG4iXX0=","import { distance } from 'fastest-levenshtein';\nexport function levenstein() {\n return (seq1, seq2) => {\n return distance(seq1, seq2) / Math.max(seq1.length, seq2.length);\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV2ZW5zdGVpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxldmVuc3RlaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRzdDLE1BQU0sVUFBVSxVQUFVO0lBQ3hCLE9BQU8sQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLEVBQUU7UUFDcEMsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZGlzdGFuY2V9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGxldmVuc3RlaW4oKTogbW1EaXN0YW5jZUZ1bmN0aW9uVHlwZSB7XG4gIHJldHVybiAoc2VxMTogc3RyaW5nLCBzZXEyOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gZGlzdGFuY2Uoc2VxMSwgc2VxMikgLyBNYXRoLm1heChzZXExLmxlbmd0aCwgc2VxMi5sZW5ndGgpO1xuICB9O1xufVxuIl19","export function errorToConsole(err) {\n var _a;\n if (typeof err === 'string' || err instanceof String) {\n return err;\n }\n else if ((typeof err == 'object' || err instanceof Object) && '$thrownJsError' in err) {\n return errorToConsole(err['$thrownJsError']);\n }\n else if (err instanceof Error) {\n return (_a = err.stack) !== null && _a !== void 0 ? _a : err.message;\n }\n else {\n return err.toString();\n }\n}\nexport function rectToConsole(rect) {\n return `(x=${rect.x}, y=${rect.y}, w=${rect.width}, h=${rect.height})`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8tY29uc29sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvLWNvbnNvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFROztJQUNyQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLFlBQVksTUFBTSxFQUFFO1FBQ3BELE9BQU8sR0FBYSxDQUFDO0tBQ3RCO1NBQU0sSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFFBQVEsSUFBSSxHQUFHLFlBQVksTUFBTSxDQUFDLElBQUksZ0JBQWdCLElBQUksR0FBRyxFQUFFO1FBQ3ZGLE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7S0FDOUM7U0FBTSxJQUFJLEdBQUcsWUFBWSxLQUFLLEVBQUU7UUFDL0IsT0FBTyxNQUFDLEdBQWEsQ0FBQyxLQUFLLG1DQUFLLEdBQWEsQ0FBQyxPQUFPLENBQUM7S0FDdkQ7U0FBTTtRQUNMLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQ3ZCO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsSUFBYTtJQUN6QyxPQUFPLE1BQU0sSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO0FBQ3pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvclRvQ29uc29sZShlcnI6IGFueSk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJyB8fCBlcnIgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICByZXR1cm4gZXJyIGFzIHN0cmluZztcbiAgfSBlbHNlIGlmICgodHlwZW9mIGVyciA9PSAnb2JqZWN0JyB8fCBlcnIgaW5zdGFuY2VvZiBPYmplY3QpICYmICckdGhyb3duSnNFcnJvcicgaW4gZXJyKSB7XG4gICAgcmV0dXJuIGVycm9yVG9Db25zb2xlKGVyclsnJHRocm93bkpzRXJyb3InXSk7XG4gIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gKGVyciBhcyBFcnJvcikuc3RhY2sgPz8gKGVyciBhcyBFcnJvcikubWVzc2FnZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXJyLnRvU3RyaW5nKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY3RUb0NvbnNvbGUocmVjdDogREcuUmVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBgKHg9JHtyZWN0Lnh9LCB5PSR7cmVjdC55fSwgdz0ke3JlY3Qud2lkdGh9LCBoPSR7cmVjdC5oZWlnaHR9KWA7XG59XG4iXX0=","(function (root, factory) {\n // Hack to make all exports of this module sha256 function object properties.\n var exports = {};\n factory(exports);\n var sha256 = exports[\"default\"];\n for (var k in exports) {\n sha256[k] = exports[k];\n }\n \n if (typeof module === 'object' && typeof module.exports === 'object') {\n module.exports = sha256;\n } else if (typeof define === 'function' && define.amd) {\n define(function() { return sha256; }); \n } else {\n root.sha256 = sha256;\n }\n})(this, function(exports) {\n\"use strict\";\nexports.__esModule = true;\n// SHA-256 (+ HMAC and PBKDF2) for JavaScript.\n//\n// Written in 2014-2016 by Dmitry Chestnykh.\n// Public domain, no warranty.\n//\n// Functions (accept and return Uint8Arrays):\n//\n// sha256(message) -> hash\n// sha256.hmac(key, message) -> mac\n// sha256.pbkdf2(password, salt, rounds, dkLen) -> dk\n//\n// Classes:\n//\n// new sha256.Hash()\n// new sha256.HMAC(key)\n//\nexports.digestLength = 32;\nexports.blockSize = 64;\n// SHA-256 constants\nvar K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b,\n 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01,\n 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7,\n 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152,\n 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc,\n 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819,\n 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08,\n 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f,\n 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\nfunction hashBlocks(w, v, p, pos, len) {\n var a, b, c, d, e, f, g, h, u, i, j, t1, t2;\n while (len >= 64) {\n a = v[0];\n b = v[1];\n c = v[2];\n d = v[3];\n e = v[4];\n f = v[5];\n g = v[6];\n h = v[7];\n for (i = 0; i < 16; i++) {\n j = pos + i * 4;\n w[i] = (((p[j] & 0xff) << 24) | ((p[j + 1] & 0xff) << 16) |\n ((p[j + 2] & 0xff) << 8) | (p[j + 3] & 0xff));\n }\n for (i = 16; i < 64; i++) {\n u = w[i - 2];\n t1 = (u >>> 17 | u << (32 - 17)) ^ (u >>> 19 | u << (32 - 19)) ^ (u >>> 10);\n u = w[i - 15];\n t2 = (u >>> 7 | u << (32 - 7)) ^ (u >>> 18 | u << (32 - 18)) ^ (u >>> 3);\n w[i] = (t1 + w[i - 7] | 0) + (t2 + w[i - 16] | 0);\n }\n for (i = 0; i < 64; i++) {\n t1 = (((((e >>> 6 | e << (32 - 6)) ^ (e >>> 11 | e << (32 - 11)) ^\n (e >>> 25 | e << (32 - 25))) + ((e & f) ^ (~e & g))) | 0) +\n ((h + ((K[i] + w[i]) | 0)) | 0)) | 0;\n t2 = (((a >>> 2 | a << (32 - 2)) ^ (a >>> 13 | a << (32 - 13)) ^\n (a >>> 22 | a << (32 - 22))) + ((a & b) ^ (a & c) ^ (b & c))) | 0;\n h = g;\n g = f;\n f = e;\n e = (d + t1) | 0;\n d = c;\n c = b;\n b = a;\n a = (t1 + t2) | 0;\n }\n v[0] += a;\n v[1] += b;\n v[2] += c;\n v[3] += d;\n v[4] += e;\n v[5] += f;\n v[6] += g;\n v[7] += h;\n pos += 64;\n len -= 64;\n }\n return pos;\n}\n// Hash implements SHA256 hash algorithm.\nvar Hash = /** @class */ (function () {\n function Hash() {\n this.digestLength = exports.digestLength;\n this.blockSize = exports.blockSize;\n // Note: Int32Array is used instead of Uint32Array for performance reasons.\n this.state = new Int32Array(8); // hash state\n this.temp = new Int32Array(64); // temporary state\n this.buffer = new Uint8Array(128); // buffer for data to hash\n this.bufferLength = 0; // number of bytes in buffer\n this.bytesHashed = 0; // number of total bytes hashed\n this.finished = false; // indicates whether the hash was finalized\n this.reset();\n }\n // Resets hash state making it possible\n // to re-use this instance to hash other data.\n Hash.prototype.reset = function () {\n this.state[0] = 0x6a09e667;\n this.state[1] = 0xbb67ae85;\n this.state[2] = 0x3c6ef372;\n this.state[3] = 0xa54ff53a;\n this.state[4] = 0x510e527f;\n this.state[5] = 0x9b05688c;\n this.state[6] = 0x1f83d9ab;\n this.state[7] = 0x5be0cd19;\n this.bufferLength = 0;\n this.bytesHashed = 0;\n this.finished = false;\n return this;\n };\n // Cleans internal buffers and re-initializes hash state.\n Hash.prototype.clean = function () {\n for (var i = 0; i < this.buffer.length; i++) {\n this.buffer[i] = 0;\n }\n for (var i = 0; i < this.temp.length; i++) {\n this.temp[i] = 0;\n }\n this.reset();\n };\n // Updates hash state with the given data.\n //\n // Optionally, length of the data can be specified to hash\n // fewer bytes than data.length.\n //\n // Throws error when trying to update already finalized hash:\n // instance must be reset to use it again.\n Hash.prototype.update = function (data, dataLength) {\n if (dataLength === void 0) { dataLength = data.length; }\n if (this.finished) {\n throw new Error(\"SHA256: can't update because hash was finished.\");\n }\n var dataPos = 0;\n this.bytesHashed += dataLength;\n if (this.bufferLength > 0) {\n while (this.bufferLength < 64 && dataLength > 0) {\n this.buffer[this.bufferLength++] = data[dataPos++];\n dataLength--;\n }\n if (this.bufferLength === 64) {\n hashBlocks(this.temp, this.state, this.buffer, 0, 64);\n this.bufferLength = 0;\n }\n }\n if (dataLength >= 64) {\n dataPos = hashBlocks(this.temp, this.state, data, dataPos, dataLength);\n dataLength %= 64;\n }\n while (dataLength > 0) {\n this.buffer[this.bufferLength++] = data[dataPos++];\n dataLength--;\n }\n return this;\n };\n // Finalizes hash state and puts hash into out.\n //\n // If hash was already finalized, puts the same value.\n Hash.prototype.finish = function (out) {\n if (!this.finished) {\n var bytesHashed = this.bytesHashed;\n var left = this.bufferLength;\n var bitLenHi = (bytesHashed / 0x20000000) | 0;\n var bitLenLo = bytesHashed << 3;\n var padLength = (bytesHashed % 64 < 56) ? 64 : 128;\n this.buffer[left] = 0x80;\n for (var i = left + 1; i < padLength - 8; i++) {\n this.buffer[i] = 0;\n }\n this.buffer[padLength - 8] = (bitLenHi >>> 24) & 0xff;\n this.buffer[padLength - 7] = (bitLenHi >>> 16) & 0xff;\n this.buffer[padLength - 6] = (bitLenHi >>> 8) & 0xff;\n this.buffer[padLength - 5] = (bitLenHi >>> 0) & 0xff;\n this.buffer[padLength - 4] = (bitLenLo >>> 24) & 0xff;\n this.buffer[padLength - 3] = (bitLenLo >>> 16) & 0xff;\n this.buffer[padLength - 2] = (bitLenLo >>> 8) & 0xff;\n this.buffer[padLength - 1] = (bitLenLo >>> 0) & 0xff;\n hashBlocks(this.temp, this.state, this.buffer, 0, padLength);\n this.finished = true;\n }\n for (var i = 0; i < 8; i++) {\n out[i * 4 + 0] = (this.state[i] >>> 24) & 0xff;\n out[i * 4 + 1] = (this.state[i] >>> 16) & 0xff;\n out[i * 4 + 2] = (this.state[i] >>> 8) & 0xff;\n out[i * 4 + 3] = (this.state[i] >>> 0) & 0xff;\n }\n return this;\n };\n // Returns the final hash digest.\n Hash.prototype.digest = function () {\n var out = new Uint8Array(this.digestLength);\n this.finish(out);\n return out;\n };\n // Internal function for use in HMAC for optimization.\n Hash.prototype._saveState = function (out) {\n for (var i = 0; i < this.state.length; i++) {\n out[i] = this.state[i];\n }\n };\n // Internal function for use in HMAC for optimization.\n Hash.prototype._restoreState = function (from, bytesHashed) {\n for (var i = 0; i < this.state.length; i++) {\n this.state[i] = from[i];\n }\n this.bytesHashed = bytesHashed;\n this.finished = false;\n this.bufferLength = 0;\n };\n return Hash;\n}());\nexports.Hash = Hash;\n// HMAC implements HMAC-SHA256 message authentication algorithm.\nvar HMAC = /** @class */ (function () {\n function HMAC(key) {\n this.inner = new Hash();\n this.outer = new Hash();\n this.blockSize = this.inner.blockSize;\n this.digestLength = this.inner.digestLength;\n var pad = new Uint8Array(this.blockSize);\n if (key.length > this.blockSize) {\n (new Hash()).update(key).finish(pad).clean();\n }\n else {\n for (var i = 0; i < key.length; i++) {\n pad[i] = key[i];\n }\n }\n for (var i = 0; i < pad.length; i++) {\n pad[i] ^= 0x36;\n }\n this.inner.update(pad);\n for (var i = 0; i < pad.length; i++) {\n pad[i] ^= 0x36 ^ 0x5c;\n }\n this.outer.update(pad);\n this.istate = new Uint32Array(8);\n this.ostate = new Uint32Array(8);\n this.inner._saveState(this.istate);\n this.outer._saveState(this.ostate);\n for (var i = 0; i < pad.length; i++) {\n pad[i] = 0;\n }\n }\n // Returns HMAC state to the state initialized with key\n // to make it possible to run HMAC over the other data with the same\n // key without creating a new instance.\n HMAC.prototype.reset = function () {\n this.inner._restoreState(this.istate, this.inner.blockSize);\n this.outer._restoreState(this.ostate, this.outer.blockSize);\n return this;\n };\n // Cleans HMAC state.\n HMAC.prototype.clean = function () {\n for (var i = 0; i < this.istate.length; i++) {\n this.ostate[i] = this.istate[i] = 0;\n }\n this.inner.clean();\n this.outer.clean();\n };\n // Updates state with provided data.\n HMAC.prototype.update = function (data) {\n this.inner.update(data);\n return this;\n };\n // Finalizes HMAC and puts the result in out.\n HMAC.prototype.finish = function (out) {\n if (this.outer.finished) {\n this.outer.finish(out);\n }\n else {\n this.inner.finish(out);\n this.outer.update(out, this.digestLength).finish(out);\n }\n return this;\n };\n // Returns message authentication code.\n HMAC.prototype.digest = function () {\n var out = new Uint8Array(this.digestLength);\n this.finish(out);\n return out;\n };\n return HMAC;\n}());\nexports.HMAC = HMAC;\n// Returns SHA256 hash of data.\nfunction hash(data) {\n var h = (new Hash()).update(data);\n var digest = h.digest();\n h.clean();\n return digest;\n}\nexports.hash = hash;\n// Function hash is both available as module.hash and as default export.\nexports[\"default\"] = hash;\n// Returns HMAC-SHA256 of data under the key.\nfunction hmac(key, data) {\n var h = (new HMAC(key)).update(data);\n var digest = h.digest();\n h.clean();\n return digest;\n}\nexports.hmac = hmac;\n// Fills hkdf buffer like this:\n// T(1) = HMAC-Hash(PRK, T(0) | info | 0x01)\nfunction fillBuffer(buffer, hmac, info, counter) {\n // Counter is a byte value: check if it overflowed.\n var num = counter[0];\n if (num === 0) {\n throw new Error(\"hkdf: cannot expand more\");\n }\n // Prepare HMAC instance for new data with old key.\n hmac.reset();\n // Hash in previous output if it was generated\n // (i.e. counter is greater than 1).\n if (num > 1) {\n hmac.update(buffer);\n }\n // Hash in info if it exists.\n if (info) {\n hmac.update(info);\n }\n // Hash in the counter.\n hmac.update(counter);\n // Output result to buffer and clean HMAC instance.\n hmac.finish(buffer);\n // Increment counter inside typed array, this works properly.\n counter[0]++;\n}\nvar hkdfSalt = new Uint8Array(exports.digestLength); // Filled with zeroes.\nfunction hkdf(key, salt, info, length) {\n if (salt === void 0) { salt = hkdfSalt; }\n if (length === void 0) { length = 32; }\n var counter = new Uint8Array([1]);\n // HKDF-Extract uses salt as HMAC key, and key as data.\n var okm = hmac(salt, key);\n // Initialize HMAC for expanding with extracted key.\n // Ensure no collisions with `hmac` function.\n var hmac_ = new HMAC(okm);\n // Allocate buffer.\n var buffer = new Uint8Array(hmac_.digestLength);\n var bufpos = buffer.length;\n var out = new Uint8Array(length);\n for (var i = 0; i < length; i++) {\n if (bufpos === buffer.length) {\n fillBuffer(buffer, hmac_, info, counter);\n bufpos = 0;\n }\n out[i] = buffer[bufpos++];\n }\n hmac_.clean();\n buffer.fill(0);\n counter.fill(0);\n return out;\n}\nexports.hkdf = hkdf;\n// Derives a key from password and salt using PBKDF2-HMAC-SHA256\n// with the given number of iterations.\n//\n// The number of bytes returned is equal to dkLen.\n//\n// (For better security, avoid dkLen greater than hash length - 32 bytes).\nfunction pbkdf2(password, salt, iterations, dkLen) {\n var prf = new HMAC(password);\n var len = prf.digestLength;\n var ctr = new Uint8Array(4);\n var t = new Uint8Array(len);\n var u = new Uint8Array(len);\n var dk = new Uint8Array(dkLen);\n for (var i = 0; i * len < dkLen; i++) {\n var c = i + 1;\n ctr[0] = (c >>> 24) & 0xff;\n ctr[1] = (c >>> 16) & 0xff;\n ctr[2] = (c >>> 8) & 0xff;\n ctr[3] = (c >>> 0) & 0xff;\n prf.reset();\n prf.update(salt);\n prf.update(ctr);\n prf.finish(u);\n for (var j = 0; j < len; j++) {\n t[j] = u[j];\n }\n for (var j = 2; j <= iterations; j++) {\n prf.reset();\n prf.update(u).finish(u);\n for (var k = 0; k < len; k++) {\n t[k] ^= u[k];\n }\n }\n for (var j = 0; j < len && i * len + j < dkLen; j++) {\n dk[i * len + j] = t[j];\n }\n }\n for (var i = 0; i < len; i++) {\n t[i] = u[i] = 0;\n }\n for (var i = 0; i < 4; i++) {\n ctr[i] = 0;\n }\n prf.clean();\n return dk;\n}\nexports.pbkdf2 = pbkdf2;\n});\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport wu from 'wu';\nimport {Unsubscribable} from 'rxjs';\n\nimport {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types/index';\n\nimport {getParts, parseHelm} from './utils';\n\nimport {_package, getMonomerLib} from './package';\n\nexport const enum Temps {\n helmMonomerPlacer = 'bio-helmMonomerPlacer',\n}\n\nexport interface IEditor {\n get m(): IEditorMol;\n\n redraw(): void;\n}\n\nexport interface IEditorMol {\n get atoms(): IEditorMolAtom[];\n}\n\nexport interface IEditorMolAtom {\n get p(): IEditorPoint;\n\n get elem(): string;\n}\n\nexport interface IEditorPoint {\n get x(): number;\n\n get y(): number;\n}\n\nexport interface ISeqMonomer {\n polymerType: string\n symbol: string,\n}\n\nexport class HelmMonomerPlacer {\n private readonly grid: DG.Grid | null;\n public readonly monomerLib: IMonomerLib;\n\n private _allPartsList: (string[] | null)[];\n private _lengthsList: (number[] | null)[];\n private _editorList: (IEditor | null)[];\n\n public monomerCharWidth: number = 7;\n public leftPadding: number = 5;\n public monomerTextSizeMap: { [p: string]: TextMetrics } = {};\n\n private subs: Unsubscribable[] = [];\n\n public constructor(\n public readonly gridCol: DG.GridColumn | null,\n public readonly col: DG.Column<string>\n ) {\n this.grid = this.gridCol ? this.gridCol.grid : null;\n this.reset();\n if (this.grid) {\n this.subs.push(this.col.dataFrame.onDataChanged.subscribe(() => {\n try {\n this.reset();\n } catch (err: any) {\n console.error(err);\n }\n }));\n this.subs.push(grok.events.onViewRemoved.subscribe((view: DG.View) => {\n try {\n if (this.grid && this.grid.view?.id === view.id) this.destroy();\n } catch (err: any) {\n console.error(err);\n }\n }));\n }\n this.monomerLib = getMonomerLib();\n this.subs.push(this.monomerLib.onChanged.subscribe(this.monomerLibOnChanged.bind(this)));\n }\n\n private reset(): void {\n this._allPartsList = new Array<string[] | null>(this.col.length).fill(null);\n this._lengthsList = new Array<number[] | null>(this.col.length).fill(null);\n this._editorList = new Array<IEditor | null>(this.col.length).fill(null);\n }\n\n private destroy(): void {\n for (const sub of this.subs) sub.unsubscribe();\n }\n\n /** Skips cell for the fallback rendering */\n public skipCell(rowIdx: number): void {\n this._allPartsList[rowIdx] = [];\n this._lengthsList[rowIdx] = [];\n }\n\n /** @param rowIdx Row index of the table {@link DG.DataFrame}, HelmMonomerPlacer is {@link DG.Column} based */\n public getCellAllPartsLengths(rowIdx: number): [string[], number[], number[]] {\n const [allParts, lengths] = this.getCellMonomerLengthsForSeq(rowIdx);\n\n const sumLengths: number[] = new Array<number>(lengths.length + 1);\n sumLengths[0] = this.leftPadding; // padding\n for (let pos: number = 1; pos < sumLengths.length; pos++)\n sumLengths[pos] = sumLengths[pos - 1] + lengths[pos - 1];\n return [allParts, lengths, sumLengths];\n }\n\n private getCellMonomerLengthsForSeq(rowIdx: number): [string[], number[]] {\n let allParts: string[] | null = this._allPartsList![rowIdx];\n if (allParts === null) {\n const seq = this.col.get(rowIdx);\n allParts = this._allPartsList![rowIdx] = getAllParts(seq);\n }\n\n let lengths: number[] | null = this._lengthsList![rowIdx];\n if (lengths === null) {\n lengths = this._lengthsList![rowIdx] = new Array<number>(allParts.length);\n for (const [part, partI] of wu.enumerate(allParts)) {\n const partWidth: number = part.length * this.monomerCharWidth;\n lengths[partI] = partWidth;\n }\n }\n\n return [allParts, lengths];\n }\n\n getMonomer(monomer: ISeqMonomer): Monomer | null {\n let res: Monomer | null = null;\n if (monomer.polymerType)\n res = this.monomerLib.getMonomer(monomer.polymerType, monomer.symbol);\n else {\n for (const polymerType of this.monomerLib.getPolymerTypes()) {\n res = this.monomerLib.getMonomer(polymerType, monomer.symbol);\n if (res) break;\n }\n }\n return res;\n }\n\n // -- Handle events --\n\n private monomerLibOnChanged(_value: any): void {\n this.reset();\n if (this.grid) this.grid.invalidate();\n }\n\n public setEditor(tableRowIndex: number, editor: IEditor) {\n this._editorList![tableRowIndex] = editor;\n }\n\n public getEditor(tableRowIndex: number): IEditor | null {\n return this._editorList![tableRowIndex];\n }\n}\n\nexport function getAllParts(seq: string | null): string[] {\n const monomerList: string[] = !!seq ? parseHelm(seq) : [];\n return !!seq ? getParts(monomerList, seq) : [];\n}\n","import { monomerToShort } from './macromolecule/utils';\nconst undefinedColor = 'rgb(100,100,100)';\nconst grayColor = '#808080';\nconst blackColor = 'rgb(0,0,0)';\nconst monomerToShortFunction = monomerToShort;\nexport var TAGS;\n(function (TAGS) {\n TAGS[\"maxMonomerLength\"] = \".mm.cellRenderer.maxMonomerLength\";\n})(TAGS || (TAGS = {}));\nexport var DrawStyle;\n(function (DrawStyle) {\n DrawStyle[\"MSA\"] = \"MSA\";\n DrawStyle[\"classic\"] = \"classic\";\n})(DrawStyle || (DrawStyle = {}));\n/** A function that prints a string aligned to left or centered.\n * @param {number}x x coordinate.\n * @param {number}y y coordinate.\n * @param {number}w Width.\n * @param {number}h Height.\n * @param {CanvasRenderingContext2D}g Canvas rendering context.\n * @param {string}s String to print.\n * @param {string}color String color.\n * @param {number}pivot Pirvot.\n * @param {boolean}left Is left aligned.\n * @param {number}transparencyRate Transparency rate where 1.0 is fully transparent\n * @param {string}separator Is separator for sequence.\n * @param {boolean}last Is checker if element last or not.\n * @param {DrawStyle}drawStyle Is draw style. MSA - for multicharSeq, classic - for other seq.\n * @param {number[]}maxWord {{[pos: number]: number}} Max word lengths per position.\n * @param {number}wordIdx Is index of word we currently draw.\n * @param {DG.GridCell}gridCell Is grid cell.\n * @param {string[]}referenceSequence Is reference sequence for diff mode.\n * @param {number}maxLengthOfMonomer Is max length of monomer.\n * @param {{[key: string]: TextMetrics}}monomerTextSizeMap Is map of monomer text sizes.\n * @return {number} x coordinate to start printing at.*/\nexport function printLeftOrCentered(x, y, w, h, g, s, color = undefinedColor, pivot = 0, left = false, transparencyRate = 1.0, separator = '', last = false, drawStyle = DrawStyle.classic, maxWord = [], wordIdx = 0, gridCell = null, referenceSequence = null, maxLengthOfMonomer = null, monomerTextSizeMap = {}) {\n g.textAlign = 'start';\n let colorPart = s.substring(0);\n let grayPart = last ? '' : separator;\n if (drawStyle === DrawStyle.MSA)\n grayPart = '';\n let colorCode = true;\n let compareWithCurrent = true;\n let highlightDifference = 'difference';\n if ((gridCell != null) && (gridCell.cell.column != null)) {\n colorCode = gridCell.cell.column.temp['color-code'] ?? true;\n compareWithCurrent = gridCell.cell.column.temp['compare-with-current'] ?? true;\n highlightDifference = gridCell.cell.column.temp['highlight-difference'] ?? 'difference';\n }\n if (referenceSequence) {\n const currentMonomerCanonical = referenceSequence[wordIdx];\n if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'difference'))\n transparencyRate = (colorPart == currentMonomerCanonical) ? 0.3 : transparencyRate;\n if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'equal'))\n transparencyRate = (colorPart != currentMonomerCanonical) ? 0.3 : transparencyRate;\n }\n if (maxLengthOfMonomer != null)\n colorPart = monomerToShortFunction(colorPart, maxLengthOfMonomer);\n const fullText = colorPart + grayPart;\n monomerTextSizeMap[fullText] ?? (monomerTextSizeMap[fullText] = g.measureText(fullText));\n let textSize = monomerTextSizeMap[fullText];\n monomerTextSizeMap[colorPart] ?? (monomerTextSizeMap[colorPart] = g.measureText(colorPart));\n let maxColorTextSize = monomerTextSizeMap[colorPart].width;\n monomerTextSizeMap[grayPart] ?? (monomerTextSizeMap[grayPart] = g.measureText(grayPart));\n const grayPartSize = monomerTextSizeMap[grayPart].width;\n const dy = h / 2 - (textSize.fontBoundingBoxAscent + textSize.fontBoundingBoxDescent) / 2 + 1;\n textSize = textSize.width;\n if (drawStyle === DrawStyle.MSA) {\n maxColorTextSize = maxWord[wordIdx];\n textSize = maxWord[wordIdx];\n }\n /** Draw color part at {@link dx1}, and gray part at {@link dx2}. */\n function draw(dx1, dx2) {\n const drawColor = colorCode ? color : blackColor;\n g.fillStyle = drawColor;\n g.globalAlpha = transparencyRate;\n if (drawStyle === DrawStyle.classic) {\n g.fillText(colorPart, x + dx1, y + dy);\n g.fillStyle = grayColor;\n g.fillText(grayPart, x + dx2, y + dy);\n }\n if (drawStyle === DrawStyle.MSA)\n g.fillText(colorPart, x + dx1, y + dy);\n }\n const placeX = (maxWord[wordIdx] ?? 0) - (maxWord[0] ?? 0);\n if (left || textSize > w) {\n draw(placeX, placeX + maxColorTextSize);\n return x + placeX + maxColorTextSize + grayPartSize;\n }\n else {\n const dx = (w - textSize) / 2;\n draw(dx, dx + maxColorTextSize);\n return x + placeX + dx + maxColorTextSize;\n }\n}\n//# sourceMappingURL=cell-renderer.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 wu from 'wu';\n\nimport {printLeftOrCentered} from '@datagrok-libraries/bio/src/utils/cell-renderer';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\n\nimport {findMonomers, parseHelm, removeGapsFromHelm} from './utils';\nimport {IEditor, HelmMonomerPlacer, IEditorMolAtom, ISeqMonomer, Temps} from './helm-monomer-placer';\nimport {IMonomerLib} from '@datagrok-libraries/bio/src/types/index';\n\n// import {_package} from './package'; // NullError: method not found: '_package' on null\n\nconst enum tempTAGS {\n helmSumMaxLengthWords = 'helm-sum-maxLengthWords',\n helmMaxLengthWords = 'helm-maxLengthWords',\n\n helmPlacer = 'bio-helmPlacer',\n}\n\nfunction getSeqMonomerFromHelm(\n helmPrefix: string, symbol: string, monomerLib: IMonomerLib\n): ISeqMonomer {\n let resSeqMonomer: ISeqMonomer | undefined = undefined;\n for (const polymerType of monomerLib.getPolymerTypes()) {\n if (helmPrefix.startsWith(polymerType))\n resSeqMonomer = {symbol: symbol, polymerType: polymerType};\n }\n if (!resSeqMonomer)\n throw new Error(`Monomer not found for symbol = '${symbol}' and helmPrefix = '${helmPrefix}'.`);\n return resSeqMonomer;\n}\n\nfunction getSeqMonomerFromHelmAtom(atom: IEditorMolAtom): ISeqMonomer {\n let polymerType: string | undefined = undefined;\n // @ts-ignore\n switch (atom.bio.type) {\n case 'HELM_BASE':\n case 'HELM_SUGAR': // r - ribose, d - deoxyribose\n case 'HELM_LINKER': // p - phosphate\n polymerType = 'RNA';\n break;\n case 'HELM_AA':\n polymerType = 'PEPTIDE';\n break;\n default:\n polymerType = 'PEPTIDE';\n }\n return {symbol: atom.elem, polymerType: polymerType};\n}\n\nfunction getHoveredMonomerFromEditor(\n argsX: number, argsY: number, gridCell: DG.GridCell, editor: IEditor\n): ISeqMonomer | null {\n let hoveredSeqMonomer: ISeqMonomer | null = null;\n\n /** @return {[number, number]} [atom, distance] */\n function getNearest(excluded: (number | undefined)[]): [number | undefined, number | undefined] {\n let atom: number | undefined = undefined;\n let distance: number | undefined = undefined;\n for (let atomI = 0; atomI < editor.m.atoms.length; ++atomI) {\n if (!excluded.includes(atomI)) {\n const aX: number = editor.m.atoms[atomI].p.x;\n const aY: number = editor.m.atoms[atomI].p.y;\n const distanceToAtomI: number = Math.sqrt((argsX - aX) ** 2 + (argsY - aY) ** 2);\n if (distance === undefined || distance > distanceToAtomI) {\n atom = atomI;\n distance = distanceToAtomI;\n }\n }\n }\n return [atom, distance];\n }\n\n const [firstAtomI, firstDistance] = getNearest([]);\n const [secondAtomI, secondDistance] = getNearest([firstAtomI]);\n\n // for (let atomI = 0; atomI < editor.m.atoms.length; ++atomI) {\n // const aX: number = editor.m.atoms[atomI].p.x;\n // const aY: number = editor.m.atoms[atomI].p.y;\n // const distanceToAtomI: number = Math.sqrt((argsX - aX) ** 2 + (argsY - aY) ** 2);\n // if (firstDistance === undefined || firstDistance > distanceToAtomI) {\n // secondAtomI = firstAtomI;\n // firstAtomI = atomI;\n //\n // secondDistance = firstDistance;\n // firstDistance = distanceToAtomI;\n // }\n // }\n\n if (firstAtomI !== undefined && firstDistance !== undefined) {\n const firstAtom = editor.m.atoms[firstAtomI];\n const firstSeqMonomer = getSeqMonomerFromHelmAtom(firstAtom);\n if (secondAtomI !== undefined && secondDistance !== undefined) {\n if (firstDistance < secondDistance * 0.45)\n hoveredSeqMonomer = firstSeqMonomer;\n } else {\n if (firstDistance < 0.35 * gridCell.bounds.height)\n hoveredSeqMonomer = firstSeqMonomer;\n }\n }\n return hoveredSeqMonomer;\n}\n\nfunction getHoveredMonomerFallback(\n argsX: number, _argsY: number, gridCell: DG.GridCell, helmPlacer: HelmMonomerPlacer\n): ISeqMonomer | null {\n let hoveredSeqMonomer: ISeqMonomer | null = null;\n const [allParts, lengths, sumLengths] = helmPlacer.getCellAllPartsLengths(gridCell.tableRowIndex!);\n const maxIndex = Object.values(lengths).length - 1;\n let left = 0;\n let right = maxIndex;\n let found = false;\n let iterCount: number = 0;\n\n let mid = 0;\n if (argsX > sumLengths[0]) {\n while (!found && iterCount < sumLengths.length) {\n mid = Math.floor((right + left) / 2);\n if (argsX >= sumLengths[mid] && argsX <= sumLengths[mid + 1]) {\n left = mid;\n found = true;\n } else if (argsX < sumLengths[mid])\n right = mid - 1;\n else if (argsX > sumLengths[mid + 1])\n left = mid + 1;\n\n if (left == right)\n found = true;\n\n iterCount++;\n }\n }\n left = (argsX >= sumLengths[left]) ? left : left - 1; // correct left to between sumLengths\n if (left >= 0)\n hoveredSeqMonomer = getSeqMonomerFromHelm(allParts[0], allParts[left], helmPlacer.monomerLib);\n return hoveredSeqMonomer;\n}\n\ntype RendererGridCellTemp = {\n [Temps.helmMonomerPlacer]: HelmMonomerPlacer;\n}\n\nfunction getRendererGridCellTemp(gridCell: DG.GridCell\n): [DG.GridColumn | null, DG.Column | null, RendererGridCellTemp] {\n /** Primarily store/get MonomerPlacer at GridColumn, fallback at (Table) Column for scatter plot tooltip */\n let temp: RendererGridCellTemp | null = null;\n\n let gridCol: DG.GridColumn | null = null;\n try { gridCol = gridCell.gridColumn; } catch { gridCol = null; }\n temp = gridCol ? gridCol.temp as RendererGridCellTemp : null;\n\n let tableCol: DG.Column | null = null;\n if (!temp) {\n try { tableCol = gridCell.cell.column; } catch { tableCol = null; }\n temp = tableCol ? tableCol.temp as RendererGridCellTemp : null;\n }\n if (temp === null) throw new Error(`Monomer placer store (GridColumn or Column) not found.`);\n return [gridCol, tableCol, temp];\n}\n\n/** Helm cell renderer in case of no missed monomer draws with JSDraw2.Editor (webeditor),\n * in case of missed monomers presented, draws linear sequences aligned in width per monomer.\n */\nexport class HelmCellRenderer extends DG.GridCellRenderer {\n get name() { return 'helm'; }\n\n get cellType() { return 'helm'; }\n\n get defaultWidth(): number | null { return 400; }\n\n get defaultHeight(): number | null { return 100; }\n\n onMouseMove(gridCell: DG.GridCell, e: MouseEvent): void {\n try {\n const [_gridCol, tableCol, temp] = getRendererGridCellTemp(gridCell);\n const helmPlacer = temp[Temps.helmMonomerPlacer];\n /* Can not do anything without tableColumn */\n if (!tableCol) return;\n\n /** {@link gridCell}.bounds */ const gcb = gridCell.bounds;\n const argsX = e.offsetX - gcb.x;\n const argsY = e.offsetY - gcb.y;\n\n const editor: IEditor | null = helmPlacer.getEditor(gridCell.tableRowIndex!);\n let seqMonomer: ISeqMonomer | null;\n let missedMonomers: Set<string> = new Set<string>(); // of .size = 0\n if (editor)\n seqMonomer = getHoveredMonomerFromEditor(argsX, argsY, gridCell, editor);\n else {\n const seq: string = !gridCell.cell.value ? '' : removeGapsFromHelm(gridCell.cell.value as string);\n const monomerList = parseHelm(seq);\n missedMonomers = findMonomers(monomerList);\n const parsedMonomers = new Set<string>(monomerList);\n seqMonomer = getHoveredMonomerFallback(argsX, argsY, gridCell, helmPlacer);\n if (seqMonomer && !parsedMonomers.has(seqMonomer.symbol)) seqMonomer = null;\n if (seqMonomer) {\n const textSize = helmPlacer.monomerTextSizeMap[seqMonomer.symbol];\n if (textSize) {\n const textBaseLine = gcb.height / 2 -\n (textSize.fontBoundingBoxAscent + textSize.fontBoundingBoxDescent) / 2 + 1;\n const textTop = textBaseLine - textSize.fontBoundingBoxAscent;\n const textBottom = textBaseLine + textSize.fontBoundingBoxDescent;\n if (argsY < textTop || textBottom < argsY) seqMonomer = null;\n }\n }\n }\n\n if (seqMonomer) {\n if (!missedMonomers.has(seqMonomer.symbol)) {\n const tooltipElements: HTMLElement[] = [ui.div(seqMonomer.symbol)];\n const monomerDiv = helmPlacer.monomerLib.getTooltip(seqMonomer.polymerType, seqMonomer.symbol);\n tooltipElements.push(monomerDiv);\n ui.tooltip.show(ui.divV(tooltipElements), e.x + 16, e.y + 16);\n } else {\n ui.tooltip.show(ui.divV([\n ui.divText(`Monomer '${seqMonomer.symbol}' not found.`),\n ui.divText('Open the Context Panel, then expand Manage Libraries'),\n ]), e.x + 16, e.y + 16);\n }\n } else if (missedMonomers.size == 0) {\n ui.tooltip.hide();\n return;\n } else { // seqMonomer == null && missedMonomers.size > 0\n const mmStrList = wu(missedMonomers.keys()).toArray().sort()\n .filter((_, i) => i < 3);\n const missedMonomersStr = mmStrList.join(', ') + (missedMonomers.size > 3 ? ', ...' : '');\n ui.tooltip.show(ui.divV([ui.divText('Monomers missed in monomer libraries:'),\n ui.divText(missedMonomersStr)\n ]), e.x + 16, e.y + 16);\n }\n } catch (err: any) {\n const errMsg: string = errorToConsole(err);\n console.error('Helm: HelmCellRenderer.onMouseMove() error:\\n' + errMsg);\n } finally {\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n\n render(g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number,\n gridCell: DG.GridCell, cellStyle: DG.GridCellStyle\n ) {\n g.save();\n try {\n const [gridCol, tableCol, temp] = getRendererGridCellTemp(gridCell);\n /* Can not do anything without tableColumn containing temp */\n if (!tableCol) return;\n let helmPlacer = temp[Temps.helmMonomerPlacer];\n if (!helmPlacer) helmPlacer = temp[Temps.helmMonomerPlacer] = new HelmMonomerPlacer(gridCol, tableCol);\n\n const grid = gridCell.gridRow !== -1 ? gridCell.grid : undefined;\n const missedColor = 'red';\n const monomerColor: string = '#404040';\n const frameColor: string = '#C0C0C0';\n\n const seq: string = !gridCell.cell.value ? '' : removeGapsFromHelm(gridCell.cell.value);\n const monomerList = parseHelm(seq);\n const monomers: Set<string> = new Set<string>(monomerList);\n const missedMonomers: Set<string> = findMonomers(monomerList);\n\n if (missedMonomers.size == 0) {\n // Recreate host to avoid hanging in window.dojox.gfx.svg.Text.prototype.getTextWidth\n const host = gridCell.element = ui.div([],\n {style: {width: `${w - 2}px`, height: `${h - 2}px`, margin: `${1}px`, backgroundColor: '#FFE0E0'}});\n host.setAttribute('dataformat', 'helm');\n host.setAttribute('data', seq /* gaps skipped */);\n // if grid has neighbour to the left, then shift host to the left\n if (host.parentElement && (gridCell.grid?.canvas?.offsetLeft ?? 0) > 0) {\n host.parentElement.style.left =\n `${(gridCell.grid?.canvas?.offsetLeft ?? 0) + host.parentElement.offsetLeft}px`;\n }\n\n // Recreate editor to avoid hanging in window.dojox.gfx.svg.Text.prototype.getTextWidth\n const editor = new JSDraw2.Editor(host, {width: w, height: h, skin: 'w8', viewonly: true}) as IEditor;\n helmPlacer.setEditor(gridCell.tableRowIndex!, editor);\n\n helmPlacer.skipCell(gridCell.tableRowIndex!);\n return;\n }\n\n if (missedMonomers.size > 0) {\n if (!grid) {\n const r = window.devicePixelRatio;\n h = 28;\n g.canvas.height = h * r;\n g.canvas.style.height = `${h}px`;\n }\n\n w = grid ? Math.min(grid.canvas.width - x, w) : g.canvas.width - x;\n //g.save();\n g.beginPath();\n g.rect(x, y, w, h);\n g.clip();\n g.transform(1, 0, 0, 1, x, y);\n g.font = '12px monospace';\n g.textBaseline = 'top';\n const [allParts, _lengths, sumLengths] = helmPlacer.getCellAllPartsLengths(gridCell.tableRowIndex!);\n\n for (let i = 0; i < allParts.length; ++i) {\n const part: string = allParts[i];\n const color: string =\n part === '.' || part.endsWith('{') || part.startsWith('}') ? frameColor :\n missedMonomers.has(part) ? missedColor :\n monomers.has(part) ? monomerColor :\n frameColor;\n g.fillStyle = color;\n printLeftOrCentered(sumLengths[i], 0, w, h, g, allParts[i], color, 0, true, 1.0,\n undefined, undefined, undefined, undefined, undefined,\n undefined, undefined, undefined, helmPlacer.monomerTextSizeMap);\n }\n }\n } finally {\n g.restore();\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 $ from 'cash-dom';\n\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\nimport {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {GapOriginals, SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';\nimport {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types';\nimport {IHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';\n\nimport {findMonomers, parseHelm} from './utils';\nimport {HelmCellRenderer} from './cell-renderer';\nimport {HelmHelper} from './helm-helper';\nimport {getPropertiesWidget} from './widgets/properties-widget';\n\nlet monomerLib: IMonomerLib | null = null;\n\nimport {WebEditorMonomer, RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from './constants';\n\nexport const _package = new DG.Package();\n\nfunction initHelmPatchDojo(): void {\n // patch window.dojox.gfx.svg.Text.prototype.getTextWidth hangs\n /** get the text width in pixels */\n // @ts-ignore\n window.dojox.gfx.svg.Text.prototype.getTextWidth = function() {\n const rawNode = this.rawNode;\n const oldParent = rawNode.parentNode;\n const _measurementNode = rawNode.cloneNode(true);\n _measurementNode.style.visibility = 'hidden';\n\n // solution to the \"orphan issue\" in FF\n let _width = 0;\n const _text = _measurementNode.firstChild.nodeValue;\n oldParent.appendChild(_measurementNode);\n\n // solution to the \"orphan issue\" in Opera\n // (nodeValue == \"\" hangs firefox)\n if (_text != '') {\n let watchdogCounter = 100;\n while (!_width && --watchdogCounter > 0) { // <-- hangs\n //Yang: work around svgweb bug 417 -- http://code.google.com/p/svgweb/issues/detail?id=417\n if (_measurementNode.getBBox)\n _width = parseInt(_measurementNode.getBBox().width);\n else\n _width = 68;\n }\n }\n oldParent.removeChild(_measurementNode);\n return _width;\n };\n}\n\n//tags: init\nexport async function initHelm(): Promise<void> {\n //@ts-ignore\n org.helm.webeditor.kCaseSensitive = true; // GROK-13880\n\n return Promise.all([\n new Promise((resolve, reject) => {\n // @ts-ignore\n dojo.ready(function() { resolve(null); });\n }).then(() => {\n initHelmPatchDojo();\n }),\n grok.functions.call('Bio:getBioLib'),\n ])\n .then(([_, lib]: [unknown, IMonomerLib]) => {\n monomerLib = lib;\n rewriteLibraries(); // initHelm()\n monomerLib.onChanged.subscribe((_) => {\n try {\n rewriteLibraries(); // initHelm()\n\n const monTypeList: string[] = monomerLib!.getPolymerTypes();\n const msgStr: string = 'Monomer lib updated:<br />' + (\n monTypeList.length == 0 ? 'empty' : monTypeList.map((monType) => {\n return `${monType} ${monomerLib!.getMonomerSymbolsByType(monType).length}`;\n }).join('<br />'));\n\n grok.shell.info(msgStr);\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Helm: initHelm monomerLib.onChanged() error:\\n' + errMsg);\n // throw err; // Prevent disabling event handler\n }\n });\n })\n .catch((err: any) => {\n const errMsg: string = err instanceof Error ? err.message : !!err ? err.toString() : 'Exception \\'undefined\\'';\n grok.shell.error(`Package \\'Helm\\' init initHelm() error: ${errMsg}`);\n const errRes = new Error(errMsg);\n errRes.stack = err.stack;\n throw errRes;\n });\n}\n\nexport function getMonomerLib(): IMonomerLib {\n return monomerLib!;\n}\n\n/** Fills org.helm.webeditor.Monomers dictionary for WebEditor */\nfunction rewriteLibraries() {\n // @ts-ignore\n org.helm.webeditor.Monomers.clear();\n monomerLib!.getPolymerTypes().forEach((polymerType) => {\n const monomerSymbols = monomerLib!.getMonomerSymbolsByType(polymerType);\n monomerSymbols.forEach((monomerSymbol) => {\n let isBroken = false;\n const monomer: Monomer = monomerLib!.getMonomer(polymerType, monomerSymbol)!;\n const webEditorMonomer: WebEditorMonomer = {\n id: monomerSymbol,\n m: monomer.molfile,\n n: monomer.name,\n na: monomer.naturalAnalog,\n rs: monomer.rgroups.length,\n type: monomer.polymerType,\n mt: monomer.monomerType,\n at: {}\n };\n\n if (monomer.rgroups.length > 0) {\n webEditorMonomer.rs = monomer.rgroups.length;\n const at: { [prop: string]: any } = {};\n monomer.rgroups.forEach((it) => {\n at[it[RGROUP_LABEL]] = it[RGROUP_CAP_GROUP_NAME];\n });\n webEditorMonomer.at = at;\n } else if (monomer[SMILES] != null) {\n webEditorMonomer.rs = Object.keys(getRS(monomer[SMILES].toString())).length;\n webEditorMonomer.at = getRS(monomer[SMILES].toString());\n } else\n isBroken = true;\n\n if (!isBroken) {\n // @ts-ignore\n org.helm.webeditor.Monomers.addOneMonomer(webEditorMonomer);\n }\n });\n });\n\n // Obsolete\n const grid: DG.Grid = grok.shell.tv?.grid;\n if (grid) grid.invalidate();\n}\n\n//name: helmCellRenderer\n//tags: cellRenderer\n//meta.cellType: helm\n//meta.columnTags: quality=Macromolecule, units=helm\n//output: grid_cell_renderer result\nexport function helmCellRenderer(): HelmCellRenderer {\n return new HelmCellRenderer();\n}\n\nfunction checkMonomersAndOpenWebEditor(cell: DG.Cell, value?: string, units?: string) {\n const cellValue: string = !!cell && units === undefined ? cell.value : value;\n const monomerList: string[] = parseHelm(cellValue);\n const missedMonomerSet = findMonomers(monomerList);\n if (missedMonomerSet.size === 0)\n webEditor(cell, value, units);\n else if (missedMonomerSet.size === 1 && missedMonomerSet.has(GapOriginals[NOTATION.HELM]))\n grok.shell.warning(`WebEditor doesn't support Helm with gaps '${GapOriginals[NOTATION.HELM]}'.`);\n else {\n grok.shell.warning(\n `Monomers ${Array.from(missedMonomerSet).map((m) => `'${m}'`).join(', ')} are absent! <br/>` +\n `Please, upload the monomer library! <br/>` +\n `<a href=\"https://datagrok.ai/help/domains/bio/macromolecules\" target=\"_blank\">Learn more</a>`);\n }\n}\n\n//tags: cellEditor\n//description: Macromolecule\n//input: grid_cell cell\n//meta.columnTags: quality=Macromolecule, units=helm\nexport function editMoleculeCell(cell: DG.GridCell): void {\n checkMonomersAndOpenWebEditor(cell.cell, undefined, undefined);\n}\n\n//name: Open Helm Web Editor\n//description: Adds editor\n//meta.action: Open Helm Web Editor\n//input: string mol { semType: Macromolecule }\nexport function openEditor(mol: string): void {\n const df = grok.shell.tv.grid.dataFrame;\n const col = df.columns.bySemType('Macromolecule')!;\n const colSh = SeqHandler.forColumn(col);\n const colUnits = col.getTag(DG.TAGS.UNITS);\n if (colUnits === NOTATION.HELM)\n checkMonomersAndOpenWebEditor(df.currentCell, undefined, undefined);\n const convert = colSh.getConverter(NOTATION.HELM);\n const helmMol = convert(mol);\n checkMonomersAndOpenWebEditor(df.currentCell, helmMol, col.getTag(DG.TAGS.UNITS));\n}\n\n//name: Properties\n//tags: panel, bio, helm, widgets\n//input: semantic_value sequence {semType: Macromolecule}\n//output: widget result\nexport function propertiesWidget(sequence: DG.SemanticValue): DG.Widget {\n return getPropertiesWidget(sequence);\n}\n\nfunction webEditor(cell: DG.Cell, value?: string, units?: string) {\n const view = ui.div();\n // const df = grok.shell.tv.grid.dataFrame;\n // const col = df.columns.bySemType('Macromolecule')!;\n const col = cell.column;\n const sh = SeqHandler.forColumn(col);\n const rowIdx = cell.rowIndex;\n // @ts-ignore\n org.helm.webeditor.MolViewer.molscale = 0.8;\n // @ts-ignore\n const app = new scil.helm.App(view, {\n showabout: false,\n mexfontsize: '90%',\n mexrnapinontab: true,\n topmargin: 20,\n mexmonomerstab: true,\n sequenceviewonly: false,\n mexfavoritefirst: true,\n mexfilter: true\n });\n const sizes = app.calculateSizes();\n app.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);\n let s = {width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px'};\n //@ts-ignore\n scil.apply(app.sequence.style, s);\n //@ts-ignore\n scil.apply(app.notation.style, s);\n s = {width: sizes.rightwidth + 'px', height: (sizes.bottomheight + app.toolbarheight) + 'px'};\n //@ts-ignore\n scil.apply(app.properties.parent.style, s);\n app.structureview.resize(sizes.rightwidth, sizes.bottomheight + app.toolbarheight);\n app.mex.resize(sizes.topheight - 80);\n setTimeout(() => {\n if (!!cell && units === undefined)\n app.canvas.helm.setSequence(cell.value, 'HELM');\n else\n app.canvas.helm.setSequence(value, 'HELM');\n }, 200);\n //@ts-ignore\n ui.dialog({showHeader: false, showFooter: true})\n .add(view)\n .onOK(() => {\n const helmValue: string = app.canvas.getHelm(true).replace(/<\\/span>/g, '')\n .replace(/<span style='background:#bbf;'>/g, '');\n if (!!cell) {\n if (units === undefined)\n cell.value = helmValue;\n else {\n const convertedRes = sh.convertHelmToFastaSeparator(helmValue, units!, sh.separator);\n cell.value = convertedRes;\n }\n }\n }).show({modal: true, fullScreen: true});\n}\n\nfunction getRS(smiles: string) {\n const newS = smiles.match(/(?<=\\[)[^\\][]*(?=])/gm);\n const res: { [name: string]: string } = {};\n let el = '';\n let digit;\n if (!!newS) {\n for (let i = 0; i < newS.length; i++) {\n if (newS[i] != null) {\n if (/\\d/.test(newS[i])) {\n digit = newS[i][newS[i].length - 1];\n newS[i] = newS[i].replace(/[0-9]/g, '');\n for (let j = 0; j < newS[i].length; j++) {\n if (newS[i][j] != ':')\n el += newS[i][j];\n }\n res['R' + digit] = el;\n el = '';\n }\n }\n }\n }\n return res;\n}\n\n//name: getMolfiles\n//input: column col {semType: Macromolecule}\n//output: column res\nexport function getMolfiles(col: DG.Column): DG.Column {\n const res = DG.Column.string('mols', col.length);\n\n const host = ui.div([], {style: {width: '0', height: '0'}});\n document.documentElement.appendChild(host);\n try {\n const editor = new JSDraw2.Editor(host, {viewonly: true});\n res.init((i) => {\n editor.setHelm(col.get(i));\n const mol = editor.getMolfile();\n return mol;\n });\n return res;\n } finally {\n $(host).empty();\n host.remove();\n }\n}\n\n// -- Utils --\n\n//name: getHelmHelper\n//output: object result\nexport async function getHelmHelper(): Promise<IHelmHelper> {\n return HelmHelper.getInstance();\n}\n","import * as DG from 'datagrok-api/dg';\n\nimport {\n RGROUP_CAP_GROUP_NAME,\n RGROUP_CAP_GROUP_SMILES,\n jsonSdfMonomerLibDict,\n MONOMER_SYMBOL,\n RGROUP_ALTER_ID,\n RGROUPS,\n RGROUP_LABEL,\n SDF_MONOMER_NAME\n} from '../constants';\n\n// Global flag is for replaceAll\nconst helmGapStartRe = /\\{(\\*\\.)+/g;\nconst helmGapIntRe = /\\.(\\*\\.)+/g;\nconst helmGapEndRe = /(\\.\\*)+\\}/g;\n\nexport function removeGapsFromHelm(srcHelm: string): string {\n return srcHelm.replaceAll(helmGapStartRe, '{').replaceAll(helmGapIntRe, '.')\n .replaceAll(helmGapEndRe, '}').replace('{*}', '{}');\n}\n\nexport function getParts(subParts: string[], s: string): string[] {\n const j = 0;\n const allParts: string[] = [];\n for (let k = 0; k < (subParts ?? []).length; ++k) {\n const indexOfMonomer = s.indexOf(subParts[k]);\n const helmBeforeMonomer = s.slice(j, indexOfMonomer);\n allParts.push(helmBeforeMonomer);\n allParts.push(subParts[k]);\n s = s.substring(indexOfMonomer + subParts[k].length);\n }\n allParts.push(s);\n return allParts;\n}\n\nexport function parseHelm(s: string): string[] {\n const sections = split(s, '$');\n s = sections[0];\n const monomers = [];\n //@ts-ignore\n if (!scil.Utils.isNullOrEmpty(s)) {\n const seqs = split(s, '|');\n for (let i = 0; i < seqs.length; ++i) {\n const e = detachAnnotation(seqs[i]);\n s = e.str;\n\n let p = s.indexOf('{');\n\n s = s.substring(p + 1);\n p = s.indexOf('}');\n s = s.substring(0, p);\n\n const ss = split(s, '.');\n for (const monomer of ss) {\n if (!monomer || monomer === '') continue;\n if (monomer.startsWith('[') && monomer.includes(']')) {\n const closingIndex = findClosing(monomer, 1, '[', ']');\n const element = monomer.substring(1, closingIndex);\n monomers.push(element);\n const residue = monomer.substring(closingIndex + 1);\n ss.push(residue);\n } else if (monomer.includes('[') && monomer.endsWith(']')) {\n const openingIndex = findOpening(monomer, monomer.length - 2, '[', ']');\n const element = monomer.substring(openingIndex + 1, monomer.length - 1);\n monomers.push(element);\n const residue = monomer.substring(0, openingIndex);\n ss.push(residue);\n } else if (monomer.includes('(') && monomer.includes(')')) {\n // here we only want to split the string at first '(' and last ')'\n // because entries like [L-hArg(Et,Et)]([L-hArg(Et,Et)]) where L-hArg(Et,Et) is a single monomer\n const firstPiece = monomer.substring(0, monomer.indexOf('('));\n const thirdPiece = monomer.substring(monomer.lastIndexOf(')') + 1);\n const secondPiece = monomer.substring(firstPiece.length + 1, monomer.length - thirdPiece.length - 1);\n const elements = [firstPiece, secondPiece, thirdPiece];\n for (const el of elements)\n ss.push(el);\n } else\n monomers.push(monomer);\n }\n }\n }\n return monomers;\n}\n\n// /** Find monomers missed in Helm monomer library configured and\n// * used in org.helm.webeditor / scil.helm.Monomers / org.helm.webeditor.Monomers .\n// */\n// export function findMonomers(helmString: string) {\n// //@ts-ignore\n// const types: string[] = Object.keys(org.helm.webeditor.monomerTypeList());\n// const monomerNameList: any[] = [];\n// const monomerNameI: number = 0;\n// const weMonomers = org.helm.webeditor.Monomers;\n// for (let typeI = 0; typeI < types.length; typeI++) {\n// //@ts-ignore\n// const ofTypeMonomers: {} = weMonomers.getMonomerSet(types[typeI]) ?? {};\n// Object.keys(ofTypeMonomers).forEach((key) => {\n// const monomer: any = ofTypeMonomers[key];\n// monomerNameList[monomerNameI] = monomer.id;\n// monomerNameI += 1;\n// });\n// }\n// const helmPartList = parseHelm(helmString);\n// return new Set(helmPartList.filter((val) => !monomerNameList.includes(val)));\n// }\n\n/** Searches monomers of helmString for missed. */\nexport function findMonomers(monomerSymbolList: string[]): Set<string> {\n const types = Object.keys(org.helm.webeditor.monomerTypeList());\n const monomers: any = [];\n const monomerNames: any = [];\n for (let i = 0; i < types.length; i++) {\n //@ts-ignore\n // eslint-disable-next-line new-cap\n monomers.push(new scil.helm.Monomers.getMonomerSet(types[i]));\n Object.keys(monomers[i]).forEach((k) => {\n monomerNames.push(monomers[i][k].id);\n });\n }\n return new Set(monomerSymbolList.filter((val) => !monomerNames.includes(val)));\n}\n\nfunction findClosing(s: string, start: number, open: string, close: string) {\n let i = start;\n let count = 0;\n while (i < s.length) {\n if (s[i] === open)\n count++;\n\n if (s[i] === close) {\n if (count === 0)\n return i;\n count--;\n }\n i++;\n }\n return -1;\n}\n\nfunction findOpening(s: string, start: number, open: string, close: string) {\n let i = start;\n let count = 0;\n while (i >= 0) {\n if (s[i] === close)\n count++;\n\n if (s[i] === open) {\n if (count === 0)\n return i;\n count--;\n }\n i--;\n }\n return -1;\n}\n\nfunction split(s: string, sep: string) {\n const ret = [];\n let frag = '';\n let parentheses = 0;\n let bracket = 0;\n let braces = 0;\n let quote = 0;\n for (let i = 0; i < s.length; ++i) {\n let c = s.substring(i, i + 1);\n if (c == sep && bracket == 0 && parentheses == 0 && braces == 0 && quote == 0) {\n ret.push(frag);\n frag = '';\n } else {\n frag += c;\n if (quote > 0) {\n if (c == '\\\\' && i + 1 < s.length) {\n ++i;\n const c2 = s.substring(i, i + 1);\n frag += c2;\n c += c2;\n }\n }\n if (c == '\\\"') {\n if (!(i > 0 && s.substring(i - 1, i) == '\\\\'))\n quote = quote == 0 ? 1 : 0;\n } else if (c == '[')\n ++bracket;\n else if (c == ']')\n --bracket;\n else if (c == '(')\n ++parentheses;\n else if (c == ')')\n --parentheses;\n else if (c == '{')\n ++braces;\n else if (c == '}')\n --braces;\n }\n }\n ret.push(frag);\n return ret;\n}\n\nfunction detachAnnotation(s: string) {\n const ret = _detachAppendix(s, '\\\"');\n if (ret.tag != null)\n return ret;\n\n const r = _detachAppendix(s, '\\'');\n return {tag: ret.tag, repeat: r.tag, str: r.str};\n}\n\nfunction _detachAppendix(s: string, c: string) {\n let tag = null;\n //@ts-ignore\n if (scil.Utils.endswith(s, c)) {\n let p = s.length - 1;\n while (p > 0) {\n p = s.lastIndexOf(c, p - 1);\n if (p <= 0 || s.substring(p - 1, p) != '\\\\')\n break;\n }\n\n if (p > 0 && p < s.length - 1) {\n tag = s.substring(p + 1, s.length - 1);\n s = s.substring(0, p);\n }\n }\n if (tag != null)\n tag = unescape(tag.replace(new RegExp('\\\\' + c, 'g'), c));\n return {tag: tag, str: s};\n}\n\nfunction unescape(s: string) {\n //@ts-ignore\n if (scil.Utils.isNullOrEmpty(s))\n return s;\n\n return s.replace(/[\\\\]./g, function(m) {\n switch (m) {\n case '\\\\r':\n return '\\r';\n case '\\\\n':\n return '\\n';\n case '\\\\t':\n return '\\t';\n default:\n return m.substring(1);\n }\n });\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport $ from 'cash-dom';\n\nimport {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';\nimport {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\n\nimport {removeGapsFromHelm} from '../utils';\n\nexport function getPropertiesDict(seq: string, sh: SeqHandler): {} {\n const helmString = sh.isHelm() ? seq : sh.getConverter(NOTATION.HELM)(seq);\n // Remove gap symbols for compatibility with WebEditor\n const helmString2 = removeGapsFromHelm(helmString);\n\n const host = ui.div([], {style: {width: '0', height: '0'}});\n document.documentElement.appendChild(host);\n try {\n const editor = new JSDraw2.Editor(host, {viewonly: true});\n editor.setHelm(helmString2);\n\n const formula = editor.getFormula(true);\n const molWeight = Math.round(editor.getMolWeight() * 100) / 100;\n const coef = Math.round(editor.getExtinctionCoefficient(true) * 100) / 100;\n return {\n 'formula': formula.replace(/<sub>/g, '').replace(/<\\/sub>/g, ''),\n 'molecular weight': molWeight,\n 'extinction coefficient': coef,\n };\n } finally {\n $(host).empty();\n host.remove();\n }\n}\n\n\nexport function getPropertiesWidget(value: DG.SemanticValue): DG.Widget {\n const sh = SeqHandler.forColumn(value.cell.column);\n const propDict = getPropertiesDict(value.value, sh);\n return new DG.Widget(\n ui.tableFromMap(propDict)\n );\n}\n","module.exports = $;","module.exports = DG;","module.exports = grok;","module.exports = ui;","module.exports = wu;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.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};","/* eslint-disable max-len */\nimport * as DG from 'datagrok-api/dg';\nimport * as sha256 from 'fast-sha256';\n/**\n * For columns of string type. Checks whether column contains empty values and removes corresponding rows in case user selects to remove.\n *\n */\nexport function removeEmptyStringRows(table, col) {\n const cats = col.categories;\n const emptyRawInd = cats.map((val, ind) => !val ? ind : null).filter((it) => it !== null);\n const rawData = [...col.getRawData()];\n const emptyRawsIndexes = [];\n let removedRowsCounter = 0;\n for (let i = 0; i < table.rowCount; i++) {\n if (emptyRawInd.includes(rawData[i])) {\n table.rows.removeAt(i - removedRowsCounter);\n emptyRawsIndexes.push(i);\n removedRowsCounter += 1;\n }\n }\n return emptyRawsIndexes;\n}\nexport function hashDataFrame(table, names) {\n names !== null && names !== void 0 ? names : (names = table.columns.names());\n const hasher = new sha256.Hash();\n const order = table.getSortedOrder(names);\n const encoder = new TextEncoder();\n for (const name of names) {\n const column = table.columns.byName(name);\n const dataArray = column.getRawData();\n const isString = column.type == DG.TYPE.STRING;\n const cats = column.categories;\n for (let i = 0; i < dataArray.length; i++) {\n if (isString) {\n const data = cats[dataArray[order[i]]];\n hasher.update(encoder.encode(data));\n }\n else {\n const data = dataArray[order[i]];\n hasher.update(Uint8Array.from([data]));\n }\n }\n }\n return hasher.digest();\n}\nexport const testData = DG.DataFrame.fromCsv(`countries,fasta,smiles,molregno,LON,Zip Code,Street Address Line 1,ImageUrl,user_id,error_message,xray,flag,magnitude,CS-id,pdb_id,accel_a,time_offset,chart,fit,Questions,empty_number,empty_string\nBelgium,MSNFHNEHVMQFYRNNLKTKGVFGRQ,CC(C(=O)OCCCc1cccnc1)c2cccc(c2)C(=O)c3ccccc3,1480014,36.276729583740234,995042300,14016 ROUTE 31W,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,1,1,1QBS,1,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.497360340644872, 1.7058694986686864, 5.278052678195135, 0.16000320889028383],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":2.374499797821045},{\"\"x\"\":0.6000000238418579,\"\"y\"\":2.6242473125457764},{\"\"x\"\":1.100000023841858,\"\"y\"\":2.367267608642578},{\"\"x\"\":1.600000023841858,\"\"y\"\":2.6723148822784424},{\"\"x\"\":2.0999999046325684,\"\"y\"\":2.6537344455718994},{\"\"x\"\":2.5999999046325684,\"\"y\"\":2.3651671409606934},{\"\"x\"\":3.0999999046325684,\"\"y\"\":2.5654284954071045},{\"\"x\"\":3.5999999046325684,\"\"y\"\":2.4160959720611572},{\"\"x\"\":4.099999904632568,\"\"y\"\":2.286726713180542},{\"\"x\"\":4.599999904632568,\"\"y\"\":2.5100042819976807},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.6676985025405884},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.680136501789093},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.3391543924808502},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.09038983285427094},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.19802775979042053}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[7.525235855508179, 1.3186911876809984, 5.335672608564294, 0.7860743343958098],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":7.988070487976074},{\"\"x\"\":0.6000000238418579,\"\"y\"\":7.018453121185303},{\"\"x\"\":1.100000023841858,\"\"y\"\":8.115279197692871},{\"\"x\"\":1.600000023841858,\"\"y\"\":7.486658096313477},{\"\"x\"\":2.0999999046325684,\"\"y\"\":7.396438121795654},{\"\"x\"\":2.5999999046325684,\"\"y\"\":7.477052211761475},{\"\"x\"\":3.0999999046325684,\"\"y\"\":6.913095474243164},{\"\"x\"\":3.5999999046325684,\"\"y\"\":8.01385498046875},{\"\"x\"\":4.099999904632568,\"\"y\"\":6.985900402069092},{\"\"x\"\":4.599999904632568,\"\"y\"\":6.970335960388184},{\"\"x\"\":5.099999904632568,\"\"y\"\":5.448817253112793},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.5534818172454834},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.893947958946228},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6340042352676392},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.8403874039649963}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,100,abc\nBurundi,MDYKETLLMPKTDFPMRGGLPNKEPQIQEKW,COc1ccc2cc(ccc2c1)C(C)C(=O)Oc3ccc(C)cc3OC,1480015,36.276729583740234,995073444,80 STATE HIGHWAY 310,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,2,2,1ZP8,2,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[4.431460753103398, 2.1691498799246745, 5.266445597102774, 0.7825762827017926],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":4.751083850860596},{\"\"x\"\":0.6000000238418579,\"\"y\"\":4.203000068664551},{\"\"x\"\":1.100000023841858,\"\"y\"\":4.415858745574951},{\"\"x\"\":1.600000023841858,\"\"y\"\":4.68414306640625},{\"\"x\"\":2.0999999046325684,\"\"y\"\":4.198400974273682},{\"\"x\"\":2.5999999046325684,\"\"y\"\":4.179222106933594},{\"\"x\"\":3.0999999046325684,\"\"y\"\":4.638473987579346},{\"\"x\"\":3.5999999046325684,\"\"y\"\":4.708553314208984},{\"\"x\"\":4.099999904632568,\"\"y\"\":4.291589260101318},{\"\"x\"\":4.599999904632568,\"\"y\"\":4.038082599639893},{\"\"x\"\":5.099999904632568,\"\"y\"\":3.4349939823150635},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.2194708585739136},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.1920831203460693},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.5352635979652405},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.3346920311450958}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.339458017970126, -1.0734184310171178, 4.746332950550934, 0.2482416857595658],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.2139337658882141},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.4269562065601349},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.2441573292016983},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.146635964512825},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.08818462491035461},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.2560656666755676},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.42434045672416687},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.37111231684684753},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.5581737160682678},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.183590054512024},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.5629843473434448},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.3211288452148438},{\"\"x\"\":6.099999904632568,\"\"y\"\":2.229961633682251},{\"\"x\"\":6.599999904632568,\"\"y\"\":2.2560226917266846},{\"\"x\"\":7.099999904632568,\"\"y\"\":2.2142398357391357}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCameroon,MIEVFLFGIVLGLIPITLAGLFVTAYLQYRRGDQLDL,COc1ccc2cc(ccc2c1)C(C)C(=O)OCCCc3cccnc3,1480016,36.26095962524414,995153596,30-56 WHITESTONE EXPY,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,3,3,2BDJ,3,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[4.6760652578642325, 0.9046956320756703, 5.651408971856738, 0.07738846012184185],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":4.32425594329834},{\"\"x\"\":0.6000000238418579,\"\"y\"\":4.668442249298096},{\"\"x\"\":1.100000023841858,\"\"y\"\":4.379785060882568},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.0345139503479},{\"\"x\"\":2.0999999046325684,\"\"y\"\":4.878653526306152},{\"\"x\"\":2.5999999046325684,\"\"y\"\":4.3451313972473145},{\"\"x\"\":3.0999999046325684,\"\"y\"\":4.336992263793945},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.037430286407471},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.0092692375183105},{\"\"x\"\":4.599999904632568,\"\"y\"\":4.151902675628662},{\"\"x\"\":5.099999904632568,\"\"y\"\":3.4066951274871826},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.3732759952545166},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.673728108406067},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.48574790358543396},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.2783052325248718}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.938395863010111, -1.4658480661392117, 5.462702751996584, 0.3473139023615039],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.4941710829734802},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.15323974192142487},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.46373432874679565},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.3370431363582611},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.5179030299186707},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.27899765968322754},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.22075064480304718},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.5789918899536133},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.21169911324977875},{\"\"x\"\":4.599999904632568,\"\"y\"\":0.27857646346092224},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.0906332731246948},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.8520300388336182},{\"\"x\"\":6.099999904632568,\"\"y\"\":2.7177059650421143},{\"\"x\"\":6.599999904632568,\"\"y\"\":2.8680918216705322},{\"\"x\"\":7.099999904632568,\"\"y\"\":3.2413077354431152}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCanada,MMELVLKTIIGPIVVGVVLRIVDKWLNKDK,CC(C(=O)NCCS)c1cccc(c1)C(=O)c2ccccc2,1480017,36.26095962524414,99515,30-56 WHITESTONE EXPY,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,4,4,1IAN,4,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[0.8597390975430008, 1.0957625732481946, 5.260537067987958, 0.07974187998177736],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.8190152645111084},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.8421689867973328},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.8740922212600708},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.8924275040626526},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.8249067664146423},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.9327669143676758},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.8522974252700806},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.8174492716789246},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.8394647240638733},{\"\"x\"\":4.599999904632568,\"\"y\"\":0.7139387726783752},{\"\"x\"\":5.099999904632568,\"\"y\"\":0.5561167597770691},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.3276226818561554},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.12479474395513535},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.13006797432899475},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.059702079743146896}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.760930219582546, 1.6591793293833013, 4.667155929720851, 0.7858109544121652],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":6.156993389129639},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.236701965332031},{\"\"x\"\":1.100000023841858,\"\"y\"\":6.010560512542725},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.495512962341309},{\"\"x\"\":2.0999999046325684,\"\"y\"\":6.087770462036133},{\"\"x\"\":2.5999999046325684,\"\"y\"\":5.79986572265625},{\"\"x\"\":3.0999999046325684,\"\"y\"\":5.597546577453613},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.520902156829834},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.360654354095459},{\"\"x\"\":4.599999904632568,\"\"y\"\":3.5539746284484863},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.577236294746399},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.0001264810562134},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.9305797815322876},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6033638715744019},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.4203685522079468}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nColombia,MDRTDEVSNHTHDKPTLTWFEEIFEEYHSPFHN,FC(F)(F)c1ccc(OC2CCNCC2)cc1,1480029,36.3309440612793,995152050,1 COURT HOUSE SQUARE,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,5,5,4UJ1,5,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[6.4995088314153655, 2.4270351004539914, 5.178659535348579, 0.625653346241577],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":6.496231555938721},{\"\"x\"\":0.6000000238418579,\"\"y\"\":6.42543363571167},{\"\"x\"\":1.100000023841858,\"\"y\"\":7.040063858032227},{\"\"x\"\":1.600000023841858,\"\"y\"\":6.1115403175354},{\"\"x\"\":2.0999999046325684,\"\"y\"\":6.680728435516357},{\"\"x\"\":2.5999999046325684,\"\"y\"\":6.406774520874023},{\"\"x\"\":3.0999999046325684,\"\"y\"\":6.611269474029541},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.889094352722168},{\"\"x\"\":4.099999904632568,\"\"y\"\":6.75344705581665},{\"\"x\"\":4.599999904632568,\"\"y\"\":6.361435890197754},{\"\"x\"\":5.099999904632568,\"\"y\"\":4.1666975021362305},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.172118902206421},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.801048994064331},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.4640021026134491},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.0010357667924836278}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[1.4734381347446401, 1.1649805188074196, 4.82958608866421, 0.09500545496710007],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":1.5279096364974976},{\"\"x\"\":0.6000000238418579,\"\"y\"\":1.3559974431991577},{\"\"x\"\":1.100000023841858,\"\"y\"\":1.5246378183364868},{\"\"x\"\":1.600000023841858,\"\"y\"\":1.5567657947540283},{\"\"x\"\":2.0999999046325684,\"\"y\"\":1.4114240407943726},{\"\"x\"\":2.5999999046325684,\"\"y\"\":1.4045010805130005},{\"\"x\"\":3.0999999046325684,\"\"y\"\":1.4769829511642456},{\"\"x\"\":3.5999999046325684,\"\"y\"\":1.4875500202178955},{\"\"x\"\":4.099999904632568,\"\"y\"\":1.2991987466812134},{\"\"x\"\":4.599999904632568,\"\"y\"\":0.922961413860321},{\"\"x\"\":5.099999904632568,\"\"y\"\":0.6520044803619385},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.15350978076457977},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.1078903079032898},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.17276449501514435},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.14066608250141144}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCosta Rica,MKSTKEEIQTIKTLLKDSRTAKYHKRLQIVL,CC(C)Cc1ccc(cc1)C(C)C(=O)N2CCCC2C(=O)OCCCc3ccccc3,1480018,36.3309440612793,995084218,4041 SOUTHWESTERN BLVD,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,6,6,2BPW,6,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.4833641843311227, -1.8945978742090062, 4.671127708092568, 0.24159861311815153],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.0969524160027504},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.028483040630817413},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.22087176144123077},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.0068915546871721745},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.4305879771709442},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.44774115085601807},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.45346319675445557},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.2370593100786209},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.4657953977584839},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.155200719833374},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.2294070720672607},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.4311530590057373},{\"\"x\"\":6.099999904632568,\"\"y\"\":2.33846116065979},{\"\"x\"\":6.599999904632568,\"\"y\"\":2.608201026916504},{\"\"x\"\":7.099999904632568,\"\"y\"\":2.8136143684387207}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.224573521642033, 1.4454033924198528, 5.6014197746076535, 0.2823216054197577],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":4.95027494430542},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.1754679679870605},{\"\"x\"\":1.100000023841858,\"\"y\"\":5.276752948760986},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.589294910430908},{\"\"x\"\":2.0999999046325684,\"\"y\"\":5.616994857788086},{\"\"x\"\":2.5999999046325684,\"\"y\"\":5.120813846588135},{\"\"x\"\":3.0999999046325684,\"\"y\"\":5.340766906738281},{\"\"x\"\":3.5999999046325684,\"\"y\"\":4.876471042633057},{\"\"x\"\":4.099999904632568,\"\"y\"\":4.94999361038208},{\"\"x\"\":4.599999904632568,\"\"y\"\":5.162564754486084},{\"\"x\"\":5.099999904632568,\"\"y\"\":4.399557590484619},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.7977969646453857},{\"\"x\"\":6.099999904632568,\"\"y\"\":1.0229872465133667},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.48275601863861084},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.10408931970596313}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nCuba,MHAILRYFIRRLFYHIFYKIYSLISKKHQSLPSDVRQF,COc1ccc2c(c1)c(CC(=O)N3CCCC3C(=O)Oc4ccc(C)cc4OC)c(C)n2C(=O)c5ccc(Cl)cc5,1480019,36.33115768432617,995081928,1227 US HIGHWAY 11,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,7,7,1QBS,7,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.320838679713925, -1.2421619987316728, 4.831325425225256, 0.3236011098403072],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":0.3727470338344574},{\"\"x\"\":0.6000000238418579,\"\"y\"\":0.12365014106035233},{\"\"x\"\":1.100000023841858,\"\"y\"\":0.48422467708587646},{\"\"x\"\":1.600000023841858,\"\"y\"\":0.2264465093612671},{\"\"x\"\":2.0999999046325684,\"\"y\"\":0.16821794211864471},{\"\"x\"\":2.5999999046325684,\"\"y\"\":0.3879014551639557},{\"\"x\"\":3.0999999046325684,\"\"y\"\":0.5470244884490967},{\"\"x\"\":3.5999999046325684,\"\"y\"\":0.3419053554534912},{\"\"x\"\":4.099999904632568,\"\"y\"\":0.7655120491981506},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.2346516847610474},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.453336715698242},{\"\"x\"\":5.599999904632568,\"\"y\"\":2.9565491676330566},{\"\"x\"\":6.099999904632568,\"\"y\"\":3.335299491882324},{\"\"x\"\":6.599999904632568,\"\"y\"\":3.240290880203247},{\"\"x\"\":7.099999904632568,\"\"y\"\":3.1107218265533447}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.6401853521511094, 1.26211588875013, 5.399028074402744, 0.5089580830068091],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":3.8585598468780518},{\"\"x\"\":0.6000000238418579,\"\"y\"\":3.6077206134796143},{\"\"x\"\":1.100000023841858,\"\"y\"\":3.855252265930176},{\"\"x\"\":1.600000023841858,\"\"y\"\":3.619039297103882},{\"\"x\"\":2.0999999046325684,\"\"y\"\":3.839388370513916},{\"\"x\"\":2.5999999046325684,\"\"y\"\":3.335283041000366},{\"\"x\"\":3.0999999046325684,\"\"y\"\":3.571141481399536},{\"\"x\"\":3.5999999046325684,\"\"y\"\":3.4155046939849854},{\"\"x\"\":4.099999904632568,\"\"y\"\":3.7316646575927734},{\"\"x\"\":4.599999904632568,\"\"y\"\":3.0680155754089355},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.891066551208496},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.6022753715515137},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.7652576565742493},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6875326037406921},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.5828871726989746}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nItaly,MSNFHNEHVMQFYRNNLKTKGVFGRQ,CC(C)Cc1ccc(cc1)C(C)C(=O)N2CCCC2C(=O)OCCO[N+](=O)[O-],1480020,36.33115768432617,99502,\"168-46 91ST AVE., 2ND FLR\",https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,8,8,1ZP8,8,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[2.293592105923809, 1.3781586549141835, 5.1025898038676605, 0.03493851245291291],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":2.1287283897399902},{\"\"x\"\":0.6000000238418579,\"\"y\"\":2.267972230911255},{\"\"x\"\":1.100000023841858,\"\"y\"\":2.398442506790161},{\"\"x\"\":1.600000023841858,\"\"y\"\":2.5130622386932373},{\"\"x\"\":2.0999999046325684,\"\"y\"\":2.3255116939544678},{\"\"x\"\":2.5999999046325684,\"\"y\"\":2.127340793609619},{\"\"x\"\":3.0999999046325684,\"\"y\"\":2.47259783744812},{\"\"x\"\":3.5999999046325684,\"\"y\"\":2.131181478500366},{\"\"x\"\":4.099999904632568,\"\"y\"\":2.090421438217163},{\"\"x\"\":4.599999904632568,\"\"y\"\":2.02299165725708},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.1105059385299683},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.4494485855102539},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.1375635862350464},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.036351121962070465},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.1619771122932434}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.953125499439879, 1.2528620255306528, 5.187637440149802, 0.3110348753260886],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":5.6585283279418945},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.911152362823486},{\"\"x\"\":1.100000023841858,\"\"y\"\":5.924920082092285},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.8469438552856445},{\"\"x\"\":2.0999999046325684,\"\"y\"\":5.929472923278809},{\"\"x\"\":2.5999999046325684,\"\"y\"\":6.190037727355957},{\"\"x\"\":3.0999999046325684,\"\"y\"\":6.236179828643799},{\"\"x\"\":3.5999999046325684,\"\"y\"\":6.141019344329834},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.295210838317871},{\"\"x\"\":4.599999904632568,\"\"y\"\":5.265801906585693},{\"\"x\"\":5.099999904632568,\"\"y\"\":3.3722851276397705},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.8299226760864258},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.32690900564193726},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.6274543404579163},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.8441857099533081}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nRwanda,MPNSEPASLLELFNSIATQGELVRSLKAGNASK,CC(C)Cc1ccc(cc1)C(C)C(=O)N2CCCC2C(=O)OCCO,1480021,36.33137130737305,995037247,\"168-46 91ST AVE., 2ND FLR\",https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,9,9,2BDJ,9,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.8209972202654474, 1.3779216716448506, 5.299882228439686, 0.06040645519069608],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":3.7821109294891357},{\"\"x\"\":0.6000000238418579,\"\"y\"\":3.542433023452759},{\"\"x\"\":1.100000023841858,\"\"y\"\":3.7008674144744873},{\"\"x\"\":1.600000023841858,\"\"y\"\":3.717301607131958},{\"\"x\"\":2.0999999046325684,\"\"y\"\":4.024452209472656},{\"\"x\"\":2.5999999046325684,\"\"y\"\":4.013899326324463},{\"\"x\"\":3.0999999046325684,\"\"y\"\":3.945094347000122},{\"\"x\"\":3.5999999046325684,\"\"y\"\":3.866621971130371},{\"\"x\"\":4.099999904632568,\"\"y\"\":3.7461626529693604},{\"\"x\"\":4.599999904632568,\"\"y\"\":3.3454740047454834},{\"\"x\"\":5.099999904632568,\"\"y\"\":2.61944317817688},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.999405026435852},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.46259793639183044},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.054134611040353775},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.05711187422275543}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[5.6318079657726035, 1.8495493770000595, 5.391793312471116, 0.17060707587348442],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":5.458079814910889},{\"\"x\"\":0.6000000238418579,\"\"y\"\":5.554427146911621},{\"\"x\"\":1.100000023841858,\"\"y\"\":5.799983024597168},{\"\"x\"\":1.600000023841858,\"\"y\"\":5.364140033721924},{\"\"x\"\":2.0999999046325684,\"\"y\"\":5.864485740661621},{\"\"x\"\":2.5999999046325684,\"\"y\"\":5.4509806632995605},{\"\"x\"\":3.0999999046325684,\"\"y\"\":5.702574729919434},{\"\"x\"\":3.5999999046325684,\"\"y\"\":5.7314534187316895},{\"\"x\"\":4.099999904632568,\"\"y\"\":5.5123443603515625},{\"\"x\"\":4.599999904632568,\"\"y\"\":5.724395751953125},{\"\"x\"\":5.099999904632568,\"\"y\"\":4.354506969451904},{\"\"x\"\":5.599999904632568,\"\"y\"\":1.7307666540145874},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.6305936574935913},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.035183437168598175},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.7575169205665588}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\nSwitzerland,IRVVGRYLIEVWKAAGMDMDKVLFLWSSDEI,CN1CCC(CC1)Oc2ccc(cc2)C(F)(F)F,1480028,36.33137130737305,99504,92-11 179TH PLACE,https://datagrok.ai/img/slides/access-db-connect.png,id,ErrorMessage,\"COMPND \nATOM \nEND\",flag,9,10,1IAN,10,1.23,<chart></chart>,\"{\"\"series\"\":[{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitFunction\"\":\"\"sigmoid\"\",\"\"fitLineColor\"\":\"\"#1f77b4\"\",\"\"pointColor\"\":\"\"#1f77b4\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[1.1190255865097471, 2.3163895161544437, 5.4968866182279195, 0.2035204047289052],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":1.1057683229446411},{\"\"x\"\":0.6000000238418579,\"\"y\"\":1.1019697189331055},{\"\"x\"\":1.100000023841858,\"\"y\"\":1.0818607807159424},{\"\"x\"\":1.600000023841858,\"\"y\"\":1.062997817993164},{\"\"x\"\":2.0999999046325684,\"\"y\"\":1.046447515487671},{\"\"x\"\":2.5999999046325684,\"\"y\"\":1.1217249631881714},{\"\"x\"\":3.0999999046325684,\"\"y\"\":1.2166996002197266},{\"\"x\"\":3.5999999046325684,\"\"y\"\":1.215477705001831},{\"\"x\"\":4.099999904632568,\"\"y\"\":1.0581893920898438},{\"\"x\"\":4.599999904632568,\"\"y\"\":1.1747995615005493},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.0181127786636353},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.5344523191452026},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.2569526433944702},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.1912207305431366},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.15060538053512573}]},{\"\"name\"\":\"\"Run:2023-08-08\"\",\"\"fitLineColor\"\":\"\"#ffbb78\"\",\"\"pointColor\"\":\"\"#ffbb78\"\",\"\"showPoints\"\":\"\"points\"\",\"\"parameters\"\":[3.1038581025805785, 2.0032224204185245, 5.087602825989163, 0.13277988512492753],\"\"points\"\":[{\"\"x\"\":0.10000000149011612,\"\"y\"\":3.0498509407043457},{\"\"x\"\":0.6000000238418579,\"\"y\"\":2.805217742919922},{\"\"x\"\":1.100000023841858,\"\"y\"\":3.3415253162384033},{\"\"x\"\":1.600000023841858,\"\"y\"\":3.0549843311309814},{\"\"x\"\":2.0999999046325684,\"\"y\"\":3.250074863433838},{\"\"x\"\":2.5999999046325684,\"\"y\"\":3.0432586669921875},{\"\"x\"\":3.0999999046325684,\"\"y\"\":3.265852451324463},{\"\"x\"\":3.5999999046325684,\"\"y\"\":2.9475724697113037},{\"\"x\"\":4.099999904632568,\"\"y\"\":3.1929898262023926},{\"\"x\"\":4.599999904632568,\"\"y\"\":2.7460060119628906},{\"\"x\"\":5.099999904632568,\"\"y\"\":1.6175861358642578},{\"\"x\"\":5.599999904632568,\"\"y\"\":0.3006608486175537},{\"\"x\"\":6.099999904632568,\"\"y\"\":0.3444803059101105},{\"\"x\"\":6.599999904632568,\"\"y\"\":0.015537971630692482},{\"\"x\"\":7.099999904632568,\"\"y\"\":0.5527358055114746}]}],\"\"chartOptions\"\":{\"\"xAxisName\"\":\"\"Conc.\"\",\"\"yAxisName\"\":\"\"Activity\"\",\"\"title\"\":\"\"Dose-Response curves\"\"}}\",text,,\n,,,,,,,,,,,,,,,,,,,,,`);\ntestData.columns.add(DG.Column.fromList(DG.TYPE.BYTE_ARRAY, 'BinaryImage', Array.from(new Uint8Array(11))));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZyYW1lLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGF0YWZyYW1lLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUM1QixPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ3RDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxLQUFtQixFQUFFLEdBQWM7SUFDdkUsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztJQUM1QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDMUYsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0lBQzVCLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3ZDLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNwQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztZQUM1QyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsa0JBQWtCLElBQUksQ0FBQyxDQUFDO1NBQ3pCO0tBQ0Y7SUFDRCxPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQW1CLEVBQUUsS0FBZ0I7SUFDakUsS0FBSyxhQUFMLEtBQUssY0FBTCxLQUFLLElBQUwsS0FBSyxHQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUM7SUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQy9DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekMsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzthQUNyQztpQkFBTTtnQkFDTCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN4QztTQUNGO0tBQ0Y7SUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3NCQStCdkIsQ0FBQyxDQUFDO0FBQ3hCLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCAqIGFzIHNoYTI1NiBmcm9tICdmYXN0LXNoYTI1Nic7XG4vKipcbiAqIEZvciBjb2x1bW5zIG9mIHN0cmluZyB0eXBlLiBDaGVja3Mgd2hldGhlciBjb2x1bW4gY29udGFpbnMgZW1wdHkgdmFsdWVzIGFuZCByZW1vdmVzIGNvcnJlc3BvbmRpbmcgcm93cyBpbiBjYXNlIHVzZXIgc2VsZWN0cyB0byByZW1vdmUuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRW1wdHlTdHJpbmdSb3dzKHRhYmxlOiBERy5EYXRhRnJhbWUsIGNvbDogREcuQ29sdW1uKTogbnVtYmVyW10ge1xuICBjb25zdCBjYXRzID0gY29sLmNhdGVnb3JpZXM7XG4gIGNvbnN0IGVtcHR5UmF3SW5kID0gY2F0cy5tYXAoKHZhbCwgaW5kKSA9PiAhdmFsID8gaW5kIDogbnVsbCkuZmlsdGVyKChpdCkgPT4gaXQgIT09IG51bGwpO1xuICBjb25zdCByYXdEYXRhID0gWy4uLmNvbC5nZXRSYXdEYXRhKCldO1xuICBjb25zdCBlbXB0eVJhd3NJbmRleGVzID0gW107XG4gIGxldCByZW1vdmVkUm93c0NvdW50ZXIgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLnJvd0NvdW50OyBpKyspIHtcbiAgICBpZiAoZW1wdHlSYXdJbmQuaW5jbHVkZXMocmF3RGF0YVtpXSkpIHtcbiAgICAgIHRhYmxlLnJvd3MucmVtb3ZlQXQoaSAtIHJlbW92ZWRSb3dzQ291bnRlcik7XG4gICAgICBlbXB0eVJhd3NJbmRleGVzLnB1c2goaSk7XG4gICAgICByZW1vdmVkUm93c0NvdW50ZXIgKz0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVtcHR5UmF3c0luZGV4ZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNoRGF0YUZyYW1lKHRhYmxlOiBERy5EYXRhRnJhbWUsIG5hbWVzPzogc3RyaW5nW10pOiBVaW50OEFycmF5IHtcbiAgbmFtZXMgPz89IHRhYmxlLmNvbHVtbnMubmFtZXMoKTtcbiAgY29uc3QgaGFzaGVyID0gbmV3IHNoYTI1Ni5IYXNoKCk7XG4gIGNvbnN0IG9yZGVyID0gdGFibGUuZ2V0U29ydGVkT3JkZXIobmFtZXMpO1xuICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRhYmxlLmNvbHVtbnMuYnlOYW1lKG5hbWUpO1xuICAgIGNvbnN0IGRhdGFBcnJheSA9IGNvbHVtbi5nZXRSYXdEYXRhKCk7XG4gICAgY29uc3QgaXNTdHJpbmcgPSBjb2x1bW4udHlwZSA9PSBERy5UWVBFLlNUUklORztcbiAgICBjb25zdCBjYXRzID0gY29sdW1uLmNhdGVnb3JpZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpc1N0cmluZykge1xuICAgICAgICBjb25zdCBkYXRhID0gY2F0c1tkYXRhQXJyYXlbb3JkZXJbaV1dXTtcbiAgICAgICAgaGFzaGVyLnVwZGF0ZShlbmNvZGVyLmVuY29kZShkYXRhKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkYXRhID0gZGF0YUFycmF5W29yZGVyW2ldXTtcbiAgICAgICAgaGFzaGVyLnVwZGF0ZShVaW50OEFycmF5LmZyb20oW2RhdGFdKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBoYXNoZXIuZGlnZXN0KCk7XG59XG5cbmV4cG9ydCBjb25zdCB0ZXN0RGF0YSA9IERHLkRhdGFGcmFtZS5mcm9tQ3N2KGBjb3VudHJpZXMsZmFzdGEsc21pbGVzLG1vbHJlZ25vLExPTixaaXAgQ29kZSxTdHJlZXQgQWRkcmVzcyBMaW5lIDEsSW1hZ2VVcmwsdXNlcl9pZCxlcnJvcl9tZXNzYWdlLHhyYXksZmxhZyxtYWduaXR1ZGUsQ1MtaWQscGRiX2lkLGFjY2VsX2EsdGltZV9vZmZzZXQsY2hhcnQsZml0LFF1ZXN0aW9ucyxlbXB0eV9udW1iZXIsZW1wdHlfc3RyaW5nXG5CZWxnaXVtLE1TTkZITkVIVk1RRllSTk5MS1RLR1ZGR1JRLENDKEMoPU8pT0NDQ2MxY2NjbmMxKWMyY2NjYyhjMilDKD1PKWMzY2NjY2MzLDE0ODAwMTQsMzYuMjc2NzI5NTgzNzQwMjM0LDk5NTA0MjMwMCwxNDAxNiBST1VURSAzMVcsaHR0cHM6Ly9kYXRhZ3Jvay5haS9pbWcvc2xpZGVzL2FjY2Vzcy1kYi1jb25uZWN0LnBuZyxpZCxFcnJvck1lc3NhZ2UsXCJDT01QTkQgXG5BVE9NIFxuRU5EXCIsZmxhZywxLDEsMVFCUywxLDEuMjMsPGNoYXJ0PjwvY2hhcnQ+LFwie1wiXCJzZXJpZXNcIlwiOlt7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdEZ1bmN0aW9uXCJcIjpcIlwic2lnbW9pZFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbMi40OTczNjAzNDA2NDQ4NzIsIDEuNzA1ODY5NDk4NjY4Njg2NCwgNS4yNzgwNTI2NzgxOTUxMzUsIDAuMTYwMDAzMjA4ODkwMjgzODNdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjIuMzc0NDk5Nzk3ODIxMDQ1fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6Mi42MjQyNDczMTI1NDU3NzY0fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjoyLjM2NzI2NzYwODY0MjU3OH0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6Mi42NzIzMTQ4ODIyNzg0NDI0fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Mi42NTM3MzQ0NDU1NzE4OTk0fSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Mi4zNjUxNjcxNDA5NjA2OTM0fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Mi41NjU0Mjg0OTU0MDcxMDQ1fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Mi40MTYwOTU5NzIwNjExNTcyfSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjI4NjcyNjcxMzE4MDU0Mn0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi41MTAwMDQyODE5OTc2ODA3fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjY2NzY5ODUwMjU0MDU4ODR9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNjgwMTM2NTAxNzg5MDkzfSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjMzOTE1NDM5MjQ4MDg1MDJ9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMDkwMzg5ODMyODU0MjcwOTR9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTk4MDI3NzU5NzkwNDIwNTN9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzcuNTI1MjM1ODU1NTA4MTc5LCAxLjMxODY5MTE4NzY4MDk5ODQsIDUuMzM1NjcyNjA4NTY0Mjk0LCAwLjc4NjA3NDMzNDM5NTgwOThdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjcuOTg4MDcwNDg3OTc2MDc0fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6Ny4wMTg0NTMxMjExODUzMDN9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjguMTE1Mjc5MTk3NjkyODcxfSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo3LjQ4NjY1ODA5NjMxMzQ3N30se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjcuMzk2NDM4MTIxNzk1NjU0fSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Ny40NzcwNTIyMTE3NjE0NzV9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo2LjkxMzA5NTQ3NDI0MzE2NH0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjguMDEzODU0OTgwNDY4NzV9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjYuOTg1OTAwNDAyMDY5MDkyfSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo2Ljk3MDMzNTk2MDM4ODE4NH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NS40NDg4MTcyNTMxMTI3OTN9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuNTUzNDgxODE3MjQ1NDgzNH0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS44OTM5NDc5NTg5NDYyMjh9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNjM0MDA0MjM1MjY3NjM5Mn0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC44NDAzODc0MDM5NjQ5OTYzfV19XSxcIlwiY2hhcnRPcHRpb25zXCJcIjp7XCJcInhBeGlzTmFtZVwiXCI6XCJcIkNvbmMuXCJcIixcIlwieUF4aXNOYW1lXCJcIjpcIlwiQWN0aXZpdHlcIlwiLFwiXCJ0aXRsZVwiXCI6XCJcIkRvc2UtUmVzcG9uc2UgY3VydmVzXCJcIn19XCIsdGV4dCwxMDAsYWJjXG5CdXJ1bmRpLE1EWUtFVExMTVBLVERGUE1SR0dMUE5LRVBRSVFFS1csQ09jMWNjYzJjYyhjY2MyYzEpQyhDKUMoPU8pT2MzY2NjKEMpY2MzT0MsMTQ4MDAxNSwzNi4yNzY3Mjk1ODM3NDAyMzQsOTk1MDczNDQ0LDgwIFNUQVRFIEhJR0hXQVkgMzEwLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsMiwyLDFaUDgsMiwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzQuNDMxNDYwNzUzMTAzMzk4LCAyLjE2OTE0OTg3OTkyNDY3NDUsIDUuMjY2NDQ1NTk3MTAyNzc0LCAwLjc4MjU3NjI4MjcwMTc5MjZdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjQuNzUxMDgzODUwODYwNTk2fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6NC4yMDMwMDAwNjg2NjQ1NTF9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjQuNDE1ODU4NzQ1NTc0OTUxfSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo0LjY4NDE0MzA2NjQwNjI1fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC4xOTg0MDA5NzQyNzM2ODJ9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo0LjE3OTIyMjEwNjkzMzU5NH0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjQuNjM4NDczOTg3NTc5MzQ2fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC43MDg1NTMzMTQyMDg5ODR9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjQuMjkxNTg5MjYwMTAxMzE4fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo0LjAzODA4MjU5OTYzOTg5M30se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My40MzQ5OTM5ODIzMTUwNjM1fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjIxOTQ3MDg1ODU3MzkxMzZ9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMTkyMDgzMTIwMzQ2MDY5M30se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC41MzUyNjM1OTc5NjUyNDA1fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjMzNDY5MjAzMTE0NTA5NTh9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzIuMzM5NDU4MDE3OTcwMTI2LCAtMS4wNzM0MTg0MzEwMTcxMTc4LCA0Ljc0NjMzMjk1MDU1MDkzNCwgMC4yNDgyNDE2ODU3NTk1NjU4XSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjowLjIxMzkzMzc2NTg4ODIxNDF9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjowLjQyNjk1NjIwNjU2MDEzNDl9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjAuMjQ0MTU3MzI5MjAxNjk4M30se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6MC4xNDY2MzU5NjQ1MTI4MjV9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjA4ODE4NDYyNDkxMDM1NDYxfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC4yNTYwNjU2NjY2NzU1Njc2fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC40MjQzNDA0NTY3MjQxNjY4N30se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuMzcxMTEyMzE2ODQ2ODQ3NTN9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNTU4MTczNzE2MDY4MjY3OH0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4xODM1OTAwNTQ1MTIwMjR9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuNTYyOTg0MzQ3MzQzNDQ0OH0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi4zMjExMjg4NDUyMTQ4NDM4fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjIyOTk2MTYzMzY4MjI1MX0se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi4yNTYwMjI2OTE3MjY2ODQ2fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjIxNDIzOTgzNTczOTEzNTd9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcbkNhbWVyb29uLE1JRVZGTEZHSVZMR0xJUElUTEFHTEZWVEFZTFFZUlJHRFFMREwsQ09jMWNjYzJjYyhjY2MyYzEpQyhDKUMoPU8pT0NDQ2MzY2NjbmMzLDE0ODAwMTYsMzYuMjYwOTU5NjI1MjQ0MTQsOTk1MTUzNTk2LDMwLTU2IFdISVRFU1RPTkUgRVhQWSxodHRwczovL2RhdGFncm9rLmFpL2ltZy9zbGlkZXMvYWNjZXNzLWRiLWNvbm5lY3QucG5nLGlkLEVycm9yTWVzc2FnZSxcIkNPTVBORCBcbkFUT00gXG5FTkRcIixmbGFnLDMsMywyQkRKLDMsMS4yMyw8Y2hhcnQ+PC9jaGFydD4sXCJ7XCJcInNlcmllc1wiXCI6W3tcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0RnVuY3Rpb25cIlwiOlwiXCJzaWdtb2lkXCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOls0LjY3NjA2NTI1Nzg2NDIzMjUsIDAuOTA0Njk1NjMyMDc1NjcwMywgNS42NTE0MDg5NzE4NTY3MzgsIDAuMDc3Mzg4NDYwMTIxODQxODVdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjQuMzI0MjU1OTQzMjk4MzR9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjo0LjY2ODQ0MjI0OTI5ODA5Nn0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NC4zNzk3ODUwNjA4ODI1Njh9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjUuMDM0NTEzOTUwMzQ3OX0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjQuODc4NjUzNTI2MzA2MTUyfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC4zNDUxMzEzOTcyNDczMTQ1fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC4zMzY5OTIyNjM3OTM5NDV9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1LjAzNzQzMDI4NjQwNzQ3MX0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NS4wMDkyNjkyMzc1MTgzMTA1fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo0LjE1MTkwMjY3NTYyODY2Mn0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My40MDY2OTUxMjc0ODcxODI2fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjM3MzI3NTk5NTI1NDUxNjZ9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuNjczNzI4MTA4NDA2MDY3fSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjQ4NTc0NzkwMzU4NTQzMzk2fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjI3ODMwNTIzMjUyNDg3MTh9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzIuOTM4Mzk1ODYzMDEwMTExLCAtMS40NjU4NDgwNjYxMzkyMTE3LCA1LjQ2MjcwMjc1MTk5NjU4NCwgMC4zNDczMTM5MDIzNjE1MDM5XSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjowLjQ5NDE3MTA4Mjk3MzQ4MDJ9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjowLjE1MzIzOTc0MTkyMTQyNDg3fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjQ2MzczNDMyODc0Njc5NTY1fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjMzNzA0MzEzNjM1ODI2MTF9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjUxNzkwMzAyOTkxODY3MDd9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjI3ODk5NzY1OTY4MzIyNzU0fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC4yMjA3NTA2NDQ4MDMwNDcxOH0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuNTc4OTkxODg5OTUzNjEzM30se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4yMTE2OTkxMTMyNDk3Nzg3NX0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4yNzg1NzY0NjM0NjA5MjIyNH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4wOTA2MzMyNzMxMjQ2OTQ4fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjg1MjAzMDAzODgzMzYxODJ9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuNzE3NzA1OTY1MDQyMTE0M30se1wiXCJ4XCJcIjo2LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi44NjgwOTE4MjE2NzA1MzIyfSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjI0MTMwNzczNTQ0MzExNTJ9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcbkNhbmFkYSxNTUVMVkxLVElJR1BJVlZHVlZMUklWREtXTE5LREssQ0MoQyg9TylOQ0NTKWMxY2NjYyhjMSlDKD1PKWMyY2NjY2MyLDE0ODAwMTcsMzYuMjYwOTU5NjI1MjQ0MTQsOTk1MTUsMzAtNTYgV0hJVEVTVE9ORSBFWFBZLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsNCw0LDFJQU4sNCwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzAuODU5NzM5MDk3NTQzMDAwOCwgMS4wOTU3NjI1NzMyNDgxOTQ2LCA1LjI2MDUzNzA2Nzk4Nzk1OCwgMC4wNzk3NDE4Nzk5ODE3NzczNl0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6MC44MTkwMTUyNjQ1MTExMDg0fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6MC44NDIxNjg5ODY3OTczMzI4fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjg3NDA5MjIyMTI2MDA3MDh9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjAuODkyNDI3NTA0MDYyNjUyNn0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuODI0OTA2NzY2NDE0NjQyM30se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuOTMyNzY2OTE0MzY3Njc1OH0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuODUyMjk3NDI1MjcwMDgwNn0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuODE3NDQ5MjcxNjc4OTI0Nn0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC44Mzk0NjQ3MjQwNjM4NzMzfSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjcxMzkzODc3MjY3ODM3NTJ9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNTU2MTE2NzU5Nzc3MDY5MX0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4zMjc2MjI2ODE4NTYxNTU0fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjEyNDc5NDc0Mzk1NTEzNTM1fSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjEzMDA2Nzk3NDMyODk5NDc1fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjA1OTcwMjA3OTc0MzE0Njg5Nn1dfSx7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbNS43NjA5MzAyMTk1ODI1NDYsIDEuNjU5MTc5MzI5MzgzMzAxMywgNC42NjcxNTU5Mjk3MjA4NTEsIDAuNzg1ODEwOTU0NDEyMTY1Ml0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6Ni4xNTY5OTMzODkxMjk2Mzl9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjo1LjIzNjcwMTk2NTMzMjAzMX0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6Ni4wMTA1NjA1MTI1NDI3MjV9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjUuNDk1NTEyOTYyMzQxMzA5fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Ni4wODc3NzA0NjIwMzYxMzN9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1Ljc5OTg2NTcyMjY1NjI1fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS41OTc1NDY1Nzc0NTM2MTN9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1LjUyMDkwMjE1NjgyOTgzNH0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NS4zNjA2NTQzNTQwOTU0NTl9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjMuNTUzOTc0NjI4NDQ4NDg2M30se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS41NzcyMzYyOTQ3NDYzOTl9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMDAwMTI2NDgxMDU2MjEzNH0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC45MzA1Nzk3ODE1MzIyODc2fSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjYwMzM2Mzg3MTU3NDQwMTl9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNDIwMzY4NTUyMjA3OTQ2OH1dfV0sXCJcImNoYXJ0T3B0aW9uc1wiXCI6e1wiXCJ4QXhpc05hbWVcIlwiOlwiXCJDb25jLlwiXCIsXCJcInlBeGlzTmFtZVwiXCI6XCJcIkFjdGl2aXR5XCJcIixcIlwidGl0bGVcIlwiOlwiXCJEb3NlLVJlc3BvbnNlIGN1cnZlc1wiXCJ9fVwiLHRleHQsLFxuQ29sb21iaWEsTURSVERFVlNOSFRIREtQVExUV0ZFRUlGRUVZSFNQRkhOLEZDKEYpKEYpYzFjY2MoT0MyQ0NOQ0MyKWNjMSwxNDgwMDI5LDM2LjMzMDk0NDA2MTI3OTMsOTk1MTUyMDUwLDEgQ09VUlQgSE9VU0UgU1FVQVJFLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsNSw1LDRVSjEsNSwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzYuNDk5NTA4ODMxNDE1MzY1NSwgMi40MjcwMzUxMDA0NTM5OTE0LCA1LjE3ODY1OTUzNTM0ODU3OSwgMC42MjU2NTMzNDYyNDE1NzddLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjYuNDk2MjMxNTU1OTM4NzIxfSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6Ni40MjU0MzM2MzU3MTE2N30se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6Ny4wNDAwNjM4NTgwMzIyMjd9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjYuMTExNTQwMzE3NTM1NH0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjYuNjgwNzI4NDM1NTE2MzU3fSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Ni40MDY3NzQ1MjA4NzQwMjN9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo2LjYxMTI2OTQ3NDAyOTU0MX0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuODg5MDk0MzUyNzIyMTY4fSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo2Ljc1MzQ0NzA1NTgxNjY1fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo2LjM2MTQzNTg5MDE5Nzc1NH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6NC4xNjY2OTc1MDIxMzYyMzA1fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjE3MjExODkwMjIwNjQyMX0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC44MDEwNDg5OTQwNjQzMzF9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNDY0MDAyMTAyNjEzNDQ5MX0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4wMDEwMzU3NjY3OTI0ODM2Mjc4fV19LHtcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOlsxLjQ3MzQzODEzNDc0NDY0MDEsIDEuMTY0OTgwNTE4ODA3NDE5NiwgNC44Mjk1ODYwODg2NjQyMSwgMC4wOTUwMDU0NTQ5NjcxMDAwN10sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6MS41Mjc5MDk2MzY0OTc0OTc2fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6MS4zNTU5OTc0NDMxOTkxNTc3fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjoxLjUyNDYzNzgxODMzNjQ4Njh9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjEuNTU2NzY1Nzk0NzU0MDI4M30se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjEuNDExNDI0MDQwNzk0MzcyNn0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjEuNDA0NTAxMDgwNTEzMDAwNX0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjEuNDc2OTgyOTUxMTY0MjQ1Nn0se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjEuNDg3NTUwMDIwMjE3ODk1NX0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4yOTkxOTg3NDY2ODEyMTM0fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjkyMjk2MTQxMzg2MDMyMX0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC42NTIwMDQ0ODAzNjE5Mzg1fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjE1MzUwOTc4MDc2NDU3OTc3fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjEwNzg5MDMwNzkwMzI4OTh9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTcyNzY0NDk1MDE1MTQ0MzV9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTQwNjY2MDgyNTAxNDExNDR9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcbkNvc3RhIFJpY2EsTUtTVEtFRUlRVElLVExMS0RTUlRBS1lIS1JMUUlWTCxDQyhDKUNjMWNjYyhjYzEpQyhDKUMoPU8pTjJDQ0NDMkMoPU8pT0NDQ2MzY2NjY2MzLDE0ODAwMTgsMzYuMzMwOTQ0MDYxMjc5Myw5OTUwODQyMTgsNDA0MSBTT1VUSFdFU1RFUk4gQkxWRCxodHRwczovL2RhdGFncm9rLmFpL2ltZy9zbGlkZXMvYWNjZXNzLWRiLWNvbm5lY3QucG5nLGlkLEVycm9yTWVzc2FnZSxcIkNPTVBORCBcbkFUT00gXG5FTkRcIixmbGFnLDYsNiwyQlBXLDYsMS4yMyw8Y2hhcnQ+PC9jaGFydD4sXCJ7XCJcInNlcmllc1wiXCI6W3tcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0RnVuY3Rpb25cIlwiOlwiXCJzaWdtb2lkXCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOlsyLjQ4MzM2NDE4NDMzMTEyMjcsIC0xLjg5NDU5Nzg3NDIwOTAwNjIsIDQuNjcxMTI3NzA4MDkyNTY4LCAwLjI0MTU5ODYxMzExODE1MTUzXSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjowLjA5Njk1MjQxNjAwMjc1MDR9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjowLjAyODQ4MzA0MDYzMDgxNzQxM30se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6MC4yMjA4NzE3NjE0NDEyMzA3N30se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6MC4wMDY4OTE1NTQ2ODcxNzIxNzQ1fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC40MzA1ODc5NzcxNzA5NDQyfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC40NDc3NDExNTA4NTYwMTgwN30se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjAuNDUzNDYzMTk2NzU0NDU1NTd9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjIzNzA1OTMxMDA3ODYyMDl9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNDY1Nzk1Mzk3NzU4NDgzOX0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4xNTUyMDA3MTk4MzMzNzR9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuMjI5NDA3MDcyMDY3MjYwN30se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi40MzExNTMwNTkwMDU3MzczfSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjMzODQ2MTE2MDY1OTc5fSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjYwODIwMTAyNjkxNjUwNH0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi44MTM2MTQzNjg0Mzg3MjA3fV19LHtcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOls1LjIyNDU3MzUyMTY0MjAzMywgMS40NDU0MDMzOTI0MTk4NTI4LCA1LjYwMTQxOTc3NDYwNzY1MzUsIDAuMjgyMzIxNjA1NDE5NzU3N10sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6NC45NTAyNzQ5NDQzMDU0Mn0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjUuMTc1NDY3OTY3OTg3MDYwNX0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NS4yNzY3NTI5NDg3NjA5ODZ9LHtcIlwieFwiXCI6MS42MDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjUuNTg5Mjk0OTEwNDMwOTA4fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS42MTY5OTQ4NTc3ODgwODZ9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1LjEyMDgxMzg0NjU4ODEzNX0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuMzQwNzY2OTA2NzM4MjgxfSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NC44NzY0NzEwNDI2MzMwNTd9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjQuOTQ5OTkzNjEwMzgyMDh9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjUuMTYyNTY0NzU0NDg2MDg0fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo0LjM5OTU1NzU5MDQ4NDYxOX0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi43OTc3OTY5NjQ2NDUzODU3fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjAyMjk4NzI0NjUxMzM2Njd9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNDgyNzU2MDE4NjM4NjEwODR9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTA0MDg5MzE5NzA1OTYzMTN9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcbkN1YmEsTUhBSUxSWUZJUlJMRllISUZZS0lZU0xJU0tLSFFTTFBTRFZSUUYsQ09jMWNjYzJjKGMxKWMoQ0MoPU8pTjNDQ0NDM0MoPU8pT2M0Y2NjKEMpY2M0T0MpYyhDKW4yQyg9TyljNWNjYyhDbCljYzUsMTQ4MDAxOSwzNi4zMzExNTc2ODQzMjYxNyw5OTUwODE5MjgsMTIyNyBVUyBISUdIV0FZIDExLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsNyw3LDFRQlMsNywxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzMuMzIwODM4Njc5NzEzOTI1LCAtMS4yNDIxNjE5OTg3MzE2NzI4LCA0LjgzMTMyNTQyNTIyNTI1NiwgMC4zMjM2MDExMDk4NDAzMDcyXSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjowLjM3Mjc0NzAzMzgzNDQ1NzR9LHtcIlwieFwiXCI6MC42MDAwMDAwMjM4NDE4NTc5LFwiXCJ5XCJcIjowLjEyMzY1MDE0MTA2MDM1MjMzfSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjQ4NDIyNDY3NzA4NTg3NjQ2fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjowLjIyNjQ0NjUwOTM2MTI2NzF9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjowLjE2ODIxNzk0MjExODY0NDcxfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC4zODc5MDE0NTUxNjM5NTU3fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC41NDcwMjQ0ODg0NDkwOTY3fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MC4zNDE5MDUzNTU0NTM0OTEyfSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjc2NTUxMjA0OTE5ODE1MDZ9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMjM0NjUxNjg0NzYxMDQ3NH0se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi40NTMzMzY3MTU2OTgyNDJ9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuOTU2NTQ5MTY3NjMzMDU2Nn0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My4zMzUyOTk0OTE4ODIzMjR9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjMuMjQwMjkwODgwMjAzMjQ3fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjExMDcyMTgyNjU1MzM0NDd9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzMuNjQwMTg1MzUyMTUxMTA5NCwgMS4yNjIxMTU4ODg3NTAxMywgNS4zOTkwMjgwNzQ0MDI3NDQsIDAuNTA4OTU4MDgzMDA2ODA5MV0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6My44NTg1NTk4NDY4NzgwNTE4fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6My42MDc3MjA2MTM0Nzk2MTQzfSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjozLjg1NTI1MjI2NTkzMDE3Nn0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6My42MTkwMzkyOTcxMDM4ODJ9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjgzOTM4ODM3MDUxMzkxNn0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjMuMzM1MjgzMDQxMDAwMzY2fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6My41NzExNDE0ODEzOTk1MzZ9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjQxNTUwNDY5Mzk4NDk4NTR9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjMuNzMxNjY0NjU3NTkyNzczNH0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My4wNjgwMTU1NzU0MDg5MzU1fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjg5MTA2NjU1MTIwODQ5Nn0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS42MDIyNzUzNzE1NTE1MTM3fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjc2NTI1NzY1NjU3NDI0OTN9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNjg3NTMyNjAzNzQwNjkyMX0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC41ODI4ODcxNzI2OTg5NzQ2fV19XSxcIlwiY2hhcnRPcHRpb25zXCJcIjp7XCJcInhBeGlzTmFtZVwiXCI6XCJcIkNvbmMuXCJcIixcIlwieUF4aXNOYW1lXCJcIjpcIlwiQWN0aXZpdHlcIlwiLFwiXCJ0aXRsZVwiXCI6XCJcIkRvc2UtUmVzcG9uc2UgY3VydmVzXCJcIn19XCIsdGV4dCwsXG5JdGFseSxNU05GSE5FSFZNUUZZUk5OTEtUS0dWRkdSUSxDQyhDKUNjMWNjYyhjYzEpQyhDKUMoPU8pTjJDQ0NDMkMoPU8pT0NDT1tOK10oPU8pW08tXSwxNDgwMDIwLDM2LjMzMTE1NzY4NDMyNjE3LDk5NTAyLFwiMTY4LTQ2IDkxU1QgQVZFLiwgMk5EIEZMUlwiLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsOCw4LDFaUDgsOCwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzIuMjkzNTkyMTA1OTIzODA5LCAxLjM3ODE1ODY1NDkxNDE4MzUsIDUuMTAyNTg5ODAzODY3NjYwNSwgMC4wMzQ5Mzg1MTI0NTI5MTI5MV0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6Mi4xMjg3MjgzODk3Mzk5OTAyfSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6Mi4yNjc5NzIyMzA5MTEyNTV9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjIuMzk4NDQyNTA2NzkwMTYxfSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjoyLjUxMzA2MjIzODY5MzIzNzN9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoyLjMyNTUxMTY5Mzk1NDQ2Nzh9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoyLjEyNzM0MDc5MzYwOTYxOX0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjIuNDcyNTk3ODM3NDQ4MTJ9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjoyLjEzMTE4MTQ3ODUwMDM2Nn0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6Mi4wOTA0MjE0MzgyMTcxNjN9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuMDIyOTkxNjU3MjU3MDh9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMTEwNTA1OTM4NTI5OTY4M30se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC40NDk0NDg1ODU1MTAyNTM5fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjEzNzU2MzU4NjIzNTA0NjR9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMDM2MzUxMTIxOTYyMDcwNDY1fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjE2MTk3NzExMjI5MzI0MzR9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzUuOTUzMTI1NDk5NDM5ODc5LCAxLjI1Mjg2MjAyNTUzMDY1MjgsIDUuMTg3NjM3NDQwMTQ5ODAyLCAwLjMxMTAzNDg3NTMyNjA4ODZdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjUuNjU4NTI4MzI3OTQxODk0NX0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjUuOTExMTUyMzYyODIzNDg2fSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo1LjkyNDkyMDA4MjA5MjI4NX0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NS44NDY5NDM4NTUyODU2NDQ1fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS45Mjk0NzI5MjMyNzg4MDl9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo2LjE5MDAzNzcyNzM1NTk1N30se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjYuMjM2MTc5ODI4NjQzNzk5fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6Ni4xNDEwMTkzNDQzMjk4MzR9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjUuMjk1MjEwODM4MzE3ODcxfSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo1LjI2NTgwMTkwNjU4NTY5M30se1wiXCJ4XCJcIjo1LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My4zNzIyODUxMjc2Mzk3NzA1fSx7XCJcInhcIlwiOjUuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjgyOTkyMjY3NjA4NjQyNTh9LHtcIlwieFwiXCI6Ni4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMzI2OTA5MDA1NjQxOTM3MjZ9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNjI3NDU0MzQwNDU3OTE2M30se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC44NDQxODU3MDk5NTMzMDgxfV19XSxcIlwiY2hhcnRPcHRpb25zXCJcIjp7XCJcInhBeGlzTmFtZVwiXCI6XCJcIkNvbmMuXCJcIixcIlwieUF4aXNOYW1lXCJcIjpcIlwiQWN0aXZpdHlcIlwiLFwiXCJ0aXRsZVwiXCI6XCJcIkRvc2UtUmVzcG9uc2UgY3VydmVzXCJcIn19XCIsdGV4dCwsXG5Sd2FuZGEsTVBOU0VQQVNMTEVMRk5TSUFUUUdFTFZSU0xLQUdOQVNLLENDKEMpQ2MxY2NjKGNjMSlDKEMpQyg9TylOMkNDQ0MyQyg9TylPQ0NPLDE0ODAwMjEsMzYuMzMxMzcxMzA3MzczMDUsOTk1MDM3MjQ3LFwiMTY4LTQ2IDkxU1QgQVZFLiwgMk5EIEZMUlwiLGh0dHBzOi8vZGF0YWdyb2suYWkvaW1nL3NsaWRlcy9hY2Nlc3MtZGItY29ubmVjdC5wbmcsaWQsRXJyb3JNZXNzYWdlLFwiQ09NUE5EIFxuQVRPTSBcbkVORFwiLGZsYWcsOSw5LDJCREosOSwxLjIzLDxjaGFydD48L2NoYXJ0PixcIntcIlwic2VyaWVzXCJcIjpbe1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRGdW5jdGlvblwiXCI6XCJcInNpZ21vaWRcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiMxZjc3YjRcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzMuODIwOTk3MjIwMjY1NDQ3NCwgMS4zNzc5MjE2NzE2NDQ4NTA2LCA1LjI5OTg4MjIyODQzOTY4NiwgMC4wNjA0MDY0NTUxOTA2OTYwOF0sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6My43ODIxMTA5Mjk0ODkxMzU3fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6My41NDI0MzMwMjM0NTI3NTl9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjMuNzAwODY3NDE0NDc0NDg3M30se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6My43MTczMDE2MDcxMzE5NTh9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo0LjAyNDQ1MjIwOTQ3MjY1Nn0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjQuMDEzODk5MzI2MzI0NDYzfSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6My45NDUwOTQzNDcwMDAxMjJ9LHtcIlwieFwiXCI6My41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjg2NjYyMTk3MTEzMDM3MX0se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My43NDYxNjI2NTI5NjkzNjA0fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjozLjM0NTQ3NDAwNDc0NTQ4MzR9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjIuNjE5NDQzMTc4MTc2ODh9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuOTk5NDA1MDI2NDM1ODUyfSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjQ2MjU5NzkzNjM5MTgzMDQ0fSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjA1NDEzNDYxMTA0MDM1Mzc3NX0se1wiXCJ4XCJcIjo3LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4wNTcxMTE4NzQyMjI3NTU0M31dfSx7XCJcIm5hbWVcIlwiOlwiXCJSdW46MjAyMy0wOC0wOFwiXCIsXCJcImZpdExpbmVDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJwb2ludENvbG9yXCJcIjpcIlwiI2ZmYmI3OFwiXCIsXCJcInNob3dQb2ludHNcIlwiOlwiXCJwb2ludHNcIlwiLFwiXCJwYXJhbWV0ZXJzXCJcIjpbNS42MzE4MDc5NjU3NzI2MDM1LCAxLjg0OTU0OTM3NzAwMDA1OTUsIDUuMzkxNzkzMzEyNDcxMTE2LCAwLjE3MDYwNzA3NTg3MzQ4NDQyXSxcIlwicG9pbnRzXCJcIjpbe1wiXCJ4XCJcIjowLjEwMDAwMDAwMTQ5MDExNjEyLFwiXCJ5XCJcIjo1LjQ1ODA3OTgxNDkxMDg4OX0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjUuNTU0NDI3MTQ2OTExNjIxfSx7XCJcInhcIlwiOjEuMTAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjo1Ljc5OTk4MzAyNDU5NzE2OH0se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6NS4zNjQxNDAwMzM3MjE5MjR9LHtcIlwieFwiXCI6Mi4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjo1Ljg2NDQ4NTc0MDY2MTYyMX0se1wiXCJ4XCJcIjoyLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuNDUwOTgwNjYzMjk5NTYwNX0se1wiXCJ4XCJcIjozLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjUuNzAyNTc0NzI5OTE5NDM0fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6NS43MzE0NTM0MTg3MzE2ODk1fSx7XCJcInhcIlwiOjQuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo1LjUxMjM0NDM2MDM1MTU2MjV9LHtcIlwieFwiXCI6NC41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjUuNzI0Mzk1NzUxOTUzMTI1fSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjo0LjM1NDUwNjk2OTQ1MTkwNH0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS43MzA3NjY2NTQwMTQ1ODc0fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjYzMDU5MzY1NzQ5MzU5MTN9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMDM1MTgzNDM3MTY4NTk4MTc1fSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjc1NzUxNjkyMDU2NjU1ODh9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcblN3aXR6ZXJsYW5kLElSVlZHUllMSUVWV0tBQUdNRE1ES1ZMRkxXU1NERUksQ04xQ0NDKENDMSlPYzJjY2MoY2MyKUMoRikoRilGLDE0ODAwMjgsMzYuMzMxMzcxMzA3MzczMDUsOTk1MDQsOTItMTEgMTc5VEggUExBQ0UsaHR0cHM6Ly9kYXRhZ3Jvay5haS9pbWcvc2xpZGVzL2FjY2Vzcy1kYi1jb25uZWN0LnBuZyxpZCxFcnJvck1lc3NhZ2UsXCJDT01QTkQgXG5BVE9NIFxuRU5EXCIsZmxhZyw5LDEwLDFJQU4sMTAsMS4yMyw8Y2hhcnQ+PC9jaGFydD4sXCJ7XCJcInNlcmllc1wiXCI6W3tcIlwibmFtZVwiXCI6XCJcIlJ1bjoyMDIzLTA4LTA4XCJcIixcIlwiZml0RnVuY3Rpb25cIlwiOlwiXCJzaWdtb2lkXCJcIixcIlwiZml0TGluZUNvbG9yXCJcIjpcIlwiIzFmNzdiNFwiXCIsXCJcInBvaW50Q29sb3JcIlwiOlwiXCIjMWY3N2I0XCJcIixcIlwic2hvd1BvaW50c1wiXCI6XCJcInBvaW50c1wiXCIsXCJcInBhcmFtZXRlcnNcIlwiOlsxLjExOTAyNTU4NjUwOTc0NzEsIDIuMzE2Mzg5NTE2MTU0NDQzNywgNS40OTY4ODY2MTgyMjc5MTk1LCAwLjIwMzUyMDQwNDcyODkwNTJdLFwiXCJwb2ludHNcIlwiOlt7XCJcInhcIlwiOjAuMTAwMDAwMDAxNDkwMTE2MTIsXCJcInlcIlwiOjEuMTA1NzY4MzIyOTQ0NjQxMX0se1wiXCJ4XCJcIjowLjYwMDAwMDAyMzg0MTg1NzksXCJcInlcIlwiOjEuMTAxOTY5NzE4OTMzMTA1NX0se1wiXCJ4XCJcIjoxLjEwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6MS4wODE4NjA3ODA3MTU5NDI0fSx7XCJcInhcIlwiOjEuNjAwMDAwMDIzODQxODU4LFwiXCJ5XCJcIjoxLjA2Mjk5NzgxNzk5MzE2NH0se1wiXCJ4XCJcIjoyLjA5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjEuMDQ2NDQ3NTE1NDg3NjcxfSx7XCJcInhcIlwiOjIuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS4xMjE3MjQ5NjMxODgxNzE0fSx7XCJcInhcIlwiOjMuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS4yMTY2OTk2MDAyMTk3MjY2fSx7XCJcInhcIlwiOjMuNTk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6MS4yMTU0Nzc3MDUwMDE4MzF9LHtcIlwieFwiXCI6NC4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuMDU4MTg5MzkyMDg5ODQzOH0se1wiXCJ4XCJcIjo0LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MS4xNzQ3OTk1NjE1MDA1NDkzfSx7XCJcInhcIlwiOjUuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoxLjAxODExMjc3ODY2MzYzNTN9LHtcIlwieFwiXCI6NS41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuNTM0NDUyMzE5MTQ1MjAyNn0se1wiXCJ4XCJcIjo2LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4yNTY5NTI2NDMzOTQ0NzAyfSx7XCJcInhcIlwiOjYuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjE5MTIyMDczMDU0MzEzNjZ9LHtcIlwieFwiXCI6Ny4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMTUwNjA1MzgwNTM1MTI1NzN9XX0se1wiXCJuYW1lXCJcIjpcIlwiUnVuOjIwMjMtMDgtMDhcIlwiLFwiXCJmaXRMaW5lQ29sb3JcIlwiOlwiXCIjZmZiYjc4XCJcIixcIlwicG9pbnRDb2xvclwiXCI6XCJcIiNmZmJiNzhcIlwiLFwiXCJzaG93UG9pbnRzXCJcIjpcIlwicG9pbnRzXCJcIixcIlwicGFyYW1ldGVyc1wiXCI6WzMuMTAzODU4MTAyNTgwNTc4NSwgMi4wMDMyMjI0MjA0MTg1MjQ1LCA1LjA4NzYwMjgyNTk4OTE2MywgMC4xMzI3Nzk4ODUxMjQ5Mjc1M10sXCJcInBvaW50c1wiXCI6W3tcIlwieFwiXCI6MC4xMDAwMDAwMDE0OTAxMTYxMixcIlwieVwiXCI6My4wNDk4NTA5NDA3MDQzNDU3fSx7XCJcInhcIlwiOjAuNjAwMDAwMDIzODQxODU3OSxcIlwieVwiXCI6Mi44MDUyMTc3NDI5MTk5MjJ9LHtcIlwieFwiXCI6MS4xMDAwMDAwMjM4NDE4NTgsXCJcInlcIlwiOjMuMzQxNTI1MzE2MjM4NDAzM30se1wiXCJ4XCJcIjoxLjYwMDAwMDAyMzg0MTg1OCxcIlwieVwiXCI6My4wNTQ5ODQzMzExMzA5ODE0fSx7XCJcInhcIlwiOjIuMDk5OTk5OTA0NjMyNTY4NCxcIlwieVwiXCI6My4yNTAwNzQ4NjM0MzM4Mzh9LHtcIlwieFwiXCI6Mi41OTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjA0MzI1ODY2Njk5MjE4NzV9LHtcIlwieFwiXCI6My4wOTk5OTk5MDQ2MzI1Njg0LFwiXCJ5XCJcIjozLjI2NTg1MjQ1MTMyNDQ2M30se1wiXCJ4XCJcIjozLjU5OTk5OTkwNDYzMjU2ODQsXCJcInlcIlwiOjIuOTQ3NTcyNDY5NzExMzAzN30se1wiXCJ4XCJcIjo0LjA5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6My4xOTI5ODk4MjYyMDIzOTI2fSx7XCJcInhcIlwiOjQuNTk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjoyLjc0NjAwNjAxMTk2Mjg5MDZ9LHtcIlwieFwiXCI6NS4wOTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjEuNjE3NTg2MTM1ODY0MjU3OH0se1wiXCJ4XCJcIjo1LjU5OTk5OTkwNDYzMjU2OCxcIlwieVwiXCI6MC4zMDA2NjA4NDg2MTc1NTM3fSx7XCJcInhcIlwiOjYuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjM0NDQ4MDMwNTkxMDExMDV9LHtcIlwieFwiXCI6Ni41OTk5OTk5MDQ2MzI1NjgsXCJcInlcIlwiOjAuMDE1NTM3OTcxNjMwNjkyNDgyfSx7XCJcInhcIlwiOjcuMDk5OTk5OTA0NjMyNTY4LFwiXCJ5XCJcIjowLjU1MjczNTgwNTUxMTQ3NDZ9XX1dLFwiXCJjaGFydE9wdGlvbnNcIlwiOntcIlwieEF4aXNOYW1lXCJcIjpcIlwiQ29uYy5cIlwiLFwiXCJ5QXhpc05hbWVcIlwiOlwiXCJBY3Rpdml0eVwiXCIsXCJcInRpdGxlXCJcIjpcIlwiRG9zZS1SZXNwb25zZSBjdXJ2ZXNcIlwifX1cIix0ZXh0LCxcbiwsLCwsLCwsLCwsLCwsLCwsLCwsLGApO1xudGVzdERhdGEuY29sdW1ucy5hZGQoREcuQ29sdW1uLmZyb21MaXN0KERHLlRZUEUuQllURV9BUlJBWSwgJ0JpbmFyeUltYWdlJywgQXJyYXkuZnJvbShuZXcgVWludDhBcnJheSgxMSkpKSk7XG4iXX0=","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport * as grok from 'datagrok-api/grok';\nimport * as DG from 'datagrok-api/dg';\nimport { testData } from './dataframe-utils';\nconst STANDART_TIMEOUT = 30000;\nconst BENCHMARK_TIMEOUT = 10800000;\nconst stdLog = console.log.bind(console);\nconst stdInfo = console.info.bind(console);\nconst stdWarn = console.warn.bind(console);\nconst stdError = console.error.bind(console);\nexport const tests = {};\nconst autoTestsCatName = 'Auto Tests';\nconst demoCatName = 'Demo';\nconst detectorsCatName = 'Detectors';\nconst coreCatName = 'Core';\nconst wasRegistered = {};\nexport let currentCategory;\nexport var assure;\n(function (assure) {\n function notNull(value, name) {\n if (value == null)\n throw new Error(`${name == null ? 'Value' : name} not defined`);\n }\n assure.notNull = notNull;\n})(assure || (assure = {}));\nexport class TestContext {\n constructor(catchUnhandled, report) {\n this.catchUnhandled = true;\n this.report = false;\n if (catchUnhandled !== undefined)\n this.catchUnhandled = catchUnhandled;\n if (report !== undefined)\n this.report = report;\n }\n ;\n}\nexport class Test {\n constructor(category, name, test, options) {\n var _a;\n this.category = category;\n this.name = name;\n options !== null && options !== void 0 ? options : (options = {});\n (_a = options.timeout) !== null && _a !== void 0 ? _a : (options.timeout = STANDART_TIMEOUT);\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, reason = `timeout`) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n const sub = event.subscribe((args) => {\n try {\n handler(args);\n resolve('OK');\n }\n catch (e) {\n reject(e);\n }\n // Do not clearTimeout or event sub if handler fails\n sub.unsubscribe();\n clearTimeout(timeout);\n });\n const timeout = setTimeout(() => {\n sub.unsubscribe();\n // eslint-disable-next-line prefer-promise-reject-errors\n reject(reason);\n }, ms);\n trigger();\n });\n });\n}\nexport function test(name, test, options) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n if (tests[currentCategory].tests == undefined)\n tests[currentCategory].tests = [];\n tests[currentCategory].tests.push(new Test(currentCategory, name, test, options));\n}\n/* Tests two objects for equality, throws an exception if they are not equal. */\nexport function expect(actual, expected = true, error) {\n if (error)\n error = `${error}, `;\n else\n error = '';\n if (actual !== expected)\n throw new Error(`${error}Expected \"${expected}\", got \"${actual}\"`);\n}\nexport function expectFloat(actual, expected, tolerance = 0.001, error) {\n if ((actual === Number.POSITIVE_INFINITY && expected === Number.POSITIVE_INFINITY) ||\n (actual === Number.NEGATIVE_INFINITY && expected === Number.NEGATIVE_INFINITY) ||\n (actual === Number.NaN && expected === Number.NaN) || (isNaN(actual) && isNaN(expected)))\n return;\n const areEqual = Math.abs(actual - expected) < tolerance;\n expect(areEqual, true, `${error !== null && error !== void 0 ? error : ''} (tolerance = ${tolerance})`);\n if (!areEqual)\n throw new Error(`Expected ${expected}, got ${actual} (tolerance = ${tolerance})`);\n}\nexport function expectTable(actual, expected, error) {\n const expectedRowCount = expected.rowCount;\n const actualRowCount = actual.rowCount;\n expect(actualRowCount, expectedRowCount, `${error !== null && error !== void 0 ? error : ''}, row count`);\n for (const column of expected.columns) {\n const actualColumn = actual.columns.byName(column.name);\n if (actualColumn == null)\n throw new Error(`Column ${column.name} not found`);\n if (actualColumn.type != column.type)\n throw new Error(`Column ${column.name} type expected ${column.type} got ${actualColumn.type}`);\n for (let i = 0; i < expectedRowCount; i++) {\n const value = column.get(i);\n const actualValue = actualColumn.get(i);\n if (column.type == DG.TYPE.FLOAT)\n expectFloat(actualValue, value, 0.0001, error);\n else if (column.type == DG.TYPE.DATE_TIME)\n expect(actualValue.isSame(value), true, error);\n else\n expect(actualValue, value, error);\n }\n }\n}\nexport function expectObject(actual, expected) {\n for (const [expectedKey, expectedValue] of Object.entries(expected)) {\n if (!actual.hasOwnProperty(expectedKey))\n throw new Error(`Expected property \"${expectedKey}\" not found`);\n const actualValue = actual[expectedKey];\n if (actualValue instanceof Array && expectedValue instanceof Array)\n expectArray(actualValue, expectedValue);\n else if (actualValue instanceof Object && expectedValue instanceof Object)\n expectObject(actualValue, expectedValue);\n else if (Number.isFinite(actualValue) && Number.isFinite(expectedValue))\n expectFloat(actualValue, expectedValue);\n else if (actualValue != expectedValue)\n throw new Error(`Expected (${expectedValue}) for key '${expectedKey}', got (${actualValue})`);\n }\n}\nexport function expectArray(actual, expected) {\n const actualLength = actual.length;\n const expectedLength = expected.length;\n if (actualLength != expectedLength) {\n throw new Error(`Arrays are of different length: actual array length is ${actualLength} ` +\n `and expected array length is ${expectedLength}`);\n }\n for (let i = 0; i < actualLength; i++) {\n if (actual[i] instanceof Array && expected[i] instanceof Array)\n expectArray(actual[i], expected[i]);\n else if (actual[i] instanceof Object && expected[i] instanceof Object)\n expectObject(actual[i], expected[i]);\n else if (actual[i] != expected[i])\n throw new Error(`Expected ${expected[i]} at position ${i}, got ${actual[i]}`);\n }\n}\n/* Defines a test suite. */\nexport function category(category, tests_, options) {\n var _a;\n currentCategory = category;\n tests_();\n if (tests[currentCategory]) {\n tests[currentCategory].clear = (_a = options === null || options === void 0 ? void 0 : options.clear) !== null && _a !== void 0 ? _a : true;\n tests[currentCategory].timeout = options === null || options === void 0 ? void 0 : options.timeout;\n }\n}\n/* Defines a function to be executed before the tests in this category are executed. */\nexport function before(before) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].before = before;\n}\n/* Defines a function to be executed after the tests in this category are executed. */\nexport function after(after) {\n if (tests[currentCategory] == undefined)\n tests[currentCategory] = {};\n tests[currentCategory].after = after;\n}\nfunction addNamespace(s, f) {\n return s.replace(new RegExp(f.name, 'gi'), f.nqName);\n}\nexport function initAutoTests(package_, module) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const packageId = package_.id;\n if (wasRegistered[packageId])\n return;\n const moduleTests = module ? module.tests : tests;\n if (moduleTests[autoTestsCatName] !== undefined ||\n moduleTests[demoCatName] !== undefined ||\n Object.keys(moduleTests).find((c) => c.startsWith(autoTestsCatName) || c.startsWith(coreCatName))) {\n wasRegistered[packageId] = true;\n return;\n }\n if (package_.name === 'DevTools' || (!!module && module._package.name === 'DevTools')) {\n const testFunctions = DG.Func.find({ tags: ['dartTest'] });\n for (const f of testFunctions) {\n const arr = f.name.split(/\\s*\\|\\s*/g);\n const name = (_a = arr.pop()) !== null && _a !== void 0 ? _a : f.name;\n const cat = arr.length ? coreCatName + ': ' + arr.join(': ') : coreCatName;\n if (moduleTests[cat] === undefined)\n moduleTests[cat] = { tests: [], clear: true };\n moduleTests[cat].tests.push(new Test(cat, name, () => __awaiter(this, void 0, void 0, function* () { return yield f.apply(); }), { isAggregated: f.outputs.length > 0, timeout: 300000 }));\n }\n }\n const moduleAutoTests = [];\n const moduleDemo = [];\n const moduleDetectors = [];\n const packFunctions = yield grok.dapi.functions.filter(`package.id = \"${packageId}\"`).list();\n const reg = new RegExp(/skip:\\s*([^,\\s]+)|wait:\\s*(\\d+)|cat:\\s*([^,\\s]+)|timeout:\\s*(\\d+)/g);\n for (const f of packFunctions) {\n const tests = f.options['test'];\n const demo = f.options['demoPath'];\n if ((tests && Array.isArray(tests) && tests.length)) {\n for (let i = 0; i < tests.length; i++) {\n const res = tests[i].matchAll(reg);\n const map = {};\n Array.from(res).forEach((arr) => {\n if (arr[0].startsWith('skip'))\n map['skip'] = arr[1];\n else if (arr[0].startsWith('wait'))\n map['wait'] = parseInt(arr[2]);\n else if (arr[0].startsWith('cat'))\n map['cat'] = arr[3];\n else if (arr[0].startsWith('timeout'))\n map['timeout'] = parseInt(arr[4]);\n });\n const test = new Test(autoTestsCatName, tests.length === 1 ? f.name : `${f.name} ${i + 1}`, () => __awaiter(this, void 0, void 0, function* () {\n const res = yield grok.functions.eval(addNamespace(tests[i], f));\n if (map.wait)\n yield delay(map.wait);\n // eslint-disable-next-line no-throw-literal\n if (typeof res === 'boolean' && !res)\n throw `Failed: ${tests[i]}, expected true, got ${res}`;\n }), { skipReason: map.skip, timeout: map.timeout });\n if (map.cat) {\n const cat = autoTestsCatName + ': ' + map.cat;\n test.category = cat;\n if (moduleTests[cat] === undefined)\n moduleTests[cat] = { tests: [], clear: true };\n moduleTests[cat].tests.push(test);\n }\n else\n moduleAutoTests.push(test);\n }\n }\n if (demo) {\n const wait = f.options['demoWait'] ? parseInt(f.options['demoWait']) : undefined;\n const test = new Test(demoCatName, f.friendlyName, () => __awaiter(this, void 0, void 0, function* () {\n grok.shell.lastError = '';\n yield f.apply();\n yield delay(wait ? wait : 2000);\n if (grok.shell.lastError)\n throw new Error(grok.shell.lastError);\n }), { skipReason: f.options['demoSkip'] });\n moduleDemo.push(test);\n }\n if (f.hasTag('semTypeDetector')) {\n const test = new Test(detectorsCatName, f.friendlyName, () => __awaiter(this, void 0, void 0, function* () {\n const arr = [];\n for (const col of testData.clone().columns) {\n const res = yield f.apply([col]);\n arr.push(res || col.semType);\n }\n expect(arr.filter((i) => i).length, 1);\n }), { skipReason: f.options['skipTest'] });\n moduleDetectors.push(test);\n }\n }\n wasRegistered[packageId] = true;\n if (moduleAutoTests.length)\n moduleTests[autoTestsCatName] = { tests: moduleAutoTests, clear: true };\n if (moduleDemo.length)\n moduleTests[demoCatName] = { tests: moduleDemo, clear: true };\n if (moduleDetectors.length)\n moduleTests[detectorsCatName] = { tests: moduleDetectors, clear: false };\n });\n}\nfunction redefineConsole() {\n const logs = [];\n console.log = (...args) => {\n logs.push(...args);\n stdLog(...args);\n };\n console.info = (...args) => {\n logs.push(...args);\n stdInfo(...args);\n };\n console.warn = (...args) => {\n logs.push(...args);\n stdWarn(...args);\n };\n console.error = (...args) => {\n logs.push(...args);\n stdError(...args);\n };\n return logs;\n}\nfunction resetConsole() {\n console.log = stdLog;\n console.info = stdInfo;\n console.warn = stdWarn;\n console.error = stdError;\n}\nexport function runTests(options) {\n var _a, _b, _c, _d, _e, _f;\n var _g;\n return __awaiter(this, void 0, void 0, function* () {\n const package_ = (_b = (_a = grok.functions.getCurrentCall()) === null || _a === void 0 ? void 0 : _a.func) === null || _b === void 0 ? void 0 : _b.package;\n yield initAutoTests(package_);\n const results = [];\n console.log(`Running tests`);\n options !== null && options !== void 0 ? options : (options = {});\n (_c = (_g = options).testContext) !== null && _c !== void 0 ? _c : (_g.testContext = new TestContext());\n grok.shell.lastError = '';\n const categories = [];\n const logs = redefineConsole();\n try {\n for (const [key, value] of Object.entries(tests)) {\n if ((!!(options === null || options === void 0 ? void 0 : options.category) && !key.toLowerCase().startsWith(options === null || options === void 0 ? void 0 : options.category.toLowerCase())) ||\n ((_d = options.exclude) === null || _d === void 0 ? void 0 : _d.some((c) => key.startsWith(c))))\n continue;\n stdLog(`Started ${key} category`);\n categories.push(key);\n const skipped = (_e = value.tests) === null || _e === void 0 ? void 0 : _e.every((t) => { var _a; return (_a = t.options) === null || _a === void 0 ? void 0 : _a.skipReason; });\n try {\n if (value.before && !skipped)\n yield value.before();\n }\n catch (x) {\n value.beforeStatus = getResult(x);\n }\n const t = (_f = value.tests) !== null && _f !== void 0 ? _f : [];\n const res = [];\n if (value.clear) {\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, logs, value.timeout, package_.name, options.verbose));\n grok.shell.closeAll();\n DG.Balloon.closeAll();\n }\n }\n else {\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, logs, value.timeout, package_.name, options.verbose));\n }\n const data = res.filter((d) => d.result != 'skipped');\n try {\n if (value.after && !skipped)\n yield value.after();\n }\n catch (x) {\n value.afterStatus = getResult(x);\n }\n // Clear after category\n // grok.shell.closeAll();\n // DG.Balloon.closeAll();\n if (value.afterStatus)\n data.push({ category: key, name: 'after', result: value.afterStatus, success: false, ms: 0, skipped: false });\n if (value.beforeStatus)\n data.push({ category: key, name: 'before', result: value.beforeStatus, success: false, ms: 0, skipped: false });\n results.push(...data);\n }\n }\n finally {\n resetConsole();\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.test && results.length) {\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 packageName = package_.name;\n for (const cat of categories) {\n const res = results.filter((r) => r.category === cat);\n const failed_ = res.filter((r) => !r.success).length;\n const params = { success: failed_ === 0,\n passed: res.filter((r) => r.success).length,\n skipped: res.filter((r) => r.skipped).length,\n failed: failed_,\n type: 'package', packageName, category: cat };\n grok.log.usage(`${packageName}: ${cat}`, params, `category-package ${packageName}: ${cat}`);\n }\n if (!options.category) {\n const params = { success: failed.length === 0, passed: successful, skipped, failed: failed.length,\n type: 'package', packageName };\n grok.log.usage(packageName, params, `package-package ${packageName}`);\n }\n if (options.testContext.report) {\n const logger = new DG.Logger();\n const description = 'Package @package tested: @successful successful, @skipped skipped, @failed failed tests';\n const params = {\n successful: successful,\n skipped: skipped,\n failed: failed.length,\n package: package_\n };\n for (const r of failed)\n Object.assign(params, { [`${r.category} | ${r.name}`]: r.result });\n logger.log(description, params, 'package-tested');\n }\n }\n return results;\n });\n}\nfunction getResult(x) {\n return `${x.toString()}\\n${x.stack ? DG.Logger.translateStackTrace(x.stack) : ''}`;\n}\nfunction execTest(t, predicate, logs, categoryTimeout, packageName, verbose) {\n var _a, _b, _c, _d, _e, _f;\n return __awaiter(this, void 0, void 0, function* () {\n logs.length = 0;\n let r;\n let type = 'package';\n const filter = predicate != undefined && (t.name.toLowerCase() !== 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 stdLog(`Started ${t.category} ${t.name}`);\n const start = Date.now();\n try {\n if (skip)\n r = { success: true, result: skipReason, ms: 0, skipped: true };\n else {\n let timeout_ = ((_c = t.options) === null || _c === void 0 ? void 0 : _c.timeout) === STANDART_TIMEOUT &&\n categoryTimeout ? categoryTimeout : (_d = t.options) === null || _d === void 0 ? void 0 : _d.timeout;\n timeout_ = DG.Test.isInBenchmark && timeout_ === STANDART_TIMEOUT ? BENCHMARK_TIMEOUT : timeout_;\n r = { success: true, result: (_e = yield timeout(t.test, timeout_)) !== null && _e !== void 0 ? _e : 'OK', ms: 0, skipped: false };\n }\n }\n catch (x) {\n r = { success: false, result: getResult(x), ms: 0, skipped: false };\n }\n if (((_f = t.options) === null || _f === void 0 ? void 0 : _f.isAggregated) && r.result.constructor === DG.DataFrame) {\n const col = r.result.col('success');\n type = 'core';\n if (col)\n r.success = col.stats.sum === col.length;\n if (!verbose) {\n const df = r.result;\n df.columns.remove('stack');\n df.rows.removeWhere((r) => r.get('success'));\n r.result = df;\n }\n r.result = r.result.toCsv();\n }\n r.logs = logs.join('\\n');\n r.ms = Date.now() - start;\n if (!skip)\n stdLog(`Finished ${t.category} ${t.name} for ${r.ms} ms`);\n r.category = t.category;\n r.name = t.name;\n if (!filter) {\n let params = { 'success': r.success, 'result': r.result, 'ms': r.ms, 'skipped': r.skipped,\n 'type': type, packageName, 'category': t.category, 'test': t.name, 'logs': r.logs };\n if (r.result.constructor == Object) {\n const res = Object.keys(r.result).reduce((acc, k) => (Object.assign(Object.assign({}, acc), { ['result.' + k]: r.result[k] })), {});\n params = Object.assign(Object.assign({}, params), res);\n }\n grok.log.usage(`${packageName}: ${t.category}: ${t.name}`, params, `test-${type} ${packageName}: ${t.category}: ${t.name}`);\n }\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, interval = 50) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n clearInterval(intervalId);\n reject(new Error(error));\n }, wait);\n // @ts-ignore\n const intervalId = setInterval(() => {\n if (checkHandler()) {\n clearInterval(intervalId);\n resolve();\n }\n }, interval);\n });\n });\n}\n// Returns test execution result or an error in case of timeout\nfunction timeout(func, testTimeout) {\n return __awaiter(this, void 0, void 0, function* () {\n let timeout = null;\n const timeoutPromise = new Promise((_, reject) => {\n timeout = setTimeout(() => {\n // eslint-disable-next-line prefer-promise-reject-errors\n reject('EXECUTION TIMEOUT');\n }, testTimeout);\n });\n try {\n return yield Promise.race([func(), timeoutPromise]);\n }\n finally {\n if (timeout)\n clearTimeout(timeout);\n }\n });\n}\nexport function isDialogPresent(dialogTitle) {\n const dialogs = DG.Dialog.getOpenDialogs();\n for (let i = 0; i < dialogs.length; i++) {\n if (dialogs[i].title == dialogTitle)\n return true;\n }\n return false;\n}\n/** Expects an asynchronous {@link action} to throw an exception. Use {@link check} to perform\n * deeper inspection of the exception if necessary.\n * @param {function(): Promise<void>} action\n * @param {function(any): boolean} check\n * @return {Promise<void>}\n */\nexport function expectExceptionAsync(action, check) {\n return __awaiter(this, void 0, void 0, function* () {\n let caught = false;\n let checked = false;\n try {\n yield action();\n }\n catch (e) {\n caught = true;\n checked = !check || check(e);\n }\n finally {\n if (!caught)\n throw new Error('An exception is expected but not thrown');\n if (!checked)\n throw new Error('An expected exception is thrown, but it does not satisfy the condition');\n }\n });\n}\nconst catDF = DG.DataFrame.fromColumns([DG.Column.fromStrings('col', ['val1', 'val2', 'val3'])]);\n/**\n * Universal test for viewers. It search viewers in DOM by tags: canvas, svg, img, input, h1, a\n * @param {string} v Viewer name\n * @param {DG.DataFrame} df Dataframe to use. Should have at least 3 rows\n * @param {boolean} options.detectSemanticTypes Specify whether to detect semantic types or not\n * @param {boolean} options.readOnly If set to true, the dataframe will not be modified during the test\n * @param {boolean} options.arbitraryDfTest If set to false, test on arbitrary dataframe\n * (one categorical column) will not be performed\n * @param {object} options List of options (optional)\n * @return {Promise<void>} The test is considered successful if it completes without errors\n */\nexport function testViewer(v, df, options) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const createViewer = (tv, v, packageName) => __awaiter(this, void 0, void 0, function* () {\n let res;\n if (packageName) {\n res = (yield tv.dataFrame.plot.fromType(v));\n tv.dockManager.dock(res);\n }\n else\n res = tv.addViewer(v);\n return res;\n });\n if (options === null || options === void 0 ? void 0 : options.detectSemanticTypes)\n yield grok.data.detectSemanticTypes(df);\n let 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,${viewerName} .d4-viewer-error`;\n const selector = ['div.ui-box' /* root */, 'canvas', 'svg', 'img', 'input', 'h1', 'a', '.d4-viewer-error']\n .map((selTag) => `${viewerName} ${selTag}`).join(', ');\n const res = [];\n try {\n let viewer = yield createViewer(tv, v, options === null || options === void 0 ? void 0 : options.packageName);\n yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer', 3000);\n const tag = (_a = document.querySelector(selector)) === null || _a === void 0 ? void 0 : _a.tagName;\n res.push(Array.from(tv.viewers).length);\n if (!(options === null || options === void 0 ? void 0 : options.readOnly)) {\n Array.from(df.row(0).cells).forEach((c) => c.value = null);\n const num = df.rowCount < 20 ? Math.floor(df.rowCount / 2) : 10;\n df.rows.select((row) => row.idx >= 0 && row.idx < num);\n yield delay(50);\n for (let i = num; i < num * 2; i++)\n df.filter.set(i, false);\n yield delay(50);\n df.currentRowIdx = 1;\n const df1 = df.clone();\n df.columns.names().slice(0, Math.ceil(df.columns.length / 2)).forEach((c) => df.columns.remove(c));\n yield delay(100);\n tv.dataFrame = df1;\n }\n let optns;\n try {\n optns = viewer.getOptions(true).look;\n }\n catch (err) {\n throw new Error(`Viewer's .getOptions() error.`, { cause: err });\n }\n let props;\n try {\n props = viewer.getProperties();\n }\n catch (err) {\n throw new Error(`Viewer's .getProperties() error.`, { cause: err });\n }\n const newProps = {};\n Object.keys(optns).filter((k) => typeof optns[k] === 'boolean').forEach((k) => newProps[k] = !optns[k]);\n props.filter((p) => p.choices !== null)\n .forEach((p) => newProps[p.name] = p.choices.find((c) => c !== optns[p.name]));\n viewer.setOptions(newProps);\n yield delay(300);\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 const selector1 = `${viewerName} ${tag}`;\n yield awaitCheck(() => document.querySelector(selector1) !== null, 'cannot load viewer from layout', 3000);\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 if ((options === null || options === void 0 ? void 0 : options.arbitraryDfTest) !== false) {\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield options.awaitViewer(viewer);\n grok.shell.closeAll();\n yield delay(100);\n tv = grok.shell.addTableView(catDF);\n try {\n viewer = yield createViewer(tv, v, options === null || options === void 0 ? void 0 : options.packageName);\n }\n catch (e) {\n grok.shell.closeAll();\n DG.Balloon.closeAll();\n return;\n }\n yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer on arbitrary dataset', 3000);\n }\n if (options === null || options === void 0 ? void 0 : options.awaitViewer)\n yield options.awaitViewer(viewer);\n }\n finally {\n // closeAll() is handling by common test workflow\n // grok.shell.closeAll();\n // DG.Balloon.closeAll();\n }\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUczQyxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUMvQixNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQztBQUVuQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMzQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMzQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUU3QyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBS2QsRUFBRSxDQUFDO0FBRVAsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7QUFDdEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDO0FBQzNCLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO0FBQ3JDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQztBQUMzQixNQUFNLGFBQWEsR0FBNkIsRUFBRSxDQUFDO0FBQ25ELE1BQU0sQ0FBQyxJQUFJLGVBQXVCLENBQUM7QUFFbkMsTUFBTSxLQUFXLE1BQU0sQ0FLdEI7QUFMRCxXQUFpQixNQUFNO0lBQ3JCLFNBQWdCLE9BQU8sQ0FBQyxLQUFVLEVBQUUsSUFBYTtRQUMvQyxJQUFJLEtBQUssSUFBSSxJQUFJO1lBQ2YsTUFBTSxJQUFJ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R0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ25ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNyQyxNQUFNLEdBQUcsR0FBSSxLQUFLLENBQUMsQ0FBQyxDQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUMvQyxNQUFNLEdBQUcsR0FBbUUsRUFBRSxDQUFDO29CQUMvRSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUM5QixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDOzRCQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7NkJBQy9DLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7NEJBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs2QkFDOUQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQzs0QkFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzZCQUNsRCxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDOzRCQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzNFLENBQUMsQ0FBQyxDQUFDO29CQUNILE1BQU0s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QztnQkFFdEIsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pCLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDcEMsSUFBSTtvQkFDRixNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsV0FBVyxDQUFDLENBQUM7aUJBQzFEO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3RCLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3RCLE9BQU87aUJBQ1I7Z0JBQ0QsTUFBTSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQzlELHlDQUF5QyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ3BEO1lBQ0QsSUFBSSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsV0FBVztnQkFBRSxNQUFNLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0Q7Z0JBQVM7WUFDUixpREFBaUQ7WUFDakQseUJBQXlCO1lBQ3pCLHlCQUF5QjtTQUMxQjs7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge3Rlc3REYXRhfSBmcm9tICcuL2RhdGFmcmFtZS11dGlscyc7XG5pbXBvcnQgVGltZW91dCA9IE5vZGVKUy5UaW1lb3V0O1xuXG5jb25zdCBTVEFOREFSVF9USU1FT1VUID0gMzAwMDA7XG5jb25zdCBCRU5DSE1BUktfVElNRU9VVCA9IDEwODAwMDAwO1xuXG5jb25zdCBzdGRMb2cgPSBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO1xuY29uc3Qgc3RkSW5mbyA9IGNvbnNvbGUuaW5mby5iaW5kKGNvbnNvbGUpO1xuY29uc3Qgc3RkV2FybiA9IGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpO1xuY29uc3Qgc3RkRXJyb3IgPSBjb25zb2xlLmVycm9yLmJpbmQoY29uc29sZSk7XG5cbmV4cG9ydCBjb25zdCB0ZXN0czoge1xuICBba2V5OiBzdHJpbmddOiB7XG4gICAgdGVzdHM/OiBUZXN0W10sIGJlZm9yZT86ICgpID0+IFByb21pc2U8dm9pZD4sIGFmdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBiZWZvcmVTdGF0dXM/OiBzdHJpbmcsIGFmdGVyU3RhdHVzPzogc3RyaW5nLCBjbGVhcj86IGJvb2xlYW4sIHRpbWVvdXQ/OiBudW1iZXJcbiAgfVxufSA9IHt9O1xuXG5jb25zdCBhdXRvVGVzdHNDYXROYW1lID0gJ0F1dG8gVGVzdHMnO1xuY29uc3QgZGVtb0NhdE5hbWUgPSAnRGVtbyc7XG5jb25zdCBkZXRlY3RvcnNDYXROYW1lID0gJ0RldGVjdG9ycyc7XG5jb25zdCBjb3JlQ2F0TmFtZSA9ICdDb3JlJztcbmNvbnN0IHdhc1JlZ2lzdGVyZWQ6IHtba2V5OiBzdHJpbmddOiBib29sZWFufSA9IHt9O1xuZXhwb3J0IGxldCBjdXJyZW50Q2F0ZWdvcnk6IHN0cmluZztcblxuZXhwb3J0IG5hbWVzcGFjZSBhc3N1cmUge1xuICBleHBvcnQgZnVuY3Rpb24gbm90TnVsbCh2YWx1ZTogYW55LCBuYW1lPzogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZSA9PSBudWxsID8gJ1ZhbHVlJyA6IG5hbWV9IG5vdCBkZWZpbmVkYCk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXN0T3B0aW9ucyB7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIHVuaGFuZGxlZEV4Y2VwdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gIHNraXBSZWFzb24/OiBzdHJpbmc7XG4gIGlzQWdncmVnYXRlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcnlPcHRpb25zIHtcbiAgY2xlYXI/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgVGVzdENvbnRleHQge1xuICBjYXRjaFVuaGFuZGxlZCA9IHRydWU7XG4gIHJlcG9ydCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGNhdGNoVW5oYW5kbGVkPzogYm9vbGVhbiwgcmVwb3J0PzogYm9vbGVhbikge1xuICAgIGlmIChjYXRjaFVuaGFuZGxlZCAhPT0gdW5kZWZpbmVkKSB0aGlzLmNhdGNoVW5oYW5kbGVkID0gY2F0Y2hVbmhhbmRsZWQ7XG4gICAgaWYgKHJlcG9ydCAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlcG9ydCA9IHJlcG9ydDtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFRlc3Qge1xuICB0ZXN0OiAoKSA9PiBQcm9taXNlPGFueT47XG4gIG5hbWU6IHN0cmluZztcbiAgY2F0ZWdvcnk6IHN0cmluZztcbiAgb3B0aW9ucz86IFRlc3RPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKGNhdGVnb3J5OiBzdHJpbmcsIG5hbWU6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+LCBvcHRpb25zPzogVGVzdE9wdGlvbnMpIHtcbiAgICB0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICBvcHRpb25zID8/PSB7fTtcbiAgICBvcHRpb25zLnRpbWVvdXQgPz89IFNUQU5EQVJUX1RJTUVPVVQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnRlc3QgPSBhc3luYyAoKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0ZXN0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0RXZlbnQ8VD4oZXZlbnQ6IE9ic2VydmFibGU8VD4sXG4gIGhhbmRsZXI6IChhcmdzOiBUKSA9PiB2b2lkLCB0cmlnZ2VyOiAoKSA9PiB2b2lkLCBtczogbnVtYmVyID0gMCwgcmVhc29uOiBzdHJpbmcgPSBgdGltZW91dGBcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc3ViID0gZXZlbnQuc3Vic2NyaWJlKChhcmdzOiBUKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBoYW5kbGVyKGFyZ3MpO1xuICAgICAgICByZXNvbHZlKCdPSycpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgICAvLyBEbyBub3QgY2xlYXJUaW1lb3V0IG9yIGV2ZW50IHN1YiBpZiBoYW5kbGVyIGZhaWxzXG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICB9KTtcbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QocmVhc29uKTtcbiAgICB9LCBtcyk7XG4gICAgdHJpZ2dlcigpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRlc3QobmFtZTogc3RyaW5nLCB0ZXN0OiAoKSA9PiBQcm9taXNlPGFueT4sIG9wdGlvbnM/OiBUZXN0T3B0aW9ucyk6IHZvaWQge1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XSA9PSB1bmRlZmluZWQpXG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyA9PSB1bmRlZmluZWQpXG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyA9IFtdO1xuICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLnRlc3RzIS5wdXNoKG5ldyBUZXN0KGN1cnJlbnRDYXRlZ29yeSwgbmFtZSwgdGVzdCwgb3B0aW9ucykpO1xufVxuXG4vKiBUZXN0cyB0d28gb2JqZWN0cyBmb3IgZXF1YWxpdHksIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhleSBhcmUgbm90IGVxdWFsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdChhY3R1YWw6IGFueSwgZXhwZWN0ZWQ6IGFueSA9IHRydWUsIGVycm9yPzogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChlcnJvcilcbiAgICBlcnJvciA9IGAke2Vycm9yfSwgYDtcbiAgZWxzZSBlcnJvciA9ICcnO1xuICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3J9RXhwZWN0ZWQgXCIke2V4cGVjdGVkfVwiLCBnb3QgXCIke2FjdHVhbH1cImApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0RmxvYXQoYWN0dWFsOiBudW1iZXIsIGV4cGVjdGVkOiBudW1iZXIsIHRvbGVyYW5jZSA9IDAuMDAxLCBlcnJvcj86IHN0cmluZyk6IHZvaWQge1xuICBpZiAoKGFjdHVhbCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZICYmIGV4cGVjdGVkID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHx8XG4gICAgICAoYWN0dWFsID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgJiYgZXhwZWN0ZWQgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSkgfHxcbiAgICAgIChhY3R1YWwgPT09IE51bWJlci5OYU4gJiYgZXhwZWN0ZWQgPT09IE51bWJlci5OYU4pIHx8IChpc05hTihhY3R1YWwpICYmIGlzTmFOKGV4cGVjdGVkKSkpXG4gICAgcmV0dXJuO1xuICBjb25zdCBhcmVFcXVhbCA9IE1hdGguYWJzKGFjdHVhbCAtIGV4cGVjdGVkKSA8IHRvbGVyYW5jZTtcbiAgZXhwZWN0KGFyZUVxdWFsLCB0cnVlLCBgJHtlcnJvciA/PyAnJ30gKHRvbGVyYW5jZSA9ICR7dG9sZXJhbmNlfSlgKTtcbiAgaWYgKCFhcmVFcXVhbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZXhwZWN0ZWR9LCBnb3QgJHthY3R1YWx9ICh0b2xlcmFuY2UgPSAke3RvbGVyYW5jZX0pYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RUYWJsZShhY3R1YWw6IERHLkRhdGFGcmFtZSwgZXhwZWN0ZWQ6IERHLkRhdGFGcmFtZSwgZXJyb3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZXhwZWN0ZWRSb3dDb3VudCA9IGV4cGVjdGVkLnJvd0NvdW50O1xuICBjb25zdCBhY3R1YWxSb3dDb3VudCA9IGFjdHVhbC5yb3dDb3VudDtcbiAgZXhwZWN0KGFjdHVhbFJvd0NvdW50LCBleHBlY3RlZFJvd0NvdW50LCBgJHtlcnJvciA/PyAnJ30sIHJvdyBjb3VudGApO1xuXG4gIGZvciAoY29uc3QgY29sdW1uIG9mIGV4cGVjdGVkLmNvbHVtbnMpIHtcbiAgICBjb25zdCBhY3R1YWxDb2x1bW4gPSBhY3R1YWwuY29sdW1ucy5ieU5hbWUoY29sdW1uLm5hbWUpO1xuICAgIGlmIChhY3R1YWxDb2x1bW4gPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uICR7Y29sdW1uLm5hbWV9IG5vdCBmb3VuZGApO1xuICAgIGlmIChhY3R1YWxDb2x1bW4udHlwZSAhPSBjb2x1bW4udHlwZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uICR7Y29sdW1uLm5hbWV9IHR5cGUgZXhwZWN0ZWQgJHtjb2x1bW4udHlwZX0gZ290ICR7YWN0dWFsQ29sdW1uLnR5cGV9YCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBlY3RlZFJvd0NvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29sdW1uLmdldChpKTtcbiAgICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gYWN0dWFsQ29sdW1uLmdldChpKTtcbiAgICAgIGlmIChjb2x1bW4udHlwZSA9PSBERy5UWVBFLkZMT0FUKVxuICAgICAgICBleHBlY3RGbG9hdChhY3R1YWxWYWx1ZSwgdmFsdWUsIDAuMDAwMSwgZXJyb3IpO1xuICAgICAgZWxzZSBpZiAoY29sdW1uLnR5cGUgPT0gREcuVFlQRS5EQVRFX1RJTUUpXG4gICAgICAgIGV4cGVjdChhY3R1YWxWYWx1ZS5pc1NhbWUodmFsdWUpLCB0cnVlLCBlcnJvcik7XG4gICAgICBlbHNlXG4gICAgICAgIGV4cGVjdChhY3R1YWxWYWx1ZSwgdmFsdWUsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdE9iamVjdChhY3R1YWw6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGV4cGVjdGVkOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7XG4gIGZvciAoY29uc3QgW2V4cGVjdGVkS2V5LCBleHBlY3RlZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhleHBlY3RlZCkpIHtcbiAgICBpZiAoIWFjdHVhbC5oYXNPd25Qcm9wZXJ0eShleHBlY3RlZEtleSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHByb3BlcnR5IFwiJHtleHBlY3RlZEtleX1cIiBub3QgZm91bmRgKTtcblxuICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gYWN0dWFsW2V4cGVjdGVkS2V5XTtcbiAgICBpZiAoYWN0dWFsVmFsdWUgaW5zdGFuY2VvZiBBcnJheSAmJiBleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgQXJyYXkpXG4gICAgICBleHBlY3RBcnJheShhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsVmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgIGV4cGVjdE9iamVjdChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7XG4gICAgZWxzZSBpZiAoTnVtYmVyLmlzRmluaXRlKGFjdHVhbFZhbHVlKSAmJiBOdW1iZXIuaXNGaW5pdGUoZXhwZWN0ZWRWYWx1ZSkpXG4gICAgICBleHBlY3RGbG9hdChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsVmFsdWUgIT0gZXhwZWN0ZWRWYWx1ZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgKCR7ZXhwZWN0ZWRWYWx1ZX0pIGZvciBrZXkgJyR7ZXhwZWN0ZWRLZXl9JywgZ290ICgke2FjdHVhbFZhbHVlfSlgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0QXJyYXkoYWN0dWFsOiBBcnJheUxpa2U8YW55PiwgZXhwZWN0ZWQ6IEFycmF5TGlrZTxhbnk+KSB7XG4gIGNvbnN0IGFjdHVhbExlbmd0aCA9IGFjdHVhbC5sZW5ndGg7XG4gIGNvbnN0IGV4cGVjdGVkTGVuZ3RoID0gZXhwZWN0ZWQubGVuZ3RoO1xuXG4gIGlmIChhY3R1YWxMZW5ndGggIT0gZXhwZWN0ZWRMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEFycmF5cyBhcmUgb2YgZGlmZmVyZW50IGxlbmd0aDogYWN0dWFsIGFycmF5IGxlbmd0aCBpcyAke2FjdHVhbExlbmd0aH0gYCArXG4gICAgICBgYW5kIGV4cGVjdGVkIGFycmF5IGxlbmd0aCBpcyAke2V4cGVjdGVkTGVuZ3RofWApO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhY3R1YWxMZW5ndGg7IGkrKykge1xuICAgIGlmIChhY3R1YWxbaV0gaW5zdGFuY2VvZiBBcnJheSAmJiBleHBlY3RlZFtpXSBpbnN0YW5jZW9mIEFycmF5KVxuICAgICAgZXhwZWN0QXJyYXkoYWN0dWFsW2ldLCBleHBlY3RlZFtpXSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsW2ldIGluc3RhbmNlb2YgT2JqZWN0ICYmIGV4cGVjdGVkW2ldIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgZXhwZWN0T2JqZWN0KGFjdHVhbFtpXSwgZXhwZWN0ZWRbaV0pO1xuICAgIGVsc2UgaWYgKGFjdHVhbFtpXSAhPSBleHBlY3RlZFtpXSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtleHBlY3RlZFtpXX0gYXQgcG9zaXRpb24gJHtpfSwgZ290ICR7YWN0dWFsW2ldfWApO1xuICB9XG59XG5cbi8qIERlZmluZXMgYSB0ZXN0IHN1aXRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcsIHRlc3RzXzogKCkgPT4gdm9pZCwgb3B0aW9ucz86IENhdGVnb3J5T3B0aW9ucyk6IHZvaWQge1xuICBjdXJyZW50Q2F0ZWdvcnkgPSBjYXRlZ29yeTtcbiAgdGVzdHNfKCk7XG4gIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldKSB7XG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5jbGVhciA9IG9wdGlvbnM/LmNsZWFyID8/IHRydWU7XG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dDtcbiAgfVxufVxuXG4vKiBEZWZpbmVzIGEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYmVmb3JlIHRoZSB0ZXN0cyBpbiB0aGlzIGNhdGVnb3J5IGFyZSBleGVjdXRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiZWZvcmUoYmVmb3JlOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogdm9pZCB7XG4gIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID0ge307XG4gIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uYmVmb3JlID0gYmVmb3JlO1xufVxuXG4vKiBEZWZpbmVzIGEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyKGFmdGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogdm9pZCB7XG4gIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID0ge307XG4gIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uYWZ0ZXIgPSBhZnRlcjtcbn1cblxuZnVuY3Rpb24gYWRkTmFtZXNwYWNlKHM6IHN0cmluZywgZjogREcuRnVuYyk6IHN0cmluZyB7XG4gIHJldHVybiBzLnJlcGxhY2UobmV3IFJlZ0V4cChmLm5hbWUsICdnaScpLCBmLm5xTmFtZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0QXV0b1Rlc3RzKHBhY2thZ2VfOiBERy5QYWNrYWdlLCBtb2R1bGU/OiBhbnkpIHtcbiAgY29uc3QgcGFja2FnZUlkID0gcGFja2FnZV8uaWQ7XG4gIGlmICh3YXNSZWdpc3RlcmVkW3BhY2thZ2VJZF0pIHJldHVybjtcbiAgY29uc3QgbW9kdWxlVGVzdHMgPSBtb2R1bGUgPyBtb2R1bGUudGVzdHMgOiB0ZXN0cztcbiAgaWYgKG1vZHVsZVRlc3RzW2F1dG9UZXN0c0NhdE5hbWVdICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIG1vZHVsZVRlc3RzW2RlbW9DYXROYW1lXSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBPYmplY3Qua2V5cyhtb2R1bGVUZXN0cykuZmluZCgoYykgPT4gYy5zdGFydHNXaXRoKGF1dG9UZXN0c0NhdE5hbWUpIHx8IGMuc3RhcnRzV2l0aChjb3JlQ2F0TmFtZSkpKSB7XG4gICAgd2FzUmVnaXN0ZXJlZFtwYWNrYWdlSWRdID0gdHJ1ZTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHBhY2thZ2VfLm5hbWUgPT09ICdEZXZUb29scycgfHwgKCEhbW9kdWxlICYmIG1vZHVsZS5fcGFja2FnZS5uYW1lID09PSAnRGV2VG9vbHMnKSkge1xuICAgIGNvbnN0IHRlc3RGdW5jdGlvbnM6IERHLkZ1bmNbXSA9IERHLkZ1bmMuZmluZCh7dGFnczogWydkYXJ0VGVzdCddfSk7XG4gICAgZm9yIChjb25zdCBmIG9mIHRlc3RGdW5jdGlvbnMpIHtcbiAgICAgIGNvbnN0IGFyciA9IGYubmFtZS5zcGxpdCgvXFxzKlxcfFxccyovZyk7XG4gICAgICBjb25zdCBuYW1lID0gYXJyLnBvcCgpID8/IGYubmFtZTtcbiAgICAgIGNvbnN0IGNhdCA9IGFyci5sZW5ndGggPyBjb3JlQ2F0TmFtZSArICc6ICcgKyBhcnIuam9pbignOiAnKSA6IGNvcmVDYXROYW1lO1xuICAgICAgaWYgKG1vZHVsZVRlc3RzW2NhdF0gPT09IHVuZGVmaW5lZClcbiAgICAgICAgbW9kdWxlVGVzdHNbY2F0XSA9IHt0ZXN0czogW10sIGNsZWFyOiB0cnVlfTtcbiAgICAgIG1vZHVsZVRlc3RzW2NhdF0udGVzdHMucHVzaChuZXcgVGVzdChjYXQsIG5hbWUsXG4gICAgICAgIGFzeW5jICgpID0+IGF3YWl0IGYuYXBwbHkoKSwge2lzQWdncmVnYXRlZDogZi5vdXRwdXRzLmxlbmd0aCA+IDAsIHRpbWVvdXQ6IDMwMDAwMH0pKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbW9kdWxlQXV0b1Rlc3RzID0gW107XG4gIGNvbnN0IG1vZHVsZURlbW8gPSBbXTtcbiAgY29uc3QgbW9kdWxlRGV0ZWN0b3JzID0gW107XG4gIGNvbnN0IHBhY2tGdW5jdGlvbnMgPSBhd2FpdCBncm9rLmRhcGkuZnVuY3Rpb25zLmZpbHRlcihgcGFja2FnZS5pZCA9IFwiJHtwYWNrYWdlSWR9XCJgKS5saXN0KCk7XG4gIGNvbnN0IHJlZyA9IG5ldyBSZWdFeHAoL3NraXA6XFxzKihbXixcXHNdKyl8d2FpdDpcXHMqKFxcZCspfGNhdDpcXHMqKFteLFxcc10rKXx0aW1lb3V0OlxccyooXFxkKykvZyk7XG4gIGZvciAoY29uc3QgZiBvZiBwYWNrRnVuY3Rpb25zKSB7XG4gICAgY29uc3QgdGVzdHMgPSBmLm9wdGlvbnNbJ3Rlc3QnXTtcbiAgICBjb25zdCBkZW1vID0gZi5vcHRpb25zWydkZW1vUGF0aCddO1xuICAgIGlmICgodGVzdHMgJiYgQXJyYXkuaXNBcnJheSh0ZXN0cykgJiYgdGVzdHMubGVuZ3RoKSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByZXMgPSAodGVzdHNbaV0gYXMgc3RyaW5nKS5tYXRjaEFsbChyZWcpO1xuICAgICAgICBjb25zdCBtYXA6IHtza2lwPzogc3RyaW5nLCB3YWl0PzogbnVtYmVyLCBjYXQ/OiBzdHJpbmcsIHRpbWVvdXQ/OiBudW1iZXJ9ID0ge307XG4gICAgICAgIEFycmF5LmZyb20ocmVzKS5mb3JFYWNoKChhcnIpID0+IHtcbiAgICAgICAgICBpZiAoYXJyWzBdLnN0YXJ0c1dpdGgoJ3NraXAnKSkgbWFwWydza2lwJ10gPSBhcnJbMV07XG4gICAgICAgICAgZWxzZSBpZiAoYXJyWzBdLnN0YXJ0c1dpdGgoJ3dhaXQnKSkgbWFwWyd3YWl0J10gPSBwYXJzZUludChhcnJbMl0pO1xuICAgICAgICAgIGVsc2UgaWYgKGFyclswXS5zdGFydHNXaXRoKCdjYXQnKSkgbWFwWydjYXQnXSA9IGFyclszXTtcbiAgICAgICAgICBlbHNlIGlmIChhcnJbMF0uc3RhcnRzV2l0aCgndGltZW91dCcpKSBtYXBbJ3RpbWVvdXQnXSA9IHBhcnNlSW50KGFycls0XSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0ZXN0ID0gbmV3IFRlc3QoYXV0b1Rlc3RzQ2F0TmFtZSwgdGVzdHMubGVuZ3RoID09PSAxID8gZi5uYW1lIDogYCR7Zi5uYW1lfSAke2kgKyAxfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBncm9rLmZ1bmN0aW9ucy5ldmFsKGFkZE5hbWVzcGFjZSh0ZXN0c1tpXSwgZikpO1xuICAgICAgICAgIGlmIChtYXAud2FpdCkgYXdhaXQgZGVsYXkobWFwLndhaXQpO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsXG4gICAgICAgICAgaWYgKHR5cGVvZiByZXMgPT09ICdib29sZWFuJyAmJiAhcmVzKSB0aHJvdyBgRmFpbGVkOiAke3Rlc3RzW2ldfSwgZXhwZWN0ZWQgdHJ1ZSwgZ290ICR7cmVzfWA7XG4gICAgICAgIH0sIHtza2lwUmVhc29uOiBtYXAuc2tpcCwgdGltZW91dDogbWFwLnRpbWVvdXR9KTtcbiAgICAgICAgaWYgKG1hcC5jYXQpIHtcbiAgICAgICAgICBjb25zdCBjYXQ6IHN0cmluZyA9IGF1dG9UZXN0c0NhdE5hbWUgKyAnOiAnICsgbWFwLmNhdDtcbiAgICAgICAgICB0ZXN0LmNhdGVnb3J5ID0gY2F0O1xuICAgICAgICAgIGlmIChtb2R1bGVUZXN0c1tjYXRdID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBtb2R1bGVUZXN0c1tjYXRdID0ge3Rlc3RzOiBbXSwgY2xlYXI6IHRydWV9O1xuICAgICAgICAgIG1vZHVsZVRlc3RzW2NhdF0udGVzdHMucHVzaCh0ZXN0KTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgbW9kdWxlQXV0b1Rlc3RzLnB1c2godGVzdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZW1vKSB7XG4gICAgICBjb25zdCB3YWl0ID0gZi5vcHRpb25zWydkZW1vV2FpdCddID8gcGFyc2VJbnQoZi5vcHRpb25zWydkZW1vV2FpdCddKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHRlc3QgPSBuZXcgVGVzdChkZW1vQ2F0TmFtZSwgZi5mcmllbmRseU5hbWUsIGFzeW5jICgpID0+IHtcbiAgICAgICAgZ3Jvay5zaGVsbC5sYXN0RXJyb3IgPSAnJztcbiAgICAgICAgYXdhaXQgZi5hcHBseSgpO1xuICAgICAgICBhd2FpdCBkZWxheSh3YWl0ID8gd2FpdCA6IDIwMDApO1xuICAgICAgICBpZiAoZ3Jvay5zaGVsbC5sYXN0RXJyb3IpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGdyb2suc2hlbGwubGFzdEVycm9yKTtcbiAgICAgIH0sIHtza2lwUmVhc29uOiBmLm9wdGlvbnNbJ2RlbW9Ta2lwJ119KTtcbiAgICAgIG1vZHVsZURlbW8ucHVzaCh0ZXN0KTtcbiAgICB9XG4gICAgaWYgKGYuaGFzVGFnKCdzZW1UeXBlRGV0ZWN0b3InKSkge1xuICAgICAgY29uc3QgdGVzdCA9IG5ldyBUZXN0KGRldGVjdG9yc0NhdE5hbWUsIGYuZnJpZW5kbHlOYW1lLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFyciA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiB0ZXN0RGF0YS5jbG9uZSgpLmNvbHVtbnMpIHtcbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmLmFwcGx5KFtjb2xdKTtcbiAgICAgICAgICBhcnIucHVzaChyZXMgfHwgY29sLnNlbVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGV4cGVjdChhcnIuZmlsdGVyKChpKSA9PiBpKS5sZW5ndGgsIDEpO1xuICAgICAgfSwge3NraXBSZWFzb246IGYub3B0aW9uc1snc2tpcFRlc3QnXX0pO1xuICAgICAgbW9kdWxlRGV0ZWN0b3JzLnB1c2godGVzdCk7XG4gICAgfVxuICB9XG4gIHdhc1JlZ2lzdGVyZWRbcGFja2FnZUlkXSA9IHRydWU7XG4gIGlmIChtb2R1bGVBdXRvVGVzdHMubGVuZ3RoKVxuICAgIG1vZHVsZVRlc3RzW2F1dG9UZXN0c0NhdE5hbWVdID0ge3Rlc3RzOiBtb2R1bGVBdXRvVGVzdHMsIGNsZWFyOiB0cnVlfTtcbiAgaWYgKG1vZHVsZURlbW8ubGVuZ3RoKVxuICAgIG1vZHVsZVRlc3RzW2RlbW9DYXROYW1lXSA9IHt0ZXN0czogbW9kdWxlRGVtbywgY2xlYXI6IHRydWV9O1xuICBpZiAobW9kdWxlRGV0ZWN0b3JzLmxlbmd0aClcbiAgICBtb2R1bGVUZXN0c1tkZXRlY3RvcnNDYXROYW1lXSA9IHt0ZXN0czogbW9kdWxlRGV0ZWN0b3JzLCBjbGVhcjogZmFsc2V9O1xufVxuXG5mdW5jdGlvbiByZWRlZmluZUNvbnNvbGUoKTogYW55W10ge1xuICBjb25zdCBsb2dzOiBhbnlbXSA9IFtdO1xuICBjb25zb2xlLmxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgbG9ncy5wdXNoKC4uLmFyZ3MpO1xuICAgIHN0ZExvZyguLi5hcmdzKTtcbiAgfTtcbiAgY29uc29sZS5pbmZvID0gKC4uLmFyZ3MpID0+IHtcbiAgICBsb2dzLnB1c2goLi4uYXJncyk7XG4gICAgc3RkSW5mbyguLi5hcmdzKTtcbiAgfTtcbiAgY29uc29sZS53YXJuID0gKC4uLmFyZ3MpID0+IHtcbiAgICBsb2dzLnB1c2goLi4uYXJncyk7XG4gICAgc3RkV2FybiguLi5hcmdzKTtcbiAgfTtcbiAgY29uc29sZS5lcnJvciA9ICguLi5hcmdzKSA9PiB7XG4gICAgbG9ncy5wdXNoKC4uLmFyZ3MpO1xuICAgIHN0ZEVycm9yKC4uLmFyZ3MpO1xuICB9O1xuICByZXR1cm4gbG9ncztcbn1cblxuZnVuY3Rpb24gcmVzZXRDb25zb2xlKCk6IHZvaWQge1xuICBjb25zb2xlLmxvZyA9IHN0ZExvZztcbiAgY29uc29sZS5pbmZvID0gc3RkSW5mbztcbiAgY29uc29sZS53YXJuID0gc3RkV2FybjtcbiAgY29uc29sZS5lcnJvciA9IHN0ZEVycm9yO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuVGVzdHMob3B0aW9ucz86XG4gIHtjYXRlZ29yeT86IHN0cmluZywgdGVzdD86IHN0cmluZywgdGVzdENvbnRleHQ/OiBUZXN0Q29udGV4dCwgZXhjbHVkZT86IHN0cmluZ1tdLCB2ZXJib3NlPzogYm9vbGVhbn0pIHtcbiAgY29uc3QgcGFja2FnZV8gPSBncm9rLmZ1bmN0aW9ucy5nZXRDdXJyZW50Q2FsbCgpPy5mdW5jPy5wYWNrYWdlO1xuICBhd2FpdCBpbml0QXV0b1Rlc3RzKHBhY2thZ2VfKTtcbiAgY29uc3QgcmVzdWx0czogeyBjYXRlZ29yeT86IHN0cmluZywgbmFtZT86IHN0cmluZywgc3VjY2VzczogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHN0cmluZywgbXM6IG51bWJlciwgc2tpcHBlZDogYm9vbGVhbiB9W10gPSBbXTtcbiAgY29uc29sZS5sb2coYFJ1bm5pbmcgdGVzdHNgKTtcbiAgb3B0aW9ucyA/Pz0ge307XG4gIG9wdGlvbnMhLnRlc3RDb250ZXh0ID8/PSBuZXcgVGVzdENvbnRleHQoKTtcbiAgZ3Jvay5zaGVsbC5sYXN0RXJyb3IgPSAnJztcbiAgY29uc3QgY2F0ZWdvcmllcyA9IFtdO1xuICBjb25zdCBsb2dzID0gcmVkZWZpbmVDb25zb2xlKCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGVzdHMpKSB7XG4gICAgICBpZiAoKCEhb3B0aW9ucz8uY2F0ZWdvcnkgJiYgIWtleS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgob3B0aW9ucz8uY2F0ZWdvcnkudG9Mb3dlckNhc2UoKSkpIHx8XG4gICAgICAgIG9wdGlvbnMuZXhjbHVkZT8uc29tZSgoYykgPT4ga2V5LnN0YXJ0c1dpdGgoYykpKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIHN0ZExvZyhgU3RhcnRlZCAke2tleX0gY2F0ZWdvcnlgKTtcbiAgICAgIGNhdGVnb3JpZXMucHVzaChrZXkpO1xuICAgICAgY29uc3Qgc2tpcHBlZCA9IHZhbHVlLnRlc3RzPy5ldmVyeSgodCkgPT4gdC5vcHRpb25zPy5za2lwUmVhc29uKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh2YWx1ZS5iZWZvcmUgJiYgIXNraXBwZWQpXG4gICAgICAgICAgYXdhaXQgdmFsdWUuYmVmb3JlKCk7XG4gICAgICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICAgICAgdmFsdWUuYmVmb3JlU3RhdHVzID0gZ2V0UmVzdWx0KHgpO1xuICAgICAgfVxuICAgICAgY29uc3QgdCA9IHZhbHVlLnRlc3RzID8/IFtdO1xuICAgICAgY29uc3QgcmVzID0gW107XG4gICAgICBpZiAodmFsdWUuY2xlYXIpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcmVzLnB1c2goYXdhaXQgZXhlY1Rlc3QodFtpXSwgb3B0aW9ucz8udGVzdCwgbG9ncywgdmFsdWUudGltZW91dCwgcGFja2FnZV8ubmFtZSwgb3B0aW9ucy52ZXJib3NlKSk7XG4gICAgICAgICAgZ3Jvay5zaGVsbC5jbG9zZUFsbCgpO1xuICAgICAgICAgIERHLkJhbGxvb24uY2xvc2VBbGwoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgIHJlcy5wdXNoKGF3YWl0IGV4ZWNUZXN0KHRbaV0sIG9wdGlvbnM/LnRlc3QsIGxvZ3MsIHZhbHVlLnRpbWVvdXQsIHBhY2thZ2VfLm5hbWUsIG9wdGlvbnMudmVyYm9zZSkpO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0YSA9IHJlcy5maWx0ZXIoKGQpID0+IGQucmVzdWx0ICE9ICdza2lwcGVkJyk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodmFsdWUuYWZ0ZXIgJiYgIXNraXBwZWQpXG4gICAgICAgICAgYXdhaXQgdmFsdWUuYWZ0ZXIoKTtcbiAgICAgIH0gY2F0Y2ggKHg6IGFueSkge1xuICAgICAgICB2YWx1ZS5hZnRlclN0YXR1cyA9IGdldFJlc3VsdCh4KTtcbiAgICAgIH1cbiAgICAgIC8vIENsZWFyIGFmdGVyIGNhdGVnb3J5XG4gICAgICAvLyBncm9rLnNoZWxsLmNsb3NlQWxsKCk7XG4gICAgICAvLyBERy5CYWxsb29uLmNsb3NlQWxsKCk7XG4gICAgICBpZiAodmFsdWUuYWZ0ZXJTdGF0dXMpXG4gICAgICAgIGRhdGEucHVzaCh7Y2F0ZWdvcnk6IGtleSwgbmFtZTogJ2FmdGVyJywgcmVzdWx0OiB2YWx1ZS5hZnRlclN0YXR1cywgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZX0pO1xuICAgICAgaWYgKHZhbHVlLmJlZm9yZVN0YXR1cylcbiAgICAgICAgZGF0YS5wdXNoKHtjYXRlZ29yeToga2V5LCBuYW1lOiAnYmVmb3JlJywgcmVzdWx0OiB2YWx1ZS5iZWZvcmVTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlLCBtczogMCwgc2tpcHBlZDogZmFsc2V9KTtcbiAgICAgIHJlc3VsdHMucHVzaCguLi5kYXRhKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVzZXRDb25zb2xlKCk7XG4gIH1cbiAgaWYgKG9wdGlvbnMudGVzdENvbnRleHQuY2F0Y2hVbmhhbmRsZWQpIHtcbiAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICBpZiAoZ3Jvay5zaGVsbC5sYXN0RXJyb3IubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgY2F0ZWdvcnk6ICdVbmhhbmRsZWQgZXhjZXB0aW9ucycsXG4gICAgICAgIG5hbWU6ICdleGNlcHRpb25zJyxcbiAgICAgICAgcmVzdWx0OiBncm9rLnNoZWxsLmxhc3RFcnJvciwgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmICghb3B0aW9ucy50ZXN0ICYmIHJlc3VsdHMubGVuZ3RoKSB7XG4gICAgY29uc3Qgc3VjY2Vzc2Z1bCA9IHJlc3VsdHMuZmlsdGVyKChyKSA9PiByLnN1Y2Nlc3MpLmxlbmd0aDtcbiAgICBjb25zdCBza2lwcGVkID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuc2tpcHBlZCkubGVuZ3RoO1xuICAgIGNvbnN0IGZhaWxlZCA9IHJlc3VsdHMuZmlsdGVyKChyKSA9PiAhci5zdWNjZXNzKTtcbiAgICBjb25zdCBwYWNrYWdlTmFtZSA9IHBhY2thZ2VfLm5hbWU7XG4gICAgZm9yIChjb25zdCBjYXQgb2YgY2F0ZWdvcmllcykge1xuICAgICAgY29uc3QgcmVzID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuY2F0ZWdvcnkgPT09IGNhdCk7XG4gICAgICBjb25zdCBmYWlsZWRfID0gcmVzLmZpbHRlcigocikgPT4gIXIuc3VjY2VzcykubGVuZ3RoO1xuICAgICAgY29uc3QgcGFyYW1zID0ge3N1Y2Nlc3M6IGZhaWxlZF8gPT09IDAsXG4gICAgICAgIHBhc3NlZDogcmVzLmZpbHRlcigocikgPT4gci5zdWNjZXNzKS5sZW5ndGgsXG4gICAgICAgIHNraXBwZWQ6IHJlcy5maWx0ZXIoKHIpID0+IHIuc2tpcHBlZCkubGVuZ3RoLFxuICAgICAgICBmYWlsZWQ6IGZhaWxlZF8sXG4gICAgICAgIHR5cGU6ICdwYWNrYWdlJywgcGFja2FnZU5hbWUsIGNhdGVnb3J5OiBjYXR9O1xuICAgICAgZ3Jvay5sb2cudXNhZ2UoYCR7cGFja2FnZU5hbWV9OiAke2NhdH1gLFxuICAgICAgICBwYXJhbXMsIGBjYXRlZ29yeS1wYWNrYWdlICR7cGFja2FnZU5hbWV9OiAke2NhdH1gKTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmNhdGVnb3J5KSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7c3VjY2VzczogZmFpbGVkLmxlbmd0aCA9PT0gMCwgcGFzc2VkOiBzdWNjZXNzZnVsLCBza2lwcGVkLCBmYWlsZWQ6IGZhaWxlZC5sZW5ndGgsXG4gICAgICAgIHR5cGU6ICdwYWNrYWdlJywgcGFja2FnZU5hbWV9O1xuICAgICAgZ3Jvay5sb2cudXNhZ2UocGFja2FnZU5hbWUsIHBhcmFtcywgYHBhY2thZ2UtcGFja2FnZSAke3BhY2thZ2VOYW1lfWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50ZXN0Q29udGV4dC5yZXBvcnQpIHtcbiAgICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBERy5Mb2dnZXIoKTtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gJ1BhY2thZ2UgQHBhY2thZ2UgdGVzdGVkOiBAc3VjY2Vzc2Z1bCBzdWNjZXNzZnVsLCBAc2tpcHBlZCBza2lwcGVkLCBAZmFpbGVkIGZhaWxlZCB0ZXN0cyc7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIHN1Y2Nlc3NmdWw6IHN1Y2Nlc3NmdWwsXG4gICAgICAgIHNraXBwZWQ6IHNraXBwZWQsXG4gICAgICAgIGZhaWxlZDogZmFpbGVkLmxlbmd0aCxcbiAgICAgICAgcGFja2FnZTogcGFja2FnZV9cbiAgICAgIH07XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgZmFpbGVkKSBPYmplY3QuYXNzaWduKHBhcmFtcywge1tgJHtyLmNhdGVnb3J5fSB8ICR7ci5uYW1lfWBdOiByLnJlc3VsdH0pO1xuICAgICAgbG9nZ2VyLmxvZyhkZXNjcmlwdGlvbiwgcGFyYW1zLCAncGFja2FnZS10ZXN0ZWQnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIGdldFJlc3VsdCh4OiBhbnkpIHtcbiAgcmV0dXJuIGAke3gudG9TdHJpbmcoKX1cXG4ke3guc3RhY2sgPyBERy5Mb2dnZXIudHJhbnNsYXRlU3RhY2tUcmFjZSh4LnN0YWNrKSA6ICcnfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWNUZXN0KHQ6IFRlc3QsIHByZWRpY2F0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBsb2dzOiBhbnlbXSxcbiAgY2F0ZWdvcnlUaW1lb3V0PzogbnVtYmVyLCBwYWNrYWdlTmFtZT86IHN0cmluZywgdmVyYm9zZT86IGJvb2xlYW4pIHtcbiAgbG9ncy5sZW5ndGggPSAwO1xuICBsZXQgcjoge2NhdGVnb3J5Pzogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBzdWNjZXNzOiBib29sZWFuLCByZXN1bHQ6IGFueSwgbXM6IG51bWJlciwgc2tpcHBlZDogYm9vbGVhbiwgbG9ncz86IHN0cmluZ307XG4gIGxldCB0eXBlOiBzdHJpbmcgPSAncGFja2FnZSc7XG4gIGNvbnN0IGZpbHRlciA9IHByZWRpY2F0ZSAhPSB1bmRlZmluZWQgJiYgKHQubmFtZS50b0xvd2VyQ2FzZSgpICE9PSBwcmVkaWNhdGUudG9Mb3dlckNhc2UoKSk7XG4gIGNvbnN0IHNraXAgPSB0Lm9wdGlvbnM/LnNraXBSZWFzb24gfHwgZmlsdGVyO1xuICBjb25zdCBza2lwUmVhc29uID0gZmlsdGVyID8gJ3NraXBwZWQnIDogdC5vcHRpb25zPy5za2lwUmVhc29uO1xuICBpZiAoIXNraXApXG4gICAgc3RkTG9nKGBTdGFydGVkICR7dC5jYXRlZ29yeX0gJHt0Lm5hbWV9YCk7XG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgdHJ5IHtcbiAgICBpZiAoc2tpcClcbiAgICAgIHIgPSB7c3VjY2VzczogdHJ1ZSwgcmVzdWx0OiBza2lwUmVhc29uISwgbXM6IDAsIHNraXBwZWQ6IHRydWV9O1xuICAgIGVsc2Uge1xuICAgICAgbGV0IHRpbWVvdXRfID0gdC5vcHRpb25zPy50aW1lb3V0ID09PSBTVEFOREFSVF9USU1FT1VUICYmXG4gICAgICAgIGNhdGVnb3J5VGltZW91dCA/IGNhdGVnb3J5VGltZW91dCA6IHQub3B0aW9ucz8udGltZW91dCE7XG4gICAgICB0aW1lb3V0XyA9IERHLlRlc3QuaXNJbkJlbmNobWFyayAmJiB0aW1lb3V0XyA9PT0gU1RBTkRBUlRfVElNRU9VVCA/IEJFTkNITUFSS19USU1FT1VUIDogdGltZW91dF87XG4gICAgICByID0ge3N1Y2Nlc3M6IHRydWUsIHJlc3VsdDogYXdhaXQgdGltZW91dCh0LnRlc3QsIHRpbWVvdXRfKSA/PyAnT0snLCBtczogMCwgc2tpcHBlZDogZmFsc2V9O1xuICAgIH1cbiAgfSBjYXRjaCAoeDogYW55KSB7XG4gICAgciA9IHtzdWNjZXNzOiBmYWxzZSwgcmVzdWx0OiBnZXRSZXN1bHQoeCksIG1zOiAwLCBza2lwcGVkOiBmYWxzZX07XG4gIH1cbiAgaWYgKHQub3B0aW9ucz8uaXNBZ2dyZWdhdGVkICYmIHIucmVzdWx0LmNvbnN0cnVjdG9yID09PSBERy5EYXRhRnJhbWUpIHtcbiAgICBjb25zdCBjb2wgPSByLnJlc3VsdC5jb2woJ3N1Y2Nlc3MnKTtcbiAgICB0eXBlID0gJ2NvcmUnO1xuICAgIGlmIChjb2wpXG4gICAgICByLnN1Y2Nlc3MgPSBjb2wuc3RhdHMuc3VtID09PSBjb2wubGVuZ3RoO1xuICAgIGlmICghdmVyYm9zZSkge1xuICAgICAgY29uc3QgZGYgPSByLnJlc3VsdDtcbiAgICAgIGRmLmNvbHVtbnMucmVtb3ZlKCdzdGFjaycpO1xuICAgICAgZGYucm93cy5yZW1vdmVXaGVyZSgocikgPT4gci5nZXQoJ3N1Y2Nlc3MnKSk7XG4gICAgICByLnJlc3VsdCA9IGRmO1xuICAgIH1cbiAgICByLnJlc3VsdCA9IHIucmVzdWx0LnRvQ3N2KCk7XG4gIH1cbiAgci5sb2dzID0gbG9ncy5qb2luKCdcXG4nKTtcbiAgci5tcyA9IERhdGUubm93KCkgLSBzdGFydDtcbiAgaWYgKCFza2lwKVxuICAgIHN0ZExvZyhgRmluaXNoZWQgJHt0LmNhdGVnb3J5fSAke3QubmFtZX0gZm9yICR7ci5tc30gbXNgKTtcbiAgci5jYXRlZ29yeSA9IHQuY2F0ZWdvcnk7XG4gIHIubmFtZSA9IHQubmFtZTtcbiAgaWYgKCFmaWx0ZXIpIHtcbiAgICBsZXQgcGFyYW1zID0geydzdWNjZXNzJzogci5zdWNjZXNzLCAncmVzdWx0Jzogci5yZXN1bHQsICdtcyc6IHIubXMsICdza2lwcGVkJzogci5za2lwcGVkLFxuICAgICAgJ3R5cGUnOiB0eXBlLCBwYWNrYWdlTmFtZSwgJ2NhdGVnb3J5JzogdC5jYXRlZ29yeSwgJ3Rlc3QnOiB0Lm5hbWUsICdsb2dzJzogci5sb2dzfTtcbiAgICBpZiAoci5yZXN1bHQuY29uc3RydWN0b3IgPT0gT2JqZWN0KSB7XG4gICAgICBjb25zdCByZXMgPSBPYmplY3Qua2V5cyhyLnJlc3VsdCkucmVkdWNlKChhY2MsIGspID0+ICh7Li4uYWNjLCBbJ3Jlc3VsdC4nICsga106IHIucmVzdWx0W2tdfSksIHt9KTtcbiAgICAgIHBhcmFtcyA9IHsuLi5wYXJhbXMsIC4uLnJlc307XG4gICAgfVxuICAgIGdyb2subG9nLnVzYWdlKGAke3BhY2thZ2VOYW1lfTogJHt0LmNhdGVnb3J5fTogJHt0Lm5hbWV9YCxcbiAgICAgIHBhcmFtcywgYHRlc3QtJHt0eXBlfSAke3BhY2thZ2VOYW1lfTogJHt0LmNhdGVnb3J5fTogJHt0Lm5hbWV9YCk7XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5cbi8qIFdhaXRzIFttc10gbWlsbGlzZWNvbmRzICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcikge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRDaGVjayhjaGVja0hhbmRsZXI6ICgpID0+IGJvb2xlYW4sXG4gIGVycm9yOiBzdHJpbmcgPSAnVGltZW91dCBleGNlZWRlZCcsIHdhaXQ6IG51bWJlciA9IDUwMCwgaW50ZXJ2YWw6IG51bWJlciA9IDUwKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihlcnJvcikpO1xuICAgIH0sIHdhaXQpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBpbnRlcnZhbElkOiBUaW1lb3V0ID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKGNoZWNrSGFuZGxlcigpKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9LCBpbnRlcnZhbCk7XG4gIH0pO1xufVxuXG4vLyBSZXR1cm5zIHRlc3QgZXhlY3V0aW9uIHJlc3VsdCBvciBhbiBlcnJvciBpbiBjYXNlIG9mIHRpbWVvdXRcbmFzeW5jIGZ1bmN0aW9uIHRpbWVvdXQoZnVuYzogKCkgPT4gUHJvbWlzZTxhbnk+LCB0ZXN0VGltZW91dDogbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcbiAgbGV0IHRpbWVvdXQ6IGFueSA9IG51bGw7XG4gIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8YW55PigoXywgcmVqZWN0KSA9PiB7XG4gICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdCgnRVhFQ1VUSU9OIFRJTUVPVVQnKTtcbiAgICB9LCB0ZXN0VGltZW91dCk7XG4gIH0pO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UoW2Z1bmMoKSwgdGltZW91dFByb21pc2VdKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAodGltZW91dClcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEaWFsb2dQcmVzZW50KGRpYWxvZ1RpdGxlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZGlhbG9ncyA9IERHLkRpYWxvZy5nZXRPcGVuRGlhbG9ncygpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpYWxvZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZGlhbG9nc1tpXS50aXRsZSA9PSBkaWFsb2dUaXRsZSlcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqIEV4cGVjdHMgYW4gYXN5bmNocm9ub3VzIHtAbGluayBhY3Rpb259IHRvIHRocm93IGFuIGV4Y2VwdGlvbi4gVXNlIHtAbGluayBjaGVja30gdG8gcGVyZm9ybVxuICogZGVlcGVyIGluc3BlY3Rpb24gb2YgdGhlIGV4Y2VwdGlvbiBpZiBuZWNlc3NhcnkuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbigpOiBQcm9taXNlPHZvaWQ+fSBhY3Rpb25cbiAqIEBwYXJhbSAge2Z1bmN0aW9uKGFueSk6IGJvb2xlYW59IGNoZWNrXG4gKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwZWN0RXhjZXB0aW9uQXN5bmMoYWN0aW9uOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICBjaGVjaz86IChleGNlcHRpb246IGFueSkgPT4gYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgY2F1Z2h0OiBib29sZWFuID0gZmFsc2U7XG4gIGxldCBjaGVja2VkOiBib29sZWFuID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgYXdhaXQgYWN0aW9uKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjYXVnaHQgPSB0cnVlO1xuICAgIGNoZWNrZWQgPSAhY2hlY2sgfHwgY2hlY2soZSk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKCFjYXVnaHQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIGV4Y2VwdGlvbiBpcyBleHBlY3RlZCBidXQgbm90IHRocm93bicpO1xuICAgIGlmICghY2hlY2tlZClcbiAgICAgIHRocm93IG5ldyBFcnJvcignQW4gZXhwZWN0ZWQgZXhjZXB0aW9uIGlzIHRocm93biwgYnV0IGl0IGRvZXMgbm90IHNhdGlzZnkgdGhlIGNvbmRpdGlvbicpO1xuICB9XG59XG5cbmNvbnN0IGNhdERGID0gREcuRGF0YUZyYW1lLmZyb21Db2x1bW5zKFtERy5Db2x1bW4uZnJvbVN0cmluZ3MoJ2NvbCcsIFsndmFsMScsICd2YWwyJywgJ3ZhbDMnXSldKTtcblxuLyoqXG4gKiBVbml2ZXJzYWwgdGVzdCBmb3Igdmlld2Vycy4gSXQgc2VhcmNoIHZpZXdlcnMgaW4gRE9NIGJ5IHRhZ3M6IGNhbnZhcywgc3ZnLCBpbWcsIGlucHV0LCBoMSwgYVxuICogQHBhcmFtICB7c3RyaW5nfSB2IFZpZXdlciBuYW1lXG4gKiBAcGFyYW0gIHtERy5EYXRhRnJhbWV9IGRmIERhdGFmcmFtZSB0byB1c2UuIFNob3VsZCBoYXZlIGF0IGxlYXN0IDMgcm93c1xuICogQHBhcmFtICB7Ym9vbGVhbn0gb3B0aW9ucy5kZXRlY3RTZW1hbnRpY1R5cGVzIFNwZWNpZnkgd2hldGhlciB0byBkZXRlY3Qgc2VtYW50aWMgdHlwZXMgb3Igbm90XG4gKiBAcGFyYW0gIHtib29sZWFufSBvcHRpb25zLnJlYWRPbmx5IElmIHNldCB0byB0cnVlLCB0aGUgZGF0YWZyYW1lIHdpbGwgbm90IGJlIG1vZGlmaWVkIGR1cmluZyB0aGUgdGVzdFxuICogQHBhcmFtICB7Ym9vbGVhbn0gb3B0aW9ucy5hcmJpdHJhcnlEZlRlc3QgSWYgc2V0IHRvIGZhbHNlLCB0ZXN0IG9uIGFyYml0cmFyeSBkYXRhZnJhbWVcbiAqIChvbmUgY2F0ZWdvcmljYWwgY29sdW1uKSB3aWxsIG5vdCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSAge29iamVjdH0gb3B0aW9ucyBMaXN0IG9mIG9wdGlvbnMgKG9wdGlvbmFsKVxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gVGhlIHRlc3QgaXMgY29uc2lkZXJlZCBzdWNjZXNzZnVsIGlmIGl0IGNvbXBsZXRlcyB3aXRob3V0IGVycm9yc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdFZpZXdlcih2OiBzdHJpbmcsIGRmOiBERy5EYXRhRnJhbWUsIG9wdGlvbnM/OiB7XG4gIGRldGVjdFNlbWFudGljVHlwZXM/OiBib29sZWFuLCByZWFkT25seT86IGJvb2xlYW4sIGFyYml0cmFyeURmVGVzdD86IGJvb2xlYW4sXG4gIHBhY2thZ2VOYW1lPzogc3RyaW5nLCBhd2FpdFZpZXdlcj86ICh2aWV3ZXI6IERHLlZpZXdlcikgPT4gUHJvbWlzZTx2b2lkPlxufSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjcmVhdGVWaWV3ZXIgPSBhc3luYyAodHY6IERHLlRhYmxlVmlldywgdjogc3RyaW5nLCBwYWNrYWdlTmFtZT86IHN0cmluZyk6IFByb21pc2U8REcuVmlld2VyPiA9PiB7XG4gICAgbGV0IHJlczogREcuVmlld2VyO1xuICAgIGlmIChwYWNrYWdlTmFtZSkge1xuICAgICAgcmVzID0gYXdhaXQgdHYuZGF0YUZyYW1lLnBsb3QuZnJvbVR5cGUodikgYXMgREcuVmlld2VyO1xuICAgICAgdHYuZG9ja01hbmFnZXIuZG9jayhyZXMpO1xuICAgIH0gZWxzZVxuICAgICAgcmVzID0gdHYuYWRkVmlld2VyKHYpO1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgaWYgKG9wdGlvbnM/LmRldGVjdFNlbWFudGljVHlwZXMpIGF3YWl0IGdyb2suZGF0YS5kZXRlY3RTZW1hbnRpY1R5cGVzKGRmKTtcbiAgbGV0IHR2ID0gZ3Jvay5zaGVsbC5hZGRUYWJsZVZpZXcoZGYpO1xuICBjb25zdCB2aWV3ZXJOYW1lID0gYFtuYW1lPXZpZXdlci0ke3YucmVwbGFjZSgvXFxzKy9nLCAnLScpfSBpXWA7XG4gIC8vIGNvbnN0IHNlbGVjdG9yID0gYCR7dmlld2VyTmFtZX0gY2FudmFzLCR7dmlld2VyTmFtZX0gc3ZnLCR7dmlld2VyTmFtZX0gaW1nLFxuICAvLyAgICR7dmlld2VyTmFtZX0gaW5wdXQsJHt2aWV3ZXJOYW1lfSBoMSwke3ZpZXdlck5hbWV9IGEsJHt2aWV3ZXJOYW1lfSAuZDQtdmlld2VyLWVycm9yYDtcbiAgY29uc3Qgc2VsZWN0b3IgPSBbJ2Rpdi51aS1ib3gnIC8qIHJvb3QgKi8sICdjYW52YXMnLCAnc3ZnJywgJ2ltZycsICdpbnB1dCcsICdoMScsICdhJywgJy5kNC12aWV3ZXItZXJyb3InXVxuICAgIC5tYXAoKHNlbFRhZykgPT4gYCR7dmlld2VyTmFtZX0gJHtzZWxUYWd9YCkuam9pbignLCAnKTtcbiAgY29uc3QgcmVzID0gW107XG4gIHRyeSB7XG4gICAgbGV0IHZpZXdlciA9IGF3YWl0IGNyZWF0ZVZpZXdlcih0diwgdiwgb3B0aW9ucz8ucGFja2FnZU5hbWUpO1xuICAgIGF3YWl0IGF3YWl0Q2hlY2soKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgIT09IG51bGwsXG4gICAgICAnY2Fubm90IGxvYWQgdmlld2VyJywgMzAwMCk7XG4gICAgY29uc3QgdGFnID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik/LnRhZ05hbWU7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIGlmICghb3B0aW9ucz8ucmVhZE9ubHkpIHtcbiAgICAgIEFycmF5LmZyb20oZGYucm93KDApLmNlbGxzKS5mb3JFYWNoKChjOmFueSkgPT4gYy52YWx1ZSA9IG51bGwpO1xuICAgICAgY29uc3QgbnVtID0gZGYucm93Q291bnQgPCAyMCA/IE1hdGguZmxvb3IoZGYucm93Q291bnQgLyAyKSA6IDEwO1xuICAgICAgZGYucm93cy5zZWxlY3QoKHJvdzogREcuUm93KSA9PiByb3cuaWR4ID49IDAgJiYgcm93LmlkeCA8IG51bSk7XG4gICAgICBhd2FpdCBkZWxheSg1MCk7XG4gICAgICBmb3IgKGxldCBpID0gbnVtOyBpIDwgbnVtICogMjsgaSsrKSBkZi5maWx0ZXIuc2V0KGksIGZhbHNlKTtcbiAgICAgIGF3YWl0IGRlbGF5KDUwKTtcbiAgICAgIGRmLmN1cnJlbnRSb3dJZHggPSAxO1xuICAgICAgY29uc3QgZGYxID0gZGYuY2xvbmUoKTtcbiAgICAgIGRmLmNvbHVtbnMubmFtZXMoKS5zbGljZSgwLCBNYXRoLmNlaWwoZGYuY29sdW1ucy5sZW5ndGggLyAyKSkuZm9yRWFjaCgoYzogYW55KSA9PiBkZi5jb2x1bW5zLnJlbW92ZShjKSk7XG4gICAgICBhd2FpdCBkZWxheSgxMDApO1xuICAgICAgdHYuZGF0YUZyYW1lID0gZGYxO1xuICAgIH1cbiAgICBsZXQgb3B0bnM6IHsgW3A6IHN0cmluZ106IGFueSB9O1xuICAgIHRyeSB7XG4gICAgICBvcHRucyA9IHZpZXdlci5nZXRPcHRpb25zKHRydWUpLmxvb2s7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVmlld2VyJ3MgLmdldE9wdGlvbnMoKSBlcnJvci5gLCB7Y2F1c2U6IGVycn0pO1xuICAgIH1cbiAgICBsZXQgcHJvcHM6IERHLlByb3BlcnR5W107XG4gICAgdHJ5IHtcbiAgICAgIHByb3BzID0gdmlld2VyLmdldFByb3BlcnRpZXMoKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBWaWV3ZXIncyAuZ2V0UHJvcGVydGllcygpIGVycm9yLmAsIHtjYXVzZTogZXJyfSk7XG4gICAgfVxuICAgIGNvbnN0IG5ld1Byb3BzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuPiA9IHt9O1xuICAgIE9iamVjdC5rZXlzKG9wdG5zKS5maWx0ZXIoKGspID0+IHR5cGVvZiBvcHRuc1trXSA9PT0gJ2Jvb2xlYW4nKS5mb3JFYWNoKChrKSA9PiBuZXdQcm9wc1trXSA9ICFvcHRuc1trXSk7XG4gICAgcHJvcHMuZmlsdGVyKChwOiBERy5Qcm9wZXJ0eSkgPT4gcC5jaG9pY2VzICE9PSBudWxsKVxuICAgICAgLmZvckVhY2goKHA6IERHLlByb3BlcnR5KSA9PiBuZXdQcm9wc1twLm5hbWVdID0gcC5jaG9pY2VzLmZpbmQoKGM6IGFueSkgPT4gYyAhPT0gb3B0bnNbcC5uYW1lXSkhKTtcbiAgICB2aWV3ZXIuc2V0T3B0aW9ucyhuZXdQcm9wcyk7XG4gICAgYXdhaXQgZGVsYXkoMzAwKTtcbiAgICBjb25zdCBsYXlvdXQgPSB0di5zYXZlTGF5b3V0KCk7XG4gICAgY29uc3Qgb2xkUHJvcHMgPSB2aWV3ZXIuZ2V0T3B0aW9ucygpLmxvb2s7XG4gICAgdHYucmVzZXRMYXlvdXQoKTtcbiAgICByZXMucHVzaChBcnJheS5mcm9tKHR2LnZpZXdlcnMpLmxlbmd0aCk7XG4gICAgdHYubG9hZExheW91dChsYXlvdXQpO1xuICAgIGNvbnN0IHNlbGVjdG9yMSA9IGAke3ZpZXdlck5hbWV9ICR7dGFnfWA7XG4gICAgYXdhaXQgYXdhaXRDaGVjaygoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yMSkgIT09IG51bGwsXG4gICAgICAnY2Fubm90IGxvYWQgdmlld2VyIGZyb20gbGF5b3V0JywgMzAwMCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIHZpZXdlciA9IEFycmF5LmZyb20odHYudmlld2VycykuZmluZCgodjogYW55KSA9PiB2LnR5cGUgIT09ICdHcmlkJykhO1xuICAgIGV4cGVjdEFycmF5KHJlcywgWzIsIDEsIDJdKTtcbiAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkodmlld2VyLmdldE9wdGlvbnMoKS5sb29rKSwgSlNPTi5zdHJpbmdpZnkob2xkUHJvcHMpKTtcbiAgICBpZiAob3B0aW9ucz8uYXJiaXRyYXJ5RGZUZXN0ICE9PSBmYWxzZSkge1xuICAgICAgaWYgKG9wdGlvbnM/LmF3YWl0Vmlld2VyKSBhd2FpdCBvcHRpb25zLmF3YWl0Vmlld2VyKHZpZXdlcik7XG4gICAgICBncm9rLnNoZWxsLmNsb3NlQWxsKCk7XG5cbiAgICAgIGF3YWl0IGRlbGF5KDEwMCk7XG4gICAgICB0diA9IGdyb2suc2hlbGwuYWRkVGFibGVWaWV3KGNhdERGKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZpZXdlciA9IGF3YWl0IGNyZWF0ZVZpZXdlcih0diwgdiwgb3B0aW9ucz8ucGFja2FnZU5hbWUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBncm9rLnNoZWxsLmNsb3NlQWxsKCk7XG4gICAgICAgIERHLkJhbGxvb24uY2xvc2VBbGwoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXdhaXQgYXdhaXRDaGVjaygoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSAhPT0gbnVsbCxcbiAgICAgICAgJ2Nhbm5vdCBsb2FkIHZpZXdlciBvbiBhcmJpdHJhcnkgZGF0YXNldCcsIDMwMDApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucz8uYXdhaXRWaWV3ZXIpIGF3YWl0IG9wdGlvbnMuYXdhaXRWaWV3ZXIodmlld2VyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBjbG9zZUFsbCgpIGlzIGhhbmRsaW5nIGJ5IGNvbW1vbiB0ZXN0IHdvcmtmbG93XG4gICAgLy8gZ3Jvay5zaGVsbC5jbG9zZUFsbCgpO1xuICAgIC8vIERHLkJhbGxvb24uY2xvc2VBbGwoKTtcbiAgfVxufVxuIl19","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {after, before, category, delay, expect, test, expectArray} from '@datagrok-libraries/utils/src/test';\n//import {findMonomers, helmToFasta, helmToPeptide, helmToRNA, initHelm} from '../package';\nimport {parseHelm} from '../utils';\n\nimport {_package} from '../package-test';\n\ncategory('Helm', () => {\n //These tests require webservice that is not present on test stand\n // test('helmToFasta', async () => {\n // expect(await helmToFasta('RNA1{R(U)P.R(T)P.R(G)P.R(C)P.R(A)}$$$$'), '>RNA1UTGCA');\n // expect(await helmToFasta('RNA1{P.R(U).P.R(T)}$$$$'), '>RNA1UT');\n // expect(await helmToFasta('PEPTIDE1{A.G}$$$$V2.0'), '>PEPTIDE1AG');\n // });\n //\n // test('helmToRNA', async () => {\n // expect(await helmToRNA('RNA1{R(U)P.R(T)P.R(G)P.R(C)P.R(A)}$$$$'), 'UTGCA');\n // expect(await helmToRNA('RNA1{P.R(U).P.R(T)}$$$$'), 'UT');\n // // eslint-disable-next-line max-len\n // expect(\n // await helmToRNA('RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$'), 'UT AA'\n // );\n // });\n //\n // test('helmToPeptide', async () => {\n // expect(await helmToPeptide('PEPTIDE1{A.G}$$$$V2.0'), 'AG');\n // expect(await helmToPeptide('PEPTIDE1{L.V.A}|PEPTIDE2{L.V.A}$$$$'), 'LVA LVA');\n // // eslint-disable-next-line max-len\n // expect(await helmToPeptide('PEPTIDE1{A.R.C.A.A.K.T.C.D.A}$PEPTIDE1,PEPTIDE1,8:R3-3:R3$$$'), 'ARCAAKTCDA');\n // });\n\n // detectMacromolecule is a function of Bio package\n // test('detectMacromolecule', async () => {\n // const file = await _package.files.readAsText('tests/test.csv');\n // const df = DG.DataFrame.fromCsv(file);\n // const col = df.columns.byName('HELM string');\n // await grok.data.detectSemanticTypes(df);\n // expect(col.semType, DG.SEMTYPE.MACROMOLECULE);\n // });\n\n // semType and units tags are detecting by Bio package function detectMacromolecule\n // test('detectHelm', async () => {\n // const file = await _package.files.readAsText('tests/test.csv');\n // const df = DG.DataFrame.fromCsv(file);\n // const col = df.columns.byName('HELM string');\n // await grok.data.detectSemanticTypes(df);\n // expect(col.tags[DG.TAGS.UNITS], 'HELM');\n // });\n\n const complexMonomers = [\n // tests parsing of complex monomemer in square brackets like [L-hArg(Et,Et)]\n 'PEPTIDE1{[L-hArg(Et,Et)].E.F.G}|PEPTIDE2{C.E}$PEPTIDE1,PEPTIDE2,2:R3-1:R1$$$V2.0',\n // tests parsing of complex monomer and one as a side chain as well\n 'PEPTIDE1{[L-hArg(Et,Et)]([L-hArg(Et,Et)]).E.F.G}$$$$',\n // tests parsing of complex monomer and one as a side chain as well\n 'RNA1{[dhp]([m1A])p.r(T)p.r(T)p.r(G)p}$$$$V2.0',\n // tests complex monomer as side chain\n 'RNA1{r([mo6pur])p.r(T)p.r(T)p.r(G)p}$$$$V2.0',\n // test complex monomer, side chain and linker\n 'RNA1{[afhna]([mo6pur])[36SS].r(T)p}$$$$V2.0'\n ];\n\n const complexMonomersExpected = [\n ['L-hArg(Et,Et)', 'E', 'F', 'G', 'C', 'E'],\n ['L-hArg(Et,Et)', 'L-hArg(Et,Et)', 'E', 'F', 'G'],\n ['dhp', 'm1A', 'p', 'r', 'T', 'p', 'r', 'T', 'p', 'r', 'G', 'p'],\n ['r', 'mo6pur', 'p', 'r', 'T', 'p', 'r', 'T', 'p', 'r', 'G', 'p'],\n ['afhna', 'mo6pur', '36SS', 'r', 'T', 'p']\n ];\n\n const complexTestNames = [\n 'comples-monomer', 'complex-monomer+side-chain', 'complex-monomer+side-chain-RNA',\n 'complex-side-chain', 'complex+side-chain+linker'\n ];\n test('parseHelm', async () => {\n const expectedResults = [\n ['meI', 'hHis', 'Aca', 'N', 'T', 'dK', 'Thr_PO3H2', 'D-Tyr_Et', 'Aze', 'dV', 'E', 'Phe_4Me'],\n ['A', 'C', 'T', 'G', 'W', 'E', 'Q'],\n ['R', 'U', 'P', 'T', 'A'],\n ['A', '*', 'G', 'C']\n ];\n const helmStrings = [\n 'PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2.Aca.D-Tyr_Et.Aze.dV.E.N.dV.Phe_4Me}$$$',\n // eslint-disable-next-line max-len\n 'PEPTIDE1{A.C.T.G.C.T.W.G.T.W.E.C.W.C.Q.W}|PEPTIDE2{A.C.T.G.C.T.W.G.T.W.E.Q}$PEPTIDE1,PEPTIDE1,5:R3-14:R3|PEPTIDE2,PEPTIDE1,2:R3-12:R3$$$',\n 'RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$',\n 'PEPTIDE1{A.*.G.C}$$$$V2.0'\n ];\n for (let idx = 0; idx < helmStrings.length; ++idx) {\n const monomerSet = new Set(parseHelm(helmStrings[idx]));\n const monomerArray = Array.from(monomerSet);\n expect(JSON.stringify(monomerArray), JSON.stringify(expectedResults[idx]));\n }\n });\n complexMonomers.forEach((helm, i) => {\n test(complexTestNames[i], async () => {\n const monomersArray = parseHelm(helm);\n monomersArray.sort();\n const expected = complexMonomersExpected[i];\n expected.sort();\n expectArray(monomersArray, expected);\n });\n });\n});\n","import * as grok from 'datagrok-api/grok';\n// -- Monomer libraries --\nexport const LIB_STORAGE_NAME = 'Libraries';\nexport const LIB_PATH = 'System:AppData/Bio/monomer-libraries/';\nconst LIB_SETTINGS_FOR_TESTS = { explicit: ['HELMCoreLibrary.json'], exclude: [] };\nlet userLibSettingsPromise = Promise.resolve();\nexport async function getUserLibSettings() {\n let res;\n userLibSettingsPromise = userLibSettingsPromise.then(async () => {\n const resStr = await grok.dapi.userDataStorage.getValue(LIB_STORAGE_NAME, 'Settings', true);\n res = resStr ? JSON.parse(resStr) : { exclude: [], explicit: [] };\n // Fix empty object returned in case there is no settings stored for user\n res.exclude = res.exclude instanceof Array ? res.exclude : [];\n res.explicit = res.explicit instanceof Array ? res.explicit : [];\n console.debug(`Bio: getUserLibSettings()\\n${JSON.stringify(res, undefined, 2)}`);\n });\n await userLibSettingsPromise;\n return res;\n}\nexport async function setUserLibSettings(value) {\n userLibSettingsPromise = userLibSettingsPromise.then(async () => {\n console.debug(`Bio: setUserLibSettings()\\n${JSON.stringify(value, undefined, 2)}`);\n await grok.dapi.userDataStorage.postValue(LIB_STORAGE_NAME, 'Settings', JSON.stringify(value), true);\n });\n await userLibSettingsPromise;\n}\n/** Set only HELMCoreLibrary.json */\nexport async function setUserLibSettingsForTests() {\n await setUserLibSettings(LIB_SETTINGS_FOR_TESTS);\n}\n//# sourceMappingURL=lib-settings.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 {after, before, category, delay, expect, expectObject, test} from '@datagrok-libraries/utils/src/test';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';\nimport {\n getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\n\nimport {findMonomers, parseHelm} from '../utils';\n\n\n/** Tests with default monomer library */\ncategory('findMonomers', () => {\n let monomerLibHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibSettings: UserLibSettings;\n\n before(async () => {\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n\n // Tests 'findMonomers' requires default monomer library loaded\n await setUserLibSettingsForTests();\n await monomerLibHelper.loadLibraries(true); // load default libraries for tests\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadLibraries(true);\n });\n\n const tests: { [testName: string]: { test: string, tgt: Set<string> } } = {\n 'withoutMissed': {\n test: 'PEPTIDE1{meI.hHis.Aca.N.T.dE.Thr_PO3H2.Aca.D-Tyr_Et}$$$$',\n tgt: new Set<string>(),\n },\n 'withMissed':\n {\n test: 'PEPTIDE1{meI.missed2.Aca.N.T.dE.Thr_PO3H2.Aca.D-Tyr_Et}$$$$',\n tgt: new Set<string>(['missed2'])\n }\n };\n\n for (const [testName, testData] of Object.entries(tests)) {\n test(testName, async () => {\n _testFindMonomers(testData.test, testData.tgt);\n });\n }\n\n function _testFindMonomers(testHelmValue: string, tgtMissedSet: Set<string>): void {\n const monomerSymbolList: string[] = parseHelm(testHelmValue);\n const resMissedSet: Set<string> = findMonomers(monomerSymbolList);\n expectObject(resMissedSet, tgtMissedSet);\n }\n});\n","export const R_GROUP_ELEMENT_SYMBOL = 'R#';\nexport const HYDROGEN_SYMBOL = 'H';\nexport var V2K_CONST;\n(function (V2K_CONST) {\n V2K_CONST[\"TYPE\"] = \"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[V2K_CONST[\"MAX_ATOM_COUNT\"] = 999] = \"MAX_ATOM_COUNT\";\n V2K_CONST[\"RGP_LINE_START\"] = \"M RGP\";\n V2K_CONST[\"ATOM_ALIAS_LINE_START\"] = \"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`;\nexport const EMPTY_MOL_V3000 = `\nEmpty input\n\n 0 0 0 0 0 0 999 V3000\nM END`;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS1jb25zdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1vbGZpbGUtY29uc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDO0FBQzNDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFFbkMsTUFBTSxDQUFOLElBQVksU0FnQlg7QUFoQkQsV0FBWSxTQUFTO0lBQ25CLDJCQUFjLENBQUE7SUFDZCx1RUFBdUIsQ0FBQTtJQUV2Qix5RUFBd0IsQ0FBQTtJQUN4QiwyREFBaUIsQ0FBQTtJQUNqQiwyRUFBeUIsQ0FBQTtJQUN6QiwyREFBaUIsQ0FBQTtJQUVqQixtREFBYSxDQUFBO0lBQ2IsK0RBQW9CLENBQUE7SUFFcEIsc0NBQXlCLENBQUE7SUFDekIsMENBQTZCLENBQUE7SUFFN0IsMkJBQWMsQ0FBQTtBQUNoQixDQUFDLEVBaEJXLFNBQVMsS0FBVCxTQUFTLFFBZ0JwQjtBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHOzs7O09BSTVCLENBQUM7QUF1Q1IsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHOzs7O09BSXhCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgUl9HUk9VUF9FTEVNRU5UX1NZTUJPTCA9ICdSIyc7XG5leHBvcnQgY29uc3QgSFlEUk9HRU5fU1lNQk9MID0gJ0gnO1xuXG5leHBvcnQgZW51bSBWMktfQ09OU1Qge1xuICBUWVBFID0gJ1YyMDAwJyxcbiAgTlVNX09GX0hFQURFUl9MSU5FUyA9IDMsXG5cbiAgTlVNX09GX0NPVU5UU19ESUdJVFMgPSAzLFxuICBBVE9NX1RZUEVfQ09MID0gNCxcbiAgRklSU1RfQk9OREVEX0FUT01fQ09MID0gMSxcbiAgQk9ORF9UWVBFX0NPTCA9IDMsXG5cbiAgUkdQX1NISUZUID0gOCxcbiAgTUFYX0FUT01fQ09VTlQgPSA5OTksXG5cbiAgUkdQX0xJTkVfU1RBUlQgPSAnTSAgUkdQJyxcbiAgQVRPTV9BTElBU19MSU5FX1NUQVJUID0gJ0EgICcsXG5cbiAgRU5EID0gJ00gIEVORCcsXG59XG5cbmV4cG9ydCBjb25zdCBNQUxGT1JNRURfTU9MX1YyMDAwID0gYFxuTWFsZm9ybWVkXG5cbiAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMCAgMDk5OSBWMjAwMFxuTSAgRU5EYDtcblxuZXhwb3J0IGNvbnN0IGVudW0gVjNLX0NPTlNUIHtcbiAgVFlQRSA9ICdWMzAwMCcsXG4gIEhFQURFUl9TRUNPTkRfTElORSA9ICcgIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICA5OTkgVjMwMDBcXG4nLFxuXG4gIEJFR0lOX0RBVEFfTElORSA9ICdNICBWMzAgJyxcblxuICBCRUdJTl9DT1VOVFNfTElORSA9ICdNICBWMzAgQ09VTlRTICcsXG4gIC8qKiBJbmRleCBzaGlmdCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlICdDT1VOVFMnIGxpbmUgdG8gdGhlIG51bWJlciBvZiBhdG9tcyAgKi9cbiAgQ09VTlRTX1NISUZUID0gMTQsXG5cbiAgQkVHSU5fQ1RBQl9CTE9DSyA9ICdNICBWMzAgQkVHSU4gQ1RBQicsXG4gIEVORF9DVEFCX0JMT0NLID0gJ00gIFYzMCBFTkQgQ1RBQicsXG5cbiAgQkVHSU5fQVRPTV9CTE9DSyA9ICdNICBWMzAgQkVHSU4gQVRPTScsXG4gIEVORF9BVE9NX0JMT0NLID0gJ00gIFYzMCBFTkQgQVRPTScsXG5cbiAgQkVHSU5fQk9ORF9CTE9DSyA9ICdNICBWMzAgQkVHSU4gQk9ORCcsXG4gIEVORF9CT05EX0JMT0NLID0gJ00gIFYzMCBFTkQgQk9ORCcsXG4gIEJPTkRfQ09ORklHID0gJyBDRkc9JyxcblxuICBBVE9NX1RZUEVfQ09MID0gNCxcbiAgWF9DT0wgPSA1LFxuICBGSVJTVF9CT05ERURfQVRPTV9DT0wgPSA1LFxuICBCT05EX1RZUEVfQ09MID0gNCxcbiAgRFVNTVlfSEVBREVSID0gYFxuICAgICBEYXRhZ3Jva1xuXG4gIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDAgIDA5OTkgVjMwMDBgLFxuICBCRUdJTl9DVEFCID0gJ00gIFYzMCBCRUdJTiBDVEFCJyxcbiAgQ09VTlRTX0xJTkVfU1RBUlQgPSAnTSAgVjMwIENPVU5UUyAnLFxuICBDT1VOVFNfTElORV9EVU1NWV9FTkQgPSAnIDAgMCAwJyxcbiAgQkVHSU5fQ09MTEVDVElPTl9CTE9DSyA9ICdNICBWMzAgQkVHSU4gQ09MTEVDVElPTicsXG4gIEVORF9DT0xMRUNUSU9OX0JMT0NLID0gJ00gIFYzMCBFTkQgQ09MTEVDVElPTicsXG4gIEVORF9DVEFCID0gJ00gIFYzMCBFTkQgQ1RBQicsXG4gIEVORCA9ICdNICBFTkQnLFxufVxuXG5leHBvcnQgY29uc3QgRU1QVFlfTU9MX1YzMDAwID0gYFxuRW1wdHkgaW5wdXRcblxuICAwICAwICAwICAwICAwICAwICAgICAgICAgICAgOTk5IFYzMDAwXG5NICBFTkRgO1xuIl19","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport $ from 'cash-dom';\n\nimport {category, expect, test, awaitCheck, delay} from '@datagrok-libraries/utils/src/test';\nimport {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {TAGS as helmTAGS} from '../constants';\n\ncategory('renderers', () => {\n test('missedInLib', async () => { await _testMissedInLib(); });\n});\n\nasync function _testMissedInLib() {\n const df: DG.DataFrame = await grok.dapi.files.readCsv('System:AppData/Helm/tests/sample_HELM-missedInLib.csv');\n const helmCol: DG.Column<string> = df.getCol('HELM');\n\n const tv: DG.TableView = grok.shell.addTableView(df);\n await awaitCheck(() => {\n return $(tv.root).find('.d4-grid canvas').length > 0;\n }, 'Table view canvas not found', 100);\n\n expect(helmCol.semType, DG.SEMTYPE.MACROMOLECULE);\n expect(helmCol.getTag(DG.TAGS.UNITS), NOTATION.HELM);\n expect(helmCol.getTag(DG.TAGS.CELL_RENDERER), 'helm');\n\n const cellRendererErrorJson: string = helmCol.getTag(helmTAGS.cellRendererRenderError);\n if (!!cellRendererErrorJson) {\n const cellRendererError: any = JSON.parse(cellRendererErrorJson);\n const err = new Error(cellRendererError['message']);\n err.stack = cellRendererError['stack'];\n throw err;\n }\n}\n","/** Base for Molfile or Mol2 parser/handler */\nexport class ChemicalTableParserBase {\n constructor(fileContent) {\n this.init(fileContent);\n }\n ;\n init(fileContent) {\n this.fileContent = fileContent.replace(/\\r/g, '');\n this._atomCount = undefined;\n this._atomTypes = undefined;\n this._bondCount = undefined;\n this._bondTypes = undefined;\n this.xyzAtomCoordinates = undefined;\n this._pairsOfBondedAtoms = undefined;\n }\n /** Total number of atoms in a molecule */\n get atomCount() {\n if (this._atomCount === undefined)\n this.setAtomAndBondCounts();\n return this._atomCount;\n }\n /** Number of bonds in a molecule */\n get bondCount() {\n if (this._bondCount === undefined)\n this.setAtomAndBondCounts();\n return this._bondCount;\n }\n /** X coordinates of all atoms in a molecule */\n get x() {\n var _a;\n (_a = this.xyzAtomCoordinates) !== null && _a !== void 0 ? _a : (this.xyzAtomCoordinates = this.parseAtomCoordinates());\n return this.xyzAtomCoordinates.x;\n }\n ;\n /** Y coordinates of all atoms in a molecule */\n get y() {\n var _a;\n (_a = this.xyzAtomCoordinates) !== null && _a !== void 0 ? _a : (this.xyzAtomCoordinates = this.parseAtomCoordinates());\n return this.xyzAtomCoordinates.y;\n }\n ;\n /** Z coordinates of all atoms in a molecule */\n get z() {\n var _a;\n (_a = this.xyzAtomCoordinates) !== null && _a !== void 0 ? _a : (this.xyzAtomCoordinates = this.parseAtomCoordinates());\n return this.xyzAtomCoordinates.z;\n }\n ;\n get atomTypes() {\n var _a;\n (_a = this._atomTypes) !== null && _a !== void 0 ? _a : (this._atomTypes = this.parseAtomTypes());\n return this._atomTypes;\n }\n get pairsOfBondedAtoms() {\n var _a;\n (_a = this._pairsOfBondedAtoms) !== null && _a !== void 0 ? _a : (this._pairsOfBondedAtoms = this.parseBondedAtomPairs());\n return this._pairsOfBondedAtoms;\n }\n get bondTypes() {\n var _a;\n (_a = this._bondTypes) !== null && _a !== void 0 ? _a : (this._bondTypes = this.parseBondTypes());\n return this._bondTypes;\n }\n setAtomAndBondCounts() {\n const { atomCount, bondCount } = this.parseAtomAndBondCounts();\n this._atomCount = atomCount;\n this._bondCount = bondCount;\n }\n getNextColumnIdx(idx) {\n // skip non-whitespace, if necessary\n while (!this.isWhitespace(idx))\n ++idx;\n // skip whitespace\n while (this.isWhitespace(idx))\n ++idx;\n return idx;\n }\n shiftIdxToSpecifiedColumn(lineStartIdx, columnNumber) {\n let idx = lineStartIdx;\n const numberOfJumps = this.isWhitespace(idx) ? columnNumber : columnNumber - 1;\n for (let i = 0; i < numberOfJumps; i++)\n idx = this.getNextColumnIdx(idx);\n return idx;\n }\n parseAtomTypes() {\n const atomCount = this.atomCount;\n const atomTypes = new Array(atomCount);\n let idx = this.getAtomBlockIdx();\n for (let i = 0; i < atomCount; i++) {\n idx = this.shiftIdxToAtomType(idx);\n atomTypes[i] = this.parseAtomType(idx);\n idx = this.getNextLineIdx(idx);\n }\n return atomTypes;\n }\n ;\n parseAtomCoordinates() {\n const x = new Float32Array(this.atomCount);\n const y = new Float32Array(this.atomCount);\n const z = new Float32Array(this.atomCount);\n let idx = this.getAtomBlockIdx();\n for (let i = 0; i < this.atomCount; i++) {\n idx = this.shiftIdxToXColumn(idx);\n for (const item of [x, y, z]) {\n item[i] = this.parseFloatValue(idx);\n idx = this.getNextColumnIdx(idx);\n }\n idx = this.getNextLineIdx(idx);\n }\n return { x: x, y: y, z: z };\n }\n parseBondedAtomPairs() {\n const bondedAtomPairs = new Array(this.bondCount);\n let idx = this.getBondBlockIdx();\n for (let i = 0; i < this.bondCount; i++) {\n idx = this.shiftIdxToBondedAtomsPair(idx);\n const pair = new Uint16Array(2);\n pair[0] = this.parseIntValue(idx);\n idx = this.getNextColumnIdx(idx);\n pair[1] = this.parseIntValue(idx);\n bondedAtomPairs[i] = pair;\n idx = this.getNextLineIdx(idx);\n }\n return bondedAtomPairs;\n }\n parseBondTypes() {\n const bondCount = this.bondCount;\n const bondTypes = new Uint16Array(bondCount);\n let idx = this.getBondBlockIdx();\n for (let i = 0; i < bondCount; i++) {\n idx = this.shiftIdxToBondType(idx);\n bondTypes[i] = this.parseIntValue(idx);\n idx = this.getNextLineIdx(idx);\n }\n return bondTypes;\n }\n ;\n isWhitespace(idx) {\n const symbol = this.fileContent[idx];\n return symbol === ' ' || symbol === '\\t';\n }\n getNextLineIdx(idx) {\n if (this.fileContent[idx] !== '\\n')\n return this.fileContent.indexOf('\\n', idx) + 1;\n else\n return idx + 1;\n }\n parseFloatValue(idxOfNumber) {\n return this.parseNumericValue(parseFloat, idxOfNumber);\n }\n parseIntValue(idxOfNumber) {\n return this.parseNumericValue(parseInt, idxOfNumber);\n }\n parseNumericValue(parserFunction, idxOfNumber) {\n let end = idxOfNumber + 1;\n while (!this.isWhitespace(end))\n ++end;\n const value = parserFunction(this.fileContent.substring(idxOfNumber, end));\n return value;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlbWljYWwtdGFibGUtcGFyc2VyLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjaGVtaWNhbC10YWJsZS1wYXJzZXItYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXQSw4Q0FBOEM7QUFDOUMsTUFBTSxPQUFnQix1QkFBdUI7SUFDM0MsWUFBWSxXQUFtQjtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFBQSxDQUFDO0lBVVEsSUFBSSxDQUFDLFdBQW1CO1FBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztRQUNwQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsSUFBSSxTQUFTO1FBQ1gsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVM7WUFDL0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsVUFBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxxQ0FBcUM7SUFDckMsSUFBSSxTQUFTO1FBQ1gsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVM7WUFDL0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsVUFBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsSUFBSSxDQUFDOztRQUNILE1BQUEsSUFBSSxDQUFDLGtC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QVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQXRvbUFuZEJvbmRDb3VudHMgPSB7XG4gIGF0b21Db3VudDogbnVtYmVyLFxuICBib25kQ291bnQ6IG51bWJlclxufVxuXG50eXBlIENvb3JkaW5hdGVBcnJheXMgPSB7XG4gIHg6IEZsb2F0MzJBcnJheSxcbiAgeTogRmxvYXQzMkFycmF5LFxuICB6OiBGbG9hdDMyQXJyYXksXG59XG5cbi8qKiBCYXNlIGZvciBNb2xmaWxlIG9yIE1vbDIgcGFyc2VyL2hhbmRsZXIgKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDaGVtaWNhbFRhYmxlUGFyc2VyQmFzZSB7XG4gIGNvbnN0cnVjdG9yKGZpbGVDb250ZW50OiBzdHJpbmcpIHtcbiAgICB0aGlzLmluaXQoZmlsZUNvbnRlbnQpO1xuICB9O1xuXG4gIHByb3RlY3RlZCBmaWxlQ29udGVudCE6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9hdG9tQ291bnQ/OiBudW1iZXI7XG4gIHByb3RlY3RlZCBfYm9uZENvdW50PzogbnVtYmVyO1xuICBwcm90ZWN0ZWQgeHl6QXRvbUNvb3JkaW5hdGVzPzogQ29vcmRpbmF0ZUFycmF5cztcbiAgcHJvdGVjdGVkIF9hdG9tVHlwZXM/OiBzdHJpbmdbXTtcbiAgcHJvdGVjdGVkIF9wYWlyc09mQm9uZGVkQXRvbXM/OiBVaW50MTZBcnJheVtdO1xuICBwcm90ZWN0ZWQgX2JvbmRUeXBlcz86IFVpbnQxNkFycmF5O1xuXG4gIHByb3RlY3RlZCBpbml0KGZpbGVDb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmZpbGVDb250ZW50ID0gZmlsZUNvbnRlbnQucmVwbGFjZSgvXFxyL2csICcnKTtcbiAgICB0aGlzLl9hdG9tQ291bnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fYXRvbVR5cGVzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2JvbmRDb3VudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9ib25kVHlwZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy54eXpBdG9tQ29vcmRpbmF0ZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcGFpcnNPZkJvbmRlZEF0b21zID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFRvdGFsIG51bWJlciBvZiBhdG9tcyBpbiBhIG1vbGVjdWxlICovXG4gIGdldCBhdG9tQ291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fYXRvbUNvdW50ID09PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLnNldEF0b21BbmRCb25kQ291bnRzKCk7XG4gICAgcmV0dXJuIHRoaXMuX2F0b21Db3VudCE7XG4gIH1cblxuICAvKiogTnVtYmVyIG9mIGJvbmRzIGluIGEgbW9sZWN1bGUgICovXG4gIGdldCBib25kQ291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fYm9uZENvdW50ID09PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLnNldEF0b21BbmRCb25kQ291bnRzKCk7XG4gICAgcmV0dXJuIHRoaXMuX2JvbmRDb3VudCE7XG4gIH1cblxuICAvKiogWCBjb29yZGluYXRlcyBvZiBhbGwgYXRvbXMgaW4gYSBtb2xlY3VsZSAgKi9cbiAgZ2V0IHgoKTogRmxvYXQzMkFycmF5IHtcbiAgICB0aGlzLnh5ekF0b21Db29yZGluYXRlcyA/Pz0gdGhpcy5wYXJzZUF0b21Db29yZGluYXRlcygpO1xuICAgIHJldHVybiB0aGlzLnh5ekF0b21Db29yZGluYXRlcy54O1xuICB9O1xuXG4gIC8qKiBZIGNvb3JkaW5hdGVzIG9mIGFsbCBhdG9tcyBpbiBhIG1vbGVjdWxlICAqL1xuICBnZXQgeSgpOiBGbG9hdDMyQXJyYXkge1xuICAgIHRoaXMueHl6QXRvbUNvb3JkaW5hdGVzID8/PSB0aGlzLnBhcnNlQXRvbUNvb3JkaW5hdGVzKCk7XG4gICAgcmV0dXJuIHRoaXMueHl6QXRvbUNvb3JkaW5hdGVzIS55O1xuICB9O1xuXG4gIC8qKiBaIGNvb3JkaW5hdGVzIG9mIGFsbCBhdG9tcyBpbiBhIG1vbGVjdWxlICAqL1xuICBnZXQgeigpOiBGbG9hdDMyQXJyYXkge1xuICAgIHRoaXMueHl6QXRvbUNvb3JkaW5hdGVzID8/PSB0aGlzLnBhcnNlQXRvbUNvb3JkaW5hdGVzKCk7XG4gICAgcmV0dXJuIHRoaXMueHl6QXRvbUNvb3JkaW5hdGVzIS56O1xuICB9O1xuXG4gIGdldCBhdG9tVHlwZXMoKTogc3RyaW5nW10ge1xuICAgIHRoaXMuX2F0b21UeXBlcyA/Pz0gdGhpcy5wYXJzZUF0b21UeXBlcygpO1xuICAgIHJldHVybiB0aGlzLl9hdG9tVHlwZXM7XG4gIH1cblxuICBnZXQgcGFpcnNPZkJvbmRlZEF0b21zKCk6IFVpbnQxNkFycmF5W10ge1xuICAgIHRoaXMuX3BhaXJzT2ZCb25kZWRBdG9tcyA/Pz0gdGhpcy5wYXJzZUJvbmRlZEF0b21QYWlycygpO1xuICAgIHJldHVybiB0aGlzLl9wYWlyc09mQm9uZGVkQXRvbXMhO1xuICB9XG5cbiAgZ2V0IGJvbmRUeXBlcygpOiBVaW50MTZBcnJheSB7XG4gICAgdGhpcy5fYm9uZFR5cGVzID8/PSB0aGlzLnBhcnNlQm9uZFR5cGVzKCk7XG4gICAgcmV0dXJuIHRoaXMuX2JvbmRUeXBlcyE7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VBdG9tQW5kQm9uZENvdW50cygpOiBBdG9tQW5kQm9uZENvdW50cztcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldENvdW50c0xpbmVJZHgoKTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0QXRvbUJsb2NrSWR4KCk6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldEJvbmRCbG9ja0lkeCgpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzaGlmdElkeFRvWENvbHVtbihsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHNoaWZ0SWR4VG9BdG9tVHlwZShsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHNoaWZ0SWR4VG9Cb25kZWRBdG9tc1BhaXIobGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzaGlmdElkeFRvQm9uZFR5cGUobGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZUF0b21UeXBlKGlkeDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBzZXRBdG9tQW5kQm9uZENvdW50cygpOiB2b2lkIHtcbiAgICBjb25zdCB7YXRvbUNvdW50LCBib25kQ291bnR9ID0gdGhpcy5wYXJzZUF0b21BbmRCb25kQ291bnRzKCk7XG4gICAgdGhpcy5fYXRvbUNvdW50ID0gYXRvbUNvdW50O1xuICAgIHRoaXMuX2JvbmRDb3VudCA9IGJvbmRDb3VudDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXROZXh0Q29sdW1uSWR4KGlkeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBza2lwIG5vbi13aGl0ZXNwYWNlLCBpZiBuZWNlc3NhcnlcbiAgICB3aGlsZSAoIXRoaXMuaXNXaGl0ZXNwYWNlKGlkeCkpXG4gICAgICArK2lkeDtcbiAgICAvLyBza2lwIHdoaXRlc3BhY2VcbiAgICB3aGlsZSAodGhpcy5pc1doaXRlc3BhY2UoaWR4KSlcbiAgICAgICsraWR4O1xuICAgIHJldHVybiBpZHg7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hpZnRJZHhUb1NwZWNpZmllZENvbHVtbihsaW5lU3RhcnRJZHg6IG51bWJlciwgY29sdW1uTnVtYmVyOiBudW1iZXIpIHtcbiAgICBsZXQgaWR4ID0gbGluZVN0YXJ0SWR4O1xuICAgIGNvbnN0IG51bWJlck9mSnVtcHMgPSB0aGlzLmlzV2hpdGVzcGFjZShpZHgpID8gY29sdW1uTnVtYmVyIDogY29sdW1uTnVtYmVyIC0gMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mSnVtcHM7IGkrKylcbiAgICAgIGlkeCA9IHRoaXMuZ2V0TmV4dENvbHVtbklkeChpZHgpO1xuICAgIHJldHVybiBpZHg7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VBdG9tVHlwZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGF0b21Db3VudCA9IHRoaXMuYXRvbUNvdW50O1xuICAgIGNvbnN0IGF0b21UeXBlcyA9IG5ldyBBcnJheTxzdHJpbmc+KGF0b21Db3VudCk7XG4gICAgbGV0IGlkeCA9IHRoaXMuZ2V0QXRvbUJsb2NrSWR4KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdG9tQ291bnQ7IGkrKykge1xuICAgICAgaWR4ID0gdGhpcy5zaGlmdElkeFRvQXRvbVR5cGUoaWR4KTtcbiAgICAgIGF0b21UeXBlc1tpXSA9IHRoaXMucGFyc2VBdG9tVHlwZShpZHgpO1xuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4gYXRvbVR5cGVzO1xuICB9O1xuXG4gIHByb3RlY3RlZCBwYXJzZUF0b21Db29yZGluYXRlcygpOiBDb29yZGluYXRlQXJyYXlzIHtcbiAgICBjb25zdCB4ID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmF0b21Db3VudCk7XG4gICAgY29uc3QgeSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hdG9tQ291bnQpO1xuICAgIGNvbnN0IHogPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXRvbUNvdW50KTtcbiAgICBsZXQgaWR4ID0gdGhpcy5nZXRBdG9tQmxvY2tJZHgoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXRvbUNvdW50OyBpKyspIHtcbiAgICAgIGlkeCA9IHRoaXMuc2hpZnRJZHhUb1hDb2x1bW4oaWR4KTtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBbeCwgeSwgel0pIHtcbiAgICAgICAgaXRlbVtpXSA9IHRoaXMucGFyc2VGbG9hdFZhbHVlKGlkeCk7XG4gICAgICAgIGlkeCA9IHRoaXMuZ2V0TmV4dENvbHVtbklkeChpZHgpO1xuICAgICAgfVxuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4ge3g6IHgsIHk6IHksIHo6IHp9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlQm9uZGVkQXRvbVBhaXJzKCk6IFVpbnQxNkFycmF5W10ge1xuICAgIGNvbnN0IGJvbmRlZEF0b21QYWlycyA9IG5ldyBBcnJheTxVaW50MTZBcnJheT4odGhpcy5ib25kQ291bnQpO1xuICAgIGxldCBpZHggPSB0aGlzLmdldEJvbmRCbG9ja0lkeCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ib25kQ291bnQ7IGkrKykge1xuICAgICAgaWR4ID0gdGhpcy5zaGlmdElkeFRvQm9uZGVkQXRvbXNQYWlyKGlkeCk7XG4gICAgICBjb25zdCBwYWlyID0gbmV3IFVpbnQxNkFycmF5KDIpO1xuICAgICAgcGFpclswXSA9IHRoaXMucGFyc2VJbnRWYWx1ZShpZHgpO1xuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0Q29sdW1uSWR4KGlkeCk7XG4gICAgICBwYWlyWzFdID0gdGhpcy5wYXJzZUludFZhbHVlKGlkeCk7XG4gICAgICBib25kZWRBdG9tUGFpcnNbaV0gPSBwYWlyO1xuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4gYm9uZGVkQXRvbVBhaXJzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlQm9uZFR5cGVzKCk6IFVpbnQxNkFycmF5IHtcbiAgICBjb25zdCBib25kQ291bnQgPSB0aGlzLmJvbmRDb3VudDtcbiAgICBjb25zdCBib25kVHlwZXMgPSBuZXcgVWludDE2QXJyYXkoYm9uZENvdW50KTtcbiAgICBsZXQgaWR4ID0gdGhpcy5nZXRCb25kQmxvY2tJZHgoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJvbmRDb3VudDsgaSsrKSB7XG4gICAgICBpZHggPSB0aGlzLnNoaWZ0SWR4VG9Cb25kVHlwZShpZHgpO1xuICAgICAgYm9uZFR5cGVzW2ldID0gdGhpcy5wYXJzZUludFZhbHVlKGlkeCk7XG4gICAgICBpZHggPSB0aGlzLmdldE5leHRMaW5lSWR4KGlkeCk7XG4gICAgfVxuICAgIHJldHVybiBib25kVHlwZXM7XG4gIH07XG5cbiAgcHJvdGVjdGVkIGlzV2hpdGVzcGFjZShpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN5bWJvbCA9IHRoaXMuZmlsZUNvbnRlbnRbaWR4XTtcbiAgICByZXR1cm4gc3ltYm9sID09PSAnICcgfHwgc3ltYm9sID09PSAnXFx0JztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXROZXh0TGluZUlkeChpZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuZmlsZUNvbnRlbnRbaWR4XSAhPT0gJ1xcbicpXG4gICAgICByZXR1cm4gdGhpcy5maWxlQ29udGVudC5pbmRleE9mKCdcXG4nLCBpZHgpICsgMTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gaWR4ICsgMTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUZsb2F0VmFsdWUoaWR4T2ZOdW1iZXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VOdW1lcmljVmFsdWUocGFyc2VGbG9hdCwgaWR4T2ZOdW1iZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlSW50VmFsdWUoaWR4T2ZOdW1iZXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VOdW1lcmljVmFsdWUocGFyc2VJbnQsIGlkeE9mTnVtYmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZU51bWVyaWNWYWx1ZShcbiAgICBwYXJzZXJGdW5jdGlvbjogKHN0cjogc3RyaW5nKSA9PiBudW1iZXIsXG4gICAgaWR4T2ZOdW1iZXI6IG51bWJlclxuICApOiBudW1iZXIge1xuICAgIGxldCBlbmQgPSBpZHhPZk51bWJlciArIDE7XG4gICAgd2hpbGUgKCF0aGlzLmlzV2hpdGVzcGFjZShlbmQpKVxuICAgICAgKytlbmQ7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZXJGdW5jdGlvbih0aGlzLmZpbGVDb250ZW50LnN1YnN0cmluZyhpZHhPZk51bWJlciwgZW5kKSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4iXX0=","import { ChemicalTableParserBase } from './chemical-table-parser-base';\nimport { ASTERISK, D_QUOTE, L, R, S_QUOTE } from './const';\nimport { isAlpha } from './utils';\nexport class MolfileHandlerBase extends ChemicalTableParserBase {\n constructor(molfile) {\n super(molfile);\n this.init(molfile);\n }\n init(molfile) {\n super.init(molfile);\n }\n parseAtomType(idx) {\n let begin = idx;\n let end = begin;\n if (this.isQuote(begin)) {\n end = this.getNextIdenticalChar(begin);\n begin++;\n }\n else {\n end = this.fileContent.indexOf(' ', end);\n }\n return this.fileContent.substring(begin, end);\n }\n isQuote(idx) {\n const letter = this.fileContent[idx].charCodeAt(0);\n return letter === S_QUOTE || letter === D_QUOTE;\n }\n getNextIdenticalChar(idx) {\n const sym = this.fileContent[idx];\n return sym ? this.fileContent.indexOf(sym, idx + 1) : -1;\n }\n isQuery() {\n return this.isQueryOrFragment((char, idx) => {\n return char === S_QUOTE || char === D_QUOTE ||\n (char === L && !isAlpha(this.fileContent.charCodeAt(idx + 1)));\n });\n }\n ;\n isFragment() {\n return this.isQueryOrFragment((char) => {\n return char === R || char === ASTERISK;\n });\n }\n ;\n isQueryOrFragment(condition) {\n const atomCount = this.atomCount;\n let idx = this.getAtomBlockIdx();\n for (let i = 0; i < atomCount; i++) {\n idx = this.shiftIdxToAtomType(idx);\n const char = this.fileContent.charCodeAt(idx);\n if (condition(char, idx))\n return true;\n idx = this.getNextLineIdx(idx);\n }\n return false;\n }\n ;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS1oYW5kbGVyLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtb2xmaWxlLWhhbmRsZXItYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsdUJBQXVCLEVBQW9CLE1BQU0sOEJBQThCLENBQUM7QUFDeEYsT0FBTyxFQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDekQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUVoQyxNQUFNLE9BQWdCLGtCQUFtQixTQUFRLHVCQUF1QjtJQUN0RSxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRVMsSUFBSSxDQUFDLE9BQWU7UUFDNUIsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBV1MsYUFBYSxDQUFDLEdBQVc7UUFDakMsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdkIsR0FBRyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxLQUFLLEVBQUUsQ0FBQztTQUNUO2FBQU07WUFDTCxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQzFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVTLE9BQU8sQ0FBQyxHQUFXO1FBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sTUFBTSxLQUFLLE9BQU8sSUFBSSxNQUFNLEtBQUssT0FBTyxDQUFDO0lBQ2xELENBQUM7SUFFUyxvQkFBb0IsQ0FBQyxHQUFXO1FBQ3hDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFZLEVBQUUsR0FBVyxFQUFFLEVBQUU7WUFDMUQsT0FBTyxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksS0FBSyxPQUFPO2dCQUMzQyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQSxDQUFDO0lBRUssVUFBVTtRQUNmLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUU7WUFDN0MsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxRQUFRLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUEsQ0FBQztJQUVRLGlCQUFpQixDQUFDLFNBQWlEO1FBQzNFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDakMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEMsR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO2dCQUN0QixPQUFPLElBQUksQ0FBQztZQUNkLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQUEsQ0FBQztDQUtIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGVtaWNhbFRhYmxlUGFyc2VyQmFzZSwgQXRvbUFuZEJvbmRDb3VudHN9IGZyb20gJy4vY2hlbWljYWwtdGFibGUtcGFyc2VyLWJhc2UnO1xuaW1wb3J0IHtBU1RFUklTSywgRF9RVU9URSwgTCwgUiwgU19RVU9URX0gZnJvbSAnLi9jb25zdCc7XG5pbXBvcnQge2lzQWxwaGF9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTW9sZmlsZUhhbmRsZXJCYXNlIGV4dGVuZHMgQ2hlbWljYWxUYWJsZVBhcnNlckJhc2Uge1xuICBjb25zdHJ1Y3Rvcihtb2xmaWxlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtb2xmaWxlKTtcbiAgICB0aGlzLmluaXQobW9sZmlsZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdChtb2xmaWxlOiBzdHJpbmcpIHtcbiAgICBzdXBlci5pbml0KG1vbGZpbGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlQXRvbUFuZEJvbmRDb3VudHMoKTogQXRvbUFuZEJvbmRDb3VudHM7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRDb3VudHNMaW5lSWR4KCk6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldEF0b21CbG9ja0lkeCgpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzaGlmdElkeFRvWENvbHVtbihsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHNoaWZ0SWR4VG9BdG9tVHlwZShsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldEJvbmRCbG9ja0lkeCgpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzaGlmdElkeFRvQm9uZGVkQXRvbXNQYWlyKGxpbmVTdGFydElkeDogbnVtYmVyKTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2hpZnRJZHhUb0JvbmRUeXBlKGxpbmVTdGFydElkeDogbnVtYmVyKTogbnVtYmVyO1xuXG4gIHByb3RlY3RlZCBwYXJzZUF0b21UeXBlKGlkeDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBsZXQgYmVnaW4gPSBpZHg7XG4gICAgbGV0IGVuZCA9IGJlZ2luO1xuICAgIGlmICh0aGlzLmlzUXVvdGUoYmVnaW4pKSB7XG4gICAgICBlbmQgPSB0aGlzLmdldE5leHRJZGVudGljYWxDaGFyKGJlZ2luKTtcbiAgICAgIGJlZ2luKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVuZCA9IHRoaXMuZmlsZUNvbnRlbnQuaW5kZXhPZignICcsIGVuZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbGVDb250ZW50LnN1YnN0cmluZyhiZWdpbiwgZW5kKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1F1b3RlKGlkeDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbGV0dGVyID0gdGhpcy5maWxlQ29udGVudFtpZHhdLmNoYXJDb2RlQXQoMCk7XG4gICAgcmV0dXJuIGxldHRlciA9PT0gU19RVU9URSB8fCBsZXR0ZXIgPT09IERfUVVPVEU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TmV4dElkZW50aWNhbENoYXIoaWR4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHN5bSA9IHRoaXMuZmlsZUNvbnRlbnRbaWR4XTtcbiAgICByZXR1cm4gc3ltID8gdGhpcy5maWxlQ29udGVudC5pbmRleE9mKHN5bSwgaWR4ICsgMSkgOiAtMTtcbiAgfVxuXG4gIHB1YmxpYyBpc1F1ZXJ5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUXVlcnlPckZyYWdtZW50KChjaGFyOiBudW1iZXIsIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICByZXR1cm4gY2hhciA9PT0gU19RVU9URSB8fCBjaGFyID09PSBEX1FVT1RFIHx8XG4gICAgICAoY2hhciA9PT0gTCAmJiAhaXNBbHBoYSh0aGlzLmZpbGVDb250ZW50LmNoYXJDb2RlQXQoaWR4ICsgMSkpKTtcbiAgICB9KTtcbiAgfTtcblxuICBwdWJsaWMgaXNGcmFnbWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1F1ZXJ5T3JGcmFnbWVudCgoY2hhcjogbnVtYmVyKSA9PiB7XG4gICAgICByZXR1cm4gY2hhciA9PT0gUiB8fCBjaGFyID09PSBBU1RFUklTSztcbiAgICB9KTtcbiAgfTtcblxuICBwcm90ZWN0ZWQgaXNRdWVyeU9yRnJhZ21lbnQoY29uZGl0aW9uOiAoY2hhcjogbnVtYmVyLCBpZHg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGF0b21Db3VudCA9IHRoaXMuYXRvbUNvdW50O1xuICAgIGxldCBpZHggPSB0aGlzLmdldEF0b21CbG9ja0lkeCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXRvbUNvdW50OyBpKyspIHtcbiAgICAgIGlkeCA9IHRoaXMuc2hpZnRJZHhUb0F0b21UeXBlKGlkeCk7XG4gICAgICBjb25zdCBjaGFyID0gdGhpcy5maWxlQ29udGVudC5jaGFyQ29kZUF0KGlkeCk7XG4gICAgICBpZiAoY29uZGl0aW9uKGNoYXIsIGlkeCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgYWJzdHJhY3QgZ2V0QXRvbUxpbmVzKCk6IHN0cmluZ1tdO1xuICBhYnN0cmFjdCBnZXRCb25kTGluZXMoKTogc3RyaW5nW107XG4gIGFic3RyYWN0IGdldFJHcm91cElkVG9BdG9taWNJZHhNYXAoKTogTWFwPG51bWJlciwgbnVtYmVyPjtcbn1cbiJdfQ==","export const R = 82;\nexport const L = 76;\nexport const D_QUOTE = 34;\nexport const S_QUOTE = 39;\nexport const ASTERISK = 42;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb25zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEIsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUMxQixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQzFCLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgUiA9IDgyO1xuZXhwb3J0IGNvbnN0IEwgPSA3NjtcbmV4cG9ydCBjb25zdCBEX1FVT1RFID0gMzQ7XG5leHBvcnQgY29uc3QgU19RVU9URSA9IDM5O1xuZXhwb3J0IGNvbnN0IEFTVEVSSVNLID0gNDI7XG4iXX0=","export function isAlpha(charCode) {\n return (charCode > 64 && charCode < 91) ||\n (charCode > 96 && charCode < 123);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFVBQVUsT0FBTyxDQUFDLFFBQWdCO0lBQ3BDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsRUFBRSxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkMsQ0FBQyxRQUFRLEdBQUcsRUFBRSxJQUFJLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGlzQWxwaGEoY2hhckNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoY2hhckNvZGUgPiA2NCAmJiBjaGFyQ29kZSA8IDkxKSB8fFxuICAgICAgICAoY2hhckNvZGUgPiA5NiAmJiBjaGFyQ29kZSA8IDEyMyk7XG59XG4iXX0=","import { R_GROUP_ELEMENT_SYMBOL, V2K_CONST } from '../formats/molfile-const';\nimport { MolfileHandlerBase } from './molfile-handler-base';\nexport class MolfileV2KHandler extends MolfileHandlerBase {\n constructor(molfile) {\n super(molfile);\n }\n getAtomLines() {\n const atomBlockIdx = this.getAtomBlockIdx();\n const end = this.getBondBlockIdx();\n return this.fileContent.substring(atomBlockIdx, end).split('\\n').slice(0, this.atomCount);\n }\n getBondLines() {\n const bondBlockIdx = this.getBondBlockIdx();\n return this.fileContent.substring(bondBlockIdx).split('\\n').slice(0, this.bondCount);\n }\n getRGroupIdToAtomicIdxMap() {\n const map = new Map();\n const lines = this.fileContent.split('\\n');\n const rgroupLines = lines.filter((line) => line.startsWith(V2K_CONST.RGP_LINE_START));\n rgroupLines.forEach((line) => {\n const atomIdxToRgpIdxList = this.getAtomIdxToRgpIdxList(line);\n for (const [key, value] of atomIdxToRgpIdxList) {\n if (map.has(key))\n throw new Error(`R group ${key} is already in the map`);\n map.set(key, value);\n }\n });\n const atomAliasLinesIndices = lines.map((line, idx) => {\n if (line.startsWith(V2K_CONST.ATOM_ALIAS_LINE_START))\n return idx;\n }).filter((idx) => idx !== undefined);\n const atomAliasLines = atomAliasLinesIndices.map((idx) => lines[idx]);\n const atomAliasTextLines = atomAliasLinesIndices.map((idx) => lines[idx + 1]);\n atomAliasLines.forEach((line, idx) => {\n const rgpAtomIdx = parseInt(line.split(/\\s+/)[1]) - 1;\n const rgpId = parseInt(atomAliasTextLines[idx].substring(1));\n if (map.has(rgpId))\n throw new Error(`R group ${rgpId} is already in the map`);\n map.set(rgpId, rgpAtomIdx);\n });\n const rGroupAtomicIndices = this.getRGroupAtomicIndices();\n const unaccounted = rGroupAtomicIndices.filter((idx) => !Array.from(map.values()).includes(idx));\n if (unaccounted.length !== 0)\n throw new Error(`Unaccounted R group indices: ${unaccounted}`);\n return map;\n }\n getAtomIdxToRgpIdxList(rgpLine) {\n const indices = rgpLine.split(/\\s+/).filter((item) => item)\n .slice(3).map((item) => parseInt(item));\n const atomIdxToRgpIdxList = new Array(indices.length / 2);\n for (let i = 0; i < indices.length; i += 2)\n atomIdxToRgpIdxList[i / 2] = [indices[i + 1], indices[i] - 1];\n return atomIdxToRgpIdxList;\n }\n getRGroupAtomicIndices() {\n return this.atomTypes.map((line, idx) => {\n if (line.includes(R_GROUP_ELEMENT_SYMBOL))\n return idx;\n }).filter((idx) => idx !== undefined);\n }\n static isValidMolfile(molfile) {\n return (molfile.indexOf(V2K_CONST.TYPE) !== -1 &&\n molfile.indexOf(V2K_CONST.END) !== -1);\n }\n shiftIdxToAtomType(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, V2K_CONST.ATOM_TYPE_COL);\n }\n getCountsLineIdx() {\n let idx = 0;\n for (let i = 0; i < V2K_CONST.NUM_OF_HEADER_LINES; ++i)\n idx = this.getNextLineIdx(idx);\n return idx;\n }\n getAtomBlockIdx() {\n let idx = this.getCountsLineIdx();\n idx = this.getNextLineIdx(idx);\n return idx;\n }\n shiftIdxToXColumn(lineStartIdx) {\n return this.getNextColumnIdx(lineStartIdx);\n }\n shiftIdxToBondedAtomsPair(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, V2K_CONST.FIRST_BONDED_ATOM_COL);\n }\n shiftIdxToBondType(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, V2K_CONST.BOND_TYPE_COL);\n }\n getBondBlockIdx() {\n let idx = this.getAtomBlockIdx();\n for (let i = 0; i < this.atomCount; i++)\n idx = this.getNextLineIdx(idx);\n return idx;\n }\n parseAtomAndBondCounts() {\n let begin = this.getCountsLineIdx();\n let end = begin + V2K_CONST.NUM_OF_COUNTS_DIGITS;\n const atomCount = parseInt(this.fileContent.substring(begin, end));\n begin = end;\n end += V2K_CONST.NUM_OF_COUNTS_DIGITS;\n const bondCount = parseInt(this.fileContent.substring(begin, end));\n return { atomCount: atomCount, bondCount: bondCount };\n }\n ;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS12MmstaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1vbGZpbGUtdjJrLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHNCQUFzQixFQUFFLFNBQVMsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRTNFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRTFELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxrQkFBa0I7SUFDdkQsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBRUQsWUFBWTtRQUNWLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFRCxZQUFZO1FBQ1YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCx5QkFBeUI7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsS0FBSyxD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QztRQUNqRCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkUsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNaLEdBQUcsSUFBSSxTQUFTLENBQUMsb0JBQW9CLENBQUM7UUFDdEMsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQUEsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtSX0dST1VQX0VMRU1FTlRfU1lNQk9MLCBWMktfQ09OU1R9IGZyb20gJy4uL2Zvcm1hdHMvbW9sZmlsZS1jb25zdCc7XG5pbXBvcnQge0F0b21BbmRCb25kQ291bnRzfSBmcm9tICcuL2NoZW1pY2FsLXRhYmxlLXBhcnNlci1iYXNlJztcbmltcG9ydCB7TW9sZmlsZUhhbmRsZXJCYXNlfSBmcm9tICcuL21vbGZpbGUtaGFuZGxlci1iYXNlJztcblxuZXhwb3J0IGNsYXNzIE1vbGZpbGVWMktIYW5kbGVyIGV4dGVuZHMgTW9sZmlsZUhhbmRsZXJCYXNlIHtcbiAgY29uc3RydWN0b3IobW9sZmlsZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobW9sZmlsZSk7XG4gIH1cblxuICBnZXRBdG9tTGluZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGF0b21CbG9ja0lkeCA9IHRoaXMuZ2V0QXRvbUJsb2NrSWR4KCk7XG4gICAgY29uc3QgZW5kID0gdGhpcy5nZXRCb25kQmxvY2tJZHgoKTtcbiAgICByZXR1cm4gdGhpcy5maWxlQ29udGVudC5zdWJzdHJpbmcoYXRvbUJsb2NrSWR4LCBlbmQpLnNwbGl0KCdcXG4nKS5zbGljZSgwLCB0aGlzLmF0b21Db3VudCk7XG4gIH1cblxuICBnZXRCb25kTGluZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGJvbmRCbG9ja0lkeCA9IHRoaXMuZ2V0Qm9uZEJsb2NrSWR4KCk7XG4gICAgcmV0dXJuIHRoaXMuZmlsZUNvbnRlbnQuc3Vic3RyaW5nKGJvbmRCbG9ja0lkeCkuc3BsaXQoJ1xcbicpLnNsaWNlKDAsIHRoaXMuYm9uZENvdW50KTtcbiAgfVxuXG4gIGdldFJHcm91cElkVG9BdG9taWNJZHhNYXAoKTogTWFwPG51bWJlciwgbnVtYmVyPiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgICBjb25zdCBsaW5lcyA9IHRoaXMuZmlsZUNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IHJncm91cExpbmVzID0gbGluZXMuZmlsdGVyKChsaW5lOiBzdHJpbmcpID0+IGxpbmUuc3RhcnRzV2l0aChWMktfQ09OU1QuUkdQX0xJTkVfU1RBUlQpKTtcbiAgICByZ3JvdXBMaW5lcy5mb3JFYWNoKChsaW5lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGF0b21JZHhUb1JncElkeExpc3QgPSB0aGlzLmdldEF0b21JZHhUb1JncElkeExpc3QobGluZSk7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhdG9tSWR4VG9SZ3BJZHhMaXN0KSB7XG4gICAgICAgIGlmIChtYXAuaGFzKGtleSkpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSIGdyb3VwICR7a2V5fSBpcyBhbHJlYWR5IGluIHRoZSBtYXBgKTtcbiAgICAgICAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGF0b21BbGlhc0xpbmVzSW5kaWNlcyA9IGxpbmVzLm1hcCgobGluZTogc3RyaW5nLCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aChWMktfQ09OU1QuQVRPTV9BTElBU19MSU5FX1NUQVJUKSlcbiAgICAgICAgcmV0dXJuIGlkeDtcbiAgICB9KS5maWx0ZXIoKGlkeCkgPT4gaWR4ICE9PSB1bmRlZmluZWQpIGFzIG51bWJlcltdO1xuICAgIGNvbnN0IGF0b21BbGlhc0xpbmVzID0gYXRvbUFsaWFzTGluZXNJbmRpY2VzLm1hcCgoaWR4KSA9PiBsaW5lc1tpZHhdKTtcbiAgICBjb25zdCBhdG9tQWxpYXNUZXh0TGluZXMgPSBhdG9tQWxpYXNMaW5lc0luZGljZXMubWFwKChpZHgpID0+IGxpbmVzW2lkeCArIDFdKTtcbiAgICBhdG9tQWxpYXNMaW5lcy5mb3JFYWNoKChsaW5lOiBzdHJpbmcsIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCByZ3BBdG9tSWR4ID0gcGFyc2VJbnQobGluZS5zcGxpdCgvXFxzKy8pWzFdKSAtIDE7XG4gICAgICBjb25zdCByZ3BJZCA9IHBhcnNlSW50KGF0b21BbGlhc1RleHRMaW5lc1tpZHhdLnN1YnN0cmluZygxKSk7XG4gICAgICBpZiAobWFwLmhhcyhyZ3BJZCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUiBncm91cCAke3JncElkfSBpcyBhbHJlYWR5IGluIHRoZSBtYXBgKTtcbiAgICAgIG1hcC5zZXQocmdwSWQsIHJncEF0b21JZHgpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgckdyb3VwQXRvbWljSW5kaWNlcyA9IHRoaXMuZ2V0Ukdyb3VwQXRvbWljSW5kaWNlcygpO1xuICAgIGNvbnN0IHVuYWNjb3VudGVkID0gckdyb3VwQXRvbWljSW5kaWNlcy5maWx0ZXIoKGlkeCkgPT4gIUFycmF5LmZyb20obWFwLnZhbHVlcygpKS5pbmNsdWRlcyhpZHgpKTtcbiAgICBpZiAodW5hY2NvdW50ZWQubGVuZ3RoICE9PSAwKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFjY291bnRlZCBSIGdyb3VwIGluZGljZXM6ICR7dW5hY2NvdW50ZWR9YCk7XG5cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdG9tSWR4VG9SZ3BJZHhMaXN0KHJncExpbmU6IHN0cmluZyk6IFtudW1iZXIsIG51bWJlcl1bXSB7XG4gICAgY29uc3QgaW5kaWNlcyA9IHJncExpbmUuc3BsaXQoL1xccysvKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0pXG4gICAgICAuc2xpY2UoMykubWFwKChpdGVtKSA9PiBwYXJzZUludChpdGVtKSk7XG4gICAgY29uc3QgYXRvbUlkeFRvUmdwSWR4TGlzdCA9IG5ldyBBcnJheTxbbnVtYmVyLCBudW1iZXJdPihpbmRpY2VzLmxlbmd0aCAvIDIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMilcbiAgICAgIGF0b21JZHhUb1JncElkeExpc3RbaSAvIDJdID0gW2luZGljZXNbaSArIDFdLCBpbmRpY2VzW2ldIC0gMV07XG4gICAgcmV0dXJuIGF0b21JZHhUb1JncElkeExpc3Q7XG4gIH1cblxuICBwcml2YXRlIGdldFJHcm91cEF0b21pY0luZGljZXMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiB0aGlzLmF0b21UeXBlcy5tYXAoKGxpbmU6IHN0cmluZywgaWR4OiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChsaW5lLmluY2x1ZGVzKFJfR1JPVVBfRUxFTUVOVF9TWU1CT0wpKVxuICAgICAgICByZXR1cm4gaWR4O1xuICAgIH0pLmZpbHRlcigoaWR4KSA9PiBpZHggIT09IHVuZGVmaW5lZCkgYXMgbnVtYmVyW107XG4gIH1cblxuICBzdGF0aWMgaXNWYWxpZE1vbGZpbGUobW9sZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChtb2xmaWxlLmluZGV4T2YoVjJLX0NPTlNULlRZUEUpICE9PSAtMSAmJlxuICAgIG1vbGZpbGUuaW5kZXhPZihWMktfQ09OU1QuRU5EKSAhPT0gLTEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNoaWZ0SWR4VG9BdG9tVHlwZShsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hpZnRJZHhUb1NwZWNpZmllZENvbHVtbihsaW5lU3RhcnRJZHgsIFYyS19DT05TVC5BVE9NX1RZUEVfQ09MKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDb3VudHNMaW5lSWR4KCk6IG51bWJlciB7XG4gICAgbGV0IGlkeCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBWMktfQ09OU1QuTlVNX09GX0hFQURFUl9MSU5FUzsgKytpKVxuICAgICAgaWR4ID0gdGhpcy5nZXROZXh0TGluZUlkeChpZHgpO1xuICAgIHJldHVybiBpZHg7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QXRvbUJsb2NrSWR4KCk6IG51bWJlciB7XG4gICAgbGV0IGlkeCA9IHRoaXMuZ2V0Q291bnRzTGluZUlkeCgpO1xuICAgIGlkeCA9IHRoaXMuZ2V0TmV4dExpbmVJZHgoaWR4KTtcbiAgICByZXR1cm4gaWR4O1xuICB9XG5cbiAgcHJvdGVjdGVkIHNoaWZ0SWR4VG9YQ29sdW1uKGxpbmVTdGFydElkeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXROZXh0Q29sdW1uSWR4KGxpbmVTdGFydElkeCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hpZnRJZHhUb0JvbmRlZEF0b21zUGFpcihsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hpZnRJZHhUb1NwZWNpZmllZENvbHVtbihsaW5lU3RhcnRJZHgsIFYyS19DT05TVC5GSVJTVF9CT05ERURfQVRPTV9DT0wpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNoaWZ0SWR4VG9Cb25kVHlwZShsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hpZnRJZHhUb1NwZWNpZmllZENvbHVtbihsaW5lU3RhcnRJZHgsIFYyS19DT05TVC5CT05EX1RZUEVfQ09MKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRCb25kQmxvY2tJZHgoKTogbnVtYmVyIHtcbiAgICBsZXQgaWR4ID0gdGhpcy5nZXRBdG9tQmxvY2tJZHgoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXRvbUNvdW50OyBpKyspXG4gICAgICBpZHggPSB0aGlzLmdldE5leHRMaW5lSWR4KGlkeCk7XG4gICAgcmV0dXJuIGlkeDtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUF0b21BbmRCb25kQ291bnRzKCk6IEF0b21BbmRCb25kQ291bnRzIHtcbiAgICBsZXQgYmVnaW4gPSB0aGlzLmdldENvdW50c0xpbmVJZHgoKTtcbiAgICBsZXQgZW5kID0gYmVnaW4gKyBWMktfQ09OU1QuTlVNX09GX0NPVU5UU19ESUdJVFM7XG4gICAgY29uc3QgYXRvbUNvdW50ID0gcGFyc2VJbnQodGhpcy5maWxlQ29udGVudC5zdWJzdHJpbmcoYmVnaW4sIGVuZCkpO1xuICAgIGJlZ2luID0gZW5kO1xuICAgIGVuZCArPSBWMktfQ09OU1QuTlVNX09GX0NPVU5UU19ESUdJVFM7XG4gICAgY29uc3QgYm9uZENvdW50ID0gcGFyc2VJbnQodGhpcy5maWxlQ29udGVudC5zdWJzdHJpbmcoYmVnaW4sIGVuZCkpO1xuICAgIHJldHVybiB7YXRvbUNvdW50OiBhdG9tQ291bnQsIGJvbmRDb3VudDogYm9uZENvdW50fTtcbiAgfTtcbn1cbiJdfQ==","import { MolfileHandlerBase } from './molfile-handler-base';\nexport class MolfileV3KHandler extends MolfileHandlerBase {\n constructor(molfile) {\n super(molfile);\n this.init(molfile);\n }\n getAtomLines() {\n const atomBlockIdx = this.getAtomBlockIdx();\n const end = this.getBondBlockIdx();\n return this.fileContent.substring(atomBlockIdx, end).split('\\n').slice(0, this.atomCount);\n }\n getBondLines() {\n const bondBlockIdx = this.getBondBlockIdx();\n return this.fileContent.substring(bondBlockIdx).split('\\n').slice(0, this.bondCount);\n }\n getRGroupIdToAtomicIdxMap() {\n const map = new Map();\n this.getAtomLines().forEach((line, idx) => {\n const rGroupMatches = line.match(/RGROUPS=\\(([\\d\\s]+)\\)/);\n if (rGroupMatches) {\n const rGroupData = rGroupMatches[1].split(/\\s+/).map((rgId) => parseInt(rgId));\n // todo: handle cases when there are more than 2 r groups\n if (rGroupData.length > 2)\n throw new Error(`R group data ${rGroupData} has more than 2 elements`);\n const rGroupId = rGroupData[1];\n if (map.has(rGroupId))\n throw new Error(`R group ${rGroupId} is already in the map`);\n map.set(rGroupId, idx);\n }\n });\n return map;\n }\n shiftIdxToAtomType(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, 4 /* V3K_CONST.ATOM_TYPE_COL */);\n }\n getCountsLineIdx() {\n return this.fileContent.indexOf(\"M V30 COUNTS \" /* V3K_CONST.BEGIN_COUNTS_LINE */);\n }\n getAtomBlockIdx() {\n let idx = this.fileContent.indexOf(\"M V30 BEGIN ATOM\" /* V3K_CONST.BEGIN_ATOM_BLOCK */);\n idx = this.getNextLineIdx(idx);\n return idx;\n }\n shiftIdxToXColumn(lineStartIdx) {\n let idx = this.shiftIdxToAtomType(lineStartIdx);\n if (this.isQuote(idx)) {\n idx = this.getNextIdenticalChar(idx);\n idx = this.getNextColumnIdx(idx);\n return idx;\n }\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, 5 /* V3K_CONST.X_COL */);\n }\n shiftIdxToBondedAtomsPair(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, 5 /* V3K_CONST.FIRST_BONDED_ATOM_COL */);\n }\n shiftIdxToBondType(lineStartIdx) {\n return this.shiftIdxToSpecifiedColumn(lineStartIdx, 4 /* V3K_CONST.BOND_TYPE_COL */);\n }\n getBondBlockIdx() {\n return this.getNextLineIdx(this.fileContent.indexOf(\"M V30 BEGIN BOND\" /* V3K_CONST.BEGIN_BOND_BLOCK */));\n }\n static isValidMolfile(molfile) {\n return (molfile.indexOf(\"V3000\" /* V3K_CONST.TYPE */) !== -1 &&\n molfile.indexOf(\"M END\" /* V3K_CONST.END */) !== -1);\n }\n parseAtomAndBondCounts() {\n // parse atom count\n let begin = this.fileContent.indexOf(\"M V30 COUNTS \" /* V3K_CONST.BEGIN_COUNTS_LINE */) + 14 /* V3K_CONST.COUNTS_SHIFT */;\n let end = this.fileContent.indexOf(' ', begin + 1);\n const numOfAtoms = parseInt(this.fileContent.substring(begin, end));\n // parse bond count\n begin = end + 1;\n end = this.fileContent.indexOf(' ', begin + 1);\n const numOfBonds = parseInt(this.fileContent.substring(begin, end));\n return { atomCount: numOfAtoms, bondCount: numOfBonds };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS12M2staGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1vbGZpbGUtdjNrLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFMUQsTUFBTSxPQUFPLGlCQUFrQixTQUFRLGtCQUFrQjtJQUN2RCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsWUFBWTtRQUNWLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFRCxZQUFZO1FBQ1YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCx5QkFBeUI7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDdEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUN4QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxD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LENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFcEUsbUJBQW1CO1FBQ25CLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVwRSxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLENBQUM7SUFDeEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtWM0tfQ09OU1R9IGZyb20gJy4uL2Zvcm1hdHMvbW9sZmlsZS1jb25zdCc7XG5pbXBvcnQge0F0b21BbmRCb25kQ291bnRzfSBmcm9tICcuL2NoZW1pY2FsLXRhYmxlLXBhcnNlci1iYXNlJztcbmltcG9ydCB7TW9sZmlsZUhhbmRsZXJCYXNlfSBmcm9tICcuL21vbGZpbGUtaGFuZGxlci1iYXNlJztcblxuZXhwb3J0IGNsYXNzIE1vbGZpbGVWM0tIYW5kbGVyIGV4dGVuZHMgTW9sZmlsZUhhbmRsZXJCYXNlIHtcbiAgY29uc3RydWN0b3IobW9sZmlsZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobW9sZmlsZSk7XG4gICAgdGhpcy5pbml0KG1vbGZpbGUpO1xuICB9XG5cbiAgZ2V0QXRvbUxpbmVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBhdG9tQmxvY2tJZHggPSB0aGlzLmdldEF0b21CbG9ja0lkeCgpO1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuZ2V0Qm9uZEJsb2NrSWR4KCk7XG4gICAgcmV0dXJuIHRoaXMuZmlsZUNvbnRlbnQuc3Vic3RyaW5nKGF0b21CbG9ja0lkeCwgZW5kKS5zcGxpdCgnXFxuJykuc2xpY2UoMCwgdGhpcy5hdG9tQ291bnQpO1xuICB9XG5cbiAgZ2V0Qm9uZExpbmVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBib25kQmxvY2tJZHggPSB0aGlzLmdldEJvbmRCbG9ja0lkeCgpO1xuICAgIHJldHVybiB0aGlzLmZpbGVDb250ZW50LnN1YnN0cmluZyhib25kQmxvY2tJZHgpLnNwbGl0KCdcXG4nKS5zbGljZSgwLCB0aGlzLmJvbmRDb3VudCk7XG4gIH1cblxuICBnZXRSR3JvdXBJZFRvQXRvbWljSWR4TWFwKCk6IE1hcDxudW1iZXIsIG51bWJlcj4ge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gICAgdGhpcy5nZXRBdG9tTGluZXMoKS5mb3JFYWNoKChsaW5lLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IHJHcm91cE1hdGNoZXMgPSBsaW5lLm1hdGNoKC9SR1JPVVBTPVxcKChbXFxkXFxzXSspXFwpLyk7XG5cbiAgICAgIGlmIChyR3JvdXBNYXRjaGVzKSB7XG4gICAgICAgIGNvbnN0IHJHcm91cERhdGEgPSByR3JvdXBNYXRjaGVzWzFdLnNwbGl0KC9cXHMrLykubWFwKChyZ0lkKSA9PiBwYXJzZUludChyZ0lkKSk7XG4gICAgICAgIC8vIHRvZG86IGhhbmRsZSBjYXNlcyB3aGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gMiByIGdyb3Vwc1xuICAgICAgICBpZiAockdyb3VwRGF0YS5sZW5ndGggPiAyKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUiBncm91cCBkYXRhICR7ckdyb3VwRGF0YX0gaGFzIG1vcmUgdGhhbiAyIGVsZW1lbnRzYCk7XG4gICAgICAgIGNvbnN0IHJHcm91cElkID0gckdyb3VwRGF0YVsxXTtcbiAgICAgICAgaWYgKG1hcC5oYXMockdyb3VwSWQpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUiBncm91cCAke3JHcm91cElkfSBpcyBhbHJlYWR5IGluIHRoZSBtYXBgKTtcblxuICAgICAgICBtYXAuc2V0KHJHcm91cElkLCBpZHgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaGlmdElkeFRvQXRvbVR5cGUobGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNoaWZ0SWR4VG9TcGVjaWZpZWRDb2x1bW4obGluZVN0YXJ0SWR4LCBWM0tfQ09OU1QuQVRPTV9UWVBFX0NPTCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q291bnRzTGluZUlkeCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmZpbGVDb250ZW50LmluZGV4T2YoVjNLX0NPTlNULkJFR0lOX0NPVU5UU19MSU5FKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBdG9tQmxvY2tJZHgoKTogbnVtYmVyIHtcbiAgICBsZXQgaWR4ID0gdGhpcy5maWxlQ29udGVudC5pbmRleE9mKFYzS19DT05TVC5CRUdJTl9BVE9NX0JMT0NLKTtcbiAgICBpZHggPSB0aGlzLmdldE5leHRMaW5lSWR4KGlkeCk7XG4gICAgcmV0dXJuIGlkeDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaGlmdElkeFRvWENvbHVtbihsaW5lU3RhcnRJZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IGlkeCA9IHRoaXMuc2hpZnRJZHhUb0F0b21UeXBlKGxpbmVTdGFydElkeCk7XG4gICAgaWYgKHRoaXMuaXNRdW90ZShpZHgpKSB7XG4gICAgICBpZHggPSB0aGlzLmdldE5leHRJZGVudGljYWxDaGFyKGlkeCk7XG4gICAgICBpZHggPSB0aGlzLmdldE5leHRDb2x1bW5JZHgoaWR4KTtcbiAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNoaWZ0SWR4VG9TcGVjaWZpZWRDb2x1bW4obGluZVN0YXJ0SWR4LCBWM0tfQ09OU1QuWF9DT0wpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNoaWZ0SWR4VG9Cb25kZWRBdG9tc1BhaXIobGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNoaWZ0SWR4VG9TcGVjaWZpZWRDb2x1bW4obGluZVN0YXJ0SWR4LCBWM0tfQ09OU1QuRklSU1RfQk9OREVEX0FUT01fQ09MKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaGlmdElkeFRvQm9uZFR5cGUobGluZVN0YXJ0SWR4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNoaWZ0SWR4VG9TcGVjaWZpZWRDb2x1bW4obGluZVN0YXJ0SWR4LCBWM0tfQ09OU1QuQk9ORF9UWVBFX0NPTCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Qm9uZEJsb2NrSWR4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmV4dExpbmVJZHgodGhpcy5maWxlQ29udGVudC5pbmRleE9mKFYzS19DT05TVC5CRUdJTl9CT05EX0JMT0NLKSk7XG4gIH1cblxuICBzdGF0aWMgaXNWYWxpZE1vbGZpbGUobW9sZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChtb2xmaWxlLmluZGV4T2YoVjNLX0NPTlNULlRZUEUpICE9PSAtMSAmJlxuICAgIG1vbGZpbGUuaW5kZXhPZihWM0tfQ09OU1QuRU5EKSAhPT0gLTEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlQXRvbUFuZEJvbmRDb3VudHMoKTogQXRvbUFuZEJvbmRDb3VudHMge1xuICAgIC8vIHBhcnNlIGF0b20gY291bnRcbiAgICBsZXQgYmVnaW4gPSB0aGlzLmZpbGVDb250ZW50LmluZGV4T2YoVjNLX0NPTlNULkJFR0lOX0NPVU5UU19MSU5FKSArIFYzS19DT05TVC5DT1VOVFNfU0hJRlQ7XG4gICAgbGV0IGVuZCA9IHRoaXMuZmlsZUNvbnRlbnQuaW5kZXhPZignICcsIGJlZ2luICsgMSk7XG4gICAgY29uc3QgbnVtT2ZBdG9tcyA9IHBhcnNlSW50KHRoaXMuZmlsZUNvbnRlbnQuc3Vic3RyaW5nKGJlZ2luLCBlbmQpKTtcblxuICAgIC8vIHBhcnNlIGJvbmQgY291bnRcbiAgICBiZWdpbiA9IGVuZCArIDE7XG4gICAgZW5kID0gdGhpcy5maWxlQ29udGVudC5pbmRleE9mKCcgJywgYmVnaW4gKyAxKTtcbiAgICBjb25zdCBudW1PZkJvbmRzID0gcGFyc2VJbnQodGhpcy5maWxlQ29udGVudC5zdWJzdHJpbmcoYmVnaW4sIGVuZCkpO1xuXG4gICAgcmV0dXJuIHthdG9tQ291bnQ6IG51bU9mQXRvbXMsIGJvbmRDb3VudDogbnVtT2ZCb25kc307XG4gIH1cbn1cbiJdfQ==","import { MolfileV2KHandler } from './molfile-v2k-handler';\nimport { MolfileV3KHandler } from './molfile-v3k-handler';\n/** Defines the proper handler based on the molfile type */\nexport class MolfileHandler {\n constructor() { }\n static getInstance(molfile) {\n if (MolfileHandler.isMolfileV2K(molfile))\n return new MolfileV2KHandler(molfile);\n else if (MolfileHandler.isMolfileV3K(molfile))\n return new MolfileV3KHandler(molfile);\n else\n throw new Error('Malformed molfile');\n }\n static isMolfileV2K(molfile) {\n return MolfileV2KHandler.isValidMolfile(molfile);\n }\n static isMolfileV3K(molfile) {\n return MolfileV3KHandler.isValidMolfile(molfile);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9sZmlsZS1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibW9sZmlsZS1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELDREQUE0RDtBQUM1RCxNQUFNLE9BQU8sY0FBYztJQUN6QixnQkFBdUIsQ0FBQztJQUV4QixNQUFNLENBQUMsV0FBVyxDQUFDLE9BQWU7UUFDaEMsSUFBSSxjQUFjLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUN0QyxPQUFPLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDbkMsSUFBSSxjQUFjLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUMzQyxPQUFPLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7O1lBRXRDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFlO1FBQ2pDLE9BQU8saUJBQWlCLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQWU7UUFDakMsT0FBTyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNb2xmaWxlSGFuZGxlckJhc2V9IGZyb20gJy4vbW9sZmlsZS1oYW5kbGVyLWJhc2UnO1xuaW1wb3J0IHtNb2xmaWxlVjJLSGFuZGxlcn0gZnJvbSAnLi9tb2xmaWxlLXYyay1oYW5kbGVyJztcbmltcG9ydCB7TW9sZmlsZVYzS0hhbmRsZXJ9IGZyb20gJy4vbW9sZmlsZS12M2staGFuZGxlcic7XG5cbi8qKiBEZWZpbmVzIHRoZSBwcm9wZXIgaGFuZGxlciBiYXNlZCBvbiB0aGUgbW9sZmlsZSB0eXBlICAqL1xuZXhwb3J0IGNsYXNzIE1vbGZpbGVIYW5kbGVyIHtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhdGljIGdldEluc3RhbmNlKG1vbGZpbGU6IHN0cmluZyk6IE1vbGZpbGVIYW5kbGVyQmFzZSB7XG4gICAgaWYgKE1vbGZpbGVIYW5kbGVyLmlzTW9sZmlsZVYySyhtb2xmaWxlKSlcbiAgICAgIHJldHVybiBuZXcgTW9sZmlsZVYyS0hhbmRsZXIobW9sZmlsZSk7XG4gICAgZWxzZSBpZiAoTW9sZmlsZUhhbmRsZXIuaXNNb2xmaWxlVjNLKG1vbGZpbGUpKVxuICAgICAgcmV0dXJuIG5ldyBNb2xmaWxlVjNLSGFuZGxlcihtb2xmaWxlKTtcbiAgICBlbHNlXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hbGZvcm1lZCBtb2xmaWxlJyk7XG4gIH1cblxuICBzdGF0aWMgaXNNb2xmaWxlVjJLKG1vbGZpbGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBNb2xmaWxlVjJLSGFuZGxlci5pc1ZhbGlkTW9sZmlsZShtb2xmaWxlKTtcbiAgfVxuXG4gIHN0YXRpYyBpc01vbGZpbGVWM0sobW9sZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE1vbGZpbGVWM0tIYW5kbGVyLmlzVmFsaWRNb2xmaWxlKG1vbGZpbGUpO1xuICB9XG59XG4iXX0=","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {delay, testEvent} from '@datagrok-libraries/utils/src/test';\n\nexport async function awaitGrid(grid: DG.Grid, timeout: number = 5000): Promise<void> {\n await delay(100);\n await testEvent(grid.onAfterDrawContent, () => {},\n () => { grid.invalidate(); }, timeout);\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 {after, before, category, delay, expect, test, expectArray, testEvent} from '@datagrok-libraries/utils/src/test';\nimport {\n getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests\n} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';\nimport {MolfileHandler} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler';\nimport {MolfileHandlerBase} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler-base';\n\nimport {awaitGrid} from './utils';\n\nimport {_package} from '../package-test';\n\ncategory('getMolfiles', () => {\n let monomerLibHelper: IMonomerLibHelper;\n let userLibSettings: UserLibSettings;\n\n before(async () => {\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = await getUserLibSettings();\n await setUserLibSettingsForTests();\n await monomerLibHelper.loadLibraries(true);\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadLibraries(true);\n });\n\n const csv = `Helm, atoms, bonds\nPEPTIDE1{meI.hHis.Aca.N.T.dE.Thr_PO3H2.Aca.D-Tyr_Et.Tyr_ab-dehydroMe.dV}$$$$,11,10\nPEPTIDE1{meI.hHis.Aca.Cys_SEt.T.dK.Thr_PO3H2.Aca.Tyr_PO3H2.D-Chg.dV}$$$$,11,10\nPEPTIDE1{Lys_Boc.hHis.Aca.Cys_SEt.T.dK.Thr_PO3H2.Aca.Tyr_PO3H2}$$$$,9,8`;\n\n test('linear1', async () => {\n const df = DG.DataFrame.fromCsv(csv);\n const helmCol = df.getCol('Helm');\n const view = grok.shell.addTableView(df);\n\n _package.logger.debug('Helm/getMolfiles/linear1, grid awaiting 1');\n await awaitGrid(view.grid, 5000);\n _package.logger.debug('Helm/getMolfiles/linear1, grid awaited 1');\n\n const resCol: DG.Column<string> = await grok.functions.call('Helm:getMolfiles', {col: helmCol});\n expect(resCol.length, helmCol.length);\n const resMolfileList: MolfileHandlerBase[] = resCol.toList().map((molfile) => MolfileHandler.getInstance(molfile));\n expectArray(resMolfileList.map((mf) => mf.atomCount), df.getCol('atoms').toList());\n expectArray(resMolfileList.map((mf) => mf.bondCount), df.getCol('bonds').toList());\n\n _package.logger.debug('Helm/getMolfiles/linear1, grid awaiting 2');\n await awaitGrid(view.grid, 5000);\n _package.logger.debug('Helm/getMolfiles/linear1, grid awaited 2');\n });\n});\n","import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\n\nimport {after, before, category, expect, expectObject, test} from '@datagrok-libraries/utils/src/test';\nimport {ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';\nimport {getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';\nimport {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';\n\nimport {getPropertiesDict} from '../widgets/properties-widget';\n\nconst enum MolProps {\n formula = 'formula',\n mw = 'molecular weight',\n extinctCoef = 'extinction coefficient',\n}\n\nconst enum Tests {\n helm = 'Helm',\n separator = 'separator',\n separator2 = 'separator2', // with a few gaps in a row\n separatorGaps = 'separator-gaps',\n fastaPt = 'fasta-PT',\n fastaPtMsa = 'fasta-PT-MSA',\n fastaDna = 'fasta-DNA',\n}\n\nconst TestsData: {\n [testName: string]: { seq: string, units: NOTATION, separator?: string, alphabet?: ALPHABET, res: {} }\n} = {\n [Tests.helm]: {\n seq: 'PEPTIDE1{I.H.A.C.T.[Thr_PO3H2].[Aca].[D-Tyr_Et]}|PEPTIDE2{E.A.[meG]}$PEPTIDE1,PEPTIDE2,4:R3-1:R1$$$V2.0',\n units: NOTATION.HELM,\n res: {[MolProps.formula]: 'C58H94N13O21SP', [MolProps.mw]: 1372.48, [MolProps.extinctCoef]: 1.55}\n },\n [Tests.separator]: {\n seq: 'I/H/A/C/T/Thr_PO3H2/Aca/D-Tyr_Et',\n units: NOTATION.SEPARATOR, separator: '/', alphabet: ALPHABET.UN,\n res: {[MolProps.formula]: 'C47H77N10O15SP', [MolProps.mw]: 1085.21, [MolProps.extinctCoef]: 1.55}\n },\n [Tests.separator2]: {\n seq: 'meI/hHis/Aca/N/T/dK/Thr_PO3H2/Aca/D-Tyr_Et/Aze/dV/E/N////Phe_4Me',\n units: NOTATION.SEPARATOR, separator: '/', alphabet: ALPHABET.UN,\n res: {[MolProps.formula]: 'C91H146N19O25P', [MolProps.mw]: 1937.21, [MolProps.extinctCoef]: 1.49},\n },\n [Tests.separatorGaps]: {\n seq: 'I/H/A//T/Thr_PO3H2/Aca/D-Tyr_Et',\n units: NOTATION.SEPARATOR, separator: '/', alphabet: ALPHABET.UN,\n res: {[MolProps.formula]: 'C44H72N9O14P', [MolProps.mw]: 982.07, [MolProps.extinctCoef]: 1.49},\n },\n [Tests.fastaPt]: {\n seq: 'IHACTTAY',\n units: NOTATION.FASTA, alphabet: ALPHABET.PT,\n res: {[MolProps.formula]: 'C38H58N10O12S', [MolProps.mw]: 878.99, [MolProps.extinctCoef]: 1.55}\n },\n [Tests.fastaDna]: {\n seq: 'ACGTATTCC',\n units: NOTATION.FASTA, alphabet: ALPHABET.DNA,\n res: {[MolProps.formula]: 'C87H113N30O56P9', [MolProps.mw]: 2753.76, [MolProps.extinctCoef]: 91.74}\n }\n};\n\ncategory('properties-widget', () => {\n let monomerLibHelper: IMonomerLibHelper;\n /** Backup actual user's monomer libraries settings */\n let userLibSettings: any = null;\n\n before(async () => {\n monomerLibHelper = await getMonomerLibHelper();\n userLibSettings = getUserLibSettings();\n await setUserLibSettingsForTests();\n await monomerLibHelper.loadLibraries(true); // load default libraries\n });\n\n after(async () => {\n await setUserLibSettings(userLibSettings);\n await monomerLibHelper.loadLibraries(true); // load user settings libraries\n });\n\n for (const [testName, testData] of Object.entries(TestsData)) {\n test(testName, async () => {\n testPropertiesDict(testData.seq, testData.units, testData.separator, testData.alphabet, testData.res);\n });\n }\n});\n\nfunction testPropertiesDict(\n seq: string, units: NOTATION, separator: string | undefined, alphabet: ALPHABET | undefined, expPropDict: {}\n) {\n const col = DG.Column.fromList(DG.COLUMN_TYPE.STRING, 'seq', [seq]);\n col.semType = DG.SEMTYPE.MACROMOLECULE;\n col.setTag(DG.TAGS.UNITS, units);\n if (separator) col.setTag(bioTAGS.separator, separator);\n if (alphabet) col.setTag(bioTAGS.alphabet, alphabet);\n const uh = SeqHandler.forColumn(col);\n const actPropDict = getPropertiesDict(seq, uh);\n expectObject(actPropDict, expPropDict);\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 {after, before, category, delay, expect, test, expectArray} from '@datagrok-libraries/utils/src/test';\n\nimport {getAllParts} from '../helm-monomer-placer';\n\ncategory('getAllParts', () => {\n /** All parts of Helm string are required for fallback rendering. */\n\n const tests: { [testName: string]: { tgt: string[]; seq: string } } = {\n 'peptideSimpleSingleChar': {\n seq: 'PEPTIDE1{L.V.A}$$$$',\n tgt: ['PEPTIDE1{', 'L', '.', 'V', '.', 'A', '}$$$$'],\n },\n 'peptideSimpleMultiChar': {\n seq: 'PEPTIDE1{[Ac].V.A}$$$$',\n /* doubt joining square brackets to separator or notation is correct */\n tgt: ['PEPTIDE1{[', 'Ac', '].', 'V', '.', 'A', '}$$$$'],\n }\n };\n\n for (const [testName, testData] of Object.entries(tests)) {\n test(`${testName}`, async () => {\n await _testAllParts(testData.seq, testData.tgt);\n });\n }\n});\n\nasync function _testAllParts(seq: string | null, tgt: string[]): Promise<void> {\n const res: string[] = getAllParts(seq);\n expectArray(res, tgt);\n}\n","import * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\n\nimport {runTests, tests, TestContext} from '@datagrok-libraries/utils/src/test';\n\nimport './tests/helm-tests.ts';\nimport './tests/findMonomers-tests';\nimport './tests/renderers-tests';\nimport './tests/get-molfiles';\nimport './tests/properties-widget-tests';\nimport './tests/get-all-parts-tests';\n\nexport const _package = new DG.Package();\nexport {tests};\n\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":["StringMetricsNames","VectorMetricsNames","BitArrayMetricsNames","IntArrayMetricsNames","DistanceMetricsSubjects","NumberMetricsNames","NumberArrayMetricsNames","constructor","arg","defaultValue","this","_length","_version","_updateLevel","_selectedCount","_selectedCountVersion","_selectedIndexesVersion","_versionedName","_versionedNameVersion","SHRINK_THRESHOLD","length","buff","_createBuffer","i","_data","Uint32Array","Error","getRawData","assureGoez","num","argName","assureInRange","value","min","max","copy","src","dst","count","copyFrom","other","lengthInInts","buffer","data","version","incrementVersion","notify","Math","floor","versionedName","name","self","setLength","nIntsNeeded","newData","fill","fromAnd","set1","set2","temp","len","fromValues","values","fromSeq","flag","setBit","fromString","s","charAt","fromUint32Array","fromBytes","bytes","num1","num2","toString","countBits","equals","getBit","clone","bitArray","from","init","setAll","invert","flags","setIndexes","indexes","clear","setFast","everyIndex","index","anyIndex","setWhere","check","allowClear","getRange","to","arr","push","getRangeAsList","setRange","start","end","setTrue","setFalse","setRandom","n","k","random","and","andNot","notAnd","not","or","xor","insertAt","pos","oldlength","removeAt","contains","removeByMask","mask","dstIdx","srcIdx","findNext","bit","trueCount","falseCount","_onBitCount","remainingBits","countWhere","result","andWithCountBits","second","allTrue","allFalse","anyTrue","anyFalse","unusedBits","numInts","j","p","_firstOnBit","findPrev","_lastOnBit","Int8Array","async","getMonomerLibHelper","funcList","find","package","prepare","call","getOutputParamValue","Tanimoto","Dice","Asymmetric","BraunBlanquet","Cosine","Kulczynski","McConnaughey","RogotGoldberg","Russel","Sokal","Hamming","Euclidean","HAMMING","LEVENSHTEIN","MONOMER_CHEMICAL_DISTANCE","NEEDLEMANN_WUNSCH","PHOSPHATE_SYMBOL","HELM_WRAPPERS_REGEXP","RegExp","NOTATION","positionSeparator","monomerRe","Alphabets","fasta","peptide","Set","dna","rna","candidateAlphabets","GAP_SYMBOL","CandidateType","alphabet","cutoff","CandidateSimType","candidate","freq","similarity","super","Float32Array","vectorLength","v","sqrSum","sqrt","makePalette","dt","simplified","PaletteType","palette","forEach","cp","objList","colour","obj","ind","colourPalette","_palette","get","m","undefinedColor","Lesk","lesk","GrokGroups","grokGroups","RasMol","rasMol","resM","aaSynonyms","Aminoacids","getPalette","scheme","getInnerOuter","c","isInner","inner","outer","char","isNaN","parseInt","getColorAAPivot","monomer","chemPaletteInstance","outerMonomer","innerMonomer","slice","amino","toUpperCase","substring","AAFullNames","toLowerCase","SemType","SemTypeMultipleAlignment","Names","AASmiles","AASmilesTruncated","Nucleotides","StringUtils","hashCode","hash","charCodeAt","UnknownSeqPalette","UnknownColorPalette","buildPalette","concat","Object","pI","color","dgColor","fromHtml","g","r","b","distToBlack","pow","toRgb","correctColor","StringListSeqSplitted","mList","canonicals","originals","isGap","posIdx","getOriginal","gapOriginalMonomer","getCanonical","FastaSimpleSeqSplitted","seqS","FASTA","splitterAsFasta","seq","mmList","matchAll","map","ma","toArray","splitterAsFastaSimple","getSplitterWithSeparator","separator","limit","undefined","replaceAll","split","SEPARATOR","helmRe","helmPp1Re","splitterAsHelm","lastIndex","ea","exec","inSeq","mm","pp1M","HELM","longMonomerPartRe","monomerToShort","maxLengthOfMonomer","shortAminoMatch","match","needAddDots","shortAmino","detectAlphabet","candidates","gapSymbol","candidatesSims","sim","keys","delete","freqA","alphabetA","has","freqV","alphabetV","v1","v2","prod","vectorDotProduct","getAlphabetSimilarity","alphabetName","maxSim","cs","SeqTemps","seqHandler","notationProvider","GapOriginals","SeqHandler","col","_splitter","cached","_splitted","columnVersion","_stats","_maxLength","_posList","_joiner","type","STRING","_column","units","getTag","UNITS","_units","_notation","getNotation","_defaultGapOriginal","isFasta","isHelm","column","tags","setUnitsToFastaColumn","isSeparator","setUnitsToSeparatorColumn","setUnitsToHelmColumn","setTag","includes","uh","semType","MACROMOLECULE","setTags","stats","some","aligned","sameLength","alphabetSize","alphabetIsMultichar","notation","defaultGapOriginal","helmCompatible","getAlphabetSize","alphabetSizeStr","console","warn","getAlphabetIsMultichar","getSplitted","rowIdx","Array","resSS","deref","splitter","WeakRef","firstLength","colLen","mSeq","cm","maxLength","take","posList","posListTxt","trim","isRna","isDna","isPeptide","isMsa","isHelmCompatible","om","startsWith","getHelmWrappers","getNewColumn","tgtNotation","tgtSeparator","colName","newColName","dataFrame","columns","getUnusedName","newColumn","fromList","CELL_RENDERER","srcAligned","srcAlphabet","srcAlphabetSize","srcAlphabetIsMultichar","getNewColumnFromList","seqList","templateCol","forColumn","targetNotation","unitsStringIsValid","getNewColumnFromParams","getSplitter","getDistanceFunctionName","getDistanceFunction","checkHelmCompatibility","peptides","getBioLib","getMonomerSymbolsByType","peptidesSet","catIdxSet","rowCount","colRawData","catI","add","monomers","toFasta","toSeparator","toHelm","convertHelmToFastaSeparator","srcSeq","tgtGapOriginal","isNucleotide","helmItemsArray","tgtMonomersArray","replace","join","convert","joiner","getJoiner","srcSS","getRegion","startIdx","endIdx","regCol","startIdxVal","endIdxVal","regLength","gapOM","rowI","regOMList","regJPos","seqJPos","getRegionOfPositionNames","str","srcPosList","regPosList","srcJPos","srcPositionNamesStr","srcPositionLabelsStr","opts","res","srcSh","joinToFasta","joinToSeparator","isDnaOrRna","wrappers","joinToHelm","getConverter","tgtUnits","convertToFasta","convertToHelm","convertToSeparator","resMList","srcUhSplitter","splitterAsHelmNucl","srcMList","tgtMList","filter","prefix","leftWrapper","rightWrapper","postfix","resOMList","hamming","args","distanceF","scoringMatrix","alphabetIndexes","a","matrix","minCharCode","scorringArray","entries","key","matrixRow","key2","index2","getDistanceF","threshold","seq1","seq2","diff","s1l","s2l","thresholdLimit","abs","peq","defaultArgs","gapOpen","gapExtend","MmDistanceFunctionsNames","mmDistanceFunctions","tmp","lst","pv","mv","sc","eq","xv","myers_32","mhc","phc","hsize","ceil","vsize","vlen","pb","mb","xh","ph","mh","score","myers_x","distance","charCodeArray","Uint16Array","verticalGaps","horizontalGaps","prevRow","currRow","diagonal","top","left","maxScore","errorToConsole","err","_a","String","stack","message","exports","__esModule","digestLength","blockSize","K","hashBlocks","w","d","e","f","h","u","t1","t2","Hash","state","Int32Array","Uint8Array","bufferLength","bytesHashed","finished","reset","prototype","clean","update","dataLength","dataPos","finish","out","bitLenHi","bitLenLo","padLength","digest","_saveState","_restoreState","HMAC","pad","istate","ostate","hmac","fillBuffer","info","counter","hkdfSalt","hkdf","salt","okm","hmac_","bufpos","pbkdf2","password","iterations","dkLen","prf","ctr","t","dk","factory","sha256","module","HelmMonomerPlacer","gridCol","monomerCharWidth","leftPadding","monomerTextSizeMap","subs","grid","onDataChanged","subscribe","error","onViewRemoved","view","id","destroy","monomerLib","getMonomerLib","onChanged","monomerLibOnChanged","bind","_allPartsList","_lengthsList","_editorList","sub","unsubscribe","skipCell","getCellAllPartsLengths","allParts","lengths","getCellMonomerLengthsForSeq","sumLengths","getAllParts","part","partI","partWidth","getMonomer","polymerType","symbol","getPolymerTypes","_value","invalidate","setEditor","tableRowIndex","editor","getEditor","monomerList","TAGS","DrawStyle","helmGapStartRe","helmGapIntRe","helmGapEndRe","removeGapsFromHelm","srcHelm","getParts","subParts","indexOfMonomer","indexOf","helmBeforeMonomer","parseHelm","scil","Utils","isNullOrEmpty","seqs","detachAnnotation","ss","closingIndex","findClosing","element","residue","endsWith","openingIndex","findOpening","firstPiece","thirdPiece","lastIndexOf","elements","el","findMonomers","monomerSymbolList","types","org","helm","webeditor","monomerTypeList","monomerNames","Monomers","getMonomerSet","val","open","close","sep","ret","frag","parentheses","bracket","braces","quote","c2","_detachAppendix","tag","repeat","endswith","unescape","getPropertiesDict","sh","helmString","helmString2","host","style","width","height","document","documentElement","appendChild","JSDraw2","Editor","viewonly","setHelm","formula","getFormula","molWeight","round","getMolWeight","coef","getExtinctionCoefficient","empty","remove","$","DG","grok","ui","wu","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","definition","o","defineProperty","enumerable","prop","hasOwnProperty","Symbol","toStringTag","testData","fromCsv","BYTE_ARRAY","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","done","then","apply","STANDART_TIMEOUT","BENCHMARK_TIMEOUT","stdLog","log","stdInfo","stdWarn","stdError","tests","autoTestsCatName","demoCatName","detectorsCatName","coreCatName","wasRegistered","currentCategory","assure","notNull","TestContext","catchUnhandled","report","Test","category","test","options","timeout","expect","actual","expected","expectFloat","tolerance","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","NaN","areEqual","expectObject","expectedKey","expectedValue","actualValue","expectArray","isFinite","actualLength","expectedLength","tests_","before","after","addNamespace","nqName","getResult","x","translateStackTrace","execTest","predicate","logs","categoryTimeout","packageName","verbose","_b","_c","_d","_e","_f","skip","skipReason","Date","now","success","ms","skipped","timeout_","isInBenchmark","isAggregated","sum","df","rows","removeWhere","toCsv","params","reduce","acc","assign","usage","delay","setTimeout","func","testTimeout","timeoutPromise","_","race","clearTimeout","fromColumns","fromStrings","complexMonomersExpected","complexTestNames","expectedResults","helmStrings","idx","monomerSet","monomerArray","JSON","stringify","monomersArray","sort","LIB_STORAGE_NAME","LIB_SETTINGS_FOR_TESTS","explicit","exclude","userLibSettingsPromise","getUserLibSettings","resStr","userDataStorage","getValue","parse","debug","setUserLibSettings","postValue","setUserLibSettingsForTests","monomerLibHelper","userLibSettings","loadLibraries","tgt","testName","_testFindMonomers","testHelmValue","tgtMissedSet","V2K_CONST","files","readCsv","helmCol","getCol","tv","addTableView","checkHandler","wait","interval","clearInterval","intervalId","setInterval","awaitCheck","root","cellRendererErrorJson","cellRendererError","_testMissedInLib","ChemicalTableParserBase","fileContent","_atomCount","_atomTypes","_bondCount","_bondTypes","xyzAtomCoordinates","_pairsOfBondedAtoms","atomCount","setAtomAndBondCounts","bondCount","parseAtomCoordinates","y","z","atomTypes","parseAtomTypes","pairsOfBondedAtoms","parseBondedAtomPairs","bondTypes","parseBondTypes","parseAtomAndBondCounts","getNextColumnIdx","isWhitespace","shiftIdxToSpecifiedColumn","lineStartIdx","columnNumber","numberOfJumps","getAtomBlockIdx","shiftIdxToAtomType","parseAtomType","getNextLineIdx","shiftIdxToXColumn","item","parseFloatValue","bondedAtomPairs","getBondBlockIdx","shiftIdxToBondedAtomsPair","pair","parseIntValue","shiftIdxToBondType","idxOfNumber","parseNumericValue","parseFloat","parserFunction","MolfileHandlerBase","molfile","begin","isQuote","getNextIdenticalChar","letter","sym","isQuery","isQueryOrFragment","charCode","isFragment","condition","MolfileV2KHandler","getAtomLines","atomBlockIdx","getBondLines","bondBlockIdx","getRGroupIdToAtomicIdxMap","Map","lines","line","RGP_LINE_START","atomIdxToRgpIdxList","getAtomIdxToRgpIdxList","set","atomAliasLinesIndices","ATOM_ALIAS_LINE_START","atomAliasLines","atomAliasTextLines","rgpAtomIdx","rgpId","unaccounted","getRGroupAtomicIndices","rgpLine","indices","isValidMolfile","TYPE","END","ATOM_TYPE_COL","getCountsLineIdx","NUM_OF_HEADER_LINES","FIRST_BONDED_ATOM_COL","BOND_TYPE_COL","NUM_OF_COUNTS_DIGITS","MolfileV3KHandler","rGroupMatches","rGroupData","rgId","rGroupId","numOfAtoms","MolfileHandler","getInstance","isMolfileV2K","isMolfileV3K","awaitGrid","event","handler","trigger","reason","testEvent","onAfterDrawContent","_package","logger","resCol","resMolfileList","toList","mf","TestsData","testPropertiesDict","expPropDict","_testAllParts","testContext","_g","package_","getCurrentCall","packageId","moduleTests","testFunctions","pop","cat","outputs","moduleAutoTests","moduleDemo","moduleDetectors","packFunctions","functions","list","reg","demo","isArray","eval","friendlyName","lastError","hasTag","initAutoTests","results","categories","redefineConsole","every","beforeStatus","closeAll","afterStatus","successful","failed","failed_","passed","description","runTests","fromObjects"],"sourceRoot":""}