@datagrok/bio 2.11.26 → 2.11.27
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.
- package/dist/42.js +2 -0
- package/dist/42.js.map +1 -0
- package/dist/886.js +1 -1
- package/dist/886.js.map +1 -1
- package/dist/package-test.js +1 -1
- package/dist/package-test.js.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/package.json +2 -2
package/dist/886.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"886.js","mappings":"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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,IAEjDtE,EAASqI,YAAcG,UAAUlE,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,IAEjDtE,EAASuI,WAAaC,UAAUlE,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,iBC5jB1C,SAASmE,EAAmBC,EAAGC,GA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","sources":["webpack://bio/webpack/runtime/chunk loaded","webpack://bio/webpack/runtime/startup chunk dependencies","webpack://bio/./node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/typed-metrics/consts.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/bit-array.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-metrics-methods.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/typed-metrics/typed-metrics.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/types.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/utils.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/distance-matrix-service.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/umap/utils.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/umap/heap.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/umap/matrix.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/umap/tree.js","webpack://bio/./node_modules/is-any-array/src/index.js","webpack://bio/./node_modules/ml-levenberg-marquardt/src/errorCalculation.js","webpack://bio/./node_modules/ml-matrix/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-rescale/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-max/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-min/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-rescale/lib-es6/index.js","webpack://bio/./node_modules/ml-array-min/lib-es6/index.js","webpack://bio/./node_modules/ml-array-max/lib-es6/index.js","webpack://bio/./node_modules/ml-matrix/src/inspect.js","webpack://bio/./node_modules/ml-matrix/src/util.js","webpack://bio/./node_modules/ml-matrix/src/matrix.js","webpack://bio/./node_modules/ml-matrix/src/stat.js","webpack://bio/./node_modules/ml-matrix/src/mathOperations.js","webpack://bio/./node_modules/ml-matrix/src/wrap/WrapperMatrix2D.js","webpack://bio/./node_modules/ml-matrix/src/dc/lu.js","webpack://bio/./node_modules/ml-matrix/src/dc/util.js","webpack://bio/./node_modules/ml-matrix/src/dc/qr.js","webpack://bio/./node_modules/ml-matrix/src/dc/svd.js","webpack://bio/./node_modules/ml-levenberg-marquardt/src/step.js","webpack://bio/./node_modules/ml-matrix/src/decompositions.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/umap/umap.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/umap/nn_descent.js","webpack://bio/./node_modules/ml-levenberg-marquardt/src/index.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/sparse-matrix-service.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/multi-column-dim-reducer.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/proxy.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/mulit-column-dim-reducer-worker.js","webpack://bio/./node_modules/@keckelt/tsne/lib/index.js","webpack://bio/./node_modules/@keckelt/tsne/lib/tsne.js","webpack://bio/webpack/bootstrap","webpack://bio/webpack/runtime/define property getters","webpack://bio/webpack/runtime/ensure chunk","webpack://bio/webpack/runtime/get javascript chunk filename","webpack://bio/webpack/runtime/global","webpack://bio/webpack/runtime/hasOwnProperty shorthand","webpack://bio/webpack/runtime/publicPath","webpack://bio/webpack/runtime/importScripts chunk loading","webpack://bio/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn __webpack_require__.e(649).then(next);\n};","/**\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=","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 || (DistanceMetricsSubjects = {}));\nexport var NumberMetricsNames;\n(function (NumberMetricsNames) {\n NumberMetricsNames[\"Difference\"] = \"Difference\";\n})(NumberMetricsNames || (NumberMetricsNames = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29uc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLGtCQUtUO0FBTEgsV0FBWSxrQkFBa0I7SUFDMUIsaURBQTJCLENBQUE7SUFDM0Isa0RBQTRCLENBQUE7SUFDNUIsNkNBQXVCLENBQUE7SUFDdkIsd0NBQWtCLENBQUE7QUFDcEIsQ0FBQyxFQUxTLGtCQUFrQixLQUFsQixrQkFBa0IsUUFLM0I7QUFFSCxNQUFNLENBQU4sSUFBWSxrQkFFVDtBQUZILFdBQVksa0JBQWtCO0lBQzFCLDZDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFGUyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRTNCO0FBRUgsTUFBTSxDQUFOLElBQVksb0JBYVQ7QUFiSCxXQUFZLG9CQUFvQjtJQUM1Qiw2Q0FBcUIsQ0FBQTtJQUNyQixxQ0FBYSxDQUFBO0lBQ2IsaURBQXlCLENBQUE7SUFDekIsd0RBQWdDLENBQUE7SUFDaEMseUNBQWlCLENBQUE7SUFDakIsaURBQXlCLENBQUE7SUFDekIsc0RBQThCLENBQUE7SUFDOUIsd0RBQWdDLENBQUE7SUFDaEMseUNBQWlCLENBQUE7SUFDakIsdUNBQWUsQ0FBQTtJQUNmLDJDQUFtQixDQUFBO0lBQ25CLCtDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFiUyxvQkFBb0IsS0FBcEIsb0JBQW9CLFFBYTdCO0FBRUgsTUFBTSxDQUFOLElBQVksb0JBRVg7QUFGRCxXQUFZLG9CQUFvQjtJQUM5Qiw2REFBcUMsQ0FBQTtBQUN2QyxDQUFDLEVBRlcsb0JBQW9CLEtBQXBCLG9CQUFvQixRQUUvQjtBQUVELE1BQU0sQ0FBTixJQUFZLHVCQU9UO0FBUEgsV0FBWSx1QkFBdUI7SUFDL0IsNENBQWlCLENBQUE7SUFDakIsNENBQWlCLENBQUE7SUFDakIsZ0RBQXFCLENBQUE7SUFDckIsMERBQStCLENBQUE7SUFDL0IsNENBQWlCLENBQUE7SUFDakIsZ0RBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQVBTLHVCQUF1QixLQUF2Qix1QkFBdUIsUUFPaEM7QUFFSCxNQUFNLENBQU4sSUFBWSxrQkFFWDtBQUZELFdBQVksa0JBQWtCO0lBQzVCLCtDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFGVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRTdCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGVudW0gU3RyaW5nTWV0cmljc05hbWVzIHtcbiAgICBMZXZlbnNodGVpbiA9ICdMZXZlbnNodGVpbicsXG4gICAgSmFyb1dpbmtsZXIgPSAnSmFyby1XaW5rbGVyJyxcbiAgICBNYW5oYXR0YW4gPSAnTWFuaGF0dGFuJyxcbiAgICBPbmVob3QgPSAnT25lLUhvdCcsXG4gIH1cblxuZXhwb3J0IGVudW0gVmVjdG9yTWV0cmljc05hbWVzIHtcbiAgICBFdWNsaWRlYW4gPSAnRXVjbGlkZWFuJyxcbiAgfVxuXG5leHBvcnQgZW51bSBCaXRBcnJheU1ldHJpY3NOYW1lcyB7XG4gICAgVGFuaW1vdG8gPSAnVGFuaW1vdG8nLFxuICAgIERpY2UgPSAnRGljZScsXG4gICAgQXN5bW1ldHJpYyA9ICdBc3ltbWV0cmljJyxcbiAgICBCcmF1bkJsYW5xdWV0ID0gJ0JyYXVuLUJsYW5xdWV0JyxcbiAgICBDb3NpbmUgPSAnQ29zaW5lJyxcbiAgICBLdWxjenluc2tpID0gJ0t1bGN6eW5za2knLFxuICAgIE1jQ29ubmF1Z2hleSA9ICdNYy1Db25uYXVnaGV5JyxcbiAgICBSb2dvdEdvbGRiZXJnID0gJ1JvZ290LUdvbGRiZXJnJyxcbiAgICBSdXNzZWwgPSAnUnVzc2VsJyxcbiAgICBTb2thbCA9ICdTb2thbCcsXG4gICAgSGFtbWluZyA9ICdIYW1taW5nJyxcbiAgICBFdWNsaWRlYW4gPSAnRXVjbGlkZWFuJyxcbiAgfVxuXG5leHBvcnQgZW51bSBJbnRBcnJheU1ldHJpY3NOYW1lcyB7XG4gIFRhbmltb3RvSW50QXJyYXkgPSAnVGFuaW1vdG9JbnRBcnJheScsXG59XG5cbmV4cG9ydCBlbnVtIERpc3RhbmNlTWV0cmljc1N1YmplY3RzIHtcbiAgICBWZWN0b3IgPSAnVmVjdG9yJyxcbiAgICBTdHJpbmcgPSAnU3RyaW5nJyxcbiAgICBCaXRBcnJheSA9ICdCaXRBcnJheScsXG4gICAgTWFjcm9Nb2xlY3VsZSA9ICdNYWNyb01vbGVjdWxlJyxcbiAgICBOdW1iZXIgPSAnTnVtYmVyJyxcbiAgICBJbnRBcnJheSA9ICdJbnRBcnJheScsXG4gIH1cblxuZXhwb3J0IGVudW0gTnVtYmVyTWV0cmljc05hbWVzIHtcbiAgRGlmZmVyZW5jZSA9ICdEaWZmZXJlbmNlJyxcbn1cblxuIl19","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 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 getDistanceFromSimilarity(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 getDistanceFromSimilarity(diceSimilarity(x, y));\n}\nexport function cosineSimilarity(x, y) {\n const total = x.trueCount() * y.trueCount();\n if (total == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / Math.sqrt(total);\n}\nexport function cosineDistance(x, y) {\n return getDistanceFromSimilarity(cosineSimilarity(x, y));\n}\nexport function euclideanSimilarity(x, y) {\n return getSimilarityFromDistance(euclideanDistance(x, y));\n}\nexport function euclideanDistance(x, y) {\n return Math.sqrt(x.trueCount() + y.trueCount() - 2 * x.andWithCountBits(y, true));\n}\nexport function hammingSimilarity(x, y) {\n return getSimilarityFromDistance(hammingDistance(x, y));\n}\nexport function hammingDistance(x, y) {\n return x.trueCount() + y.trueCount() - 2 * x.andWithCountBits(y, true);\n}\nexport function sokalSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const common = x.andWithCountBits(y, true);\n return common / (2 * total - 3 * common);\n}\nexport function sokalDistance(x, y) {\n return getDistanceFromSimilarity(sokalSimilarity(x, y));\n}\nexport function kulczynskiSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const totalProd = x.trueCount() * y.trueCount();\n if (totalProd == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return (common * total) / (2 * totalProd);\n}\nexport function kulczynskiDistance(x, y) {\n return getDistanceFromSimilarity(kulczynskiSimilarity(x, y));\n}\nexport function mcConnaugheySimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const totalProd = x.trueCount() * y.trueCount();\n if (totalProd == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return (common * total - totalProd) / totalProd;\n}\nexport function mcConnaugheyDistance(x, y) {\n return getDistanceFromSimilarity(mcConnaugheySimilarity(x, y));\n}\nexport function asymmetricSimilarity(x, y) {\n const min = Math.min(x.trueCount(), y.trueCount());\n if (min == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / min;\n}\nexport function asymmetricDistance(x, y) {\n return getDistanceFromSimilarity(asymmetricSimilarity(x, y));\n}\nexport function braunBlanquetSimilarity(x, y) {\n const max = Math.max(x.trueCount(), y.trueCount());\n if (max == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / max;\n}\nexport function braunBlanquetDistance(x, y) {\n return getDistanceFromSimilarity(braunBlanquetSimilarity(x, y));\n}\nexport function russelSimilarity(x, y) {\n if (x.length == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / x.length;\n}\nexport function russelDistance(x, y) {\n return getDistanceFromSimilarity(russelSimilarity(x, y));\n}\nexport function rogotGoldbergSimilarity(x, y) {\n const common = x.andWithCountBits(y, true);\n const total = x.countBits(true) + y.countBits(true);\n const len = x.length;\n const diff = len - total + common;\n if ((common == len) || (diff == len))\n return 1.0;\n else\n return common / total + diff / (2 * len - total);\n}\nexport function rogotGoldbergDistance(x, y) {\n return getDistanceFromSimilarity(rogotGoldbergSimilarity(x, y));\n}\nexport function getSimilarityFromDistance(distance) {\n return 1 / (1 + distance);\n}\nexport function getDistanceFromSimilarity(similarity) {\n return similarity === 0 ? 3.402823E+38 : (1 / similarity) - 1;\n}\nexport function numericDistance(x, y) {\n return Math.abs(x - y);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sUUFBUSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9ELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRTVFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE2RDtJQUN4RixDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxFQUFFLGtCQUFrQjtJQUNuRCxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLGNBQWM7SUFDM0MsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxvQkFBb0I7SUFDdkQsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBRSx1QkFBdUI7SUFDN0QsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDL0MsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxvQkFBb0I7SUFDdkQsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxzQkFBc0I7SUFDM0QsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBRSx1QkFBdUI7SUFDN0QsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDL0MsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxlQUFlO0lBQzdDLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUUsaUJBQWlCO0lBQ2pELENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEVBQUUsbUJBQW1CO0NBQ3RELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQTZEO0lBQ3ZGLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEVB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QyxHQUFHLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxDQUFTLEVBQUUsQ0FBUztJQUNsRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQml0QXJyYXkgZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvYml0LWFycmF5JztcbmltcG9ydCB7Qml0QXJyYXlNZXRyaWNzTmFtZXN9IGZyb20gJy4vdHlwZWQtbWV0cmljcy9jb25zdHMnO1xuaW1wb3J0IHtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXN9IGZyb20gJy4vbWFjcm9tb2xlY3VsZS1kaXN0YW5jZS1mdW5jdGlvbnMnO1xuXG5leHBvcnQgY29uc3Qgc2ltaWxhcml0eU1ldHJpYzogeyBbbmFtZTogc3RyaW5nXTogKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSkgPT4gbnVtYmVyIH0gPSB7XG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b106IHRhbmltb3RvU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdOiBkaWNlU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkFzeW1tZXRyaWNdOiBhc3ltbWV0cmljU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkJyYXVuQmxhbnF1ZXRdOiBicmF1bkJsYW5xdWV0U2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV06IGNvc2luZVNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5LdWxjenluc2tpXToga3VsY3p5bnNraVNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5NY0Nvbm5hdWdoZXldOiBtY0Nvbm5hdWdoZXlTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ106IHJvZ290R29sZGJlcmdTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUnVzc2VsXTogcnVzc2VsU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlNva2FsXTogc29rYWxTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuSGFtbWluZ106IGhhbW1pbmdTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXTogZXVjbGlkZWFuU2ltaWxhcml0eSxcbn07XG5cbmV4cG9ydCBjb25zdCBkaXN0YW5jZU1ldHJpY3M6IHsgW25hbWU6IHN0cmluZ106ICh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpID0+IG51bWJlciB9ID0ge1xuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dOiB0YW5pbW90b0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuRGljZV06IGRpY2VEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkFzeW1tZXRyaWNdOiBhc3ltbWV0cmljRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5CcmF1bkJsYW5xdWV0XTogYnJhdW5CbGFucXVldERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lXTogY29zaW5lRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5LdWxjenluc2tpXToga3VsY3p5bnNraURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuTWNDb25uYXVnaGV5XTogbWNDb25uYXVnaGV5RGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Sb2dvdEdvbGRiZXJnXTogcm9nb3RHb2xkYmVyZ0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUnVzc2VsXTogcnVzc2VsRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF06IHNva2FsRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5IYW1taW5nXTogaGFtbWluZ0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXTogZXVjbGlkZWFuRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3QgQ0hFTV9TSU1JTEFSSVRZX01FVFJJQ1MgPSBbXG4gIEJpdEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvLFxuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5EaWNlLFxuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdO1xuZXhwb3J0IGNvbnN0IFNFUV9TUEFDRV9TSU1JTEFSSVRZX01FVFJJQ1MgPSBbXG4gIEJpdEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvLFxuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljLFxuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmUsXG4gIEJpdEFycmF5TWV0cmljc05hbWVzLlNva2FsXTtcbmV4cG9ydCBjb25zdCBNQUNST01PTEVDVUxFX1NJTUlMQVJJVFlfTUVUUklDUyA9IFtcbiAgTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkhBTU1JTkcsXG4gIE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5MRVZFTlNIVEVJTixcbiAgTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLk1PTk9NRVJfQ0hFTUlDQUxfRElTVEFOQ0UsXG4gIE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5ORUVETEVNQU5OX1dVTlNDSFxuXTtcblxuXG5leHBvcnQgZnVuY3Rpb24gdGFuaW1vdG9TaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCk7XG4gIGlmICh0b3RhbCA9PSAwKSByZXR1cm4gMS4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyAodG90YWwgLSBjb21tb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFuaW1vdG9EaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eSh0YW5pbW90b1NpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFuaW1vdG9EaXN0YW5jZUludEFycmF5KHg6IFVpbnQzMkFycmF5LCB5OiBVaW50MzJBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHhiID0gbmV3IEJpdEFycmF5KHgsIHgubGVuZ3RoICogMzIpO1xuICBjb25zdCB5YiA9IG5ldyBCaXRBcnJheSh5LCB5Lmxlbmd0aCAqIDMyKTtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkodGFuaW1vdG9TaW1pbGFyaXR5KHhiLCB5YikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGljZVNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIDIgKiBjb21tb24gLyB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpY2VEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShkaWNlU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3NpbmVTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSAqIHkudHJ1ZUNvdW50KCk7XG4gIGlmICh0b3RhbCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyBNYXRoLnNxcnQodG90YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29zaW5lRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkoY29zaW5lU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldWNsaWRlYW5TaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXRTaW1pbGFyaXR5RnJvbURpc3RhbmNlKGV1Y2xpZGVhbkRpc3RhbmNlKHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV1Y2xpZGVhbkRpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnNxcnQoeC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCkgLSAyICogeC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbW1pbmdTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXRTaW1pbGFyaXR5RnJvbURpc3RhbmNlKGhhbW1pbmdEaXN0YW5jZSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW1taW5nRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpIC0gMiAqIHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNva2FsU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyAoMiAqIHRvdGFsIC0gMyAqIGNvbW1vbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb2thbERpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KHNva2FsU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBrdWxjenluc2tpU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBjb25zdCB0b3RhbFByb2QgPSB4LnRydWVDb3VudCgpICogeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsUHJvZCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiAoY29tbW9uICogdG90YWwpIC8gKDIgKiB0b3RhbFByb2QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga3VsY3p5bnNraURpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KGt1bGN6eW5za2lTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1jQ29ubmF1Z2hleVNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgY29uc3QgdG90YWxQcm9kID0geC50cnVlQ291bnQoKSAqIHkudHJ1ZUNvdW50KCk7XG4gIGlmICh0b3RhbFByb2QgPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gKGNvbW1vbiAqIHRvdGFsIC0gdG90YWxQcm9kKSAvIHRvdGFsUHJvZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1jQ29ubmF1Z2hleURpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KG1jQ29ubmF1Z2hleVNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXN5bW1ldHJpY1NpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgbWluID0gTWF0aC5taW4oeC50cnVlQ291bnQoKSwgeS50cnVlQ291bnQoKSk7XG4gIGlmIChtaW4gPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gbWluO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXN5bW1ldHJpY0Rpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KGFzeW1tZXRyaWNTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJyYXVuQmxhbnF1ZXRTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IG1heCA9IE1hdGgubWF4KHgudHJ1ZUNvdW50KCksIHkudHJ1ZUNvdW50KCkpO1xuICBpZiAobWF4ID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvIG1heDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJyYXVuQmxhbnF1ZXREaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShicmF1bkJsYW5xdWV0U2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydXNzZWxTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGlmICh4Lmxlbmd0aCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyB4Lmxlbmd0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1c3NlbERpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KHJ1c3NlbFNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcm9nb3RHb2xkYmVyZ1NpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICBjb25zdCB0b3RhbCA9IHguY291bnRCaXRzKHRydWUpICsgeS5jb3VudEJpdHModHJ1ZSk7XG4gIGNvbnN0IGxlbiA9IHgubGVuZ3RoO1xuICBjb25zdCBkaWZmID0gbGVuIC0gdG90YWwgKyBjb21tb247XG4gIGlmICgoY29tbW9uID09IGxlbikgfHwgKGRpZmYgPT0gbGVuKSkgcmV0dXJuIDEuMDtcbiAgZWxzZSByZXR1cm4gY29tbW9uIC8gdG90YWwgKyBkaWZmIC8gKDIgKiBsZW4gLSB0b3RhbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByb2dvdEdvbGRiZXJnRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkocm9nb3RHb2xkYmVyZ1NpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2ltaWxhcml0eUZyb21EaXN0YW5jZShkaXN0YW5jZTogbnVtYmVyKSB7XG4gIHJldHVybiAxIC8gKDEgKyBkaXN0YW5jZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KHNpbWlsYXJpdHk6IG51bWJlcikgeyAvL2luIGNhc2Ugc2ltaWxhcml0eSBpcyAwLCB1c2UgbWF4IG51bWJlciBmb3IgZmxvYXQzMlxuICByZXR1cm4gc2ltaWxhcml0eSA9PT0gMCA/IDMuNDAyODIzRSszOCA6ICgxIC8gc2ltaWxhcml0eSkgLSAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbnVtZXJpY0Rpc3RhbmNlKHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gIHJldHVybiBNYXRoLmFicyh4IC0geSk7XG59XG4iXX0=","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=","import * as fl from 'fastest-levenshtein';\nimport { jaroWinkler } from 'jaro-winkler-typescript';\nimport { asymmetricDistance, braunBlanquetDistance, cosineDistance, diceDistance, euclideanDistance, hammingDistance, kulczynskiDistance, mcConnaugheyDistance, rogotGoldbergDistance, russelDistance, sokalDistance, tanimotoDistance, numericDistance, tanimotoDistanceIntArray, } from '../distance-metrics-methods';\nimport { calculateEuclideanDistance } from '@datagrok-libraries/utils/src/vector-operations';\nimport { mmDistanceFunctions, MmDistanceFunctionsNames } from '../macromolecule-distance-functions';\nimport { DistanceMetricsSubjects, BitArrayMetricsNames, StringMetricsNames, VectorMetricsNames, NumberMetricsNames, IntArrayMetricsNames } from './consts';\nexport const vectorDistanceMetricsMethods = {\n [VectorMetricsNames.Euclidean]: calculateEuclideanDistance,\n};\nexport const stringDistanceMetricsMethods = {\n [StringMetricsNames.Levenshtein]: fl.distance,\n [StringMetricsNames.JaroWinkler]: jaroWinkler,\n [StringMetricsNames.Manhattan]: manhattanDistance,\n [StringMetricsNames.Onehot]: categoricalDistance,\n};\nexport const bitArrayDistanceMetricsMethods = {\n [BitArrayMetricsNames.Tanimoto]: tanimotoDistance,\n [BitArrayMetricsNames.Dice]: diceDistance,\n [BitArrayMetricsNames.Asymmetric]: asymmetricDistance,\n [BitArrayMetricsNames.BraunBlanquet]: braunBlanquetDistance,\n [BitArrayMetricsNames.Cosine]: cosineDistance,\n [BitArrayMetricsNames.Kulczynski]: kulczynskiDistance,\n [BitArrayMetricsNames.McConnaughey]: mcConnaugheyDistance,\n [BitArrayMetricsNames.RogotGoldberg]: rogotGoldbergDistance,\n [BitArrayMetricsNames.Russel]: russelDistance,\n [BitArrayMetricsNames.Sokal]: sokalDistance,\n [BitArrayMetricsNames.Hamming]: hammingDistance,\n [BitArrayMetricsNames.Euclidean]: euclideanDistance,\n};\nexport const intArrayDistanceMetricsMethods = {\n [IntArrayMetricsNames.TanimotoIntArray]: tanimotoDistanceIntArray,\n};\nexport const numberDistanceMetricsMethods = {\n [NumberMetricsNames.Difference]: numericDistance,\n};\nexport const AvailableMetrics = {\n [DistanceMetricsSubjects.Vector]: {\n [VectorMetricsNames.Euclidean]: vectorDistanceMetricsMethods[VectorMetricsNames.Euclidean],\n },\n [DistanceMetricsSubjects.String]: {\n [StringMetricsNames.Levenshtein]: stringDistanceMetricsMethods[StringMetricsNames.Levenshtein],\n [StringMetricsNames.JaroWinkler]: stringDistanceMetricsMethods[StringMetricsNames.JaroWinkler],\n [StringMetricsNames.Manhattan]: stringDistanceMetricsMethods[StringMetricsNames.Manhattan],\n [StringMetricsNames.Onehot]: stringDistanceMetricsMethods[StringMetricsNames.Onehot],\n },\n [DistanceMetricsSubjects.BitArray]: {\n [BitArrayMetricsNames.Tanimoto]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Tanimoto],\n [BitArrayMetricsNames.Dice]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Dice],\n [BitArrayMetricsNames.Asymmetric]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Asymmetric],\n [BitArrayMetricsNames.BraunBlanquet]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.BraunBlanquet],\n [BitArrayMetricsNames.Cosine]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Cosine],\n [BitArrayMetricsNames.Kulczynski]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Kulczynski],\n [BitArrayMetricsNames.McConnaughey]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.McConnaughey],\n [BitArrayMetricsNames.RogotGoldberg]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.RogotGoldberg],\n [BitArrayMetricsNames.Russel]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Russel],\n [BitArrayMetricsNames.Sokal]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Sokal],\n },\n [DistanceMetricsSubjects.MacroMolecule]: {\n [MmDistanceFunctionsNames.HAMMING]: mmDistanceFunctions[MmDistanceFunctionsNames.HAMMING],\n [MmDistanceFunctionsNames.LEVENSHTEIN]: mmDistanceFunctions[MmDistanceFunctionsNames.LEVENSHTEIN],\n [MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH]: mmDistanceFunctions[MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH],\n [MmDistanceFunctionsNames.MONOMER_CHEMICAL_DISTANCE]: mmDistanceFunctions[MmDistanceFunctionsNames.MONOMER_CHEMICAL_DISTANCE],\n },\n [DistanceMetricsSubjects.Number]: {\n [NumberMetricsNames.Difference]: numberDistanceMetricsMethods[NumberMetricsNames.Difference],\n },\n [DistanceMetricsSubjects.IntArray]: {\n [IntArrayMetricsNames.TanimotoIntArray]: intArrayDistanceMetricsMethods[IntArrayMetricsNames.TanimotoIntArray],\n }\n};\nexport const MetricToDataType = Object.keys(AvailableMetrics)\n .reduce((ret, key) => {\n for (const val of Object.keys(AvailableMetrics[key]))\n ret[val] = key;\n return ret;\n}, {});\nexport function isStringMetric(name) {\n return MetricToDataType[name] == 'String';\n}\nexport function isBitArrayMetric(name) {\n return MetricToDataType[name] == 'BitArray';\n}\nexport function isVectorMetric(name) {\n return MetricToDataType[name] == 'Vector';\n}\nexport function isMacroMoleculeMetric(name) {\n return MetricToDataType[name] == DistanceMetricsSubjects.MacroMolecule.toString();\n}\n/** Manhattan distance between two sequences (match - 0, mismatch - 1) normalized for length. */\nexport function manhattanDistance(s1, s2) {\n if (s1.length !== s2.length) {\n return 1;\n }\n else {\n let dist = 0;\n for (let i = 1; i < s1.length; i++)\n dist += s1[i] == s2[i] ? 0 : 1;\n return dist / s1.length;\n }\n}\nexport function categoricalDistance(s1, s2) {\n return s1 === s2 ? 0 : 1;\n}\n/** Unified class implementing different string measures. */\nexport class Measure {\n method;\n dataType;\n /**\n * Creates an instance of Measure with .\n * @param {string} method Method to calculate distance between strings.\n * @memberof Measurer\n */\n constructor(method) {\n this.method = method;\n this.dataType = MetricToDataType[method];\n }\n /**\n * Returns custom string distance function specified.\n * @param {opts} opts Options for the measure. used for macromolecule distances\n * @return {DistanceMetric} Callback of the measure chosen.\n * @memberof Measurer\n */\n getMeasure(opts) {\n const dict = AvailableMetrics;\n if (!dict.hasOwnProperty(this.dataType) || !dict[this.dataType].hasOwnProperty(this.method))\n throw new Error(`Unknown measure ${this.method} for data type ${this.dataType}`);\n return isMacroMoleculeMetric(this.method) ?\n dict[this.dataType][this.method](opts) :\n dict[this.dataType][this.method];\n }\n /**\n * Returns custom string distance by the given data type.\n * @param {AvailableDataTypes} dataType Metric's data type\n * @return {string[]} Metric names which expects the given data type\n * @memberof Measurer\n */\n static getMetricByDataType(dataType) {\n return Object.keys(AvailableMetrics[dataType]);\n }\n /** Returns metric names available.\n * @memberof Measurer\n */\n static get availableMeasures() {\n return Object.keys(AvailableMetrics);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWQtbWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInR5cGVkLW1ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsY0FBYyxFQUNkLFlBQVksRUFDWixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZix3QkFBd0IsR0FDekIsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUczRixPQUFPLEVBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNsRyxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsb0JBQW9CLEVBQ25ELGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFDLE1BQU0sVUFBVSxDQUFDO0FBR3BHLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUF5RDtJQUNoRyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLDBCQUEwQjtDQUMzRCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQXlEO0lBQ2hHLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVE7SUFDN0MsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxXQUFXO0lBQzdDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsaUJBQWlCO0lBQ2pELENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEVBQUUsbUJBQW1C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O0lBQ0ksTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQTRCO1FBQzVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sS0FBSyxpQkFBaUI7UUFDMUIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZmwgZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5pbXBvcnQge2phcm9XaW5rbGVyfSBmcm9tICdqYXJvLXdpbmtsZXItdHlwZXNjcmlwdCc7XG5pbXBvcnQge0Rpc3RhbmNlTWV0cmljfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge1xuICBhc3ltbWV0cmljRGlzdGFuY2UsXG4gIGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgY29zaW5lRGlzdGFuY2UsXG4gIGRpY2VEaXN0YW5jZSxcbiAgZXVjbGlkZWFuRGlzdGFuY2UsXG4gIGhhbW1pbmdEaXN0YW5jZSxcbiAga3VsY3p5bnNraURpc3RhbmNlLFxuICBtY0Nvbm5hdWdoZXlEaXN0YW5jZSxcbiAgcm9nb3RHb2xkYmVyZ0Rpc3RhbmNlLFxuICBydXNzZWxEaXN0YW5jZSxcbiAgc29rYWxEaXN0YW5jZSxcbiAgdGFuaW1vdG9EaXN0YW5jZSxcbiAgbnVtZXJpY0Rpc3RhbmNlLFxuICB0YW5pbW90b0Rpc3RhbmNlSW50QXJyYXksXG59IGZyb20gJy4uL2Rpc3RhbmNlLW1ldHJpY3MtbWV0aG9kcyc7XG5cbmltcG9ydCB7Y2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2V9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3ZlY3Rvci1vcGVyYXRpb25zJztcbmltcG9ydCBCaXRBcnJheSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy9iaXQtYXJyYXknO1xuaW1wb3J0IHtWZWN0b3IsIFN0cmluZ0RpY3Rpb25hcnl9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7bW1EaXN0YW5jZUZ1bmN0aW9ucywgTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzfSBmcm9tICcuLi9tYWNyb21vbGVjdWxlLWRpc3RhbmNlLWZ1bmN0aW9ucyc7XG5pbXBvcnQge0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLCBCaXRBcnJheU1ldHJpY3NOYW1lcyxcbiAgU3RyaW5nTWV0cmljc05hbWVzLCBWZWN0b3JNZXRyaWNzTmFtZXMsIE51bWJlck1ldHJpY3NOYW1lcywgSW50QXJyYXlNZXRyaWNzTmFtZXN9IGZyb20gJy4vY29uc3RzJztcblxuXG5leHBvcnQgY29uc3QgdmVjdG9yRGlzdGFuY2VNZXRyaWNzTWV0aG9kczogeyBbbmFtZTogc3RyaW5nXTogKHg6IFZlY3RvciwgeTogVmVjdG9yKSA9PiBudW1iZXIgfSA9IHtcbiAgW1ZlY3Rvck1ldHJpY3NOYW1lcy5FdWNsaWRlYW5dOiBjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZSxcbn07XG5cbmV4cG9ydCBjb25zdCBzdHJpbmdEaXN0YW5jZU1ldHJpY3NNZXRob2RzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogc3RyaW5nLCB5OiBzdHJpbmcpID0+IG51bWJlciB9ID0ge1xuICBbU3RyaW5nTWV0cmljc05hbWVzLkxldmVuc2h0ZWluXTogZmwuZGlzdGFuY2UsXG4gIFtTdHJpbmdNZXRyaWNzTmFtZXMuSmFyb1dpbmtsZXJdOiBqYXJvV2lua2xlcixcbiAgW1N0cmluZ01ldHJpY3NOYW1lcy5NYW5oYXR0YW5dOiBtYW5oYXR0YW5EaXN0YW5jZSxcbiAgW1N0cmluZ01ldHJpY3NOYW1lcy5PbmVob3RdOiBjYXRlZ29yaWNhbERpc3RhbmNlLFxufTtcblxuZXhwb3J0IGNvbnN0IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kczogeyBbbmFtZTogc3RyaW5nXTogKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSkgPT4gbnVtYmVyIH0gPSB7XG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b106IHRhbmltb3RvRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5EaWNlXTogZGljZURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQXN5bW1ldHJpY106IGFzeW1tZXRyaWNEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkJyYXVuQmxhbnF1ZXRdOiBicmF1bkJsYW5xdWV0RGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdOiBjb3NpbmVEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkt1bGN6eW5za2ldOiBrdWxjenluc2tpRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5NY0Nvbm5hdWdoZXldOiBtY0Nvbm5hdWdoZXlEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJvZ290R29sZGJlcmddOiByb2dvdEdvbGRiZXJnRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5SdXNzZWxdOiBydXNzZWxEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlNva2FsXTogc29rYWxEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkhhbW1pbmddOiBoYW1taW5nRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5FdWNsaWRlYW5dOiBldWNsaWRlYW5EaXN0YW5jZSxcbn07XG5cbmV4cG9ydCBjb25zdCBpbnRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHM6IHsgW25hbWU6IHN0cmluZ106ICh4OiBVaW50MzJBcnJheSwgeTogVWludDMyQXJyYXkpID0+IG51bWJlciB9ID0ge1xuICBbSW50QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9JbnRBcnJheV06IHRhbmltb3RvRGlzdGFuY2VJbnRBcnJheSxcbn07XG5cbmV4cG9ydCBjb25zdCBudW1iZXJEaXN0YW5jZU1ldHJpY3NNZXRob2RzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IG51bWJlciB9ID0ge1xuICBbTnVtYmVyTWV0cmljc05hbWVzLkRpZmZlcmVuY2VdOiBudW1lcmljRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3QgQXZhaWxhYmxlTWV0cmljcyA9IHtcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLlZlY3Rvcl06IHtcbiAgICBbVmVjdG9yTWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IHZlY3RvckRpc3RhbmNlTWV0cmljc01ldGhvZHNbVmVjdG9yTWV0cmljc05hbWVzLkV1Y2xpZGVhbl0sXG4gIH0sXG4gIFtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5TdHJpbmddOiB7XG4gICAgW1N0cmluZ01ldHJpY3NOYW1lcy5MZXZlbnNodGVpbl06IHN0cmluZ0Rpc3RhbmNlTWV0cmljc01ldGhvZHNbU3RyaW5nTWV0cmljc05hbWVzLkxldmVuc2h0ZWluXSxcbiAgICBbU3RyaW5nTWV0cmljc05hbWVzLkphcm9XaW5rbGVyXTogc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tTdHJpbmdNZXRyaWNzTmFtZXMuSmFyb1dpbmtsZXJdLFxuICAgIFtTdHJpbmdNZXRyaWNzTmFtZXMuTWFuaGF0dGFuXTogc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tTdHJpbmdNZXRyaWNzTmFtZXMuTWFuaGF0dGFuXSxcbiAgICBbU3RyaW5nTWV0cmljc05hbWVzLk9uZWhvdF06IHN0cmluZ0Rpc3RhbmNlTWV0cmljc01ldGhvZHNbU3RyaW5nTWV0cmljc05hbWVzLk9uZWhvdF0sXG4gIH0sXG4gIFtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5CaXRBcnJheV06IHtcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5EaWNlXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkFzeW1tZXRyaWNdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5CcmF1bkJsYW5xdWV0XTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkJyYXVuQmxhbnF1ZXRdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lXSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5LdWxjenluc2tpXSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuTWNDb25uYXVnaGV5XTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJvZ290R29sZGJlcmddOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ10sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5SdXNzZWxdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF0sXG4gIH0sXG4gIFtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5NYWNyb01vbGVjdWxlXTogeyAvLyBvcHRpb25hbCBhcmdzIG5lZWRlZCBmb3IgbWFjcm9tb2xlY3VsZSBmdW5jdGlvbnMgd2hpY2ggaW5pdGlhbGl6ZSB0aGVtXG4gICAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5IQU1NSU5HXTogbW1EaXN0YW5jZUZ1bmN0aW9uc1tNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuSEFNTUlOR10sXG4gICAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5MRVZFTlNIVEVJTl06IG1tRGlzdGFuY2VGdW5jdGlvbnNbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkxFVkVOU0hURUlOXSxcbiAgICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLk5FRURMRU1BTk5fV1VOU0NIXTogbW1EaXN0YW5jZUZ1bmN0aW9uc1tNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTkVFRExFTUFOTl9XVU5TQ0hdLFxuICAgIFtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRV06XG4gICAgICBtbURpc3RhbmNlRnVuY3Rpb25zW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5NT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFXSxcbiAgfSxcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLk51bWJlcl06IHtcbiAgICBbTnVtYmVyTWV0cmljc05hbWVzLkRpZmZlcmVuY2VdOiBudW1iZXJEaXN0YW5jZU1ldHJpY3NNZXRob2RzW051bWJlck1ldHJpY3NOYW1lcy5EaWZmZXJlbmNlXSxcbiAgfSxcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLkludEFycmF5XToge1xuICAgIFtJbnRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b0ludEFycmF5XTogaW50QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0ludEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvSW50QXJyYXldLFxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgTWV0cmljVG9EYXRhVHlwZTogU3RyaW5nRGljdGlvbmFyeSA9IE9iamVjdC5rZXlzKEF2YWlsYWJsZU1ldHJpY3MpXG4gIC5yZWR1Y2UoKHJldDogU3RyaW5nRGljdGlvbmFyeSwga2V5KSA9PiB7XG4gICAgZm9yIChjb25zdCB2YWwgb2YgT2JqZWN0LmtleXMoQXZhaWxhYmxlTWV0cmljc1trZXkgYXMgQXZhaWxhYmxlRGF0YVR5cGVzXSkpXG4gICAgICByZXRbdmFsIGFzIEF2YWlsYWJsZURhdGFUeXBlc10gPSBrZXk7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9LCB7fSk7XG5cbmV4cG9ydCB0eXBlIEF2YWlsYWJsZURhdGFUeXBlcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVNZXRyaWNzO1xuZXhwb3J0IHR5cGUgVmVjdG9yTWV0cmljcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVNZXRyaWNzW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLlZlY3Rvcl07XG5leHBvcnQgdHlwZSBTdHJpbmdNZXRyaWNzID0ga2V5b2YgdHlwZW9mIEF2YWlsYWJsZU1ldHJpY3NbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuU3RyaW5nXTtcbmV4cG9ydCB0eXBlIEJpdEFycmF5TWV0cmljcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVNZXRyaWNzW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLkJpdEFycmF5XTtcbmV4cG9ydCB0eXBlIEtub3duTWV0cmljcyA9IFN0cmluZ01ldHJpY3MgfCBCaXRBcnJheU1ldHJpY3MgfCBWZWN0b3JNZXRyaWNzIHxcbiAgTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzIHwgTnVtYmVyTWV0cmljc05hbWVzIHwgSW50QXJyYXlNZXRyaWNzTmFtZXM7XG5cbmV4cG9ydCB0eXBlIFZhbGlkVHlwZXMgPVxuICB7IGRhdGE6IHN0cmluZ1tdLCBtZXRyaWM6IFN0cmluZ01ldHJpY3MgfCBNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMgfSB8XG4gIHsgZGF0YTogVmVjdG9yW10sIG1ldHJpYzogVmVjdG9yTWV0cmljcyB9IHxcbiAgeyBkYXRhOiBCaXRBcnJheVtdLCBtZXRyaWM6IEJpdEFycmF5TWV0cmljcyB9IHxcbiAgeyBkYXRhOiBudW1iZXJbXSwgbWV0cmljOiBOdW1iZXJNZXRyaWNzTmFtZXMgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nTWV0cmljKG5hbWU6IEtub3duTWV0cmljcykge1xuICByZXR1cm4gTWV0cmljVG9EYXRhVHlwZVtuYW1lXSA9PSAnU3RyaW5nJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQml0QXJyYXlNZXRyaWMobmFtZTogS25vd25NZXRyaWNzKSB7XG4gIHJldHVybiBNZXRyaWNUb0RhdGFUeXBlW25hbWVdID09ICdCaXRBcnJheSc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlY3Rvck1ldHJpYyhuYW1lOiBLbm93bk1ldHJpY3MpIHtcbiAgcmV0dXJuIE1ldHJpY1RvRGF0YVR5cGVbbmFtZV0gPT0gJ1ZlY3Rvcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01hY3JvTW9sZWN1bGVNZXRyaWMobmFtZTogS25vd25NZXRyaWNzKSB7XG4gIHJldHVybiBNZXRyaWNUb0RhdGFUeXBlW25hbWVdID09IERpc3RhbmNlTWV0cmljc1N1YmplY3RzLk1hY3JvTW9sZWN1bGUudG9TdHJpbmcoKTtcbn1cblxuLyoqIE1hbmhhdHRhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzZXF1ZW5jZXMgKG1hdGNoIC0gMCwgbWlzbWF0Y2ggLSAxKSBub3JtYWxpemVkIGZvciBsZW5ndGguICovXG5leHBvcnQgZnVuY3Rpb24gbWFuaGF0dGFuRGlzdGFuY2UoczE6IHN0cmluZywgczI6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmIChzMS5sZW5ndGggIT09IHMyLmxlbmd0aCkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIGxldCBkaXN0OiBudW1iZXIgPSAwO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgczEubGVuZ3RoOyBpKyspXG4gICAgICBkaXN0ICs9IHMxW2ldID09IHMyW2ldID8gMCA6IDE7XG4gICAgcmV0dXJuIGRpc3QgLyBzMS5sZW5ndGg7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3JpY2FsRGlzdGFuY2UoczE6IHN0cmluZywgczI6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBzMSA9PT0gczIgPyAwIDogMTtcbn1cblxuLyoqIFVuaWZpZWQgY2xhc3MgaW1wbGVtZW50aW5nIGRpZmZlcmVudCBzdHJpbmcgbWVhc3VyZXMuICovXG5leHBvcnQgY2xhc3MgTWVhc3VyZSB7XG4gIHByb3RlY3RlZCBtZXRob2Q6IEtub3duTWV0cmljcztcbiAgcHJvdGVjdGVkIGRhdGFUeXBlOiBBdmFpbGFibGVEYXRhVHlwZXM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTWVhc3VyZSB3aXRoIC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCBNZXRob2QgdG8gY2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4gc3RyaW5ncy5cbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXRob2Q6IEtub3duTWV0cmljcykge1xuICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgIHRoaXMuZGF0YVR5cGUgPSBNZXRyaWNUb0RhdGFUeXBlW21ldGhvZF0gYXMgQXZhaWxhYmxlRGF0YVR5cGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY3VzdG9tIHN0cmluZyBkaXN0YW5jZSBmdW5jdGlvbiBzcGVjaWZpZWQuXG4gICAqIEBwYXJhbSB7b3B0c30gb3B0cyBPcHRpb25zIGZvciB0aGUgbWVhc3VyZS4gdXNlZCBmb3IgbWFjcm9tb2xlY3VsZSBkaXN0YW5jZXNcbiAgICogQHJldHVybiB7RGlzdGFuY2VNZXRyaWN9IENhbGxiYWNrIG9mIHRoZSBtZWFzdXJlIGNob3Nlbi5cbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBwdWJsaWMgZ2V0TWVhc3VyZShvcHRzPzogYW55KTogRGlzdGFuY2VNZXRyaWMge1xuICAgIGNvbnN0IGRpY3Q6IHsgW2tleTogc3RyaW5nXTpcbiAgICAgIHtba2V5Mjogc3RyaW5nXTogRGlzdGFuY2VNZXRyaWMgfCAoKG9wdHM6IGFueSkgPT4gRGlzdGFuY2VNZXRyaWMpfVxuICAgIH0gPSBBdmFpbGFibGVNZXRyaWNzO1xuICAgIGlmICghZGljdC5oYXNPd25Qcm9wZXJ0eSh0aGlzLmRhdGFUeXBlKSB8fCAhZGljdFt0aGlzLmRhdGFUeXBlXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLm1ldGhvZCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbWVhc3VyZSAke3RoaXMubWV0aG9kfSBmb3IgZGF0YSB0eXBlICR7dGhpcy5kYXRhVHlwZX1gKTtcbiAgICByZXR1cm4gaXNNYWNyb01vbGVjdWxlTWV0cmljKHRoaXMubWV0aG9kKSA/XG4gICAgICAoZGljdFt0aGlzLmRhdGFUeXBlXVt0aGlzLm1ldGhvZF0gYXMgKChvcHRzOiBhbnkpID0+IERpc3RhbmNlTWV0cmljKSkob3B0cykgOlxuICAgICAgZGljdFt0aGlzLmRhdGFUeXBlXVt0aGlzLm1ldGhvZF0gYXMgRGlzdGFuY2VNZXRyaWM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBjdXN0b20gc3RyaW5nIGRpc3RhbmNlIGJ5IHRoZSBnaXZlbiBkYXRhIHR5cGUuXG4gICAqIEBwYXJhbSB7QXZhaWxhYmxlRGF0YVR5cGVzfSBkYXRhVHlwZSBNZXRyaWMncyBkYXRhIHR5cGVcbiAgICogQHJldHVybiB7c3RyaW5nW119IE1ldHJpYyBuYW1lcyB3aGljaCBleHBlY3RzIHRoZSBnaXZlbiBkYXRhIHR5cGVcbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldE1ldHJpY0J5RGF0YVR5cGUoZGF0YVR5cGU6IEF2YWlsYWJsZURhdGFUeXBlcyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoQXZhaWxhYmxlTWV0cmljc1tkYXRhVHlwZV0pO1xuICB9XG5cbiAgLyoqIFJldHVybnMgbWV0cmljIG5hbWVzIGF2YWlsYWJsZS5cbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBzdGF0aWMgZ2V0IGF2YWlsYWJsZU1lYXN1cmVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoQXZhaWxhYmxlTWV0cmljcyk7XG4gIH1cbn1cbiJdfQ==","export var DistanceAggregationMethods;\n(function (DistanceAggregationMethods) {\n DistanceAggregationMethods[\"EUCLIDEAN\"] = \"EUCLIDEAN\";\n DistanceAggregationMethods[\"MANHATTAN\"] = \"MANHATTAN\";\n})(DistanceAggregationMethods || (DistanceAggregationMethods = {}));\n;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSwwQkFHVDtBQUhILFdBQVksMEJBQTBCO0lBQ2xDLHFEQUF1QixDQUFBO0lBQ3ZCLHFEQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFIUywwQkFBMEIsS0FBMUIsMEJBQTBCLFFBR25DO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzIHtcbiAgICBFVUNMSURFQU4gPSAnRVVDTElERUFOJyxcbiAgICBNQU5IQVRUQU4gPSAnTUFOSEFUVEFOJyxcbiAgfTtcblxuZXhwb3J0IHR5cGUgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IGtleW9mIHR5cGVvZiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcztcbiJdfQ==","import { DistanceAggregationMethods } from './types';\nexport const isNil = (x) => x === null || x === undefined;\nexport function insertSmaller(distancesAr, indexes, num, index) {\n if (num > distancesAr[distancesAr.length - 1])\n return;\n const newPosition = distancesAr.findIndex((v) => num < v);\n distancesAr.pop();\n distancesAr.splice(newPosition, 0, num);\n indexes.pop();\n indexes.splice(newPosition, 0, index);\n}\nexport function insertLarger(distancesAr, indexes, num, index) {\n if (num < distancesAr[distancesAr.length - 1])\n return;\n const newPosition = distancesAr.findIndex((v) => num > v);\n distancesAr.pop();\n distancesAr.splice(newPosition, 0, num);\n indexes.pop();\n indexes.splice(newPosition, 0, index);\n}\nexport function getAggregationFunction(aggregationMethod, weights) {\n switch (aggregationMethod) {\n case DistanceAggregationMethods.MANHATTAN:\n return (vs) => vs.reduce((acc, val, idx) => acc + val * weights[idx], 0);\n default:\n return (vs) => {\n // euclidean\n const sum = vs.reduce((acc, val, idx) => acc + (val * weights[idx]) ** 2, 0);\n return Math.sqrt(sum);\n };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRCLDBCQUEwQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBRS9ELE1BQU0sVUFBVSxhQUFhLENBQUMsV0FBcUIsRUFBRSxPQUFpQixFQUFFLEdBQVcsRUFBRSxLQUFhO0lBQ2hHLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPO0lBRVQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFELFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQixXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLFdBQXFCLEVBQUUsT0FBaUIsRUFBRSxHQUFXLEVBQUUsS0FBYTtJQUMvRixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTztJQUVULE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxRCxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbEIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxpQkFBNEMsRUFBRSxPQUFpQjtJQUUvRCxRQUFRLGlCQUFpQixFQUFFO1FBQ3pCLEtBQUssMEJBQTBCLENBQUMsU0FBUztZQUN2QyxPQUFPLENBQUMsRUFBWSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JGO1lBQ0UsT0FBTyxDQUFDLEVBQVksRUFBRSxFQUFFO2dCQUN0QixZQUFZO2dCQUNaLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0UsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLENBQUMsQ0FBQztLQUNMO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCwgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHN9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgaXNOaWwgPSAoeDogYW55KSA9PiB4ID09PSBudWxsIHx8IHggPT09IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydFNtYWxsZXIoZGlzdGFuY2VzQXI6IG51bWJlcltdLCBpbmRleGVzOiBudW1iZXJbXSwgbnVtOiBudW1iZXIsIGluZGV4OiBudW1iZXIpIHtcbiAgaWYgKG51bSA+IGRpc3RhbmNlc0FyW2Rpc3RhbmNlc0FyLmxlbmd0aC0xXSlcbiAgICByZXR1cm47XG5cbiAgY29uc3QgbmV3UG9zaXRpb24gPSBkaXN0YW5jZXNBci5maW5kSW5kZXgoKHYpID0+IG51bSA8IHYpO1xuICBkaXN0YW5jZXNBci5wb3AoKTtcbiAgZGlzdGFuY2VzQXIuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBudW0pO1xuICBpbmRleGVzLnBvcCgpO1xuICBpbmRleGVzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaW5kZXgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0TGFyZ2VyKGRpc3RhbmNlc0FyOiBudW1iZXJbXSwgaW5kZXhlczogbnVtYmVyW10sIG51bTogbnVtYmVyLCBpbmRleDogbnVtYmVyKSB7XG4gIGlmIChudW0gPCBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGgtMV0pXG4gICAgcmV0dXJuO1xuXG4gIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPiB2KTtcbiAgZGlzdGFuY2VzQXIucG9wKCk7XG4gIGRpc3RhbmNlc0FyLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgbnVtKTtcbiAgaW5kZXhlcy5wb3AoKTtcbiAgaW5kZXhlcy5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0aW9uRnVuY3Rpb24oXG4gIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kLCB3ZWlnaHRzOiBudW1iZXJbXVxuKTogKHZhbHVlczogbnVtYmVyW10pID0+IG51bWJlciB7XG4gIHN3aXRjaCAoYWdncmVnYXRpb25NZXRob2QpIHtcbiAgICBjYXNlIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLk1BTkhBVFRBTjpcbiAgICAgIHJldHVybiAodnM6IG51bWJlcltdKSA9PiB2cy5yZWR1Y2UoKGFjYywgdmFsLCBpZHgpID0+IGFjYyArIHZhbCAqIHdlaWdodHNbaWR4XSwgMCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAodnM6IG51bWJlcltdKSA9PiB7XG4gICAgICAgIC8vIGV1Y2xpZGVhblxuICAgICAgICBjb25zdCBzdW0gPSB2cy5yZWR1Y2UoKGFjYywgdmFsLCBpZHgpID0+IGFjYyArICh2YWwgKiB3ZWlnaHRzW2lkeF0pICoqIDIsIDApO1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHN1bSk7XG4gICAgICB9O1xuICB9XG59XG4iXX0=","export class DistanceMatrixService {\n _workers;\n _workerCount;\n _terminateOnComplete;\n constructor(useConcurrentWorkers = true, terminateOnComplete = true) {\n const threadCount = navigator.hardwareConcurrency;\n this._workerCount = useConcurrentWorkers ? Math.max(threadCount - 2, 1) : 1;\n this._workers = new Array(this._workerCount).fill(null)\n .map(() => new Worker(new URL('./distance-matrix-worker', import.meta.url)));\n this._terminateOnComplete = terminateOnComplete;\n }\n ;\n async calc(values, fnName, normalize = true, opts) {\n return new Promise(async (resolve, reject) => {\n try {\n const len = values.length;\n const promises = new Array(this._workerCount);\n const totalLength = len * (len - 1) / 2; // size of reduced distance matrix\n this._workerCount = Math.min(this._workerCount, totalLength);\n const chunkSize = totalLength / this._workerCount;\n const distanceMatrix = new Float32Array(totalLength);\n let endRow = 0;\n let endCol = 1;\n // minmax for normalization\n let lmin = 0;\n let lmax = Number.MIN_VALUE;\n for (let i = 0; i < this._workerCount; i++) {\n const start = Math.floor(i * chunkSize);\n const end = (i === this._workerCount - 1) ? totalLength : Math.floor((i + 1) * chunkSize);\n const startRow = endRow;\n const startCol = endCol;\n if (i !== this._workerCount - 1) {\n // These formulas map the linear index to the upper triangular matrix indices\n endRow = len - 2 - Math.floor(Math.sqrt(-8 * end + 4 * len * (len - 1) - 7) / 2 - 0.5);\n endCol = end - len * endRow + Math.floor((endRow + 1) * (endRow + 2) / 2);\n }\n this._workers[i].postMessage({ values, fnName, startRow, startCol, chunckSize: end - start, opts });\n promises[i] = new Promise((resolveWorker, rejectWorker) => {\n this._workers[i].onmessage = ({ data: { error, distanceMatrixData, min, max } }) => {\n this._terminateOnComplete && this._workers[i].terminate();\n if (error) {\n rejectWorker(error);\n }\n else {\n distanceMatrix.set(distanceMatrixData, start);\n if (min < lmin)\n lmin = min;\n if (max > lmax)\n lmax = max;\n resolveWorker();\n }\n };\n });\n }\n await Promise.all(promises);\n if (normalize)\n distanceMatrix.forEach((value, index) => { distanceMatrix[index] = (value - lmin) / (lmax - lmin); });\n resolve(distanceMatrix);\n }\n catch (e) {\n reject(e);\n }\n });\n }\n terminate() {\n this._workers.forEach((worker) => worker.terminate());\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWF0cml4LXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaXN0YW5jZS1tYXRyaXgtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLE9BQU8scUJBQXFCO0lBQ3RCLFFBQVEsQ0FBVztJQUNuQixZQUFZLENBQVM7SUFDckIsb0JBQW9CLENBQVU7SUFDdEMsWUFBbUIsb0JBQW9CLEdBQUcsSUFBSSxFQUFFLG1CQUFtQixHQUFHLElBQUk7UUFDeEUsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLG1CQUFtQixDQUFDO1FBQ2xELElBQUksQ0FBQyxZQUFZLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDcEQsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLDBCQUEwQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxtQkFBbUIsQ0FBQztJQUNsRCxDQUFDO0lBQUEsQ0FBQztJQUVLLEtBQUssQ0FBQyxJQUFJLENBQUksTUFBK0IsRUFBRSxNQUFvQixFQUN4RSxTQUFTLEdBQUcsSUFBSSxFQUFFLElBQXlCO1FBQzNDLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMzQyxJQUFJO2dCQUNGLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksS0FB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LElBQUksR0FBRyxHQUFHLElBQUk7b0NBQ1osSUFBSSxHQUFHLEdBQUcsQ0FBQztnQ0FDYixJQUFJLEdBQUcsR0FBRyxJQUFJO29DQUNaLElBQUksR0FBRyxHQUFHLENBQUM7Z0NBQ2IsYUFBYSxFQUFFLENBQUM7NkJBQ2pCO3dCQUNILENBQUMsQ0FBQztvQkFDSixDQUFDLENBQUMsQ0FBQztpQkFDSjtnQkFDRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzVCLElBQUksU0FBUztvQkFDWCxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUN6QjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNYO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sU0FBUztRQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5cbmV4cG9ydCBjbGFzcyBEaXN0YW5jZU1hdHJpeFNlcnZpY2Uge1xuICAgIHByaXZhdGUgX3dvcmtlcnM6IFdvcmtlcltdO1xuICAgIHByaXZhdGUgX3dvcmtlckNvdW50OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfdGVybWluYXRlT25Db21wbGV0ZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IodXNlQ29uY3VycmVudFdvcmtlcnMgPSB0cnVlLCB0ZXJtaW5hdGVPbkNvbXBsZXRlID0gdHJ1ZSkge1xuICAgICAgY29uc3QgdGhyZWFkQ291bnQgPSBuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeTtcbiAgICAgIHRoaXMuX3dvcmtlckNvdW50ID0gdXNlQ29uY3VycmVudFdvcmtlcnMgPyBNYXRoLm1heCh0aHJlYWRDb3VudCAtIDIsIDEpIDogMTtcbiAgICAgIHRoaXMuX3dvcmtlcnMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpLmZpbGwobnVsbClcbiAgICAgICAgLm1hcCgoKSA9PiBuZXcgV29ya2VyKG5ldyBVUkwoJy4vZGlzdGFuY2UtbWF0cml4LXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcbiAgICAgIHRoaXMuX3Rlcm1pbmF0ZU9uQ29tcGxldGUgPSB0ZXJtaW5hdGVPbkNvbXBsZXRlO1xuICAgIH07XG5cbiAgICBwdWJsaWMgYXN5bmMgY2FsYzxUPih2YWx1ZXM6IEFycmF5PFQ+IHwgQXJyYXlMaWtlPFQ+LCBmbk5hbWU6IEtub3duTWV0cmljcyxcbiAgICAgIG5vcm1hbGl6ZSA9IHRydWUsIG9wdHM/OiB7W186IHN0cmluZ106IGFueX0pOiBQcm9taXNlPEZsb2F0MzJBcnJheT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBsZW4gPSB2YWx1ZXMubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gbmV3IEFycmF5PFByb21pc2U8dm9pZD4+KHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgICAgICBjb25zdCB0b3RhbExlbmd0aCA9IGxlbiAqIChsZW4gLSAxKSAvIDI7IC8vIHNpemUgb2YgcmVkdWNlZCBkaXN0YW5jZSBtYXRyaXhcbiAgICAgICAgICB0aGlzLl93b3JrZXJDb3VudCA9IE1hdGgubWluKHRoaXMuX3dvcmtlckNvdW50LCB0b3RhbExlbmd0aCk7XG4gICAgICAgICAgY29uc3QgY2h1bmtTaXplID0gdG90YWxMZW5ndGggLyB0aGlzLl93b3JrZXJDb3VudDtcbiAgICAgICAgICBjb25zdCBkaXN0YW5jZU1hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkodG90YWxMZW5ndGgpO1xuICAgICAgICAgIGxldCBlbmRSb3cgPSAwO1xuICAgICAgICAgIGxldCBlbmRDb2wgPSAxO1xuICAgICAgICAgIC8vIG1pbm1heCBmb3Igbm9ybWFsaXphdGlvblxuICAgICAgICAgIGxldCBsbWluID0gMDtcbiAgICAgICAgICBsZXQgbG1heCA9IE51bWJlci5NSU5fVkFMVUU7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl93b3JrZXJDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGguZmxvb3IoaSAqIGNodW5rU2l6ZSk7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSAoaSA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxKSA/IHRvdGFsTGVuZ3RoIDogTWF0aC5mbG9vcigoaSArIDEpICogY2h1bmtTaXplKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0Um93ID0gZW5kUm93O1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRDb2wgPSBlbmRDb2w7XG4gICAgICAgICAgICBpZiAoaSAhPT0gdGhpcy5fd29ya2VyQ291bnQgLSAxKSB7XG4gICAgICAgICAgICAgIC8vIFRoZXNlIGZvcm11bGFzIG1hcCB0aGUgbGluZWFyIGluZGV4IHRvIHRoZSB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeCBpbmRpY2VzXG4gICAgICAgICAgICAgIGVuZFJvdyA9IGxlbiAtIDIgLSBNYXRoLmZsb29yKE1hdGguc3FydCgtOCAqIGVuZCArIDQgKiBsZW4gKiAobGVuIC0gMSkgLSA3KSAvIDIgLSAwLjUpO1xuICAgICAgICAgICAgICBlbmRDb2wgPSBlbmQgLSBsZW4gKiBlbmRSb3cgKyBNYXRoLmZsb29yKChlbmRSb3cgKyAxKSAqIChlbmRSb3cgKyAyKSAvIDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fd29ya2Vyc1tpXS5wb3N0TWVzc2FnZSh7dmFsdWVzLCBmbk5hbWUsIHN0YXJ0Um93LCBzdGFydENvbCwgY2h1bmNrU2l6ZTogZW5kIC0gc3RhcnQsIG9wdHN9KTtcbiAgICAgICAgICAgIHByb21pc2VzW2ldID0gbmV3IFByb21pc2UoKHJlc29sdmVXb3JrZXIsIHJlamVjdFdvcmtlcikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLl93b3JrZXJzW2ldLm9ubWVzc2FnZSA9ICh7ZGF0YToge2Vycm9yLCBkaXN0YW5jZU1hdHJpeERhdGEsIG1pbiwgbWF4fX0pOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hdGVPbkNvbXBsZXRlICYmIHRoaXMuX3dvcmtlcnNbaV0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICByZWplY3RXb3JrZXIoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBkaXN0YW5jZU1hdHJpeC5zZXQoZGlzdGFuY2VNYXRyaXhEYXRhLCBzdGFydCk7XG4gICAgICAgICAgICAgICAgICBpZiAobWluIDwgbG1pbilcbiAgICAgICAgICAgICAgICAgICAgbG1pbiA9IG1pbjtcbiAgICAgICAgICAgICAgICAgIGlmIChtYXggPiBsbWF4KVxuICAgICAgICAgICAgICAgICAgICBsbWF4ID0gbWF4O1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgICAgaWYgKG5vcm1hbGl6ZSlcbiAgICAgICAgICAgIGRpc3RhbmNlTWF0cml4LmZvckVhY2goKHZhbHVlLCBpbmRleCkgPT4geyBkaXN0YW5jZU1hdHJpeFtpbmRleF0gPSAodmFsdWUgLSBsbWluKSAvIChsbWF4IC0gbG1pbik7IH0pO1xuICAgICAgICAgIHJlc29sdmUoZGlzdGFuY2VNYXRyaXgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdGVybWluYXRlKCk6IHZvaWQge1xuICAgICAgdGhpcy5fd29ya2Vycy5mb3JFYWNoKCh3b3JrZXIpID0+IHdvcmtlci50ZXJtaW5hdGUoKSk7XG4gICAgfVxufVxuIl19","/**\n * @license\n *\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ==============================================================================\n */\n/**\n * Simple random integer function\n */\nexport function tauRandInt(n, random) {\n return Math.floor(random() * n);\n}\n/**\n * Simple random float function\n */\nexport function tauRand(random) {\n return random();\n}\n/**\n * Compute the (standard l2) norm of a vector.\n */\nexport function norm(vec) {\n let result = 0;\n for (let item of vec) {\n result += item ** 2;\n }\n return Math.sqrt(result);\n}\n/**\n * Creates an empty array (filled with undefined)\n */\nexport function empty(n) {\n const output = [];\n for (let i = 0; i < n; i++) {\n output.push(undefined);\n }\n return output;\n}\n/**\n * Creates an array filled with index values\n */\nexport function range(n) {\n return empty(n).map((_, i) => i);\n}\n/**\n * Creates an array filled with a specific value\n */\nexport function filled(n, v) {\n return empty(n).map(() => v);\n}\n/**\n * Creates an array filled with zeros\n */\nexport function zeros(n) {\n return filled(n, 0);\n}\n/**\n * Creates an array filled with ones\n */\nexport function ones(n) {\n return filled(n, 1);\n}\n/**\n * Creates an array from a to b, of length len, inclusive\n */\nexport function linear(a, b, len) {\n return empty(len).map((_, i) => {\n return a + i * ((b - a) / (len - 1));\n });\n}\n/**\n * Returns the sum of an array\n */\nexport function sum(input) {\n return input.reduce((sum, val) => sum + val);\n}\n/**\n * Returns the mean of an array\n */\nexport function mean(input) {\n return sum(input) / input.length;\n}\n/**\n * Returns the maximum value of an array\n */\nexport function max(input) {\n let max = 0;\n for (let i = 0; i < input.length; i++) {\n max = input[i] > max ? input[i] : max;\n }\n return max;\n}\n/**\n * Returns the maximum value of a 2d array\n */\nexport function max2d(input) {\n let max = 0;\n for (let i = 0; i < input.length; i++) {\n for (let j = 0; j < input[i].length; j++) {\n max = input[i][j] > max ? input[i][j] : max;\n }\n }\n return max;\n}\n/**\n * Generate nSamples many integers from 0 to poolSize such that no\n * integer is selected twice. The duplication constraint is achieved via\n * rejection sampling.\n */\nexport function rejectionSample(nSamples, poolSize, random) {\n const result = zeros(nSamples);\n for (let i = 0; i < nSamples; i++) {\n let rejectSample = true;\n while (rejectSample) {\n const j = tauRandInt(poolSize, random);\n let broken = false;\n for (let k = 0; k < i; k++) {\n if (j === result[k]) {\n broken = true;\n break;\n }\n }\n if (!broken) {\n rejectSample = false;\n }\n result[i] = j;\n }\n }\n return result;\n}\n/**\n * Reshapes a 1d array into a 2D of given dimensions.\n */\nexport function reshape2d(x, a, b) {\n const rows = [];\n let count = 0;\n let index = 0;\n if (x.length !== a * b) {\n throw new Error('Array dimensions must match input length.');\n }\n for (let i = 0; i < a; i++) {\n const col = [];\n for (let j = 0; j < b; j++) {\n col.push(x[index]);\n index += 1;\n }\n rows.push(col);\n count += 1;\n }\n return rows;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFJSDs7R0FFRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsQ0FBUyxFQUFFLE1BQWdCO0lBQ3BELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFDLE1BQWdCO0lBQ3RDLE9BQU8sTUFBTSxFQUFFLENBQUM7QUFDbEIsQ0FBQztBQUNEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLElBQUksQ0FBQyxHQUFhO0lBQ2hDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNmLEtBQUssSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFO1FBQ3BCLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDO0tBQ3JCO0lBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxLQUFLLENBQUMsQ0FBUztJQUM3QixNQUFNLE1BQU0sR0FBZ0IsRUFBRSxDQUFDO0lBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUN4QjtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxLQUFLLENBQUMsQ0FBUztJQUM3QixPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FB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QUMsQ0FBQztTQUNaO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNmLEtBQUssSUFBSSxDQUFDLENBQUM7S0FDWjtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7IFJhbmRvbUZuIH0gZnJvbSAnLi91bWFwJztcblxuLyoqXG4gKiBTaW1wbGUgcmFuZG9tIGludGVnZXIgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhdVJhbmRJbnQobjogbnVtYmVyLCByYW5kb206IFJhbmRvbUZuKSB7XG4gIHJldHVybiBNYXRoLmZsb29yKHJhbmRvbSgpICogbik7XG59XG5cbi8qKlxuICogU2ltcGxlIHJhbmRvbSBmbG9hdCBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdGF1UmFuZChyYW5kb206IFJhbmRvbUZuKSB7XG4gIHJldHVybiByYW5kb20oKTtcbn1cbi8qKlxuICogQ29tcHV0ZSB0aGUgKHN0YW5kYXJkIGwyKSBub3JtIG9mIGEgdmVjdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybSh2ZWM6IG51bWJlcltdKSB7XG4gIGxldCByZXN1bHQgPSAwO1xuICBmb3IgKGxldCBpdGVtIG9mIHZlYykge1xuICAgIHJlc3VsdCArPSBpdGVtICoqIDI7XG4gIH1cbiAgcmV0dXJuIE1hdGguc3FydChyZXN1bHQpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZW1wdHkgYXJyYXkgKGZpbGxlZCB3aXRoIHVuZGVmaW5lZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5KG46IG51bWJlcik6IHVuZGVmaW5lZFtdIHtcbiAgY29uc3Qgb3V0cHV0OiB1bmRlZmluZWRbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIG91dHB1dC5wdXNoKHVuZGVmaW5lZCk7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGZpbGxlZCB3aXRoIGluZGV4IHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2UobjogbnVtYmVyKTogbnVtYmVyW10ge1xuICByZXR1cm4gZW1wdHkobikubWFwKChfLCBpKSA9PiBpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGZpbGxlZCB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxlZChuOiBudW1iZXIsIHY6IG51bWJlcik6IG51bWJlcltdIHtcbiAgcmV0dXJuIGVtcHR5KG4pLm1hcCgoKSA9PiB2KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGZpbGxlZCB3aXRoIHplcm9zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvcyhuOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIHJldHVybiBmaWxsZWQobiwgMCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBmaWxsZWQgd2l0aCBvbmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVzKG46IG51bWJlcik6IG51bWJlcltdIHtcbiAgcmV0dXJuIGZpbGxlZChuLCAxKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGZyb20gYSB0byBiLCBvZiBsZW5ndGggbGVuLCBpbmNsdXNpdmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpbmVhcihhOiBudW1iZXIsIGI6IG51bWJlciwgbGVuOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIHJldHVybiBlbXB0eShsZW4pLm1hcCgoXywgaSkgPT4ge1xuICAgIHJldHVybiBhICsgaSAqICgoYiAtIGEpIC8gKGxlbiAtIDEpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3VtIG9mIGFuIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdW0oaW5wdXQ6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgcmV0dXJuIGlucHV0LnJlZHVjZSgoc3VtLCB2YWwpID0+IHN1bSArIHZhbCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWVhbiBvZiBhbiBhcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVhbihpbnB1dDogbnVtYmVyW10pOiBudW1iZXIge1xuICByZXR1cm4gc3VtKGlucHV0KSAvIGlucHV0Lmxlbmd0aDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGFuIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXgoaW5wdXQ6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgbGV0IG1heCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICBtYXggPSBpbnB1dFtpXSA+IG1heCA/IGlucHV0W2ldIDogbWF4O1xuICB9XG4gIHJldHVybiBtYXg7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBhIDJkIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXgyZChpbnB1dDogbnVtYmVyW11bXSk6IG51bWJlciB7XG4gIGxldCBtYXggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbnB1dFtpXS5sZW5ndGg7IGorKykge1xuICAgICAgbWF4ID0gaW5wdXRbaV1bal0gPiBtYXggPyBpbnB1dFtpXVtqXSA6IG1heDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBuU2FtcGxlcyBtYW55IGludGVnZXJzIGZyb20gMCB0byBwb29sU2l6ZSBzdWNoIHRoYXQgbm9cbiAqIGludGVnZXIgaXMgc2VsZWN0ZWQgdHdpY2UuIFRoZSBkdXBsaWNhdGlvbiBjb25zdHJhaW50IGlzIGFjaGlldmVkIHZpYVxuICogcmVqZWN0aW9uIHNhbXBsaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVqZWN0aW9uU2FtcGxlKFxuICBuU2FtcGxlczogbnVtYmVyLFxuICBwb29sU2l6ZTogbnVtYmVyLFxuICByYW5kb206IFJhbmRvbUZuXG4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHJlc3VsdCA9IHplcm9zKG5TYW1wbGVzKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuU2FtcGxlczsgaSsrKSB7XG4gICAgbGV0IHJlamVjdFNhbXBsZSA9IHRydWU7XG4gICAgd2hpbGUgKHJlamVjdFNhbXBsZSkge1xuICAgICAgY29uc3QgaiA9IHRhdVJhbmRJbnQocG9vbFNpemUsIHJhbmRvbSk7XG4gICAgICBsZXQgYnJva2VuID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBrID0gMDsgayA8IGk7IGsrKykge1xuICAgICAgICBpZiAoaiA9PT0gcmVzdWx0W2tdKSB7XG4gICAgICAgICAgYnJva2VuID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFicm9rZW4pIHtcbiAgICAgICAgcmVqZWN0U2FtcGxlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXN1bHRbaV0gPSBqO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJlc2hhcGVzIGEgMWQgYXJyYXkgaW50byBhIDJEIG9mIGdpdmVuIGRpbWVuc2lvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNoYXBlMmQ8VD4oeDogVFtdLCBhOiBudW1iZXIsIGI6IG51bWJlcik6IFRbXVtdIHtcbiAgY29uc3Qgcm93czogVFtdW10gPSBbXTtcbiAgbGV0IGNvdW50ID0gMDtcbiAgbGV0IGluZGV4ID0gMDtcblxuICBpZiAoeC5sZW5ndGggIT09IGEgKiBiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBkaW1lbnNpb25zIG11c3QgbWF0Y2ggaW5wdXQgbGVuZ3RoLicpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhOyBpKyspIHtcbiAgICBjb25zdCBjb2w6IFRbXSA9IFtdO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgYjsgaisrKSB7XG4gICAgICBjb2wucHVzaCh4W2luZGV4XSk7XG4gICAgICBpbmRleCArPSAxO1xuICAgIH1cbiAgICByb3dzLnB1c2goY29sKTtcbiAgICBjb3VudCArPSAxO1xuICB9XG4gIHJldHVybiByb3dzO1xufVxuIl19","/**\n * @license\n *\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ==============================================================================\n */\nimport * as utils from './utils';\n/**\n * Constructor for the heap objects. The heaps are used\n * for approximate nearest neighbor search, maintaining a list of potential\n * neighbors sorted by their distance. We also flag if potential neighbors\n * are newly added to the list or not. Internally this is stored as\n * a single array; the first axis determines whether we are looking at the\n * array of candidate indices, the array of distances, or the flag array for\n * whether elements are new or not. Each of these arrays are of shape\n * (``nPoints``, ``size``)\n */\nexport function makeHeap(nPoints, size) {\n const makeArrays = (fillValue) => {\n return utils.empty(nPoints).map(() => {\n return utils.filled(size, fillValue);\n });\n };\n const heap = [];\n heap.push(makeArrays(-1));\n heap.push(makeArrays(Infinity));\n heap.push(makeArrays(0));\n return heap;\n}\n/**\n * Generate n_samples many integers from 0 to pool_size such that no\n * integer is selected twice. The duplication constraint is achieved via\n * rejection sampling.\n */\nexport function rejectionSample(nSamples, poolSize, random) {\n const result = utils.zeros(nSamples);\n for (let i = 0; i < nSamples; i++) {\n let rejectSample = true;\n let j = 0;\n while (rejectSample) {\n j = utils.tauRandInt(poolSize, random);\n let broken = false;\n for (let k = 0; k < i; k++) {\n if (j === result[k]) {\n broken = true;\n break;\n }\n }\n if (!broken)\n rejectSample = false;\n }\n result[i] = j;\n }\n return result;\n}\n/**\n * Push a new element onto the heap. The heap stores potential neighbors\n * for each data point. The ``row`` parameter determines which data point we\n * are addressing, the ``weight`` determines the distance (for heap sorting),\n * the ``index`` is the element to add, and the flag determines whether this\n * is to be considered a new addition.\n */\nexport function heapPush(heap, row, weight, index, flag) {\n row = Math.floor(row);\n const indices = heap[0][row];\n const weights = heap[1][row];\n const isNew = heap[2][row];\n if (weight >= weights[0]) {\n return 0;\n }\n // Break if we already have this element.\n for (let i = 0; i < indices.length; i++) {\n if (index === indices[i]) {\n return 0;\n }\n }\n return uncheckedHeapPush(heap, row, weight, index, flag);\n}\n/**\n * Push a new element onto the heap. The heap stores potential neighbors\n * for each data point. The ``row`` parameter determines which data point we\n * are addressing, the ``weight`` determines the distance (for heap sorting),\n * the ``index`` is the element to add, and the flag determines whether this\n * is to be considered a new addition.\n */\nexport function uncheckedHeapPush(heap, row, weight, index, flag) {\n const indices = heap[0][row];\n const weights = heap[1][row];\n const isNew = heap[2][row];\n if (weight >= weights[0]) {\n return 0;\n }\n // Insert val at position zero\n weights[0] = weight;\n indices[0] = index;\n isNew[0] = flag;\n // Descend the heap, swapping values until the max heap criterion is met\n let i = 0;\n let iSwap = 0;\n while (true) {\n const ic1 = 2 * i + 1;\n const ic2 = ic1 + 1;\n const heapShape2 = heap[0][0].length;\n if (ic1 >= heapShape2) {\n break;\n }\n else if (ic2 >= heapShape2) {\n if (weights[ic1] > weight) {\n iSwap = ic1;\n }\n else {\n break;\n }\n }\n else if (weights[ic1] >= weights[ic2]) {\n if (weight < weights[ic1]) {\n iSwap = ic1;\n }\n else {\n break;\n }\n }\n else {\n if (weight < weights[ic2]) {\n iSwap = ic2;\n }\n else {\n break;\n }\n }\n weights[i] = weights[iSwap];\n indices[i] = indices[iSwap];\n isNew[i] = isNew[iSwap];\n i = iSwap;\n }\n weights[i] = weight;\n indices[i] = index;\n isNew[i] = flag;\n return 1;\n}\n/**\n * Build a heap of candidate neighbors for nearest neighbor descent. For\n * each vertex the candidate neighbors are any current neighbors, and any\n * vertices that have the vertex as one of their nearest neighbors.\n */\nexport function buildCandidates(currentGraph, nVertices, nNeighbors, maxCandidates, random) {\n const candidateNeighbors = makeHeap(nVertices, maxCandidates);\n for (let i = 0; i < nVertices; i++) {\n for (let j = 0; j < nNeighbors; j++) {\n if (currentGraph[0][i][j] < 0) {\n continue;\n }\n const idx = currentGraph[0][i][j];\n const isn = currentGraph[2][i][j];\n const d = utils.tauRand(random);\n heapPush(candidateNeighbors, i, d, idx, isn);\n heapPush(candidateNeighbors, idx, d, i, isn);\n currentGraph[2][i][j] = 0;\n }\n }\n return candidateNeighbors;\n}\n/**\n * Given an array of heaps (of indices and weights), unpack the heap\n * out to give and array of sorted lists of indices and weights by increasing\n * weight. This is effectively just the second half of heap sort (the first\n * half not being required since we already have the data in a heap).\n */\nexport function deheapSort(heap) {\n const indices = heap[0];\n const weights = heap[1];\n for (let i = 0; i < indices.length; i++) {\n const indHeap = indices[i];\n const distHeap = weights[i];\n for (let j = 0; j < indHeap.length - 1; j++) {\n const indHeapIndex = indHeap.length - j - 1;\n const distHeapIndex = distHeap.length - j - 1;\n const temp1 = indHeap[0];\n indHeap[0] = indHeap[indHeapIndex];\n indHeap[indHeapIndex] = temp1;\n const temp2 = distHeap[0];\n distHeap[0] = distHeap[distHeapIndex];\n distHeap[distHeapIndex] = temp2;\n siftDown(distHeap, indHeap, distHeapIndex, 0);\n }\n }\n return { indices, weights };\n}\n/**\n * Restore the heap property for a heap with an out of place element\n * at position ``elt``. This works with a heap pair where heap1 carries\n * the weights and heap2 holds the corresponding elements.\n */\nfunction siftDown(heap1, heap2, ceiling, elt) {\n while (elt * 2 + 1 < ceiling) {\n const leftChild = elt * 2 + 1;\n const rightChild = leftChild + 1;\n let swap = elt;\n if (heap1[swap] < heap1[leftChild]) {\n swap = leftChild;\n }\n if (rightChild < ceiling && heap1[swap] < heap1[rightChild]) {\n swap = rightChild;\n }\n if (swap === elt) {\n break;\n }\n else {\n const temp1 = heap1[elt];\n heap1[elt] = heap1[swap];\n heap1[swap] = temp1;\n const temp2 = heap2[elt];\n heap2[elt] = heap2[swap];\n heap2[swap] = temp2;\n elt = swap;\n }\n }\n}\n/**\n * Search the heap for the smallest element that is still flagged.\n */\nexport function smallestFlagged(heap, row) {\n const ind = heap[0][row];\n const dist = heap[1][row];\n const flag = heap[2][row];\n let minDist = Infinity;\n let resultIndex = -1;\n for (let i = 0; i > ind.length; i++) {\n if (flag[i] === 1 && dist[i] < minDist) {\n minDist = dist[i];\n resultIndex = i;\n }\n }\n if (resultIndex >= 0) {\n flag[resultIndex] = 0;\n return Math.floor(ind[resultIndex]);\n }\n else {\n return -1;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhlYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBMkNILE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBSWpDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUMsT0FBZSxFQUFFLElBQVk7SUFDcEQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUU7UUFDdkMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDbkMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLE1BQU0sSUFBSSxHQUFTLEVBQUUsQ0FBQztJQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixRQUFnQixFQUNoQixRQUFnQixFQUNoQixNQUFnQjtJQUVoQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDakMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMs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SSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUUxQixJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUM7SUFDdkIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbkMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUU7WUFDdEMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQixXQUFXLEdBQUcsQ0FBQyxDQUFDO1NBQ2pCO0tBQ0Y7SUFFRCxJQUFJLFdBQVcsSUFBSSxDQUFDLEVBQUU7UUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7S0FDckM7U0FBTTtRQUNMLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FDWDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBKYXZhU2NyaXB0IHJlaW1wbGVtZW50YXRpb24gb2YgVU1BUCAob3JpZ2luYWwgbGljZW5zZSBiZWxvdyksIGZyb21cbiAqIHRoZSBweXRob24gaW1wbGVtZW50YXRpb24gZm91bmQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2xtY2lubmVzL3VtYXAuXG4gKlxuICogQGF1dGhvciBhbmR5Y29lbmVuQGdvb2dsZS5jb20gKEFuZHkgQ29lbmVuKVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIEJTRCAzLUNsYXVzZSBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE3LCBMZWxhbmQgTWNJbm5lc1xuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG5pbXBvcnQgeyBSYW5kb21GbiB9IGZyb20gJy4vdW1hcCc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IHR5cGUgSGVhcCA9IG51bWJlcltdW11bXTtcblxuLyoqXG4gKiAgQ29uc3RydWN0b3IgZm9yIHRoZSBoZWFwIG9iamVjdHMuIFRoZSBoZWFwcyBhcmUgdXNlZFxuICogZm9yIGFwcHJveGltYXRlIG5lYXJlc3QgbmVpZ2hib3Igc2VhcmNoLCBtYWludGFpbmluZyBhIGxpc3Qgb2YgcG90ZW50aWFsXG4gKiBuZWlnaGJvcnMgc29ydGVkIGJ5IHRoZWlyIGRpc3RhbmNlLiBXZSBhbHNvIGZsYWcgaWYgcG90ZW50aWFsIG5laWdoYm9yc1xuICogYXJlIG5ld2x5IGFkZGVkIHRvIHRoZSBsaXN0IG9yIG5vdC4gSW50ZXJuYWxseSB0aGlzIGlzIHN0b3JlZCBhc1xuICogYSBzaW5nbGUgYXJyYXk7IHRoZSBmaXJzdCBheGlzIGRldGVybWluZXMgd2hldGhlciB3ZSBhcmUgbG9va2luZyBhdCB0aGVcbiAqIGFycmF5IG9mIGNhbmRpZGF0ZSBpbmRpY2VzLCB0aGUgYXJyYXkgb2YgZGlzdGFuY2VzLCBvciB0aGUgZmxhZyBhcnJheSBmb3JcbiAqIHdoZXRoZXIgZWxlbWVudHMgYXJlIG5ldyBvciBub3QuIEVhY2ggb2YgdGhlc2UgYXJyYXlzIGFyZSBvZiBzaGFwZVxuICogKGBgblBvaW50c2BgLCBgYHNpemVgYClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VIZWFwKG5Qb2ludHM6IG51bWJlciwgc2l6ZTogbnVtYmVyKTogSGVhcCB7XG4gIGNvbnN0IG1ha2VBcnJheXMgPSAoZmlsbFZhbHVlOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gdXRpbHMuZW1wdHkoblBvaW50cykubWFwKCgpID0+IHtcbiAgICAgIHJldHVybiB1dGlscy5maWxsZWQoc2l6ZSwgZmlsbFZhbHVlKTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBoZWFwOiBIZWFwID0gW107XG4gIGhlYXAucHVzaChtYWtlQXJyYXlzKC0xKSk7XG4gIGhlYXAucHVzaChtYWtlQXJyYXlzKEluZmluaXR5KSk7XG4gIGhlYXAucHVzaChtYWtlQXJyYXlzKDApKTtcbiAgcmV0dXJuIGhlYXA7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgbl9zYW1wbGVzIG1hbnkgaW50ZWdlcnMgZnJvbSAwIHRvIHBvb2xfc2l6ZSBzdWNoIHRoYXQgbm9cbiAqIGludGVnZXIgaXMgc2VsZWN0ZWQgdHdpY2UuIFRoZSBkdXBsaWNhdGlvbiBjb25zdHJhaW50IGlzIGFjaGlldmVkIHZpYVxuICogcmVqZWN0aW9uIHNhbXBsaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVqZWN0aW9uU2FtcGxlKFxuICBuU2FtcGxlczogbnVtYmVyLFxuICBwb29sU2l6ZTogbnVtYmVyLFxuICByYW5kb206IFJhbmRvbUZuXG4pIHtcbiAgY29uc3QgcmVzdWx0ID0gdXRpbHMuemVyb3MoblNhbXBsZXMpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5TYW1wbGVzOyBpKyspIHtcbiAgICBsZXQgcmVqZWN0U2FtcGxlID0gdHJ1ZTtcbiAgICBsZXQgaiA9IDA7XG4gICAgd2hpbGUgKHJlamVjdFNhbXBsZSkge1xuICAgICAgaiA9IHV0aWxzLnRhdVJhbmRJbnQocG9vbFNpemUsIHJhbmRvbSk7XG4gICAgICBsZXQgYnJva2VuID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBrID0gMDsgayA8IGk7IGsrKykge1xuICAgICAgICBpZiAoaiA9PT0gcmVzdWx0W2tdKSB7XG4gICAgICAgICAgYnJva2VuID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFicm9rZW4pIHJlamVjdFNhbXBsZSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXN1bHRbaV0gPSBqO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUHVzaCBhIG5ldyBlbGVtZW50IG9udG8gdGhlIGhlYXAuIFRoZSBoZWFwIHN0b3JlcyBwb3RlbnRpYWwgbmVpZ2hib3JzXG4gKiBmb3IgZWFjaCBkYXRhIHBvaW50LiBUaGUgYGByb3dgYCBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB3aGljaCBkYXRhIHBvaW50IHdlXG4gKiBhcmUgYWRkcmVzc2luZywgdGhlIGBgd2VpZ2h0YGAgZGV0ZXJtaW5lcyB0aGUgZGlzdGFuY2UgKGZvciBoZWFwIHNvcnRpbmcpLFxuICogdGhlIGBgaW5kZXhgYCBpcyB0aGUgZWxlbWVudCB0byBhZGQsIGFuZCB0aGUgZmxhZyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhpc1xuICogaXMgdG8gYmUgY29uc2lkZXJlZCBhIG5ldyBhZGRpdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhlYXBQdXNoKFxuICBoZWFwOiBIZWFwLFxuICByb3c6IG51bWJlcixcbiAgd2VpZ2h0OiBudW1iZXIsXG4gIGluZGV4OiBudW1iZXIsXG4gIGZsYWc6IG51bWJlclxuKTogbnVtYmVyIHtcbiAgcm93ID0gTWF0aC5mbG9vcihyb3cpO1xuICBjb25zdCBpbmRpY2VzID0gaGVhcFswXVtyb3ddO1xuICBjb25zdCB3ZWlnaHRzID0gaGVhcFsxXVtyb3ddO1xuICBjb25zdCBpc05ldyA9IGhlYXBbMl1bcm93XTtcblxuICBpZiAod2VpZ2h0ID49IHdlaWdodHNbMF0pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8vIEJyZWFrIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGlzIGVsZW1lbnQuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChpbmRleCA9PT0gaW5kaWNlc1tpXSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuY2hlY2tlZEhlYXBQdXNoKGhlYXAsIHJvdywgd2VpZ2h0LCBpbmRleCwgZmxhZyk7XG59XG5cbi8qKlxuICogUHVzaCBhIG5ldyBlbGVtZW50IG9udG8gdGhlIGhlYXAuIFRoZSBoZWFwIHN0b3JlcyBwb3RlbnRpYWwgbmVpZ2hib3JzXG4gKiBmb3IgZWFjaCBkYXRhIHBvaW50LiBUaGUgYGByb3dgYCBwYXJhbWV0ZXIgZGV0ZXJtaW5lcyB3aGljaCBkYXRhIHBvaW50IHdlXG4gKiBhcmUgYWRkcmVzc2luZywgdGhlIGBgd2VpZ2h0YGAgZGV0ZXJtaW5lcyB0aGUgZGlzdGFuY2UgKGZvciBoZWFwIHNvcnRpbmcpLFxuICogdGhlIGBgaW5kZXhgYCBpcyB0aGUgZWxlbWVudCB0byBhZGQsIGFuZCB0aGUgZmxhZyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhpc1xuICogaXMgdG8gYmUgY29uc2lkZXJlZCBhIG5ldyBhZGRpdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuY2hlY2tlZEhlYXBQdXNoKFxuICBoZWFwOiBIZWFwLFxuICByb3c6IG51bWJlcixcbiAgd2VpZ2h0OiBudW1iZXIsXG4gIGluZGV4OiBudW1iZXIsXG4gIGZsYWc6IG51bWJlclxuKTogbnVtYmVyIHtcbiAgY29uc3QgaW5kaWNlcyA9IGhlYXBbMF1bcm93XTtcbiAgY29uc3Qgd2VpZ2h0cyA9IGhlYXBbMV1bcm93XTtcbiAgY29uc3QgaXNOZXcgPSBoZWFwWzJdW3Jvd107XG5cbiAgaWYgKHdlaWdodCA+PSB3ZWlnaHRzWzBdKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvLyBJbnNlcnQgdmFsIGF0IHBvc2l0aW9uIHplcm9cbiAgd2VpZ2h0c1swXSA9IHdlaWdodDtcbiAgaW5kaWNlc1swXSA9IGluZGV4O1xuICBpc05ld1swXSA9IGZsYWc7XG5cbiAgLy8gRGVzY2VuZCB0aGUgaGVhcCwgc3dhcHBpbmcgdmFsdWVzIHVudGlsIHRoZSBtYXggaGVhcCBjcml0ZXJpb24gaXMgbWV0XG4gIGxldCBpID0gMDtcbiAgbGV0IGlTd2FwID0gMDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBpYzEgPSAyICogaSArIDE7XG4gICAgY29uc3QgaWMyID0gaWMxICsgMTtcblxuICAgIGNvbnN0IGhlYXBTaGFwZTIgPSBoZWFwWzBdWzBdLmxlbmd0aDtcbiAgICBpZiAoaWMxID49IGhlYXBTaGFwZTIpIHtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSBpZiAoaWMyID49IGhlYXBTaGFwZTIpIHtcbiAgICAgIGlmICh3ZWlnaHRzW2ljMV0gPiB3ZWlnaHQpIHtcbiAgICAgICAgaVN3YXAgPSBpYzE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHdlaWdodHNbaWMxXSA+PSB3ZWlnaHRzW2ljMl0pIHtcbiAgICAgIGlmICh3ZWlnaHQgPCB3ZWlnaHRzW2ljMV0pIHtcbiAgICAgICAgaVN3YXAgPSBpYzE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHdlaWdodCA8IHdlaWdodHNbaWMyXSkge1xuICAgICAgICBpU3dhcCA9IGljMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdlaWdodHNbaV0gPSB3ZWlnaHRzW2lTd2FwXTtcbiAgICBpbmRpY2VzW2ldID0gaW5kaWNlc1tpU3dhcF07XG4gICAgaXNOZXdbaV0gPSBpc05ld1tpU3dhcF07XG5cbiAgICBpID0gaVN3YXA7XG4gIH1cblxuICB3ZWlnaHRzW2ldID0gd2VpZ2h0O1xuICBpbmRpY2VzW2ldID0gaW5kZXg7XG4gIGlzTmV3W2ldID0gZmxhZztcbiAgcmV0dXJuIDE7XG59XG5cbi8qKlxuICogQnVpbGQgYSBoZWFwIG9mIGNhbmRpZGF0ZSBuZWlnaGJvcnMgZm9yIG5lYXJlc3QgbmVpZ2hib3IgZGVzY2VudC4gRm9yXG4gKiBlYWNoIHZlcnRleCB0aGUgY2FuZGlkYXRlIG5laWdoYm9ycyBhcmUgYW55IGN1cnJlbnQgbmVpZ2hib3JzLCBhbmQgYW55XG4gKiB2ZXJ0aWNlcyB0aGF0IGhhdmUgdGhlIHZlcnRleCBhcyBvbmUgb2YgdGhlaXIgbmVhcmVzdCBuZWlnaGJvcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENhbmRpZGF0ZXMoXG4gIGN1cnJlbnRHcmFwaDogSGVhcCxcbiAgblZlcnRpY2VzOiBudW1iZXIsXG4gIG5OZWlnaGJvcnM6IG51bWJlcixcbiAgbWF4Q2FuZGlkYXRlczogbnVtYmVyLFxuICByYW5kb206IFJhbmRvbUZuXG4pIHtcbiAgY29uc3QgY2FuZGlkYXRlTmVpZ2hib3JzID0gbWFrZUhlYXAoblZlcnRpY2VzLCBtYXhDYW5kaWRhdGVzKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuVmVydGljZXM7IGkrKykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbk5laWdoYm9yczsgaisrKSB7XG4gICAgICBpZiAoY3VycmVudEdyYXBoWzBdW2ldW2pdIDwgMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlkeCA9IGN1cnJlbnRHcmFwaFswXVtpXVtqXTtcbiAgICAgIGNvbnN0IGlzbiA9IGN1cnJlbnRHcmFwaFsyXVtpXVtqXTtcbiAgICAgIGNvbnN0IGQgPSB1dGlscy50YXVSYW5kKHJhbmRvbSk7XG4gICAgICBoZWFwUHVzaChjYW5kaWRhdGVOZWlnaGJvcnMsIGksIGQsIGlkeCwgaXNuKTtcbiAgICAgIGhlYXBQdXNoKGNhbmRpZGF0ZU5laWdoYm9ycywgaWR4LCBkLCBpLCBpc24pO1xuICAgICAgY3VycmVudEdyYXBoWzJdW2ldW2pdID0gMDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNhbmRpZGF0ZU5laWdoYm9ycztcbn1cblxuLyoqXG4gKiBHaXZlbiBhbiBhcnJheSBvZiBoZWFwcyAob2YgaW5kaWNlcyBhbmQgd2VpZ2h0cyksIHVucGFjayB0aGUgaGVhcFxuICogb3V0IHRvIGdpdmUgYW5kIGFycmF5IG9mIHNvcnRlZCBsaXN0cyBvZiBpbmRpY2VzIGFuZCB3ZWlnaHRzIGJ5IGluY3JlYXNpbmdcbiAqIHdlaWdodC4gVGhpcyBpcyBlZmZlY3RpdmVseSBqdXN0IHRoZSBzZWNvbmQgaGFsZiBvZiBoZWFwIHNvcnQgKHRoZSBmaXJzdFxuICogaGFsZiBub3QgYmVpbmcgcmVxdWlyZWQgc2luY2Ugd2UgYWxyZWFkeSBoYXZlIHRoZSBkYXRhIGluIGEgaGVhcCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWhlYXBTb3J0KGhlYXA6IEhlYXApIHtcbiAgY29uc3QgaW5kaWNlcyA9IGhlYXBbMF07XG4gIGNvbnN0IHdlaWdodHMgPSBoZWFwWzFdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGluZEhlYXAgPSBpbmRpY2VzW2ldO1xuICAgIGNvbnN0IGRpc3RIZWFwID0gd2VpZ2h0c1tpXTtcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5kSGVhcC5sZW5ndGggLSAxOyBqKyspIHtcbiAgICAgIGNvbnN0IGluZEhlYXBJbmRleCA9IGluZEhlYXAubGVuZ3RoIC0gaiAtIDE7XG4gICAgICBjb25zdCBkaXN0SGVhcEluZGV4ID0gZGlzdEhlYXAubGVuZ3RoIC0gaiAtIDE7XG5cbiAgICAgIGNvbnN0IHRlbXAxID0gaW5kSGVhcFswXTtcbiAgICAgIGluZEhlYXBbMF0gPSBpbmRIZWFwW2luZEhlYXBJbmRleF07XG4gICAgICBpbmRIZWFwW2luZEhlYXBJbmRleF0gPSB0ZW1wMTtcblxuICAgICAgY29uc3QgdGVtcDIgPSBkaXN0SGVhcFswXTtcbiAgICAgIGRpc3RIZWFwWzBdID0gZGlzdEhlYXBbZGlzdEhlYXBJbmRleF07XG4gICAgICBkaXN0SGVhcFtkaXN0SGVhcEluZGV4XSA9IHRlbXAyO1xuXG4gICAgICBzaWZ0RG93bihkaXN0SGVhcCwgaW5kSGVhcCwgZGlzdEhlYXBJbmRleCwgMCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGluZGljZXMsIHdlaWdodHMgfTtcbn1cblxuLyoqXG4gKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGZvciBhIGhlYXAgd2l0aCBhbiBvdXQgb2YgcGxhY2UgZWxlbWVudFxuICogYXQgcG9zaXRpb24gYGBlbHRgYC4gVGhpcyB3b3JrcyB3aXRoIGEgaGVhcCBwYWlyIHdoZXJlIGhlYXAxIGNhcnJpZXNcbiAqIHRoZSB3ZWlnaHRzIGFuZCBoZWFwMiBob2xkcyB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cy5cbiAqL1xuZnVuY3Rpb24gc2lmdERvd24oXG4gIGhlYXAxOiBudW1iZXJbXSxcbiAgaGVhcDI6IG51bWJlcltdLFxuICBjZWlsaW5nOiBudW1iZXIsXG4gIGVsdDogbnVtYmVyXG4pIHtcbiAgd2hpbGUgKGVsdCAqIDIgKyAxIDwgY2VpbGluZykge1xuICAgIGNvbnN0IGxlZnRDaGlsZCA9IGVsdCAqIDIgKyAxO1xuICAgIGNvbnN0IHJpZ2h0Q2hpbGQgPSBsZWZ0Q2hpbGQgKyAxO1xuICAgIGxldCBzd2FwID0gZWx0O1xuXG4gICAgaWYgKGhlYXAxW3N3YXBdIDwgaGVhcDFbbGVmdENoaWxkXSkge1xuICAgICAgc3dhcCA9IGxlZnRDaGlsZDtcbiAgICB9XG4gICAgaWYgKHJpZ2h0Q2hpbGQgPCBjZWlsaW5nICYmIGhlYXAxW3N3YXBdIDwgaGVhcDFbcmlnaHRDaGlsZF0pIHtcbiAgICAgIHN3YXAgPSByaWdodENoaWxkO1xuICAgIH1cblxuICAgIGlmIChzd2FwID09PSBlbHQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0ZW1wMSA9IGhlYXAxW2VsdF07XG4gICAgICBoZWFwMVtlbHRdID0gaGVhcDFbc3dhcF07XG4gICAgICBoZWFwMVtzd2FwXSA9IHRlbXAxO1xuXG4gICAgICBjb25zdCB0ZW1wMiA9IGhlYXAyW2VsdF07XG4gICAgICBoZWFwMltlbHRdID0gaGVhcDJbc3dhcF07XG4gICAgICBoZWFwMltzd2FwXSA9IHRlbXAyO1xuICAgICAgZWx0ID0gc3dhcDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTZWFyY2ggdGhlIGhlYXAgZm9yIHRoZSBzbWFsbGVzdCBlbGVtZW50IHRoYXQgaXMgc3RpbGwgZmxhZ2dlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNtYWxsZXN0RmxhZ2dlZChoZWFwOiBIZWFwLCByb3c6IG51bWJlcikge1xuICBjb25zdCBpbmQgPSBoZWFwWzBdW3Jvd107XG4gIGNvbnN0IGRpc3QgPSBoZWFwWzFdW3Jvd107XG4gIGNvbnN0IGZsYWcgPSBoZWFwWzJdW3Jvd107XG5cbiAgbGV0IG1pbkRpc3QgPSBJbmZpbml0eTtcbiAgbGV0IHJlc3VsdEluZGV4ID0gLTE7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPiBpbmQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZmxhZ1tpXSA9PT0gMSAmJiBkaXN0W2ldIDwgbWluRGlzdCkge1xuICAgICAgbWluRGlzdCA9IGRpc3RbaV07XG4gICAgICByZXN1bHRJbmRleCA9IGk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHJlc3VsdEluZGV4ID49IDApIHtcbiAgICBmbGFnW3Jlc3VsdEluZGV4XSA9IDA7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoaW5kW3Jlc3VsdEluZGV4XSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG4iXX0=","/**\n * @license\n *\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ==============================================================================\n */\nimport * as utils from './utils';\n/**\n * Internal 2-dimensional sparse matrix class\n */\nexport class SparseMatrix {\n entries = new Map();\n nRows = 0;\n nCols = 0;\n constructor(rows, cols, values, dims) {\n if (rows.length !== cols.length || rows.length !== values.length) {\n throw new Error('rows, cols and values arrays must all have the same length');\n }\n // TODO: Assert that dims are legit.\n this.nRows = dims[0];\n this.nCols = dims[1];\n for (let i = 0; i < values.length; i++) {\n const row = rows[i];\n const col = cols[i];\n this.checkDims(row, col);\n const key = this.makeKey(row, col);\n this.entries.set(key, { value: values[i], row, col });\n }\n }\n makeKey(row, col) {\n return `${row}:${col}`;\n }\n checkDims(row, col) {\n const withinBounds = row < this.nRows && col < this.nCols;\n if (!withinBounds) {\n throw new Error('row and/or col specified outside of matrix dimensions');\n }\n }\n set(row, col, value) {\n this.checkDims(row, col);\n const key = this.makeKey(row, col);\n if (!this.entries.has(key)) {\n this.entries.set(key, { value, row, col });\n }\n else {\n this.entries.get(key).value = value;\n }\n }\n get(row, col, defaultValue = 0) {\n //this.checkDims(row, col);\n const key = this.makeKey(row, col);\n if (this.entries.has(key)) {\n return this.entries.get(key).value;\n }\n else {\n return defaultValue;\n }\n }\n getAll(ordered = true) {\n const rowColValues = new Array(this.entries.size).fill(null);\n let i = 0;\n this.entries.forEach(value => {\n rowColValues[i++] = value;\n });\n if (ordered) {\n // Ordering the result isn't required for processing but it does make it easier to write tests\n rowColValues.sort((a, b) => {\n if (a.row === b.row) {\n return a.col - b.col;\n }\n else {\n return a.row - b.row;\n }\n });\n }\n return rowColValues;\n }\n getDims() {\n return [this.nRows, this.nCols];\n }\n getRows() {\n return Array.from(this.entries, ([key, value]) => value.row);\n // return this.rows as unknown as number[];\n }\n getCols() {\n return Array.from(this.entries, ([key, value]) => value.col);\n // return this.cols as unknown as number[];\n }\n getValues() {\n return Array.from(this.entries, ([key, value]) => value.value);\n //return this.values as unknown as number[];\n }\n forEach(fn) {\n this.entries.forEach(value => fn(value.value, value.row, value.col));\n }\n map(fn) {\n const vals = new Float32Array(this.entries.size);\n let i = 0;\n this.entries.forEach(value => {\n vals[i++] = fn(value.value, value.row, value.col);\n });\n const dims = [this.nRows, this.nCols];\n return new SparseMatrix(this.getRows(), this.getCols(), vals, dims);\n }\n toArray() {\n const rows = utils.empty(this.nRows);\n const output = rows.map(() => {\n return utils.zeros(this.nCols);\n });\n this.entries.forEach(value => {\n output[value.row][value.col] = value.value;\n });\n return output;\n }\n}\n/**\n * Transpose a sparse matrix\n */\nexport function transpose(matrix) {\n const oldRows = matrix.getRows();\n const oldCols = matrix.getCols();\n const oldVals = matrix.getValues();\n const matlen = oldCols.length;\n const cols = new Int32Array(matlen);\n const rows = new Int32Array(matlen);\n const vals = new Float32Array(matlen);\n cols.set(oldRows);\n rows.set(oldCols);\n vals.set(oldVals);\n const dims = [matrix.nCols, matrix.nRows];\n return new SparseMatrix(rows, cols, vals, dims);\n}\n/**\n * Construct a sparse identity matrix\n */\nexport function identity(size) {\n const [rows] = size;\n const matrix = new SparseMatrix([], [], [], size);\n for (let i = 0; i < rows; i++) {\n matrix.set(i, i, 1);\n }\n return matrix;\n}\n/**\n * Element-wise multiplication of two matrices\n */\nexport function pairwiseMultiply(a, b) {\n return elementWise(a, b, (x, y) => x * y);\n}\n/**\n * Element-wise addition of two matrices\n */\nexport function add(a, b) {\n return elementWise(a, b, (x, y) => x + y);\n}\n/**\n * Element-wise subtraction of two matrices\n */\nexport function subtract(a, b) {\n return elementWise(a, b, (x, y) => x - y);\n}\n/**\n * Element-wise maximum of two matrices\n */\nexport function maximum(a, b) {\n return elementWise(a, b, (x, y) => (x > y ? x : y));\n}\n/**\n * Scalar multiplication of two matrices\n */\nexport function multiplyScalar(a, scalar) {\n return a.map((value) => {\n return value * scalar;\n });\n}\n/**\n * Returns a new matrix with zero entries removed.\n */\nexport function eliminateZeros(m) {\n const zeroIndices = new Set();\n const values = m.getValues();\n const rows = m.getRows();\n const cols = m.getCols();\n for (let i = 0; i < values.length; i++) {\n if (values[i] === 0) {\n zeroIndices.add(i);\n }\n }\n const removeByZeroIndex = (_, index) => !zeroIndices.has(index);\n const nextValues = values.filter(removeByZeroIndex);\n const nextRows = rows.filter(removeByZeroIndex);\n const nextCols = cols.filter(removeByZeroIndex);\n return new SparseMatrix(nextRows, nextCols, nextValues, m.getDims());\n}\n/**\n * Normalization of a sparse matrix.\n */\nexport function normalize(m, normType = \"l2\" /* NormType.l2 */) {\n const normFn = normFns[normType];\n const colsByRow = new Map();\n m.forEach((_, row, col) => {\n const cols = colsByRow.get(row) || [];\n cols.push(col);\n colsByRow.set(row, cols);\n });\n const nextMatrix = new SparseMatrix([], [], [], m.getDims());\n for (let row of colsByRow.keys()) {\n const cols = colsByRow.get(row).sort();\n const vals = cols.map(col => m.get(row, col));\n const norm = normFn(vals);\n for (let i = 0; i < norm.length; i++) {\n nextMatrix.set(row, cols[i], norm[i]);\n }\n }\n return nextMatrix;\n}\nconst normFns = {\n [\"max\" /* NormType.max */]: (xs) => {\n let max = -Infinity;\n for (let i = 0; i < xs.length; i++) {\n max = xs[i] > max ? xs[i] : max;\n }\n return xs.map(x => x / max);\n },\n [\"l1\" /* NormType.l1 */]: (xs) => {\n let sum = 0;\n for (let i = 0; i < xs.length; i++) {\n sum += xs[i];\n }\n return xs.map(x => x / sum);\n },\n [\"l2\" /* NormType.l2 */]: (xs) => {\n let sum = 0;\n for (let i = 0; i < xs.length; i++) {\n sum += xs[i] ** 2;\n }\n return xs.map(x => Math.sqrt(x ** 2 / sum));\n },\n};\n/**\n * Helper function for element-wise operations.\n */\nfunction elementWise(a, b, op) {\n const visited = new Set();\n const rows = [];\n const cols = [];\n const vals = [];\n const operate = (row, col) => {\n rows.push(row);\n cols.push(col);\n const nextValue = op(a.get(row, col), b.get(row, col));\n vals.push(nextValue);\n };\n const valuesA = a.getValues();\n const rowsA = a.getRows();\n const colsA = a.getCols();\n for (let i = 0; i < valuesA.length; i++) {\n const row = rowsA[i];\n const col = colsA[i];\n const key = `${row}:${col}`;\n visited.add(key);\n operate(row, col);\n }\n const valuesB = b.getValues();\n const rowsB = b.getRows();\n const colsB = b.getCols();\n for (let i = 0; i < valuesB.length; i++) {\n const row = rowsB[i];\n const col = colsB[i];\n const key = `${row}:${col}`;\n if (visited.has(key))\n continue;\n operate(row, col);\n }\n const dims = [a.nRows, a.nCols];\n return new SparseMatrix(rows, cols, vals, dims);\n}\n/**\n * Helper function for getting data, indices, and inptr arrays from a sparse\n * matrix to follow csr matrix conventions. Super inefficient (and kind of\n * defeats the purpose of this convention) but a lot of the ported python tree\n * search logic depends on this data format.\n */\nexport function getCSR(x) {\n const entries = [];\n x.forEach((value, row, col) => {\n entries.push({ value, row, col });\n });\n entries.sort((a, b) => {\n if (a.row === b.row) {\n return a.col - b.col;\n }\n else {\n return a.row - b.row;\n }\n });\n const indices = [];\n const values = [];\n const indptr = [];\n let currentRow = -1;\n for (let i = 0; i < entries.length; i++) {\n const { row, col, value } = entries[i];\n if (row !== currentRow) {\n currentRow = row;\n indptr.push(i);\n }\n indices.push(col);\n values.push(value);\n }\n return { indices, values, indptr };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0cml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWF0cml4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVILE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBSWpDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFDZixPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQWlCLENBQUM7SUFFbEMsS0FBSyxHQUFXLENBQUMsQ0FBQztJQUNsQixLQUFLLEdBQVcsQ0FBQyxDQUFDO0lBRTNCLFlBQ0UsSUFBMkIsRUFDM0IsSUFBMkIsRUFDM0IsTUFBK0IsRUFDL0IsSUFBYztRQUVkLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNoRSxNQUFNLElBQUksS0FBSyxDQUNiLDREQUE0RCxDQUM3RCxDQUFDO1NBQ0g7UUFFRCxvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN6QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZEO0lBQ0gsQ0FBQztJQUVPLE9BQU8sQ0FBQyxHQUFXLEVBQUUsR0FBVztRQUN0QyxPQUFPLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxTQUFTLENBQUMsR0FBVyxFQUFFLEdBQVc7UUFDeEMsTUFBTSxZQUFZLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDMUQsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7U0FDMUU7SUFDSCxDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQVcsRUFBRSxHQUFXLEVBQUUsS0FBYTtRQUN6QyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN6QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQzVDO2FBQU07WUFDTCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFXLEVBQUUsR0FBVyxFQUFFLFlBQVksR0FBRyxDQUFDO1FBQzVDLDJCQUEyQjtRQUMzQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNuQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFFLENBQUMsS0FBSyxDQUFDO1NBQ3JDO2FBQU07WUFDTCxPQUFPLFlBQVksQ0FBQztTQUNyQjtJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUk7UUFDbkIsTUFBTSxZQUFZLEdBQVksSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDM0IsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxPQUFPLEVBQUU7WUFDWCw4RkFBOEY7WUFDOUYsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDekIsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUU7b0JBQ25CLE9BQU8sQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO2lCQUN0QjtxQkFBTTtvQkFDTCxPQUFPLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztpQkFDdEI7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELE9BQU87UUFDTixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0QsMkNBQTJDO0lBQzVDLENBQUM7SUFFRCxPQUFPO1FBQ04sT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdELDJDQUEyQztJQUM1QyxDQUFDO0lBRUQsU0FBUztRQUNULE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvRCw0Q0FBNEM7SUFDNUMsQ0FBQztJQUVELE9BQU8sQ0FBQyxFQUFxRDtRQUMzRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELEdBQUcsQ0FBQyxFQUF1RDtRQUN6RCxNQUFNLElBQUksR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNULElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzNCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxPQUFPLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBMkIsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQsT0FBTztRQUNMLE1BQU0sSUFBSSxHQUFnQixLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUMzQixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDM0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxNQUFvQjtJQUM1QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQzlCLE1BQU0sSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXRDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xCLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLElBQWM7SUFDckMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNwQixNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNyQjtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsQ0FBZSxFQUNmLENBQWU7SUFFZixPQUFPLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBZSxFQUFFLENBQWU7SUFDbEQsT0FBTyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLENBQWUsRUFBRSxDQUFlO0lBQ3ZELE9BQU8sV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBQyxDQUFlLEVBQUUsQ0FBZTtJQUN0RCxPQUFPLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxDQUFlLEVBQUUsTUFBYztJQUM1RCxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFhLEVBQUUsRUFBRTtRQUM3QixPQUFPLEtBQUssR0FBRyxNQUFNLENBQUM7SUFDeEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLENBQWU7SUFDNUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUM5QixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDN0IsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3pCLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN0QyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbkIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwQjtLQUNGO0lBQ0QsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQU0sRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3RSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUVoRCxPQUFPLElBQUksWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsQ0FBZSxFQUFFLFFBQVEseUJBQWM7SUFDL0QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRWpDLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBQzlDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ3hCLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sVUFBVSxHQUFHLElBQUksWUFBWSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBRTdELEtBQUssSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ2hDLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFeEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN2QztLQUNGO0lBRUQsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQU1ELE1BQU0sT0FBTyxHQUFZO0lBQ3ZCLDBCQUFjLEVBQUUsQ0FBQyxFQUFZLEVBQUUsRUFBRTtRQUMvQixJQUFJLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7U0FDakM7UUFDRCxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUNELHdCQUFhLEVBQUUsQ0FBQyxFQUFZLEVBQUUsRUFBRTtRQUM5QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUNELHdCQUFhLEVBQUUsQ0FBQyxFQUFZLEVBQUUsRUFBRTtRQUM5QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQjtRQUNELE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7Q0FDRixDQUFDO0FBUUY7O0dBRUc7QUFDSCxTQUFTLFdBQVcsQ0FDbEIsQ0FBZSxFQUNmLENBQWUsRUFDZixFQUFvQztJQUVwQyxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztJQUMxQixNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7SUFDMUIsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO0lBRTFCLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBVyxFQUFFLEdBQVcsRUFBRSxFQUFFO1FBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2QixDQUFDLENBQUM7SUFDRixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzFCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN2QyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUNuQjtJQUVELE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM5QixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDMUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3ZDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUFFLFNBQVM7UUFDL0IsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUNuQjtJQUVELE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLENBQWU7SUFDcEMsTUFBTSxPQUFPLEdBQVksRUFBRSxDQUFDO0lBRTVCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO1NBQ3RCO2FBQU07WUFDTCxPQUFPLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUN0QjtJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBQzdCLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFFNUIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDcEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdkMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksR0FBRyxLQUFLLFVBQVUsRUFBRTtZQUN0QixVQUFVLEdBQUcsR0FBRyxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEI7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDcEI7SUFFRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbnR5cGUgRW50cnkgPSB7IHZhbHVlOiBudW1iZXI7IHJvdzogbnVtYmVyOyBjb2w6IG51bWJlciB9O1xuXG4vKipcbiAqIEludGVybmFsIDItZGltZW5zaW9uYWwgc3BhcnNlIG1hdHJpeCBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgU3BhcnNlTWF0cml4IHtcbiAgcHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIEVudHJ5PigpO1xuXG4gIHJlYWRvbmx5IG5Sb3dzOiBudW1iZXIgPSAwO1xuICByZWFkb25seSBuQ29sczogbnVtYmVyID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICByb3dzOiBudW1iZXJbXSB8IEludDMyQXJyYXksXG4gICAgY29sczogbnVtYmVyW10gfCBJbnQzMkFycmF5LFxuICAgIHZhbHVlczogbnVtYmVyW10gfCBGbG9hdDMyQXJyYXksXG4gICAgZGltczogbnVtYmVyW11cbiAgKSB7XG4gICAgaWYgKHJvd3MubGVuZ3RoICE9PSBjb2xzLmxlbmd0aCB8fCByb3dzLmxlbmd0aCAhPT0gdmFsdWVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAncm93cywgY29scyBhbmQgdmFsdWVzIGFycmF5cyBtdXN0IGFsbCBoYXZlIHRoZSBzYW1lIGxlbmd0aCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogQXNzZXJ0IHRoYXQgZGltcyBhcmUgbGVnaXQuXG4gICAgdGhpcy5uUm93cyA9IGRpbXNbMF07XG4gICAgdGhpcy5uQ29scyA9IGRpbXNbMV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJvdyA9IHJvd3NbaV07XG4gICAgICBjb25zdCBjb2wgPSBjb2xzW2ldO1xuICAgICAgdGhpcy5jaGVja0RpbXMocm93LCBjb2wpO1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5tYWtlS2V5KHJvdywgY29sKTtcbiAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7IHZhbHVlOiB2YWx1ZXNbaV0sIHJvdywgY29sIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWFrZUtleShyb3c6IG51bWJlciwgY29sOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtyb3d9OiR7Y29sfWA7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRGltcyhyb3c6IG51bWJlciwgY29sOiBudW1iZXIpIHtcbiAgICBjb25zdCB3aXRoaW5Cb3VuZHMgPSByb3cgPCB0aGlzLm5Sb3dzICYmIGNvbCA8IHRoaXMubkNvbHM7XG4gICAgaWYgKCF3aXRoaW5Cb3VuZHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncm93IGFuZC9vciBjb2wgc3BlY2lmaWVkIG91dHNpZGUgb2YgbWF0cml4IGRpbWVuc2lvbnMnKTtcbiAgICB9XG4gIH1cblxuICBzZXQocm93OiBudW1iZXIsIGNvbDogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5jaGVja0RpbXMocm93LCBjb2wpO1xuICAgIGNvbnN0IGtleSA9IHRoaXMubWFrZUtleShyb3csIGNvbCk7XG4gICAgaWYgKCF0aGlzLmVudHJpZXMuaGFzKGtleSkpIHtcbiAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7IHZhbHVlLCByb3csIGNvbCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbnRyaWVzLmdldChrZXkpIS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGdldChyb3c6IG51bWJlciwgY29sOiBudW1iZXIsIGRlZmF1bHRWYWx1ZSA9IDApIHtcbiAgICAvL3RoaXMuY2hlY2tEaW1zKHJvdywgY29sKTtcbiAgICBjb25zdCBrZXkgPSB0aGlzLm1ha2VLZXkocm93LCBjb2wpO1xuICAgIGlmICh0aGlzLmVudHJpZXMuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KGtleSkhLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGdldEFsbChvcmRlcmVkID0gdHJ1ZSk6IHsgdmFsdWU6IG51bWJlcjsgcm93OiBudW1iZXI7IGNvbDogbnVtYmVyIH1bXSB7XG4gICAgY29uc3Qgcm93Q29sVmFsdWVzOiBFbnRyeVtdID0gbmV3IEFycmF5KHRoaXMuZW50cmllcy5zaXplKS5maWxsKG51bGwpO1xuICAgIGxldCBpID0gMDtcbiAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICByb3dDb2xWYWx1ZXNbaSsrXSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIGlmIChvcmRlcmVkKSB7XG4gICAgICAvLyBPcmRlcmluZyB0aGUgcmVzdWx0IGlzbid0IHJlcXVpcmVkIGZvciBwcm9jZXNzaW5nIGJ1dCBpdCBkb2VzIG1ha2UgaXQgZWFzaWVyIHRvIHdyaXRlIHRlc3RzXG4gICAgICByb3dDb2xWYWx1ZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBpZiAoYS5yb3cgPT09IGIucm93KSB7XG4gICAgICAgICAgcmV0dXJuIGEuY29sIC0gYi5jb2w7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGEucm93IC0gYi5yb3c7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcm93Q29sVmFsdWVzO1xuICB9XG5cbiAgZ2V0RGltcygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIFt0aGlzLm5Sb3dzLCB0aGlzLm5Db2xzXTtcbiAgfVxuXG4gIGdldFJvd3MoKTogbnVtYmVyW10ge1xuICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLCAoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZS5yb3cpO1xuICAgLy8gcmV0dXJuIHRoaXMucm93cyBhcyB1bmtub3duIGFzIG51bWJlcltdO1xuICB9XG5cbiAgZ2V0Q29scygpOiBudW1iZXJbXXtcbiAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcywgKFtrZXksIHZhbHVlXSkgPT4gdmFsdWUuY29sKTtcbiAgIC8vIHJldHVybiB0aGlzLmNvbHMgYXMgdW5rbm93biBhcyBudW1iZXJbXTtcbiAgfVxuXG4gIGdldFZhbHVlcygpOiBudW1iZXJbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcywgKFtrZXksIHZhbHVlXSkgPT4gdmFsdWUudmFsdWUpO1xuICAvL3JldHVybiB0aGlzLnZhbHVlcyBhcyB1bmtub3duIGFzIG51bWJlcltdO1xuICB9XG5cbiAgZm9yRWFjaChmbjogKHZhbHVlOiBudW1iZXIsIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKHZhbHVlID0+IGZuKHZhbHVlLnZhbHVlLCB2YWx1ZS5yb3csIHZhbHVlLmNvbCkpO1xuICB9XG5cbiAgbWFwKGZuOiAodmFsdWU6IG51bWJlciwgcm93OiBudW1iZXIsIGNvbDogbnVtYmVyKSA9PiBudW1iZXIpOiBTcGFyc2VNYXRyaXgge1xuICAgIGNvbnN0IHZhbHMgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuZW50cmllcy5zaXplKTtcbiAgICBsZXQgaSA9IDBcbiAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICB2YWxzW2krK10gPSBmbih2YWx1ZS52YWx1ZSwgdmFsdWUucm93LCB2YWx1ZS5jb2wpO1xuICAgIH0pO1xuICAgIGNvbnN0IGRpbXMgPSBbdGhpcy5uUm93cywgdGhpcy5uQ29sc107XG4gICAgcmV0dXJuIG5ldyBTcGFyc2VNYXRyaXgodGhpcy5nZXRSb3dzKCksIHRoaXMuZ2V0Q29scygpLCB2YWxzIGFzIHVua25vd24gYXMgbnVtYmVyW10sIGRpbXMpO1xuICB9XG5cbiAgdG9BcnJheSgpIHtcbiAgICBjb25zdCByb3dzOiB1bmRlZmluZWRbXSA9IHV0aWxzLmVtcHR5KHRoaXMublJvd3MpO1xuICAgIGNvbnN0IG91dHB1dCA9IHJvd3MubWFwKCgpID0+IHtcbiAgICAgIHJldHVybiB1dGlscy56ZXJvcyh0aGlzLm5Db2xzKTtcbiAgICB9KTtcbiAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICBvdXRwdXRbdmFsdWUucm93XVt2YWx1ZS5jb2xdID0gdmFsdWUudmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBhIHNwYXJzZSBtYXRyaXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShtYXRyaXg6IFNwYXJzZU1hdHJpeCk6IFNwYXJzZU1hdHJpeCB7XG4gIGNvbnN0IG9sZFJvd3MgPSBtYXRyaXguZ2V0Um93cygpO1xuICBjb25zdCBvbGRDb2xzID0gbWF0cml4LmdldENvbHMoKTtcbiAgY29uc3Qgb2xkVmFscyA9IG1hdHJpeC5nZXRWYWx1ZXMoKTtcbiAgY29uc3QgbWF0bGVuID0gb2xkQ29scy5sZW5ndGg7XG4gIGNvbnN0IGNvbHMgPSBuZXcgSW50MzJBcnJheShtYXRsZW4pO1xuICBjb25zdCByb3dzID0gbmV3IEludDMyQXJyYXkobWF0bGVuKTtcbiAgY29uc3QgdmFscyA9IG5ldyBGbG9hdDMyQXJyYXkobWF0bGVuKTtcblxuICBjb2xzLnNldChvbGRSb3dzKTtcbiAgcm93cy5zZXQob2xkQ29scyk7XG4gIHZhbHMuc2V0KG9sZFZhbHMpO1xuICBjb25zdCBkaW1zID0gW21hdHJpeC5uQ29scywgbWF0cml4Lm5Sb3dzXTtcbiAgcmV0dXJuIG5ldyBTcGFyc2VNYXRyaXgocm93cywgY29scywgdmFscywgZGltcyk7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGEgc3BhcnNlIGlkZW50aXR5IG1hdHJpeFxuICovXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkoc2l6ZTogbnVtYmVyW10pOiBTcGFyc2VNYXRyaXgge1xuICBjb25zdCBbcm93c10gPSBzaXplO1xuICBjb25zdCBtYXRyaXggPSBuZXcgU3BhcnNlTWF0cml4KFtdLCBbXSwgW10sIHNpemUpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd3M7IGkrKykge1xuICAgIG1hdHJpeC5zZXQoaSwgaSwgMSk7XG4gIH1cbiAgcmV0dXJuIG1hdHJpeDtcbn1cblxuLyoqXG4gKiBFbGVtZW50LXdpc2UgbXVsdGlwbGljYXRpb24gb2YgdHdvIG1hdHJpY2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYWlyd2lzZU11bHRpcGx5KFxuICBhOiBTcGFyc2VNYXRyaXgsXG4gIGI6IFNwYXJzZU1hdHJpeFxuKTogU3BhcnNlTWF0cml4IHtcbiAgcmV0dXJuIGVsZW1lbnRXaXNlKGEsIGIsICh4LCB5KSA9PiB4ICogeSk7XG59XG5cbi8qKlxuICogRWxlbWVudC13aXNlIGFkZGl0aW9uIG9mIHR3byBtYXRyaWNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGE6IFNwYXJzZU1hdHJpeCwgYjogU3BhcnNlTWF0cml4KTogU3BhcnNlTWF0cml4IHtcbiAgcmV0dXJuIGVsZW1lbnRXaXNlKGEsIGIsICh4LCB5KSA9PiB4ICsgeSk7XG59XG5cbi8qKlxuICogRWxlbWVudC13aXNlIHN1YnRyYWN0aW9uIG9mIHR3byBtYXRyaWNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3QoYTogU3BhcnNlTWF0cml4LCBiOiBTcGFyc2VNYXRyaXgpOiBTcGFyc2VNYXRyaXgge1xuICByZXR1cm4gZWxlbWVudFdpc2UoYSwgYiwgKHgsIHkpID0+IHggLSB5KTtcbn1cblxuLyoqXG4gKiBFbGVtZW50LXdpc2UgbWF4aW11bSBvZiB0d28gbWF0cmljZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1heGltdW0oYTogU3BhcnNlTWF0cml4LCBiOiBTcGFyc2VNYXRyaXgpOiBTcGFyc2VNYXRyaXgge1xuICByZXR1cm4gZWxlbWVudFdpc2UoYSwgYiwgKHgsIHkpID0+ICh4ID4geSA/IHggOiB5KSk7XG59XG5cbi8qKlxuICogU2NhbGFyIG11bHRpcGxpY2F0aW9uIG9mIHR3byBtYXRyaWNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXIoYTogU3BhcnNlTWF0cml4LCBzY2FsYXI6IG51bWJlcik6IFNwYXJzZU1hdHJpeCB7XG4gIHJldHVybiBhLm1hcCgodmFsdWU6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiB2YWx1ZSAqIHNjYWxhcjtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBtYXRyaXggd2l0aCB6ZXJvIGVudHJpZXMgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVsaW1pbmF0ZVplcm9zKG06IFNwYXJzZU1hdHJpeCkge1xuICBjb25zdCB6ZXJvSW5kaWNlcyA9IG5ldyBTZXQoKTtcbiAgY29uc3QgdmFsdWVzID0gbS5nZXRWYWx1ZXMoKTtcbiAgY29uc3Qgcm93cyA9IG0uZ2V0Um93cygpO1xuICBjb25zdCBjb2xzID0gbS5nZXRDb2xzKCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHZhbHVlc1tpXSA9PT0gMCkge1xuICAgICAgemVyb0luZGljZXMuYWRkKGkpO1xuICAgIH1cbiAgfVxuICBjb25zdCByZW1vdmVCeVplcm9JbmRleCA9IChfOiBhbnksIGluZGV4OiBudW1iZXIpID0+ICF6ZXJvSW5kaWNlcy5oYXMoaW5kZXgpO1xuICBjb25zdCBuZXh0VmFsdWVzID0gdmFsdWVzLmZpbHRlcihyZW1vdmVCeVplcm9JbmRleCk7XG4gIGNvbnN0IG5leHRSb3dzID0gcm93cy5maWx0ZXIocmVtb3ZlQnlaZXJvSW5kZXgpO1xuICBjb25zdCBuZXh0Q29scyA9IGNvbHMuZmlsdGVyKHJlbW92ZUJ5WmVyb0luZGV4KTtcblxuICByZXR1cm4gbmV3IFNwYXJzZU1hdHJpeChuZXh0Um93cywgbmV4dENvbHMsIG5leHRWYWx1ZXMsIG0uZ2V0RGltcygpKTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemF0aW9uIG9mIGEgc3BhcnNlIG1hdHJpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShtOiBTcGFyc2VNYXRyaXgsIG5vcm1UeXBlID0gTm9ybVR5cGUubDIpIHtcbiAgY29uc3Qgbm9ybUZuID0gbm9ybUZuc1tub3JtVHlwZV07XG5cbiAgY29uc3QgY29sc0J5Um93ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcltdPigpO1xuICBtLmZvckVhY2goKF8sIHJvdywgY29sKSA9PiB7XG4gICAgY29uc3QgY29scyA9IGNvbHNCeVJvdy5nZXQocm93KSB8fCBbXTtcbiAgICBjb2xzLnB1c2goY29sKTtcbiAgICBjb2xzQnlSb3cuc2V0KHJvdywgY29scyk7XG4gIH0pO1xuXG4gIGNvbnN0IG5leHRNYXRyaXggPSBuZXcgU3BhcnNlTWF0cml4KFtdLCBbXSwgW10sIG0uZ2V0RGltcygpKTtcblxuICBmb3IgKGxldCByb3cgb2YgY29sc0J5Um93LmtleXMoKSkge1xuICAgIGNvbnN0IGNvbHMgPSBjb2xzQnlSb3cuZ2V0KHJvdykhLnNvcnQoKTtcblxuICAgIGNvbnN0IHZhbHMgPSBjb2xzLm1hcChjb2wgPT4gbS5nZXQocm93LCBjb2wpKTtcbiAgICBjb25zdCBub3JtID0gbm9ybUZuKHZhbHMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9ybS5sZW5ndGg7IGkrKykge1xuICAgICAgbmV4dE1hdHJpeC5zZXQocm93LCBjb2xzW2ldLCBub3JtW2ldKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dE1hdHJpeDtcbn1cblxuLyoqXG4gKiBWZWN0b3Igbm9ybWFsaXphdGlvbiBmdW5jdGlvbnNcbiAqL1xudHlwZSBOb3JtRm5zID0geyBba2V5IGluIE5vcm1UeXBlXTogKHY6IG51bWJlcltdKSA9PiBudW1iZXJbXSB9O1xuY29uc3Qgbm9ybUZuczogTm9ybUZucyA9IHtcbiAgW05vcm1UeXBlLm1heF06ICh4czogbnVtYmVyW10pID0+IHtcbiAgICBsZXQgbWF4ID0gLUluZmluaXR5O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG1heCA9IHhzW2ldID4gbWF4ID8geHNbaV0gOiBtYXg7XG4gICAgfVxuICAgIHJldHVybiB4cy5tYXAoeCA9PiB4IC8gbWF4KTtcbiAgfSxcbiAgW05vcm1UeXBlLmwxXTogKHhzOiBudW1iZXJbXSkgPT4ge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHN1bSArPSB4c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHhzLm1hcCh4ID0+IHggLyBzdW0pO1xuICB9LFxuICBbTm9ybVR5cGUubDJdOiAoeHM6IG51bWJlcltdKSA9PiB7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgc3VtICs9IHhzW2ldICoqIDI7XG4gICAgfVxuICAgIHJldHVybiB4cy5tYXAoeCA9PiBNYXRoLnNxcnQoeCAqKiAyIC8gc3VtKSk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgZW51bSBOb3JtVHlwZSB7XG4gIG1heCA9ICdtYXgnLFxuICBsMSA9ICdsMScsXG4gIGwyID0gJ2wyJyxcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGVsZW1lbnQtd2lzZSBvcGVyYXRpb25zLlxuICovXG5mdW5jdGlvbiBlbGVtZW50V2lzZShcbiAgYTogU3BhcnNlTWF0cml4LFxuICBiOiBTcGFyc2VNYXRyaXgsXG4gIG9wOiAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IG51bWJlclxuKTogU3BhcnNlTWF0cml4IHtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCByb3dzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBjb2xzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB2YWxzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGNvbnN0IG9wZXJhdGUgPSAocm93OiBudW1iZXIsIGNvbDogbnVtYmVyKSA9PiB7XG4gICAgcm93cy5wdXNoKHJvdyk7XG4gICAgY29scy5wdXNoKGNvbCk7XG4gICAgY29uc3QgbmV4dFZhbHVlID0gb3AoYS5nZXQocm93LCBjb2wpLCBiLmdldChyb3csIGNvbCkpO1xuICAgIHZhbHMucHVzaChuZXh0VmFsdWUpO1xuICB9O1xuICBjb25zdCB2YWx1ZXNBID0gYS5nZXRWYWx1ZXMoKTtcbiAgY29uc3Qgcm93c0EgPSBhLmdldFJvd3MoKTtcbiAgY29uc3QgY29sc0EgPSBhLmdldENvbHMoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXNBLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgcm93ID0gcm93c0FbaV07XG4gICAgY29uc3QgY29sID0gY29sc0FbaV07XG4gICAgY29uc3Qga2V5ID0gYCR7cm93fToke2NvbH1gO1xuICAgIHZpc2l0ZWQuYWRkKGtleSk7XG4gICAgb3BlcmF0ZShyb3csIGNvbCk7XG4gIH1cblxuICBjb25zdCB2YWx1ZXNCID0gYi5nZXRWYWx1ZXMoKTtcbiAgY29uc3Qgcm93c0IgPSBiLmdldFJvd3MoKTtcbiAgY29uc3QgY29sc0IgPSBiLmdldENvbHMoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXNCLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgcm93ID0gcm93c0JbaV07XG4gICAgY29uc3QgY29sID0gY29sc0JbaV07XG4gICAgY29uc3Qga2V5ID0gYCR7cm93fToke2NvbH1gO1xuICAgIGlmICh2aXNpdGVkLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICBvcGVyYXRlKHJvdywgY29sKTtcbiAgfVxuXG4gIGNvbnN0IGRpbXMgPSBbYS5uUm93cywgYS5uQ29sc107XG4gIHJldHVybiBuZXcgU3BhcnNlTWF0cml4KHJvd3MsIGNvbHMsIHZhbHMsIGRpbXMpO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiBmb3IgZ2V0dGluZyBkYXRhLCBpbmRpY2VzLCBhbmQgaW5wdHIgYXJyYXlzIGZyb20gYSBzcGFyc2VcbiAqIG1hdHJpeCB0byBmb2xsb3cgY3NyIG1hdHJpeCBjb252ZW50aW9ucy4gU3VwZXIgaW5lZmZpY2llbnQgKGFuZCBraW5kIG9mXG4gKiBkZWZlYXRzIHRoZSBwdXJwb3NlIG9mIHRoaXMgY29udmVudGlvbikgYnV0IGEgbG90IG9mIHRoZSBwb3J0ZWQgcHl0aG9uIHRyZWVcbiAqIHNlYXJjaCBsb2dpYyBkZXBlbmRzIG9uIHRoaXMgZGF0YSBmb3JtYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDU1IoeDogU3BhcnNlTWF0cml4KSB7XG4gIGNvbnN0IGVudHJpZXM6IEVudHJ5W10gPSBbXTtcblxuICB4LmZvckVhY2goKHZhbHVlLCByb3csIGNvbCkgPT4ge1xuICAgIGVudHJpZXMucHVzaCh7IHZhbHVlLCByb3csIGNvbCB9KTtcbiAgfSk7XG5cbiAgZW50cmllcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgaWYgKGEucm93ID09PSBiLnJvdykge1xuICAgICAgcmV0dXJuIGEuY29sIC0gYi5jb2w7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBhLnJvdyAtIGIucm93O1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgaW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgdmFsdWVzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBpbmRwdHI6IG51bWJlcltdID0gW107XG5cbiAgbGV0IGN1cnJlbnRSb3cgPSAtMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgeyByb3csIGNvbCwgdmFsdWUgfSA9IGVudHJpZXNbaV07XG4gICAgaWYgKHJvdyAhPT0gY3VycmVudFJvdykge1xuICAgICAgY3VycmVudFJvdyA9IHJvdztcbiAgICAgIGluZHB0ci5wdXNoKGkpO1xuICAgIH1cbiAgICBpbmRpY2VzLnB1c2goY29sKTtcbiAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4geyBpbmRpY2VzLCB2YWx1ZXMsIGluZHB0ciB9O1xufVxuIl19","/**\n * @license\n *\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ==============================================================================\n */\n/**\n * This is a JavaScript reimplementation of UMAP (original license below), from\n * the python implementation found at https://github.com/lmcinnes/umap.\n *\n * @author andycoenen@google.com (Andy Coenen)\n */\n/**\n * @license\n * BSD 3-Clause License\n *\n * Copyright (c) 2017, Leland McInnes\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * * Neither the name of the copyright holder nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport * as utils from './utils';\nexport class FlatTree {\n hyperplanes;\n offsets;\n children;\n indices;\n constructor(hyperplanes, offsets, children, indices) {\n this.hyperplanes = hyperplanes;\n this.offsets = offsets;\n this.children = children;\n this.indices = indices;\n }\n}\n/**\n * Build a random projection forest with ``nTrees``.\n */\nexport function makeForest(data, nNeighbors, nTrees, random) {\n const leafSize = Math.max(10, nNeighbors);\n const trees = utils\n .range(nTrees)\n .map((_, i) => makeTree(data, leafSize, i, random));\n const forest = trees.map(tree => flattenTree(tree, leafSize));\n return forest;\n}\n/**\n * Construct a random projection tree based on ``data`` with leaves\n * of size at most ``leafSize``\n */\nfunction makeTree(data, leafSize = 30, n, random) {\n const indices = utils.range(data.length);\n const tree = makeEuclideanTree(data, indices, leafSize, n, random);\n return tree;\n}\nfunction makeEuclideanTree(data, indices, leafSize = 30, q, random) {\n if (indices.length > leafSize) {\n const splitResults = euclideanRandomProjectionSplit(data, indices, random);\n const { indicesLeft, indicesRight, hyperplane, offset } = splitResults;\n const leftChild = makeEuclideanTree(data, indicesLeft, leafSize, q + 1, random);\n const rightChild = makeEuclideanTree(data, indicesRight, leafSize, q + 1, random);\n const node = { leftChild, rightChild, isLeaf: false, hyperplane, offset };\n return node;\n }\n else {\n const node = { indices, isLeaf: true };\n return node;\n }\n}\n/**\n * Given a set of ``indices`` for data points from ``data``, create\n * a random hyperplane to split the data, returning two arrays indices\n * that fall on either side of the hyperplane. This is the basis for a\n * random projection tree, which simply uses this splitting recursively.\n * This particular split uses euclidean distance to determine the hyperplane\n * and which side each data sample falls on.\n */\nfunction euclideanRandomProjectionSplit(data, indices, random) {\n const dim = 1;\n // Select two random points, set the hyperplane between them\n let leftIndex = utils.tauRandInt(indices.length, random);\n let rightIndex = utils.tauRandInt(indices.length, random);\n rightIndex += leftIndex === rightIndex ? 1 : 0;\n rightIndex = rightIndex % indices.length;\n const left = indices[leftIndex];\n const right = indices[rightIndex];\n // Compute the normal vector to the hyperplane (the vector between the two\n // points) and the offset from the origin\n let hyperplaneOffset = 0;\n let hyperplaneVector = 0;\n hyperplaneVector = data[left] - data[right];\n hyperplaneOffset -=\n (hyperplaneVector * (data[left] + data[right])) / 2.0;\n // For each point compute the margin (project into normal vector)\n // If we are on lower side of the hyperplane put in one pile, otherwise\n // put it in the other pile (if we hit hyperplane on the nose, flip a coin)\n let nLeft = 0;\n let nRight = 0;\n const side = utils.zeros(indices.length);\n for (let i = 0; i < indices.length; i++) {\n let margin = hyperplaneOffset;\n margin += hyperplaneVector * data[indices[i]];\n if (margin === 0) {\n side[i] = utils.tauRandInt(2, random);\n if (side[i] === 0) {\n nLeft += 1;\n }\n else {\n nRight += 1;\n }\n }\n else if (margin > 0) {\n side[i] = 0;\n nLeft += 1;\n }\n else {\n side[i] = 1;\n nRight += 1;\n }\n }\n // Now that we have the counts, allocate arrays\n const indicesLeft = utils.zeros(nLeft);\n const indicesRight = utils.zeros(nRight);\n // Populate the arrays with indices according to which side they fell on\n nLeft = 0;\n nRight = 0;\n for (let i = 0; i < side.length; i++) {\n if (side[i] === 0) {\n indicesLeft[nLeft] = indices[i];\n nLeft += 1;\n }\n else {\n indicesRight[nRight] = indices[i];\n nRight += 1;\n }\n }\n return {\n indicesLeft,\n indicesRight,\n hyperplane: hyperplaneVector,\n offset: hyperplaneOffset,\n };\n}\nfunction flattenTree(tree, leafSize) {\n const nNodes = numNodes(tree);\n const nLeaves = numLeaves(tree);\n // TODO: Verify that sparse code is not relevant...\n const hyperplanes = utils\n .range(nNodes)\n .map(() => tree.hyperplane ? 1 : 0);\n const offsets = utils.zeros(nNodes);\n const children = utils.range(nNodes).map(() => [-1, -1]);\n const indices = utils\n .range(nLeaves)\n .map(() => utils.range(leafSize).map(() => -1));\n recursiveFlatten(tree, hyperplanes, offsets, children, indices, 0, 0);\n return new FlatTree(hyperplanes, offsets, children, indices);\n}\nfunction recursiveFlatten(tree, hyperplanes, offsets, children, indices, nodeNum, leafNum) {\n if (tree.isLeaf) {\n children[nodeNum][0] = -leafNum;\n // TODO: Triple check this operation corresponds to\n // indices[leafNum : tree.indices.shape[0]] = tree.indices\n indices[leafNum].splice(0, tree.indices.length, ...tree.indices);\n leafNum += 1;\n return { nodeNum, leafNum };\n }\n else {\n hyperplanes[nodeNum] = tree.hyperplane;\n offsets[nodeNum] = tree.offset;\n children[nodeNum][0] = nodeNum + 1;\n const oldNodeNum = nodeNum;\n let res = recursiveFlatten(tree.leftChild, hyperplanes, offsets, children, indices, nodeNum + 1, leafNum);\n nodeNum = res.nodeNum;\n leafNum = res.leafNum;\n children[oldNodeNum][1] = nodeNum + 1;\n res = recursiveFlatten(tree.rightChild, hyperplanes, offsets, children, indices, nodeNum + 1, leafNum);\n return { nodeNum: res.nodeNum, leafNum: res.leafNum };\n }\n}\nfunction numNodes(tree) {\n if (tree.isLeaf) {\n return 1;\n }\n else {\n return 1 + numNodes(tree.leftChild) + numNodes(tree.rightChild);\n }\n}\nfunction numLeaves(tree) {\n if (tree.isLeaf) {\n return 1;\n }\n else {\n return numLeaves(tree.leftChild) + numLeaves(tree.rightChild);\n }\n}\n/**\n * Generate an array of sets of candidate nearest neighbors by\n * constructing a random projection forest and taking the leaves of all the\n * trees. Any given tree has leaves that are a set of potential nearest\n * neighbors. Given enough trees the set of all such leaves gives a good\n * likelihood of getting a good set of nearest neighbors in composite. Since\n * such a random projection forest is inexpensive to compute, this can be a\n * useful means of seeding other nearest neighbor algorithms.\n */\nexport function makeLeafArray(rpForest) {\n if (rpForest.length > 0) {\n const output = [];\n for (let tree of rpForest) {\n output.push(...tree.indices);\n }\n return output;\n }\n else {\n return [[-1]];\n }\n}\n/**\n * Selects the side of the tree to search during flat tree search.\n */\nfunction selectSide(hyperplane, offset, point, random) {\n let margin = offset;\n margin += hyperplane * point;\n if (margin === 0) {\n const side = utils.tauRandInt(2, random);\n return side;\n }\n else if (margin > 0) {\n return 0;\n }\n else {\n return 1;\n }\n}\n/**\n * Searches a flattened rp-tree for a point.\n */\nexport function searchFlatTree(point, tree, random) {\n let node = 0;\n while (tree.children[node][0] > 0) {\n const side = selectSide(tree.hyperplanes[node], tree.offsets[node], point, random);\n if (side === 0) {\n node = tree.children[node][0];\n }\n else {\n node = tree.children[node][1];\n }\n }\n const index = -1 * tree.children[node][0];\n return tree.indices[index];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBZWpDLE1BQU0sT0FBTyxRQUFRO0lBRVY7SUFDQTtJQUNBO0lBQ0E7SUFKVCxZQUNTLFdBQXFCLEVBQ3JCLE9BQWlCLEVBQ2pCLFFBQW9CLEVBQ3BCLE9BQW1CO1FBSG5CLGdCQUFXLEdBQVgsV0FBVyxDQUFVO1FBQ3JCLFlBQU8sR0FBUCxPQUFPLENBQVU7UUFDakIsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQUNwQixZQUFPLEdBQVAsT0FBTyxDQUFZO0lBQ3pCLENBQUM7Q0FDTDtBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FDeEIsSUFBWSxFQUNaLFVBQWtCLEVBQ2xCLE1BQWMsRUFDZCxNQUFnQjtJQUVoQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUUxQyxNQUFNLEtBQUssR0FBRyxLQUFLO1NBQ2hCLEtBQUssQ0FBQyxNQUFNLENBQUM7U0FDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN0RCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRTlELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLFFBQVEsQ0FDZixJQUFZLEVBQ1os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QUMsQ0FBQyxDQUFDLENBQUM7U0FDL0I7YUFBTTtZQUNMLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQy9CO0tBQ0Y7SUFFRCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgSmF2YVNjcmlwdCByZWltcGxlbWVudGF0aW9uIG9mIFVNQVAgKG9yaWdpbmFsIGxpY2Vuc2UgYmVsb3cpLCBmcm9tXG4gKiB0aGUgcHl0aG9uIGltcGxlbWVudGF0aW9uIGZvdW5kIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9sbWNpbm5lcy91bWFwLlxuICpcbiAqIEBhdXRob3IgYW5keWNvZW5lbkBnb29nbGUuY29tIChBbmR5IENvZW5lbilcbiAqL1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBCU0QgMy1DbGF1c2UgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNywgTGVsYW5kIE1jSW5uZXNcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuICogICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXIgbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFXG4gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1JcbiAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSXG4gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBSYW5kb21GbiwgVmVjdG9yLCBWZWN0b3JzIH0gZnJvbSAnLi91bWFwJztcblxuLyoqXG4gKiBUcmVlIGZ1bmN0aW9uYWxpdHkgZm9yIGFwcHJveGltYXRpbmcgbmVhcmVzdCBuZWlnaGJvcnNcbiAqL1xuaW50ZXJmYWNlIFJhbmRvbVByb2plY3Rpb25UcmVlTm9kZSB7XG4gIGlzTGVhZjogYm9vbGVhbjtcbiAgaW5kaWNlcz86IG51bWJlcltdO1xuICBsZWZ0Q2hpbGQ/OiBSYW5kb21Qcm9qZWN0aW9uVHJlZU5vZGU7XG4gIHJpZ2h0Q2hpbGQ/OiBSYW5kb21Qcm9qZWN0aW9uVHJlZU5vZGU7XG4gIGh5cGVycGxhbmU/OiBudW1iZXI7XG4gIG9mZnNldD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEZsYXRUcmVlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGh5cGVycGxhbmVzOiBudW1iZXJbXSxcbiAgICBwdWJsaWMgb2Zmc2V0czogbnVtYmVyW10sXG4gICAgcHVibGljIGNoaWxkcmVuOiBudW1iZXJbXVtdLFxuICAgIHB1YmxpYyBpbmRpY2VzOiBudW1iZXJbXVtdXG4gICkge31cbn1cblxuLyoqXG4gKiBCdWlsZCBhIHJhbmRvbSBwcm9qZWN0aW9uIGZvcmVzdCB3aXRoIGBgblRyZWVzYGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlRm9yZXN0KFxuICBkYXRhOiBWZWN0b3IsXG4gIG5OZWlnaGJvcnM6IG51bWJlcixcbiAgblRyZWVzOiBudW1iZXIsXG4gIHJhbmRvbTogUmFuZG9tRm5cbikge1xuICBjb25zdCBsZWFmU2l6ZSA9IE1hdGgubWF4KDEwLCBuTmVpZ2hib3JzKTtcblxuICBjb25zdCB0cmVlcyA9IHV0aWxzXG4gICAgLnJhbmdlKG5UcmVlcylcbiAgICAubWFwKChfLCBpKSA9PiBtYWtlVHJlZShkYXRhLCBsZWFmU2l6ZSwgaSwgcmFuZG9tKSk7XG4gIGNvbnN0IGZvcmVzdCA9IHRyZWVzLm1hcCh0cmVlID0+IGZsYXR0ZW5UcmVlKHRyZWUsIGxlYWZTaXplKSk7XG5cbiAgcmV0dXJuIGZvcmVzdDtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSByYW5kb20gcHJvamVjdGlvbiB0cmVlIGJhc2VkIG9uIGBgZGF0YWBgIHdpdGggbGVhdmVzXG4gKiBvZiBzaXplIGF0IG1vc3QgYGBsZWFmU2l6ZWBgXG4gKi9cbmZ1bmN0aW9uIG1ha2VUcmVlKFxuICBkYXRhOiBWZWN0b3IsXG4gIGxlYWZTaXplID0gMzAsXG4gIG46IG51bWJlcixcbiAgcmFuZG9tOiBSYW5kb21GblxuKTogUmFuZG9tUHJvamVjdGlvblRyZWVOb2RlIHtcbiAgY29uc3QgaW5kaWNlcyA9IHV0aWxzLnJhbmdlKGRhdGEubGVuZ3RoKTtcbiAgY29uc3QgdHJlZSA9IG1ha2VFdWNsaWRlYW5UcmVlKGRhdGEsIGluZGljZXMsIGxlYWZTaXplLCBuLCByYW5kb20pO1xuICByZXR1cm4gdHJlZTtcbn1cblxuZnVuY3Rpb24gbWFrZUV1Y2xpZGVhblRyZWUoXG4gIGRhdGE6IFZlY3RvcixcbiAgaW5kaWNlczogbnVtYmVyW10sXG4gIGxlYWZTaXplID0gMzAsXG4gIHE6IG51bWJlcixcbiAgcmFuZG9tOiBSYW5kb21GblxuKTogUmFuZG9tUHJvamVjdGlvblRyZWVOb2RlIHtcbiAgaWYgKGluZGljZXMubGVuZ3RoID4gbGVhZlNpemUpIHtcbiAgICBjb25zdCBzcGxpdFJlc3VsdHMgPSBldWNsaWRlYW5SYW5kb21Qcm9qZWN0aW9uU3BsaXQoZGF0YSwgaW5kaWNlcywgcmFuZG9tKTtcbiAgICBjb25zdCB7IGluZGljZXNMZWZ0LCBpbmRpY2VzUmlnaHQsIGh5cGVycGxhbmUsIG9mZnNldCB9ID0gc3BsaXRSZXN1bHRzO1xuXG4gICAgY29uc3QgbGVmdENoaWxkID0gbWFrZUV1Y2xpZGVhblRyZWUoXG4gICAgICBkYXRhLFxuICAgICAgaW5kaWNlc0xlZnQsXG4gICAgICBsZWFmU2l6ZSxcbiAgICAgIHEgKyAxLFxuICAgICAgcmFuZG9tXG4gICAgKTtcbiAgICBjb25zdCByaWdodENoaWxkID0gbWFrZUV1Y2xpZGVhblRyZWUoXG4gICAgICBkYXRhLFxuICAgICAgaW5kaWNlc1JpZ2h0LFxuICAgICAgbGVhZlNpemUsXG4gICAgICBxICsgMSxcbiAgICAgIHJhbmRvbVxuICAgICk7XG5cbiAgICBjb25zdCBub2RlID0geyBsZWZ0Q2hpbGQsIHJpZ2h0Q2hpbGQsIGlzTGVhZjogZmFsc2UsIGh5cGVycGxhbmUsIG9mZnNldCB9O1xuICAgIHJldHVybiBub2RlO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG5vZGUgPSB7IGluZGljZXMsIGlzTGVhZjogdHJ1ZSB9O1xuICAgIHJldHVybiBub2RlO1xuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYSBzZXQgb2YgYGBpbmRpY2VzYGAgZm9yIGRhdGEgcG9pbnRzIGZyb20gYGBkYXRhYGAsIGNyZWF0ZVxuICogYSByYW5kb20gaHlwZXJwbGFuZSB0byBzcGxpdCB0aGUgZGF0YSwgcmV0dXJuaW5nIHR3byBhcnJheXMgaW5kaWNlc1xuICogdGhhdCBmYWxsIG9uIGVpdGhlciBzaWRlIG9mIHRoZSBoeXBlcnBsYW5lLiBUaGlzIGlzIHRoZSBiYXNpcyBmb3IgYVxuICogcmFuZG9tIHByb2plY3Rpb24gdHJlZSwgd2hpY2ggc2ltcGx5IHVzZXMgdGhpcyBzcGxpdHRpbmcgcmVjdXJzaXZlbHkuXG4gKiBUaGlzIHBhcnRpY3VsYXIgc3BsaXQgdXNlcyBldWNsaWRlYW4gZGlzdGFuY2UgdG8gZGV0ZXJtaW5lIHRoZSBoeXBlcnBsYW5lXG4gKiBhbmQgd2hpY2ggc2lkZSBlYWNoIGRhdGEgc2FtcGxlIGZhbGxzIG9uLlxuICovXG5mdW5jdGlvbiBldWNsaWRlYW5SYW5kb21Qcm9qZWN0aW9uU3BsaXQoXG4gIGRhdGE6IFZlY3RvcixcbiAgaW5kaWNlczogbnVtYmVyW10sXG4gIHJhbmRvbTogUmFuZG9tRm5cbikge1xuICBjb25zdCBkaW0gPSAxO1xuXG4gIC8vIFNlbGVjdCB0d28gcmFuZG9tIHBvaW50cywgc2V0IHRoZSBoeXBlcnBsYW5lIGJldHdlZW4gdGhlbVxuICBsZXQgbGVmdEluZGV4ID0gdXRpbHMudGF1UmFuZEludChpbmRpY2VzLmxlbmd0aCwgcmFuZG9tKTtcbiAgbGV0IHJpZ2h0SW5kZXggPSB1dGlscy50YXVSYW5kSW50KGluZGljZXMubGVuZ3RoLCByYW5kb20pO1xuICByaWdodEluZGV4ICs9IGxlZnRJbmRleCA9PT0gcmlnaHRJbmRleCA/IDEgOiAwO1xuICByaWdodEluZGV4ID0gcmlnaHRJbmRleCAlIGluZGljZXMubGVuZ3RoO1xuICBjb25zdCBsZWZ0ID0gaW5kaWNlc1tsZWZ0SW5kZXhdO1xuICBjb25zdCByaWdodCA9IGluZGljZXNbcmlnaHRJbmRleF07XG5cbiAgLy8gQ29tcHV0ZSB0aGUgbm9ybWFsIHZlY3RvciB0byB0aGUgaHlwZXJwbGFuZSAodGhlIHZlY3RvciBiZXR3ZWVuIHRoZSB0d29cbiAgLy8gcG9pbnRzKSBhbmQgdGhlIG9mZnNldCBmcm9tIHRoZSBvcmlnaW5cbiAgbGV0IGh5cGVycGxhbmVPZmZzZXQgPSAwO1xuICBsZXQgaHlwZXJwbGFuZVZlY3RvciA9IDA7XG5cbiAgXG4gIGh5cGVycGxhbmVWZWN0b3IgPSBkYXRhW2xlZnRdIC0gZGF0YVtyaWdodF07XG4gIGh5cGVycGxhbmVPZmZzZXQgLT1cbiAgICAoaHlwZXJwbGFuZVZlY3RvciAqIChkYXRhW2xlZnRdICsgZGF0YVtyaWdodF0pKSAvIDIuMDtcbiAgXG5cbiAgLy8gRm9yIGVhY2ggcG9pbnQgY29tcHV0ZSB0aGUgbWFyZ2luIChwcm9qZWN0IGludG8gbm9ybWFsIHZlY3RvcilcbiAgLy8gSWYgd2UgYXJlIG9uIGxvd2VyIHNpZGUgb2YgdGhlIGh5cGVycGxhbmUgcHV0IGluIG9uZSBwaWxlLCBvdGhlcndpc2VcbiAgLy8gcHV0IGl0IGluIHRoZSBvdGhlciBwaWxlIChpZiB3ZSBoaXQgaHlwZXJwbGFuZSBvbiB0aGUgbm9zZSwgZmxpcCBhIGNvaW4pXG4gIGxldCBuTGVmdCA9IDA7XG4gIGxldCBuUmlnaHQgPSAwO1xuICBjb25zdCBzaWRlID0gdXRpbHMuemVyb3MoaW5kaWNlcy5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgbWFyZ2luID0gaHlwZXJwbGFuZU9mZnNldDtcbiAgICBcbiAgICAgIG1hcmdpbiArPSBoeXBlcnBsYW5lVmVjdG9yICogZGF0YVtpbmRpY2VzW2ldXTtcbiAgICBcbiAgICBpZiAobWFyZ2luID09PSAwKSB7XG4gICAgICBzaWRlW2ldID0gdXRpbHMudGF1UmFuZEludCgyLCByYW5kb20pO1xuICAgICAgaWYgKHNpZGVbaV0gPT09IDApIHtcbiAgICAgICAgbkxlZnQgKz0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5SaWdodCArPSAxO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobWFyZ2luID4gMCkge1xuICAgICAgc2lkZVtpXSA9IDA7XG4gICAgICBuTGVmdCArPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaWRlW2ldID0gMTtcbiAgICAgIG5SaWdodCArPSAxO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyB0aGF0IHdlIGhhdmUgdGhlIGNvdW50cywgYWxsb2NhdGUgYXJyYXlzXG4gIGNvbnN0IGluZGljZXNMZWZ0ID0gdXRpbHMuemVyb3MobkxlZnQpO1xuICBjb25zdCBpbmRpY2VzUmlnaHQgPSB1dGlscy56ZXJvcyhuUmlnaHQpO1xuXG4gIC8vIFBvcHVsYXRlIHRoZSBhcnJheXMgd2l0aCBpbmRpY2VzIGFjY29yZGluZyB0byB3aGljaCBzaWRlIHRoZXkgZmVsbCBvblxuICBuTGVmdCA9IDA7XG4gIG5SaWdodCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2lkZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzaWRlW2ldID09PSAwKSB7XG4gICAgICBpbmRpY2VzTGVmdFtuTGVmdF0gPSBpbmRpY2VzW2ldO1xuICAgICAgbkxlZnQgKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5kaWNlc1JpZ2h0W25SaWdodF0gPSBpbmRpY2VzW2ldO1xuICAgICAgblJpZ2h0ICs9IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpbmRpY2VzTGVmdCxcbiAgICBpbmRpY2VzUmlnaHQsXG4gICAgaHlwZXJwbGFuZTogaHlwZXJwbGFuZVZlY3RvcixcbiAgICBvZmZzZXQ6IGh5cGVycGxhbmVPZmZzZXQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5UcmVlKHRyZWU6IFJhbmRvbVByb2plY3Rpb25UcmVlTm9kZSwgbGVhZlNpemU6IG51bWJlcikge1xuICBjb25zdCBuTm9kZXMgPSBudW1Ob2Rlcyh0cmVlKTtcbiAgY29uc3QgbkxlYXZlcyA9IG51bUxlYXZlcyh0cmVlKTtcblxuICAvLyBUT0RPOiBWZXJpZnkgdGhhdCBzcGFyc2UgY29kZSBpcyBub3QgcmVsZXZhbnQuLi5cbiAgY29uc3QgaHlwZXJwbGFuZXMgPSB1dGlsc1xuICAgIC5yYW5nZShuTm9kZXMpXG4gICAgLm1hcCgoKSA9PiB0cmVlLmh5cGVycGxhbmUgPyAxIDogMCk7XG5cbiAgY29uc3Qgb2Zmc2V0cyA9IHV0aWxzLnplcm9zKG5Ob2Rlcyk7XG4gIGNvbnN0IGNoaWxkcmVuID0gdXRpbHMucmFuZ2Uobk5vZGVzKS5tYXAoKCkgPT4gWy0xLCAtMV0pO1xuICBjb25zdCBpbmRpY2VzID0gdXRpbHNcbiAgICAucmFuZ2UobkxlYXZlcylcbiAgICAubWFwKCgpID0+IHV0aWxzLnJhbmdlKGxlYWZTaXplKS5tYXAoKCkgPT4gLTEpKTtcbiAgcmVjdXJzaXZlRmxhdHRlbih0cmVlLCBoeXBlcnBsYW5lcywgb2Zmc2V0cywgY2hpbGRyZW4sIGluZGljZXMsIDAsIDApO1xuICByZXR1cm4gbmV3IEZsYXRUcmVlKGh5cGVycGxhbmVzLCBvZmZzZXRzLCBjaGlsZHJlbiwgaW5kaWNlcyk7XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZUZsYXR0ZW4oXG4gIHRyZWU6IFJhbmRvbVByb2plY3Rpb25UcmVlTm9kZSxcbiAgaHlwZXJwbGFuZXM6IG51bWJlcltdLFxuICBvZmZzZXRzOiBudW1iZXJbXSxcbiAgY2hpbGRyZW46IG51bWJlcltdW10sXG4gIGluZGljZXM6IG51bWJlcltdW10sXG4gIG5vZGVOdW06IG51bWJlcixcbiAgbGVhZk51bTogbnVtYmVyXG4pOiB7IG5vZGVOdW06IG51bWJlcjsgbGVhZk51bTogbnVtYmVyIH0ge1xuICBpZiAodHJlZS5pc0xlYWYpIHtcbiAgICBjaGlsZHJlbltub2RlTnVtXVswXSA9IC1sZWFmTnVtO1xuXG4gICAgLy8gVE9ETzogVHJpcGxlIGNoZWNrIHRoaXMgb3BlcmF0aW9uIGNvcnJlc3BvbmRzIHRvXG4gICAgLy8gaW5kaWNlc1tsZWFmTnVtIDogdHJlZS5pbmRpY2VzLnNoYXBlWzBdXSA9IHRyZWUuaW5kaWNlc1xuICAgIGluZGljZXNbbGVhZk51bV0uc3BsaWNlKDAsIHRyZWUuaW5kaWNlcyEubGVuZ3RoLCAuLi50cmVlLmluZGljZXMhKTtcbiAgICBsZWFmTnVtICs9IDE7XG4gICAgcmV0dXJuIHsgbm9kZU51bSwgbGVhZk51bSB9O1xuICB9IGVsc2Uge1xuICAgIGh5cGVycGxhbmVzW25vZGVOdW1dID0gdHJlZS5oeXBlcnBsYW5lITtcbiAgICBvZmZzZXRzW25vZGVOdW1dID0gdHJlZS5vZmZzZXQhO1xuICAgIGNoaWxkcmVuW25vZGVOdW1dWzBdID0gbm9kZU51bSArIDE7XG4gICAgY29uc3Qgb2xkTm9kZU51bSA9IG5vZGVOdW07XG5cbiAgICBsZXQgcmVzID0gcmVjdXJzaXZlRmxhdHRlbihcbiAgICAgIHRyZWUubGVmdENoaWxkISxcbiAgICAgIGh5cGVycGxhbmVzLFxuICAgICAgb2Zmc2V0cyxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgaW5kaWNlcyxcbiAgICAgIG5vZGVOdW0gKyAxLFxuICAgICAgbGVhZk51bVxuICAgICk7XG4gICAgbm9kZU51bSA9IHJlcy5ub2RlTnVtO1xuICAgIGxlYWZOdW0gPSByZXMubGVhZk51bTtcblxuICAgIGNoaWxkcmVuW29sZE5vZGVOdW1dWzFdID0gbm9kZU51bSArIDE7XG5cbiAgICByZXMgPSByZWN1cnNpdmVGbGF0dGVuKFxuICAgICAgdHJlZS5yaWdodENoaWxkISxcbiAgICAgIGh5cGVycGxhbmVzLFxuICAgICAgb2Zmc2V0cyxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgaW5kaWNlcyxcbiAgICAgIG5vZGVOdW0gKyAxLFxuICAgICAgbGVhZk51bVxuICAgICk7XG4gICAgcmV0dXJuIHsgbm9kZU51bTogcmVzLm5vZGVOdW0sIGxlYWZOdW06IHJlcy5sZWFmTnVtIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gbnVtTm9kZXModHJlZTogUmFuZG9tUHJvamVjdGlvblRyZWVOb2RlKTogbnVtYmVyIHtcbiAgaWYgKHRyZWUuaXNMZWFmKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDEgKyBudW1Ob2Rlcyh0cmVlLmxlZnRDaGlsZCEpICsgbnVtTm9kZXModHJlZS5yaWdodENoaWxkISk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbnVtTGVhdmVzKHRyZWU6IFJhbmRvbVByb2plY3Rpb25UcmVlTm9kZSk6IG51bWJlciB7XG4gIGlmICh0cmVlLmlzTGVhZikge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudW1MZWF2ZXModHJlZS5sZWZ0Q2hpbGQhKSArIG51bUxlYXZlcyh0cmVlLnJpZ2h0Q2hpbGQhKTtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGFuIGFycmF5IG9mIHNldHMgb2YgY2FuZGlkYXRlIG5lYXJlc3QgbmVpZ2hib3JzIGJ5XG4gKiBjb25zdHJ1Y3RpbmcgYSByYW5kb20gcHJvamVjdGlvbiBmb3Jlc3QgYW5kIHRha2luZyB0aGUgbGVhdmVzIG9mIGFsbCB0aGVcbiAqIHRyZWVzLiBBbnkgZ2l2ZW4gdHJlZSBoYXMgbGVhdmVzIHRoYXQgYXJlIGEgc2V0IG9mIHBvdGVudGlhbCBuZWFyZXN0XG4gKiBuZWlnaGJvcnMuIEdpdmVuIGVub3VnaCB0cmVlcyB0aGUgc2V0IG9mIGFsbCBzdWNoIGxlYXZlcyBnaXZlcyBhIGdvb2RcbiAqIGxpa2VsaWhvb2Qgb2YgZ2V0dGluZyBhIGdvb2Qgc2V0IG9mIG5lYXJlc3QgbmVpZ2hib3JzIGluIGNvbXBvc2l0ZS4gU2luY2VcbiAqIHN1Y2ggYSByYW5kb20gcHJvamVjdGlvbiBmb3Jlc3QgaXMgaW5leHBlbnNpdmUgdG8gY29tcHV0ZSwgdGhpcyBjYW4gYmUgYVxuICogdXNlZnVsIG1lYW5zIG9mIHNlZWRpbmcgb3RoZXIgbmVhcmVzdCBuZWlnaGJvciBhbGdvcml0aG1zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUxlYWZBcnJheShycEZvcmVzdDogRmxhdFRyZWVbXSk6IG51bWJlcltdW10ge1xuICBpZiAocnBGb3Jlc3QubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG91dHB1dDogbnVtYmVyW11bXSA9IFtdO1xuICAgIGZvciAobGV0IHRyZWUgb2YgcnBGb3Jlc3QpIHtcbiAgICAgIG91dHB1dC5wdXNoKC4uLnRyZWUuaW5kaWNlcyEpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbWy0xXV07XG4gIH1cbn1cblxuLyoqXG4gKiBTZWxlY3RzIHRoZSBzaWRlIG9mIHRoZSB0cmVlIHRvIHNlYXJjaCBkdXJpbmcgZmxhdCB0cmVlIHNlYXJjaC5cbiAqL1xuZnVuY3Rpb24gc2VsZWN0U2lkZShcbiAgaHlwZXJwbGFuZTogbnVtYmVyLFxuICBvZmZzZXQ6IG51bWJlcixcbiAgcG9pbnQ6IG51bWJlcixcbiAgcmFuZG9tOiBSYW5kb21GblxuKSB7XG4gIGxldCBtYXJnaW4gPSBvZmZzZXQ7XG5cbiAgICBtYXJnaW4gKz0gaHlwZXJwbGFuZSAqIHBvaW50O1xuICBcblxuICBpZiAobWFyZ2luID09PSAwKSB7XG4gICAgY29uc3Qgc2lkZSA9IHV0aWxzLnRhdVJhbmRJbnQoMiwgcmFuZG9tKTtcbiAgICByZXR1cm4gc2lkZTtcbiAgfSBlbHNlIGlmIChtYXJnaW4gPiAwKSB7XG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn1cblxuLyoqXG4gKiBTZWFyY2hlcyBhIGZsYXR0ZW5lZCBycC10cmVlIGZvciBhIHBvaW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VhcmNoRmxhdFRyZWUoXG4gIHBvaW50OiBudW1iZXIsXG4gIHRyZWU6IEZsYXRUcmVlLFxuICByYW5kb206IFJhbmRvbUZuXG4pIHtcbiAgbGV0IG5vZGUgPSAwO1xuICB3aGlsZSAodHJlZS5jaGlsZHJlbltub2RlXVswXSA+IDApIHtcbiAgICBjb25zdCBzaWRlID0gc2VsZWN0U2lkZShcbiAgICAgIHRyZWUuaHlwZXJwbGFuZXNbbm9kZV0sXG4gICAgICB0cmVlLm9mZnNldHNbbm9kZV0sXG4gICAgICBwb2ludCxcbiAgICAgIHJhbmRvbVxuICAgICk7XG4gICAgaWYgKHNpZGUgPT09IDApIHtcbiAgICAgIG5vZGUgPSB0cmVlLmNoaWxkcmVuW25vZGVdWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlID0gdHJlZS5jaGlsZHJlbltub2RlXVsxXTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBpbmRleCA9IC0xICogdHJlZS5jaGlsZHJlbltub2RlXVswXTtcbiAgcmV0dXJuIHRyZWUuaW5kaWNlc1tpbmRleF07XG59XG4iXX0=","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n return toString.call(object).endsWith('Array]');\n}\n","/**\n * Calculate current error\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} parameters - Array of current parameter values\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {number}\n */\nexport default function errorCalculation(\n data,\n parameters,\n parameterizedFunction,\n) {\n let error = 0;\n const func = parameterizedFunction(parameters);\n\n for (let i = 0; i < data.x.length; i++) {\n error += Math.abs(data.y[i] - func(data.x[i]));\n }\n\n return error;\n}\n","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n } else if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var output;\n\n if (options.output !== undefined) {\n if (!isAnyArray(options.output)) {\n throw new TypeError('output option must be an array if specified');\n }\n\n output = options.output;\n } else {\n output = new Array(input.length);\n }\n\n var currentMin = min(input);\n var currentMax = max(input);\n\n if (currentMin === currentMax) {\n throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n }\n\n var _options$min = options.min,\n minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n _options$max = options.max,\n maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n if (minValue >= maxValue) {\n throw new RangeError('min option must be smaller than max option');\n }\n\n var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n for (var i = 0; i < input.length; i++) {\n output[i] = (input[i] - currentMin) * factor + minValue;\n }\n\n return output;\n}\n\nexport { rescale as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n }\n\n if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var _options$fromIndex = options.fromIndex,\n fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n _options$toIndex = options.toIndex,\n toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n throw new Error('fromIndex must be a positive integer smaller than length');\n }\n\n if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n }\n\n var minValue = input[fromIndex];\n\n for (var i = fromIndex + 1; i < toIndex; i++) {\n if (input[i] < minValue) minValue = input[i];\n }\n\n return minValue;\n}\n\nexport { min as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n }\n\n if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var _options$fromIndex = options.fromIndex,\n fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n _options$toIndex = options.toIndex,\n toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n throw new Error('fromIndex must be a positive integer smaller than length');\n }\n\n if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n }\n\n var maxValue = input[fromIndex];\n\n for (var i = fromIndex + 1; i < toIndex; i++) {\n if (input[i] > maxValue) maxValue = input[i];\n }\n\n return maxValue;\n}\n\nexport { max as default };\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n const {\n maxRows = 15,\n maxColumns = 10,\n maxNumSize = 8,\n padMinus = 'auto',\n } = options;\n return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus) {\n const { rows, columns } = matrix;\n const maxI = Math.min(rows, maxRows);\n const maxJ = Math.min(columns, maxColumns);\n const result = [];\n\n if (padMinus === 'auto') {\n padMinus = false;\n loop: for (let i = 0; i < maxI; i++) {\n for (let j = 0; j < maxJ; j++) {\n if (matrix.get(i, j) < 0) {\n padMinus = true;\n break loop;\n }\n }\n }\n }\n\n for (let i = 0; i < maxI; i++) {\n let line = [];\n for (let j = 0; j < maxJ; j++) {\n line.push(formatNumber(matrix.get(i, j), maxNumSize, padMinus));\n }\n result.push(`${line.join(' ')}`);\n }\n if (maxJ !== columns) {\n result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n }\n if (maxI !== rows) {\n result.push(`... ${rows - maxRows} more rows`);\n }\n return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize, padMinus) {\n return (\n num >= 0 && padMinus\n ? ` ${formatNumber2(num, maxNumSize - 1)}`\n : formatNumber2(num, maxNumSize)\n ).padEnd(maxNumSize);\n}\n\nfunction formatNumber2(num, len) {\n // small.length numbers should be as is\n let str = num.toString();\n if (str.length <= len) return str;\n\n // (7)'0.00123' is better then (7)'1.23e-2'\n // (8)'0.000123' is worse then (7)'1.23e-3',\n let fix = num.toFixed(len);\n if (fix.length > len) {\n fix = num.toFixed(Math.max(0, len - (fix.length - len)));\n }\n if (\n fix.length <= len &&\n !fix.startsWith('0.000') &&\n !fix.startsWith('-0.000')\n ) {\n return fix;\n }\n\n // well, if it's still too long the user should've used longer numbers\n let exp = num.toExponential(len);\n if (exp.length > len) {\n exp = num.toExponential(Math.max(0, len - (exp.length - len)));\n }\n return exp.slice(0);\n}\n","import { isAnyArray } from 'is-any-array';\n\n/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n let max = outer ? matrix.rows : matrix.rows - 1;\n if (index < 0 || index > max) {\n throw new RangeError('Row index out of range');\n }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n let max = outer ? matrix.columns : matrix.columns - 1;\n if (index < 0 || index > max) {\n throw new RangeError('Column index out of range');\n }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n if (vector.to1DArray) {\n vector = vector.to1DArray();\n }\n if (vector.length !== matrix.columns) {\n throw new RangeError(\n 'vector size must be the same as the number of columns',\n );\n }\n return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n if (vector.to1DArray) {\n vector = vector.to1DArray();\n }\n if (vector.length !== matrix.rows) {\n throw new RangeError('vector size must be the same as the number of rows');\n }\n return vector;\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n if (!isAnyArray(rowIndices)) {\n throw new TypeError('row indices must be an array');\n }\n\n for (let i = 0; i < rowIndices.length; i++) {\n if (rowIndices[i] < 0 || rowIndices[i] >= matrix.rows) {\n throw new RangeError('row indices are out of range');\n }\n }\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n if (!isAnyArray(columnIndices)) {\n throw new TypeError('column indices must be an array');\n }\n\n for (let i = 0; i < columnIndices.length; i++) {\n if (columnIndices[i] < 0 || columnIndices[i] >= matrix.columns) {\n throw new RangeError('column indices are out of range');\n }\n }\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n if (arguments.length !== 5) {\n throw new RangeError('expected 4 arguments');\n }\n checkNumber('startRow', startRow);\n checkNumber('endRow', endRow);\n checkNumber('startColumn', startColumn);\n checkNumber('endColumn', endColumn);\n if (\n startRow > endRow ||\n startColumn > endColumn ||\n startRow < 0 ||\n startRow >= matrix.rows ||\n endRow < 0 ||\n endRow >= matrix.rows ||\n startColumn < 0 ||\n startColumn >= matrix.columns ||\n endColumn < 0 ||\n endColumn >= matrix.columns\n ) {\n throw new RangeError('Submatrix indices are out of range');\n }\n}\n\nexport function newArray(length, value = 0) {\n let array = [];\n for (let i = 0; i < length; i++) {\n array.push(value);\n }\n return array;\n}\n\nfunction checkNumber(name, value) {\n if (typeof value !== 'number') {\n throw new TypeError(`${name} must be a number`);\n }\n}\n\nexport function checkNonEmpty(matrix) {\n if (matrix.isEmpty()) {\n throw new Error('Empty matrix has no elements to index');\n }\n}\n","import { isAnyArray } from 'is-any-array';\nimport rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n sumByRow,\n sumByColumn,\n sumAll,\n productByRow,\n productByColumn,\n productAll,\n varianceByRow,\n varianceByColumn,\n varianceAll,\n centerByRow,\n centerByColumn,\n centerAll,\n scaleByRow,\n scaleByColumn,\n scaleAll,\n getScaleByRow,\n getScaleByColumn,\n getScaleAll,\n} from './stat';\nimport {\n checkRowVector,\n checkRowIndex,\n checkColumnIndex,\n checkColumnVector,\n checkRange,\n checkNonEmpty,\n checkRowIndices,\n checkColumnIndices,\n} from './util';\n\nexport class AbstractMatrix {\n static from1DArray(newRows, newColumns, newData) {\n let length = newRows * newColumns;\n if (length !== newData.length) {\n throw new RangeError('data length does not match given dimensions');\n }\n let newMatrix = new Matrix(newRows, newColumns);\n for (let row = 0; row < newRows; row++) {\n for (let column = 0; column < newColumns; column++) {\n newMatrix.set(row, column, newData[row * newColumns + column]);\n }\n }\n return newMatrix;\n }\n\n static rowVector(newData) {\n let vector = new Matrix(1, newData.length);\n for (let i = 0; i < newData.length; i++) {\n vector.set(0, i, newData[i]);\n }\n return vector;\n }\n\n static columnVector(newData) {\n let vector = new Matrix(newData.length, 1);\n for (let i = 0; i < newData.length; i++) {\n vector.set(i, 0, newData[i]);\n }\n return vector;\n }\n\n static zeros(rows, columns) {\n return new Matrix(rows, columns);\n }\n\n static ones(rows, columns) {\n return new Matrix(rows, columns).fill(1);\n }\n\n static rand(rows, columns, options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { random = Math.random } = options;\n let matrix = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n matrix.set(i, j, random());\n }\n }\n return matrix;\n }\n\n static randInt(rows, columns, options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1000, random = Math.random } = options;\n if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let interval = max - min;\n let matrix = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n let value = min + Math.round(random() * interval);\n matrix.set(i, j, value);\n }\n }\n return matrix;\n }\n\n static eye(rows, columns, value) {\n if (columns === undefined) columns = rows;\n if (value === undefined) value = 1;\n let min = Math.min(rows, columns);\n let matrix = this.zeros(rows, columns);\n for (let i = 0; i < min; i++) {\n matrix.set(i, i, value);\n }\n return matrix;\n }\n\n static diag(data, rows, columns) {\n let l = data.length;\n if (rows === undefined) rows = l;\n if (columns === undefined) columns = rows;\n let min = Math.min(l, rows, columns);\n let matrix = this.zeros(rows, columns);\n for (let i = 0; i < min; i++) {\n matrix.set(i, i, data[i]);\n }\n return matrix;\n }\n\n static min(matrix1, matrix2) {\n matrix1 = this.checkMatrix(matrix1);\n matrix2 = this.checkMatrix(matrix2);\n let rows = matrix1.rows;\n let columns = matrix1.columns;\n let result = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n }\n }\n return result;\n }\n\n static max(matrix1, matrix2) {\n matrix1 = this.checkMatrix(matrix1);\n matrix2 = this.checkMatrix(matrix2);\n let rows = matrix1.rows;\n let columns = matrix1.columns;\n let result = new this(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n }\n }\n return result;\n }\n\n static checkMatrix(value) {\n return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n }\n\n static isMatrix(value) {\n return value != null && value.klass === 'Matrix';\n }\n\n get size() {\n return this.rows * this.columns;\n }\n\n apply(callback) {\n if (typeof callback !== 'function') {\n throw new TypeError('callback must be a function');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n callback.call(this, i, j);\n }\n }\n return this;\n }\n\n to1DArray() {\n let array = [];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n array.push(this.get(i, j));\n }\n }\n return array;\n }\n\n to2DArray() {\n let copy = [];\n for (let i = 0; i < this.rows; i++) {\n copy.push([]);\n for (let j = 0; j < this.columns; j++) {\n copy[i].push(this.get(i, j));\n }\n }\n return copy;\n }\n\n toJSON() {\n return this.to2DArray();\n }\n\n isRowVector() {\n return this.rows === 1;\n }\n\n isColumnVector() {\n return this.columns === 1;\n }\n\n isVector() {\n return this.rows === 1 || this.columns === 1;\n }\n\n isSquare() {\n return this.rows === this.columns;\n }\n\n isEmpty() {\n return this.rows === 0 || this.columns === 0;\n }\n\n isSymmetric() {\n if (this.isSquare()) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j <= i; j++) {\n if (this.get(i, j) !== this.get(j, i)) {\n return false;\n }\n }\n }\n return true;\n }\n return false;\n }\n\n isEchelonForm() {\n let i = 0;\n let j = 0;\n let previousColumn = -1;\n let isEchelonForm = true;\n let checked = false;\n while (i < this.rows && isEchelonForm) {\n j = 0;\n checked = false;\n while (j < this.columns && checked === false) {\n if (this.get(i, j) === 0) {\n j++;\n } else if (this.get(i, j) === 1 && j > previousColumn) {\n checked = true;\n previousColumn = j;\n } else {\n isEchelonForm = false;\n checked = true;\n }\n }\n i++;\n }\n return isEchelonForm;\n }\n\n isReducedEchelonForm() {\n let i = 0;\n let j = 0;\n let previousColumn = -1;\n let isReducedEchelonForm = true;\n let checked = false;\n while (i < this.rows && isReducedEchelonForm) {\n j = 0;\n checked = false;\n while (j < this.columns && checked === false) {\n if (this.get(i, j) === 0) {\n j++;\n } else if (this.get(i, j) === 1 && j > previousColumn) {\n checked = true;\n previousColumn = j;\n } else {\n isReducedEchelonForm = false;\n checked = true;\n }\n }\n for (let k = j + 1; k < this.rows; k++) {\n if (this.get(i, k) !== 0) {\n isReducedEchelonForm = false;\n }\n }\n i++;\n }\n return isReducedEchelonForm;\n }\n\n echelonForm() {\n let result = this.clone();\n let h = 0;\n let k = 0;\n while (h < result.rows && k < result.columns) {\n let iMax = h;\n for (let i = h; i < result.rows; i++) {\n if (result.get(i, k) > result.get(iMax, k)) {\n iMax = i;\n }\n }\n if (result.get(iMax, k) === 0) {\n k++;\n } else {\n result.swapRows(h, iMax);\n let tmp = result.get(h, k);\n for (let j = k; j < result.columns; j++) {\n result.set(h, j, result.get(h, j) / tmp);\n }\n for (let i = h + 1; i < result.rows; i++) {\n let factor = result.get(i, k) / result.get(h, k);\n result.set(i, k, 0);\n for (let j = k + 1; j < result.columns; j++) {\n result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n }\n }\n h++;\n k++;\n }\n }\n return result;\n }\n\n reducedEchelonForm() {\n let result = this.echelonForm();\n let m = result.columns;\n let n = result.rows;\n let h = n - 1;\n while (h >= 0) {\n if (result.maxRow(h) === 0) {\n h--;\n } else {\n let p = 0;\n let pivot = false;\n while (p < n && pivot === false) {\n if (result.get(h, p) === 1) {\n pivot = true;\n } else {\n p++;\n }\n }\n for (let i = 0; i < h; i++) {\n let factor = result.get(i, p);\n for (let j = p; j < m; j++) {\n let tmp = result.get(i, j) - factor * result.get(h, j);\n result.set(i, j, tmp);\n }\n }\n h--;\n }\n }\n return result;\n }\n\n set() {\n throw new Error('set method is unimplemented');\n }\n\n get() {\n throw new Error('get method is unimplemented');\n }\n\n repeat(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { rows = 1, columns = 1 } = options;\n if (!Number.isInteger(rows) || rows <= 0) {\n throw new TypeError('rows must be a positive integer');\n }\n if (!Number.isInteger(columns) || columns <= 0) {\n throw new TypeError('columns must be a positive integer');\n }\n let matrix = new Matrix(this.rows * rows, this.columns * columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n }\n }\n return matrix;\n }\n\n fill(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, value);\n }\n }\n return this;\n }\n\n neg() {\n return this.mulS(-1);\n }\n\n getRow(index) {\n checkRowIndex(this, index);\n let row = [];\n for (let i = 0; i < this.columns; i++) {\n row.push(this.get(index, i));\n }\n return row;\n }\n\n getRowVector(index) {\n return Matrix.rowVector(this.getRow(index));\n }\n\n setRow(index, array) {\n checkRowIndex(this, index);\n array = checkRowVector(this, array);\n for (let i = 0; i < this.columns; i++) {\n this.set(index, i, array[i]);\n }\n return this;\n }\n\n swapRows(row1, row2) {\n checkRowIndex(this, row1);\n checkRowIndex(this, row2);\n for (let i = 0; i < this.columns; i++) {\n let temp = this.get(row1, i);\n this.set(row1, i, this.get(row2, i));\n this.set(row2, i, temp);\n }\n return this;\n }\n\n getColumn(index) {\n checkColumnIndex(this, index);\n let column = [];\n for (let i = 0; i < this.rows; i++) {\n column.push(this.get(i, index));\n }\n return column;\n }\n\n getColumnVector(index) {\n return Matrix.columnVector(this.getColumn(index));\n }\n\n setColumn(index, array) {\n checkColumnIndex(this, index);\n array = checkColumnVector(this, array);\n for (let i = 0; i < this.rows; i++) {\n this.set(i, index, array[i]);\n }\n return this;\n }\n\n swapColumns(column1, column2) {\n checkColumnIndex(this, column1);\n checkColumnIndex(this, column2);\n for (let i = 0; i < this.rows; i++) {\n let temp = this.get(i, column1);\n this.set(i, column1, this.get(i, column2));\n this.set(i, column2, temp);\n }\n return this;\n }\n\n addRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + vector[j]);\n }\n }\n return this;\n }\n\n subRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - vector[j]);\n }\n }\n return this;\n }\n\n mulRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * vector[j]);\n }\n }\n return this;\n }\n\n divRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / vector[j]);\n }\n }\n return this;\n }\n\n addColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + vector[i]);\n }\n }\n return this;\n }\n\n subColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - vector[i]);\n }\n }\n return this;\n }\n\n mulColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * vector[i]);\n }\n }\n return this;\n }\n\n divColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / vector[i]);\n }\n }\n return this;\n }\n\n mulRow(index, value) {\n checkRowIndex(this, index);\n for (let i = 0; i < this.columns; i++) {\n this.set(index, i, this.get(index, i) * value);\n }\n return this;\n }\n\n mulColumn(index, value) {\n checkColumnIndex(this, index);\n for (let i = 0; i < this.rows; i++) {\n this.set(i, index, this.get(i, index) * value);\n }\n return this;\n }\n\n max(by) {\n if (this.isEmpty()) {\n return NaN;\n }\n switch (by) {\n case 'row': {\n const max = new Array(this.rows).fill(Number.NEGATIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max[row]) {\n max[row] = this.get(row, column);\n }\n }\n }\n return max;\n }\n case 'column': {\n const max = new Array(this.columns).fill(Number.NEGATIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max[column]) {\n max[column] = this.get(row, column);\n }\n }\n }\n return max;\n }\n case undefined: {\n let max = this.get(0, 0);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max) {\n max = this.get(row, column);\n }\n }\n }\n return max;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n maxIndex() {\n checkNonEmpty(this);\n let v = this.get(0, 0);\n let idx = [0, 0];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n if (this.get(i, j) > v) {\n v = this.get(i, j);\n idx[0] = i;\n idx[1] = j;\n }\n }\n }\n return idx;\n }\n\n min(by) {\n if (this.isEmpty()) {\n return NaN;\n }\n\n switch (by) {\n case 'row': {\n const min = new Array(this.rows).fill(Number.POSITIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min[row]) {\n min[row] = this.get(row, column);\n }\n }\n }\n return min;\n }\n case 'column': {\n const min = new Array(this.columns).fill(Number.POSITIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min[column]) {\n min[column] = this.get(row, column);\n }\n }\n }\n return min;\n }\n case undefined: {\n let min = this.get(0, 0);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min) {\n min = this.get(row, column);\n }\n }\n }\n return min;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n minIndex() {\n checkNonEmpty(this);\n let v = this.get(0, 0);\n let idx = [0, 0];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n if (this.get(i, j) < v) {\n v = this.get(i, j);\n idx[0] = i;\n idx[1] = j;\n }\n }\n }\n return idx;\n }\n\n maxRow(row) {\n checkRowIndex(this, row);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(row, 0);\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) > v) {\n v = this.get(row, i);\n }\n }\n return v;\n }\n\n maxRowIndex(row) {\n checkRowIndex(this, row);\n checkNonEmpty(this);\n let v = this.get(row, 0);\n let idx = [row, 0];\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) > v) {\n v = this.get(row, i);\n idx[1] = i;\n }\n }\n return idx;\n }\n\n minRow(row) {\n checkRowIndex(this, row);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(row, 0);\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) < v) {\n v = this.get(row, i);\n }\n }\n return v;\n }\n\n minRowIndex(row) {\n checkRowIndex(this, row);\n checkNonEmpty(this);\n let v = this.get(row, 0);\n let idx = [row, 0];\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) < v) {\n v = this.get(row, i);\n idx[1] = i;\n }\n }\n return idx;\n }\n\n maxColumn(column) {\n checkColumnIndex(this, column);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(0, column);\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) > v) {\n v = this.get(i, column);\n }\n }\n return v;\n }\n\n maxColumnIndex(column) {\n checkColumnIndex(this, column);\n checkNonEmpty(this);\n let v = this.get(0, column);\n let idx = [0, column];\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) > v) {\n v = this.get(i, column);\n idx[0] = i;\n }\n }\n return idx;\n }\n\n minColumn(column) {\n checkColumnIndex(this, column);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(0, column);\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) < v) {\n v = this.get(i, column);\n }\n }\n return v;\n }\n\n minColumnIndex(column) {\n checkColumnIndex(this, column);\n checkNonEmpty(this);\n let v = this.get(0, column);\n let idx = [0, column];\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) < v) {\n v = this.get(i, column);\n idx[0] = i;\n }\n }\n return idx;\n }\n\n diag() {\n let min = Math.min(this.rows, this.columns);\n let diag = [];\n for (let i = 0; i < min; i++) {\n diag.push(this.get(i, i));\n }\n return diag;\n }\n\n norm(type = 'frobenius') {\n let result = 0;\n if (type === 'max') {\n return this.max();\n } else if (type === 'frobenius') {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n result = result + this.get(i, j) * this.get(i, j);\n }\n }\n return Math.sqrt(result);\n } else {\n throw new RangeError(`unknown norm type: ${type}`);\n }\n }\n\n cumulativeSum() {\n let sum = 0;\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n sum += this.get(i, j);\n this.set(i, j, sum);\n }\n }\n return this;\n }\n\n dot(vector2) {\n if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n let vector1 = this.to1DArray();\n if (vector1.length !== vector2.length) {\n throw new RangeError('vectors do not have the same size');\n }\n let dot = 0;\n for (let i = 0; i < vector1.length; i++) {\n dot += vector1[i] * vector2[i];\n }\n return dot;\n }\n\n mmul(other) {\n other = Matrix.checkMatrix(other);\n\n let m = this.rows;\n let n = this.columns;\n let p = other.columns;\n\n let result = new Matrix(m, p);\n\n let Bcolj = new Float64Array(n);\n for (let j = 0; j < p; j++) {\n for (let k = 0; k < n; k++) {\n Bcolj[k] = other.get(k, j);\n }\n\n for (let i = 0; i < m; i++) {\n let s = 0;\n for (let k = 0; k < n; k++) {\n s += this.get(i, k) * Bcolj[k];\n }\n\n result.set(i, j, s);\n }\n }\n return result;\n }\n\n strassen2x2(other) {\n other = Matrix.checkMatrix(other);\n let result = new Matrix(2, 2);\n const a11 = this.get(0, 0);\n const b11 = other.get(0, 0);\n const a12 = this.get(0, 1);\n const b12 = other.get(0, 1);\n const a21 = this.get(1, 0);\n const b21 = other.get(1, 0);\n const a22 = this.get(1, 1);\n const b22 = other.get(1, 1);\n\n // Compute intermediate values.\n const m1 = (a11 + a22) * (b11 + b22);\n const m2 = (a21 + a22) * b11;\n const m3 = a11 * (b12 - b22);\n const m4 = a22 * (b21 - b11);\n const m5 = (a11 + a12) * b22;\n const m6 = (a21 - a11) * (b11 + b12);\n const m7 = (a12 - a22) * (b21 + b22);\n\n // Combine intermediate values into the output.\n const c00 = m1 + m4 - m5 + m7;\n const c01 = m3 + m5;\n const c10 = m2 + m4;\n const c11 = m1 - m2 + m3 + m6;\n\n result.set(0, 0, c00);\n result.set(0, 1, c01);\n result.set(1, 0, c10);\n result.set(1, 1, c11);\n return result;\n }\n\n strassen3x3(other) {\n other = Matrix.checkMatrix(other);\n let result = new Matrix(3, 3);\n\n const a00 = this.get(0, 0);\n const a01 = this.get(0, 1);\n const a02 = this.get(0, 2);\n const a10 = this.get(1, 0);\n const a11 = this.get(1, 1);\n const a12 = this.get(1, 2);\n const a20 = this.get(2, 0);\n const a21 = this.get(2, 1);\n const a22 = this.get(2, 2);\n\n const b00 = other.get(0, 0);\n const b01 = other.get(0, 1);\n const b02 = other.get(0, 2);\n const b10 = other.get(1, 0);\n const b11 = other.get(1, 1);\n const b12 = other.get(1, 2);\n const b20 = other.get(2, 0);\n const b21 = other.get(2, 1);\n const b22 = other.get(2, 2);\n\n const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n const m2 = (a00 - a10) * (-b01 + b11);\n const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n const m5 = (a10 + a11) * (-b00 + b01);\n const m6 = a00 * b00;\n const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n const m8 = (-a00 + a20) * (b02 - b12);\n const m9 = (a20 + a21) * (-b00 + b02);\n const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n const m13 = (a02 - a22) * (b11 - b21);\n const m14 = a02 * b20;\n const m15 = (a21 + a22) * (-b20 + b21);\n const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n const m17 = (a02 - a12) * (b12 - b22);\n const m18 = (a11 + a12) * (-b20 + b22);\n const m19 = a01 * b10;\n const m20 = a12 * b21;\n const m21 = a10 * b02;\n const m22 = a20 * b01;\n const m23 = a22 * b22;\n\n const c00 = m6 + m14 + m19;\n const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n const c11 = m2 + m4 + m5 + m6 + m20;\n const c12 = m14 + m16 + m17 + m18 + m21;\n const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n const c21 = m12 + m13 + m14 + m15 + m22;\n const c22 = m6 + m7 + m8 + m9 + m23;\n\n result.set(0, 0, c00);\n result.set(0, 1, c01);\n result.set(0, 2, c02);\n result.set(1, 0, c10);\n result.set(1, 1, c11);\n result.set(1, 2, c12);\n result.set(2, 0, c20);\n result.set(2, 1, c21);\n result.set(2, 2, c22);\n return result;\n }\n\n mmulStrassen(y) {\n y = Matrix.checkMatrix(y);\n let x = this.clone();\n let r1 = x.rows;\n let c1 = x.columns;\n let r2 = y.rows;\n let c2 = y.columns;\n if (c1 !== r2) {\n // eslint-disable-next-line no-console\n console.warn(\n `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n );\n }\n\n // Put a matrix into the top left of a matrix of zeros.\n // `rows` and `cols` are the dimensions of the output matrix.\n function embed(mat, rows, cols) {\n let r = mat.rows;\n let c = mat.columns;\n if (r === rows && c === cols) {\n return mat;\n } else {\n let resultat = AbstractMatrix.zeros(rows, cols);\n resultat = resultat.setSubMatrix(mat, 0, 0);\n return resultat;\n }\n }\n\n // Make sure both matrices are the same size.\n // This is exclusively for simplicity:\n // this algorithm can be implemented with matrices of different sizes.\n\n let r = Math.max(r1, r2);\n let c = Math.max(c1, c2);\n x = embed(x, r, c);\n y = embed(y, r, c);\n\n // Our recursive multiplication function.\n function blockMult(a, b, rows, cols) {\n // For small matrices, resort to naive multiplication.\n if (rows <= 512 || cols <= 512) {\n return a.mmul(b); // a is equivalent to this\n }\n\n // Apply dynamic padding.\n if (rows % 2 === 1 && cols % 2 === 1) {\n a = embed(a, rows + 1, cols + 1);\n b = embed(b, rows + 1, cols + 1);\n } else if (rows % 2 === 1) {\n a = embed(a, rows + 1, cols);\n b = embed(b, rows + 1, cols);\n } else if (cols % 2 === 1) {\n a = embed(a, rows, cols + 1);\n b = embed(b, rows, cols + 1);\n }\n\n let halfRows = parseInt(a.rows / 2, 10);\n let halfCols = parseInt(a.columns / 2, 10);\n // Subdivide input matrices.\n let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n // Compute intermediate values.\n let m1 = blockMult(\n AbstractMatrix.add(a11, a22),\n AbstractMatrix.add(b11, b22),\n halfRows,\n halfCols,\n );\n let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n let m6 = blockMult(\n AbstractMatrix.sub(a21, a11),\n AbstractMatrix.add(b11, b12),\n halfRows,\n halfCols,\n );\n let m7 = blockMult(\n AbstractMatrix.sub(a12, a22),\n AbstractMatrix.add(b21, b22),\n halfRows,\n halfCols,\n );\n\n // Combine intermediate values into the output.\n let c11 = AbstractMatrix.add(m1, m4);\n c11.sub(m5);\n c11.add(m7);\n let c12 = AbstractMatrix.add(m3, m5);\n let c21 = AbstractMatrix.add(m2, m4);\n let c22 = AbstractMatrix.sub(m1, m2);\n c22.add(m3);\n c22.add(m6);\n\n // Crop output to the desired size (undo dynamic padding).\n let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n resultat = resultat.setSubMatrix(c11, 0, 0);\n resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n }\n\n return blockMult(x, y, r, c);\n }\n\n scaleRows(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1 } = options;\n if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let newMatrix = new Matrix(this.rows, this.columns);\n for (let i = 0; i < this.rows; i++) {\n const row = this.getRow(i);\n if (row.length > 0) {\n rescale(row, { min, max, output: row });\n }\n newMatrix.setRow(i, row);\n }\n return newMatrix;\n }\n\n scaleColumns(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1 } = options;\n if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let newMatrix = new Matrix(this.rows, this.columns);\n for (let i = 0; i < this.columns; i++) {\n const column = this.getColumn(i);\n if (column.length) {\n rescale(column, {\n min: min,\n max: max,\n output: column,\n });\n }\n newMatrix.setColumn(i, column);\n }\n return newMatrix;\n }\n\n flipRows() {\n const middle = Math.ceil(this.columns / 2);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < middle; j++) {\n let first = this.get(i, j);\n let last = this.get(i, this.columns - 1 - j);\n this.set(i, j, last);\n this.set(i, this.columns - 1 - j, first);\n }\n }\n return this;\n }\n\n flipColumns() {\n const middle = Math.ceil(this.rows / 2);\n for (let j = 0; j < this.columns; j++) {\n for (let i = 0; i < middle; i++) {\n let first = this.get(i, j);\n let last = this.get(this.rows - 1 - i, j);\n this.set(i, j, last);\n this.set(this.rows - 1 - i, j, first);\n }\n }\n return this;\n }\n\n kroneckerProduct(other) {\n other = Matrix.checkMatrix(other);\n\n let m = this.rows;\n let n = this.columns;\n let p = other.rows;\n let q = other.columns;\n\n let result = new Matrix(m * p, n * q);\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n for (let k = 0; k < p; k++) {\n for (let l = 0; l < q; l++) {\n result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n }\n }\n }\n }\n return result;\n }\n\n kroneckerSum(other) {\n other = Matrix.checkMatrix(other);\n if (!this.isSquare() || !other.isSquare()) {\n throw new Error('Kronecker Sum needs two Square Matrices');\n }\n let m = this.rows;\n let n = other.rows;\n let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n return AxI.add(IxB);\n }\n\n transpose() {\n let result = new Matrix(this.columns, this.rows);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n result.set(j, i, this.get(i, j));\n }\n }\n return result;\n }\n\n sortRows(compareFunction = compareNumbers) {\n for (let i = 0; i < this.rows; i++) {\n this.setRow(i, this.getRow(i).sort(compareFunction));\n }\n return this;\n }\n\n sortColumns(compareFunction = compareNumbers) {\n for (let i = 0; i < this.columns; i++) {\n this.setColumn(i, this.getColumn(i).sort(compareFunction));\n }\n return this;\n }\n\n subMatrix(startRow, endRow, startColumn, endColumn) {\n checkRange(this, startRow, endRow, startColumn, endColumn);\n let newMatrix = new Matrix(\n endRow - startRow + 1,\n endColumn - startColumn + 1,\n );\n for (let i = startRow; i <= endRow; i++) {\n for (let j = startColumn; j <= endColumn; j++) {\n newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n }\n }\n return newMatrix;\n }\n\n subMatrixRow(indices, startColumn, endColumn) {\n if (startColumn === undefined) startColumn = 0;\n if (endColumn === undefined) endColumn = this.columns - 1;\n if (\n startColumn > endColumn ||\n startColumn < 0 ||\n startColumn >= this.columns ||\n endColumn < 0 ||\n endColumn >= this.columns\n ) {\n throw new RangeError('Argument out of range');\n }\n\n let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n for (let i = 0; i < indices.length; i++) {\n for (let j = startColumn; j <= endColumn; j++) {\n if (indices[i] < 0 || indices[i] >= this.rows) {\n throw new RangeError(`Row index out of range: ${indices[i]}`);\n }\n newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n }\n }\n return newMatrix;\n }\n\n subMatrixColumn(indices, startRow, endRow) {\n if (startRow === undefined) startRow = 0;\n if (endRow === undefined) endRow = this.rows - 1;\n if (\n startRow > endRow ||\n startRow < 0 ||\n startRow >= this.rows ||\n endRow < 0 ||\n endRow >= this.rows\n ) {\n throw new RangeError('Argument out of range');\n }\n\n let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n for (let i = 0; i < indices.length; i++) {\n for (let j = startRow; j <= endRow; j++) {\n if (indices[i] < 0 || indices[i] >= this.columns) {\n throw new RangeError(`Column index out of range: ${indices[i]}`);\n }\n newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n }\n }\n return newMatrix;\n }\n\n setSubMatrix(matrix, startRow, startColumn) {\n matrix = Matrix.checkMatrix(matrix);\n if (matrix.isEmpty()) {\n return this;\n }\n let endRow = startRow + matrix.rows - 1;\n let endColumn = startColumn + matrix.columns - 1;\n checkRange(this, startRow, endRow, startColumn, endColumn);\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n this.set(startRow + i, startColumn + j, matrix.get(i, j));\n }\n }\n return this;\n }\n\n selection(rowIndices, columnIndices) {\n checkRowIndices(this, rowIndices);\n checkColumnIndices(this, columnIndices);\n let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n for (let i = 0; i < rowIndices.length; i++) {\n let rowIndex = rowIndices[i];\n for (let j = 0; j < columnIndices.length; j++) {\n let columnIndex = columnIndices[j];\n newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n }\n }\n return newMatrix;\n }\n\n trace() {\n let min = Math.min(this.rows, this.columns);\n let trace = 0;\n for (let i = 0; i < min; i++) {\n trace += this.get(i, i);\n }\n return trace;\n }\n\n clone() {\n let newMatrix = new Matrix(this.rows, this.columns);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n newMatrix.set(row, column, this.get(row, column));\n }\n }\n return newMatrix;\n }\n\n sum(by) {\n switch (by) {\n case 'row':\n return sumByRow(this);\n case 'column':\n return sumByColumn(this);\n case undefined:\n return sumAll(this);\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n product(by) {\n switch (by) {\n case 'row':\n return productByRow(this);\n case 'column':\n return productByColumn(this);\n case undefined:\n return productAll(this);\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n mean(by) {\n const sum = this.sum(by);\n switch (by) {\n case 'row': {\n for (let i = 0; i < this.rows; i++) {\n sum[i] /= this.columns;\n }\n return sum;\n }\n case 'column': {\n for (let i = 0; i < this.columns; i++) {\n sum[i] /= this.rows;\n }\n return sum;\n }\n case undefined:\n return sum / this.size;\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n variance(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { unbiased = true, mean = this.mean(by) } = options;\n if (typeof unbiased !== 'boolean') {\n throw new TypeError('unbiased must be a boolean');\n }\n switch (by) {\n case 'row': {\n if (!isAnyArray(mean)) {\n throw new TypeError('mean must be an array');\n }\n return varianceByRow(this, unbiased, mean);\n }\n case 'column': {\n if (!isAnyArray(mean)) {\n throw new TypeError('mean must be an array');\n }\n return varianceByColumn(this, unbiased, mean);\n }\n case undefined: {\n if (typeof mean !== 'number') {\n throw new TypeError('mean must be a number');\n }\n return varianceAll(this, unbiased, mean);\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n standardDeviation(by, options) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n const variance = this.variance(by, options);\n if (by === undefined) {\n return Math.sqrt(variance);\n } else {\n for (let i = 0; i < variance.length; i++) {\n variance[i] = Math.sqrt(variance[i]);\n }\n return variance;\n }\n }\n\n center(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { center = this.mean(by) } = options;\n switch (by) {\n case 'row': {\n if (!isAnyArray(center)) {\n throw new TypeError('center must be an array');\n }\n centerByRow(this, center);\n return this;\n }\n case 'column': {\n if (!isAnyArray(center)) {\n throw new TypeError('center must be an array');\n }\n centerByColumn(this, center);\n return this;\n }\n case undefined: {\n if (typeof center !== 'number') {\n throw new TypeError('center must be a number');\n }\n centerAll(this, center);\n return this;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n scale(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n let scale = options.scale;\n switch (by) {\n case 'row': {\n if (scale === undefined) {\n scale = getScaleByRow(this);\n } else if (!isAnyArray(scale)) {\n throw new TypeError('scale must be an array');\n }\n scaleByRow(this, scale);\n return this;\n }\n case 'column': {\n if (scale === undefined) {\n scale = getScaleByColumn(this);\n } else if (!isAnyArray(scale)) {\n throw new TypeError('scale must be an array');\n }\n scaleByColumn(this, scale);\n return this;\n }\n case undefined: {\n if (scale === undefined) {\n scale = getScaleAll(this);\n } else if (typeof scale !== 'number') {\n throw new TypeError('scale must be a number');\n }\n scaleAll(this, scale);\n return this;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n toString(options) {\n return inspectMatrixWithOptions(this, options);\n }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n return a - b;\n}\n\nfunction isArrayOfNumbers(array) {\n return array.every((element) => {\n return typeof element === 'number';\n });\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n constructor(nRows, nColumns) {\n super();\n if (Matrix.isMatrix(nRows)) {\n // eslint-disable-next-line no-constructor-return\n return nRows.clone();\n } else if (Number.isInteger(nRows) && nRows >= 0) {\n // Create an empty matrix\n this.data = [];\n if (Number.isInteger(nColumns) && nColumns >= 0) {\n for (let i = 0; i < nRows; i++) {\n this.data.push(new Float64Array(nColumns));\n }\n } else {\n throw new TypeError('nColumns must be a positive integer');\n }\n } else if (isAnyArray(nRows)) {\n // Copy the values from the 2D array\n const arrayData = nRows;\n nRows = arrayData.length;\n nColumns = nRows ? arrayData[0].length : 0;\n if (typeof nColumns !== 'number') {\n throw new TypeError(\n 'Data must be a 2D array with at least one element',\n );\n }\n this.data = [];\n for (let i = 0; i < nRows; i++) {\n if (arrayData[i].length !== nColumns) {\n throw new RangeError('Inconsistent array dimensions');\n }\n if (!isArrayOfNumbers(arrayData[i])) {\n throw new TypeError('Input data contains non-numeric values');\n }\n this.data.push(Float64Array.from(arrayData[i]));\n }\n } else {\n throw new TypeError(\n 'First argument must be a positive number or an array',\n );\n }\n this.rows = nRows;\n this.columns = nColumns;\n }\n\n set(rowIndex, columnIndex, value) {\n this.data[rowIndex][columnIndex] = value;\n return this;\n }\n\n get(rowIndex, columnIndex) {\n return this.data[rowIndex][columnIndex];\n }\n\n removeRow(index) {\n checkRowIndex(this, index);\n this.data.splice(index, 1);\n this.rows -= 1;\n return this;\n }\n\n addRow(index, array) {\n if (array === undefined) {\n array = index;\n index = this.rows;\n }\n checkRowIndex(this, index, true);\n array = Float64Array.from(checkRowVector(this, array));\n this.data.splice(index, 0, array);\n this.rows += 1;\n return this;\n }\n\n removeColumn(index) {\n checkColumnIndex(this, index);\n for (let i = 0; i < this.rows; i++) {\n const newRow = new Float64Array(this.columns - 1);\n for (let j = 0; j < index; j++) {\n newRow[j] = this.data[i][j];\n }\n for (let j = index + 1; j < this.columns; j++) {\n newRow[j - 1] = this.data[i][j];\n }\n this.data[i] = newRow;\n }\n this.columns -= 1;\n return this;\n }\n\n addColumn(index, array) {\n if (typeof array === 'undefined') {\n array = index;\n index = this.columns;\n }\n checkColumnIndex(this, index, true);\n array = checkColumnVector(this, array);\n for (let i = 0; i < this.rows; i++) {\n const newRow = new Float64Array(this.columns + 1);\n let j = 0;\n for (; j < index; j++) {\n newRow[j] = this.data[i][j];\n }\n newRow[j++] = array[i];\n for (; j < this.columns + 1; j++) {\n newRow[j] = this.data[i][j - 1];\n }\n this.data[i] = newRow;\n }\n this.columns += 1;\n return this;\n }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n let sum = newArray(matrix.rows);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[i] += matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function sumByColumn(matrix) {\n let sum = newArray(matrix.columns);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[j] += matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function sumAll(matrix) {\n let v = 0;\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n v += matrix.get(i, j);\n }\n }\n return v;\n}\n\nexport function productByRow(matrix) {\n let sum = newArray(matrix.rows, 1);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[i] *= matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function productByColumn(matrix) {\n let sum = newArray(matrix.columns, 1);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[j] *= matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function productAll(matrix) {\n let v = 1;\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n v *= matrix.get(i, j);\n }\n }\n return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const variance = [];\n\n for (let i = 0; i < rows; i++) {\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let j = 0; j < cols; j++) {\n x = matrix.get(i, j) - mean[i];\n sum1 += x;\n sum2 += x * x;\n }\n if (unbiased) {\n variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n } else {\n variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n }\n }\n return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const variance = [];\n\n for (let j = 0; j < cols; j++) {\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let i = 0; i < rows; i++) {\n x = matrix.get(i, j) - mean[j];\n sum1 += x;\n sum2 += x * x;\n }\n if (unbiased) {\n variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n } else {\n variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n }\n }\n return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const size = rows * cols;\n\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < cols; j++) {\n x = matrix.get(i, j) - mean;\n sum1 += x;\n sum2 += x * x;\n }\n }\n if (unbiased) {\n return (sum2 - (sum1 * sum1) / size) / (size - 1);\n } else {\n return (sum2 - (sum1 * sum1) / size) / size;\n }\n}\n\nexport function centerByRow(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean[i]);\n }\n }\n}\n\nexport function centerByColumn(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean[j]);\n }\n }\n}\n\nexport function centerAll(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean);\n }\n }\n}\n\nexport function getScaleByRow(matrix) {\n const scale = [];\n for (let i = 0; i < matrix.rows; i++) {\n let sum = 0;\n for (let j = 0; j < matrix.columns; j++) {\n sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n }\n scale.push(Math.sqrt(sum));\n }\n return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale[i]);\n }\n }\n}\n\nexport function getScaleByColumn(matrix) {\n const scale = [];\n for (let j = 0; j < matrix.columns; j++) {\n let sum = 0;\n for (let i = 0; i < matrix.rows; i++) {\n sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n }\n scale.push(Math.sqrt(sum));\n }\n return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale[j]);\n }\n }\n}\n\nexport function getScaleAll(matrix) {\n const divider = matrix.size - 1;\n let sum = 0;\n for (let j = 0; j < matrix.columns; j++) {\n for (let i = 0; i < matrix.rows; i++) {\n sum += Math.pow(matrix.get(i, j), 2) / divider;\n }\n }\n return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale);\n }\n }\n}\n","export function installMathOperations(AbstractMatrix, Matrix) {\n AbstractMatrix.prototype.add = function add(value) {\n if (typeof value === 'number') return this.addS(value);\n return this.addM(value);\n };\n\n AbstractMatrix.prototype.addS = function addS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.addM = function addM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.add = function add(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.add(value);\n };\n\n AbstractMatrix.prototype.sub = function sub(value) {\n if (typeof value === 'number') return this.subS(value);\n return this.subM(value);\n };\n\n AbstractMatrix.prototype.subS = function subS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.subM = function subM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.sub = function sub(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sub(value);\n };\n AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n AbstractMatrix.subtract = AbstractMatrix.sub;\n\n AbstractMatrix.prototype.mul = function mul(value) {\n if (typeof value === 'number') return this.mulS(value);\n return this.mulM(value);\n };\n\n AbstractMatrix.prototype.mulS = function mulS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.mulM = function mulM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.mul = function mul(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.mul(value);\n };\n AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n AbstractMatrix.multiply = AbstractMatrix.mul;\n\n AbstractMatrix.prototype.div = function div(value) {\n if (typeof value === 'number') return this.divS(value);\n return this.divM(value);\n };\n\n AbstractMatrix.prototype.divS = function divS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.divM = function divM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.div = function div(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.div(value);\n };\n AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n AbstractMatrix.divide = AbstractMatrix.div;\n\n AbstractMatrix.prototype.mod = function mod(value) {\n if (typeof value === 'number') return this.modS(value);\n return this.modM(value);\n };\n\n AbstractMatrix.prototype.modS = function modS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) % value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.modM = function modM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) % matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.mod = function mod(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.mod(value);\n };\n AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n AbstractMatrix.modulus = AbstractMatrix.mod;\n\n AbstractMatrix.prototype.and = function and(value) {\n if (typeof value === 'number') return this.andS(value);\n return this.andM(value);\n };\n\n AbstractMatrix.prototype.andS = function andS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) & value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.andM = function andM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) & matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.and = function and(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.and(value);\n };\n\n AbstractMatrix.prototype.or = function or(value) {\n if (typeof value === 'number') return this.orS(value);\n return this.orM(value);\n };\n\n AbstractMatrix.prototype.orS = function orS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) | value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.orM = function orM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) | matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.or = function or(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.or(value);\n };\n\n AbstractMatrix.prototype.xor = function xor(value) {\n if (typeof value === 'number') return this.xorS(value);\n return this.xorM(value);\n };\n\n AbstractMatrix.prototype.xorS = function xorS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) ^ value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.xorM = function xorM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.xor = function xor(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.xor(value);\n };\n\n AbstractMatrix.prototype.leftShift = function leftShift(value) {\n if (typeof value === 'number') return this.leftShiftS(value);\n return this.leftShiftM(value);\n };\n\n AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) << value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) << matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.leftShift = function leftShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.leftShift(value);\n };\n\n AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n return this.signPropagatingRightShiftM(value);\n };\n\n AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >> value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.signPropagatingRightShift(value);\n };\n\n AbstractMatrix.prototype.rightShift = function rightShift(value) {\n if (typeof value === 'number') return this.rightShiftS(value);\n return this.rightShiftM(value);\n };\n\n AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >>> value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.rightShift = function rightShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.rightShift(value);\n };\n AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n AbstractMatrix.prototype.not = function not() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, ~(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.not = function not(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.not();\n };\n\n AbstractMatrix.prototype.abs = function abs() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.abs(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.abs = function abs(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.abs();\n };\n\n AbstractMatrix.prototype.acos = function acos() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.acos(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.acos = function acos(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.acos();\n };\n\n AbstractMatrix.prototype.acosh = function acosh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.acosh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.acosh = function acosh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.acosh();\n };\n\n AbstractMatrix.prototype.asin = function asin() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.asin(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.asin = function asin(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.asin();\n };\n\n AbstractMatrix.prototype.asinh = function asinh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.asinh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.asinh = function asinh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.asinh();\n };\n\n AbstractMatrix.prototype.atan = function atan() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.atan(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.atan = function atan(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.atan();\n };\n\n AbstractMatrix.prototype.atanh = function atanh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.atanh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.atanh = function atanh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.atanh();\n };\n\n AbstractMatrix.prototype.cbrt = function cbrt() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cbrt(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cbrt = function cbrt(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cbrt();\n };\n\n AbstractMatrix.prototype.ceil = function ceil() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.ceil(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.ceil = function ceil(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.ceil();\n };\n\n AbstractMatrix.prototype.clz32 = function clz32() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.clz32(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.clz32 = function clz32(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.clz32();\n };\n\n AbstractMatrix.prototype.cos = function cos() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cos(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cos = function cos(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cos();\n };\n\n AbstractMatrix.prototype.cosh = function cosh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cosh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cosh = function cosh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cosh();\n };\n\n AbstractMatrix.prototype.exp = function exp() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.exp(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.exp = function exp(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.exp();\n };\n\n AbstractMatrix.prototype.expm1 = function expm1() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.expm1(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.expm1 = function expm1(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.expm1();\n };\n\n AbstractMatrix.prototype.floor = function floor() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.floor(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.floor = function floor(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.floor();\n };\n\n AbstractMatrix.prototype.fround = function fround() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.fround(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.fround = function fround(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.fround();\n };\n\n AbstractMatrix.prototype.log = function log() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log = function log(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log();\n };\n\n AbstractMatrix.prototype.log1p = function log1p() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log1p(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log1p = function log1p(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log1p();\n };\n\n AbstractMatrix.prototype.log10 = function log10() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log10(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log10 = function log10(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log10();\n };\n\n AbstractMatrix.prototype.log2 = function log2() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log2(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log2 = function log2(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log2();\n };\n\n AbstractMatrix.prototype.round = function round() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.round(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.round = function round(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.round();\n };\n\n AbstractMatrix.prototype.sign = function sign() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sign(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sign = function sign(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sign();\n };\n\n AbstractMatrix.prototype.sin = function sin() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sin(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sin = function sin(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sin();\n };\n\n AbstractMatrix.prototype.sinh = function sinh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sinh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sinh = function sinh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sinh();\n };\n\n AbstractMatrix.prototype.sqrt = function sqrt() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sqrt(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sqrt = function sqrt(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sqrt();\n };\n\n AbstractMatrix.prototype.tan = function tan() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.tan(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.tan = function tan(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.tan();\n };\n\n AbstractMatrix.prototype.tanh = function tanh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.tanh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.tanh = function tanh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.tanh();\n };\n\n AbstractMatrix.prototype.trunc = function trunc() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.trunc(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.trunc = function trunc(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.trunc();\n };\n\n AbstractMatrix.pow = function pow(matrix, arg0) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.pow(arg0);\n };\n\n AbstractMatrix.prototype.pow = function pow(value) {\n if (typeof value === 'number') return this.powS(value);\n return this.powM(value);\n };\n\n AbstractMatrix.prototype.powS = function powS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.pow(this.get(i, j), value));\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.powM = function powM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n }\n }\n return this;\n };\n}\n","import { AbstractMatrix } from '../matrix';\n\nexport default class WrapperMatrix2D extends AbstractMatrix {\n constructor(data) {\n super();\n this.data = data;\n this.rows = data.length;\n this.columns = data[0].length;\n }\n\n set(rowIndex, columnIndex, value) {\n this.data[rowIndex][columnIndex] = value;\n return this;\n }\n\n get(rowIndex, columnIndex) {\n return this.data[rowIndex][columnIndex];\n }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nexport default class LuDecomposition {\n constructor(matrix) {\n matrix = WrapperMatrix2D.checkMatrix(matrix);\n\n let lu = matrix.clone();\n let rows = lu.rows;\n let columns = lu.columns;\n let pivotVector = new Float64Array(rows);\n let pivotSign = 1;\n let i, j, k, p, s, t, v;\n let LUcolj, kmax;\n\n for (i = 0; i < rows; i++) {\n pivotVector[i] = i;\n }\n\n LUcolj = new Float64Array(rows);\n\n for (j = 0; j < columns; j++) {\n for (i = 0; i < rows; i++) {\n LUcolj[i] = lu.get(i, j);\n }\n\n for (i = 0; i < rows; i++) {\n kmax = Math.min(i, j);\n s = 0;\n for (k = 0; k < kmax; k++) {\n s += lu.get(i, k) * LUcolj[k];\n }\n LUcolj[i] -= s;\n lu.set(i, j, LUcolj[i]);\n }\n\n p = j;\n for (i = j + 1; i < rows; i++) {\n if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {\n p = i;\n }\n }\n\n if (p !== j) {\n for (k = 0; k < columns; k++) {\n t = lu.get(p, k);\n lu.set(p, k, lu.get(j, k));\n lu.set(j, k, t);\n }\n\n v = pivotVector[p];\n pivotVector[p] = pivotVector[j];\n pivotVector[j] = v;\n\n pivotSign = -pivotSign;\n }\n\n if (j < rows && lu.get(j, j) !== 0) {\n for (i = j + 1; i < rows; i++) {\n lu.set(i, j, lu.get(i, j) / lu.get(j, j));\n }\n }\n }\n\n this.LU = lu;\n this.pivotVector = pivotVector;\n this.pivotSign = pivotSign;\n }\n\n isSingular() {\n let data = this.LU;\n let col = data.columns;\n for (let j = 0; j < col; j++) {\n if (data.get(j, j) === 0) {\n return true;\n }\n }\n return false;\n }\n\n solve(value) {\n value = Matrix.checkMatrix(value);\n\n let lu = this.LU;\n let rows = lu.rows;\n\n if (rows !== value.rows) {\n throw new Error('Invalid matrix dimensions');\n }\n if (this.isSingular()) {\n throw new Error('LU matrix is singular');\n }\n\n let count = value.columns;\n let X = value.subMatrixRow(this.pivotVector, 0, count - 1);\n let columns = lu.columns;\n let i, j, k;\n\n for (k = 0; k < columns; k++) {\n for (i = k + 1; i < columns; i++) {\n for (j = 0; j < count; j++) {\n X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n }\n }\n }\n for (k = columns - 1; k >= 0; k--) {\n for (j = 0; j < count; j++) {\n X.set(k, j, X.get(k, j) / lu.get(k, k));\n }\n for (i = 0; i < k; i++) {\n for (j = 0; j < count; j++) {\n X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n }\n }\n }\n return X;\n }\n\n get determinant() {\n let data = this.LU;\n if (!data.isSquare()) {\n throw new Error('Matrix must be square');\n }\n let determinant = this.pivotSign;\n let col = data.columns;\n for (let j = 0; j < col; j++) {\n determinant *= data.get(j, j);\n }\n return determinant;\n }\n\n get lowerTriangularMatrix() {\n let data = this.LU;\n let rows = data.rows;\n let columns = data.columns;\n let X = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n if (i > j) {\n X.set(i, j, data.get(i, j));\n } else if (i === j) {\n X.set(i, j, 1);\n } else {\n X.set(i, j, 0);\n }\n }\n }\n return X;\n }\n\n get upperTriangularMatrix() {\n let data = this.LU;\n let rows = data.rows;\n let columns = data.columns;\n let X = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n if (i <= j) {\n X.set(i, j, data.get(i, j));\n } else {\n X.set(i, j, 0);\n }\n }\n }\n return X;\n }\n\n get pivotPermutationVector() {\n return Array.from(this.pivotVector);\n }\n}\n","export function hypotenuse(a, b) {\n let r = 0;\n if (Math.abs(a) > Math.abs(b)) {\n r = b / a;\n return Math.abs(a) * Math.sqrt(1 + r * r);\n }\n if (b !== 0) {\n r = a / b;\n return Math.abs(b) * Math.sqrt(1 + r * r);\n }\n return 0;\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class QrDecomposition {\n constructor(value) {\n value = WrapperMatrix2D.checkMatrix(value);\n\n let qr = value.clone();\n let m = value.rows;\n let n = value.columns;\n let rdiag = new Float64Array(n);\n let i, j, k, s;\n\n for (k = 0; k < n; k++) {\n let nrm = 0;\n for (i = k; i < m; i++) {\n nrm = hypotenuse(nrm, qr.get(i, k));\n }\n if (nrm !== 0) {\n if (qr.get(k, k) < 0) {\n nrm = -nrm;\n }\n for (i = k; i < m; i++) {\n qr.set(i, k, qr.get(i, k) / nrm);\n }\n qr.set(k, k, qr.get(k, k) + 1);\n for (j = k + 1; j < n; j++) {\n s = 0;\n for (i = k; i < m; i++) {\n s += qr.get(i, k) * qr.get(i, j);\n }\n s = -s / qr.get(k, k);\n for (i = k; i < m; i++) {\n qr.set(i, j, qr.get(i, j) + s * qr.get(i, k));\n }\n }\n }\n rdiag[k] = -nrm;\n }\n\n this.QR = qr;\n this.Rdiag = rdiag;\n }\n\n solve(value) {\n value = Matrix.checkMatrix(value);\n\n let qr = this.QR;\n let m = qr.rows;\n\n if (value.rows !== m) {\n throw new Error('Matrix row dimensions must agree');\n }\n if (!this.isFullRank()) {\n throw new Error('Matrix is rank deficient');\n }\n\n let count = value.columns;\n let X = value.clone();\n let n = qr.columns;\n let i, j, k, s;\n\n for (k = 0; k < n; k++) {\n for (j = 0; j < count; j++) {\n s = 0;\n for (i = k; i < m; i++) {\n s += qr.get(i, k) * X.get(i, j);\n }\n s = -s / qr.get(k, k);\n for (i = k; i < m; i++) {\n X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n }\n }\n }\n for (k = n - 1; k >= 0; k--) {\n for (j = 0; j < count; j++) {\n X.set(k, j, X.get(k, j) / this.Rdiag[k]);\n }\n for (i = 0; i < k; i++) {\n for (j = 0; j < count; j++) {\n X.set(i, j, X.get(i, j) - X.get(k, j) * qr.get(i, k));\n }\n }\n }\n\n return X.subMatrix(0, n - 1, 0, count - 1);\n }\n\n isFullRank() {\n let columns = this.QR.columns;\n for (let i = 0; i < columns; i++) {\n if (this.Rdiag[i] === 0) {\n return false;\n }\n }\n return true;\n }\n\n get upperTriangularMatrix() {\n let qr = this.QR;\n let n = qr.columns;\n let X = new Matrix(n, n);\n let i, j;\n for (i = 0; i < n; i++) {\n for (j = 0; j < n; j++) {\n if (i < j) {\n X.set(i, j, qr.get(i, j));\n } else if (i === j) {\n X.set(i, j, this.Rdiag[i]);\n } else {\n X.set(i, j, 0);\n }\n }\n }\n return X;\n }\n\n get orthogonalMatrix() {\n let qr = this.QR;\n let rows = qr.rows;\n let columns = qr.columns;\n let X = new Matrix(rows, columns);\n let i, j, k, s;\n\n for (k = columns - 1; k >= 0; k--) {\n for (i = 0; i < rows; i++) {\n X.set(i, k, 0);\n }\n X.set(k, k, 1);\n for (j = k; j < columns; j++) {\n if (qr.get(k, k) !== 0) {\n s = 0;\n for (i = k; i < rows; i++) {\n s += qr.get(i, k) * X.get(i, j);\n }\n\n s = -s / qr.get(k, k);\n\n for (i = k; i < rows; i++) {\n X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n }\n }\n }\n }\n return X;\n }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class SingularValueDecomposition {\n constructor(value, options = {}) {\n value = WrapperMatrix2D.checkMatrix(value);\n\n if (value.isEmpty()) {\n throw new Error('Matrix must be non-empty');\n }\n\n let m = value.rows;\n let n = value.columns;\n\n const {\n computeLeftSingularVectors = true,\n computeRightSingularVectors = true,\n autoTranspose = false,\n } = options;\n\n let wantu = Boolean(computeLeftSingularVectors);\n let wantv = Boolean(computeRightSingularVectors);\n\n let swapped = false;\n let a;\n if (m < n) {\n if (!autoTranspose) {\n a = value.clone();\n // eslint-disable-next-line no-console\n console.warn(\n 'Computing SVD on a matrix with more columns than rows. Consider enabling autoTranspose',\n );\n } else {\n a = value.transpose();\n m = a.rows;\n n = a.columns;\n swapped = true;\n let aux = wantu;\n wantu = wantv;\n wantv = aux;\n }\n } else {\n a = value.clone();\n }\n\n let nu = Math.min(m, n);\n let ni = Math.min(m + 1, n);\n let s = new Float64Array(ni);\n let U = new Matrix(m, nu);\n let V = new Matrix(n, n);\n\n let e = new Float64Array(n);\n let work = new Float64Array(m);\n\n let si = new Float64Array(ni);\n for (let i = 0; i < ni; i++) si[i] = i;\n\n let nct = Math.min(m - 1, n);\n let nrt = Math.max(0, Math.min(n - 2, m));\n let mrc = Math.max(nct, nrt);\n\n for (let k = 0; k < mrc; k++) {\n if (k < nct) {\n s[k] = 0;\n for (let i = k; i < m; i++) {\n s[k] = hypotenuse(s[k], a.get(i, k));\n }\n if (s[k] !== 0) {\n if (a.get(k, k) < 0) {\n s[k] = -s[k];\n }\n for (let i = k; i < m; i++) {\n a.set(i, k, a.get(i, k) / s[k]);\n }\n a.set(k, k, a.get(k, k) + 1);\n }\n s[k] = -s[k];\n }\n\n for (let j = k + 1; j < n; j++) {\n if (k < nct && s[k] !== 0) {\n let t = 0;\n for (let i = k; i < m; i++) {\n t += a.get(i, k) * a.get(i, j);\n }\n t = -t / a.get(k, k);\n for (let i = k; i < m; i++) {\n a.set(i, j, a.get(i, j) + t * a.get(i, k));\n }\n }\n e[j] = a.get(k, j);\n }\n\n if (wantu && k < nct) {\n for (let i = k; i < m; i++) {\n U.set(i, k, a.get(i, k));\n }\n }\n\n if (k < nrt) {\n e[k] = 0;\n for (let i = k + 1; i < n; i++) {\n e[k] = hypotenuse(e[k], e[i]);\n }\n if (e[k] !== 0) {\n if (e[k + 1] < 0) {\n e[k] = 0 - e[k];\n }\n for (let i = k + 1; i < n; i++) {\n e[i] /= e[k];\n }\n e[k + 1] += 1;\n }\n e[k] = -e[k];\n if (k + 1 < m && e[k] !== 0) {\n for (let i = k + 1; i < m; i++) {\n work[i] = 0;\n }\n for (let i = k + 1; i < m; i++) {\n for (let j = k + 1; j < n; j++) {\n work[i] += e[j] * a.get(i, j);\n }\n }\n for (let j = k + 1; j < n; j++) {\n let t = -e[j] / e[k + 1];\n for (let i = k + 1; i < m; i++) {\n a.set(i, j, a.get(i, j) + t * work[i]);\n }\n }\n }\n if (wantv) {\n for (let i = k + 1; i < n; i++) {\n V.set(i, k, e[i]);\n }\n }\n }\n }\n\n let p = Math.min(n, m + 1);\n if (nct < n) {\n s[nct] = a.get(nct, nct);\n }\n if (m < p) {\n s[p - 1] = 0;\n }\n if (nrt + 1 < p) {\n e[nrt] = a.get(nrt, p - 1);\n }\n e[p - 1] = 0;\n\n if (wantu) {\n for (let j = nct; j < nu; j++) {\n for (let i = 0; i < m; i++) {\n U.set(i, j, 0);\n }\n U.set(j, j, 1);\n }\n for (let k = nct - 1; k >= 0; k--) {\n if (s[k] !== 0) {\n for (let j = k + 1; j < nu; j++) {\n let t = 0;\n for (let i = k; i < m; i++) {\n t += U.get(i, k) * U.get(i, j);\n }\n t = -t / U.get(k, k);\n for (let i = k; i < m; i++) {\n U.set(i, j, U.get(i, j) + t * U.get(i, k));\n }\n }\n for (let i = k; i < m; i++) {\n U.set(i, k, -U.get(i, k));\n }\n U.set(k, k, 1 + U.get(k, k));\n for (let i = 0; i < k - 1; i++) {\n U.set(i, k, 0);\n }\n } else {\n for (let i = 0; i < m; i++) {\n U.set(i, k, 0);\n }\n U.set(k, k, 1);\n }\n }\n }\n\n if (wantv) {\n for (let k = n - 1; k >= 0; k--) {\n if (k < nrt && e[k] !== 0) {\n for (let j = k + 1; j < n; j++) {\n let t = 0;\n for (let i = k + 1; i < n; i++) {\n t += V.get(i, k) * V.get(i, j);\n }\n t = -t / V.get(k + 1, k);\n for (let i = k + 1; i < n; i++) {\n V.set(i, j, V.get(i, j) + t * V.get(i, k));\n }\n }\n }\n for (let i = 0; i < n; i++) {\n V.set(i, k, 0);\n }\n V.set(k, k, 1);\n }\n }\n\n let pp = p - 1;\n let iter = 0;\n let eps = Number.EPSILON;\n while (p > 0) {\n let k, kase;\n for (k = p - 2; k >= -1; k--) {\n if (k === -1) {\n break;\n }\n const alpha =\n Number.MIN_VALUE + eps * Math.abs(s[k] + Math.abs(s[k + 1]));\n if (Math.abs(e[k]) <= alpha || Number.isNaN(e[k])) {\n e[k] = 0;\n break;\n }\n }\n if (k === p - 2) {\n kase = 4;\n } else {\n let ks;\n for (ks = p - 1; ks >= k; ks--) {\n if (ks === k) {\n break;\n }\n let t =\n (ks !== p ? Math.abs(e[ks]) : 0) +\n (ks !== k + 1 ? Math.abs(e[ks - 1]) : 0);\n if (Math.abs(s[ks]) <= eps * t) {\n s[ks] = 0;\n break;\n }\n }\n if (ks === k) {\n kase = 3;\n } else if (ks === p - 1) {\n kase = 1;\n } else {\n kase = 2;\n k = ks;\n }\n }\n\n k++;\n\n switch (kase) {\n case 1: {\n let f = e[p - 2];\n e[p - 2] = 0;\n for (let j = p - 2; j >= k; j--) {\n let t = hypotenuse(s[j], f);\n let cs = s[j] / t;\n let sn = f / t;\n s[j] = t;\n if (j !== k) {\n f = -sn * e[j - 1];\n e[j - 1] = cs * e[j - 1];\n }\n if (wantv) {\n for (let i = 0; i < n; i++) {\n t = cs * V.get(i, j) + sn * V.get(i, p - 1);\n V.set(i, p - 1, -sn * V.get(i, j) + cs * V.get(i, p - 1));\n V.set(i, j, t);\n }\n }\n }\n break;\n }\n case 2: {\n let f = e[k - 1];\n e[k - 1] = 0;\n for (let j = k; j < p; j++) {\n let t = hypotenuse(s[j], f);\n let cs = s[j] / t;\n let sn = f / t;\n s[j] = t;\n f = -sn * e[j];\n e[j] = cs * e[j];\n if (wantu) {\n for (let i = 0; i < m; i++) {\n t = cs * U.get(i, j) + sn * U.get(i, k - 1);\n U.set(i, k - 1, -sn * U.get(i, j) + cs * U.get(i, k - 1));\n U.set(i, j, t);\n }\n }\n }\n break;\n }\n case 3: {\n const scale = Math.max(\n Math.abs(s[p - 1]),\n Math.abs(s[p - 2]),\n Math.abs(e[p - 2]),\n Math.abs(s[k]),\n Math.abs(e[k]),\n );\n const sp = s[p - 1] / scale;\n const spm1 = s[p - 2] / scale;\n const epm1 = e[p - 2] / scale;\n const sk = s[k] / scale;\n const ek = e[k] / scale;\n const b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2;\n const c = sp * epm1 * (sp * epm1);\n let shift = 0;\n if (b !== 0 || c !== 0) {\n if (b < 0) {\n shift = 0 - Math.sqrt(b * b + c);\n } else {\n shift = Math.sqrt(b * b + c);\n }\n shift = c / (b + shift);\n }\n let f = (sk + sp) * (sk - sp) + shift;\n let g = sk * ek;\n for (let j = k; j < p - 1; j++) {\n let t = hypotenuse(f, g);\n if (t === 0) t = Number.MIN_VALUE;\n let cs = f / t;\n let sn = g / t;\n if (j !== k) {\n e[j - 1] = t;\n }\n f = cs * s[j] + sn * e[j];\n e[j] = cs * e[j] - sn * s[j];\n g = sn * s[j + 1];\n s[j + 1] = cs * s[j + 1];\n if (wantv) {\n for (let i = 0; i < n; i++) {\n t = cs * V.get(i, j) + sn * V.get(i, j + 1);\n V.set(i, j + 1, -sn * V.get(i, j) + cs * V.get(i, j + 1));\n V.set(i, j, t);\n }\n }\n t = hypotenuse(f, g);\n if (t === 0) t = Number.MIN_VALUE;\n cs = f / t;\n sn = g / t;\n s[j] = t;\n f = cs * e[j] + sn * s[j + 1];\n s[j + 1] = -sn * e[j] + cs * s[j + 1];\n g = sn * e[j + 1];\n e[j + 1] = cs * e[j + 1];\n if (wantu && j < m - 1) {\n for (let i = 0; i < m; i++) {\n t = cs * U.get(i, j) + sn * U.get(i, j + 1);\n U.set(i, j + 1, -sn * U.get(i, j) + cs * U.get(i, j + 1));\n U.set(i, j, t);\n }\n }\n }\n e[p - 2] = f;\n iter = iter + 1;\n break;\n }\n case 4: {\n if (s[k] <= 0) {\n s[k] = s[k] < 0 ? -s[k] : 0;\n if (wantv) {\n for (let i = 0; i <= pp; i++) {\n V.set(i, k, -V.get(i, k));\n }\n }\n }\n while (k < pp) {\n if (s[k] >= s[k + 1]) {\n break;\n }\n let t = s[k];\n s[k] = s[k + 1];\n s[k + 1] = t;\n if (wantv && k < n - 1) {\n for (let i = 0; i < n; i++) {\n t = V.get(i, k + 1);\n V.set(i, k + 1, V.get(i, k));\n V.set(i, k, t);\n }\n }\n if (wantu && k < m - 1) {\n for (let i = 0; i < m; i++) {\n t = U.get(i, k + 1);\n U.set(i, k + 1, U.get(i, k));\n U.set(i, k, t);\n }\n }\n k++;\n }\n iter = 0;\n p--;\n break;\n }\n // no default\n }\n }\n\n if (swapped) {\n let tmp = V;\n V = U;\n U = tmp;\n }\n\n this.m = m;\n this.n = n;\n this.s = s;\n this.U = U;\n this.V = V;\n }\n\n solve(value) {\n let Y = value;\n let e = this.threshold;\n let scols = this.s.length;\n let Ls = Matrix.zeros(scols, scols);\n\n for (let i = 0; i < scols; i++) {\n if (Math.abs(this.s[i]) <= e) {\n Ls.set(i, i, 0);\n } else {\n Ls.set(i, i, 1 / this.s[i]);\n }\n }\n\n let U = this.U;\n let V = this.rightSingularVectors;\n\n let VL = V.mmul(Ls);\n let vrows = V.rows;\n let urows = U.rows;\n let VLU = Matrix.zeros(vrows, urows);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < urows; j++) {\n let sum = 0;\n for (let k = 0; k < scols; k++) {\n sum += VL.get(i, k) * U.get(j, k);\n }\n VLU.set(i, j, sum);\n }\n }\n\n return VLU.mmul(Y);\n }\n\n solveForDiagonal(value) {\n return this.solve(Matrix.diag(value));\n }\n\n inverse() {\n let V = this.V;\n let e = this.threshold;\n let vrows = V.rows;\n let vcols = V.columns;\n let X = new Matrix(vrows, this.s.length);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < vcols; j++) {\n if (Math.abs(this.s[j]) > e) {\n X.set(i, j, V.get(i, j) / this.s[j]);\n }\n }\n }\n\n let U = this.U;\n\n let urows = U.rows;\n let ucols = U.columns;\n let Y = new Matrix(vrows, urows);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < urows; j++) {\n let sum = 0;\n for (let k = 0; k < ucols; k++) {\n sum += X.get(i, k) * U.get(j, k);\n }\n Y.set(i, j, sum);\n }\n }\n\n return Y;\n }\n\n get condition() {\n return this.s[0] / this.s[Math.min(this.m, this.n) - 1];\n }\n\n get norm2() {\n return this.s[0];\n }\n\n get rank() {\n let tol = Math.max(this.m, this.n) * this.s[0] * Number.EPSILON;\n let r = 0;\n let s = this.s;\n for (let i = 0, ii = s.length; i < ii; i++) {\n if (s[i] > tol) {\n r++;\n }\n }\n return r;\n }\n\n get diagonal() {\n return Array.from(this.s);\n }\n\n get threshold() {\n return (Number.EPSILON / 2) * Math.max(this.m, this.n) * this.s[0];\n }\n\n get leftSingularVectors() {\n return this.U;\n }\n\n get rightSingularVectors() {\n return this.V;\n }\n\n get diagonalMatrix() {\n return Matrix.diag(this.s);\n }\n}\n","import { inverse, Matrix } from 'ml-matrix';\n\n/**\n * Difference of the matrix function over the parameters\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} evaluatedData - Array of previous evaluated function values\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number} gradientDifference - Adjustment for decrease the damping parameter\n * @param {function} paramFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Matrix}\n */\nfunction gradientFunction(\n data,\n evaluatedData,\n params,\n gradientDifference,\n paramFunction,\n) {\n const n = params.length;\n const m = data.x.length;\n\n let ans = new Array(n);\n\n for (let param = 0; param < n; param++) {\n ans[param] = new Array(m);\n let auxParams = params.slice();\n auxParams[param] += gradientDifference;\n let funcParam = paramFunction(auxParams);\n\n for (let point = 0; point < m; point++) {\n ans[param][point] = evaluatedData[point] - funcParam(data.x[point]);\n }\n }\n return new Matrix(ans);\n}\n\n/**\n * Matrix function over the samples\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} evaluatedData - Array of previous evaluated function values\n * @return {Matrix}\n */\nfunction matrixFunction(data, evaluatedData) {\n const m = data.x.length;\n\n let ans = new Array(m);\n\n for (let point = 0; point < m; point++) {\n ans[point] = [data.y[point] - evaluatedData[point]];\n }\n\n return new Matrix(ans);\n}\n\n/**\n * Iteration for Levenberg-Marquardt\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number} damping - Levenberg-Marquardt parameter\n * @param {number} gradientDifference - Adjustment for decrease the damping parameter\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Array<number>}\n */\nexport default function step(\n data,\n params,\n damping,\n gradientDifference,\n parameterizedFunction,\n) {\n let value = damping * gradientDifference * gradientDifference;\n let identity = Matrix.eye(params.length, params.length, value);\n\n const func = parameterizedFunction(params);\n\n let evaluatedData = new Float64Array(data.x.length);\n for (let i = 0; i < data.x.length; i++) {\n evaluatedData[i] = func(data.x[i]);\n }\n\n let gradientFunc = gradientFunction(\n data,\n evaluatedData,\n params,\n gradientDifference,\n parameterizedFunction,\n );\n let matrixFunc = matrixFunction(data, evaluatedData);\n let inverseMatrix = inverse(\n identity.add(gradientFunc.mmul(gradientFunc.transpose())),\n );\n\n params = new Matrix([params]);\n params = params.sub(\n inverseMatrix\n .mmul(gradientFunc)\n .mmul(matrixFunc)\n .mul(gradientDifference)\n .transpose(),\n );\n\n return params.to1DArray();\n}\n","import LuDecomposition from './dc/lu';\nimport QrDecomposition from './dc/qr';\nimport SingularValueDecomposition from './dc/svd';\nimport Matrix from './matrix';\nimport WrapperMatrix2D from './wrap/WrapperMatrix2D';\n\nexport function inverse(matrix, useSVD = false) {\n matrix = WrapperMatrix2D.checkMatrix(matrix);\n if (useSVD) {\n return new SingularValueDecomposition(matrix).inverse();\n } else {\n return solve(matrix, Matrix.eye(matrix.rows));\n }\n}\n\nexport function solve(leftHandSide, rightHandSide, useSVD = false) {\n leftHandSide = WrapperMatrix2D.checkMatrix(leftHandSide);\n rightHandSide = WrapperMatrix2D.checkMatrix(rightHandSide);\n if (useSVD) {\n return new SingularValueDecomposition(leftHandSide).solve(rightHandSide);\n } else {\n return leftHandSide.isSquare()\n ? new LuDecomposition(leftHandSide).solve(rightHandSide)\n : new QrDecomposition(leftHandSide).solve(rightHandSide);\n }\n}\n","/**\n * @license\n *\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ==============================================================================\n */\n/**\n * This is a JavaScript reimplementation of UMAP (original license below), from\n * the python implementation found at https://github.com/lmcinnes/umap.\n *\n * @author andycoenen@google.com (Andy Coenen)\n */\n/**\n * @license\n * BSD 3-Clause License\n *\n * Copyright (c) 2017, Leland McInnes\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * * Neither the name of the copyright holder nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport * as heap from './heap';\nimport * as matrix from './matrix';\nimport * as nnDescent from './nn_descent';\nimport * as tree from './tree';\nimport * as utils from './utils';\nimport LM from 'ml-levenberg-marquardt';\nconst SMOOTH_K_TOLERANCE = 1e-5;\nconst MIN_K_DIST_SCALE = 1e-3;\n/**\n * UMAP projection system, based on the python implementation from McInnes, L,\n * Healy, J, UMAP: Uniform Manifold Approximation and Projection for Dimension\n * Reduction (https://github.com/lmcinnes/umap).\n *\n * This implementation differs in a few regards:\n * a) The initialization of the embedding for optimization is not computed using\n * a spectral method, rather it is initialized randomly. This avoids some\n * computationally intensive matrix eigen computations that aren't easily\n * ported to JavaScript.\n * b) A lot of \"extra\" functionality has been omitted from this implementation,\n * most notably a great deal of alternate distance functions.\n *\n * This implementation provides three methods of reducing dimensionality:\n * 1) fit: fit the data synchronously\n * 2) fitAsync: fit the data asynchronously, with a callback function provided\n * that is invoked on each optimization step.\n * 3) initializeFit / step: manually initialize the algorithm then explictly\n * step through each epoch of the SGD optimization\n */\nexport class UMAP {\n learningRate = 1.0;\n localConnectivity = 1.0;\n minDist = 0.1;\n nComponents = 2;\n nEpochs = 0;\n nNeighbors = 15;\n negativeSampleRate = 5;\n random = Math.random;\n repulsionStrength = 1.0;\n setOpMixRatio = 1.0;\n spread = 1.0;\n transformQueueSize = 4.0;\n // Supervised projection params\n targetMetric = \"categorical\" /* TargetMetric.categorical */;\n targetWeight = 0.5;\n targetNNeighbors = this.nNeighbors;\n distanceFn = numeric;\n // KNN state (can be precomputed and supplied via initializeFit)\n knnIndices;\n knnDistances;\n // Internal graph connectivity representation\n graph;\n X;\n isInitialized = false;\n rpForest = [];\n initFromRandom;\n initFromTree;\n search;\n searchGraph;\n // Supervised projection labels / targets\n Y;\n // Projected embedding\n embedding = [];\n optimizationState = new OptimizationState();\n get neighbors() {\n return this.nNeighbors;\n }\n constructor(params = {}) {\n const setParam = (key) => {\n //@ts-ignore\n if (params[key] !== undefined)\n this[key] = params[key];\n };\n setParam('distanceFn');\n setParam('learningRate');\n setParam('localConnectivity');\n setParam('minDist');\n setParam('nComponents');\n setParam('nEpochs');\n setParam('nNeighbors');\n setParam('negativeSampleRate');\n setParam('random');\n setParam('repulsionStrength');\n setParam('setOpMixRatio');\n setParam('spread');\n setParam('transformQueueSize');\n }\n /**\n * Fit the data to a projected embedding space synchronously.\n */\n fit(X) {\n this.initializeFit(X);\n this.optimizeLayout();\n return this.embedding;\n }\n /**\n * Fit the data to a projected embedding space asynchronously, with a callback\n * function invoked on every epoch of optimization.\n */\n async fitAsync(X, callback = () => true) {\n this.initializeFit(X);\n await this.optimizeLayoutAsync(callback);\n return this.embedding;\n }\n /**\n * Initializes parameters needed for supervised projection.\n */\n setSupervisedProjection(Y, params = {}) {\n this.Y = Y;\n this.targetMetric = params.targetMetric || this.targetMetric;\n this.targetWeight = params.targetWeight || this.targetWeight;\n this.targetNNeighbors = params.targetNNeighbors || this.targetNNeighbors;\n }\n /**\n * Initializes umap with precomputed KNN indices and distances.\n */\n setPrecomputedKNN(knnIndices, knnDistances) {\n this.knnIndices = knnIndices;\n this.knnDistances = knnDistances;\n }\n /**\n * Initializes fit by computing KNN and a fuzzy simplicial set, as well as\n * initializing the projected embeddings. Sets the optimization state ahead\n * of optimization steps. Returns the number of epochs to be used for the\n * SGD optimization.\n */\n initializeFit(X) {\n if (X.length <= this.nNeighbors) {\n throw new Error(`Not enough data points (${X.length}) to create nNeighbors: ${this.nNeighbors}. Add more data points or adjust the configuration.`);\n }\n // We don't need to reinitialize if we've already initialized for this data.\n if (this.X === X && this.isInitialized) {\n return this.getNEpochs();\n }\n this.X = X;\n if (!this.knnIndices && !this.knnDistances) {\n const knnResults = this.nearestNeighbors(X);\n this.knnIndices = knnResults.knnIndices;\n this.knnDistances = knnResults.knnDistances;\n }\n this.graph = this.fuzzySimplicialSet(X, this.nNeighbors, this.setOpMixRatio);\n // Set up the search graph for subsequent transformation.\n this.makeSearchFns();\n this.searchGraph = this.makeSearchGraph(X);\n // Check if supervised projection, then adjust the graph.\n this.processGraphForSupervisedProjection();\n const { head, tail, epochsPerSample, } = this.initializeSimplicialSetEmbedding();\n // Set the optimization routine state\n this.optimizationState.head = head;\n this.optimizationState.tail = tail;\n this.optimizationState.epochsPerSample = epochsPerSample;\n // Now, initialize the optimization steps\n this.initializeOptimization();\n this.prepareForOptimizationLoop();\n this.isInitialized = true;\n return this.getNEpochs();\n }\n makeSearchFns() {\n const { initFromTree, initFromRandom } = nnDescent.makeInitializations(this.distanceFn);\n this.initFromTree = initFromTree;\n this.initFromRandom = initFromRandom;\n this.search = nnDescent.makeInitializedNNSearch(this.distanceFn);\n }\n makeSearchGraph(X) {\n const knnIndices = this.knnIndices;\n const knnDistances = this.knnDistances;\n const dims = [X.length, X.length];\n const searchGraph = new matrix.SparseMatrix([], [], [], dims);\n for (let i = 0; i < knnIndices.length; i++) {\n const knn = knnIndices[i];\n const distances = knnDistances[i];\n for (let j = 0; j < knn.length; j++) {\n const neighbor = knn[j];\n const distance = distances[j];\n if (distance > 0) {\n searchGraph.set(i, neighbor, distance);\n }\n }\n }\n const transpose = matrix.transpose(searchGraph);\n return matrix.maximum(searchGraph, transpose);\n }\n /**\n * Transforms data to the existing embedding space.\n */\n transform(toTransform) {\n // Use the previous rawData\n const rawData = this.X;\n if (rawData === undefined || rawData.length === 0) {\n throw new Error('No data has been fit.');\n }\n let nNeighbors = Math.floor(this.nNeighbors * this.transformQueueSize);\n nNeighbors = Math.min(rawData.length, nNeighbors);\n const init = nnDescent.initializeSearch(this.rpForest, rawData, toTransform, nNeighbors, this.initFromRandom, this.initFromTree, this.random);\n const result = this.search(rawData, this.searchGraph, init, toTransform);\n let { indices, weights: distances } = heap.deheapSort(result);\n indices = indices.map(x => x.slice(0, this.nNeighbors));\n distances = distances.map(x => x.slice(0, this.nNeighbors));\n const adjustedLocalConnectivity = Math.max(0, this.localConnectivity - 1);\n const { sigmas, rhos } = this.smoothKNNDistance(distances, this.nNeighbors, adjustedLocalConnectivity);\n const { rows, cols, vals } = this.computeMembershipStrengths(indices, distances, sigmas, rhos);\n const size = [toTransform.length, rawData.length];\n let graph = new matrix.SparseMatrix(rows, cols, vals, size);\n // This was a very specially constructed graph with constant degree.\n // That lets us do fancy unpacking by reshaping the csr matrix indices\n // and data. Doing so relies on the constant degree assumption!\n const normed = matrix.normalize(graph, \"l1\" /* matrix.NormType.l1 */);\n const csrMatrix = matrix.getCSR(normed);\n const nPoints = toTransform.length;\n const eIndices = utils.reshape2d(csrMatrix.indices, nPoints, this.nNeighbors);\n const eWeights = utils.reshape2d(csrMatrix.values, nPoints, this.nNeighbors);\n const embedding = initTransform(eIndices, eWeights, this.embedding);\n const nEpochs = this.nEpochs\n ? this.nEpochs / 3\n : graph.nRows <= 10000\n ? 100\n : 30;\n const graphMax = graph\n .getValues()\n .reduce((max, val) => (val > max ? val : max), 0);\n graph = graph.map(value => (value < graphMax / nEpochs ? 0 : value));\n graph = matrix.eliminateZeros(graph);\n const epochsPerSample = this.makeEpochsPerSample(graph.getValues(), nEpochs);\n const head = graph.getRows();\n const tail = graph.getCols();\n // Initialize optimization slightly differently than the fit method.\n this.assignOptimizationStateParameters({\n headEmbedding: embedding,\n tailEmbedding: this.embedding,\n head,\n tail,\n currentEpoch: 0,\n nEpochs,\n nVertices: graph.getDims()[1],\n epochsPerSample,\n });\n this.prepareForOptimizationLoop();\n return this.optimizeLayout();\n }\n /**\n * Checks if we're using supervised projection, then process the graph\n * accordingly.\n */\n processGraphForSupervisedProjection() {\n const { Y, X } = this;\n if (Y) {\n if (Y.length !== X.length) {\n throw new Error('Length of X and y must be equal');\n }\n if (this.targetMetric === \"categorical\" /* TargetMetric.categorical */) {\n const lt = this.targetWeight < 1.0;\n const farDist = lt ? 2.5 * (1.0 / (1.0 - this.targetWeight)) : 1.0e12;\n this.graph = this.categoricalSimplicialSetIntersection(this.graph, Y, farDist);\n }\n // TODO (andycoenen@): add non-categorical supervised embeddings.\n }\n }\n /**\n * Manually step through the optimization process one epoch at a time.\n */\n step() {\n const { currentEpoch } = this.optimizationState;\n if (currentEpoch < this.getNEpochs()) {\n this.optimizeLayoutStep(currentEpoch);\n }\n return this.optimizationState.currentEpoch;\n }\n /**\n * Returns the computed projected embedding.\n */\n getEmbedding() {\n return this.embedding;\n }\n /**\n * Compute the ``nNeighbors`` nearest points for each data point in ``X``\n * This may be exact, but more likely is approximated via nearest neighbor\n * descent.\n */\n nearestNeighbors(X) {\n const { distanceFn, nNeighbors } = this;\n const log2 = (n) => Math.log(n) / Math.log(2);\n const metricNNDescent = nnDescent.makeNNDescent(distanceFn, this.random);\n // Handle python3 rounding down from 0.5 discrpancy\n const round = (n) => {\n return n === 0.5 ? 0 : Math.round(n);\n };\n const nTrees = 5 + Math.floor(round(X.length ** 0.5 / 20.0));\n const nIters = Math.max(5, Math.floor(Math.round(log2(X.length))));\n this.rpForest = tree.makeForest(X, nNeighbors, nTrees, this.random);\n const leafArray = tree.makeLeafArray(this.rpForest);\n const { indices, weights } = metricNNDescent(X, leafArray, nNeighbors, nIters);\n return { knnIndices: indices, knnDistances: weights };\n }\n /**\n * Given a set of data X, a neighborhood size, and a measure of distance\n * compute the fuzzy simplicial set (here represented as a fuzzy graph in\n * the form of a sparse matrix) associated to the data. This is done by\n * locally approximating geodesic distance at each point, creating a fuzzy\n * simplicial set for each such point, and then combining all the local\n * fuzzy simplicial sets into a global one via a fuzzy union.\n */\n fuzzySimplicialSet(X, nNeighbors, setOpMixRatio = 1.0) {\n const { knnIndices = [], knnDistances = [], localConnectivity } = this;\n const { sigmas, rhos } = this.smoothKNNDistance(knnDistances, nNeighbors, localConnectivity);\n const { rows, cols, vals } = this.computeMembershipStrengths(knnIndices, knnDistances, sigmas, rhos);\n const size = [X.length, X.length];\n const sparseMatrix = new matrix.SparseMatrix(rows, cols, vals, size);\n const transpose = matrix.transpose(sparseMatrix);\n const prodMatrix = matrix.pairwiseMultiply(sparseMatrix, transpose);\n const a = matrix.subtract(matrix.add(sparseMatrix, transpose), prodMatrix);\n const b = matrix.multiplyScalar(a, setOpMixRatio);\n const c = matrix.multiplyScalar(prodMatrix, 1.0 - setOpMixRatio);\n const result = matrix.add(b, c);\n return result;\n }\n /**\n * Combine a fuzzy simplicial set with another fuzzy simplicial set\n * generated from categorical data using categorical distances. The target\n * data is assumed to be categorical label data (a vector of labels),\n * and this will update the fuzzy simplicial set to respect that label data.\n */\n categoricalSimplicialSetIntersection(simplicialSet, target, farDist, unknownDist = 1.0) {\n let intersection = fastIntersection(simplicialSet, target, unknownDist, farDist);\n intersection = matrix.eliminateZeros(intersection);\n return resetLocalConnectivity(intersection);\n }\n /**\n * Compute a continuous version of the distance to the kth nearest\n * neighbor. That is, this is similar to knn-distance but allows continuous\n * k values rather than requiring an integral k. In esscence we are simply\n * computing the distance such that the cardinality of fuzzy set we generate\n * is k.\n */\n smoothKNNDistance(distances, k, localConnectivity = 1.0, nIter = 64, bandwidth = 1.0) {\n const target = (Math.log(k) / Math.log(2)) * bandwidth;\n const rho = utils.zeros(distances.length);\n const result = utils.zeros(distances.length);\n for (let i = 0; i < distances.length; i++) {\n let lo = 0.0;\n let hi = Infinity;\n let mid = 1.0;\n // TODO: This is very inefficient, but will do for now. FIXME\n const ithDistances = distances[i];\n const nonZeroDists = ithDistances.filter(d => d > 0.0);\n if (nonZeroDists.length >= localConnectivity) {\n let index = Math.floor(localConnectivity);\n let interpolation = localConnectivity - index;\n if (index > 0) {\n rho[i] = nonZeroDists[index - 1];\n if (interpolation > SMOOTH_K_TOLERANCE) {\n rho[i] +=\n interpolation * (nonZeroDists[index] - nonZeroDists[index - 1]);\n }\n }\n else {\n rho[i] = interpolation * nonZeroDists[0];\n }\n }\n else if (nonZeroDists.length > 0) {\n rho[i] = utils.max(nonZeroDists);\n }\n for (let n = 0; n < nIter; n++) {\n let psum = 0.0;\n for (let j = 1; j < distances[i].length; j++) {\n const d = distances[i][j] - rho[i];\n if (d > 0) {\n psum += Math.exp(-(d / mid));\n }\n else {\n psum += 1.0;\n }\n }\n if (Math.abs(psum - target) < SMOOTH_K_TOLERANCE) {\n break;\n }\n if (psum > target) {\n hi = mid;\n mid = (lo + hi) / 2.0;\n }\n else {\n lo = mid;\n if (hi === Infinity) {\n mid *= 2;\n }\n else {\n mid = (lo + hi) / 2.0;\n }\n }\n }\n result[i] = mid;\n // TODO: This is very inefficient, but will do for now. FIXME\n if (rho[i] > 0.0) {\n const meanIthDistances = utils.mean(ithDistances);\n if (result[i] < MIN_K_DIST_SCALE * meanIthDistances) {\n result[i] = MIN_K_DIST_SCALE * meanIthDistances;\n }\n }\n else {\n const meanDistances = utils.mean(distances.map(utils.mean));\n if (result[i] < MIN_K_DIST_SCALE * meanDistances) {\n result[i] = MIN_K_DIST_SCALE * meanDistances;\n }\n }\n }\n return { sigmas: result, rhos: rho };\n }\n /**\n * Construct the membership strength data for the 1-skeleton of each local\n * fuzzy simplicial set -- this is formed as a sparse matrix where each row is\n * a local fuzzy simplicial set, with a membership strength for the\n * 1-simplex to each other data point.\n */\n computeMembershipStrengths(knnIndices, knnDistances, sigmas, rhos) {\n const nSamples = knnIndices.length;\n const nNeighbors = knnIndices[0].length;\n const rows = utils.zeros(nSamples * nNeighbors);\n const cols = utils.zeros(nSamples * nNeighbors);\n const vals = utils.zeros(nSamples * nNeighbors);\n for (let i = 0; i < nSamples; i++) {\n for (let j = 0; j < nNeighbors; j++) {\n let val = 0;\n if (knnIndices[i][j] === -1) {\n continue; // We didn't get the full knn for i\n }\n if (knnIndices[i][j] === i) {\n val = 0.0;\n }\n else if (knnDistances[i][j] - rhos[i] <= 0.0) {\n val = 1.0;\n }\n else {\n val = Math.exp(-((knnDistances[i][j] - rhos[i]) / sigmas[i]));\n }\n rows[i * nNeighbors + j] = i;\n cols[i * nNeighbors + j] = knnIndices[i][j];\n vals[i * nNeighbors + j] = val;\n }\n }\n return { rows, cols, vals };\n }\n /**\n * Initialize a fuzzy simplicial set embedding, using a specified\n * initialisation method and then minimizing the fuzzy set cross entropy\n * between the 1-skeletons of the high and low dimensional fuzzy simplicial\n * sets.\n */\n initializeSimplicialSetEmbedding() {\n const nEpochs = this.getNEpochs();\n const { nComponents } = this;\n const graphValues = this.graph.getValues();\n let graphMax = 0;\n for (let i = 0; i < graphValues.length; i++) {\n const value = graphValues[i];\n if (graphMax < graphValues[i]) {\n graphMax = value;\n }\n }\n const graph = this.graph.map(value => {\n if (value < graphMax / nEpochs) {\n return 0;\n }\n else {\n return value;\n }\n });\n // We're not computing the spectral initialization in this implementation\n // until we determine a better eigenvalue/eigenvector computation\n // approach\n this.embedding = utils.zeros(graph.nRows).map(() => {\n return utils.zeros(nComponents).map(() => {\n return utils.tauRand(this.random) * 20 + -10; // Random from -10 to 10\n });\n });\n // Get graph data in ordered way...\n const weights = [];\n const head = [];\n const tail = [];\n const rowColValues = graph.getAll();\n for (let i = 0; i < rowColValues.length; i++) {\n const entry = rowColValues[i];\n if (entry.value) {\n weights.push(entry.value);\n tail.push(entry.row);\n head.push(entry.col);\n }\n }\n const epochsPerSample = this.makeEpochsPerSample(weights, nEpochs);\n return { head, tail, epochsPerSample };\n }\n /**\n * Given a set of weights and number of epochs generate the number of\n * epochs per sample for each weight.\n */\n makeEpochsPerSample(weights, nEpochs) {\n const result = utils.filled(weights.length, -1.0);\n const max = utils.max(weights);\n const nSamples = weights.map(w => (w / max) * nEpochs);\n nSamples.forEach((n, i) => {\n if (n > 0)\n result[i] = nEpochs / nSamples[i];\n });\n return result;\n }\n /**\n * Assigns optimization state parameters from a partial optimization state.\n */\n assignOptimizationStateParameters(state) {\n Object.assign(this.optimizationState, state);\n }\n /**\n * Sets a few optimization state parameters that are necessary before entering\n * the optimization step loop.\n */\n prepareForOptimizationLoop() {\n // Hyperparameters\n const { repulsionStrength, learningRate, negativeSampleRate } = this;\n const { epochsPerSample, headEmbedding, tailEmbedding, } = this.optimizationState;\n const dim = headEmbedding[0].length;\n const moveOther = headEmbedding.length === tailEmbedding.length;\n const epochsPerNegativeSample = epochsPerSample.map(e => e / negativeSampleRate);\n const epochOfNextNegativeSample = [...epochsPerNegativeSample];\n const epochOfNextSample = [...epochsPerSample];\n this.assignOptimizationStateParameters({\n epochOfNextSample,\n epochOfNextNegativeSample,\n epochsPerNegativeSample,\n moveOther,\n initialAlpha: learningRate,\n alpha: learningRate,\n gamma: repulsionStrength,\n dim,\n });\n }\n /**\n * Initializes optimization state for stepwise optimization.\n */\n initializeOptimization() {\n // Algorithm state\n const headEmbedding = this.embedding;\n const tailEmbedding = this.embedding;\n // Initialized in initializeSimplicialSetEmbedding()\n const { head, tail, epochsPerSample } = this.optimizationState;\n const nEpochs = this.getNEpochs();\n const nVertices = this.graph.nCols;\n const { a, b } = findABParams(this.spread, this.minDist);\n this.assignOptimizationStateParameters({\n headEmbedding,\n tailEmbedding,\n head,\n tail,\n epochsPerSample,\n a,\n b,\n nEpochs,\n nVertices,\n });\n }\n /**\n * Improve an embedding using stochastic gradient descent to minimize the\n * fuzzy set cross entropy between the 1-skeletons of the high dimensional\n * and low dimensional fuzzy simplicial sets. In practice this is done by\n * sampling edges based on their membership strength (with the (1-p) terms\n * coming from negative sampling similar to word2vec).\n */\n optimizeLayoutStep(n) {\n const { optimizationState } = this;\n const { head, tail, headEmbedding, tailEmbedding, epochsPerSample, epochOfNextSample, epochOfNextNegativeSample, epochsPerNegativeSample, moveOther, initialAlpha, alpha, gamma, a, b, dim, nEpochs, nVertices, } = optimizationState;\n const clipValue = 4.0;\n for (let i = 0; i < epochsPerSample.length; i++) {\n if (epochOfNextSample[i] > n) {\n continue;\n }\n const j = head[i];\n const k = tail[i];\n const current = headEmbedding[j];\n const other = tailEmbedding[k];\n const distSquared = rDist(current, other);\n let gradCoeff = 0;\n if (distSquared > 0) {\n gradCoeff = -2.0 * a * b * Math.pow(distSquared, b - 1.0);\n gradCoeff /= a * Math.pow(distSquared, b) + 1.0;\n }\n for (let d = 0; d < dim; d++) {\n const gradD = clip(gradCoeff * (current[d] - other[d]), clipValue);\n current[d] += gradD * alpha;\n if (moveOther) {\n other[d] += -gradD * alpha;\n }\n }\n epochOfNextSample[i] += epochsPerSample[i];\n const nNegSamples = Math.floor((n - epochOfNextNegativeSample[i]) / epochsPerNegativeSample[i]);\n for (let p = 0; p < nNegSamples; p++) {\n const k = utils.tauRandInt(nVertices, this.random);\n const other = tailEmbedding[k];\n const distSquared = rDist(current, other);\n let gradCoeff = 0.0;\n if (distSquared > 0.0) {\n gradCoeff = 2.0 * gamma * b;\n gradCoeff /=\n (0.001 + distSquared) * (a * Math.pow(distSquared, b) + 1);\n }\n else if (j === k) {\n continue;\n }\n for (let d = 0; d < dim; d++) {\n let gradD = 4.0;\n if (gradCoeff > 0.0) {\n gradD = clip(gradCoeff * (current[d] - other[d]), clipValue);\n }\n current[d] += gradD * alpha;\n }\n }\n epochOfNextNegativeSample[i] += nNegSamples * epochsPerNegativeSample[i];\n }\n optimizationState.alpha = initialAlpha * (1.0 - n / nEpochs);\n optimizationState.currentEpoch += 1;\n return headEmbedding;\n }\n /**\n * Improve an embedding using stochastic gradient descent to minimize the\n * fuzzy set cross entropy between the 1-skeletons of the high dimensional\n * and low dimensional fuzzy simplicial sets. In practice this is done by\n * sampling edges based on their membership strength (with the (1-p) terms\n * coming from negative sampling similar to word2vec).\n */\n optimizeLayoutAsync(epochCallback = () => true) {\n return new Promise((resolve, reject) => {\n const step = async () => {\n try {\n const { nEpochs, currentEpoch } = this.optimizationState;\n this.embedding = this.optimizeLayoutStep(currentEpoch);\n const epochCompleted = this.optimizationState.currentEpoch;\n const shouldStop = epochCallback(epochCompleted) === false;\n const isFinished = epochCompleted === nEpochs;\n if (!shouldStop && !isFinished) {\n setTimeout(() => step(), 0);\n }\n else {\n return resolve(isFinished);\n }\n }\n catch (err) {\n reject(err);\n }\n };\n setTimeout(() => step(), 0);\n });\n }\n /**\n * Improve an embedding using stochastic gradient descent to minimize the\n * fuzzy set cross entropy between the 1-skeletons of the high dimensional\n * and low dimensional fuzzy simplicial sets. In practice this is done by\n * sampling edges based on their membership strength (with the (1-p) terms\n * coming from negative sampling similar to word2vec).\n */\n optimizeLayout(epochCallback = () => true) {\n let isFinished = false;\n let embedding = [];\n while (!isFinished) {\n const { nEpochs, currentEpoch } = this.optimizationState;\n embedding = this.optimizeLayoutStep(currentEpoch);\n const epochCompleted = this.optimizationState.currentEpoch;\n const shouldStop = epochCallback(epochCompleted) === false;\n isFinished = epochCompleted === nEpochs || shouldStop;\n }\n return embedding;\n }\n /**\n * Gets the number of epochs for optimizing the projection.\n * NOTE: This heuristic differs from the python version\n */\n getNEpochs() {\n const graph = this.graph;\n if (this.nEpochs > 0) {\n return this.nEpochs;\n }\n if (!graph) {\n return 200;\n }\n const length = graph.nRows;\n if (length <= 2500) {\n return 500;\n }\n else if (length <= 5000) {\n return 400;\n }\n else if (length <= 7500) {\n return 300;\n }\n else {\n return 200;\n }\n }\n}\nexport function euclidean(x, y) {\n let result = 0;\n for (let i = 0; i < x.length; i++) {\n result += (x[i] - y[i]) ** 2;\n }\n return Math.sqrt(result);\n}\nexport function numeric(x, y) {\n const result = Math.abs(x - y);\n return result;\n}\nexport function cosine(x, y) {\n let result = 0.0;\n let normX = 0.0;\n let normY = 0.0;\n for (let i = 0; i < x.length; i++) {\n result += x[i] * y[i];\n normX += x[i] ** 2;\n normY += y[i] ** 2;\n }\n if (normX === 0 && normY === 0) {\n return 0;\n }\n else if (normX === 0 || normY === 0) {\n return 1.0;\n }\n else {\n return 1.0 - result / Math.sqrt(normX * normY);\n }\n}\n/**\n * An interface representing the optimization state tracked between steps of\n * the SGD optimization\n */\nclass OptimizationState {\n currentEpoch = 0;\n // Data tracked during optimization steps.\n headEmbedding = [];\n tailEmbedding = [];\n head = [];\n tail = [];\n epochsPerSample = [];\n epochOfNextSample = [];\n epochOfNextNegativeSample = [];\n epochsPerNegativeSample = [];\n moveOther = true;\n initialAlpha = 1.0;\n alpha = 1.0;\n gamma = 1.0;\n a = 1.5769434603113077;\n b = 0.8950608779109733;\n dim = 2;\n nEpochs = 500;\n nVertices = 0;\n}\n/**\n * Standard clamping of a value into a fixed range\n */\nfunction clip(x, clipValue) {\n if (x > clipValue)\n return clipValue;\n else if (x < -clipValue)\n return -clipValue;\n else\n return x;\n}\n/**\n * Reduced Euclidean distance.\n */\nfunction rDist(x, y) {\n let result = 0.0;\n for (let i = 0; i < x.length; i++) {\n result += Math.pow(x[i] - y[i], 2);\n }\n return result;\n}\n/**\n * Fit a, b params for the differentiable curve used in lower\n * dimensional fuzzy simplicial complex construction. We want the\n * smooth curve (from a pre-defined family with simple gradient) that\n * best matches an offset exponential decay.\n */\nexport function findABParams(spread, minDist) {\n const curve = ([a, b]) => (x) => {\n return 1.0 / (1.0 + a * x ** (2 * b));\n };\n const xv = utils\n .linear(0, spread * 3, 300)\n .map(val => (val < minDist ? 1.0 : val));\n const yv = utils.zeros(xv.length).map((val, index) => {\n const gte = xv[index] >= minDist;\n return gte ? Math.exp(-(xv[index] - minDist) / spread) : val;\n });\n const initialValues = [0.5, 0.5];\n const data = { x: xv, y: yv };\n // Default options for the algorithm (from github example)\n const options = {\n damping: 1.5,\n initialValues,\n gradientDifference: 10e-2,\n maxIterations: 100,\n errorTolerance: 10e-3,\n };\n const { parameterValues } = LM(data, curve, options);\n const [a, b] = parameterValues;\n return { a, b };\n}\n/**\n * Under the assumption of categorical distance for the intersecting\n * simplicial set perform a fast intersection.\n */\nexport function fastIntersection(graph, target, unknownDist = 1.0, farDist = 5.0) {\n return graph.map((value, row, col) => {\n if (target[row] === -1 || target[col] === -1) {\n return value * Math.exp(-unknownDist);\n }\n else if (target[row] !== target[col]) {\n return value * Math.exp(-farDist);\n }\n else {\n return value;\n }\n });\n}\n/**\n * Reset the local connectivity requirement -- each data sample should\n * have complete confidence in at least one 1-simplex in the simplicial set.\n * We can enforce this by locally rescaling confidences, and then remerging the\n * different local simplicial sets together.\n */\nexport function resetLocalConnectivity(simplicialSet) {\n simplicialSet = matrix.normalize(simplicialSet, \"max\" /* matrix.NormType.max */);\n const transpose = matrix.transpose(simplicialSet);\n const prodMatrix = matrix.pairwiseMultiply(transpose, simplicialSet);\n simplicialSet = matrix.add(simplicialSet, matrix.subtract(transpose, prodMatrix));\n return matrix.eliminateZeros(simplicialSet);\n}\n/**\n * Given indices and weights and an original embeddings\n * initialize the positions of new points relative to the\n * indices and weights (of their neighbors in the source data).\n */\nexport function initTransform(indices, weights, embedding) {\n const result = utils\n .zeros(indices.length)\n .map(z => utils.zeros(embedding[0].length));\n for (let i = 0; i < indices.length; i++) {\n for (let j = 0; j < indices[0].length; j++) {\n for (let d = 0; d < embedding[0].length; d++) {\n const a = indices[i][j];\n result[i][d] += weights[i][j] * embedding[a][d];\n }\n }\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInVtYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE9BQU8sS0FBSyxJQUFJLE1BQU0sUUFBUSxDQUFDO0FBQy9CLE9BQU8sS0FBSyxNQUFNLE1BQU0sVUFBVSxDQUFDO0FBQ25DLE9BQU8sS0FBSyxTQUFTLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sS0FBSyxJQUFJLE1BQU0sUUFBUSxDQUFDO0FBQy9CLE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBYXhDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0FBbUg5Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sT0FBTyxJQUFJO0lBQ1AsWUFBWSxHQUFHLEdBQUcsQ0FBQztJQUNuQixpQkFBaUIsR0FBRyxHQUFHLENBQUM7SUFDeEIsT0FBTyxHQUFHLEdBQUcsQ0FBQztJQUNkLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDaEIsT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNaLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDaEIsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztJQUN4QixhQUFhLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLE1BQU0sR0FBRyxHQUFHLENBQUM7SUFDYixrQkFBa0IsR0FBRyxHQUFHLENBQUM7SUFFakMsK0JBQStCO0lBQ3ZCLFlBQVksZ0RBQTRCO0lBQ3hDLFlBQVksR0FBRyxHQUFHLENBQUM7SUFDbkIsZ0JBQWdCLEdB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QUFFLENBQUMsRUFBRSxFQUFFO1FBQ3ZDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM1QyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2pEO1NBQ0Y7S0FDRjtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBKYXZhU2NyaXB0IHJlaW1wbGVtZW50YXRpb24gb2YgVU1BUCAob3JpZ2luYWwgbGljZW5zZSBiZWxvdyksIGZyb21cbiAqIHRoZSBweXRob24gaW1wbGVtZW50YXRpb24gZm91bmQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2xtY2lubmVzL3VtYXAuXG4gKlxuICogQGF1dGhvciBhbmR5Y29lbmVuQGdvb2dsZS5jb20gKEFuZHkgQ29lbmVuKVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIEJTRCAzLUNsYXVzZSBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE3LCBMZWxhbmQgTWNJbm5lc1xuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBoZWFwIGZyb20gJy4vaGVhcCc7XG5pbXBvcnQgKiBhcyBtYXRyaXggZnJvbSAnLi9tYXRyaXgnO1xuaW1wb3J0ICogYXMgbm5EZXNjZW50IGZyb20gJy4vbm5fZGVzY2VudCc7XG5pbXBvcnQgKiBhcyB0cmVlIGZyb20gJy4vdHJlZSc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBMTSBmcm9tICdtbC1sZXZlbmJlcmctbWFycXVhcmR0JztcblxuZXhwb3J0IHR5cGUgRGlzdGFuY2VGbiA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gbnVtYmVyO1xuZXhwb3J0IHR5cGUgUmFuZG9tRm4gPSAoKSA9PiBudW1iZXI7XG5leHBvcnQgdHlwZSBFcG9jaENhbGxiYWNrID0gKGVwb2NoOiBudW1iZXIpID0+IGJvb2xlYW4gfCB2b2lkO1xuZXhwb3J0IHR5cGUgVmVjdG9yID0gbnVtYmVyW107XG5leHBvcnQgdHlwZSBWZWN0b3JzID0gVmVjdG9yW107XG5leHBvcnQgY29uc3QgZW51bSBUYXJnZXRNZXRyaWMge1xuICBjYXRlZ29yaWNhbCA9ICdjYXRlZ29yaWNhbCcsXG4gIGwxID0gJ2wxJyxcbiAgbDIgPSAnbDInLFxufVxuXG5jb25zdCBTTU9PVEhfS19UT0xFUkFOQ0UgPSAxZS01O1xuY29uc3QgTUlOX0tfRElTVF9TQ0FMRSA9IDFlLTM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVU1BUFBhcmFtZXRlcnMge1xuICAvKipcbiAgICogVGhlIGRpc3RhbmNlIGZ1bmN0aW9uIHdpdGggd2hpY2ggdG8gYXNzZXNzIG5lYXJlc3QgbmVpZ2hib3JzLCBkZWZhdWx0c1xuICAgKiB0byBldWNsaWRlYW4gZGlzdGFuY2UuXG4gICAqL1xuICBkaXN0YW5jZUZuPzogRGlzdGFuY2VGbjtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIGxlYXJuaW5nIHJhdGUgZm9yIHRoZSBlbWJlZGRpbmcgb3B0aW1pemF0aW9uLlxuICAgKi9cbiAgbGVhcm5pbmdSYXRlPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGxvY2FsIGNvbm5lY3Rpdml0eSByZXF1aXJlZCAtLSBpLmUuIHRoZSBudW1iZXIgb2YgbmVhcmVzdFxuICAgKiBuZWlnaGJvcnMgdGhhdCBzaG91bGQgYmUgYXNzdW1lZCB0byBiZSBjb25uZWN0ZWQgYXQgYSBsb2NhbCBsZXZlbC5cbiAgICogVGhlIGhpZ2hlciB0aGlzIHZhbHVlIHRoZSBtb3JlIGNvbm5lY3RlZCB0aGUgbWFuaWZvbGQgYmVjb21lc1xuICAgKiBsb2NhbGx5LiBJbiBwcmFjdGljZSB0aGlzIHNob3VsZCBiZSBub3QgbW9yZSB0aGFuIHRoZSBsb2NhbCBpbnRyaW5zaWNcbiAgICogZGltZW5zaW9uIG9mIHRoZSBtYW5pZm9sZC5cbiAgICovXG4gIGxvY2FsQ29ubmVjdGl2aXR5PzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGVmZmVjdGl2ZSBtaW5pbXVtIGRpc3RhbmNlIGJldHdlZW4gZW1iZWRkZWQgcG9pbnRzLiBTbWFsbGVyIHZhbHVlc1xuICAgKiB3aWxsIHJlc3VsdCBpbiBhIG1vcmUgY2x1c3RlcmVkL2NsdW1wZWQgZW1iZWRkaW5nIHdoZXJlIG5lYXJieSBwb2ludHNcbiAgICogb24gdGhlIG1hbmlmb2xkIGFyZSBkcmF3biBjbG9zZXIgdG9nZXRoZXIsIHdoaWxlIGxhcmdlciB2YWx1ZXMgd2lsbFxuICAgKiByZXN1bHQgb24gYSBtb3JlIGV2ZW4gZGlzcGVyc2FsIG9mIHBvaW50cy4gVGhlIHZhbHVlIHNob3VsZCBiZSBzZXRcbiAgICogcmVsYXRpdmUgdG8gdGhlIGBgc3ByZWFkYGAgdmFsdWUsIHdoaWNoIGRldGVybWluZXMgdGhlIHNjYWxlIGF0IHdoaWNoXG4gICAqIGVtYmVkZGVkIHBvaW50cyB3aWxsIGJlIHNwcmVhZCBvdXQuXG4gICAqL1xuICBtaW5EaXN0PzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGRpbWVuc2lvbiBvZiB0aGUgc3BhY2UgdG8gZW1iZWQgaW50by4gVGhpcyBkZWZhdWx0cyB0byAyIHRvXG4gICAqIHByb3ZpZGUgZWFzeSB2aXN1YWxpemF0aW9uLCBidXQgY2FuIHJlYXNvbmFibHkgYmUgc2V0IHRvIGFueVxuICAgKiBpbnRlZ2VyIHZhbHVlIGluIHRoZSByYW5nZSAyIHRvIDEwMC5cbiAgICovXG4gIG5Db21wb25lbnRzPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiB0cmFpbmluZyBlcG9jaHMgdG8gYmUgdXNlZCBpbiBvcHRpbWl6aW5nIHRoZVxuICAgKiBsb3cgZGltZW5zaW9uYWwgZW1iZWRkaW5nLiBMYXJnZXIgdmFsdWVzIHJlc3VsdCBpbiBtb3JlIGFjY3VyYXRlXG4gICAqIGVtYmVkZGluZ3MuIElmIE5vbmUgaXMgc3BlY2lmaWVkIGEgdmFsdWUgd2lsbCBiZSBzZWxlY3RlZCBiYXNlZCBvblxuICAgKiB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgZGF0YXNldCAoMjAwIGZvciBsYXJnZSBkYXRhc2V0cywgNTAwIGZvciBzbWFsbCkuXG4gICAqL1xuICBuRXBvY2hzPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHNpemUgb2YgbG9jYWwgbmVpZ2hib3Job29kIChpbiB0ZXJtcyBvZiBudW1iZXIgb2YgbmVpZ2hib3JpbmdcbiAgICogc2FtcGxlIHBvaW50cykgdXNlZCBmb3IgbWFuaWZvbGQgYXBwcm94aW1hdGlvbi4gTGFyZ2VyIHZhbHVlc1xuICAgKiByZXN1bHQgaW4gbW9yZSBnbG9iYWwgdmlld3Mgb2YgdGhlIG1hbmlmb2xkLCB3aGlsZSBzbWFsbGVyXG4gICAqIHZhbHVlcyByZXN1bHQgaW4gbW9yZSBsb2NhbCBkYXRhIGJlaW5nIHByZXNlcnZlZC4gSW4gZ2VuZXJhbFxuICAgKiB2YWx1ZXMgc2hvdWxkIGJlIGluIHRoZSByYW5nZSAyIHRvIDEwMC5cbiAgICovXG4gIG5OZWlnaGJvcnM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG5lZ2F0aXZlIHNhbXBsZXMgdG8gc2VsZWN0IHBlciBwb3NpdGl2ZSBzYW1wbGVcbiAgICogaW4gdGhlIG9wdGltaXphdGlvbiBwcm9jZXNzLiBJbmNyZWFzaW5nIHRoaXMgdmFsdWUgd2lsbCByZXN1bHRcbiAgICogaW4gZ3JlYXRlciByZXB1bHNpdmUgZm9yY2UgYmVpbmcgYXBwbGllZCwgZ3JlYXRlciBvcHRpbWl6YXRpb25cbiAgICogY29zdCwgYnV0IHNsaWdodGx5IG1vcmUgYWNjdXJhY3kuXG4gICAqL1xuICBuZWdhdGl2ZVNhbXBsZVJhdGU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXZWlnaHRpbmcgYXBwbGllZCB0byBuZWdhdGl2ZSBzYW1wbGVzIGluIGxvdyBkaW1lbnNpb25hbCBlbWJlZGRpbmdcbiAgICogb3B0aW1pemF0aW9uLiBWYWx1ZXMgaGlnaGVyIHRoYW4gb25lIHdpbGwgcmVzdWx0IGluIGdyZWF0ZXIgd2VpZ2h0XG4gICAqIGJlaW5nIGdpdmVuIHRvIG5lZ2F0aXZlIHNhbXBsZXMuXG4gICAqL1xuICByZXB1bHNpb25TdHJlbmd0aD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBwc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdXNlZCBieSB0aGUgc3RvY2hhc3RpYyBwYXJ0cyBvZiB0aGVcbiAgICogYWxnb3JpdGhtLlxuICAgKi9cbiAgcmFuZG9tPzogUmFuZG9tRm47XG4gIC8qKlxuICAgKiBJbnRlcnBvbGF0ZSBiZXR3ZWVuIChmdXp6eSkgdW5pb24gYW5kIGludGVyc2VjdGlvbiBhcyB0aGUgc2V0IG9wZXJhdGlvblxuICAgKiB1c2VkIHRvIGNvbWJpbmUgbG9jYWwgZnV6enkgc2ltcGxpY2lhbCBzZXRzIHRvIG9idGFpbiBhIGdsb2JhbCBmdXp6eVxuICAgKiBzaW1wbGljaWFsIHNldHMuIEJvdGggZnV6enkgc2V0IG9wZXJhdGlvbnMgdXNlIHRoZSBwcm9kdWN0IHQtbm9ybS5cbiAgICogVGhlIHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyIHNob3VsZCBiZSBiZXR3ZWVuIDAuMCBhbmQgMS4wOyBhIHZhbHVlIG9mXG4gICAqIDEuMCB3aWxsIHVzZSBhIHB1cmUgZnV6enkgdW5pb24sIHdoaWxlIDAuMCB3aWxsIHVzZSBhIHB1cmUgZnV6enlcbiAgICogaW50ZXJzZWN0aW9uLlxuICAgKi9cbiAgc2V0T3BNaXhSYXRpbz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBlZmZlY3RpdmUgc2NhbGUgb2YgZW1iZWRkZWQgcG9pbnRzLiBJbiBjb21iaW5hdGlvbiB3aXRoIGBgbWluX2Rpc3RgYFxuICAgKiB0aGlzIGRldGVybWluZXMgaG93IGNsdXN0ZXJlZC9jbHVtcGVkIHRoZSBlbWJlZGRlZCBwb2ludHMgYXJlLlxuICAgKi9cbiAgc3ByZWFkPzogbnVtYmVyO1xuICAvKipcbiAgICogRm9yIHRyYW5zZm9ybSBvcGVyYXRpb25zIChlbWJlZGRpbmcgbmV3IHBvaW50cyB1c2luZyBhIHRyYWluZWQgbW9kZWwpXG4gICAqIHRoaXMgd2lsbCBjb250cm9sIGhvdyBhZ2dyZXNzaXZlbHkgdG8gc2VhcmNoIGZvciBuZWFyZXN0IG5laWdoYm9ycy5cbiAgICogTGFyZ2VyIHZhbHVlcyB3aWxsIHJlc3VsdCBpbiBzbG93ZXIgcGVyZm9ybWFuY2UgYnV0IG1vcmUgYWNjdXJhdGVcbiAgICogbmVhcmVzdCBuZWlnaGJvciBldmFsdWF0aW9uLlxuICAgKi9cbiAgdHJhbnNmb3JtUXVldWVTaXplPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVNQVBTdXBlcnZpc2VkUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBtZXRyaWMgdXNlZCB0byBtZWFzdXJlIGRpc3RhbmNlIGZvciBhIHRhcmdldCBhcnJheSBpcyB1c2luZyBzdXBlcnZpc2VkXG4gICAqIGRpbWVuc2lvbiByZWR1Y3Rpb24uIEJ5IGRlZmF1bHQgdGhpcyBpcyAnY2F0ZWdvcmljYWwnIHdoaWNoIHdpbGwgbWVhc3VyZVxuICAgKiBkaXN0YW5jZSBpbiB0ZXJtcyBvZiB3aGV0aGVyIGNhdGVnb3JpZXMgbWF0Y2ggb3IgYXJlIGRpZmZlcmVudC4gRnVydGhlcm1vcmUsXG4gICAqIGlmIHNlbWktc3VwZXJ2aXNlZCBpcyByZXF1aXJlZCB0YXJnZXQgdmFsdWVzIG9mIC0xIHdpbGwgYmUgdHJlYXRlZCBhc1xuICAgKiB1bmxhYmVsbGVkIHVuZGVyIHRoZSAnY2F0ZWdvcmljYWwnIG1ldHJpYy4gSWYgdGhlIHRhcmdldCBhcnJheSB0YWtlc1xuICAgKiBjb250aW51b3VzIHZhbHVlcyAoZS5nLiBmb3IgYSByZWdyZXNzaW9uIHByb2JsZW0pIHRoZW4gbWV0cmljIG9mICdsMSdcbiAgICogb3IgJ2wyJyBpcyBwcm9iYWJseSBtb3JlIGFwcHJvcHJpYXRlLlxuICAgKi9cbiAgdGFyZ2V0TWV0cmljPzogVGFyZ2V0TWV0cmljO1xuICAvKipcbiAgICogV2VpZ2h0aW5nIGZhY3RvciBiZXR3ZWVuIGRhdGEgdG9wb2xvZ3kgYW5kIHRhcmdldCB0b3BvbG9neS4gQSB2YWx1ZSBvZlxuICAgKiAwLjAgd2VpZ2h0cyBlbnRpcmVseSBvbiBkYXRhLCBhIHZhbHVlIG9mIDEuMCB3ZWlnaHRzIGVudGlyZWx5IG9uIHRhcmdldC5cbiAgICogVGhlIGRlZmF1bHQgb2YgMC41IGJhbGFuY2VzIHRoZSB3ZWlnaHRpbmcgZXF1YWxseSBiZXR3ZWVuIGRhdGEgYW5kIHRhcmdldC5cbiAgICovXG4gIHRhcmdldFdlaWdodD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgbmVhcmVzdCBuZWlnaGJvcnMgdG8gdXNlIHRvIGNvbnN0cnVjdCB0aGUgdGFyZ2V0IHNpbXBsY2lhbFxuICAgKiBzZXQuIERlZmF1bHRzIHRvIHRoZSBgbmVhcmVzdE5laWdoYm9yc2AgcGFyYW1ldGVyLlxuICAgKi9cbiAgdGFyZ2V0Tk5laWdoYm9ycz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBVTUFQIHByb2plY3Rpb24gc3lzdGVtLCBiYXNlZCBvbiB0aGUgcHl0aG9uIGltcGxlbWVudGF0aW9uIGZyb20gTWNJbm5lcywgTCxcbiAqIEhlYWx5LCBKLCBVTUFQOiBVbmlmb3JtIE1hbmlmb2xkIEFwcHJveGltYXRpb24gYW5kIFByb2plY3Rpb24gZm9yIERpbWVuc2lvblxuICogUmVkdWN0aW9uIChodHRwczovL2dpdGh1Yi5jb20vbG1jaW5uZXMvdW1hcCkuXG4gKlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBkaWZmZXJzIGluIGEgZmV3IHJlZ2FyZHM6XG4gKiBhKSBUaGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGVtYmVkZGluZyBmb3Igb3B0aW1pemF0aW9uIGlzIG5vdCBjb21wdXRlZCB1c2luZ1xuICogICAgYSBzcGVjdHJhbCBtZXRob2QsIHJhdGhlciBpdCBpcyBpbml0aWFsaXplZCByYW5kb21seS4gVGhpcyBhdm9pZHMgc29tZVxuICogICAgY29tcHV0YXRpb25hbGx5IGludGVuc2l2ZSBtYXRyaXggZWlnZW4gY29tcHV0YXRpb25zIHRoYXQgYXJlbid0IGVhc2lseVxuICogICAgcG9ydGVkIHRvIEphdmFTY3JpcHQuXG4gKiBiKSBBIGxvdCBvZiBcImV4dHJhXCIgZnVuY3Rpb25hbGl0eSBoYXMgYmVlbiBvbWl0dGVkIGZyb20gdGhpcyBpbXBsZW1lbnRhdGlvbixcbiAqICAgIG1vc3Qgbm90YWJseSBhIGdyZWF0IGRlYWwgb2YgYWx0ZXJuYXRlIGRpc3RhbmNlIGZ1bmN0aW9ucy5cbiAqXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIHRocmVlIG1ldGhvZHMgb2YgcmVkdWNpbmcgZGltZW5zaW9uYWxpdHk6XG4gKiAxKSBmaXQ6IGZpdCB0aGUgZGF0YSBzeW5jaHJvbm91c2x5XG4gKiAyKSBmaXRBc3luYzogZml0IHRoZSBkYXRhIGFzeW5jaHJvbm91c2x5LCB3aXRoIGEgY2FsbGJhY2sgZnVuY3Rpb24gcHJvdmlkZWRcbiAqICAgICAgdGhhdCBpcyBpbnZva2VkIG9uIGVhY2ggb3B0aW1pemF0aW9uIHN0ZXAuXG4gKiAzKSBpbml0aWFsaXplRml0IC8gc3RlcDogbWFudWFsbHkgaW5pdGlhbGl6ZSB0aGUgYWxnb3JpdGhtIHRoZW4gZXhwbGljdGx5XG4gKiAgICAgIHN0ZXAgdGhyb3VnaCBlYWNoIGVwb2NoIG9mIHRoZSBTR0Qgb3B0aW1pemF0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBVTUFQIHtcbiAgcHJpdmF0ZSBsZWFybmluZ1JhdGUgPSAxLjA7XG4gIHByaXZhdGUgbG9jYWxDb25uZWN0aXZpdHkgPSAxLjA7XG4gIHByaXZhdGUgbWluRGlzdCA9IDAuMTtcbiAgcHJpdmF0ZSBuQ29tcG9uZW50cyA9IDI7XG4gIHByaXZhdGUgbkVwb2NocyA9IDA7XG4gIHByaXZhdGUgbk5laWdoYm9ycyA9IDE1O1xuICBwcml2YXRlIG5lZ2F0aXZlU2FtcGxlUmF0ZSA9IDU7XG4gIHByaXZhdGUgcmFuZG9tID0gTWF0aC5yYW5kb207XG4gIHByaXZhdGUgcmVwdWxzaW9uU3RyZW5ndGggPSAxLjA7XG4gIHByaXZhdGUgc2V0T3BNaXhSYXRpbyA9IDEuMDtcbiAgcHJpdmF0ZSBzcHJlYWQgPSAxLjA7XG4gIHByaXZhdGUgdHJhbnNmb3JtUXVldWVTaXplID0gNC4wO1xuXG4gIC8vIFN1cGVydmlzZWQgcHJvamVjdGlvbiBwYXJhbXNcbiAgcHJpdmF0ZSB0YXJnZXRNZXRyaWMgPSBUYXJnZXRNZXRyaWMuY2F0ZWdvcmljYWw7XG4gIHByaXZhdGUgdGFyZ2V0V2VpZ2h0ID0gMC41O1xuICBwcml2YXRlIHRhcmdldE5OZWlnaGJvcnMgPSB0aGlzLm5OZWlnaGJvcnM7XG5cbiAgcHJpdmF0ZSBkaXN0YW5jZUZuOiBEaXN0YW5jZUZuID0gbnVtZXJpYztcblxuICAvLyBLTk4gc3RhdGUgKGNhbiBiZSBwcmVjb21wdXRlZCBhbmQgc3VwcGxpZWQgdmlhIGluaXRpYWxpemVGaXQpXG4gIHByaXZhdGUga25uSW5kaWNlcz86IG51bWJlcltdW107XG4gIHByaXZhdGUga25uRGlzdGFuY2VzPzogbnVtYmVyW11bXTtcblxuICAvLyBJbnRlcm5hbCBncmFwaCBjb25uZWN0aXZpdHkgcmVwcmVzZW50YXRpb25cbiAgcHJpdmF0ZSBncmFwaCE6IG1hdHJpeC5TcGFyc2VNYXRyaXg7XG4gIHByaXZhdGUgWCE6IFZlY3RvcjtcbiAgcHJpdmF0ZSBpc0luaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgcnBGb3Jlc3Q6IHRyZWUuRmxhdFRyZWVbXSA9IFtdO1xuICBwcml2YXRlIGluaXRGcm9tUmFuZG9tITogbm5EZXNjZW50LkluaXRGcm9tUmFuZG9tRm47XG4gIHByaXZhdGUgaW5pdEZyb21UcmVlITogbm5EZXNjZW50LkluaXRGcm9tVHJlZUZuO1xuICBwcml2YXRlIHNlYXJjaCE6IG5uRGVzY2VudC5TZWFyY2hGbjtcbiAgcHJpdmF0ZSBzZWFyY2hHcmFwaCE6IG1hdHJpeC5TcGFyc2VNYXRyaXg7XG5cbiAgLy8gU3VwZXJ2aXNlZCBwcm9qZWN0aW9uIGxhYmVscyAvIHRhcmdldHNcbiAgcHJpdmF0ZSBZPzogbnVtYmVyW107XG5cbiAgLy8gUHJvamVjdGVkIGVtYmVkZGluZ1xuICBwcml2YXRlIGVtYmVkZGluZzogbnVtYmVyW11bXSA9IFtdO1xuICBwcml2YXRlIG9wdGltaXphdGlvblN0YXRlID0gbmV3IE9wdGltaXphdGlvblN0YXRlKCk7XG5cblxuICBnZXQgbmVpZ2hib3JzKCkge1xuICAgIHJldHVybiB0aGlzLm5OZWlnaGJvcnM7XG4gIH1cbiAgY29uc3RydWN0b3IocGFyYW1zOiBVTUFQUGFyYW1ldGVycyA9IHt9KSB7XG4gICAgY29uc3Qgc2V0UGFyYW0gPSAoa2V5OiBrZXlvZiBVTUFQUGFyYW1ldGVycykgPT4ge1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBpZiAocGFyYW1zW2tleV0gIT09IHVuZGVmaW5lZCkgdGhpc1trZXldID0gcGFyYW1zW2tleV07XG4gICAgfTtcblxuICAgIHNldFBhcmFtKCdkaXN0YW5jZUZuJyk7XG4gICAgc2V0UGFyYW0oJ2xlYXJuaW5nUmF0ZScpO1xuICAgIHNldFBhcmFtKCdsb2NhbENvbm5lY3Rpdml0eScpO1xuICAgIHNldFBhcmFtKCdtaW5EaXN0Jyk7XG4gICAgc2V0UGFyYW0oJ25Db21wb25lbnRzJyk7XG4gICAgc2V0UGFyYW0oJ25FcG9jaHMnKTtcbiAgICBzZXRQYXJhbSgnbk5laWdoYm9ycycpO1xuICAgIHNldFBhcmFtKCduZWdhdGl2ZVNhbXBsZVJhdGUnKTtcbiAgICBzZXRQYXJhbSgncmFuZG9tJyk7XG4gICAgc2V0UGFyYW0oJ3JlcHVsc2lvblN0cmVuZ3RoJyk7XG4gICAgc2V0UGFyYW0oJ3NldE9wTWl4UmF0aW8nKTtcbiAgICBzZXRQYXJhbSgnc3ByZWFkJyk7XG4gICAgc2V0UGFyYW0oJ3RyYW5zZm9ybVF1ZXVlU2l6ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpdCB0aGUgZGF0YSB0byBhIHByb2plY3RlZCBlbWJlZGRpbmcgc3BhY2Ugc3luY2hyb25vdXNseS5cbiAgICovXG4gIGZpdChYOiBWZWN0b3IpIHtcbiAgICB0aGlzLmluaXRpYWxpemVGaXQoWCk7XG4gICAgdGhpcy5vcHRpbWl6ZUxheW91dCgpO1xuXG4gICAgcmV0dXJuIHRoaXMuZW1iZWRkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpdCB0aGUgZGF0YSB0byBhIHByb2plY3RlZCBlbWJlZGRpbmcgc3BhY2UgYXN5bmNocm9ub3VzbHksIHdpdGggYSBjYWxsYmFja1xuICAgKiBmdW5jdGlvbiBpbnZva2VkIG9uIGV2ZXJ5IGVwb2NoIG9mIG9wdGltaXphdGlvbi5cbiAgICovXG4gIGFzeW5jIGZpdEFzeW5jKFxuICAgIFg6IFZlY3RvcixcbiAgICBjYWxsYmFjazogKGVwb2NoTnVtYmVyOiBudW1iZXIpID0+IHZvaWQgfCBib29sZWFuID0gKCkgPT4gdHJ1ZVxuICApIHtcbiAgICB0aGlzLmluaXRpYWxpemVGaXQoWCk7XG5cbiAgICBhd2FpdCB0aGlzLm9wdGltaXplTGF5b3V0QXN5bmMoY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzLmVtYmVkZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBwYXJhbWV0ZXJzIG5lZWRlZCBmb3Igc3VwZXJ2aXNlZCBwcm9qZWN0aW9uLlxuICAgKi9cbiAgc2V0U3VwZXJ2aXNlZFByb2plY3Rpb24oWTogbnVtYmVyW10sIHBhcmFtczogVU1BUFN1cGVydmlzZWRQYXJhbXMgPSB7fSkge1xuICAgIHRoaXMuWSA9IFk7XG4gICAgdGhpcy50YXJnZXRNZXRyaWMgPSBwYXJhbXMudGFyZ2V0TWV0cmljIHx8IHRoaXMudGFyZ2V0TWV0cmljO1xuICAgIHRoaXMudGFyZ2V0V2VpZ2h0ID0gcGFyYW1zLnRhcmdldFdlaWdodCB8fCB0aGlzLnRhcmdldFdlaWdodDtcbiAgICB0aGlzLnRhcmdldE5OZWlnaGJvcnMgPSBwYXJhbXMudGFyZ2V0Tk5laWdoYm9ycyB8fCB0aGlzLnRhcmdldE5OZWlnaGJvcnM7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdW1hcCB3aXRoIHByZWNvbXB1dGVkIEtOTiBpbmRpY2VzIGFuZCBkaXN0YW5jZXMuXG4gICAqL1xuICBzZXRQcmVjb21wdXRlZEtOTihrbm5JbmRpY2VzOiBudW1iZXJbXVtdLCBrbm5EaXN0YW5jZXM6IG51bWJlcltdW10pIHtcbiAgICB0aGlzLmtubkluZGljZXMgPSBrbm5JbmRpY2VzO1xuICAgIHRoaXMua25uRGlzdGFuY2VzID0ga25uRGlzdGFuY2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGZpdCBieSBjb21wdXRpbmcgS05OIGFuZCBhIGZ1enp5IHNpbXBsaWNpYWwgc2V0LCBhcyB3ZWxsIGFzXG4gICAqIGluaXRpYWxpemluZyB0aGUgcHJvamVjdGVkIGVtYmVkZGluZ3MuIFNldHMgdGhlIG9wdGltaXphdGlvbiBzdGF0ZSBhaGVhZFxuICAgKiBvZiBvcHRpbWl6YXRpb24gc3RlcHMuIFJldHVybnMgdGhlIG51bWJlciBvZiBlcG9jaHMgdG8gYmUgdXNlZCBmb3IgdGhlXG4gICAqIFNHRCBvcHRpbWl6YXRpb24uXG4gICAqL1xuICBpbml0aWFsaXplRml0KFg6IFZlY3Rvcik6IG51bWJlciB7XG4gICAgaWYgKFgubGVuZ3RoIDw9IHRoaXMubk5laWdoYm9ycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3QgZW5vdWdoIGRhdGEgcG9pbnRzICgke1gubGVuZ3RofSkgdG8gY3JlYXRlIG5OZWlnaGJvcnM6ICR7dGhpcy5uTmVpZ2hib3JzfS4gIEFkZCBtb3JlIGRhdGEgcG9pbnRzIG9yIGFkanVzdCB0aGUgY29uZmlndXJhdGlvbi5gKTtcbiAgICB9XG5cbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlaW5pdGlhbGl6ZSBpZiB3ZSd2ZSBhbHJlYWR5IGluaXRpYWxpemVkIGZvciB0aGlzIGRhdGEuXG4gICAgaWYgKHRoaXMuWCA9PT0gWCAmJiB0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE5FcG9jaHMoKTtcbiAgICB9XG5cbiAgICB0aGlzLlggPSBYO1xuXG4gICAgaWYgKCF0aGlzLmtubkluZGljZXMgJiYgIXRoaXMua25uRGlzdGFuY2VzKSB7XG4gICAgICBjb25zdCBrbm5SZXN1bHRzID0gdGhpcy5uZWFyZXN0TmVpZ2hib3JzKFgpO1xuICAgICAgdGhpcy5rbm5JbmRpY2VzID0ga25uUmVzdWx0cy5rbm5JbmRpY2VzO1xuICAgICAgdGhpcy5rbm5EaXN0YW5jZXMgPSBrbm5SZXN1bHRzLmtubkRpc3RhbmNlcztcbiAgICB9XG5cbiAgICB0aGlzLmdyYXBoID0gdGhpcy5mdXp6eVNpbXBsaWNpYWxTZXQoXG4gICAgICBYLFxuICAgICAgdGhpcy5uTmVpZ2hib3JzLFxuICAgICAgdGhpcy5zZXRPcE1peFJhdGlvXG4gICAgKTtcblxuICAgIC8vIFNldCB1cCB0aGUgc2VhcmNoIGdyYXBoIGZvciBzdWJzZXF1ZW50IHRyYW5zZm9ybWF0aW9uLlxuICAgIHRoaXMubWFrZVNlYXJjaEZucygpO1xuICAgIHRoaXMuc2VhcmNoR3JhcGggPSB0aGlzLm1ha2VTZWFyY2hHcmFwaChYKTtcblxuICAgIC8vIENoZWNrIGlmIHN1cGVydmlzZWQgcHJvamVjdGlvbiwgdGhlbiBhZGp1c3QgdGhlIGdyYXBoLlxuICAgIHRoaXMucHJvY2Vzc0dyYXBoRm9yU3VwZXJ2aXNlZFByb2plY3Rpb24oKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGhlYWQsXG4gICAgICB0YWlsLFxuICAgICAgZXBvY2hzUGVyU2FtcGxlLFxuICAgIH0gPSB0aGlzLmluaXRpYWxpemVTaW1wbGljaWFsU2V0RW1iZWRkaW5nKCk7XG5cbiAgICAvLyBTZXQgdGhlIG9wdGltaXphdGlvbiByb3V0aW5lIHN0YXRlXG4gICAgdGhpcy5vcHRpbWl6YXRpb25TdGF0ZS5oZWFkID0gaGVhZDtcbiAgICB0aGlzLm9wdGltaXphdGlvblN0YXRlLnRhaWwgPSB0YWlsO1xuICAgIHRoaXMub3B0aW1pemF0aW9uU3RhdGUuZXBvY2hzUGVyU2FtcGxlID0gZXBvY2hzUGVyU2FtcGxlO1xuXG4gICAgLy8gTm93LCBpbml0aWFsaXplIHRoZSBvcHRpbWl6YXRpb24gc3RlcHNcbiAgICB0aGlzLmluaXRpYWxpemVPcHRpbWl6YXRpb24oKTtcbiAgICB0aGlzLnByZXBhcmVGb3JPcHRpbWl6YXRpb25Mb29wKCk7XG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aGlzLmdldE5FcG9jaHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFrZVNlYXJjaEZucygpIHtcbiAgICBjb25zdCB7IGluaXRGcm9tVHJlZSwgaW5pdEZyb21SYW5kb20gfSA9IG5uRGVzY2VudC5tYWtlSW5pdGlhbGl6YXRpb25zKFxuICAgICAgdGhpcy5kaXN0YW5jZUZuXG4gICAgKTtcbiAgICB0aGlzLmluaXRGcm9tVHJlZSA9IGluaXRGcm9tVHJlZTtcbiAgICB0aGlzLmluaXRGcm9tUmFuZG9tID0gaW5pdEZyb21SYW5kb207XG4gICAgdGhpcy5zZWFyY2ggPSBubkRlc2NlbnQubWFrZUluaXRpYWxpemVkTk5TZWFyY2godGhpcy5kaXN0YW5jZUZuKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFrZVNlYXJjaEdyYXBoKFg6IFZlY3Rvcikge1xuICAgIGNvbnN0IGtubkluZGljZXMgPSB0aGlzLmtubkluZGljZXMhO1xuICAgIGNvbnN0IGtubkRpc3RhbmNlcyA9IHRoaXMua25uRGlzdGFuY2VzITtcbiAgICBjb25zdCBkaW1zID0gW1gubGVuZ3RoLCBYLmxlbmd0aF07XG4gICAgY29uc3Qgc2VhcmNoR3JhcGggPSBuZXcgbWF0cml4LlNwYXJzZU1hdHJpeChbXSwgW10sIFtdLCBkaW1zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtubkluZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtubiA9IGtubkluZGljZXNbaV07XG4gICAgICBjb25zdCBkaXN0YW5jZXMgPSBrbm5EaXN0YW5jZXNbaV07XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGtubi5sZW5ndGg7IGorKykge1xuICAgICAgICBjb25zdCBuZWlnaGJvciA9IGtubltqXTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZXNbal07XG4gICAgICAgIGlmIChkaXN0YW5jZSA+IDApIHtcbiAgICAgICAgICBzZWFyY2hHcmFwaC5zZXQoaSwgbmVpZ2hib3IsIGRpc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zcG9zZSA9IG1hdHJpeC50cmFuc3Bvc2Uoc2VhcmNoR3JhcGgpO1xuICAgIHJldHVybiBtYXRyaXgubWF4aW11bShzZWFyY2hHcmFwaCwgdHJhbnNwb3NlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIGRhdGEgdG8gdGhlIGV4aXN0aW5nIGVtYmVkZGluZyBzcGFjZS5cbiAgICovXG4gIHRyYW5zZm9ybSh0b1RyYW5zZm9ybTogVmVjdG9yKSB7XG4gICAgLy8gVXNlIHRoZSBwcmV2aW91cyByYXdEYXRhXG4gICAgY29uc3QgcmF3RGF0YSA9IHRoaXMuWDtcbiAgICBpZiAocmF3RGF0YSA9PT0gdW5kZWZpbmVkIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGRhdGEgaGFzIGJlZW4gZml0LicpO1xuICAgIH1cblxuICAgIGxldCBuTmVpZ2hib3JzID0gTWF0aC5mbG9vcih0aGlzLm5OZWlnaGJvcnMgKiB0aGlzLnRyYW5zZm9ybVF1ZXVlU2l6ZSk7XG4gICAgbk5laWdoYm9ycyA9IE1hdGgubWluKHJhd0RhdGEubGVuZ3RoLCBuTmVpZ2hib3JzKTtcbiAgICBjb25zdCBpbml0ID0gbm5EZXNjZW50LmluaXRpYWxpemVTZWFyY2goXG4gICAgICB0aGlzLnJwRm9yZXN0LFxuICAgICAgcmF3RGF0YSxcbiAgICAgIHRvVHJhbnNmb3JtLFxuICAgICAgbk5laWdoYm9ycyxcbiAgICAgIHRoaXMuaW5pdEZyb21SYW5kb20sXG4gICAgICB0aGlzLmluaXRGcm9tVHJlZSxcbiAgICAgIHRoaXMucmFuZG9tXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VhcmNoKHJhd0RhdGEsIHRoaXMuc2VhcmNoR3JhcGgsIGluaXQsIHRvVHJhbnNmb3JtKTtcblxuICAgIGxldCB7IGluZGljZXMsIHdlaWdodHM6IGRpc3RhbmNlcyB9ID0gaGVhcC5kZWhlYXBTb3J0KHJlc3VsdCk7XG5cbiAgICBpbmRpY2VzID0gaW5kaWNlcy5tYXAoeCA9PiB4LnNsaWNlKDAsIHRoaXMubk5laWdoYm9ycykpO1xuICAgIGRpc3RhbmNlcyA9IGRpc3RhbmNlcy5tYXAoeCA9PiB4LnNsaWNlKDAsIHRoaXMubk5laWdoYm9ycykpO1xuXG4gICAgY29uc3QgYWRqdXN0ZWRMb2NhbENvbm5lY3Rpdml0eSA9IE1hdGgubWF4KDAsIHRoaXMubG9jYWxDb25uZWN0aXZpdHkgLSAxKTtcbiAgICBjb25zdCB7IHNpZ21hcywgcmhvcyB9ID0gdGhpcy5zbW9vdGhLTk5EaXN0YW5jZShcbiAgICAgIGRpc3RhbmNlcyxcbiAgICAgIHRoaXMubk5laWdoYm9ycyxcbiAgICAgIGFkanVzdGVkTG9jYWxDb25uZWN0aXZpdHlcbiAgICApO1xuXG4gICAgY29uc3QgeyByb3dzLCBjb2xzLCB2YWxzIH0gPSB0aGlzLmNvbXB1dGVNZW1iZXJzaGlwU3RyZW5ndGhzKFxuICAgICAgaW5kaWNlcyxcbiAgICAgIGRpc3RhbmNlcyxcbiAgICAgIHNpZ21hcyxcbiAgICAgIHJob3NcbiAgICApO1xuXG4gICAgY29uc3Qgc2l6ZSA9IFt0b1RyYW5zZm9ybS5sZW5ndGgsIHJhd0RhdGEubGVuZ3RoXTtcbiAgICBsZXQgZ3JhcGggPSBuZXcgbWF0cml4LlNwYXJzZU1hdHJpeChyb3dzLCBjb2xzLCB2YWxzLCBzaXplKTtcblxuICAgIC8vIFRoaXMgd2FzIGEgdmVyeSBzcGVjaWFsbHkgY29uc3RydWN0ZWQgZ3JhcGggd2l0aCBjb25zdGFudCBkZWdyZWUuXG4gICAgLy8gVGhhdCBsZXRzIHVzIGRvIGZhbmN5IHVucGFja2luZyBieSByZXNoYXBpbmcgdGhlIGNzciBtYXRyaXggaW5kaWNlc1xuICAgIC8vIGFuZCBkYXRhLiBEb2luZyBzbyByZWxpZXMgb24gdGhlIGNvbnN0YW50IGRlZ3JlZSBhc3N1bXB0aW9uIVxuXG4gICAgY29uc3Qgbm9ybWVkID0gbWF0cml4Lm5vcm1hbGl6ZShncmFwaCwgbWF0cml4Lk5vcm1UeXBlLmwxKTtcblxuICAgIGNvbnN0IGNzck1hdHJpeCA9IG1hdHJpeC5nZXRDU1Iobm9ybWVkKTtcbiAgICBjb25zdCBuUG9pbnRzID0gdG9UcmFuc2Zvcm0ubGVuZ3RoO1xuXG4gICAgY29uc3QgZUluZGljZXMgPSB1dGlscy5yZXNoYXBlMmQoXG4gICAgICBjc3JNYXRyaXguaW5kaWNlcyxcbiAgICAgIG5Qb2ludHMsXG4gICAgICB0aGlzLm5OZWlnaGJvcnNcbiAgICApO1xuXG4gICAgY29uc3QgZVdlaWdodHMgPSB1dGlscy5yZXNoYXBlMmQoXG4gICAgICBjc3JNYXRyaXgudmFsdWVzLFxuICAgICAgblBvaW50cyxcbiAgICAgIHRoaXMubk5laWdoYm9yc1xuICAgICk7XG5cbiAgICBjb25zdCBlbWJlZGRpbmcgPSBpbml0VHJhbnNmb3JtKGVJbmRpY2VzLCBlV2VpZ2h0cywgdGhpcy5lbWJlZGRpbmcpO1xuXG4gICAgY29uc3QgbkVwb2NocyA9IHRoaXMubkVwb2Noc1xuICAgICAgPyB0aGlzLm5FcG9jaHMgLyAzXG4gICAgICA6IGdyYXBoLm5Sb3dzIDw9IDEwMDAwXG4gICAgICA/IDEwMFxuICAgICAgOiAzMDtcblxuICAgIGNvbnN0IGdyYXBoTWF4ID0gZ3JhcGhcbiAgICAgIC5nZXRWYWx1ZXMoKVxuICAgICAgLnJlZHVjZSgobWF4LCB2YWwpID0+ICh2YWwgPiBtYXggPyB2YWwgOiBtYXgpLCAwKTtcbiAgICBncmFwaCA9IGdyYXBoLm1hcCh2YWx1ZSA9PiAodmFsdWUgPCBncmFwaE1heCAvIG5FcG9jaHMgPyAwIDogdmFsdWUpKTtcbiAgICBncmFwaCA9IG1hdHJpeC5lbGltaW5hdGVaZXJvcyhncmFwaCk7XG5cbiAgICBjb25zdCBlcG9jaHNQZXJTYW1wbGUgPSB0aGlzLm1ha2VFcG9jaHNQZXJTYW1wbGUoXG4gICAgICBncmFwaC5nZXRWYWx1ZXMoKSxcbiAgICAgIG5FcG9jaHNcbiAgICApO1xuICAgIGNvbnN0IGhlYWQgPSBncmFwaC5nZXRSb3dzKCk7XG4gICAgY29uc3QgdGFpbCA9IGdyYXBoLmdldENvbHMoKTtcblxuICAgIC8vIEluaXRpYWxpemUgb3B0aW1pemF0aW9uIHNsaWdodGx5IGRpZmZlcmVudGx5IHRoYW4gdGhlIGZpdCBtZXRob2QuXG4gICAgdGhpcy5hc3NpZ25PcHRpbWl6YXRpb25TdGF0ZVBhcmFtZXRlcnMoe1xuICAgICAgaGVhZEVtYmVkZGluZzogZW1iZWRkaW5nLFxuICAgICAgdGFpbEVtYmVkZGluZzogdGhpcy5lbWJlZGRpbmcsXG4gICAgICBoZWFkLFxuICAgICAgdGFpbCxcbiAgICAgIGN1cnJlbnRFcG9jaDogMCxcbiAgICAgIG5FcG9jaHMsXG4gICAgICBuVmVydGljZXM6IGdyYXBoLmdldERpbXMoKVsxXSxcbiAgICAgIGVwb2Noc1BlclNhbXBsZSxcbiAgICB9KTtcbiAgICB0aGlzLnByZXBhcmVGb3JPcHRpbWl6YXRpb25Mb29wKCk7XG5cbiAgICByZXR1cm4gdGhpcy5vcHRpbWl6ZUxheW91dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB3ZSdyZSB1c2luZyBzdXBlcnZpc2VkIHByb2plY3Rpb24sIHRoZW4gcHJvY2VzcyB0aGUgZ3JhcGhcbiAgICogYWNjb3JkaW5nbHkuXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NHcmFwaEZvclN1cGVydmlzZWRQcm9qZWN0aW9uKCkge1xuICAgIGNvbnN0IHsgWSwgWCB9ID0gdGhpcztcbiAgICBpZiAoWSkge1xuICAgICAgaWYgKFkubGVuZ3RoICE9PSBYLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xlbmd0aCBvZiBYIGFuZCB5IG11c3QgYmUgZXF1YWwnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudGFyZ2V0TWV0cmljID09PSBUYXJnZXRNZXRyaWMuY2F0ZWdvcmljYWwpIHtcbiAgICAgICAgY29uc3QgbHQgPSB0aGlzLnRhcmdldFdlaWdodCA8IDEuMDtcbiAgICAgICAgY29uc3QgZmFyRGlzdCA9IGx0ID8gMi41ICogKDEuMCAvICgxLjAgLSB0aGlzLnRhcmdldFdlaWdodCkpIDogMS4wZTEyO1xuICAgICAgICB0aGlzLmdyYXBoID0gdGhpcy5jYXRlZ29yaWNhbFNpbXBsaWNpYWxTZXRJbnRlcnNlY3Rpb24oXG4gICAgICAgICAgdGhpcy5ncmFwaCxcbiAgICAgICAgICBZLFxuICAgICAgICAgIGZhckRpc3RcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE8gKGFuZHljb2VuZW5AKTogYWRkIG5vbi1jYXRlZ29yaWNhbCBzdXBlcnZpc2VkIGVtYmVkZGluZ3MuXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hbnVhbGx5IHN0ZXAgdGhyb3VnaCB0aGUgb3B0aW1pemF0aW9uIHByb2Nlc3Mgb25lIGVwb2NoIGF0IGEgdGltZS5cbiAgICovXG4gIHN0ZXAoKSB7XG4gICAgY29uc3QgeyBjdXJyZW50RXBvY2ggfSA9IHRoaXMub3B0aW1pemF0aW9uU3RhdGU7XG5cbiAgICBpZiAoY3VycmVudEVwb2NoIDwgdGhpcy5nZXRORXBvY2hzKCkpIHtcbiAgICAgIHRoaXMub3B0aW1pemVMYXlvdXRTdGVwKGN1cnJlbnRFcG9jaCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm9wdGltaXphdGlvblN0YXRlLmN1cnJlbnRFcG9jaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb21wdXRlZCBwcm9qZWN0ZWQgZW1iZWRkaW5nLlxuICAgKi9cbiAgZ2V0RW1iZWRkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmVtYmVkZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSBgYG5OZWlnaGJvcnNgYCBuZWFyZXN0IHBvaW50cyBmb3IgZWFjaCBkYXRhIHBvaW50IGluIGBgWGBgXG4gICAqIFRoaXMgbWF5IGJlIGV4YWN0LCBidXQgbW9yZSBsaWtlbHkgaXMgYXBwcm94aW1hdGVkIHZpYSBuZWFyZXN0IG5laWdoYm9yXG4gICAqIGRlc2NlbnQuXG4gICAqL1xuICBwcml2YXRlIG5lYXJlc3ROZWlnaGJvcnMoWDogVmVjdG9yKSB7XG4gICAgY29uc3QgeyBkaXN0YW5jZUZuLCBuTmVpZ2hib3JzIH0gPSB0aGlzO1xuICAgIGNvbnN0IGxvZzIgPSAobjogbnVtYmVyKSA9PiBNYXRoLmxvZyhuKSAvIE1hdGgubG9nKDIpO1xuICAgIGNvbnN0IG1ldHJpY05ORGVzY2VudCA9IG5uRGVzY2VudC5tYWtlTk5EZXNjZW50KGRpc3RhbmNlRm4sIHRoaXMucmFuZG9tKTtcblxuICAgIC8vIEhhbmRsZSBweXRob24zIHJvdW5kaW5nIGRvd24gZnJvbSAwLjUgZGlzY3JwYW5jeVxuICAgIGNvbnN0IHJvdW5kID0gKG46IG51bWJlcikgPT4ge1xuICAgICAgcmV0dXJuIG4gPT09IDAuNSA/IDAgOiBNYXRoLnJvdW5kKG4pO1xuICAgIH07XG5cbiAgICBjb25zdCBuVHJlZXMgPSA1ICsgTWF0aC5mbG9vcihyb3VuZChYLmxlbmd0aCAqKiAwLjUgLyAyMC4wKSk7XG4gICAgY29uc3Qgbkl0ZXJzID0gTWF0aC5tYXgoNSwgTWF0aC5mbG9vcihNYXRoLnJvdW5kKGxvZzIoWC5sZW5ndGgpKSkpO1xuXG4gICAgdGhpcy5ycEZvcmVzdCA9IHRyZWUubWFrZUZvcmVzdChYLCBuTmVpZ2hib3JzLCBuVHJlZXMsIHRoaXMucmFuZG9tKTtcblxuICAgIGNvbnN0IGxlYWZBcnJheSA9IHRyZWUubWFrZUxlYWZBcnJheSh0aGlzLnJwRm9yZXN0KTtcbiAgICBjb25zdCB7IGluZGljZXMsIHdlaWdodHMgfSA9IG1ldHJpY05ORGVzY2VudChcbiAgICAgIFgsXG4gICAgICBsZWFmQXJyYXksXG4gICAgICBuTmVpZ2hib3JzLFxuICAgICAgbkl0ZXJzXG4gICAgKTtcbiAgICByZXR1cm4geyBrbm5JbmRpY2VzOiBpbmRpY2VzLCBrbm5EaXN0YW5jZXM6IHdlaWdodHMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIHNldCBvZiBkYXRhIFgsIGEgbmVpZ2hib3Job29kIHNpemUsIGFuZCBhIG1lYXN1cmUgb2YgZGlzdGFuY2VcbiAgICogY29tcHV0ZSB0aGUgZnV6enkgc2ltcGxpY2lhbCBzZXQgKGhlcmUgcmVwcmVzZW50ZWQgYXMgYSBmdXp6eSBncmFwaCBpblxuICAgKiB0aGUgZm9ybSBvZiBhIHNwYXJzZSBtYXRyaXgpIGFzc29jaWF0ZWQgdG8gdGhlIGRhdGEuIFRoaXMgaXMgZG9uZSBieVxuICAgKiBsb2NhbGx5IGFwcHJveGltYXRpbmcgZ2VvZGVzaWMgZGlzdGFuY2UgYXQgZWFjaCBwb2ludCwgY3JlYXRpbmcgYSBmdXp6eVxuICAgKiBzaW1wbGljaWFsIHNldCBmb3IgZWFjaCBzdWNoIHBvaW50LCBhbmQgdGhlbiBjb21iaW5pbmcgYWxsIHRoZSBsb2NhbFxuICAgKiBmdXp6eSBzaW1wbGljaWFsIHNldHMgaW50byBhIGdsb2JhbCBvbmUgdmlhIGEgZnV6enkgdW5pb24uXG4gICAqL1xuICBwcml2YXRlIGZ1enp5U2ltcGxpY2lhbFNldChcbiAgICBYOiBWZWN0b3IsXG4gICAgbk5laWdoYm9yczogbnVtYmVyLFxuICAgIHNldE9wTWl4UmF0aW8gPSAxLjBcbiAgKSB7XG4gICAgY29uc3QgeyBrbm5JbmRpY2VzID0gW10sIGtubkRpc3RhbmNlcyA9IFtdLCBsb2NhbENvbm5lY3Rpdml0eSB9ID0gdGhpcztcblxuICAgIGNvbnN0IHsgc2lnbWFzLCByaG9zIH0gPSB0aGlzLnNtb290aEtOTkRpc3RhbmNlKFxuICAgICAga25uRGlzdGFuY2VzLFxuICAgICAgbk5laWdoYm9ycyxcbiAgICAgIGxvY2FsQ29ubmVjdGl2aXR5XG4gICAgKTtcblxuICAgIGNvbnN0IHsgcm93cywgY29scywgdmFscyB9ID0gdGhpcy5jb21wdXRlTWVtYmVyc2hpcFN0cmVuZ3RocyhcbiAgICAgIGtubkluZGljZXMsXG4gICAgICBrbm5EaXN0YW5jZXMsXG4gICAgICBzaWdtYXMsXG4gICAgICByaG9zXG4gICAgKTtcblxuICAgIGNvbnN0IHNpemUgPSBbWC5sZW5ndGgsIFgubGVuZ3RoXTtcbiAgICBjb25zdCBzcGFyc2VNYXRyaXggPSBuZXcgbWF0cml4LlNwYXJzZU1hdHJpeChyb3dzLCBjb2xzLCB2YWxzLCBzaXplKTtcblxuICAgIGNvbnN0IHRyYW5zcG9zZSA9IG1hdHJpeC50cmFuc3Bvc2Uoc3BhcnNlTWF0cml4KTtcbiAgICBjb25zdCBwcm9kTWF0cml4ID0gbWF0cml4LnBhaXJ3aXNlTXVsdGlwbHkoc3BhcnNlTWF0cml4LCB0cmFuc3Bvc2UpO1xuXG4gICAgY29uc3QgYSA9IG1hdHJpeC5zdWJ0cmFjdChtYXRyaXguYWRkKHNwYXJzZU1hdHJpeCwgdHJhbnNwb3NlKSwgcHJvZE1hdHJpeCk7XG4gICAgY29uc3QgYiA9IG1hdHJpeC5tdWx0aXBseVNjYWxhcihhLCBzZXRPcE1peFJhdGlvKTtcbiAgICBjb25zdCBjID0gbWF0cml4Lm11bHRpcGx5U2NhbGFyKHByb2RNYXRyaXgsIDEuMCAtIHNldE9wTWl4UmF0aW8pO1xuICAgIGNvbnN0IHJlc3VsdCA9IG1hdHJpeC5hZGQoYiwgYyk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbWJpbmUgYSBmdXp6eSBzaW1wbGljaWFsIHNldCB3aXRoIGFub3RoZXIgZnV6enkgc2ltcGxpY2lhbCBzZXRcbiAgICogZ2VuZXJhdGVkIGZyb20gY2F0ZWdvcmljYWwgZGF0YSB1c2luZyBjYXRlZ29yaWNhbCBkaXN0YW5jZXMuIFRoZSB0YXJnZXRcbiAgICogZGF0YSBpcyBhc3N1bWVkIHRvIGJlIGNhdGVnb3JpY2FsIGxhYmVsIGRhdGEgKGEgdmVjdG9yIG9mIGxhYmVscyksXG4gICAqIGFuZCB0aGlzIHdpbGwgdXBkYXRlIHRoZSBmdXp6eSBzaW1wbGljaWFsIHNldCB0byByZXNwZWN0IHRoYXQgbGFiZWwgZGF0YS5cbiAgICovXG4gIHByaXZhdGUgY2F0ZWdvcmljYWxTaW1wbGljaWFsU2V0SW50ZXJzZWN0aW9uKFxuICAgIHNpbXBsaWNpYWxTZXQ6IG1hdHJpeC5TcGFyc2VNYXRyaXgsXG4gICAgdGFyZ2V0OiBudW1iZXJbXSxcbiAgICBmYXJEaXN0OiBudW1iZXIsXG4gICAgdW5rbm93bkRpc3QgPSAxLjBcbiAgKSB7XG4gICAgbGV0IGludGVyc2VjdGlvbiA9IGZhc3RJbnRlcnNlY3Rpb24oXG4gICAgICBzaW1wbGljaWFsU2V0LFxuICAgICAgdGFyZ2V0LFxuICAgICAgdW5rbm93bkRpc3QsXG4gICAgICBmYXJEaXN0XG4gICAgKTtcbiAgICBpbnRlcnNlY3Rpb24gPSBtYXRyaXguZWxpbWluYXRlWmVyb3MoaW50ZXJzZWN0aW9uKTtcbiAgICByZXR1cm4gcmVzZXRMb2NhbENvbm5lY3Rpdml0eShpbnRlcnNlY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgYSBjb250aW51b3VzIHZlcnNpb24gb2YgdGhlIGRpc3RhbmNlIHRvIHRoZSBrdGggbmVhcmVzdFxuICAgKiBuZWlnaGJvci4gVGhhdCBpcywgdGhpcyBpcyBzaW1pbGFyIHRvIGtubi1kaXN0YW5jZSBidXQgYWxsb3dzIGNvbnRpbnVvdXNcbiAgICogayB2YWx1ZXMgcmF0aGVyIHRoYW4gcmVxdWlyaW5nIGFuIGludGVncmFsIGsuIEluIGVzc2NlbmNlIHdlIGFyZSBzaW1wbHlcbiAgICogY29tcHV0aW5nIHRoZSBkaXN0YW5jZSBzdWNoIHRoYXQgdGhlIGNhcmRpbmFsaXR5IG9mIGZ1enp5IHNldCB3ZSBnZW5lcmF0ZVxuICAgKiBpcyBrLlxuICAgKi9cbiAgcHJpdmF0ZSBzbW9vdGhLTk5EaXN0YW5jZShcbiAgICBkaXN0YW5jZXM6IFZlY3RvcnMsXG4gICAgazogbnVtYmVyLFxuICAgIGxvY2FsQ29ubmVjdGl2aXR5ID0gMS4wLFxuICAgIG5JdGVyID0gNjQsXG4gICAgYmFuZHdpZHRoID0gMS4wXG4gICkge1xuICAgIGNvbnN0IHRhcmdldCA9IChNYXRoLmxvZyhrKSAvIE1hdGgubG9nKDIpKSAqIGJhbmR3aWR0aDtcbiAgICBjb25zdCByaG8gPSB1dGlscy56ZXJvcyhkaXN0YW5jZXMubGVuZ3RoKTtcbiAgICBjb25zdCByZXN1bHQgPSB1dGlscy56ZXJvcyhkaXN0YW5jZXMubGVuZ3RoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgbG8gPSAwLjA7XG4gICAgICBsZXQgaGkgPSBJbmZpbml0eTtcbiAgICAgIGxldCBtaWQgPSAxLjA7XG5cbiAgICAgIC8vIFRPRE86IFRoaXMgaXMgdmVyeSBpbmVmZmljaWVudCwgYnV0IHdpbGwgZG8gZm9yIG5vdy4gRklYTUVcbiAgICAgIGNvbnN0IGl0aERpc3RhbmNlcyA9IGRpc3RhbmNlc1tpXTtcbiAgICAgIGNvbnN0IG5vblplcm9EaXN0cyA9IGl0aERpc3RhbmNlcy5maWx0ZXIoZCA9PiBkID4gMC4wKTtcblxuICAgICAgaWYgKG5vblplcm9EaXN0cy5sZW5ndGggPj0gbG9jYWxDb25uZWN0aXZpdHkpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gTWF0aC5mbG9vcihsb2NhbENvbm5lY3Rpdml0eSk7XG4gICAgICAgIGxldCBpbnRlcnBvbGF0aW9uID0gbG9jYWxDb25uZWN0aXZpdHkgLSBpbmRleDtcbiAgICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICAgIHJob1tpXSA9IG5vblplcm9EaXN0c1tpbmRleCAtIDFdO1xuICAgICAgICAgIGlmIChpbnRlcnBvbGF0aW9uID4gU01PT1RIX0tfVE9MRVJBTkNFKSB7XG4gICAgICAgICAgICByaG9baV0gKz1cbiAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiAqIChub25aZXJvRGlzdHNbaW5kZXhdIC0gbm9uWmVyb0Rpc3RzW2luZGV4IC0gMV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByaG9baV0gPSBpbnRlcnBvbGF0aW9uICogbm9uWmVyb0Rpc3RzWzBdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vblplcm9EaXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJob1tpXSA9IHV0aWxzLm1heChub25aZXJvRGlzdHMpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IG5JdGVyOyBuKyspIHtcbiAgICAgICAgbGV0IHBzdW0gPSAwLjA7XG4gICAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgZGlzdGFuY2VzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgY29uc3QgZCA9IGRpc3RhbmNlc1tpXVtqXSAtIHJob1tpXTtcbiAgICAgICAgICBpZiAoZCA+IDApIHtcbiAgICAgICAgICAgIHBzdW0gKz0gTWF0aC5leHAoLShkIC8gbWlkKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBzdW0gKz0gMS4wO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChNYXRoLmFicyhwc3VtIC0gdGFyZ2V0KSA8IFNNT09USF9LX1RPTEVSQU5DRSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBzdW0gPiB0YXJnZXQpIHtcbiAgICAgICAgICBoaSA9IG1pZDtcbiAgICAgICAgICBtaWQgPSAobG8gKyBoaSkgLyAyLjA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG8gPSBtaWQ7XG4gICAgICAgICAgaWYgKGhpID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgbWlkICo9IDI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1pZCA9IChsbyArIGhpKSAvIDIuMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0W2ldID0gbWlkO1xuXG4gICAgICAvLyBUT0RPOiBUaGlzIGlzIHZlcnkgaW5lZmZpY2llbnQsIGJ1dCB3aWxsIGRvIGZvciBub3cuIEZJWE1FXG4gICAgICBpZiAocmhvW2ldID4gMC4wKSB7XG4gICAgICAgIGNvbnN0IG1lYW5JdGhEaXN0YW5jZXMgPSB1dGlscy5tZWFuKGl0aERpc3RhbmNlcyk7XG4gICAgICAgIGlmIChyZXN1bHRbaV0gPCBNSU5fS19ESVNUX1NDQUxFICogbWVhbkl0aERpc3RhbmNlcykge1xuICAgICAgICAgIHJlc3VsdFtpXSA9IE1JTl9LX0RJU1RfU0NBTEUgKiBtZWFuSXRoRGlzdGFuY2VzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtZWFuRGlzdGFuY2VzID0gdXRpbHMubWVhbihkaXN0YW5jZXMubWFwKHV0aWxzLm1lYW4pKTtcbiAgICAgICAgaWYgKHJlc3VsdFtpXSA8IE1JTl9LX0RJU1RfU0NBTEUgKiBtZWFuRGlzdGFuY2VzKSB7XG4gICAgICAgICAgcmVzdWx0W2ldID0gTUlOX0tfRElTVF9TQ0FMRSAqIG1lYW5EaXN0YW5jZXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBzaWdtYXM6IHJlc3VsdCwgcmhvczogcmhvIH07XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0IHRoZSBtZW1iZXJzaGlwIHN0cmVuZ3RoIGRhdGEgZm9yIHRoZSAxLXNrZWxldG9uIG9mIGVhY2ggbG9jYWxcbiAgICogZnV6enkgc2ltcGxpY2lhbCBzZXQgLS0gdGhpcyBpcyBmb3JtZWQgYXMgYSBzcGFyc2UgbWF0cml4IHdoZXJlIGVhY2ggcm93IGlzXG4gICAqIGEgbG9jYWwgZnV6enkgc2ltcGxpY2lhbCBzZXQsIHdpdGggYSBtZW1iZXJzaGlwIHN0cmVuZ3RoIGZvciB0aGVcbiAgICogMS1zaW1wbGV4IHRvIGVhY2ggb3RoZXIgZGF0YSBwb2ludC5cbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZU1lbWJlcnNoaXBTdHJlbmd0aHMoXG4gICAga25uSW5kaWNlczogVmVjdG9ycyxcbiAgICBrbm5EaXN0YW5jZXM6IFZlY3RvcnMsXG4gICAgc2lnbWFzOiBudW1iZXJbXSxcbiAgICByaG9zOiBudW1iZXJbXVxuICApOiB7IHJvd3M6IG51bWJlcltdOyBjb2xzOiBudW1iZXJbXTsgdmFsczogbnVtYmVyW10gfSB7XG4gICAgY29uc3QgblNhbXBsZXMgPSBrbm5JbmRpY2VzLmxlbmd0aDtcbiAgICBjb25zdCBuTmVpZ2hib3JzID0ga25uSW5kaWNlc1swXS5sZW5ndGg7XG5cbiAgICBjb25zdCByb3dzID0gdXRpbHMuemVyb3MoblNhbXBsZXMgKiBuTmVpZ2hib3JzKTtcbiAgICBjb25zdCBjb2xzID0gdXRpbHMuemVyb3MoblNhbXBsZXMgKiBuTmVpZ2hib3JzKTtcbiAgICBjb25zdCB2YWxzID0gdXRpbHMuemVyb3MoblNhbXBsZXMgKiBuTmVpZ2hib3JzKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblNhbXBsZXM7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuTmVpZ2hib3JzOyBqKyspIHtcbiAgICAgICAgbGV0IHZhbCA9IDA7XG4gICAgICAgIGlmIChrbm5JbmRpY2VzW2ldW2pdID09PSAtMSkge1xuICAgICAgICAgIGNvbnRpbnVlOyAvLyBXZSBkaWRuJ3QgZ2V0IHRoZSBmdWxsIGtubiBmb3IgaVxuICAgICAgICB9XG4gICAgICAgIGlmIChrbm5JbmRpY2VzW2ldW2pdID09PSBpKSB7XG4gICAgICAgICAgdmFsID0gMC4wO1xuICAgICAgICB9IGVsc2UgaWYgKGtubkRpc3RhbmNlc1tpXVtqXSAtIHJob3NbaV0gPD0gMC4wKSB7XG4gICAgICAgICAgdmFsID0gMS4wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IE1hdGguZXhwKC0oKGtubkRpc3RhbmNlc1tpXVtqXSAtIHJob3NbaV0pIC8gc2lnbWFzW2ldKSk7XG4gICAgICAgIH1cblxuICAgICAgICByb3dzW2kgKiBuTmVpZ2hib3JzICsgal0gPSBpO1xuICAgICAgICBjb2xzW2kgKiBuTmVpZ2hib3JzICsgal0gPSBrbm5JbmRpY2VzW2ldW2pdO1xuICAgICAgICB2YWxzW2kgKiBuTmVpZ2hib3JzICsgal0gPSB2YWw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcm93cywgY29scywgdmFscyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBmdXp6eSBzaW1wbGljaWFsIHNldCBlbWJlZGRpbmcsIHVzaW5nIGEgc3BlY2lmaWVkXG4gICAqIGluaXRpYWxpc2F0aW9uIG1ldGhvZCBhbmQgdGhlbiBtaW5pbWl6aW5nIHRoZSBmdXp6eSBzZXQgY3Jvc3MgZW50cm9weVxuICAgKiBiZXR3ZWVuIHRoZSAxLXNrZWxldG9ucyBvZiB0aGUgaGlnaCBhbmQgbG93IGRpbWVuc2lvbmFsIGZ1enp5IHNpbXBsaWNpYWxcbiAgICogc2V0cy5cbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVNpbXBsaWNpYWxTZXRFbWJlZGRpbmcoKSB7XG4gICAgY29uc3QgbkVwb2NocyA9IHRoaXMuZ2V0TkVwb2NocygpO1xuXG4gICAgY29uc3QgeyBuQ29tcG9uZW50cyB9ID0gdGhpcztcbiAgICBjb25zdCBncmFwaFZhbHVlcyA9IHRoaXMuZ3JhcGguZ2V0VmFsdWVzKCk7XG4gICAgbGV0IGdyYXBoTWF4ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyYXBoVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGdyYXBoVmFsdWVzW2ldO1xuICAgICAgaWYgKGdyYXBoTWF4IDwgZ3JhcGhWYWx1ZXNbaV0pIHtcbiAgICAgICAgZ3JhcGhNYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBncmFwaCA9IHRoaXMuZ3JhcGgubWFwKHZhbHVlID0+IHtcbiAgICAgIGlmICh2YWx1ZSA8IGdyYXBoTWF4IC8gbkVwb2Nocykge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFdlJ3JlIG5vdCBjb21wdXRpbmcgdGhlIHNwZWN0cmFsIGluaXRpYWxpemF0aW9uIGluIHRoaXMgaW1wbGVtZW50YXRpb25cbiAgICAvLyB1bnRpbCB3ZSBkZXRlcm1pbmUgYSBiZXR0ZXIgZWlnZW52YWx1ZS9laWdlbnZlY3RvciBjb21wdXRhdGlvblxuICAgIC8vIGFwcHJvYWNoXG4gICAgdGhpcy5lbWJlZGRpbmcgPSB1dGlscy56ZXJvcyhncmFwaC5uUm93cykubWFwKCgpID0+IHtcbiAgICAgIHJldHVybiB1dGlscy56ZXJvcyhuQ29tcG9uZW50cykubWFwKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnRhdVJhbmQodGhpcy5yYW5kb20pICogMjAgKyAtMTA7IC8vIFJhbmRvbSBmcm9tIC0xMCB0byAxMFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBHZXQgZ3JhcGggZGF0YSBpbiBvcmRlcmVkIHdheS4uLlxuICAgIGNvbnN0IHdlaWdodHM6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgaGVhZDogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCB0YWlsOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IHJvd0NvbFZhbHVlcyA9IGdyYXBoLmdldEFsbCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q29sVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IHJvd0NvbFZhbHVlc1tpXTtcbiAgICAgIGlmIChlbnRyeS52YWx1ZSkge1xuICAgICAgICB3ZWlnaHRzLnB1c2goZW50cnkudmFsdWUpO1xuICAgICAgICB0YWlsLnB1c2goZW50cnkucm93KTtcbiAgICAgICAgaGVhZC5wdXNoKGVudHJ5LmNvbCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVwb2Noc1BlclNhbXBsZSA9IHRoaXMubWFrZUVwb2Noc1BlclNhbXBsZSh3ZWlnaHRzLCBuRXBvY2hzKTtcblxuICAgIHJldHVybiB7IGhlYWQsIHRhaWwsIGVwb2Noc1BlclNhbXBsZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgc2V0IG9mIHdlaWdodHMgYW5kIG51bWJlciBvZiBlcG9jaHMgZ2VuZXJhdGUgdGhlIG51bWJlciBvZlxuICAgKiBlcG9jaHMgcGVyIHNhbXBsZSBmb3IgZWFjaCB3ZWlnaHQuXG4gICAqL1xuICBwcml2YXRlIG1ha2VFcG9jaHNQZXJTYW1wbGUod2VpZ2h0czogbnVtYmVyW10sIG5FcG9jaHM6IG51bWJlcikge1xuICAgIGNvbnN0IHJlc3VsdCA9IHV0aWxzLmZpbGxlZCh3ZWlnaHRzLmxlbmd0aCwgLTEuMCk7XG4gICAgY29uc3QgbWF4ID0gdXRpbHMubWF4KHdlaWdodHMpO1xuICAgIGNvbnN0IG5TYW1wbGVzID0gd2VpZ2h0cy5tYXAodyA9PiAodyAvIG1heCkgKiBuRXBvY2hzKTtcbiAgICBuU2FtcGxlcy5mb3JFYWNoKChuLCBpKSA9PiB7XG4gICAgICBpZiAobiA+IDApIHJlc3VsdFtpXSA9IG5FcG9jaHMgLyBuU2FtcGxlc1tpXTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2lnbnMgb3B0aW1pemF0aW9uIHN0YXRlIHBhcmFtZXRlcnMgZnJvbSBhIHBhcnRpYWwgb3B0aW1pemF0aW9uIHN0YXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NpZ25PcHRpbWl6YXRpb25TdGF0ZVBhcmFtZXRlcnMoc3RhdGU6IFBhcnRpYWw8T3B0aW1pemF0aW9uU3RhdGU+KSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGltaXphdGlvblN0YXRlLCBzdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIGZldyBvcHRpbWl6YXRpb24gc3RhdGUgcGFyYW1ldGVycyB0aGF0IGFyZSBuZWNlc3NhcnkgYmVmb3JlIGVudGVyaW5nXG4gICAqIHRoZSBvcHRpbWl6YXRpb24gc3RlcCBsb29wLlxuICAgKi9cbiAgcHJpdmF0ZSBwcmVwYXJlRm9yT3B0aW1pemF0aW9uTG9vcCgpIHtcbiAgICAvLyBIeXBlcnBhcmFtZXRlcnNcbiAgICBjb25zdCB7IHJlcHVsc2lvblN0cmVuZ3RoLCBsZWFybmluZ1JhdGUsIG5lZ2F0aXZlU2FtcGxlUmF0ZSB9ID0gdGhpcztcblxuICAgIGNvbnN0IHtcbiAgICAgIGVwb2Noc1BlclNhbXBsZSxcbiAgICAgIGhlYWRFbWJlZGRpbmcsXG4gICAgICB0YWlsRW1iZWRkaW5nLFxuICAgIH0gPSB0aGlzLm9wdGltaXphdGlvblN0YXRlO1xuXG4gICAgY29uc3QgZGltID0gaGVhZEVtYmVkZGluZ1swXS5sZW5ndGg7XG4gICAgY29uc3QgbW92ZU90aGVyID0gaGVhZEVtYmVkZGluZy5sZW5ndGggPT09IHRhaWxFbWJlZGRpbmcubGVuZ3RoO1xuXG4gICAgY29uc3QgZXBvY2hzUGVyTmVnYXRpdmVTYW1wbGUgPSBlcG9jaHNQZXJTYW1wbGUubWFwKFxuICAgICAgZSA9PiBlIC8gbmVnYXRpdmVTYW1wbGVSYXRlXG4gICAgKTtcbiAgICBjb25zdCBlcG9jaE9mTmV4dE5lZ2F0aXZlU2FtcGxlID0gWy4uLmVwb2Noc1Blck5lZ2F0aXZlU2FtcGxlXTtcbiAgICBjb25zdCBlcG9jaE9mTmV4dFNhbXBsZSA9IFsuLi5lcG9jaHNQZXJTYW1wbGVdO1xuXG4gICAgdGhpcy5hc3NpZ25PcHRpbWl6YXRpb25TdGF0ZVBhcmFtZXRlcnMoe1xuICAgICAgZXBvY2hPZk5leHRTYW1wbGUsXG4gICAgICBlcG9jaE9mTmV4dE5lZ2F0aXZlU2FtcGxlLFxuICAgICAgZXBvY2hzUGVyTmVnYXRpdmVTYW1wbGUsXG4gICAgICBtb3ZlT3RoZXIsXG4gICAgICBpbml0aWFsQWxwaGE6IGxlYXJuaW5nUmF0ZSxcbiAgICAgIGFscGhhOiBsZWFybmluZ1JhdGUsXG4gICAgICBnYW1tYTogcmVwdWxzaW9uU3RyZW5ndGgsXG4gICAgICBkaW0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgb3B0aW1pemF0aW9uIHN0YXRlIGZvciBzdGVwd2lzZSBvcHRpbWl6YXRpb24uXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemVPcHRpbWl6YXRpb24oKSB7XG4gICAgLy8gQWxnb3JpdGhtIHN0YXRlXG4gICAgY29uc3QgaGVhZEVtYmVkZGluZyA9IHRoaXMuZW1iZWRkaW5nO1xuICAgIGNvbnN0IHRhaWxFbWJlZGRpbmcgPSB0aGlzLmVtYmVkZGluZztcblxuICAgIC8vIEluaXRpYWxpemVkIGluIGluaXRpYWxpemVTaW1wbGljaWFsU2V0RW1iZWRkaW5nKClcbiAgICBjb25zdCB7IGhlYWQsIHRhaWwsIGVwb2Noc1BlclNhbXBsZSB9ID0gdGhpcy5vcHRpbWl6YXRpb25TdGF0ZTtcblxuICAgIGNvbnN0IG5FcG9jaHMgPSB0aGlzLmdldE5FcG9jaHMoKTtcbiAgICBjb25zdCBuVmVydGljZXMgPSB0aGlzLmdyYXBoLm5Db2xzO1xuXG4gICAgY29uc3QgeyBhLCBiIH0gPSBmaW5kQUJQYXJhbXModGhpcy5zcHJlYWQsIHRoaXMubWluRGlzdCk7XG5cbiAgICB0aGlzLmFzc2lnbk9wdGltaXphdGlvblN0YXRlUGFyYW1ldGVycyh7XG4gICAgICBoZWFkRW1iZWRkaW5nLFxuICAgICAgdGFpbEVtYmVkZGluZyxcbiAgICAgIGhlYWQsXG4gICAgICB0YWlsLFxuICAgICAgZXBvY2hzUGVyU2FtcGxlLFxuICAgICAgYSxcbiAgICAgIGIsXG4gICAgICBuRXBvY2hzLFxuICAgICAgblZlcnRpY2VzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcHJvdmUgYW4gZW1iZWRkaW5nIHVzaW5nIHN0b2NoYXN0aWMgZ3JhZGllbnQgZGVzY2VudCB0byBtaW5pbWl6ZSB0aGVcbiAgICogZnV6enkgc2V0IGNyb3NzIGVudHJvcHkgYmV0d2VlbiB0aGUgMS1za2VsZXRvbnMgb2YgdGhlIGhpZ2ggZGltZW5zaW9uYWxcbiAgICogYW5kIGxvdyBkaW1lbnNpb25hbCBmdXp6eSBzaW1wbGljaWFsIHNldHMuIEluIHByYWN0aWNlIHRoaXMgaXMgZG9uZSBieVxuICAgKiBzYW1wbGluZyBlZGdlcyBiYXNlZCBvbiB0aGVpciBtZW1iZXJzaGlwIHN0cmVuZ3RoICh3aXRoIHRoZSAoMS1wKSB0ZXJtc1xuICAgKiBjb21pbmcgZnJvbSBuZWdhdGl2ZSBzYW1wbGluZyBzaW1pbGFyIHRvIHdvcmQydmVjKS5cbiAgICovXG4gIHByaXZhdGUgb3B0aW1pemVMYXlvdXRTdGVwKG46IG51bWJlcikge1xuICAgIGNvbnN0IHsgb3B0aW1pemF0aW9uU3RhdGUgfSA9IHRoaXM7XG4gICAgY29uc3Qge1xuICAgICAgaGVhZCxcbiAgICAgIHRhaWwsXG4gICAgICBoZWFkRW1iZWRkaW5nLFxuICAgICAgdGFpbEVtYmVkZGluZyxcbiAgICAgIGVwb2Noc1BlclNhbXBsZSxcbiAgICAgIGVwb2NoT2ZOZXh0U2FtcGxlLFxuICAgICAgZXBvY2hPZk5leHROZWdhdGl2ZVNhbXBsZSxcbiAgICAgIGVwb2Noc1Blck5lZ2F0aXZlU2FtcGxlLFxuICAgICAgbW92ZU90aGVyLFxuICAgICAgaW5pdGlhbEFscGhhLFxuICAgICAgYWxwaGEsXG4gICAgICBnYW1tYSxcbiAgICAgIGEsXG4gICAgICBiLFxuICAgICAgZGltLFxuICAgICAgbkVwb2NocyxcbiAgICAgIG5WZXJ0aWNlcyxcbiAgICB9ID0gb3B0aW1pemF0aW9uU3RhdGU7XG5cbiAgICBjb25zdCBjbGlwVmFsdWUgPSA0LjA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVwb2Noc1BlclNhbXBsZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGVwb2NoT2ZOZXh0U2FtcGxlW2ldID4gbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaiA9IGhlYWRbaV07XG4gICAgICBjb25zdCBrID0gdGFpbFtpXTtcblxuICAgICAgY29uc3QgY3VycmVudCA9IGhlYWRFbWJlZGRpbmdbal07XG4gICAgICBjb25zdCBvdGhlciA9IHRhaWxFbWJlZGRpbmdba107XG5cbiAgICAgIGNvbnN0IGRpc3RTcXVhcmVkID0gckRpc3QoY3VycmVudCwgb3RoZXIpO1xuXG4gICAgICBsZXQgZ3JhZENvZWZmID0gMDtcbiAgICAgIGlmIChkaXN0U3F1YXJlZCA+IDApIHtcbiAgICAgICAgZ3JhZENvZWZmID0gLTIuMCAqIGEgKiBiICogTWF0aC5wb3coZGlzdFNxdWFyZWQsIGIgLSAxLjApO1xuICAgICAgICBncmFkQ29lZmYgLz0gYSAqIE1hdGgucG93KGRpc3RTcXVhcmVkLCBiKSArIDEuMDtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBkaW07IGQrKykge1xuICAgICAgICBjb25zdCBncmFkRCA9IGNsaXAoZ3JhZENvZWZmICogKGN1cnJlbnRbZF0gLSBvdGhlcltkXSksIGNsaXBWYWx1ZSk7XG4gICAgICAgIGN1cnJlbnRbZF0gKz0gZ3JhZEQgKiBhbHBoYTtcbiAgICAgICAgaWYgKG1vdmVPdGhlcikge1xuICAgICAgICAgIG90aGVyW2RdICs9IC1ncmFkRCAqIGFscGhhO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVwb2NoT2ZOZXh0U2FtcGxlW2ldICs9IGVwb2Noc1BlclNhbXBsZVtpXTtcblxuICAgICAgY29uc3Qgbk5lZ1NhbXBsZXMgPSBNYXRoLmZsb29yKFxuICAgICAgICAobiAtIGVwb2NoT2ZOZXh0TmVnYXRpdmVTYW1wbGVbaV0pIC8gZXBvY2hzUGVyTmVnYXRpdmVTYW1wbGVbaV1cbiAgICAgICk7XG5cbiAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgbk5lZ1NhbXBsZXM7IHArKykge1xuICAgICAgICBjb25zdCBrID0gdXRpbHMudGF1UmFuZEludChuVmVydGljZXMsIHRoaXMucmFuZG9tKTtcbiAgICAgICAgY29uc3Qgb3RoZXIgPSB0YWlsRW1iZWRkaW5nW2tdO1xuXG4gICAgICAgIGNvbnN0IGRpc3RTcXVhcmVkID0gckRpc3QoY3VycmVudCwgb3RoZXIpO1xuXG4gICAgICAgIGxldCBncmFkQ29lZmYgPSAwLjA7XG4gICAgICAgIGlmIChkaXN0U3F1YXJlZCA+IDAuMCkge1xuICAgICAgICAgIGdyYWRDb2VmZiA9IDIuMCAqIGdhbW1hICogYjtcbiAgICAgICAgICBncmFkQ29lZmYgLz1cbiAgICAgICAgICAgICgwLjAwMSArIGRpc3RTcXVhcmVkKSAqIChhICogTWF0aC5wb3coZGlzdFNxdWFyZWQsIGIpICsgMSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaiA9PT0gaykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBkaW07IGQrKykge1xuICAgICAgICAgIGxldCBncmFkRCA9IDQuMDtcbiAgICAgICAgICBpZiAoZ3JhZENvZWZmID4gMC4wKSB7XG4gICAgICAgICAgICBncmFkRCA9IGNsaXAoZ3JhZENvZWZmICogKGN1cnJlbnRbZF0gLSBvdGhlcltkXSksIGNsaXBWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRbZF0gKz0gZ3JhZEQgKiBhbHBoYTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZXBvY2hPZk5leHROZWdhdGl2ZVNhbXBsZVtpXSArPSBuTmVnU2FtcGxlcyAqIGVwb2Noc1Blck5lZ2F0aXZlU2FtcGxlW2ldO1xuICAgIH1cbiAgICBvcHRpbWl6YXRpb25TdGF0ZS5hbHBoYSA9IGluaXRpYWxBbHBoYSAqICgxLjAgLSBuIC8gbkVwb2Nocyk7XG5cbiAgICBvcHRpbWl6YXRpb25TdGF0ZS5jdXJyZW50RXBvY2ggKz0gMTtcbiAgICByZXR1cm4gaGVhZEVtYmVkZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXByb3ZlIGFuIGVtYmVkZGluZyB1c2luZyBzdG9jaGFzdGljIGdyYWRpZW50IGRlc2NlbnQgdG8gbWluaW1pemUgdGhlXG4gICAqIGZ1enp5IHNldCBjcm9zcyBlbnRyb3B5IGJldHdlZW4gdGhlIDEtc2tlbGV0b25zIG9mIHRoZSBoaWdoIGRpbWVuc2lvbmFsXG4gICAqIGFuZCBsb3cgZGltZW5zaW9uYWwgZnV6enkgc2ltcGxpY2lhbCBzZXRzLiBJbiBwcmFjdGljZSB0aGlzIGlzIGRvbmUgYnlcbiAgICogc2FtcGxpbmcgZWRnZXMgYmFzZWQgb24gdGhlaXIgbWVtYmVyc2hpcCBzdHJlbmd0aCAod2l0aCB0aGUgKDEtcCkgdGVybXNcbiAgICogY29taW5nIGZyb20gbmVnYXRpdmUgc2FtcGxpbmcgc2ltaWxhciB0byB3b3JkMnZlYykuXG4gICAqL1xuICBwcml2YXRlIG9wdGltaXplTGF5b3V0QXN5bmMoXG4gICAgZXBvY2hDYWxsYmFjazogKGVwb2NoTnVtYmVyOiBudW1iZXIpID0+IHZvaWQgfCBib29sZWFuID0gKCkgPT4gdHJ1ZVxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc3RlcCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IG5FcG9jaHMsIGN1cnJlbnRFcG9jaCB9ID0gdGhpcy5vcHRpbWl6YXRpb25TdGF0ZTtcbiAgICAgICAgICB0aGlzLmVtYmVkZGluZyA9IHRoaXMub3B0aW1pemVMYXlvdXRTdGVwKGN1cnJlbnRFcG9jaCk7XG4gICAgICAgICAgY29uc3QgZXBvY2hDb21wbGV0ZWQgPSB0aGlzLm9wdGltaXphdGlvblN0YXRlLmN1cnJlbnRFcG9jaDtcbiAgICAgICAgICBjb25zdCBzaG91bGRTdG9wID0gZXBvY2hDYWxsYmFjayhlcG9jaENvbXBsZXRlZCkgPT09IGZhbHNlO1xuICAgICAgICAgIGNvbnN0IGlzRmluaXNoZWQgPSBlcG9jaENvbXBsZXRlZCA9PT0gbkVwb2NocztcbiAgICAgICAgICBpZiAoIXNob3VsZFN0b3AgJiYgIWlzRmluaXNoZWQpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gc3RlcCgpLCAwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoaXNGaW5pc2hlZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gc3RlcCgpLCAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXByb3ZlIGFuIGVtYmVkZGluZyB1c2luZyBzdG9jaGFzdGljIGdyYWRpZW50IGRlc2NlbnQgdG8gbWluaW1pemUgdGhlXG4gICAqIGZ1enp5IHNldCBjcm9zcyBlbnRyb3B5IGJldHdlZW4gdGhlIDEtc2tlbGV0b25zIG9mIHRoZSBoaWdoIGRpbWVuc2lvbmFsXG4gICAqIGFuZCBsb3cgZGltZW5zaW9uYWwgZnV6enkgc2ltcGxpY2lhbCBzZXRzLiBJbiBwcmFjdGljZSB0aGlzIGlzIGRvbmUgYnlcbiAgICogc2FtcGxpbmcgZWRnZXMgYmFzZWQgb24gdGhlaXIgbWVtYmVyc2hpcCBzdHJlbmd0aCAod2l0aCB0aGUgKDEtcCkgdGVybXNcbiAgICogY29taW5nIGZyb20gbmVnYXRpdmUgc2FtcGxpbmcgc2ltaWxhciB0byB3b3JkMnZlYykuXG4gICAqL1xuICBwcml2YXRlIG9wdGltaXplTGF5b3V0KFxuICAgIGVwb2NoQ2FsbGJhY2s6IChlcG9jaE51bWJlcjogbnVtYmVyKSA9PiB2b2lkIHwgYm9vbGVhbiA9ICgpID0+IHRydWVcbiAgKTogVmVjdG9ycyB7XG4gICAgbGV0IGlzRmluaXNoZWQgPSBmYWxzZTtcbiAgICBsZXQgZW1iZWRkaW5nOiBWZWN0b3JzID0gW107XG4gICAgd2hpbGUgKCFpc0ZpbmlzaGVkKSB7XG4gICAgICBjb25zdCB7IG5FcG9jaHMsIGN1cnJlbnRFcG9jaCB9ID0gdGhpcy5vcHRpbWl6YXRpb25TdGF0ZTtcbiAgICAgIGVtYmVkZGluZyA9IHRoaXMub3B0aW1pemVMYXlvdXRTdGVwKGN1cnJlbnRFcG9jaCk7XG4gICAgICBjb25zdCBlcG9jaENvbXBsZXRlZCA9IHRoaXMub3B0aW1pemF0aW9uU3RhdGUuY3VycmVudEVwb2NoO1xuICAgICAgY29uc3Qgc2hvdWxkU3RvcCA9IGVwb2NoQ2FsbGJhY2soZXBvY2hDb21wbGV0ZWQpID09PSBmYWxzZTtcbiAgICAgIGlzRmluaXNoZWQgPSBlcG9jaENvbXBsZXRlZCA9PT0gbkVwb2NocyB8fCBzaG91bGRTdG9wO1xuICAgIH1cbiAgICByZXR1cm4gZW1iZWRkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiBlcG9jaHMgZm9yIG9wdGltaXppbmcgdGhlIHByb2plY3Rpb24uXG4gICAqIE5PVEU6IFRoaXMgaGV1cmlzdGljIGRpZmZlcnMgZnJvbSB0aGUgcHl0aG9uIHZlcnNpb25cbiAgICovXG4gIHB1YmxpYyBnZXRORXBvY2hzKCkge1xuICAgIGNvbnN0IGdyYXBoID0gdGhpcy5ncmFwaDtcblxuICAgIGlmICh0aGlzLm5FcG9jaHMgPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5uRXBvY2hzO1xuICAgIH1cblxuICAgIGlmICghZ3JhcGgpIHtcbiAgICAgIHJldHVybiAyMDA7XG4gICAgfVxuXG4gICAgY29uc3QgbGVuZ3RoID0gZ3JhcGgublJvd3M7XG4gICAgaWYgKGxlbmd0aCA8PSAyNTAwKSB7XG4gICAgICByZXR1cm4gNTAwO1xuICAgIH0gZWxzZSBpZiAobGVuZ3RoIDw9IDUwMDApIHtcbiAgICAgIHJldHVybiA0MDA7XG4gICAgfSBlbHNlIGlmIChsZW5ndGggPD0gNzUwMCkge1xuICAgICAgcmV0dXJuIDMwMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDIwMDtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV1Y2xpZGVhbih4OiBWZWN0b3IsIHk6IFZlY3Rvcikge1xuICBsZXQgcmVzdWx0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzdWx0ICs9ICh4W2ldIC0geVtpXSkgKiogMjtcbiAgfVxuICByZXR1cm4gTWF0aC5zcXJ0KHJlc3VsdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBudW1lcmljKHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gIGNvbnN0IHJlc3VsdCA9IE1hdGguYWJzKHggLSB5KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvc2luZSh4OiBWZWN0b3IsIHk6IFZlY3Rvcikge1xuICBsZXQgcmVzdWx0ID0gMC4wO1xuICBsZXQgbm9ybVggPSAwLjA7XG4gIGxldCBub3JtWSA9IDAuMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHQgKz0geFtpXSAqIHlbaV07XG4gICAgbm9ybVggKz0geFtpXSAqKiAyO1xuICAgIG5vcm1ZICs9IHlbaV0gKiogMjtcbiAgfVxuXG4gIGlmIChub3JtWCA9PT0gMCAmJiBub3JtWSA9PT0gMCkge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2UgaWYgKG5vcm1YID09PSAwIHx8IG5vcm1ZID09PSAwKSB7XG4gICAgcmV0dXJuIDEuMDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMS4wIC0gcmVzdWx0IC8gTWF0aC5zcXJ0KG5vcm1YICogbm9ybVkpO1xuICB9XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIHJlcHJlc2VudGluZyB0aGUgb3B0aW1pemF0aW9uIHN0YXRlIHRyYWNrZWQgYmV0d2VlbiBzdGVwcyBvZlxuICogdGhlIFNHRCBvcHRpbWl6YXRpb25cbiAqL1xuY2xhc3MgT3B0aW1pemF0aW9uU3RhdGUge1xuICBjdXJyZW50RXBvY2ggPSAwO1xuXG4gIC8vIERhdGEgdHJhY2tlZCBkdXJpbmcgb3B0aW1pemF0aW9uIHN0ZXBzLlxuICBoZWFkRW1iZWRkaW5nOiBudW1iZXJbXVtdID0gW107XG4gIHRhaWxFbWJlZGRpbmc6IG51bWJlcltdW10gPSBbXTtcbiAgaGVhZDogbnVtYmVyW10gPSBbXTtcbiAgdGFpbDogbnVtYmVyW10gPSBbXTtcbiAgZXBvY2hzUGVyU2FtcGxlOiBudW1iZXJbXSA9IFtdO1xuICBlcG9jaE9mTmV4dFNhbXBsZTogbnVtYmVyW10gPSBbXTtcbiAgZXBvY2hPZk5leHROZWdhdGl2ZVNhbXBsZTogbnVtYmVyW10gPSBbXTtcbiAgZXBvY2hzUGVyTmVnYXRpdmVTYW1wbGU6IG51bWJlcltdID0gW107XG4gIG1vdmVPdGhlciA9IHRydWU7XG4gIGluaXRpYWxBbHBoYSA9IDEuMDtcbiAgYWxwaGEgPSAxLjA7XG4gIGdhbW1hID0gMS4wO1xuICBhID0gMS41NzY5NDM0NjAzMTEzMDc3O1xuICBiID0gMC44OTUwNjA4Nzc5MTA5NzMzO1xuICBkaW0gPSAyO1xuICBuRXBvY2hzID0gNTAwO1xuICBuVmVydGljZXMgPSAwO1xufVxuXG4vKipcbiAqIFN0YW5kYXJkIGNsYW1waW5nIG9mIGEgdmFsdWUgaW50byBhIGZpeGVkIHJhbmdlXG4gKi9cbmZ1bmN0aW9uIGNsaXAoeDogbnVtYmVyLCBjbGlwVmFsdWU6IG51bWJlcikge1xuICBpZiAoeCA+IGNsaXBWYWx1ZSkgcmV0dXJuIGNsaXBWYWx1ZTtcbiAgZWxzZSBpZiAoeCA8IC1jbGlwVmFsdWUpIHJldHVybiAtY2xpcFZhbHVlO1xuICBlbHNlIHJldHVybiB4O1xufVxuXG4vKipcbiAqIFJlZHVjZWQgRXVjbGlkZWFuIGRpc3RhbmNlLlxuICovXG5mdW5jdGlvbiByRGlzdCh4OiBudW1iZXJbXSwgeTogbnVtYmVyW10pIHtcbiAgbGV0IHJlc3VsdCA9IDAuMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzdWx0ICs9IE1hdGgucG93KHhbaV0gLSB5W2ldLCAyKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZpdCBhLCBiIHBhcmFtcyBmb3IgdGhlIGRpZmZlcmVudGlhYmxlIGN1cnZlIHVzZWQgaW4gbG93ZXJcbiAqIGRpbWVuc2lvbmFsIGZ1enp5IHNpbXBsaWNpYWwgY29tcGxleCBjb25zdHJ1Y3Rpb24uIFdlIHdhbnQgdGhlXG4gKiBzbW9vdGggY3VydmUgKGZyb20gYSBwcmUtZGVmaW5lZCBmYW1pbHkgd2l0aCBzaW1wbGUgZ3JhZGllbnQpIHRoYXRcbiAqIGJlc3QgbWF0Y2hlcyBhbiBvZmZzZXQgZXhwb25lbnRpYWwgZGVjYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQUJQYXJhbXMoc3ByZWFkOiBudW1iZXIsIG1pbkRpc3Q6IG51bWJlcikge1xuICBjb25zdCBjdXJ2ZSA9IChbYSwgYl06IG51bWJlcltdKSA9PiAoeDogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIDEuMCAvICgxLjAgKyBhICogeCAqKiAoMiAqIGIpKTtcbiAgfTtcblxuICBjb25zdCB4diA9IHV0aWxzXG4gICAgLmxpbmVhcigwLCBzcHJlYWQgKiAzLCAzMDApXG4gICAgLm1hcCh2YWwgPT4gKHZhbCA8IG1pbkRpc3QgPyAxLjAgOiB2YWwpKTtcblxuICBjb25zdCB5diA9IHV0aWxzLnplcm9zKHh2Lmxlbmd0aCkubWFwKCh2YWwsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZ3RlID0geHZbaW5kZXhdID49IG1pbkRpc3Q7XG4gICAgcmV0dXJuIGd0ZSA/IE1hdGguZXhwKC0oeHZbaW5kZXhdIC0gbWluRGlzdCkgLyBzcHJlYWQpIDogdmFsO1xuICB9KTtcblxuICBjb25zdCBpbml0aWFsVmFsdWVzID0gWzAuNSwgMC41XTtcbiAgY29uc3QgZGF0YSA9IHsgeDogeHYsIHk6IHl2IH07XG5cbiAgLy8gRGVmYXVsdCBvcHRpb25zIGZvciB0aGUgYWxnb3JpdGhtIChmcm9tIGdpdGh1YiBleGFtcGxlKVxuICBjb25zdCBvcHRpb25zID0ge1xuICAgIGRhbXBpbmc6IDEuNSxcbiAgICBpbml0aWFsVmFsdWVzLFxuICAgIGdyYWRpZW50RGlmZmVyZW5jZTogMTBlLTIsXG4gICAgbWF4SXRlcmF0aW9uczogMTAwLFxuICAgIGVycm9yVG9sZXJhbmNlOiAxMGUtMyxcbiAgfTtcblxuICBjb25zdCB7IHBhcmFtZXRlclZhbHVlcyB9ID0gTE0oZGF0YSwgY3VydmUsIG9wdGlvbnMpO1xuICBjb25zdCBbYSwgYl0gPSBwYXJhbWV0ZXJWYWx1ZXMgYXMgbnVtYmVyW107XG4gIHJldHVybiB7IGEsIGIgfTtcbn1cblxuLyoqXG4gKiBVbmRlciB0aGUgYXNzdW1wdGlvbiBvZiBjYXRlZ29yaWNhbCBkaXN0YW5jZSBmb3IgdGhlIGludGVyc2VjdGluZ1xuICogc2ltcGxpY2lhbCBzZXQgcGVyZm9ybSBhIGZhc3QgaW50ZXJzZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFzdEludGVyc2VjdGlvbihcbiAgZ3JhcGg6IG1hdHJpeC5TcGFyc2VNYXRyaXgsXG4gIHRhcmdldDogbnVtYmVyW10sXG4gIHVua25vd25EaXN0ID0gMS4wLFxuICBmYXJEaXN0ID0gNS4wXG4pIHtcbiAgcmV0dXJuIGdyYXBoLm1hcCgodmFsdWUsIHJvdywgY29sKSA9PiB7XG4gICAgaWYgKHRhcmdldFtyb3ddID09PSAtMSB8fCB0YXJnZXRbY29sXSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAqIE1hdGguZXhwKC11bmtub3duRGlzdCk7XG4gICAgfSBlbHNlIGlmICh0YXJnZXRbcm93XSAhPT0gdGFyZ2V0W2NvbF0pIHtcbiAgICAgIHJldHVybiB2YWx1ZSAqIE1hdGguZXhwKC1mYXJEaXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogUmVzZXQgdGhlIGxvY2FsIGNvbm5lY3Rpdml0eSByZXF1aXJlbWVudCAtLSBlYWNoIGRhdGEgc2FtcGxlIHNob3VsZFxuICogaGF2ZSBjb21wbGV0ZSBjb25maWRlbmNlIGluIGF0IGxlYXN0IG9uZSAxLXNpbXBsZXggaW4gdGhlIHNpbXBsaWNpYWwgc2V0LlxuICogV2UgY2FuIGVuZm9yY2UgdGhpcyBieSBsb2NhbGx5IHJlc2NhbGluZyBjb25maWRlbmNlcywgYW5kIHRoZW4gcmVtZXJnaW5nIHRoZVxuICogZGlmZmVyZW50IGxvY2FsIHNpbXBsaWNpYWwgc2V0cyB0b2dldGhlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0TG9jYWxDb25uZWN0aXZpdHkoc2ltcGxpY2lhbFNldDogbWF0cml4LlNwYXJzZU1hdHJpeCkge1xuICBzaW1wbGljaWFsU2V0ID0gbWF0cml4Lm5vcm1hbGl6ZShzaW1wbGljaWFsU2V0LCBtYXRyaXguTm9ybVR5cGUubWF4KTtcbiAgY29uc3QgdHJhbnNwb3NlID0gbWF0cml4LnRyYW5zcG9zZShzaW1wbGljaWFsU2V0KTtcbiAgY29uc3QgcHJvZE1hdHJpeCA9IG1hdHJpeC5wYWlyd2lzZU11bHRpcGx5KHRyYW5zcG9zZSwgc2ltcGxpY2lhbFNldCk7XG4gIHNpbXBsaWNpYWxTZXQgPSBtYXRyaXguYWRkKFxuICAgIHNpbXBsaWNpYWxTZXQsXG4gICAgbWF0cml4LnN1YnRyYWN0KHRyYW5zcG9zZSwgcHJvZE1hdHJpeClcbiAgKTtcbiAgcmV0dXJuIG1hdHJpeC5lbGltaW5hdGVaZXJvcyhzaW1wbGljaWFsU2V0KTtcbn1cblxuLyoqXG4gKiBHaXZlbiBpbmRpY2VzIGFuZCB3ZWlnaHRzIGFuZCBhbiBvcmlnaW5hbCBlbWJlZGRpbmdzXG4gKiBpbml0aWFsaXplIHRoZSBwb3NpdGlvbnMgb2YgbmV3IHBvaW50cyByZWxhdGl2ZSB0byB0aGVcbiAqIGluZGljZXMgYW5kIHdlaWdodHMgKG9mIHRoZWlyIG5laWdoYm9ycyBpbiB0aGUgc291cmNlIGRhdGEpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFRyYW5zZm9ybShcbiAgaW5kaWNlczogbnVtYmVyW11bXSxcbiAgd2VpZ2h0czogbnVtYmVyW11bXSxcbiAgZW1iZWRkaW5nOiBWZWN0b3JzXG4pIHtcbiAgY29uc3QgcmVzdWx0ID0gdXRpbHNcbiAgICAuemVyb3MoaW5kaWNlcy5sZW5ndGgpXG4gICAgLm1hcCh6ID0+IHV0aWxzLnplcm9zKGVtYmVkZGluZ1swXS5sZW5ndGgpKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGluZGljZXNbMF0ubGVuZ3RoOyBqKyspIHtcbiAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgZW1iZWRkaW5nWzBdLmxlbmd0aDsgZCsrKSB7XG4gICAgICAgIGNvbnN0IGEgPSBpbmRpY2VzW2ldW2pdO1xuICAgICAgICByZXN1bHRbaV1bZF0gKz0gd2VpZ2h0c1tpXVtqXSAqIGVtYmVkZGluZ1thXVtkXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==","/**\n * @license\n *\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ==============================================================================\n */\n/**\n * This is a JavaScript reimplementation of UMAP (original license below), from\n * the python implementation found at https://github.com/lmcinnes/umap.\n *\n * @author andycoenen@google.com (Andy Coenen)\n */\n/**\n * @license\n * BSD 3-Clause License\n *\n * Copyright (c) 2017, Leland McInnes\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * * Neither the name of the copyright holder nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport * as heap from './heap';\nimport * as matrix from './matrix';\nimport * as tree from './tree';\nimport * as utils from './utils';\n/**\n * Create a version of nearest neighbor descent.\n */\nexport function makeNNDescent(distanceFn, random) {\n return function nNDescent(data, leafArray, nNeighbors, nIters = 10, maxCandidates = 50, delta = 0.001, rho = 0.5, rpTreeInit = true) {\n const nVertices = data.length;\n const currentGraph = heap.makeHeap(data.length, nNeighbors);\n for (let i = 0; i < data.length; i++) {\n const indices = heap.rejectionSample(nNeighbors, data.length, random);\n for (let j = 0; j < indices.length; j++) {\n const d = distanceFn(data[i], data[indices[j]]);\n heap.heapPush(currentGraph, i, d, indices[j], 1);\n heap.heapPush(currentGraph, indices[j], d, i, 1);\n }\n }\n if (rpTreeInit) {\n for (let n = 0; n < leafArray.length; n++) {\n for (let i = 0; i < leafArray[n].length; i++) {\n if (leafArray[n][i] < 0) {\n break;\n }\n for (let j = i + 1; j < leafArray[n].length; j++) {\n if (leafArray[n][j] < 0) {\n break;\n }\n const d = distanceFn(data[leafArray[n][i]], data[leafArray[n][j]]);\n heap.heapPush(currentGraph, leafArray[n][i], d, leafArray[n][j], 1);\n heap.heapPush(currentGraph, leafArray[n][j], d, leafArray[n][i], 1);\n }\n }\n }\n }\n for (let n = 0; n < nIters; n++) {\n const candidateNeighbors = heap.buildCandidates(currentGraph, nVertices, nNeighbors, maxCandidates, random);\n let c = 0;\n for (let i = 0; i < nVertices; i++) {\n for (let j = 0; j < maxCandidates; j++) {\n let p = Math.floor(candidateNeighbors[0][i][j]);\n if (p < 0 || utils.tauRand(random) < rho) {\n continue;\n }\n for (let k = 0; k < maxCandidates; k++) {\n const q = Math.floor(candidateNeighbors[0][i][k]);\n const cj = candidateNeighbors[2][i][j];\n const ck = candidateNeighbors[2][i][k];\n if (q < 0 || (!cj && !ck)) {\n continue;\n }\n const d = distanceFn(data[p], data[q]);\n c += heap.heapPush(currentGraph, p, d, q, 1);\n c += heap.heapPush(currentGraph, q, d, p, 1);\n }\n }\n }\n if (c <= delta * nNeighbors * data.length) {\n break;\n }\n }\n const sorted = heap.deheapSort(currentGraph);\n return sorted;\n };\n}\nexport function makeInitializations(distanceFn) {\n function initFromRandom(nNeighbors, data, queryPoints, _heap, random) {\n for (let i = 0; i < queryPoints.length; i++) {\n const indices = utils.rejectionSample(nNeighbors, data.length, random);\n for (let j = 0; j < indices.length; j++) {\n if (indices[j] < 0) {\n continue;\n }\n const d = distanceFn(data[indices[j]], queryPoints[i]);\n heap.heapPush(_heap, i, d, indices[j], 1);\n }\n }\n }\n function initFromTree(_tree, data, queryPoints, _heap, random) {\n for (let i = 0; i < queryPoints.length; i++) {\n const indices = tree.searchFlatTree(queryPoints[i], _tree, random);\n for (let j = 0; j < indices.length; j++) {\n if (indices[j] < 0) {\n return;\n }\n const d = distanceFn(data[indices[j]], queryPoints[i]);\n heap.heapPush(_heap, i, d, indices[j], 1);\n }\n }\n return;\n }\n return { initFromRandom, initFromTree };\n}\nexport function makeInitializedNNSearch(distanceFn) {\n return function nnSearchFn(data, graph, initialization, queryPoints) {\n const { indices, indptr } = matrix.getCSR(graph);\n for (let i = 0; i < queryPoints.length; i++) {\n const tried = new Set(initialization[0][i]);\n while (true) {\n // Find smallest flagged vertex\n const vertex = heap.smallestFlagged(initialization, i);\n if (vertex === -1) {\n break;\n }\n const candidates = indices.slice(indptr[vertex], indptr[vertex + 1]);\n for (const candidate of candidates) {\n if (candidate === vertex ||\n candidate === -1 ||\n tried.has(candidate)) {\n continue;\n }\n const d = distanceFn(data[candidate], queryPoints[i]);\n heap.uncheckedHeapPush(initialization, i, d, candidate, 1);\n tried.add(candidate);\n }\n }\n }\n return initialization;\n };\n}\nexport function initializeSearch(forest, data, queryPoints, nNeighbors, initFromRandom, initFromTree, random) {\n const results = heap.makeHeap(queryPoints.length, nNeighbors);\n initFromRandom(nNeighbors, data, queryPoints, results, random);\n if (forest) {\n for (let tree of forest) {\n initFromTree(tree, data, queryPoints, results, random);\n }\n }\n return results;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm5fZGVzY2VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5uX2Rlc2NlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE9BQU8sS0FBSyxJQUFJLE1BQU0sUUFBUSxDQUFDO0FBQy9CLE9BQU8sS0FBSyxNQUFNLE1BQU0sVUFBVSxDQUFDO0FBQ25DLE9BQU8sS0FBSyxJQUFJLE1BQU0sUUFBUSxDQUFDO0FBQy9CLE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBR2pDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxVQUFzQixFQUFFLE1BQWdCO0lBQ3BFLE9BQU8sU0FBUyxTQUFTLENBQ3ZCLElBQVksRUFDWixTQUFrQixFQUNsQixVQUFrQixFQUNsQixNQUFNLEdBQUcsRUFBRSxFQUNYLGFBQWEsR0FBRyxFQUFFLEVBQ2xCLEtBQUssR0FBRyxLQUFLLEVBQ2IsR0FBRyxHQUFHLEdBQUcsRUFDVCxVQUFVLEdBQUcsSUFBSTtRQUVqQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzlCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUU1RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3RFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxF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QU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgSmF2YVNjcmlwdCByZWltcGxlbWVudGF0aW9uIG9mIFVNQVAgKG9yaWdpbmFsIGxpY2Vuc2UgYmVsb3cpLCBmcm9tXG4gKiB0aGUgcHl0aG9uIGltcGxlbWVudGF0aW9uIGZvdW5kIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9sbWNpbm5lcy91bWFwLlxuICpcbiAqIEBhdXRob3IgYW5keWNvZW5lbkBnb29nbGUuY29tIChBbmR5IENvZW5lbilcbiAqL1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBCU0QgMy1DbGF1c2UgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNywgTGVsYW5kIE1jSW5uZXNcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuICogICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXIgbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFXG4gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1JcbiAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSXG4gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuaW1wb3J0ICogYXMgaGVhcCBmcm9tICcuL2hlYXAnO1xuaW1wb3J0ICogYXMgbWF0cml4IGZyb20gJy4vbWF0cml4JztcbmltcG9ydCAqIGFzIHRyZWUgZnJvbSAnLi90cmVlJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgUmFuZG9tRm4sIFZlY3RvcnMsIERpc3RhbmNlRm4sIFZlY3RvciB9IGZyb20gJy4vdW1hcCc7XG5cbi8qKlxuICogQ3JlYXRlIGEgdmVyc2lvbiBvZiBuZWFyZXN0IG5laWdoYm9yIGRlc2NlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTk5EZXNjZW50KGRpc3RhbmNlRm46IERpc3RhbmNlRm4sIHJhbmRvbTogUmFuZG9tRm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIG5ORGVzY2VudChcbiAgICBkYXRhOiBWZWN0b3IsXG4gICAgbGVhZkFycmF5OiBWZWN0b3JzLFxuICAgIG5OZWlnaGJvcnM6IG51bWJlcixcbiAgICBuSXRlcnMgPSAxMCxcbiAgICBtYXhDYW5kaWRhdGVzID0gNTAsXG4gICAgZGVsdGEgPSAwLjAwMSxcbiAgICByaG8gPSAwLjUsXG4gICAgcnBUcmVlSW5pdCA9IHRydWVcbiAgKSB7XG4gICAgY29uc3QgblZlcnRpY2VzID0gZGF0YS5sZW5ndGg7XG4gICAgY29uc3QgY3VycmVudEdyYXBoID0gaGVhcC5tYWtlSGVhcChkYXRhLmxlbmd0aCwgbk5laWdoYm9ycyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGljZXMgPSBoZWFwLnJlamVjdGlvblNhbXBsZShuTmVpZ2hib3JzLCBkYXRhLmxlbmd0aCwgcmFuZG9tKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5kaWNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBjb25zdCBkID0gZGlzdGFuY2VGbihkYXRhW2ldLCBkYXRhW2luZGljZXNbal1dKTtcblxuICAgICAgICBoZWFwLmhlYXBQdXNoKGN1cnJlbnRHcmFwaCwgaSwgZCwgaW5kaWNlc1tqXSwgMSk7XG4gICAgICAgIGhlYXAuaGVhcFB1c2goY3VycmVudEdyYXBoLCBpbmRpY2VzW2pdLCBkLCBpLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJwVHJlZUluaXQpIHtcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbGVhZkFycmF5Lmxlbmd0aDsgbisrKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVhZkFycmF5W25dLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGxlYWZBcnJheVtuXVtpXSA8IDApIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBsZWFmQXJyYXlbbl0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChsZWFmQXJyYXlbbl1bal0gPCAwKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZCA9IGRpc3RhbmNlRm4oZGF0YVtsZWFmQXJyYXlbbl1baV1dLCBkYXRhW2xlYWZBcnJheVtuXVtqXV0pO1xuICAgICAgICAgICAgaGVhcC5oZWFwUHVzaChjdXJyZW50R3JhcGgsIGxlYWZBcnJheVtuXVtpXSwgZCwgbGVhZkFycmF5W25dW2pdLCAxKTtcbiAgICAgICAgICAgIGhlYXAuaGVhcFB1c2goY3VycmVudEdyYXBoLCBsZWFmQXJyYXlbbl1bal0sIGQsIGxlYWZBcnJheVtuXVtpXSwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgbiA9IDA7IG4gPCBuSXRlcnM7IG4rKykge1xuICAgICAgY29uc3QgY2FuZGlkYXRlTmVpZ2hib3JzID0gaGVhcC5idWlsZENhbmRpZGF0ZXMoXG4gICAgICAgIGN1cnJlbnRHcmFwaCxcbiAgICAgICAgblZlcnRpY2VzLFxuICAgICAgICBuTmVpZ2hib3JzLFxuICAgICAgICBtYXhDYW5kaWRhdGVzLFxuICAgICAgICByYW5kb21cbiAgICAgICk7XG5cbiAgICAgIGxldCBjID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblZlcnRpY2VzOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtYXhDYW5kaWRhdGVzOyBqKyspIHtcbiAgICAgICAgICBsZXQgcCA9IE1hdGguZmxvb3IoY2FuZGlkYXRlTmVpZ2hib3JzWzBdW2ldW2pdKTtcbiAgICAgICAgICBpZiAocCA8IDAgfHwgdXRpbHMudGF1UmFuZChyYW5kb20pIDwgcmhvKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYXhDYW5kaWRhdGVzOyBrKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHEgPSBNYXRoLmZsb29yKGNhbmRpZGF0ZU5laWdoYm9yc1swXVtpXVtrXSk7XG4gICAgICAgICAgICBjb25zdCBjaiA9IGNhbmRpZGF0ZU5laWdoYm9yc1syXVtpXVtqXTtcbiAgICAgICAgICAgIGNvbnN0IGNrID0gY2FuZGlkYXRlTmVpZ2hib3JzWzJdW2ldW2tdO1xuICAgICAgICAgICAgaWYgKHEgPCAwIHx8ICghY2ogJiYgIWNrKSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZCA9IGRpc3RhbmNlRm4oZGF0YVtwXSwgZGF0YVtxXSk7XG4gICAgICAgICAgICBjICs9IGhlYXAuaGVhcFB1c2goY3VycmVudEdyYXBoLCBwLCBkLCBxLCAxKTtcbiAgICAgICAgICAgIGMgKz0gaGVhcC5oZWFwUHVzaChjdXJyZW50R3JhcGgsIHEsIGQsIHAsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGMgPD0gZGVsdGEgKiBuTmVpZ2hib3JzICogZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNvcnRlZCA9IGhlYXAuZGVoZWFwU29ydChjdXJyZW50R3JhcGgpO1xuICAgIHJldHVybiBzb3J0ZWQ7XG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIEluaXRGcm9tUmFuZG9tRm4gPSAoXG4gIG5OZWlnaGJvcnM6IG51bWJlcixcbiAgZGF0YTogVmVjdG9yLFxuICBxdWVyeVBvaW50czogVmVjdG9yLFxuICBfaGVhcDogaGVhcC5IZWFwLFxuICByYW5kb206IFJhbmRvbUZuXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIEluaXRGcm9tVHJlZUZuID0gKFxuICBfdHJlZTogdHJlZS5GbGF0VHJlZSxcbiAgZGF0YTogVmVjdG9yLFxuICBxdWVyeVBvaW50czogVmVjdG9yLFxuICBfaGVhcDogaGVhcC5IZWFwLFxuICByYW5kb206IFJhbmRvbUZuXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlSW5pdGlhbGl6YXRpb25zKGRpc3RhbmNlRm46IERpc3RhbmNlRm4pIHtcbiAgZnVuY3Rpb24gaW5pdEZyb21SYW5kb20oXG4gICAgbk5laWdoYm9yczogbnVtYmVyLFxuICAgIGRhdGE6IFZlY3RvcixcbiAgICBxdWVyeVBvaW50czogVmVjdG9yLFxuICAgIF9oZWFwOiBoZWFwLkhlYXAsXG4gICAgcmFuZG9tOiBSYW5kb21GblxuICApIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXJ5UG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbmRpY2VzID0gdXRpbHMucmVqZWN0aW9uU2FtcGxlKG5OZWlnaGJvcnMsIGRhdGEubGVuZ3RoLCByYW5kb20pO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbmRpY2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChpbmRpY2VzW2pdIDwgMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGQgPSBkaXN0YW5jZUZuKGRhdGFbaW5kaWNlc1tqXV0sIHF1ZXJ5UG9pbnRzW2ldKTtcbiAgICAgICAgaGVhcC5oZWFwUHVzaChfaGVhcCwgaSwgZCwgaW5kaWNlc1tqXSwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5pdEZyb21UcmVlKFxuICAgIF90cmVlOiB0cmVlLkZsYXRUcmVlLFxuICAgIGRhdGE6IFZlY3RvcixcbiAgICBxdWVyeVBvaW50czogVmVjdG9yLFxuICAgIF9oZWFwOiBoZWFwLkhlYXAsXG4gICAgcmFuZG9tOiBSYW5kb21GblxuICApIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXJ5UG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbmRpY2VzID0gdHJlZS5zZWFyY2hGbGF0VHJlZShxdWVyeVBvaW50c1tpXSwgX3RyZWUsIHJhbmRvbSk7XG5cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5kaWNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoaW5kaWNlc1tqXSA8IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZCA9IGRpc3RhbmNlRm4oZGF0YVtpbmRpY2VzW2pdXSwgcXVlcnlQb2ludHNbaV0pO1xuICAgICAgICBoZWFwLmhlYXBQdXNoKF9oZWFwLCBpLCBkLCBpbmRpY2VzW2pdLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIHsgaW5pdEZyb21SYW5kb20sIGluaXRGcm9tVHJlZSB9O1xufVxuXG5leHBvcnQgdHlwZSBTZWFyY2hGbiA9IChcbiAgZGF0YTogVmVjdG9yLFxuICBncmFwaDogbWF0cml4LlNwYXJzZU1hdHJpeCxcbiAgaW5pdGlhbGl6YXRpb246IGhlYXAuSGVhcCxcbiAgcXVlcnlQb2ludHM6IFZlY3RvclxuKSA9PiBoZWFwLkhlYXA7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlSW5pdGlhbGl6ZWROTlNlYXJjaChkaXN0YW5jZUZuOiBEaXN0YW5jZUZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBublNlYXJjaEZuKFxuICAgIGRhdGE6IFZlY3RvcixcbiAgICBncmFwaDogbWF0cml4LlNwYXJzZU1hdHJpeCxcbiAgICBpbml0aWFsaXphdGlvbjogaGVhcC5IZWFwLFxuICAgIHF1ZXJ5UG9pbnRzOiBWZWN0b3JcbiAgKSB7XG4gICAgY29uc3QgeyBpbmRpY2VzLCBpbmRwdHIgfSA9IG1hdHJpeC5nZXRDU1IoZ3JhcGgpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWVyeVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdHJpZWQgPSBuZXcgU2V0KGluaXRpYWxpemF0aW9uWzBdW2ldKTtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIC8vIEZpbmQgc21hbGxlc3QgZmxhZ2dlZCB2ZXJ0ZXhcbiAgICAgICAgY29uc3QgdmVydGV4ID0gaGVhcC5zbWFsbGVzdEZsYWdnZWQoaW5pdGlhbGl6YXRpb24sIGkpO1xuXG4gICAgICAgIGlmICh2ZXJ0ZXggPT09IC0xKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IGluZGljZXMuc2xpY2UoaW5kcHRyW3ZlcnRleF0sIGluZHB0clt2ZXJ0ZXggKyAxXSk7XG4gICAgICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjYW5kaWRhdGUgPT09IHZlcnRleCB8fFxuICAgICAgICAgICAgY2FuZGlkYXRlID09PSAtMSB8fFxuICAgICAgICAgICAgdHJpZWQuaGFzKGNhbmRpZGF0ZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBkID0gZGlzdGFuY2VGbihkYXRhW2NhbmRpZGF0ZV0sIHF1ZXJ5UG9pbnRzW2ldKTtcbiAgICAgICAgICBoZWFwLnVuY2hlY2tlZEhlYXBQdXNoKGluaXRpYWxpemF0aW9uLCBpLCBkLCBjYW5kaWRhdGUsIDEpO1xuICAgICAgICAgIHRyaWVkLmFkZChjYW5kaWRhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbml0aWFsaXphdGlvbjtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVTZWFyY2goXG4gIGZvcmVzdDogdHJlZS5GbGF0VHJlZVtdLFxuICBkYXRhOiBWZWN0b3IsXG4gIHF1ZXJ5UG9pbnRzOiBWZWN0b3IsXG4gIG5OZWlnaGJvcnM6IG51bWJlcixcbiAgaW5pdEZyb21SYW5kb206IEluaXRGcm9tUmFuZG9tRm4sXG4gIGluaXRGcm9tVHJlZTogSW5pdEZyb21UcmVlRm4sXG4gIHJhbmRvbTogUmFuZG9tRm5cbikge1xuICBjb25zdCByZXN1bHRzID0gaGVhcC5tYWtlSGVhcChxdWVyeVBvaW50cy5sZW5ndGgsIG5OZWlnaGJvcnMpO1xuICBpbml0RnJvbVJhbmRvbShuTmVpZ2hib3JzLCBkYXRhLCBxdWVyeVBvaW50cywgcmVzdWx0cywgcmFuZG9tKTtcbiAgaWYgKGZvcmVzdCkge1xuICAgIGZvciAobGV0IHRyZWUgb2YgZm9yZXN0KSB7XG4gICAgICBpbml0RnJvbVRyZWUodHJlZSwgZGF0YSwgcXVlcnlQb2ludHMsIHJlc3VsdHMsIHJhbmRvbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuIl19","import isArray from 'is-any-array';\n\nimport errorCalculation from './errorCalculation';\nimport step from './step';\n\n/**\n * Curve fitting algorithm\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param {object} [options] - Options object\n * @param {number} [options.damping] - Levenberg-Marquardt parameter\n * @param {number} [options.gradientDifference = 10e-2] - Adjustment for decrease the damping parameter\n * @param {Array<number>} [options.minValues] - Minimum allowed values for parameters\n * @param {Array<number>} [options.maxValues] - Maximum allowed values for parameters\n * @param {Array<number>} [options.initialValues] - Array of initial parameter values\n * @param {number} [options.maxIterations = 100] - Maximum of allowed iterations\n * @param {number} [options.errorTolerance = 10e-3] - Minimum uncertainty allowed for each point\n * @return {{parameterValues: Array<number>, parameterError: number, iterations: number}}\n */\nexport default function levenbergMarquardt(\n data,\n parameterizedFunction,\n options = {},\n) {\n let {\n maxIterations = 100,\n gradientDifference = 10e-2,\n damping = 0,\n errorTolerance = 10e-3,\n minValues,\n maxValues,\n initialValues,\n } = options;\n\n if (damping <= 0) {\n throw new Error('The damping option must be a positive number');\n } else if (!data.x || !data.y) {\n throw new Error('The data parameter must have x and y elements');\n } else if (\n !isArray(data.x) ||\n data.x.length < 2 ||\n !isArray(data.y) ||\n data.y.length < 2\n ) {\n throw new Error(\n 'The data parameter elements must be an array with more than 2 points',\n );\n } else if (data.x.length !== data.y.length) {\n throw new Error('The data parameter elements must have the same size');\n }\n\n let parameters =\n initialValues || new Array(parameterizedFunction.length).fill(1);\n let parLen = parameters.length;\n maxValues = maxValues || new Array(parLen).fill(Number.MAX_SAFE_INTEGER);\n minValues = minValues || new Array(parLen).fill(Number.MIN_SAFE_INTEGER);\n\n if (maxValues.length !== minValues.length) {\n throw new Error('minValues and maxValues must be the same size');\n }\n\n if (!isArray(parameters)) {\n throw new Error('initialValues must be an array');\n }\n\n let error = errorCalculation(data, parameters, parameterizedFunction);\n\n let converged = error <= errorTolerance;\n\n let iteration;\n for (iteration = 0; iteration < maxIterations && !converged; iteration++) {\n parameters = step(\n data,\n parameters,\n damping,\n gradientDifference,\n parameterizedFunction,\n );\n\n for (let k = 0; k < parLen; k++) {\n parameters[k] = Math.min(\n Math.max(minValues[k], parameters[k]),\n maxValues[k],\n );\n }\n\n error = errorCalculation(data, parameters, parameterizedFunction);\n if (isNaN(error)) break;\n converged = error <= errorTolerance;\n }\n\n return {\n parameterValues: parameters,\n parameterError: error,\n iterations: iteration,\n };\n}\n","import { getSimilarityFromDistance } from '../distance-metrics-methods';\nimport { BitArrayMetricsNames } from '../typed-metrics';\nimport { DistanceAggregationMethods } from './types';\nimport { insertSmaller, isNil } from './utils';\nexport class SparseMatrixService {\n _workerCount;\n constructor() {\n this._workerCount = Math.max(navigator.hardwareConcurrency - 2, 1);\n }\n async calc(values, fnName, threshold, opts = {}) {\n //size of full matrix\n const matSize = values.length * (values.length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const minThreshold = values.length > 20000 ? await this.getMinimalThreshold(values, fnName, opts) : 0;\n if (threshold < minThreshold) {\n console.log(`using threshold ${minThreshold}`);\n threshold = minThreshold;\n }\n opts['threshold'] = threshold;\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./sparse-matrix-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ i: new Int32Array(0), j: new Int32Array(0), distance: new Float32Array(0), idx });\n workers[idx].postMessage({ values, startIdx, endIdx, threshold, fnName, opts });\n workers[idx].onmessage = ({ data: { error, i, j, distance } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ i, j, distance, idx });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const fullSize = results.reduce((acc, val) => acc + val.i.length, 0);\n const i = new Int32Array(fullSize);\n const j = new Int32Array(fullSize);\n const distance = new Float32Array(fullSize);\n let offset = 0;\n // setting the results\n for (const res of results) {\n i.set(res.i, offset);\n j.set(res.j, offset);\n distance.set(res.distance, offset);\n offset += res.i.length;\n }\n return { i, j, distance };\n }\n async getKNN(values, fnName, nNeighbours = 15, opts = {}) {\n return await this.multiColumnKNN([values], [fnName], nNeighbours, [opts], [1]);\n }\n async multiColumnKNN(values, fnNames, nNeighbours = 15, opts, weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n if (values.length !== fnNames.length || values.length !== opts.length || values.length !== weights.length)\n throw new Error('values, distance functions, options and weights arrays should have the same length');\n if (values.some((v) => v.length !== values[0].length))\n throw new Error('all values arrays should have the same length');\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./knn-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ knnDistances: new Array(0), knnIndexes: new Array(0) });\n workers[idx].postMessage({ values, startIdx, endIdx, fnNames, opts, nNeighbours, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, knnDistances, knnIndexes } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ knnDistances, knnIndexes });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const knnRes = {\n knnDistances: new Array(values[0].length).fill(null).map(() => new Array(nNeighbours).fill(99999)),\n knnIndexes: new Array(values[0].length).fill(null).map(() => new Array(nNeighbours).fill(-1))\n };\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i) {\n for (let j = 0; j < res.knnDistances[i]?.length ?? 0; ++j)\n insertSmaller(knnRes.knnDistances[i], knnRes.knnIndexes[i], res.knnDistances[i][j], res.knnIndexes[i][j]);\n }\n }\n return knnRes;\n }\n async getSampleDistances(values, fnName, opts = {}) {\n const thresholdWorkers = new Array(this._workerCount).fill(null)\n .map(() => new Worker(new URL('./sparse-matrix-threshold-worker', import.meta.url)));\n // data may be sorted by clusters, which will hinder the random sampling\n // so we shuffle it first\n const shuffledValues = values.slice();\n for (let i = shuffledValues.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [shuffledValues[i], shuffledValues[j]] = [shuffledValues[j], shuffledValues[i]];\n }\n try {\n const matSize = values.length * (values.length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const maxSampleSize = 1000000;\n const sampleSise = Math.max(Math.min(matSize / 1000, maxSampleSize), Math.min(matSize, maxSampleSize));\n const testSetSizePerWorker = Math.floor(sampleSise / this._workerCount);\n const tPromises = new Array(this._workerCount);\n for (let idx = 0; idx < this._workerCount; idx++) {\n tPromises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n thresholdWorkers[idx].postMessage({\n values: shuffledValues, startIdx, endIdx, sampleLength: testSetSizePerWorker, fnName, opts\n });\n thresholdWorkers[idx].onmessage = ({ data: { error, distance } }) => {\n thresholdWorkers[idx].terminate();\n if (error)\n rejectWorker(error);\n else\n resolveWorker({ distance });\n };\n });\n }\n const results = await Promise.all(tPromises);\n const fullSize = results.reduce((acc, val) => acc + val.distance.length, 0);\n const distance = new Float32Array(fullSize);\n let offset = 0;\n for (const res of results) {\n distance.set(res.distance, offset);\n offset += res.distance.length;\n }\n distance.sort();\n return distance;\n }\n catch (e) {\n thresholdWorkers?.forEach((w) => w?.terminate());\n console.error(e);\n return new Float32Array(1).fill(0.5);\n }\n }\n async getMinimalThreshold(values, fnName, opts = {}) {\n //We need to calculate the minimal threshold first,\n //in order to get matrix such that it does not exceed the maximum size of 1GB\n //we have 3 return arrays, each 4 bites per element, so if the maximum size of the matrix is 1GB,\n const maxSparseMatrixSize = 70000000;\n try {\n const matSize = values.length * (values.length - 1) / 2;\n const distance = await this.getSampleDistances(values, fnName, opts);\n const fractionIndex = Math.floor(maxSparseMatrixSize / matSize * distance.length);\n const threshold = 1 - distance[fractionIndex];\n // threshold = Math.max(threshold, 0.3);\n return threshold;\n }\n catch (e) {\n console.error(e);\n return 0.5;\n }\n }\n static calcSync(values, fnName, distanceFn, threshold) {\n const i = [];\n const j = [];\n const distances = [];\n let cnt = 0;\n let mi = 0;\n let mj = 0;\n const fullSize = values.length * (values.length - 1) / 2;\n while (cnt < fullSize) {\n //const value = seq1List[mi] && seq1List[mj] ? hamming(seq1List[mi], seq1List[mj]) : 0;\n const value = !isNil(values[mi]) && !isNil(values[mj]) ?\n distanceFn(values[mi], values[mj]) : 1;\n const similarity = Object.values(BitArrayMetricsNames).some((a) => a === fnName) ? getSimilarityFromDistance(value) : 1 - value;\n if (similarity >= threshold) {\n i.push(mi);\n j.push(mj);\n distances.push(value);\n }\n cnt++;\n mj++;\n if (mj === values.length) {\n mi++;\n mj = mi + 1;\n }\n }\n const iArray = new Int32Array(i);\n const jArray = new Int32Array(j);\n const distanceArray = new Float32Array(distances);\n return { i: iArray, j: jArray, distance: distanceArray };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlLW1hdHJpeC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BhcnNlLW1hdHJpeC1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxvQkFBb0IsRUFBZSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BFLE9BQU8sRUFBNEIsMEJBQTBCLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUUsT0FBTyxFQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFhN0MsTUFBTSxPQUFPLG1CQUFtQjtJQUNwQixZQUFZLENBQVM7SUFDN0I7UUFDRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUksQ0FBSSxNQUFnQixFQUFFLE1BQW9CLEVBQUUsU0FBaUIsRUFBRSxPQUEyQixFQUFFO1FBQzNHLHFCQUFxQjtRQUNyQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTFELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkcsSUFBSSxTQUFTLEdBQUcsWUFBWSxFQUFFO1lBQzVCLE9BQU8sQ0FBQyxHQUFH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SUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQy9HLElBQUksVUFBVSxJQUFJLFNBQVMsRUFBRTtnQkFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDWCxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNYLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdkI7WUFDRCxHQUFHLEVBQUUsQ0FBQztZQUNOLEVBQUUsRUFBRSxDQUFDO1lBQ0wsSUFBSSxFQUFFLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRTtnQkFDeEIsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDYjtTQUNGO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsTUFBTSxhQUFhLEdBQUcsSUFBSSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFbEQsT0FBTyxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFDLENBQUM7SUFDekQsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtnZXRTaW1pbGFyaXR5RnJvbURpc3RhbmNlfSBmcm9tICcuLi9kaXN0YW5jZS1tZXRyaWNzLW1ldGhvZHMnO1xuaW1wb3J0IHtCaXRBcnJheU1ldHJpY3NOYW1lcywgS25vd25NZXRyaWNzfSBmcm9tICcuLi90eXBlZC1tZXRyaWNzJztcbmltcG9ydCB7RGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCwgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHN9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtpbnNlcnRTbWFsbGVyLCBpc05pbH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCB0eXBlIFNwYXJzZU1hdHJpeFJlc3VsdCA9IHtcbiAgaTogSW50MzJBcnJheSxcbiAgajogSW50MzJBcnJheSxcbiAgZGlzdGFuY2U6IEZsb2F0MzJBcnJheSxcbiAgaWR4PzogbnVtYmVyXG59O1xuXG5leHBvcnQgdHlwZSBLbm5SZXN1bHQgPSB7XG4gIGtubkRpc3RhbmNlczogbnVtYmVyW11bXSxcbiAga25uSW5kZXhlczogbnVtYmVyW11bXVxufVxuZXhwb3J0IGNsYXNzIFNwYXJzZU1hdHJpeFNlcnZpY2Uge1xuICAgIHByaXZhdGUgX3dvcmtlckNvdW50OiBudW1iZXI7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLl93b3JrZXJDb3VudCA9IE1hdGgubWF4KG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5IC0gMiwgMSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNhbGM8VD4odmFsdWVzOiBBcnJheTxUPiwgZm5OYW1lOiBLbm93bk1ldHJpY3MsIHRocmVzaG9sZDogbnVtYmVyLCBvcHRzOiB7W186IHN0cmluZ106IGFueX0gPSB7fSkge1xuICAgICAgLy9zaXplIG9mIGZ1bGwgbWF0cml4XG4gICAgICBjb25zdCBtYXRTaXplID0gdmFsdWVzLmxlbmd0aCAqICh2YWx1ZXMubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihtYXRTaXplIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuXG4gICAgICBjb25zdCBtaW5UaHJlc2hvbGQgPSB2YWx1ZXMubGVuZ3RoID4gMjBfMDAwID8gYXdhaXQgdGhpcy5nZXRNaW5pbWFsVGhyZXNob2xkKHZhbHVlcywgZm5OYW1lLCBvcHRzKSA6IDA7XG4gICAgICBpZiAodGhyZXNob2xkIDwgbWluVGhyZXNob2xkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGB1c2luZyB0aHJlc2hvbGQgJHttaW5UaHJlc2hvbGR9YCk7XG4gICAgICAgIHRocmVzaG9sZCA9IG1pblRocmVzaG9sZDtcbiAgICAgIH1cbiAgICAgIG9wdHNbJ3RocmVzaG9sZCddID0gdGhyZXNob2xkO1xuICAgICAgY29uc3QgcHJvbWlzZXMgPVxuICAgICAgICBuZXcgQXJyYXk8UHJvbWlzZTxTcGFyc2VNYXRyaXhSZXN1bHQ+Pih0aGlzLl93b3JrZXJDb3VudCk7XG5cbiAgICAgIGNvbnN0IHdvcmtlcnMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpXG4gICAgICAgIC5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgV29ya2VyKG5ldyBVUkwoJy4vc3BhcnNlLW1hdHJpeC13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKSk7XG4gICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCB0aGlzLl93b3JrZXJDb3VudDsgaWR4KyspIHtcbiAgICAgICAgcHJvbWlzZXNbaWR4XSA9IG5ldyBQcm9taXNlKChyZXNvbHZlV29ya2VyLCByZWplY3RXb3JrZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGFydElkeCA9IGlkeCAqIGNodW5rU2l6ZTtcbiAgICAgICAgICBjb25zdCBlbmRJZHggPSBpZHggPT09IHRoaXMuX3dvcmtlckNvdW50IC0gMSA/IG1hdFNpemUgOiAoaWR4ICsgMSkgKiBjaHVua1NpemU7XG4gICAgICAgICAgaWYgKGVuZElkeCA8PSBzdGFydElkeClcbiAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoe2k6IG5ldyBJbnQzMkFycmF5KDApLCBqOiBuZXcgSW50MzJBcnJheSgwKSwgZGlzdGFuY2U6IG5ldyBGbG9hdDMyQXJyYXkoMCksIGlkeH0pO1xuICAgICAgICAgIHdvcmtlcnNbaWR4XS5wb3N0TWVzc2FnZSh7dmFsdWVzLCBzdGFydElkeCwgZW5kSWR4LCB0aHJlc2hvbGQsIGZuTmFtZSwgb3B0c30pO1xuICAgICAgICAgIHdvcmtlcnNbaWR4XS5vbm1lc3NhZ2UgPSAoe2RhdGE6IHtlcnJvciwgaSwgaiwgZGlzdGFuY2V9fSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVqZWN0V29ya2VyKGVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7aSwgaiwgZGlzdGFuY2UsIGlkeH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgY29uc3QgZnVsbFNpemUgPSByZXN1bHRzLnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyArIHZhbC5pLmxlbmd0aCwgMCk7XG4gICAgICBjb25zdCBpID0gbmV3IEludDMyQXJyYXkoZnVsbFNpemUpO1xuICAgICAgY29uc3QgaiA9IG5ldyBJbnQzMkFycmF5KGZ1bGxTaXplKTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gbmV3IEZsb2F0MzJBcnJheShmdWxsU2l6ZSk7XG4gICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgIC8vIHNldHRpbmcgdGhlIHJlc3VsdHNcbiAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgaS5zZXQocmVzLmksIG9mZnNldCk7XG4gICAgICAgIGouc2V0KHJlcy5qLCBvZmZzZXQpO1xuICAgICAgICBkaXN0YW5jZS5zZXQocmVzLmRpc3RhbmNlLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gcmVzLmkubGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtpLCBqLCBkaXN0YW5jZX07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEtOTihcbiAgICAgIHZhbHVlczogQXJyYXk8YW55PiwgZm5OYW1lOiBLbm93bk1ldHJpY3MsIG5OZWlnaGJvdXJzOiBudW1iZXIgPSAxNSwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9ID0ge31cbiAgICApIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLm11bHRpQ29sdW1uS05OKFt2YWx1ZXNdLCBbZm5OYW1lXSwgbk5laWdoYm91cnMsIFtvcHRzXSwgWzFdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbXVsdGlDb2x1bW5LTk4odmFsdWVzOiBBcnJheTxBcnJheTxhbnk+PiwgZm5OYW1lczogS25vd25NZXRyaWNzW10sIG5OZWlnaGJvdXJzOiBudW1iZXIgPSAxNSxcbiAgICAgIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fVtdLCB3ZWlnaHRzOiBudW1iZXJbXSxcbiAgICAgIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kID0gRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMuRVVDTElERUFOXG4gICAgKSB7XG4gICAgICBpZiAodmFsdWVzLmxlbmd0aCAhPT0gZm5OYW1lcy5sZW5ndGggfHwgdmFsdWVzLmxlbmd0aCAhPT0gb3B0cy5sZW5ndGggfHwgdmFsdWVzLmxlbmd0aCAhPT0gd2VpZ2h0cy5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmFsdWVzLCBkaXN0YW5jZSBmdW5jdGlvbnMsIG9wdGlvbnMgYW5kIHdlaWdodHMgYXJyYXlzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aCcpO1xuXG4gICAgICBpZiAodmFsdWVzLnNvbWUoKHYpID0+IHYubGVuZ3RoICE9PSB2YWx1ZXNbMF0ubGVuZ3RoKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbGwgdmFsdWVzIGFycmF5cyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGgnKTtcblxuICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlc1swXS5sZW5ndGggKiAodmFsdWVzWzBdLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IE1hdGguZmxvb3IobWF0U2l6ZSAvIHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgIGNvbnN0IHByb21pc2VzID1cbiAgICAgICAgbmV3IEFycmF5PFByb21pc2U8S25uUmVzdWx0Pj4odGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgY29uc3Qgd29ya2VycyA9IG5ldyBBcnJheSh0aGlzLl93b3JrZXJDb3VudClcbiAgICAgICAgLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBXb3JrZXIobmV3IFVSTCgnLi9rbm4td29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSkpO1xuICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgdGhpcy5fd29ya2VyQ291bnQ7IGlkeCsrKSB7XG4gICAgICAgIHByb21pc2VzW2lkeF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZVdvcmtlciwgcmVqZWN0V29ya2VyKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSBpZHggKiBjaHVua1NpemU7XG4gICAgICAgICAgY29uc3QgZW5kSWR4ID0gaWR4ID09PSB0aGlzLl93b3JrZXJDb3VudCAtIDEgPyBtYXRTaXplIDogKGlkeCArIDEpICogY2h1bmtTaXplO1xuICAgICAgICAgIGlmIChlbmRJZHggPD0gc3RhcnRJZHgpXG4gICAgICAgICAgICByZXNvbHZlV29ya2VyKHtrbm5EaXN0YW5jZXM6IG5ldyBBcnJheSgwKSwga25uSW5kZXhlczogbmV3IEFycmF5KDApfSk7XG4gICAgICAgICAgd29ya2Vyc1tpZHhdLnBvc3RNZXNzYWdlKHt2YWx1ZXMsIHN0YXJ0SWR4LCBlbmRJZHgsIGZuTmFtZXMsIG9wdHMsIG5OZWlnaGJvdXJzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZH0pO1xuICAgICAgICAgIHdvcmtlcnNbaWR4XS5vbm1lc3NhZ2UgPSAoe2RhdGE6IHtlcnJvciwga25uRGlzdGFuY2VzLCBrbm5JbmRleGVzfX0pOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgIHJlamVjdFdvcmtlcihlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoe2tubkRpc3RhbmNlcywga25uSW5kZXhlc30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgY29uc3Qga25uUmVzOiBLbm5SZXN1bHQgPSB7XG4gICAgICAgIGtubkRpc3RhbmNlczogbmV3IEFycmF5KHZhbHVlc1swXS5sZW5ndGgpLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBBcnJheTxudW1iZXI+KG5OZWlnaGJvdXJzKS5maWxsKDk5OTk5KSksXG4gICAgICAgIGtubkluZGV4ZXM6IG5ldyBBcnJheSh2YWx1ZXNbMF0ubGVuZ3RoKS5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgQXJyYXk8bnVtYmVyPihuTmVpZ2hib3VycykuZmlsbCgtMSkpfTtcbiAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXNbMF0ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlcy5rbm5EaXN0YW5jZXNbaV0/Lmxlbmd0aCA/PyAwOyArK2opXG4gICAgICAgICAgICBpbnNlcnRTbWFsbGVyKGtublJlcy5rbm5EaXN0YW5jZXNbaV0sIGtublJlcy5rbm5JbmRleGVzW2ldLCByZXMua25uRGlzdGFuY2VzW2ldW2pdLCByZXMua25uSW5kZXhlc1tpXVtqXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBrbm5SZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFNhbXBsZURpc3RhbmNlczxUPih2YWx1ZXM6IEFycmF5PFQ+LCBmbk5hbWU6IEtub3duTWV0cmljcyxcbiAgICAgIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fSA9IHt9KTogUHJvbWlzZTxGbG9hdDMyQXJyYXk+IHtcbiAgICAgIGNvbnN0IHRocmVzaG9sZFdvcmtlcnMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpLmZpbGwobnVsbClcbiAgICAgICAgLm1hcCgoKSA9PiBuZXcgV29ya2VyKG5ldyBVUkwoJy4vc3BhcnNlLW1hdHJpeC10aHJlc2hvbGQtd29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSkpO1xuICAgICAgLy8gZGF0YSBtYXkgYmUgc29ydGVkIGJ5IGNsdXN0ZXJzLCB3aGljaCB3aWxsIGhpbmRlciB0aGUgcmFuZG9tIHNhbXBsaW5nXG4gICAgICAvLyBzbyB3ZSBzaHVmZmxlIGl0IGZpcnN0XG4gICAgICBjb25zdCBzaHVmZmxlZFZhbHVlcyA9IHZhbHVlcy5zbGljZSgpO1xuICAgICAgZm9yIChsZXQgaSA9IHNodWZmbGVkVmFsdWVzLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgICAgICBbc2h1ZmZsZWRWYWx1ZXNbaV0sIHNodWZmbGVkVmFsdWVzW2pdXSA9IFtzaHVmZmxlZFZhbHVlc1tqXSwgc2h1ZmZsZWRWYWx1ZXNbaV1dO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtYXRTaXplID0gdmFsdWVzLmxlbmd0aCAqICh2YWx1ZXMubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgICBjb25zdCBjaHVua1NpemUgPSBNYXRoLmZsb29yKG1hdFNpemUgLyB0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICAgIGNvbnN0IG1heFNhbXBsZVNpemUgPSAxXzAwMF8wMDA7XG4gICAgICAgIGNvbnN0IHNhbXBsZVNpc2UgPSBNYXRoLm1heChNYXRoLm1pbihtYXRTaXplIC8gMTAwMCwgbWF4U2FtcGxlU2l6ZSksIE1hdGgubWluKG1hdFNpemUsIG1heFNhbXBsZVNpemUpKTtcbiAgICAgICAgY29uc3QgdGVzdFNldFNpemVQZXJXb3JrZXIgPSBNYXRoLmZsb29yKHNhbXBsZVNpc2UgLyB0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICAgIGNvbnN0IHRQcm9taXNlcyA9IG5ldyBBcnJheTxQcm9taXNlPHtkaXN0YW5jZTogRmxvYXQzMkFycmF5fT4+KHRoaXMuX3dvcmtlckNvdW50KTtcblxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCB0aGlzLl93b3JrZXJDb3VudDsgaWR4KyspIHtcbiAgICAgICAgICB0UHJvbWlzZXNbaWR4XSA9IG5ldyBQcm9taXNlKChyZXNvbHZlV29ya2VyLCByZWplY3RXb3JrZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gaWR4ICogY2h1bmtTaXplO1xuICAgICAgICAgICAgY29uc3QgZW5kSWR4ID0gaWR4ID09PSB0aGlzLl93b3JrZXJDb3VudCAtIDEgPyBtYXRTaXplIDogKGlkeCArIDEpICogY2h1bmtTaXplO1xuICAgICAgICAgICAgdGhyZXNob2xkV29ya2Vyc1tpZHhdLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgdmFsdWVzOiBzaHVmZmxlZFZhbHVlcywgc3RhcnRJZHgsIGVuZElkeCwgc2FtcGxlTGVuZ3RoOiB0ZXN0U2V0U2l6ZVBlcldvcmtlciwgZm5OYW1lLCBvcHRzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocmVzaG9sZFdvcmtlcnNbaWR4XS5vbm1lc3NhZ2UgPSAoe2RhdGE6IHtlcnJvciwgZGlzdGFuY2V9fSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICB0aHJlc2hvbGRXb3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgIGlmIChlcnJvcikgcmVqZWN0V29ya2VyKGVycm9yKTsgZWxzZVxuICAgICAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoe2Rpc3RhbmNlfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHRQcm9taXNlcyk7XG4gICAgICAgIGNvbnN0IGZ1bGxTaXplID0gcmVzdWx0cy5yZWR1Y2UoKGFjYywgdmFsKSA9PiBhY2MgKyB2YWwuZGlzdGFuY2UubGVuZ3RoLCAwKTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBuZXcgRmxvYXQzMkFycmF5KGZ1bGxTaXplKTtcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICBkaXN0YW5jZS5zZXQocmVzLmRpc3RhbmNlLCBvZmZzZXQpO1xuICAgICAgICAgIG9mZnNldCArPSByZXMuZGlzdGFuY2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGRpc3RhbmNlLnNvcnQoKTtcblxuICAgICAgICByZXR1cm4gZGlzdGFuY2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocmVzaG9sZFdvcmtlcnM/LmZvckVhY2goKHcpID0+IHc/LnRlcm1pbmF0ZSgpKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoMSkuZmlsbCgwLjUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0TWluaW1hbFRocmVzaG9sZDxUPih2YWx1ZXM6IEFycmF5PFQ+LCBmbk5hbWU6IEtub3duTWV0cmljcywgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9ID0ge30pIHtcbiAgICAgIC8vV2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIG1pbmltYWwgdGhyZXNob2xkIGZpcnN0LFxuICAgICAgLy9pbiBvcmRlciB0byBnZXQgbWF0cml4IHN1Y2ggdGhhdCBpdCBkb2VzIG5vdCBleGNlZWQgdGhlIG1heGltdW0gc2l6ZSBvZiAxR0JcbiAgICAgIC8vd2UgaGF2ZSAzIHJldHVybiBhcnJheXMsIGVhY2ggNCBiaXRlcyBwZXIgZWxlbWVudCwgc28gaWYgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbWF0cml4IGlzIDFHQixcbiAgICAgIGNvbnN0IG1heFNwYXJzZU1hdHJpeFNpemUgPSA3MF8wMDBfMDAwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlcy5sZW5ndGggKiAodmFsdWVzLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBhd2FpdCB0aGlzLmdldFNhbXBsZURpc3RhbmNlcyh2YWx1ZXMsIGZuTmFtZSwgb3B0cyk7XG4gICAgICAgIGNvbnN0IGZyYWN0aW9uSW5kZXggPSBNYXRoLmZsb29yKG1heFNwYXJzZU1hdHJpeFNpemUgLyBtYXRTaXplICogZGlzdGFuY2UubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdGhyZXNob2xkID0gMSAtIGRpc3RhbmNlW2ZyYWN0aW9uSW5kZXhdO1xuICAgICAgICAvLyB0aHJlc2hvbGQgPSBNYXRoLm1heCh0aHJlc2hvbGQsIDAuMyk7XG4gICAgICAgIHJldHVybiB0aHJlc2hvbGQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIHJldHVybiAwLjU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjYWxjU3luYzxUPihcbiAgICAgIHZhbHVlczogQXJyYXk8VD4gfCBBcnJheUxpa2U8VD4sIGZuTmFtZTogS25vd25NZXRyaWNzLCBkaXN0YW5jZUZuOiBGdW5jdGlvbiwgdGhyZXNob2xkOiBudW1iZXJcbiAgICApIHtcbiAgICAgIGNvbnN0IGk6IG51bWJlcltdID0gW107XG4gICAgICBjb25zdCBqOiBudW1iZXJbXSA9IFtdO1xuICAgICAgY29uc3QgZGlzdGFuY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgbGV0IGNudCA9IDA7XG4gICAgICBsZXQgbWkgPSAwO1xuICAgICAgbGV0IG1qID0gMDtcbiAgICAgIGNvbnN0IGZ1bGxTaXplID0gdmFsdWVzLmxlbmd0aCAqICh2YWx1ZXMubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgd2hpbGUgKGNudCA8IGZ1bGxTaXplKSB7XG4gICAgICAgIC8vY29uc3QgdmFsdWUgPSBzZXExTGlzdFttaV0gJiYgc2VxMUxpc3RbbWpdID8gaGFtbWluZyhzZXExTGlzdFttaV0sIHNlcTFMaXN0W21qXSkgOiAwO1xuICAgICAgICBjb25zdCB2YWx1ZSA9ICFpc05pbCh2YWx1ZXNbbWldKSAmJiAhaXNOaWwodmFsdWVzW21qXSkgP1xuICAgICAgICAgIGRpc3RhbmNlRm4odmFsdWVzW21pXSwgdmFsdWVzW21qXSkgOiAxO1xuICAgICAgICBjb25zdCBzaW1pbGFyaXR5ID1cbiAgICAgICAgICBPYmplY3QudmFsdWVzKEJpdEFycmF5TWV0cmljc05hbWVzKS5zb21lKChhKSA9PiBhID09PSBmbk5hbWUpID8gZ2V0U2ltaWxhcml0eUZyb21EaXN0YW5jZSh2YWx1ZSkgOiAxIC0gdmFsdWU7XG4gICAgICAgIGlmIChzaW1pbGFyaXR5ID49IHRocmVzaG9sZCkge1xuICAgICAgICAgIGkucHVzaChtaSk7XG4gICAgICAgICAgai5wdXNoKG1qKTtcbiAgICAgICAgICBkaXN0YW5jZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY250Kys7XG4gICAgICAgIG1qKys7XG4gICAgICAgIGlmIChtaiA9PT0gdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgIG1pKys7XG4gICAgICAgICAgbWogPSBtaSArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaUFycmF5ID0gbmV3IEludDMyQXJyYXkoaSk7XG4gICAgICBjb25zdCBqQXJyYXkgPSBuZXcgSW50MzJBcnJheShqKTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGRpc3RhbmNlcyk7XG5cbiAgICAgIHJldHVybiB7aTogaUFycmF5LCBqOiBqQXJyYXksIGRpc3RhbmNlOiBkaXN0YW5jZUFycmF5fTtcbiAgICB9XG59XG4iXX0=","import { Vector } from '@datagrok-libraries/utils/src/type-declarations';\nimport { TSNE } from '@keckelt/tsne';\nimport { AvailableMetrics, Measure, isBitArrayMetric } from '../typed-metrics';\nimport { DistanceMatrixService, distanceMatrixProxy } from '../distance-matrix';\nimport { getAggregationFunction } from '../distance-matrix/utils';\nimport { UMAP } from '../umap';\nimport { assert, transposeMatrix } from '@datagrok-libraries/utils/src/vector-operations';\nimport { SparseMatrixService } from '../distance-matrix/sparse-matrix-service';\nimport BitArray from '@datagrok-libraries/utils/src/bit-array';\nclass MultiColumnReducer {\n data;\n weights;\n aggregationMethod;\n constructor(options) {\n this.data = options.data;\n this.weights = options.weights;\n this.aggregationMethod = options.aggregationMethod;\n }\n}\nclass MultiTSNEReducer extends MultiColumnReducer {\n reducer;\n iterations;\n distanceFnames;\n distanceFns;\n distanceFnArgs;\n /**\n * Creates an instance of TSNEReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof TSNEReducer\n */\n constructor(options) {\n super(options);\n this.reducer = new TSNE(options);\n this.iterations = options?.iterations ?? 100;\n this.distanceFnames = options.distanceFnames;\n this.distanceFns = options.distanceFns;\n this.distanceFnArgs = options.distanceFnArgs;\n }\n /**\n * Embeds the data given into the two-dimensional space using t-SNE method.\\\n * @param {boolean} [parallelDistanceWorkers] Whether to use parallel distance workers.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n */\n async transform() {\n if (this.data[0].length > 10000)\n throw new Error('Maximum number of samples for T-SNE is 10000');\n const matrixService = new DistanceMatrixService(true, false);\n try {\n const aggregate = getAggregationFunction(this.aggregationMethod, this.weights);\n const distances = [];\n for (let i = 0; i < this.data.length; ++i) {\n const dist = await matrixService.calc(this.data[i], this.distanceFnames[i], false, this.distanceFnArgs[i]);\n distances.push(dist);\n }\n const distance = new Float32Array(distances[0].length).fill(0);\n for (let i = 0; i < distances[0].length; ++i)\n distance[i] = aggregate(distances.map((d) => d[i]));\n const matrixProxy = distanceMatrixProxy(distance, this.data[0].length);\n this.reducer.initDataDist(matrixProxy);\n for (let i = 0; i < this.iterations; ++i)\n this.reducer.step(); // every time you call this, solution gets better\n matrixService.terminate();\n return this.reducer.getSolution();\n }\n catch (e) {\n matrixService.terminate();\n throw e;\n }\n }\n}\nclass MultiUMAPReducer extends MultiColumnReducer {\n reducer;\n distanceFnames;\n distanceFns;\n vectors;\n progressFunc;\n distanceFnArgs;\n /**\n * Creates an instance of UMAPReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof UMAPReducer\n */\n constructor(options) {\n super(options);\n assert('distanceFnames' in options);\n assert('distanceFns' in options);\n this.distanceFnArgs = options.distanceFnArgs;\n this.distanceFns = options.distanceFns;\n this.progressFunc = options.progressFunc;\n this.distanceFnames = options.distanceFnames;\n //Umap uses vector indexing, so we need to create an array of vectors as indeces.\n this.vectors = new Array(this.data[0].length).fill(0).map((_, i) => i);\n if (this.data[0].length < 15)\n options.nNeighbors = this.data[0].length - 1;\n this.reducer = new UMAP(options);\n // this.reducer.distanceFn = this._encodedDistance.bind(this);\n }\n /**\n * Embeds the data given into the two-dimensional space using UMAP method.\n * @param {boolean} [_parallelDistanceWorkers] Whether to use parallel distance matrix workers.\n * @return {any} Cartesian coordinate of this embedding.\n */\n async transform(_parallelDistanceWorkers) {\n console.time('knn graph');\n const knnRes = await new SparseMatrixService()\n .multiColumnKNN(this.data, this.distanceFnames, this.reducer.neighbors, this.distanceFnArgs, this.weights, this.aggregationMethod);\n console.timeEnd('knn graph');\n this.reducer.setPrecomputedKNN(knnRes.knnIndexes, knnRes.knnDistances);\n // needed so that garbage collector can free memory from distance matrix\n await new Promise((resolve) => {\n setTimeout(() => {\n resolve();\n }, 300);\n });\n const embedding = await this.reducer.fitAsync(this.vectors, (epoc) => {\n if (this.progressFunc)\n this.progressFunc(epoc, this.reducer.getNEpochs(), this.reducer.getEmbedding());\n });\n function arrayCast2Coordinates(data) {\n return new Array(data.length).fill(0).map((_, i) => (Vector.from(data[i])));\n }\n return arrayCast2Coordinates(embedding);\n }\n}\nconst AvailableReducers = {\n 'UMAP': MultiUMAPReducer,\n 't-SNE': MultiTSNEReducer,\n};\nexport class MultiColDimReducer {\n reducer;\n /**\n * Creates an instance of DimensionalityReducer.\n * @param {any[]} data Vectors to embed.\n * @param {KnownMethods} method Embedding method to be applied\n * @param {KnownMetrics} metric Distance metric to be computed between each of the vectors.\n * @param {Options} [options] Options to pass to the implementing embedders.\n * @memberof DimensionalityReducer\n */\n constructor(data, method, metrics, weights, distanceAggregation, options) {\n const measures = [];\n for (let idx = 0; idx < metrics.length; ++idx) {\n const measure = new Measure(metrics[idx]).getMeasure(options.distanceFnArgs[idx]);\n measures.push(measure);\n let bitArrayLength = 2048;\n for (let i = 0; i < data[idx].length; ++i) {\n if (data[idx][i] && data[idx][i]._length) {\n bitArrayLength = data[idx][i]._length;\n break;\n }\n }\n if (isBitArrayMetric(metrics[idx])) {\n for (let i = 0; i < data[idx].length; ++i) {\n if (data[idx][i] && data[idx][i]._data)\n data[idx][i] = new BitArray(data[idx][i]._data, data[idx][i]._length);\n else\n data[idx][i] = new BitArray(bitArrayLength);\n }\n }\n }\n if (method == 'UMAP') {\n this.reducer = new MultiUMAPReducer({\n data: data,\n distanceFnames: metrics,\n distanceFns: measures,\n distanceFnArgs: options.distanceFnArgs,\n weights: weights,\n aggregationMethod: distanceAggregation,\n ...options\n });\n }\n else if (method == 't-SNE') {\n this.reducer = new MultiTSNEReducer({\n data: data,\n distanceFnames: metrics,\n distanceFns: measures,\n distanceFnArgs: options.distanceFnArgs,\n weights: weights,\n aggregationMethod: distanceAggregation,\n ...options\n });\n }\n }\n /**\n * Embeds the data given into the two-dimensional space using the chosen method.\n *\n * @param {boolean} transpose Whether to transform coordinates to have columns-first orientation.\n * @param {boolean} parallelDistanceWorkers Whether to use parallel distance computation.\n * @throws {Error} If the embedding method was not found.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n * @memberof DimensionalityReducer\n */\n async transform(transpose = false) {\n if (this.reducer === undefined)\n throw new Error('Reducer was not defined.');\n let embedding = await this.reducer.transform();\n if (transpose)\n embedding = transposeMatrix(embedding);\n return embedding;\n }\n /**\n * Returns metrics available by type.\n *\n * @param {AvailableDataTypes} typeName type name\n * @return {string[]} Metric names which expects the given data type\n * @memberof DimensionalityReducer\n */\n static availableMetricsByType(typeName) {\n return Object.keys(AvailableMetrics[typeName]);\n }\n /**\n * Returns dimensionality reduction methods available.\n *\n * @readonly\n * @memberof DimensionalityReducer\n */\n static get availableMethods() {\n return Object.keys(AvailableReducers);\n }\n /**\n * Returns metrics available.\n *\n * @readonly\n * @memberof DimensionalityReducer\n */\n static get availableMetrics() {\n let ans = [];\n Object.values(AvailableMetrics).forEach((obj) => {\n const array = Object.values(obj);\n ans = [...ans, ...array];\n });\n return ans;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktY29sdW1uLWRpbS1yZWR1Y2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibXVsdGktY29sdW1uLWRpbS1yZWR1Y2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBK0MsTUFBTSxFQUFVLE1BQy9ELGlEQUFpRCxDQUFDO0FBQ3pELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFxQixnQkFBZ0IsRUFBZ0IsT0FBTyxFQUFFLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDL0csT0FBTyxFQUFDLHFCQUFxQixFQUFFLG1CQUFtQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDOUUsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFaEUsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM3QixPQUFPLEVBQUMsTUFBTSxFQUFFLGVBQWUsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ3hGLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBRTdFLE9BQU8sUUFBUSxNQUFNLHlDQUF5QyxDQUFDO0FBMkIvRCxNQUFlLGtCQUFrQjtJQUNuQixJQUFJLENBQVk7SUFDaEIsT0FBTyxDQUFXO0lBQ2xCLGlCQUFpQixDQUE0QjtJQUN2RCxZQUFZLE9BQWdCO1FBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDL0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztJQUNyRCxDQUFDO0NBS0o7QUFFRCxNQUFNLGdCQUFpQixTQUFRLGtCQUFrQjtJQUNuQyxPQUFPLENBQU87SUFDZCxVQUFVLENBQVM7SUFDbkIsY0FBYyxDQUFpQjtJQUMvQixXQUFXLENBQWlDO0lB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QztJQUNiLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29vcmRpbmF0ZXMsIERpc3RhbmNlTWV0cmljLCBNYXRyaXgsIE9wdGlvbnMsIFZlY3RvciwgVmVjdG9yc31cbiAgZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdHlwZS1kZWNsYXJhdGlvbnMnO1xuaW1wb3J0IHtUU05FfSBmcm9tICdAa2Vja2VsdC90c25lJztcbmltcG9ydCB7QXZhaWxhYmxlRGF0YVR5cGVzLCBBdmFpbGFibGVNZXRyaWNzLCBLbm93bk1ldHJpY3MsIE1lYXN1cmUsIGlzQml0QXJyYXlNZXRyaWN9IGZyb20gJy4uL3R5cGVkLW1ldHJpY3MnO1xuaW1wb3J0IHtEaXN0YW5jZU1hdHJpeFNlcnZpY2UsIGRpc3RhbmNlTWF0cml4UHJveHl9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeCc7XG5pbXBvcnQge2dldEFnZ3JlZ2F0aW9uRnVuY3Rpb259IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC91dGlscyc7XG5pbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2R9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC90eXBlcyc7XG5pbXBvcnQge1VNQVB9IGZyb20gJy4uL3VtYXAnO1xuaW1wb3J0IHthc3NlcnQsIHRyYW5zcG9zZU1hdHJpeH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdmVjdG9yLW9wZXJhdGlvbnMnO1xuaW1wb3J0IHtTcGFyc2VNYXRyaXhTZXJ2aWNlfSBmcm9tICcuLi9kaXN0YW5jZS1tYXRyaXgvc3BhcnNlLW1hdHJpeC1zZXJ2aWNlJztcbmltcG9ydCB7RGltUmVkdWN0aW9uTWV0aG9kc30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgQml0QXJyYXkgZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvYml0LWFycmF5JztcbmV4cG9ydCBpbnRlcmZhY2UgSVVNQVBPcHRpb25zIHtcbiAgICBsZWFybmluZ1JhdGU/OiBudW1iZXI7XG4gICAgbkNvbXBvbmVudHM/OiBudW1iZXI7XG4gICAgbkVwb2Nocz86IG51bWJlcjtcbiAgICBuTmVpZ2hib3JzPzogbnVtYmVyO1xuICAgIHNwcmVhZD86IG51bWJlcjtcbiAgICBtaW5EaXN0PzogbnVtYmVyO1xuICAgIHByb2dyZXNzRnVuYz86IChlcG9jOiBudW1iZXIsIGVwb2Noc0xlbmd0aDogbnVtYmVyLCBlbWJlZGRpbmdzOiBudW1iZXJbXVtdKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUU05FT3B0aW9ucyB7XG4gICAgZXBzaWxvbj86IG51bWJlcjtcbiAgICBwZXJwbGV4aXR5PzogbnVtYmVyO1xuICAgIGRpbT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGltUmVkdWN0aW9uUGFyYW0ge1xuICAgIHVpTmFtZTogc3RyaW5nO1xuICAgIHZhbHVlOiBudW1iZXIgfCBudWxsO1xuICAgIHRvb2x0aXA6IHN0cmluZztcbiAgICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgICBtaW4/OiBudW1iZXI7XG4gICAgbWF4PzogbnVtYmVyO1xuICAgIHN0ZXA/OiBudW1iZXI7XG59XG5cbmFic3RyYWN0IGNsYXNzIE11bHRpQ29sdW1uUmVkdWNlciB7XG4gICAgcHJvdGVjdGVkIGRhdGE6IFZlY3RvcnNbXTtcbiAgICBwcm90ZWN0ZWQgd2VpZ2h0czogbnVtYmVyW107XG4gICAgcHJvdGVjdGVkIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgIHRoaXMuZGF0YSA9IG9wdGlvbnMuZGF0YTtcbiAgICAgIHRoaXMud2VpZ2h0cyA9IG9wdGlvbnMud2VpZ2h0cztcbiAgICAgIHRoaXMuYWdncmVnYXRpb25NZXRob2QgPSBvcHRpb25zLmFnZ3JlZ2F0aW9uTWV0aG9kO1xuICAgIH1cblxuICAgIC8qKiBFbWJlZHMgdGhlIGRhdGEgZ2l2ZW4gaW50byB0aGUgdHdvLWRpbWVuc2lvbmFsIHNwYWNlLlxuICAgICAqIEByZXR1cm4ge2FueX0gQ2FydGVzaWFuIGNvb3JkaW5hdGUgb2YgdGhpcyBlbWJlZGRpbmcgYW5kIGRpc3RhbmNlIG1hdHJpeCB3aGVyZSBhcHBsaWNhYmxlLiAqL1xuICAgIGFic3RyYWN0IHRyYW5zZm9ybSgpOiBQcm9taXNlPE1hdHJpeD47XG59XG5cbmNsYXNzIE11bHRpVFNORVJlZHVjZXIgZXh0ZW5kcyBNdWx0aUNvbHVtblJlZHVjZXIge1xuICAgIHByb3RlY3RlZCByZWR1Y2VyOiBUU05FO1xuICAgIHByb3RlY3RlZCBpdGVyYXRpb25zOiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIGRpc3RhbmNlRm5hbWVzOiBLbm93bk1ldHJpY3NbXTtcbiAgICBwcm90ZWN0ZWQgZGlzdGFuY2VGbnM6ICgoYTogYW55LCBiOiBhbnkpID0+IG51bWJlcilbXTtcbiAgICBwcm90ZWN0ZWQgZGlzdGFuY2VGbkFyZ3M6IHtbXzogc3RyaW5nXTogYW55fVtdO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBUU05FUmVkdWNlci5cbiAgICAgKiBAcGFyYW0ge09wdGlvbnN9IG9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBAbWVtYmVyb2YgVFNORVJlZHVjZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgIHRoaXMucmVkdWNlciA9IG5ldyBUU05FKG9wdGlvbnMpO1xuICAgICAgdGhpcy5pdGVyYXRpb25zID0gb3B0aW9ucz8uaXRlcmF0aW9ucyA/PyAxMDA7XG4gICAgICB0aGlzLmRpc3RhbmNlRm5hbWVzID0gb3B0aW9ucy5kaXN0YW5jZUZuYW1lcztcbiAgICAgIHRoaXMuZGlzdGFuY2VGbnMgPSBvcHRpb25zLmRpc3RhbmNlRm5zO1xuICAgICAgdGhpcy5kaXN0YW5jZUZuQXJncyA9IG9wdGlvbnMuZGlzdGFuY2VGbkFyZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1iZWRzIHRoZSBkYXRhIGdpdmVuIGludG8gdGhlIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyB0LVNORSBtZXRob2QuXFxcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwYXJhbGxlbERpc3RhbmNlV29ya2Vyc10gV2hldGhlciB0byB1c2UgcGFyYWxsZWwgZGlzdGFuY2Ugd29ya2Vycy5cbiAgICAgKiBAcmV0dXJuIHthbnl9IENhcnRlc2lhbiBjb29yZGluYXRlIG9mIHRoaXMgZW1iZWRkaW5nIGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdHJhbnNmb3JtKCk6IFByb21pc2U8TWF0cml4PiB7XG4gICAgICBpZiAodGhpcy5kYXRhWzBdLmxlbmd0aCA+IDEwMDAwKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01heGltdW0gbnVtYmVyIG9mIHNhbXBsZXMgZm9yIFQtU05FIGlzIDEwMDAwJyk7XG4gICAgICBjb25zdCBtYXRyaXhTZXJ2aWNlID0gbmV3IERpc3RhbmNlTWF0cml4U2VydmljZSh0cnVlLCBmYWxzZSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBhZ2dyZWdhdGUgPSBnZXRBZ2dyZWdhdGlvbkZ1bmN0aW9uKHRoaXMuYWdncmVnYXRpb25NZXRob2QsIHRoaXMud2VpZ2h0cyk7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlczogQXJyYXk8RmxvYXQzMkFycmF5PiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGNvbnN0IGRpc3QgPSBhd2FpdCBtYXRyaXhTZXJ2aWNlLmNhbGModGhpcy5kYXRhW2ldLCB0aGlzLmRpc3RhbmNlRm5hbWVzW2ldLCBmYWxzZSwgdGhpcy5kaXN0YW5jZUZuQXJnc1tpXSk7XG4gICAgICAgICAgZGlzdGFuY2VzLnB1c2goZGlzdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBuZXcgRmxvYXQzMkFycmF5KGRpc3RhbmNlc1swXS5sZW5ndGgpLmZpbGwoMCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzdGFuY2VzWzBdLmxlbmd0aDsgKytpKVxuICAgICAgICAgIGRpc3RhbmNlW2ldID0gYWdncmVnYXRlKGRpc3RhbmNlcy5tYXAoKGQpID0+IGRbaV0pKTtcbiAgICAgICAgY29uc3QgbWF0cml4UHJveHkgPSBkaXN0YW5jZU1hdHJpeFByb3h5KGRpc3RhbmNlLCB0aGlzLmRhdGFbMF0ubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5yZWR1Y2VyLmluaXREYXRhRGlzdChtYXRyaXhQcm94eSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLml0ZXJhdGlvbnM7ICsraSlcbiAgICAgICAgICB0aGlzLnJlZHVjZXIuc3RlcCgpOyAvLyBldmVyeSB0aW1lIHlvdSBjYWxsIHRoaXMsIHNvbHV0aW9uIGdldHMgYmV0dGVyXG4gICAgICAgIG1hdHJpeFNlcnZpY2UudGVybWluYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZHVjZXIuZ2V0U29sdXRpb24oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbWF0cml4U2VydmljZS50ZXJtaW5hdGUoKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIE11bHRpVU1BUFJlZHVjZXIgZXh0ZW5kcyBNdWx0aUNvbHVtblJlZHVjZXIge1xuICAgIHByb3RlY3RlZCByZWR1Y2VyOiBVTUFQO1xuICAgIHByb3RlY3RlZCBkaXN0YW5jZUZuYW1lczogS25vd25NZXRyaWNzW107XG4gICAgcHJvdGVjdGVkIGRpc3RhbmNlRm5zOiBGdW5jdGlvbltdO1xuICAgIHByb3RlY3RlZCB2ZWN0b3JzOiBudW1iZXJbXTtcbiAgICBwcm90ZWN0ZWQgcHJvZ3Jlc3NGdW5jPzogKGVwb2M6IG51bWJlciwgZXBvY2hzTGVuZ3RoOiBudW1iZXIsIGVtYmVkZGluZ3M6IG51bWJlcltdW10pID0+IHZvaWQ7XG4gICAgcHJvdGVjdGVkIGRpc3RhbmNlRm5BcmdzOiB7W186IHN0cmluZ106IGFueX1bXTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFVNQVBSZWR1Y2VyLlxuICAgICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIEBtZW1iZXJvZiBVTUFQUmVkdWNlclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgYXNzZXJ0KCdkaXN0YW5jZUZuYW1lcycgaW4gb3B0aW9ucyk7XG4gICAgICBhc3NlcnQoJ2Rpc3RhbmNlRm5zJyBpbiBvcHRpb25zKTtcbiAgICAgIHRoaXMuZGlzdGFuY2VGbkFyZ3MgPSBvcHRpb25zLmRpc3RhbmNlRm5BcmdzO1xuICAgICAgdGhpcy5kaXN0YW5jZUZucyA9IG9wdGlvbnMuZGlzdGFuY2VGbnMhO1xuICAgICAgdGhpcy5wcm9ncmVzc0Z1bmMgPSBvcHRpb25zLnByb2dyZXNzRnVuYztcblxuICAgICAgdGhpcy5kaXN0YW5jZUZuYW1lcyA9IG9wdGlvbnMuZGlzdGFuY2VGbmFtZXMhO1xuICAgICAgLy9VbWFwIHVzZXMgdmVjdG9yIGluZGV4aW5nLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhbiBhcnJheSBvZiB2ZWN0b3JzIGFzIGluZGVjZXMuXG4gICAgICB0aGlzLnZlY3RvcnMgPSBuZXcgQXJyYXkodGhpcy5kYXRhWzBdLmxlbmd0aCkuZmlsbCgwKS5tYXAoKF8sIGkpID0+IGkpO1xuXG4gICAgICBpZiAodGhpcy5kYXRhWzBdLmxlbmd0aCA8IDE1KVxuICAgICAgICBvcHRpb25zLm5OZWlnaGJvcnMgPSB0aGlzLmRhdGFbMF0ubGVuZ3RoIC0gMTtcbiAgICAgIHRoaXMucmVkdWNlciA9IG5ldyBVTUFQKG9wdGlvbnMpO1xuICAgICAgLy8gdGhpcy5yZWR1Y2VyLmRpc3RhbmNlRm4gPSB0aGlzLl9lbmNvZGVkRGlzdGFuY2UuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWJlZHMgdGhlIGRhdGEgZ2l2ZW4gaW50byB0aGUgdHdvLWRpbWVuc2lvbmFsIHNwYWNlIHVzaW5nIFVNQVAgbWV0aG9kLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW19wYXJhbGxlbERpc3RhbmNlV29ya2Vyc10gV2hldGhlciB0byB1c2UgcGFyYWxsZWwgZGlzdGFuY2UgbWF0cml4IHdvcmtlcnMuXG4gICAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdHJhbnNmb3JtKF9wYXJhbGxlbERpc3RhbmNlV29ya2Vycz86IGJvb2xlYW4pOiBQcm9taXNlPE1hdHJpeD4ge1xuICAgICAgY29uc29sZS50aW1lKCdrbm4gZ3JhcGgnKTtcbiAgICAgIGNvbnN0IGtublJlcyA9IGF3YWl0IG5ldyBTcGFyc2VNYXRyaXhTZXJ2aWNlKClcbiAgICAgICAgLm11bHRpQ29sdW1uS05OKHRoaXMuZGF0YSwgdGhpcy5kaXN0YW5jZUZuYW1lcywgdGhpcy5yZWR1Y2VyLm5laWdoYm9ycyxcbiAgICAgICAgICB0aGlzLmRpc3RhbmNlRm5BcmdzLCB0aGlzLndlaWdodHMsIHRoaXMuYWdncmVnYXRpb25NZXRob2QpO1xuICAgICAgY29uc29sZS50aW1lRW5kKCdrbm4gZ3JhcGgnKTtcbiAgICAgIHRoaXMucmVkdWNlci5zZXRQcmVjb21wdXRlZEtOTihrbm5SZXMua25uSW5kZXhlcywga25uUmVzLmtubkRpc3RhbmNlcyk7XG5cbiAgICAgIC8vIG5lZWRlZCBzbyB0aGF0IGdhcmJhZ2UgY29sbGVjdG9yIGNhbiBmcmVlIG1lbW9yeSBmcm9tIGRpc3RhbmNlIG1hdHJpeFxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LCAzMDApO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVtYmVkZGluZyA9IGF3YWl0IHRoaXMucmVkdWNlci5maXRBc3luYyh0aGlzLnZlY3RvcnMsIChlcG9jKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnByb2dyZXNzRnVuYylcbiAgICAgICAgICB0aGlzLnByb2dyZXNzRnVuYyhlcG9jLCB0aGlzLnJlZHVjZXIuZ2V0TkVwb2NocygpLCB0aGlzLnJlZHVjZXIuZ2V0RW1iZWRkaW5nKCkpO1xuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIGFycmF5Q2FzdDJDb29yZGluYXRlcyhkYXRhOiBudW1iZXJbXVtdKTogQ29vcmRpbmF0ZXMge1xuICAgICAgICByZXR1cm4gbmV3IEFycmF5KGRhdGEubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaSkgPT4gKFZlY3Rvci5mcm9tKGRhdGFbaV0pKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcnJheUNhc3QyQ29vcmRpbmF0ZXMoZW1iZWRkaW5nKTtcbiAgICB9XG59XG5cbmNvbnN0IEF2YWlsYWJsZVJlZHVjZXJzID0ge1xuICAnVU1BUCc6IE11bHRpVU1BUFJlZHVjZXIsXG4gICd0LVNORSc6IE11bHRpVFNORVJlZHVjZXIsXG59O1xuXG5leHBvcnQgdHlwZSBLbm93bk1ldGhvZHMgPSBrZXlvZiB0eXBlb2YgQXZhaWxhYmxlUmVkdWNlcnM7XG5cbmV4cG9ydCBjbGFzcyBNdWx0aUNvbERpbVJlZHVjZXIge1xuICAgIHByaXZhdGUgcmVkdWNlcjogTXVsdGlDb2x1bW5SZWR1Y2VyIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIERpbWVuc2lvbmFsaXR5UmVkdWNlci5cbiAgICogQHBhcmFtIHthbnlbXX0gZGF0YSBWZWN0b3JzIHRvIGVtYmVkLlxuICAgKiBAcGFyYW0ge0tub3duTWV0aG9kc30gbWV0aG9kIEVtYmVkZGluZyBtZXRob2QgdG8gYmUgYXBwbGllZFxuICAgKiBAcGFyYW0ge0tub3duTWV0cmljc30gbWV0cmljIERpc3RhbmNlIG1ldHJpYyB0byBiZSBjb21wdXRlZCBiZXR3ZWVuIGVhY2ggb2YgdGhlIHZlY3RvcnMuXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgaW1wbGVtZW50aW5nIGVtYmVkZGVycy5cbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBBcnJheTxhbnlbXT4sIG1ldGhvZDogRGltUmVkdWN0aW9uTWV0aG9kcywgbWV0cmljczogS25vd25NZXRyaWNzW10sXG4gICAgICB3ZWlnaHRzOiBudW1iZXJbXSwgZGlzdGFuY2VBZ2dyZWdhdGlvbjogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCwgb3B0aW9uczogT3B0aW9ucykge1xuICAgICAgY29uc3QgbWVhc3VyZXM6IERpc3RhbmNlTWV0cmljW10gPSBbXTtcbiAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IG1ldHJpY3MubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICBjb25zdCBtZWFzdXJlID0gbmV3IE1lYXN1cmUobWV0cmljc1tpZHhdKS5nZXRNZWFzdXJlKG9wdGlvbnMuZGlzdGFuY2VGbkFyZ3NbaWR4XSk7XG4gICAgICAgIG1lYXN1cmVzLnB1c2gobWVhc3VyZSk7XG4gICAgICAgIGxldCBiaXRBcnJheUxlbmd0aCA9IDIwNDg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YVtpZHhdLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKGRhdGFbaWR4XVtpXSAmJiBkYXRhW2lkeF1baV0uX2xlbmd0aCkge1xuICAgICAgICAgICAgYml0QXJyYXlMZW5ndGggPSBkYXRhW2lkeF1baV0uX2xlbmd0aDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNCaXRBcnJheU1ldHJpYyhtZXRyaWNzW2lkeF0pKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhW2lkeF0ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChkYXRhW2lkeF1baV0gJiYgZGF0YVtpZHhdW2ldLl9kYXRhKVxuICAgICAgICAgICAgICBkYXRhW2lkeF1baV0gPSBuZXcgQml0QXJyYXkoZGF0YVtpZHhdW2ldLl9kYXRhLCBkYXRhW2lkeF1baV0uX2xlbmd0aCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIGRhdGFbaWR4XVtpXSA9IG5ldyBCaXRBcnJheShiaXRBcnJheUxlbmd0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXRob2QgPT0gJ1VNQVAnKSB7XG4gICAgICAgIHRoaXMucmVkdWNlciA9IG5ldyBNdWx0aVVNQVBSZWR1Y2VyKHtcbiAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgIGRpc3RhbmNlRm5hbWVzOiBtZXRyaWNzLFxuICAgICAgICAgIGRpc3RhbmNlRm5zOiBtZWFzdXJlcyxcbiAgICAgICAgICBkaXN0YW5jZUZuQXJnczogb3B0aW9ucy5kaXN0YW5jZUZuQXJncyxcbiAgICAgICAgICB3ZWlnaHRzOiB3ZWlnaHRzLFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uTWV0aG9kOiBkaXN0YW5jZUFnZ3JlZ2F0aW9uLFxuICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PSAndC1TTkUnKSB7XG4gICAgICAgIHRoaXMucmVkdWNlciA9IG5ldyBNdWx0aVRTTkVSZWR1Y2VyKHtcbiAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgIGRpc3RhbmNlRm5hbWVzOiBtZXRyaWNzLFxuICAgICAgICAgIGRpc3RhbmNlRm5zOiBtZWFzdXJlcyxcbiAgICAgICAgICBkaXN0YW5jZUZuQXJnczogb3B0aW9ucy5kaXN0YW5jZUZuQXJncyxcbiAgICAgICAgICB3ZWlnaHRzOiB3ZWlnaHRzLFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uTWV0aG9kOiBkaXN0YW5jZUFnZ3JlZ2F0aW9uLFxuICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgdGhlIGNob3NlbiBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdHJhbnNwb3NlIFdoZXRoZXIgdG8gdHJhbnNmb3JtIGNvb3JkaW5hdGVzIHRvIGhhdmUgY29sdW1ucy1maXJzdCBvcmllbnRhdGlvbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbGxlbERpc3RhbmNlV29ya2VycyBXaGV0aGVyIHRvIHVzZSBwYXJhbGxlbCBkaXN0YW5jZSBjb21wdXRhdGlvbi5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBlbWJlZGRpbmcgbWV0aG9kIHdhcyBub3QgZm91bmQuXG4gICAqIEByZXR1cm4ge2FueX0gQ2FydGVzaWFuIGNvb3JkaW5hdGUgb2YgdGhpcyBlbWJlZGRpbmcgYW5kIGRpc3RhbmNlIG1hdHJpeCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgKiBAbWVtYmVyb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyXG4gICAqL1xuICAgIHB1YmxpYyBhc3luYyB0cmFuc2Zvcm0odHJhbnNwb3NlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPE1hdHJpeD4ge1xuICAgICAgaWYgKHRoaXMucmVkdWNlciA9PT0gdW5kZWZpbmVkKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZHVjZXIgd2FzIG5vdCBkZWZpbmVkLicpO1xuXG4gICAgICBsZXQgZW1iZWRkaW5nID0gYXdhaXQgdGhpcy5yZWR1Y2VyLnRyYW5zZm9ybSgpO1xuXG4gICAgICBpZiAodHJhbnNwb3NlKVxuICAgICAgICBlbWJlZGRpbmcgPSB0cmFuc3Bvc2VNYXRyaXgoZW1iZWRkaW5nKTtcblxuICAgICAgcmV0dXJuIGVtYmVkZGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICogUmV0dXJucyBtZXRyaWNzIGF2YWlsYWJsZSBieSB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0ge0F2YWlsYWJsZURhdGFUeXBlc30gdHlwZU5hbWUgdHlwZSBuYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBNZXRyaWMgbmFtZXMgd2hpY2ggZXhwZWN0cyB0aGUgZ2l2ZW4gZGF0YSB0eXBlXG4gICAqIEBtZW1iZXJvZiBEaW1lbnNpb25hbGl0eVJlZHVjZXJcbiAgICovXG4gICAgc3RhdGljIGF2YWlsYWJsZU1ldHJpY3NCeVR5cGUodHlwZU5hbWU6IEF2YWlsYWJsZURhdGFUeXBlcykge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKEF2YWlsYWJsZU1ldHJpY3NbdHlwZU5hbWVdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICogUmV0dXJucyBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24gbWV0aG9kcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEByZWFkb25seVxuICAgKiBAbWVtYmVyb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyXG4gICAqL1xuICAgIHN0YXRpYyBnZXQgYXZhaWxhYmxlTWV0aG9kcygpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVSZWR1Y2Vycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAqIFJldHVybnMgbWV0cmljcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEByZWFkb25seVxuICAgKiBAbWVtYmVyb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyXG4gICAqL1xuICAgIHN0YXRpYyBnZXQgYXZhaWxhYmxlTWV0cmljcygpIHtcbiAgICAgIGxldCBhbnM6IHN0cmluZ1tdID0gW107XG4gICAgICBPYmplY3QudmFsdWVzKEF2YWlsYWJsZU1ldHJpY3MpLmZvckVhY2goKG9iaikgPT4ge1xuICAgICAgICBjb25zdCBhcnJheSA9IE9iamVjdC52YWx1ZXMob2JqKTtcbiAgICAgICAgYW5zID0gWy4uLmFucywgLi4uYXJyYXldO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYW5zO1xuICAgIH1cbn1cbiJdfQ==","/** Proxy for DistanceMatrix class. Allows to index matrix as matrix[i][j]\n * Note: much slower than direct indexing, but still much faster than recalculating distances.\n * will be used for T-SNE mainly.\n * @param {Float32Array}condensedArray - array of distances between all pairs of objects\n * @param {number}size - number of comparebles in matrix\n * @return {Float32Array} - proxy for condensedArray\n*/\nexport function distanceMatrixProxy(condensedArray, size) {\n const linearFunc = dmLinearIndex(size);\n function linearIndex(i, j) {\n const iNum = Number(i);\n const jNum = Number(j);\n return linearFunc(iNum, jNum);\n }\n function idx2Handler(idx1) {\n return ({\n get(target, idx2, _receiver) {\n if (idx1 === idx2)\n return 0;\n const linearIdx = Number(idx1) > Number(idx2) ? linearIndex(idx2, idx1) : linearIndex(idx1, idx2);\n return target[linearIdx];\n },\n });\n }\n const idx1Handler = {\n get(target, idx1, _receiver) {\n if (idx1 === 'length')\n return size;\n return new Proxy(target, idx2Handler(idx1));\n },\n };\n return new Proxy(condensedArray, idx1Handler);\n}\nexport function dmLinearIndex(size) {\n return (i, j) => size * i + j - Math.floor(((i + 2) * (i + 1)) / 2);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7O0VBTUU7QUFDRixNQUFNLFVBQVUsbUJBQW1CLENBQUMsY0FBNEIsRUFBRSxJQUFZO0lBQzVFLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxTQUFTLFdBQVcsQ0FBQyxDQUFrQixFQUFFLENBQWtCO1FBQ3pELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxTQUFTLFdBQVcsQ0FBQyxJQUFxQjtRQUN4QyxPQUFPLENBQ0w7WUFDRSxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTO2dCQUN6QixJQUFJLElBQUksS0FBSyxJQUFJO29CQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUM1QixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNsRyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzQixDQUFDO1NBQ0YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sV0FBVyxHQUErQjtRQUM5QyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTO1lBQ3pCLElBQUksSUFBSSxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDbkMsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQztLQUNGLENBQUM7SUFFRixPQUFPLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFZO0lBQ3hDLE9BQU8sQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5cbi8qKiBQcm94eSBmb3IgRGlzdGFuY2VNYXRyaXggY2xhc3MuIEFsbG93cyB0byBpbmRleCBtYXRyaXggYXMgbWF0cml4W2ldW2pdXG4gKiBOb3RlOiBtdWNoIHNsb3dlciB0aGFuIGRpcmVjdCBpbmRleGluZywgYnV0IHN0aWxsIG11Y2ggZmFzdGVyIHRoYW4gcmVjYWxjdWxhdGluZyBkaXN0YW5jZXMuXG4gKiB3aWxsIGJlIHVzZWQgZm9yIFQtU05FIG1haW5seS5cbiAqIEBwYXJhbSB7RmxvYXQzMkFycmF5fWNvbmRlbnNlZEFycmF5IC0gYXJyYXkgb2YgZGlzdGFuY2VzIGJldHdlZW4gYWxsIHBhaXJzIG9mIG9iamVjdHNcbiAqIEBwYXJhbSB7bnVtYmVyfXNpemUgLSBudW1iZXIgb2YgY29tcGFyZWJsZXMgaW4gbWF0cml4XG4gKiBAcmV0dXJuIHtGbG9hdDMyQXJyYXl9IC0gcHJveHkgZm9yIGNvbmRlbnNlZEFycmF5XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlTWF0cml4UHJveHkoY29uZGVuc2VkQXJyYXk6IEZsb2F0MzJBcnJheSwgc2l6ZTogbnVtYmVyKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgbGluZWFyRnVuYyA9IGRtTGluZWFySW5kZXgoc2l6ZSk7XG4gIGZ1bmN0aW9uIGxpbmVhckluZGV4KGk6IHN5bWJvbCB8IHN0cmluZywgajogc3ltYm9sIHwgc3RyaW5nKSB7XG4gICAgY29uc3QgaU51bSA9IE51bWJlcihpKTtcbiAgICBjb25zdCBqTnVtID0gTnVtYmVyKGopO1xuICAgIHJldHVybiBsaW5lYXJGdW5jKGlOdW0sIGpOdW0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaWR4MkhhbmRsZXIoaWR4MTogc3ltYm9sIHwgc3RyaW5nKTpQcm94eUhhbmRsZXI8RmxvYXQzMkFycmF5PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgaWR4MiwgX3JlY2VpdmVyKSB7XG4gICAgICAgICAgaWYgKGlkeDEgPT09IGlkeDIpIHJldHVybiAwO1xuICAgICAgICAgIGNvbnN0IGxpbmVhcklkeCA9IE51bWJlcihpZHgxKSA+IE51bWJlcihpZHgyKSA/IGxpbmVhckluZGV4KGlkeDIsIGlkeDEpIDogbGluZWFySW5kZXgoaWR4MSwgaWR4Mik7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtsaW5lYXJJZHhdO1xuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgY29uc3QgaWR4MUhhbmRsZXI6IFByb3h5SGFuZGxlcjxGbG9hdDMyQXJyYXk+ID0ge1xuICAgIGdldCh0YXJnZXQsIGlkeDEsIF9yZWNlaXZlcikge1xuICAgICAgaWYgKGlkeDEgPT09ICdsZW5ndGgnKSByZXR1cm4gc2l6ZTtcbiAgICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCBpZHgySGFuZGxlcihpZHgxKSk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gbmV3IFByb3h5KGNvbmRlbnNlZEFycmF5LCBpZHgxSGFuZGxlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkbUxpbmVhckluZGV4KHNpemU6IG51bWJlcik6IChpOiBudW1iZXIsIGo6IG51bWJlcikgPT4gbnVtYmVyIHtcbiAgcmV0dXJuIChpOiBudW1iZXIsIGo6IG51bWJlcikgPT4gc2l6ZSAqIGkgKyBqIC0gTWF0aC5mbG9vcigoKGkgKyAyKSAqIChpICsgMSkpIC8gMik7XG59XG4iXX0=","import { MultiColDimReducer } from './multi-column-dim-reducer';\n/**\n * Worker thread receiving data function.\n *\n * @param {any[]} columnData Samples to process.\n * @param {KnownMethods} method Embedding method.\n * @param {KnownMetrics} measure Distance metric.\n * @param {any} options Options to pass to algorithm.\n * @param {boolean} parallelDistanceWorkers Whether to use parallel distance workers.\n * @return {any} Embedding (and distance matrix where applicable).\n */\nasync function onMessage(columnsData, method, metrics, weights, aggregationMethod, options) {\n const reducer = new MultiColDimReducer(columnsData, method, metrics, weights, aggregationMethod, { ...options, progressFunc });\n return await reducer.transform(true);\n}\nasync function progressFunc(epochNum, epochsLength, embedding) {\n if (epochNum % 5 === 0)\n self.postMessage({ epochNum, epochsLength, embedding });\n}\nself.onmessage = async ({ data: { columnsData, method, distanceMetrics, options, weights, aggregationMethod } }) => {\n let data;\n try {\n const embedding = await onMessage(columnsData, method, distanceMetrics, weights, aggregationMethod, options);\n data = { embedding };\n }\n catch (e) {\n data = { error: e };\n }\n self.postMessage({\n error: data.error,\n embedding: data.embedding,\n });\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsaXQtY29sdW1uLWRpbS1yZWR1Y2VyLXdvcmtlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm11bGl0LWNvbHVtbi1kaW0tcmVkdWNlci13b3JrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFFOUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsS0FBSyxVQUFVLFNBQVMsQ0FBQyxXQUF5QixFQUFFLE1BQTJCLEVBQUUsT0FBdUIsRUFDdEcsT0FBaUIsRUFBRSxpQkFBNEMsRUFDL0QsT0FBWTtJQUNaLE1BQU0sT0FBTyxHQUFHLElBQUksa0JBQWtCLENBQ3BDLFdBQVcsRUFDWCxNQUFNLEVBQ04sT0FBTyxFQUNQLE9BQU8sRUFDUCxpQkFBaUIsRUFDakIsRUFBQyxHQUFHLE9BQU8sRUFBRSxZQUFZLEVBQUMsQ0FDM0IsQ0FBQztJQUNGLE9BQU8sTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFFRCxLQUFLLFVBQVUsWUFBWSxDQUFDLFFBQWdCLEVBQUUsWUFBb0IsRUFBRSxTQUFxQjtJQUN2RixJQUFJLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxFQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUMsRUFBQyxFQUFFLEVBQUU7SUFDN0csSUFBSSxJQUFvQyxDQUFDO0lBQ3pDLElBQUk7UUFDRixNQUFNLFNBQVMsR0FBRyxNQUFNLFNBQVMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0csSUFBSSxHQUFHLEVBQUMsU0FBUyxFQUFDLENBQUM7S0FDcEI7SUFBQyxPQUFPLENBQU0sRUFBRTtRQUNmLElBQUksR0FBRyxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUMsQ0FBQztLQUNuQjtJQUNELElBQUksQ0FBQyxXQUFXLENBQUM7UUFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7UUFDakIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO0tBQzFCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TWF0cml4fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcy90eXBlZC1tZXRyaWNzJztcbmltcG9ydCB7RGltUmVkdWN0aW9uTWV0aG9kc30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2R9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC90eXBlcyc7XG5pbXBvcnQge011bHRpQ29sRGltUmVkdWNlcn0gZnJvbSAnLi9tdWx0aS1jb2x1bW4tZGltLXJlZHVjZXInO1xuXG4vKipcbiAqIFdvcmtlciB0aHJlYWQgcmVjZWl2aW5nIGRhdGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHthbnlbXX0gY29sdW1uRGF0YSBTYW1wbGVzIHRvIHByb2Nlc3MuXG4gKiBAcGFyYW0ge0tub3duTWV0aG9kc30gbWV0aG9kIEVtYmVkZGluZyBtZXRob2QuXG4gKiBAcGFyYW0ge0tub3duTWV0cmljc30gbWVhc3VyZSBEaXN0YW5jZSBtZXRyaWMuXG4gKiBAcGFyYW0ge2FueX0gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gYWxnb3JpdGhtLlxuICogQHBhcmFtIHtib29sZWFufSBwYXJhbGxlbERpc3RhbmNlV29ya2VycyBXaGV0aGVyIHRvIHVzZSBwYXJhbGxlbCBkaXN0YW5jZSB3b3JrZXJzLlxuICogQHJldHVybiB7YW55fSBFbWJlZGRpbmcgKGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZSkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9uTWVzc2FnZShjb2x1bW5zRGF0YTogQXJyYXk8YW55W10+LCBtZXRob2Q6IERpbVJlZHVjdGlvbk1ldGhvZHMsIG1ldHJpY3M6IEtub3duTWV0cmljc1tdLFxuICB3ZWlnaHRzOiBudW1iZXJbXSwgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsXG4gIG9wdGlvbnM6IGFueSk6IFByb21pc2U8TWF0cml4PiB7XG4gIGNvbnN0IHJlZHVjZXIgPSBuZXcgTXVsdGlDb2xEaW1SZWR1Y2VyKFxuICAgIGNvbHVtbnNEYXRhLFxuICAgIG1ldGhvZCxcbiAgICBtZXRyaWNzLFxuICAgIHdlaWdodHMsXG4gICAgYWdncmVnYXRpb25NZXRob2QsXG4gICAgey4uLm9wdGlvbnMsIHByb2dyZXNzRnVuY31cbiAgKTtcbiAgcmV0dXJuIGF3YWl0IHJlZHVjZXIudHJhbnNmb3JtKHRydWUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9ncmVzc0Z1bmMoZXBvY2hOdW06IG51bWJlciwgZXBvY2hzTGVuZ3RoOiBudW1iZXIsIGVtYmVkZGluZzogbnVtYmVyW11bXSkge1xuICBpZiAoZXBvY2hOdW0gJSA1ID09PSAwKVxuICAgIHNlbGYucG9zdE1lc3NhZ2Uoe2Vwb2NoTnVtLCBlcG9jaHNMZW5ndGgsIGVtYmVkZGluZ30pO1xufVxuXG5zZWxmLm9ubWVzc2FnZSA9IGFzeW5jICh7ZGF0YToge2NvbHVtbnNEYXRhLCBtZXRob2QsIGRpc3RhbmNlTWV0cmljcywgb3B0aW9ucywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2R9fSkgPT4ge1xuICBsZXQgZGF0YToge2Vycm9yPzogYW55LCBlbWJlZGRpbmc/OiBhbnl9O1xuICB0cnkge1xuICAgIGNvbnN0IGVtYmVkZGluZyA9IGF3YWl0IG9uTWVzc2FnZShjb2x1bW5zRGF0YSwgbWV0aG9kLCBkaXN0YW5jZU1ldHJpY3MsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kLCBvcHRpb25zKTtcbiAgICBkYXRhID0ge2VtYmVkZGluZ307XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIGRhdGEgPSB7ZXJyb3I6IGV9O1xuICB9XG4gIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgIGVycm9yOiBkYXRhLmVycm9yLFxuICAgIGVtYmVkZGluZzogZGF0YS5lbWJlZGRpbmcsXG4gIH0pO1xufTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TSNE = void 0;\nvar tsne_1 = require(\"./tsne\");\nObject.defineProperty(exports, \"TSNE\", { enumerable: true, get: function () { return tsne_1.TSNE; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TSNE = void 0;\nclass TSNE {\n constructor(opt) {\n // return 0 mean unit standard deviation random number\n this.returnV = false;\n this.vValue = 0.0;\n this.iter = 0;\n opt = opt || {};\n this.perplexity = this.getopt(opt, 'perplexity', 30); // effective number of nearest neighbors\n this.dim = this.getopt(opt, 'dim', 2); // by default 2-D tSNE\n this.epsilon = this.getopt(opt, 'epsilon', 10); // learning rate\n }\n assert(condition, message) {\n if (!condition) {\n throw message || 'Assertion failed';\n }\n }\n // syntax sugar\n getopt(opt, field, defaultval) {\n if (opt.hasOwnProperty(field)) {\n return opt[field];\n }\n else {\n return defaultval;\n }\n }\n gaussRandom() {\n if (this.returnV) {\n this.returnV = false;\n return this.vValue;\n }\n const u = 2 * Math.random() - 1;\n const v = 2 * Math.random() - 1;\n const r = u * u + v * v;\n if (r === 0 || r > 1) {\n return this.gaussRandom();\n }\n const c = Math.sqrt(-2 * Math.log(r) / r);\n this.vValue = v * c; // cache this for next function call for efficiency\n this.returnV = true;\n return u * c;\n }\n // return random normal number\n randn(mu, std) { return mu + this.gaussRandom() * std; }\n // utilitity that creates contiguous vector of zeros of size n\n zeros(n) {\n if (typeof (n) === 'undefined' || isNaN(n)) {\n return [];\n }\n if (typeof ArrayBuffer === 'undefined') {\n // lacking browser support\n const arr = new Array(n);\n for (let i = 0; i < n; i++) {\n arr[i] = 0;\n }\n return arr;\n }\n else {\n return new Float64Array(n); // typed arrays are faster\n }\n }\n // utility that returns 2d array filled with random numbers\n // or with value s, if provided\n randn2d(n, d, s) {\n const uses = typeof s !== 'undefined';\n const x = [];\n for (let i = 0; i < n; i++) {\n const xhere = [];\n for (let j = 0; j < d; j++) {\n if (uses) {\n xhere.push(s);\n }\n else {\n xhere.push(this.randn(0.0, 1e-4));\n }\n }\n x.push(xhere);\n }\n return x;\n }\n // compute L2 distance between two vectors\n L2(x1, x2) {\n const D = x1.length;\n let d = 0;\n for (let i = 0; i < D; i++) {\n const x1i = x1[i];\n const x2i = x2[i];\n d += (x1i - x2i) * (x1i - x2i);\n }\n return d;\n }\n // compute pairwise distance in all vectors in X\n xtod(X) {\n const N = X.length;\n const dist = this.zeros(N * N); // allocate contiguous array\n for (let i = 0; i < N; i++) {\n for (let j = i + 1; j < N; j++) {\n const d = this.L2(X[i], X[j]);\n dist[i * N + j] = d;\n dist[j * N + i] = d;\n }\n }\n return dist;\n }\n // compute (p_{i|j} + p_{j|i})/(2n)\n d2p(D, perplexity, tol) {\n const nf = Math.sqrt(D.length); // this better be an integer\n const n = Math.floor(nf);\n this.assert(n === nf, 'D should have square number of elements.');\n const hTarget = Math.log(perplexity); // target entropy of distribution\n const P = this.zeros(n * n); // temporary probability matrix\n const prow = this.zeros(n); // a temporary storage compartment\n for (let i = 0; i < n; i++) {\n let betamin = -Infinity;\n let betamax = Infinity;\n let beta = 1; // initial value of precision\n let done = false;\n const maxtries = 50;\n // perform binary search to find a suitable precision beta\n // so that the entropy of the distribution is appropriate\n let num = 0;\n while (!done) {\n //debugger;\n // compute entropy and kernel row with beta precision\n let psum = 0.0;\n for (let j = 0; j < n; j++) {\n let pj = Math.exp(-D[i * n + j] * beta);\n if (i === j) {\n pj = 0;\n } // we dont care about diagonals\n prow[j] = pj;\n psum += pj;\n }\n // normalize p and compute entropy\n let nHere = 0.0;\n for (let j = 0; j < n; j++) {\n let pj;\n if (psum === 0) {\n pj = 0;\n }\n else {\n pj = prow[j] / psum;\n }\n prow[j] = pj;\n if (pj > 1e-7) {\n nHere -= pj * Math.log(pj);\n }\n }\n // adjust beta based on result\n if (nHere > hTarget) {\n // entropy was too high (distribution too diffuse)\n // so we need to increase the precision for more peaky distribution\n betamin = beta; // move up the bounds\n if (betamax === Infinity) {\n beta = beta * 2;\n }\n else {\n beta = (beta + betamax) / 2;\n }\n }\n else {\n // converse case. make distrubtion less peaky\n betamax = beta;\n if (betamin === -Infinity) {\n beta = beta / 2;\n }\n else {\n beta = (beta + betamin) / 2;\n }\n }\n // stopping conditions: too many tries or got a good precision\n num++;\n if (Math.abs(nHere - hTarget) < tol) {\n done = true;\n }\n if (num >= maxtries) {\n done = true;\n }\n }\n // console.log('data point ' + i + ' gets precision ' + beta + ' after ' + num + ' binary search steps.');\n // copy over the final prow to P at row i\n for (let j = 0; j < n; j++) {\n P[i * n + j] = prow[j];\n }\n } // end loop over examples i\n // symmetrize P and normalize it to sum to 1 over all ij\n const pOut = this.zeros(n * n);\n const N2 = n * 2;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n pOut[i * n + j] = Math.max((P[i * n + j] + P[j * n + i]) / N2, 1e-100);\n }\n }\n return pOut;\n }\n // helper function\n sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }\n // this function takes a set of high-dimensional points\n // and creates matrix P from them using gaussian kernel\n initDataRaw(X) {\n const N = X.length;\n const D = X[0].length;\n this.assert(N > 0, ' X is empty? You must have some data!');\n this.assert(D > 0, ' X[0] is empty? Where is the data?');\n const dists = this.xtod(X); // convert X to distances using gaussian kernel\n this.P = this.d2p(dists, this.perplexity, 1e-4); // attach to object\n this.N = N; // back up the size of the dataset\n this.initSolution(); // refresh this\n }\n // this function takes a given distance matrix and creates\n // matrix P from them.\n // D is assumed to be provided as a list of lists, and should be symmetric\n initDataDist(D) {\n const N = D.length;\n this.assert(N > 0, ' X is empty? You must have some data!');\n // convert D to a (fast) typed array version\n const dists = this.zeros(N * N); // allocate contiguous array\n for (let i = 0; i < N; i++) {\n for (let j = i + 1; j < N; j++) {\n const d = D[i][j];\n dists[i * N + j] = d;\n dists[j * N + i] = d;\n }\n }\n this.P = this.d2p(dists, this.perplexity, 1e-4);\n this.N = N;\n this.initSolution(); // refresh this\n }\n // (re)initializes the solution to random\n initSolution() {\n // generate random solution to t-SNE\n this.Y = this.randn2d(this.N, this.dim); // the solution\n this.gains = this.randn2d(this.N, this.dim, 1.0); // step gains to accelerate progress in unchanging directions\n this.ystep = this.randn2d(this.N, this.dim, 0.0); // momentum accumulator\n this.iter = 0;\n }\n // return pointer to current solution\n getSolution() {\n return this.Y;\n }\n // perform a single step of optimization to improve the embedding\n step() {\n this.iter += 1;\n const N = this.N;\n const cg = this.costGrad(this.Y); // evaluate gradient\n const cost = cg.cost;\n const grad = cg.grad;\n // perform gradient step\n const ymean = this.zeros(this.dim);\n for (let i = 0; i < N; i++) {\n for (let d = 0; d < this.dim; d++) {\n const gid = grad[i][d];\n const sid = this.ystep[i][d];\n const gainid = this.gains[i][d];\n // compute gain update\n let newgain = this.sign(gid) === this.sign(sid) ? gainid * 0.8 : gainid + 0.2;\n if (newgain < 0.01) {\n newgain = 0.01;\n } // clamp\n this.gains[i][d] = newgain; // store for next turn\n // compute momentum step direction\n const momval = this.iter < 250 ? 0.5 : 0.8;\n const newsid = momval * sid - this.epsilon * newgain * grad[i][d];\n this.ystep[i][d] = newsid; // remember the step we took\n // step!\n this.Y[i][d] += newsid;\n ymean[d] += this.Y[i][d]; // accumulate mean so that we can center later\n }\n }\n // reproject Y to be zero mean\n for (let i = 0; i < N; i++) {\n for (let d = 0; d < this.dim; d++) {\n this.Y[i][d] -= ymean[d] / N;\n }\n }\n //if(this.iter%100===0) console.log('iter ' + this.iter + ', cost: ' + cost);\n return cost; // return current cost\n }\n // for debugging: gradient check\n debugGrad() {\n const N = this.N;\n const cg = this.costGrad(this.Y); // evaluate gradient\n const cost = cg.cost;\n const grad = cg.grad;\n const e = 1e-5;\n for (let i = 0; i < N; i++) {\n for (let d = 0; d < this.dim; d++) {\n const yold = this.Y[i][d];\n this.Y[i][d] = yold + e;\n const cg0 = this.costGrad(this.Y);\n this.Y[i][d] = yold - e;\n const cg1 = this.costGrad(this.Y);\n const analytic = grad[i][d];\n const numerical = (cg0.cost - cg1.cost) / (2 * e);\n console.log(i + ',' + d + ': gradcheck analytic: ' + analytic + ' vs. numerical: ' + numerical);\n this.Y[i][d] = yold;\n }\n }\n }\n // return cost and gradient, given an arrangement\n costGrad(Y) {\n const N = this.N;\n const dim = this.dim; // dim of output space\n const P = this.P;\n const pmul = this.iter < 100 ? 4 : 1; // trick that helps with local optima\n // compute current Q distribution, unnormalized first\n const quArr = this.zeros(N * N);\n let qsum = 0.0;\n for (let i = 0; i < N; i++) {\n for (let j = i + 1; j < N; j++) {\n let dsum = 0.0;\n for (let d = 0; d < dim; d++) {\n const dhere = Y[i][d] - Y[j][d];\n dsum += dhere * dhere;\n }\n const qu = 1.0 / (1.0 + dsum); // Student t-distribution\n quArr[i * N + j] = qu;\n quArr[j * N + i] = qu;\n qsum += 2 * qu;\n }\n }\n // normalize Q distribution to sum to 1\n const NN = N * N;\n const Q = this.zeros(NN);\n for (let q = 0; q < NN; q++) {\n Q[q] = Math.max(quArr[q] / qsum, 1e-100);\n }\n let cost = 0.0;\n const grad = [];\n for (let i = 0; i < N; i++) {\n const gsum = new Array(dim); // init grad for point i\n for (let d = 0; d < dim; d++) {\n gsum[d] = 0.0;\n }\n for (let j = 0; j < N; j++) {\n cost += -P[i * N + j] * Math.log(Q[i * N + j]); // accumulate cost (the non-constant portion at least...)\n const premult = 4 * (pmul * P[i * N + j] - Q[i * N + j]) * quArr[i * N + j];\n for (let d = 0; d < dim; d++) {\n gsum[d] += premult * (Y[i][d] - Y[j][d]);\n }\n }\n grad.push(gsum);\n }\n return { cost, grad };\n }\n}\nexports.TSNE = TSNE;\n","// 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](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [649], () => (__webpack_require__(2886)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\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__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && !scriptUrl) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = self.location + \"\";\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t886: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = self[\"webpackChunkbio\"] = self[\"webpackChunkbio\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","Float32Array","StringMetricsNames","VectorMetricsNames","BitArrayMetricsNames","IntArrayMetricsNames","DistanceMetricsSubjects","NumberMetricsNames","BitArray","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","static","set1","set2","temp","len","values","flag","setBit","s","fromSeq","charAt","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","fromValues","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","tanimotoSimilarity","x","y","total","common","getDistanceFromSimilarity","similarity","assert","condition","message","Tanimoto","Dice","Asymmetric","BraunBlanquet","Cosine","Kulczynski","McConnaughey","RogotGoldberg","Russel","Sokal","Hamming","Euclidean","HAMMING","LEVENSHTEIN","MONOMER_CHEMICAL_DISTANCE","NEEDLEMANN_WUNSCH","vectorDistanceMetricsMethods","q","pow","sqrt","stringDistanceMetricsMethods","Levenshtein","JaroWinkler","Manhattan","s1","s2","dist","Onehot","bitArrayDistanceMetricsMethods","diceSimilarity","asymmetricSimilarity","braunBlanquetSimilarity","cosineSimilarity","totalProd","kulczynskiSimilarity","mcConnaugheySimilarity","diff","rogotGoldbergSimilarity","russelSimilarity","sokalSimilarity","intArrayDistanceMetricsMethods","TanimotoIntArray","numberDistanceMetricsMethods","Difference","abs","AvailableMetrics","Vector","String","MacroMolecule","Number","IntArray","MetricToDataType","Object","keys","reduce","ret","key","val","Measure","method","dataType","getMeasure","opts","dict","hasOwnProperty","availableMeasures","DistanceAggregationMethods","insertSmaller","distancesAr","newPosition","findIndex","v","pop","splice","DistanceMatrixService","_workers","_workerCount","_terminateOnComplete","useConcurrentWorkers","terminateOnComplete","threadCount","navigator","hardwareConcurrency","Array","map","Worker","URL","async","fnName","normalize","Promise","resolve","reject","promises","totalLength","chunkSize","distanceMatrix","endRow","endCol","lmin","lmax","MIN_VALUE","startRow","startCol","postMessage","chunckSize","resolveWorker","rejectWorker","onmessage","error","distanceMatrixData","terminate","set","all","forEach","e","worker","tauRandInt","tauRand","empty","output","undefined","range","_","filled","zeros","mean","input","sum","rejectionSample","nSamples","poolSize","rejectSample","broken","reshape2d","a","b","rows","col","makeHeap","nPoints","size","makeArrays","fillValue","heap","Infinity","heapPush","row","weight","indices","weights","uncheckedHeapPush","isNew","iSwap","ic1","ic2","heapShape2","buildCandidates","currentGraph","nVertices","nNeighbors","maxCandidates","candidateNeighbors","idx","isn","d","deheapSort","indHeap","distHeap","indHeapIndex","distHeapIndex","temp1","temp2","siftDown","heap1","heap2","ceiling","elt","leftChild","rightChild","swap","smallestFlagged","ind","minDist","resultIndex","SparseMatrix","entries","Map","nRows","nCols","cols","dims","checkDims","makeKey","has","get","getAll","ordered","rowColValues","sort","getDims","getRows","getCols","getValues","fn","vals","toArray","matrix","oldRows","oldCols","oldVals","matlen","Int32Array","pairwiseMultiply","elementWise","add","subtract","multiplyScalar","scalar","eliminateZeros","m","zeroIndices","Set","removeByZeroIndex","nextValues","filter","nextRows","nextCols","normType","normFn","normFns","colsByRow","nextMatrix","norm","xs","op","visited","operate","nextValue","valuesA","rowsA","colsA","valuesB","rowsB","colsB","getCSR","indptr","currentRow","FlatTree","hyperplanes","offsets","children","makeForest","nTrees","leafSize","trees","makeEuclideanTree","makeTree","forest","tree","nNodes","numNodes","nLeaves","numLeaves","hyperplane","recursiveFlatten","flattenTree","splitResults","leftIndex","rightIndex","left","right","hyperplaneOffset","hyperplaneVector","nLeft","nRight","side","margin","indicesLeft","indicesRight","offset","euclideanRandomProjectionSplit","isLeaf","nodeNum","leafNum","oldNodeNum","res","selectSide","point","searchFlatTree","node","prototype","isAnyArray","object","call","endsWith","errorCalculation","parameters","parameterizedFunction","func","rescale","options","arguments","TypeError","currentMin","_options$fromIndex","fromIndex","_options$toIndex","toIndex","isInteger","minValue","currentMax","maxValue","RangeError","_options$min","autoMinMax","_options$max","factor","indent","repeat","indentData","inspectMatrixWithOptions","maxRows","maxColumns","maxNumSize","padMinus","columns","maxI","maxJ","loop","line","formatNumber","join","inspectData","formatNumber2","padEnd","str","fix","toFixed","startsWith","exp","toExponential","slice","checkRowIndex","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRange","startColumn","endColumn","checkNumber","newArray","array","checkNonEmpty","isEmpty","AbstractMatrix","newRows","newColumns","newMatrix","column","interval","round","l","matrix1","matrix2","checkMatrix","isMatrix","klass","apply","callback","to2DArray","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","echelonForm","h","iMax","swapRows","tmp","reducedEchelonForm","maxRow","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","by","NaN","NEGATIVE_INFINITY","maxIndex","POSITIVE_INFINITY","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","type","cumulativeSum","dot","vector2","vector1","mmul","Bcolj","Float64Array","strassen2x2","a11","b11","a12","b12","a21","b21","a22","b22","m1","m2","m3","m4","m5","c00","c01","c10","c11","strassen3x3","a00","a01","a02","a10","a20","b00","b01","b02","b10","b20","m6","m7","m8","m9","m12","m13","m14","m15","m16","m17","m18","c02","c12","c20","c21","c22","mmulStrassen","r1","c1","r2","c2","embed","mat","r","c","resultat","console","warn","blockMult","halfRows","parseInt","halfCols","subMatrix","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","ceil","first","last","flipColumns","kroneckerProduct","kroneckerSum","AxI","eye","IxB","transpose","sortRows","compareFunction","compareNumbers","sortColumns","subMatrixRow","subMatrixColumn","selection","rowIndices","columnIndices","checkRowIndices","checkColumnIndices","rowIndex","columnIndex","trace","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","center","centerByRow","centerByColumn","centerAll","scale","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","Symbol","for","rand","randomInt","randInt","diagonal","identity","negate","tensorProduct","nColumns","super","arrayData","every","element","removeRow","addRow","removeColumn","newRow","addColumn","Matrix","addS","addM","subS","subM","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","andS","andM","orS","orM","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","expm1","fround","log","log1p","log10","log2","sign","sin","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","WrapperMatrix2D","LuDecomposition","t","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","solve","X","determinant","lowerTriangularMatrix","upperTriangularMatrix","pivotPermutationVector","hypotenuse","QrDecomposition","qr","rdiag","nrm","QR","Rdiag","isFullRank","orthogonalMatrix","SingularValueDecomposition","computeLeftSingularVectors","computeRightSingularVectors","autoTranspose","wantu","Boolean","wantv","swapped","aux","nu","ni","U","V","work","si","nct","nrt","mrc","pp","iter","eps","EPSILON","kase","alpha","isNaN","ks","f","cs","sn","sp","spm1","epm1","sk","ek","shift","g","Y","threshold","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","ucols","norm2","rank","tol","ii","leftSingularVectors","diagonalMatrix","step","params","damping","gradientDifference","evaluatedData","gradientFunc","paramFunction","ans","param","auxParams","funcParam","gradientFunction","matrixFunc","matrixFunction","inverseMatrix","useSVD","leftHandSide","rightHandSide","SMOOTH_K_TOLERANCE","MIN_K_DIST_SCALE","UMAP","learningRate","localConnectivity","nComponents","nEpochs","negativeSampleRate","repulsionStrength","setOpMixRatio","spread","transformQueueSize","targetMetric","targetWeight","targetNNeighbors","distanceFn","numeric","knnIndices","knnDistances","graph","isInitialized","rpForest","initFromRandom","initFromTree","search","searchGraph","embedding","optimizationState","OptimizationState","neighbors","setParam","fit","initializeFit","optimizeLayout","optimizeLayoutAsync","setSupervisedProjection","setPrecomputedKNN","getNEpochs","knnResults","nearestNeighbors","fuzzySimplicialSet","makeSearchFns","makeSearchGraph","processGraphForSupervisedProjection","head","tail","epochsPerSample","initializeSimplicialSetEmbedding","initializeOptimization","prepareForOptimizationLoop","queryPoints","_heap","_tree","initialization","tried","vertex","candidates","candidate","knn","distances","neighbor","distance","transform","toTransform","rawData","results","adjustedLocalConnectivity","sigmas","rhos","smoothKNNDistance","computeMembershipStrengths","csrMatrix","z","initTransform","graphMax","makeEpochsPerSample","assignOptimizationStateParameters","headEmbedding","tailEmbedding","currentEpoch","farDist","categoricalSimplicialSetIntersection","optimizeLayoutStep","getEmbedding","metricNNDescent","leafArray","nIters","delta","rho","rpTreeInit","cj","ck","sparseMatrix","prodMatrix","simplicialSet","target","unknownDist","intersection","fastIntersection","resetLocalConnectivity","nIter","bandwidth","lo","hi","mid","ithDistances","nonZeroDists","interpolation","psum","meanIthDistances","meanDistances","graphValues","entry","w","state","assign","dim","moveOther","epochsPerNegativeSample","epochOfNextNegativeSample","epochOfNextSample","initialAlpha","gamma","xv","yv","parameterValues","maxIterations","errorTolerance","minValues","maxValues","initialValues","parLen","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","iteration","converged","parameterError","iterations","findABParams","current","distSquared","rDist","gradCoeff","gradD","clip","nNegSamples","epochCallback","epochCompleted","shouldStop","isFinished","setTimeout","err","clipValue","SparseMatrixService","matSize","minThreshold","getMinimalThreshold","workers","startIdx","endIdx","fullSize","acc","nNeighbours","multiColumnKNN","fnNames","aggregationMethod","EUCLIDEAN","some","knnIndexes","knnRes","thresholdWorkers","shuffledValues","maxSampleSize","sampleSise","testSetSizePerWorker","tPromises","sampleLength","getSampleDistances","cnt","mi","mj","MultiColumnReducer","MultiTSNEReducer","reducer","distanceFnames","distanceFns","distanceFnArgs","matrixService","aggregate","MANHATTAN","vs","calc","matrixProxy","condensedArray","linearFunc","dmLinearIndex","linearIndex","iNum","jNum","idx1Handler","idx1","_receiver","Proxy","idx2","idx2Handler","distanceMatrixProxy","initDataDist","getSolution","MultiUMAPReducer","vectors","progressFunc","_parallelDistanceWorkers","time","timeEnd","fitAsync","epoc","AvailableReducers","MultiColDimReducer","metrics","distanceAggregation","measures","measure","bitArrayLength","typeName","availableMethods","availableMetrics","obj","epochNum","epochsLength","columnsData","distanceMetrics","onMessage","exports","tsne_1","defineProperty","enumerable","TSNE","opt","returnV","vValue","perplexity","getopt","epsilon","field","defaultval","gaussRandom","u","randn","mu","std","ArrayBuffer","randn2d","uses","xhere","L2","x1","x2","D","x1i","x2i","xtod","N","d2p","nf","hTarget","P","prow","betamin","betamax","beta","done","maxtries","pj","nHere","pOut","N2","initDataRaw","dists","initSolution","gains","ystep","cg","costGrad","cost","grad","ymean","gid","sid","gainid","newgain","newsid","debugGrad","yold","cg0","cg1","analytic","numerical","pmul","quArr","qsum","dsum","dhere","qu","NN","Q","gsum","premult","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","module","__webpack_modules__","__webpack_exports__","O","chunkIds","priority","notFulfilled","fulfilled","definition","o","chunkId","globalThis","Function","window","prop","scriptUrl","importScripts","location","document","currentScript","scripts","getElementsByTagName","replace","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","bind","moreModules","runtime","then"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"886.js","mappings":";yFAOO,MAAM,UAAeA,kBCPjBC,EAOAC,EAIAC,EAeAC,EAIAC,EASAC,aAtCX,SAAWL,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,UACzC,CAPD,CAOGA,IAA4BA,EAA0B,CAAC,IAE1D,SAAWC,GACPA,EAA+B,WAAI,YACtC,CAFD,CAEGA,IAAuBA,EAAqB,CAAC,4BC1CjC,MAAMC,EACjBC,YAAYC,EAAKC,GAAe,GAU5B,GATAC,KAAKC,QAAU,EACfD,KAAKE,SAAW,EAChBF,KAAKG,aAAe,EACpBH,KAAKI,eAAiB,EACtBJ,KAAKK,uBAAyB,EAC9BL,KAAKM,yBAA2B,EAChCN,KAAKO,eAAiB,GACtBP,KAAKQ,uBAAyB,EAC9BR,KAAKS,iBAAmB,IACL,iBAARX,EAAkB,CACzB,MAAMY,EAASZ,EACTa,EAAOf,EAASgB,cAAcF,GACpC,GAAIX,EACA,IAAK,IAAIc,EAAI,EAAGA,EAAIF,EAAKD,OAAQG,IAC7BF,EAAKE,IAAM,EAEnBb,KAAKc,MAAQH,EACbX,KAAKC,QAAUS,CACnB,KACK,MAAIZ,aAAeiB,aAKpB,MAAM,IAAIC,MAAM,uBAJhBhB,KAAKc,MAAQhB,EACbE,KAAKC,QAAUF,CAInB,CACJ,CACAkB,aAAe,OAAOjB,KAAKc,KAAO,CAClCI,WAAWC,EAAKC,GACZ,GAAID,EAAM,EACN,MAAM,IAAIH,MAAM,GAAGI,gCAC3B,CACAC,cAAcC,EAAOC,EAAKC,EAAKJ,GAC3B,GAAKE,EAAQC,GAASD,EAAQE,EAC1B,MAAM,IAAIR,MAAM,YAAYI,MAAYE,oBAAwBC,MAAQC,KAChF,CACAC,KAAKC,EAAKC,EAAKC,GACX,IAAK,IAAIf,EAAI,EAAGA,EAAIe,EAAOf,IACvBc,EAAId,GAAKa,EAAIb,EACrB,CACAgB,SAASC,GACL,GAAI9B,KAAKC,SAAW6B,EAAM7B,QACtB,MAAM,IAAIe,MAAM,mBAAmBhB,KAAKC,cAAc6B,EAAM7B,YAChED,KAAKyB,KAAKK,EAAMhB,MAAOd,KAAKc,MAAOd,KAAK+B,cACxC/B,KAAKE,UACT,CACIQ,aACA,OAAOV,KAAKC,OAChB,CACI+B,aACA,OAAOhC,KAAKc,KAChB,CACIkB,WAAOC,GACPjC,KAAKc,MAAQmB,EACbjC,KAAKE,UACT,CACIgC,cACA,OAAOlC,KAAKE,QAChB,CACIgC,YAAQZ,GACRtB,KAAKE,SAAWoB,CACpB,CACAa,iBAAiBC,GAAS,GACtBpC,KAAKE,UACT,CACI6B,mBACA,OAAOM,KAAKC,OAAOtC,KAAKC,QAAU,IAAQ,GAC9C,CACIsC,oBACA,OAAOvC,KAAKE,UAAYF,KAAKQ,sBAAwBR,KAAKO,eAAiB,EAC/E,CACIgC,kBAAcC,GACdxC,KAAKO,eAAiBiC,EACtBxC,KAAKQ,sBAAwBR,KAAKE,QACtC,CACIuC,WACA,OAAOzC,IACX,CACA0C,UAAUpB,GACN,GAAIA,EAAQ,EACR,MAAM,IAAIN,MAAM,kBACpB,GAAIM,GAAStB,KAAKC,QACd,OACJ,MAAM0C,EAAcN,KAAKC,OAAOhB,EAAQ,IAAQ,IAChD,GAAKqB,EAAc3C,KAAKc,MAAMJ,QAAaiC,EAAc3C,KAAKS,iBAAoBT,KAAKc,MAAMJ,OAAS,CAClG,MAAMkC,EAAU,IAAI7B,YAAY4B,GAChC3C,KAAKyB,KAAKzB,KAAKc,MAAO8B,EAAUD,EAAc3C,KAAKc,MAAMJ,OAAUV,KAAKc,MAAMJ,OAASiC,GACvF3C,KAAKc,MAAQ8B,CACjB,CACItB,EAAQtB,KAAKC,UACTD,KAAKC,QAAU,GAAO,IACtBD,KAAKc,MAAMd,KAAK+B,aAAe,KAAO,IAAO/B,KAAKC,QAAU,GAAQ,KAAS,GACjFD,KAAKc,MAAM+B,KAAK,EAAG7C,KAAK+B,aAAcY,IAE1C3C,KAAKC,QAAUqB,EACftB,KAAKE,UACT,CACA4C,eAAeC,EAAMC,GACjB,GAAID,EAAK9C,SAAW+C,EAAK/C,QACrB,MAAM,IAAIe,MAAM,mBAAmB+B,EAAK9C,cAAc+C,EAAK/C,YAC/D,MAAMgD,EAAO,IAAIrD,EAASmD,EAAK9C,SAC/BgD,EAAKhD,QAAU8C,EAAK9C,QACpBgD,EAAKnC,MAAQlB,EAASgB,cAAcqC,EAAKhD,SACzCgD,EAAK/C,SAAW,EAChB,MAAMgD,EAAMH,EAAKhB,aACjB,IAAK,IAAIlB,EAAI,EAAGA,EAAIqC,EAAKrC,IACrBoC,EAAKnC,MAAMD,GAAKkC,EAAKjC,MAAMD,GAAKmC,EAAKlC,MAAMD,GAC/C,OAAOoC,CACX,CACAH,qBAAqBpC,GACjB,OAAO,IAAIK,YAAYsB,KAAKC,OAAO5B,EAAS,IAAQ,IACxD,CACAoC,kBAAkBK,GACd,MAAMF,EAAO,IAAIrD,EAASuD,EAAOzC,QACjCuC,EAAK/C,SAAW,EAChB,IAAK,IAAIW,EAAI,EAAGA,EAAIoC,EAAKhD,QAASY,IAC1BsC,EAAOtC,KACPoC,EAAKnC,MAAMuB,KAAKC,MAAMzB,EAAI,MAAU,IAAOA,EAAI,GAAQ,KAE/D,OAAOoC,CACX,CAEAH,eAAelB,EAAOwB,GAClB,MAAMH,EAAO,IAAIrD,EAASgC,GAC1B,IAAK,IAAIf,EAAI,EAAGA,EAAIe,IAASf,EACzBoC,EAAKI,OAAOxC,EAAGuC,EAAKvC,IAExB,OADAoC,EAAK/C,SAAW,EACT+C,CACX,CAEAH,kBAAkBQ,GACd,OAAO1D,EAAS2D,QAAQD,EAAE5C,QAASG,GAAqB,KAAfyC,EAAEE,OAAO3C,IACtD,CAEAiC,uBAAuB7C,EAASa,GAC5B,MAAMmC,EAAO,IAAIrD,EAASK,GAE1B,OADAgD,EAAKnC,MAAQA,EACNmC,CACX,CAEAH,iBAAiBW,GACb,MAAMP,EAAMO,EAAM/C,OACZuC,EAAO,IAAIrD,EAAe,EAANsD,GAC1BD,EAAKnC,MAAQ,IAAIC,YAAYsB,KAAKC,OAAOY,EAAM,GAAK,IACpDD,EAAKhD,QAAgB,EAANiD,EACf,IAAIQ,EAAO,EACPC,EAAO,EACX,KAAQT,EAAMS,GAAS,GACnBV,EAAKnC,MAAM4C,KAA2B,IAAdD,EAAME,IAAoC,IAAlBF,EAAME,EAAO,KAAc,GACnD,IAAlBF,EAAME,EAAO,KAAc,IAA6B,IAAlBF,EAAME,EAAO,KAAc,GACvEA,GAAQ,EASZ,OAPIT,EAAMS,GAAQ,IACdV,EAAKnC,MAAM4C,IAA2B,IAAlBD,EAAME,EAAO,KAAc,IAC/CT,EAAMS,GAAQ,IACdV,EAAKnC,MAAM4C,KAA4B,IAAlBD,EAAME,EAAO,KAAc,GAChDT,EAAMS,GAAQ,IACdV,EAAKnC,MAAM4C,IAAuB,IAAdD,EAAME,IAC9BV,EAAK/C,SAAW,EACT+C,CACX,CACAW,WACI,MAAO,GAAG5D,KAAKC,iBAAiBD,KAAK6D,WAAU,QACnD,CAEAC,OAAOhC,GACH,GAAI9B,MAAQ8B,EACR,OAAO,EACX,GAAa,MAATA,EACA,OAAO,EACX,GAAI9B,KAAKC,SAAW6B,EAAM7B,QACtB,OAAO,EACX,GAAoB,GAAhBD,KAAKC,QACL,OAAO,EACX,IAAK,IAAIY,EAAI,EAAGA,EAAIb,KAAKc,MAAMJ,OAAS,EAAGG,IACvC,GAAIb,KAAKc,MAAMD,IAAMiB,EAAMhB,MAAMD,GAC7B,OAAO,EACf,IAAK,IAAIA,EAA8B,GAAzBb,KAAKc,MAAMJ,OAAS,GAAQG,EAAIb,KAAKC,QAASY,IACxD,GAAIb,KAAK+D,OAAOlD,IAAMiB,EAAMiC,OAAOlD,GAC/B,OAAO,EAEf,OAAO,CACX,CAEAmD,QACI,MAAMC,EAAW,IAAIrE,EAAS,GAAG,GAIjC,OAHAqE,EAASnD,MAAQC,YAAYmD,KAAKlE,KAAKc,OACvCmD,EAAShE,QAAUD,KAAKC,QACxBgE,EAAS/D,SAAWF,KAAKE,SAClB+D,CACX,CAEAE,KAAKf,EAAMhB,GACPpC,KAAKoE,QAAO,GAAO,GACnB,IAAK,IAAIvD,EAAI,EAAGA,EAAIb,KAAKC,QAASY,IAC1BuC,EAAKvC,KACLb,KAAKc,MAAMuB,KAAKC,MAAMzB,EAAI,MAAU,IAAOA,EAAI,GAAQ,KAG/D,OADAb,KAAKmC,iBAAiBC,GACfpC,IACX,CAEAqE,OAAOjC,GAAS,GACZ,IAAK,IAAIvB,EAAI,EAAGA,EAAIb,KAAKc,MAAMJ,OAAQG,IACnCb,KAAKc,MAAMD,KAAO,EACtBb,KAAKmC,iBAAiBC,EAC1B,CAEAgC,OAAO9C,EAAOc,GAAS,GACnB,MAAMkC,EAAQhD,GAAS,EAAI,EACrB4B,EAAMlD,KAAK+B,aACjB,IAAK,IAAIlB,EAAI,EAAGA,EAAIqC,EAAKrC,IACrBb,KAAKc,MAAMD,GAAKyD,EACpBtE,KAAKmC,iBAAiBC,EAC1B,CAIAmC,WAAWC,EAASlD,GAAQ,EAAMmD,GAAQ,EAAMrC,GAAS,GACjDqC,GACAzE,KAAKoE,QAAQ9C,GAAO,GACxB,IAAK,MAAMT,KAAK2D,EACZxE,KAAK0E,QAAQ7D,EAAGS,GACpBtB,KAAKmC,iBAAiBC,EAC1B,CACAuC,WAAWH,EAASlD,GAAQ,GACxB,IAAK,MAAMsD,KAASJ,EAChB,GAAIxE,KAAK+D,OAAOa,IAAUtD,EACtB,OAAO,EAEf,OAAO,CACX,CACAuD,SAASL,EAASlD,GAAQ,GACtB,IAAK,MAAMsD,KAASJ,EAChB,GAAIxE,KAAK+D,OAAOa,IAAUtD,EACtB,OAAO,EAEf,OAAO,CACX,CACAwD,SAASC,EAAOzD,GAAQ,EAAMmD,GAAQ,EAAMrC,GAAS,EAAM4C,GAAa,GAGpE,GAFIP,GAASO,GACThF,KAAKoE,QAAQ9C,GAAO,GACpB0D,EACA,IAAK,IAAInE,EAAI,EAAGA,EAAIb,KAAKC,QAASY,IAC1BkE,EAAMlE,IACNb,KAAK0E,QAAQ7D,EAAGS,QAIxB,IAAK,IAAIT,EAAI,EAAGA,EAAIb,KAAKC,QAASY,IAC9Bb,KAAK0E,QAAQ7D,EAAGkE,EAAMlE,GAAKS,GAASA,GAE5CtB,KAAKmC,iBAAiBC,EAC1B,CACA6C,SAASf,EAAMgB,GACXlF,KAAKqB,cAAc6C,EAAM,EAAGlE,KAAKC,QAAU,EAAG,QAC9CD,KAAKqB,cAAc6D,EAAI,EAAGlF,KAAKC,QAAS,MACxC,MAAMkF,EAAM,GACZ,IAAK,IAAItE,EAAIqD,EAAMrD,EAAIqE,IAAMrE,EACzBsE,EAAIC,KAAKpF,KAAK+D,OAAOlD,IACzB,OAAOjB,EAASyF,WAAWF,EAC/B,CACAG,eAAepB,EAAMgB,GACjBlF,KAAKqB,cAAc6C,EAAM,EAAGlE,KAAKC,QAAU,EAAG,QAC9CD,KAAKqB,cAAc6D,EAAI,EAAGlF,KAAKC,QAAS,MACxC,MAAMkF,EAAM,GACZ,IAAK,IAAItE,EAAIqD,EAAMrD,EAAIqE,IAAMrE,EACzBsE,EAAIC,KAAKpF,KAAK+D,OAAOlD,IACzB,OAAOsE,CACX,CACAI,SAASrB,EAAMgB,EAAI5D,EAAOc,GAAS,GAC/BpC,KAAKqB,cAAc6C,EAAM,EAAGlE,KAAKC,QAAU,EAAG,QAC9CD,KAAKqB,cAAc6D,EAAI,EAAGlF,KAAKC,QAAU,EAAG,MAC5C,MAAMuF,EAAQnD,KAAKd,IAAI2C,EAAMgB,GACvBO,EAAMpD,KAAKb,IAAI0C,EAAMgB,GAE3B,GAAI5D,EACA,IAAK,IAAIT,EAAI2E,EAAO3E,GAAK4E,EAAK5E,IAC1Bb,KAAK0F,QAAQ7E,QAGjB,IAAK,IAAIA,EAAI2E,EAAO3E,GAAK4E,EAAK5E,IAC1Bb,KAAK2F,SAAS9E,GAGtB,OADAb,KAAKmC,iBAAiBC,GACfpC,IACX,CAEA4F,UAAUC,EAAGvE,EAAOc,GAAS,GACzB,GAAIyD,EAAI,GAAKA,EAAI7F,KAAKC,QAClB,MAAM,IAAIe,MAAM,8BAChB6E,EAAI7F,KAAKC,QAAU,GACnBD,KAAK4F,UAAU5F,KAAKC,QAAU4F,GAAIvE,GACtCtB,KAAKoE,QAAQ9C,GACb,IAAK,IAAIwE,EAAI,EAAGA,EAAID,GAAI,CACpB,MAAMhF,EAAIwB,KAAKC,MAAMD,KAAK0D,SAAW/F,KAAKC,SACtCD,KAAK+D,OAAOlD,IAAMS,IAEtBtB,KAAK0E,QAAQ7D,EAAGS,GAChBwE,IACJ,CACA9F,KAAKmC,iBAAiBC,EAC1B,CAGA4D,IAAI1E,EAAOc,GAAS,GAChB,GAAIpC,KAAKC,SAAWqB,EAAMrB,QACtB,MAAM,IAAIe,MAAM,yBACpB,IAAK,IAAIH,EAAI,EAAGqC,EAAMlD,KAAK+B,aAAclB,EAAIqC,EAAKrC,IAC9Cb,KAAKc,MAAMD,IAAMS,EAAMR,MAAMD,GAEjC,OADAb,KAAKmC,iBAAiBC,GACfpC,IACX,CAGAiG,OAAO3E,EAAOc,GAAS,GACnB,GAAIpC,KAAKC,SAAWqB,EAAMrB,QACtB,MAAM,IAAIe,MAAM,yBACpB,MAAMkC,EAAMlD,KAAK+B,aACjB,IAAK,IAAI4B,EAAO,EAAGA,EAAOT,EAAKS,IAC3B3D,KAAKc,MAAM6C,KAAUrC,EAAMR,MAAM6C,GAErC,OADA3D,KAAKmC,iBAAiBC,GACfpC,IACX,CAGAkG,OAAO5E,EAAOc,GAAS,GACnB,GAAIpC,KAAKC,SAAWqB,EAAMrB,QACtB,MAAM,IAAIe,MAAM,yBACpB,IAAK,IAAIH,EAAI,EAAGqC,EAAMlD,KAAK+B,aAAclB,EAAIqC,EAAKrC,IAC9Cb,KAAKc,MAAMD,IAAOb,KAAKc,MAAMD,GAAMS,EAAMR,MAAMD,GAEnD,OADAb,KAAKmC,iBAAiBC,GACfpC,IACX,CAEAmG,IAAI/D,GAAS,GACT,IAAK,IAAIvB,EAAI,EAAGqC,EAAMlD,KAAK+B,aAAclB,EAAIqC,EAAKrC,IAC9Cb,KAAKc,MAAMD,IAAMb,KAAKc,MAAMD,GAEhC,OADAb,KAAKmC,iBAAiBC,GACfpC,IACX,CAGAoG,GAAG9E,EAAOc,GAAS,GACf,GAAIpC,KAAKC,SAAWqB,EAAMrB,QACtB,MAAM,IAAIe,MAAM,yBACpB,IAAK,IAAIH,EAAI,EAAGqC,EAAMlD,KAAK+B,aAAclB,EAAIqC,EAAKrC,IAC9Cb,KAAKc,MAAMD,IAAMS,EAAMR,MAAMD,GAEjC,OADAb,KAAKmC,iBAAiBC,GACfpC,IACX,CAGAqG,IAAI/E,EAAOc,GAAS,GAChB,GAAIpC,KAAKC,SAAWqB,EAAMrB,QACtB,MAAM,IAAIe,MAAM,yBACpB,IAAK,IAAIH,EAAI,EAAGqC,EAAMlD,KAAK+B,aAAclB,EAAIqC,EAAKrC,IAC9Cb,KAAKc,MAAMD,IAAMS,EAAMR,MAAMD,GAEjC,OADAb,KAAKmC,iBAAiBC,GACfpC,IACX,CAEAsG,SAASC,EAAKV,EAAGzC,GAAO,GAEpB,GADApD,KAAKqB,cAAckF,EAAK,EAAGvG,KAAKC,QAAS,OAChC,GAAL4F,EACA,OAIJ,MAAMW,EAAYxG,KAAKC,QACvBD,KAAK0C,UAAU1C,KAAKC,QAAU4F,GAE9B,IAAK,IAAIhF,EAAI2F,EAAY,EAAG3F,GAAK0F,EAAK1F,IAClCb,KAAKqD,OAAOxC,EAAIgF,EAAG7F,KAAK+D,OAAOlD,IACnC,IAAK,IAAIA,EAAI0F,EAAK1F,EAAI0F,EAAMV,EAAGhF,IAC3Bb,KAAKqD,OAAOxC,EAAGuC,EAEvB,CAGAqD,SAASF,EAAKV,EAAI,GAEd,GAAIA,EAAI,EACJ,MAAM,IAAI7E,MAAM,wBAEpB,GADAhB,KAAKqB,cAAckF,EAAK,EAAGvG,KAAKC,QAAU4F,EAAG,OACzC7F,KAAK0G,UAAS,GACd,IAAK,IAAI7F,EAAI0F,EAAK1F,EAAIb,KAAKC,QAAU4F,EAAGhF,IACpCb,KAAKqD,OAAOxC,EAAGb,KAAK+D,OAAOlD,EAAIgF,IAEvC7F,KAAK0C,UAAU1C,KAAKC,QAAU4F,EAClC,CACAc,aAAaC,EAAMxD,GAAO,GACtB,GAAIpD,KAAKC,SAAW2G,EAAKlG,OACrB,MAAM,IAAIM,MAAM,yBACpB,GAAI4F,GAAQ5G,KACRA,KAAK0C,UAAUkE,EAAK/C,WAAWT,IAC/BpD,KAAKoE,QAAQhB,OAEZ,CACD,IAAIyD,EAAS,EACb,IAAK,IAAIC,GAAU,GAA+C,IAA3CA,EAASF,EAAKG,SAASD,GAAS1D,KACnDpD,KAAK0E,QAAQmC,IAAU7G,KAAK+D,OAAO+C,IACvC9G,KAAKC,QAAU4G,EACf7G,KAAKE,UACT,CACA,OAAOF,IACX,CAEA+D,OAAOwC,GACH,OAAqE,IAA7DvG,KAAKc,MAAMuB,KAAKC,MAAMiE,EAAM,KAAU,IAAY,GAANA,GACxD,CAEAlD,OAAOkD,EAAKS,EAAK5E,GAAS,GACtBpC,KAAK0E,QAAQ6B,EAAKS,GAEdhH,KAAKE,UAGb,CAEAwE,QAAQ7D,EAAGS,GACHA,EACAtB,KAAKc,MAAMuB,KAAKC,MAAMzB,EAAI,MAAU,IAAU,GAAJA,GAE1Cb,KAAKc,MAAMuB,KAAKC,MAAMzB,EAAI,QAAY,IAAU,GAAJA,GACpD,CACA6E,QAAQa,GACJvG,KAAKc,MAAMuB,KAAKC,MAAMiE,EAAM,MAAU,IAAY,GAANA,EAChD,CACAZ,SAASY,GACLvG,KAAKc,MAAMuB,KAAKC,MAAMiE,EAAM,QAAY,IAAY,GAANA,GAClD,CACAU,YACI,OAAOjH,KAAK6D,WAAU,EAC1B,CACAqD,aACI,OAAOlH,KAAK6D,WAAU,EAC1B,CAEAA,UAAUvC,GACN,GAAoB,GAAhBtB,KAAKC,QACL,OAAO,EACX,GAAID,KAAKK,uBAAyBL,KAAKE,SAAU,CAC7CF,KAAKI,eAAiB,EACtB,MAAM8C,EAAMlD,KAAK+B,aACjB,IAAIlB,EAAI,EACR,KAAOA,EAAIqC,EAAM,EAAGrC,IAChB,IAAK,IAAIiF,EAAI9F,KAAKc,MAAMD,GAAS,GAALiF,EAAQA,KAAO,EACvC9F,KAAKI,gBAAkBR,EAASuH,YAAgB,IAAJrB,GAIpD,IAAIA,EAAI9F,KAAKc,MAAMD,GACnB,MAAMuG,EAA+B,GAAfpH,KAAKC,QAG3B,IAFqB,GAAjBmH,IACAtB,KAAO,YAAgBsB,IACf,GAALtB,EAAQA,KAAO,EAClB9F,KAAKI,gBAAkBR,EAASuH,YAAgB,IAAJrB,GAChD9F,KAAKK,sBAAwBL,KAAKE,QACtC,CACA,OAAQoB,EAAQtB,KAAKI,eAAiBJ,KAAKC,QAAUD,KAAKI,cAC9D,CAEAiH,WAAWtC,GACP,IAAIuC,EAAS,EACb,GAAItH,KAAKiH,aAAejH,KAAKC,QACzB,IAAK,IAAIY,EAAI,EAAGA,EAAIb,KAAKC,QAASY,IAC9ByG,GAAUvC,EAAMlE,GAAK,EAAI,OAG7B,IAAK,IAAIA,GAAK,GAAoC,IAAhCA,EAAIb,KAAK+G,SAASlG,GAAG,KACnCyG,GAAUvC,EAAMlE,GAAK,EAAI,EAEjC,OAAOyG,CACX,CAEAC,iBAAiBC,EAAQlG,GACrB,GAAoB,GAAhBtB,KAAKC,QACL,OAAO,EACX,IAAI2B,EAAQ,EACZ,MAAMsB,EAAMlD,KAAK+B,aACjB,IAAIlB,EAAI,EACR,KAAOA,EAAIqC,EAAM,EAAGrC,IAChB,IAAK,IAAIiF,EAAI9F,KAAKc,MAAMD,GAAK2G,EAAO1G,MAAMD,GAAS,GAALiF,EAAQA,KAAO,EACzDlE,GAAShC,EAASuH,YAAgB,IAAJrB,GAGtC,IAAIA,EAAI9F,KAAKc,MAAMD,GAAK2G,EAAO1G,MAAMD,GACrC,MAAMuG,EAA+B,GAAfpH,KAAKC,QAG3B,IAFqB,GAAjBmH,IACAtB,KAAO,YAAgBsB,IACf,GAALtB,EAAQA,KAAO,EAClBlE,GAAShC,EAASuH,YAAgB,IAAJrB,GAClC,OAAQxE,EAAQM,EAAQ5B,KAAKC,QAAU2B,CAC3C,CACA6C,QACIzE,KAAK0C,UAAU,EACnB,CACAgE,SAASpF,GACL,OAAOtB,KAAK+G,UAAU,EAAGzF,IAAU,CACvC,CACImG,cACA,OAAOzH,KAAK6D,WAAU,IAAS7D,KAAKC,OACxC,CACIyH,eACA,OAAO1H,KAAK6D,WAAU,IAAU7D,KAAKC,OACzC,CACI0H,cACA,OAAO3H,KAAK6D,WAAU,GAAQ,CAClC,CACI+D,eACA,OAAO5H,KAAK6D,WAAU,GAAS,CACnC,CAGAkD,SAASnC,EAAOtD,GAAQ,GAEpB,GADAtB,KAAKqB,cAAcuD,GAAQ,EAAG5E,KAAKC,QAAS,SACxC2E,GAAS5E,KAAKC,QAAU,EACxB,OAAQ,EAEZ,IAAI4H,EAAqB,IADzBjD,EAAQA,EAAQ,EAAI,EAAIA,EAAQ,GAEhC,MAAMkD,EAAU9H,KAAK+B,aACrB,IAAK,IAAIlB,EAAIwB,KAAKC,MAAMsC,EAAQ,IAAK/D,EAAIiH,EAASjH,IAAK,CACnD,IAAIiF,EAAKxE,EAAQtB,KAAKc,MAAMD,IAAMb,KAAKc,MAAMD,GAC7C,GAAkB,GAAdgH,EACA/B,GAAO,YAAc+B,EAAc,WACnCA,EAAa,OAEZ,IAAKvG,IAAe,YAANwE,EACf,SAEJ,IAAK,IAAIiC,EAAI,EAAQ,GAALjC,EAAQiC,GAAK,EAAGjC,KAAO,EAAG,CACtC,MAAMkC,EAAIpI,EAASqI,YAAgB,IAAJnC,GAC/B,GAAIkC,GAAK,EAEL,OADApD,EAAQoD,EAAS,GAAJnH,EAAUkH,IACV/H,KAAKC,SACN,EACL2E,CAEf,CACJ,CACA,OAAQ,CACZ,CAEAsD,SAAStD,EAAOtD,GAAQ,GACpB,GAAa,GAATsD,EACA,OAAQ,EACZ5E,KAAKqB,cAAcuD,GAAQ,EAAG5E,KAAKC,QAAS,SAG5C,IAAImH,EAAyB,GAF7BxC,EAAQA,EAAQ,EAAI5E,KAAKC,QAAU,EAAI2E,EAAQ,GAEb,GAClC,IAAK,IAAI/D,EAFUwB,KAAKC,MAAMsC,EAAQ,IAEb/D,GAAK,EAAGA,IAAK,CAClC,IAAIiF,EAAKxE,EAAQtB,KAAKc,MAAMD,IAAMb,KAAKc,MAAMD,GACxB,GAAjBuG,IACAtB,KAAO,YAAgBsB,GACvBA,EAAgB,GAEpB,IAAK,IAAIW,EAAI,GAAS,GAALjC,EAAQiC,GAAK,EAAGjC,IAAM,EAAG,CACtC,MAAMkC,EAAIpI,EAASuI,WAAWrC,IAAM,IACpC,GAAIkC,GAAK,EACL,OAAOA,EAAS,GAAJnH,EAAUkH,CAC9B,CACJ,CACA,OAAQ,CACZ,EAEJnI,EAASuH,YAAciB,UAAUlE,KAAK,CAClC,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,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAEjDtE,EAASqI,YAAcG,UAAUlE,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,IAEjDtE,EAASuI,WAAaC,UAAUlE,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,iBC5jB1C,SAASmE,EAAmBC,EAAGC,GAClC,MAAMC,EAA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","sources":["webpack://bio/./node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/typed-metrics/consts.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/bit-array.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-metrics-methods.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/typed-metrics/typed-metrics.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/types.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/utils.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/distance-matrix-service.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/umap/utils.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/umap/heap.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/umap/matrix.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/umap/tree.js","webpack://bio/./node_modules/is-any-array/src/index.js","webpack://bio/./node_modules/ml-levenberg-marquardt/src/errorCalculation.js","webpack://bio/./node_modules/ml-matrix/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-rescale/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-max/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-min/node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/ml-array-rescale/lib-es6/index.js","webpack://bio/./node_modules/ml-array-min/lib-es6/index.js","webpack://bio/./node_modules/ml-array-max/lib-es6/index.js","webpack://bio/./node_modules/ml-matrix/src/inspect.js","webpack://bio/./node_modules/ml-matrix/src/util.js","webpack://bio/./node_modules/ml-matrix/src/matrix.js","webpack://bio/./node_modules/ml-matrix/src/stat.js","webpack://bio/./node_modules/ml-matrix/src/mathOperations.js","webpack://bio/./node_modules/ml-matrix/src/wrap/WrapperMatrix2D.js","webpack://bio/./node_modules/ml-matrix/src/dc/lu.js","webpack://bio/./node_modules/ml-matrix/src/dc/util.js","webpack://bio/./node_modules/ml-matrix/src/dc/qr.js","webpack://bio/./node_modules/ml-matrix/src/dc/svd.js","webpack://bio/./node_modules/ml-levenberg-marquardt/src/step.js","webpack://bio/./node_modules/ml-matrix/src/decompositions.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/umap/umap.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/umap/nn_descent.js","webpack://bio/./node_modules/ml-levenberg-marquardt/src/index.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/sparse-matrix-service.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/multi-column-dim-reducer.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/proxy.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/mulit-column-dim-reducer-worker.js","webpack://bio/./node_modules/@keckelt/tsne/lib/index.js","webpack://bio/./node_modules/@keckelt/tsne/lib/tsne.js","webpack://bio/./node_modules/seedrandom/index.js","webpack://bio/./node_modules/seedrandom/lib/alea.js","webpack://bio/./node_modules/seedrandom/lib/tychei.js","webpack://bio/./node_modules/seedrandom/lib/xor128.js","webpack://bio/./node_modules/seedrandom/lib/xor4096.js","webpack://bio/./node_modules/seedrandom/lib/xorshift7.js","webpack://bio/./node_modules/seedrandom/lib/xorwow.js","webpack://bio/./node_modules/seedrandom/seedrandom.js"],"sourcesContent":["/**\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=","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 || (DistanceMetricsSubjects = {}));\nexport var NumberMetricsNames;\n(function (NumberMetricsNames) {\n NumberMetricsNames[\"Difference\"] = \"Difference\";\n})(NumberMetricsNames || (NumberMetricsNames = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29uc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLGtCQUtUO0FBTEgsV0FBWSxrQkFBa0I7SUFDMUIsaURBQTJCLENBQUE7SUFDM0Isa0RBQTRCLENBQUE7SUFDNUIsNkNBQXVCLENBQUE7SUFDdkIsd0NBQWtCLENBQUE7QUFDcEIsQ0FBQyxFQUxTLGtCQUFrQixLQUFsQixrQkFBa0IsUUFLM0I7QUFFSCxNQUFNLENBQU4sSUFBWSxrQkFFVDtBQUZILFdBQVksa0JBQWtCO0lBQzFCLDZDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFGUyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRTNCO0FBRUgsTUFBTSxDQUFOLElBQVksb0JBYVQ7QUFiSCxXQUFZLG9CQUFvQjtJQUM1Qiw2Q0FBcUIsQ0FBQTtJQUNyQixxQ0FBYSxDQUFBO0lBQ2IsaURBQXlCLENBQUE7SUFDekIsd0RBQWdDLENBQUE7SUFDaEMseUNBQWlCLENBQUE7SUFDakIsaURBQXlCLENBQUE7SUFDekIsc0RBQThCLENBQUE7SUFDOUIsd0RBQWdDLENBQUE7SUFDaEMseUNBQWlCLENBQUE7SUFDakIsdUNBQWUsQ0FBQTtJQUNmLDJDQUFtQixDQUFBO0lBQ25CLCtDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFiUyxvQkFBb0IsS0FBcEIsb0JBQW9CLFFBYTdCO0FBRUgsTUFBTSxDQUFOLElBQVksb0JBRVg7QUFGRCxXQUFZLG9CQUFvQjtJQUM5Qiw2REFBcUMsQ0FBQTtBQUN2QyxDQUFDLEVBRlcsb0JBQW9CLEtBQXBCLG9CQUFvQixRQUUvQjtBQUVELE1BQU0sQ0FBTixJQUFZLHVCQU9UO0FBUEgsV0FBWSx1QkFBdUI7SUFDL0IsNENBQWlCLENBQUE7SUFDakIsNENBQWlCLENBQUE7SUFDakIsZ0RBQXFCLENBQUE7SUFDckIsMERBQStCLENBQUE7SUFDL0IsNENBQWlCLENBQUE7SUFDakIsZ0RBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQVBTLHVCQUF1QixLQUF2Qix1QkFBdUIsUUFPaEM7QUFFSCxNQUFNLENBQU4sSUFBWSxrQkFFWDtBQUZELFdBQVksa0JBQWtCO0lBQzVCLCtDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFGVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRTdCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGVudW0gU3RyaW5nTWV0cmljc05hbWVzIHtcbiAgICBMZXZlbnNodGVpbiA9ICdMZXZlbnNodGVpbicsXG4gICAgSmFyb1dpbmtsZXIgPSAnSmFyby1XaW5rbGVyJyxcbiAgICBNYW5oYXR0YW4gPSAnTWFuaGF0dGFuJyxcbiAgICBPbmVob3QgPSAnT25lLUhvdCcsXG4gIH1cblxuZXhwb3J0IGVudW0gVmVjdG9yTWV0cmljc05hbWVzIHtcbiAgICBFdWNsaWRlYW4gPSAnRXVjbGlkZWFuJyxcbiAgfVxuXG5leHBvcnQgZW51bSBCaXRBcnJheU1ldHJpY3NOYW1lcyB7XG4gICAgVGFuaW1vdG8gPSAnVGFuaW1vdG8nLFxuICAgIERpY2UgPSAnRGljZScsXG4gICAgQXN5bW1ldHJpYyA9ICdBc3ltbWV0cmljJyxcbiAgICBCcmF1bkJsYW5xdWV0ID0gJ0JyYXVuLUJsYW5xdWV0JyxcbiAgICBDb3NpbmUgPSAnQ29zaW5lJyxcbiAgICBLdWxjenluc2tpID0gJ0t1bGN6eW5za2knLFxuICAgIE1jQ29ubmF1Z2hleSA9ICdNYy1Db25uYXVnaGV5JyxcbiAgICBSb2dvdEdvbGRiZXJnID0gJ1JvZ290LUdvbGRiZXJnJyxcbiAgICBSdXNzZWwgPSAnUnVzc2VsJyxcbiAgICBTb2thbCA9ICdTb2thbCcsXG4gICAgSGFtbWluZyA9ICdIYW1taW5nJyxcbiAgICBFdWNsaWRlYW4gPSAnRXVjbGlkZWFuJyxcbiAgfVxuXG5leHBvcnQgZW51bSBJbnRBcnJheU1ldHJpY3NOYW1lcyB7XG4gIFRhbmltb3RvSW50QXJyYXkgPSAnVGFuaW1vdG9JbnRBcnJheScsXG59XG5cbmV4cG9ydCBlbnVtIERpc3RhbmNlTWV0cmljc1N1YmplY3RzIHtcbiAgICBWZWN0b3IgPSAnVmVjdG9yJyxcbiAgICBTdHJpbmcgPSAnU3RyaW5nJyxcbiAgICBCaXRBcnJheSA9ICdCaXRBcnJheScsXG4gICAgTWFjcm9Nb2xlY3VsZSA9ICdNYWNyb01vbGVjdWxlJyxcbiAgICBOdW1iZXIgPSAnTnVtYmVyJyxcbiAgICBJbnRBcnJheSA9ICdJbnRBcnJheScsXG4gIH1cblxuZXhwb3J0IGVudW0gTnVtYmVyTWV0cmljc05hbWVzIHtcbiAgRGlmZmVyZW5jZSA9ICdEaWZmZXJlbmNlJyxcbn1cblxuIl19","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 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 getDistanceFromSimilarity(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 getDistanceFromSimilarity(diceSimilarity(x, y));\n}\nexport function cosineSimilarity(x, y) {\n const total = x.trueCount() * y.trueCount();\n if (total == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / Math.sqrt(total);\n}\nexport function cosineDistance(x, y) {\n return getDistanceFromSimilarity(cosineSimilarity(x, y));\n}\nexport function euclideanSimilarity(x, y) {\n return getSimilarityFromDistance(euclideanDistance(x, y));\n}\nexport function euclideanDistance(x, y) {\n return Math.sqrt(x.trueCount() + y.trueCount() - 2 * x.andWithCountBits(y, true));\n}\nexport function hammingSimilarity(x, y) {\n return getSimilarityFromDistance(hammingDistance(x, y));\n}\nexport function hammingDistance(x, y) {\n return x.trueCount() + y.trueCount() - 2 * x.andWithCountBits(y, true);\n}\nexport function sokalSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const common = x.andWithCountBits(y, true);\n return common / (2 * total - 3 * common);\n}\nexport function sokalDistance(x, y) {\n return getDistanceFromSimilarity(sokalSimilarity(x, y));\n}\nexport function kulczynskiSimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const totalProd = x.trueCount() * y.trueCount();\n if (totalProd == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return (common * total) / (2 * totalProd);\n}\nexport function kulczynskiDistance(x, y) {\n return getDistanceFromSimilarity(kulczynskiSimilarity(x, y));\n}\nexport function mcConnaugheySimilarity(x, y) {\n const total = x.trueCount() + y.trueCount();\n const totalProd = x.trueCount() * y.trueCount();\n if (totalProd == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return (common * total - totalProd) / totalProd;\n}\nexport function mcConnaugheyDistance(x, y) {\n return getDistanceFromSimilarity(mcConnaugheySimilarity(x, y));\n}\nexport function asymmetricSimilarity(x, y) {\n const min = Math.min(x.trueCount(), y.trueCount());\n if (min == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / min;\n}\nexport function asymmetricDistance(x, y) {\n return getDistanceFromSimilarity(asymmetricSimilarity(x, y));\n}\nexport function braunBlanquetSimilarity(x, y) {\n const max = Math.max(x.trueCount(), y.trueCount());\n if (max == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / max;\n}\nexport function braunBlanquetDistance(x, y) {\n return getDistanceFromSimilarity(braunBlanquetSimilarity(x, y));\n}\nexport function russelSimilarity(x, y) {\n if (x.length == 0)\n return 0.0;\n const common = x.andWithCountBits(y, true);\n return common / x.length;\n}\nexport function russelDistance(x, y) {\n return getDistanceFromSimilarity(russelSimilarity(x, y));\n}\nexport function rogotGoldbergSimilarity(x, y) {\n const common = x.andWithCountBits(y, true);\n const total = x.countBits(true) + y.countBits(true);\n const len = x.length;\n const diff = len - total + common;\n if ((common == len) || (diff == len))\n return 1.0;\n else\n return common / total + diff / (2 * len - total);\n}\nexport function rogotGoldbergDistance(x, y) {\n return getDistanceFromSimilarity(rogotGoldbergSimilarity(x, y));\n}\nexport function getSimilarityFromDistance(distance) {\n return 1 / (1 + distance);\n}\nexport function getDistanceFromSimilarity(similarity) {\n return similarity === 0 ? 3.402823E+38 : (1 / similarity) - 1;\n}\nexport function numericDistance(x, y) {\n return Math.abs(x - y);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sUUFBUSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9ELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRTVFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE2RDtJQUN4RixDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxFQUFFLGtCQUFrQjtJQUNuRCxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLGNBQWM7SUFDM0MsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxvQkFBb0I7SUFDdkQsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBRSx1QkFBdUI7SUFDN0QsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDL0MsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxvQkFBb0I7SUFDdkQsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxzQkFBc0I7SUFDM0QsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsRUFBRSx1QkFBdUI7SUFDN0QsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0I7SUFDL0MsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxlQUFlO0lBQzdDLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUUsaUJBQWlCO0lBQ2pELENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEVBQUUsbUJBQW1CO0NBQ3RELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQTZEO0lBQ3ZGLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEVB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QyxHQUFHLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxDQUFTLEVBQUUsQ0FBUztJQUNsRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQml0QXJyYXkgZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvYml0LWFycmF5JztcbmltcG9ydCB7Qml0QXJyYXlNZXRyaWNzTmFtZXN9IGZyb20gJy4vdHlwZWQtbWV0cmljcy9jb25zdHMnO1xuaW1wb3J0IHtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXN9IGZyb20gJy4vbWFjcm9tb2xlY3VsZS1kaXN0YW5jZS1mdW5jdGlvbnMnO1xuXG5leHBvcnQgY29uc3Qgc2ltaWxhcml0eU1ldHJpYzogeyBbbmFtZTogc3RyaW5nXTogKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSkgPT4gbnVtYmVyIH0gPSB7XG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b106IHRhbmltb3RvU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdOiBkaWNlU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkFzeW1tZXRyaWNdOiBhc3ltbWV0cmljU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkJyYXVuQmxhbnF1ZXRdOiBicmF1bkJsYW5xdWV0U2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV06IGNvc2luZVNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5LdWxjenluc2tpXToga3VsY3p5bnNraVNpbWlsYXJpdHksXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5NY0Nvbm5hdWdoZXldOiBtY0Nvbm5hdWdoZXlTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ106IHJvZ290R29sZGJlcmdTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUnVzc2VsXTogcnVzc2VsU2ltaWxhcml0eSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlNva2FsXTogc29rYWxTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuSGFtbWluZ106IGhhbW1pbmdTaW1pbGFyaXR5LFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXTogZXVjbGlkZWFuU2ltaWxhcml0eSxcbn07XG5cbmV4cG9ydCBjb25zdCBkaXN0YW5jZU1ldHJpY3M6IHsgW25hbWU6IHN0cmluZ106ICh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpID0+IG51bWJlciB9ID0ge1xuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dOiB0YW5pbW90b0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuRGljZV06IGRpY2VEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkFzeW1tZXRyaWNdOiBhc3ltbWV0cmljRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5CcmF1bkJsYW5xdWV0XTogYnJhdW5CbGFucXVldERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lXTogY29zaW5lRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5LdWxjenluc2tpXToga3VsY3p5bnNraURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuTWNDb25uYXVnaGV5XTogbWNDb25uYXVnaGV5RGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Sb2dvdEdvbGRiZXJnXTogcm9nb3RHb2xkYmVyZ0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUnVzc2VsXTogcnVzc2VsRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF06IHNva2FsRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5IYW1taW5nXTogaGFtbWluZ0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXTogZXVjbGlkZWFuRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3QgQ0hFTV9TSU1JTEFSSVRZX01FVFJJQ1MgPSBbXG4gIEJpdEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvLFxuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5EaWNlLFxuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdO1xuZXhwb3J0IGNvbnN0IFNFUV9TUEFDRV9TSU1JTEFSSVRZX01FVFJJQ1MgPSBbXG4gIEJpdEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvLFxuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljLFxuICBCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmUsXG4gIEJpdEFycmF5TWV0cmljc05hbWVzLlNva2FsXTtcbmV4cG9ydCBjb25zdCBNQUNST01PTEVDVUxFX1NJTUlMQVJJVFlfTUVUUklDUyA9IFtcbiAgTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkhBTU1JTkcsXG4gIE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5MRVZFTlNIVEVJTixcbiAgTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLk1PTk9NRVJfQ0hFTUlDQUxfRElTVEFOQ0UsXG4gIE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5ORUVETEVNQU5OX1dVTlNDSFxuXTtcblxuXG5leHBvcnQgZnVuY3Rpb24gdGFuaW1vdG9TaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCk7XG4gIGlmICh0b3RhbCA9PSAwKSByZXR1cm4gMS4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyAodG90YWwgLSBjb21tb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFuaW1vdG9EaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eSh0YW5pbW90b1NpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFuaW1vdG9EaXN0YW5jZUludEFycmF5KHg6IFVpbnQzMkFycmF5LCB5OiBVaW50MzJBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHhiID0gbmV3IEJpdEFycmF5KHgsIHgubGVuZ3RoICogMzIpO1xuICBjb25zdCB5YiA9IG5ldyBCaXRBcnJheSh5LCB5Lmxlbmd0aCAqIDMyKTtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkodGFuaW1vdG9TaW1pbGFyaXR5KHhiLCB5YikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGljZVNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIDIgKiBjb21tb24gLyB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpY2VEaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShkaWNlU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3NpbmVTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHRvdGFsID0geC50cnVlQ291bnQoKSAqIHkudHJ1ZUNvdW50KCk7XG4gIGlmICh0b3RhbCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyBNYXRoLnNxcnQodG90YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29zaW5lRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkoY29zaW5lU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldWNsaWRlYW5TaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXRTaW1pbGFyaXR5RnJvbURpc3RhbmNlKGV1Y2xpZGVhbkRpc3RhbmNlKHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV1Y2xpZGVhbkRpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnNxcnQoeC50cnVlQ291bnQoKSArIHkudHJ1ZUNvdW50KCkgLSAyICogeC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbW1pbmdTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXRTaW1pbGFyaXR5RnJvbURpc3RhbmNlKGhhbW1pbmdEaXN0YW5jZSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW1taW5nRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpIC0gMiAqIHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNva2FsU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyAoMiAqIHRvdGFsIC0gMyAqIGNvbW1vbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb2thbERpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KHNva2FsU2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBrdWxjenluc2tpU2ltaWxhcml0eSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCB0b3RhbCA9IHgudHJ1ZUNvdW50KCkgKyB5LnRydWVDb3VudCgpO1xuICBjb25zdCB0b3RhbFByb2QgPSB4LnRydWVDb3VudCgpICogeS50cnVlQ291bnQoKTtcbiAgaWYgKHRvdGFsUHJvZCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiAoY29tbW9uICogdG90YWwpIC8gKDIgKiB0b3RhbFByb2QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga3VsY3p5bnNraURpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KGt1bGN6eW5za2lTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1jQ29ubmF1Z2hleVNpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgdG90YWwgPSB4LnRydWVDb3VudCgpICsgeS50cnVlQ291bnQoKTtcbiAgY29uc3QgdG90YWxQcm9kID0geC50cnVlQ291bnQoKSAqIHkudHJ1ZUNvdW50KCk7XG4gIGlmICh0b3RhbFByb2QgPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gKGNvbW1vbiAqIHRvdGFsIC0gdG90YWxQcm9kKSAvIHRvdGFsUHJvZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1jQ29ubmF1Z2hleURpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KG1jQ29ubmF1Z2hleVNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXN5bW1ldHJpY1NpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgbWluID0gTWF0aC5taW4oeC50cnVlQ291bnQoKSwgeS50cnVlQ291bnQoKSk7XG4gIGlmIChtaW4gPT0gMCkgcmV0dXJuIDAuMDtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICByZXR1cm4gY29tbW9uIC8gbWluO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXN5bW1ldHJpY0Rpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KGFzeW1tZXRyaWNTaW1pbGFyaXR5KHgsIHkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJyYXVuQmxhbnF1ZXRTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IG1heCA9IE1hdGgubWF4KHgudHJ1ZUNvdW50KCksIHkudHJ1ZUNvdW50KCkpO1xuICBpZiAobWF4ID09IDApIHJldHVybiAwLjA7XG4gIGNvbnN0IGNvbW1vbiA9IHguYW5kV2l0aENvdW50Qml0cyh5LCB0cnVlKTtcbiAgcmV0dXJuIGNvbW1vbiAvIG1heDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJyYXVuQmxhbnF1ZXREaXN0YW5jZSh4OiBCaXRBcnJheSwgeTogQml0QXJyYXkpOiBudW1iZXIge1xuICByZXR1cm4gZ2V0RGlzdGFuY2VGcm9tU2ltaWxhcml0eShicmF1bkJsYW5xdWV0U2ltaWxhcml0eSh4LCB5KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydXNzZWxTaW1pbGFyaXR5KHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIGlmICh4Lmxlbmd0aCA9PSAwKSByZXR1cm4gMC4wO1xuICBjb25zdCBjb21tb24gPSB4LmFuZFdpdGhDb3VudEJpdHMoeSwgdHJ1ZSk7XG4gIHJldHVybiBjb21tb24gLyB4Lmxlbmd0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1c3NlbERpc3RhbmNlKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSk6IG51bWJlciB7XG4gIHJldHVybiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KHJ1c3NlbFNpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcm9nb3RHb2xkYmVyZ1NpbWlsYXJpdHkoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgY29tbW9uID0geC5hbmRXaXRoQ291bnRCaXRzKHksIHRydWUpO1xuICBjb25zdCB0b3RhbCA9IHguY291bnRCaXRzKHRydWUpICsgeS5jb3VudEJpdHModHJ1ZSk7XG4gIGNvbnN0IGxlbiA9IHgubGVuZ3RoO1xuICBjb25zdCBkaWZmID0gbGVuIC0gdG90YWwgKyBjb21tb247XG4gIGlmICgoY29tbW9uID09IGxlbikgfHwgKGRpZmYgPT0gbGVuKSkgcmV0dXJuIDEuMDtcbiAgZWxzZSByZXR1cm4gY29tbW9uIC8gdG90YWwgKyBkaWZmIC8gKDIgKiBsZW4gLSB0b3RhbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByb2dvdEdvbGRiZXJnRGlzdGFuY2UoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldERpc3RhbmNlRnJvbVNpbWlsYXJpdHkocm9nb3RHb2xkYmVyZ1NpbWlsYXJpdHkoeCwgeSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2ltaWxhcml0eUZyb21EaXN0YW5jZShkaXN0YW5jZTogbnVtYmVyKSB7XG4gIHJldHVybiAxIC8gKDEgKyBkaXN0YW5jZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaXN0YW5jZUZyb21TaW1pbGFyaXR5KHNpbWlsYXJpdHk6IG51bWJlcikgeyAvL2luIGNhc2Ugc2ltaWxhcml0eSBpcyAwLCB1c2UgbWF4IG51bWJlciBmb3IgZmxvYXQzMlxuICByZXR1cm4gc2ltaWxhcml0eSA9PT0gMCA/IDMuNDAyODIzRSszOCA6ICgxIC8gc2ltaWxhcml0eSkgLSAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbnVtZXJpY0Rpc3RhbmNlKHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gIHJldHVybiBNYXRoLmFicyh4IC0geSk7XG59XG4iXX0=","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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsVUFBa0IsRUFBRSxVQUFrQixFQUFFLE9BQWUsQ0FBQztJQUN0RixPQUFPLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFjO0lBQzVDLE9BQU8sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDdkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEYsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLGFBQXFCLENBQUM7SUFDcEUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUV4QixNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsOEJBQThCLENBQUMsQ0FBQztJQUUzRCxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDL0IsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXRDLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxRQUFRLENBQUMsQ0FBUztJQUN6QixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFFZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDL0IsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoQixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsWUFBWSxDQUFDLENBQVM7SUFDN0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN4QixNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDL0IsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFekIsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxDQUFTO0lBQ3BDLElBQUksTUFBTSxHQUFXLENBQUMsQ0FBQztJQUN2QixLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFDdkMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsRUFBVSxFQUFFLEVBQVU7SUFDckQsSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxNQUFNO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztJQUNsRSxJQUFJLElBQUksR0FBVyxDQUFDLENBQUM7SUFDckIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1FBQ3hDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFVBQWtCLEVBQUUsVUFBa0IsRUFBRSxRQUFnQixFQUFFO0lBQ3pGLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNuQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUNqQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3JDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDN0QsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUVyQixJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTTtRQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFFbEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLFNBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUksQ0FBQyxDQUFBLENBQUM7SUFFL0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQWEsRUFBRSxRQUF3QjtJQUN4RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzNCLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWxELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDbkMsTUFBTSxDQUFDLEdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNqQztLQUNGO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsNEJBQTRCLENBQUMsSUFBYSxFQUFFLFFBQXdCO0lBQ2xGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDM0IsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEQsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUMzQixJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO0lBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtZQUMvQixNQUFNLENBQUMsR0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLEdBQUcsR0FBRztnQkFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxHQUFHLEdBQUc7Z0JBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztTQUN0QjtLQUNGO0lBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDakMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztLQUNwRTtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxrRkFBa0Y7QUFDbEYsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLFlBQVksR0FBRyxLQUFLO0lBQ3ZFLE1BQU0sTUFBTSxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDN0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7SUFFeEIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFDLE1BQWEsRUFBRSxPQUFPLEdBQUcsS0FBSztJQUNwRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBUSxFQUFFLENBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBUSxFQUFFLENBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkcsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFNLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQjtJQUNsRSxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO0lBQ3ZELE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBVSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBYyxFQUFFLENBQVMsRUFBRSxJQUF3QztJQUNsRyxTQUFTLEtBQUssQ0FBQyxNQUFnQyxFQUFFLE9BQThCO1FBQzdFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFFdEIsS0FBSyxNQUFNLE9BQU8sSUFBSSxNQUFNLEVBQUU7WUFDNUIsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxjQUFjLEdBQUcsVUFBVSxFQUFFO2dCQUNyRCxRQUFRLEdBQUcsT0FBTyxDQUFDO2dCQUNuQixVQUFVLEdBQUcsY0FBYyxDQUFDO2FBQzdCO1NBQ0Y7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUU3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNyQixVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3JCO0lBRUQsT0FBTyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN4QixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQ2YsVUFBVSxDQUFDLE1BQU0sRUFBOEIsRUFDL0MsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVMsR0FBRyxFQUFFLEtBQUs7WUFDeEQsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNQLElBQUksR0FBRyxFQUFFO1lBQ1AsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3hCO0tBQ0Y7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQVk7SUFDcEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN4QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDWixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7SUFFckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUM1QixHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsWUFBWSxJQUFJLFNBQUEsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFJLENBQUMsQ0FBQSxDQUFDO0tBQzlCO0lBRUQsTUFBTSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUN2QixNQUFNLGFBQWEsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxHQUFHLFNBQUEsSUFBSSxFQUFJLENBQUMsQ0FBQSxDQUFDLENBQUM7SUFFdEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQztJQUU3QyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsQ0FBUSxFQUFFLENBQVE7SUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNYXRyaXgsIFZlY3RvciwgQ29vcmRpbmF0ZXMsIFZlY3RvcnMsIERpc3RhbmNlTWV0cmljfSBmcm9tICcuL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7cmFuZG9tRmxvYXQsIHJhbmRvbUludH0gZnJvbSAnLi9yYW5kb20nO1xuXG4vKipcbiAqIEFzc2VydHMgYSBjb25kaXRpb24gYnkgdGhyb3dpbmcgYW4gRXJyb3IuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtib29sZWFufSBbY29uZGl0aW9uPWZhbHNlXSBDb25kaXRpb24gdG8gYXNzZXJ0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPSdBc3NlcnRpb24gZXJyb3IuJ10gTWVzc2FnZSB0byBvdXRwdXQuXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb246IGJvb2xlYW4gPSBmYWxzZSwgbWVzc2FnZTogc3RyaW5nID0gJ0Fzc2VydGlvbiBlcnJvci4nKSB7XG4gIGlmICghY29uZGl0aW9uKVxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIG5ldyB0d28tZGltZW5zaW9uYWwgYXJyYXkgYW5kIGZpbGxzIGl0IHdpdGggdGhlIHZhbHVlIGdpdmVuLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBkaW1lbnNpb24xIFRoZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhlIGNvb3JkaW5hdGVzIChudW1iZXIgb2Ygcm93cykuXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgY29vcmRpbmF0ZXMgKG51bWJlciBvZiBjb2x1bW5zKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbD0wXSBBIHZhbHVlIHRvIGZpbGwgdGhlIGNvb3JkaW5hdGVzIHdpdGguXG4gKiBAcmV0dXJuIHtDb29yZGluYXRlc30gQSB0d28tZGltZW5zaW9uYWwgZmlsbGVkIHdpdGggdGhlIHZhbHVlIGdpdmVuLlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIGZpbGw6IG51bWJlciA9IDApOiBDb29yZGluYXRlcyB7XG4gIHJldHVybiBuZXcgQXJyYXkoZGltZW5zaW9uMSkuZmlsbChmaWxsKS5tYXAoKCkgPT4gKG5ldyBWZWN0b3IoZGltZW5zaW9uMikuZmlsbChmaWxsKSkpO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBNYXRyaXgge1xuICByZXR1cm4gbmV3IEFycmF5KG1hdHJpeFswXS5sZW5ndGgpLmZpbGwoMClcbiAgICAubWFwKChfLCBpKSA9PiAobmV3IFZlY3RvcihtYXRyaXgubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaikgPT4gKG1hdHJpeFtqXVtpXSkpKSk7XG59XG5cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocDogVmVjdG9yLCBxOiBWZWN0b3IsIG11bHRpcGxpZXI6IG51bWJlciA9IDEpOiBWZWN0b3Ige1xuICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcblxuICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuXG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHBbaV0gKyBtdWx0aXBsaWVyICogcVtpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbi8qKlxuICogU3VtcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBiZSBzdW1tZWQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2ZWN0b3IncyBpdGVtcyBzdW0uXG4gKi9cbmZ1bmN0aW9uIGl0ZW1zU3VtKHY6IFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgIHRvdGFsICs9IHZbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1cWFyZXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gc3F1YXJlLlxuICogQHJldHVybiB7VmVjdG9yfSBBIG5ldyB2ZWN0b3IgY29udGFpbmluZyB0aGUgb3JpZ2luYWwncyBpdGVtcyBzcXVhcmVkLlxuICovXG5mdW5jdGlvbiB2ZWN0b3JTcXVhcmUodjogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3Rvckxlbmd0aCh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgc3FyU3VtOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICBzcXJTdW0gKz0gdltpXSAqIHZbaV07XG4gIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvckRvdFByb2R1Y3QodjE6IFZlY3RvciwgdjI6IFZlY3Rvcik6IG51bWJlciB7XG4gIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSB2ZWN0b3JzIG11c3QgbWF0Y2gnKTtcbiAgbGV0IHByb2Q6IG51bWJlciA9IDA7XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKylcbiAgICBwcm9kICs9IHYxW2ldICogdjJbaV07XG4gIHJldHVybiBwcm9kO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xLl0gTWF4IHZhbHVlIGdpdmVuIGJ5IHJhbmRvbSBnZW5lcmF0b3IuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IEEgbmV3IG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSYW5kb21NYXRyaXgoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIHNjYWxlOiBudW1iZXIgPSAxLik6IE1hdHJpeCB7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhkaW1lbnNpb24xLCBkaW1lbnNpb24yKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbWVuc2lvbjE7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UocDogVmVjdG9yLCBxOiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgcmVzdWx0ID0gMDtcbiAgY29uc3QgbGVuID0gcC5sZW5ndGg7XG5cbiAgaWYgKGxlbiAhPT0gcS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZGltZW5zaW9uYWxpdHkgb2YgdGhlIHZlY3RvcnMgbXVzdCBtYXRjaCcpO1xuICBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICByZXN1bHQgKz0gKHBbaV0gLSBxW2ldKSAqKiAyO1xuICBcbiAgcmV0dXJuIE1hdGguc3FydChyZXN1bHQpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgYSBjdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3JzfSBkYXRhIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy5cbiAqIEBwYXJhbSB7RGlzdGFuY2VNZXRyaWN9IGRpc3RhbmNlIEN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge01hdHJpeH0gQ2FsY3VsYXRlZCBjdXN0b20gZGlzdGFuY2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY0Rpc3RhbmNlTWF0cml4KGRhdGE6IFZlY3RvcnMsIGRpc3RhbmNlOiBEaXN0YW5jZU1ldHJpYyk6IE1hdHJpeCB7XG4gIGNvbnN0IG5JdGVtcyA9IGRhdGEubGVuZ3RoO1xuICBjb25zdCBtYXRyaXggPSBpbml0Q29vcmRpbmF0ZXMobkl0ZW1zLCBuSXRlbXMsIDApO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBuSXRlbXM7ICsraikge1xuICAgICAgY29uc3QgZDogbnVtYmVyID0gKGRhdGFbaV0gPT0gbnVsbCkgfHwgKGRhdGFbal0gPT0gbnVsbCkgPyAwIDogZGlzdGFuY2UoZGF0YVtpXSwgZGF0YVtqXSk7XG4gICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbal1baV0gPSBkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWF0cml4O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgYSBjdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3JzfSBkYXRhIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy5cbiAqIEBwYXJhbSB7RGlzdGFuY2VNZXRyaWN9IGRpc3RhbmNlIEN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge01hdHJpeH0gQ2FsY3VsYXRlZCBjdXN0b20gZGlzdGFuY2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY05vcm1hbGl6ZWREaXN0YW5jZU1hdHJpeChkYXRhOiBWZWN0b3JzLCBkaXN0YW5jZTogRGlzdGFuY2VNZXRyaWMpOiBNYXRyaXgge1xuICBjb25zdCBuSXRlbXMgPSBkYXRhLmxlbmd0aDtcbiAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcbiAgbGV0IG1heCA9IE51bWJlci5NSU5fVkFMVUU7XG4gIGxldCBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGk7IGogPCBuSXRlbXM7ICsraikge1xuICAgICAgY29uc3QgZDogbnVtYmVyID0gKGRhdGFbaV0gPT0gbnVsbCkgfHwgKGRhdGFbal0gPT0gbnVsbCB8fCBpID09PSBqKSA/IDAgOiBkaXN0YW5jZShkYXRhW2ldLCBkYXRhW2pdKTtcbiAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtqXVtpXSA9IGQ7XG4gICAgICBpZiAoZCA+IG1heCkgbWF4ID0gZDtcbiAgICAgIGlmIChkIDwgbWluKSBtaW4gPSBkO1xuICAgIH1cbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbkl0ZW1zOyArK2opXG4gICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbal1baV0gPSAobWF0cml4W2ldW2pdIC0gbWluKSAvIChtYXggLSBtaW4pO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKiBHZW5lcmF0ZXMgYXJyYXkgZnJvbSBhIHJhbmdlIFtiZWdpbjsgZW5kXSBvciBbYmVnaW47IGVuZCkgaWYgZW5kRXhjbHVzaXZlLiAqKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5SYW5nZShiZWdpbjogbnVtYmVyLCBlbmQ6IG51bWJlciwgZW5kRXhjbHVzaXZlID0gZmFsc2UpOiBJbnQzMkFycmF5IHtcbiAgY29uc3Qgbkl0ZW1zID0gZW5kIC0gYmVnaW4gKyAoZW5kRXhjbHVzaXZlID8gMCA6IDEpO1xuICBjb25zdCBzZXJpZXMgPSBuZXcgSW50MzJBcnJheShuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpXG4gICAgc2VyaWVzW2ldID0gYmVnaW4gKyBpO1xuXG4gIHJldHVybiBzZXJpZXM7XG59XG5cbi8qKlxuICogUmV0dXJucyBvcmRlciBvZiB2YWx1ZXMgYXMgaWYgdGhleSBhcmUgc29ydGVkLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7YW55W119IHZhbHVlcyBJbnB1dCBhcnJheS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldmVyc2U9ZmFsc2VdIFdoZXRoZXIgdG8gcmV0dXJuIHJldmVyc2VkIG9yZGVyLlxuICogQHJldHVybiB7bnVtYmVyW119IFRoZSBvcmRlciBjb21wdXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFyZ1NvcnQodmFsdWVzOiBhbnlbXSwgcmV2ZXJzZSA9IGZhbHNlKTogbnVtYmVyW10ge1xuICBjb25zdCBzb3J0Zm4gPSByZXZlcnNlID8gKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGJbMF0gLSBhWzBdKSA6IChhOiBhbnlbXSwgYjogYW55W10pID0+IChhWzBdIC0gYlswXSk7XG4gIGNvbnN0IGRlY29yID0gKHY6IGFueSwgaTogbnVtYmVyKSA9PiBbdiwgaV07IC8vIHNldCBpbmRleCB0byB2YWx1ZVxuICBjb25zdCB1bmRlY29yID0gKGE6IGFueVtdKSA9PiBhWzFdOyAvLyBsZWF2ZSBvbmx5IGluZGV4XG4gIGNvbnN0IF9hcmdzb3J0ID0gKGFycjogYW55W10pID0+IGFyci5tYXAoZGVjb3IpLnNvcnQoc29ydGZuKS5tYXAodW5kZWNvcik7XG4gIHJldHVybiBfYXJnc29ydCh2YWx1ZXMpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4ZXMgb2YgdGhlIG1vc3QgZGl2ZXJzZSBvYmplY3RzIGFjY29yZGluZyB0byB0aGUgZGlzdCBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCB0b3RhbCBudW1iZXIgb2Ygb2JqZWN0c1xuICogQHBhcmFtIHtudW1iZXJ9IG4gbnVtYmVyIG9mIGRpdmVyc2UgZWxlbWVudHMgdG8gZmluZFxuICogQHBhcmFtIHsoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyfSBkaXN0IGEgZnVuY3Rpb24gd2hpY2ggY2FsY3VsYXRlcyBkaXN0YW5jZSBiZXR3ZWVuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvIG9iamVjdHMgdXNpbmcgdGhlaXIgaW5kZXhlc1xuICogQHJldHVybnMge251bWJlcltdfSBUaGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpdmVyc2VTdWJzZXQobGVuZ3RoOiBudW1iZXIsIG46IG51bWJlciwgZGlzdDogKGkxOiBudW1iZXIsIGkyOiBudW1iZXIpID0+IG51bWJlcik6IG51bWJlcltdIHtcbiAgZnVuY3Rpb24gbWF4QnkodmFsdWVzOiBJdGVyYWJsZUl0ZXJhdG9yPG51bWJlcj4sIG9yZGVyQnk6IChpOiBudW1iZXIpID0+IG51bWJlcikge1xuICAgIGxldCBtYXhWYWx1ZSA9IG51bGw7XG4gICAgbGV0IG1heE9yZGVyQnkgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHZhbHVlcykge1xuICAgICAgY29uc3QgZWxlbWVudE9yZGVyQnkgPSBvcmRlckJ5KGVsZW1lbnQpO1xuICAgICAgaWYgKG1heE9yZGVyQnkgPT0gbnVsbCB8fCBlbGVtZW50T3JkZXJCeSA+IG1heE9yZGVyQnkpIHtcbiAgICAgICAgbWF4VmFsdWUgPSBlbGVtZW50O1xuICAgICAgICBtYXhPcmRlckJ5ID0gZWxlbWVudE9yZGVyQnk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXhWYWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHN1YnNldCA9IFtyYW5kb21JbnQobGVuZ3RoIC0gMSldO1xuICBjb25zdCBjb21wbGVtZW50ID0gbmV3IFNldCgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoIXN1YnNldC5pbmNsdWRlcyhpKSlcbiAgICAgIGNvbXBsZW1lbnQuYWRkKGkpO1xuICB9XG5cbiAgd2hpbGUgKHN1YnNldC5sZW5ndGggPCBuKSB7XG4gICAgY29uc3QgaWR4ID0gbWF4QnkoXG4gICAgICBjb21wbGVtZW50LnZhbHVlcygpIGFzIEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPixcbiAgICAgIChpKSA9PiBNYXRoLm1pbi5hcHBseShNYXRoLCBzdWJzZXQubWFwKGZ1bmN0aW9uKHZhbCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGRpc3QoaSwgdmFsKTtcbiAgICAgIH0pKSk7XG4gICAgaWYgKGlkeCkge1xuICAgICAgc3Vic2V0LnB1c2goaWR4KTtcbiAgICAgIGNvbXBsZW1lbnQuZGVsZXRlKGlkeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdWJzZXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBub3JtYWxpemVkIHZlY3Rvci5cbiAqIFxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3J9IGRhdGEgbnVtZXJpY2FsIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUoZGF0YTogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGg7XG4gIGxldCBzdW0gPSAwO1xuICBsZXQgc3VtT2ZTcXVhcmVzID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgc3VtICs9IGRhdGFbaV07XG4gICAgc3VtT2ZTcXVhcmVzICs9IGRhdGFbaV0gKiogMjtcbiAgfVxuXG4gIGNvbnN0IG1lYW4gPSBzdW0gLyBsZW47XG4gIGNvbnN0IHN0ZERldkludmVyc2UgPSAxLjAgLyBNYXRoLnNxcnQoc3VtT2ZTcXVhcmVzIC8gbGVuIC0gbWVhbiAqKiAyKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pICogc3RkRGV2SW52ZXJzZTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBGaW5kcyBzZXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBsaXN0cy5cbiAqIEBwYXJhbSB7YW55W119IGEgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge2FueVtdfSBiIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge2FueVtdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGlmZmVyZW5jZShhOiBhbnlbXSwgYjogYW55W10pOiBhbnlbXSB7XG4gIGNvbnN0IGJTZXQgPSBuZXcgU2V0KGIpO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGEuZmlsdGVyKCh4KSA9PiAhYlNldC5oYXMoeCkpKS52YWx1ZXMoKSk7XG59XG4iXX0=","import * as fl from 'fastest-levenshtein';\nimport { jaroWinkler } from 'jaro-winkler-typescript';\nimport { asymmetricDistance, braunBlanquetDistance, cosineDistance, diceDistance, euclideanDistance, hammingDistance, kulczynskiDistance, mcConnaugheyDistance, rogotGoldbergDistance, russelDistance, sokalDistance, tanimotoDistance, numericDistance, tanimotoDistanceIntArray, } from '../distance-metrics-methods';\nimport { calculateEuclideanDistance } from '@datagrok-libraries/utils/src/vector-operations';\nimport { mmDistanceFunctions, MmDistanceFunctionsNames } from '../macromolecule-distance-functions';\nimport { DistanceMetricsSubjects, BitArrayMetricsNames, StringMetricsNames, VectorMetricsNames, NumberMetricsNames, IntArrayMetricsNames } from './consts';\nexport const vectorDistanceMetricsMethods = {\n [VectorMetricsNames.Euclidean]: calculateEuclideanDistance,\n};\nexport const stringDistanceMetricsMethods = {\n [StringMetricsNames.Levenshtein]: fl.distance,\n [StringMetricsNames.JaroWinkler]: jaroWinkler,\n [StringMetricsNames.Manhattan]: manhattanDistance,\n [StringMetricsNames.Onehot]: categoricalDistance,\n};\nexport const bitArrayDistanceMetricsMethods = {\n [BitArrayMetricsNames.Tanimoto]: tanimotoDistance,\n [BitArrayMetricsNames.Dice]: diceDistance,\n [BitArrayMetricsNames.Asymmetric]: asymmetricDistance,\n [BitArrayMetricsNames.BraunBlanquet]: braunBlanquetDistance,\n [BitArrayMetricsNames.Cosine]: cosineDistance,\n [BitArrayMetricsNames.Kulczynski]: kulczynskiDistance,\n [BitArrayMetricsNames.McConnaughey]: mcConnaugheyDistance,\n [BitArrayMetricsNames.RogotGoldberg]: rogotGoldbergDistance,\n [BitArrayMetricsNames.Russel]: russelDistance,\n [BitArrayMetricsNames.Sokal]: sokalDistance,\n [BitArrayMetricsNames.Hamming]: hammingDistance,\n [BitArrayMetricsNames.Euclidean]: euclideanDistance,\n};\nexport const intArrayDistanceMetricsMethods = {\n [IntArrayMetricsNames.TanimotoIntArray]: tanimotoDistanceIntArray,\n};\nexport const numberDistanceMetricsMethods = {\n [NumberMetricsNames.Difference]: numericDistance,\n};\nexport const AvailableMetrics = {\n [DistanceMetricsSubjects.Vector]: {\n [VectorMetricsNames.Euclidean]: vectorDistanceMetricsMethods[VectorMetricsNames.Euclidean],\n },\n [DistanceMetricsSubjects.String]: {\n [StringMetricsNames.Levenshtein]: stringDistanceMetricsMethods[StringMetricsNames.Levenshtein],\n [StringMetricsNames.JaroWinkler]: stringDistanceMetricsMethods[StringMetricsNames.JaroWinkler],\n [StringMetricsNames.Manhattan]: stringDistanceMetricsMethods[StringMetricsNames.Manhattan],\n [StringMetricsNames.Onehot]: stringDistanceMetricsMethods[StringMetricsNames.Onehot],\n },\n [DistanceMetricsSubjects.BitArray]: {\n [BitArrayMetricsNames.Tanimoto]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Tanimoto],\n [BitArrayMetricsNames.Dice]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Dice],\n [BitArrayMetricsNames.Asymmetric]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Asymmetric],\n [BitArrayMetricsNames.BraunBlanquet]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.BraunBlanquet],\n [BitArrayMetricsNames.Cosine]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Cosine],\n [BitArrayMetricsNames.Kulczynski]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Kulczynski],\n [BitArrayMetricsNames.McConnaughey]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.McConnaughey],\n [BitArrayMetricsNames.RogotGoldberg]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.RogotGoldberg],\n [BitArrayMetricsNames.Russel]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Russel],\n [BitArrayMetricsNames.Sokal]: bitArrayDistanceMetricsMethods[BitArrayMetricsNames.Sokal],\n },\n [DistanceMetricsSubjects.MacroMolecule]: {\n [MmDistanceFunctionsNames.HAMMING]: mmDistanceFunctions[MmDistanceFunctionsNames.HAMMING],\n [MmDistanceFunctionsNames.LEVENSHTEIN]: mmDistanceFunctions[MmDistanceFunctionsNames.LEVENSHTEIN],\n [MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH]: mmDistanceFunctions[MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH],\n [MmDistanceFunctionsNames.MONOMER_CHEMICAL_DISTANCE]: mmDistanceFunctions[MmDistanceFunctionsNames.MONOMER_CHEMICAL_DISTANCE],\n },\n [DistanceMetricsSubjects.Number]: {\n [NumberMetricsNames.Difference]: numberDistanceMetricsMethods[NumberMetricsNames.Difference],\n },\n [DistanceMetricsSubjects.IntArray]: {\n [IntArrayMetricsNames.TanimotoIntArray]: intArrayDistanceMetricsMethods[IntArrayMetricsNames.TanimotoIntArray],\n }\n};\nexport const MetricToDataType = Object.keys(AvailableMetrics)\n .reduce((ret, key) => {\n for (const val of Object.keys(AvailableMetrics[key]))\n ret[val] = key;\n return ret;\n}, {});\nexport function isStringMetric(name) {\n return MetricToDataType[name] == 'String';\n}\nexport function isBitArrayMetric(name) {\n return MetricToDataType[name] == 'BitArray';\n}\nexport function isVectorMetric(name) {\n return MetricToDataType[name] == 'Vector';\n}\nexport function isMacroMoleculeMetric(name) {\n return MetricToDataType[name] == DistanceMetricsSubjects.MacroMolecule.toString();\n}\n/** Manhattan distance between two sequences (match - 0, mismatch - 1) normalized for length. */\nexport function manhattanDistance(s1, s2) {\n if (s1.length !== s2.length) {\n return 1;\n }\n else {\n let dist = 0;\n for (let i = 1; i < s1.length; i++)\n dist += s1[i] == s2[i] ? 0 : 1;\n return dist / s1.length;\n }\n}\nexport function categoricalDistance(s1, s2) {\n return s1 === s2 ? 0 : 1;\n}\n/** Unified class implementing different string measures. */\nexport class Measure {\n method;\n dataType;\n /**\n * Creates an instance of Measure with .\n * @param {string} method Method to calculate distance between strings.\n * @memberof Measurer\n */\n constructor(method) {\n this.method = method;\n this.dataType = MetricToDataType[method];\n }\n /**\n * Returns custom string distance function specified.\n * @param {opts} opts Options for the measure. used for macromolecule distances\n * @return {DistanceMetric} Callback of the measure chosen.\n * @memberof Measurer\n */\n getMeasure(opts) {\n const dict = AvailableMetrics;\n if (!dict.hasOwnProperty(this.dataType) || !dict[this.dataType].hasOwnProperty(this.method))\n throw new Error(`Unknown measure ${this.method} for data type ${this.dataType}`);\n return isMacroMoleculeMetric(this.method) ?\n dict[this.dataType][this.method](opts) :\n dict[this.dataType][this.method];\n }\n /**\n * Returns custom string distance by the given data type.\n * @param {AvailableDataTypes} dataType Metric's data type\n * @return {string[]} Metric names which expects the given data type\n * @memberof Measurer\n */\n static getMetricByDataType(dataType) {\n return Object.keys(AvailableMetrics[dataType]);\n }\n /** Returns metric names available.\n * @memberof Measurer\n */\n static get availableMeasures() {\n return Object.keys(AvailableMetrics);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWQtbWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInR5cGVkLW1ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsY0FBYyxFQUNkLFlBQVksRUFDWixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZix3QkFBd0IsR0FDekIsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUczRixPQUFPLEVBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNsRyxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsb0JBQW9CLEVBQ25ELGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFDLE1BQU0sVUFBVSxDQUFDO0FBR3BHLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUF5RDtJQUNoRyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLDBCQUEwQjtDQUMzRCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQXlEO0lBQ2hHLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVE7SUFDN0MsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxXQUFXO0lBQzdDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsaUJBQWlCO0lBQ2pELENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEVBQUUsbUJBQW1C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O0lBQ0ksTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQTRCO1FBQzVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sS0FBSyxpQkFBaUI7UUFDMUIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZmwgZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5pbXBvcnQge2phcm9XaW5rbGVyfSBmcm9tICdqYXJvLXdpbmtsZXItdHlwZXNjcmlwdCc7XG5pbXBvcnQge0Rpc3RhbmNlTWV0cmljfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge1xuICBhc3ltbWV0cmljRGlzdGFuY2UsXG4gIGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgY29zaW5lRGlzdGFuY2UsXG4gIGRpY2VEaXN0YW5jZSxcbiAgZXVjbGlkZWFuRGlzdGFuY2UsXG4gIGhhbW1pbmdEaXN0YW5jZSxcbiAga3VsY3p5bnNraURpc3RhbmNlLFxuICBtY0Nvbm5hdWdoZXlEaXN0YW5jZSxcbiAgcm9nb3RHb2xkYmVyZ0Rpc3RhbmNlLFxuICBydXNzZWxEaXN0YW5jZSxcbiAgc29rYWxEaXN0YW5jZSxcbiAgdGFuaW1vdG9EaXN0YW5jZSxcbiAgbnVtZXJpY0Rpc3RhbmNlLFxuICB0YW5pbW90b0Rpc3RhbmNlSW50QXJyYXksXG59IGZyb20gJy4uL2Rpc3RhbmNlLW1ldHJpY3MtbWV0aG9kcyc7XG5cbmltcG9ydCB7Y2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2V9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3ZlY3Rvci1vcGVyYXRpb25zJztcbmltcG9ydCBCaXRBcnJheSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy9iaXQtYXJyYXknO1xuaW1wb3J0IHtWZWN0b3IsIFN0cmluZ0RpY3Rpb25hcnl9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7bW1EaXN0YW5jZUZ1bmN0aW9ucywgTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzfSBmcm9tICcuLi9tYWNyb21vbGVjdWxlLWRpc3RhbmNlLWZ1bmN0aW9ucyc7XG5pbXBvcnQge0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLCBCaXRBcnJheU1ldHJpY3NOYW1lcyxcbiAgU3RyaW5nTWV0cmljc05hbWVzLCBWZWN0b3JNZXRyaWNzTmFtZXMsIE51bWJlck1ldHJpY3NOYW1lcywgSW50QXJyYXlNZXRyaWNzTmFtZXN9IGZyb20gJy4vY29uc3RzJztcblxuXG5leHBvcnQgY29uc3QgdmVjdG9yRGlzdGFuY2VNZXRyaWNzTWV0aG9kczogeyBbbmFtZTogc3RyaW5nXTogKHg6IFZlY3RvciwgeTogVmVjdG9yKSA9PiBudW1iZXIgfSA9IHtcbiAgW1ZlY3Rvck1ldHJpY3NOYW1lcy5FdWNsaWRlYW5dOiBjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZSxcbn07XG5cbmV4cG9ydCBjb25zdCBzdHJpbmdEaXN0YW5jZU1ldHJpY3NNZXRob2RzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogc3RyaW5nLCB5OiBzdHJpbmcpID0+IG51bWJlciB9ID0ge1xuICBbU3RyaW5nTWV0cmljc05hbWVzLkxldmVuc2h0ZWluXTogZmwuZGlzdGFuY2UsXG4gIFtTdHJpbmdNZXRyaWNzTmFtZXMuSmFyb1dpbmtsZXJdOiBqYXJvV2lua2xlcixcbiAgW1N0cmluZ01ldHJpY3NOYW1lcy5NYW5oYXR0YW5dOiBtYW5oYXR0YW5EaXN0YW5jZSxcbiAgW1N0cmluZ01ldHJpY3NOYW1lcy5PbmVob3RdOiBjYXRlZ29yaWNhbERpc3RhbmNlLFxufTtcblxuZXhwb3J0IGNvbnN0IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kczogeyBbbmFtZTogc3RyaW5nXTogKHg6IEJpdEFycmF5LCB5OiBCaXRBcnJheSkgPT4gbnVtYmVyIH0gPSB7XG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b106IHRhbmltb3RvRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5EaWNlXTogZGljZURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQXN5bW1ldHJpY106IGFzeW1tZXRyaWNEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkJyYXVuQmxhbnF1ZXRdOiBicmF1bkJsYW5xdWV0RGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdOiBjb3NpbmVEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkt1bGN6eW5za2ldOiBrdWxjenluc2tpRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5NY0Nvbm5hdWdoZXldOiBtY0Nvbm5hdWdoZXlEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJvZ290R29sZGJlcmddOiByb2dvdEdvbGRiZXJnRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5SdXNzZWxdOiBydXNzZWxEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlNva2FsXTogc29rYWxEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkhhbW1pbmddOiBoYW1taW5nRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5FdWNsaWRlYW5dOiBldWNsaWRlYW5EaXN0YW5jZSxcbn07XG5cbmV4cG9ydCBjb25zdCBpbnRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHM6IHsgW25hbWU6IHN0cmluZ106ICh4OiBVaW50MzJBcnJheSwgeTogVWludDMyQXJyYXkpID0+IG51bWJlciB9ID0ge1xuICBbSW50QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9JbnRBcnJheV06IHRhbmltb3RvRGlzdGFuY2VJbnRBcnJheSxcbn07XG5cbmV4cG9ydCBjb25zdCBudW1iZXJEaXN0YW5jZU1ldHJpY3NNZXRob2RzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IG51bWJlciB9ID0ge1xuICBbTnVtYmVyTWV0cmljc05hbWVzLkRpZmZlcmVuY2VdOiBudW1lcmljRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3QgQXZhaWxhYmxlTWV0cmljcyA9IHtcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLlZlY3Rvcl06IHtcbiAgICBbVmVjdG9yTWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IHZlY3RvckRpc3RhbmNlTWV0cmljc01ldGhvZHNbVmVjdG9yTWV0cmljc05hbWVzLkV1Y2xpZGVhbl0sXG4gIH0sXG4gIFtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5TdHJpbmddOiB7XG4gICAgW1N0cmluZ01ldHJpY3NOYW1lcy5MZXZlbnNodGVpbl06IHN0cmluZ0Rpc3RhbmNlTWV0cmljc01ldGhvZHNbU3RyaW5nTWV0cmljc05hbWVzLkxldmVuc2h0ZWluXSxcbiAgICBbU3RyaW5nTWV0cmljc05hbWVzLkphcm9XaW5rbGVyXTogc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tTdHJpbmdNZXRyaWNzTmFtZXMuSmFyb1dpbmtsZXJdLFxuICAgIFtTdHJpbmdNZXRyaWNzTmFtZXMuTWFuaGF0dGFuXTogc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tTdHJpbmdNZXRyaWNzTmFtZXMuTWFuaGF0dGFuXSxcbiAgICBbU3RyaW5nTWV0cmljc05hbWVzLk9uZWhvdF06IHN0cmluZ0Rpc3RhbmNlTWV0cmljc01ldGhvZHNbU3RyaW5nTWV0cmljc05hbWVzLk9uZWhvdF0sXG4gIH0sXG4gIFtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5CaXRBcnJheV06IHtcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9dLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5EaWNlXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkFzeW1tZXRyaWNdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5CcmF1bkJsYW5xdWV0XTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkJyYXVuQmxhbnF1ZXRdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuQ29zaW5lXSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5LdWxjenluc2tpXSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuTWNDb25uYXVnaGV5XTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJvZ290R29sZGJlcmddOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ10sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5SdXNzZWxdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5Tb2thbF0sXG4gIH0sXG4gIFtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5NYWNyb01vbGVjdWxlXTogeyAvLyBvcHRpb25hbCBhcmdzIG5lZWRlZCBmb3IgbWFjcm9tb2xlY3VsZSBmdW5jdGlvbnMgd2hpY2ggaW5pdGlhbGl6ZSB0aGVtXG4gICAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5IQU1NSU5HXTogbW1EaXN0YW5jZUZ1bmN0aW9uc1tNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuSEFNTUlOR10sXG4gICAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5MRVZFTlNIVEVJTl06IG1tRGlzdGFuY2VGdW5jdGlvbnNbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkxFVkVOU0hURUlOXSxcbiAgICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLk5FRURMRU1BTk5fV1VOU0NIXTogbW1EaXN0YW5jZUZ1bmN0aW9uc1tNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTkVFRExFTUFOTl9XVU5TQ0hdLFxuICAgIFtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRV06XG4gICAgICBtbURpc3RhbmNlRnVuY3Rpb25zW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5NT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFXSxcbiAgfSxcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLk51bWJlcl06IHtcbiAgICBbTnVtYmVyTWV0cmljc05hbWVzLkRpZmZlcmVuY2VdOiBudW1iZXJEaXN0YW5jZU1ldHJpY3NNZXRob2RzW051bWJlck1ldHJpY3NOYW1lcy5EaWZmZXJlbmNlXSxcbiAgfSxcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLkludEFycmF5XToge1xuICAgIFtJbnRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b0ludEFycmF5XTogaW50QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0ludEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvSW50QXJyYXldLFxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgTWV0cmljVG9EYXRhVHlwZTogU3RyaW5nRGljdGlvbmFyeSA9IE9iamVjdC5rZXlzKEF2YWlsYWJsZU1ldHJpY3MpXG4gIC5yZWR1Y2UoKHJldDogU3RyaW5nRGljdGlvbmFyeSwga2V5KSA9PiB7XG4gICAgZm9yIChjb25zdCB2YWwgb2YgT2JqZWN0LmtleXMoQXZhaWxhYmxlTWV0cmljc1trZXkgYXMgQXZhaWxhYmxlRGF0YVR5cGVzXSkpXG4gICAgICByZXRbdmFsIGFzIEF2YWlsYWJsZURhdGFUeXBlc10gPSBrZXk7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9LCB7fSk7XG5cbmV4cG9ydCB0eXBlIEF2YWlsYWJsZURhdGFUeXBlcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVNZXRyaWNzO1xuZXhwb3J0IHR5cGUgVmVjdG9yTWV0cmljcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVNZXRyaWNzW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLlZlY3Rvcl07XG5leHBvcnQgdHlwZSBTdHJpbmdNZXRyaWNzID0ga2V5b2YgdHlwZW9mIEF2YWlsYWJsZU1ldHJpY3NbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuU3RyaW5nXTtcbmV4cG9ydCB0eXBlIEJpdEFycmF5TWV0cmljcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVNZXRyaWNzW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLkJpdEFycmF5XTtcbmV4cG9ydCB0eXBlIEtub3duTWV0cmljcyA9IFN0cmluZ01ldHJpY3MgfCBCaXRBcnJheU1ldHJpY3MgfCBWZWN0b3JNZXRyaWNzIHxcbiAgTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzIHwgTnVtYmVyTWV0cmljc05hbWVzIHwgSW50QXJyYXlNZXRyaWNzTmFtZXM7XG5cbmV4cG9ydCB0eXBlIFZhbGlkVHlwZXMgPVxuICB7IGRhdGE6IHN0cmluZ1tdLCBtZXRyaWM6IFN0cmluZ01ldHJpY3MgfCBNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMgfSB8XG4gIHsgZGF0YTogVmVjdG9yW10sIG1ldHJpYzogVmVjdG9yTWV0cmljcyB9IHxcbiAgeyBkYXRhOiBCaXRBcnJheVtdLCBtZXRyaWM6IEJpdEFycmF5TWV0cmljcyB9IHxcbiAgeyBkYXRhOiBudW1iZXJbXSwgbWV0cmljOiBOdW1iZXJNZXRyaWNzTmFtZXMgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nTWV0cmljKG5hbWU6IEtub3duTWV0cmljcykge1xuICByZXR1cm4gTWV0cmljVG9EYXRhVHlwZVtuYW1lXSA9PSAnU3RyaW5nJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQml0QXJyYXlNZXRyaWMobmFtZTogS25vd25NZXRyaWNzKSB7XG4gIHJldHVybiBNZXRyaWNUb0RhdGFUeXBlW25hbWVdID09ICdCaXRBcnJheSc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlY3Rvck1ldHJpYyhuYW1lOiBLbm93bk1ldHJpY3MpIHtcbiAgcmV0dXJuIE1ldHJpY1RvRGF0YVR5cGVbbmFtZV0gPT0gJ1ZlY3Rvcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01hY3JvTW9sZWN1bGVNZXRyaWMobmFtZTogS25vd25NZXRyaWNzKSB7XG4gIHJldHVybiBNZXRyaWNUb0RhdGFUeXBlW25hbWVdID09IERpc3RhbmNlTWV0cmljc1N1YmplY3RzLk1hY3JvTW9sZWN1bGUudG9TdHJpbmcoKTtcbn1cblxuLyoqIE1hbmhhdHRhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzZXF1ZW5jZXMgKG1hdGNoIC0gMCwgbWlzbWF0Y2ggLSAxKSBub3JtYWxpemVkIGZvciBsZW5ndGguICovXG5leHBvcnQgZnVuY3Rpb24gbWFuaGF0dGFuRGlzdGFuY2UoczE6IHN0cmluZywgczI6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmIChzMS5sZW5ndGggIT09IHMyLmxlbmd0aCkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIGxldCBkaXN0OiBudW1iZXIgPSAwO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgczEubGVuZ3RoOyBpKyspXG4gICAgICBkaXN0ICs9IHMxW2ldID09IHMyW2ldID8gMCA6IDE7XG4gICAgcmV0dXJuIGRpc3QgLyBzMS5sZW5ndGg7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3JpY2FsRGlzdGFuY2UoczE6IHN0cmluZywgczI6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBzMSA9PT0gczIgPyAwIDogMTtcbn1cblxuLyoqIFVuaWZpZWQgY2xhc3MgaW1wbGVtZW50aW5nIGRpZmZlcmVudCBzdHJpbmcgbWVhc3VyZXMuICovXG5leHBvcnQgY2xhc3MgTWVhc3VyZSB7XG4gIHByb3RlY3RlZCBtZXRob2Q6IEtub3duTWV0cmljcztcbiAgcHJvdGVjdGVkIGRhdGFUeXBlOiBBdmFpbGFibGVEYXRhVHlwZXM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTWVhc3VyZSB3aXRoIC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCBNZXRob2QgdG8gY2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4gc3RyaW5ncy5cbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXRob2Q6IEtub3duTWV0cmljcykge1xuICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgIHRoaXMuZGF0YVR5cGUgPSBNZXRyaWNUb0RhdGFUeXBlW21ldGhvZF0gYXMgQXZhaWxhYmxlRGF0YVR5cGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY3VzdG9tIHN0cmluZyBkaXN0YW5jZSBmdW5jdGlvbiBzcGVjaWZpZWQuXG4gICAqIEBwYXJhbSB7b3B0c30gb3B0cyBPcHRpb25zIGZvciB0aGUgbWVhc3VyZS4gdXNlZCBmb3IgbWFjcm9tb2xlY3VsZSBkaXN0YW5jZXNcbiAgICogQHJldHVybiB7RGlzdGFuY2VNZXRyaWN9IENhbGxiYWNrIG9mIHRoZSBtZWFzdXJlIGNob3Nlbi5cbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBwdWJsaWMgZ2V0TWVhc3VyZShvcHRzPzogYW55KTogRGlzdGFuY2VNZXRyaWMge1xuICAgIGNvbnN0IGRpY3Q6IHsgW2tleTogc3RyaW5nXTpcbiAgICAgIHtba2V5Mjogc3RyaW5nXTogRGlzdGFuY2VNZXRyaWMgfCAoKG9wdHM6IGFueSkgPT4gRGlzdGFuY2VNZXRyaWMpfVxuICAgIH0gPSBBdmFpbGFibGVNZXRyaWNzO1xuICAgIGlmICghZGljdC5oYXNPd25Qcm9wZXJ0eSh0aGlzLmRhdGFUeXBlKSB8fCAhZGljdFt0aGlzLmRhdGFUeXBlXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLm1ldGhvZCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbWVhc3VyZSAke3RoaXMubWV0aG9kfSBmb3IgZGF0YSB0eXBlICR7dGhpcy5kYXRhVHlwZX1gKTtcbiAgICByZXR1cm4gaXNNYWNyb01vbGVjdWxlTWV0cmljKHRoaXMubWV0aG9kKSA/XG4gICAgICAoZGljdFt0aGlzLmRhdGFUeXBlXVt0aGlzLm1ldGhvZF0gYXMgKChvcHRzOiBhbnkpID0+IERpc3RhbmNlTWV0cmljKSkob3B0cykgOlxuICAgICAgZGljdFt0aGlzLmRhdGFUeXBlXVt0aGlzLm1ldGhvZF0gYXMgRGlzdGFuY2VNZXRyaWM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBjdXN0b20gc3RyaW5nIGRpc3RhbmNlIGJ5IHRoZSBnaXZlbiBkYXRhIHR5cGUuXG4gICAqIEBwYXJhbSB7QXZhaWxhYmxlRGF0YVR5cGVzfSBkYXRhVHlwZSBNZXRyaWMncyBkYXRhIHR5cGVcbiAgICogQHJldHVybiB7c3RyaW5nW119IE1ldHJpYyBuYW1lcyB3aGljaCBleHBlY3RzIHRoZSBnaXZlbiBkYXRhIHR5cGVcbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldE1ldHJpY0J5RGF0YVR5cGUoZGF0YVR5cGU6IEF2YWlsYWJsZURhdGFUeXBlcyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoQXZhaWxhYmxlTWV0cmljc1tkYXRhVHlwZV0pO1xuICB9XG5cbiAgLyoqIFJldHVybnMgbWV0cmljIG5hbWVzIGF2YWlsYWJsZS5cbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBzdGF0aWMgZ2V0IGF2YWlsYWJsZU1lYXN1cmVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoQXZhaWxhYmxlTWV0cmljcyk7XG4gIH1cbn1cbiJdfQ==","export var DistanceAggregationMethods;\n(function (DistanceAggregationMethods) {\n DistanceAggregationMethods[\"EUCLIDEAN\"] = \"EUCLIDEAN\";\n DistanceAggregationMethods[\"MANHATTAN\"] = \"MANHATTAN\";\n})(DistanceAggregationMethods || (DistanceAggregationMethods = {}));\n;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSwwQkFHVDtBQUhILFdBQVksMEJBQTBCO0lBQ2xDLHFEQUF1QixDQUFBO0lBQ3ZCLHFEQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFIUywwQkFBMEIsS0FBMUIsMEJBQTBCLFFBR25DO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzIHtcbiAgICBFVUNMSURFQU4gPSAnRVVDTElERUFOJyxcbiAgICBNQU5IQVRUQU4gPSAnTUFOSEFUVEFOJyxcbiAgfTtcblxuZXhwb3J0IHR5cGUgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IGtleW9mIHR5cGVvZiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcztcbiJdfQ==","import { DistanceAggregationMethods } from './types';\nexport const isNil = (x) => x === null || x === undefined;\nexport function insertSmaller(distancesAr, indexes, num, index) {\n if (num > distancesAr[distancesAr.length - 1])\n return;\n const newPosition = distancesAr.findIndex((v) => num < v);\n distancesAr.pop();\n distancesAr.splice(newPosition, 0, num);\n indexes.pop();\n indexes.splice(newPosition, 0, index);\n}\nexport function insertLarger(distancesAr, indexes, num, index) {\n if (num < distancesAr[distancesAr.length - 1])\n return;\n const newPosition = distancesAr.findIndex((v) => num > v);\n distancesAr.pop();\n distancesAr.splice(newPosition, 0, num);\n indexes.pop();\n indexes.splice(newPosition, 0, index);\n}\nexport function getAggregationFunction(aggregationMethod, weights) {\n switch (aggregationMethod) {\n case DistanceAggregationMethods.MANHATTAN:\n return (vs) => vs.reduce((acc, val, idx) => acc + val * weights[idx], 0);\n default:\n return (vs) => {\n // euclidean\n const sum = vs.reduce((acc, val, idx) => acc + (val * weights[idx]) ** 2, 0);\n return Math.sqrt(sum);\n };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRCLDBCQUEwQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBRS9ELE1BQU0sVUFBVSxhQUFhLENBQUMsV0FBcUIsRUFBRSxPQUFpQixFQUFFLEdBQVcsRUFBRSxLQUFhO0lBQ2hHLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPO0lBRVQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFELFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQixXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLFdBQXFCLEVBQUUsT0FBaUIsRUFBRSxHQUFXLEVBQUUsS0FBYTtJQUMvRixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTztJQUVULE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxRCxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbEIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxpQkFBNEMsRUFBRSxPQUFpQjtJQUUvRCxRQUFRLGlCQUFpQixFQUFFO1FBQ3pCLEtBQUssMEJBQTBCLENBQUMsU0FBUztZQUN2QyxPQUFPLENBQUMsRUFBWSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JGO1lBQ0UsT0FBTyxDQUFDLEVBQVksRUFBRSxFQUFFO2dCQUN0QixZQUFZO2dCQUNaLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0UsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLENBQUMsQ0FBQztLQUNMO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCwgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHN9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgaXNOaWwgPSAoeDogYW55KSA9PiB4ID09PSBudWxsIHx8IHggPT09IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydFNtYWxsZXIoZGlzdGFuY2VzQXI6IG51bWJlcltdLCBpbmRleGVzOiBudW1iZXJbXSwgbnVtOiBudW1iZXIsIGluZGV4OiBudW1iZXIpIHtcbiAgaWYgKG51bSA+IGRpc3RhbmNlc0FyW2Rpc3RhbmNlc0FyLmxlbmd0aC0xXSlcbiAgICByZXR1cm47XG5cbiAgY29uc3QgbmV3UG9zaXRpb24gPSBkaXN0YW5jZXNBci5maW5kSW5kZXgoKHYpID0+IG51bSA8IHYpO1xuICBkaXN0YW5jZXNBci5wb3AoKTtcbiAgZGlzdGFuY2VzQXIuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBudW0pO1xuICBpbmRleGVzLnBvcCgpO1xuICBpbmRleGVzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaW5kZXgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0TGFyZ2VyKGRpc3RhbmNlc0FyOiBudW1iZXJbXSwgaW5kZXhlczogbnVtYmVyW10sIG51bTogbnVtYmVyLCBpbmRleDogbnVtYmVyKSB7XG4gIGlmIChudW0gPCBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGgtMV0pXG4gICAgcmV0dXJuO1xuXG4gIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPiB2KTtcbiAgZGlzdGFuY2VzQXIucG9wKCk7XG4gIGRpc3RhbmNlc0FyLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgbnVtKTtcbiAgaW5kZXhlcy5wb3AoKTtcbiAgaW5kZXhlcy5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0aW9uRnVuY3Rpb24oXG4gIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kLCB3ZWlnaHRzOiBudW1iZXJbXVxuKTogKHZhbHVlczogbnVtYmVyW10pID0+IG51bWJlciB7XG4gIHN3aXRjaCAoYWdncmVnYXRpb25NZXRob2QpIHtcbiAgICBjYXNlIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLk1BTkhBVFRBTjpcbiAgICAgIHJldHVybiAodnM6IG51bWJlcltdKSA9PiB2cy5yZWR1Y2UoKGFjYywgdmFsLCBpZHgpID0+IGFjYyArIHZhbCAqIHdlaWdodHNbaWR4XSwgMCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAodnM6IG51bWJlcltdKSA9PiB7XG4gICAgICAgIC8vIGV1Y2xpZGVhblxuICAgICAgICBjb25zdCBzdW0gPSB2cy5yZWR1Y2UoKGFjYywgdmFsLCBpZHgpID0+IGFjYyArICh2YWwgKiB3ZWlnaHRzW2lkeF0pICoqIDIsIDApO1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHN1bSk7XG4gICAgICB9O1xuICB9XG59XG4iXX0=","export class DistanceMatrixService {\n _workers;\n _workerCount;\n _terminateOnComplete;\n constructor(useConcurrentWorkers = true, terminateOnComplete = true) {\n const threadCount = navigator.hardwareConcurrency;\n this._workerCount = useConcurrentWorkers ? Math.max(threadCount - 2, 1) : 1;\n this._workers = new Array(this._workerCount).fill(null)\n .map(() => new Worker(new URL('./distance-matrix-worker', import.meta.url)));\n this._terminateOnComplete = terminateOnComplete;\n }\n ;\n async calc(values, fnName, normalize = true, opts) {\n return new Promise(async (resolve, reject) => {\n try {\n const len = values.length;\n const promises = new Array(this._workerCount);\n const totalLength = len * (len - 1) / 2; // size of reduced distance matrix\n this._workerCount = Math.min(this._workerCount, totalLength);\n const chunkSize = totalLength / this._workerCount;\n const distanceMatrix = new Float32Array(totalLength);\n let endRow = 0;\n let endCol = 1;\n // minmax for normalization\n let lmin = 0;\n let lmax = Number.MIN_VALUE;\n for (let i = 0; i < this._workerCount; i++) {\n const start = Math.floor(i * chunkSize);\n const end = (i === this._workerCount - 1) ? totalLength : Math.floor((i + 1) * chunkSize);\n const startRow = endRow;\n const startCol = endCol;\n if (i !== this._workerCount - 1) {\n // These formulas map the linear index to the upper triangular matrix indices\n endRow = len - 2 - Math.floor(Math.sqrt(-8 * end + 4 * len * (len - 1) - 7) / 2 - 0.5);\n endCol = end - len * endRow + Math.floor((endRow + 1) * (endRow + 2) / 2);\n }\n this._workers[i].postMessage({ values, fnName, startRow, startCol, chunckSize: end - start, opts });\n promises[i] = new Promise((resolveWorker, rejectWorker) => {\n this._workers[i].onmessage = ({ data: { error, distanceMatrixData, min, max } }) => {\n this._terminateOnComplete && this._workers[i].terminate();\n if (error) {\n rejectWorker(error);\n }\n else {\n distanceMatrix.set(distanceMatrixData, start);\n if (min < lmin)\n lmin = min;\n if (max > lmax)\n lmax = max;\n resolveWorker();\n }\n };\n });\n }\n await Promise.all(promises);\n if (normalize)\n distanceMatrix.forEach((value, index) => { distanceMatrix[index] = (value - lmin) / (lmax - lmin); });\n resolve(distanceMatrix);\n }\n catch (e) {\n reject(e);\n }\n });\n }\n terminate() {\n this._workers.forEach((worker) => worker.terminate());\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWF0cml4LXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaXN0YW5jZS1tYXRyaXgtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLE9BQU8scUJBQXFCO0lBQ3RCLFFBQVEsQ0FBVztJQUNuQixZQUFZLENBQVM7SUFDckIsb0JBQW9CLENBQVU7SUFDdEMsWUFBbUIsb0JBQW9CLEdBQUcsSUFBSSxFQUFFLG1CQUFtQixHQUFHLElBQUk7UUFDeEUsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLG1CQUFtQixDQUFDO1FBQ2xELElBQUksQ0FBQyxZQUFZLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDcEQsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLDBCQUEwQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxtQkFBbUIsQ0FBQztJQUNsRCxDQUFDO0lBQUEsQ0FBQztJQUVLLEtBQUssQ0FBQyxJQUFJLENBQUksTUFBK0IsRUFBRSxNQUFvQixFQUN4RSxTQUFTLEdBQUcsSUFBSSxFQUFFLElBQXlCO1FBQzNDLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMzQyxJQUFJO2dCQUNGLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFnQixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzdELE1BQU0sV0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxrQ0FBa0M7Z0JBQzNFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLFNBQVMsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFDbEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3JELElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDZixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQ2YsMkJBQTJCO2dCQUMzQixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ2IsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQzFDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO29CQUN4QyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7b0JBQzFGLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQztvQkFDeEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDO29CQUN4QixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsRUFBRTt3QkFDL0IsNkVBQTZFO3dCQUM3RSxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO3dCQUN2RixNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztxQkFDM0U7b0JBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztvQkFDbEcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxFQUFFO3dCQUN4RCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUMsSUFBSSxFQUFFLEVBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUMsRUFBQyxFQUFRLEVBQUU7NEJBQ25GLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDOzRCQUMxRCxJQUFJLEtBQUssRUFBRTtnQ0FDVCxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7NkJBQ3JCO2lDQUFNO2dDQUNMLGNBQWMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0NBQzlDLElBQUksR0FBRyxHQUFHLElBQUk7b0NBQ1osSUFBSSxHQUFHLEdBQUcsQ0FBQztnQ0FDYixJQUFJLEdBQUcsR0FBRyxJQUFJO29DQUNaLElBQUksR0FBRyxHQUFHLENBQUM7Z0NBQ2IsYUFBYSxFQUFFLENBQUM7NkJBQ2pCO3dCQUNILENBQUMsQ0FBQztvQkFDSixDQUFDLENBQUMsQ0FBQztpQkFDSjtnQkFDRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzVCLElBQUksU0FBUztvQkFDWCxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUN6QjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNYO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sU0FBUztRQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5cbmV4cG9ydCBjbGFzcyBEaXN0YW5jZU1hdHJpeFNlcnZpY2Uge1xuICAgIHByaXZhdGUgX3dvcmtlcnM6IFdvcmtlcltdO1xuICAgIHByaXZhdGUgX3dvcmtlckNvdW50OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfdGVybWluYXRlT25Db21wbGV0ZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IodXNlQ29uY3VycmVudFdvcmtlcnMgPSB0cnVlLCB0ZXJtaW5hdGVPbkNvbXBsZXRlID0gdHJ1ZSkge1xuICAgICAgY29uc3QgdGhyZWFkQ291bnQgPSBuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeTtcbiAgICAgIHRoaXMuX3dvcmtlckNvdW50ID0gdXNlQ29uY3VycmVudFdvcmtlcnMgPyBNYXRoLm1heCh0aHJlYWRDb3VudCAtIDIsIDEpIDogMTtcbiAgICAgIHRoaXMuX3dvcmtlcnMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpLmZpbGwobnVsbClcbiAgICAgICAgLm1hcCgoKSA9PiBuZXcgV29ya2VyKG5ldyBVUkwoJy4vZGlzdGFuY2UtbWF0cml4LXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcbiAgICAgIHRoaXMuX3Rlcm1pbmF0ZU9uQ29tcGxldGUgPSB0ZXJtaW5hdGVPbkNvbXBsZXRlO1xuICAgIH07XG5cbiAgICBwdWJsaWMgYXN5bmMgY2FsYzxUPih2YWx1ZXM6IEFycmF5PFQ+IHwgQXJyYXlMaWtlPFQ+LCBmbk5hbWU6IEtub3duTWV0cmljcyxcbiAgICAgIG5vcm1hbGl6ZSA9IHRydWUsIG9wdHM/OiB7W186IHN0cmluZ106IGFueX0pOiBQcm9taXNlPEZsb2F0MzJBcnJheT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBsZW4gPSB2YWx1ZXMubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gbmV3IEFycmF5PFByb21pc2U8dm9pZD4+KHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgICAgICBjb25zdCB0b3RhbExlbmd0aCA9IGxlbiAqIChsZW4gLSAxKSAvIDI7IC8vIHNpemUgb2YgcmVkdWNlZCBkaXN0YW5jZSBtYXRyaXhcbiAgICAgICAgICB0aGlzLl93b3JrZXJDb3VudCA9IE1hdGgubWluKHRoaXMuX3dvcmtlckNvdW50LCB0b3RhbExlbmd0aCk7XG4gICAgICAgICAgY29uc3QgY2h1bmtTaXplID0gdG90YWxMZW5ndGggLyB0aGlzLl93b3JrZXJDb3VudDtcbiAgICAgICAgICBjb25zdCBkaXN0YW5jZU1hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkodG90YWxMZW5ndGgpO1xuICAgICAgICAgIGxldCBlbmRSb3cgPSAwO1xuICAgICAgICAgIGxldCBlbmRDb2wgPSAxO1xuICAgICAgICAgIC8vIG1pbm1heCBmb3Igbm9ybWFsaXphdGlvblxuICAgICAgICAgIGxldCBsbWluID0gMDtcbiAgICAgICAgICBsZXQgbG1heCA9IE51bWJlci5NSU5fVkFMVUU7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl93b3JrZXJDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGguZmxvb3IoaSAqIGNodW5rU2l6ZSk7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSAoaSA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxKSA/IHRvdGFsTGVuZ3RoIDogTWF0aC5mbG9vcigoaSArIDEpICogY2h1bmtTaXplKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0Um93ID0gZW5kUm93O1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRDb2wgPSBlbmRDb2w7XG4gICAgICAgICAgICBpZiAoaSAhPT0gdGhpcy5fd29ya2VyQ291bnQgLSAxKSB7XG4gICAgICAgICAgICAgIC8vIFRoZXNlIGZvcm11bGFzIG1hcCB0aGUgbGluZWFyIGluZGV4IHRvIHRoZSB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeCBpbmRpY2VzXG4gICAgICAgICAgICAgIGVuZFJvdyA9IGxlbiAtIDIgLSBNYXRoLmZsb29yKE1hdGguc3FydCgtOCAqIGVuZCArIDQgKiBsZW4gKiAobGVuIC0gMSkgLSA3KSAvIDIgLSAwLjUpO1xuICAgICAgICAgICAgICBlbmRDb2wgPSBlbmQgLSBsZW4gKiBlbmRSb3cgKyBNYXRoLmZsb29yKChlbmRSb3cgKyAxKSAqIChlbmRSb3cgKyAyKSAvIDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fd29ya2Vyc1tpXS5wb3N0TWVzc2FnZSh7dmFsdWVzLCBmbk5hbWUsIHN0YXJ0Um93LCBzdGFydENvbCwgY2h1bmNrU2l6ZTogZW5kIC0gc3RhcnQsIG9wdHN9KTtcbiAgICAgICAgICAgIHByb21pc2VzW2ldID0gbmV3IFByb21pc2UoKHJlc29sdmVXb3JrZXIsIHJlamVjdFdvcmtlcikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLl93b3JrZXJzW2ldLm9ubWVzc2FnZSA9ICh7ZGF0YToge2Vycm9yLCBkaXN0YW5jZU1hdHJpeERhdGEsIG1pbiwgbWF4fX0pOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hdGVPbkNvbXBsZXRlICYmIHRoaXMuX3dvcmtlcnNbaV0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICByZWplY3RXb3JrZXIoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBkaXN0YW5jZU1hdHJpeC5zZXQoZGlzdGFuY2VNYXRyaXhEYXRhLCBzdGFydCk7XG4gICAgICAgICAgICAgICAgICBpZiAobWluIDwgbG1pbilcbiAgICAgICAgICAgICAgICAgICAgbG1pbiA9IG1pbjtcbiAgICAgICAgICAgICAgICAgIGlmIChtYXggPiBsbWF4KVxuICAgICAgICAgICAgICAgICAgICBsbWF4ID0gbWF4O1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgICAgaWYgKG5vcm1hbGl6ZSlcbiAgICAgICAgICAgIGRpc3RhbmNlTWF0cml4LmZvckVhY2goKHZhbHVlLCBpbmRleCkgPT4geyBkaXN0YW5jZU1hdHJpeFtpbmRleF0gPSAodmFsdWUgLSBsbWluKSAvIChsbWF4IC0gbG1pbik7IH0pO1xuICAgICAgICAgIHJlc29sdmUoZGlzdGFuY2VNYXRyaXgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdGVybWluYXRlKCk6IHZvaWQge1xuICAgICAgdGhpcy5fd29ya2Vycy5mb3JFYWNoKCh3b3JrZXIpID0+IHdvcmtlci50ZXJtaW5hdGUoKSk7XG4gICAgfVxufVxuIl19","/**\n * @license\n *\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ==============================================================================\n */\n/**\n * Simple random integer function\n */\nexport function tauRandInt(n, random) {\n return Math.floor(random() * n);\n}\n/**\n * Simple random float function\n */\nexport function tauRand(random) {\n return random();\n}\n/**\n * Compute the (standard l2) norm of a vector.\n */\nexport function norm(vec) {\n let result = 0;\n for (const item of vec)\n result += item ** 2;\n return Math.sqrt(result);\n}\n/**\n * Creates an empty array (filled with undefined)\n */\nexport function empty(n) {\n const output = [];\n for (let i = 0; i < n; i++)\n output.push(undefined);\n return output;\n}\n/**\n * Creates an array filled with index values\n */\nexport function range(n) {\n return empty(n).map((_, i) => i);\n}\n/**\n * Creates an array filled with a specific value\n */\nexport function filled(n, v) {\n return empty(n).map(() => v);\n}\n/**\n * Creates an array filled with zeros\n */\nexport function zeros(n) {\n return filled(n, 0);\n}\n/**\n * Creates an array filled with ones\n */\nexport function ones(n) {\n return filled(n, 1);\n}\n/**\n * Creates an array from a to b, of length len, inclusive\n */\nexport function linear(a, b, len) {\n return empty(len).map((_, i) => {\n return a + i * ((b - a) / (len - 1));\n });\n}\n/**\n * Returns the sum of an array\n */\nexport function sum(input) {\n return input.reduce((sum, val) => sum + val);\n}\n/**\n * Returns the mean of an array\n */\nexport function mean(input) {\n return sum(input) / input.length;\n}\n/**\n * Returns the maximum value of an array\n */\nexport function max(input) {\n let max = 0;\n for (let i = 0; i < input.length; i++)\n max = input[i] > max ? input[i] : max;\n return max;\n}\n/**\n * Returns the maximum value of a 2d array\n */\nexport function max2d(input) {\n let max = 0;\n for (let i = 0; i < input.length; i++) {\n for (let j = 0; j < input[i].length; j++)\n max = input[i][j] > max ? input[i][j] : max;\n }\n return max;\n}\n/**\n * Generate nSamples many integers from 0 to poolSize such that no\n * integer is selected twice. The duplication constraint is achieved via\n * rejection sampling.\n */\nexport function rejectionSample(nSamples, poolSize, random) {\n const result = zeros(nSamples);\n for (let i = 0; i < nSamples; i++) {\n let rejectSample = true;\n while (rejectSample) {\n const j = tauRandInt(poolSize, random);\n let broken = false;\n for (let k = 0; k < i; k++) {\n if (j === result[k]) {\n broken = true;\n break;\n }\n }\n if (!broken)\n rejectSample = false;\n result[i] = j;\n }\n }\n return result;\n}\n/**\n * Reshapes a 1d array into a 2D of given dimensions.\n */\nexport function reshape2d(x, a, b) {\n const rows = [];\n // let count = 0;\n let index = 0;\n if (x.length !== a * b)\n throw new Error('Array dimensions must match input length.');\n for (let i = 0; i < a; i++) {\n const col = [];\n for (let j = 0; j < b; j++) {\n col.push(x[index]);\n index += 1;\n }\n rows.push(col);\n // count += 1;\n }\n return rows;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFJSDs7R0FFRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsQ0FBUyxFQUFFLE1BQWdCO0lBQ3BELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFDLE1BQWdCO0lBQ3RDLE9BQU8sTUFBTSxFQUFFLENBQUM7QUFDbEIsQ0FBQztBQUNEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLElBQUksQ0FBQyxHQUFhO0lBQ2hDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNmLEtBQUssTUFBTSxJQUFJLElBQUksR0FBRztRQUNwQixNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQztJQUV0QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxDQUFTO0lBQzdCLE1BQU0sTUFBTSxHQUFnQixFQUFFLENBQUM7SUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUV6QixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFDLENBQVM7SUFDN0IsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxV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LElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1JhbmRvbUZufSBmcm9tICcuL3VtYXAnO1xuXG4vKipcbiAqIFNpbXBsZSByYW5kb20gaW50ZWdlciBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdGF1UmFuZEludChuOiBudW1iZXIsIHJhbmRvbTogUmFuZG9tRm4pIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IocmFuZG9tKCkgKiBuKTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgcmFuZG9tIGZsb2F0IGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YXVSYW5kKHJhbmRvbTogUmFuZG9tRm4pIHtcbiAgcmV0dXJuIHJhbmRvbSgpO1xufVxuLyoqXG4gKiBDb21wdXRlIHRoZSAoc3RhbmRhcmQgbDIpIG5vcm0gb2YgYSB2ZWN0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtKHZlYzogbnVtYmVyW10pIHtcbiAgbGV0IHJlc3VsdCA9IDA7XG4gIGZvciAoY29uc3QgaXRlbSBvZiB2ZWMpXG4gICAgcmVzdWx0ICs9IGl0ZW0gKiogMjtcblxuICByZXR1cm4gTWF0aC5zcXJ0KHJlc3VsdCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlbXB0eSBhcnJheSAoZmlsbGVkIHdpdGggdW5kZWZpbmVkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW1wdHkobjogbnVtYmVyKTogdW5kZWZpbmVkW10ge1xuICBjb25zdCBvdXRwdXQ6IHVuZGVmaW5lZFtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKVxuICAgIG91dHB1dC5wdXNoKHVuZGVmaW5lZCk7XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGZpbGxlZCB3aXRoIGluZGV4IHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2UobjogbnVtYmVyKTogbnVtYmVyW10ge1xuICByZXR1cm4gZW1wdHkobikubWFwKChfLCBpKSA9PiBpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGZpbGxlZCB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxlZChuOiBudW1iZXIsIHY6IG51bWJlcik6IG51bWJlcltdIHtcbiAgcmV0dXJuIGVtcHR5KG4pLm1hcCgoKSA9PiB2KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGZpbGxlZCB3aXRoIHplcm9zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvcyhuOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIHJldHVybiBmaWxsZWQobiwgMCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBmaWxsZWQgd2l0aCBvbmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVzKG46IG51bWJlcik6IG51bWJlcltdIHtcbiAgcmV0dXJuIGZpbGxlZChuLCAxKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGZyb20gYSB0byBiLCBvZiBsZW5ndGggbGVuLCBpbmNsdXNpdmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpbmVhcihhOiBudW1iZXIsIGI6IG51bWJlciwgbGVuOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIHJldHVybiBlbXB0eShsZW4pLm1hcCgoXywgaSkgPT4ge1xuICAgIHJldHVybiBhICsgaSAqICgoYiAtIGEpIC8gKGxlbiAtIDEpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3VtIG9mIGFuIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdW0oaW5wdXQ6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgcmV0dXJuIGlucHV0LnJlZHVjZSgoc3VtLCB2YWwpID0+IHN1bSArIHZhbCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWVhbiBvZiBhbiBhcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVhbihpbnB1dDogbnVtYmVyW10pOiBudW1iZXIge1xuICByZXR1cm4gc3VtKGlucHV0KSAvIGlucHV0Lmxlbmd0aDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGFuIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXgoaW5wdXQ6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgbGV0IG1heCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspXG4gICAgbWF4ID0gaW5wdXRbaV0gPiBtYXggPyBpbnB1dFtpXSA6IG1heDtcblxuICByZXR1cm4gbWF4O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUgb2YgYSAyZCBhcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4MmQoaW5wdXQ6IG51bWJlcltdW10pOiBudW1iZXIge1xuICBsZXQgbWF4ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5wdXRbaV0ubGVuZ3RoOyBqKyspXG4gICAgICBtYXggPSBpbnB1dFtpXVtqXSA+IG1heCA/IGlucHV0W2ldW2pdIDogbWF4O1xuICB9XG4gIHJldHVybiBtYXg7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgblNhbXBsZXMgbWFueSBpbnRlZ2VycyBmcm9tIDAgdG8gcG9vbFNpemUgc3VjaCB0aGF0IG5vXG4gKiBpbnRlZ2VyIGlzIHNlbGVjdGVkIHR3aWNlLiBUaGUgZHVwbGljYXRpb24gY29uc3RyYWludCBpcyBhY2hpZXZlZCB2aWFcbiAqIHJlamVjdGlvbiBzYW1wbGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlamVjdGlvblNhbXBsZShcbiAgblNhbXBsZXM6IG51bWJlcixcbiAgcG9vbFNpemU6IG51bWJlcixcbiAgcmFuZG9tOiBSYW5kb21GblxuKTogbnVtYmVyW10ge1xuICBjb25zdCByZXN1bHQgPSB6ZXJvcyhuU2FtcGxlcyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgblNhbXBsZXM7IGkrKykge1xuICAgIGxldCByZWplY3RTYW1wbGUgPSB0cnVlO1xuICAgIHdoaWxlIChyZWplY3RTYW1wbGUpIHtcbiAgICAgIGNvbnN0IGogPSB0YXVSYW5kSW50KHBvb2xTaXplLCByYW5kb20pO1xuICAgICAgbGV0IGJyb2tlbiA9IGZhbHNlO1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBpOyBrKyspIHtcbiAgICAgICAgaWYgKGogPT09IHJlc3VsdFtrXSkge1xuICAgICAgICAgIGJyb2tlbiA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghYnJva2VuKVxuICAgICAgICByZWplY3RTYW1wbGUgPSBmYWxzZTtcblxuICAgICAgcmVzdWx0W2ldID0gajtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXNoYXBlcyBhIDFkIGFycmF5IGludG8gYSAyRCBvZiBnaXZlbiBkaW1lbnNpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzaGFwZTJkPFQ+KHg6IFRbXSwgYTogbnVtYmVyLCBiOiBudW1iZXIpOiBUW11bXSB7XG4gIGNvbnN0IHJvd3M6IFRbXVtdID0gW107XG4gIC8vIGxldCBjb3VudCA9IDA7XG4gIGxldCBpbmRleCA9IDA7XG5cbiAgaWYgKHgubGVuZ3RoICE9PSBhICogYilcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FycmF5IGRpbWVuc2lvbnMgbXVzdCBtYXRjaCBpbnB1dCBsZW5ndGguJyk7XG5cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGE7IGkrKykge1xuICAgIGNvbnN0IGNvbDogVFtdID0gW107XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBiOyBqKyspIHtcbiAgICAgIGNvbC5wdXNoKHhbaW5kZXhdKTtcbiAgICAgIGluZGV4ICs9IDE7XG4gICAgfVxuICAgIHJvd3MucHVzaChjb2wpO1xuICAgIC8vIGNvdW50ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJvd3M7XG59XG4iXX0=","/**\n * @license\n *\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ==============================================================================\n */\nimport * as utils from './utils';\n/**\n * Constructor for the heap objects. The heaps are used\n * for approximate nearest neighbor search, maintaining a list of potential\n * neighbors sorted by their distance. We also flag if potential neighbors\n * are newly added to the list or not. Internally this is stored as\n * a single array; the first axis determines whether we are looking at the\n * array of candidate indices, the array of distances, or the flag array for\n * whether elements are new or not. Each of these arrays are of shape\n * (``nPoints``, ``size``)\n */\nexport function makeHeap(nPoints, size) {\n const makeArrays = (fillValue) => {\n return utils.empty(nPoints).map(() => {\n return utils.filled(size, fillValue);\n });\n };\n const heap = [];\n heap.push(makeArrays(-1));\n heap.push(makeArrays(Infinity));\n heap.push(makeArrays(0));\n return heap;\n}\n/**\n * Generate n_samples many integers from 0 to pool_size such that no\n * integer is selected twice. The duplication constraint is achieved via\n * rejection sampling.\n */\nexport function rejectionSample(nSamples, poolSize, random) {\n const result = utils.zeros(nSamples);\n for (let i = 0; i < nSamples; i++) {\n let rejectSample = true;\n let j = 0;\n while (rejectSample) {\n j = utils.tauRandInt(poolSize, random);\n let broken = false;\n for (let k = 0; k < i; k++) {\n if (j === result[k]) {\n broken = true;\n break;\n }\n }\n if (!broken)\n rejectSample = false;\n }\n result[i] = j;\n }\n return result;\n}\n/**\n * Push a new element onto the heap. The heap stores potential neighbors\n * for each data point. The ``row`` parameter determines which data point we\n * are addressing, the ``weight`` determines the distance (for heap sorting),\n * the ``index`` is the element to add, and the flag determines whether this\n * is to be considered a new addition.\n */\nexport function heapPush(heap, row, weight, index, flag) {\n row = Math.floor(row);\n const indices = heap[0][row];\n const weights = heap[1][row];\n //const isNew = heap[2][row];\n if (weight >= weights[0])\n return 0;\n // Break if we already have this element.\n for (let i = 0; i < indices.length; i++) {\n if (index === indices[i])\n return 0;\n }\n return uncheckedHeapPush(heap, row, weight, index, flag);\n}\n/**\n * Push a new element onto the heap. The heap stores potential neighbors\n * for each data point. The ``row`` parameter determines which data point we\n * are addressing, the ``weight`` determines the distance (for heap sorting),\n * the ``index`` is the element to add, and the flag determines whether this\n * is to be considered a new addition.\n */\nexport function uncheckedHeapPush(heap, row, weight, index, flag) {\n const indices = heap[0][row];\n const weights = heap[1][row];\n const isNew = heap[2][row];\n if (weight >= weights[0])\n return 0;\n // Insert val at position zero\n weights[0] = weight;\n indices[0] = index;\n isNew[0] = flag;\n // Descend the heap, swapping values until the max heap criterion is met\n let i = 0;\n let iSwap = 0;\n while (true) {\n const ic1 = 2 * i + 1;\n const ic2 = ic1 + 1;\n const heapShape2 = heap[0][0].length;\n if (ic1 >= heapShape2) {\n break;\n }\n else if (ic2 >= heapShape2) {\n if (weights[ic1] > weight)\n iSwap = ic1;\n else\n break;\n }\n else if (weights[ic1] >= weights[ic2]) {\n if (weight < weights[ic1])\n iSwap = ic1;\n else\n break;\n }\n else {\n if (weight < weights[ic2])\n iSwap = ic2;\n else\n break;\n }\n weights[i] = weights[iSwap];\n indices[i] = indices[iSwap];\n isNew[i] = isNew[iSwap];\n i = iSwap;\n }\n weights[i] = weight;\n indices[i] = index;\n isNew[i] = flag;\n return 1;\n}\n/**\n * Build a heap of candidate neighbors for nearest neighbor descent. For\n * each vertex the candidate neighbors are any current neighbors, and any\n * vertices that have the vertex as one of their nearest neighbors.\n */\nexport function buildCandidates(currentGraph, nVertices, nNeighbors, maxCandidates, random) {\n const candidateNeighbors = makeHeap(nVertices, maxCandidates);\n for (let i = 0; i < nVertices; i++) {\n for (let j = 0; j < nNeighbors; j++) {\n if (currentGraph[0][i][j] < 0)\n continue;\n const idx = currentGraph[0][i][j];\n const isn = currentGraph[2][i][j];\n const d = utils.tauRand(random);\n heapPush(candidateNeighbors, i, d, idx, isn);\n heapPush(candidateNeighbors, idx, d, i, isn);\n currentGraph[2][i][j] = 0;\n }\n }\n return candidateNeighbors;\n}\n/**\n * Given an array of heaps (of indices and weights), unpack the heap\n * out to give and array of sorted lists of indices and weights by increasing\n * weight. This is effectively just the second half of heap sort (the first\n * half not being required since we already have the data in a heap).\n */\nexport function deheapSort(heap) {\n const indices = heap[0];\n const weights = heap[1];\n for (let i = 0; i < indices.length; i++) {\n const indHeap = indices[i];\n const distHeap = weights[i];\n for (let j = 0; j < indHeap.length - 1; j++) {\n const indHeapIndex = indHeap.length - j - 1;\n const distHeapIndex = distHeap.length - j - 1;\n const temp1 = indHeap[0];\n indHeap[0] = indHeap[indHeapIndex];\n indHeap[indHeapIndex] = temp1;\n const temp2 = distHeap[0];\n distHeap[0] = distHeap[distHeapIndex];\n distHeap[distHeapIndex] = temp2;\n siftDown(distHeap, indHeap, distHeapIndex, 0);\n }\n }\n return { indices, weights };\n}\n/**\n * Restore the heap property for a heap with an out of place element\n * at position ``elt``. This works with a heap pair where heap1 carries\n * the weights and heap2 holds the corresponding elements.\n */\nfunction siftDown(heap1, heap2, ceiling, elt) {\n while (elt * 2 + 1 < ceiling) {\n const leftChild = elt * 2 + 1;\n const rightChild = leftChild + 1;\n let swap = elt;\n if (heap1[swap] < heap1[leftChild])\n swap = leftChild;\n if (rightChild < ceiling && heap1[swap] < heap1[rightChild])\n swap = rightChild;\n if (swap === elt) {\n break;\n }\n else {\n const temp1 = heap1[elt];\n heap1[elt] = heap1[swap];\n heap1[swap] = temp1;\n const temp2 = heap2[elt];\n heap2[elt] = heap2[swap];\n heap2[swap] = temp2;\n elt = swap;\n }\n }\n}\n/**\n * Search the heap for the smallest element that is still flagged.\n */\nexport function smallestFlagged(heap, row) {\n const ind = heap[0][row];\n const dist = heap[1][row];\n const flag = heap[2][row];\n let minDist = Infinity;\n let resultIndex = -1;\n for (let i = 0; i > ind.length; i++) {\n if (flag[i] === 1 && dist[i] < minDist) {\n minDist = dist[i];\n resultIndex = i;\n }\n }\n if (resultIndex >= 0) {\n flag[resultIndex] = 0;\n return Math.floor(ind[resultIndex]);\n }\n else {\n return -1;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhlYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBMkNILE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBSWpDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUMsT0FBZSxFQUFFLElBQVk7SUFDcEQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUU7UUFDdkMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDbkMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLE1BQU0sSUFBSSxHQUFTLEVBQUUsQ0FBQztJQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixRQUFnQixFQUNoQixRQUFnQixFQUNoQixNQUFnQjtJQUVoQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDakMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMs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QyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbkMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUU7WUFDdEMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQixXQUFXLEdBQUcsQ0FBQyxDQUFDO1NBQ2pCO0tBQ0Y7SUFFRCxJQUFJLFdBQVcsSUFBSSxDQUFDLEVBQUU7UUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7S0FDckM7U0FBTTtRQUNMLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FDWDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBKYXZhU2NyaXB0IHJlaW1wbGVtZW50YXRpb24gb2YgVU1BUCAob3JpZ2luYWwgbGljZW5zZSBiZWxvdyksIGZyb21cbiAqIHRoZSBweXRob24gaW1wbGVtZW50YXRpb24gZm91bmQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2xtY2lubmVzL3VtYXAuXG4gKlxuICogQGF1dGhvciBhbmR5Y29lbmVuQGdvb2dsZS5jb20gKEFuZHkgQ29lbmVuKVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIEJTRCAzLUNsYXVzZSBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE3LCBMZWxhbmQgTWNJbm5lc1xuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG5pbXBvcnQge1JhbmRvbUZufSBmcm9tICcuL3VtYXAnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCB0eXBlIEhlYXAgPSBudW1iZXJbXVtdW107XG5cbi8qKlxuICogIENvbnN0cnVjdG9yIGZvciB0aGUgaGVhcCBvYmplY3RzLiBUaGUgaGVhcHMgYXJlIHVzZWRcbiAqIGZvciBhcHByb3hpbWF0ZSBuZWFyZXN0IG5laWdoYm9yIHNlYXJjaCwgbWFpbnRhaW5pbmcgYSBsaXN0IG9mIHBvdGVudGlhbFxuICogbmVpZ2hib3JzIHNvcnRlZCBieSB0aGVpciBkaXN0YW5jZS4gV2UgYWxzbyBmbGFnIGlmIHBvdGVudGlhbCBuZWlnaGJvcnNcbiAqIGFyZSBuZXdseSBhZGRlZCB0byB0aGUgbGlzdCBvciBub3QuIEludGVybmFsbHkgdGhpcyBpcyBzdG9yZWQgYXNcbiAqIGEgc2luZ2xlIGFycmF5OyB0aGUgZmlyc3QgYXhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgd2UgYXJlIGxvb2tpbmcgYXQgdGhlXG4gKiBhcnJheSBvZiBjYW5kaWRhdGUgaW5kaWNlcywgdGhlIGFycmF5IG9mIGRpc3RhbmNlcywgb3IgdGhlIGZsYWcgYXJyYXkgZm9yXG4gKiB3aGV0aGVyIGVsZW1lbnRzIGFyZSBuZXcgb3Igbm90LiBFYWNoIG9mIHRoZXNlIGFycmF5cyBhcmUgb2Ygc2hhcGVcbiAqIChgYG5Qb2ludHNgYCwgYGBzaXplYGApXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlSGVhcChuUG9pbnRzOiBudW1iZXIsIHNpemU6IG51bWJlcik6IEhlYXAge1xuICBjb25zdCBtYWtlQXJyYXlzID0gKGZpbGxWYWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIHV0aWxzLmVtcHR5KG5Qb2ludHMpLm1hcCgoKSA9PiB7XG4gICAgICByZXR1cm4gdXRpbHMuZmlsbGVkKHNpemUsIGZpbGxWYWx1ZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgaGVhcDogSGVhcCA9IFtdO1xuICBoZWFwLnB1c2gobWFrZUFycmF5cygtMSkpO1xuICBoZWFwLnB1c2gobWFrZUFycmF5cyhJbmZpbml0eSkpO1xuICBoZWFwLnB1c2gobWFrZUFycmF5cygwKSk7XG4gIHJldHVybiBoZWFwO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIG5fc2FtcGxlcyBtYW55IGludGVnZXJzIGZyb20gMCB0byBwb29sX3NpemUgc3VjaCB0aGF0IG5vXG4gKiBpbnRlZ2VyIGlzIHNlbGVjdGVkIHR3aWNlLiBUaGUgZHVwbGljYXRpb24gY29uc3RyYWludCBpcyBhY2hpZXZlZCB2aWFcbiAqIHJlamVjdGlvbiBzYW1wbGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlamVjdGlvblNhbXBsZShcbiAgblNhbXBsZXM6IG51bWJlcixcbiAgcG9vbFNpemU6IG51bWJlcixcbiAgcmFuZG9tOiBSYW5kb21GblxuKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHV0aWxzLnplcm9zKG5TYW1wbGVzKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuU2FtcGxlczsgaSsrKSB7XG4gICAgbGV0IHJlamVjdFNhbXBsZSA9IHRydWU7XG4gICAgbGV0IGogPSAwO1xuICAgIHdoaWxlIChyZWplY3RTYW1wbGUpIHtcbiAgICAgIGogPSB1dGlscy50YXVSYW5kSW50KHBvb2xTaXplLCByYW5kb20pO1xuICAgICAgbGV0IGJyb2tlbiA9IGZhbHNlO1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBpOyBrKyspIHtcbiAgICAgICAgaWYgKGogPT09IHJlc3VsdFtrXSkge1xuICAgICAgICAgIGJyb2tlbiA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghYnJva2VuKSByZWplY3RTYW1wbGUgPSBmYWxzZTtcbiAgICB9XG4gICAgcmVzdWx0W2ldID0gajtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFB1c2ggYSBuZXcgZWxlbWVudCBvbnRvIHRoZSBoZWFwLiBUaGUgaGVhcCBzdG9yZXMgcG90ZW50aWFsIG5laWdoYm9yc1xuICogZm9yIGVhY2ggZGF0YSBwb2ludC4gVGhlIGBgcm93YGAgcGFyYW1ldGVyIGRldGVybWluZXMgd2hpY2ggZGF0YSBwb2ludCB3ZVxuICogYXJlIGFkZHJlc3NpbmcsIHRoZSBgYHdlaWdodGBgIGRldGVybWluZXMgdGhlIGRpc3RhbmNlIChmb3IgaGVhcCBzb3J0aW5nKSxcbiAqIHRoZSBgYGluZGV4YGAgaXMgdGhlIGVsZW1lbnQgdG8gYWRkLCBhbmQgdGhlIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXNcbiAqIGlzIHRvIGJlIGNvbnNpZGVyZWQgYSBuZXcgYWRkaXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZWFwUHVzaChcbiAgaGVhcDogSGVhcCxcbiAgcm93OiBudW1iZXIsXG4gIHdlaWdodDogbnVtYmVyLFxuICBpbmRleDogbnVtYmVyLFxuICBmbGFnOiBudW1iZXJcbik6IG51bWJlciB7XG4gIHJvdyA9IE1hdGguZmxvb3Iocm93KTtcbiAgY29uc3QgaW5kaWNlcyA9IGhlYXBbMF1bcm93XTtcbiAgY29uc3Qgd2VpZ2h0cyA9IGhlYXBbMV1bcm93XTtcbiAgLy9jb25zdCBpc05ldyA9IGhlYXBbMl1bcm93XTtcblxuICBpZiAod2VpZ2h0ID49IHdlaWdodHNbMF0pXG4gICAgcmV0dXJuIDA7XG5cblxuICAvLyBCcmVhayBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBlbGVtZW50LlxuICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaW5kZXggPT09IGluZGljZXNbaV0pXG4gICAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiB1bmNoZWNrZWRIZWFwUHVzaChoZWFwLCByb3csIHdlaWdodCwgaW5kZXgsIGZsYWcpO1xufVxuXG4vKipcbiAqIFB1c2ggYSBuZXcgZWxlbWVudCBvbnRvIHRoZSBoZWFwLiBUaGUgaGVhcCBzdG9yZXMgcG90ZW50aWFsIG5laWdoYm9yc1xuICogZm9yIGVhY2ggZGF0YSBwb2ludC4gVGhlIGBgcm93YGAgcGFyYW1ldGVyIGRldGVybWluZXMgd2hpY2ggZGF0YSBwb2ludCB3ZVxuICogYXJlIGFkZHJlc3NpbmcsIHRoZSBgYHdlaWdodGBgIGRldGVybWluZXMgdGhlIGRpc3RhbmNlIChmb3IgaGVhcCBzb3J0aW5nKSxcbiAqIHRoZSBgYGluZGV4YGAgaXMgdGhlIGVsZW1lbnQgdG8gYWRkLCBhbmQgdGhlIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXNcbiAqIGlzIHRvIGJlIGNvbnNpZGVyZWQgYSBuZXcgYWRkaXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmNoZWNrZWRIZWFwUHVzaChcbiAgaGVhcDogSGVhcCxcbiAgcm93OiBudW1iZXIsXG4gIHdlaWdodDogbnVtYmVyLFxuICBpbmRleDogbnVtYmVyLFxuICBmbGFnOiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IGluZGljZXMgPSBoZWFwWzBdW3Jvd107XG4gIGNvbnN0IHdlaWdodHMgPSBoZWFwWzFdW3Jvd107XG4gIGNvbnN0IGlzTmV3ID0gaGVhcFsyXVtyb3ddO1xuXG4gIGlmICh3ZWlnaHQgPj0gd2VpZ2h0c1swXSlcbiAgICByZXR1cm4gMDtcblxuXG4gIC8vIEluc2VydCB2YWwgYXQgcG9zaXRpb24gemVyb1xuICB3ZWlnaHRzWzBdID0gd2VpZ2h0O1xuICBpbmRpY2VzWzBdID0gaW5kZXg7XG4gIGlzTmV3WzBdID0gZmxhZztcblxuICAvLyBEZXNjZW5kIHRoZSBoZWFwLCBzd2FwcGluZyB2YWx1ZXMgdW50aWwgdGhlIG1heCBoZWFwIGNyaXRlcmlvbiBpcyBtZXRcbiAgbGV0IGkgPSAwO1xuICBsZXQgaVN3YXAgPSAwO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGljMSA9IDIgKiBpICsgMTtcbiAgICBjb25zdCBpYzIgPSBpYzEgKyAxO1xuXG4gICAgY29uc3QgaGVhcFNoYXBlMiA9IGhlYXBbMF1bMF0ubGVuZ3RoO1xuICAgIGlmIChpYzEgPj0gaGVhcFNoYXBlMikge1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmIChpYzIgPj0gaGVhcFNoYXBlMikge1xuICAgICAgaWYgKHdlaWdodHNbaWMxXSA+IHdlaWdodClcbiAgICAgICAgaVN3YXAgPSBpYzE7XG4gICAgICBlbHNlXG4gICAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSBpZiAod2VpZ2h0c1tpYzFdID49IHdlaWdodHNbaWMyXSkge1xuICAgICAgaWYgKHdlaWdodCA8IHdlaWdodHNbaWMxXSlcbiAgICAgICAgaVN3YXAgPSBpYzE7XG4gICAgICBlbHNlXG4gICAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAod2VpZ2h0IDwgd2VpZ2h0c1tpYzJdKVxuICAgICAgICBpU3dhcCA9IGljMjtcbiAgICAgIGVsc2VcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgd2VpZ2h0c1tpXSA9IHdlaWdodHNbaVN3YXBdO1xuICAgIGluZGljZXNbaV0gPSBpbmRpY2VzW2lTd2FwXTtcbiAgICBpc05ld1tpXSA9IGlzTmV3W2lTd2FwXTtcblxuICAgIGkgPSBpU3dhcDtcbiAgfVxuXG4gIHdlaWdodHNbaV0gPSB3ZWlnaHQ7XG4gIGluZGljZXNbaV0gPSBpbmRleDtcbiAgaXNOZXdbaV0gPSBmbGFnO1xuICByZXR1cm4gMTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGhlYXAgb2YgY2FuZGlkYXRlIG5laWdoYm9ycyBmb3IgbmVhcmVzdCBuZWlnaGJvciBkZXNjZW50LiBGb3JcbiAqIGVhY2ggdmVydGV4IHRoZSBjYW5kaWRhdGUgbmVpZ2hib3JzIGFyZSBhbnkgY3VycmVudCBuZWlnaGJvcnMsIGFuZCBhbnlcbiAqIHZlcnRpY2VzIHRoYXQgaGF2ZSB0aGUgdmVydGV4IGFzIG9uZSBvZiB0aGVpciBuZWFyZXN0IG5laWdoYm9ycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2FuZGlkYXRlcyhcbiAgY3VycmVudEdyYXBoOiBIZWFwLFxuICBuVmVydGljZXM6IG51bWJlcixcbiAgbk5laWdoYm9yczogbnVtYmVyLFxuICBtYXhDYW5kaWRhdGVzOiBudW1iZXIsXG4gIHJhbmRvbTogUmFuZG9tRm5cbikge1xuICBjb25zdCBjYW5kaWRhdGVOZWlnaGJvcnMgPSBtYWtlSGVhcChuVmVydGljZXMsIG1heENhbmRpZGF0ZXMpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5WZXJ0aWNlczsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBuTmVpZ2hib3JzOyBqKyspIHtcbiAgICAgIGlmIChjdXJyZW50R3JhcGhbMF1baV1bal0gPCAwKVxuICAgICAgICBjb250aW51ZTtcblxuICAgICAgY29uc3QgaWR4ID0gY3VycmVudEdyYXBoWzBdW2ldW2pdO1xuICAgICAgY29uc3QgaXNuID0gY3VycmVudEdyYXBoWzJdW2ldW2pdO1xuICAgICAgY29uc3QgZCA9IHV0aWxzLnRhdVJhbmQocmFuZG9tKTtcbiAgICAgIGhlYXBQdXNoKGNhbmRpZGF0ZU5laWdoYm9ycywgaSwgZCwgaWR4LCBpc24pO1xuICAgICAgaGVhcFB1c2goY2FuZGlkYXRlTmVpZ2hib3JzLCBpZHgsIGQsIGksIGlzbik7XG4gICAgICBjdXJyZW50R3JhcGhbMl1baV1bal0gPSAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlTmVpZ2hib3JzO1xufVxuXG4vKipcbiAqIEdpdmVuIGFuIGFycmF5IG9mIGhlYXBzIChvZiBpbmRpY2VzIGFuZCB3ZWlnaHRzKSwgdW5wYWNrIHRoZSBoZWFwXG4gKiBvdXQgdG8gZ2l2ZSBhbmQgYXJyYXkgb2Ygc29ydGVkIGxpc3RzIG9mIGluZGljZXMgYW5kIHdlaWdodHMgYnkgaW5jcmVhc2luZ1xuICogd2VpZ2h0LiBUaGlzIGlzIGVmZmVjdGl2ZWx5IGp1c3QgdGhlIHNlY29uZCBoYWxmIG9mIGhlYXAgc29ydCAodGhlIGZpcnN0XG4gKiBoYWxmIG5vdCBiZWluZyByZXF1aXJlZCBzaW5jZSB3ZSBhbHJlYWR5IGhhdmUgdGhlIGRhdGEgaW4gYSBoZWFwKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlaGVhcFNvcnQoaGVhcDogSGVhcCkge1xuICBjb25zdCBpbmRpY2VzID0gaGVhcFswXTtcbiAgY29uc3Qgd2VpZ2h0cyA9IGhlYXBbMV07XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaW5kSGVhcCA9IGluZGljZXNbaV07XG4gICAgY29uc3QgZGlzdEhlYXAgPSB3ZWlnaHRzW2ldO1xuXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbmRIZWFwLmxlbmd0aCAtIDE7IGorKykge1xuICAgICAgY29uc3QgaW5kSGVhcEluZGV4ID0gaW5kSGVhcC5sZW5ndGggLSBqIC0gMTtcbiAgICAgIGNvbnN0IGRpc3RIZWFwSW5kZXggPSBkaXN0SGVhcC5sZW5ndGggLSBqIC0gMTtcblxuICAgICAgY29uc3QgdGVtcDEgPSBpbmRIZWFwWzBdO1xuICAgICAgaW5kSGVhcFswXSA9IGluZEhlYXBbaW5kSGVhcEluZGV4XTtcbiAgICAgIGluZEhlYXBbaW5kSGVhcEluZGV4XSA9IHRlbXAxO1xuXG4gICAgICBjb25zdCB0ZW1wMiA9IGRpc3RIZWFwWzBdO1xuICAgICAgZGlzdEhlYXBbMF0gPSBkaXN0SGVhcFtkaXN0SGVhcEluZGV4XTtcbiAgICAgIGRpc3RIZWFwW2Rpc3RIZWFwSW5kZXhdID0gdGVtcDI7XG5cbiAgICAgIHNpZnREb3duKGRpc3RIZWFwLCBpbmRIZWFwLCBkaXN0SGVhcEluZGV4LCAwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtpbmRpY2VzLCB3ZWlnaHRzfTtcbn1cblxuLyoqXG4gKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGZvciBhIGhlYXAgd2l0aCBhbiBvdXQgb2YgcGxhY2UgZWxlbWVudFxuICogYXQgcG9zaXRpb24gYGBlbHRgYC4gVGhpcyB3b3JrcyB3aXRoIGEgaGVhcCBwYWlyIHdoZXJlIGhlYXAxIGNhcnJpZXNcbiAqIHRoZSB3ZWlnaHRzIGFuZCBoZWFwMiBob2xkcyB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cy5cbiAqL1xuZnVuY3Rpb24gc2lmdERvd24oXG4gIGhlYXAxOiBudW1iZXJbXSxcbiAgaGVhcDI6IG51bWJlcltdLFxuICBjZWlsaW5nOiBudW1iZXIsXG4gIGVsdDogbnVtYmVyXG4pIHtcbiAgd2hpbGUgKGVsdCAqIDIgKyAxIDwgY2VpbGluZykge1xuICAgIGNvbnN0IGxlZnRDaGlsZCA9IGVsdCAqIDIgKyAxO1xuICAgIGNvbnN0IHJpZ2h0Q2hpbGQgPSBsZWZ0Q2hpbGQgKyAxO1xuICAgIGxldCBzd2FwID0gZWx0O1xuXG4gICAgaWYgKGhlYXAxW3N3YXBdIDwgaGVhcDFbbGVmdENoaWxkXSlcbiAgICAgIHN3YXAgPSBsZWZ0Q2hpbGQ7XG5cbiAgICBpZiAocmlnaHRDaGlsZCA8IGNlaWxpbmcgJiYgaGVhcDFbc3dhcF0gPCBoZWFwMVtyaWdodENoaWxkXSlcbiAgICAgIHN3YXAgPSByaWdodENoaWxkO1xuXG5cbiAgICBpZiAoc3dhcCA9PT0gZWx0KSB7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGVtcDEgPSBoZWFwMVtlbHRdO1xuICAgICAgaGVhcDFbZWx0XSA9IGhlYXAxW3N3YXBdO1xuICAgICAgaGVhcDFbc3dhcF0gPSB0ZW1wMTtcblxuICAgICAgY29uc3QgdGVtcDIgPSBoZWFwMltlbHRdO1xuICAgICAgaGVhcDJbZWx0XSA9IGhlYXAyW3N3YXBdO1xuICAgICAgaGVhcDJbc3dhcF0gPSB0ZW1wMjtcbiAgICAgIGVsdCA9IHN3YXA7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU2VhcmNoIHRoZSBoZWFwIGZvciB0aGUgc21hbGxlc3QgZWxlbWVudCB0aGF0IGlzIHN0aWxsIGZsYWdnZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbWFsbGVzdEZsYWdnZWQoaGVhcDogSGVhcCwgcm93OiBudW1iZXIpIHtcbiAgY29uc3QgaW5kID0gaGVhcFswXVtyb3ddO1xuICBjb25zdCBkaXN0ID0gaGVhcFsxXVtyb3ddO1xuICBjb25zdCBmbGFnID0gaGVhcFsyXVtyb3ddO1xuXG4gIGxldCBtaW5EaXN0ID0gSW5maW5pdHk7XG4gIGxldCByZXN1bHRJbmRleCA9IC0xO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpID4gaW5kLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZsYWdbaV0gPT09IDEgJiYgZGlzdFtpXSA8IG1pbkRpc3QpIHtcbiAgICAgIG1pbkRpc3QgPSBkaXN0W2ldO1xuICAgICAgcmVzdWx0SW5kZXggPSBpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZXN1bHRJbmRleCA+PSAwKSB7XG4gICAgZmxhZ1tyZXN1bHRJbmRleF0gPSAwO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGluZFtyZXN1bHRJbmRleF0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAtMTtcbiAgfVxufVxuIl19","/**\n * @license\n *\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ==============================================================================\n */\nimport * as utils from './utils';\n/**\n * Internal 2-dimensional sparse matrix class\n */\nexport class SparseMatrix {\n entries = new Map();\n nRows = 0;\n nCols = 0;\n constructor(rows, cols, values, dims) {\n if (rows.length !== cols.length || rows.length !== values.length) {\n throw new Error('rows, cols and values arrays must all have the same length');\n }\n // TODO: Assert that dims are legit.\n this.nRows = dims[0];\n this.nCols = dims[1];\n for (let i = 0; i < values.length; i++) {\n const row = rows[i];\n const col = cols[i];\n this.checkDims(row, col);\n const key = this.makeKey(row, col);\n this.entries.set(key, { value: values[i], row, col });\n }\n }\n makeKey(row, col) {\n return `${row}:${col}`;\n }\n checkDims(row, col) {\n const withinBounds = row < this.nRows && col < this.nCols;\n if (!withinBounds)\n throw new Error('row and/or col specified outside of matrix dimensions');\n }\n set(row, col, value) {\n this.checkDims(row, col);\n const key = this.makeKey(row, col);\n if (!this.entries.has(key))\n this.entries.set(key, { value, row, col });\n else\n this.entries.get(key).value = value;\n }\n get(row, col, defaultValue = 0) {\n //this.checkDims(row, col);\n const key = this.makeKey(row, col);\n if (this.entries.has(key))\n return this.entries.get(key).value;\n else\n return defaultValue;\n }\n getAll(ordered = true) {\n const rowColValues = new Array(this.entries.size).fill(null);\n let i = 0;\n this.entries.forEach((value) => {\n rowColValues[i++] = value;\n });\n if (ordered) {\n // Ordering the result isn't required for processing but it does make it easier to write tests\n rowColValues.sort((a, b) => {\n if (a.row === b.row)\n return a.col - b.col;\n else\n return a.row - b.row;\n });\n }\n return rowColValues;\n }\n getDims() {\n return [this.nRows, this.nCols];\n }\n getRows() {\n return Array.from(this.entries, ([_key, value]) => value.row);\n // return this.rows as unknown as number[];\n }\n getCols() {\n return Array.from(this.entries, ([_key, value]) => value.col);\n // return this.cols as unknown as number[];\n }\n getValues() {\n return Array.from(this.entries, ([_key, value]) => value.value);\n //return this.values as unknown as number[];\n }\n forEach(fn) {\n this.entries.forEach((value) => fn(value.value, value.row, value.col));\n }\n map(fn) {\n const vals = new Float32Array(this.entries.size);\n let i = 0;\n this.entries.forEach((value) => {\n vals[i++] = fn(value.value, value.row, value.col);\n });\n const dims = [this.nRows, this.nCols];\n return new SparseMatrix(this.getRows(), this.getCols(), vals, dims);\n }\n toArray() {\n const rows = utils.empty(this.nRows);\n const output = rows.map(() => {\n return utils.zeros(this.nCols);\n });\n this.entries.forEach((value) => {\n output[value.row][value.col] = value.value;\n });\n return output;\n }\n}\n/**\n * Transpose a sparse matrix\n */\nexport function transpose(matrix) {\n const oldRows = matrix.getRows();\n const oldCols = matrix.getCols();\n const oldVals = matrix.getValues();\n const matlen = oldCols.length;\n const cols = new Int32Array(matlen);\n const rows = new Int32Array(matlen);\n const vals = new Float32Array(matlen);\n cols.set(oldRows);\n rows.set(oldCols);\n vals.set(oldVals);\n const dims = [matrix.nCols, matrix.nRows];\n return new SparseMatrix(rows, cols, vals, dims);\n}\n/**\n * Construct a sparse identity matrix\n */\nexport function identity(size) {\n const [rows] = size;\n const matrix = new SparseMatrix([], [], [], size);\n for (let i = 0; i < rows; i++)\n matrix.set(i, i, 1);\n return matrix;\n}\n/**\n * Element-wise multiplication of two matrices\n */\nexport function pairwiseMultiply(a, b) {\n return elementWise(a, b, (x, y) => x * y);\n}\n/**\n * Element-wise addition of two matrices\n */\nexport function add(a, b) {\n return elementWise(a, b, (x, y) => x + y);\n}\n/**\n * Element-wise subtraction of two matrices\n */\nexport function subtract(a, b) {\n return elementWise(a, b, (x, y) => x - y);\n}\n/**\n * Element-wise maximum of two matrices\n */\nexport function maximum(a, b) {\n return elementWise(a, b, (x, y) => (x > y ? x : y));\n}\n/**\n * Scalar multiplication of two matrices\n */\nexport function multiplyScalar(a, scalar) {\n return a.map((value) => {\n return value * scalar;\n });\n}\n/**\n * Returns a new matrix with zero entries removed.\n */\nexport function eliminateZeros(m) {\n const zeroIndices = new Set();\n const values = m.getValues();\n const rows = m.getRows();\n const cols = m.getCols();\n for (let i = 0; i < values.length; i++) {\n if (values[i] === 0)\n zeroIndices.add(i);\n }\n const removeByZeroIndex = (_, index) => !zeroIndices.has(index);\n const nextValues = values.filter(removeByZeroIndex);\n const nextRows = rows.filter(removeByZeroIndex);\n const nextCols = cols.filter(removeByZeroIndex);\n return new SparseMatrix(nextRows, nextCols, nextValues, m.getDims());\n}\n/**\n * Normalization of a sparse matrix.\n */\nexport function normalize(m, normType = \"l2\" /* NormType.l2 */) {\n const normFn = normFns[normType];\n const colsByRow = new Map();\n m.forEach((_, row, col) => {\n const cols = colsByRow.get(row) || [];\n cols.push(col);\n colsByRow.set(row, cols);\n });\n const nextMatrix = new SparseMatrix([], [], [], m.getDims());\n for (const row of colsByRow.keys()) {\n const cols = colsByRow.get(row).sort();\n const vals = cols.map((col) => m.get(row, col));\n const norm = normFn(vals);\n for (let i = 0; i < norm.length; i++)\n nextMatrix.set(row, cols[i], norm[i]);\n }\n return nextMatrix;\n}\nconst normFns = {\n [\"max\" /* NormType.max */]: (xs) => {\n let max = -Infinity;\n for (let i = 0; i < xs.length; i++)\n max = xs[i] > max ? xs[i] : max;\n return xs.map((x) => x / max);\n },\n [\"l1\" /* NormType.l1 */]: (xs) => {\n let sum = 0;\n for (let i = 0; i < xs.length; i++)\n sum += xs[i];\n return xs.map((x) => x / sum);\n },\n [\"l2\" /* NormType.l2 */]: (xs) => {\n let sum = 0;\n for (let i = 0; i < xs.length; i++)\n sum += xs[i] ** 2;\n return xs.map((x) => Math.sqrt(x ** 2 / sum));\n },\n};\n/**\n * Helper function for element-wise operations.\n */\nfunction elementWise(a, b, op) {\n const visited = new Set();\n const rows = [];\n const cols = [];\n const vals = [];\n const operate = (row, col) => {\n rows.push(row);\n cols.push(col);\n const nextValue = op(a.get(row, col), b.get(row, col));\n vals.push(nextValue);\n };\n const valuesA = a.getValues();\n const rowsA = a.getRows();\n const colsA = a.getCols();\n for (let i = 0; i < valuesA.length; i++) {\n const row = rowsA[i];\n const col = colsA[i];\n const key = `${row}:${col}`;\n visited.add(key);\n operate(row, col);\n }\n const valuesB = b.getValues();\n const rowsB = b.getRows();\n const colsB = b.getCols();\n for (let i = 0; i < valuesB.length; i++) {\n const row = rowsB[i];\n const col = colsB[i];\n const key = `${row}:${col}`;\n if (visited.has(key))\n continue;\n operate(row, col);\n }\n const dims = [a.nRows, a.nCols];\n return new SparseMatrix(rows, cols, vals, dims);\n}\n/**\n * Helper function for getting data, indices, and inptr arrays from a sparse\n * matrix to follow csr matrix conventions. Super inefficient (and kind of\n * defeats the purpose of this convention) but a lot of the ported python tree\n * search logic depends on this data format.\n */\nexport function getCSR(x) {\n const entries = [];\n x.forEach((value, row, col) => {\n entries.push({ value, row, col });\n });\n entries.sort((a, b) => {\n if (a.row === b.row)\n return a.col - b.col;\n else\n return a.row - b.row;\n });\n const indices = [];\n const values = [];\n const indptr = [];\n let currentRow = -1;\n for (let i = 0; i < entries.length; i++) {\n const { row, col, value } = entries[i];\n if (row !== currentRow) {\n currentRow = row;\n indptr.push(i);\n }\n indices.push(col);\n values.push(value);\n }\n return { indices, values, indptr };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0cml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWF0cml4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVILE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBSWpDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFDZixPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQWlCLENBQUM7SUFFbEMsS0FBSyxHQUFXLENBQUMsQ0FBQztJQUNsQixLQUFLLEdBQVcsQ0FBQyxDQUFDO0lBRTNCLFlBQ0UsSUFBMkIsRUFDM0IsSUFBMkIsRUFDM0IsTUFBK0IsRUFDL0IsSUFBYztRQUVkLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNoRSxNQUFNLElBQUksS0FBSyxDQUNiLDREQUE0RCxDQUM3RCxDQUFDO1NBQ0g7UUFFRCxvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN6QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdB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LENBQUMsQ0FBQyxDQUFDO0lBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3ZDLE1BQU0sRUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxJQUFJLEdBQUcsS0FBSyxVQUFVLEVBQUU7WUFDdEIsVUFBVSxHQUFHLEdBQUcsQ0FBQztZQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3BCO0lBRUQsT0FBTyxFQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFDLENBQUM7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuXG50eXBlIEVudHJ5ID0geyB2YWx1ZTogbnVtYmVyOyByb3c6IG51bWJlcjsgY29sOiBudW1iZXIgfTtcblxuLyoqXG4gKiBJbnRlcm5hbCAyLWRpbWVuc2lvbmFsIHNwYXJzZSBtYXRyaXggY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIFNwYXJzZU1hdHJpeCB7XG4gIHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBFbnRyeT4oKTtcblxuICByZWFkb25seSBuUm93czogbnVtYmVyID0gMDtcbiAgcmVhZG9ubHkgbkNvbHM6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcm93czogbnVtYmVyW10gfCBJbnQzMkFycmF5LFxuICAgIGNvbHM6IG51bWJlcltdIHwgSW50MzJBcnJheSxcbiAgICB2YWx1ZXM6IG51bWJlcltdIHwgRmxvYXQzMkFycmF5LFxuICAgIGRpbXM6IG51bWJlcltdXG4gICkge1xuICAgIGlmIChyb3dzLmxlbmd0aCAhPT0gY29scy5sZW5ndGggfHwgcm93cy5sZW5ndGggIT09IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3Jvd3MsIGNvbHMgYW5kIHZhbHVlcyBhcnJheXMgbXVzdCBhbGwgaGF2ZSB0aGUgc2FtZSBsZW5ndGgnXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEFzc2VydCB0aGF0IGRpbXMgYXJlIGxlZ2l0LlxuICAgIHRoaXMublJvd3MgPSBkaW1zWzBdO1xuICAgIHRoaXMubkNvbHMgPSBkaW1zWzFdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByb3cgPSByb3dzW2ldO1xuICAgICAgY29uc3QgY29sID0gY29sc1tpXTtcbiAgICAgIHRoaXMuY2hlY2tEaW1zKHJvdywgY29sKTtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMubWFrZUtleShyb3csIGNvbCk7XG4gICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwge3ZhbHVlOiB2YWx1ZXNbaV0sIHJvdywgY29sfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtYWtlS2V5KHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3Jvd306JHtjb2x9YDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tEaW1zKHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcikge1xuICAgIGNvbnN0IHdpdGhpbkJvdW5kcyA9IHJvdyA8IHRoaXMublJvd3MgJiYgY29sIDwgdGhpcy5uQ29scztcbiAgICBpZiAoIXdpdGhpbkJvdW5kcylcbiAgICAgIHRocm93IG5ldyBFcnJvcigncm93IGFuZC9vciBjb2wgc3BlY2lmaWVkIG91dHNpZGUgb2YgbWF0cml4IGRpbWVuc2lvbnMnKTtcbiAgfVxuXG4gIHNldChyb3c6IG51bWJlciwgY29sOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLmNoZWNrRGltcyhyb3csIGNvbCk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5tYWtlS2V5KHJvdywgY29sKTtcbiAgICBpZiAoIXRoaXMuZW50cmllcy5oYXMoa2V5KSlcbiAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7dmFsdWUsIHJvdywgY29sfSk7XG4gICAgZWxzZVxuICAgICAgdGhpcy5lbnRyaWVzLmdldChrZXkpIS52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0KHJvdzogbnVtYmVyLCBjb2w6IG51bWJlciwgZGVmYXVsdFZhbHVlID0gMCkge1xuICAgIC8vdGhpcy5jaGVja0RpbXMocm93LCBjb2wpO1xuICAgIGNvbnN0IGtleSA9IHRoaXMubWFrZUtleShyb3csIGNvbCk7XG4gICAgaWYgKHRoaXMuZW50cmllcy5oYXMoa2V5KSlcbiAgICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KGtleSkhLnZhbHVlO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICBnZXRBbGwob3JkZXJlZCA9IHRydWUpOiB7IHZhbHVlOiBudW1iZXI7IHJvdzogbnVtYmVyOyBjb2w6IG51bWJlciB9W10ge1xuICAgIGNvbnN0IHJvd0NvbFZhbHVlczogRW50cnlbXSA9IG5ldyBBcnJheSh0aGlzLmVudHJpZXMuc2l6ZSkuZmlsbChudWxsKTtcbiAgICBsZXQgaSA9IDA7XG4gICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICByb3dDb2xWYWx1ZXNbaSsrXSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIGlmIChvcmRlcmVkKSB7XG4gICAgICAvLyBPcmRlcmluZyB0aGUgcmVzdWx0IGlzbid0IHJlcXVpcmVkIGZvciBwcm9jZXNzaW5nIGJ1dCBpdCBkb2VzIG1ha2UgaXQgZWFzaWVyIHRvIHdyaXRlIHRlc3RzXG4gICAgICByb3dDb2xWYWx1ZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBpZiAoYS5yb3cgPT09IGIucm93KVxuICAgICAgICAgIHJldHVybiBhLmNvbCAtIGIuY29sO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgcmV0dXJuIGEucm93IC0gYi5yb3c7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJvd0NvbFZhbHVlcztcbiAgfVxuXG4gIGdldERpbXMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiBbdGhpcy5uUm93cywgdGhpcy5uQ29sc107XG4gIH1cblxuICBnZXRSb3dzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMsIChbX2tleSwgdmFsdWVdKSA9PiB2YWx1ZS5yb3cpO1xuICAgIC8vIHJldHVybiB0aGlzLnJvd3MgYXMgdW5rbm93biBhcyBudW1iZXJbXTtcbiAgfVxuXG4gIGdldENvbHMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcywgKFtfa2V5LCB2YWx1ZV0pID0+IHZhbHVlLmNvbCk7XG4gICAgLy8gcmV0dXJuIHRoaXMuY29scyBhcyB1bmtub3duIGFzIG51bWJlcltdO1xuICB9XG5cbiAgZ2V0VmFsdWVzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMsIChbX2tleSwgdmFsdWVdKSA9PiB2YWx1ZS52YWx1ZSk7XG4gIC8vcmV0dXJuIHRoaXMudmFsdWVzIGFzIHVua25vd24gYXMgbnVtYmVyW107XG4gIH1cblxuICBmb3JFYWNoKGZuOiAodmFsdWU6IG51bWJlciwgcm93OiBudW1iZXIsIGNvbDogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKHZhbHVlKSA9PiBmbih2YWx1ZS52YWx1ZSwgdmFsdWUucm93LCB2YWx1ZS5jb2wpKTtcbiAgfVxuXG4gIG1hcChmbjogKHZhbHVlOiBudW1iZXIsIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcikgPT4gbnVtYmVyKTogU3BhcnNlTWF0cml4IHtcbiAgICBjb25zdCB2YWxzID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmVudHJpZXMuc2l6ZSk7XG4gICAgbGV0IGkgPSAwO1xuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgdmFsc1tpKytdID0gZm4odmFsdWUudmFsdWUsIHZhbHVlLnJvdywgdmFsdWUuY29sKTtcbiAgICB9KTtcbiAgICBjb25zdCBkaW1zID0gW3RoaXMublJvd3MsIHRoaXMubkNvbHNdO1xuICAgIHJldHVybiBuZXcgU3BhcnNlTWF0cml4KHRoaXMuZ2V0Um93cygpLCB0aGlzLmdldENvbHMoKSwgdmFscyBhcyB1bmtub3duIGFzIG51bWJlcltdLCBkaW1zKTtcbiAgfVxuXG4gIHRvQXJyYXkoKSB7XG4gICAgY29uc3Qgcm93czogdW5kZWZpbmVkW10gPSB1dGlscy5lbXB0eSh0aGlzLm5Sb3dzKTtcbiAgICBjb25zdCBvdXRwdXQgPSByb3dzLm1hcCgoKSA9PiB7XG4gICAgICByZXR1cm4gdXRpbHMuemVyb3ModGhpcy5uQ29scyk7XG4gICAgfSk7XG4gICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICBvdXRwdXRbdmFsdWUucm93XVt2YWx1ZS5jb2xdID0gdmFsdWUudmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBhIHNwYXJzZSBtYXRyaXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShtYXRyaXg6IFNwYXJzZU1hdHJpeCk6IFNwYXJzZU1hdHJpeCB7XG4gIGNvbnN0IG9sZFJvd3MgPSBtYXRyaXguZ2V0Um93cygpO1xuICBjb25zdCBvbGRDb2xzID0gbWF0cml4LmdldENvbHMoKTtcbiAgY29uc3Qgb2xkVmFscyA9IG1hdHJpeC5nZXRWYWx1ZXMoKTtcbiAgY29uc3QgbWF0bGVuID0gb2xkQ29scy5sZW5ndGg7XG4gIGNvbnN0IGNvbHMgPSBuZXcgSW50MzJBcnJheShtYXRsZW4pO1xuICBjb25zdCByb3dzID0gbmV3IEludDMyQXJyYXkobWF0bGVuKTtcbiAgY29uc3QgdmFscyA9IG5ldyBGbG9hdDMyQXJyYXkobWF0bGVuKTtcblxuICBjb2xzLnNldChvbGRSb3dzKTtcbiAgcm93cy5zZXQob2xkQ29scyk7XG4gIHZhbHMuc2V0KG9sZFZhbHMpO1xuICBjb25zdCBkaW1zID0gW21hdHJpeC5uQ29scywgbWF0cml4Lm5Sb3dzXTtcbiAgcmV0dXJuIG5ldyBTcGFyc2VNYXRyaXgocm93cywgY29scywgdmFscywgZGltcyk7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGEgc3BhcnNlIGlkZW50aXR5IG1hdHJpeFxuICovXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkoc2l6ZTogbnVtYmVyW10pOiBTcGFyc2VNYXRyaXgge1xuICBjb25zdCBbcm93c10gPSBzaXplO1xuICBjb25zdCBtYXRyaXggPSBuZXcgU3BhcnNlTWF0cml4KFtdLCBbXSwgW10sIHNpemUpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd3M7IGkrKylcbiAgICBtYXRyaXguc2V0KGksIGksIDEpO1xuXG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogRWxlbWVudC13aXNlIG11bHRpcGxpY2F0aW9uIG9mIHR3byBtYXRyaWNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFpcndpc2VNdWx0aXBseShcbiAgYTogU3BhcnNlTWF0cml4LFxuICBiOiBTcGFyc2VNYXRyaXhcbik6IFNwYXJzZU1hdHJpeCB7XG4gIHJldHVybiBlbGVtZW50V2lzZShhLCBiLCAoeCwgeSkgPT4geCAqIHkpO1xufVxuXG4vKipcbiAqIEVsZW1lbnQtd2lzZSBhZGRpdGlvbiBvZiB0d28gbWF0cmljZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZChhOiBTcGFyc2VNYXRyaXgsIGI6IFNwYXJzZU1hdHJpeCk6IFNwYXJzZU1hdHJpeCB7XG4gIHJldHVybiBlbGVtZW50V2lzZShhLCBiLCAoeCwgeSkgPT4geCArIHkpO1xufVxuXG4vKipcbiAqIEVsZW1lbnQtd2lzZSBzdWJ0cmFjdGlvbiBvZiB0d28gbWF0cmljZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KGE6IFNwYXJzZU1hdHJpeCwgYjogU3BhcnNlTWF0cml4KTogU3BhcnNlTWF0cml4IHtcbiAgcmV0dXJuIGVsZW1lbnRXaXNlKGEsIGIsICh4LCB5KSA9PiB4IC0geSk7XG59XG5cbi8qKlxuICogRWxlbWVudC13aXNlIG1heGltdW0gb2YgdHdvIG1hdHJpY2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXhpbXVtKGE6IFNwYXJzZU1hdHJpeCwgYjogU3BhcnNlTWF0cml4KTogU3BhcnNlTWF0cml4IHtcbiAgcmV0dXJuIGVsZW1lbnRXaXNlKGEsIGIsICh4LCB5KSA9PiAoeCA+IHkgPyB4IDogeSkpO1xufVxuXG4vKipcbiAqIFNjYWxhciBtdWx0aXBsaWNhdGlvbiBvZiB0d28gbWF0cmljZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyKGE6IFNwYXJzZU1hdHJpeCwgc2NhbGFyOiBudW1iZXIpOiBTcGFyc2VNYXRyaXgge1xuICByZXR1cm4gYS5tYXAoKHZhbHVlOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gdmFsdWUgKiBzY2FsYXI7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbWF0cml4IHdpdGggemVybyBlbnRyaWVzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbGltaW5hdGVaZXJvcyhtOiBTcGFyc2VNYXRyaXgpIHtcbiAgY29uc3QgemVyb0luZGljZXMgPSBuZXcgU2V0KCk7XG4gIGNvbnN0IHZhbHVlcyA9IG0uZ2V0VmFsdWVzKCk7XG4gIGNvbnN0IHJvd3MgPSBtLmdldFJvd3MoKTtcbiAgY29uc3QgY29scyA9IG0uZ2V0Q29scygpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmICh2YWx1ZXNbaV0gPT09IDApXG4gICAgICB6ZXJvSW5kaWNlcy5hZGQoaSk7XG4gIH1cbiAgY29uc3QgcmVtb3ZlQnlaZXJvSW5kZXggPSAoXzogYW55LCBpbmRleDogbnVtYmVyKSA9PiAhemVyb0luZGljZXMuaGFzKGluZGV4KTtcbiAgY29uc3QgbmV4dFZhbHVlcyA9IHZhbHVlcy5maWx0ZXIocmVtb3ZlQnlaZXJvSW5kZXgpO1xuICBjb25zdCBuZXh0Um93cyA9IHJvd3MuZmlsdGVyKHJlbW92ZUJ5WmVyb0luZGV4KTtcbiAgY29uc3QgbmV4dENvbHMgPSBjb2xzLmZpbHRlcihyZW1vdmVCeVplcm9JbmRleCk7XG5cbiAgcmV0dXJuIG5ldyBTcGFyc2VNYXRyaXgobmV4dFJvd3MsIG5leHRDb2xzLCBuZXh0VmFsdWVzLCBtLmdldERpbXMoKSk7XG59XG5cbi8qKlxuICogTm9ybWFsaXphdGlvbiBvZiBhIHNwYXJzZSBtYXRyaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUobTogU3BhcnNlTWF0cml4LCBub3JtVHlwZSA9IE5vcm1UeXBlLmwyKSB7XG4gIGNvbnN0IG5vcm1GbiA9IG5vcm1GbnNbbm9ybVR5cGVdO1xuXG4gIGNvbnN0IGNvbHNCeVJvdyA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXJbXT4oKTtcbiAgbS5mb3JFYWNoKChfLCByb3csIGNvbCkgPT4ge1xuICAgIGNvbnN0IGNvbHMgPSBjb2xzQnlSb3cuZ2V0KHJvdykgfHwgW107XG4gICAgY29scy5wdXNoKGNvbCk7XG4gICAgY29sc0J5Um93LnNldChyb3csIGNvbHMpO1xuICB9KTtcblxuICBjb25zdCBuZXh0TWF0cml4ID0gbmV3IFNwYXJzZU1hdHJpeChbXSwgW10sIFtdLCBtLmdldERpbXMoKSk7XG5cbiAgZm9yIChjb25zdCByb3cgb2YgY29sc0J5Um93LmtleXMoKSkge1xuICAgIGNvbnN0IGNvbHMgPSBjb2xzQnlSb3cuZ2V0KHJvdykhLnNvcnQoKTtcblxuICAgIGNvbnN0IHZhbHMgPSBjb2xzLm1hcCgoY29sKSA9PiBtLmdldChyb3csIGNvbCkpO1xuICAgIGNvbnN0IG5vcm0gPSBub3JtRm4odmFscyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub3JtLmxlbmd0aDsgaSsrKVxuICAgICAgbmV4dE1hdHJpeC5zZXQocm93LCBjb2xzW2ldLCBub3JtW2ldKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0TWF0cml4O1xufVxuXG4vKipcbiAqIFZlY3RvciBub3JtYWxpemF0aW9uIGZ1bmN0aW9uc1xuICovXG50eXBlIE5vcm1GbnMgPSB7IFtrZXkgaW4gTm9ybVR5cGVdOiAodjogbnVtYmVyW10pID0+IG51bWJlcltdIH07XG5jb25zdCBub3JtRm5zOiBOb3JtRm5zID0ge1xuICBbTm9ybVR5cGUubWF4XTogKHhzOiBudW1iZXJbXSkgPT4ge1xuICAgIGxldCBtYXggPSAtSW5maW5pdHk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKylcbiAgICAgIG1heCA9IHhzW2ldID4gbWF4ID8geHNbaV0gOiBtYXg7XG5cbiAgICByZXR1cm4geHMubWFwKCh4KSA9PiB4IC8gbWF4KTtcbiAgfSxcbiAgW05vcm1UeXBlLmwxXTogKHhzOiBudW1iZXJbXSkgPT4ge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspXG4gICAgICBzdW0gKz0geHNbaV07XG5cbiAgICByZXR1cm4geHMubWFwKCh4KSA9PiB4IC8gc3VtKTtcbiAgfSxcbiAgW05vcm1UeXBlLmwyXTogKHhzOiBudW1iZXJbXSkgPT4ge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspXG4gICAgICBzdW0gKz0geHNbaV0gKiogMjtcblxuICAgIHJldHVybiB4cy5tYXAoKHgpID0+IE1hdGguc3FydCh4ICoqIDIgLyBzdW0pKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBlbnVtIE5vcm1UeXBlIHtcbiAgbWF4ID0gJ21heCcsXG4gIGwxID0gJ2wxJyxcbiAgbDIgPSAnbDInLFxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiBmb3IgZWxlbWVudC13aXNlIG9wZXJhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGVsZW1lbnRXaXNlKFxuICBhOiBTcGFyc2VNYXRyaXgsXG4gIGI6IFNwYXJzZU1hdHJpeCxcbiAgb3A6ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gbnVtYmVyXG4pOiBTcGFyc2VNYXRyaXgge1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHJvd3M6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGNvbHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHZhbHM6IG51bWJlcltdID0gW107XG5cbiAgY29uc3Qgb3BlcmF0ZSA9IChyb3c6IG51bWJlciwgY29sOiBudW1iZXIpID0+IHtcbiAgICByb3dzLnB1c2gocm93KTtcbiAgICBjb2xzLnB1c2goY29sKTtcbiAgICBjb25zdCBuZXh0VmFsdWUgPSBvcChhLmdldChyb3csIGNvbCksIGIuZ2V0KHJvdywgY29sKSk7XG4gICAgdmFscy5wdXNoKG5leHRWYWx1ZSk7XG4gIH07XG4gIGNvbnN0IHZhbHVlc0EgPSBhLmdldFZhbHVlcygpO1xuICBjb25zdCByb3dzQSA9IGEuZ2V0Um93cygpO1xuICBjb25zdCBjb2xzQSA9IGEuZ2V0Q29scygpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlc0EubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCByb3cgPSByb3dzQVtpXTtcbiAgICBjb25zdCBjb2wgPSBjb2xzQVtpXTtcbiAgICBjb25zdCBrZXkgPSBgJHtyb3d9OiR7Y29sfWA7XG4gICAgdmlzaXRlZC5hZGQoa2V5KTtcbiAgICBvcGVyYXRlKHJvdywgY29sKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlc0IgPSBiLmdldFZhbHVlcygpO1xuICBjb25zdCByb3dzQiA9IGIuZ2V0Um93cygpO1xuICBjb25zdCBjb2xzQiA9IGIuZ2V0Q29scygpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlc0IubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCByb3cgPSByb3dzQltpXTtcbiAgICBjb25zdCBjb2wgPSBjb2xzQltpXTtcbiAgICBjb25zdCBrZXkgPSBgJHtyb3d9OiR7Y29sfWA7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgIG9wZXJhdGUocm93LCBjb2wpO1xuICB9XG5cbiAgY29uc3QgZGltcyA9IFthLm5Sb3dzLCBhLm5Db2xzXTtcbiAgcmV0dXJuIG5ldyBTcGFyc2VNYXRyaXgocm93cywgY29scywgdmFscywgZGltcyk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIGZvciBnZXR0aW5nIGRhdGEsIGluZGljZXMsIGFuZCBpbnB0ciBhcnJheXMgZnJvbSBhIHNwYXJzZVxuICogbWF0cml4IHRvIGZvbGxvdyBjc3IgbWF0cml4IGNvbnZlbnRpb25zLiBTdXBlciBpbmVmZmljaWVudCAoYW5kIGtpbmQgb2ZcbiAqIGRlZmVhdHMgdGhlIHB1cnBvc2Ugb2YgdGhpcyBjb252ZW50aW9uKSBidXQgYSBsb3Qgb2YgdGhlIHBvcnRlZCBweXRob24gdHJlZVxuICogc2VhcmNoIGxvZ2ljIGRlcGVuZHMgb24gdGhpcyBkYXRhIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENTUih4OiBTcGFyc2VNYXRyaXgpIHtcbiAgY29uc3QgZW50cmllczogRW50cnlbXSA9IFtdO1xuXG4gIHguZm9yRWFjaCgodmFsdWUsIHJvdywgY29sKSA9PiB7XG4gICAgZW50cmllcy5wdXNoKHt2YWx1ZSwgcm93LCBjb2x9KTtcbiAgfSk7XG5cbiAgZW50cmllcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgaWYgKGEucm93ID09PSBiLnJvdylcbiAgICAgIHJldHVybiBhLmNvbCAtIGIuY29sO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBhLnJvdyAtIGIucm93O1xuICB9KTtcblxuICBjb25zdCBpbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB2YWx1ZXM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGluZHB0cjogbnVtYmVyW10gPSBbXTtcblxuICBsZXQgY3VycmVudFJvdyA9IC0xO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB7cm93LCBjb2wsIHZhbHVlfSA9IGVudHJpZXNbaV07XG4gICAgaWYgKHJvdyAhPT0gY3VycmVudFJvdykge1xuICAgICAgY3VycmVudFJvdyA9IHJvdztcbiAgICAgIGluZHB0ci5wdXNoKGkpO1xuICAgIH1cbiAgICBpbmRpY2VzLnB1c2goY29sKTtcbiAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4ge2luZGljZXMsIHZhbHVlcywgaW5kcHRyfTtcbn1cbiJdfQ==","/**\n * @license\n *\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ==============================================================================\n */\n/**\n * This is a JavaScript reimplementation of UMAP (original license below), from\n * the python implementation found at https://github.com/lmcinnes/umap.\n *\n * @author andycoenen@google.com (Andy Coenen)\n */\n/**\n * @license\n * BSD 3-Clause License\n *\n * Copyright (c) 2017, Leland McInnes\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * * Neither the name of the copyright holder nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport * as utils from './utils';\nexport class FlatTree {\n hyperplanes;\n offsets;\n children;\n indices;\n constructor(hyperplanes, offsets, children, indices) {\n this.hyperplanes = hyperplanes;\n this.offsets = offsets;\n this.children = children;\n this.indices = indices;\n }\n}\n/**\n * Build a random projection forest with ``nTrees``.\n */\nexport function makeForest(data, nNeighbors, nTrees, random) {\n const leafSize = Math.max(10, nNeighbors);\n const trees = utils\n .range(nTrees)\n .map((_, i) => makeTree(data, leafSize, i, random));\n const forest = trees.map((tree) => flattenTree(tree, leafSize));\n return forest;\n}\n/**\n * Construct a random projection tree based on ``data`` with leaves\n * of size at most ``leafSize``\n */\nfunction makeTree(data, leafSize = 30, n, random) {\n const indices = utils.range(data.length);\n const tree = makeEuclideanTree(data, indices, leafSize, n, random);\n return tree;\n}\nfunction makeEuclideanTree(data, indices, leafSize = 30, q, random) {\n if (indices.length > leafSize) {\n const splitResults = euclideanRandomProjectionSplit(data, indices, random);\n const { indicesLeft, indicesRight, hyperplane, offset } = splitResults;\n const leftChild = makeEuclideanTree(data, indicesLeft, leafSize, q + 1, random);\n const rightChild = makeEuclideanTree(data, indicesRight, leafSize, q + 1, random);\n const node = { leftChild, rightChild, isLeaf: false, hyperplane, offset };\n return node;\n }\n else {\n const node = { indices, isLeaf: true };\n return node;\n }\n}\n/**\n * Given a set of ``indices`` for data points from ``data``, create\n * a random hyperplane to split the data, returning two arrays indices\n * that fall on either side of the hyperplane. This is the basis for a\n * random projection tree, which simply uses this splitting recursively.\n * This particular split uses euclidean distance to determine the hyperplane\n * and which side each data sample falls on.\n */\nfunction euclideanRandomProjectionSplit(data, indices, random) {\n //const dim = 1;\n // Select two random points, set the hyperplane between them\n const leftIndex = utils.tauRandInt(indices.length, random);\n let rightIndex = utils.tauRandInt(indices.length, random);\n rightIndex += leftIndex === rightIndex ? 1 : 0;\n rightIndex = rightIndex % indices.length;\n const left = indices[leftIndex];\n const right = indices[rightIndex];\n // Compute the normal vector to the hyperplane (the vector between the two\n // points) and the offset from the origin\n let hyperplaneOffset = 0;\n let hyperplaneVector = 0;\n hyperplaneVector = data[left] - data[right];\n hyperplaneOffset -=\n (hyperplaneVector * (data[left] + data[right])) / 2.0;\n // For each point compute the margin (project into normal vector)\n // If we are on lower side of the hyperplane put in one pile, otherwise\n // put it in the other pile (if we hit hyperplane on the nose, flip a coin)\n let nLeft = 0;\n let nRight = 0;\n const side = utils.zeros(indices.length);\n for (let i = 0; i < indices.length; i++) {\n let margin = hyperplaneOffset;\n margin += hyperplaneVector * data[indices[i]];\n if (margin === 0) {\n side[i] = utils.tauRandInt(2, random);\n if (side[i] === 0)\n nLeft += 1;\n else\n nRight += 1;\n }\n else if (margin > 0) {\n side[i] = 0;\n nLeft += 1;\n }\n else {\n side[i] = 1;\n nRight += 1;\n }\n }\n // Now that we have the counts, allocate arrays\n const indicesLeft = utils.zeros(nLeft);\n const indicesRight = utils.zeros(nRight);\n // Populate the arrays with indices according to which side they fell on\n nLeft = 0;\n nRight = 0;\n for (let i = 0; i < side.length; i++) {\n if (side[i] === 0) {\n indicesLeft[nLeft] = indices[i];\n nLeft += 1;\n }\n else {\n indicesRight[nRight] = indices[i];\n nRight += 1;\n }\n }\n return {\n indicesLeft,\n indicesRight,\n hyperplane: hyperplaneVector,\n offset: hyperplaneOffset,\n };\n}\nfunction flattenTree(tree, leafSize) {\n const nNodes = numNodes(tree);\n const nLeaves = numLeaves(tree);\n // TODO: Verify that sparse code is not relevant...\n const hyperplanes = utils\n .range(nNodes)\n .map(() => tree.hyperplane ? 1 : 0);\n const offsets = utils.zeros(nNodes);\n const children = utils.range(nNodes).map(() => [-1, -1]);\n const indices = utils\n .range(nLeaves)\n .map(() => utils.range(leafSize).map(() => -1));\n recursiveFlatten(tree, hyperplanes, offsets, children, indices, 0, 0);\n return new FlatTree(hyperplanes, offsets, children, indices);\n}\nfunction recursiveFlatten(tree, hyperplanes, offsets, children, indices, nodeNum, leafNum) {\n if (tree.isLeaf) {\n children[nodeNum][0] = -leafNum;\n // TODO: Triple check this operation corresponds to\n // indices[leafNum : tree.indices.shape[0]] = tree.indices\n indices[leafNum].splice(0, tree.indices.length, ...tree.indices);\n leafNum += 1;\n return { nodeNum, leafNum };\n }\n else {\n hyperplanes[nodeNum] = tree.hyperplane;\n offsets[nodeNum] = tree.offset;\n children[nodeNum][0] = nodeNum + 1;\n const oldNodeNum = nodeNum;\n let res = recursiveFlatten(tree.leftChild, hyperplanes, offsets, children, indices, nodeNum + 1, leafNum);\n nodeNum = res.nodeNum;\n leafNum = res.leafNum;\n children[oldNodeNum][1] = nodeNum + 1;\n res = recursiveFlatten(tree.rightChild, hyperplanes, offsets, children, indices, nodeNum + 1, leafNum);\n return { nodeNum: res.nodeNum, leafNum: res.leafNum };\n }\n}\nfunction numNodes(tree) {\n if (tree.isLeaf)\n return 1;\n else\n return 1 + numNodes(tree.leftChild) + numNodes(tree.rightChild);\n}\nfunction numLeaves(tree) {\n if (tree.isLeaf)\n return 1;\n else\n return numLeaves(tree.leftChild) + numLeaves(tree.rightChild);\n}\n/**\n * Generate an array of sets of candidate nearest neighbors by\n * constructing a random projection forest and taking the leaves of all the\n * trees. Any given tree has leaves that are a set of potential nearest\n * neighbors. Given enough trees the set of all such leaves gives a good\n * likelihood of getting a good set of nearest neighbors in composite. Since\n * such a random projection forest is inexpensive to compute, this can be a\n * useful means of seeding other nearest neighbor algorithms.\n */\nexport function makeLeafArray(rpForest) {\n if (rpForest.length > 0) {\n const output = [];\n for (const tree of rpForest)\n output.push(...tree.indices);\n return output;\n }\n else {\n return [[-1]];\n }\n}\n/**\n * Selects the side of the tree to search during flat tree search.\n */\nfunction selectSide(hyperplane, offset, point, random) {\n let margin = offset;\n margin += hyperplane * point;\n if (margin === 0) {\n const side = utils.tauRandInt(2, random);\n return side;\n }\n else if (margin > 0) {\n return 0;\n }\n else {\n return 1;\n }\n}\n/**\n * Searches a flattened rp-tree for a point.\n */\nexport function searchFlatTree(point, tree, random) {\n let node = 0;\n while (tree.children[node][0] > 0) {\n const side = selectSide(tree.hyperplanes[node], tree.offsets[node], point, random);\n if (side === 0)\n node = tree.children[node][0];\n else\n node = tree.children[node][1];\n }\n const index = -1 * tree.children[node][0];\n return tree.indices[index];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBZWpDLE1BQU0sT0FBTyxRQUFRO0lBRVY7SUFDQTtJQUNBO0lBQ0E7SUFKVCxZQUNTLFdBQXFCLEVBQ3JCLE9BQWlCLEVBQ2pCLFFBQW9CLEVBQ3BCLE9BQW1CO1FBSG5CLGdCQUFXLEdBQVgsV0FBVyxDQUFVO1FBQ3JCLFlBQU8sR0FBUCxPQUFPLENBQVU7UUFDakIsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQUNwQixZQUFPLEdBQVAsT0FBTyxDQUFZO0lBQ3pCLENBQUM7Q0FDTDtBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FDeEIsSUFBWSxFQUNaLFVBQWtCLEVBQ2xCLE1BQWMsRUFDZCxNQUFnQjtJQUVoQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUUxQyxNQUFNLEtBQUssR0FBRyxLQUFLO1NBQ2hCLEtBQUssQ0FBQyxNQUFNLENBQUM7U0FDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN0RCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFFaEUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsUUFBUSxDQUNmLElBQVks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QUNqQztJQUVELE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBKYXZhU2NyaXB0IHJlaW1wbGVtZW50YXRpb24gb2YgVU1BUCAob3JpZ2luYWwgbGljZW5zZSBiZWxvdyksIGZyb21cbiAqIHRoZSBweXRob24gaW1wbGVtZW50YXRpb24gZm91bmQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2xtY2lubmVzL3VtYXAuXG4gKlxuICogQGF1dGhvciBhbmR5Y29lbmVuQGdvb2dsZS5jb20gKEFuZHkgQ29lbmVuKVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIEJTRCAzLUNsYXVzZSBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE3LCBMZWxhbmQgTWNJbm5lc1xuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7UmFuZG9tRm4sIFZlY3Rvcn0gZnJvbSAnLi91bWFwJztcblxuLyoqXG4gKiBUcmVlIGZ1bmN0aW9uYWxpdHkgZm9yIGFwcHJveGltYXRpbmcgbmVhcmVzdCBuZWlnaGJvcnNcbiAqL1xuaW50ZXJmYWNlIFJhbmRvbVByb2plY3Rpb25UcmVlTm9kZSB7XG4gIGlzTGVhZjogYm9vbGVhbjtcbiAgaW5kaWNlcz86IG51bWJlcltdO1xuICBsZWZ0Q2hpbGQ/OiBSYW5kb21Qcm9qZWN0aW9uVHJlZU5vZGU7XG4gIHJpZ2h0Q2hpbGQ/OiBSYW5kb21Qcm9qZWN0aW9uVHJlZU5vZGU7XG4gIGh5cGVycGxhbmU/OiBudW1iZXI7XG4gIG9mZnNldD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEZsYXRUcmVlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGh5cGVycGxhbmVzOiBudW1iZXJbXSxcbiAgICBwdWJsaWMgb2Zmc2V0czogbnVtYmVyW10sXG4gICAgcHVibGljIGNoaWxkcmVuOiBudW1iZXJbXVtdLFxuICAgIHB1YmxpYyBpbmRpY2VzOiBudW1iZXJbXVtdXG4gICkge31cbn1cblxuLyoqXG4gKiBCdWlsZCBhIHJhbmRvbSBwcm9qZWN0aW9uIGZvcmVzdCB3aXRoIGBgblRyZWVzYGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlRm9yZXN0KFxuICBkYXRhOiBWZWN0b3IsXG4gIG5OZWlnaGJvcnM6IG51bWJlcixcbiAgblRyZWVzOiBudW1iZXIsXG4gIHJhbmRvbTogUmFuZG9tRm5cbikge1xuICBjb25zdCBsZWFmU2l6ZSA9IE1hdGgubWF4KDEwLCBuTmVpZ2hib3JzKTtcblxuICBjb25zdCB0cmVlcyA9IHV0aWxzXG4gICAgLnJhbmdlKG5UcmVlcylcbiAgICAubWFwKChfLCBpKSA9PiBtYWtlVHJlZShkYXRhLCBsZWFmU2l6ZSwgaSwgcmFuZG9tKSk7XG4gIGNvbnN0IGZvcmVzdCA9IHRyZWVzLm1hcCgodHJlZSkgPT4gZmxhdHRlblRyZWUodHJlZSwgbGVhZlNpemUpKTtcblxuICByZXR1cm4gZm9yZXN0O1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBhIHJhbmRvbSBwcm9qZWN0aW9uIHRyZWUgYmFzZWQgb24gYGBkYXRhYGAgd2l0aCBsZWF2ZXNcbiAqIG9mIHNpemUgYXQgbW9zdCBgYGxlYWZTaXplYGBcbiAqL1xuZnVuY3Rpb24gbWFrZVRyZWUoXG4gIGRhdGE6IFZlY3RvcixcbiAgbGVhZlNpemUgPSAzMCxcbiAgbjogbnVtYmVyLFxuICByYW5kb206IFJhbmRvbUZuXG4pOiBSYW5kb21Qcm9qZWN0aW9uVHJlZU5vZGUge1xuICBjb25zdCBpbmRpY2VzID0gdXRpbHMucmFuZ2UoZGF0YS5sZW5ndGgpO1xuICBjb25zdCB0cmVlID0gbWFrZUV1Y2xpZGVhblRyZWUoZGF0YSwgaW5kaWNlcywgbGVhZlNpemUsIG4sIHJhbmRvbSk7XG4gIHJldHVybiB0cmVlO1xufVxuXG5mdW5jdGlvbiBtYWtlRXVjbGlkZWFuVHJlZShcbiAgZGF0YTogVmVjdG9yLFxuICBpbmRpY2VzOiBudW1iZXJbXSxcbiAgbGVhZlNpemUgPSAzMCxcbiAgcTogbnVtYmVyLFxuICByYW5kb206IFJhbmRvbUZuXG4pOiBSYW5kb21Qcm9qZWN0aW9uVHJlZU5vZGUge1xuICBpZiAoaW5kaWNlcy5sZW5ndGggPiBsZWFmU2l6ZSkge1xuICAgIGNvbnN0IHNwbGl0UmVzdWx0cyA9IGV1Y2xpZGVhblJhbmRvbVByb2plY3Rpb25TcGxpdChkYXRhLCBpbmRpY2VzLCByYW5kb20pO1xuICAgIGNvbnN0IHtpbmRpY2VzTGVmdCwgaW5kaWNlc1JpZ2h0LCBoeXBlcnBsYW5lLCBvZmZzZXR9ID0gc3BsaXRSZXN1bHRzO1xuXG4gICAgY29uc3QgbGVmdENoaWxkID0gbWFrZUV1Y2xpZGVhblRyZWUoXG4gICAgICBkYXRhLFxuICAgICAgaW5kaWNlc0xlZnQsXG4gICAgICBsZWFmU2l6ZSxcbiAgICAgIHEgKyAxLFxuICAgICAgcmFuZG9tXG4gICAgKTtcbiAgICBjb25zdCByaWdodENoaWxkID0gbWFrZUV1Y2xpZGVhblRyZWUoXG4gICAgICBkYXRhLFxuICAgICAgaW5kaWNlc1JpZ2h0LFxuICAgICAgbGVhZlNpemUsXG4gICAgICBxICsgMSxcbiAgICAgIHJhbmRvbVxuICAgICk7XG5cbiAgICBjb25zdCBub2RlID0ge2xlZnRDaGlsZCwgcmlnaHRDaGlsZCwgaXNMZWFmOiBmYWxzZSwgaHlwZXJwbGFuZSwgb2Zmc2V0fTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBub2RlID0ge2luZGljZXMsIGlzTGVhZjogdHJ1ZX07XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbn1cblxuLyoqXG4gKiBHaXZlbiBhIHNldCBvZiBgYGluZGljZXNgYCBmb3IgZGF0YSBwb2ludHMgZnJvbSBgYGRhdGFgYCwgY3JlYXRlXG4gKiBhIHJhbmRvbSBoeXBlcnBsYW5lIHRvIHNwbGl0IHRoZSBkYXRhLCByZXR1cm5pbmcgdHdvIGFycmF5cyBpbmRpY2VzXG4gKiB0aGF0IGZhbGwgb24gZWl0aGVyIHNpZGUgb2YgdGhlIGh5cGVycGxhbmUuIFRoaXMgaXMgdGhlIGJhc2lzIGZvciBhXG4gKiByYW5kb20gcHJvamVjdGlvbiB0cmVlLCB3aGljaCBzaW1wbHkgdXNlcyB0aGlzIHNwbGl0dGluZyByZWN1cnNpdmVseS5cbiAqIFRoaXMgcGFydGljdWxhciBzcGxpdCB1c2VzIGV1Y2xpZGVhbiBkaXN0YW5jZSB0byBkZXRlcm1pbmUgdGhlIGh5cGVycGxhbmVcbiAqIGFuZCB3aGljaCBzaWRlIGVhY2ggZGF0YSBzYW1wbGUgZmFsbHMgb24uXG4gKi9cbmZ1bmN0aW9uIGV1Y2xpZGVhblJhbmRvbVByb2plY3Rpb25TcGxpdChcbiAgZGF0YTogVmVjdG9yLFxuICBpbmRpY2VzOiBudW1iZXJbXSxcbiAgcmFuZG9tOiBSYW5kb21GblxuKSB7XG4gIC8vY29uc3QgZGltID0gMTtcblxuICAvLyBTZWxlY3QgdHdvIHJhbmRvbSBwb2ludHMsIHNldCB0aGUgaHlwZXJwbGFuZSBiZXR3ZWVuIHRoZW1cbiAgY29uc3QgbGVmdEluZGV4ID0gdXRpbHMudGF1UmFuZEludChpbmRpY2VzLmxlbmd0aCwgcmFuZG9tKTtcbiAgbGV0IHJpZ2h0SW5kZXggPSB1dGlscy50YXVSYW5kSW50KGluZGljZXMubGVuZ3RoLCByYW5kb20pO1xuICByaWdodEluZGV4ICs9IGxlZnRJbmRleCA9PT0gcmlnaHRJbmRleCA/IDEgOiAwO1xuICByaWdodEluZGV4ID0gcmlnaHRJbmRleCAlIGluZGljZXMubGVuZ3RoO1xuICBjb25zdCBsZWZ0ID0gaW5kaWNlc1tsZWZ0SW5kZXhdO1xuICBjb25zdCByaWdodCA9IGluZGljZXNbcmlnaHRJbmRleF07XG5cbiAgLy8gQ29tcHV0ZSB0aGUgbm9ybWFsIHZlY3RvciB0byB0aGUgaHlwZXJwbGFuZSAodGhlIHZlY3RvciBiZXR3ZWVuIHRoZSB0d29cbiAgLy8gcG9pbnRzKSBhbmQgdGhlIG9mZnNldCBmcm9tIHRoZSBvcmlnaW5cbiAgbGV0IGh5cGVycGxhbmVPZmZzZXQgPSAwO1xuICBsZXQgaHlwZXJwbGFuZVZlY3RvciA9IDA7XG5cblxuICBoeXBlcnBsYW5lVmVjdG9yID0gZGF0YVtsZWZ0XSAtIGRhdGFbcmlnaHRdO1xuICBoeXBlcnBsYW5lT2Zmc2V0IC09XG4gICAgKGh5cGVycGxhbmVWZWN0b3IgKiAoZGF0YVtsZWZ0XSArIGRhdGFbcmlnaHRdKSkgLyAyLjA7XG5cblxuICAvLyBGb3IgZWFjaCBwb2ludCBjb21wdXRlIHRoZSBtYXJnaW4gKHByb2plY3QgaW50byBub3JtYWwgdmVjdG9yKVxuICAvLyBJZiB3ZSBhcmUgb24gbG93ZXIgc2lkZSBvZiB0aGUgaHlwZXJwbGFuZSBwdXQgaW4gb25lIHBpbGUsIG90aGVyd2lzZVxuICAvLyBwdXQgaXQgaW4gdGhlIG90aGVyIHBpbGUgKGlmIHdlIGhpdCBoeXBlcnBsYW5lIG9uIHRoZSBub3NlLCBmbGlwIGEgY29pbilcbiAgbGV0IG5MZWZ0ID0gMDtcbiAgbGV0IG5SaWdodCA9IDA7XG4gIGNvbnN0IHNpZGUgPSB1dGlscy56ZXJvcyhpbmRpY2VzLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBtYXJnaW4gPSBoeXBlcnBsYW5lT2Zmc2V0O1xuXG4gICAgbWFyZ2luICs9IGh5cGVycGxhbmVWZWN0b3IgKiBkYXRhW2luZGljZXNbaV1dO1xuXG4gICAgaWYgKG1hcmdpbiA9PT0gMCkge1xuICAgICAgc2lkZVtpXSA9IHV0aWxzLnRhdVJhbmRJbnQoMiwgcmFuZG9tKTtcbiAgICAgIGlmIChzaWRlW2ldID09PSAwKVxuICAgICAgICBuTGVmdCArPSAxO1xuICAgICAgZWxzZVxuICAgICAgICBuUmlnaHQgKz0gMTtcbiAgICB9IGVsc2UgaWYgKG1hcmdpbiA+IDApIHtcbiAgICAgIHNpZGVbaV0gPSAwO1xuICAgICAgbkxlZnQgKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2lkZVtpXSA9IDE7XG4gICAgICBuUmlnaHQgKz0gMTtcbiAgICB9XG4gIH1cblxuICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHRoZSBjb3VudHMsIGFsbG9jYXRlIGFycmF5c1xuICBjb25zdCBpbmRpY2VzTGVmdCA9IHV0aWxzLnplcm9zKG5MZWZ0KTtcbiAgY29uc3QgaW5kaWNlc1JpZ2h0ID0gdXRpbHMuemVyb3MoblJpZ2h0KTtcblxuICAvLyBQb3B1bGF0ZSB0aGUgYXJyYXlzIHdpdGggaW5kaWNlcyBhY2NvcmRpbmcgdG8gd2hpY2ggc2lkZSB0aGV5IGZlbGwgb25cbiAgbkxlZnQgPSAwO1xuICBuUmlnaHQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNpZGUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc2lkZVtpXSA9PT0gMCkge1xuICAgICAgaW5kaWNlc0xlZnRbbkxlZnRdID0gaW5kaWNlc1tpXTtcbiAgICAgIG5MZWZ0ICs9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGljZXNSaWdodFtuUmlnaHRdID0gaW5kaWNlc1tpXTtcbiAgICAgIG5SaWdodCArPSAxO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaW5kaWNlc0xlZnQsXG4gICAgaW5kaWNlc1JpZ2h0LFxuICAgIGh5cGVycGxhbmU6IGh5cGVycGxhbmVWZWN0b3IsXG4gICAgb2Zmc2V0OiBoeXBlcnBsYW5lT2Zmc2V0LFxuICB9O1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuVHJlZSh0cmVlOiBSYW5kb21Qcm9qZWN0aW9uVHJlZU5vZGUsIGxlYWZTaXplOiBudW1iZXIpIHtcbiAgY29uc3Qgbk5vZGVzID0gbnVtTm9kZXModHJlZSk7XG4gIGNvbnN0IG5MZWF2ZXMgPSBudW1MZWF2ZXModHJlZSk7XG5cbiAgLy8gVE9ETzogVmVyaWZ5IHRoYXQgc3BhcnNlIGNvZGUgaXMgbm90IHJlbGV2YW50Li4uXG4gIGNvbnN0IGh5cGVycGxhbmVzID0gdXRpbHNcbiAgICAucmFuZ2Uobk5vZGVzKVxuICAgIC5tYXAoKCkgPT4gdHJlZS5oeXBlcnBsYW5lID8gMSA6IDApO1xuXG4gIGNvbnN0IG9mZnNldHMgPSB1dGlscy56ZXJvcyhuTm9kZXMpO1xuICBjb25zdCBjaGlsZHJlbiA9IHV0aWxzLnJhbmdlKG5Ob2RlcykubWFwKCgpID0+IFstMSwgLTFdKTtcbiAgY29uc3QgaW5kaWNlcyA9IHV0aWxzXG4gICAgLnJhbmdlKG5MZWF2ZXMpXG4gICAgLm1hcCgoKSA9PiB1dGlscy5yYW5nZShsZWFmU2l6ZSkubWFwKCgpID0+IC0xKSk7XG4gIHJlY3Vyc2l2ZUZsYXR0ZW4odHJlZSwgaHlwZXJwbGFuZXMsIG9mZnNldHMsIGNoaWxkcmVuLCBpbmRpY2VzLCAwLCAwKTtcbiAgcmV0dXJuIG5ldyBGbGF0VHJlZShoeXBlcnBsYW5lcywgb2Zmc2V0cywgY2hpbGRyZW4sIGluZGljZXMpO1xufVxuXG5mdW5jdGlvbiByZWN1cnNpdmVGbGF0dGVuKFxuICB0cmVlOiBSYW5kb21Qcm9qZWN0aW9uVHJlZU5vZGUsXG4gIGh5cGVycGxhbmVzOiBudW1iZXJbXSxcbiAgb2Zmc2V0czogbnVtYmVyW10sXG4gIGNoaWxkcmVuOiBudW1iZXJbXVtdLFxuICBpbmRpY2VzOiBudW1iZXJbXVtdLFxuICBub2RlTnVtOiBudW1iZXIsXG4gIGxlYWZOdW06IG51bWJlclxuKTogeyBub2RlTnVtOiBudW1iZXI7IGxlYWZOdW06IG51bWJlciB9IHtcbiAgaWYgKHRyZWUuaXNMZWFmKSB7XG4gICAgY2hpbGRyZW5bbm9kZU51bV1bMF0gPSAtbGVhZk51bTtcblxuICAgIC8vIFRPRE86IFRyaXBsZSBjaGVjayB0aGlzIG9wZXJhdGlvbiBjb3JyZXNwb25kcyB0b1xuICAgIC8vIGluZGljZXNbbGVhZk51bSA6IHRyZWUuaW5kaWNlcy5zaGFwZVswXV0gPSB0cmVlLmluZGljZXNcbiAgICBpbmRpY2VzW2xlYWZOdW1dLnNwbGljZSgwLCB0cmVlLmluZGljZXMhLmxlbmd0aCwgLi4udHJlZS5pbmRpY2VzISk7XG4gICAgbGVhZk51bSArPSAxO1xuICAgIHJldHVybiB7bm9kZU51bSwgbGVhZk51bX07XG4gIH0gZWxzZSB7XG4gICAgaHlwZXJwbGFuZXNbbm9kZU51bV0gPSB0cmVlLmh5cGVycGxhbmUhO1xuICAgIG9mZnNldHNbbm9kZU51bV0gPSB0cmVlLm9mZnNldCE7XG4gICAgY2hpbGRyZW5bbm9kZU51bV1bMF0gPSBub2RlTnVtICsgMTtcbiAgICBjb25zdCBvbGROb2RlTnVtID0gbm9kZU51bTtcblxuICAgIGxldCByZXMgPSByZWN1cnNpdmVGbGF0dGVuKFxuICAgICAgdHJlZS5sZWZ0Q2hpbGQhLFxuICAgICAgaHlwZXJwbGFuZXMsXG4gICAgICBvZmZzZXRzLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBpbmRpY2VzLFxuICAgICAgbm9kZU51bSArIDEsXG4gICAgICBsZWFmTnVtXG4gICAgKTtcbiAgICBub2RlTnVtID0gcmVzLm5vZGVOdW07XG4gICAgbGVhZk51bSA9IHJlcy5sZWFmTnVtO1xuXG4gICAgY2hpbGRyZW5bb2xkTm9kZU51bV1bMV0gPSBub2RlTnVtICsgMTtcblxuICAgIHJlcyA9IHJlY3Vyc2l2ZUZsYXR0ZW4oXG4gICAgICB0cmVlLnJpZ2h0Q2hpbGQhLFxuICAgICAgaHlwZXJwbGFuZXMsXG4gICAgICBvZmZzZXRzLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBpbmRpY2VzLFxuICAgICAgbm9kZU51bSArIDEsXG4gICAgICBsZWFmTnVtXG4gICAgKTtcbiAgICByZXR1cm4ge25vZGVOdW06IHJlcy5ub2RlTnVtLCBsZWFmTnVtOiByZXMubGVhZk51bX07XG4gIH1cbn1cblxuZnVuY3Rpb24gbnVtTm9kZXModHJlZTogUmFuZG9tUHJvamVjdGlvblRyZWVOb2RlKTogbnVtYmVyIHtcbiAgaWYgKHRyZWUuaXNMZWFmKVxuICAgIHJldHVybiAxO1xuICBlbHNlXG4gICAgcmV0dXJuIDEgKyBudW1Ob2Rlcyh0cmVlLmxlZnRDaGlsZCEpICsgbnVtTm9kZXModHJlZS5yaWdodENoaWxkISk7XG59XG5cbmZ1bmN0aW9uIG51bUxlYXZlcyh0cmVlOiBSYW5kb21Qcm9qZWN0aW9uVHJlZU5vZGUpOiBudW1iZXIge1xuICBpZiAodHJlZS5pc0xlYWYpXG4gICAgcmV0dXJuIDE7XG4gIGVsc2VcbiAgICByZXR1cm4gbnVtTGVhdmVzKHRyZWUubGVmdENoaWxkISkgKyBudW1MZWF2ZXModHJlZS5yaWdodENoaWxkISk7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYW4gYXJyYXkgb2Ygc2V0cyBvZiBjYW5kaWRhdGUgbmVhcmVzdCBuZWlnaGJvcnMgYnlcbiAqIGNvbnN0cnVjdGluZyBhIHJhbmRvbSBwcm9qZWN0aW9uIGZvcmVzdCBhbmQgdGFraW5nIHRoZSBsZWF2ZXMgb2YgYWxsIHRoZVxuICogdHJlZXMuIEFueSBnaXZlbiB0cmVlIGhhcyBsZWF2ZXMgdGhhdCBhcmUgYSBzZXQgb2YgcG90ZW50aWFsIG5lYXJlc3RcbiAqIG5laWdoYm9ycy4gR2l2ZW4gZW5vdWdoIHRyZWVzIHRoZSBzZXQgb2YgYWxsIHN1Y2ggbGVhdmVzIGdpdmVzIGEgZ29vZFxuICogbGlrZWxpaG9vZCBvZiBnZXR0aW5nIGEgZ29vZCBzZXQgb2YgbmVhcmVzdCBuZWlnaGJvcnMgaW4gY29tcG9zaXRlLiBTaW5jZVxuICogc3VjaCBhIHJhbmRvbSBwcm9qZWN0aW9uIGZvcmVzdCBpcyBpbmV4cGVuc2l2ZSB0byBjb21wdXRlLCB0aGlzIGNhbiBiZSBhXG4gKiB1c2VmdWwgbWVhbnMgb2Ygc2VlZGluZyBvdGhlciBuZWFyZXN0IG5laWdoYm9yIGFsZ29yaXRobXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTGVhZkFycmF5KHJwRm9yZXN0OiBGbGF0VHJlZVtdKTogbnVtYmVyW11bXSB7XG4gIGlmIChycEZvcmVzdC5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgb3V0cHV0OiBudW1iZXJbXVtdID0gW107XG4gICAgZm9yIChjb25zdCB0cmVlIG9mIHJwRm9yZXN0KVxuICAgICAgb3V0cHV0LnB1c2goLi4udHJlZS5pbmRpY2VzISk7XG5cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbWy0xXV07XG4gIH1cbn1cblxuLyoqXG4gKiBTZWxlY3RzIHRoZSBzaWRlIG9mIHRoZSB0cmVlIHRvIHNlYXJjaCBkdXJpbmcgZmxhdCB0cmVlIHNlYXJjaC5cbiAqL1xuZnVuY3Rpb24gc2VsZWN0U2lkZShcbiAgaHlwZXJwbGFuZTogbnVtYmVyLFxuICBvZmZzZXQ6IG51bWJlcixcbiAgcG9pbnQ6IG51bWJlcixcbiAgcmFuZG9tOiBSYW5kb21GblxuKSB7XG4gIGxldCBtYXJnaW4gPSBvZmZzZXQ7XG5cbiAgbWFyZ2luICs9IGh5cGVycGxhbmUgKiBwb2ludDtcblxuXG4gIGlmIChtYXJnaW4gPT09IDApIHtcbiAgICBjb25zdCBzaWRlID0gdXRpbHMudGF1UmFuZEludCgyLCByYW5kb20pO1xuICAgIHJldHVybiBzaWRlO1xuICB9IGVsc2UgaWYgKG1hcmdpbiA+IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMTtcbiAgfVxufVxuXG4vKipcbiAqIFNlYXJjaGVzIGEgZmxhdHRlbmVkIHJwLXRyZWUgZm9yIGEgcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWFyY2hGbGF0VHJlZShcbiAgcG9pbnQ6IG51bWJlcixcbiAgdHJlZTogRmxhdFRyZWUsXG4gIHJhbmRvbTogUmFuZG9tRm5cbikge1xuICBsZXQgbm9kZSA9IDA7XG4gIHdoaWxlICh0cmVlLmNoaWxkcmVuW25vZGVdWzBdID4gMCkge1xuICAgIGNvbnN0IHNpZGUgPSBzZWxlY3RTaWRlKFxuICAgICAgdHJlZS5oeXBlcnBsYW5lc1tub2RlXSxcbiAgICAgIHRyZWUub2Zmc2V0c1tub2RlXSxcbiAgICAgIHBvaW50LFxuICAgICAgcmFuZG9tXG4gICAgKTtcbiAgICBpZiAoc2lkZSA9PT0gMClcbiAgICAgIG5vZGUgPSB0cmVlLmNoaWxkcmVuW25vZGVdWzBdO1xuICAgIGVsc2VcbiAgICAgIG5vZGUgPSB0cmVlLmNoaWxkcmVuW25vZGVdWzFdO1xuICB9XG5cbiAgY29uc3QgaW5kZXggPSAtMSAqIHRyZWUuY2hpbGRyZW5bbm9kZV1bMF07XG4gIHJldHVybiB0cmVlLmluZGljZXNbaW5kZXhdO1xufVxuIl19","const toString = Object.prototype.toString;\n\nexport default function isAnyArray(object) {\n return toString.call(object).endsWith('Array]');\n}\n","/**\n * Calculate current error\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} parameters - Array of current parameter values\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {number}\n */\nexport default function errorCalculation(\n data,\n parameters,\n parameterizedFunction,\n) {\n let error = 0;\n const func = parameterizedFunction(parameters);\n\n for (let i = 0; i < data.x.length; i++) {\n error += Math.abs(data.y[i] - func(data.x[i]));\n }\n\n return error;\n}\n","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","const toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array).\n *\n * @param {any} value - Object to check.\n * @returns {boolean} True if the object is an array.\n */\nexport function isAnyArray(value) {\n return toString.call(value).endsWith('Array]');\n}\n//# sourceMappingURL=index.js.map","import { isAnyArray } from 'is-any-array';\nimport max from 'ml-array-max';\nimport min from 'ml-array-min';\n\nfunction rescale(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n } else if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var output;\n\n if (options.output !== undefined) {\n if (!isAnyArray(options.output)) {\n throw new TypeError('output option must be an array if specified');\n }\n\n output = options.output;\n } else {\n output = new Array(input.length);\n }\n\n var currentMin = min(input);\n var currentMax = max(input);\n\n if (currentMin === currentMax) {\n throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n }\n\n var _options$min = options.min,\n minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n _options$max = options.max,\n maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n if (minValue >= maxValue) {\n throw new RangeError('min option must be smaller than max option');\n }\n\n var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n for (var i = 0; i < input.length; i++) {\n output[i] = (input[i] - currentMin) * factor + minValue;\n }\n\n return output;\n}\n\nexport { rescale as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction min(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n }\n\n if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var _options$fromIndex = options.fromIndex,\n fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n _options$toIndex = options.toIndex,\n toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n throw new Error('fromIndex must be a positive integer smaller than length');\n }\n\n if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n }\n\n var minValue = input[fromIndex];\n\n for (var i = fromIndex + 1; i < toIndex; i++) {\n if (input[i] < minValue) minValue = input[i];\n }\n\n return minValue;\n}\n\nexport { min as default };\n","import { isAnyArray } from 'is-any-array';\n\nfunction max(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n }\n\n if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var _options$fromIndex = options.fromIndex,\n fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n _options$toIndex = options.toIndex,\n toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n throw new Error('fromIndex must be a positive integer smaller than length');\n }\n\n if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n }\n\n var maxValue = input[fromIndex];\n\n for (var i = fromIndex + 1; i < toIndex; i++) {\n if (input[i] > maxValue) maxValue = input[i];\n }\n\n return maxValue;\n}\n\nexport { max as default };\n","const indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nexport function inspectMatrix() {\n return inspectMatrixWithOptions(this);\n}\n\nexport function inspectMatrixWithOptions(matrix, options = {}) {\n const {\n maxRows = 15,\n maxColumns = 10,\n maxNumSize = 8,\n padMinus = 'auto',\n } = options;\n return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus) {\n const { rows, columns } = matrix;\n const maxI = Math.min(rows, maxRows);\n const maxJ = Math.min(columns, maxColumns);\n const result = [];\n\n if (padMinus === 'auto') {\n padMinus = false;\n loop: for (let i = 0; i < maxI; i++) {\n for (let j = 0; j < maxJ; j++) {\n if (matrix.get(i, j) < 0) {\n padMinus = true;\n break loop;\n }\n }\n }\n }\n\n for (let i = 0; i < maxI; i++) {\n let line = [];\n for (let j = 0; j < maxJ; j++) {\n line.push(formatNumber(matrix.get(i, j), maxNumSize, padMinus));\n }\n result.push(`${line.join(' ')}`);\n }\n if (maxJ !== columns) {\n result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n }\n if (maxI !== rows) {\n result.push(`... ${rows - maxRows} more rows`);\n }\n return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize, padMinus) {\n return (\n num >= 0 && padMinus\n ? ` ${formatNumber2(num, maxNumSize - 1)}`\n : formatNumber2(num, maxNumSize)\n ).padEnd(maxNumSize);\n}\n\nfunction formatNumber2(num, len) {\n // small.length numbers should be as is\n let str = num.toString();\n if (str.length <= len) return str;\n\n // (7)'0.00123' is better then (7)'1.23e-2'\n // (8)'0.000123' is worse then (7)'1.23e-3',\n let fix = num.toFixed(len);\n if (fix.length > len) {\n fix = num.toFixed(Math.max(0, len - (fix.length - len)));\n }\n if (\n fix.length <= len &&\n !fix.startsWith('0.000') &&\n !fix.startsWith('-0.000')\n ) {\n return fix;\n }\n\n // well, if it's still too long the user should've used longer numbers\n let exp = num.toExponential(len);\n if (exp.length > len) {\n exp = num.toExponential(Math.max(0, len - (exp.length - len)));\n }\n return exp.slice(0);\n}\n","import { isAnyArray } from 'is-any-array';\n\n/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkRowIndex(matrix, index, outer) {\n let max = outer ? matrix.rows : matrix.rows - 1;\n if (index < 0 || index > max) {\n throw new RangeError('Row index out of range');\n }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nexport function checkColumnIndex(matrix, index, outer) {\n let max = outer ? matrix.columns : matrix.columns - 1;\n if (index < 0 || index > max) {\n throw new RangeError('Column index out of range');\n }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkRowVector(matrix, vector) {\n if (vector.to1DArray) {\n vector = vector.to1DArray();\n }\n if (vector.length !== matrix.columns) {\n throw new RangeError(\n 'vector size must be the same as the number of columns',\n );\n }\n return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nexport function checkColumnVector(matrix, vector) {\n if (vector.to1DArray) {\n vector = vector.to1DArray();\n }\n if (vector.length !== matrix.rows) {\n throw new RangeError('vector size must be the same as the number of rows');\n }\n return vector;\n}\n\nexport function checkRowIndices(matrix, rowIndices) {\n if (!isAnyArray(rowIndices)) {\n throw new TypeError('row indices must be an array');\n }\n\n for (let i = 0; i < rowIndices.length; i++) {\n if (rowIndices[i] < 0 || rowIndices[i] >= matrix.rows) {\n throw new RangeError('row indices are out of range');\n }\n }\n}\n\nexport function checkColumnIndices(matrix, columnIndices) {\n if (!isAnyArray(columnIndices)) {\n throw new TypeError('column indices must be an array');\n }\n\n for (let i = 0; i < columnIndices.length; i++) {\n if (columnIndices[i] < 0 || columnIndices[i] >= matrix.columns) {\n throw new RangeError('column indices are out of range');\n }\n }\n}\n\nexport function checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n if (arguments.length !== 5) {\n throw new RangeError('expected 4 arguments');\n }\n checkNumber('startRow', startRow);\n checkNumber('endRow', endRow);\n checkNumber('startColumn', startColumn);\n checkNumber('endColumn', endColumn);\n if (\n startRow > endRow ||\n startColumn > endColumn ||\n startRow < 0 ||\n startRow >= matrix.rows ||\n endRow < 0 ||\n endRow >= matrix.rows ||\n startColumn < 0 ||\n startColumn >= matrix.columns ||\n endColumn < 0 ||\n endColumn >= matrix.columns\n ) {\n throw new RangeError('Submatrix indices are out of range');\n }\n}\n\nexport function newArray(length, value = 0) {\n let array = [];\n for (let i = 0; i < length; i++) {\n array.push(value);\n }\n return array;\n}\n\nfunction checkNumber(name, value) {\n if (typeof value !== 'number') {\n throw new TypeError(`${name} must be a number`);\n }\n}\n\nexport function checkNonEmpty(matrix) {\n if (matrix.isEmpty()) {\n throw new Error('Empty matrix has no elements to index');\n }\n}\n","import { isAnyArray } from 'is-any-array';\nimport rescale from 'ml-array-rescale';\n\nimport { inspectMatrix, inspectMatrixWithOptions } from './inspect';\nimport { installMathOperations } from './mathOperations';\nimport {\n sumByRow,\n sumByColumn,\n sumAll,\n productByRow,\n productByColumn,\n productAll,\n varianceByRow,\n varianceByColumn,\n varianceAll,\n centerByRow,\n centerByColumn,\n centerAll,\n scaleByRow,\n scaleByColumn,\n scaleAll,\n getScaleByRow,\n getScaleByColumn,\n getScaleAll,\n} from './stat';\nimport {\n checkRowVector,\n checkRowIndex,\n checkColumnIndex,\n checkColumnVector,\n checkRange,\n checkNonEmpty,\n checkRowIndices,\n checkColumnIndices,\n} from './util';\n\nexport class AbstractMatrix {\n static from1DArray(newRows, newColumns, newData) {\n let length = newRows * newColumns;\n if (length !== newData.length) {\n throw new RangeError('data length does not match given dimensions');\n }\n let newMatrix = new Matrix(newRows, newColumns);\n for (let row = 0; row < newRows; row++) {\n for (let column = 0; column < newColumns; column++) {\n newMatrix.set(row, column, newData[row * newColumns + column]);\n }\n }\n return newMatrix;\n }\n\n static rowVector(newData) {\n let vector = new Matrix(1, newData.length);\n for (let i = 0; i < newData.length; i++) {\n vector.set(0, i, newData[i]);\n }\n return vector;\n }\n\n static columnVector(newData) {\n let vector = new Matrix(newData.length, 1);\n for (let i = 0; i < newData.length; i++) {\n vector.set(i, 0, newData[i]);\n }\n return vector;\n }\n\n static zeros(rows, columns) {\n return new Matrix(rows, columns);\n }\n\n static ones(rows, columns) {\n return new Matrix(rows, columns).fill(1);\n }\n\n static rand(rows, columns, options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { random = Math.random } = options;\n let matrix = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n matrix.set(i, j, random());\n }\n }\n return matrix;\n }\n\n static randInt(rows, columns, options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1000, random = Math.random } = options;\n if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let interval = max - min;\n let matrix = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n let value = min + Math.round(random() * interval);\n matrix.set(i, j, value);\n }\n }\n return matrix;\n }\n\n static eye(rows, columns, value) {\n if (columns === undefined) columns = rows;\n if (value === undefined) value = 1;\n let min = Math.min(rows, columns);\n let matrix = this.zeros(rows, columns);\n for (let i = 0; i < min; i++) {\n matrix.set(i, i, value);\n }\n return matrix;\n }\n\n static diag(data, rows, columns) {\n let l = data.length;\n if (rows === undefined) rows = l;\n if (columns === undefined) columns = rows;\n let min = Math.min(l, rows, columns);\n let matrix = this.zeros(rows, columns);\n for (let i = 0; i < min; i++) {\n matrix.set(i, i, data[i]);\n }\n return matrix;\n }\n\n static min(matrix1, matrix2) {\n matrix1 = this.checkMatrix(matrix1);\n matrix2 = this.checkMatrix(matrix2);\n let rows = matrix1.rows;\n let columns = matrix1.columns;\n let result = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n }\n }\n return result;\n }\n\n static max(matrix1, matrix2) {\n matrix1 = this.checkMatrix(matrix1);\n matrix2 = this.checkMatrix(matrix2);\n let rows = matrix1.rows;\n let columns = matrix1.columns;\n let result = new this(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n }\n }\n return result;\n }\n\n static checkMatrix(value) {\n return AbstractMatrix.isMatrix(value) ? value : new Matrix(value);\n }\n\n static isMatrix(value) {\n return value != null && value.klass === 'Matrix';\n }\n\n get size() {\n return this.rows * this.columns;\n }\n\n apply(callback) {\n if (typeof callback !== 'function') {\n throw new TypeError('callback must be a function');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n callback.call(this, i, j);\n }\n }\n return this;\n }\n\n to1DArray() {\n let array = [];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n array.push(this.get(i, j));\n }\n }\n return array;\n }\n\n to2DArray() {\n let copy = [];\n for (let i = 0; i < this.rows; i++) {\n copy.push([]);\n for (let j = 0; j < this.columns; j++) {\n copy[i].push(this.get(i, j));\n }\n }\n return copy;\n }\n\n toJSON() {\n return this.to2DArray();\n }\n\n isRowVector() {\n return this.rows === 1;\n }\n\n isColumnVector() {\n return this.columns === 1;\n }\n\n isVector() {\n return this.rows === 1 || this.columns === 1;\n }\n\n isSquare() {\n return this.rows === this.columns;\n }\n\n isEmpty() {\n return this.rows === 0 || this.columns === 0;\n }\n\n isSymmetric() {\n if (this.isSquare()) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j <= i; j++) {\n if (this.get(i, j) !== this.get(j, i)) {\n return false;\n }\n }\n }\n return true;\n }\n return false;\n }\n\n isEchelonForm() {\n let i = 0;\n let j = 0;\n let previousColumn = -1;\n let isEchelonForm = true;\n let checked = false;\n while (i < this.rows && isEchelonForm) {\n j = 0;\n checked = false;\n while (j < this.columns && checked === false) {\n if (this.get(i, j) === 0) {\n j++;\n } else if (this.get(i, j) === 1 && j > previousColumn) {\n checked = true;\n previousColumn = j;\n } else {\n isEchelonForm = false;\n checked = true;\n }\n }\n i++;\n }\n return isEchelonForm;\n }\n\n isReducedEchelonForm() {\n let i = 0;\n let j = 0;\n let previousColumn = -1;\n let isReducedEchelonForm = true;\n let checked = false;\n while (i < this.rows && isReducedEchelonForm) {\n j = 0;\n checked = false;\n while (j < this.columns && checked === false) {\n if (this.get(i, j) === 0) {\n j++;\n } else if (this.get(i, j) === 1 && j > previousColumn) {\n checked = true;\n previousColumn = j;\n } else {\n isReducedEchelonForm = false;\n checked = true;\n }\n }\n for (let k = j + 1; k < this.rows; k++) {\n if (this.get(i, k) !== 0) {\n isReducedEchelonForm = false;\n }\n }\n i++;\n }\n return isReducedEchelonForm;\n }\n\n echelonForm() {\n let result = this.clone();\n let h = 0;\n let k = 0;\n while (h < result.rows && k < result.columns) {\n let iMax = h;\n for (let i = h; i < result.rows; i++) {\n if (result.get(i, k) > result.get(iMax, k)) {\n iMax = i;\n }\n }\n if (result.get(iMax, k) === 0) {\n k++;\n } else {\n result.swapRows(h, iMax);\n let tmp = result.get(h, k);\n for (let j = k; j < result.columns; j++) {\n result.set(h, j, result.get(h, j) / tmp);\n }\n for (let i = h + 1; i < result.rows; i++) {\n let factor = result.get(i, k) / result.get(h, k);\n result.set(i, k, 0);\n for (let j = k + 1; j < result.columns; j++) {\n result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n }\n }\n h++;\n k++;\n }\n }\n return result;\n }\n\n reducedEchelonForm() {\n let result = this.echelonForm();\n let m = result.columns;\n let n = result.rows;\n let h = n - 1;\n while (h >= 0) {\n if (result.maxRow(h) === 0) {\n h--;\n } else {\n let p = 0;\n let pivot = false;\n while (p < n && pivot === false) {\n if (result.get(h, p) === 1) {\n pivot = true;\n } else {\n p++;\n }\n }\n for (let i = 0; i < h; i++) {\n let factor = result.get(i, p);\n for (let j = p; j < m; j++) {\n let tmp = result.get(i, j) - factor * result.get(h, j);\n result.set(i, j, tmp);\n }\n }\n h--;\n }\n }\n return result;\n }\n\n set() {\n throw new Error('set method is unimplemented');\n }\n\n get() {\n throw new Error('get method is unimplemented');\n }\n\n repeat(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { rows = 1, columns = 1 } = options;\n if (!Number.isInteger(rows) || rows <= 0) {\n throw new TypeError('rows must be a positive integer');\n }\n if (!Number.isInteger(columns) || columns <= 0) {\n throw new TypeError('columns must be a positive integer');\n }\n let matrix = new Matrix(this.rows * rows, this.columns * columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n }\n }\n return matrix;\n }\n\n fill(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, value);\n }\n }\n return this;\n }\n\n neg() {\n return this.mulS(-1);\n }\n\n getRow(index) {\n checkRowIndex(this, index);\n let row = [];\n for (let i = 0; i < this.columns; i++) {\n row.push(this.get(index, i));\n }\n return row;\n }\n\n getRowVector(index) {\n return Matrix.rowVector(this.getRow(index));\n }\n\n setRow(index, array) {\n checkRowIndex(this, index);\n array = checkRowVector(this, array);\n for (let i = 0; i < this.columns; i++) {\n this.set(index, i, array[i]);\n }\n return this;\n }\n\n swapRows(row1, row2) {\n checkRowIndex(this, row1);\n checkRowIndex(this, row2);\n for (let i = 0; i < this.columns; i++) {\n let temp = this.get(row1, i);\n this.set(row1, i, this.get(row2, i));\n this.set(row2, i, temp);\n }\n return this;\n }\n\n getColumn(index) {\n checkColumnIndex(this, index);\n let column = [];\n for (let i = 0; i < this.rows; i++) {\n column.push(this.get(i, index));\n }\n return column;\n }\n\n getColumnVector(index) {\n return Matrix.columnVector(this.getColumn(index));\n }\n\n setColumn(index, array) {\n checkColumnIndex(this, index);\n array = checkColumnVector(this, array);\n for (let i = 0; i < this.rows; i++) {\n this.set(i, index, array[i]);\n }\n return this;\n }\n\n swapColumns(column1, column2) {\n checkColumnIndex(this, column1);\n checkColumnIndex(this, column2);\n for (let i = 0; i < this.rows; i++) {\n let temp = this.get(i, column1);\n this.set(i, column1, this.get(i, column2));\n this.set(i, column2, temp);\n }\n return this;\n }\n\n addRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + vector[j]);\n }\n }\n return this;\n }\n\n subRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - vector[j]);\n }\n }\n return this;\n }\n\n mulRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * vector[j]);\n }\n }\n return this;\n }\n\n divRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / vector[j]);\n }\n }\n return this;\n }\n\n addColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + vector[i]);\n }\n }\n return this;\n }\n\n subColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - vector[i]);\n }\n }\n return this;\n }\n\n mulColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * vector[i]);\n }\n }\n return this;\n }\n\n divColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / vector[i]);\n }\n }\n return this;\n }\n\n mulRow(index, value) {\n checkRowIndex(this, index);\n for (let i = 0; i < this.columns; i++) {\n this.set(index, i, this.get(index, i) * value);\n }\n return this;\n }\n\n mulColumn(index, value) {\n checkColumnIndex(this, index);\n for (let i = 0; i < this.rows; i++) {\n this.set(i, index, this.get(i, index) * value);\n }\n return this;\n }\n\n max(by) {\n if (this.isEmpty()) {\n return NaN;\n }\n switch (by) {\n case 'row': {\n const max = new Array(this.rows).fill(Number.NEGATIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max[row]) {\n max[row] = this.get(row, column);\n }\n }\n }\n return max;\n }\n case 'column': {\n const max = new Array(this.columns).fill(Number.NEGATIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max[column]) {\n max[column] = this.get(row, column);\n }\n }\n }\n return max;\n }\n case undefined: {\n let max = this.get(0, 0);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) > max) {\n max = this.get(row, column);\n }\n }\n }\n return max;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n maxIndex() {\n checkNonEmpty(this);\n let v = this.get(0, 0);\n let idx = [0, 0];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n if (this.get(i, j) > v) {\n v = this.get(i, j);\n idx[0] = i;\n idx[1] = j;\n }\n }\n }\n return idx;\n }\n\n min(by) {\n if (this.isEmpty()) {\n return NaN;\n }\n\n switch (by) {\n case 'row': {\n const min = new Array(this.rows).fill(Number.POSITIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min[row]) {\n min[row] = this.get(row, column);\n }\n }\n }\n return min;\n }\n case 'column': {\n const min = new Array(this.columns).fill(Number.POSITIVE_INFINITY);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min[column]) {\n min[column] = this.get(row, column);\n }\n }\n }\n return min;\n }\n case undefined: {\n let min = this.get(0, 0);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n if (this.get(row, column) < min) {\n min = this.get(row, column);\n }\n }\n }\n return min;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n minIndex() {\n checkNonEmpty(this);\n let v = this.get(0, 0);\n let idx = [0, 0];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n if (this.get(i, j) < v) {\n v = this.get(i, j);\n idx[0] = i;\n idx[1] = j;\n }\n }\n }\n return idx;\n }\n\n maxRow(row) {\n checkRowIndex(this, row);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(row, 0);\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) > v) {\n v = this.get(row, i);\n }\n }\n return v;\n }\n\n maxRowIndex(row) {\n checkRowIndex(this, row);\n checkNonEmpty(this);\n let v = this.get(row, 0);\n let idx = [row, 0];\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) > v) {\n v = this.get(row, i);\n idx[1] = i;\n }\n }\n return idx;\n }\n\n minRow(row) {\n checkRowIndex(this, row);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(row, 0);\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) < v) {\n v = this.get(row, i);\n }\n }\n return v;\n }\n\n minRowIndex(row) {\n checkRowIndex(this, row);\n checkNonEmpty(this);\n let v = this.get(row, 0);\n let idx = [row, 0];\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) < v) {\n v = this.get(row, i);\n idx[1] = i;\n }\n }\n return idx;\n }\n\n maxColumn(column) {\n checkColumnIndex(this, column);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(0, column);\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) > v) {\n v = this.get(i, column);\n }\n }\n return v;\n }\n\n maxColumnIndex(column) {\n checkColumnIndex(this, column);\n checkNonEmpty(this);\n let v = this.get(0, column);\n let idx = [0, column];\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) > v) {\n v = this.get(i, column);\n idx[0] = i;\n }\n }\n return idx;\n }\n\n minColumn(column) {\n checkColumnIndex(this, column);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(0, column);\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) < v) {\n v = this.get(i, column);\n }\n }\n return v;\n }\n\n minColumnIndex(column) {\n checkColumnIndex(this, column);\n checkNonEmpty(this);\n let v = this.get(0, column);\n let idx = [0, column];\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) < v) {\n v = this.get(i, column);\n idx[0] = i;\n }\n }\n return idx;\n }\n\n diag() {\n let min = Math.min(this.rows, this.columns);\n let diag = [];\n for (let i = 0; i < min; i++) {\n diag.push(this.get(i, i));\n }\n return diag;\n }\n\n norm(type = 'frobenius') {\n let result = 0;\n if (type === 'max') {\n return this.max();\n } else if (type === 'frobenius') {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n result = result + this.get(i, j) * this.get(i, j);\n }\n }\n return Math.sqrt(result);\n } else {\n throw new RangeError(`unknown norm type: ${type}`);\n }\n }\n\n cumulativeSum() {\n let sum = 0;\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n sum += this.get(i, j);\n this.set(i, j, sum);\n }\n }\n return this;\n }\n\n dot(vector2) {\n if (AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n let vector1 = this.to1DArray();\n if (vector1.length !== vector2.length) {\n throw new RangeError('vectors do not have the same size');\n }\n let dot = 0;\n for (let i = 0; i < vector1.length; i++) {\n dot += vector1[i] * vector2[i];\n }\n return dot;\n }\n\n mmul(other) {\n other = Matrix.checkMatrix(other);\n\n let m = this.rows;\n let n = this.columns;\n let p = other.columns;\n\n let result = new Matrix(m, p);\n\n let Bcolj = new Float64Array(n);\n for (let j = 0; j < p; j++) {\n for (let k = 0; k < n; k++) {\n Bcolj[k] = other.get(k, j);\n }\n\n for (let i = 0; i < m; i++) {\n let s = 0;\n for (let k = 0; k < n; k++) {\n s += this.get(i, k) * Bcolj[k];\n }\n\n result.set(i, j, s);\n }\n }\n return result;\n }\n\n strassen2x2(other) {\n other = Matrix.checkMatrix(other);\n let result = new Matrix(2, 2);\n const a11 = this.get(0, 0);\n const b11 = other.get(0, 0);\n const a12 = this.get(0, 1);\n const b12 = other.get(0, 1);\n const a21 = this.get(1, 0);\n const b21 = other.get(1, 0);\n const a22 = this.get(1, 1);\n const b22 = other.get(1, 1);\n\n // Compute intermediate values.\n const m1 = (a11 + a22) * (b11 + b22);\n const m2 = (a21 + a22) * b11;\n const m3 = a11 * (b12 - b22);\n const m4 = a22 * (b21 - b11);\n const m5 = (a11 + a12) * b22;\n const m6 = (a21 - a11) * (b11 + b12);\n const m7 = (a12 - a22) * (b21 + b22);\n\n // Combine intermediate values into the output.\n const c00 = m1 + m4 - m5 + m7;\n const c01 = m3 + m5;\n const c10 = m2 + m4;\n const c11 = m1 - m2 + m3 + m6;\n\n result.set(0, 0, c00);\n result.set(0, 1, c01);\n result.set(1, 0, c10);\n result.set(1, 1, c11);\n return result;\n }\n\n strassen3x3(other) {\n other = Matrix.checkMatrix(other);\n let result = new Matrix(3, 3);\n\n const a00 = this.get(0, 0);\n const a01 = this.get(0, 1);\n const a02 = this.get(0, 2);\n const a10 = this.get(1, 0);\n const a11 = this.get(1, 1);\n const a12 = this.get(1, 2);\n const a20 = this.get(2, 0);\n const a21 = this.get(2, 1);\n const a22 = this.get(2, 2);\n\n const b00 = other.get(0, 0);\n const b01 = other.get(0, 1);\n const b02 = other.get(0, 2);\n const b10 = other.get(1, 0);\n const b11 = other.get(1, 1);\n const b12 = other.get(1, 2);\n const b20 = other.get(2, 0);\n const b21 = other.get(2, 1);\n const b22 = other.get(2, 2);\n\n const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n const m2 = (a00 - a10) * (-b01 + b11);\n const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n const m5 = (a10 + a11) * (-b00 + b01);\n const m6 = a00 * b00;\n const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n const m8 = (-a00 + a20) * (b02 - b12);\n const m9 = (a20 + a21) * (-b00 + b02);\n const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n const m13 = (a02 - a22) * (b11 - b21);\n const m14 = a02 * b20;\n const m15 = (a21 + a22) * (-b20 + b21);\n const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n const m17 = (a02 - a12) * (b12 - b22);\n const m18 = (a11 + a12) * (-b20 + b22);\n const m19 = a01 * b10;\n const m20 = a12 * b21;\n const m21 = a10 * b02;\n const m22 = a20 * b01;\n const m23 = a22 * b22;\n\n const c00 = m6 + m14 + m19;\n const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n const c11 = m2 + m4 + m5 + m6 + m20;\n const c12 = m14 + m16 + m17 + m18 + m21;\n const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n const c21 = m12 + m13 + m14 + m15 + m22;\n const c22 = m6 + m7 + m8 + m9 + m23;\n\n result.set(0, 0, c00);\n result.set(0, 1, c01);\n result.set(0, 2, c02);\n result.set(1, 0, c10);\n result.set(1, 1, c11);\n result.set(1, 2, c12);\n result.set(2, 0, c20);\n result.set(2, 1, c21);\n result.set(2, 2, c22);\n return result;\n }\n\n mmulStrassen(y) {\n y = Matrix.checkMatrix(y);\n let x = this.clone();\n let r1 = x.rows;\n let c1 = x.columns;\n let r2 = y.rows;\n let c2 = y.columns;\n if (c1 !== r2) {\n // eslint-disable-next-line no-console\n console.warn(\n `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n );\n }\n\n // Put a matrix into the top left of a matrix of zeros.\n // `rows` and `cols` are the dimensions of the output matrix.\n function embed(mat, rows, cols) {\n let r = mat.rows;\n let c = mat.columns;\n if (r === rows && c === cols) {\n return mat;\n } else {\n let resultat = AbstractMatrix.zeros(rows, cols);\n resultat = resultat.setSubMatrix(mat, 0, 0);\n return resultat;\n }\n }\n\n // Make sure both matrices are the same size.\n // This is exclusively for simplicity:\n // this algorithm can be implemented with matrices of different sizes.\n\n let r = Math.max(r1, r2);\n let c = Math.max(c1, c2);\n x = embed(x, r, c);\n y = embed(y, r, c);\n\n // Our recursive multiplication function.\n function blockMult(a, b, rows, cols) {\n // For small matrices, resort to naive multiplication.\n if (rows <= 512 || cols <= 512) {\n return a.mmul(b); // a is equivalent to this\n }\n\n // Apply dynamic padding.\n if (rows % 2 === 1 && cols % 2 === 1) {\n a = embed(a, rows + 1, cols + 1);\n b = embed(b, rows + 1, cols + 1);\n } else if (rows % 2 === 1) {\n a = embed(a, rows + 1, cols);\n b = embed(b, rows + 1, cols);\n } else if (cols % 2 === 1) {\n a = embed(a, rows, cols + 1);\n b = embed(b, rows, cols + 1);\n }\n\n let halfRows = parseInt(a.rows / 2, 10);\n let halfCols = parseInt(a.columns / 2, 10);\n // Subdivide input matrices.\n let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n // Compute intermediate values.\n let m1 = blockMult(\n AbstractMatrix.add(a11, a22),\n AbstractMatrix.add(b11, b22),\n halfRows,\n halfCols,\n );\n let m2 = blockMult(AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n let m3 = blockMult(a11, AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n let m4 = blockMult(a22, AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n let m5 = blockMult(AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n let m6 = blockMult(\n AbstractMatrix.sub(a21, a11),\n AbstractMatrix.add(b11, b12),\n halfRows,\n halfCols,\n );\n let m7 = blockMult(\n AbstractMatrix.sub(a12, a22),\n AbstractMatrix.add(b21, b22),\n halfRows,\n halfCols,\n );\n\n // Combine intermediate values into the output.\n let c11 = AbstractMatrix.add(m1, m4);\n c11.sub(m5);\n c11.add(m7);\n let c12 = AbstractMatrix.add(m3, m5);\n let c21 = AbstractMatrix.add(m2, m4);\n let c22 = AbstractMatrix.sub(m1, m2);\n c22.add(m3);\n c22.add(m6);\n\n // Crop output to the desired size (undo dynamic padding).\n let resultat = AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n resultat = resultat.setSubMatrix(c11, 0, 0);\n resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n }\n\n return blockMult(x, y, r, c);\n }\n\n scaleRows(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1 } = options;\n if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let newMatrix = new Matrix(this.rows, this.columns);\n for (let i = 0; i < this.rows; i++) {\n const row = this.getRow(i);\n if (row.length > 0) {\n rescale(row, { min, max, output: row });\n }\n newMatrix.setRow(i, row);\n }\n return newMatrix;\n }\n\n scaleColumns(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1 } = options;\n if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let newMatrix = new Matrix(this.rows, this.columns);\n for (let i = 0; i < this.columns; i++) {\n const column = this.getColumn(i);\n if (column.length) {\n rescale(column, {\n min: min,\n max: max,\n output: column,\n });\n }\n newMatrix.setColumn(i, column);\n }\n return newMatrix;\n }\n\n flipRows() {\n const middle = Math.ceil(this.columns / 2);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < middle; j++) {\n let first = this.get(i, j);\n let last = this.get(i, this.columns - 1 - j);\n this.set(i, j, last);\n this.set(i, this.columns - 1 - j, first);\n }\n }\n return this;\n }\n\n flipColumns() {\n const middle = Math.ceil(this.rows / 2);\n for (let j = 0; j < this.columns; j++) {\n for (let i = 0; i < middle; i++) {\n let first = this.get(i, j);\n let last = this.get(this.rows - 1 - i, j);\n this.set(i, j, last);\n this.set(this.rows - 1 - i, j, first);\n }\n }\n return this;\n }\n\n kroneckerProduct(other) {\n other = Matrix.checkMatrix(other);\n\n let m = this.rows;\n let n = this.columns;\n let p = other.rows;\n let q = other.columns;\n\n let result = new Matrix(m * p, n * q);\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n for (let k = 0; k < p; k++) {\n for (let l = 0; l < q; l++) {\n result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n }\n }\n }\n }\n return result;\n }\n\n kroneckerSum(other) {\n other = Matrix.checkMatrix(other);\n if (!this.isSquare() || !other.isSquare()) {\n throw new Error('Kronecker Sum needs two Square Matrices');\n }\n let m = this.rows;\n let n = other.rows;\n let AxI = this.kroneckerProduct(Matrix.eye(n, n));\n let IxB = Matrix.eye(m, m).kroneckerProduct(other);\n return AxI.add(IxB);\n }\n\n transpose() {\n let result = new Matrix(this.columns, this.rows);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n result.set(j, i, this.get(i, j));\n }\n }\n return result;\n }\n\n sortRows(compareFunction = compareNumbers) {\n for (let i = 0; i < this.rows; i++) {\n this.setRow(i, this.getRow(i).sort(compareFunction));\n }\n return this;\n }\n\n sortColumns(compareFunction = compareNumbers) {\n for (let i = 0; i < this.columns; i++) {\n this.setColumn(i, this.getColumn(i).sort(compareFunction));\n }\n return this;\n }\n\n subMatrix(startRow, endRow, startColumn, endColumn) {\n checkRange(this, startRow, endRow, startColumn, endColumn);\n let newMatrix = new Matrix(\n endRow - startRow + 1,\n endColumn - startColumn + 1,\n );\n for (let i = startRow; i <= endRow; i++) {\n for (let j = startColumn; j <= endColumn; j++) {\n newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n }\n }\n return newMatrix;\n }\n\n subMatrixRow(indices, startColumn, endColumn) {\n if (startColumn === undefined) startColumn = 0;\n if (endColumn === undefined) endColumn = this.columns - 1;\n if (\n startColumn > endColumn ||\n startColumn < 0 ||\n startColumn >= this.columns ||\n endColumn < 0 ||\n endColumn >= this.columns\n ) {\n throw new RangeError('Argument out of range');\n }\n\n let newMatrix = new Matrix(indices.length, endColumn - startColumn + 1);\n for (let i = 0; i < indices.length; i++) {\n for (let j = startColumn; j <= endColumn; j++) {\n if (indices[i] < 0 || indices[i] >= this.rows) {\n throw new RangeError(`Row index out of range: ${indices[i]}`);\n }\n newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n }\n }\n return newMatrix;\n }\n\n subMatrixColumn(indices, startRow, endRow) {\n if (startRow === undefined) startRow = 0;\n if (endRow === undefined) endRow = this.rows - 1;\n if (\n startRow > endRow ||\n startRow < 0 ||\n startRow >= this.rows ||\n endRow < 0 ||\n endRow >= this.rows\n ) {\n throw new RangeError('Argument out of range');\n }\n\n let newMatrix = new Matrix(endRow - startRow + 1, indices.length);\n for (let i = 0; i < indices.length; i++) {\n for (let j = startRow; j <= endRow; j++) {\n if (indices[i] < 0 || indices[i] >= this.columns) {\n throw new RangeError(`Column index out of range: ${indices[i]}`);\n }\n newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n }\n }\n return newMatrix;\n }\n\n setSubMatrix(matrix, startRow, startColumn) {\n matrix = Matrix.checkMatrix(matrix);\n if (matrix.isEmpty()) {\n return this;\n }\n let endRow = startRow + matrix.rows - 1;\n let endColumn = startColumn + matrix.columns - 1;\n checkRange(this, startRow, endRow, startColumn, endColumn);\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n this.set(startRow + i, startColumn + j, matrix.get(i, j));\n }\n }\n return this;\n }\n\n selection(rowIndices, columnIndices) {\n checkRowIndices(this, rowIndices);\n checkColumnIndices(this, columnIndices);\n let newMatrix = new Matrix(rowIndices.length, columnIndices.length);\n for (let i = 0; i < rowIndices.length; i++) {\n let rowIndex = rowIndices[i];\n for (let j = 0; j < columnIndices.length; j++) {\n let columnIndex = columnIndices[j];\n newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n }\n }\n return newMatrix;\n }\n\n trace() {\n let min = Math.min(this.rows, this.columns);\n let trace = 0;\n for (let i = 0; i < min; i++) {\n trace += this.get(i, i);\n }\n return trace;\n }\n\n clone() {\n let newMatrix = new Matrix(this.rows, this.columns);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n newMatrix.set(row, column, this.get(row, column));\n }\n }\n return newMatrix;\n }\n\n sum(by) {\n switch (by) {\n case 'row':\n return sumByRow(this);\n case 'column':\n return sumByColumn(this);\n case undefined:\n return sumAll(this);\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n product(by) {\n switch (by) {\n case 'row':\n return productByRow(this);\n case 'column':\n return productByColumn(this);\n case undefined:\n return productAll(this);\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n mean(by) {\n const sum = this.sum(by);\n switch (by) {\n case 'row': {\n for (let i = 0; i < this.rows; i++) {\n sum[i] /= this.columns;\n }\n return sum;\n }\n case 'column': {\n for (let i = 0; i < this.columns; i++) {\n sum[i] /= this.rows;\n }\n return sum;\n }\n case undefined:\n return sum / this.size;\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n variance(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { unbiased = true, mean = this.mean(by) } = options;\n if (typeof unbiased !== 'boolean') {\n throw new TypeError('unbiased must be a boolean');\n }\n switch (by) {\n case 'row': {\n if (!isAnyArray(mean)) {\n throw new TypeError('mean must be an array');\n }\n return varianceByRow(this, unbiased, mean);\n }\n case 'column': {\n if (!isAnyArray(mean)) {\n throw new TypeError('mean must be an array');\n }\n return varianceByColumn(this, unbiased, mean);\n }\n case undefined: {\n if (typeof mean !== 'number') {\n throw new TypeError('mean must be a number');\n }\n return varianceAll(this, unbiased, mean);\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n standardDeviation(by, options) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n const variance = this.variance(by, options);\n if (by === undefined) {\n return Math.sqrt(variance);\n } else {\n for (let i = 0; i < variance.length; i++) {\n variance[i] = Math.sqrt(variance[i]);\n }\n return variance;\n }\n }\n\n center(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { center = this.mean(by) } = options;\n switch (by) {\n case 'row': {\n if (!isAnyArray(center)) {\n throw new TypeError('center must be an array');\n }\n centerByRow(this, center);\n return this;\n }\n case 'column': {\n if (!isAnyArray(center)) {\n throw new TypeError('center must be an array');\n }\n centerByColumn(this, center);\n return this;\n }\n case undefined: {\n if (typeof center !== 'number') {\n throw new TypeError('center must be a number');\n }\n centerAll(this, center);\n return this;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n scale(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n let scale = options.scale;\n switch (by) {\n case 'row': {\n if (scale === undefined) {\n scale = getScaleByRow(this);\n } else if (!isAnyArray(scale)) {\n throw new TypeError('scale must be an array');\n }\n scaleByRow(this, scale);\n return this;\n }\n case 'column': {\n if (scale === undefined) {\n scale = getScaleByColumn(this);\n } else if (!isAnyArray(scale)) {\n throw new TypeError('scale must be an array');\n }\n scaleByColumn(this, scale);\n return this;\n }\n case undefined: {\n if (scale === undefined) {\n scale = getScaleAll(this);\n } else if (typeof scale !== 'number') {\n throw new TypeError('scale must be a number');\n }\n scaleAll(this, scale);\n return this;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n toString(options) {\n return inspectMatrixWithOptions(this, options);\n }\n}\n\nAbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n return a - b;\n}\n\nfunction isArrayOfNumbers(array) {\n return array.every((element) => {\n return typeof element === 'number';\n });\n}\n\n// Synonyms\nAbstractMatrix.random = AbstractMatrix.rand;\nAbstractMatrix.randomInt = AbstractMatrix.randInt;\nAbstractMatrix.diagonal = AbstractMatrix.diag;\nAbstractMatrix.prototype.diagonal = AbstractMatrix.prototype.diag;\nAbstractMatrix.identity = AbstractMatrix.eye;\nAbstractMatrix.prototype.negate = AbstractMatrix.prototype.neg;\nAbstractMatrix.prototype.tensorProduct =\n AbstractMatrix.prototype.kroneckerProduct;\n\nexport default class Matrix extends AbstractMatrix {\n constructor(nRows, nColumns) {\n super();\n if (Matrix.isMatrix(nRows)) {\n // eslint-disable-next-line no-constructor-return\n return nRows.clone();\n } else if (Number.isInteger(nRows) && nRows >= 0) {\n // Create an empty matrix\n this.data = [];\n if (Number.isInteger(nColumns) && nColumns >= 0) {\n for (let i = 0; i < nRows; i++) {\n this.data.push(new Float64Array(nColumns));\n }\n } else {\n throw new TypeError('nColumns must be a positive integer');\n }\n } else if (isAnyArray(nRows)) {\n // Copy the values from the 2D array\n const arrayData = nRows;\n nRows = arrayData.length;\n nColumns = nRows ? arrayData[0].length : 0;\n if (typeof nColumns !== 'number') {\n throw new TypeError(\n 'Data must be a 2D array with at least one element',\n );\n }\n this.data = [];\n for (let i = 0; i < nRows; i++) {\n if (arrayData[i].length !== nColumns) {\n throw new RangeError('Inconsistent array dimensions');\n }\n if (!isArrayOfNumbers(arrayData[i])) {\n throw new TypeError('Input data contains non-numeric values');\n }\n this.data.push(Float64Array.from(arrayData[i]));\n }\n } else {\n throw new TypeError(\n 'First argument must be a positive number or an array',\n );\n }\n this.rows = nRows;\n this.columns = nColumns;\n }\n\n set(rowIndex, columnIndex, value) {\n this.data[rowIndex][columnIndex] = value;\n return this;\n }\n\n get(rowIndex, columnIndex) {\n return this.data[rowIndex][columnIndex];\n }\n\n removeRow(index) {\n checkRowIndex(this, index);\n this.data.splice(index, 1);\n this.rows -= 1;\n return this;\n }\n\n addRow(index, array) {\n if (array === undefined) {\n array = index;\n index = this.rows;\n }\n checkRowIndex(this, index, true);\n array = Float64Array.from(checkRowVector(this, array));\n this.data.splice(index, 0, array);\n this.rows += 1;\n return this;\n }\n\n removeColumn(index) {\n checkColumnIndex(this, index);\n for (let i = 0; i < this.rows; i++) {\n const newRow = new Float64Array(this.columns - 1);\n for (let j = 0; j < index; j++) {\n newRow[j] = this.data[i][j];\n }\n for (let j = index + 1; j < this.columns; j++) {\n newRow[j - 1] = this.data[i][j];\n }\n this.data[i] = newRow;\n }\n this.columns -= 1;\n return this;\n }\n\n addColumn(index, array) {\n if (typeof array === 'undefined') {\n array = index;\n index = this.columns;\n }\n checkColumnIndex(this, index, true);\n array = checkColumnVector(this, array);\n for (let i = 0; i < this.rows; i++) {\n const newRow = new Float64Array(this.columns + 1);\n let j = 0;\n for (; j < index; j++) {\n newRow[j] = this.data[i][j];\n }\n newRow[j++] = array[i];\n for (; j < this.columns + 1; j++) {\n newRow[j] = this.data[i][j - 1];\n }\n this.data[i] = newRow;\n }\n this.columns += 1;\n return this;\n }\n}\n\ninstallMathOperations(AbstractMatrix, Matrix);\n","import { newArray } from './util';\n\nexport function sumByRow(matrix) {\n let sum = newArray(matrix.rows);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[i] += matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function sumByColumn(matrix) {\n let sum = newArray(matrix.columns);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[j] += matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function sumAll(matrix) {\n let v = 0;\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n v += matrix.get(i, j);\n }\n }\n return v;\n}\n\nexport function productByRow(matrix) {\n let sum = newArray(matrix.rows, 1);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[i] *= matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function productByColumn(matrix) {\n let sum = newArray(matrix.columns, 1);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[j] *= matrix.get(i, j);\n }\n }\n return sum;\n}\n\nexport function productAll(matrix) {\n let v = 1;\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n v *= matrix.get(i, j);\n }\n }\n return v;\n}\n\nexport function varianceByRow(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const variance = [];\n\n for (let i = 0; i < rows; i++) {\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let j = 0; j < cols; j++) {\n x = matrix.get(i, j) - mean[i];\n sum1 += x;\n sum2 += x * x;\n }\n if (unbiased) {\n variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n } else {\n variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n }\n }\n return variance;\n}\n\nexport function varianceByColumn(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const variance = [];\n\n for (let j = 0; j < cols; j++) {\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let i = 0; i < rows; i++) {\n x = matrix.get(i, j) - mean[j];\n sum1 += x;\n sum2 += x * x;\n }\n if (unbiased) {\n variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n } else {\n variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n }\n }\n return variance;\n}\n\nexport function varianceAll(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const size = rows * cols;\n\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < cols; j++) {\n x = matrix.get(i, j) - mean;\n sum1 += x;\n sum2 += x * x;\n }\n }\n if (unbiased) {\n return (sum2 - (sum1 * sum1) / size) / (size - 1);\n } else {\n return (sum2 - (sum1 * sum1) / size) / size;\n }\n}\n\nexport function centerByRow(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean[i]);\n }\n }\n}\n\nexport function centerByColumn(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean[j]);\n }\n }\n}\n\nexport function centerAll(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean);\n }\n }\n}\n\nexport function getScaleByRow(matrix) {\n const scale = [];\n for (let i = 0; i < matrix.rows; i++) {\n let sum = 0;\n for (let j = 0; j < matrix.columns; j++) {\n sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n }\n scale.push(Math.sqrt(sum));\n }\n return scale;\n}\n\nexport function scaleByRow(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale[i]);\n }\n }\n}\n\nexport function getScaleByColumn(matrix) {\n const scale = [];\n for (let j = 0; j < matrix.columns; j++) {\n let sum = 0;\n for (let i = 0; i < matrix.rows; i++) {\n sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n }\n scale.push(Math.sqrt(sum));\n }\n return scale;\n}\n\nexport function scaleByColumn(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale[j]);\n }\n }\n}\n\nexport function getScaleAll(matrix) {\n const divider = matrix.size - 1;\n let sum = 0;\n for (let j = 0; j < matrix.columns; j++) {\n for (let i = 0; i < matrix.rows; i++) {\n sum += Math.pow(matrix.get(i, j), 2) / divider;\n }\n }\n return Math.sqrt(sum);\n}\n\nexport function scaleAll(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale);\n }\n }\n}\n","export function installMathOperations(AbstractMatrix, Matrix) {\n AbstractMatrix.prototype.add = function add(value) {\n if (typeof value === 'number') return this.addS(value);\n return this.addM(value);\n };\n\n AbstractMatrix.prototype.addS = function addS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.addM = function addM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.add = function add(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.add(value);\n };\n\n AbstractMatrix.prototype.sub = function sub(value) {\n if (typeof value === 'number') return this.subS(value);\n return this.subM(value);\n };\n\n AbstractMatrix.prototype.subS = function subS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.subM = function subM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.sub = function sub(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sub(value);\n };\n AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n AbstractMatrix.subtract = AbstractMatrix.sub;\n\n AbstractMatrix.prototype.mul = function mul(value) {\n if (typeof value === 'number') return this.mulS(value);\n return this.mulM(value);\n };\n\n AbstractMatrix.prototype.mulS = function mulS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.mulM = function mulM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.mul = function mul(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.mul(value);\n };\n AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n AbstractMatrix.multiply = AbstractMatrix.mul;\n\n AbstractMatrix.prototype.div = function div(value) {\n if (typeof value === 'number') return this.divS(value);\n return this.divM(value);\n };\n\n AbstractMatrix.prototype.divS = function divS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.divM = function divM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.div = function div(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.div(value);\n };\n AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n AbstractMatrix.divide = AbstractMatrix.div;\n\n AbstractMatrix.prototype.mod = function mod(value) {\n if (typeof value === 'number') return this.modS(value);\n return this.modM(value);\n };\n\n AbstractMatrix.prototype.modS = function modS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) % value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.modM = function modM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) % matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.mod = function mod(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.mod(value);\n };\n AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n AbstractMatrix.modulus = AbstractMatrix.mod;\n\n AbstractMatrix.prototype.and = function and(value) {\n if (typeof value === 'number') return this.andS(value);\n return this.andM(value);\n };\n\n AbstractMatrix.prototype.andS = function andS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) & value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.andM = function andM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) & matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.and = function and(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.and(value);\n };\n\n AbstractMatrix.prototype.or = function or(value) {\n if (typeof value === 'number') return this.orS(value);\n return this.orM(value);\n };\n\n AbstractMatrix.prototype.orS = function orS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) | value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.orM = function orM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) | matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.or = function or(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.or(value);\n };\n\n AbstractMatrix.prototype.xor = function xor(value) {\n if (typeof value === 'number') return this.xorS(value);\n return this.xorM(value);\n };\n\n AbstractMatrix.prototype.xorS = function xorS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) ^ value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.xorM = function xorM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.xor = function xor(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.xor(value);\n };\n\n AbstractMatrix.prototype.leftShift = function leftShift(value) {\n if (typeof value === 'number') return this.leftShiftS(value);\n return this.leftShiftM(value);\n };\n\n AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) << value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) << matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.leftShift = function leftShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.leftShift(value);\n };\n\n AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n return this.signPropagatingRightShiftM(value);\n };\n\n AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >> value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.signPropagatingRightShift(value);\n };\n\n AbstractMatrix.prototype.rightShift = function rightShift(value) {\n if (typeof value === 'number') return this.rightShiftS(value);\n return this.rightShiftM(value);\n };\n\n AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >>> value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.rightShift = function rightShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.rightShift(value);\n };\n AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n AbstractMatrix.prototype.not = function not() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, ~(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.not = function not(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.not();\n };\n\n AbstractMatrix.prototype.abs = function abs() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.abs(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.abs = function abs(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.abs();\n };\n\n AbstractMatrix.prototype.acos = function acos() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.acos(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.acos = function acos(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.acos();\n };\n\n AbstractMatrix.prototype.acosh = function acosh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.acosh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.acosh = function acosh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.acosh();\n };\n\n AbstractMatrix.prototype.asin = function asin() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.asin(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.asin = function asin(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.asin();\n };\n\n AbstractMatrix.prototype.asinh = function asinh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.asinh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.asinh = function asinh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.asinh();\n };\n\n AbstractMatrix.prototype.atan = function atan() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.atan(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.atan = function atan(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.atan();\n };\n\n AbstractMatrix.prototype.atanh = function atanh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.atanh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.atanh = function atanh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.atanh();\n };\n\n AbstractMatrix.prototype.cbrt = function cbrt() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cbrt(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cbrt = function cbrt(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cbrt();\n };\n\n AbstractMatrix.prototype.ceil = function ceil() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.ceil(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.ceil = function ceil(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.ceil();\n };\n\n AbstractMatrix.prototype.clz32 = function clz32() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.clz32(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.clz32 = function clz32(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.clz32();\n };\n\n AbstractMatrix.prototype.cos = function cos() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cos(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cos = function cos(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cos();\n };\n\n AbstractMatrix.prototype.cosh = function cosh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cosh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cosh = function cosh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cosh();\n };\n\n AbstractMatrix.prototype.exp = function exp() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.exp(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.exp = function exp(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.exp();\n };\n\n AbstractMatrix.prototype.expm1 = function expm1() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.expm1(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.expm1 = function expm1(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.expm1();\n };\n\n AbstractMatrix.prototype.floor = function floor() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.floor(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.floor = function floor(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.floor();\n };\n\n AbstractMatrix.prototype.fround = function fround() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.fround(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.fround = function fround(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.fround();\n };\n\n AbstractMatrix.prototype.log = function log() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log = function log(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log();\n };\n\n AbstractMatrix.prototype.log1p = function log1p() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log1p(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log1p = function log1p(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log1p();\n };\n\n AbstractMatrix.prototype.log10 = function log10() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log10(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log10 = function log10(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log10();\n };\n\n AbstractMatrix.prototype.log2 = function log2() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log2(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log2 = function log2(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log2();\n };\n\n AbstractMatrix.prototype.round = function round() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.round(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.round = function round(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.round();\n };\n\n AbstractMatrix.prototype.sign = function sign() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sign(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sign = function sign(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sign();\n };\n\n AbstractMatrix.prototype.sin = function sin() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sin(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sin = function sin(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sin();\n };\n\n AbstractMatrix.prototype.sinh = function sinh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sinh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sinh = function sinh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sinh();\n };\n\n AbstractMatrix.prototype.sqrt = function sqrt() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sqrt(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sqrt = function sqrt(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sqrt();\n };\n\n AbstractMatrix.prototype.tan = function tan() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.tan(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.tan = function tan(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.tan();\n };\n\n AbstractMatrix.prototype.tanh = function tanh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.tanh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.tanh = function tanh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.tanh();\n };\n\n AbstractMatrix.prototype.trunc = function trunc() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.trunc(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.trunc = function trunc(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.trunc();\n };\n\n AbstractMatrix.pow = function pow(matrix, arg0) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.pow(arg0);\n };\n\n AbstractMatrix.prototype.pow = function pow(value) {\n if (typeof value === 'number') return this.powS(value);\n return this.powM(value);\n };\n\n AbstractMatrix.prototype.powS = function powS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.pow(this.get(i, j), value));\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.powM = function powM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n }\n }\n return this;\n };\n}\n","import { AbstractMatrix } from '../matrix';\n\nexport default class WrapperMatrix2D extends AbstractMatrix {\n constructor(data) {\n super();\n this.data = data;\n this.rows = data.length;\n this.columns = data[0].length;\n }\n\n set(rowIndex, columnIndex, value) {\n this.data[rowIndex][columnIndex] = value;\n return this;\n }\n\n get(rowIndex, columnIndex) {\n return this.data[rowIndex][columnIndex];\n }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nexport default class LuDecomposition {\n constructor(matrix) {\n matrix = WrapperMatrix2D.checkMatrix(matrix);\n\n let lu = matrix.clone();\n let rows = lu.rows;\n let columns = lu.columns;\n let pivotVector = new Float64Array(rows);\n let pivotSign = 1;\n let i, j, k, p, s, t, v;\n let LUcolj, kmax;\n\n for (i = 0; i < rows; i++) {\n pivotVector[i] = i;\n }\n\n LUcolj = new Float64Array(rows);\n\n for (j = 0; j < columns; j++) {\n for (i = 0; i < rows; i++) {\n LUcolj[i] = lu.get(i, j);\n }\n\n for (i = 0; i < rows; i++) {\n kmax = Math.min(i, j);\n s = 0;\n for (k = 0; k < kmax; k++) {\n s += lu.get(i, k) * LUcolj[k];\n }\n LUcolj[i] -= s;\n lu.set(i, j, LUcolj[i]);\n }\n\n p = j;\n for (i = j + 1; i < rows; i++) {\n if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {\n p = i;\n }\n }\n\n if (p !== j) {\n for (k = 0; k < columns; k++) {\n t = lu.get(p, k);\n lu.set(p, k, lu.get(j, k));\n lu.set(j, k, t);\n }\n\n v = pivotVector[p];\n pivotVector[p] = pivotVector[j];\n pivotVector[j] = v;\n\n pivotSign = -pivotSign;\n }\n\n if (j < rows && lu.get(j, j) !== 0) {\n for (i = j + 1; i < rows; i++) {\n lu.set(i, j, lu.get(i, j) / lu.get(j, j));\n }\n }\n }\n\n this.LU = lu;\n this.pivotVector = pivotVector;\n this.pivotSign = pivotSign;\n }\n\n isSingular() {\n let data = this.LU;\n let col = data.columns;\n for (let j = 0; j < col; j++) {\n if (data.get(j, j) === 0) {\n return true;\n }\n }\n return false;\n }\n\n solve(value) {\n value = Matrix.checkMatrix(value);\n\n let lu = this.LU;\n let rows = lu.rows;\n\n if (rows !== value.rows) {\n throw new Error('Invalid matrix dimensions');\n }\n if (this.isSingular()) {\n throw new Error('LU matrix is singular');\n }\n\n let count = value.columns;\n let X = value.subMatrixRow(this.pivotVector, 0, count - 1);\n let columns = lu.columns;\n let i, j, k;\n\n for (k = 0; k < columns; k++) {\n for (i = k + 1; i < columns; i++) {\n for (j = 0; j < count; j++) {\n X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n }\n }\n }\n for (k = columns - 1; k >= 0; k--) {\n for (j = 0; j < count; j++) {\n X.set(k, j, X.get(k, j) / lu.get(k, k));\n }\n for (i = 0; i < k; i++) {\n for (j = 0; j < count; j++) {\n X.set(i, j, X.get(i, j) - X.get(k, j) * lu.get(i, k));\n }\n }\n }\n return X;\n }\n\n get determinant() {\n let data = this.LU;\n if (!data.isSquare()) {\n throw new Error('Matrix must be square');\n }\n let determinant = this.pivotSign;\n let col = data.columns;\n for (let j = 0; j < col; j++) {\n determinant *= data.get(j, j);\n }\n return determinant;\n }\n\n get lowerTriangularMatrix() {\n let data = this.LU;\n let rows = data.rows;\n let columns = data.columns;\n let X = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n if (i > j) {\n X.set(i, j, data.get(i, j));\n } else if (i === j) {\n X.set(i, j, 1);\n } else {\n X.set(i, j, 0);\n }\n }\n }\n return X;\n }\n\n get upperTriangularMatrix() {\n let data = this.LU;\n let rows = data.rows;\n let columns = data.columns;\n let X = new Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n if (i <= j) {\n X.set(i, j, data.get(i, j));\n } else {\n X.set(i, j, 0);\n }\n }\n }\n return X;\n }\n\n get pivotPermutationVector() {\n return Array.from(this.pivotVector);\n }\n}\n","export function hypotenuse(a, b) {\n let r = 0;\n if (Math.abs(a) > Math.abs(b)) {\n r = b / a;\n return Math.abs(a) * Math.sqrt(1 + r * r);\n }\n if (b !== 0) {\n r = a / b;\n return Math.abs(b) * Math.sqrt(1 + r * r);\n }\n return 0;\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class QrDecomposition {\n constructor(value) {\n value = WrapperMatrix2D.checkMatrix(value);\n\n let qr = value.clone();\n let m = value.rows;\n let n = value.columns;\n let rdiag = new Float64Array(n);\n let i, j, k, s;\n\n for (k = 0; k < n; k++) {\n let nrm = 0;\n for (i = k; i < m; i++) {\n nrm = hypotenuse(nrm, qr.get(i, k));\n }\n if (nrm !== 0) {\n if (qr.get(k, k) < 0) {\n nrm = -nrm;\n }\n for (i = k; i < m; i++) {\n qr.set(i, k, qr.get(i, k) / nrm);\n }\n qr.set(k, k, qr.get(k, k) + 1);\n for (j = k + 1; j < n; j++) {\n s = 0;\n for (i = k; i < m; i++) {\n s += qr.get(i, k) * qr.get(i, j);\n }\n s = -s / qr.get(k, k);\n for (i = k; i < m; i++) {\n qr.set(i, j, qr.get(i, j) + s * qr.get(i, k));\n }\n }\n }\n rdiag[k] = -nrm;\n }\n\n this.QR = qr;\n this.Rdiag = rdiag;\n }\n\n solve(value) {\n value = Matrix.checkMatrix(value);\n\n let qr = this.QR;\n let m = qr.rows;\n\n if (value.rows !== m) {\n throw new Error('Matrix row dimensions must agree');\n }\n if (!this.isFullRank()) {\n throw new Error('Matrix is rank deficient');\n }\n\n let count = value.columns;\n let X = value.clone();\n let n = qr.columns;\n let i, j, k, s;\n\n for (k = 0; k < n; k++) {\n for (j = 0; j < count; j++) {\n s = 0;\n for (i = k; i < m; i++) {\n s += qr.get(i, k) * X.get(i, j);\n }\n s = -s / qr.get(k, k);\n for (i = k; i < m; i++) {\n X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n }\n }\n }\n for (k = n - 1; k >= 0; k--) {\n for (j = 0; j < count; j++) {\n X.set(k, j, X.get(k, j) / this.Rdiag[k]);\n }\n for (i = 0; i < k; i++) {\n for (j = 0; j < count; j++) {\n X.set(i, j, X.get(i, j) - X.get(k, j) * qr.get(i, k));\n }\n }\n }\n\n return X.subMatrix(0, n - 1, 0, count - 1);\n }\n\n isFullRank() {\n let columns = this.QR.columns;\n for (let i = 0; i < columns; i++) {\n if (this.Rdiag[i] === 0) {\n return false;\n }\n }\n return true;\n }\n\n get upperTriangularMatrix() {\n let qr = this.QR;\n let n = qr.columns;\n let X = new Matrix(n, n);\n let i, j;\n for (i = 0; i < n; i++) {\n for (j = 0; j < n; j++) {\n if (i < j) {\n X.set(i, j, qr.get(i, j));\n } else if (i === j) {\n X.set(i, j, this.Rdiag[i]);\n } else {\n X.set(i, j, 0);\n }\n }\n }\n return X;\n }\n\n get orthogonalMatrix() {\n let qr = this.QR;\n let rows = qr.rows;\n let columns = qr.columns;\n let X = new Matrix(rows, columns);\n let i, j, k, s;\n\n for (k = columns - 1; k >= 0; k--) {\n for (i = 0; i < rows; i++) {\n X.set(i, k, 0);\n }\n X.set(k, k, 1);\n for (j = k; j < columns; j++) {\n if (qr.get(k, k) !== 0) {\n s = 0;\n for (i = k; i < rows; i++) {\n s += qr.get(i, k) * X.get(i, j);\n }\n\n s = -s / qr.get(k, k);\n\n for (i = k; i < rows; i++) {\n X.set(i, j, X.get(i, j) + s * qr.get(i, k));\n }\n }\n }\n }\n return X;\n }\n}\n","import Matrix from '../matrix';\nimport WrapperMatrix2D from '../wrap/WrapperMatrix2D';\n\nimport { hypotenuse } from './util';\n\nexport default class SingularValueDecomposition {\n constructor(value, options = {}) {\n value = WrapperMatrix2D.checkMatrix(value);\n\n if (value.isEmpty()) {\n throw new Error('Matrix must be non-empty');\n }\n\n let m = value.rows;\n let n = value.columns;\n\n const {\n computeLeftSingularVectors = true,\n computeRightSingularVectors = true,\n autoTranspose = false,\n } = options;\n\n let wantu = Boolean(computeLeftSingularVectors);\n let wantv = Boolean(computeRightSingularVectors);\n\n let swapped = false;\n let a;\n if (m < n) {\n if (!autoTranspose) {\n a = value.clone();\n // eslint-disable-next-line no-console\n console.warn(\n 'Computing SVD on a matrix with more columns than rows. Consider enabling autoTranspose',\n );\n } else {\n a = value.transpose();\n m = a.rows;\n n = a.columns;\n swapped = true;\n let aux = wantu;\n wantu = wantv;\n wantv = aux;\n }\n } else {\n a = value.clone();\n }\n\n let nu = Math.min(m, n);\n let ni = Math.min(m + 1, n);\n let s = new Float64Array(ni);\n let U = new Matrix(m, nu);\n let V = new Matrix(n, n);\n\n let e = new Float64Array(n);\n let work = new Float64Array(m);\n\n let si = new Float64Array(ni);\n for (let i = 0; i < ni; i++) si[i] = i;\n\n let nct = Math.min(m - 1, n);\n let nrt = Math.max(0, Math.min(n - 2, m));\n let mrc = Math.max(nct, nrt);\n\n for (let k = 0; k < mrc; k++) {\n if (k < nct) {\n s[k] = 0;\n for (let i = k; i < m; i++) {\n s[k] = hypotenuse(s[k], a.get(i, k));\n }\n if (s[k] !== 0) {\n if (a.get(k, k) < 0) {\n s[k] = -s[k];\n }\n for (let i = k; i < m; i++) {\n a.set(i, k, a.get(i, k) / s[k]);\n }\n a.set(k, k, a.get(k, k) + 1);\n }\n s[k] = -s[k];\n }\n\n for (let j = k + 1; j < n; j++) {\n if (k < nct && s[k] !== 0) {\n let t = 0;\n for (let i = k; i < m; i++) {\n t += a.get(i, k) * a.get(i, j);\n }\n t = -t / a.get(k, k);\n for (let i = k; i < m; i++) {\n a.set(i, j, a.get(i, j) + t * a.get(i, k));\n }\n }\n e[j] = a.get(k, j);\n }\n\n if (wantu && k < nct) {\n for (let i = k; i < m; i++) {\n U.set(i, k, a.get(i, k));\n }\n }\n\n if (k < nrt) {\n e[k] = 0;\n for (let i = k + 1; i < n; i++) {\n e[k] = hypotenuse(e[k], e[i]);\n }\n if (e[k] !== 0) {\n if (e[k + 1] < 0) {\n e[k] = 0 - e[k];\n }\n for (let i = k + 1; i < n; i++) {\n e[i] /= e[k];\n }\n e[k + 1] += 1;\n }\n e[k] = -e[k];\n if (k + 1 < m && e[k] !== 0) {\n for (let i = k + 1; i < m; i++) {\n work[i] = 0;\n }\n for (let i = k + 1; i < m; i++) {\n for (let j = k + 1; j < n; j++) {\n work[i] += e[j] * a.get(i, j);\n }\n }\n for (let j = k + 1; j < n; j++) {\n let t = -e[j] / e[k + 1];\n for (let i = k + 1; i < m; i++) {\n a.set(i, j, a.get(i, j) + t * work[i]);\n }\n }\n }\n if (wantv) {\n for (let i = k + 1; i < n; i++) {\n V.set(i, k, e[i]);\n }\n }\n }\n }\n\n let p = Math.min(n, m + 1);\n if (nct < n) {\n s[nct] = a.get(nct, nct);\n }\n if (m < p) {\n s[p - 1] = 0;\n }\n if (nrt + 1 < p) {\n e[nrt] = a.get(nrt, p - 1);\n }\n e[p - 1] = 0;\n\n if (wantu) {\n for (let j = nct; j < nu; j++) {\n for (let i = 0; i < m; i++) {\n U.set(i, j, 0);\n }\n U.set(j, j, 1);\n }\n for (let k = nct - 1; k >= 0; k--) {\n if (s[k] !== 0) {\n for (let j = k + 1; j < nu; j++) {\n let t = 0;\n for (let i = k; i < m; i++) {\n t += U.get(i, k) * U.get(i, j);\n }\n t = -t / U.get(k, k);\n for (let i = k; i < m; i++) {\n U.set(i, j, U.get(i, j) + t * U.get(i, k));\n }\n }\n for (let i = k; i < m; i++) {\n U.set(i, k, -U.get(i, k));\n }\n U.set(k, k, 1 + U.get(k, k));\n for (let i = 0; i < k - 1; i++) {\n U.set(i, k, 0);\n }\n } else {\n for (let i = 0; i < m; i++) {\n U.set(i, k, 0);\n }\n U.set(k, k, 1);\n }\n }\n }\n\n if (wantv) {\n for (let k = n - 1; k >= 0; k--) {\n if (k < nrt && e[k] !== 0) {\n for (let j = k + 1; j < n; j++) {\n let t = 0;\n for (let i = k + 1; i < n; i++) {\n t += V.get(i, k) * V.get(i, j);\n }\n t = -t / V.get(k + 1, k);\n for (let i = k + 1; i < n; i++) {\n V.set(i, j, V.get(i, j) + t * V.get(i, k));\n }\n }\n }\n for (let i = 0; i < n; i++) {\n V.set(i, k, 0);\n }\n V.set(k, k, 1);\n }\n }\n\n let pp = p - 1;\n let iter = 0;\n let eps = Number.EPSILON;\n while (p > 0) {\n let k, kase;\n for (k = p - 2; k >= -1; k--) {\n if (k === -1) {\n break;\n }\n const alpha =\n Number.MIN_VALUE + eps * Math.abs(s[k] + Math.abs(s[k + 1]));\n if (Math.abs(e[k]) <= alpha || Number.isNaN(e[k])) {\n e[k] = 0;\n break;\n }\n }\n if (k === p - 2) {\n kase = 4;\n } else {\n let ks;\n for (ks = p - 1; ks >= k; ks--) {\n if (ks === k) {\n break;\n }\n let t =\n (ks !== p ? Math.abs(e[ks]) : 0) +\n (ks !== k + 1 ? Math.abs(e[ks - 1]) : 0);\n if (Math.abs(s[ks]) <= eps * t) {\n s[ks] = 0;\n break;\n }\n }\n if (ks === k) {\n kase = 3;\n } else if (ks === p - 1) {\n kase = 1;\n } else {\n kase = 2;\n k = ks;\n }\n }\n\n k++;\n\n switch (kase) {\n case 1: {\n let f = e[p - 2];\n e[p - 2] = 0;\n for (let j = p - 2; j >= k; j--) {\n let t = hypotenuse(s[j], f);\n let cs = s[j] / t;\n let sn = f / t;\n s[j] = t;\n if (j !== k) {\n f = -sn * e[j - 1];\n e[j - 1] = cs * e[j - 1];\n }\n if (wantv) {\n for (let i = 0; i < n; i++) {\n t = cs * V.get(i, j) + sn * V.get(i, p - 1);\n V.set(i, p - 1, -sn * V.get(i, j) + cs * V.get(i, p - 1));\n V.set(i, j, t);\n }\n }\n }\n break;\n }\n case 2: {\n let f = e[k - 1];\n e[k - 1] = 0;\n for (let j = k; j < p; j++) {\n let t = hypotenuse(s[j], f);\n let cs = s[j] / t;\n let sn = f / t;\n s[j] = t;\n f = -sn * e[j];\n e[j] = cs * e[j];\n if (wantu) {\n for (let i = 0; i < m; i++) {\n t = cs * U.get(i, j) + sn * U.get(i, k - 1);\n U.set(i, k - 1, -sn * U.get(i, j) + cs * U.get(i, k - 1));\n U.set(i, j, t);\n }\n }\n }\n break;\n }\n case 3: {\n const scale = Math.max(\n Math.abs(s[p - 1]),\n Math.abs(s[p - 2]),\n Math.abs(e[p - 2]),\n Math.abs(s[k]),\n Math.abs(e[k]),\n );\n const sp = s[p - 1] / scale;\n const spm1 = s[p - 2] / scale;\n const epm1 = e[p - 2] / scale;\n const sk = s[k] / scale;\n const ek = e[k] / scale;\n const b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2;\n const c = sp * epm1 * (sp * epm1);\n let shift = 0;\n if (b !== 0 || c !== 0) {\n if (b < 0) {\n shift = 0 - Math.sqrt(b * b + c);\n } else {\n shift = Math.sqrt(b * b + c);\n }\n shift = c / (b + shift);\n }\n let f = (sk + sp) * (sk - sp) + shift;\n let g = sk * ek;\n for (let j = k; j < p - 1; j++) {\n let t = hypotenuse(f, g);\n if (t === 0) t = Number.MIN_VALUE;\n let cs = f / t;\n let sn = g / t;\n if (j !== k) {\n e[j - 1] = t;\n }\n f = cs * s[j] + sn * e[j];\n e[j] = cs * e[j] - sn * s[j];\n g = sn * s[j + 1];\n s[j + 1] = cs * s[j + 1];\n if (wantv) {\n for (let i = 0; i < n; i++) {\n t = cs * V.get(i, j) + sn * V.get(i, j + 1);\n V.set(i, j + 1, -sn * V.get(i, j) + cs * V.get(i, j + 1));\n V.set(i, j, t);\n }\n }\n t = hypotenuse(f, g);\n if (t === 0) t = Number.MIN_VALUE;\n cs = f / t;\n sn = g / t;\n s[j] = t;\n f = cs * e[j] + sn * s[j + 1];\n s[j + 1] = -sn * e[j] + cs * s[j + 1];\n g = sn * e[j + 1];\n e[j + 1] = cs * e[j + 1];\n if (wantu && j < m - 1) {\n for (let i = 0; i < m; i++) {\n t = cs * U.get(i, j) + sn * U.get(i, j + 1);\n U.set(i, j + 1, -sn * U.get(i, j) + cs * U.get(i, j + 1));\n U.set(i, j, t);\n }\n }\n }\n e[p - 2] = f;\n iter = iter + 1;\n break;\n }\n case 4: {\n if (s[k] <= 0) {\n s[k] = s[k] < 0 ? -s[k] : 0;\n if (wantv) {\n for (let i = 0; i <= pp; i++) {\n V.set(i, k, -V.get(i, k));\n }\n }\n }\n while (k < pp) {\n if (s[k] >= s[k + 1]) {\n break;\n }\n let t = s[k];\n s[k] = s[k + 1];\n s[k + 1] = t;\n if (wantv && k < n - 1) {\n for (let i = 0; i < n; i++) {\n t = V.get(i, k + 1);\n V.set(i, k + 1, V.get(i, k));\n V.set(i, k, t);\n }\n }\n if (wantu && k < m - 1) {\n for (let i = 0; i < m; i++) {\n t = U.get(i, k + 1);\n U.set(i, k + 1, U.get(i, k));\n U.set(i, k, t);\n }\n }\n k++;\n }\n iter = 0;\n p--;\n break;\n }\n // no default\n }\n }\n\n if (swapped) {\n let tmp = V;\n V = U;\n U = tmp;\n }\n\n this.m = m;\n this.n = n;\n this.s = s;\n this.U = U;\n this.V = V;\n }\n\n solve(value) {\n let Y = value;\n let e = this.threshold;\n let scols = this.s.length;\n let Ls = Matrix.zeros(scols, scols);\n\n for (let i = 0; i < scols; i++) {\n if (Math.abs(this.s[i]) <= e) {\n Ls.set(i, i, 0);\n } else {\n Ls.set(i, i, 1 / this.s[i]);\n }\n }\n\n let U = this.U;\n let V = this.rightSingularVectors;\n\n let VL = V.mmul(Ls);\n let vrows = V.rows;\n let urows = U.rows;\n let VLU = Matrix.zeros(vrows, urows);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < urows; j++) {\n let sum = 0;\n for (let k = 0; k < scols; k++) {\n sum += VL.get(i, k) * U.get(j, k);\n }\n VLU.set(i, j, sum);\n }\n }\n\n return VLU.mmul(Y);\n }\n\n solveForDiagonal(value) {\n return this.solve(Matrix.diag(value));\n }\n\n inverse() {\n let V = this.V;\n let e = this.threshold;\n let vrows = V.rows;\n let vcols = V.columns;\n let X = new Matrix(vrows, this.s.length);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < vcols; j++) {\n if (Math.abs(this.s[j]) > e) {\n X.set(i, j, V.get(i, j) / this.s[j]);\n }\n }\n }\n\n let U = this.U;\n\n let urows = U.rows;\n let ucols = U.columns;\n let Y = new Matrix(vrows, urows);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < urows; j++) {\n let sum = 0;\n for (let k = 0; k < ucols; k++) {\n sum += X.get(i, k) * U.get(j, k);\n }\n Y.set(i, j, sum);\n }\n }\n\n return Y;\n }\n\n get condition() {\n return this.s[0] / this.s[Math.min(this.m, this.n) - 1];\n }\n\n get norm2() {\n return this.s[0];\n }\n\n get rank() {\n let tol = Math.max(this.m, this.n) * this.s[0] * Number.EPSILON;\n let r = 0;\n let s = this.s;\n for (let i = 0, ii = s.length; i < ii; i++) {\n if (s[i] > tol) {\n r++;\n }\n }\n return r;\n }\n\n get diagonal() {\n return Array.from(this.s);\n }\n\n get threshold() {\n return (Number.EPSILON / 2) * Math.max(this.m, this.n) * this.s[0];\n }\n\n get leftSingularVectors() {\n return this.U;\n }\n\n get rightSingularVectors() {\n return this.V;\n }\n\n get diagonalMatrix() {\n return Matrix.diag(this.s);\n }\n}\n","import { inverse, Matrix } from 'ml-matrix';\n\n/**\n * Difference of the matrix function over the parameters\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} evaluatedData - Array of previous evaluated function values\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number} gradientDifference - Adjustment for decrease the damping parameter\n * @param {function} paramFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Matrix}\n */\nfunction gradientFunction(\n data,\n evaluatedData,\n params,\n gradientDifference,\n paramFunction,\n) {\n const n = params.length;\n const m = data.x.length;\n\n let ans = new Array(n);\n\n for (let param = 0; param < n; param++) {\n ans[param] = new Array(m);\n let auxParams = params.slice();\n auxParams[param] += gradientDifference;\n let funcParam = paramFunction(auxParams);\n\n for (let point = 0; point < m; point++) {\n ans[param][point] = evaluatedData[point] - funcParam(data.x[point]);\n }\n }\n return new Matrix(ans);\n}\n\n/**\n * Matrix function over the samples\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} evaluatedData - Array of previous evaluated function values\n * @return {Matrix}\n */\nfunction matrixFunction(data, evaluatedData) {\n const m = data.x.length;\n\n let ans = new Array(m);\n\n for (let point = 0; point < m; point++) {\n ans[point] = [data.y[point] - evaluatedData[point]];\n }\n\n return new Matrix(ans);\n}\n\n/**\n * Iteration for Levenberg-Marquardt\n * @ignore\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {Array<number>} params - Array of previous parameter values\n * @param {number} damping - Levenberg-Marquardt parameter\n * @param {number} gradientDifference - Adjustment for decrease the damping parameter\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @return {Array<number>}\n */\nexport default function step(\n data,\n params,\n damping,\n gradientDifference,\n parameterizedFunction,\n) {\n let value = damping * gradientDifference * gradientDifference;\n let identity = Matrix.eye(params.length, params.length, value);\n\n const func = parameterizedFunction(params);\n\n let evaluatedData = new Float64Array(data.x.length);\n for (let i = 0; i < data.x.length; i++) {\n evaluatedData[i] = func(data.x[i]);\n }\n\n let gradientFunc = gradientFunction(\n data,\n evaluatedData,\n params,\n gradientDifference,\n parameterizedFunction,\n );\n let matrixFunc = matrixFunction(data, evaluatedData);\n let inverseMatrix = inverse(\n identity.add(gradientFunc.mmul(gradientFunc.transpose())),\n );\n\n params = new Matrix([params]);\n params = params.sub(\n inverseMatrix\n .mmul(gradientFunc)\n .mmul(matrixFunc)\n .mul(gradientDifference)\n .transpose(),\n );\n\n return params.to1DArray();\n}\n","import LuDecomposition from './dc/lu';\nimport QrDecomposition from './dc/qr';\nimport SingularValueDecomposition from './dc/svd';\nimport Matrix from './matrix';\nimport WrapperMatrix2D from './wrap/WrapperMatrix2D';\n\nexport function inverse(matrix, useSVD = false) {\n matrix = WrapperMatrix2D.checkMatrix(matrix);\n if (useSVD) {\n return new SingularValueDecomposition(matrix).inverse();\n } else {\n return solve(matrix, Matrix.eye(matrix.rows));\n }\n}\n\nexport function solve(leftHandSide, rightHandSide, useSVD = false) {\n leftHandSide = WrapperMatrix2D.checkMatrix(leftHandSide);\n rightHandSide = WrapperMatrix2D.checkMatrix(rightHandSide);\n if (useSVD) {\n return new SingularValueDecomposition(leftHandSide).solve(rightHandSide);\n } else {\n return leftHandSide.isSquare()\n ? new LuDecomposition(leftHandSide).solve(rightHandSide)\n : new QrDecomposition(leftHandSide).solve(rightHandSide);\n }\n}\n","/* eslint-disable max-len */\n/**\n * @license\n *\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ==============================================================================\n */\n/**\n * This is a JavaScript reimplementation of UMAP (original license below), from\n * the python implementation found at https://github.com/lmcinnes/umap.\n *\n * @author andycoenen@google.com (Andy Coenen)\n */\n/**\n * @license\n * BSD 3-Clause License\n *\n * Copyright (c) 2017, Leland McInnes\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * * Neither the name of the copyright holder nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport * as heap from './heap';\nimport * as matrix from './matrix';\nimport * as nnDescent from './nn_descent';\nimport * as tree from './tree';\nimport * as utils from './utils';\nimport LM from 'ml-levenberg-marquardt';\nconst SMOOTH_K_TOLERANCE = 1e-5;\nconst MIN_K_DIST_SCALE = 1e-3;\n/**\n * UMAP projection system, based on the python implementation from McInnes, L,\n * Healy, J, UMAP: Uniform Manifold Approximation and Projection for Dimension\n * Reduction (https://github.com/lmcinnes/umap).\n *\n * This implementation differs in a few regards:\n * a) The initialization of the embedding for optimization is not computed using\n * a spectral method, rather it is initialized randomly. This avoids some\n * computationally intensive matrix eigen computations that aren't easily\n * ported to JavaScript.\n * b) A lot of \"extra\" functionality has been omitted from this implementation,\n * most notably a great deal of alternate distance functions.\n *\n * This implementation provides three methods of reducing dimensionality:\n * 1) fit: fit the data synchronously\n * 2) fitAsync: fit the data asynchronously, with a callback function provided\n * that is invoked on each optimization step.\n * 3) initializeFit / step: manually initialize the algorithm then explictly\n * step through each epoch of the SGD optimization\n */\nexport class UMAP {\n learningRate = 1.0;\n localConnectivity = 1.0;\n minDist = 0.1;\n nComponents = 2;\n nEpochs = 0;\n nNeighbors = 15;\n negativeSampleRate = 5;\n random = Math.random;\n repulsionStrength = 1.0;\n setOpMixRatio = 1.0;\n spread = 1.0;\n transformQueueSize = 4.0;\n // Supervised projection params\n targetMetric = \"categorical\" /* TargetMetric.categorical */;\n targetWeight = 0.5;\n targetNNeighbors = 15;\n distanceFn = numeric;\n // KNN state (can be precomputed and supplied via initializeFit)\n knnIndices;\n knnDistances;\n // Internal graph connectivity representation\n graph;\n X;\n isInitialized = false;\n rpForest = [];\n initFromRandom;\n initFromTree;\n search;\n searchGraph;\n // Supervised projection labels / targets\n Y;\n // Projected embedding\n embedding = [];\n optimizationState = new OptimizationState();\n get neighbors() {\n return this.nNeighbors;\n }\n constructor(params = {}) {\n const setParam = (key) => {\n //@ts-ignore\n if (params[key] !== undefined)\n this[key] = params[key];\n };\n setParam('distanceFn');\n setParam('learningRate');\n setParam('localConnectivity');\n setParam('minDist');\n setParam('nComponents');\n setParam('nEpochs');\n setParam('nNeighbors');\n setParam('negativeSampleRate');\n setParam('random');\n setParam('repulsionStrength');\n setParam('setOpMixRatio');\n setParam('spread');\n setParam('transformQueueSize');\n this.targetNNeighbors = params.nNeighbors || this.nNeighbors || this.targetNNeighbors;\n }\n /**\n * Fit the data to a projected embedding space synchronously.\n */\n fit(X) {\n this.initializeFit(X);\n this.optimizeLayout();\n return this.embedding;\n }\n /**\n * Fit the data to a projected embedding space asynchronously, with a callback\n * function invoked on every epoch of optimization.\n */\n async fitAsync(X, callback = () => true) {\n this.initializeFit(X);\n await this.optimizeLayoutAsync(callback);\n return this.embedding;\n }\n /**\n * Initializes parameters needed for supervised projection.\n */\n setSupervisedProjection(Y, params = {}) {\n this.Y = Y;\n this.targetMetric = params.targetMetric || this.targetMetric;\n this.targetWeight = params.targetWeight || this.targetWeight;\n this.targetNNeighbors = params.targetNNeighbors || this.targetNNeighbors;\n }\n /**\n * Initializes umap with precomputed KNN indices and distances.\n */\n setPrecomputedKNN(knnIndices, knnDistances) {\n this.knnIndices = knnIndices;\n this.knnDistances = knnDistances;\n }\n /**\n * Initializes fit by computing KNN and a fuzzy simplicial set, as well as\n * initializing the projected embeddings. Sets the optimization state ahead\n * of optimization steps. Returns the number of epochs to be used for the\n * SGD optimization.\n */\n initializeFit(X) {\n if (X.length <= this.nNeighbors)\n throw new Error(`Not enough data points (${X.length}) to create nNeighbors: ${this.nNeighbors}. Add more data points or adjust the configuration.`);\n // We don't need to reinitialize if we've already initialized for this data.\n if (this.X === X && this.isInitialized)\n return this.getNEpochs();\n this.X = X;\n if (!this.knnIndices && !this.knnDistances) {\n const knnResults = this.nearestNeighbors(X);\n this.knnIndices = knnResults.knnIndices;\n this.knnDistances = knnResults.knnDistances;\n }\n this.graph = this.fuzzySimplicialSet(X, this.nNeighbors, this.setOpMixRatio);\n // Set up the search graph for subsequent transformation.\n this.makeSearchFns();\n this.searchGraph = this.makeSearchGraph(X);\n // Check if supervised projection, then adjust the graph.\n this.processGraphForSupervisedProjection();\n const { head, tail, epochsPerSample, } = this.initializeSimplicialSetEmbedding();\n // Set the optimization routine state\n this.optimizationState.head = head;\n this.optimizationState.tail = tail;\n this.optimizationState.epochsPerSample = epochsPerSample;\n // Now, initialize the optimization steps\n this.initializeOptimization();\n this.prepareForOptimizationLoop();\n this.isInitialized = true;\n return this.getNEpochs();\n }\n makeSearchFns() {\n const { initFromTree, initFromRandom } = nnDescent.makeInitializations(this.distanceFn);\n this.initFromTree = initFromTree;\n this.initFromRandom = initFromRandom;\n this.search = nnDescent.makeInitializedNNSearch(this.distanceFn);\n }\n makeSearchGraph(X) {\n const knnIndices = this.knnIndices;\n const knnDistances = this.knnDistances;\n const dims = [X.length, X.length];\n const searchGraph = new matrix.SparseMatrix([], [], [], dims);\n for (let i = 0; i < knnIndices.length; i++) {\n const knn = knnIndices[i];\n const distances = knnDistances[i];\n for (let j = 0; j < knn.length; j++) {\n const neighbor = knn[j];\n const distance = distances[j];\n if (distance > 0)\n searchGraph.set(i, neighbor, distance);\n }\n }\n const transpose = matrix.transpose(searchGraph);\n return matrix.maximum(searchGraph, transpose);\n }\n /**\n * Transforms data to the existing embedding space.\n */\n transform(toTransform) {\n // Use the previous rawData\n const rawData = this.X;\n if (rawData === undefined || rawData.length === 0)\n throw new Error('No data has been fit.');\n let nNeighbors = Math.floor(this.nNeighbors * this.transformQueueSize);\n nNeighbors = Math.min(rawData.length, nNeighbors);\n const init = nnDescent.initializeSearch(this.rpForest, rawData, toTransform, nNeighbors, this.initFromRandom, this.initFromTree, this.random);\n const result = this.search(rawData, this.searchGraph, init, toTransform);\n let { indices, weights: distances } = heap.deheapSort(result);\n indices = indices.map((x) => x.slice(0, this.nNeighbors));\n distances = distances.map((x) => x.slice(0, this.nNeighbors));\n const adjustedLocalConnectivity = Math.max(0, this.localConnectivity - 1);\n const { sigmas, rhos } = this.smoothKNNDistance(distances, this.nNeighbors, adjustedLocalConnectivity);\n const { rows, cols, vals } = this.computeMembershipStrengths(indices, distances, sigmas, rhos);\n const size = [toTransform.length, rawData.length];\n let graph = new matrix.SparseMatrix(rows, cols, vals, size);\n // This was a very specially constructed graph with constant degree.\n // That lets us do fancy unpacking by reshaping the csr matrix indices\n // and data. Doing so relies on the constant degree assumption!\n const normed = matrix.normalize(graph, \"l1\" /* matrix.NormType.l1 */);\n const csrMatrix = matrix.getCSR(normed);\n const nPoints = toTransform.length;\n const eIndices = utils.reshape2d(csrMatrix.indices, nPoints, this.nNeighbors);\n const eWeights = utils.reshape2d(csrMatrix.values, nPoints, this.nNeighbors);\n const embedding = initTransform(eIndices, eWeights, this.embedding);\n const nEpochs = this.nEpochs ?\n this.nEpochs / 3 :\n graph.nRows <= 10000 ?\n 100 :\n 30;\n const graphMax = graph\n .getValues()\n .reduce((max, val) => (val > max ? val : max), 0);\n graph = graph.map((value) => (value < graphMax / nEpochs ? 0 : value));\n graph = matrix.eliminateZeros(graph);\n const epochsPerSample = this.makeEpochsPerSample(graph.getValues(), nEpochs);\n const head = graph.getRows();\n const tail = graph.getCols();\n // Initialize optimization slightly differently than the fit method.\n this.assignOptimizationStateParameters({\n headEmbedding: embedding,\n tailEmbedding: this.embedding,\n head,\n tail,\n currentEpoch: 0,\n nEpochs,\n nVertices: graph.getDims()[1],\n epochsPerSample,\n });\n this.prepareForOptimizationLoop();\n return this.optimizeLayout();\n }\n /**\n * Checks if we're using supervised projection, then process the graph\n * accordingly.\n */\n processGraphForSupervisedProjection() {\n const { Y, X } = this;\n if (Y) {\n if (Y.length !== X.length)\n throw new Error('Length of X and y must be equal');\n if (this.targetMetric === \"categorical\" /* TargetMetric.categorical */) {\n const lt = this.targetWeight < 1.0;\n const farDist = lt ? 2.5 * (1.0 / (1.0 - this.targetWeight)) : 1.0e12;\n this.graph = this.categoricalSimplicialSetIntersection(this.graph, Y, farDist);\n }\n // TODO (andycoenen@): add non-categorical supervised embeddings.\n }\n }\n /**\n * Manually step through the optimization process one epoch at a time.\n */\n step() {\n const { currentEpoch } = this.optimizationState;\n if (currentEpoch < this.getNEpochs())\n this.optimizeLayoutStep(currentEpoch);\n return this.optimizationState.currentEpoch;\n }\n /**\n * Returns the computed projected embedding.\n */\n getEmbedding() {\n return this.embedding;\n }\n /**\n * Compute the ``nNeighbors`` nearest points for each data point in ``X``\n * This may be exact, but more likely is approximated via nearest neighbor\n * descent.\n */\n nearestNeighbors(X) {\n const { distanceFn, nNeighbors } = this;\n const log2 = (n) => Math.log(n) / Math.log(2);\n const metricNNDescent = nnDescent.makeNNDescent(distanceFn, this.random);\n // Handle python3 rounding down from 0.5 discrpancy\n const round = (n) => {\n return n === 0.5 ? 0 : Math.round(n);\n };\n const nTrees = 5 + Math.floor(round(X.length ** 0.5 / 20.0));\n const nIters = Math.max(5, Math.floor(Math.round(log2(X.length))));\n this.rpForest = tree.makeForest(X, nNeighbors, nTrees, this.random);\n const leafArray = tree.makeLeafArray(this.rpForest);\n const { indices, weights } = metricNNDescent(X, leafArray, nNeighbors, nIters);\n return { knnIndices: indices, knnDistances: weights };\n }\n /**\n * Given a set of data X, a neighborhood size, and a measure of distance\n * compute the fuzzy simplicial set (here represented as a fuzzy graph in\n * the form of a sparse matrix) associated to the data. This is done by\n * locally approximating geodesic distance at each point, creating a fuzzy\n * simplicial set for each such point, and then combining all the local\n * fuzzy simplicial sets into a global one via a fuzzy union.\n */\n fuzzySimplicialSet(X, nNeighbors, setOpMixRatio = 1.0) {\n const { knnIndices = [], knnDistances = [], localConnectivity } = this;\n const { sigmas, rhos } = this.smoothKNNDistance(knnDistances, nNeighbors, localConnectivity);\n const { rows, cols, vals } = this.computeMembershipStrengths(knnIndices, knnDistances, sigmas, rhos);\n const size = [X.length, X.length];\n const sparseMatrix = new matrix.SparseMatrix(rows, cols, vals, size);\n const transpose = matrix.transpose(sparseMatrix);\n const prodMatrix = matrix.pairwiseMultiply(sparseMatrix, transpose);\n const a = matrix.subtract(matrix.add(sparseMatrix, transpose), prodMatrix);\n const b = matrix.multiplyScalar(a, setOpMixRatio);\n const c = matrix.multiplyScalar(prodMatrix, 1.0 - setOpMixRatio);\n const result = matrix.add(b, c);\n return result;\n }\n /**\n * Combine a fuzzy simplicial set with another fuzzy simplicial set\n * generated from categorical data using categorical distances. The target\n * data is assumed to be categorical label data (a vector of labels),\n * and this will update the fuzzy simplicial set to respect that label data.\n */\n categoricalSimplicialSetIntersection(simplicialSet, target, farDist, unknownDist = 1.0) {\n let intersection = fastIntersection(simplicialSet, target, unknownDist, farDist);\n intersection = matrix.eliminateZeros(intersection);\n return resetLocalConnectivity(intersection);\n }\n /**\n * Compute a continuous version of the distance to the kth nearest\n * neighbor. That is, this is similar to knn-distance but allows continuous\n * k values rather than requiring an integral k. In esscence we are simply\n * computing the distance such that the cardinality of fuzzy set we generate\n * is k.\n */\n smoothKNNDistance(distances, k, localConnectivity = 1.0, nIter = 64, bandwidth = 1.0) {\n const target = (Math.log(k) / Math.log(2)) * bandwidth;\n const rho = utils.zeros(distances.length);\n const result = utils.zeros(distances.length);\n for (let i = 0; i < distances.length; i++) {\n let lo = 0.0;\n let hi = Infinity;\n let mid = 1.0;\n // TODO: This is very inefficient, but will do for now. FIXME\n const ithDistances = distances[i];\n const nonZeroDists = ithDistances.filter((d) => d > 0.0);\n if (nonZeroDists.length >= localConnectivity) {\n const index = Math.floor(localConnectivity);\n const interpolation = localConnectivity - index;\n if (index > 0) {\n rho[i] = nonZeroDists[index - 1];\n if (interpolation > SMOOTH_K_TOLERANCE) {\n rho[i] +=\n interpolation * (nonZeroDists[index] - nonZeroDists[index - 1]);\n }\n }\n else {\n rho[i] = interpolation * nonZeroDists[0];\n }\n }\n else if (nonZeroDists.length > 0) {\n rho[i] = utils.max(nonZeroDists);\n }\n for (let n = 0; n < nIter; n++) {\n let psum = 0.0;\n for (let j = 1; j < distances[i].length; j++) {\n const d = distances[i][j] - rho[i];\n if (d > 0)\n psum += Math.exp(-(d / mid));\n else\n psum += 1.0;\n }\n if (Math.abs(psum - target) < SMOOTH_K_TOLERANCE)\n break;\n if (psum > target) {\n hi = mid;\n mid = (lo + hi) / 2.0;\n }\n else {\n lo = mid;\n if (hi === Infinity)\n mid *= 2;\n else\n mid = (lo + hi) / 2.0;\n }\n }\n result[i] = mid;\n // TODO: This is very inefficient, but will do for now. FIXME\n if (rho[i] > 0.0) {\n const meanIthDistances = utils.mean(ithDistances);\n if (result[i] < MIN_K_DIST_SCALE * meanIthDistances)\n result[i] = MIN_K_DIST_SCALE * meanIthDistances;\n }\n else {\n const meanDistances = utils.mean(distances.map(utils.mean));\n if (result[i] < MIN_K_DIST_SCALE * meanDistances)\n result[i] = MIN_K_DIST_SCALE * meanDistances;\n }\n }\n return { sigmas: result, rhos: rho };\n }\n /**\n * Construct the membership strength data for the 1-skeleton of each local\n * fuzzy simplicial set -- this is formed as a sparse matrix where each row is\n * a local fuzzy simplicial set, with a membership strength for the\n * 1-simplex to each other data point.\n */\n computeMembershipStrengths(knnIndices, knnDistances, sigmas, rhos) {\n const nSamples = knnIndices.length;\n const nNeighbors = knnIndices[0].length;\n const rows = utils.zeros(nSamples * nNeighbors);\n const cols = utils.zeros(nSamples * nNeighbors);\n const vals = utils.zeros(nSamples * nNeighbors);\n for (let i = 0; i < nSamples; i++) {\n for (let j = 0; j < nNeighbors; j++) {\n let val = 0;\n if (knnIndices[i][j] === -1)\n continue; // We didn't get the full knn for i\n if (knnIndices[i][j] === i)\n val = 0.0;\n else if (knnDistances[i][j] - rhos[i] <= 0.0)\n val = 1.0;\n else\n val = Math.exp(-((knnDistances[i][j] - rhos[i]) / sigmas[i]));\n rows[i * nNeighbors + j] = i;\n cols[i * nNeighbors + j] = knnIndices[i][j];\n vals[i * nNeighbors + j] = val;\n }\n }\n return { rows, cols, vals };\n }\n /**\n * Initialize a fuzzy simplicial set embedding, using a specified\n * initialisation method and then minimizing the fuzzy set cross entropy\n * between the 1-skeletons of the high and low dimensional fuzzy simplicial\n * sets.\n */\n initializeSimplicialSetEmbedding() {\n const nEpochs = this.getNEpochs();\n const { nComponents } = this;\n const graphValues = this.graph.getValues();\n let graphMax = 0;\n for (let i = 0; i < graphValues.length; i++) {\n const value = graphValues[i];\n if (graphMax < graphValues[i])\n graphMax = value;\n }\n const graph = this.graph.map((value) => {\n if (value < graphMax / nEpochs)\n return 0;\n else\n return value;\n });\n // We're not computing the spectral initialization in this implementation\n // until we determine a better eigenvalue/eigenvector computation\n // approach\n this.embedding = utils.zeros(graph.nRows).map(() => {\n return utils.zeros(nComponents).map(() => {\n return utils.tauRand(this.random) * 20 + -10; // Random from -10 to 10\n });\n });\n // Get graph data in ordered way...\n const weights = [];\n const head = [];\n const tail = [];\n const rowColValues = graph.getAll();\n for (let i = 0; i < rowColValues.length; i++) {\n const entry = rowColValues[i];\n if (entry.value) {\n weights.push(entry.value);\n tail.push(entry.row);\n head.push(entry.col);\n }\n }\n const epochsPerSample = this.makeEpochsPerSample(weights, nEpochs);\n return { head, tail, epochsPerSample };\n }\n /**\n * Given a set of weights and number of epochs generate the number of\n * epochs per sample for each weight.\n */\n makeEpochsPerSample(weights, nEpochs) {\n const result = utils.filled(weights.length, -1.0);\n const max = utils.max(weights);\n const nSamples = weights.map((w) => (w / max) * nEpochs);\n nSamples.forEach((n, i) => {\n if (n > 0)\n result[i] = nEpochs / nSamples[i];\n });\n return result;\n }\n /**\n * Assigns optimization state parameters from a partial optimization state.\n */\n assignOptimizationStateParameters(state) {\n Object.assign(this.optimizationState, state);\n }\n /**\n * Sets a few optimization state parameters that are necessary before entering\n * the optimization step loop.\n */\n prepareForOptimizationLoop() {\n // Hyperparameters\n const { repulsionStrength, learningRate, negativeSampleRate } = this;\n const { epochsPerSample, headEmbedding, tailEmbedding, } = this.optimizationState;\n const dim = headEmbedding[0].length;\n const moveOther = headEmbedding.length === tailEmbedding.length;\n const epochsPerNegativeSample = epochsPerSample.map((e) => e / negativeSampleRate);\n const epochOfNextNegativeSample = [...epochsPerNegativeSample];\n const epochOfNextSample = [...epochsPerSample];\n this.assignOptimizationStateParameters({\n epochOfNextSample,\n epochOfNextNegativeSample,\n epochsPerNegativeSample,\n moveOther,\n initialAlpha: learningRate,\n alpha: learningRate,\n gamma: repulsionStrength,\n dim,\n });\n }\n /**\n * Initializes optimization state for stepwise optimization.\n */\n initializeOptimization() {\n // Algorithm state\n const headEmbedding = this.embedding;\n const tailEmbedding = this.embedding;\n // Initialized in initializeSimplicialSetEmbedding()\n const { head, tail, epochsPerSample } = this.optimizationState;\n const nEpochs = this.getNEpochs();\n const nVertices = this.graph.nCols;\n const { a, b } = findABParams(this.spread, this.minDist);\n this.assignOptimizationStateParameters({\n headEmbedding,\n tailEmbedding,\n head,\n tail,\n epochsPerSample,\n a,\n b,\n nEpochs,\n nVertices,\n });\n }\n /**\n * Improve an embedding using stochastic gradient descent to minimize the\n * fuzzy set cross entropy between the 1-skeletons of the high dimensional\n * and low dimensional fuzzy simplicial sets. In practice this is done by\n * sampling edges based on their membership strength (with the (1-p) terms\n * coming from negative sampling similar to word2vec).\n */\n optimizeLayoutStep(n) {\n const { optimizationState } = this;\n const { head, tail, headEmbedding, tailEmbedding, epochsPerSample, epochOfNextSample, epochOfNextNegativeSample, epochsPerNegativeSample, moveOther, initialAlpha, alpha, gamma, a, b, dim, nEpochs, nVertices, } = optimizationState;\n const clipValue = 4.0;\n for (let i = 0; i < epochsPerSample.length; i++) {\n if (epochOfNextSample[i] > n)\n continue;\n const j = head[i];\n const k = tail[i];\n const current = headEmbedding[j];\n const other = tailEmbedding[k];\n const distSquared = rDist(current, other);\n let gradCoeff = 0;\n if (distSquared > 0) {\n gradCoeff = -2.0 * a * b * Math.pow(distSquared, b - 1.0);\n gradCoeff /= a * Math.pow(distSquared, b) + 1.0;\n }\n for (let d = 0; d < dim; d++) {\n const gradD = clip(gradCoeff * (current[d] - other[d]), clipValue);\n current[d] += gradD * alpha;\n if (moveOther)\n other[d] += -gradD * alpha;\n }\n epochOfNextSample[i] += epochsPerSample[i];\n const nNegSamples = Math.floor((n - epochOfNextNegativeSample[i]) / epochsPerNegativeSample[i]);\n for (let p = 0; p < nNegSamples; p++) {\n const k = utils.tauRandInt(nVertices, this.random);\n const other = tailEmbedding[k];\n const distSquared = rDist(current, other);\n let gradCoeff = 0.0;\n if (distSquared > 0.0) {\n gradCoeff = 2.0 * gamma * b;\n gradCoeff /=\n (0.001 + distSquared) * (a * Math.pow(distSquared, b) + 1);\n }\n else if (j === k) {\n continue;\n }\n for (let d = 0; d < dim; d++) {\n let gradD = 4.0;\n if (gradCoeff > 0.0)\n gradD = clip(gradCoeff * (current[d] - other[d]), clipValue);\n current[d] += gradD * alpha;\n }\n }\n epochOfNextNegativeSample[i] += nNegSamples * epochsPerNegativeSample[i];\n }\n optimizationState.alpha = initialAlpha * (1.0 - n / nEpochs);\n optimizationState.currentEpoch += 1;\n return headEmbedding;\n }\n /**\n * Improve an embedding using stochastic gradient descent to minimize the\n * fuzzy set cross entropy between the 1-skeletons of the high dimensional\n * and low dimensional fuzzy simplicial sets. In practice this is done by\n * sampling edges based on their membership strength (with the (1-p) terms\n * coming from negative sampling similar to word2vec).\n */\n optimizeLayoutAsync(epochCallback = () => true) {\n return new Promise((resolve, reject) => {\n const step = async () => {\n try {\n const { nEpochs, currentEpoch } = this.optimizationState;\n this.embedding = this.optimizeLayoutStep(currentEpoch);\n const epochCompleted = this.optimizationState.currentEpoch;\n const shouldStop = epochCallback(epochCompleted) === false;\n const isFinished = epochCompleted === nEpochs;\n if (!shouldStop && !isFinished)\n setTimeout(() => step(), 0);\n else\n return resolve(isFinished);\n }\n catch (err) {\n reject(err);\n }\n };\n setTimeout(() => step(), 0);\n });\n }\n /**\n * Improve an embedding using stochastic gradient descent to minimize the\n * fuzzy set cross entropy between the 1-skeletons of the high dimensional\n * and low dimensional fuzzy simplicial sets. In practice this is done by\n * sampling edges based on their membership strength (with the (1-p) terms\n * coming from negative sampling similar to word2vec).\n */\n optimizeLayout(epochCallback = () => true) {\n let isFinished = false;\n let embedding = [];\n while (!isFinished) {\n const { nEpochs, currentEpoch } = this.optimizationState;\n embedding = this.optimizeLayoutStep(currentEpoch);\n const epochCompleted = this.optimizationState.currentEpoch;\n const shouldStop = epochCallback(epochCompleted) === false;\n isFinished = epochCompleted === nEpochs || shouldStop;\n }\n return embedding;\n }\n /**\n * Gets the number of epochs for optimizing the projection.\n * NOTE: This heuristic differs from the python version\n */\n getNEpochs() {\n const graph = this.graph;\n if (this.nEpochs > 0)\n return this.nEpochs;\n if (!graph)\n return 200;\n const length = graph.nRows;\n if (length <= 2500)\n return 500;\n else if (length <= 5000)\n return 400;\n else if (length <= 7500)\n return 300;\n else\n return 200;\n }\n}\nexport function euclidean(x, y) {\n let result = 0;\n for (let i = 0; i < x.length; i++)\n result += (x[i] - y[i]) ** 2;\n return Math.sqrt(result);\n}\nexport function numeric(x, y) {\n const result = Math.abs(x - y);\n return result;\n}\nexport function cosine(x, y) {\n let result = 0.0;\n let normX = 0.0;\n let normY = 0.0;\n for (let i = 0; i < x.length; i++) {\n result += x[i] * y[i];\n normX += x[i] ** 2;\n normY += y[i] ** 2;\n }\n if (normX === 0 && normY === 0)\n return 0;\n else if (normX === 0 || normY === 0)\n return 1.0;\n else\n return 1.0 - result / Math.sqrt(normX * normY);\n}\n/**\n * An interface representing the optimization state tracked between steps of\n * the SGD optimization\n */\nclass OptimizationState {\n currentEpoch = 0;\n // Data tracked during optimization steps.\n headEmbedding = [];\n tailEmbedding = [];\n head = [];\n tail = [];\n epochsPerSample = [];\n epochOfNextSample = [];\n epochOfNextNegativeSample = [];\n epochsPerNegativeSample = [];\n moveOther = true;\n initialAlpha = 1.0;\n alpha = 1.0;\n gamma = 1.0;\n a = 1.5769434603113077;\n b = 0.8950608779109733;\n dim = 2;\n nEpochs = 500;\n nVertices = 0;\n}\n/**\n * Standard clamping of a value into a fixed range\n */\nfunction clip(x, clipValue) {\n if (x > clipValue)\n return clipValue;\n else if (x < -clipValue)\n return -clipValue;\n else\n return x;\n}\n/**\n * Reduced Euclidean distance.\n */\nfunction rDist(x, y) {\n let result = 0.0;\n for (let i = 0; i < x.length; i++)\n result += Math.pow(x[i] - y[i], 2);\n return result;\n}\n/**\n * Fit a, b params for the differentiable curve used in lower\n * dimensional fuzzy simplicial complex construction. We want the\n * smooth curve (from a pre-defined family with simple gradient) that\n * best matches an offset exponential decay.\n */\nexport function findABParams(spread, minDist) {\n const curve = ([a, b]) => (x) => {\n return 1.0 / (1.0 + a * x ** (2 * b));\n };\n const xv = utils\n .linear(0, spread * 3, 300)\n .map((val) => (val < minDist ? 1.0 : val));\n const yv = utils.zeros(xv.length).map((val, index) => {\n const gte = xv[index] >= minDist;\n return gte ? Math.exp(-(xv[index] - minDist) / spread) : val;\n });\n const initialValues = [0.5, 0.5];\n const data = { x: xv, y: yv };\n // Default options for the algorithm (from github example)\n const options = {\n damping: 1.5,\n initialValues,\n gradientDifference: 10e-2,\n maxIterations: 100,\n errorTolerance: 10e-3,\n };\n // eslint-disable-next-line new-cap\n const { parameterValues } = LM(data, curve, options);\n const [a, b] = parameterValues;\n return { a, b };\n}\n/**\n * Under the assumption of categorical distance for the intersecting\n * simplicial set perform a fast intersection.\n */\nexport function fastIntersection(graph, target, unknownDist = 1.0, farDist = 5.0) {\n return graph.map((value, row, col) => {\n if (target[row] === -1 || target[col] === -1)\n return value * Math.exp(-unknownDist);\n else if (target[row] !== target[col])\n return value * Math.exp(-farDist);\n else\n return value;\n });\n}\n/**\n * Reset the local connectivity requirement -- each data sample should\n * have complete confidence in at least one 1-simplex in the simplicial set.\n * We can enforce this by locally rescaling confidences, and then remerging the\n * different local simplicial sets together.\n */\nexport function resetLocalConnectivity(simplicialSet) {\n simplicialSet = matrix.normalize(simplicialSet, \"max\" /* matrix.NormType.max */);\n const transpose = matrix.transpose(simplicialSet);\n const prodMatrix = matrix.pairwiseMultiply(transpose, simplicialSet);\n simplicialSet = matrix.add(simplicialSet, matrix.subtract(transpose, prodMatrix));\n return matrix.eliminateZeros(simplicialSet);\n}\n/**\n * Given indices and weights and an original embeddings\n * initialize the positions of new points relative to the\n * indices and weights (of their neighbors in the source data).\n */\nexport function initTransform(indices, weights, embedding) {\n const result = utils\n .zeros(indices.length)\n .map((_z) => utils.zeros(embedding[0].length));\n for (let i = 0; i < indices.length; i++) {\n for (let j = 0; j < indices[0].length; j++) {\n for (let d = 0; d < embedding[0].length; d++) {\n const a = indices[i][j];\n result[i][d] += weights[i][j] * embedding[a][d];\n }\n }\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInVtYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNEJBQTRCO0FBQzVCOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFFSCxPQUFPLEtBQUssSUFBSSxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEtBQUssTUFBTSxNQUFNLFVBQVUsQ0FBQztBQUNuQyxPQUFPLEtBQUssU0FBUyxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEtBQUssSUFBSSxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEtBQUssS0FBSyxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQWF4QyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQztBQUNoQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQW1IOUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLE9BQU8sSUFBSTtJQUNQLFlBQVksR0FBRyxHQUFHLENBQUM7SUFDbkIsaUJBQWlCLEdBQUcsR0FBRyxDQUFDO0lBQ3hCLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDZCxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDWixVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLGtCQUFrQixHQUFHLENBQUMsQ0FBQztJQUN2QixNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixpQkFBaUIsR0FBRyxHQUFHLENBQUM7SUFDeEIsYUFBYSxHQUFHLEdBQUcsQ0FBQztJQUNwQixNQUFNLEdBQUcsR0FBRyxDQUFDO0lBQ2Isa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0lBRWpDLCtCQUErQjtJQUN2QixZQUFZLGdEQUE0QjtJQUN4QyxZQUFZLEdBQUcsR0FBRyxDQUFDO0lB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QyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNqRDtTQUNGO0tBQ0Y7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgSmF2YVNjcmlwdCByZWltcGxlbWVudGF0aW9uIG9mIFVNQVAgKG9yaWdpbmFsIGxpY2Vuc2UgYmVsb3cpLCBmcm9tXG4gKiB0aGUgcHl0aG9uIGltcGxlbWVudGF0aW9uIGZvdW5kIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9sbWNpbm5lcy91bWFwLlxuICpcbiAqIEBhdXRob3IgYW5keWNvZW5lbkBnb29nbGUuY29tIChBbmR5IENvZW5lbilcbiAqL1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBCU0QgMy1DbGF1c2UgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNywgTGVsYW5kIE1jSW5uZXNcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuICogICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXIgbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbiAqICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFXG4gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTFxuICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1JcbiAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSXG4gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLFxuICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxuaW1wb3J0ICogYXMgaGVhcCBmcm9tICcuL2hlYXAnO1xuaW1wb3J0ICogYXMgbWF0cml4IGZyb20gJy4vbWF0cml4JztcbmltcG9ydCAqIGFzIG5uRGVzY2VudCBmcm9tICcuL25uX2Rlc2NlbnQnO1xuaW1wb3J0ICogYXMgdHJlZSBmcm9tICcuL3RyZWUnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgTE0gZnJvbSAnbWwtbGV2ZW5iZXJnLW1hcnF1YXJkdCc7XG5cbmV4cG9ydCB0eXBlIERpc3RhbmNlRm4gPSAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IG51bWJlcjtcbmV4cG9ydCB0eXBlIFJhbmRvbUZuID0gKCkgPT4gbnVtYmVyO1xuZXhwb3J0IHR5cGUgRXBvY2hDYWxsYmFjayA9IChlcG9jaDogbnVtYmVyKSA9PiBib29sZWFuIHwgdm9pZDtcbmV4cG9ydCB0eXBlIFZlY3RvciA9IG51bWJlcltdO1xuZXhwb3J0IHR5cGUgVmVjdG9ycyA9IFZlY3RvcltdO1xuZXhwb3J0IGNvbnN0IGVudW0gVGFyZ2V0TWV0cmljIHtcbiAgY2F0ZWdvcmljYWwgPSAnY2F0ZWdvcmljYWwnLFxuICBsMSA9ICdsMScsXG4gIGwyID0gJ2wyJyxcbn1cblxuY29uc3QgU01PT1RIX0tfVE9MRVJBTkNFID0gMWUtNTtcbmNvbnN0IE1JTl9LX0RJU1RfU0NBTEUgPSAxZS0zO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVNQVBQYXJhbWV0ZXJzIHtcbiAgLyoqXG4gICAqIFRoZSBkaXN0YW5jZSBmdW5jdGlvbiB3aXRoIHdoaWNoIHRvIGFzc2VzcyBuZWFyZXN0IG5laWdoYm9ycywgZGVmYXVsdHNcbiAgICogdG8gZXVjbGlkZWFuIGRpc3RhbmNlLlxuICAgKi9cbiAgZGlzdGFuY2VGbj86IERpc3RhbmNlRm47XG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCBsZWFybmluZyByYXRlIGZvciB0aGUgZW1iZWRkaW5nIG9wdGltaXphdGlvbi5cbiAgICovXG4gIGxlYXJuaW5nUmF0ZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBsb2NhbCBjb25uZWN0aXZpdHkgcmVxdWlyZWQgLS0gaS5lLiB0aGUgbnVtYmVyIG9mIG5lYXJlc3RcbiAgICogbmVpZ2hib3JzIHRoYXQgc2hvdWxkIGJlIGFzc3VtZWQgdG8gYmUgY29ubmVjdGVkIGF0IGEgbG9jYWwgbGV2ZWwuXG4gICAqIFRoZSBoaWdoZXIgdGhpcyB2YWx1ZSB0aGUgbW9yZSBjb25uZWN0ZWQgdGhlIG1hbmlmb2xkIGJlY29tZXNcbiAgICogbG9jYWxseS4gSW4gcHJhY3RpY2UgdGhpcyBzaG91bGQgYmUgbm90IG1vcmUgdGhhbiB0aGUgbG9jYWwgaW50cmluc2ljXG4gICAqIGRpbWVuc2lvbiBvZiB0aGUgbWFuaWZvbGQuXG4gICAqL1xuICBsb2NhbENvbm5lY3Rpdml0eT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBlZmZlY3RpdmUgbWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIGVtYmVkZGVkIHBvaW50cy4gU21hbGxlciB2YWx1ZXNcbiAgICogd2lsbCByZXN1bHQgaW4gYSBtb3JlIGNsdXN0ZXJlZC9jbHVtcGVkIGVtYmVkZGluZyB3aGVyZSBuZWFyYnkgcG9pbnRzXG4gICAqIG9uIHRoZSBtYW5pZm9sZCBhcmUgZHJhd24gY2xvc2VyIHRvZ2V0aGVyLCB3aGlsZSBsYXJnZXIgdmFsdWVzIHdpbGxcbiAgICogcmVzdWx0IG9uIGEgbW9yZSBldmVuIGRpc3BlcnNhbCBvZiBwb2ludHMuIFRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0XG4gICAqIHJlbGF0aXZlIHRvIHRoZSBgYHNwcmVhZGBgIHZhbHVlLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBzY2FsZSBhdCB3aGljaFxuICAgKiBlbWJlZGRlZCBwb2ludHMgd2lsbCBiZSBzcHJlYWQgb3V0LlxuICAgKi9cbiAgbWluRGlzdD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBkaW1lbnNpb24gb2YgdGhlIHNwYWNlIHRvIGVtYmVkIGludG8uIFRoaXMgZGVmYXVsdHMgdG8gMiB0b1xuICAgKiBwcm92aWRlIGVhc3kgdmlzdWFsaXphdGlvbiwgYnV0IGNhbiByZWFzb25hYmx5IGJlIHNldCB0byBhbnlcbiAgICogaW50ZWdlciB2YWx1ZSBpbiB0aGUgcmFuZ2UgMiB0byAxMDAuXG4gICAqL1xuICBuQ29tcG9uZW50cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgdHJhaW5pbmcgZXBvY2hzIHRvIGJlIHVzZWQgaW4gb3B0aW1pemluZyB0aGVcbiAgICogbG93IGRpbWVuc2lvbmFsIGVtYmVkZGluZy4gTGFyZ2VyIHZhbHVlcyByZXN1bHQgaW4gbW9yZSBhY2N1cmF0ZVxuICAgKiBlbWJlZGRpbmdzLiBJZiBOb25lIGlzIHNwZWNpZmllZCBhIHZhbHVlIHdpbGwgYmUgc2VsZWN0ZWQgYmFzZWQgb25cbiAgICogdGhlIHNpemUgb2YgdGhlIGlucHV0IGRhdGFzZXQgKDIwMCBmb3IgbGFyZ2UgZGF0YXNldHMsIDUwMCBmb3Igc21hbGwpLlxuICAgKi9cbiAgbkVwb2Nocz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIGxvY2FsIG5laWdoYm9yaG9vZCAoaW4gdGVybXMgb2YgbnVtYmVyIG9mIG5laWdoYm9yaW5nXG4gICAqIHNhbXBsZSBwb2ludHMpIHVzZWQgZm9yIG1hbmlmb2xkIGFwcHJveGltYXRpb24uIExhcmdlciB2YWx1ZXNcbiAgICogcmVzdWx0IGluIG1vcmUgZ2xvYmFsIHZpZXdzIG9mIHRoZSBtYW5pZm9sZCwgd2hpbGUgc21hbGxlclxuICAgKiB2YWx1ZXMgcmVzdWx0IGluIG1vcmUgbG9jYWwgZGF0YSBiZWluZyBwcmVzZXJ2ZWQuIEluIGdlbmVyYWxcbiAgICogdmFsdWVzIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgMiB0byAxMDAuXG4gICAqL1xuICBuTmVpZ2hib3JzPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBuZWdhdGl2ZSBzYW1wbGVzIHRvIHNlbGVjdCBwZXIgcG9zaXRpdmUgc2FtcGxlXG4gICAqIGluIHRoZSBvcHRpbWl6YXRpb24gcHJvY2Vzcy4gSW5jcmVhc2luZyB0aGlzIHZhbHVlIHdpbGwgcmVzdWx0XG4gICAqIGluIGdyZWF0ZXIgcmVwdWxzaXZlIGZvcmNlIGJlaW5nIGFwcGxpZWQsIGdyZWF0ZXIgb3B0aW1pemF0aW9uXG4gICAqIGNvc3QsIGJ1dCBzbGlnaHRseSBtb3JlIGFjY3VyYWN5LlxuICAgKi9cbiAgbmVnYXRpdmVTYW1wbGVSYXRlPzogbnVtYmVyO1xuICAvKipcbiAgICogV2VpZ2h0aW5nIGFwcGxpZWQgdG8gbmVnYXRpdmUgc2FtcGxlcyBpbiBsb3cgZGltZW5zaW9uYWwgZW1iZWRkaW5nXG4gICAqIG9wdGltaXphdGlvbi4gVmFsdWVzIGhpZ2hlciB0aGFuIG9uZSB3aWxsIHJlc3VsdCBpbiBncmVhdGVyIHdlaWdodFxuICAgKiBiZWluZyBnaXZlbiB0byBuZWdhdGl2ZSBzYW1wbGVzLlxuICAgKi9cbiAgcmVwdWxzaW9uU3RyZW5ndGg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHVzZWQgYnkgdGhlIHN0b2NoYXN0aWMgcGFydHMgb2YgdGhlXG4gICAqIGFsZ29yaXRobS5cbiAgICovXG4gIHJhbmRvbT86IFJhbmRvbUZuO1xuICAvKipcbiAgICogSW50ZXJwb2xhdGUgYmV0d2VlbiAoZnV6enkpIHVuaW9uIGFuZCBpbnRlcnNlY3Rpb24gYXMgdGhlIHNldCBvcGVyYXRpb25cbiAgICogdXNlZCB0byBjb21iaW5lIGxvY2FsIGZ1enp5IHNpbXBsaWNpYWwgc2V0cyB0byBvYnRhaW4gYSBnbG9iYWwgZnV6enlcbiAgICogc2ltcGxpY2lhbCBzZXRzLiBCb3RoIGZ1enp5IHNldCBvcGVyYXRpb25zIHVzZSB0aGUgcHJvZHVjdCB0LW5vcm0uXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlciBzaG91bGQgYmUgYmV0d2VlbiAwLjAgYW5kIDEuMDsgYSB2YWx1ZSBvZlxuICAgKiAxLjAgd2lsbCB1c2UgYSBwdXJlIGZ1enp5IHVuaW9uLCB3aGlsZSAwLjAgd2lsbCB1c2UgYSBwdXJlIGZ1enp5XG4gICAqIGludGVyc2VjdGlvbi5cbiAgICovXG4gIHNldE9wTWl4UmF0aW8/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgZWZmZWN0aXZlIHNjYWxlIG9mIGVtYmVkZGVkIHBvaW50cy4gSW4gY29tYmluYXRpb24gd2l0aCBgYG1pbl9kaXN0YGBcbiAgICogdGhpcyBkZXRlcm1pbmVzIGhvdyBjbHVzdGVyZWQvY2x1bXBlZCB0aGUgZW1iZWRkZWQgcG9pbnRzIGFyZS5cbiAgICovXG4gIHNwcmVhZD86IG51bWJlcjtcbiAgLyoqXG4gICAqIEZvciB0cmFuc2Zvcm0gb3BlcmF0aW9ucyAoZW1iZWRkaW5nIG5ldyBwb2ludHMgdXNpbmcgYSB0cmFpbmVkIG1vZGVsKVxuICAgKiB0aGlzIHdpbGwgY29udHJvbCBob3cgYWdncmVzc2l2ZWx5IHRvIHNlYXJjaCBmb3IgbmVhcmVzdCBuZWlnaGJvcnMuXG4gICAqIExhcmdlciB2YWx1ZXMgd2lsbCByZXN1bHQgaW4gc2xvd2VyIHBlcmZvcm1hbmNlIGJ1dCBtb3JlIGFjY3VyYXRlXG4gICAqIG5lYXJlc3QgbmVpZ2hib3IgZXZhbHVhdGlvbi5cbiAgICovXG4gIHRyYW5zZm9ybVF1ZXVlU2l6ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVTUFQU3VwZXJ2aXNlZFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbWV0cmljIHVzZWQgdG8gbWVhc3VyZSBkaXN0YW5jZSBmb3IgYSB0YXJnZXQgYXJyYXkgaXMgdXNpbmcgc3VwZXJ2aXNlZFxuICAgKiBkaW1lbnNpb24gcmVkdWN0aW9uLiBCeSBkZWZhdWx0IHRoaXMgaXMgJ2NhdGVnb3JpY2FsJyB3aGljaCB3aWxsIG1lYXN1cmVcbiAgICogZGlzdGFuY2UgaW4gdGVybXMgb2Ygd2hldGhlciBjYXRlZ29yaWVzIG1hdGNoIG9yIGFyZSBkaWZmZXJlbnQuIEZ1cnRoZXJtb3JlLFxuICAgKiBpZiBzZW1pLXN1cGVydmlzZWQgaXMgcmVxdWlyZWQgdGFyZ2V0IHZhbHVlcyBvZiAtMSB3aWxsIGJlIHRyZWF0ZWQgYXNcbiAgICogdW5sYWJlbGxlZCB1bmRlciB0aGUgJ2NhdGVnb3JpY2FsJyBtZXRyaWMuIElmIHRoZSB0YXJnZXQgYXJyYXkgdGFrZXNcbiAgICogY29udGludW91cyB2YWx1ZXMgKGUuZy4gZm9yIGEgcmVncmVzc2lvbiBwcm9ibGVtKSB0aGVuIG1ldHJpYyBvZiAnbDEnXG4gICAqIG9yICdsMicgaXMgcHJvYmFibHkgbW9yZSBhcHByb3ByaWF0ZS5cbiAgICovXG4gIHRhcmdldE1ldHJpYz86IFRhcmdldE1ldHJpYztcbiAgLyoqXG4gICAqIFdlaWdodGluZyBmYWN0b3IgYmV0d2VlbiBkYXRhIHRvcG9sb2d5IGFuZCB0YXJnZXQgdG9wb2xvZ3kuIEEgdmFsdWUgb2ZcbiAgICogMC4wIHdlaWdodHMgZW50aXJlbHkgb24gZGF0YSwgYSB2YWx1ZSBvZiAxLjAgd2VpZ2h0cyBlbnRpcmVseSBvbiB0YXJnZXQuXG4gICAqIFRoZSBkZWZhdWx0IG9mIDAuNSBiYWxhbmNlcyB0aGUgd2VpZ2h0aW5nIGVxdWFsbHkgYmV0d2VlbiBkYXRhIGFuZCB0YXJnZXQuXG4gICAqL1xuICB0YXJnZXRXZWlnaHQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG5lYXJlc3QgbmVpZ2hib3JzIHRvIHVzZSB0byBjb25zdHJ1Y3QgdGhlIHRhcmdldCBzaW1wbGNpYWxcbiAgICogc2V0LiBEZWZhdWx0cyB0byB0aGUgYG5lYXJlc3ROZWlnaGJvcnNgIHBhcmFtZXRlci5cbiAgICovXG4gIHRhcmdldE5OZWlnaGJvcnM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVU1BUCBwcm9qZWN0aW9uIHN5c3RlbSwgYmFzZWQgb24gdGhlIHB5dGhvbiBpbXBsZW1lbnRhdGlvbiBmcm9tIE1jSW5uZXMsIEwsXG4gKiBIZWFseSwgSiwgVU1BUDogVW5pZm9ybSBNYW5pZm9sZCBBcHByb3hpbWF0aW9uIGFuZCBQcm9qZWN0aW9uIGZvciBEaW1lbnNpb25cbiAqIFJlZHVjdGlvbiAoaHR0cHM6Ly9naXRodWIuY29tL2xtY2lubmVzL3VtYXApLlxuICpcbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gZGlmZmVycyBpbiBhIGZldyByZWdhcmRzOlxuICogYSkgVGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBlbWJlZGRpbmcgZm9yIG9wdGltaXphdGlvbiBpcyBub3QgY29tcHV0ZWQgdXNpbmdcbiAqICAgIGEgc3BlY3RyYWwgbWV0aG9kLCByYXRoZXIgaXQgaXMgaW5pdGlhbGl6ZWQgcmFuZG9tbHkuIFRoaXMgYXZvaWRzIHNvbWVcbiAqICAgIGNvbXB1dGF0aW9uYWxseSBpbnRlbnNpdmUgbWF0cml4IGVpZ2VuIGNvbXB1dGF0aW9ucyB0aGF0IGFyZW4ndCBlYXNpbHlcbiAqICAgIHBvcnRlZCB0byBKYXZhU2NyaXB0LlxuICogYikgQSBsb3Qgb2YgXCJleHRyYVwiIGZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gb21pdHRlZCBmcm9tIHRoaXMgaW1wbGVtZW50YXRpb24sXG4gKiAgICBtb3N0IG5vdGFibHkgYSBncmVhdCBkZWFsIG9mIGFsdGVybmF0ZSBkaXN0YW5jZSBmdW5jdGlvbnMuXG4gKlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyB0aHJlZSBtZXRob2RzIG9mIHJlZHVjaW5nIGRpbWVuc2lvbmFsaXR5OlxuICogMSkgZml0OiBmaXQgdGhlIGRhdGEgc3luY2hyb25vdXNseVxuICogMikgZml0QXN5bmM6IGZpdCB0aGUgZGF0YSBhc3luY2hyb25vdXNseSwgd2l0aCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHByb3ZpZGVkXG4gKiAgICAgIHRoYXQgaXMgaW52b2tlZCBvbiBlYWNoIG9wdGltaXphdGlvbiBzdGVwLlxuICogMykgaW5pdGlhbGl6ZUZpdCAvIHN0ZXA6IG1hbnVhbGx5IGluaXRpYWxpemUgdGhlIGFsZ29yaXRobSB0aGVuIGV4cGxpY3RseVxuICogICAgICBzdGVwIHRocm91Z2ggZWFjaCBlcG9jaCBvZiB0aGUgU0dEIG9wdGltaXphdGlvblxuICovXG5leHBvcnQgY2xhc3MgVU1BUCB7XG4gIHByaXZhdGUgbGVhcm5pbmdSYXRlID0gMS4wO1xuICBwcml2YXRlIGxvY2FsQ29ubmVjdGl2aXR5ID0gMS4wO1xuICBwcml2YXRlIG1pbkRpc3QgPSAwLjE7XG4gIHByaXZhdGUgbkNvbXBvbmVudHMgPSAyO1xuICBwcml2YXRlIG5FcG9jaHMgPSAwO1xuICBwcml2YXRlIG5OZWlnaGJvcnMgPSAxNTtcbiAgcHJpdmF0ZSBuZWdhdGl2ZVNhbXBsZVJhdGUgPSA1O1xuICBwcml2YXRlIHJhbmRvbSA9IE1hdGgucmFuZG9tO1xuICBwcml2YXRlIHJlcHVsc2lvblN0cmVuZ3RoID0gMS4wO1xuICBwcml2YXRlIHNldE9wTWl4UmF0aW8gPSAxLjA7XG4gIHByaXZhdGUgc3ByZWFkID0gMS4wO1xuICBwcml2YXRlIHRyYW5zZm9ybVF1ZXVlU2l6ZSA9IDQuMDtcblxuICAvLyBTdXBlcnZpc2VkIHByb2plY3Rpb24gcGFyYW1zXG4gIHByaXZhdGUgdGFyZ2V0TWV0cmljID0gVGFyZ2V0TWV0cmljLmNhdGVnb3JpY2FsO1xuICBwcml2YXRlIHRhcmdldFdlaWdodCA9IDAuNTtcbiAgcHJpdmF0ZSB0YXJnZXROTmVpZ2hib3JzID0gMTU7XG5cbiAgcHJpdmF0ZSBkaXN0YW5jZUZuOiBEaXN0YW5jZUZuID0gbnVtZXJpYztcblxuICAvLyBLTk4gc3RhdGUgKGNhbiBiZSBwcmVjb21wdXRlZCBhbmQgc3VwcGxpZWQgdmlhIGluaXRpYWxpemVGaXQpXG4gIHByaXZhdGUga25uSW5kaWNlcz86IG51bWJlcltdW107XG4gIHByaXZhdGUga25uRGlzdGFuY2VzPzogbnVtYmVyW11bXTtcblxuICAvLyBJbnRlcm5hbCBncmFwaCBjb25uZWN0aXZpdHkgcmVwcmVzZW50YXRpb25cbiAgcHJpdmF0ZSBncmFwaCE6IG1hdHJpeC5TcGFyc2VNYXRyaXg7XG4gIHByaXZhdGUgWCE6IFZlY3RvcjtcbiAgcHJpdmF0ZSBpc0luaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgcnBGb3Jlc3Q6IHRyZWUuRmxhdFRyZWVbXSA9IFtdO1xuICBwcml2YXRlIGluaXRGcm9tUmFuZG9tITogbm5EZXNjZW50LkluaXRGcm9tUmFuZG9tRm47XG4gIHByaXZhdGUgaW5pdEZyb21UcmVlITogbm5EZXNjZW50LkluaXRGcm9tVHJlZUZuO1xuICBwcml2YXRlIHNlYXJjaCE6IG5uRGVzY2VudC5TZWFyY2hGbjtcbiAgcHJpdmF0ZSBzZWFyY2hHcmFwaCE6IG1hdHJpeC5TcGFyc2VNYXRyaXg7XG5cbiAgLy8gU3VwZXJ2aXNlZCBwcm9qZWN0aW9uIGxhYmVscyAvIHRhcmdldHNcbiAgcHJpdmF0ZSBZPzogbnVtYmVyW107XG5cbiAgLy8gUHJvamVjdGVkIGVtYmVkZGluZ1xuICBwcml2YXRlIGVtYmVkZGluZzogbnVtYmVyW11bXSA9IFtdO1xuICBwcml2YXRlIG9wdGltaXphdGlvblN0YXRlID0gbmV3IE9wdGltaXphdGlvblN0YXRlKCk7XG5cblxuICBnZXQgbmVpZ2hib3JzKCkge1xuICAgIHJldHVybiB0aGlzLm5OZWlnaGJvcnM7XG4gIH1cbiAgY29uc3RydWN0b3IocGFyYW1zOiBVTUFQUGFyYW1ldGVycyA9IHt9KSB7XG4gICAgY29uc3Qgc2V0UGFyYW0gPSAoa2V5OiBrZXlvZiBVTUFQUGFyYW1ldGVycykgPT4ge1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBpZiAocGFyYW1zW2tleV0gIT09IHVuZGVmaW5lZCkgdGhpc1trZXldID0gcGFyYW1zW2tleV07XG4gICAgfTtcblxuICAgIHNldFBhcmFtKCdkaXN0YW5jZUZuJyk7XG4gICAgc2V0UGFyYW0oJ2xlYXJuaW5nUmF0ZScpO1xuICAgIHNldFBhcmFtKCdsb2NhbENvbm5lY3Rpdml0eScpO1xuICAgIHNldFBhcmFtKCdtaW5EaXN0Jyk7XG4gICAgc2V0UGFyYW0oJ25Db21wb25lbnRzJyk7XG4gICAgc2V0UGFyYW0oJ25FcG9jaHMnKTtcbiAgICBzZXRQYXJhbSgnbk5laWdoYm9ycycpO1xuICAgIHNldFBhcmFtKCduZWdhdGl2ZVNhbXBsZVJhdGUnKTtcbiAgICBzZXRQYXJhbSgncmFuZG9tJyk7XG4gICAgc2V0UGFyYW0oJ3JlcHVsc2lvblN0cmVuZ3RoJyk7XG4gICAgc2V0UGFyYW0oJ3NldE9wTWl4UmF0aW8nKTtcbiAgICBzZXRQYXJhbSgnc3ByZWFkJyk7XG4gICAgc2V0UGFyYW0oJ3RyYW5zZm9ybVF1ZXVlU2l6ZScpO1xuICAgIHRoaXMudGFyZ2V0Tk5laWdoYm9ycyA9IHBhcmFtcy5uTmVpZ2hib3JzIHx8IHRoaXMubk5laWdoYm9ycyB8fCB0aGlzLnRhcmdldE5OZWlnaGJvcnM7XG4gIH1cblxuICAvKipcbiAgICogRml0IHRoZSBkYXRhIHRvIGEgcHJvamVjdGVkIGVtYmVkZGluZyBzcGFjZSBzeW5jaHJvbm91c2x5LlxuICAgKi9cbiAgZml0KFg6IFZlY3Rvcikge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUZpdChYKTtcbiAgICB0aGlzLm9wdGltaXplTGF5b3V0KCk7XG5cbiAgICByZXR1cm4gdGhpcy5lbWJlZGRpbmc7XG4gIH1cblxuICAvKipcbiAgICogRml0IHRoZSBkYXRhIHRvIGEgcHJvamVjdGVkIGVtYmVkZGluZyBzcGFjZSBhc3luY2hyb25vdXNseSwgd2l0aCBhIGNhbGxiYWNrXG4gICAqIGZ1bmN0aW9uIGludm9rZWQgb24gZXZlcnkgZXBvY2ggb2Ygb3B0aW1pemF0aW9uLlxuICAgKi9cbiAgYXN5bmMgZml0QXN5bmMoXG4gICAgWDogVmVjdG9yLFxuICAgIGNhbGxiYWNrOiAoZXBvY2hOdW1iZXI6IG51bWJlcikgPT4gdm9pZCB8IGJvb2xlYW4gPSAoKSA9PiB0cnVlXG4gICkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUZpdChYKTtcblxuICAgIGF3YWl0IHRoaXMub3B0aW1pemVMYXlvdXRBc3luYyhjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXMuZW1iZWRkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHBhcmFtZXRlcnMgbmVlZGVkIGZvciBzdXBlcnZpc2VkIHByb2plY3Rpb24uXG4gICAqL1xuICBzZXRTdXBlcnZpc2VkUHJvamVjdGlvbihZOiBudW1iZXJbXSwgcGFyYW1zOiBVTUFQU3VwZXJ2aXNlZFBhcmFtcyA9IHt9KSB7XG4gICAgdGhpcy5ZID0gWTtcbiAgICB0aGlzLnRhcmdldE1ldHJpYyA9IHBhcmFtcy50YXJnZXRNZXRyaWMgfHwgdGhpcy50YXJnZXRNZXRyaWM7XG4gICAgdGhpcy50YXJnZXRXZWlnaHQgPSBwYXJhbXMudGFyZ2V0V2VpZ2h0IHx8IHRoaXMudGFyZ2V0V2VpZ2h0O1xuICAgIHRoaXMudGFyZ2V0Tk5laWdoYm9ycyA9IHBhcmFtcy50YXJnZXROTmVpZ2hib3JzIHx8IHRoaXMudGFyZ2V0Tk5laWdoYm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB1bWFwIHdpdGggcHJlY29tcHV0ZWQgS05OIGluZGljZXMgYW5kIGRpc3RhbmNlcy5cbiAgICovXG4gIHNldFByZWNvbXB1dGVkS05OKGtubkluZGljZXM6IG51bWJlcltdW10sIGtubkRpc3RhbmNlczogbnVtYmVyW11bXSkge1xuICAgIHRoaXMua25uSW5kaWNlcyA9IGtubkluZGljZXM7XG4gICAgdGhpcy5rbm5EaXN0YW5jZXMgPSBrbm5EaXN0YW5jZXM7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgZml0IGJ5IGNvbXB1dGluZyBLTk4gYW5kIGEgZnV6enkgc2ltcGxpY2lhbCBzZXQsIGFzIHdlbGwgYXNcbiAgICogaW5pdGlhbGl6aW5nIHRoZSBwcm9qZWN0ZWQgZW1iZWRkaW5ncy4gU2V0cyB0aGUgb3B0aW1pemF0aW9uIHN0YXRlIGFoZWFkXG4gICAqIG9mIG9wdGltaXphdGlvbiBzdGVwcy4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVwb2NocyB0byBiZSB1c2VkIGZvciB0aGVcbiAgICogU0dEIG9wdGltaXphdGlvbi5cbiAgICovXG4gIGluaXRpYWxpemVGaXQoWDogVmVjdG9yKTogbnVtYmVyIHtcbiAgICBpZiAoWC5sZW5ndGggPD0gdGhpcy5uTmVpZ2hib3JzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3QgZW5vdWdoIGRhdGEgcG9pbnRzICgke1gubGVuZ3RofSkgdG8gY3JlYXRlIG5OZWlnaGJvcnM6ICR7dGhpcy5uTmVpZ2hib3JzfS4gIEFkZCBtb3JlIGRhdGEgcG9pbnRzIG9yIGFkanVzdCB0aGUgY29uZmlndXJhdGlvbi5gKTtcblxuXG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZWluaXRpYWxpemUgaWYgd2UndmUgYWxyZWFkeSBpbml0aWFsaXplZCBmb3IgdGhpcyBkYXRhLlxuICAgIGlmICh0aGlzLlggPT09IFggJiYgdGhpcy5pc0luaXRpYWxpemVkKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0TkVwb2NocygpO1xuXG5cbiAgICB0aGlzLlggPSBYO1xuXG4gICAgaWYgKCF0aGlzLmtubkluZGljZXMgJiYgIXRoaXMua25uRGlzdGFuY2VzKSB7XG4gICAgICBjb25zdCBrbm5SZXN1bHRzID0gdGhpcy5uZWFyZXN0TmVpZ2hib3JzKFgpO1xuICAgICAgdGhpcy5rbm5JbmRpY2VzID0ga25uUmVzdWx0cy5rbm5JbmRpY2VzO1xuICAgICAgdGhpcy5rbm5EaXN0YW5jZXMgPSBrbm5SZXN1bHRzLmtubkRpc3RhbmNlcztcbiAgICB9XG5cbiAgICB0aGlzLmdyYXBoID0gdGhpcy5mdXp6eVNpbXBsaWNpYWxTZXQoXG4gICAgICBYLFxuICAgICAgdGhpcy5uTmVpZ2hib3JzLFxuICAgICAgdGhpcy5zZXRPcE1peFJhdGlvXG4gICAgKTtcblxuICAgIC8vIFNldCB1cCB0aGUgc2VhcmNoIGdyYXBoIGZvciBzdWJzZXF1ZW50IHRyYW5zZm9ybWF0aW9uLlxuICAgIHRoaXMubWFrZVNlYXJjaEZucygpO1xuICAgIHRoaXMuc2VhcmNoR3JhcGggPSB0aGlzLm1ha2VTZWFyY2hHcmFwaChYKTtcblxuICAgIC8vIENoZWNrIGlmIHN1cGVydmlzZWQgcHJvamVjdGlvbiwgdGhlbiBhZGp1c3QgdGhlIGdyYXBoLlxuICAgIHRoaXMucHJvY2Vzc0dyYXBoRm9yU3VwZXJ2aXNlZFByb2plY3Rpb24oKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGhlYWQsXG4gICAgICB0YWlsLFxuICAgICAgZXBvY2hzUGVyU2FtcGxlLFxuICAgIH0gPSB0aGlzLmluaXRpYWxpemVTaW1wbGljaWFsU2V0RW1iZWRkaW5nKCk7XG5cbiAgICAvLyBTZXQgdGhlIG9wdGltaXphdGlvbiByb3V0aW5lIHN0YXRlXG4gICAgdGhpcy5vcHRpbWl6YXRpb25TdGF0ZS5oZWFkID0gaGVhZDtcbiAgICB0aGlzLm9wdGltaXphdGlvblN0YXRlLnRhaWwgPSB0YWlsO1xuICAgIHRoaXMub3B0aW1pemF0aW9uU3RhdGUuZXBvY2hzUGVyU2FtcGxlID0gZXBvY2hzUGVyU2FtcGxlO1xuXG4gICAgLy8gTm93LCBpbml0aWFsaXplIHRoZSBvcHRpbWl6YXRpb24gc3RlcHNcbiAgICB0aGlzLmluaXRpYWxpemVPcHRpbWl6YXRpb24oKTtcbiAgICB0aGlzLnByZXBhcmVGb3JPcHRpbWl6YXRpb25Mb29wKCk7XG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aGlzLmdldE5FcG9jaHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFrZVNlYXJjaEZucygpIHtcbiAgICBjb25zdCB7aW5pdEZyb21UcmVlLCBpbml0RnJvbVJhbmRvbX0gPSBubkRlc2NlbnQubWFrZUluaXRpYWxpemF0aW9ucyhcbiAgICAgIHRoaXMuZGlzdGFuY2VGblxuICAgICk7XG4gICAgdGhpcy5pbml0RnJvbVRyZWUgPSBpbml0RnJvbVRyZWU7XG4gICAgdGhpcy5pbml0RnJvbVJhbmRvbSA9IGluaXRGcm9tUmFuZG9tO1xuICAgIHRoaXMuc2VhcmNoID0gbm5EZXNjZW50Lm1ha2VJbml0aWFsaXplZE5OU2VhcmNoKHRoaXMuZGlzdGFuY2VGbik7XG4gIH1cblxuICBwcml2YXRlIG1ha2VTZWFyY2hHcmFwaChYOiBWZWN0b3IpIHtcbiAgICBjb25zdCBrbm5JbmRpY2VzID0gdGhpcy5rbm5JbmRpY2VzITtcbiAgICBjb25zdCBrbm5EaXN0YW5jZXMgPSB0aGlzLmtubkRpc3RhbmNlcyE7XG4gICAgY29uc3QgZGltcyA9IFtYLmxlbmd0aCwgWC5sZW5ndGhdO1xuICAgIGNvbnN0IHNlYXJjaEdyYXBoID0gbmV3IG1hdHJpeC5TcGFyc2VNYXRyaXgoW10sIFtdLCBbXSwgZGltcyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrbm5JbmRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrbm4gPSBrbm5JbmRpY2VzW2ldO1xuICAgICAgY29uc3QgZGlzdGFuY2VzID0ga25uRGlzdGFuY2VzW2ldO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBrbm4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY29uc3QgbmVpZ2hib3IgPSBrbm5bal07XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2VzW2pdO1xuICAgICAgICBpZiAoZGlzdGFuY2UgPiAwKVxuICAgICAgICAgIHNlYXJjaEdyYXBoLnNldChpLCBuZWlnaGJvciwgZGlzdGFuY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zcG9zZSA9IG1hdHJpeC50cmFuc3Bvc2Uoc2VhcmNoR3JhcGgpO1xuICAgIHJldHVybiBtYXRyaXgubWF4aW11bShzZWFyY2hHcmFwaCwgdHJhbnNwb3NlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIGRhdGEgdG8gdGhlIGV4aXN0aW5nIGVtYmVkZGluZyBzcGFjZS5cbiAgICovXG4gIHRyYW5zZm9ybSh0b1RyYW5zZm9ybTogVmVjdG9yKSB7XG4gICAgLy8gVXNlIHRoZSBwcmV2aW91cyByYXdEYXRhXG4gICAgY29uc3QgcmF3RGF0YSA9IHRoaXMuWDtcbiAgICBpZiAocmF3RGF0YSA9PT0gdW5kZWZpbmVkIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBkYXRhIGhhcyBiZWVuIGZpdC4nKTtcblxuXG4gICAgbGV0IG5OZWlnaGJvcnMgPSBNYXRoLmZsb29yKHRoaXMubk5laWdoYm9ycyAqIHRoaXMudHJhbnNmb3JtUXVldWVTaXplKTtcbiAgICBuTmVpZ2hib3JzID0gTWF0aC5taW4ocmF3RGF0YS5sZW5ndGgsIG5OZWlnaGJvcnMpO1xuICAgIGNvbnN0IGluaXQgPSBubkRlc2NlbnQuaW5pdGlhbGl6ZVNlYXJjaChcbiAgICAgIHRoaXMucnBGb3Jlc3QsXG4gICAgICByYXdEYXRhLFxuICAgICAgdG9UcmFuc2Zvcm0sXG4gICAgICBuTmVpZ2hib3JzLFxuICAgICAgdGhpcy5pbml0RnJvbVJhbmRvbSxcbiAgICAgIHRoaXMuaW5pdEZyb21UcmVlLFxuICAgICAgdGhpcy5yYW5kb21cbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZWFyY2gocmF3RGF0YSwgdGhpcy5zZWFyY2hHcmFwaCwgaW5pdCwgdG9UcmFuc2Zvcm0pO1xuXG4gICAgbGV0IHtpbmRpY2VzLCB3ZWlnaHRzOiBkaXN0YW5jZXN9ID0gaGVhcC5kZWhlYXBTb3J0KHJlc3VsdCk7XG5cbiAgICBpbmRpY2VzID0gaW5kaWNlcy5tYXAoKHgpID0+IHguc2xpY2UoMCwgdGhpcy5uTmVpZ2hib3JzKSk7XG4gICAgZGlzdGFuY2VzID0gZGlzdGFuY2VzLm1hcCgoeCkgPT4geC5zbGljZSgwLCB0aGlzLm5OZWlnaGJvcnMpKTtcblxuICAgIGNvbnN0IGFkanVzdGVkTG9jYWxDb25uZWN0aXZpdHkgPSBNYXRoLm1heCgwLCB0aGlzLmxvY2FsQ29ubmVjdGl2aXR5IC0gMSk7XG4gICAgY29uc3Qge3NpZ21hcywgcmhvc30gPSB0aGlzLnNtb290aEtOTkRpc3RhbmNlKFxuICAgICAgZGlzdGFuY2VzLFxuICAgICAgdGhpcy5uTmVpZ2hib3JzLFxuICAgICAgYWRqdXN0ZWRMb2NhbENvbm5lY3Rpdml0eVxuICAgICk7XG5cbiAgICBjb25zdCB7cm93cywgY29scywgdmFsc30gPSB0aGlzLmNvbXB1dGVNZW1iZXJzaGlwU3RyZW5ndGhzKFxuICAgICAgaW5kaWNlcyxcbiAgICAgIGRpc3RhbmNlcyxcbiAgICAgIHNpZ21hcyxcbiAgICAgIHJob3NcbiAgICApO1xuXG4gICAgY29uc3Qgc2l6ZSA9IFt0b1RyYW5zZm9ybS5sZW5ndGgsIHJhd0RhdGEubGVuZ3RoXTtcbiAgICBsZXQgZ3JhcGggPSBuZXcgbWF0cml4LlNwYXJzZU1hdHJpeChyb3dzLCBjb2xzLCB2YWxzLCBzaXplKTtcblxuICAgIC8vIFRoaXMgd2FzIGEgdmVyeSBzcGVjaWFsbHkgY29uc3RydWN0ZWQgZ3JhcGggd2l0aCBjb25zdGFudCBkZWdyZWUuXG4gICAgLy8gVGhhdCBsZXRzIHVzIGRvIGZhbmN5IHVucGFja2luZyBieSByZXNoYXBpbmcgdGhlIGNzciBtYXRyaXggaW5kaWNlc1xuICAgIC8vIGFuZCBkYXRhLiBEb2luZyBzbyByZWxpZXMgb24gdGhlIGNvbnN0YW50IGRlZ3JlZSBhc3N1bXB0aW9uIVxuXG4gICAgY29uc3Qgbm9ybWVkID0gbWF0cml4Lm5vcm1hbGl6ZShncmFwaCwgbWF0cml4Lk5vcm1UeXBlLmwxKTtcblxuICAgIGNvbnN0IGNzck1hdHJpeCA9IG1hdHJpeC5nZXRDU1Iobm9ybWVkKTtcbiAgICBjb25zdCBuUG9pbnRzID0gdG9UcmFuc2Zvcm0ubGVuZ3RoO1xuXG4gICAgY29uc3QgZUluZGljZXMgPSB1dGlscy5yZXNoYXBlMmQoXG4gICAgICBjc3JNYXRyaXguaW5kaWNlcyxcbiAgICAgIG5Qb2ludHMsXG4gICAgICB0aGlzLm5OZWlnaGJvcnNcbiAgICApO1xuXG4gICAgY29uc3QgZVdlaWdodHMgPSB1dGlscy5yZXNoYXBlMmQoXG4gICAgICBjc3JNYXRyaXgudmFsdWVzLFxuICAgICAgblBvaW50cyxcbiAgICAgIHRoaXMubk5laWdoYm9yc1xuICAgICk7XG5cbiAgICBjb25zdCBlbWJlZGRpbmcgPSBpbml0VHJhbnNmb3JtKGVJbmRpY2VzLCBlV2VpZ2h0cywgdGhpcy5lbWJlZGRpbmcpO1xuXG4gICAgY29uc3QgbkVwb2NocyA9IHRoaXMubkVwb2NocyA/XG4gICAgICB0aGlzLm5FcG9jaHMgLyAzIDpcbiAgICAgIGdyYXBoLm5Sb3dzIDw9IDEwMDAwID9cbiAgICAgICAgMTAwIDpcbiAgICAgICAgMzA7XG5cbiAgICBjb25zdCBncmFwaE1heCA9IGdyYXBoXG4gICAgICAuZ2V0VmFsdWVzKClcbiAgICAgIC5yZWR1Y2UoKG1heCwgdmFsKSA9PiAodmFsID4gbWF4ID8gdmFsIDogbWF4KSwgMCk7XG4gICAgZ3JhcGggPSBncmFwaC5tYXAoKHZhbHVlKSA9PiAodmFsdWUgPCBncmFwaE1heCAvIG5FcG9jaHMgPyAwIDogdmFsdWUpKTtcbiAgICBncmFwaCA9IG1hdHJpeC5lbGltaW5hdGVaZXJvcyhncmFwaCk7XG5cbiAgICBjb25zdCBlcG9jaHNQZXJTYW1wbGUgPSB0aGlzLm1ha2VFcG9jaHNQZXJTYW1wbGUoXG4gICAgICBncmFwaC5nZXRWYWx1ZXMoKSxcbiAgICAgIG5FcG9jaHNcbiAgICApO1xuICAgIGNvbnN0IGhlYWQgPSBncmFwaC5nZXRSb3dzKCk7XG4gICAgY29uc3QgdGFpbCA9IGdyYXBoLmdldENvbHMoKTtcblxuICAgIC8vIEluaXRpYWxpemUgb3B0aW1pemF0aW9uIHNsaWdodGx5IGRpZmZlcmVudGx5IHRoYW4gdGhlIGZpdCBtZXRob2QuXG4gICAgdGhpcy5hc3NpZ25PcHRpbWl6YXRpb25TdGF0ZVBhcmFtZXRlcnMoe1xuICAgICAgaGVhZEVtYmVkZGluZzogZW1iZWRkaW5nLFxuICAgICAgdGFpbEVtYmVkZGluZzogdGhpcy5lbWJlZGRpbmcsXG4gICAgICBoZWFkLFxuICAgICAgdGFpbCxcbiAgICAgIGN1cnJlbnRFcG9jaDogMCxcbiAgICAgIG5FcG9jaHMsXG4gICAgICBuVmVydGljZXM6IGdyYXBoLmdldERpbXMoKVsxXSxcbiAgICAgIGVwb2Noc1BlclNhbXBsZSxcbiAgICB9KTtcbiAgICB0aGlzLnByZXBhcmVGb3JPcHRpbWl6YXRpb25Mb29wKCk7XG5cbiAgICByZXR1cm4gdGhpcy5vcHRpbWl6ZUxheW91dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB3ZSdyZSB1c2luZyBzdXBlcnZpc2VkIHByb2plY3Rpb24sIHRoZW4gcHJvY2VzcyB0aGUgZ3JhcGhcbiAgICogYWNjb3JkaW5nbHkuXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NHcmFwaEZvclN1cGVydmlzZWRQcm9qZWN0aW9uKCkge1xuICAgIGNvbnN0IHtZLCBYfSA9IHRoaXM7XG4gICAgaWYgKFkpIHtcbiAgICAgIGlmIChZLmxlbmd0aCAhPT0gWC5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTGVuZ3RoIG9mIFggYW5kIHkgbXVzdCBiZSBlcXVhbCcpO1xuXG5cbiAgICAgIGlmICh0aGlzLnRhcmdldE1ldHJpYyA9PT0gVGFyZ2V0TWV0cmljLmNhdGVnb3JpY2FsKSB7XG4gICAgICAgIGNvbnN0IGx0ID0gdGhpcy50YXJnZXRXZWlnaHQgPCAxLjA7XG4gICAgICAgIGNvbnN0IGZhckRpc3QgPSBsdCA/IDIuNSAqICgxLjAgLyAoMS4wIC0gdGhpcy50YXJnZXRXZWlnaHQpKSA6IDEuMGUxMjtcbiAgICAgICAgdGhpcy5ncmFwaCA9IHRoaXMuY2F0ZWdvcmljYWxTaW1wbGljaWFsU2V0SW50ZXJzZWN0aW9uKFxuICAgICAgICAgIHRoaXMuZ3JhcGgsXG4gICAgICAgICAgWSxcbiAgICAgICAgICBmYXJEaXN0XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPIChhbmR5Y29lbmVuQCk6IGFkZCBub24tY2F0ZWdvcmljYWwgc3VwZXJ2aXNlZCBlbWJlZGRpbmdzLlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSBzdGVwIHRocm91Z2ggdGhlIG9wdGltaXphdGlvbiBwcm9jZXNzIG9uZSBlcG9jaCBhdCBhIHRpbWUuXG4gICAqL1xuICBzdGVwKCkge1xuICAgIGNvbnN0IHtjdXJyZW50RXBvY2h9ID0gdGhpcy5vcHRpbWl6YXRpb25TdGF0ZTtcblxuICAgIGlmIChjdXJyZW50RXBvY2ggPCB0aGlzLmdldE5FcG9jaHMoKSlcbiAgICAgIHRoaXMub3B0aW1pemVMYXlvdXRTdGVwKGN1cnJlbnRFcG9jaCk7XG5cbiAgICByZXR1cm4gdGhpcy5vcHRpbWl6YXRpb25TdGF0ZS5jdXJyZW50RXBvY2g7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29tcHV0ZWQgcHJvamVjdGVkIGVtYmVkZGluZy5cbiAgICovXG4gIGdldEVtYmVkZGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5lbWJlZGRpbmc7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZSB0aGUgYGBuTmVpZ2hib3JzYGAgbmVhcmVzdCBwb2ludHMgZm9yIGVhY2ggZGF0YSBwb2ludCBpbiBgYFhgYFxuICAgKiBUaGlzIG1heSBiZSBleGFjdCwgYnV0IG1vcmUgbGlrZWx5IGlzIGFwcHJveGltYXRlZCB2aWEgbmVhcmVzdCBuZWlnaGJvclxuICAgKiBkZXNjZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBuZWFyZXN0TmVpZ2hib3JzKFg6IFZlY3Rvcikge1xuICAgIGNvbnN0IHtkaXN0YW5jZUZuLCBuTmVpZ2hib3JzfSA9IHRoaXM7XG4gICAgY29uc3QgbG9nMiA9IChuOiBudW1iZXIpID0+IE1hdGgubG9nKG4pIC8gTWF0aC5sb2coMik7XG4gICAgY29uc3QgbWV0cmljTk5EZXNjZW50ID0gbm5EZXNjZW50Lm1ha2VOTkRlc2NlbnQoZGlzdGFuY2VGbiwgdGhpcy5yYW5kb20pO1xuXG4gICAgLy8gSGFuZGxlIHB5dGhvbjMgcm91bmRpbmcgZG93biBmcm9tIDAuNSBkaXNjcnBhbmN5XG4gICAgY29uc3Qgcm91bmQgPSAobjogbnVtYmVyKSA9PiB7XG4gICAgICByZXR1cm4gbiA9PT0gMC41ID8gMCA6IE1hdGgucm91bmQobik7XG4gICAgfTtcblxuICAgIGNvbnN0IG5UcmVlcyA9IDUgKyBNYXRoLmZsb29yKHJvdW5kKFgubGVuZ3RoICoqIDAuNSAvIDIwLjApKTtcbiAgICBjb25zdCBuSXRlcnMgPSBNYXRoLm1heCg1LCBNYXRoLmZsb29yKE1hdGgucm91bmQobG9nMihYLmxlbmd0aCkpKSk7XG5cbiAgICB0aGlzLnJwRm9yZXN0ID0gdHJlZS5tYWtlRm9yZXN0KFgsIG5OZWlnaGJvcnMsIG5UcmVlcywgdGhpcy5yYW5kb20pO1xuXG4gICAgY29uc3QgbGVhZkFycmF5ID0gdHJlZS5tYWtlTGVhZkFycmF5KHRoaXMucnBGb3Jlc3QpO1xuICAgIGNvbnN0IHtpbmRpY2VzLCB3ZWlnaHRzfSA9IG1ldHJpY05ORGVzY2VudChcbiAgICAgIFgsXG4gICAgICBsZWFmQXJyYXksXG4gICAgICBuTmVpZ2hib3JzLFxuICAgICAgbkl0ZXJzXG4gICAgKTtcbiAgICByZXR1cm4ge2tubkluZGljZXM6IGluZGljZXMsIGtubkRpc3RhbmNlczogd2VpZ2h0c307XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBzZXQgb2YgZGF0YSBYLCBhIG5laWdoYm9yaG9vZCBzaXplLCBhbmQgYSBtZWFzdXJlIG9mIGRpc3RhbmNlXG4gICAqIGNvbXB1dGUgdGhlIGZ1enp5IHNpbXBsaWNpYWwgc2V0IChoZXJlIHJlcHJlc2VudGVkIGFzIGEgZnV6enkgZ3JhcGggaW5cbiAgICogdGhlIGZvcm0gb2YgYSBzcGFyc2UgbWF0cml4KSBhc3NvY2lhdGVkIHRvIHRoZSBkYXRhLiBUaGlzIGlzIGRvbmUgYnlcbiAgICogbG9jYWxseSBhcHByb3hpbWF0aW5nIGdlb2Rlc2ljIGRpc3RhbmNlIGF0IGVhY2ggcG9pbnQsIGNyZWF0aW5nIGEgZnV6enlcbiAgICogc2ltcGxpY2lhbCBzZXQgZm9yIGVhY2ggc3VjaCBwb2ludCwgYW5kIHRoZW4gY29tYmluaW5nIGFsbCB0aGUgbG9jYWxcbiAgICogZnV6enkgc2ltcGxpY2lhbCBzZXRzIGludG8gYSBnbG9iYWwgb25lIHZpYSBhIGZ1enp5IHVuaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBmdXp6eVNpbXBsaWNpYWxTZXQoXG4gICAgWDogVmVjdG9yLFxuICAgIG5OZWlnaGJvcnM6IG51bWJlcixcbiAgICBzZXRPcE1peFJhdGlvID0gMS4wXG4gICkge1xuICAgIGNvbnN0IHtrbm5JbmRpY2VzID0gW10sIGtubkRpc3RhbmNlcyA9IFtdLCBsb2NhbENvbm5lY3Rpdml0eX0gPSB0aGlzO1xuXG4gICAgY29uc3Qge3NpZ21hcywgcmhvc30gPSB0aGlzLnNtb290aEtOTkRpc3RhbmNlKFxuICAgICAga25uRGlzdGFuY2VzLFxuICAgICAgbk5laWdoYm9ycyxcbiAgICAgIGxvY2FsQ29ubmVjdGl2aXR5XG4gICAgKTtcblxuICAgIGNvbnN0IHtyb3dzLCBjb2xzLCB2YWxzfSA9IHRoaXMuY29tcHV0ZU1lbWJlcnNoaXBTdHJlbmd0aHMoXG4gICAgICBrbm5JbmRpY2VzLFxuICAgICAga25uRGlzdGFuY2VzLFxuICAgICAgc2lnbWFzLFxuICAgICAgcmhvc1xuICAgICk7XG5cbiAgICBjb25zdCBzaXplID0gW1gubGVuZ3RoLCBYLmxlbmd0aF07XG4gICAgY29uc3Qgc3BhcnNlTWF0cml4ID0gbmV3IG1hdHJpeC5TcGFyc2VNYXRyaXgocm93cywgY29scywgdmFscywgc2l6ZSk7XG5cbiAgICBjb25zdCB0cmFuc3Bvc2UgPSBtYXRyaXgudHJhbnNwb3NlKHNwYXJzZU1hdHJpeCk7XG4gICAgY29uc3QgcHJvZE1hdHJpeCA9IG1hdHJpeC5wYWlyd2lzZU11bHRpcGx5KHNwYXJzZU1hdHJpeCwgdHJhbnNwb3NlKTtcblxuICAgIGNvbnN0IGEgPSBtYXRyaXguc3VidHJhY3QobWF0cml4LmFkZChzcGFyc2VNYXRyaXgsIHRyYW5zcG9zZSksIHByb2RNYXRyaXgpO1xuICAgIGNvbnN0IGIgPSBtYXRyaXgubXVsdGlwbHlTY2FsYXIoYSwgc2V0T3BNaXhSYXRpbyk7XG4gICAgY29uc3QgYyA9IG1hdHJpeC5tdWx0aXBseVNjYWxhcihwcm9kTWF0cml4LCAxLjAgLSBzZXRPcE1peFJhdGlvKTtcbiAgICBjb25zdCByZXN1bHQgPSBtYXRyaXguYWRkKGIsIGMpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21iaW5lIGEgZnV6enkgc2ltcGxpY2lhbCBzZXQgd2l0aCBhbm90aGVyIGZ1enp5IHNpbXBsaWNpYWwgc2V0XG4gICAqIGdlbmVyYXRlZCBmcm9tIGNhdGVnb3JpY2FsIGRhdGEgdXNpbmcgY2F0ZWdvcmljYWwgZGlzdGFuY2VzLiBUaGUgdGFyZ2V0XG4gICAqIGRhdGEgaXMgYXNzdW1lZCB0byBiZSBjYXRlZ29yaWNhbCBsYWJlbCBkYXRhIChhIHZlY3RvciBvZiBsYWJlbHMpLFxuICAgKiBhbmQgdGhpcyB3aWxsIHVwZGF0ZSB0aGUgZnV6enkgc2ltcGxpY2lhbCBzZXQgdG8gcmVzcGVjdCB0aGF0IGxhYmVsIGRhdGEuXG4gICAqL1xuICBwcml2YXRlIGNhdGVnb3JpY2FsU2ltcGxpY2lhbFNldEludGVyc2VjdGlvbihcbiAgICBzaW1wbGljaWFsU2V0OiBtYXRyaXguU3BhcnNlTWF0cml4LFxuICAgIHRhcmdldDogbnVtYmVyW10sXG4gICAgZmFyRGlzdDogbnVtYmVyLFxuICAgIHVua25vd25EaXN0ID0gMS4wXG4gICkge1xuICAgIGxldCBpbnRlcnNlY3Rpb24gPSBmYXN0SW50ZXJzZWN0aW9uKFxuICAgICAgc2ltcGxpY2lhbFNldCxcbiAgICAgIHRhcmdldCxcbiAgICAgIHVua25vd25EaXN0LFxuICAgICAgZmFyRGlzdFxuICAgICk7XG4gICAgaW50ZXJzZWN0aW9uID0gbWF0cml4LmVsaW1pbmF0ZVplcm9zKGludGVyc2VjdGlvbik7XG4gICAgcmV0dXJuIHJlc2V0TG9jYWxDb25uZWN0aXZpdHkoaW50ZXJzZWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIGEgY29udGludW91cyB2ZXJzaW9uIG9mIHRoZSBkaXN0YW5jZSB0byB0aGUga3RoIG5lYXJlc3RcbiAgICogbmVpZ2hib3IuIFRoYXQgaXMsIHRoaXMgaXMgc2ltaWxhciB0byBrbm4tZGlzdGFuY2UgYnV0IGFsbG93cyBjb250aW51b3VzXG4gICAqIGsgdmFsdWVzIHJhdGhlciB0aGFuIHJlcXVpcmluZyBhbiBpbnRlZ3JhbCBrLiBJbiBlc3NjZW5jZSB3ZSBhcmUgc2ltcGx5XG4gICAqIGNvbXB1dGluZyB0aGUgZGlzdGFuY2Ugc3VjaCB0aGF0IHRoZSBjYXJkaW5hbGl0eSBvZiBmdXp6eSBzZXQgd2UgZ2VuZXJhdGVcbiAgICogaXMgay5cbiAgICovXG4gIHByaXZhdGUgc21vb3RoS05ORGlzdGFuY2UoXG4gICAgZGlzdGFuY2VzOiBWZWN0b3JzLFxuICAgIGs6IG51bWJlcixcbiAgICBsb2NhbENvbm5lY3Rpdml0eSA9IDEuMCxcbiAgICBuSXRlciA9IDY0LFxuICAgIGJhbmR3aWR0aCA9IDEuMFxuICApIHtcbiAgICBjb25zdCB0YXJnZXQgPSAoTWF0aC5sb2coaykgLyBNYXRoLmxvZygyKSkgKiBiYW5kd2lkdGg7XG4gICAgY29uc3QgcmhvID0gdXRpbHMuemVyb3MoZGlzdGFuY2VzLmxlbmd0aCk7XG4gICAgY29uc3QgcmVzdWx0ID0gdXRpbHMuemVyb3MoZGlzdGFuY2VzLmxlbmd0aCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3RhbmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGxvID0gMC4wO1xuICAgICAgbGV0IGhpID0gSW5maW5pdHk7XG4gICAgICBsZXQgbWlkID0gMS4wO1xuXG4gICAgICAvLyBUT0RPOiBUaGlzIGlzIHZlcnkgaW5lZmZpY2llbnQsIGJ1dCB3aWxsIGRvIGZvciBub3cuIEZJWE1FXG4gICAgICBjb25zdCBpdGhEaXN0YW5jZXMgPSBkaXN0YW5jZXNbaV07XG4gICAgICBjb25zdCBub25aZXJvRGlzdHMgPSBpdGhEaXN0YW5jZXMuZmlsdGVyKChkKSA9PiBkID4gMC4wKTtcblxuICAgICAgaWYgKG5vblplcm9EaXN0cy5sZW5ndGggPj0gbG9jYWxDb25uZWN0aXZpdHkpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBNYXRoLmZsb29yKGxvY2FsQ29ubmVjdGl2aXR5KTtcbiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IGxvY2FsQ29ubmVjdGl2aXR5IC0gaW5kZXg7XG4gICAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgICByaG9baV0gPSBub25aZXJvRGlzdHNbaW5kZXggLSAxXTtcbiAgICAgICAgICBpZiAoaW50ZXJwb2xhdGlvbiA+IFNNT09USF9LX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgcmhvW2ldICs9XG4gICAgICAgICAgICAgIGludGVycG9sYXRpb24gKiAobm9uWmVyb0Rpc3RzW2luZGV4XSAtIG5vblplcm9EaXN0c1tpbmRleCAtIDFdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmhvW2ldID0gaW50ZXJwb2xhdGlvbiAqIG5vblplcm9EaXN0c1swXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub25aZXJvRGlzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICByaG9baV0gPSB1dGlscy5tYXgobm9uWmVyb0Rpc3RzKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBuSXRlcjsgbisrKSB7XG4gICAgICAgIGxldCBwc3VtID0gMC4wO1xuICAgICAgICBmb3IgKGxldCBqID0gMTsgaiA8IGRpc3RhbmNlc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGNvbnN0IGQgPSBkaXN0YW5jZXNbaV1bal0gLSByaG9baV07XG4gICAgICAgICAgaWYgKGQgPiAwKVxuICAgICAgICAgICAgcHN1bSArPSBNYXRoLmV4cCgtKGQgLyBtaWQpKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBwc3VtICs9IDEuMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChNYXRoLmFicyhwc3VtIC0gdGFyZ2V0KSA8IFNNT09USF9LX1RPTEVSQU5DRSlcbiAgICAgICAgICBicmVhaztcblxuXG4gICAgICAgIGlmIChwc3VtID4gdGFyZ2V0KSB7XG4gICAgICAgICAgaGkgPSBtaWQ7XG4gICAgICAgICAgbWlkID0gKGxvICsgaGkpIC8gMi4wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvID0gbWlkO1xuICAgICAgICAgIGlmIChoaSA9PT0gSW5maW5pdHkpXG4gICAgICAgICAgICBtaWQgKj0gMjtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBtaWQgPSAobG8gKyBoaSkgLyAyLjA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0W2ldID0gbWlkO1xuXG4gICAgICAvLyBUT0RPOiBUaGlzIGlzIHZlcnkgaW5lZmZpY2llbnQsIGJ1dCB3aWxsIGRvIGZvciBub3cuIEZJWE1FXG4gICAgICBpZiAocmhvW2ldID4gMC4wKSB7XG4gICAgICAgIGNvbnN0IG1lYW5JdGhEaXN0YW5jZXMgPSB1dGlscy5tZWFuKGl0aERpc3RhbmNlcyk7XG4gICAgICAgIGlmIChyZXN1bHRbaV0gPCBNSU5fS19ESVNUX1NDQUxFICogbWVhbkl0aERpc3RhbmNlcylcbiAgICAgICAgICByZXN1bHRbaV0gPSBNSU5fS19ESVNUX1NDQUxFICogbWVhbkl0aERpc3RhbmNlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1lYW5EaXN0YW5jZXMgPSB1dGlscy5tZWFuKGRpc3RhbmNlcy5tYXAodXRpbHMubWVhbikpO1xuICAgICAgICBpZiAocmVzdWx0W2ldIDwgTUlOX0tfRElTVF9TQ0FMRSAqIG1lYW5EaXN0YW5jZXMpXG4gICAgICAgICAgcmVzdWx0W2ldID0gTUlOX0tfRElTVF9TQ0FMRSAqIG1lYW5EaXN0YW5jZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtzaWdtYXM6IHJlc3VsdCwgcmhvczogcmhvfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgdGhlIG1lbWJlcnNoaXAgc3RyZW5ndGggZGF0YSBmb3IgdGhlIDEtc2tlbGV0b24gb2YgZWFjaCBsb2NhbFxuICAgKiBmdXp6eSBzaW1wbGljaWFsIHNldCAtLSB0aGlzIGlzIGZvcm1lZCBhcyBhIHNwYXJzZSBtYXRyaXggd2hlcmUgZWFjaCByb3cgaXNcbiAgICogYSBsb2NhbCBmdXp6eSBzaW1wbGljaWFsIHNldCwgd2l0aCBhIG1lbWJlcnNoaXAgc3RyZW5ndGggZm9yIHRoZVxuICAgKiAxLXNpbXBsZXggdG8gZWFjaCBvdGhlciBkYXRhIHBvaW50LlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlTWVtYmVyc2hpcFN0cmVuZ3RocyhcbiAgICBrbm5JbmRpY2VzOiBWZWN0b3JzLFxuICAgIGtubkRpc3RhbmNlczogVmVjdG9ycyxcbiAgICBzaWdtYXM6IG51bWJlcltdLFxuICAgIHJob3M6IG51bWJlcltdXG4gICk6IHsgcm93czogbnVtYmVyW107IGNvbHM6IG51bWJlcltdOyB2YWxzOiBudW1iZXJbXSB9IHtcbiAgICBjb25zdCBuU2FtcGxlcyA9IGtubkluZGljZXMubGVuZ3RoO1xuICAgIGNvbnN0IG5OZWlnaGJvcnMgPSBrbm5JbmRpY2VzWzBdLmxlbmd0aDtcblxuICAgIGNvbnN0IHJvd3MgPSB1dGlscy56ZXJvcyhuU2FtcGxlcyAqIG5OZWlnaGJvcnMpO1xuICAgIGNvbnN0IGNvbHMgPSB1dGlscy56ZXJvcyhuU2FtcGxlcyAqIG5OZWlnaGJvcnMpO1xuICAgIGNvbnN0IHZhbHMgPSB1dGlscy56ZXJvcyhuU2FtcGxlcyAqIG5OZWlnaGJvcnMpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuU2FtcGxlczsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5OZWlnaGJvcnM7IGorKykge1xuICAgICAgICBsZXQgdmFsID0gMDtcbiAgICAgICAgaWYgKGtubkluZGljZXNbaV1bal0gPT09IC0xKVxuICAgICAgICAgIGNvbnRpbnVlOyAvLyBXZSBkaWRuJ3QgZ2V0IHRoZSBmdWxsIGtubiBmb3IgaVxuXG4gICAgICAgIGlmIChrbm5JbmRpY2VzW2ldW2pdID09PSBpKVxuICAgICAgICAgIHZhbCA9IDAuMDtcbiAgICAgICAgZWxzZSBpZiAoa25uRGlzdGFuY2VzW2ldW2pdIC0gcmhvc1tpXSA8PSAwLjApXG4gICAgICAgICAgdmFsID0gMS4wO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdmFsID0gTWF0aC5leHAoLSgoa25uRGlzdGFuY2VzW2ldW2pdIC0gcmhvc1tpXSkgLyBzaWdtYXNbaV0pKTtcblxuXG4gICAgICAgIHJvd3NbaSAqIG5OZWlnaGJvcnMgKyBqXSA9IGk7XG4gICAgICAgIGNvbHNbaSAqIG5OZWlnaGJvcnMgKyBqXSA9IGtubkluZGljZXNbaV1bal07XG4gICAgICAgIHZhbHNbaSAqIG5OZWlnaGJvcnMgKyBqXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge3Jvd3MsIGNvbHMsIHZhbHN9O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBmdXp6eSBzaW1wbGljaWFsIHNldCBlbWJlZGRpbmcsIHVzaW5nIGEgc3BlY2lmaWVkXG4gICAqIGluaXRpYWxpc2F0aW9uIG1ldGhvZCBhbmQgdGhlbiBtaW5pbWl6aW5nIHRoZSBmdXp6eSBzZXQgY3Jvc3MgZW50cm9weVxuICAgKiBiZXR3ZWVuIHRoZSAxLXNrZWxldG9ucyBvZiB0aGUgaGlnaCBhbmQgbG93IGRpbWVuc2lvbmFsIGZ1enp5IHNpbXBsaWNpYWxcbiAgICogc2V0cy5cbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVNpbXBsaWNpYWxTZXRFbWJlZGRpbmcoKSB7XG4gICAgY29uc3QgbkVwb2NocyA9IHRoaXMuZ2V0TkVwb2NocygpO1xuXG4gICAgY29uc3Qge25Db21wb25lbnRzfSA9IHRoaXM7XG4gICAgY29uc3QgZ3JhcGhWYWx1ZXMgPSB0aGlzLmdyYXBoLmdldFZhbHVlcygpO1xuICAgIGxldCBncmFwaE1heCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncmFwaFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmFsdWUgPSBncmFwaFZhbHVlc1tpXTtcbiAgICAgIGlmIChncmFwaE1heCA8IGdyYXBoVmFsdWVzW2ldKVxuICAgICAgICBncmFwaE1heCA9IHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IGdyYXBoID0gdGhpcy5ncmFwaC5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgPCBncmFwaE1heCAvIG5FcG9jaHMpXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG5cbiAgICAvLyBXZSdyZSBub3QgY29tcHV0aW5nIHRoZSBzcGVjdHJhbCBpbml0aWFsaXphdGlvbiBpbiB0aGlzIGltcGxlbWVudGF0aW9uXG4gICAgLy8gdW50aWwgd2UgZGV0ZXJtaW5lIGEgYmV0dGVyIGVpZ2VudmFsdWUvZWlnZW52ZWN0b3IgY29tcHV0YXRpb25cbiAgICAvLyBhcHByb2FjaFxuICAgIHRoaXMuZW1iZWRkaW5nID0gdXRpbHMuemVyb3MoZ3JhcGgublJvd3MpLm1hcCgoKSA9PiB7XG4gICAgICByZXR1cm4gdXRpbHMuemVyb3MobkNvbXBvbmVudHMpLm1hcCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB1dGlscy50YXVSYW5kKHRoaXMucmFuZG9tKSAqIDIwICsgLTEwOyAvLyBSYW5kb20gZnJvbSAtMTAgdG8gMTBcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gR2V0IGdyYXBoIGRhdGEgaW4gb3JkZXJlZCB3YXkuLi5cbiAgICBjb25zdCB3ZWlnaHRzOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IGhlYWQ6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgdGFpbDogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCByb3dDb2xWYWx1ZXMgPSBncmFwaC5nZXRBbGwoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0NvbFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZW50cnkgPSByb3dDb2xWYWx1ZXNbaV07XG4gICAgICBpZiAoZW50cnkudmFsdWUpIHtcbiAgICAgICAgd2VpZ2h0cy5wdXNoKGVudHJ5LnZhbHVlKTtcbiAgICAgICAgdGFpbC5wdXNoKGVudHJ5LnJvdyk7XG4gICAgICAgIGhlYWQucHVzaChlbnRyeS5jb2wpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlcG9jaHNQZXJTYW1wbGUgPSB0aGlzLm1ha2VFcG9jaHNQZXJTYW1wbGUod2VpZ2h0cywgbkVwb2Nocyk7XG5cbiAgICByZXR1cm4ge2hlYWQsIHRhaWwsIGVwb2Noc1BlclNhbXBsZX07XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBzZXQgb2Ygd2VpZ2h0cyBhbmQgbnVtYmVyIG9mIGVwb2NocyBnZW5lcmF0ZSB0aGUgbnVtYmVyIG9mXG4gICAqIGVwb2NocyBwZXIgc2FtcGxlIGZvciBlYWNoIHdlaWdodC5cbiAgICovXG4gIHByaXZhdGUgbWFrZUVwb2Noc1BlclNhbXBsZSh3ZWlnaHRzOiBudW1iZXJbXSwgbkVwb2NoczogbnVtYmVyKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdXRpbHMuZmlsbGVkKHdlaWdodHMubGVuZ3RoLCAtMS4wKTtcbiAgICBjb25zdCBtYXggPSB1dGlscy5tYXgod2VpZ2h0cyk7XG4gICAgY29uc3QgblNhbXBsZXMgPSB3ZWlnaHRzLm1hcCgodykgPT4gKHcgLyBtYXgpICogbkVwb2Nocyk7XG4gICAgblNhbXBsZXMuZm9yRWFjaCgobiwgaSkgPT4ge1xuICAgICAgaWYgKG4gPiAwKSByZXN1bHRbaV0gPSBuRXBvY2hzIC8gblNhbXBsZXNbaV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ25zIG9wdGltaXphdGlvbiBzdGF0ZSBwYXJhbWV0ZXJzIGZyb20gYSBwYXJ0aWFsIG9wdGltaXphdGlvbiBzdGF0ZS5cbiAgICovXG4gIHByaXZhdGUgYXNzaWduT3B0aW1pemF0aW9uU3RhdGVQYXJhbWV0ZXJzKHN0YXRlOiBQYXJ0aWFsPE9wdGltaXphdGlvblN0YXRlPikge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5vcHRpbWl6YXRpb25TdGF0ZSwgc3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBmZXcgb3B0aW1pemF0aW9uIHN0YXRlIHBhcmFtZXRlcnMgdGhhdCBhcmUgbmVjZXNzYXJ5IGJlZm9yZSBlbnRlcmluZ1xuICAgKiB0aGUgb3B0aW1pemF0aW9uIHN0ZXAgbG9vcC5cbiAgICovXG4gIHByaXZhdGUgcHJlcGFyZUZvck9wdGltaXphdGlvbkxvb3AoKSB7XG4gICAgLy8gSHlwZXJwYXJhbWV0ZXJzXG4gICAgY29uc3Qge3JlcHVsc2lvblN0cmVuZ3RoLCBsZWFybmluZ1JhdGUsIG5lZ2F0aXZlU2FtcGxlUmF0ZX0gPSB0aGlzO1xuXG4gICAgY29uc3Qge1xuICAgICAgZXBvY2hzUGVyU2FtcGxlLFxuICAgICAgaGVhZEVtYmVkZGluZyxcbiAgICAgIHRhaWxFbWJlZGRpbmcsXG4gICAgfSA9IHRoaXMub3B0aW1pemF0aW9uU3RhdGU7XG5cbiAgICBjb25zdCBkaW0gPSBoZWFkRW1iZWRkaW5nWzBdLmxlbmd0aDtcbiAgICBjb25zdCBtb3ZlT3RoZXIgPSBoZWFkRW1iZWRkaW5nLmxlbmd0aCA9PT0gdGFpbEVtYmVkZGluZy5sZW5ndGg7XG5cbiAgICBjb25zdCBlcG9jaHNQZXJOZWdhdGl2ZVNhbXBsZSA9IGVwb2Noc1BlclNhbXBsZS5tYXAoXG4gICAgICAoZSkgPT4gZSAvIG5lZ2F0aXZlU2FtcGxlUmF0ZVxuICAgICk7XG4gICAgY29uc3QgZXBvY2hPZk5leHROZWdhdGl2ZVNhbXBsZSA9IFsuLi5lcG9jaHNQZXJOZWdhdGl2ZVNhbXBsZV07XG4gICAgY29uc3QgZXBvY2hPZk5leHRTYW1wbGUgPSBbLi4uZXBvY2hzUGVyU2FtcGxlXTtcblxuICAgIHRoaXMuYXNzaWduT3B0aW1pemF0aW9uU3RhdGVQYXJhbWV0ZXJzKHtcbiAgICAgIGVwb2NoT2ZOZXh0U2FtcGxlLFxuICAgICAgZXBvY2hPZk5leHROZWdhdGl2ZVNhbXBsZSxcbiAgICAgIGVwb2Noc1Blck5lZ2F0aXZlU2FtcGxlLFxuICAgICAgbW92ZU90aGVyLFxuICAgICAgaW5pdGlhbEFscGhhOiBsZWFybmluZ1JhdGUsXG4gICAgICBhbHBoYTogbGVhcm5pbmdSYXRlLFxuICAgICAgZ2FtbWE6IHJlcHVsc2lvblN0cmVuZ3RoLFxuICAgICAgZGltLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIG9wdGltaXphdGlvbiBzdGF0ZSBmb3Igc3RlcHdpc2Ugb3B0aW1pemF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplT3B0aW1pemF0aW9uKCkge1xuICAgIC8vIEFsZ29yaXRobSBzdGF0ZVxuICAgIGNvbnN0IGhlYWRFbWJlZGRpbmcgPSB0aGlzLmVtYmVkZGluZztcbiAgICBjb25zdCB0YWlsRW1iZWRkaW5nID0gdGhpcy5lbWJlZGRpbmc7XG5cbiAgICAvLyBJbml0aWFsaXplZCBpbiBpbml0aWFsaXplU2ltcGxpY2lhbFNldEVtYmVkZGluZygpXG4gICAgY29uc3Qge2hlYWQsIHRhaWwsIGVwb2Noc1BlclNhbXBsZX0gPSB0aGlzLm9wdGltaXphdGlvblN0YXRlO1xuXG4gICAgY29uc3QgbkVwb2NocyA9IHRoaXMuZ2V0TkVwb2NocygpO1xuICAgIGNvbnN0IG5WZXJ0aWNlcyA9IHRoaXMuZ3JhcGgubkNvbHM7XG5cbiAgICBjb25zdCB7YSwgYn0gPSBmaW5kQUJQYXJhbXModGhpcy5zcHJlYWQsIHRoaXMubWluRGlzdCk7XG5cbiAgICB0aGlzLmFzc2lnbk9wdGltaXphdGlvblN0YXRlUGFyYW1ldGVycyh7XG4gICAgICBoZWFkRW1iZWRkaW5nLFxuICAgICAgdGFpbEVtYmVkZGluZyxcbiAgICAgIGhlYWQsXG4gICAgICB0YWlsLFxuICAgICAgZXBvY2hzUGVyU2FtcGxlLFxuICAgICAgYSxcbiAgICAgIGIsXG4gICAgICBuRXBvY2hzLFxuICAgICAgblZlcnRpY2VzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcHJvdmUgYW4gZW1iZWRkaW5nIHVzaW5nIHN0b2NoYXN0aWMgZ3JhZGllbnQgZGVzY2VudCB0byBtaW5pbWl6ZSB0aGVcbiAgICogZnV6enkgc2V0IGNyb3NzIGVudHJvcHkgYmV0d2VlbiB0aGUgMS1za2VsZXRvbnMgb2YgdGhlIGhpZ2ggZGltZW5zaW9uYWxcbiAgICogYW5kIGxvdyBkaW1lbnNpb25hbCBmdXp6eSBzaW1wbGljaWFsIHNldHMuIEluIHByYWN0aWNlIHRoaXMgaXMgZG9uZSBieVxuICAgKiBzYW1wbGluZyBlZGdlcyBiYXNlZCBvbiB0aGVpciBtZW1iZXJzaGlwIHN0cmVuZ3RoICh3aXRoIHRoZSAoMS1wKSB0ZXJtc1xuICAgKiBjb21pbmcgZnJvbSBuZWdhdGl2ZSBzYW1wbGluZyBzaW1pbGFyIHRvIHdvcmQydmVjKS5cbiAgICovXG4gIHByaXZhdGUgb3B0aW1pemVMYXlvdXRTdGVwKG46IG51bWJlcikge1xuICAgIGNvbnN0IHtvcHRpbWl6YXRpb25TdGF0ZX0gPSB0aGlzO1xuICAgIGNvbnN0IHtcbiAgICAgIGhlYWQsXG4gICAgICB0YWlsLFxuICAgICAgaGVhZEVtYmVkZGluZyxcbiAgICAgIHRhaWxFbWJlZGRpbmcsXG4gICAgICBlcG9jaHNQZXJTYW1wbGUsXG4gICAgICBlcG9jaE9mTmV4dFNhbXBsZSxcbiAgICAgIGVwb2NoT2ZOZXh0TmVnYXRpdmVTYW1wbGUsXG4gICAgICBlcG9jaHNQZXJOZWdhdGl2ZVNhbXBsZSxcbiAgICAgIG1vdmVPdGhlcixcbiAgICAgIGluaXRpYWxBbHBoYSxcbiAgICAgIGFscGhhLFxuICAgICAgZ2FtbWEsXG4gICAgICBhLFxuICAgICAgYixcbiAgICAgIGRpbSxcbiAgICAgIG5FcG9jaHMsXG4gICAgICBuVmVydGljZXMsXG4gICAgfSA9IG9wdGltaXphdGlvblN0YXRlO1xuXG4gICAgY29uc3QgY2xpcFZhbHVlID0gNC4wO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlcG9jaHNQZXJTYW1wbGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChlcG9jaE9mTmV4dFNhbXBsZVtpXSA+IG4pXG4gICAgICAgIGNvbnRpbnVlO1xuXG5cbiAgICAgIGNvbnN0IGogPSBoZWFkW2ldO1xuICAgICAgY29uc3QgayA9IHRhaWxbaV07XG5cbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBoZWFkRW1iZWRkaW5nW2pdO1xuICAgICAgY29uc3Qgb3RoZXIgPSB0YWlsRW1iZWRkaW5nW2tdO1xuXG4gICAgICBjb25zdCBkaXN0U3F1YXJlZCA9IHJEaXN0KGN1cnJlbnQsIG90aGVyKTtcblxuICAgICAgbGV0IGdyYWRDb2VmZiA9IDA7XG4gICAgICBpZiAoZGlzdFNxdWFyZWQgPiAwKSB7XG4gICAgICAgIGdyYWRDb2VmZiA9IC0yLjAgKiBhICogYiAqIE1hdGgucG93KGRpc3RTcXVhcmVkLCBiIC0gMS4wKTtcbiAgICAgICAgZ3JhZENvZWZmIC89IGEgKiBNYXRoLnBvdyhkaXN0U3F1YXJlZCwgYikgKyAxLjA7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgZGltOyBkKyspIHtcbiAgICAgICAgY29uc3QgZ3JhZEQgPSBjbGlwKGdyYWRDb2VmZiAqIChjdXJyZW50W2RdIC0gb3RoZXJbZF0pLCBjbGlwVmFsdWUpO1xuICAgICAgICBjdXJyZW50W2RdICs9IGdyYWREICogYWxwaGE7XG4gICAgICAgIGlmIChtb3ZlT3RoZXIpXG4gICAgICAgICAgb3RoZXJbZF0gKz0gLWdyYWREICogYWxwaGE7XG4gICAgICB9XG5cbiAgICAgIGVwb2NoT2ZOZXh0U2FtcGxlW2ldICs9IGVwb2Noc1BlclNhbXBsZVtpXTtcblxuICAgICAgY29uc3Qgbk5lZ1NhbXBsZXMgPSBNYXRoLmZsb29yKFxuICAgICAgICAobiAtIGVwb2NoT2ZOZXh0TmVnYXRpdmVTYW1wbGVbaV0pIC8gZXBvY2hzUGVyTmVnYXRpdmVTYW1wbGVbaV1cbiAgICAgICk7XG5cbiAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgbk5lZ1NhbXBsZXM7IHArKykge1xuICAgICAgICBjb25zdCBrID0gdXRpbHMudGF1UmFuZEludChuVmVydGljZXMsIHRoaXMucmFuZG9tKTtcbiAgICAgICAgY29uc3Qgb3RoZXIgPSB0YWlsRW1iZWRkaW5nW2tdO1xuXG4gICAgICAgIGNvbnN0IGRpc3RTcXVhcmVkID0gckRpc3QoY3VycmVudCwgb3RoZXIpO1xuXG4gICAgICAgIGxldCBncmFkQ29lZmYgPSAwLjA7XG4gICAgICAgIGlmIChkaXN0U3F1YXJlZCA+IDAuMCkge1xuICAgICAgICAgIGdyYWRDb2VmZiA9IDIuMCAqIGdhbW1hICogYjtcbiAgICAgICAgICBncmFkQ29lZmYgLz1cbiAgICAgICAgICAgICgwLjAwMSArIGRpc3RTcXVhcmVkKSAqIChhICogTWF0aC5wb3coZGlzdFNxdWFyZWQsIGIpICsgMSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaiA9PT0gaykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBkaW07IGQrKykge1xuICAgICAgICAgIGxldCBncmFkRCA9IDQuMDtcbiAgICAgICAgICBpZiAoZ3JhZENvZWZmID4gMC4wKVxuICAgICAgICAgICAgZ3JhZEQgPSBjbGlwKGdyYWRDb2VmZiAqIChjdXJyZW50W2RdIC0gb3RoZXJbZF0pLCBjbGlwVmFsdWUpO1xuXG4gICAgICAgICAgY3VycmVudFtkXSArPSBncmFkRCAqIGFscGhhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlcG9jaE9mTmV4dE5lZ2F0aXZlU2FtcGxlW2ldICs9IG5OZWdTYW1wbGVzICogZXBvY2hzUGVyTmVnYXRpdmVTYW1wbGVbaV07XG4gICAgfVxuICAgIG9wdGltaXphdGlvblN0YXRlLmFscGhhID0gaW5pdGlhbEFscGhhICogKDEuMCAtIG4gLyBuRXBvY2hzKTtcblxuICAgIG9wdGltaXphdGlvblN0YXRlLmN1cnJlbnRFcG9jaCArPSAxO1xuICAgIHJldHVybiBoZWFkRW1iZWRkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcHJvdmUgYW4gZW1iZWRkaW5nIHVzaW5nIHN0b2NoYXN0aWMgZ3JhZGllbnQgZGVzY2VudCB0byBtaW5pbWl6ZSB0aGVcbiAgICogZnV6enkgc2V0IGNyb3NzIGVudHJvcHkgYmV0d2VlbiB0aGUgMS1za2VsZXRvbnMgb2YgdGhlIGhpZ2ggZGltZW5zaW9uYWxcbiAgICogYW5kIGxvdyBkaW1lbnNpb25hbCBmdXp6eSBzaW1wbGljaWFsIHNldHMuIEluIHByYWN0aWNlIHRoaXMgaXMgZG9uZSBieVxuICAgKiBzYW1wbGluZyBlZGdlcyBiYXNlZCBvbiB0aGVpciBtZW1iZXJzaGlwIHN0cmVuZ3RoICh3aXRoIHRoZSAoMS1wKSB0ZXJtc1xuICAgKiBjb21pbmcgZnJvbSBuZWdhdGl2ZSBzYW1wbGluZyBzaW1pbGFyIHRvIHdvcmQydmVjKS5cbiAgICovXG4gIHByaXZhdGUgb3B0aW1pemVMYXlvdXRBc3luYyhcbiAgICBlcG9jaENhbGxiYWNrOiAoZXBvY2hOdW1iZXI6IG51bWJlcikgPT4gdm9pZCB8IGJvb2xlYW4gPSAoKSA9PiB0cnVlXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzdGVwID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHtuRXBvY2hzLCBjdXJyZW50RXBvY2h9ID0gdGhpcy5vcHRpbWl6YXRpb25TdGF0ZTtcbiAgICAgICAgICB0aGlzLmVtYmVkZGluZyA9IHRoaXMub3B0aW1pemVMYXlvdXRTdGVwKGN1cnJlbnRFcG9jaCk7XG4gICAgICAgICAgY29uc3QgZXBvY2hDb21wbGV0ZWQgPSB0aGlzLm9wdGltaXphdGlvblN0YXRlLmN1cnJlbnRFcG9jaDtcbiAgICAgICAgICBjb25zdCBzaG91bGRTdG9wID0gZXBvY2hDYWxsYmFjayhlcG9jaENvbXBsZXRlZCkgPT09IGZhbHNlO1xuICAgICAgICAgIGNvbnN0IGlzRmluaXNoZWQgPSBlcG9jaENvbXBsZXRlZCA9PT0gbkVwb2NocztcbiAgICAgICAgICBpZiAoIXNob3VsZFN0b3AgJiYgIWlzRmluaXNoZWQpXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHN0ZXAoKSwgMCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoaXNGaW5pc2hlZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBzdGVwKCksIDApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcHJvdmUgYW4gZW1iZWRkaW5nIHVzaW5nIHN0b2NoYXN0aWMgZ3JhZGllbnQgZGVzY2VudCB0byBtaW5pbWl6ZSB0aGVcbiAgICogZnV6enkgc2V0IGNyb3NzIGVudHJvcHkgYmV0d2VlbiB0aGUgMS1za2VsZXRvbnMgb2YgdGhlIGhpZ2ggZGltZW5zaW9uYWxcbiAgICogYW5kIGxvdyBkaW1lbnNpb25hbCBmdXp6eSBzaW1wbGljaWFsIHNldHMuIEluIHByYWN0aWNlIHRoaXMgaXMgZG9uZSBieVxuICAgKiBzYW1wbGluZyBlZGdlcyBiYXNlZCBvbiB0aGVpciBtZW1iZXJzaGlwIHN0cmVuZ3RoICh3aXRoIHRoZSAoMS1wKSB0ZXJtc1xuICAgKiBjb21pbmcgZnJvbSBuZWdhdGl2ZSBzYW1wbGluZyBzaW1pbGFyIHRvIHdvcmQydmVjKS5cbiAgICovXG4gIHByaXZhdGUgb3B0aW1pemVMYXlvdXQoXG4gICAgZXBvY2hDYWxsYmFjazogKGVwb2NoTnVtYmVyOiBudW1iZXIpID0+IHZvaWQgfCBib29sZWFuID0gKCkgPT4gdHJ1ZVxuICApOiBWZWN0b3JzIHtcbiAgICBsZXQgaXNGaW5pc2hlZCA9IGZhbHNlO1xuICAgIGxldCBlbWJlZGRpbmc6IFZlY3RvcnMgPSBbXTtcbiAgICB3aGlsZSAoIWlzRmluaXNoZWQpIHtcbiAgICAgIGNvbnN0IHtuRXBvY2hzLCBjdXJyZW50RXBvY2h9ID0gdGhpcy5vcHRpbWl6YXRpb25TdGF0ZTtcbiAgICAgIGVtYmVkZGluZyA9IHRoaXMub3B0aW1pemVMYXlvdXRTdGVwKGN1cnJlbnRFcG9jaCk7XG4gICAgICBjb25zdCBlcG9jaENvbXBsZXRlZCA9IHRoaXMub3B0aW1pemF0aW9uU3RhdGUuY3VycmVudEVwb2NoO1xuICAgICAgY29uc3Qgc2hvdWxkU3RvcCA9IGVwb2NoQ2FsbGJhY2soZXBvY2hDb21wbGV0ZWQpID09PSBmYWxzZTtcbiAgICAgIGlzRmluaXNoZWQgPSBlcG9jaENvbXBsZXRlZCA9PT0gbkVwb2NocyB8fCBzaG91bGRTdG9wO1xuICAgIH1cbiAgICByZXR1cm4gZW1iZWRkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiBlcG9jaHMgZm9yIG9wdGltaXppbmcgdGhlIHByb2plY3Rpb24uXG4gICAqIE5PVEU6IFRoaXMgaGV1cmlzdGljIGRpZmZlcnMgZnJvbSB0aGUgcHl0aG9uIHZlcnNpb25cbiAgICovXG4gIHB1YmxpYyBnZXRORXBvY2hzKCkge1xuICAgIGNvbnN0IGdyYXBoID0gdGhpcy5ncmFwaDtcblxuICAgIGlmICh0aGlzLm5FcG9jaHMgPiAwKVxuICAgICAgcmV0dXJuIHRoaXMubkVwb2NocztcblxuXG4gICAgaWYgKCFncmFwaClcbiAgICAgIHJldHVybiAyMDA7XG5cblxuICAgIGNvbnN0IGxlbmd0aCA9IGdyYXBoLm5Sb3dzO1xuICAgIGlmIChsZW5ndGggPD0gMjUwMClcbiAgICAgIHJldHVybiA1MDA7XG4gICAgZWxzZSBpZiAobGVuZ3RoIDw9IDUwMDApXG4gICAgICByZXR1cm4gNDAwO1xuICAgIGVsc2UgaWYgKGxlbmd0aCA8PSA3NTAwKVxuICAgICAgcmV0dXJuIDMwMDtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gMjAwO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldWNsaWRlYW4oeDogVmVjdG9yLCB5OiBWZWN0b3IpIHtcbiAgbGV0IHJlc3VsdCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKylcbiAgICByZXN1bHQgKz0gKHhbaV0gLSB5W2ldKSAqKiAyO1xuXG4gIHJldHVybiBNYXRoLnNxcnQocmVzdWx0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG51bWVyaWMoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgY29uc3QgcmVzdWx0ID0gTWF0aC5hYnMoeCAtIHkpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29zaW5lKHg6IFZlY3RvciwgeTogVmVjdG9yKSB7XG4gIGxldCByZXN1bHQgPSAwLjA7XG4gIGxldCBub3JtWCA9IDAuMDtcbiAgbGV0IG5vcm1ZID0gMC4wO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgIHJlc3VsdCArPSB4W2ldICogeVtpXTtcbiAgICBub3JtWCArPSB4W2ldICoqIDI7XG4gICAgbm9ybVkgKz0geVtpXSAqKiAyO1xuICB9XG5cbiAgaWYgKG5vcm1YID09PSAwICYmIG5vcm1ZID09PSAwKVxuICAgIHJldHVybiAwO1xuICBlbHNlIGlmIChub3JtWCA9PT0gMCB8fCBub3JtWSA9PT0gMClcbiAgICByZXR1cm4gMS4wO1xuICBlbHNlXG4gICAgcmV0dXJuIDEuMCAtIHJlc3VsdCAvIE1hdGguc3FydChub3JtWCAqIG5vcm1ZKTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgcmVwcmVzZW50aW5nIHRoZSBvcHRpbWl6YXRpb24gc3RhdGUgdHJhY2tlZCBiZXR3ZWVuIHN0ZXBzIG9mXG4gKiB0aGUgU0dEIG9wdGltaXphdGlvblxuICovXG5jbGFzcyBPcHRpbWl6YXRpb25TdGF0ZSB7XG4gIGN1cnJlbnRFcG9jaCA9IDA7XG5cbiAgLy8gRGF0YSB0cmFja2VkIGR1cmluZyBvcHRpbWl6YXRpb24gc3RlcHMuXG4gIGhlYWRFbWJlZGRpbmc6IG51bWJlcltdW10gPSBbXTtcbiAgdGFpbEVtYmVkZGluZzogbnVtYmVyW11bXSA9IFtdO1xuICBoZWFkOiBudW1iZXJbXSA9IFtdO1xuICB0YWlsOiBudW1iZXJbXSA9IFtdO1xuICBlcG9jaHNQZXJTYW1wbGU6IG51bWJlcltdID0gW107XG4gIGVwb2NoT2ZOZXh0U2FtcGxlOiBudW1iZXJbXSA9IFtdO1xuICBlcG9jaE9mTmV4dE5lZ2F0aXZlU2FtcGxlOiBudW1iZXJbXSA9IFtdO1xuICBlcG9jaHNQZXJOZWdhdGl2ZVNhbXBsZTogbnVtYmVyW10gPSBbXTtcbiAgbW92ZU90aGVyID0gdHJ1ZTtcbiAgaW5pdGlhbEFscGhhID0gMS4wO1xuICBhbHBoYSA9IDEuMDtcbiAgZ2FtbWEgPSAxLjA7XG4gIGEgPSAxLjU3Njk0MzQ2MDMxMTMwNzc7XG4gIGIgPSAwLjg5NTA2MDg3NzkxMDk3MzM7XG4gIGRpbSA9IDI7XG4gIG5FcG9jaHMgPSA1MDA7XG4gIG5WZXJ0aWNlcyA9IDA7XG59XG5cbi8qKlxuICogU3RhbmRhcmQgY2xhbXBpbmcgb2YgYSB2YWx1ZSBpbnRvIGEgZml4ZWQgcmFuZ2VcbiAqL1xuZnVuY3Rpb24gY2xpcCh4OiBudW1iZXIsIGNsaXBWYWx1ZTogbnVtYmVyKSB7XG4gIGlmICh4ID4gY2xpcFZhbHVlKSByZXR1cm4gY2xpcFZhbHVlO1xuICBlbHNlIGlmICh4IDwgLWNsaXBWYWx1ZSkgcmV0dXJuIC1jbGlwVmFsdWU7XG4gIGVsc2UgcmV0dXJuIHg7XG59XG5cbi8qKlxuICogUmVkdWNlZCBFdWNsaWRlYW4gZGlzdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIHJEaXN0KHg6IG51bWJlcltdLCB5OiBudW1iZXJbXSkge1xuICBsZXQgcmVzdWx0ID0gMC4wO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspXG4gICAgcmVzdWx0ICs9IE1hdGgucG93KHhbaV0gLSB5W2ldLCAyKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZpdCBhLCBiIHBhcmFtcyBmb3IgdGhlIGRpZmZlcmVudGlhYmxlIGN1cnZlIHVzZWQgaW4gbG93ZXJcbiAqIGRpbWVuc2lvbmFsIGZ1enp5IHNpbXBsaWNpYWwgY29tcGxleCBjb25zdHJ1Y3Rpb24uIFdlIHdhbnQgdGhlXG4gKiBzbW9vdGggY3VydmUgKGZyb20gYSBwcmUtZGVmaW5lZCBmYW1pbHkgd2l0aCBzaW1wbGUgZ3JhZGllbnQpIHRoYXRcbiAqIGJlc3QgbWF0Y2hlcyBhbiBvZmZzZXQgZXhwb25lbnRpYWwgZGVjYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQUJQYXJhbXMoc3ByZWFkOiBudW1iZXIsIG1pbkRpc3Q6IG51bWJlcikge1xuICBjb25zdCBjdXJ2ZSA9IChbYSwgYl06IG51bWJlcltdKSA9PiAoeDogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIDEuMCAvICgxLjAgKyBhICogeCAqKiAoMiAqIGIpKTtcbiAgfTtcblxuICBjb25zdCB4diA9IHV0aWxzXG4gICAgLmxpbmVhcigwLCBzcHJlYWQgKiAzLCAzMDApXG4gICAgLm1hcCgodmFsKSA9PiAodmFsIDwgbWluRGlzdCA/IDEuMCA6IHZhbCkpO1xuXG4gIGNvbnN0IHl2ID0gdXRpbHMuemVyb3MoeHYubGVuZ3RoKS5tYXAoKHZhbCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBndGUgPSB4dltpbmRleF0gPj0gbWluRGlzdDtcbiAgICByZXR1cm4gZ3RlID8gTWF0aC5leHAoLSh4dltpbmRleF0gLSBtaW5EaXN0KSAvIHNwcmVhZCkgOiB2YWw7XG4gIH0pO1xuXG4gIGNvbnN0IGluaXRpYWxWYWx1ZXMgPSBbMC41LCAwLjVdO1xuICBjb25zdCBkYXRhID0ge3g6IHh2LCB5OiB5dn07XG5cbiAgLy8gRGVmYXVsdCBvcHRpb25zIGZvciB0aGUgYWxnb3JpdGhtIChmcm9tIGdpdGh1YiBleGFtcGxlKVxuICBjb25zdCBvcHRpb25zID0ge1xuICAgIGRhbXBpbmc6IDEuNSxcbiAgICBpbml0aWFsVmFsdWVzLFxuICAgIGdyYWRpZW50RGlmZmVyZW5jZTogMTBlLTIsXG4gICAgbWF4SXRlcmF0aW9uczogMTAwLFxuICAgIGVycm9yVG9sZXJhbmNlOiAxMGUtMyxcbiAgfTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICBjb25zdCB7cGFyYW1ldGVyVmFsdWVzfSA9IExNKGRhdGEsIGN1cnZlLCBvcHRpb25zKTtcbiAgY29uc3QgW2EsIGJdID0gcGFyYW1ldGVyVmFsdWVzIGFzIG51bWJlcltdO1xuICByZXR1cm4ge2EsIGJ9O1xufVxuXG4vKipcbiAqIFVuZGVyIHRoZSBhc3N1bXB0aW9uIG9mIGNhdGVnb3JpY2FsIGRpc3RhbmNlIGZvciB0aGUgaW50ZXJzZWN0aW5nXG4gKiBzaW1wbGljaWFsIHNldCBwZXJmb3JtIGEgZmFzdCBpbnRlcnNlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXN0SW50ZXJzZWN0aW9uKFxuICBncmFwaDogbWF0cml4LlNwYXJzZU1hdHJpeCxcbiAgdGFyZ2V0OiBudW1iZXJbXSxcbiAgdW5rbm93bkRpc3QgPSAxLjAsXG4gIGZhckRpc3QgPSA1LjBcbikge1xuICByZXR1cm4gZ3JhcGgubWFwKCh2YWx1ZSwgcm93LCBjb2wpID0+IHtcbiAgICBpZiAodGFyZ2V0W3Jvd10gPT09IC0xIHx8IHRhcmdldFtjb2xdID09PSAtMSlcbiAgICAgIHJldHVybiB2YWx1ZSAqIE1hdGguZXhwKC11bmtub3duRGlzdCk7XG4gICAgZWxzZSBpZiAodGFyZ2V0W3Jvd10gIT09IHRhcmdldFtjb2xdKVxuICAgICAgcmV0dXJuIHZhbHVlICogTWF0aC5leHAoLWZhckRpc3QpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVzZXQgdGhlIGxvY2FsIGNvbm5lY3Rpdml0eSByZXF1aXJlbWVudCAtLSBlYWNoIGRhdGEgc2FtcGxlIHNob3VsZFxuICogaGF2ZSBjb21wbGV0ZSBjb25maWRlbmNlIGluIGF0IGxlYXN0IG9uZSAxLXNpbXBsZXggaW4gdGhlIHNpbXBsaWNpYWwgc2V0LlxuICogV2UgY2FuIGVuZm9yY2UgdGhpcyBieSBsb2NhbGx5IHJlc2NhbGluZyBjb25maWRlbmNlcywgYW5kIHRoZW4gcmVtZXJnaW5nIHRoZVxuICogZGlmZmVyZW50IGxvY2FsIHNpbXBsaWNpYWwgc2V0cyB0b2dldGhlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0TG9jYWxDb25uZWN0aXZpdHkoc2ltcGxpY2lhbFNldDogbWF0cml4LlNwYXJzZU1hdHJpeCkge1xuICBzaW1wbGljaWFsU2V0ID0gbWF0cml4Lm5vcm1hbGl6ZShzaW1wbGljaWFsU2V0LCBtYXRyaXguTm9ybVR5cGUubWF4KTtcbiAgY29uc3QgdHJhbnNwb3NlID0gbWF0cml4LnRyYW5zcG9zZShzaW1wbGljaWFsU2V0KTtcbiAgY29uc3QgcHJvZE1hdHJpeCA9IG1hdHJpeC5wYWlyd2lzZU11bHRpcGx5KHRyYW5zcG9zZSwgc2ltcGxpY2lhbFNldCk7XG4gIHNpbXBsaWNpYWxTZXQgPSBtYXRyaXguYWRkKFxuICAgIHNpbXBsaWNpYWxTZXQsXG4gICAgbWF0cml4LnN1YnRyYWN0KHRyYW5zcG9zZSwgcHJvZE1hdHJpeClcbiAgKTtcbiAgcmV0dXJuIG1hdHJpeC5lbGltaW5hdGVaZXJvcyhzaW1wbGljaWFsU2V0KTtcbn1cblxuLyoqXG4gKiBHaXZlbiBpbmRpY2VzIGFuZCB3ZWlnaHRzIGFuZCBhbiBvcmlnaW5hbCBlbWJlZGRpbmdzXG4gKiBpbml0aWFsaXplIHRoZSBwb3NpdGlvbnMgb2YgbmV3IHBvaW50cyByZWxhdGl2ZSB0byB0aGVcbiAqIGluZGljZXMgYW5kIHdlaWdodHMgKG9mIHRoZWlyIG5laWdoYm9ycyBpbiB0aGUgc291cmNlIGRhdGEpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFRyYW5zZm9ybShcbiAgaW5kaWNlczogbnVtYmVyW11bXSxcbiAgd2VpZ2h0czogbnVtYmVyW11bXSxcbiAgZW1iZWRkaW5nOiBWZWN0b3JzXG4pIHtcbiAgY29uc3QgcmVzdWx0ID0gdXRpbHNcbiAgICAuemVyb3MoaW5kaWNlcy5sZW5ndGgpXG4gICAgLm1hcCgoX3opID0+IHV0aWxzLnplcm9zKGVtYmVkZGluZ1swXS5sZW5ndGgpKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGluZGljZXNbMF0ubGVuZ3RoOyBqKyspIHtcbiAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgZW1iZWRkaW5nWzBdLmxlbmd0aDsgZCsrKSB7XG4gICAgICAgIGNvbnN0IGEgPSBpbmRpY2VzW2ldW2pdO1xuICAgICAgICByZXN1bHRbaV1bZF0gKz0gd2VpZ2h0c1tpXVtqXSAqIGVtYmVkZGluZ1thXVtkXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==","/**\n * @license\n *\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ==============================================================================\n */\n/**\n * This is a JavaScript reimplementation of UMAP (original license below), from\n * the python implementation found at https://github.com/lmcinnes/umap.\n *\n * @author andycoenen@google.com (Andy Coenen)\n */\n/**\n * @license\n * BSD 3-Clause License\n *\n * Copyright (c) 2017, Leland McInnes\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * * Neither the name of the copyright holder nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport * as heap from './heap';\nimport * as matrix from './matrix';\nimport * as tree from './tree';\nimport * as utils from './utils';\n/**\n * Create a version of nearest neighbor descent.\n */\nexport function makeNNDescent(distanceFn, random) {\n return function nNDescent(data, leafArray, nNeighbors, nIters = 10, maxCandidates = 50, delta = 0.001, rho = 0.5, rpTreeInit = true) {\n const nVertices = data.length;\n const currentGraph = heap.makeHeap(data.length, nNeighbors);\n for (let i = 0; i < data.length; i++) {\n const indices = heap.rejectionSample(nNeighbors, data.length, random);\n for (let j = 0; j < indices.length; j++) {\n const d = distanceFn(data[i], data[indices[j]]);\n heap.heapPush(currentGraph, i, d, indices[j], 1);\n heap.heapPush(currentGraph, indices[j], d, i, 1);\n }\n }\n if (rpTreeInit) {\n for (let n = 0; n < leafArray.length; n++) {\n for (let i = 0; i < leafArray[n].length; i++) {\n if (leafArray[n][i] < 0)\n break;\n for (let j = i + 1; j < leafArray[n].length; j++) {\n if (leafArray[n][j] < 0)\n break;\n const d = distanceFn(data[leafArray[n][i]], data[leafArray[n][j]]);\n heap.heapPush(currentGraph, leafArray[n][i], d, leafArray[n][j], 1);\n heap.heapPush(currentGraph, leafArray[n][j], d, leafArray[n][i], 1);\n }\n }\n }\n }\n for (let n = 0; n < nIters; n++) {\n const candidateNeighbors = heap.buildCandidates(currentGraph, nVertices, nNeighbors, maxCandidates, random);\n let c = 0;\n for (let i = 0; i < nVertices; i++) {\n for (let j = 0; j < maxCandidates; j++) {\n const p = Math.floor(candidateNeighbors[0][i][j]);\n if (p < 0 || utils.tauRand(random) < rho)\n continue;\n for (let k = 0; k < maxCandidates; k++) {\n const q = Math.floor(candidateNeighbors[0][i][k]);\n const cj = candidateNeighbors[2][i][j];\n const ck = candidateNeighbors[2][i][k];\n if (q < 0 || (!cj && !ck))\n continue;\n const d = distanceFn(data[p], data[q]);\n c += heap.heapPush(currentGraph, p, d, q, 1);\n c += heap.heapPush(currentGraph, q, d, p, 1);\n }\n }\n }\n if (c <= delta * nNeighbors * data.length)\n break;\n }\n const sorted = heap.deheapSort(currentGraph);\n return sorted;\n };\n}\nexport function makeInitializations(distanceFn) {\n function initFromRandom(nNeighbors, data, queryPoints, _heap, random) {\n for (let i = 0; i < queryPoints.length; i++) {\n const indices = utils.rejectionSample(nNeighbors, data.length, random);\n for (let j = 0; j < indices.length; j++) {\n if (indices[j] < 0)\n continue;\n const d = distanceFn(data[indices[j]], queryPoints[i]);\n heap.heapPush(_heap, i, d, indices[j], 1);\n }\n }\n }\n function initFromTree(_tree, data, queryPoints, _heap, random) {\n for (let i = 0; i < queryPoints.length; i++) {\n const indices = tree.searchFlatTree(queryPoints[i], _tree, random);\n for (let j = 0; j < indices.length; j++) {\n if (indices[j] < 0)\n return;\n const d = distanceFn(data[indices[j]], queryPoints[i]);\n heap.heapPush(_heap, i, d, indices[j], 1);\n }\n }\n return;\n }\n return { initFromRandom, initFromTree };\n}\nexport function makeInitializedNNSearch(distanceFn) {\n return function nnSearchFn(data, graph, initialization, queryPoints) {\n const { indices, indptr } = matrix.getCSR(graph);\n for (let i = 0; i < queryPoints.length; i++) {\n const tried = new Set(initialization[0][i]);\n while (true) {\n // Find smallest flagged vertex\n const vertex = heap.smallestFlagged(initialization, i);\n if (vertex === -1)\n break;\n const candidates = indices.slice(indptr[vertex], indptr[vertex + 1]);\n for (const candidate of candidates) {\n if (candidate === vertex ||\n candidate === -1 ||\n tried.has(candidate))\n continue;\n const d = distanceFn(data[candidate], queryPoints[i]);\n heap.uncheckedHeapPush(initialization, i, d, candidate, 1);\n tried.add(candidate);\n }\n }\n }\n return initialization;\n };\n}\nexport function initializeSearch(forest, data, queryPoints, nNeighbors, initFromRandom, initFromTree, random) {\n const results = heap.makeHeap(queryPoints.length, nNeighbors);\n initFromRandom(nNeighbors, data, queryPoints, results, random);\n if (forest) {\n for (const tree of forest)\n initFromTree(tree, data, queryPoints, results, random);\n }\n return results;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm5fZGVzY2VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5uX2Rlc2NlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE9BQU8sS0FBSyxJQUFJLE1BQU0sUUFBUSxDQUFDO0FBQy9CLE9BQU8sS0FBSyxNQUFNLE1BQU0sVUFBVSxDQUFDO0FBQ25DLE9BQU8sS0FBSyxJQUFJLE1BQU0sUUFBUSxDQUFDO0FBQy9CLE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBR2pDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxVQUFzQixFQUFFLE1BQWdCO0lBQ3BFLE9BQU8sU0FBUyxTQUFTLENBQ3ZCLElBQVksRUFDWixTQUFrQixFQUNsQixVQUFrQixFQUNsQixNQUFNLEdBQUcsRUFBRSxFQUNYLGFBQWEsR0FBRyxFQUFFLEVBQ2xCLEtBQUssR0FBRyxLQUFLLEVBQ2IsR0FBRyxHQUFHLEdBQUcsRUFDVCxVQUFVLEdBQUcsSUFBSTtRQUVqQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzlCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUU1RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3RFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxF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TSxTQUFTLElBQUksVUFBVSxFQUFFO29CQUNsQyxJQUNFLFNBQVMsS0FBSyxNQUFNO3dCQUNwQixTQUFTLEtBQUssQ0FBQyxDQUFDO3dCQUNoQixLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQzt3QkFFcEIsU0FBUztvQkFFWCxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN0RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMzRCxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUN0QjthQUNGO1NBQ0Y7UUFDRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixNQUF1QixFQUN2QixJQUFZLEVBQ1osV0FBbUIsRUFDbkIsVUFBa0IsRUFDbEIsY0FBZ0MsRUFDaEMsWUFBNEIsRUFDNUIsTUFBZ0I7SUFFaEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlELGNBQWMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0QsSUFBSSxNQUFNLEVBQUU7UUFDVixLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU07WUFDdkIsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztLQUMxRDtJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBKYXZhU2NyaXB0IHJlaW1wbGVtZW50YXRpb24gb2YgVU1BUCAob3JpZ2luYWwgbGljZW5zZSBiZWxvdyksIGZyb21cbiAqIHRoZSBweXRob24gaW1wbGVtZW50YXRpb24gZm91bmQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2xtY2lubmVzL3VtYXAuXG4gKlxuICogQGF1dGhvciBhbmR5Y29lbmVuQGdvb2dsZS5jb20gKEFuZHkgQ29lbmVuKVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIEJTRCAzLUNsYXVzZSBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE3LCBMZWxhbmQgTWNJbm5lc1xuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBoZWFwIGZyb20gJy4vaGVhcCc7XG5pbXBvcnQgKiBhcyBtYXRyaXggZnJvbSAnLi9tYXRyaXgnO1xuaW1wb3J0ICogYXMgdHJlZSBmcm9tICcuL3RyZWUnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge1JhbmRvbUZuLCBWZWN0b3JzLCBEaXN0YW5jZUZuLCBWZWN0b3J9IGZyb20gJy4vdW1hcCc7XG5cbi8qKlxuICogQ3JlYXRlIGEgdmVyc2lvbiBvZiBuZWFyZXN0IG5laWdoYm9yIGRlc2NlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTk5EZXNjZW50KGRpc3RhbmNlRm46IERpc3RhbmNlRm4sIHJhbmRvbTogUmFuZG9tRm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIG5ORGVzY2VudChcbiAgICBkYXRhOiBWZWN0b3IsXG4gICAgbGVhZkFycmF5OiBWZWN0b3JzLFxuICAgIG5OZWlnaGJvcnM6IG51bWJlcixcbiAgICBuSXRlcnMgPSAxMCxcbiAgICBtYXhDYW5kaWRhdGVzID0gNTAsXG4gICAgZGVsdGEgPSAwLjAwMSxcbiAgICByaG8gPSAwLjUsXG4gICAgcnBUcmVlSW5pdCA9IHRydWVcbiAgKSB7XG4gICAgY29uc3QgblZlcnRpY2VzID0gZGF0YS5sZW5ndGg7XG4gICAgY29uc3QgY3VycmVudEdyYXBoID0gaGVhcC5tYWtlSGVhcChkYXRhLmxlbmd0aCwgbk5laWdoYm9ycyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGljZXMgPSBoZWFwLnJlamVjdGlvblNhbXBsZShuTmVpZ2hib3JzLCBkYXRhLmxlbmd0aCwgcmFuZG9tKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5kaWNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBjb25zdCBkID0gZGlzdGFuY2VGbihkYXRhW2ldLCBkYXRhW2luZGljZXNbal1dKTtcblxuICAgICAgICBoZWFwLmhlYXBQdXNoKGN1cnJlbnRHcmFwaCwgaSwgZCwgaW5kaWNlc1tqXSwgMSk7XG4gICAgICAgIGhlYXAuaGVhcFB1c2goY3VycmVudEdyYXBoLCBpbmRpY2VzW2pdLCBkLCBpLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJwVHJlZUluaXQpIHtcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbGVhZkFycmF5Lmxlbmd0aDsgbisrKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVhZkFycmF5W25dLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGxlYWZBcnJheVtuXVtpXSA8IDApXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IGxlYWZBcnJheVtuXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGxlYWZBcnJheVtuXVtqXSA8IDApXG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjb25zdCBkID0gZGlzdGFuY2VGbihkYXRhW2xlYWZBcnJheVtuXVtpXV0sIGRhdGFbbGVhZkFycmF5W25dW2pdXSk7XG4gICAgICAgICAgICBoZWFwLmhlYXBQdXNoKGN1cnJlbnRHcmFwaCwgbGVhZkFycmF5W25dW2ldLCBkLCBsZWFmQXJyYXlbbl1bal0sIDEpO1xuICAgICAgICAgICAgaGVhcC5oZWFwUHVzaChjdXJyZW50R3JhcGgsIGxlYWZBcnJheVtuXVtqXSwgZCwgbGVhZkFycmF5W25dW2ldLCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IG5JdGVyczsgbisrKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVOZWlnaGJvcnMgPSBoZWFwLmJ1aWxkQ2FuZGlkYXRlcyhcbiAgICAgICAgY3VycmVudEdyYXBoLFxuICAgICAgICBuVmVydGljZXMsXG4gICAgICAgIG5OZWlnaGJvcnMsXG4gICAgICAgIG1heENhbmRpZGF0ZXMsXG4gICAgICAgIHJhbmRvbVxuICAgICAgKTtcblxuICAgICAgbGV0IGMgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuVmVydGljZXM7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG1heENhbmRpZGF0ZXM7IGorKykge1xuICAgICAgICAgIGNvbnN0IHAgPSBNYXRoLmZsb29yKGNhbmRpZGF0ZU5laWdoYm9yc1swXVtpXVtqXSk7XG4gICAgICAgICAgaWYgKHAgPCAwIHx8IHV0aWxzLnRhdVJhbmQocmFuZG9tKSA8IHJobylcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYXhDYW5kaWRhdGVzOyBrKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHEgPSBNYXRoLmZsb29yKGNhbmRpZGF0ZU5laWdoYm9yc1swXVtpXVtrXSk7XG4gICAgICAgICAgICBjb25zdCBjaiA9IGNhbmRpZGF0ZU5laWdoYm9yc1syXVtpXVtqXTtcbiAgICAgICAgICAgIGNvbnN0IGNrID0gY2FuZGlkYXRlTmVpZ2hib3JzWzJdW2ldW2tdO1xuICAgICAgICAgICAgaWYgKHEgPCAwIHx8ICghY2ogJiYgIWNrKSlcbiAgICAgICAgICAgICAgY29udGludWU7XG5cblxuICAgICAgICAgICAgY29uc3QgZCA9IGRpc3RhbmNlRm4oZGF0YVtwXSwgZGF0YVtxXSk7XG4gICAgICAgICAgICBjICs9IGhlYXAuaGVhcFB1c2goY3VycmVudEdyYXBoLCBwLCBkLCBxLCAxKTtcbiAgICAgICAgICAgIGMgKz0gaGVhcC5oZWFwUHVzaChjdXJyZW50R3JhcGgsIHEsIGQsIHAsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGMgPD0gZGVsdGEgKiBuTmVpZ2hib3JzICogZGF0YS5sZW5ndGgpXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBzb3J0ZWQgPSBoZWFwLmRlaGVhcFNvcnQoY3VycmVudEdyYXBoKTtcbiAgICByZXR1cm4gc29ydGVkO1xuICB9O1xufVxuXG5leHBvcnQgdHlwZSBJbml0RnJvbVJhbmRvbUZuID0gKFxuICBuTmVpZ2hib3JzOiBudW1iZXIsXG4gIGRhdGE6IFZlY3RvcixcbiAgcXVlcnlQb2ludHM6IFZlY3RvcixcbiAgX2hlYXA6IGhlYXAuSGVhcCxcbiAgcmFuZG9tOiBSYW5kb21GblxuKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBJbml0RnJvbVRyZWVGbiA9IChcbiAgX3RyZWU6IHRyZWUuRmxhdFRyZWUsXG4gIGRhdGE6IFZlY3RvcixcbiAgcXVlcnlQb2ludHM6IFZlY3RvcixcbiAgX2hlYXA6IGhlYXAuSGVhcCxcbiAgcmFuZG9tOiBSYW5kb21GblxuKSA9PiB2b2lkO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUluaXRpYWxpemF0aW9ucyhkaXN0YW5jZUZuOiBEaXN0YW5jZUZuKSB7XG4gIGZ1bmN0aW9uIGluaXRGcm9tUmFuZG9tKFxuICAgIG5OZWlnaGJvcnM6IG51bWJlcixcbiAgICBkYXRhOiBWZWN0b3IsXG4gICAgcXVlcnlQb2ludHM6IFZlY3RvcixcbiAgICBfaGVhcDogaGVhcC5IZWFwLFxuICAgIHJhbmRvbTogUmFuZG9tRm5cbiAgKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWVyeVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW5kaWNlcyA9IHV0aWxzLnJlamVjdGlvblNhbXBsZShuTmVpZ2hib3JzLCBkYXRhLmxlbmd0aCwgcmFuZG9tKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5kaWNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoaW5kaWNlc1tqXSA8IDApXG4gICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZCA9IGRpc3RhbmNlRm4oZGF0YVtpbmRpY2VzW2pdXSwgcXVlcnlQb2ludHNbaV0pO1xuICAgICAgICBoZWFwLmhlYXBQdXNoKF9oZWFwLCBpLCBkLCBpbmRpY2VzW2pdLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0RnJvbVRyZWUoXG4gICAgX3RyZWU6IHRyZWUuRmxhdFRyZWUsXG4gICAgZGF0YTogVmVjdG9yLFxuICAgIHF1ZXJ5UG9pbnRzOiBWZWN0b3IsXG4gICAgX2hlYXA6IGhlYXAuSGVhcCxcbiAgICByYW5kb206IFJhbmRvbUZuXG4gICkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVlcnlQb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGljZXMgPSB0cmVlLnNlYXJjaEZsYXRUcmVlKHF1ZXJ5UG9pbnRzW2ldLCBfdHJlZSwgcmFuZG9tKTtcblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbmRpY2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChpbmRpY2VzW2pdIDwgMClcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZCA9IGRpc3RhbmNlRm4oZGF0YVtpbmRpY2VzW2pdXSwgcXVlcnlQb2ludHNbaV0pO1xuICAgICAgICBoZWFwLmhlYXBQdXNoKF9oZWFwLCBpLCBkLCBpbmRpY2VzW2pdLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIHtpbml0RnJvbVJhbmRvbSwgaW5pdEZyb21UcmVlfTtcbn1cblxuZXhwb3J0IHR5cGUgU2VhcmNoRm4gPSAoXG4gIGRhdGE6IFZlY3RvcixcbiAgZ3JhcGg6IG1hdHJpeC5TcGFyc2VNYXRyaXgsXG4gIGluaXRpYWxpemF0aW9uOiBoZWFwLkhlYXAsXG4gIHF1ZXJ5UG9pbnRzOiBWZWN0b3JcbikgPT4gaGVhcC5IZWFwO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUluaXRpYWxpemVkTk5TZWFyY2goZGlzdGFuY2VGbjogRGlzdGFuY2VGbikge1xuICByZXR1cm4gZnVuY3Rpb24gbm5TZWFyY2hGbihcbiAgICBkYXRhOiBWZWN0b3IsXG4gICAgZ3JhcGg6IG1hdHJpeC5TcGFyc2VNYXRyaXgsXG4gICAgaW5pdGlhbGl6YXRpb246IGhlYXAuSGVhcCxcbiAgICBxdWVyeVBvaW50czogVmVjdG9yXG4gICkge1xuICAgIGNvbnN0IHtpbmRpY2VzLCBpbmRwdHJ9ID0gbWF0cml4LmdldENTUihncmFwaCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXJ5UG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB0cmllZCA9IG5ldyBTZXQoaW5pdGlhbGl6YXRpb25bMF1baV0pO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgLy8gRmluZCBzbWFsbGVzdCBmbGFnZ2VkIHZlcnRleFxuICAgICAgICBjb25zdCB2ZXJ0ZXggPSBoZWFwLnNtYWxsZXN0RmxhZ2dlZChpbml0aWFsaXphdGlvbiwgaSk7XG5cbiAgICAgICAgaWYgKHZlcnRleCA9PT0gLTEpXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IGluZGljZXMuc2xpY2UoaW5kcHRyW3ZlcnRleF0sIGluZHB0clt2ZXJ0ZXggKyAxXSk7XG4gICAgICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjYW5kaWRhdGUgPT09IHZlcnRleCB8fFxuICAgICAgICAgICAgY2FuZGlkYXRlID09PSAtMSB8fFxuICAgICAgICAgICAgdHJpZWQuaGFzKGNhbmRpZGF0ZSlcbiAgICAgICAgICApXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGQgPSBkaXN0YW5jZUZuKGRhdGFbY2FuZGlkYXRlXSwgcXVlcnlQb2ludHNbaV0pO1xuICAgICAgICAgIGhlYXAudW5jaGVja2VkSGVhcFB1c2goaW5pdGlhbGl6YXRpb24sIGksIGQsIGNhbmRpZGF0ZSwgMSk7XG4gICAgICAgICAgdHJpZWQuYWRkKGNhbmRpZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluaXRpYWxpemF0aW9uO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZVNlYXJjaChcbiAgZm9yZXN0OiB0cmVlLkZsYXRUcmVlW10sXG4gIGRhdGE6IFZlY3RvcixcbiAgcXVlcnlQb2ludHM6IFZlY3RvcixcbiAgbk5laWdoYm9yczogbnVtYmVyLFxuICBpbml0RnJvbVJhbmRvbTogSW5pdEZyb21SYW5kb21GbixcbiAgaW5pdEZyb21UcmVlOiBJbml0RnJvbVRyZWVGbixcbiAgcmFuZG9tOiBSYW5kb21GblxuKSB7XG4gIGNvbnN0IHJlc3VsdHMgPSBoZWFwLm1ha2VIZWFwKHF1ZXJ5UG9pbnRzLmxlbmd0aCwgbk5laWdoYm9ycyk7XG4gIGluaXRGcm9tUmFuZG9tKG5OZWlnaGJvcnMsIGRhdGEsIHF1ZXJ5UG9pbnRzLCByZXN1bHRzLCByYW5kb20pO1xuICBpZiAoZm9yZXN0KSB7XG4gICAgZm9yIChjb25zdCB0cmVlIG9mIGZvcmVzdClcbiAgICAgIGluaXRGcm9tVHJlZSh0cmVlLCBkYXRhLCBxdWVyeVBvaW50cywgcmVzdWx0cywgcmFuZG9tKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn1cbiJdfQ==","import isArray from 'is-any-array';\n\nimport errorCalculation from './errorCalculation';\nimport step from './step';\n\n/**\n * Curve fitting algorithm\n * @param {{x:Array<number>, y:Array<number>}} data - Array of points to fit in the format [x1, x2, ... ], [y1, y2, ... ]\n * @param {function} parameterizedFunction - The parameters and returns a function with the independent variable as a parameter\n * @param {object} [options] - Options object\n * @param {number} [options.damping] - Levenberg-Marquardt parameter\n * @param {number} [options.gradientDifference = 10e-2] - Adjustment for decrease the damping parameter\n * @param {Array<number>} [options.minValues] - Minimum allowed values for parameters\n * @param {Array<number>} [options.maxValues] - Maximum allowed values for parameters\n * @param {Array<number>} [options.initialValues] - Array of initial parameter values\n * @param {number} [options.maxIterations = 100] - Maximum of allowed iterations\n * @param {number} [options.errorTolerance = 10e-3] - Minimum uncertainty allowed for each point\n * @return {{parameterValues: Array<number>, parameterError: number, iterations: number}}\n */\nexport default function levenbergMarquardt(\n data,\n parameterizedFunction,\n options = {},\n) {\n let {\n maxIterations = 100,\n gradientDifference = 10e-2,\n damping = 0,\n errorTolerance = 10e-3,\n minValues,\n maxValues,\n initialValues,\n } = options;\n\n if (damping <= 0) {\n throw new Error('The damping option must be a positive number');\n } else if (!data.x || !data.y) {\n throw new Error('The data parameter must have x and y elements');\n } else if (\n !isArray(data.x) ||\n data.x.length < 2 ||\n !isArray(data.y) ||\n data.y.length < 2\n ) {\n throw new Error(\n 'The data parameter elements must be an array with more than 2 points',\n );\n } else if (data.x.length !== data.y.length) {\n throw new Error('The data parameter elements must have the same size');\n }\n\n let parameters =\n initialValues || new Array(parameterizedFunction.length).fill(1);\n let parLen = parameters.length;\n maxValues = maxValues || new Array(parLen).fill(Number.MAX_SAFE_INTEGER);\n minValues = minValues || new Array(parLen).fill(Number.MIN_SAFE_INTEGER);\n\n if (maxValues.length !== minValues.length) {\n throw new Error('minValues and maxValues must be the same size');\n }\n\n if (!isArray(parameters)) {\n throw new Error('initialValues must be an array');\n }\n\n let error = errorCalculation(data, parameters, parameterizedFunction);\n\n let converged = error <= errorTolerance;\n\n let iteration;\n for (iteration = 0; iteration < maxIterations && !converged; iteration++) {\n parameters = step(\n data,\n parameters,\n damping,\n gradientDifference,\n parameterizedFunction,\n );\n\n for (let k = 0; k < parLen; k++) {\n parameters[k] = Math.min(\n Math.max(minValues[k], parameters[k]),\n maxValues[k],\n );\n }\n\n error = errorCalculation(data, parameters, parameterizedFunction);\n if (isNaN(error)) break;\n converged = error <= errorTolerance;\n }\n\n return {\n parameterValues: parameters,\n parameterError: error,\n iterations: iteration,\n };\n}\n","import { getSimilarityFromDistance } from '../distance-metrics-methods';\nimport { BitArrayMetricsNames } from '../typed-metrics';\nimport { DistanceAggregationMethods } from './types';\nimport { insertSmaller, isNil } from './utils';\nexport class SparseMatrixService {\n _workerCount;\n constructor() {\n this._workerCount = Math.max(navigator.hardwareConcurrency - 2, 1);\n }\n async calc(values, fnName, threshold, opts = {}) {\n //size of full matrix\n const matSize = values.length * (values.length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const minThreshold = values.length > 20000 ? await this.getMinimalThreshold(values, fnName, opts) : 0;\n if (threshold < minThreshold) {\n console.log(`using threshold ${minThreshold}`);\n threshold = minThreshold;\n }\n opts['threshold'] = threshold;\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./sparse-matrix-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ i: new Int32Array(0), j: new Int32Array(0), distance: new Float32Array(0), idx });\n workers[idx].postMessage({ values, startIdx, endIdx, threshold, fnName, opts });\n workers[idx].onmessage = ({ data: { error, i, j, distance } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ i, j, distance, idx });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const fullSize = results.reduce((acc, val) => acc + val.i.length, 0);\n const i = new Int32Array(fullSize);\n const j = new Int32Array(fullSize);\n const distance = new Float32Array(fullSize);\n let offset = 0;\n // setting the results\n for (const res of results) {\n i.set(res.i, offset);\n j.set(res.j, offset);\n distance.set(res.distance, offset);\n offset += res.i.length;\n }\n return { i, j, distance };\n }\n async getKNN(values, fnName, nNeighbours = 15, opts = {}) {\n return await this.multiColumnKNN([values], [fnName], nNeighbours, [opts], [1]);\n }\n async multiColumnKNN(values, fnNames, nNeighbours = 15, opts, weights, aggregationMethod = DistanceAggregationMethods.EUCLIDEAN) {\n if (values.length !== fnNames.length || values.length !== opts.length || values.length !== weights.length)\n throw new Error('values, distance functions, options and weights arrays should have the same length');\n if (values.some((v) => v.length !== values[0].length))\n throw new Error('all values arrays should have the same length');\n const matSize = values[0].length * (values[0].length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const promises = new Array(this._workerCount);\n const workers = new Array(this._workerCount)\n .fill(null).map(() => new Worker(new URL('./knn-worker', import.meta.url)));\n for (let idx = 0; idx < this._workerCount; idx++) {\n promises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n if (endIdx <= startIdx)\n resolveWorker({ knnDistances: new Array(0), knnIndexes: new Array(0) });\n workers[idx].postMessage({ values, startIdx, endIdx, fnNames, opts, nNeighbours, weights, aggregationMethod });\n workers[idx].onmessage = ({ data: { error, knnDistances, knnIndexes } }) => {\n if (error) {\n workers[idx].terminate();\n rejectWorker(error);\n }\n else {\n workers[idx].terminate();\n resolveWorker({ knnDistances, knnIndexes });\n }\n };\n });\n }\n const results = await Promise.all(promises);\n const knnRes = {\n knnDistances: new Array(values[0].length).fill(null).map(() => new Array(nNeighbours).fill(99999)),\n knnIndexes: new Array(values[0].length).fill(null).map(() => new Array(nNeighbours).fill(-1))\n };\n for (const res of results) {\n for (let i = 0; i < values[0].length; ++i) {\n for (let j = 0; j < res.knnDistances[i]?.length ?? 0; ++j)\n insertSmaller(knnRes.knnDistances[i], knnRes.knnIndexes[i], res.knnDistances[i][j], res.knnIndexes[i][j]);\n }\n }\n return knnRes;\n }\n async getSampleDistances(values, fnName, opts = {}) {\n const thresholdWorkers = new Array(this._workerCount).fill(null)\n .map(() => new Worker(new URL('./sparse-matrix-threshold-worker', import.meta.url)));\n // data may be sorted by clusters, which will hinder the random sampling\n // so we shuffle it first\n const shuffledValues = values.slice();\n for (let i = shuffledValues.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [shuffledValues[i], shuffledValues[j]] = [shuffledValues[j], shuffledValues[i]];\n }\n try {\n const matSize = values.length * (values.length - 1) / 2;\n const chunkSize = Math.floor(matSize / this._workerCount);\n const maxSampleSize = 1000000;\n const sampleSise = Math.max(Math.min(matSize / 1000, maxSampleSize), Math.min(matSize, maxSampleSize));\n const testSetSizePerWorker = Math.floor(sampleSise / this._workerCount);\n const tPromises = new Array(this._workerCount);\n for (let idx = 0; idx < this._workerCount; idx++) {\n tPromises[idx] = new Promise((resolveWorker, rejectWorker) => {\n const startIdx = idx * chunkSize;\n const endIdx = idx === this._workerCount - 1 ? matSize : (idx + 1) * chunkSize;\n thresholdWorkers[idx].postMessage({\n values: shuffledValues, startIdx, endIdx, sampleLength: testSetSizePerWorker, fnName, opts\n });\n thresholdWorkers[idx].onmessage = ({ data: { error, distance } }) => {\n thresholdWorkers[idx].terminate();\n if (error)\n rejectWorker(error);\n else\n resolveWorker({ distance });\n };\n });\n }\n const results = await Promise.all(tPromises);\n const fullSize = results.reduce((acc, val) => acc + val.distance.length, 0);\n const distance = new Float32Array(fullSize);\n let offset = 0;\n for (const res of results) {\n distance.set(res.distance, offset);\n offset += res.distance.length;\n }\n distance.sort();\n return distance;\n }\n catch (e) {\n thresholdWorkers?.forEach((w) => w?.terminate());\n console.error(e);\n return new Float32Array(1).fill(0.5);\n }\n }\n async getMinimalThreshold(values, fnName, opts = {}) {\n //We need to calculate the minimal threshold first,\n //in order to get matrix such that it does not exceed the maximum size of 1GB\n //we have 3 return arrays, each 4 bites per element, so if the maximum size of the matrix is 1GB,\n const maxSparseMatrixSize = 70000000;\n try {\n const matSize = values.length * (values.length - 1) / 2;\n const distance = await this.getSampleDistances(values, fnName, opts);\n const fractionIndex = Math.floor(maxSparseMatrixSize / matSize * distance.length);\n const threshold = 1 - distance[fractionIndex];\n // threshold = Math.max(threshold, 0.3);\n return threshold;\n }\n catch (e) {\n console.error(e);\n return 0.5;\n }\n }\n static calcSync(values, fnName, distanceFn, threshold) {\n const i = [];\n const j = [];\n const distances = [];\n let cnt = 0;\n let mi = 0;\n let mj = 0;\n const fullSize = values.length * (values.length - 1) / 2;\n while (cnt < fullSize) {\n //const value = seq1List[mi] && seq1List[mj] ? hamming(seq1List[mi], seq1List[mj]) : 0;\n const value = !isNil(values[mi]) && !isNil(values[mj]) ?\n distanceFn(values[mi], values[mj]) : 1;\n const similarity = Object.values(BitArrayMetricsNames).some((a) => a === fnName) ? getSimilarityFromDistance(value) : 1 - value;\n if (similarity >= threshold) {\n i.push(mi);\n j.push(mj);\n distances.push(value);\n }\n cnt++;\n mj++;\n if (mj === values.length) {\n mi++;\n mj = mi + 1;\n }\n }\n const iArray = new Int32Array(i);\n const jArray = new Int32Array(j);\n const distanceArray = new Float32Array(distances);\n return { i: iArray, j: jArray, distance: distanceArray };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlLW1hdHJpeC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3BhcnNlLW1hdHJpeC1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBQyxvQkFBb0IsRUFBZSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BFLE9BQU8sRUFBNEIsMEJBQTBCLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUUsT0FBTyxFQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFhN0MsTUFBTSxPQUFPLG1CQUFtQjtJQUNwQixZQUFZLENBQVM7SUFDN0I7UUFDRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUksQ0FBSSxNQUFnQixFQUFFLE1BQW9CLEVBQUUsU0FBaUIsRUFBRSxPQUEyQixFQUFFO1FBQzNHLHFCQUFxQjtRQUNyQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTFELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkcsSUFBSSxTQUFTLEdBQUcsWUFBWSxFQUFFO1lBQzVCLE9BQU8sQ0FBQyxHQUFH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SUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQy9HLElBQUksVUFBVSxJQUFJLFNBQVMsRUFBRTtnQkFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDWCxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNYLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdkI7WUFDRCxHQUFHLEVBQUUsQ0FBQztZQUNOLEVBQUUsRUFBRSxDQUFDO1lBQ0wsSUFBSSxFQUFFLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRTtnQkFDeEIsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDYjtTQUNGO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsTUFBTSxhQUFhLEdBQUcsSUFBSSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFbEQsT0FBTyxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFDLENBQUM7SUFDekQsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtnZXRTaW1pbGFyaXR5RnJvbURpc3RhbmNlfSBmcm9tICcuLi9kaXN0YW5jZS1tZXRyaWNzLW1ldGhvZHMnO1xuaW1wb3J0IHtCaXRBcnJheU1ldHJpY3NOYW1lcywgS25vd25NZXRyaWNzfSBmcm9tICcuLi90eXBlZC1tZXRyaWNzJztcbmltcG9ydCB7RGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCwgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHN9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtpbnNlcnRTbWFsbGVyLCBpc05pbH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCB0eXBlIFNwYXJzZU1hdHJpeFJlc3VsdCA9IHtcbiAgaTogSW50MzJBcnJheSxcbiAgajogSW50MzJBcnJheSxcbiAgZGlzdGFuY2U6IEZsb2F0MzJBcnJheSxcbiAgaWR4PzogbnVtYmVyXG59O1xuXG5leHBvcnQgdHlwZSBLbm5SZXN1bHQgPSB7XG4gIGtubkRpc3RhbmNlczogbnVtYmVyW11bXSxcbiAga25uSW5kZXhlczogbnVtYmVyW11bXVxufVxuZXhwb3J0IGNsYXNzIFNwYXJzZU1hdHJpeFNlcnZpY2Uge1xuICAgIHByaXZhdGUgX3dvcmtlckNvdW50OiBudW1iZXI7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLl93b3JrZXJDb3VudCA9IE1hdGgubWF4KG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5IC0gMiwgMSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNhbGM8VD4odmFsdWVzOiBBcnJheTxUPiwgZm5OYW1lOiBLbm93bk1ldHJpY3MsIHRocmVzaG9sZDogbnVtYmVyLCBvcHRzOiB7W186IHN0cmluZ106IGFueX0gPSB7fSkge1xuICAgICAgLy9zaXplIG9mIGZ1bGwgbWF0cml4XG4gICAgICBjb25zdCBtYXRTaXplID0gdmFsdWVzLmxlbmd0aCAqICh2YWx1ZXMubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihtYXRTaXplIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuXG4gICAgICBjb25zdCBtaW5UaHJlc2hvbGQgPSB2YWx1ZXMubGVuZ3RoID4gMjBfMDAwID8gYXdhaXQgdGhpcy5nZXRNaW5pbWFsVGhyZXNob2xkKHZhbHVlcywgZm5OYW1lLCBvcHRzKSA6IDA7XG4gICAgICBpZiAodGhyZXNob2xkIDwgbWluVGhyZXNob2xkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGB1c2luZyB0aHJlc2hvbGQgJHttaW5UaHJlc2hvbGR9YCk7XG4gICAgICAgIHRocmVzaG9sZCA9IG1pblRocmVzaG9sZDtcbiAgICAgIH1cbiAgICAgIG9wdHNbJ3RocmVzaG9sZCddID0gdGhyZXNob2xkO1xuICAgICAgY29uc3QgcHJvbWlzZXMgPVxuICAgICAgICBuZXcgQXJyYXk8UHJvbWlzZTxTcGFyc2VNYXRyaXhSZXN1bHQ+Pih0aGlzLl93b3JrZXJDb3VudCk7XG5cbiAgICAgIGNvbnN0IHdvcmtlcnMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpXG4gICAgICAgIC5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgV29ya2VyKG5ldyBVUkwoJy4vc3BhcnNlLW1hdHJpeC13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKSk7XG4gICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCB0aGlzLl93b3JrZXJDb3VudDsgaWR4KyspIHtcbiAgICAgICAgcHJvbWlzZXNbaWR4XSA9IG5ldyBQcm9taXNlKChyZXNvbHZlV29ya2VyLCByZWplY3RXb3JrZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGFydElkeCA9IGlkeCAqIGNodW5rU2l6ZTtcbiAgICAgICAgICBjb25zdCBlbmRJZHggPSBpZHggPT09IHRoaXMuX3dvcmtlckNvdW50IC0gMSA/IG1hdFNpemUgOiAoaWR4ICsgMSkgKiBjaHVua1NpemU7XG4gICAgICAgICAgaWYgKGVuZElkeCA8PSBzdGFydElkeClcbiAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoe2k6IG5ldyBJbnQzMkFycmF5KDApLCBqOiBuZXcgSW50MzJBcnJheSgwKSwgZGlzdGFuY2U6IG5ldyBGbG9hdDMyQXJyYXkoMCksIGlkeH0pO1xuICAgICAgICAgIHdvcmtlcnNbaWR4XS5wb3N0TWVzc2FnZSh7dmFsdWVzLCBzdGFydElkeCwgZW5kSWR4LCB0aHJlc2hvbGQsIGZuTmFtZSwgb3B0c30pO1xuICAgICAgICAgIHdvcmtlcnNbaWR4XS5vbm1lc3NhZ2UgPSAoe2RhdGE6IHtlcnJvciwgaSwgaiwgZGlzdGFuY2V9fSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVqZWN0V29ya2VyKGVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7aSwgaiwgZGlzdGFuY2UsIGlkeH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgY29uc3QgZnVsbFNpemUgPSByZXN1bHRzLnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyArIHZhbC5pLmxlbmd0aCwgMCk7XG4gICAgICBjb25zdCBpID0gbmV3IEludDMyQXJyYXkoZnVsbFNpemUpO1xuICAgICAgY29uc3QgaiA9IG5ldyBJbnQzMkFycmF5KGZ1bGxTaXplKTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gbmV3IEZsb2F0MzJBcnJheShmdWxsU2l6ZSk7XG4gICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgIC8vIHNldHRpbmcgdGhlIHJlc3VsdHNcbiAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgaS5zZXQocmVzLmksIG9mZnNldCk7XG4gICAgICAgIGouc2V0KHJlcy5qLCBvZmZzZXQpO1xuICAgICAgICBkaXN0YW5jZS5zZXQocmVzLmRpc3RhbmNlLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gcmVzLmkubGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtpLCBqLCBkaXN0YW5jZX07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEtOTihcbiAgICAgIHZhbHVlczogQXJyYXk8YW55PiwgZm5OYW1lOiBLbm93bk1ldHJpY3MsIG5OZWlnaGJvdXJzOiBudW1iZXIgPSAxNSwgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9ID0ge31cbiAgICApIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLm11bHRpQ29sdW1uS05OKFt2YWx1ZXNdLCBbZm5OYW1lXSwgbk5laWdoYm91cnMsIFtvcHRzXSwgWzFdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbXVsdGlDb2x1bW5LTk4odmFsdWVzOiBBcnJheTxBcnJheTxhbnk+PiwgZm5OYW1lczogS25vd25NZXRyaWNzW10sIG5OZWlnaGJvdXJzOiBudW1iZXIgPSAxNSxcbiAgICAgIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fVtdLCB3ZWlnaHRzOiBudW1iZXJbXSxcbiAgICAgIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kID0gRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMuRVVDTElERUFOXG4gICAgKSB7XG4gICAgICBpZiAodmFsdWVzLmxlbmd0aCAhPT0gZm5OYW1lcy5sZW5ndGggfHwgdmFsdWVzLmxlbmd0aCAhPT0gb3B0cy5sZW5ndGggfHwgdmFsdWVzLmxlbmd0aCAhPT0gd2VpZ2h0cy5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmFsdWVzLCBkaXN0YW5jZSBmdW5jdGlvbnMsIG9wdGlvbnMgYW5kIHdlaWdodHMgYXJyYXlzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aCcpO1xuXG4gICAgICBpZiAodmFsdWVzLnNvbWUoKHYpID0+IHYubGVuZ3RoICE9PSB2YWx1ZXNbMF0ubGVuZ3RoKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbGwgdmFsdWVzIGFycmF5cyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGgnKTtcblxuICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlc1swXS5sZW5ndGggKiAodmFsdWVzWzBdLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IE1hdGguZmxvb3IobWF0U2l6ZSAvIHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgIGNvbnN0IHByb21pc2VzID1cbiAgICAgICAgbmV3IEFycmF5PFByb21pc2U8S25uUmVzdWx0Pj4odGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgY29uc3Qgd29ya2VycyA9IG5ldyBBcnJheSh0aGlzLl93b3JrZXJDb3VudClcbiAgICAgICAgLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBXb3JrZXIobmV3IFVSTCgnLi9rbm4td29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSkpO1xuICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgdGhpcy5fd29ya2VyQ291bnQ7IGlkeCsrKSB7XG4gICAgICAgIHByb21pc2VzW2lkeF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZVdvcmtlciwgcmVqZWN0V29ya2VyKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSBpZHggKiBjaHVua1NpemU7XG4gICAgICAgICAgY29uc3QgZW5kSWR4ID0gaWR4ID09PSB0aGlzLl93b3JrZXJDb3VudCAtIDEgPyBtYXRTaXplIDogKGlkeCArIDEpICogY2h1bmtTaXplO1xuICAgICAgICAgIGlmIChlbmRJZHggPD0gc3RhcnRJZHgpXG4gICAgICAgICAgICByZXNvbHZlV29ya2VyKHtrbm5EaXN0YW5jZXM6IG5ldyBBcnJheSgwKSwga25uSW5kZXhlczogbmV3IEFycmF5KDApfSk7XG4gICAgICAgICAgd29ya2Vyc1tpZHhdLnBvc3RNZXNzYWdlKHt2YWx1ZXMsIHN0YXJ0SWR4LCBlbmRJZHgsIGZuTmFtZXMsIG9wdHMsIG5OZWlnaGJvdXJzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZH0pO1xuICAgICAgICAgIHdvcmtlcnNbaWR4XS5vbm1lc3NhZ2UgPSAoe2RhdGE6IHtlcnJvciwga25uRGlzdGFuY2VzLCBrbm5JbmRleGVzfX0pOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgIHJlamVjdFdvcmtlcihlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoe2tubkRpc3RhbmNlcywga25uSW5kZXhlc30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgY29uc3Qga25uUmVzOiBLbm5SZXN1bHQgPSB7XG4gICAgICAgIGtubkRpc3RhbmNlczogbmV3IEFycmF5KHZhbHVlc1swXS5sZW5ndGgpLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBBcnJheTxudW1iZXI+KG5OZWlnaGJvdXJzKS5maWxsKDk5OTk5KSksXG4gICAgICAgIGtubkluZGV4ZXM6IG5ldyBBcnJheSh2YWx1ZXNbMF0ubGVuZ3RoKS5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgQXJyYXk8bnVtYmVyPihuTmVpZ2hib3VycykuZmlsbCgtMSkpfTtcbiAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXNbMF0ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlcy5rbm5EaXN0YW5jZXNbaV0/Lmxlbmd0aCA/PyAwOyArK2opXG4gICAgICAgICAgICBpbnNlcnRTbWFsbGVyKGtublJlcy5rbm5EaXN0YW5jZXNbaV0sIGtublJlcy5rbm5JbmRleGVzW2ldLCByZXMua25uRGlzdGFuY2VzW2ldW2pdLCByZXMua25uSW5kZXhlc1tpXVtqXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBrbm5SZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFNhbXBsZURpc3RhbmNlczxUPih2YWx1ZXM6IEFycmF5PFQ+LCBmbk5hbWU6IEtub3duTWV0cmljcyxcbiAgICAgIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fSA9IHt9KTogUHJvbWlzZTxGbG9hdDMyQXJyYXk+IHtcbiAgICAgIGNvbnN0IHRocmVzaG9sZFdvcmtlcnMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpLmZpbGwobnVsbClcbiAgICAgICAgLm1hcCgoKSA9PiBuZXcgV29ya2VyKG5ldyBVUkwoJy4vc3BhcnNlLW1hdHJpeC10aHJlc2hvbGQtd29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSkpO1xuICAgICAgLy8gZGF0YSBtYXkgYmUgc29ydGVkIGJ5IGNsdXN0ZXJzLCB3aGljaCB3aWxsIGhpbmRlciB0aGUgcmFuZG9tIHNhbXBsaW5nXG4gICAgICAvLyBzbyB3ZSBzaHVmZmxlIGl0IGZpcnN0XG4gICAgICBjb25zdCBzaHVmZmxlZFZhbHVlcyA9IHZhbHVlcy5zbGljZSgpO1xuICAgICAgZm9yIChsZXQgaSA9IHNodWZmbGVkVmFsdWVzLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgICAgICBbc2h1ZmZsZWRWYWx1ZXNbaV0sIHNodWZmbGVkVmFsdWVzW2pdXSA9IFtzaHVmZmxlZFZhbHVlc1tqXSwgc2h1ZmZsZWRWYWx1ZXNbaV1dO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtYXRTaXplID0gdmFsdWVzLmxlbmd0aCAqICh2YWx1ZXMubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgICBjb25zdCBjaHVua1NpemUgPSBNYXRoLmZsb29yKG1hdFNpemUgLyB0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICAgIGNvbnN0IG1heFNhbXBsZVNpemUgPSAxXzAwMF8wMDA7XG4gICAgICAgIGNvbnN0IHNhbXBsZVNpc2UgPSBNYXRoLm1heChNYXRoLm1pbihtYXRTaXplIC8gMTAwMCwgbWF4U2FtcGxlU2l6ZSksIE1hdGgubWluKG1hdFNpemUsIG1heFNhbXBsZVNpemUpKTtcbiAgICAgICAgY29uc3QgdGVzdFNldFNpemVQZXJXb3JrZXIgPSBNYXRoLmZsb29yKHNhbXBsZVNpc2UgLyB0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICAgIGNvbnN0IHRQcm9taXNlcyA9IG5ldyBBcnJheTxQcm9taXNlPHtkaXN0YW5jZTogRmxvYXQzMkFycmF5fT4+KHRoaXMuX3dvcmtlckNvdW50KTtcblxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCB0aGlzLl93b3JrZXJDb3VudDsgaWR4KyspIHtcbiAgICAgICAgICB0UHJvbWlzZXNbaWR4XSA9IG5ldyBQcm9taXNlKChyZXNvbHZlV29ya2VyLCByZWplY3RXb3JrZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gaWR4ICogY2h1bmtTaXplO1xuICAgICAgICAgICAgY29uc3QgZW5kSWR4ID0gaWR4ID09PSB0aGlzLl93b3JrZXJDb3VudCAtIDEgPyBtYXRTaXplIDogKGlkeCArIDEpICogY2h1bmtTaXplO1xuICAgICAgICAgICAgdGhyZXNob2xkV29ya2Vyc1tpZHhdLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgdmFsdWVzOiBzaHVmZmxlZFZhbHVlcywgc3RhcnRJZHgsIGVuZElkeCwgc2FtcGxlTGVuZ3RoOiB0ZXN0U2V0U2l6ZVBlcldvcmtlciwgZm5OYW1lLCBvcHRzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocmVzaG9sZFdvcmtlcnNbaWR4XS5vbm1lc3NhZ2UgPSAoe2RhdGE6IHtlcnJvciwgZGlzdGFuY2V9fSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICB0aHJlc2hvbGRXb3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgIGlmIChlcnJvcikgcmVqZWN0V29ya2VyKGVycm9yKTsgZWxzZVxuICAgICAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoe2Rpc3RhbmNlfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHRQcm9taXNlcyk7XG4gICAgICAgIGNvbnN0IGZ1bGxTaXplID0gcmVzdWx0cy5yZWR1Y2UoKGFjYywgdmFsKSA9PiBhY2MgKyB2YWwuZGlzdGFuY2UubGVuZ3RoLCAwKTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBuZXcgRmxvYXQzMkFycmF5KGZ1bGxTaXplKTtcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICBkaXN0YW5jZS5zZXQocmVzLmRpc3RhbmNlLCBvZmZzZXQpO1xuICAgICAgICAgIG9mZnNldCArPSByZXMuZGlzdGFuY2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGRpc3RhbmNlLnNvcnQoKTtcblxuICAgICAgICByZXR1cm4gZGlzdGFuY2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocmVzaG9sZFdvcmtlcnM/LmZvckVhY2goKHcpID0+IHc/LnRlcm1pbmF0ZSgpKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoMSkuZmlsbCgwLjUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0TWluaW1hbFRocmVzaG9sZDxUPih2YWx1ZXM6IEFycmF5PFQ+LCBmbk5hbWU6IEtub3duTWV0cmljcywgb3B0czoge1tfOiBzdHJpbmddOiBhbnl9ID0ge30pIHtcbiAgICAgIC8vV2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIG1pbmltYWwgdGhyZXNob2xkIGZpcnN0LFxuICAgICAgLy9pbiBvcmRlciB0byBnZXQgbWF0cml4IHN1Y2ggdGhhdCBpdCBkb2VzIG5vdCBleGNlZWQgdGhlIG1heGltdW0gc2l6ZSBvZiAxR0JcbiAgICAgIC8vd2UgaGF2ZSAzIHJldHVybiBhcnJheXMsIGVhY2ggNCBiaXRlcyBwZXIgZWxlbWVudCwgc28gaWYgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbWF0cml4IGlzIDFHQixcbiAgICAgIGNvbnN0IG1heFNwYXJzZU1hdHJpeFNpemUgPSA3MF8wMDBfMDAwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlcy5sZW5ndGggKiAodmFsdWVzLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBhd2FpdCB0aGlzLmdldFNhbXBsZURpc3RhbmNlcyh2YWx1ZXMsIGZuTmFtZSwgb3B0cyk7XG4gICAgICAgIGNvbnN0IGZyYWN0aW9uSW5kZXggPSBNYXRoLmZsb29yKG1heFNwYXJzZU1hdHJpeFNpemUgLyBtYXRTaXplICogZGlzdGFuY2UubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdGhyZXNob2xkID0gMSAtIGRpc3RhbmNlW2ZyYWN0aW9uSW5kZXhdO1xuICAgICAgICAvLyB0aHJlc2hvbGQgPSBNYXRoLm1heCh0aHJlc2hvbGQsIDAuMyk7XG4gICAgICAgIHJldHVybiB0aHJlc2hvbGQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIHJldHVybiAwLjU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjYWxjU3luYzxUPihcbiAgICAgIHZhbHVlczogQXJyYXk8VD4gfCBBcnJheUxpa2U8VD4sIGZuTmFtZTogS25vd25NZXRyaWNzLCBkaXN0YW5jZUZuOiBGdW5jdGlvbiwgdGhyZXNob2xkOiBudW1iZXJcbiAgICApIHtcbiAgICAgIGNvbnN0IGk6IG51bWJlcltdID0gW107XG4gICAgICBjb25zdCBqOiBudW1iZXJbXSA9IFtdO1xuICAgICAgY29uc3QgZGlzdGFuY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgbGV0IGNudCA9IDA7XG4gICAgICBsZXQgbWkgPSAwO1xuICAgICAgbGV0IG1qID0gMDtcbiAgICAgIGNvbnN0IGZ1bGxTaXplID0gdmFsdWVzLmxlbmd0aCAqICh2YWx1ZXMubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgd2hpbGUgKGNudCA8IGZ1bGxTaXplKSB7XG4gICAgICAgIC8vY29uc3QgdmFsdWUgPSBzZXExTGlzdFttaV0gJiYgc2VxMUxpc3RbbWpdID8gaGFtbWluZyhzZXExTGlzdFttaV0sIHNlcTFMaXN0W21qXSkgOiAwO1xuICAgICAgICBjb25zdCB2YWx1ZSA9ICFpc05pbCh2YWx1ZXNbbWldKSAmJiAhaXNOaWwodmFsdWVzW21qXSkgP1xuICAgICAgICAgIGRpc3RhbmNlRm4odmFsdWVzW21pXSwgdmFsdWVzW21qXSkgOiAxO1xuICAgICAgICBjb25zdCBzaW1pbGFyaXR5ID1cbiAgICAgICAgICBPYmplY3QudmFsdWVzKEJpdEFycmF5TWV0cmljc05hbWVzKS5zb21lKChhKSA9PiBhID09PSBmbk5hbWUpID8gZ2V0U2ltaWxhcml0eUZyb21EaXN0YW5jZSh2YWx1ZSkgOiAxIC0gdmFsdWU7XG4gICAgICAgIGlmIChzaW1pbGFyaXR5ID49IHRocmVzaG9sZCkge1xuICAgICAgICAgIGkucHVzaChtaSk7XG4gICAgICAgICAgai5wdXNoKG1qKTtcbiAgICAgICAgICBkaXN0YW5jZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY250Kys7XG4gICAgICAgIG1qKys7XG4gICAgICAgIGlmIChtaiA9PT0gdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgIG1pKys7XG4gICAgICAgICAgbWogPSBtaSArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaUFycmF5ID0gbmV3IEludDMyQXJyYXkoaSk7XG4gICAgICBjb25zdCBqQXJyYXkgPSBuZXcgSW50MzJBcnJheShqKTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KGRpc3RhbmNlcyk7XG5cbiAgICAgIHJldHVybiB7aTogaUFycmF5LCBqOiBqQXJyYXksIGRpc3RhbmNlOiBkaXN0YW5jZUFycmF5fTtcbiAgICB9XG59XG4iXX0=","import { Vector } from '@datagrok-libraries/utils/src/type-declarations';\nimport { TSNE } from '@keckelt/tsne';\nimport { AvailableMetrics, Measure, isBitArrayMetric } from '../typed-metrics';\nimport { DistanceMatrixService, distanceMatrixProxy } from '../distance-matrix';\nimport { getAggregationFunction } from '../distance-matrix/utils';\nimport { UMAP } from '../umap';\nimport { assert, transposeMatrix } from '@datagrok-libraries/utils/src/vector-operations';\nimport { SparseMatrixService } from '../distance-matrix/sparse-matrix-service';\nimport BitArray from '@datagrok-libraries/utils/src/bit-array';\nimport seedRandom from 'seedrandom';\nclass MultiColumnReducer {\n data;\n weights;\n aggregationMethod;\n constructor(options) {\n this.data = options.data;\n this.weights = options.weights;\n this.aggregationMethod = options.aggregationMethod;\n }\n}\nclass TSNEReducer extends MultiColumnReducer {\n reducer;\n iterations;\n distanceFnames;\n distanceFns;\n distanceFnArgs;\n /**\n * Creates an instance of TSNEReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof TSNEReducer\n */\n constructor(options) {\n super(options);\n this.reducer = new TSNE(options);\n this.iterations = options?.iterations ?? 100;\n this.distanceFnames = options.distanceFnames;\n this.distanceFns = options.distanceFns;\n this.distanceFnArgs = options.distanceFnArgs;\n }\n /**\n * Embeds the data given into the two-dimensional space using t-SNE method.\\\n * @param {boolean} [parallelDistanceWorkers] Whether to use parallel distance workers.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n */\n async transform() {\n if (this.data[0].length > 10000)\n throw new Error('Maximum number of samples for T-SNE is 10000');\n const matrixService = new DistanceMatrixService(true, false);\n try {\n const aggregate = getAggregationFunction(this.aggregationMethod, this.weights);\n const distances = [];\n for (let i = 0; i < this.data.length; ++i) {\n const dist = await matrixService.calc(this.data[i], this.distanceFnames[i], false, this.distanceFnArgs[i]);\n distances.push(dist);\n }\n const distance = new Float32Array(distances[0].length).fill(0);\n for (let i = 0; i < distances[0].length; ++i)\n distance[i] = aggregate(distances.map((d) => d[i]));\n const matrixProxy = distanceMatrixProxy(distance, this.data[0].length);\n this.reducer.initDataDist(matrixProxy);\n for (let i = 0; i < this.iterations; ++i)\n this.reducer.step(); // every time you call this, solution gets better\n matrixService.terminate();\n return this.reducer.getSolution();\n }\n catch (e) {\n matrixService.terminate();\n throw e;\n }\n }\n}\nclass UMAPReducer extends MultiColumnReducer {\n reducer;\n distanceFnames;\n distanceFns;\n vectors;\n progressFunc;\n distanceFnArgs;\n /**\n * Creates an instance of UMAPReducer.\n * @param {Options} options Options to pass to the constructor.\n * @memberof UMAPReducer\n */\n constructor(options) {\n const randomSeed = options.randomSeed ?? Date();\n const randomFn = seedRandom(randomSeed);\n console.log(randomSeed);\n console.log(randomFn(), randomFn(), randomFn());\n super(options);\n assert('distanceFnames' in options);\n assert('distanceFns' in options);\n this.distanceFnArgs = options.distanceFnArgs;\n this.distanceFns = options.distanceFns;\n this.progressFunc = options.progressFunc;\n this.distanceFnames = options.distanceFnames;\n //Umap uses vector indexing, so we need to create an array of vectors as indeces.\n this.vectors = new Array(this.data[0].length).fill(0).map((_, i) => i);\n if (this.data[0].length < 15)\n options.nNeighbors = this.data[0].length - 1;\n options.random = randomFn;\n this.reducer = new UMAP(options);\n // this.reducer.distanceFn = this._encodedDistance.bind(this);\n }\n /**\n * Embeds the data given into the two-dimensional space using UMAP method.\n * @param {boolean} [_parallelDistanceWorkers] Whether to use parallel distance matrix workers.\n * @return {any} Cartesian coordinate of this embedding.\n */\n async transform(_parallelDistanceWorkers) {\n console.time('knn graph');\n const knnRes = await new SparseMatrixService()\n .multiColumnKNN(this.data, this.distanceFnames, this.reducer.neighbors, this.distanceFnArgs, this.weights, this.aggregationMethod);\n console.timeEnd('knn graph');\n this.reducer.setPrecomputedKNN(knnRes.knnIndexes, knnRes.knnDistances);\n // needed so that garbage collector can free memory from distance matrix\n await new Promise((resolve) => {\n setTimeout(() => {\n resolve();\n }, 300);\n });\n const embedding = await this.reducer.fitAsync(this.vectors, (epoc) => {\n if (this.progressFunc)\n this.progressFunc(epoc, this.reducer.getNEpochs(), this.reducer.getEmbedding());\n });\n function arrayCast2Coordinates(data) {\n return new Array(data.length).fill(0).map((_, i) => (Vector.from(data[i])));\n }\n return arrayCast2Coordinates(embedding);\n }\n}\nconst AvailableReducers = {\n 'UMAP': UMAPReducer,\n 't-SNE': TSNEReducer,\n};\nexport class MultiColDimReducer {\n reducer;\n /**\n * Creates an instance of DimensionalityReducer.\n * @param {any[]} data Vectors to embed.\n * @param {KnownMethods} method Embedding method to be applied\n * @param {KnownMetrics} metric Distance metric to be computed between each of the vectors.\n * @param {Options} [options] Options to pass to the implementing embedders.\n * @memberof DimensionalityReducer\n */\n constructor(data, method, metrics, weights, distanceAggregation, options) {\n const measures = [];\n for (let idx = 0; idx < metrics.length; ++idx) {\n const measure = new Measure(metrics[idx]).getMeasure(options.distanceFnArgs[idx]);\n measures.push(measure);\n let bitArrayLength = 2048;\n for (let i = 0; i < data[idx].length; ++i) {\n if (data[idx][i] && data[idx][i]._length) {\n bitArrayLength = data[idx][i]._length;\n break;\n }\n }\n if (isBitArrayMetric(metrics[idx])) {\n for (let i = 0; i < data[idx].length; ++i) {\n if (data[idx][i] && data[idx][i]._data)\n data[idx][i] = new BitArray(data[idx][i]._data, data[idx][i]._length);\n else\n data[idx][i] = new BitArray(bitArrayLength);\n }\n }\n }\n if (method == 'UMAP') {\n this.reducer = new UMAPReducer({\n data: data,\n distanceFnames: metrics,\n distanceFns: measures,\n distanceFnArgs: options.distanceFnArgs,\n weights: weights,\n aggregationMethod: distanceAggregation,\n ...options\n });\n }\n else if (method == 't-SNE') {\n this.reducer = new TSNEReducer({\n data: data,\n distanceFnames: metrics,\n distanceFns: measures,\n distanceFnArgs: options.distanceFnArgs,\n weights: weights,\n aggregationMethod: distanceAggregation,\n ...options\n });\n }\n }\n /**\n * Embeds the data given into the two-dimensional space using the chosen method.\n *\n * @param {boolean} transpose Whether to transform coordinates to have columns-first orientation.\n * @param {boolean} parallelDistanceWorkers Whether to use parallel distance computation.\n * @throws {Error} If the embedding method was not found.\n * @return {any} Cartesian coordinate of this embedding and distance matrix where applicable.\n * @memberof DimensionalityReducer\n */\n async transform(transpose = false) {\n if (this.reducer === undefined)\n throw new Error('Reducer was not defined.');\n let embedding = await this.reducer.transform();\n if (transpose)\n embedding = transposeMatrix(embedding);\n return embedding;\n }\n /**\n * Returns metrics available by type.\n *\n * @param {AvailableDataTypes} typeName type name\n * @return {string[]} Metric names which expects the given data type\n * @memberof DimensionalityReducer\n */\n static availableMetricsByType(typeName) {\n return Object.keys(AvailableMetrics[typeName]);\n }\n /**\n * Returns dimensionality reduction methods available.\n *\n * @readonly\n * @memberof DimensionalityReducer\n */\n static get availableMethods() {\n return Object.keys(AvailableReducers);\n }\n /**\n * Returns metrics available.\n *\n * @readonly\n * @memberof DimensionalityReducer\n */\n static get availableMetrics() {\n let ans = [];\n Object.values(AvailableMetrics).forEach((obj) => {\n const array = Object.values(obj);\n ans = [...ans, ...array];\n });\n return ans;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktY29sdW1uLWRpbS1yZWR1Y2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibXVsdGktY29sdW1uLWRpbS1yZWR1Y2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBK0MsTUFBTSxFQUFVLE1BQy9ELGlEQUFpRCxDQUFDO0FBQ3pELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFxQixnQkFBZ0IsRUFBZ0IsT0FBTyxFQUFFLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDL0csT0FBTyxFQUFDLHFCQUFxQixFQUFFLG1CQUFtQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDOUUsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFaEUsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM3QixPQUFPLEVBQUMsTUFBTSxFQUFFLGVBQWUsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ3hGLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBRTdFLE9BQU8sUUFBUSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9ELE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQztBQThCcEMsTUFBZSxrQkFBa0I7SUFDbkIsSUFBSSxDQUFZO0lBQ2hCLE9BQU8sQ0FBVztJQUNsQixpQkFBaUIsQ0FBNEI7SUFDdkQsWUFBWSxPQUFnQjtRQUMxQixJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7SUFDckQsQ0FBQztDQUtKO0FBRUQsTUFBTSxXQUFZLFNBQVEsa0JBQWtCO0lBQzlCLE9BQU8sQ0FBTztJQUNkLFVBQVUsQ0FBUztJQUNuQixj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RCxNQUFNLEtBQUssZ0JBQWdCO1FBQ3pCLElBQUksR0FBRyxHQUFhLEVBQUUsQ0FBQztRQUN2QixNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDOUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Nvb3JkaW5hdGVzLCBEaXN0YW5jZU1ldHJpYywgTWF0cml4LCBPcHRpb25zLCBWZWN0b3IsIFZlY3RvcnN9XG4gIGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7VFNORX0gZnJvbSAnQGtlY2tlbHQvdHNuZSc7XG5pbXBvcnQge0F2YWlsYWJsZURhdGFUeXBlcywgQXZhaWxhYmxlTWV0cmljcywgS25vd25NZXRyaWNzLCBNZWFzdXJlLCBpc0JpdEFycmF5TWV0cmljfSBmcm9tICcuLi90eXBlZC1tZXRyaWNzJztcbmltcG9ydCB7RGlzdGFuY2VNYXRyaXhTZXJ2aWNlLCBkaXN0YW5jZU1hdHJpeFByb3h5fSBmcm9tICcuLi9kaXN0YW5jZS1tYXRyaXgnO1xuaW1wb3J0IHtnZXRBZ2dyZWdhdGlvbkZ1bmN0aW9ufSBmcm9tICcuLi9kaXN0YW5jZS1tYXRyaXgvdXRpbHMnO1xuaW1wb3J0IHtEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kfSBmcm9tICcuLi9kaXN0YW5jZS1tYXRyaXgvdHlwZXMnO1xuaW1wb3J0IHtVTUFQfSBmcm9tICcuLi91bWFwJztcbmltcG9ydCB7YXNzZXJ0LCB0cmFuc3Bvc2VNYXRyaXh9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3ZlY3Rvci1vcGVyYXRpb25zJztcbmltcG9ydCB7U3BhcnNlTWF0cml4U2VydmljZX0gZnJvbSAnLi4vZGlzdGFuY2UtbWF0cml4L3NwYXJzZS1tYXRyaXgtc2VydmljZSc7XG5pbXBvcnQge0RpbVJlZHVjdGlvbk1ldGhvZHN9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IEJpdEFycmF5IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL2JpdC1hcnJheSc7XG5pbXBvcnQgc2VlZFJhbmRvbSBmcm9tICdzZWVkcmFuZG9tJztcblxuZXhwb3J0IGludGVyZmFjZSBJVU1BUE9wdGlvbnMge1xuICAgIGxlYXJuaW5nUmF0ZT86IG51bWJlcjtcbiAgICBuQ29tcG9uZW50cz86IG51bWJlcjtcbiAgICBuRXBvY2hzPzogbnVtYmVyO1xuICAgIG5OZWlnaGJvcnM/OiBudW1iZXI7XG4gICAgc3ByZWFkPzogbnVtYmVyO1xuICAgIG1pbkRpc3Q/OiBudW1iZXI7XG4gICAgcHJvZ3Jlc3NGdW5jPzogKGVwb2M6IG51bWJlciwgZXBvY2hzTGVuZ3RoOiBudW1iZXIsIGVtYmVkZGluZ3M6IG51bWJlcltdW10pID0+IHZvaWQ7XG4gICAgcmFuZG9tU2VlZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVFNORU9wdGlvbnMge1xuICAgIGVwc2lsb24/OiBudW1iZXI7XG4gICAgcGVycGxleGl0eT86IG51bWJlcjtcbiAgICBkaW0/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpbVJlZHVjdGlvblBhcmFtPFQgZXh0ZW5kcyBudW1iZXIgfCBzdHJpbmcgPSBudW1iZXI+IHtcbiAgICB1aU5hbWU6IHN0cmluZztcbiAgICB2YWx1ZTogKFQgZXh0ZW5kcyBudW1iZXIgPyBudW1iZXIgOiBzdHJpbmcpIHwgbnVsbDtcbiAgICB0b29sdGlwOiBzdHJpbmc7XG4gICAgdHlwZT86IFQgZXh0ZW5kcyBudW1iZXIgPyAnbnVtYmVyJyA6ICdzdHJpbmcnO1xuICAgIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAgIG1pbj86IG51bWJlcjtcbiAgICBtYXg/OiBudW1iZXI7XG4gICAgc3RlcD86IG51bWJlcjtcbn1cblxuYWJzdHJhY3QgY2xhc3MgTXVsdGlDb2x1bW5SZWR1Y2VyIHtcbiAgICBwcm90ZWN0ZWQgZGF0YTogVmVjdG9yc1tdO1xuICAgIHByb3RlY3RlZCB3ZWlnaHRzOiBudW1iZXJbXTtcbiAgICBwcm90ZWN0ZWQgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2Q7XG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucykge1xuICAgICAgdGhpcy5kYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgICAgdGhpcy53ZWlnaHRzID0gb3B0aW9ucy53ZWlnaHRzO1xuICAgICAgdGhpcy5hZ2dyZWdhdGlvbk1ldGhvZCA9IG9wdGlvbnMuYWdncmVnYXRpb25NZXRob2Q7XG4gICAgfVxuXG4gICAgLyoqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UuXG4gICAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZyBhbmQgZGlzdGFuY2UgbWF0cml4IHdoZXJlIGFwcGxpY2FibGUuICovXG4gICAgYWJzdHJhY3QgdHJhbnNmb3JtKCk6IFByb21pc2U8TWF0cml4Pjtcbn1cblxuY2xhc3MgVFNORVJlZHVjZXIgZXh0ZW5kcyBNdWx0aUNvbHVtblJlZHVjZXIge1xuICAgIHByb3RlY3RlZCByZWR1Y2VyOiBUU05FO1xuICAgIHByb3RlY3RlZCBpdGVyYXRpb25zOiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIGRpc3RhbmNlRm5hbWVzOiBLbm93bk1ldHJpY3NbXTtcbiAgICBwcm90ZWN0ZWQgZGlzdGFuY2VGbnM6ICgoYTogYW55LCBiOiBhbnkpID0+IG51bWJlcilbXTtcbiAgICBwcm90ZWN0ZWQgZGlzdGFuY2VGbkFyZ3M6IHtbXzogc3RyaW5nXTogYW55fVtdO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBUU05FUmVkdWNlci5cbiAgICAgKiBAcGFyYW0ge09wdGlvbnN9IG9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBAbWVtYmVyb2YgVFNORVJlZHVjZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgIHRoaXMucmVkdWNlciA9IG5ldyBUU05FKG9wdGlvbnMpO1xuICAgICAgdGhpcy5pdGVyYXRpb25zID0gb3B0aW9ucz8uaXRlcmF0aW9ucyA/PyAxMDA7XG4gICAgICB0aGlzLmRpc3RhbmNlRm5hbWVzID0gb3B0aW9ucy5kaXN0YW5jZUZuYW1lcztcbiAgICAgIHRoaXMuZGlzdGFuY2VGbnMgPSBvcHRpb25zLmRpc3RhbmNlRm5zO1xuICAgICAgdGhpcy5kaXN0YW5jZUZuQXJncyA9IG9wdGlvbnMuZGlzdGFuY2VGbkFyZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1iZWRzIHRoZSBkYXRhIGdpdmVuIGludG8gdGhlIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyB0LVNORSBtZXRob2QuXFxcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwYXJhbGxlbERpc3RhbmNlV29ya2Vyc10gV2hldGhlciB0byB1c2UgcGFyYWxsZWwgZGlzdGFuY2Ugd29ya2Vycy5cbiAgICAgKiBAcmV0dXJuIHthbnl9IENhcnRlc2lhbiBjb29yZGluYXRlIG9mIHRoaXMgZW1iZWRkaW5nIGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdHJhbnNmb3JtKCk6IFByb21pc2U8TWF0cml4PiB7XG4gICAgICBpZiAodGhpcy5kYXRhWzBdLmxlbmd0aCA+IDEwMDAwKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01heGltdW0gbnVtYmVyIG9mIHNhbXBsZXMgZm9yIFQtU05FIGlzIDEwMDAwJyk7XG4gICAgICBjb25zdCBtYXRyaXhTZXJ2aWNlID0gbmV3IERpc3RhbmNlTWF0cml4U2VydmljZSh0cnVlLCBmYWxzZSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBhZ2dyZWdhdGUgPSBnZXRBZ2dyZWdhdGlvbkZ1bmN0aW9uKHRoaXMuYWdncmVnYXRpb25NZXRob2QsIHRoaXMud2VpZ2h0cyk7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlczogQXJyYXk8RmxvYXQzMkFycmF5PiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGNvbnN0IGRpc3QgPSBhd2FpdCBtYXRyaXhTZXJ2aWNlLmNhbGModGhpcy5kYXRhW2ldLCB0aGlzLmRpc3RhbmNlRm5hbWVzW2ldLCBmYWxzZSwgdGhpcy5kaXN0YW5jZUZuQXJnc1tpXSk7XG4gICAgICAgICAgZGlzdGFuY2VzLnB1c2goZGlzdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBuZXcgRmxvYXQzMkFycmF5KGRpc3RhbmNlc1swXS5sZW5ndGgpLmZpbGwoMCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzdGFuY2VzWzBdLmxlbmd0aDsgKytpKVxuICAgICAgICAgIGRpc3RhbmNlW2ldID0gYWdncmVnYXRlKGRpc3RhbmNlcy5tYXAoKGQpID0+IGRbaV0pKTtcbiAgICAgICAgY29uc3QgbWF0cml4UHJveHkgPSBkaXN0YW5jZU1hdHJpeFByb3h5KGRpc3RhbmNlLCB0aGlzLmRhdGFbMF0ubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5yZWR1Y2VyLmluaXREYXRhRGlzdChtYXRyaXhQcm94eSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLml0ZXJhdGlvbnM7ICsraSlcbiAgICAgICAgICB0aGlzLnJlZHVjZXIuc3RlcCgpOyAvLyBldmVyeSB0aW1lIHlvdSBjYWxsIHRoaXMsIHNvbHV0aW9uIGdldHMgYmV0dGVyXG4gICAgICAgIG1hdHJpeFNlcnZpY2UudGVybWluYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZHVjZXIuZ2V0U29sdXRpb24oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbWF0cml4U2VydmljZS50ZXJtaW5hdGUoKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFVNQVBSZWR1Y2VyIGV4dGVuZHMgTXVsdGlDb2x1bW5SZWR1Y2VyIHtcbiAgICBwcm90ZWN0ZWQgcmVkdWNlcjogVU1BUDtcbiAgICBwcm90ZWN0ZWQgZGlzdGFuY2VGbmFtZXM6IEtub3duTWV0cmljc1tdO1xuICAgIHByb3RlY3RlZCBkaXN0YW5jZUZuczogRnVuY3Rpb25bXTtcbiAgICBwcm90ZWN0ZWQgdmVjdG9yczogbnVtYmVyW107XG4gICAgcHJvdGVjdGVkIHByb2dyZXNzRnVuYz86IChlcG9jOiBudW1iZXIsIGVwb2Noc0xlbmd0aDogbnVtYmVyLCBlbWJlZGRpbmdzOiBudW1iZXJbXVtdKSA9PiB2b2lkO1xuICAgIHByb3RlY3RlZCBkaXN0YW5jZUZuQXJnczoge1tfOiBzdHJpbmddOiBhbnl9W107XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBVTUFQUmVkdWNlci5cbiAgICAgKiBAcGFyYW0ge09wdGlvbnN9IG9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBAbWVtYmVyb2YgVU1BUFJlZHVjZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICBjb25zdCByYW5kb21TZWVkOiBzdHJpbmcgPSBvcHRpb25zLnJhbmRvbVNlZWQgPz8gRGF0ZSgpO1xuICAgICAgY29uc3QgcmFuZG9tRm4gPSBzZWVkUmFuZG9tKHJhbmRvbVNlZWQpO1xuICAgICAgY29uc29sZS5sb2cocmFuZG9tU2VlZCk7XG4gICAgICBjb25zb2xlLmxvZyhyYW5kb21GbigpLCByYW5kb21GbigpLCByYW5kb21GbigpKTtcbiAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgYXNzZXJ0KCdkaXN0YW5jZUZuYW1lcycgaW4gb3B0aW9ucyk7XG4gICAgICBhc3NlcnQoJ2Rpc3RhbmNlRm5zJyBpbiBvcHRpb25zKTtcbiAgICAgIHRoaXMuZGlzdGFuY2VGbkFyZ3MgPSBvcHRpb25zLmRpc3RhbmNlRm5BcmdzO1xuICAgICAgdGhpcy5kaXN0YW5jZUZucyA9IG9wdGlvbnMuZGlzdGFuY2VGbnMhO1xuICAgICAgdGhpcy5wcm9ncmVzc0Z1bmMgPSBvcHRpb25zLnByb2dyZXNzRnVuYztcblxuICAgICAgdGhpcy5kaXN0YW5jZUZuYW1lcyA9IG9wdGlvbnMuZGlzdGFuY2VGbmFtZXMhO1xuICAgICAgLy9VbWFwIHVzZXMgdmVjdG9yIGluZGV4aW5nLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhbiBhcnJheSBvZiB2ZWN0b3JzIGFzIGluZGVjZXMuXG4gICAgICB0aGlzLnZlY3RvcnMgPSBuZXcgQXJyYXkodGhpcy5kYXRhWzBdLmxlbmd0aCkuZmlsbCgwKS5tYXAoKF8sIGkpID0+IGkpO1xuXG4gICAgICBpZiAodGhpcy5kYXRhWzBdLmxlbmd0aCA8IDE1KVxuICAgICAgICBvcHRpb25zLm5OZWlnaGJvcnMgPSB0aGlzLmRhdGFbMF0ubGVuZ3RoIC0gMTtcbiAgICAgIG9wdGlvbnMucmFuZG9tID0gcmFuZG9tRm47XG4gICAgICB0aGlzLnJlZHVjZXIgPSBuZXcgVU1BUChvcHRpb25zKTtcbiAgICAgIC8vIHRoaXMucmVkdWNlci5kaXN0YW5jZUZuID0gdGhpcy5fZW5jb2RlZERpc3RhbmNlLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1iZWRzIHRoZSBkYXRhIGdpdmVuIGludG8gdGhlIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyBVTUFQIG1ldGhvZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtfcGFyYWxsZWxEaXN0YW5jZVdvcmtlcnNdIFdoZXRoZXIgdG8gdXNlIHBhcmFsbGVsIGRpc3RhbmNlIG1hdHJpeCB3b3JrZXJzLlxuICAgICAqIEByZXR1cm4ge2FueX0gQ2FydGVzaWFuIGNvb3JkaW5hdGUgb2YgdGhpcyBlbWJlZGRpbmcuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHRyYW5zZm9ybShfcGFyYWxsZWxEaXN0YW5jZVdvcmtlcnM/OiBib29sZWFuKTogUHJvbWlzZTxNYXRyaXg+IHtcbiAgICAgIGNvbnNvbGUudGltZSgna25uIGdyYXBoJyk7XG4gICAgICBjb25zdCBrbm5SZXMgPSBhd2FpdCBuZXcgU3BhcnNlTWF0cml4U2VydmljZSgpXG4gICAgICAgIC5tdWx0aUNvbHVtbktOTih0aGlzLmRhdGEsIHRoaXMuZGlzdGFuY2VGbmFtZXMsIHRoaXMucmVkdWNlci5uZWlnaGJvcnMsXG4gICAgICAgICAgdGhpcy5kaXN0YW5jZUZuQXJncywgdGhpcy53ZWlnaHRzLCB0aGlzLmFnZ3JlZ2F0aW9uTWV0aG9kKTtcbiAgICAgIGNvbnNvbGUudGltZUVuZCgna25uIGdyYXBoJyk7XG4gICAgICB0aGlzLnJlZHVjZXIuc2V0UHJlY29tcHV0ZWRLTk4oa25uUmVzLmtubkluZGV4ZXMsIGtublJlcy5rbm5EaXN0YW5jZXMpO1xuXG4gICAgICAvLyBuZWVkZWQgc28gdGhhdCBnYXJiYWdlIGNvbGxlY3RvciBjYW4gZnJlZSBtZW1vcnkgZnJvbSBkaXN0YW5jZSBtYXRyaXhcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSwgMzAwKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBlbWJlZGRpbmcgPSBhd2FpdCB0aGlzLnJlZHVjZXIuZml0QXN5bmModGhpcy52ZWN0b3JzLCAoZXBvYykgPT4ge1xuICAgICAgICBpZiAodGhpcy5wcm9ncmVzc0Z1bmMpXG4gICAgICAgICAgdGhpcy5wcm9ncmVzc0Z1bmMoZXBvYywgdGhpcy5yZWR1Y2VyLmdldE5FcG9jaHMoKSwgdGhpcy5yZWR1Y2VyLmdldEVtYmVkZGluZygpKTtcbiAgICAgIH0pO1xuXG4gICAgICBmdW5jdGlvbiBhcnJheUNhc3QyQ29vcmRpbmF0ZXMoZGF0YTogbnVtYmVyW11bXSk6IENvb3JkaW5hdGVzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBcnJheShkYXRhLmxlbmd0aCkuZmlsbCgwKS5tYXAoKF8sIGkpID0+IChWZWN0b3IuZnJvbShkYXRhW2ldKSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXJyYXlDYXN0MkNvb3JkaW5hdGVzKGVtYmVkZGluZyk7XG4gICAgfVxufVxuXG5jb25zdCBBdmFpbGFibGVSZWR1Y2VycyA9IHtcbiAgJ1VNQVAnOiBVTUFQUmVkdWNlcixcbiAgJ3QtU05FJzogVFNORVJlZHVjZXIsXG59O1xuXG5leHBvcnQgdHlwZSBLbm93bk1ldGhvZHMgPSBrZXlvZiB0eXBlb2YgQXZhaWxhYmxlUmVkdWNlcnM7XG5cbmV4cG9ydCBjbGFzcyBNdWx0aUNvbERpbVJlZHVjZXIge1xuICAgIHByaXZhdGUgcmVkdWNlcjogTXVsdGlDb2x1bW5SZWR1Y2VyIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIERpbWVuc2lvbmFsaXR5UmVkdWNlci5cbiAgICogQHBhcmFtIHthbnlbXX0gZGF0YSBWZWN0b3JzIHRvIGVtYmVkLlxuICAgKiBAcGFyYW0ge0tub3duTWV0aG9kc30gbWV0aG9kIEVtYmVkZGluZyBtZXRob2QgdG8gYmUgYXBwbGllZFxuICAgKiBAcGFyYW0ge0tub3duTWV0cmljc30gbWV0cmljIERpc3RhbmNlIG1ldHJpYyB0byBiZSBjb21wdXRlZCBiZXR3ZWVuIGVhY2ggb2YgdGhlIHZlY3RvcnMuXG4gICAqIEBwYXJhbSB7T3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgaW1wbGVtZW50aW5nIGVtYmVkZGVycy5cbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBBcnJheTxhbnlbXT4sIG1ldGhvZDogRGltUmVkdWN0aW9uTWV0aG9kcywgbWV0cmljczogS25vd25NZXRyaWNzW10sXG4gICAgICB3ZWlnaHRzOiBudW1iZXJbXSwgZGlzdGFuY2VBZ2dyZWdhdGlvbjogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCwgb3B0aW9uczogT3B0aW9ucykge1xuICAgICAgY29uc3QgbWVhc3VyZXM6IERpc3RhbmNlTWV0cmljW10gPSBbXTtcbiAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IG1ldHJpY3MubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICBjb25zdCBtZWFzdXJlID0gbmV3IE1lYXN1cmUobWV0cmljc1tpZHhdKS5nZXRNZWFzdXJlKG9wdGlvbnMuZGlzdGFuY2VGbkFyZ3NbaWR4XSk7XG4gICAgICAgIG1lYXN1cmVzLnB1c2gobWVhc3VyZSk7XG4gICAgICAgIGxldCBiaXRBcnJheUxlbmd0aCA9IDIwNDg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YVtpZHhdLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKGRhdGFbaWR4XVtpXSAmJiBkYXRhW2lkeF1baV0uX2xlbmd0aCkge1xuICAgICAgICAgICAgYml0QXJyYXlMZW5ndGggPSBkYXRhW2lkeF1baV0uX2xlbmd0aDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNCaXRBcnJheU1ldHJpYyhtZXRyaWNzW2lkeF0pKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhW2lkeF0ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChkYXRhW2lkeF1baV0gJiYgZGF0YVtpZHhdW2ldLl9kYXRhKVxuICAgICAgICAgICAgICBkYXRhW2lkeF1baV0gPSBuZXcgQml0QXJyYXkoZGF0YVtpZHhdW2ldLl9kYXRhLCBkYXRhW2lkeF1baV0uX2xlbmd0aCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIGRhdGFbaWR4XVtpXSA9IG5ldyBCaXRBcnJheShiaXRBcnJheUxlbmd0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXRob2QgPT0gJ1VNQVAnKSB7XG4gICAgICAgIHRoaXMucmVkdWNlciA9IG5ldyBVTUFQUmVkdWNlcih7XG4gICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICBkaXN0YW5jZUZuYW1lczogbWV0cmljcyxcbiAgICAgICAgICBkaXN0YW5jZUZuczogbWVhc3VyZXMsXG4gICAgICAgICAgZGlzdGFuY2VGbkFyZ3M6IG9wdGlvbnMuZGlzdGFuY2VGbkFyZ3MsXG4gICAgICAgICAgd2VpZ2h0czogd2VpZ2h0cyxcbiAgICAgICAgICBhZ2dyZWdhdGlvbk1ldGhvZDogZGlzdGFuY2VBZ2dyZWdhdGlvbixcbiAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT0gJ3QtU05FJykge1xuICAgICAgICB0aGlzLnJlZHVjZXIgPSBuZXcgVFNORVJlZHVjZXIoe1xuICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgZGlzdGFuY2VGbmFtZXM6IG1ldHJpY3MsXG4gICAgICAgICAgZGlzdGFuY2VGbnM6IG1lYXN1cmVzLFxuICAgICAgICAgIGRpc3RhbmNlRm5BcmdzOiBvcHRpb25zLmRpc3RhbmNlRm5BcmdzLFxuICAgICAgICAgIHdlaWdodHM6IHdlaWdodHMsXG4gICAgICAgICAgYWdncmVnYXRpb25NZXRob2Q6IGRpc3RhbmNlQWdncmVnYXRpb24sXG4gICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICogRW1iZWRzIHRoZSBkYXRhIGdpdmVuIGludG8gdGhlIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyB0aGUgY2hvc2VuIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSB0cmFuc3Bvc2UgV2hldGhlciB0byB0cmFuc2Zvcm0gY29vcmRpbmF0ZXMgdG8gaGF2ZSBjb2x1bW5zLWZpcnN0IG9yaWVudGF0aW9uLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFsbGVsRGlzdGFuY2VXb3JrZXJzIFdoZXRoZXIgdG8gdXNlIHBhcmFsbGVsIGRpc3RhbmNlIGNvbXB1dGF0aW9uLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGVtYmVkZGluZyBtZXRob2Qgd2FzIG5vdCBmb3VuZC5cbiAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZyBhbmQgZGlzdGFuY2UgbWF0cml4IHdoZXJlIGFwcGxpY2FibGUuXG4gICAqIEBtZW1iZXJvZiBEaW1lbnNpb25hbGl0eVJlZHVjZXJcbiAgICovXG4gICAgcHVibGljIGFzeW5jIHRyYW5zZm9ybSh0cmFuc3Bvc2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8TWF0cml4PiB7XG4gICAgICBpZiAodGhpcy5yZWR1Y2VyID09PSB1bmRlZmluZWQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVkdWNlciB3YXMgbm90IGRlZmluZWQuJyk7XG5cbiAgICAgIGxldCBlbWJlZGRpbmcgPSBhd2FpdCB0aGlzLnJlZHVjZXIudHJhbnNmb3JtKCk7XG5cbiAgICAgIGlmICh0cmFuc3Bvc2UpXG4gICAgICAgIGVtYmVkZGluZyA9IHRyYW5zcG9zZU1hdHJpeChlbWJlZGRpbmcpO1xuXG4gICAgICByZXR1cm4gZW1iZWRkaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgKiBSZXR1cm5zIG1ldHJpY3MgYXZhaWxhYmxlIGJ5IHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSB7QXZhaWxhYmxlRGF0YVR5cGVzfSB0eXBlTmFtZSB0eXBlIG5hbWVcbiAgICogQHJldHVybiB7c3RyaW5nW119IE1ldHJpYyBuYW1lcyB3aGljaCBleHBlY3RzIHRoZSBnaXZlbiBkYXRhIHR5cGVcbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgICBzdGF0aWMgYXZhaWxhYmxlTWV0cmljc0J5VHlwZSh0eXBlTmFtZTogQXZhaWxhYmxlRGF0YVR5cGVzKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoQXZhaWxhYmxlTWV0cmljc1t0eXBlTmFtZV0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgKiBSZXR1cm5zIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiBtZXRob2RzIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHJlYWRvbmx5XG4gICAqIEBtZW1iZXJvZiBEaW1lbnNpb25hbGl0eVJlZHVjZXJcbiAgICovXG4gICAgc3RhdGljIGdldCBhdmFpbGFibGVNZXRob2RzKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKEF2YWlsYWJsZVJlZHVjZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICogUmV0dXJucyBtZXRyaWNzIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHJlYWRvbmx5XG4gICAqIEBtZW1iZXJvZiBEaW1lbnNpb25hbGl0eVJlZHVjZXJcbiAgICovXG4gICAgc3RhdGljIGdldCBhdmFpbGFibGVNZXRyaWNzKCkge1xuICAgICAgbGV0IGFuczogc3RyaW5nW10gPSBbXTtcbiAgICAgIE9iamVjdC52YWx1ZXMoQXZhaWxhYmxlTWV0cmljcykuZm9yRWFjaCgob2JqKSA9PiB7XG4gICAgICAgIGNvbnN0IGFycmF5ID0gT2JqZWN0LnZhbHVlcyhvYmopO1xuICAgICAgICBhbnMgPSBbLi4uYW5zLCAuLi5hcnJheV07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhbnM7XG4gICAgfVxufVxuIl19","/** Proxy for DistanceMatrix class. Allows to index matrix as matrix[i][j]\n * Note: much slower than direct indexing, but still much faster than recalculating distances.\n * will be used for T-SNE mainly.\n * @param {Float32Array}condensedArray - array of distances between all pairs of objects\n * @param {number}size - number of comparebles in matrix\n * @return {Float32Array} - proxy for condensedArray\n*/\nexport function distanceMatrixProxy(condensedArray, size) {\n const linearFunc = dmLinearIndex(size);\n function linearIndex(i, j) {\n const iNum = Number(i);\n const jNum = Number(j);\n return linearFunc(iNum, jNum);\n }\n function idx2Handler(idx1) {\n return ({\n get(target, idx2, _receiver) {\n if (idx1 === idx2)\n return 0;\n const linearIdx = Number(idx1) > Number(idx2) ? linearIndex(idx2, idx1) : linearIndex(idx1, idx2);\n return target[linearIdx];\n },\n });\n }\n const idx1Handler = {\n get(target, idx1, _receiver) {\n if (idx1 === 'length')\n return size;\n return new Proxy(target, idx2Handler(idx1));\n },\n };\n return new Proxy(condensedArray, idx1Handler);\n}\nexport function dmLinearIndex(size) {\n return (i, j) => size * i + j - Math.floor(((i + 2) * (i + 1)) / 2);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7O0VBTUU7QUFDRixNQUFNLFVBQVUsbUJBQW1CLENBQUMsY0FBNEIsRUFBRSxJQUFZO0lBQzVFLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxTQUFTLFdBQVcsQ0FBQyxDQUFrQixFQUFFLENBQWtCO1FBQ3pELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxTQUFTLFdBQVcsQ0FBQyxJQUFxQjtRQUN4QyxPQUFPLENBQ0w7WUFDRSxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTO2dCQUN6QixJQUFJLElBQUksS0FBSyxJQUFJO29CQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUM1QixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNsRyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzQixDQUFDO1NBQ0YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sV0FBVyxHQUErQjtRQUM5QyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTO1lBQ3pCLElBQUksSUFBSSxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDbkMsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQztLQUNGLENBQUM7SUFFRixPQUFPLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFZO0lBQ3hDLE9BQU8sQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5cbi8qKiBQcm94eSBmb3IgRGlzdGFuY2VNYXRyaXggY2xhc3MuIEFsbG93cyB0byBpbmRleCBtYXRyaXggYXMgbWF0cml4W2ldW2pdXG4gKiBOb3RlOiBtdWNoIHNsb3dlciB0aGFuIGRpcmVjdCBpbmRleGluZywgYnV0IHN0aWxsIG11Y2ggZmFzdGVyIHRoYW4gcmVjYWxjdWxhdGluZyBkaXN0YW5jZXMuXG4gKiB3aWxsIGJlIHVzZWQgZm9yIFQtU05FIG1haW5seS5cbiAqIEBwYXJhbSB7RmxvYXQzMkFycmF5fWNvbmRlbnNlZEFycmF5IC0gYXJyYXkgb2YgZGlzdGFuY2VzIGJldHdlZW4gYWxsIHBhaXJzIG9mIG9iamVjdHNcbiAqIEBwYXJhbSB7bnVtYmVyfXNpemUgLSBudW1iZXIgb2YgY29tcGFyZWJsZXMgaW4gbWF0cml4XG4gKiBAcmV0dXJuIHtGbG9hdDMyQXJyYXl9IC0gcHJveHkgZm9yIGNvbmRlbnNlZEFycmF5XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlTWF0cml4UHJveHkoY29uZGVuc2VkQXJyYXk6IEZsb2F0MzJBcnJheSwgc2l6ZTogbnVtYmVyKTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgbGluZWFyRnVuYyA9IGRtTGluZWFySW5kZXgoc2l6ZSk7XG4gIGZ1bmN0aW9uIGxpbmVhckluZGV4KGk6IHN5bWJvbCB8IHN0cmluZywgajogc3ltYm9sIHwgc3RyaW5nKSB7XG4gICAgY29uc3QgaU51bSA9IE51bWJlcihpKTtcbiAgICBjb25zdCBqTnVtID0gTnVtYmVyKGopO1xuICAgIHJldHVybiBsaW5lYXJGdW5jKGlOdW0sIGpOdW0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaWR4MkhhbmRsZXIoaWR4MTogc3ltYm9sIHwgc3RyaW5nKTpQcm94eUhhbmRsZXI8RmxvYXQzMkFycmF5PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgaWR4MiwgX3JlY2VpdmVyKSB7XG4gICAgICAgICAgaWYgKGlkeDEgPT09IGlkeDIpIHJldHVybiAwO1xuICAgICAgICAgIGNvbnN0IGxpbmVhcklkeCA9IE51bWJlcihpZHgxKSA+IE51bWJlcihpZHgyKSA/IGxpbmVhckluZGV4KGlkeDIsIGlkeDEpIDogbGluZWFySW5kZXgoaWR4MSwgaWR4Mik7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtsaW5lYXJJZHhdO1xuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgY29uc3QgaWR4MUhhbmRsZXI6IFByb3h5SGFuZGxlcjxGbG9hdDMyQXJyYXk+ID0ge1xuICAgIGdldCh0YXJnZXQsIGlkeDEsIF9yZWNlaXZlcikge1xuICAgICAgaWYgKGlkeDEgPT09ICdsZW5ndGgnKSByZXR1cm4gc2l6ZTtcbiAgICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCBpZHgySGFuZGxlcihpZHgxKSk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gbmV3IFByb3h5KGNvbmRlbnNlZEFycmF5LCBpZHgxSGFuZGxlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkbUxpbmVhckluZGV4KHNpemU6IG51bWJlcik6IChpOiBudW1iZXIsIGo6IG51bWJlcikgPT4gbnVtYmVyIHtcbiAgcmV0dXJuIChpOiBudW1iZXIsIGo6IG51bWJlcikgPT4gc2l6ZSAqIGkgKyBqIC0gTWF0aC5mbG9vcigoKGkgKyAyKSAqIChpICsgMSkpIC8gMik7XG59XG4iXX0=","import { MultiColDimReducer } from './multi-column-dim-reducer';\n/**\n * Worker thread receiving data function.\n *\n * @param {any[]} columnData Samples to process.\n * @param {KnownMethods} method Embedding method.\n * @param {KnownMetrics} measure Distance metric.\n * @param {any} options Options to pass to algorithm.\n * @param {boolean} parallelDistanceWorkers Whether to use parallel distance workers.\n * @return {any} Embedding (and distance matrix where applicable).\n */\nasync function onMessage(columnsData, method, metrics, weights, aggregationMethod, options) {\n const reducer = new MultiColDimReducer(columnsData, method, metrics, weights, aggregationMethod, { ...options, progressFunc });\n return await reducer.transform(true);\n}\nasync function progressFunc(epochNum, epochsLength, embedding) {\n if (epochNum % 5 === 0)\n self.postMessage({ epochNum, epochsLength, embedding });\n}\nself.onmessage = async ({ data: { columnsData, method, distanceMetrics, options, weights, aggregationMethod } }) => {\n let data;\n try {\n const embedding = await onMessage(columnsData, method, distanceMetrics, weights, aggregationMethod, options);\n data = { embedding };\n }\n catch (e) {\n data = { error: e };\n }\n self.postMessage({\n error: data.error,\n embedding: data.embedding,\n });\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsaXQtY29sdW1uLWRpbS1yZWR1Y2VyLXdvcmtlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm11bGl0LWNvbHVtbi1kaW0tcmVkdWNlci13b3JrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFFOUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsS0FBSyxVQUFVLFNBQVMsQ0FBQyxXQUF5QixFQUFFLE1BQTJCLEVBQUUsT0FBdUIsRUFDdEcsT0FBaUIsRUFBRSxpQkFBNEMsRUFDL0QsT0FBWTtJQUNaLE1BQU0sT0FBTyxHQUFHLElBQUksa0JBQWtCLENBQ3BDLFdBQVcsRUFDWCxNQUFNLEVBQ04sT0FBTyxFQUNQLE9BQU8sRUFDUCxpQkFBaUIsRUFDakIsRUFBQyxHQUFHLE9BQU8sRUFBRSxZQUFZLEVBQUMsQ0FDM0IsQ0FBQztJQUNGLE9BQU8sTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFFRCxLQUFLLFVBQVUsWUFBWSxDQUFDLFFBQWdCLEVBQUUsWUFBb0IsRUFBRSxTQUFxQjtJQUN2RixJQUFJLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxFQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUMsRUFBQyxFQUFFLEVBQUU7SUFDN0csSUFBSSxJQUFvQyxDQUFDO0lBQ3pDLElBQUk7UUFDRixNQUFNLFNBQVMsR0FBRyxNQUFNLFNBQVMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0csSUFBSSxHQUFHLEVBQUMsU0FBUyxFQUFDLENBQUM7S0FDcEI7SUFBQyxPQUFPLENBQU0sRUFBRTtRQUNmLElBQUksR0FBRyxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUMsQ0FBQztLQUNuQjtJQUNELElBQUksQ0FBQyxXQUFXLENBQUM7UUFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7UUFDakIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO0tBQzFCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TWF0cml4fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcy90eXBlZC1tZXRyaWNzJztcbmltcG9ydCB7RGltUmVkdWN0aW9uTWV0aG9kc30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2R9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC90eXBlcyc7XG5pbXBvcnQge011bHRpQ29sRGltUmVkdWNlcn0gZnJvbSAnLi9tdWx0aS1jb2x1bW4tZGltLXJlZHVjZXInO1xuXG4vKipcbiAqIFdvcmtlciB0aHJlYWQgcmVjZWl2aW5nIGRhdGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHthbnlbXX0gY29sdW1uRGF0YSBTYW1wbGVzIHRvIHByb2Nlc3MuXG4gKiBAcGFyYW0ge0tub3duTWV0aG9kc30gbWV0aG9kIEVtYmVkZGluZyBtZXRob2QuXG4gKiBAcGFyYW0ge0tub3duTWV0cmljc30gbWVhc3VyZSBEaXN0YW5jZSBtZXRyaWMuXG4gKiBAcGFyYW0ge2FueX0gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gYWxnb3JpdGhtLlxuICogQHBhcmFtIHtib29sZWFufSBwYXJhbGxlbERpc3RhbmNlV29ya2VycyBXaGV0aGVyIHRvIHVzZSBwYXJhbGxlbCBkaXN0YW5jZSB3b3JrZXJzLlxuICogQHJldHVybiB7YW55fSBFbWJlZGRpbmcgKGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZSkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9uTWVzc2FnZShjb2x1bW5zRGF0YTogQXJyYXk8YW55W10+LCBtZXRob2Q6IERpbVJlZHVjdGlvbk1ldGhvZHMsIG1ldHJpY3M6IEtub3duTWV0cmljc1tdLFxuICB3ZWlnaHRzOiBudW1iZXJbXSwgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsXG4gIG9wdGlvbnM6IGFueSk6IFByb21pc2U8TWF0cml4PiB7XG4gIGNvbnN0IHJlZHVjZXIgPSBuZXcgTXVsdGlDb2xEaW1SZWR1Y2VyKFxuICAgIGNvbHVtbnNEYXRhLFxuICAgIG1ldGhvZCxcbiAgICBtZXRyaWNzLFxuICAgIHdlaWdodHMsXG4gICAgYWdncmVnYXRpb25NZXRob2QsXG4gICAgey4uLm9wdGlvbnMsIHByb2dyZXNzRnVuY31cbiAgKTtcbiAgcmV0dXJuIGF3YWl0IHJlZHVjZXIudHJhbnNmb3JtKHRydWUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9ncmVzc0Z1bmMoZXBvY2hOdW06IG51bWJlciwgZXBvY2hzTGVuZ3RoOiBudW1iZXIsIGVtYmVkZGluZzogbnVtYmVyW11bXSkge1xuICBpZiAoZXBvY2hOdW0gJSA1ID09PSAwKVxuICAgIHNlbGYucG9zdE1lc3NhZ2Uoe2Vwb2NoTnVtLCBlcG9jaHNMZW5ndGgsIGVtYmVkZGluZ30pO1xufVxuXG5zZWxmLm9ubWVzc2FnZSA9IGFzeW5jICh7ZGF0YToge2NvbHVtbnNEYXRhLCBtZXRob2QsIGRpc3RhbmNlTWV0cmljcywgb3B0aW9ucywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2R9fSkgPT4ge1xuICBsZXQgZGF0YToge2Vycm9yPzogYW55LCBlbWJlZGRpbmc/OiBhbnl9O1xuICB0cnkge1xuICAgIGNvbnN0IGVtYmVkZGluZyA9IGF3YWl0IG9uTWVzc2FnZShjb2x1bW5zRGF0YSwgbWV0aG9kLCBkaXN0YW5jZU1ldHJpY3MsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kLCBvcHRpb25zKTtcbiAgICBkYXRhID0ge2VtYmVkZGluZ307XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIGRhdGEgPSB7ZXJyb3I6IGV9O1xuICB9XG4gIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgIGVycm9yOiBkYXRhLmVycm9yLFxuICAgIGVtYmVkZGluZzogZGF0YS5lbWJlZGRpbmcsXG4gIH0pO1xufTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TSNE = void 0;\nvar tsne_1 = require(\"./tsne\");\nObject.defineProperty(exports, \"TSNE\", { enumerable: true, get: function () { return tsne_1.TSNE; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TSNE = void 0;\nclass TSNE {\n constructor(opt) {\n // return 0 mean unit standard deviation random number\n this.returnV = false;\n this.vValue = 0.0;\n this.iter = 0;\n opt = opt || {};\n this.perplexity = this.getopt(opt, 'perplexity', 30); // effective number of nearest neighbors\n this.dim = this.getopt(opt, 'dim', 2); // by default 2-D tSNE\n this.epsilon = this.getopt(opt, 'epsilon', 10); // learning rate\n }\n assert(condition, message) {\n if (!condition) {\n throw message || 'Assertion failed';\n }\n }\n // syntax sugar\n getopt(opt, field, defaultval) {\n if (opt.hasOwnProperty(field)) {\n return opt[field];\n }\n else {\n return defaultval;\n }\n }\n gaussRandom() {\n if (this.returnV) {\n this.returnV = false;\n return this.vValue;\n }\n const u = 2 * Math.random() - 1;\n const v = 2 * Math.random() - 1;\n const r = u * u + v * v;\n if (r === 0 || r > 1) {\n return this.gaussRandom();\n }\n const c = Math.sqrt(-2 * Math.log(r) / r);\n this.vValue = v * c; // cache this for next function call for efficiency\n this.returnV = true;\n return u * c;\n }\n // return random normal number\n randn(mu, std) { return mu + this.gaussRandom() * std; }\n // utilitity that creates contiguous vector of zeros of size n\n zeros(n) {\n if (typeof (n) === 'undefined' || isNaN(n)) {\n return [];\n }\n if (typeof ArrayBuffer === 'undefined') {\n // lacking browser support\n const arr = new Array(n);\n for (let i = 0; i < n; i++) {\n arr[i] = 0;\n }\n return arr;\n }\n else {\n return new Float64Array(n); // typed arrays are faster\n }\n }\n // utility that returns 2d array filled with random numbers\n // or with value s, if provided\n randn2d(n, d, s) {\n const uses = typeof s !== 'undefined';\n const x = [];\n for (let i = 0; i < n; i++) {\n const xhere = [];\n for (let j = 0; j < d; j++) {\n if (uses) {\n xhere.push(s);\n }\n else {\n xhere.push(this.randn(0.0, 1e-4));\n }\n }\n x.push(xhere);\n }\n return x;\n }\n // compute L2 distance between two vectors\n L2(x1, x2) {\n const D = x1.length;\n let d = 0;\n for (let i = 0; i < D; i++) {\n const x1i = x1[i];\n const x2i = x2[i];\n d += (x1i - x2i) * (x1i - x2i);\n }\n return d;\n }\n // compute pairwise distance in all vectors in X\n xtod(X) {\n const N = X.length;\n const dist = this.zeros(N * N); // allocate contiguous array\n for (let i = 0; i < N; i++) {\n for (let j = i + 1; j < N; j++) {\n const d = this.L2(X[i], X[j]);\n dist[i * N + j] = d;\n dist[j * N + i] = d;\n }\n }\n return dist;\n }\n // compute (p_{i|j} + p_{j|i})/(2n)\n d2p(D, perplexity, tol) {\n const nf = Math.sqrt(D.length); // this better be an integer\n const n = Math.floor(nf);\n this.assert(n === nf, 'D should have square number of elements.');\n const hTarget = Math.log(perplexity); // target entropy of distribution\n const P = this.zeros(n * n); // temporary probability matrix\n const prow = this.zeros(n); // a temporary storage compartment\n for (let i = 0; i < n; i++) {\n let betamin = -Infinity;\n let betamax = Infinity;\n let beta = 1; // initial value of precision\n let done = false;\n const maxtries = 50;\n // perform binary search to find a suitable precision beta\n // so that the entropy of the distribution is appropriate\n let num = 0;\n while (!done) {\n //debugger;\n // compute entropy and kernel row with beta precision\n let psum = 0.0;\n for (let j = 0; j < n; j++) {\n let pj = Math.exp(-D[i * n + j] * beta);\n if (i === j) {\n pj = 0;\n } // we dont care about diagonals\n prow[j] = pj;\n psum += pj;\n }\n // normalize p and compute entropy\n let nHere = 0.0;\n for (let j = 0; j < n; j++) {\n let pj;\n if (psum === 0) {\n pj = 0;\n }\n else {\n pj = prow[j] / psum;\n }\n prow[j] = pj;\n if (pj > 1e-7) {\n nHere -= pj * Math.log(pj);\n }\n }\n // adjust beta based on result\n if (nHere > hTarget) {\n // entropy was too high (distribution too diffuse)\n // so we need to increase the precision for more peaky distribution\n betamin = beta; // move up the bounds\n if (betamax === Infinity) {\n beta = beta * 2;\n }\n else {\n beta = (beta + betamax) / 2;\n }\n }\n else {\n // converse case. make distrubtion less peaky\n betamax = beta;\n if (betamin === -Infinity) {\n beta = beta / 2;\n }\n else {\n beta = (beta + betamin) / 2;\n }\n }\n // stopping conditions: too many tries or got a good precision\n num++;\n if (Math.abs(nHere - hTarget) < tol) {\n done = true;\n }\n if (num >= maxtries) {\n done = true;\n }\n }\n // console.log('data point ' + i + ' gets precision ' + beta + ' after ' + num + ' binary search steps.');\n // copy over the final prow to P at row i\n for (let j = 0; j < n; j++) {\n P[i * n + j] = prow[j];\n }\n } // end loop over examples i\n // symmetrize P and normalize it to sum to 1 over all ij\n const pOut = this.zeros(n * n);\n const N2 = n * 2;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n pOut[i * n + j] = Math.max((P[i * n + j] + P[j * n + i]) / N2, 1e-100);\n }\n }\n return pOut;\n }\n // helper function\n sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }\n // this function takes a set of high-dimensional points\n // and creates matrix P from them using gaussian kernel\n initDataRaw(X) {\n const N = X.length;\n const D = X[0].length;\n this.assert(N > 0, ' X is empty? You must have some data!');\n this.assert(D > 0, ' X[0] is empty? Where is the data?');\n const dists = this.xtod(X); // convert X to distances using gaussian kernel\n this.P = this.d2p(dists, this.perplexity, 1e-4); // attach to object\n this.N = N; // back up the size of the dataset\n this.initSolution(); // refresh this\n }\n // this function takes a given distance matrix and creates\n // matrix P from them.\n // D is assumed to be provided as a list of lists, and should be symmetric\n initDataDist(D) {\n const N = D.length;\n this.assert(N > 0, ' X is empty? You must have some data!');\n // convert D to a (fast) typed array version\n const dists = this.zeros(N * N); // allocate contiguous array\n for (let i = 0; i < N; i++) {\n for (let j = i + 1; j < N; j++) {\n const d = D[i][j];\n dists[i * N + j] = d;\n dists[j * N + i] = d;\n }\n }\n this.P = this.d2p(dists, this.perplexity, 1e-4);\n this.N = N;\n this.initSolution(); // refresh this\n }\n // (re)initializes the solution to random\n initSolution() {\n // generate random solution to t-SNE\n this.Y = this.randn2d(this.N, this.dim); // the solution\n this.gains = this.randn2d(this.N, this.dim, 1.0); // step gains to accelerate progress in unchanging directions\n this.ystep = this.randn2d(this.N, this.dim, 0.0); // momentum accumulator\n this.iter = 0;\n }\n // return pointer to current solution\n getSolution() {\n return this.Y;\n }\n // perform a single step of optimization to improve the embedding\n step() {\n this.iter += 1;\n const N = this.N;\n const cg = this.costGrad(this.Y); // evaluate gradient\n const cost = cg.cost;\n const grad = cg.grad;\n // perform gradient step\n const ymean = this.zeros(this.dim);\n for (let i = 0; i < N; i++) {\n for (let d = 0; d < this.dim; d++) {\n const gid = grad[i][d];\n const sid = this.ystep[i][d];\n const gainid = this.gains[i][d];\n // compute gain update\n let newgain = this.sign(gid) === this.sign(sid) ? gainid * 0.8 : gainid + 0.2;\n if (newgain < 0.01) {\n newgain = 0.01;\n } // clamp\n this.gains[i][d] = newgain; // store for next turn\n // compute momentum step direction\n const momval = this.iter < 250 ? 0.5 : 0.8;\n const newsid = momval * sid - this.epsilon * newgain * grad[i][d];\n this.ystep[i][d] = newsid; // remember the step we took\n // step!\n this.Y[i][d] += newsid;\n ymean[d] += this.Y[i][d]; // accumulate mean so that we can center later\n }\n }\n // reproject Y to be zero mean\n for (let i = 0; i < N; i++) {\n for (let d = 0; d < this.dim; d++) {\n this.Y[i][d] -= ymean[d] / N;\n }\n }\n //if(this.iter%100===0) console.log('iter ' + this.iter + ', cost: ' + cost);\n return cost; // return current cost\n }\n // for debugging: gradient check\n debugGrad() {\n const N = this.N;\n const cg = this.costGrad(this.Y); // evaluate gradient\n const cost = cg.cost;\n const grad = cg.grad;\n const e = 1e-5;\n for (let i = 0; i < N; i++) {\n for (let d = 0; d < this.dim; d++) {\n const yold = this.Y[i][d];\n this.Y[i][d] = yold + e;\n const cg0 = this.costGrad(this.Y);\n this.Y[i][d] = yold - e;\n const cg1 = this.costGrad(this.Y);\n const analytic = grad[i][d];\n const numerical = (cg0.cost - cg1.cost) / (2 * e);\n console.log(i + ',' + d + ': gradcheck analytic: ' + analytic + ' vs. numerical: ' + numerical);\n this.Y[i][d] = yold;\n }\n }\n }\n // return cost and gradient, given an arrangement\n costGrad(Y) {\n const N = this.N;\n const dim = this.dim; // dim of output space\n const P = this.P;\n const pmul = this.iter < 100 ? 4 : 1; // trick that helps with local optima\n // compute current Q distribution, unnormalized first\n const quArr = this.zeros(N * N);\n let qsum = 0.0;\n for (let i = 0; i < N; i++) {\n for (let j = i + 1; j < N; j++) {\n let dsum = 0.0;\n for (let d = 0; d < dim; d++) {\n const dhere = Y[i][d] - Y[j][d];\n dsum += dhere * dhere;\n }\n const qu = 1.0 / (1.0 + dsum); // Student t-distribution\n quArr[i * N + j] = qu;\n quArr[j * N + i] = qu;\n qsum += 2 * qu;\n }\n }\n // normalize Q distribution to sum to 1\n const NN = N * N;\n const Q = this.zeros(NN);\n for (let q = 0; q < NN; q++) {\n Q[q] = Math.max(quArr[q] / qsum, 1e-100);\n }\n let cost = 0.0;\n const grad = [];\n for (let i = 0; i < N; i++) {\n const gsum = new Array(dim); // init grad for point i\n for (let d = 0; d < dim; d++) {\n gsum[d] = 0.0;\n }\n for (let j = 0; j < N; j++) {\n cost += -P[i * N + j] * Math.log(Q[i * N + j]); // accumulate cost (the non-constant portion at least...)\n const premult = 4 * (pmul * P[i * N + j] - Q[i * N + j]) * quArr[i * N + j];\n for (let d = 0; d < dim; d++) {\n gsum[d] += premult * (Y[i][d] - Y[j][d]);\n }\n }\n grad.push(gsum);\n }\n return { cost, grad };\n }\n}\nexports.TSNE = TSNE;\n","// A library of seedable RNGs implemented in Javascript.\n//\n// Usage:\n//\n// var seedrandom = require('seedrandom');\n// var random = seedrandom(1); // or any seed.\n// var x = random(); // 0 <= x < 1. Every bit is random.\n// var x = random.quick(); // 0 <= x < 1. 32 bits of randomness.\n\n// alea, a 53-bit multiply-with-carry generator by Johannes Baagøe.\n// Period: ~2^116\n// Reported to pass all BigCrush tests.\nvar alea = require('./lib/alea');\n\n// xor128, a pure xor-shift generator by George Marsaglia.\n// Period: 2^128-1.\n// Reported to fail: MatrixRank and LinearComp.\nvar xor128 = require('./lib/xor128');\n\n// xorwow, George Marsaglia's 160-bit xor-shift combined plus weyl.\n// Period: 2^192-2^32\n// Reported to fail: CollisionOver, SimpPoker, and LinearComp.\nvar xorwow = require('./lib/xorwow');\n\n// xorshift7, by François Panneton and Pierre L'ecuyer, takes\n// a different approach: it adds robustness by allowing more shifts\n// than Marsaglia's original three. It is a 7-shift generator\n// with 256 bits, that passes BigCrush with no systmatic failures.\n// Period 2^256-1.\n// No systematic BigCrush failures reported.\nvar xorshift7 = require('./lib/xorshift7');\n\n// xor4096, by Richard Brent, is a 4096-bit xor-shift with a\n// very long period that also adds a Weyl generator. It also passes\n// BigCrush with no systematic failures. Its long period may\n// be useful if you have many generators and need to avoid\n// collisions.\n// Period: 2^4128-2^32.\n// No systematic BigCrush failures reported.\nvar xor4096 = require('./lib/xor4096');\n\n// Tyche-i, by Samuel Neves and Filipe Araujo, is a bit-shifting random\n// number generator derived from ChaCha, a modern stream cipher.\n// https://eden.dei.uc.pt/~sneves/pubs/2011-snfa2.pdf\n// Period: ~2^127\n// No systematic BigCrush failures reported.\nvar tychei = require('./lib/tychei');\n\n// The original ARC4-based prng included in this library.\n// Period: ~2^1600\nvar sr = require('./seedrandom');\n\nsr.alea = alea;\nsr.xor128 = xor128;\nsr.xorwow = xorwow;\nsr.xorshift7 = xorshift7;\nsr.xor4096 = xor4096;\nsr.tychei = tychei;\n\nmodule.exports = sr;\n","// A port of an algorithm by Johannes Baagøe <baagoe@baagoe.com>, 2010\n// http://baagoe.com/en/RandomMusings/javascript/\n// https://github.com/nquinlan/better-random-numbers-for-javascript-mirror\n// Original work is under MIT license -\n\n// Copyright (C) 2010 by Johannes Baagøe <baagoe@baagoe.org>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\n\n(function(global, module, define) {\n\nfunction Alea(seed) {\n var me = this, mash = Mash();\n\n me.next = function() {\n var t = 2091639 * me.s0 + me.c * 2.3283064365386963e-10; // 2^-32\n me.s0 = me.s1;\n me.s1 = me.s2;\n return me.s2 = t - (me.c = t | 0);\n };\n\n // Apply the seeding algorithm from Baagoe.\n me.c = 1;\n me.s0 = mash(' ');\n me.s1 = mash(' ');\n me.s2 = mash(' ');\n me.s0 -= mash(seed);\n if (me.s0 < 0) { me.s0 += 1; }\n me.s1 -= mash(seed);\n if (me.s1 < 0) { me.s1 += 1; }\n me.s2 -= mash(seed);\n if (me.s2 < 0) { me.s2 += 1; }\n mash = null;\n}\n\nfunction copy(f, t) {\n t.c = f.c;\n t.s0 = f.s0;\n t.s1 = f.s1;\n t.s2 = f.s2;\n return t;\n}\n\nfunction impl(seed, opts) {\n var xg = new Alea(seed),\n state = opts && opts.state,\n prng = xg.next;\n prng.int32 = function() { return (xg.next() * 0x100000000) | 0; }\n prng.double = function() {\n return prng() + (prng() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53\n };\n prng.quick = prng;\n if (state) {\n if (typeof(state) == 'object') copy(state, xg);\n prng.state = function() { return copy(xg, {}); }\n }\n return prng;\n}\n\nfunction Mash() {\n var n = 0xefc8249d;\n\n var mash = function(data) {\n data = String(data);\n for (var i = 0; i < data.length; i++) {\n n += data.charCodeAt(i);\n var h = 0.02519603282416938 * n;\n n = h >>> 0;\n h -= n;\n h *= n;\n n = h >>> 0;\n h -= n;\n n += h * 0x100000000; // 2^32\n }\n return (n >>> 0) * 2.3283064365386963e-10; // 2^-32\n };\n\n return mash;\n}\n\n\nif (module && module.exports) {\n module.exports = impl;\n} else if (define && define.amd) {\n define(function() { return impl; });\n} else {\n this.alea = impl;\n}\n\n})(\n this,\n (typeof module) == 'object' && module, // present in node.js\n (typeof define) == 'function' && define // present with an AMD loader\n);\n\n\n","// A Javascript implementaion of the \"Tyche-i\" prng algorithm by\n// Samuel Neves and Filipe Araujo.\n// See https://eden.dei.uc.pt/~sneves/pubs/2011-snfa2.pdf\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n var me = this, strseed = '';\n\n // Set up generator function.\n me.next = function() {\n var b = me.b, c = me.c, d = me.d, a = me.a;\n b = (b << 25) ^ (b >>> 7) ^ c;\n c = (c - d) | 0;\n d = (d << 24) ^ (d >>> 8) ^ a;\n a = (a - b) | 0;\n me.b = b = (b << 20) ^ (b >>> 12) ^ c;\n me.c = c = (c - d) | 0;\n me.d = (d << 16) ^ (c >>> 16) ^ a;\n return me.a = (a - b) | 0;\n };\n\n /* The following is non-inverted tyche, which has better internal\n * bit diffusion, but which is about 25% slower than tyche-i in JS.\n me.next = function() {\n var a = me.a, b = me.b, c = me.c, d = me.d;\n a = (me.a + me.b | 0) >>> 0;\n d = me.d ^ a; d = d << 16 ^ d >>> 16;\n c = me.c + d | 0;\n b = me.b ^ c; b = b << 12 ^ d >>> 20;\n me.a = a = a + b | 0;\n d = d ^ a; me.d = d = d << 8 ^ d >>> 24;\n me.c = c = c + d | 0;\n b = b ^ c;\n return me.b = (b << 7 ^ b >>> 25);\n }\n */\n\n me.a = 0;\n me.b = 0;\n me.c = 2654435769 | 0;\n me.d = 1367130551;\n\n if (seed === Math.floor(seed)) {\n // Integer seed.\n me.a = (seed / 0x100000000) | 0;\n me.b = seed | 0;\n } else {\n // String seed.\n strseed += seed;\n }\n\n // Mix in string seed, then discard an initial batch of 64 values.\n for (var k = 0; k < strseed.length + 20; k++) {\n me.b ^= strseed.charCodeAt(k) | 0;\n me.next();\n }\n}\n\nfunction copy(f, t) {\n t.a = f.a;\n t.b = f.b;\n t.c = f.c;\n t.d = f.d;\n return t;\n};\n\nfunction impl(seed, opts) {\n var xg = new XorGen(seed),\n state = opts && opts.state,\n prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11,\n bot = (xg.next() >>> 0) / 0x100000000,\n result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (typeof(state) == 'object') copy(state, xg);\n prng.state = function() { return copy(xg, {}); }\n }\n return prng;\n}\n\nif (module && module.exports) {\n module.exports = impl;\n} else if (define && define.amd) {\n define(function() { return impl; });\n} else {\n this.tychei = impl;\n}\n\n})(\n this,\n (typeof module) == 'object' && module, // present in node.js\n (typeof define) == 'function' && define // present with an AMD loader\n);\n\n\n","// A Javascript implementaion of the \"xor128\" prng algorithm by\n// George Marsaglia. See http://www.jstatsoft.org/v08/i14/paper\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n var me = this, strseed = '';\n\n me.x = 0;\n me.y = 0;\n me.z = 0;\n me.w = 0;\n\n // Set up generator function.\n me.next = function() {\n var t = me.x ^ (me.x << 11);\n me.x = me.y;\n me.y = me.z;\n me.z = me.w;\n return me.w ^= (me.w >>> 19) ^ t ^ (t >>> 8);\n };\n\n if (seed === (seed | 0)) {\n // Integer seed.\n me.x = seed;\n } else {\n // String seed.\n strseed += seed;\n }\n\n // Mix in string seed, then discard an initial batch of 64 values.\n for (var k = 0; k < strseed.length + 64; k++) {\n me.x ^= strseed.charCodeAt(k) | 0;\n me.next();\n }\n}\n\nfunction copy(f, t) {\n t.x = f.x;\n t.y = f.y;\n t.z = f.z;\n t.w = f.w;\n return t;\n}\n\nfunction impl(seed, opts) {\n var xg = new XorGen(seed),\n state = opts && opts.state,\n prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11,\n bot = (xg.next() >>> 0) / 0x100000000,\n result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (typeof(state) == 'object') copy(state, xg);\n prng.state = function() { return copy(xg, {}); }\n }\n return prng;\n}\n\nif (module && module.exports) {\n module.exports = impl;\n} else if (define && define.amd) {\n define(function() { return impl; });\n} else {\n this.xor128 = impl;\n}\n\n})(\n this,\n (typeof module) == 'object' && module, // present in node.js\n (typeof define) == 'function' && define // present with an AMD loader\n);\n\n\n","// A Javascript implementaion of Richard Brent's Xorgens xor4096 algorithm.\n//\n// This fast non-cryptographic random number generator is designed for\n// use in Monte-Carlo algorithms. It combines a long-period xorshift\n// generator with a Weyl generator, and it passes all common batteries\n// of stasticial tests for randomness while consuming only a few nanoseconds\n// for each prng generated. For background on the generator, see Brent's\n// paper: \"Some long-period random number generators using shifts and xors.\"\n// http://arxiv.org/pdf/1004.3115v1.pdf\n//\n// Usage:\n//\n// var xor4096 = require('xor4096');\n// random = xor4096(1); // Seed with int32 or string.\n// assert.equal(random(), 0.1520436450538547); // (0, 1) range, 53 bits.\n// assert.equal(random.int32(), 1806534897); // signed int32, 32 bits.\n//\n// For nonzero numeric keys, this impelementation provides a sequence\n// identical to that by Brent's xorgens 3 implementaion in C. This\n// implementation also provides for initalizing the generator with\n// string seeds, or for saving and restoring the state of the generator.\n//\n// On Chrome, this prng benchmarks about 2.1 times slower than\n// Javascript's built-in Math.random().\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n var me = this;\n\n // Set up generator function.\n me.next = function() {\n var w = me.w,\n X = me.X, i = me.i, t, v;\n // Update Weyl generator.\n me.w = w = (w + 0x61c88647) | 0;\n // Update xor generator.\n v = X[(i + 34) & 127];\n t = X[i = ((i + 1) & 127)];\n v ^= v << 13;\n t ^= t << 17;\n v ^= v >>> 15;\n t ^= t >>> 12;\n // Update Xor generator array state.\n v = X[i] = v ^ t;\n me.i = i;\n // Result is the combination.\n return (v + (w ^ (w >>> 16))) | 0;\n };\n\n function init(me, seed) {\n var t, v, i, j, w, X = [], limit = 128;\n if (seed === (seed | 0)) {\n // Numeric seeds initialize v, which is used to generates X.\n v = seed;\n seed = null;\n } else {\n // String seeds are mixed into v and X one character at a time.\n seed = seed + '\\0';\n v = 0;\n limit = Math.max(limit, seed.length);\n }\n // Initialize circular array and weyl value.\n for (i = 0, j = -32; j < limit; ++j) {\n // Put the unicode characters into the array, and shuffle them.\n if (seed) v ^= seed.charCodeAt((j + 32) % seed.length);\n // After 32 shuffles, take v as the starting w value.\n if (j === 0) w = v;\n v ^= v << 10;\n v ^= v >>> 15;\n v ^= v << 4;\n v ^= v >>> 13;\n if (j >= 0) {\n w = (w + 0x61c88647) | 0; // Weyl.\n t = (X[j & 127] ^= (v + w)); // Combine xor and weyl to init array.\n i = (0 == t) ? i + 1 : 0; // Count zeroes.\n }\n }\n // We have detected all zeroes; make the key nonzero.\n if (i >= 128) {\n X[(seed && seed.length || 0) & 127] = -1;\n }\n // Run the generator 512 times to further mix the state before using it.\n // Factoring this as a function slows the main generator, so it is just\n // unrolled here. The weyl generator is not advanced while warming up.\n i = 127;\n for (j = 4 * 128; j > 0; --j) {\n v = X[(i + 34) & 127];\n t = X[i = ((i + 1) & 127)];\n v ^= v << 13;\n t ^= t << 17;\n v ^= v >>> 15;\n t ^= t >>> 12;\n X[i] = v ^ t;\n }\n // Storing state as object members is faster than using closure variables.\n me.w = w;\n me.X = X;\n me.i = i;\n }\n\n init(me, seed);\n}\n\nfunction copy(f, t) {\n t.i = f.i;\n t.w = f.w;\n t.X = f.X.slice();\n return t;\n};\n\nfunction impl(seed, opts) {\n if (seed == null) seed = +(new Date);\n var xg = new XorGen(seed),\n state = opts && opts.state,\n prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11,\n bot = (xg.next() >>> 0) / 0x100000000,\n result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (state.X) copy(state, xg);\n prng.state = function() { return copy(xg, {}); }\n }\n return prng;\n}\n\nif (module && module.exports) {\n module.exports = impl;\n} else if (define && define.amd) {\n define(function() { return impl; });\n} else {\n this.xor4096 = impl;\n}\n\n})(\n this, // window object or global\n (typeof module) == 'object' && module, // present in node.js\n (typeof define) == 'function' && define // present with an AMD loader\n);\n","// A Javascript implementaion of the \"xorshift7\" algorithm by\n// François Panneton and Pierre L'ecuyer:\n// \"On the Xorgshift Random Number Generators\"\n// http://saluc.engr.uconn.edu/refs/crypto/rng/panneton05onthexorshift.pdf\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n var me = this;\n\n // Set up generator function.\n me.next = function() {\n // Update xor generator.\n var X = me.x, i = me.i, t, v, w;\n t = X[i]; t ^= (t >>> 7); v = t ^ (t << 24);\n t = X[(i + 1) & 7]; v ^= t ^ (t >>> 10);\n t = X[(i + 3) & 7]; v ^= t ^ (t >>> 3);\n t = X[(i + 4) & 7]; v ^= t ^ (t << 7);\n t = X[(i + 7) & 7]; t = t ^ (t << 13); v ^= t ^ (t << 9);\n X[i] = v;\n me.i = (i + 1) & 7;\n return v;\n };\n\n function init(me, seed) {\n var j, w, X = [];\n\n if (seed === (seed | 0)) {\n // Seed state array using a 32-bit integer.\n w = X[0] = seed;\n } else {\n // Seed state using a string.\n seed = '' + seed;\n for (j = 0; j < seed.length; ++j) {\n X[j & 7] = (X[j & 7] << 15) ^\n (seed.charCodeAt(j) + X[(j + 1) & 7] << 13);\n }\n }\n // Enforce an array length of 8, not all zeroes.\n while (X.length < 8) X.push(0);\n for (j = 0; j < 8 && X[j] === 0; ++j);\n if (j == 8) w = X[7] = -1; else w = X[j];\n\n me.x = X;\n me.i = 0;\n\n // Discard an initial 256 values.\n for (j = 256; j > 0; --j) {\n me.next();\n }\n }\n\n init(me, seed);\n}\n\nfunction copy(f, t) {\n t.x = f.x.slice();\n t.i = f.i;\n return t;\n}\n\nfunction impl(seed, opts) {\n if (seed == null) seed = +(new Date);\n var xg = new XorGen(seed),\n state = opts && opts.state,\n prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11,\n bot = (xg.next() >>> 0) / 0x100000000,\n result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (state.x) copy(state, xg);\n prng.state = function() { return copy(xg, {}); }\n }\n return prng;\n}\n\nif (module && module.exports) {\n module.exports = impl;\n} else if (define && define.amd) {\n define(function() { return impl; });\n} else {\n this.xorshift7 = impl;\n}\n\n})(\n this,\n (typeof module) == 'object' && module, // present in node.js\n (typeof define) == 'function' && define // present with an AMD loader\n);\n\n","// A Javascript implementaion of the \"xorwow\" prng algorithm by\n// George Marsaglia. See http://www.jstatsoft.org/v08/i14/paper\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n var me = this, strseed = '';\n\n // Set up generator function.\n me.next = function() {\n var t = (me.x ^ (me.x >>> 2));\n me.x = me.y; me.y = me.z; me.z = me.w; me.w = me.v;\n return (me.d = (me.d + 362437 | 0)) +\n (me.v = (me.v ^ (me.v << 4)) ^ (t ^ (t << 1))) | 0;\n };\n\n me.x = 0;\n me.y = 0;\n me.z = 0;\n me.w = 0;\n me.v = 0;\n\n if (seed === (seed | 0)) {\n // Integer seed.\n me.x = seed;\n } else {\n // String seed.\n strseed += seed;\n }\n\n // Mix in string seed, then discard an initial batch of 64 values.\n for (var k = 0; k < strseed.length + 64; k++) {\n me.x ^= strseed.charCodeAt(k) | 0;\n if (k == strseed.length) {\n me.d = me.x << 10 ^ me.x >>> 4;\n }\n me.next();\n }\n}\n\nfunction copy(f, t) {\n t.x = f.x;\n t.y = f.y;\n t.z = f.z;\n t.w = f.w;\n t.v = f.v;\n t.d = f.d;\n return t;\n}\n\nfunction impl(seed, opts) {\n var xg = new XorGen(seed),\n state = opts && opts.state,\n prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n prng.double = function() {\n do {\n var top = xg.next() >>> 11,\n bot = (xg.next() >>> 0) / 0x100000000,\n result = (top + bot) / (1 << 21);\n } while (result === 0);\n return result;\n };\n prng.int32 = xg.next;\n prng.quick = prng;\n if (state) {\n if (typeof(state) == 'object') copy(state, xg);\n prng.state = function() { return copy(xg, {}); }\n }\n return prng;\n}\n\nif (module && module.exports) {\n module.exports = impl;\n} else if (define && define.amd) {\n define(function() { return impl; });\n} else {\n this.xorwow = impl;\n}\n\n})(\n this,\n (typeof module) == 'object' && module, // present in node.js\n (typeof define) == 'function' && define // present with an AMD loader\n);\n\n\n","/*\nCopyright 2019 David Bau.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n*/\n\n(function (global, pool, math) {\n//\n// The following constants are related to IEEE 754 limits.\n//\n\nvar width = 256, // each RC4 output is 0 <= x < 256\n chunks = 6, // at least six RC4 outputs for each double\n digits = 52, // there are 52 significant digits in a double\n rngname = 'random', // rngname: name for Math.random and Math.seedrandom\n startdenom = math.pow(width, chunks),\n significance = math.pow(2, digits),\n overflow = significance * 2,\n mask = width - 1,\n nodecrypto; // node.js crypto module, initialized at the bottom.\n\n//\n// seedrandom()\n// This is the seedrandom function described above.\n//\nfunction seedrandom(seed, options, callback) {\n var key = [];\n options = (options == true) ? { entropy: true } : (options || {});\n\n // Flatten the seed string or build one from local entropy if needed.\n var shortseed = mixkey(flatten(\n options.entropy ? [seed, tostring(pool)] :\n (seed == null) ? autoseed() : seed, 3), key);\n\n // Use the seed to initialize an ARC4 generator.\n var arc4 = new ARC4(key);\n\n // This function returns a random double in [0, 1) that contains\n // randomness in every bit of the mantissa of the IEEE 754 value.\n var prng = function() {\n var n = arc4.g(chunks), // Start with a numerator n < 2 ^ 48\n d = startdenom, // and denominator d = 2 ^ 48.\n x = 0; // and no 'extra last byte'.\n while (n < significance) { // Fill up all significant digits by\n n = (n + x) * width; // shifting numerator and\n d *= width; // denominator and generating a\n x = arc4.g(1); // new least-significant-byte.\n }\n while (n >= overflow) { // To avoid rounding up, before adding\n n /= 2; // last byte, shift everything\n d /= 2; // right using integer math until\n x >>>= 1; // we have exactly the desired bits.\n }\n return (n + x) / d; // Form the number within [0, 1).\n };\n\n prng.int32 = function() { return arc4.g(4) | 0; }\n prng.quick = function() { return arc4.g(4) / 0x100000000; }\n prng.double = prng;\n\n // Mix the randomness into accumulated entropy.\n mixkey(tostring(arc4.S), pool);\n\n // Calling convention: what to return as a function of prng, seed, is_math.\n return (options.pass || callback ||\n function(prng, seed, is_math_call, state) {\n if (state) {\n // Load the arc4 state from the given state if it has an S array.\n if (state.S) { copy(state, arc4); }\n // Only provide the .state method if requested via options.state.\n prng.state = function() { return copy(arc4, {}); }\n }\n\n // If called as a method of Math (Math.seedrandom()), mutate\n // Math.random because that is how seedrandom.js has worked since v1.0.\n if (is_math_call) { math[rngname] = prng; return seed; }\n\n // Otherwise, it is a newer calling convention, so return the\n // prng directly.\n else return prng;\n })(\n prng,\n shortseed,\n 'global' in options ? options.global : (this == math),\n options.state);\n}\n\n//\n// ARC4\n//\n// An ARC4 implementation. The constructor takes a key in the form of\n// an array of at most (width) integers that should be 0 <= x < (width).\n//\n// The g(count) method returns a pseudorandom integer that concatenates\n// the next (count) outputs from ARC4. Its return value is a number x\n// that is in the range 0 <= x < (width ^ count).\n//\nfunction ARC4(key) {\n var t, keylen = key.length,\n me = this, i = 0, j = me.i = me.j = 0, s = me.S = [];\n\n // The empty key [] is treated as [0].\n if (!keylen) { key = [keylen++]; }\n\n // Set up S using the standard key scheduling algorithm.\n while (i < width) {\n s[i] = i++;\n }\n for (i = 0; i < width; i++) {\n s[i] = s[j = mask & (j + key[i % keylen] + (t = s[i]))];\n s[j] = t;\n }\n\n // The \"g\" method returns the next (count) outputs as one number.\n (me.g = function(count) {\n // Using instance members instead of closure state nearly doubles speed.\n var t, r = 0,\n i = me.i, j = me.j, s = me.S;\n while (count--) {\n t = s[i = mask & (i + 1)];\n r = r * width + s[mask & ((s[i] = s[j = mask & (j + t)]) + (s[j] = t))];\n }\n me.i = i; me.j = j;\n return r;\n // For robust unpredictability, the function call below automatically\n // discards an initial batch of values. This is called RC4-drop[256].\n // See http://google.com/search?q=rsa+fluhrer+response&btnI\n })(width);\n}\n\n//\n// copy()\n// Copies internal state of ARC4 to or from a plain object.\n//\nfunction copy(f, t) {\n t.i = f.i;\n t.j = f.j;\n t.S = f.S.slice();\n return t;\n};\n\n//\n// flatten()\n// Converts an object tree to nested arrays of strings.\n//\nfunction flatten(obj, depth) {\n var result = [], typ = (typeof obj), prop;\n if (depth && typ == 'object') {\n for (prop in obj) {\n try { result.push(flatten(obj[prop], depth - 1)); } catch (e) {}\n }\n }\n return (result.length ? result : typ == 'string' ? obj : obj + '\\0');\n}\n\n//\n// mixkey()\n// Mixes a string seed into a key that is an array of integers, and\n// returns a shortened string seed that is equivalent to the result key.\n//\nfunction mixkey(seed, key) {\n var stringseed = seed + '', smear, j = 0;\n while (j < stringseed.length) {\n key[mask & j] =\n mask & ((smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++));\n }\n return tostring(key);\n}\n\n//\n// autoseed()\n// Returns an object for autoseeding, using window.crypto and Node crypto\n// module if available.\n//\nfunction autoseed() {\n try {\n var out;\n if (nodecrypto && (out = nodecrypto.randomBytes)) {\n // The use of 'out' to remember randomBytes makes tight minified code.\n out = out(width);\n } else {\n out = new Uint8Array(width);\n (global.crypto || global.msCrypto).getRandomValues(out);\n }\n return tostring(out);\n } catch (e) {\n var browser = global.navigator,\n plugins = browser && browser.plugins;\n return [+new Date, global, plugins, global.screen, tostring(pool)];\n }\n}\n\n//\n// tostring()\n// Converts an array of charcodes to a string\n//\nfunction tostring(a) {\n return String.fromCharCode.apply(0, a);\n}\n\n//\n// When seedrandom.js is loaded, we immediately mix a few bits\n// from the built-in RNG into the entropy pool. Because we do\n// not want to interfere with deterministic PRNG state later,\n// seedrandom will not call math.random on its own again after\n// initialization.\n//\nmixkey(math.random(), pool);\n\n//\n// Nodejs and AMD support: export the implementation as a module using\n// either convention.\n//\nif ((typeof module) == 'object' && module.exports) {\n module.exports = seedrandom;\n // When in node.js, try using crypto package for autoseeding.\n try {\n nodecrypto = require('crypto');\n } catch (ex) {}\n} else if ((typeof define) == 'function' && define.amd) {\n define(function() { return seedrandom; });\n} else {\n // When included as a plain script, set up Math.seedrandom global.\n math['seed' + rngname] = seedrandom;\n}\n\n\n// End anonymous scope, and pass initial values.\n})(\n // global: `self` in browsers (including strict mode and web workers),\n // otherwise `this` in Node and other environments\n (typeof self !== 'undefined') ? self : this,\n [], // pool: entropy pool starts empty\n Math // math: package containing random, pow, and seedrandom\n);\n"],"names":["Float32Array","StringMetricsNames","VectorMetricsNames","BitArrayMetricsNames","IntArrayMetricsNames","DistanceMetricsSubjects","NumberMetricsNames","BitArray","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","static","set1","set2","temp","len","values","flag","setBit","s","fromSeq","charAt","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","fromValues","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","tanimotoSimilarity","x","y","total","common","getDistanceFromSimilarity","similarity","assert","condition","message","Tanimoto","Dice","Asymmetric","BraunBlanquet","Cosine","Kulczynski","McConnaughey","RogotGoldberg","Russel","Sokal","Hamming","Euclidean","HAMMING","LEVENSHTEIN","MONOMER_CHEMICAL_DISTANCE","NEEDLEMANN_WUNSCH","vectorDistanceMetricsMethods","q","pow","sqrt","stringDistanceMetricsMethods","Levenshtein","JaroWinkler","Manhattan","s1","s2","dist","Onehot","bitArrayDistanceMetricsMethods","diceSimilarity","asymmetricSimilarity","braunBlanquetSimilarity","cosineSimilarity","totalProd","kulczynskiSimilarity","mcConnaugheySimilarity","diff","rogotGoldbergSimilarity","russelSimilarity","sokalSimilarity","intArrayDistanceMetricsMethods","TanimotoIntArray","numberDistanceMetricsMethods","Difference","abs","AvailableMetrics","Vector","String","MacroMolecule","Number","IntArray","MetricToDataType","Object","keys","reduce","ret","key","val","Measure","method","dataType","getMeasure","opts","dict","hasOwnProperty","availableMeasures","DistanceAggregationMethods","insertSmaller","distancesAr","newPosition","findIndex","v","pop","splice","DistanceMatrixService","_workers","_workerCount","_terminateOnComplete","useConcurrentWorkers","terminateOnComplete","threadCount","navigator","hardwareConcurrency","Array","map","Worker","URL","async","fnName","normalize","Promise","resolve","reject","promises","totalLength","chunkSize","distanceMatrix","endRow","endCol","lmin","lmax","MIN_VALUE","startRow","startCol","postMessage","chunckSize","resolveWorker","rejectWorker","onmessage","error","distanceMatrixData","terminate","set","all","forEach","e","worker","tauRandInt","tauRand","empty","output","undefined","range","_","filled","zeros","mean","input","sum","rejectionSample","nSamples","poolSize","rejectSample","broken","reshape2d","a","b","rows","col","makeHeap","nPoints","size","makeArrays","fillValue","heap","Infinity","heapPush","row","weight","indices","uncheckedHeapPush","weights","isNew","iSwap","ic1","ic2","heapShape2","buildCandidates","currentGraph","nVertices","nNeighbors","maxCandidates","candidateNeighbors","idx","isn","d","deheapSort","indHeap","distHeap","indHeapIndex","distHeapIndex","temp1","temp2","siftDown","heap1","heap2","ceiling","elt","leftChild","rightChild","swap","smallestFlagged","ind","minDist","resultIndex","SparseMatrix","entries","Map","nRows","nCols","cols","dims","checkDims","makeKey","has","get","getAll","ordered","rowColValues","sort","getDims","getRows","_key","getCols","getValues","fn","vals","toArray","matrix","oldRows","oldCols","oldVals","matlen","Int32Array","pairwiseMultiply","elementWise","add","subtract","multiplyScalar","scalar","eliminateZeros","m","zeroIndices","Set","removeByZeroIndex","nextValues","filter","nextRows","nextCols","normType","normFn","normFns","colsByRow","nextMatrix","norm","xs","op","visited","operate","nextValue","valuesA","rowsA","colsA","valuesB","rowsB","colsB","getCSR","indptr","currentRow","FlatTree","hyperplanes","offsets","children","makeForest","nTrees","leafSize","trees","makeEuclideanTree","makeTree","forest","tree","nNodes","numNodes","nLeaves","numLeaves","hyperplane","recursiveFlatten","flattenTree","splitResults","leftIndex","rightIndex","left","right","hyperplaneOffset","hyperplaneVector","nLeft","nRight","side","margin","indicesLeft","indicesRight","offset","euclideanRandomProjectionSplit","isLeaf","nodeNum","leafNum","oldNodeNum","res","selectSide","point","searchFlatTree","node","prototype","isAnyArray","object","call","endsWith","errorCalculation","parameters","parameterizedFunction","func","rescale","options","arguments","TypeError","currentMin","_options$fromIndex","fromIndex","_options$toIndex","toIndex","isInteger","minValue","currentMax","maxValue","RangeError","_options$min","autoMinMax","_options$max","factor","indent","repeat","indentData","inspectMatrixWithOptions","maxRows","maxColumns","maxNumSize","padMinus","columns","maxI","maxJ","loop","line","formatNumber","join","inspectData","formatNumber2","padEnd","str","fix","toFixed","startsWith","exp","toExponential","slice","checkRowIndex","outer","checkColumnIndex","checkRowVector","vector","to1DArray","checkColumnVector","checkRange","startColumn","endColumn","checkNumber","newArray","array","checkNonEmpty","isEmpty","AbstractMatrix","newRows","newColumns","newMatrix","column","interval","round","l","matrix1","matrix2","checkMatrix","isMatrix","klass","apply","callback","to2DArray","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","echelonForm","h","iMax","swapRows","tmp","reducedEchelonForm","maxRow","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","getColumn","getColumnVector","columnVector","setColumn","swapColumns","column1","column2","addRowVector","subRowVector","mulRowVector","divRowVector","addColumnVector","subColumnVector","mulColumnVector","divColumnVector","mulRow","mulColumn","by","NaN","NEGATIVE_INFINITY","maxIndex","POSITIVE_INFINITY","minIndex","maxRowIndex","minRow","minRowIndex","maxColumn","maxColumnIndex","minColumn","minColumnIndex","diag","type","cumulativeSum","dot","vector2","vector1","mmul","Bcolj","Float64Array","strassen2x2","a11","b11","a12","b12","a21","b21","a22","b22","m1","m2","m3","m4","m5","c00","c01","c10","c11","strassen3x3","a00","a01","a02","a10","a20","b00","b01","b02","b10","b20","m6","m7","m8","m9","m12","m13","m14","m15","m16","m17","m18","c02","c12","c20","c21","c22","mmulStrassen","r1","c1","r2","c2","embed","mat","r","c","resultat","console","warn","blockMult","halfRows","parseInt","halfCols","subMatrix","sub","scaleRows","isFinite","scaleColumns","flipRows","middle","ceil","first","last","flipColumns","kroneckerProduct","kroneckerSum","AxI","eye","IxB","transpose","sortRows","compareFunction","compareNumbers","sortColumns","subMatrixRow","subMatrixColumn","selection","rowIndices","columnIndices","checkRowIndices","checkColumnIndices","rowIndex","columnIndex","trace","sumByRow","sumByColumn","sumAll","product","productByRow","productByColumn","productAll","variance","unbiased","sum1","sum2","varianceByRow","varianceByColumn","varianceAll","standardDeviation","center","centerByRow","centerByColumn","centerAll","scale","getScaleByRow","scaleByRow","getScaleByColumn","scaleByColumn","divider","getScaleAll","scaleAll","Symbol","for","rand","randomInt","randInt","diagonal","identity","negate","tensorProduct","nColumns","super","arrayData","every","element","removeRow","addRow","removeColumn","newRow","addColumn","Matrix","addS","addM","subS","subM","subtractS","subtractM","mul","mulM","multiply","multiplyS","multiplyM","div","divS","divM","divide","divideS","divideM","mod","modS","modM","modulus","modulusS","modulusM","andS","andM","orS","orM","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","expm1","fround","log","log1p","log10","log2","sign","sin","sinh","tan","tanh","trunc","arg0","powS","powM","installMathOperations","WrapperMatrix2D","LuDecomposition","t","LUcolj","kmax","lu","pivotVector","pivotSign","LU","isSingular","solve","X","determinant","lowerTriangularMatrix","upperTriangularMatrix","pivotPermutationVector","hypotenuse","QrDecomposition","qr","rdiag","nrm","QR","Rdiag","isFullRank","orthogonalMatrix","SingularValueDecomposition","computeLeftSingularVectors","computeRightSingularVectors","autoTranspose","wantu","Boolean","wantv","swapped","aux","nu","ni","U","V","work","si","nct","nrt","mrc","pp","iter","eps","EPSILON","kase","alpha","isNaN","ks","f","cs","sn","sp","spm1","epm1","sk","ek","shift","g","Y","threshold","scols","Ls","rightSingularVectors","VL","vrows","urows","VLU","solveForDiagonal","inverse","vcols","ucols","norm2","rank","tol","ii","leftSingularVectors","diagonalMatrix","step","params","damping","gradientDifference","evaluatedData","gradientFunc","paramFunction","ans","param","auxParams","funcParam","gradientFunction","matrixFunc","matrixFunction","inverseMatrix","useSVD","leftHandSide","rightHandSide","SMOOTH_K_TOLERANCE","MIN_K_DIST_SCALE","UMAP","learningRate","localConnectivity","nComponents","nEpochs","negativeSampleRate","repulsionStrength","setOpMixRatio","spread","transformQueueSize","targetMetric","targetWeight","targetNNeighbors","distanceFn","numeric","knnIndices","knnDistances","graph","isInitialized","rpForest","initFromRandom","initFromTree","search","searchGraph","embedding","optimizationState","OptimizationState","neighbors","setParam","fit","initializeFit","optimizeLayout","optimizeLayoutAsync","setSupervisedProjection","setPrecomputedKNN","getNEpochs","knnResults","nearestNeighbors","fuzzySimplicialSet","makeSearchFns","makeSearchGraph","processGraphForSupervisedProjection","head","tail","epochsPerSample","initializeSimplicialSetEmbedding","initializeOptimization","prepareForOptimizationLoop","queryPoints","_heap","_tree","initialization","tried","vertex","candidates","candidate","knn","distances","neighbor","distance","transform","toTransform","rawData","results","adjustedLocalConnectivity","sigmas","rhos","smoothKNNDistance","computeMembershipStrengths","csrMatrix","_z","initTransform","graphMax","makeEpochsPerSample","assignOptimizationStateParameters","headEmbedding","tailEmbedding","currentEpoch","farDist","categoricalSimplicialSetIntersection","optimizeLayoutStep","getEmbedding","metricNNDescent","leafArray","nIters","delta","rho","rpTreeInit","cj","ck","sparseMatrix","prodMatrix","simplicialSet","target","unknownDist","intersection","fastIntersection","resetLocalConnectivity","nIter","bandwidth","lo","hi","mid","ithDistances","nonZeroDists","interpolation","psum","meanIthDistances","meanDistances","graphValues","entry","w","state","assign","dim","moveOther","epochsPerNegativeSample","epochOfNextNegativeSample","epochOfNextSample","initialAlpha","gamma","xv","yv","parameterValues","maxIterations","errorTolerance","minValues","maxValues","initialValues","parLen","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","iteration","converged","parameterError","iterations","findABParams","current","distSquared","rDist","gradCoeff","gradD","clip","nNegSamples","epochCallback","epochCompleted","shouldStop","isFinished","setTimeout","err","clipValue","SparseMatrixService","matSize","minThreshold","getMinimalThreshold","workers","startIdx","endIdx","fullSize","acc","nNeighbours","multiColumnKNN","fnNames","aggregationMethod","EUCLIDEAN","some","knnIndexes","knnRes","thresholdWorkers","shuffledValues","maxSampleSize","sampleSise","testSetSizePerWorker","tPromises","sampleLength","getSampleDistances","cnt","mi","mj","MultiColumnReducer","TSNEReducer","reducer","distanceFnames","distanceFns","distanceFnArgs","matrixService","aggregate","MANHATTAN","vs","calc","matrixProxy","condensedArray","linearFunc","dmLinearIndex","linearIndex","iNum","jNum","idx1Handler","idx1","_receiver","Proxy","idx2","idx2Handler","distanceMatrixProxy","initDataDist","getSolution","UMAPReducer","vectors","progressFunc","randomSeed","Date","randomFn","_parallelDistanceWorkers","time","timeEnd","fitAsync","epoc","AvailableReducers","MultiColDimReducer","metrics","distanceAggregation","measures","measure","bitArrayLength","typeName","availableMethods","availableMetrics","obj","epochNum","epochsLength","columnsData","distanceMetrics","onMessage","exports","tsne_1","defineProperty","enumerable","TSNE","opt","returnV","vValue","perplexity","getopt","epsilon","field","defaultval","gaussRandom","u","randn","mu","std","ArrayBuffer","randn2d","uses","xhere","L2","x1","x2","D","x1i","x2i","xtod","N","d2p","nf","hTarget","P","prow","betamin","betamax","beta","done","maxtries","pj","nHere","pOut","N2","initDataRaw","dists","initSolution","gains","ystep","cg","costGrad","cost","grad","ymean","gid","sid","gainid","newgain","newsid","debugGrad","yold","cg0","cg1","analytic","numerical","pmul","quArr","qsum","dsum","dhere","qu","NN","Q","gsum","premult","alea","xor128","xorwow","xorshift7","xor4096","tychei","sr","module","global","define","Alea","seed","me","mash","charCodeAt","next","s0","impl","xg","prng","int32","double","quick","XorGen","strseed","z","limit","pool","math","nodecrypto","width","chunks","rngname","startdenom","significance","overflow","seedrandom","shortseed","mixkey","flatten","entropy","tostring","out","randomBytes","Uint8Array","crypto","msCrypto","getRandomValues","browser","plugins","screen","autoseed","arc4","ARC4","S","pass","is_math_call","keylen","depth","prop","typ","smear","stringseed","fromCharCode","ex"],"sourceRoot":""}
|