@datagrok/bio 2.11.41 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +1 -1
  3. package/detectors.js +11 -11
  4. package/dist/36.js +1 -1
  5. package/dist/36.js.map +1 -1
  6. package/dist/413.js +1 -1
  7. package/dist/413.js.map +1 -1
  8. package/dist/590.js +1 -1
  9. package/dist/590.js.map +1 -1
  10. package/dist/709.js +1 -1
  11. package/dist/709.js.map +1 -1
  12. package/dist/895.js +1 -1
  13. package/dist/895.js.map +1 -1
  14. package/dist/package-test.js +2 -2
  15. package/dist/package-test.js.map +1 -1
  16. package/dist/package.js +2 -2
  17. package/dist/package.js.map +1 -1
  18. package/package.json +10 -10
  19. package/src/analysis/sequence-activity-cliffs.ts +9 -9
  20. package/src/analysis/sequence-diversity-viewer.ts +3 -3
  21. package/src/analysis/sequence-search-base-viewer.ts +2 -2
  22. package/src/analysis/sequence-similarity-viewer.ts +10 -10
  23. package/src/analysis/sequence-space.ts +26 -23
  24. package/src/calculations/monomerLevelMols.ts +13 -11
  25. package/src/const.ts +5 -0
  26. package/src/package.ts +8 -8
  27. package/src/tests/WebLogo-layout-tests.ts +5 -2
  28. package/src/tests/WebLogo-positions-test.ts +20 -16
  29. package/src/tests/bio-tests.ts +19 -7
  30. package/src/tests/converters-test.ts +4 -4
  31. package/src/tests/detectors-benchmark-tests.ts +5 -5
  32. package/src/tests/detectors-tests.ts +13 -13
  33. package/src/tests/fasta-export-tests.ts +10 -4
  34. package/src/tests/mm-distance-tests.ts +10 -10
  35. package/src/tests/msa-tests.ts +8 -15
  36. package/src/tests/renderers-monomer-placer.ts +3 -3
  37. package/src/tests/renderers-test.ts +6 -8
  38. package/src/tests/splitters-test.ts +14 -13
  39. package/src/tests/to-atomic-level-tests.ts +2 -2
  40. package/src/tests/units-handler-get-region.ts +4 -4
  41. package/src/tests/units-handler-splitted-tests.ts +19 -17
  42. package/src/tests/units-handler-tests.ts +32 -32
  43. package/src/utils/cell-renderer.ts +40 -34
  44. package/src/utils/check-input-column.ts +5 -5
  45. package/src/utils/context-menu.ts +9 -6
  46. package/src/utils/convert.ts +9 -9
  47. package/src/utils/get-region-func-editor.ts +11 -11
  48. package/src/utils/get-region.ts +10 -12
  49. package/src/utils/macromolecule-column-widget.ts +9 -5
  50. package/src/utils/monomer-lib/library-file-manager/event-manager.ts +1 -1
  51. package/src/utils/multiple-sequence-alignment-ui.ts +6 -6
  52. package/src/utils/pepsea.ts +1 -0
  53. package/src/utils/poly-tool/transformation.ts +3 -3
  54. package/src/utils/save-as-fasta.ts +14 -15
  55. package/src/utils/sequence-to-mol.ts +4 -4
  56. package/src/viewers/web-logo-viewer.ts +95 -110
  57. package/src/widgets/bio-substructure-filter.ts +3 -3
  58. package/src/widgets/composition-analysis-widget.ts +26 -19
package/dist/895.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"895.js","mappings":"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","sources":["webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/utils.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/typed-metrics/typed-metrics.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/t-sne/t-sne.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/multi-column-dim-reducer.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/mulit-column-dim-reducer-worker.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":["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=","/**\n * Denotes a vector of floating poit values.\n *\n * @export\n * @class Vector\n * @extends {Float32Array}\n */\nexport class Vector extends Float32Array {\n}\n/**\n * Denotes a two-dimensional matrix.\n *\n * @export\n * @class Matrix\n * @extends {Array<Vector>}\n */\nexport class Matrix extends Array {\n}\n/**\n * Denotes cartesian coordinates.\n *\n * @export\n * @class Coordinates\n * @extends {Matrix}\n */\nexport class Coordinates extends Matrix {\n}\n/**\n * Denotes an array of arbitrary-typed vectors.\n *\n * @export\n * @class Vectors\n * @extends {Array<any>}\n */\nexport class Vectors extends Array {\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLWRlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbi8qKlxuICogRGVub3RlcyBhIHZlY3RvciBvZiBmbG9hdGluZyBwb2l0IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVmVjdG9yXG4gKiBAZXh0ZW5kcyB7RmxvYXQzMkFycmF5fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yIGV4dGVuZHMgRmxvYXQzMkFycmF5IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIHR3by1kaW1lbnNpb25hbCBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE1hdHJpeFxuICogQGV4dGVuZHMge0FycmF5PFZlY3Rvcj59XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBcnJheTxWZWN0b3I+IHt9XG5cbi8qKlxuICogRGVub3RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvb3JkaW5hdGVzXG4gKiBAZXh0ZW5kcyB7TWF0cml4fVxuICovXG5leHBvcnQgY2xhc3MgQ29vcmRpbmF0ZXMgZXh0ZW5kcyBNYXRyaXgge31cblxuLyoqXG4gKiBEZW5vdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeS10eXBlZCB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBWZWN0b3JzXG4gKiBAZXh0ZW5kcyB7QXJyYXk8YW55Pn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcnMgZXh0ZW5kcyBBcnJheTxhbnk+IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBmdW5jdGlvbiBvcHRpb25zLlxuICpcbiAqIEBleHBvcnRcbiAqIEB0eXBlIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcbiAqIEBwYXJhbSB7YW55fSB2MSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHthbnl9IHYyIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBEaXN0YW5jZU1ldHJpYyA9ICh2MTogYW55LCB2MjogYW55KSA9PiAobnVtYmVyKTtcblxuLyoqXG4gKiBEZW5vdGVzIGEgc2ltcGxlIHN0cmluZyB0byBzdHJpbmcgZGljdGlvbmFyeS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdHlwZSBTdHJpbmdEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0RpY3Rpb25hcnkgPSB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcblxuXG5leHBvcnQgdHlwZSBDb2x1bW5JbnB1dE9wdGlvbnMgPSB7XG4gICAgZmlsdGVyPzogKGNvbDogREcuQ29sdW1uKSA9PiBib29sZWFuIHwgbnVsbDtcbn07XG4iXX0=","import { Vector } from './type-declarations';\nimport { randomFloat, randomInt } from './random';\n/**\n * Asserts a condition by throwing an Error.\n *\n * @export\n * @param {boolean} [condition=false] Condition to assert.\n * @param {string} [message='Assertion error.'] Message to output.\n * @throws {Error}\n */\nexport function assert(condition = false, message = 'Assertion error.') {\n if (!condition)\n throw new Error(message);\n}\n/**\n * Creates new two-dimensional array and fills it with the value given.\n *\n * @param {number} dimension1 The first dimension of the coordinates (number of rows).\n * @param {number} dimension2 The second dimension of the coordinates (number of columns).\n * @param {number} [fill=0] A value to fill the coordinates with.\n * @return {Coordinates} A two-dimensional filled with the value given.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function initCoordinates(dimension1, dimension2, fill = 0) {\n return new Array(dimension1).fill(fill).map(() => (new Vector(dimension2).fill(fill)));\n}\n/**\n * Transpose matrix.\n *\n * @export\n * @param {Matrix} matrix The matrix to be transposed.\n * @return {Matrix} Transposed matrix.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function transposeMatrix(matrix) {\n return new Array(matrix[0].length).fill(0)\n .map((_, i) => (new Vector(matrix.length).fill(0).map((_, j) => (matrix[j][i]))));\n}\n/**\n * Adds two vectors with the second one to be multiplied by the given ratio.\n *\n * @export\n * @param {Vector} p The first vector to add.\n * @param {Vector} q The second vector to add.\n * @param {number} [multiplier=1] A multiplier to be used before the second vector is added.\n * @return {Vector} New vector contained the result of operation p+multiplier*q.\n */\nexport function vectorAdd(p, q, multiplier = 1) {\n const nItems = p.length;\n assert(nItems == q.length, 'Vector lengths do not match.');\n const total = new Vector(nItems);\n for (let i = 0; i < p.length; ++i)\n total[i] = p[i] + multiplier * q[i];\n return total;\n}\n/**\n * Sums the vector's items.\n *\n * @param {Vector} v The vector to be summed.\n * @return {number} The vector's items sum.\n */\nfunction itemsSum(v) {\n let total = 0;\n for (let i = 0; i < v.length; ++i)\n total += v[i];\n return total;\n}\n/**\n * Suqares the vector's items.\n *\n * @param {Vector} v The vector to square.\n * @return {Vector} A new vector containing the original's items squared.\n */\nfunction vectorSquare(v) {\n const nItems = v.length;\n const total = new Vector(nItems);\n for (let i = 0; i < v.length; ++i)\n total[i] = v[i] * v[i];\n return total;\n}\nexport function vectorLength(v) {\n let sqrSum = 0;\n for (let i = 0; i < v.length; i++)\n sqrSum += v[i] * v[i];\n return Math.sqrt(sqrSum);\n}\nexport function vectorDotProduct(v1, v2) {\n if (v1.length != v2.length)\n throw new Error('The dimensionality of the vectors must match');\n let prod = 0;\n for (let i = 0; i < v1.length; i++)\n prod += v1[i] * v2[i];\n return prod;\n}\n/**\n * Creates a matrix filled with random floating point values.\n *\n * @export\n * @param {number} dimension1 The first dimension of the matrix.\n * @param {number} dimension2 The second dimension of the matrix.\n * @param {number} [scale=1.] Max value given by random generator.\n * @return {Matrix} A new matrix filled with random floating point values.\n */\nexport function fillRandomMatrix(dimension1, dimension2, scale = 1.) {\n const matrix = initCoordinates(dimension1, dimension2);\n for (let i = 0; i < dimension1; ++i) {\n for (let j = 0; j < dimension2; ++j)\n matrix[i][j] = randomFloat(scale);\n }\n return matrix;\n}\n/**\n * Calculates Euclidean distance between two vectors.\n *\n * @export\n * @param {Vector} p The first vector.\n * @param {Vector} q The second vector.\n * @return {number} Euclidean distance between the given vectors.\n */\nexport function calculateEuclideanDistance(p, q) {\n let result = 0;\n const len = p.length;\n if (len !== q.length)\n throw new Error('The dimensionality of the vectors must match');\n for (let i = 0; i < len; ++i)\n result += Math.pow((p[i] - q[i]), 2);\n return Math.sqrt(result);\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n }\n }\n return matrix;\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcNormalizedDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n let max = Number.MIN_VALUE;\n let min = Number.MAX_VALUE;\n for (let i = 0; i < nItems; ++i) {\n for (let j = i; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null || i === j) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n if (d > max)\n max = d;\n if (d < min)\n min = d;\n }\n }\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j)\n matrix[i][j] = matrix[j][i] = (matrix[i][j] - min) / (max - min);\n }\n return matrix;\n}\n/** Generates array from a range [begin; end] or [begin; end) if endExclusive. **/\nexport function genRange(begin, end, endExclusive = false) {\n const nItems = end - begin + (endExclusive ? 0 : 1);\n const series = new Int32Array(nItems);\n for (let i = 0; i < nItems; ++i)\n series[i] = begin + i;\n return series;\n}\n/**\n * Returns order of values as if they are sorted.\n *\n * @export\n * @param {any[]} values Input array.\n * @param {boolean} [reverse=false] Whether to return reversed order.\n * @return {number[]} The order computed.\n */\nexport function argSort(values, reverse = false) {\n const sortfn = reverse ? (a, b) => (b[0] - a[0]) : (a, b) => (a[0] - b[0]);\n const decor = (v, i) => [v, i]; // set index to value\n const undecor = (a) => a[1]; // leave only index\n const _argsort = (arr) => arr.map(decor).sort(sortfn).map(undecor);\n return _argsort(values);\n}\n/**\n * Returns the indexes of the most diverse objects according to the dist function\n * @param {number} length total number of objects\n * @param {number} n number of diverse elements to find\n * @param {(i1: number, i2: number) => number} dist a function which calculates distance between\n * two objects using their indexes\n * @returns {number[]} The indexes of the most diverse objects\n */\nexport function getDiverseSubset(length, n, dist) {\n function maxBy(values, orderBy) {\n let maxValue = null;\n let maxOrderBy = null;\n for (const element of values) {\n const elementOrderBy = orderBy(element);\n if (maxOrderBy == null || elementOrderBy > maxOrderBy) {\n maxValue = element;\n maxOrderBy = elementOrderBy;\n }\n }\n return maxValue;\n }\n const subset = [randomInt(length - 1)];\n const complement = new Set();\n for (let i = 0; i < length; ++i) {\n if (!subset.includes(i))\n complement.add(i);\n }\n while (subset.length < n) {\n const idx = maxBy(complement.values(), (i) => Math.min.apply(Math, subset.map(function (val, index) {\n return dist(i, val);\n })));\n if (idx) {\n subset.push(idx);\n complement.delete(idx);\n }\n }\n return subset;\n}\n/**\n * Returns normalized vector.\n *\n * @export\n * @param {Vector} data numerical array\n */\nexport function normalize(data) {\n const len = data.length;\n let sum = 0;\n let sumOfSquares = 0;\n for (let i = 0; i < len; ++i) {\n sum += data[i];\n sumOfSquares += Math.pow(data[i], 2);\n }\n const mean = sum / len;\n const stdDevInverse = 1.0 / Math.sqrt(sumOfSquares / len - Math.pow(mean, 2));\n for (let i = 0; i < len; ++i)\n data[i] = (data[i] - mean) * stdDevInverse;\n return data;\n}\n/**\n * Finds set difference between two lists.\n * @param {any[]} a The first list.\n * @param {any[]} b The second list.\n * @return {any[]}\n */\nexport function setDifference(a, b) {\n const bSet = new Set(b);\n return Array.from(new Set(a.filter((x) => !bSet.has(x))).values());\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsVUFBa0IsRUFBRSxVQUFrQixFQUFFLE9BQWUsQ0FBQztJQUN0RixPQUFPLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFjO0lBQzVDLE9BQU8sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDdkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENB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QUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNYXRyaXgsIFZlY3RvciwgQ29vcmRpbmF0ZXMsIFZlY3RvcnMsIERpc3RhbmNlTWV0cmljfSBmcm9tICcuL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7cmFuZG9tRmxvYXQsIHJhbmRvbUludH0gZnJvbSAnLi9yYW5kb20nO1xuXG4vKipcbiAqIEFzc2VydHMgYSBjb25kaXRpb24gYnkgdGhyb3dpbmcgYW4gRXJyb3IuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtib29sZWFufSBbY29uZGl0aW9uPWZhbHNlXSBDb25kaXRpb24gdG8gYXNzZXJ0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPSdBc3NlcnRpb24gZXJyb3IuJ10gTWVzc2FnZSB0byBvdXRwdXQuXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb246IGJvb2xlYW4gPSBmYWxzZSwgbWVzc2FnZTogc3RyaW5nID0gJ0Fzc2VydGlvbiBlcnJvci4nKSB7XG4gIGlmICghY29uZGl0aW9uKVxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIG5ldyB0d28tZGltZW5zaW9uYWwgYXJyYXkgYW5kIGZpbGxzIGl0IHdpdGggdGhlIHZhbHVlIGdpdmVuLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBkaW1lbnNpb24xIFRoZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhlIGNvb3JkaW5hdGVzIChudW1iZXIgb2Ygcm93cykuXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgY29vcmRpbmF0ZXMgKG51bWJlciBvZiBjb2x1bW5zKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbD0wXSBBIHZhbHVlIHRvIGZpbGwgdGhlIGNvb3JkaW5hdGVzIHdpdGguXG4gKiBAcmV0dXJuIHtDb29yZGluYXRlc30gQSB0d28tZGltZW5zaW9uYWwgZmlsbGVkIHdpdGggdGhlIHZhbHVlIGdpdmVuLlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIGZpbGw6IG51bWJlciA9IDApOiBDb29yZGluYXRlcyB7XG4gIHJldHVybiBuZXcgQXJyYXkoZGltZW5zaW9uMSkuZmlsbChmaWxsKS5tYXAoKCkgPT4gKG5ldyBWZWN0b3IoZGltZW5zaW9uMikuZmlsbChmaWxsKSkpO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBNYXRyaXgge1xuICByZXR1cm4gbmV3IEFycmF5KG1hdHJpeFswXS5sZW5ndGgpLmZpbGwoMClcbiAgICAubWFwKChfLCBpKSA9PiAobmV3IFZlY3RvcihtYXRyaXgubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaikgPT4gKG1hdHJpeFtqXVtpXSkpKSk7XG59XG5cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocDogVmVjdG9yLCBxOiBWZWN0b3IsIG11bHRpcGxpZXI6IG51bWJlciA9IDEpOiBWZWN0b3Ige1xuICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcblxuICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuXG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHBbaV0gKyBtdWx0aXBsaWVyICogcVtpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbi8qKlxuICogU3VtcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBiZSBzdW1tZWQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2ZWN0b3IncyBpdGVtcyBzdW0uXG4gKi9cbmZ1bmN0aW9uIGl0ZW1zU3VtKHY6IFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgIHRvdGFsICs9IHZbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1cWFyZXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gc3F1YXJlLlxuICogQHJldHVybiB7VmVjdG9yfSBBIG5ldyB2ZWN0b3IgY29udGFpbmluZyB0aGUgb3JpZ2luYWwncyBpdGVtcyBzcXVhcmVkLlxuICovXG5mdW5jdGlvbiB2ZWN0b3JTcXVhcmUodjogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3Rvckxlbmd0aCh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgc3FyU3VtOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICBzcXJTdW0gKz0gdltpXSAqIHZbaV07XG4gIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvckRvdFByb2R1Y3QodjE6IFZlY3RvciwgdjI6IFZlY3Rvcik6IG51bWJlciB7XG4gIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSB2ZWN0b3JzIG11c3QgbWF0Y2gnKTtcbiAgbGV0IHByb2Q6IG51bWJlciA9IDA7XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKylcbiAgICBwcm9kICs9IHYxW2ldICogdjJbaV07XG4gIHJldHVybiBwcm9kO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xLl0gTWF4IHZhbHVlIGdpdmVuIGJ5IHJhbmRvbSBnZW5lcmF0b3IuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IEEgbmV3IG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSYW5kb21NYXRyaXgoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIHNjYWxlOiBudW1iZXIgPSAxLik6IE1hdHJpeCB7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhkaW1lbnNpb24xLCBkaW1lbnNpb24yKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbWVuc2lvbjE7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UocDogVmVjdG9yLCBxOiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgcmVzdWx0ID0gMDtcbiAgY29uc3QgbGVuID0gcC5sZW5ndGg7XG5cbiAgaWYgKGxlbiAhPT0gcS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZGltZW5zaW9uYWxpdHkgb2YgdGhlIHZlY3RvcnMgbXVzdCBtYXRjaCcpO1xuICBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICByZXN1bHQgKz0gKHBbaV0gLSBxW2ldKSAqKiAyO1xuICBcbiAgcmV0dXJuIE1hdGguc3FydChyZXN1bHQpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgYSBjdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3JzfSBkYXRhIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy5cbiAqIEBwYXJhbSB7RGlzdGFuY2VNZXRyaWN9IGRpc3RhbmNlIEN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge01hdHJpeH0gQ2FsY3VsYXRlZCBjdXN0b20gZGlzdGFuY2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY0Rpc3RhbmNlTWF0cml4KGRhdGE6IFZlY3RvcnMsIGRpc3RhbmNlOiBEaXN0YW5jZU1ldHJpYyk6IE1hdHJpeCB7XG4gIGNvbnN0IG5JdGVtcyA9IGRhdGEubGVuZ3RoO1xuICBjb25zdCBtYXRyaXggPSBpbml0Q29vcmRpbmF0ZXMobkl0ZW1zLCBuSXRlbXMsIDApO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBuSXRlbXM7ICsraikge1xuICAgICAgY29uc3QgZDogbnVtYmVyID0gKGRhdGFbaV0gPT0gbnVsbCkgfHwgKGRhdGFbal0gPT0gbnVsbCkgPyAwIDogZGlzdGFuY2UoZGF0YVtpXSwgZGF0YVtqXSk7XG4gICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbal1baV0gPSBkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWF0cml4O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgYSBjdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3JzfSBkYXRhIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy5cbiAqIEBwYXJhbSB7RGlzdGFuY2VNZXRyaWN9IGRpc3RhbmNlIEN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge01hdHJpeH0gQ2FsY3VsYXRlZCBjdXN0b20gZGlzdGFuY2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY05vcm1hbGl6ZWREaXN0YW5jZU1hdHJpeChkYXRhOiBWZWN0b3JzLCBkaXN0YW5jZTogRGlzdGFuY2VNZXRyaWMpOiBNYXRyaXgge1xuICBjb25zdCBuSXRlbXMgPSBkYXRhLmxlbmd0aDtcbiAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcbiAgbGV0IG1heCA9IE51bWJlci5NSU5fVkFMVUU7XG4gIGxldCBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGk7IGogPCBuSXRlbXM7ICsraikge1xuICAgICAgY29uc3QgZDogbnVtYmVyID0gKGRhdGFbaV0gPT0gbnVsbCkgfHwgKGRhdGFbal0gPT0gbnVsbCB8fCBpID09PSBqKSA/IDAgOiBkaXN0YW5jZShkYXRhW2ldLCBkYXRhW2pdKTtcbiAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtqXVtpXSA9IGQ7XG4gICAgICBpZiAoZCA+IG1heCkgbWF4ID0gZDtcbiAgICAgIGlmIChkIDwgbWluKSBtaW4gPSBkO1xuICAgIH1cbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbkl0ZW1zOyArK2opXG4gICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbal1baV0gPSAobWF0cml4W2ldW2pdIC0gbWluKSAvIChtYXggLSBtaW4pO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKiBHZW5lcmF0ZXMgYXJyYXkgZnJvbSBhIHJhbmdlIFtiZWdpbjsgZW5kXSBvciBbYmVnaW47IGVuZCkgaWYgZW5kRXhjbHVzaXZlLiAqKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5SYW5nZShiZWdpbjogbnVtYmVyLCBlbmQ6IG51bWJlciwgZW5kRXhjbHVzaXZlID0gZmFsc2UpOiBJbnQzMkFycmF5IHtcbiAgY29uc3Qgbkl0ZW1zID0gZW5kIC0gYmVnaW4gKyAoZW5kRXhjbHVzaXZlID8gMCA6IDEpO1xuICBjb25zdCBzZXJpZXMgPSBuZXcgSW50MzJBcnJheShuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpXG4gICAgc2VyaWVzW2ldID0gYmVnaW4gKyBpO1xuXG4gIHJldHVybiBzZXJpZXM7XG59XG5cbi8qKlxuICogUmV0dXJucyBvcmRlciBvZiB2YWx1ZXMgYXMgaWYgdGhleSBhcmUgc29ydGVkLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7YW55W119IHZhbHVlcyBJbnB1dCBhcnJheS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldmVyc2U9ZmFsc2VdIFdoZXRoZXIgdG8gcmV0dXJuIHJldmVyc2VkIG9yZGVyLlxuICogQHJldHVybiB7bnVtYmVyW119IFRoZSBvcmRlciBjb21wdXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFyZ1NvcnQodmFsdWVzOiBhbnlbXSwgcmV2ZXJzZSA9IGZhbHNlKTogbnVtYmVyW10ge1xuICBjb25zdCBzb3J0Zm4gPSByZXZlcnNlID8gKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGJbMF0gLSBhWzBdKSA6IChhOiBhbnlbXSwgYjogYW55W10pID0+IChhWzBdIC0gYlswXSk7XG4gIGNvbnN0IGRlY29yID0gKHY6IGFueSwgaTogbnVtYmVyKSA9PiBbdiwgaV07IC8vIHNldCBpbmRleCB0byB2YWx1ZVxuICBjb25zdCB1bmRlY29yID0gKGE6IGFueVtdKSA9PiBhWzFdOyAvLyBsZWF2ZSBvbmx5IGluZGV4XG4gIGNvbnN0IF9hcmdzb3J0ID0gKGFycjogYW55W10pID0+IGFyci5tYXAoZGVjb3IpLnNvcnQoc29ydGZuKS5tYXAodW5kZWNvcik7XG4gIHJldHVybiBfYXJnc29ydCh2YWx1ZXMpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4ZXMgb2YgdGhlIG1vc3QgZGl2ZXJzZSBvYmplY3RzIGFjY29yZGluZyB0byB0aGUgZGlzdCBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCB0b3RhbCBudW1iZXIgb2Ygb2JqZWN0c1xuICogQHBhcmFtIHtudW1iZXJ9IG4gbnVtYmVyIG9mIGRpdmVyc2UgZWxlbWVudHMgdG8gZmluZFxuICogQHBhcmFtIHsoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyfSBkaXN0IGEgZnVuY3Rpb24gd2hpY2ggY2FsY3VsYXRlcyBkaXN0YW5jZSBiZXR3ZWVuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvIG9iamVjdHMgdXNpbmcgdGhlaXIgaW5kZXhlc1xuICogQHJldHVybnMge251bWJlcltdfSBUaGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpdmVyc2VTdWJzZXQobGVuZ3RoOiBudW1iZXIsIG46IG51bWJlciwgZGlzdDogKGkxOiBudW1iZXIsIGkyOiBudW1iZXIpID0+IG51bWJlcik6IG51bWJlcltdIHtcbiAgZnVuY3Rpb24gbWF4QnkodmFsdWVzOiBJdGVyYWJsZUl0ZXJhdG9yPG51bWJlcj4sIG9yZGVyQnk6IChpOiBudW1iZXIpID0+IG51bWJlcikge1xuICAgIGxldCBtYXhWYWx1ZSA9IG51bGw7XG4gICAgbGV0IG1heE9yZGVyQnkgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHZhbHVlcykge1xuICAgICAgY29uc3QgZWxlbWVudE9yZGVyQnkgPSBvcmRlckJ5KGVsZW1lbnQpO1xuICAgICAgaWYgKG1heE9yZGVyQnkgPT0gbnVsbCB8fCBlbGVtZW50T3JkZXJCeSA+IG1heE9yZGVyQnkpIHtcbiAgICAgICAgbWF4VmFsdWUgPSBlbGVtZW50O1xuICAgICAgICBtYXhPcmRlckJ5ID0gZWxlbWVudE9yZGVyQnk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXhWYWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHN1YnNldCA9IFtyYW5kb21JbnQobGVuZ3RoIC0gMSldO1xuICBjb25zdCBjb21wbGVtZW50ID0gbmV3IFNldCgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoIXN1YnNldC5pbmNsdWRlcyhpKSlcbiAgICAgIGNvbXBsZW1lbnQuYWRkKGkpO1xuICB9XG5cbiAgd2hpbGUgKHN1YnNldC5sZW5ndGggPCBuKSB7XG4gICAgY29uc3QgaWR4ID0gbWF4QnkoXG4gICAgICBjb21wbGVtZW50LnZhbHVlcygpIGFzIEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPixcbiAgICAgIChpKSA9PiBNYXRoLm1pbi5hcHBseShNYXRoLCBzdWJzZXQubWFwKGZ1bmN0aW9uKHZhbCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGRpc3QoaSwgdmFsKTtcbiAgICAgIH0pKSk7XG4gICAgaWYgKGlkeCkge1xuICAgICAgc3Vic2V0LnB1c2goaWR4KTtcbiAgICAgIGNvbXBsZW1lbnQuZGVsZXRlKGlkeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdWJzZXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBub3JtYWxpemVkIHZlY3Rvci5cbiAqIFxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3J9IGRhdGEgbnVtZXJpY2FsIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUoZGF0YTogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGg7XG4gIGxldCBzdW0gPSAwO1xuICBsZXQgc3VtT2ZTcXVhcmVzID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgc3VtICs9IGRhdGFbaV07XG4gICAgc3VtT2ZTcXVhcmVzICs9IGRhdGFbaV0gKiogMjtcbiAgfVxuXG4gIGNvbnN0IG1lYW4gPSBzdW0gLyBsZW47XG4gIGNvbnN0IHN0ZERldkludmVyc2UgPSAxLjAgLyBNYXRoLnNxcnQoc3VtT2ZTcXVhcmVzIC8gbGVuIC0gbWVhbiAqKiAyKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pICogc3RkRGV2SW52ZXJzZTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBGaW5kcyBzZXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBsaXN0cy5cbiAqIEBwYXJhbSB7YW55W119IGEgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge2FueVtdfSBiIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge2FueVtdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGlmZmVyZW5jZShhOiBhbnlbXSwgYjogYW55W10pOiBhbnlbXSB7XG4gIGNvbnN0IGJTZXQgPSBuZXcgU2V0KGIpO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGEuZmlsdGVyKCh4KSA9PiAhYlNldC5oYXMoeCkpKS52YWx1ZXMoKSk7XG59XG4iXX0=","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}\nexport function isNumericMetric(name) {\n return MetricToDataType[name] == DistanceMetricsSubjects.Number.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) || isNumericMetric(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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UUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBcUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzdFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBbUIsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBNEI7UUFDNUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxLQUFLLGlCQUFpQjtRQUMxQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmbCBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcbmltcG9ydCB7amFyb1dpbmtsZXJ9IGZyb20gJ2phcm8td2lua2xlci10eXBlc2NyaXB0JztcbmltcG9ydCB7RGlzdGFuY2VNZXRyaWN9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7XG4gIGFzeW1tZXRyaWNEaXN0YW5jZSxcbiAgYnJhdW5CbGFucXVldERpc3RhbmNlLFxuICBjb3NpbmVEaXN0YW5jZSxcbiAgZGljZURpc3RhbmNlLFxuICBldWNsaWRlYW5EaXN0YW5jZSxcbiAgaGFtbWluZ0Rpc3RhbmNlLFxuICBrdWxjenluc2tpRGlzdGFuY2UsXG4gIG1jQ29ubmF1Z2hleURpc3RhbmNlLFxuICByb2dvdEdvbGRiZXJnRGlzdGFuY2UsXG4gIHJ1c3NlbERpc3RhbmNlLFxuICBzb2thbERpc3RhbmNlLFxuICB0YW5pbW90b0Rpc3RhbmNlLFxuICBudW1lcmljRGlzdGFuY2UsXG4gIHRhbmltb3RvRGlzdGFuY2VJbnRBcnJheSxcbn0gZnJvbSAnLi4vZGlzdGFuY2UtbWV0cmljcy1tZXRob2RzJztcblxuaW1wb3J0IHtjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZX0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdmVjdG9yLW9wZXJhdGlvbnMnO1xuaW1wb3J0IEJpdEFycmF5IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL2JpdC1hcnJheSc7XG5pbXBvcnQge1ZlY3RvciwgU3RyaW5nRGljdGlvbmFyeX0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdHlwZS1kZWNsYXJhdGlvbnMnO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25zLCBNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXN9IGZyb20gJy4uL21hY3JvbW9sZWN1bGUtZGlzdGFuY2UtZnVuY3Rpb25zJztcbmltcG9ydCB7RGlzdGFuY2VNZXRyaWNzU3ViamVjdHMsIEJpdEFycmF5TWV0cmljc05hbWVzLFxuICBTdHJpbmdNZXRyaWNzTmFtZXMsIFZlY3Rvck1ldHJpY3NOYW1lcywgTnVtYmVyTWV0cmljc05hbWVzLCBJbnRBcnJheU1ldHJpY3NOYW1lc30gZnJvbSAnLi9jb25zdHMnO1xuXG5cbmV4cG9ydCBjb25zdCB2ZWN0b3JEaXN0YW5jZU1ldHJpY3NNZXRob2RzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogVmVjdG9yLCB5OiBWZWN0b3IpID0+IG51bWJlciB9ID0ge1xuICBbVmVjdG9yTWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGNhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlLFxufTtcblxuZXhwb3J0IGNvbnN0IHN0cmluZ0Rpc3RhbmNlTWV0cmljc01ldGhvZHM6IHsgW25hbWU6IHN0cmluZ106ICh4OiBzdHJpbmcsIHk6IHN0cmluZykgPT4gbnVtYmVyIH0gPSB7XG4gIFtTdHJpbmdNZXRyaWNzTmFtZXMuTGV2ZW5zaHRlaW5dOiBmbC5kaXN0YW5jZSxcbiAgW1N0cmluZ01ldHJpY3NOYW1lcy5KYXJvV2lua2xlcl06IGphcm9XaW5rbGVyLFxuICBbU3RyaW5nTWV0cmljc05hbWVzLk1hbmhhdHRhbl06IG1hbmhhdHRhbkRpc3RhbmNlLFxuICBbU3RyaW5nTWV0cmljc05hbWVzLk9uZWhvdF06IGNhdGVnb3JpY2FsRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3QgYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KSA9PiBudW1iZXIgfSA9IHtcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvXTogdGFuaW1vdG9EaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdOiBkaWNlRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYXN5bW1ldHJpY0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQnJhdW5CbGFucXVldF06IGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV06IGNvc2luZURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGt1bGN6eW5za2lEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV06IG1jQ29ubmF1Z2hleURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ106IHJvZ290R29sZGJlcmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IHJ1c3NlbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuU29rYWxdOiBzb2thbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuSGFtbWluZ106IGhhbW1pbmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGV1Y2xpZGVhbkRpc3RhbmNlLFxufTtcblxuZXhwb3J0IGNvbnN0IGludEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kczogeyBbbmFtZTogc3RyaW5nXTogKHg6IFVpbnQzMkFycmF5LCB5OiBVaW50MzJBcnJheSkgPT4gbnVtYmVyIH0gPSB7XG4gIFtJbnRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b0ludEFycmF5XTogdGFuaW1vdG9EaXN0YW5jZUludEFycmF5LFxufTtcblxuZXhwb3J0IGNvbnN0IG51bWJlckRpc3RhbmNlTWV0cmljc01ldGhvZHM6IHsgW25hbWU6IHN0cmluZ106IChhcmdzOiBhbnkpID0+ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gbnVtYmVyIH0gPSB7XG4gIFtOdW1iZXJNZXRyaWNzTmFtZXMuRGlmZmVyZW5jZV06IG51bWVyaWNEaXN0YW5jZSxcbn07XG5cbmV4cG9ydCBjb25zdCBBdmFpbGFibGVNZXRyaWNzID0ge1xuICBbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuVmVjdG9yXToge1xuICAgIFtWZWN0b3JNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXTogdmVjdG9yRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tWZWN0b3JNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXSxcbiAgfSxcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLlN0cmluZ106IHtcbiAgICBbU3RyaW5nTWV0cmljc05hbWVzLkxldmVuc2h0ZWluXTogc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tTdHJpbmdNZXRyaWNzTmFtZXMuTGV2ZW5zaHRlaW5dLFxuICAgIFtTdHJpbmdNZXRyaWNzTmFtZXMuSmFyb1dpbmtsZXJdOiBzdHJpbmdEaXN0YW5jZU1ldHJpY3NNZXRob2RzW1N0cmluZ01ldHJpY3NOYW1lcy5KYXJvV2lua2xlcl0sXG4gICAgW1N0cmluZ01ldHJpY3NOYW1lcy5NYW5oYXR0YW5dOiBzdHJpbmdEaXN0YW5jZU1ldHJpY3NNZXRob2RzW1N0cmluZ01ldHJpY3NOYW1lcy5NYW5oYXR0YW5dLFxuICAgIFtTdHJpbmdNZXRyaWNzTmFtZXMuT25laG90XTogc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tTdHJpbmdNZXRyaWNzTmFtZXMuT25laG90XSxcbiAgfSxcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLkJpdEFycmF5XToge1xuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b106IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b10sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuRGljZV0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLkFzeW1tZXRyaWNdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuQXN5bW1ldHJpY10sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLkJyYXVuQmxhbnF1ZXRdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuQnJhdW5CbGFucXVldF0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5LdWxjenluc2tpXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkt1bGN6eW5za2ldLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5NY0Nvbm5hdWdoZXldOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuTWNDb25uYXVnaGV5XSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ106IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5Sb2dvdEdvbGRiZXJnXSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUnVzc2VsXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLlNva2FsXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLlNva2FsXSxcbiAgfSxcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLk1hY3JvTW9sZWN1bGVdOiB7IC8vIG9wdGlvbmFsIGFyZ3MgbmVlZGVkIGZvciBtYWNyb21vbGVjdWxlIGZ1bmN0aW9ucyB3aGljaCBpbml0aWFsaXplIHRoZW1cbiAgICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkhBTU1JTkddOiBtbURpc3RhbmNlRnVuY3Rpb25zW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5IQU1NSU5HXSxcbiAgICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkxFVkVOU0hURUlOXTogbW1EaXN0YW5jZUZ1bmN0aW9uc1tNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTEVWRU5TSFRFSU5dLFxuICAgIFtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTkVFRExFTUFOTl9XVU5TQ0hdOiBtbURpc3RhbmNlRnVuY3Rpb25zW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5ORUVETEVNQU5OX1dVTlNDSF0sXG4gICAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5NT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFXTpcbiAgICAgIG1tRGlzdGFuY2VGdW5jdGlvbnNbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLk1PTk9NRVJfQ0hFTUlDQUxfRElTVEFOQ0VdLFxuICB9LFxuICBbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuTnVtYmVyXToge1xuICAgIFtOdW1iZXJNZXRyaWNzTmFtZXMuRGlmZmVyZW5jZV06IG51bWJlckRpc3RhbmNlTWV0cmljc01ldGhvZHNbTnVtYmVyTWV0cmljc05hbWVzLkRpZmZlcmVuY2VdLFxuICB9LFxuICBbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuSW50QXJyYXldOiB7XG4gICAgW0ludEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvSW50QXJyYXldOiBpbnRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbSW50QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9JbnRBcnJheV0sXG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBNZXRyaWNUb0RhdGFUeXBlOiBTdHJpbmdEaWN0aW9uYXJ5ID0gT2JqZWN0LmtleXMoQXZhaWxhYmxlTWV0cmljcylcbiAgLnJlZHVjZSgocmV0OiBTdHJpbmdEaWN0aW9uYXJ5LCBrZXkpID0+IHtcbiAgICBmb3IgKGNvbnN0IHZhbCBvZiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzW2tleSBhcyBBdmFpbGFibGVEYXRhVHlwZXNdKSlcbiAgICAgIHJldFt2YWwgYXMgQXZhaWxhYmxlRGF0YVR5cGVzXSA9IGtleTtcblxuICAgIHJldHVybiByZXQ7XG4gIH0sIHt9KTtcblxuZXhwb3J0IHR5cGUgQXZhaWxhYmxlRGF0YVR5cGVzID0ga2V5b2YgdHlwZW9mIEF2YWlsYWJsZU1ldHJpY3M7XG5leHBvcnQgdHlwZSBWZWN0b3JNZXRyaWNzID0ga2V5b2YgdHlwZW9mIEF2YWlsYWJsZU1ldHJpY3NbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuVmVjdG9yXTtcbmV4cG9ydCB0eXBlIFN0cmluZ01ldHJpY3MgPSBrZXlvZiB0eXBlb2YgQXZhaWxhYmxlTWV0cmljc1tEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5TdHJpbmddO1xuZXhwb3J0IHR5cGUgQml0QXJyYXlNZXRyaWNzID0ga2V5b2YgdHlwZW9mIEF2YWlsYWJsZU1ldHJpY3NbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuQml0QXJyYXldO1xuZXhwb3J0IHR5cGUgS25vd25NZXRyaWNzID0gU3RyaW5nTWV0cmljcyB8IEJpdEFycmF5TWV0cmljcyB8IFZlY3Rvck1ldHJpY3MgfFxuICBNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMgfCBOdW1iZXJNZXRyaWNzTmFtZXMgfCBJbnRBcnJheU1ldHJpY3NOYW1lcztcblxuZXhwb3J0IHR5cGUgVmFsaWRUeXBlcyA9XG4gIHsgZGF0YTogc3RyaW5nW10sIG1ldHJpYzogU3RyaW5nTWV0cmljcyB8IE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcyB9IHxcbiAgeyBkYXRhOiBWZWN0b3JbXSwgbWV0cmljOiBWZWN0b3JNZXRyaWNzIH0gfFxuICB7IGRhdGE6IEJpdEFycmF5W10sIG1ldHJpYzogQml0QXJyYXlNZXRyaWNzIH0gfFxuICB7IGRhdGE6IG51bWJlcltdLCBtZXRyaWM6IE51bWJlck1ldHJpY3NOYW1lcyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdNZXRyaWMobmFtZTogS25vd25NZXRyaWNzKSB7XG4gIHJldHVybiBNZXRyaWNUb0RhdGFUeXBlW25hbWVdID09ICdTdHJpbmcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCaXRBcnJheU1ldHJpYyhuYW1lOiBLbm93bk1ldHJpY3MpIHtcbiAgcmV0dXJuIE1ldHJpY1RvRGF0YVR5cGVbbmFtZV0gPT0gJ0JpdEFycmF5Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmVjdG9yTWV0cmljKG5hbWU6IEtub3duTWV0cmljcykge1xuICByZXR1cm4gTWV0cmljVG9EYXRhVHlwZVtuYW1lXSA9PSAnVmVjdG9yJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWFjcm9Nb2xlY3VsZU1ldHJpYyhuYW1lOiBLbm93bk1ldHJpY3MpIHtcbiAgcmV0dXJuIE1ldHJpY1RvRGF0YVR5cGVbbmFtZV0gPT0gRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuTWFjcm9Nb2xlY3VsZS50b1N0cmluZygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljTWV0cmljKG5hbWU6IEtub3duTWV0cmljcykge1xuICByZXR1cm4gTWV0cmljVG9EYXRhVHlwZVtuYW1lXSA9PSBEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5OdW1iZXIudG9TdHJpbmcoKTtcbn1cblxuLyoqIE1hbmhhdHRhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzZXF1ZW5jZXMgKG1hdGNoIC0gMCwgbWlzbWF0Y2ggLSAxKSBub3JtYWxpemVkIGZvciBsZW5ndGguICovXG5leHBvcnQgZnVuY3Rpb24gbWFuaGF0dGFuRGlzdGFuY2UoczE6IHN0cmluZywgczI6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmIChzMS5sZW5ndGggIT09IHMyLmxlbmd0aCkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIGxldCBkaXN0OiBudW1iZXIgPSAwO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgczEubGVuZ3RoOyBpKyspXG4gICAgICBkaXN0ICs9IHMxW2ldID09IHMyW2ldID8gMCA6IDE7XG4gICAgcmV0dXJuIGRpc3QgLyBzMS5sZW5ndGg7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3JpY2FsRGlzdGFuY2UoczE6IHN0cmluZywgczI6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBzMSA9PT0gczIgPyAwIDogMTtcbn1cblxuLyoqIFVuaWZpZWQgY2xhc3MgaW1wbGVtZW50aW5nIGRpZmZlcmVudCBzdHJpbmcgbWVhc3VyZXMuICovXG5leHBvcnQgY2xhc3MgTWVhc3VyZSB7XG4gIHByb3RlY3RlZCBtZXRob2Q6IEtub3duTWV0cmljcztcbiAgcHJvdGVjdGVkIGRhdGFUeXBlOiBBdmFpbGFibGVEYXRhVHlwZXM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTWVhc3VyZSB3aXRoIC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCBNZXRob2QgdG8gY2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4gc3RyaW5ncy5cbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXRob2Q6IEtub3duTWV0cmljcykge1xuICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgIHRoaXMuZGF0YVR5cGUgPSBNZXRyaWNUb0RhdGFUeXBlW21ldGhvZF0gYXMgQXZhaWxhYmxlRGF0YVR5cGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY3VzdG9tIHN0cmluZyBkaXN0YW5jZSBmdW5jdGlvbiBzcGVjaWZpZWQuXG4gICAqIEBwYXJhbSB7b3B0c30gb3B0cyBPcHRpb25zIGZvciB0aGUgbWVhc3VyZS4gdXNlZCBmb3IgbWFjcm9tb2xlY3VsZSBkaXN0YW5jZXNcbiAgICogQHJldHVybiB7RGlzdGFuY2VNZXRyaWN9IENhbGxiYWNrIG9mIHRoZSBtZWFzdXJlIGNob3Nlbi5cbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBwdWJsaWMgZ2V0TWVhc3VyZShvcHRzPzogYW55KTogRGlzdGFuY2VNZXRyaWMge1xuICAgIGNvbnN0IGRpY3Q6IHsgW2tleTogc3RyaW5nXTpcbiAgICAgIHtba2V5Mjogc3RyaW5nXTogRGlzdGFuY2VNZXRyaWMgfCAoKG9wdHM6IGFueSkgPT4gRGlzdGFuY2VNZXRyaWMpfVxuICAgIH0gPSBBdmFpbGFibGVNZXRyaWNzO1xuICAgIGlmICghZGljdC5oYXNPd25Qcm9wZXJ0eSh0aGlzLmRhdGFUeXBlKSB8fCAhZGljdFt0aGlzLmRhdGFUeXBlXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLm1ldGhvZCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbWVhc3VyZSAke3RoaXMubWV0aG9kfSBmb3IgZGF0YSB0eXBlICR7dGhpcy5kYXRhVHlwZX1gKTtcbiAgICByZXR1cm4gaXNNYWNyb01vbGVjdWxlTWV0cmljKHRoaXMubWV0aG9kKSB8fCBpc051bWVyaWNNZXRyaWModGhpcy5tZXRob2QpID9cbiAgICAgIChkaWN0W3RoaXMuZGF0YVR5cGVdW3RoaXMubWV0aG9kXSBhcyAoKG9wdHM6IGFueSkgPT4gRGlzdGFuY2VNZXRyaWMpKShvcHRzKSA6XG4gICAgICBkaWN0W3RoaXMuZGF0YVR5cGVdW3RoaXMubWV0aG9kXSBhcyBEaXN0YW5jZU1ldHJpYztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGN1c3RvbSBzdHJpbmcgZGlzdGFuY2UgYnkgdGhlIGdpdmVuIGRhdGEgdHlwZS5cbiAgICogQHBhcmFtIHtBdmFpbGFibGVEYXRhVHlwZXN9IGRhdGFUeXBlIE1ldHJpYydzIGRhdGEgdHlwZVxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gTWV0cmljIG5hbWVzIHdoaWNoIGV4cGVjdHMgdGhlIGdpdmVuIGRhdGEgdHlwZVxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TWV0cmljQnlEYXRhVHlwZShkYXRhVHlwZTogQXZhaWxhYmxlRGF0YVR5cGVzKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzW2RhdGFUeXBlXSk7XG4gIH1cblxuICAvKiogUmV0dXJucyBtZXRyaWMgbmFtZXMgYXZhaWxhYmxlLlxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIHN0YXRpYyBnZXQgYXZhaWxhYmxlTWVhc3VyZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzKTtcbiAgfVxufVxuIl19","import { DistanceAggregationMethods } from './types';\nexport 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 await this.calcMulti([values], [fnName], normalize, [opts ?? {}], [1], DistanceAggregationMethods.MANHATTAN);\n }\n async calcMulti(values, fnNames, normalize = true, opts = [{}], weights = [1], aggregationMethod = DistanceAggregationMethods.MANHATTAN) {\n if (values.length < 1)\n throw new Error('values must contain at least one array');\n if (fnNames.length !== values.length || opts.length !== values.length || weights.length !== values.length)\n throw new Error('values, fnNames, weights and opts must have the same length');\n return new Promise(async (resolve, reject) => {\n try {\n const len = values[0].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, fnNames, startRow, startCol, chunckSize: end - start, opts, weights, aggregationMethod });\n promises[i] = new Promise((resolveWorker, rejectWorker) => {\n this._workers[i].onmessage = ({ data: { error, distanceMatrixData, min, max } }) => {\n this._terminateOnComplete && setTimeout(() => 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWF0cml4LXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaXN0YW5jZS1tYXRyaXgtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQTRCLDBCQUEwQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlFLE1BQU0sT0FBTyxxQkFBcUI7SUFDdEIsUUFBUSxDQUFXO0lBQ25CLFlBQVksQ0FBUztJQUNyQixvQkFBb0IsQ0FBVTtJQUN0QyxZQUFtQixvQkFBb0IsR0FBRyxJQUFJLEVBQUUsbUJBQW1CLEdBQUcsSUFBSTtRQUN4RSxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsbUJBQW1CLENBQUM7UUFDbEQsSUFBSSxDQUFDLFlBQVksR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzthQUNwRCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsMEJBQTBCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG1CQUFtQixDQUFDO0lBQ2xELENBQUM7SUFBQSxDQUFDO0lBRUssS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFrQixFQUFFLE1BQW9CLEVBQ3hELFNBQVMsR0FBRyxJQUFJLEVBQUUsSUFBeUI7UUFDM0MsT0FBTyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFDdkQsQ0FBQyxJQUFJLElB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QzVCLElBQUksU0FBUztvQkFDWCxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUN6QjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNYO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sU0FBUztRQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5pbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIERpc3RhbmNlTWF0cml4U2VydmljZSB7XG4gICAgcHJpdmF0ZSBfd29ya2VyczogV29ya2VyW107XG4gICAgcHJpdmF0ZSBfd29ya2VyQ291bnQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF90ZXJtaW5hdGVPbkNvbXBsZXRlOiBib29sZWFuO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih1c2VDb25jdXJyZW50V29ya2VycyA9IHRydWUsIHRlcm1pbmF0ZU9uQ29tcGxldGUgPSB0cnVlKSB7XG4gICAgICBjb25zdCB0aHJlYWRDb3VudCA9IG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5O1xuICAgICAgdGhpcy5fd29ya2VyQ291bnQgPSB1c2VDb25jdXJyZW50V29ya2VycyA/IE1hdGgubWF4KHRocmVhZENvdW50IC0gMiwgMSkgOiAxO1xuICAgICAgdGhpcy5fd29ya2VycyA9IG5ldyBBcnJheSh0aGlzLl93b3JrZXJDb3VudCkuZmlsbChudWxsKVxuICAgICAgICAubWFwKCgpID0+IG5ldyBXb3JrZXIobmV3IFVSTCgnLi9kaXN0YW5jZS1tYXRyaXgtd29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSkpO1xuICAgICAgdGhpcy5fdGVybWluYXRlT25Db21wbGV0ZSA9IHRlcm1pbmF0ZU9uQ29tcGxldGU7XG4gICAgfTtcblxuICAgIHB1YmxpYyBhc3luYyBjYWxjKHZhbHVlczogQXJyYXk8YW55PiwgZm5OYW1lOiBLbm93bk1ldHJpY3MsXG4gICAgICBub3JtYWxpemUgPSB0cnVlLCBvcHRzPzoge1tfOiBzdHJpbmddOiBhbnl9KTogUHJvbWlzZTxGbG9hdDMyQXJyYXk+IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNhbGNNdWx0aShbdmFsdWVzXSwgW2ZuTmFtZV0sIG5vcm1hbGl6ZSxcbiAgICAgICAgW29wdHMgPz8ge31dLCBbMV0sIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLk1BTkhBVFRBTik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNhbGNNdWx0aShcbiAgICAgIHZhbHVlczogQXJyYXk8YW55PltdLCBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSxcbiAgICAgIG5vcm1hbGl6ZSA9IHRydWUsIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fVtdID0gW3t9XSxcbiAgICAgIHdlaWdodHM6IG51bWJlcltdID0gWzFdLCBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLk1BTkhBVFRBTlxuICAgICk6IFByb21pc2U8RmxvYXQzMkFycmF5PiB7XG4gICAgICBpZiAodmFsdWVzLmxlbmd0aCA8IDEpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmFsdWVzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgYXJyYXknKTtcbiAgICAgIGlmIChmbk5hbWVzLmxlbmd0aCAhPT0gdmFsdWVzLmxlbmd0aCB8fCBvcHRzLmxlbmd0aCAhPT0gdmFsdWVzLmxlbmd0aCB8fCB3ZWlnaHRzLmxlbmd0aCAhPT0gdmFsdWVzLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2YWx1ZXMsIGZuTmFtZXMsIHdlaWdodHMgYW5kIG9wdHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCcpO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBsZW4gPSB2YWx1ZXNbMF0ubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gbmV3IEFycmF5PFByb21pc2U8dm9pZD4+KHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgICAgICBjb25zdCB0b3RhbExlbmd0aCA9IGxlbiAqIChsZW4gLSAxKSAvIDI7IC8vIHNpemUgb2YgcmVkdWNlZCBkaXN0YW5jZSBtYXRyaXhcbiAgICAgICAgICB0aGlzLl93b3JrZXJDb3VudCA9IE1hdGgubWluKHRoaXMuX3dvcmtlckNvdW50LCB0b3RhbExlbmd0aCk7XG4gICAgICAgICAgY29uc3QgY2h1bmtTaXplID0gdG90YWxMZW5ndGggLyB0aGlzLl93b3JrZXJDb3VudDtcbiAgICAgICAgICBjb25zdCBkaXN0YW5jZU1hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkodG90YWxMZW5ndGgpO1xuICAgICAgICAgIGxldCBlbmRSb3cgPSAwO1xuICAgICAgICAgIGxldCBlbmRDb2wgPSAxO1xuICAgICAgICAgIC8vIG1pbm1heCBmb3Igbm9ybWFsaXphdGlvblxuICAgICAgICAgIGxldCBsbWluID0gMDtcbiAgICAgICAgICBsZXQgbG1heCA9IE51bWJlci5NSU5fVkFMVUU7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl93b3JrZXJDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGguZmxvb3IoaSAqIGNodW5rU2l6ZSk7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSAoaSA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxKSA/IHRvdGFsTGVuZ3RoIDogTWF0aC5mbG9vcigoaSArIDEpICogY2h1bmtTaXplKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0Um93ID0gZW5kUm93O1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRDb2wgPSBlbmRDb2w7XG4gICAgICAgICAgICBpZiAoaSAhPT0gdGhpcy5fd29ya2VyQ291bnQgLSAxKSB7XG4gICAgICAgICAgICAgIC8vIFRoZXNlIGZvcm11bGFzIG1hcCB0aGUgbGluZWFyIGluZGV4IHRvIHRoZSB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeCBpbmRpY2VzXG4gICAgICAgICAgICAgIGVuZFJvdyA9IGxlbiAtIDIgLSBNYXRoLmZsb29yKE1hdGguc3FydCgtOCAqIGVuZCArIDQgKiBsZW4gKiAobGVuIC0gMSkgLSA3KSAvIDIgLSAwLjUpO1xuICAgICAgICAgICAgICBlbmRDb2wgPSBlbmQgLSBsZW4gKiBlbmRSb3cgKyBNYXRoLmZsb29yKChlbmRSb3cgKyAxKSAqIChlbmRSb3cgKyAyKSAvIDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fd29ya2Vyc1tpXS5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAge3ZhbHVlcywgZm5OYW1lcywgc3RhcnRSb3csIHN0YXJ0Q29sLCBjaHVuY2tTaXplOiBlbmQgLSBzdGFydCwgb3B0cywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2R9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcHJvbWlzZXNbaV0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZVdvcmtlciwgcmVqZWN0V29ya2VyKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX3dvcmtlcnNbaV0ub25tZXNzYWdlID0gKHtkYXRhOiB7ZXJyb3IsIGRpc3RhbmNlTWF0cml4RGF0YSwgbWluLCBtYXh9fSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmF0ZU9uQ29tcGxldGUgJiYgc2V0VGltZW91dCgoKSA9PiB0aGlzLl93b3JrZXJzW2ldLnRlcm1pbmF0ZSgpKTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIHJlamVjdFdvcmtlcihlcnJvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGRpc3RhbmNlTWF0cml4LnNldChkaXN0YW5jZU1hdHJpeERhdGEsIHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgIGlmIChtaW4gPCBsbWluKVxuICAgICAgICAgICAgICAgICAgICBsbWluID0gbWluO1xuICAgICAgICAgICAgICAgICAgaWYgKG1heCA+IGxtYXgpXG4gICAgICAgICAgICAgICAgICAgIGxtYXggPSBtYXg7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlV29ya2VyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgICBpZiAobm9ybWFsaXplKVxuICAgICAgICAgICAgZGlzdGFuY2VNYXRyaXguZm9yRWFjaCgodmFsdWUsIGluZGV4KSA9PiB7IGRpc3RhbmNlTWF0cml4W2luZGV4XSA9ICh2YWx1ZSAtIGxtaW4pIC8gKGxtYXggLSBsbWluKTsgfSk7XG4gICAgICAgICAgcmVzb2x2ZShkaXN0YW5jZU1hdHJpeCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB0ZXJtaW5hdGUoKTogdm9pZCB7XG4gICAgICB0aGlzLl93b3JrZXJzLmZvckVhY2goKHdvcmtlcikgPT4gd29ya2VyLnRlcm1pbmF0ZSgpKTtcbiAgICB9XG59XG4iXX0=","/**\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm5fZGVzY2VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5uX2Rlc2NlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE9BQU8sS0FBSyxJQUFJLE1BQU0sUUFBUSxDQUFDO0FBQy9CLE9BQU8sS0FBSyxNQUFNLE1BQU0sVUFBVSxDQUFDO0FBQ25DLE9BQU8sS0FBSyxJQUFJLE1BQU0sUUFBUSxDQUFDO0FBQy9CLE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBR2pDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxVQUFzQixFQUFFLE1BQWdCO0lBQ3BFLE9BQU8sU0FBUyxTQUFTLENBQ3ZCLElBQVksRUFDWixTQUFrQixFQUNsQixVQUFrQixFQUNsQixNQUFNLEdBQUcsRUFBRSxFQUNYLGFBQWEsR0FBRyxFQUFFLEVBQ2xCLEtBQUssR0FBRyxLQUFLLEVBQ2IsR0FBRyxHQUFHLEdBQUcsRUFDVCxVQUFVLEdBQUcsSUFBSTtRQUVqQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzlCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUU1RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3RFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN2QyxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUVoRCxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDbEQ7U0FDRjtRQUNELElBQUksVUFBVSxFQUFFO1lBQ2QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUM1QyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO3dCQUNyQixNQUFNO29CQUVSLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDaEQsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQzs0QkFDckIsTUFBTTt3QkFFUixNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNuRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDcEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQ3JFO2lCQUNGO2FBQ0Y7U0FDRjtRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0IsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUM3QyxZQUFZLEVBQ1osU0FBUyxFQUNULFVBQVUsRUFDVixhQUFhLEVBQ2IsTUFBTSxDQUNQLENBQUM7WUFFRixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN0QyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUc7d0JBQ3RDLFNBQVM7b0JBRVgsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDdEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNsRCxNQUFNLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsTUFBTSxFQUFFLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDOzRCQUN2QixTQUFTO3dCQUdYLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDN0MsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUM5QztpQkFDRjthQUNGO1lBQ0QsSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTTtnQkFDdkMsTUFBTTtTQUNUO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUM7QUFDSixDQUFDO0FBa0JELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxVQUFzQjtJQUN4RCxTQUFTLGNBQWMsQ0FDckIsVUFBa0IsRUFDbEIsSUFBWSxFQUNaLFdBQW1CLEVBQ25CLEtBQWdCLEVBQ2hCLE1BQWdCO1FBRWhCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdkUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7b0JBQ2hCLFNBQVM7Z0JBRVgsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDM0M7U0FDRjtJQUNILENBQUM7SUFFRCxTQUFTLFlBQVksQ0FDbkIsS0FBb0IsRUFDcEIsSUFBWSxFQUNaLFdBQW1CLEVBQ25CLEtBQWdCLEVBQ2hCLE1BQWdCO1FBRWhCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUVuRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdkMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztvQkFDaEIsT0FBTztnQkFFVCxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUMzQztTQUNGO1FBQ0QsT0FBTztJQUNULENBQUM7SUFFRCxPQUFPLEVBQUMsY0FBYyxFQUFFLFlBQVksRUFBQyxDQUFDO0FBQ3hDLENBQUM7QUFTRCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsVUFBc0I7SUFDNUQsT0FBTyxTQUFTLFVBQVUsQ0FDeEIsSUFBWSxFQUNaLEtBQTBCLEVBQzFCLGNBQXlCLEVBQ3pCLFdBQW1CO1FBRW5CLE1BQU0sRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUvQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzQyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxPQUFPLElBQUksRUFBRTtnQkFDWCwrQkFBK0I7Z0JBQy9CLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUV2RCxJQUFJLE1BQU0sS0FBSyxDQUFDLENBQUM7b0JBQ2YsTUFBTTtnQkFFUixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JFLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFO29CQUNsQyxJQUNFLFNBQVMsS0FBSyxNQUFNO3dCQUNwQixTQUFTLEtBQUssQ0FBQyxDQUFDO3dCQUNoQixLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQzt3QkFFcEIsU0FBUztvQkFFWCxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN0RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMzRCxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUN0QjthQUNGO1NBQ0Y7UUFDRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixNQUF1QixFQUN2QixJQUFZLEVBQ1osV0FBbUIsRUFDbkIsVUFBa0IsRUFDbEIsY0FBZ0MsRUFDaEMsWUFBNEIsRUFDNUIsTUFBZ0I7SUFFaEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlELGNBQWMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0QsSUFBSSxNQUFNLEVBQUU7UUFDVixLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU07WUFDdkIsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztLQUMxRDtJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBKYXZhU2NyaXB0IHJlaW1wbGVtZW50YXRpb24gb2YgVU1BUCAob3JpZ2luYWwgbGljZW5zZSBiZWxvdyksIGZyb21cbiAqIHRoZSBweXRob24gaW1wbGVtZW50YXRpb24gZm91bmQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2xtY2lubmVzL3VtYXAuXG4gKlxuICogQGF1dGhvciBhbmR5Y29lbmVuQGdvb2dsZS5jb20gKEFuZHkgQ29lbmVuKVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIEJTRCAzLUNsYXVzZSBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE3LCBMZWxhbmQgTWNJbm5lc1xuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBoZWFwIGZyb20gJy4vaGVhcCc7XG5pbXBvcnQgKiBhcyBtYXRyaXggZnJvbSAnLi9tYXRyaXgnO1xuaW1wb3J0ICogYXMgdHJlZSBmcm9tICcuL3RyZWUnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge1JhbmRvbUZuLCBWZWN0b3JzLCBEaXN0YW5jZUZuLCBWZWN0b3J9IGZyb20gJy4vdW1hcCc7XG5cbi8qKlxuICogQ3JlYXRlIGEgdmVyc2lvbiBvZiBuZWFyZXN0IG5laWdoYm9yIGRlc2NlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTk5EZXNjZW50KGRpc3RhbmNlRm46IERpc3RhbmNlRm4sIHJhbmRvbTogUmFuZG9tRm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIG5ORGVzY2VudChcbiAgICBkYXRhOiBWZWN0b3IsXG4gICAgbGVhZkFycmF5OiBWZWN0b3JzLFxuICAgIG5OZWlnaGJvcnM6IG51bWJlcixcbiAgICBuSXRlcnMgPSAxMCxcbiAgICBtYXhDYW5kaWRhdGVzID0gNTAsXG4gICAgZGVsdGEgPSAwLjAwMSxcbiAgICByaG8gPSAwLjUsXG4gICAgcnBUcmVlSW5pdCA9IHRydWVcbiAgKSB7XG4gICAgY29uc3QgblZlcnRpY2VzID0gZGF0YS5sZW5ndGg7XG4gICAgY29uc3QgY3VycmVudEdyYXBoID0gaGVhcC5tYWtlSGVhcChkYXRhLmxlbmd0aCwgbk5laWdoYm9ycyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGljZXMgPSBoZWFwLnJlamVjdGlvblNhbXBsZShuTmVpZ2hib3JzLCBkYXRhLmxlbmd0aCwgcmFuZG9tKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5kaWNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBjb25zdCBkID0gZGlzdGFuY2VGbihkYXRhW2ldLCBkYXRhW2luZGljZXNbal1dKTtcblxuICAgICAgICBoZWFwLmhlYXBQdXNoKGN1cnJlbnRHcmFwaCwgaSwgZCwgaW5kaWNlc1tqXSwgMSk7XG4gICAgICAgIGhlYXAuaGVhcFB1c2goY3VycmVudEdyYXBoLCBpbmRpY2VzW2pdLCBkLCBpLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJwVHJlZUluaXQpIHtcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbGVhZkFycmF5Lmxlbmd0aDsgbisrKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVhZkFycmF5W25dLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGxlYWZBcnJheVtuXVtpXSA8IDApXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IGxlYWZBcnJheVtuXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGxlYWZBcnJheVtuXVtqXSA8IDApXG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjb25zdCBkID0gZGlzdGFuY2VGbihkYXRhW2xlYWZBcnJheVtuXVtpXV0sIGRhdGFbbGVhZkFycmF5W25dW2pdXSk7XG4gICAgICAgICAgICBoZWFwLmhlYXBQdXNoKGN1cnJlbnRHcmFwaCwgbGVhZkFycmF5W25dW2ldLCBkLCBsZWFmQXJyYXlbbl1bal0sIDEpO1xuICAgICAgICAgICAgaGVhcC5oZWFwUHVzaChjdXJyZW50R3JhcGgsIGxlYWZBcnJheVtuXVtqXSwgZCwgbGVhZkFycmF5W25dW2ldLCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IG5JdGVyczsgbisrKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVOZWlnaGJvcnMgPSBoZWFwLmJ1aWxkQ2FuZGlkYXRlcyhcbiAgICAgICAgY3VycmVudEdyYXBoLFxuICAgICAgICBuVmVydGljZXMsXG4gICAgICAgIG5OZWlnaGJvcnMsXG4gICAgICAgIG1heENhbmRpZGF0ZXMsXG4gICAgICAgIHJhbmRvbVxuICAgICAgKTtcblxuICAgICAgbGV0IGMgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuVmVydGljZXM7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG1heENhbmRpZGF0ZXM7IGorKykge1xuICAgICAgICAgIGNvbnN0IHAgPSBNYXRoLmZsb29yKGNhbmRpZGF0ZU5laWdoYm9yc1swXVtpXVtqXSk7XG4gICAgICAgICAgaWYgKHAgPCAwIHx8IHV0aWxzLnRhdVJhbmQocmFuZG9tKSA8IHJobylcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYXhDYW5kaWRhdGVzOyBrKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHEgPSBNYXRoLmZsb29yKGNhbmRpZGF0ZU5laWdoYm9yc1swXVtpXVtrXSk7XG4gICAgICAgICAgICBjb25zdCBjaiA9IGNhbmRpZGF0ZU5laWdoYm9yc1syXVtpXVtqXTtcbiAgICAgICAgICAgIGNvbnN0IGNrID0gY2FuZGlkYXRlTmVpZ2hib3JzWzJdW2ldW2tdO1xuICAgICAgICAgICAgaWYgKHEgPCAwIHx8ICghY2ogJiYgIWNrKSlcbiAgICAgICAgICAgICAgY29udGludWU7XG5cblxuICAgICAgICAgICAgY29uc3QgZCA9IGRpc3RhbmNlRm4oZGF0YVtwXSwgZGF0YVtxXSk7XG4gICAgICAgICAgICBjICs9IGhlYXAuaGVhcFB1c2goY3VycmVudEdyYXBoLCBwLCBkLCBxLCAxKTtcbiAgICAgICAgICAgIGMgKz0gaGVhcC5oZWFwUHVzaChjdXJyZW50R3JhcGgsIHEsIGQsIHAsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGMgPD0gZGVsdGEgKiBuTmVpZ2hib3JzICogZGF0YS5sZW5ndGgpXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBzb3J0ZWQgPSBoZWFwLmRlaGVhcFNvcnQoY3VycmVudEdyYXBoKTtcbiAgICByZXR1cm4gc29ydGVkO1xuICB9O1xufVxuXG5leHBvcnQgdHlwZSBJbml0RnJvbVJhbmRvbUZuID0gKFxuICBuTmVpZ2hib3JzOiBudW1iZXIsXG4gIGRhdGE6IFZlY3RvcixcbiAgcXVlcnlQb2ludHM6IFZlY3RvcixcbiAgX2hlYXA6IGhlYXAuSGVhcCxcbiAgcmFuZG9tOiBSYW5kb21GblxuKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBJbml0RnJvbVRyZWVGbiA9IChcbiAgX3RyZWU6IHRyZWUuRmxhdFRyZWUsXG4gIGRhdGE6IFZlY3RvcixcbiAgcXVlcnlQb2ludHM6IFZlY3RvcixcbiAgX2hlYXA6IGhlYXAuSGVhcCxcbiAgcmFuZG9tOiBSYW5kb21GblxuKSA9PiB2b2lkO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUluaXRpYWxpemF0aW9ucyhkaXN0YW5jZUZuOiBEaXN0YW5jZUZuKSB7XG4gIGZ1bmN0aW9uIGluaXRGcm9tUmFuZG9tKFxuICAgIG5OZWlnaGJvcnM6IG51bWJlcixcbiAgICBkYXRhOiBWZWN0b3IsXG4gICAgcXVlcnlQb2ludHM6IFZlY3RvcixcbiAgICBfaGVhcDogaGVhcC5IZWFwLFxuICAgIHJhbmRvbTogUmFuZG9tRm5cbiAgKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWVyeVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW5kaWNlcyA9IHV0aWxzLnJlamVjdGlvblNhbXBsZShuTmVpZ2hib3JzLCBkYXRhLmxlbmd0aCwgcmFuZG9tKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5kaWNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoaW5kaWNlc1tqXSA8IDApXG4gICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZCA9IGRpc3RhbmNlRm4oZGF0YVtpbmRpY2VzW2pdXSwgcXVlcnlQb2ludHNbaV0pO1xuICAgICAgICBoZWFwLmhlYXBQdXNoKF9oZWFwLCBpLCBkLCBpbmRpY2VzW2pdLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0RnJvbVRyZWUoXG4gICAgX3RyZWU6IHRyZWUuRmxhdFRyZWUsXG4gICAgZGF0YTogVmVjdG9yLFxuICAgIHF1ZXJ5UG9pbnRzOiBWZWN0b3IsXG4gICAgX2hlYXA6IGhlYXAuSGVhcCxcbiAgICByYW5kb206IFJhbmRvbUZuXG4gICkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVlcnlQb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGljZXMgPSB0cmVlLnNlYXJjaEZsYXRUcmVlKHF1ZXJ5UG9pbnRzW2ldLCBfdHJlZSwgcmFuZG9tKTtcblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbmRpY2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChpbmRpY2VzW2pdIDwgMClcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZCA9IGRpc3RhbmNlRm4oZGF0YVtpbmRpY2VzW2pdXSwgcXVlcnlQb2ludHNbaV0pO1xuICAgICAgICBoZWFwLmhlYXBQdXNoKF9oZWFwLCBpLCBkLCBpbmRpY2VzW2pdLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIHtpbml0RnJvbVJhbmRvbSwgaW5pdEZyb21UcmVlfTtcbn1cblxuZXhwb3J0IHR5cGUgU2VhcmNoRm4gPSAoXG4gIGRhdGE6IFZlY3RvcixcbiAgZ3JhcGg6IG1hdHJpeC5TcGFyc2VNYXRyaXgsXG4gIGluaXRpYWxpemF0aW9uOiBoZWFwLkhlYXAsXG4gIHF1ZXJ5UG9pbnRzOiBWZWN0b3JcbikgPT4gaGVhcC5IZWFwO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUluaXRpYWxpemVkTk5TZWFyY2goZGlzdGFuY2VGbjogRGlzdGFuY2VGbikge1xuICByZXR1cm4gZnVuY3Rpb24gbm5TZWFyY2hGbihcbiAgICBkYXRhOiBWZWN0b3IsXG4gICAgZ3JhcGg6IG1hdHJpeC5TcGFyc2VNYXRyaXgsXG4gICAgaW5pdGlhbGl6YXRpb246IGhlYXAuSGVhcCxcbiAgICBxdWVyeVBvaW50czogVmVjdG9yXG4gICkge1xuICAgIGNvbnN0IHtpbmRpY2VzLCBpbmRwdHJ9ID0gbWF0cml4LmdldENTUihncmFwaCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXJ5UG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB0cmllZCA9IG5ldyBTZXQoaW5pdGlhbGl6YXRpb25bMF1baV0pO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgLy8gRmluZCBzbWFsbGVzdCBmbGFnZ2VkIHZlcnRleFxuICAgICAgICBjb25zdCB2ZXJ0ZXggPSBoZWFwLnNtYWxsZXN0RmxhZ2dlZChpbml0aWFsaXphdGlvbiwgaSk7XG5cbiAgICAgICAgaWYgKHZlcnRleCA9PT0gLTEpXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IGluZGljZXMuc2xpY2UoaW5kcHRyW3ZlcnRleF0sIGluZHB0clt2ZXJ0ZXggKyAxXSk7XG4gICAgICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjYW5kaWRhdGUgPT09IHZlcnRleCB8fFxuICAgICAgICAgICAgY2FuZGlkYXRlID09PSAtMSB8fFxuICAgICAgICAgICAgdHJpZWQuaGFzKGNhbmRpZGF0ZSlcbiAgICAgICAgICApXG4gICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGQgPSBkaXN0YW5jZUZuKGRhdGFbY2FuZGlkYXRlXSwgcXVlcnlQb2ludHNbaV0pO1xuICAgICAgICAgIGhlYXAudW5jaGVja2VkSGVhcFB1c2goaW5pdGlhbGl6YXRpb24sIGksIGQsIGNhbmRpZGF0ZSwgMSk7XG4gICAgICAgICAgdHJpZWQuYWRkKGNhbmRpZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluaXRpYWxpemF0aW9uO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZVNlYXJjaChcbiAgZm9yZXN0OiB0cmVlLkZsYXRUcmVlW10sXG4gIGRhdGE6IFZlY3RvcixcbiAgcXVlcnlQb2ludHM6IFZlY3RvcixcbiAgbk5laWdoYm9yczogbnVtYmVyLFxuICBpbml0RnJvbVJhbmRvbTogSW5pdEZyb21SYW5kb21GbixcbiAgaW5pdEZyb21UcmVlOiBJbml0RnJvbVRyZWVGbixcbiAgcmFuZG9tOiBSYW5kb21GblxuKSB7XG4gIGNvbnN0IHJlc3VsdHMgPSBoZWFwLm1ha2VIZWFwKHF1ZXJ5UG9pbnRzLmxlbmd0aCwgbk5laWdoYm9ycyk7XG4gIGluaXRGcm9tUmFuZG9tKG5OZWlnaGJvcnMsIGRhdGEsIHF1ZXJ5UG9pbnRzLCByZXN1bHRzLCByYW5kb20pO1xuICBpZiAoZm9yZXN0KSB7XG4gICAgZm9yIChjb25zdCB0cmVlIG9mIGZvcmVzdClcbiAgICAgIGluaXRGcm9tVHJlZSh0cmVlLCBkYXRhLCBxdWVyeVBvaW50cywgcmVzdWx0cywgcmFuZG9tKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn1cbiJdfQ==","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 { dmLinearIndex } from '../distance-matrix';\nexport class TSNE {\n perplexity;\n dim;\n epsilon;\n iter = 0;\n N;\n P;\n Y;\n gains;\n ystep;\n random = Math.random;\n assert(condition, message) {\n if (!condition)\n throw message || 'Assertion failed';\n }\n // syntax sugar\n getopt(opt, field, defaultval) {\n if (opt.hasOwnProperty(field))\n return opt[field];\n else\n return defaultval;\n }\n // return 0 mean unit standard deviation random number\n returnV = false;\n vValue = 0.0;\n gaussRandom() {\n if (this.returnV) {\n this.returnV = false;\n return this.vValue;\n }\n const u = 2 * this.random() - 1;\n const v = 2 * this.random() - 1;\n const r = u * u + v * v;\n if (r === 0 || r > 1)\n return this.gaussRandom();\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) {\n return mu + this.gaussRandom() * std;\n }\n // utilitity that creates contiguous vector of zeros of size n\n zeros(n) {\n if (typeof (n) === 'undefined' || isNaN(n))\n return new Float32Array();\n if (typeof ArrayBuffer === 'undefined') {\n // lacking browser support\n const arr = new Float32Array(n);\n for (let i = 0; i < n; i++)\n arr[i] = 0;\n return arr;\n }\n else {\n return new Float32Array(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 = (new Array(n)).fill(null).map(() => new Float32Array(d));\n if (uses) {\n for (let i = 0; i < n; i++)\n x[i] = new Float32Array(d).fill(s);\n }\n else {\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < d; j++)\n x[i][j] = this.randn(0.0, 1e-4);\n }\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 getIterSize(rowSize) {\n if (rowSize <= 2000)\n return 100;\n else if (rowSize <= 3000)\n return 90;\n else if (rowSize <= 5000)\n return 80;\n else\n return 70;\n }\n // compute (p_{i|j} + p_{j|i})/(2n)\n d2p(D, perplexity, tol, rowSize) {\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 indexer = dmLinearIndex(rowSize);\n const distances = new Float32Array(rowSize * rowSize);\n for (let i = 0; i < rowSize; i++) {\n for (let j = i + 1; j < rowSize; j++)\n distances[i * rowSize + j] = distances[j * rowSize + i] = D[indexer(i, j)];\n }\n const n = rowSize;\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 = Math.floor(this.getIterSize(rowSize) / 5);\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 const pj = i === j ? 0 : Math.exp(-distances[i * n + j] * beta);\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 else\n pj = prow[j] / psum;\n prow[j] = pj;\n if (pj > 1e-7)\n nHere -= pj * Math.log(pj);\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 else\n beta = (beta + betamax) / 2;\n }\n else {\n // converse case. make distrubtion less peaky\n betamax = beta;\n if (betamin === -Infinity)\n beta = beta / 2;\n else\n beta = (beta + betamin) / 2;\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 if (num >= maxtries)\n done = true;\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 } // 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 return pOut;\n }\n // helper function\n sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }\n constructor(opt) {\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 this.random = this.getopt(opt, 'random', Math.random); // random number generator\n }\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, D); // 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, rowSize) {\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 // dists.forEach((d) => console.log(d));\n console.time('distances to matrix');\n this.P = this.d2p(D, this.perplexity, 1e-4, rowSize);\n console.timeEnd('distances to matrix');\n this.N = rowSize;\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; // 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 //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 quArr;\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 this.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 const dsum = new Array(dim).reduce((prev, _, d) => prev + Math.pow(Y[i][d] - Y[j][d], 2), 0);\n const qu = 1.0 / (1.0 + dsum); // Student t-distribution\n this.quArr[i * N + j] = qu;\n this.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 let cost = 0.0;\n const grad = new Array(N).fill(null).map(() => (new Float32Array(dim)).fill(0.0));\n for (let i = 0; i < N; i++) {\n // const gsum = new Float32Array(dim).fill(0.0); // init grad for point i\n for (let j = i + 1; j < N; j++) {\n const Q = Math.max(this.quArr[i * N + j] / qsum, 1e-100);\n cost += (-P[i * N + j] * Math.log(Q)) * 2; // accumulate cost (the non-constant portion at least...)\n const premult = 4 * (pmul * P[i * N + j] - Q) * this.quArr[i * N + j];\n //console.log(premult, Q, i, j);\n for (let d = 0; d < dim; d++) {\n grad[i][d] += premult * (Y[i][d] - Y[j][d]);\n grad[j][d] += premult * (Y[j][d] - Y[i][d]);\n }\n }\n //grad[i] = gsum;\n }\n return { cost, grad };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidC1zbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0LXNuZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHakQsTUFBTSxPQUFPLElBQUk7SUFDUCxVQUFVLENBQVM7SUFDbkIsR0FBRyxDQUFTO0lBQ1osT0FBTyxDQUFTO0lBQ2hCLElBQUksR0FBRyxDQUFDLENBQUM7SUFDVCxDQUFDLENBQVU7SUFDWCxDQUFDLENBQWdCO0lBQ2pCLENBQUMsQ0FBUztJQUNWLEtBQUssQ0FBUztJQUNkLEtBQUssQ0FBUztJQUNkLE1BQU0sR0FBaUIsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNuQyxNQUFNLENBQUMsU0FBYyxFQUFFLE9BQVk7UUFDekMsSUFBSSxDQUFDLFNBQVM7WUFBRSxNQUFNLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQztJQUN0RCxDQUFDO0lBRUQsZUFBZTtJQUNQLE1BQU0sQ0FBQyxHQUF1QixFQUFFLEtBQWEsRUFBRSxVQUFlO1FBQ3BFLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFDM0IsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7O1lBRWxCLE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFQyxzREFBc0Q7SUFDOUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDO0lBQ3JCLFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQ3BCO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFD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QUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLHlEQUF5RDtnQkFDckcsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDdEUsZ0NBQWdDO2dCQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUM1QixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM1QyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3QzthQUNGO1lBQ0QsaUJBQWlCO1NBQ2xCO1FBRUQsT0FBTyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUN0QixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2RtTGluZWFySW5kZXh9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeCc7XG5cblxuZXhwb3J0IGNsYXNzIFRTTkUge1xuICBwcml2YXRlIHBlcnBsZXhpdHk6IG51bWJlcjtcbiAgcHJpdmF0ZSBkaW06IG51bWJlcjtcbiAgcHJpdmF0ZSBlcHNpbG9uOiBudW1iZXI7XG4gIHByaXZhdGUgaXRlciA9IDA7XG4gIHByaXZhdGUgTiE6IG51bWJlcjtcbiAgcHJpdmF0ZSBQITogRmxvYXQzMkFycmF5O1xuICBwcml2YXRlIFkhOiBhbnlbXTtcbiAgcHJpdmF0ZSBnYWlucyE6IGFueVtdO1xuICBwcml2YXRlIHlzdGVwITogYW55W107XG4gIHByaXZhdGUgcmFuZG9tOiAoKSA9PiBudW1iZXIgPSBNYXRoLnJhbmRvbTtcbiAgcHJpdmF0ZSBhc3NlcnQoY29uZGl0aW9uOiBhbnksIG1lc3NhZ2U6IGFueSkge1xuICAgIGlmICghY29uZGl0aW9uKSB0aHJvdyBtZXNzYWdlIHx8ICdBc3NlcnRpb24gZmFpbGVkJztcbiAgfVxuXG4gIC8vIHN5bnRheCBzdWdhclxuICBwcml2YXRlIGdldG9wdChvcHQ6IHtbXzogc3RyaW5nXTogYW55fSwgZmllbGQ6IHN0cmluZywgZGVmYXVsdHZhbDogYW55KSB7XG4gICAgaWYgKG9wdC5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpXG4gICAgICByZXR1cm4gb3B0W2ZpZWxkXTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gZGVmYXVsdHZhbDtcbiAgfVxuXG4gICAgLy8gcmV0dXJuIDAgbWVhbiB1bml0IHN0YW5kYXJkIGRldmlhdGlvbiByYW5kb20gbnVtYmVyXG4gICAgcHJpdmF0ZSByZXR1cm5WID0gZmFsc2U7XG4gICAgcHJpdmF0ZSB2VmFsdWUgPSAwLjA7XG4gICAgZ2F1c3NSYW5kb20oKTogbnVtYmVyIHtcbiAgICAgIGlmICh0aGlzLnJldHVyblYpIHtcbiAgICAgICAgdGhpcy5yZXR1cm5WID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLnZWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHUgPSAyICogdGhpcy5yYW5kb20oKSAtIDE7XG4gICAgICBjb25zdCB2ID0gMiAqIHRoaXMucmFuZG9tKCkgLSAxO1xuICAgICAgY29uc3QgciA9IHUgKiB1ICsgdiAqIHY7XG4gICAgICBpZiAociA9PT0gMCB8fCByID4gMSkgcmV0dXJuIHRoaXMuZ2F1c3NSYW5kb20oKTtcbiAgICAgIGNvbnN0IGMgPSBNYXRoLnNxcnQoLTIgKiBNYXRoLmxvZyhyKSAvIHIpO1xuICAgICAgdGhpcy52VmFsdWUgPSB2ICogYzsgLy8gY2FjaGUgdGhpcyBmb3IgbmV4dCBmdW5jdGlvbiBjYWxsIGZvciBlZmZpY2llbmN5XG4gICAgICB0aGlzLnJldHVyblYgPSB0cnVlO1xuICAgICAgcmV0dXJuIHUgKiBjO1xuICAgIH1cblxuICAgIC8vIHJldHVybiByYW5kb20gbm9ybWFsIG51bWJlclxuICAgIHByaXZhdGUgcmFuZG4obXU6IG51bWJlciwgc3RkOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBtdSArIHRoaXMuZ2F1c3NSYW5kb20oKSAqIHN0ZDtcbiAgICB9XG5cbiAgICAvLyB1dGlsaXRpdHkgdGhhdCBjcmVhdGVzIGNvbnRpZ3VvdXMgdmVjdG9yIG9mIHplcm9zIG9mIHNpemUgblxuICAgIHByaXZhdGUgemVyb3MobjogbnVtYmVyKSB7XG4gICAgICBpZiAodHlwZW9mIChuKSA9PT0gJ3VuZGVmaW5lZCcgfHwgaXNOYU4obikpIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KCk7XG4gICAgICBpZiAodHlwZW9mIEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBsYWNraW5nIGJyb3dzZXIgc3VwcG9ydFxuICAgICAgICBjb25zdCBhcnIgPSBuZXcgRmxvYXQzMkFycmF5KG4pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgYXJyW2ldID0gMDtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KG4pOyAvLyB0eXBlZCBhcnJheXMgYXJlIGZhc3RlclxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHV0aWxpdHkgdGhhdCByZXR1cm5zIDJkIGFycmF5IGZpbGxlZCB3aXRoIHJhbmRvbSBudW1iZXJzXG4gICAgLy8gb3Igd2l0aCB2YWx1ZSBzLCBpZiBwcm92aWRlZFxuICAgIHByaXZhdGUgcmFuZG4yZChuOiBudW1iZXIsIGQ6IG51bWJlciwgcz86IG51bWJlcikge1xuICAgICAgY29uc3QgdXNlcyA9IHR5cGVvZiBzICE9PSAndW5kZWZpbmVkJztcbiAgICAgIGNvbnN0IHggPSAobmV3IEFycmF5KG4pKS5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgRmxvYXQzMkFycmF5KGQpKTtcbiAgICAgIGlmICh1c2VzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKVxuICAgICAgICAgIHhbaV0gPSBuZXcgRmxvYXQzMkFycmF5KGQpLmZpbGwocyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZDsgaisrKVxuICAgICAgICAgICAgeFtpXVtqXSA9IHRoaXMucmFuZG4oMC4wLCAxZS00KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHg7XG4gICAgfVxuXG4gICAgLy8gY29tcHV0ZSBMMiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWN0b3JzXG4gICAgcHJpdmF0ZSBsMih4MTogbnVtYmVyW10sIHgyOiBudW1iZXJbXSkge1xuICAgICAgY29uc3QgRCA9IHgxLmxlbmd0aDtcbiAgICAgIGxldCBkID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHgxaSA9IHgxW2ldO1xuICAgICAgICBjb25zdCB4MmkgPSB4MltpXTtcbiAgICAgICAgZCArPSAoeDFpIC0geDJpKSAqICh4MWkgLSB4MmkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGQ7XG4gICAgfVxuXG4gICAgLy8gY29tcHV0ZSBwYWlyd2lzZSBkaXN0YW5jZSBpbiBhbGwgdmVjdG9ycyBpbiBYXG4gICAgcHJpdmF0ZSB4dG9kKFg6IEFycmF5PCBBcnJheTxudW1iZXI+ID4pIHtcbiAgICAgIGNvbnN0IE4gPSBYLmxlbmd0aDtcbiAgICAgIGNvbnN0IGRpc3QgPSB0aGlzLnplcm9zKE4gKiBOKTsgLy8gYWxsb2NhdGUgY29udGlndW91cyBhcnJheVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgTjsgaisrKSB7XG4gICAgICAgICAgY29uc3QgZCA9IHRoaXMubDIoWFtpXSwgWFtqXSk7XG4gICAgICAgICAgZGlzdFtpICogTiArIGpdID0gZDtcbiAgICAgICAgICBkaXN0W2ogKiBOICsgaV0gPSBkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZGlzdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SXRlclNpemUocm93U2l6ZTogbnVtYmVyKSB7XG4gICAgICBpZiAocm93U2l6ZSA8PSAyMDAwKVxuICAgICAgICByZXR1cm4gMTAwO1xuICAgICAgZWxzZSBpZiAocm93U2l6ZSA8PSAzMDAwKVxuICAgICAgICByZXR1cm4gOTA7XG4gICAgICBlbHNlIGlmIChyb3dTaXplIDw9IDUwMDApXG4gICAgICAgIHJldHVybiA4MDtcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIDcwO1xuICAgIH1cblxuICAgIC8vIGNvbXB1dGUgKHBfe2l8an0gKyBwX3tqfGl9KS8oMm4pXG4gICAgcHJpdmF0ZSBkMnAoRDogRmxvYXQzMkFycmF5LCBwZXJwbGV4aXR5OiBudW1iZXIsIHRvbDogbnVtYmVyLCByb3dTaXplOiBudW1iZXIpIHtcbiAgICAgIC8vIGNvbnN0IG5mID0gTWF0aC5zcXJ0KEQubGVuZ3RoKTsgLy8gdGhpcyBiZXR0ZXIgYmUgYW4gaW50ZWdlclxuICAgICAgLy8gY29uc3QgbiA9IE1hdGguZmxvb3IobmYpO1xuICAgICAgLy8gdGhpcy5hc3NlcnQobiA9PT0gbmYsICdEIHNob3VsZCBoYXZlIHNxdWFyZSBudW1iZXIgb2YgZWxlbWVudHMuJyk7XG4gICAgICBjb25zdCBpbmRleGVyID0gZG1MaW5lYXJJbmRleChyb3dTaXplKTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlcyA9IG5ldyBGbG9hdDMyQXJyYXkocm93U2l6ZSAqIHJvd1NpemUpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dTaXplOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgcm93U2l6ZTsgaisrKVxuICAgICAgICAgIGRpc3RhbmNlc1tpICogcm93U2l6ZSArIGpdID0gZGlzdGFuY2VzW2ogKiByb3dTaXplICsgaV0gPSBEW2luZGV4ZXIoaSwgaildO1xuICAgICAgfVxuICAgICAgY29uc3QgbiA9IHJvd1NpemU7XG4gICAgICBjb25zdCBoVGFyZ2V0ID0gTWF0aC5sb2cocGVycGxleGl0eSk7IC8vIHRhcmdldCBlbnRyb3B5IG9mIGRpc3RyaWJ1dGlvblxuICAgICAgY29uc3QgUCA9IHRoaXMuemVyb3MobiAqIG4pOyAvLyB0ZW1wb3JhcnkgcHJvYmFiaWxpdHkgbWF0cml4XG4gICAgICBjb25zdCBwcm93ID0gdGhpcy56ZXJvcyhuKTsgLy8gYSB0ZW1wb3Jhcnkgc3RvcmFnZSBjb21wYXJ0bWVudFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgbGV0IGJldGFtaW4gPSAtSW5maW5pdHk7XG4gICAgICAgIGxldCBiZXRhbWF4ID0gSW5maW5pdHk7XG4gICAgICAgIGxldCBiZXRhID0gMTsgLy8gaW5pdGlhbCB2YWx1ZSBvZiBwcmVjaXNpb25cbiAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgbWF4dHJpZXMgPSBNYXRoLmZsb29yKHRoaXMuZ2V0SXRlclNpemUocm93U2l6ZSkgLyA1KTtcblxuICAgICAgICAvLyBwZXJmb3JtIGJpbmFyeSBzZWFyY2ggdG8gZmluZCBhIHN1aXRhYmxlIHByZWNpc2lvbiBiZXRhXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGVudHJvcHkgb2YgdGhlIGRpc3RyaWJ1dGlvbiBpcyBhcHByb3ByaWF0ZVxuICAgICAgICBsZXQgbnVtID0gMDtcbiAgICAgICAgd2hpbGUgKCFkb25lKSB7XG4gICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgIC8vIGNvbXB1dGUgZW50cm9weSBhbmQga2VybmVsIHJvdyB3aXRoIGJldGEgcHJlY2lzaW9uXG4gICAgICAgICAgbGV0IHBzdW0gPSAwLjA7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBqID0gaSA9PT0gaiA/IDAgOiBNYXRoLmV4cCgtIGRpc3RhbmNlc1tpICogbiArIGpdICogYmV0YSk7XG4gICAgICAgICAgICBwcm93W2pdID0gcGo7XG4gICAgICAgICAgICBwc3VtICs9IHBqO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBub3JtYWxpemUgcCBhbmQgY29tcHV0ZSBlbnRyb3B5XG4gICAgICAgICAgbGV0IG5IZXJlID0gMC4wO1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbjsgaisrKSB7XG4gICAgICAgICAgICBsZXQgcGo7XG4gICAgICAgICAgICBpZiAocHN1bSA9PT0gMClcbiAgICAgICAgICAgICAgcGogPSAwO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBwaiA9IHByb3dbal0gLyBwc3VtO1xuXG4gICAgICAgICAgICBwcm93W2pdID0gcGo7XG4gICAgICAgICAgICBpZiAocGogPiAxZS03KSBuSGVyZSAtPSBwaiAqIE1hdGgubG9nKHBqKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBhZGp1c3QgYmV0YSBiYXNlZCBvbiByZXN1bHRcbiAgICAgICAgICBpZiAobkhlcmUgPiBoVGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBlbnRyb3B5IHdhcyB0b28gaGlnaCAoZGlzdHJpYnV0aW9uIHRvbyBkaWZmdXNlKVxuICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUgcHJlY2lzaW9uIGZvciBtb3JlIHBlYWt5IGRpc3RyaWJ1dGlvblxuICAgICAgICAgICAgYmV0YW1pbiA9IGJldGE7IC8vIG1vdmUgdXAgdGhlIGJvdW5kc1xuICAgICAgICAgICAgaWYgKGJldGFtYXggPT09IEluZmluaXR5KSBiZXRhID0gYmV0YSAqIDI7IGVsc2UgYmV0YSA9IChiZXRhICsgYmV0YW1heCkgLyAyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjb252ZXJzZSBjYXNlLiBtYWtlIGRpc3RydWJ0aW9uIGxlc3MgcGVha3lcbiAgICAgICAgICAgIGJldGFtYXggPSBiZXRhO1xuICAgICAgICAgICAgaWYgKGJldGFtaW4gPT09IC1JbmZpbml0eSkgYmV0YSA9IGJldGEgLyAyOyBlbHNlIGJldGEgPSAoYmV0YSArIGJldGFtaW4pIC8gMjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzdG9wcGluZyBjb25kaXRpb25zOiB0b28gbWFueSB0cmllcyBvciBnb3QgYSBnb29kIHByZWNpc2lvblxuICAgICAgICAgIG51bSsrO1xuICAgICAgICAgIGlmIChNYXRoLmFicyhuSGVyZSAtIGhUYXJnZXQpIDwgdG9sKSBkb25lID0gdHJ1ZTtcbiAgICAgICAgICBpZiAobnVtID49IG1heHRyaWVzKSBkb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdkYXRhIHBvaW50ICcgKyBpICsgJyBnZXRzIHByZWNpc2lvbiAnICsgYmV0YSArICcgYWZ0ZXIgJyArIG51bSArICcgYmluYXJ5IHNlYXJjaCBzdGVwcy4nKTtcbiAgICAgICAgLy8gY29weSBvdmVyIHRoZSBmaW5hbCBwcm93IHRvIFAgYXQgcm93IGlcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuOyBqKyspIFBbaSAqIG4gKyBqXSA9IHByb3dbal07XG4gICAgICB9IC8vIGVuZCBsb29wIG92ZXIgZXhhbXBsZXMgaVxuXG4gICAgICAvLyBzeW1tZXRyaXplIFAgYW5kIG5vcm1hbGl6ZSBpdCB0byBzdW0gdG8gMSBvdmVyIGFsbCBpalxuICAgICAgY29uc3QgcE91dCA9IHRoaXMuemVyb3MobiAqIG4pO1xuICAgICAgY29uc3QgTjIgPSBuICogMjtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbjsgaisrKVxuICAgICAgICAgIHBPdXRbaSAqIG4gKyBqXSA9IE1hdGgubWF4KChQW2kgKiBuICsgal0gKyBQW2ogKiBuICsgaV0pIC8gTjIsIDFlLTEwMCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwT3V0O1xuICAgIH1cblxuICAgIC8vIGhlbHBlciBmdW5jdGlvblxuICAgIHByaXZhdGUgc2lnbih4OiBudW1iZXIpIHsgcmV0dXJuIHggPiAwID8gMSA6IHggPCAwID8gLTEgOiAwOyB9XG5cbiAgICBjb25zdHJ1Y3RvcihvcHQ6IHtbXzogc3RyaW5nXTogYW55fSkge1xuICAgICAgb3B0ID0gb3B0IHx8IHt9O1xuICAgICAgdGhpcy5wZXJwbGV4aXR5ID0gdGhpcy5nZXRvcHQob3B0LCAncGVycGxleGl0eScsIDMwKTsgLy8gZWZmZWN0aXZlIG51bWJlciBvZiBuZWFyZXN0IG5laWdoYm9yc1xuICAgICAgdGhpcy5kaW0gPSB0aGlzLmdldG9wdChvcHQsICdkaW0nLCAyKTsgLy8gYnkgZGVmYXVsdCAyLUQgdFNORVxuICAgICAgdGhpcy5lcHNpbG9uID0gdGhpcy5nZXRvcHQob3B0LCAnZXBzaWxvbicsIDEwKTsgLy8gbGVhcm5pbmcgcmF0ZVxuICAgICAgdGhpcy5yYW5kb20gPSB0aGlzLmdldG9wdChvcHQsICdyYW5kb20nLCBNYXRoLnJhbmRvbSk7IC8vIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yXG4gICAgfVxuXG4gICAgLy8gdGhpcyBmdW5jdGlvbiB0YWtlcyBhIHNldCBvZiBoaWdoLWRpbWVuc2lvbmFsIHBvaW50c1xuICAgIC8vIGFuZCBjcmVhdGVzIG1hdHJpeCBQIGZyb20gdGhlbSB1c2luZyBnYXVzc2lhbiBrZXJuZWxcbiAgICBwdWJsaWMgaW5pdERhdGFSYXcoWDogQXJyYXk8QXJyYXk8YW55Pj4pIHtcbiAgICAgIGNvbnN0IE4gPSBYLmxlbmd0aDtcbiAgICAgIGNvbnN0IEQgPSBYWzBdLmxlbmd0aDtcbiAgICAgIHRoaXMuYXNzZXJ0KE4gPiAwLCAnIFggaXMgZW1wdHk/IFlvdSBtdXN0IGhhdmUgc29tZSBkYXRhIScpO1xuICAgICAgdGhpcy5hc3NlcnQoRCA+IDAsICcgWFswXSBpcyBlbXB0eT8gV2hlcmUgaXMgdGhlIGRhdGE/Jyk7XG4gICAgICBjb25zdCBkaXN0cyA9IHRoaXMueHRvZChYKTsgLy8gY29udmVydCBYIHRvIGRpc3RhbmNlcyB1c2luZyBnYXVzc2lhbiBrZXJuZWxcbiAgICAgIHRoaXMuUCA9IHRoaXMuZDJwKGRpc3RzLCB0aGlzLnBlcnBsZXhpdHksIDFlLTQsIEQpOyAvLyBhdHRhY2ggdG8gb2JqZWN0XG4gICAgICB0aGlzLk4gPSBOOyAvLyBiYWNrIHVwIHRoZSBzaXplIG9mIHRoZSBkYXRhc2V0XG4gICAgICB0aGlzLmluaXRTb2x1dGlvbigpOyAvLyByZWZyZXNoIHRoaXNcbiAgICB9XG5cbiAgICAvLyB0aGlzIGZ1bmN0aW9uIHRha2VzIGEgZ2l2ZW4gZGlzdGFuY2UgbWF0cml4IGFuZCBjcmVhdGVzXG4gICAgLy8gbWF0cml4IFAgZnJvbSB0aGVtLlxuICAgIC8vIEQgaXMgYXNzdW1lZCB0byBiZSBwcm92aWRlZCBhcyBhIGxpc3Qgb2YgbGlzdHMsIGFuZCBzaG91bGQgYmUgc3ltbWV0cmljXG4gICAgcHVibGljIGluaXREYXRhRGlzdChEOiBGbG9hdDMyQXJyYXksIHJvd1NpemU6IG51bWJlcikge1xuICAgICAgY29uc3QgTiA9IEQubGVuZ3RoO1xuICAgICAgdGhpcy5hc3NlcnQoTiA+IDAsICcgWCBpcyBlbXB0eT8gWW91IG11c3QgaGF2ZSBzb21lIGRhdGEhJyk7XG4gICAgICAvLyBjb252ZXJ0IEQgdG8gYSAoZmFzdCkgdHlwZWQgYXJyYXkgdmVyc2lvblxuICAgICAgLy8gZGlzdHMuZm9yRWFjaCgoZCkgPT4gY29uc29sZS5sb2coZCkpO1xuICAgICAgY29uc29sZS50aW1lKCdkaXN0YW5jZXMgdG8gbWF0cml4Jyk7XG4gICAgICB0aGlzLlAgPSB0aGlzLmQycChELCB0aGlzLnBlcnBsZXhpdHksIDFlLTQsIHJvd1NpemUpO1xuICAgICAgY29uc29sZS50aW1lRW5kKCdkaXN0YW5jZXMgdG8gbWF0cml4Jyk7XG4gICAgICB0aGlzLk4gPSByb3dTaXplO1xuICAgICAgdGhpcy5pbml0U29sdXRpb24oKTsgLy8gcmVmcmVzaCB0aGlzXG4gICAgfVxuXG4gICAgLy8gKHJlKWluaXRpYWxpemVzIHRoZSBzb2x1dGlvbiB0byByYW5kb21cbiAgICBwdWJsaWMgaW5pdFNvbHV0aW9uKCkge1xuICAgICAgLy8gZ2VuZXJhdGUgcmFuZG9tIHNvbHV0aW9uIHRvIHQtU05FXG4gICAgICB0aGlzLlkgPSB0aGlzLnJhbmRuMmQodGhpcy5OLCB0aGlzLmRpbSk7IC8vIHRoZSBzb2x1dGlvblxuICAgICAgdGhpcy5nYWlucyA9IHRoaXMucmFuZG4yZCh0aGlzLk4sIHRoaXMuZGltLCAxLjApOyAvLyBzdGVwIGdhaW5zIHRvIGFjY2VsZXJhdGUgcHJvZ3Jlc3MgaW4gdW5jaGFuZ2luZyBkaXJlY3Rpb25zXG4gICAgICB0aGlzLnlzdGVwID0gdGhpcy5yYW5kbjJkKHRoaXMuTiwgdGhpcy5kaW0sIDAuMCk7IC8vIG1vbWVudHVtIGFjY3VtdWxhdG9yXG4gICAgICB0aGlzLml0ZXIgPSAwO1xuICAgIH1cblxuICAgIC8vIHJldHVybiBwb2ludGVyIHRvIGN1cnJlbnQgc29sdXRpb25cbiAgICBwdWJsaWMgZ2V0U29sdXRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5ZO1xuICAgIH1cblxuICAgIC8vIHBlcmZvcm0gYSBzaW5nbGUgc3RlcCBvZiBvcHRpbWl6YXRpb24gdG8gaW1wcm92ZSB0aGUgZW1iZWRkaW5nXG4gICAgcHVibGljIHN0ZXAoKSB7XG4gICAgICB0aGlzLml0ZXIgKz0gMTtcbiAgICAgIGNvbnN0IE4gPSB0aGlzLk47XG4gICAgICBjb25zdCBjZyA9IHRoaXMuY29zdEdyYWQodGhpcy5ZKTsgLy8gZXZhbHVhdGUgZ3JhZGllbnRcbiAgICAgIGNvbnN0IGNvc3QgPSBjZy5jb3N0O1xuICAgICAgY29uc3QgZ3JhZCA9IGNnLmdyYWQ7XG5cbiAgICAgIC8vIHBlcmZvcm0gZ3JhZGllbnQgc3RlcFxuICAgICAgY29uc3QgeW1lYW4gPSB0aGlzLnplcm9zKHRoaXMuZGltKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgdGhpcy5kaW07IGQrKykge1xuICAgICAgICAgIGNvbnN0IGdpZCA9IGdyYWRbaV1bZF07XG4gICAgICAgICAgY29uc3Qgc2lkID0gdGhpcy55c3RlcFtpXVtkXTtcbiAgICAgICAgICBjb25zdCBnYWluaWQgPSB0aGlzLmdhaW5zW2ldW2RdO1xuXG4gICAgICAgICAgLy8gY29tcHV0ZSBnYWluIHVwZGF0ZVxuICAgICAgICAgIGxldCBuZXdnYWluID0gdGhpcy5zaWduKGdpZCkgPT09IHRoaXMuc2lnbihzaWQpID8gZ2FpbmlkICogMC44IDogZ2FpbmlkICsgMC4yO1xuICAgICAgICAgIGlmIChuZXdnYWluIDwgMC4wMSkgbmV3Z2FpbiA9IDAuMDE7IC8vIGNsYW1wXG4gICAgICAgICAgdGhpcy5nYWluc1tpXVtkXSA9IG5ld2dhaW47IC8vIHN0b3JlIGZvciBuZXh0IHR1cm5cblxuICAgICAgICAgIC8vIGNvbXB1dGUgbW9tZW50dW0gc3RlcCBkaXJlY3Rpb25cbiAgICAgICAgICBjb25zdCBtb212YWwgPSB0aGlzLml0ZXIgPCAyNTAgPyAwLjUgOiAwLjg7XG4gICAgICAgICAgY29uc3QgbmV3c2lkID0gbW9tdmFsICogc2lkIC0gdGhpcy5lcHNpbG9uICogbmV3Z2FpbiAqIGdyYWRbaV1bZF07XG4gICAgICAgICAgdGhpcy55c3RlcFtpXVtkXSA9IG5ld3NpZDsgLy8gcmVtZW1iZXIgdGhlIHN0ZXAgd2UgdG9va1xuXG4gICAgICAgICAgLy8gc3RlcCFcbiAgICAgICAgICB0aGlzLllbaV1bZF0gKz0gbmV3c2lkO1xuXG4gICAgICAgICAgeW1lYW5bZF0gKz0gdGhpcy5ZW2ldW2RdOyAvLyBhY2N1bXVsYXRlIG1lYW4gc28gdGhhdCB3ZSBjYW4gY2VudGVyIGxhdGVyXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gcmVwcm9qZWN0IFkgdG8gYmUgemVybyBtZWFuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IHRoaXMuZGltOyBkKyspXG4gICAgICAgICAgdGhpcy5ZW2ldW2RdIC09IHltZWFuW2RdIC8gTjtcbiAgICAgIH1cblxuICAgICAgLy9pZih0aGlzLml0ZXIlMTAwPT09MCkgY29uc29sZS5sb2coJ2l0ZXIgJyArIHRoaXMuaXRlciArICcsIGNvc3Q6ICcgKyBjb3N0KTtcbiAgICAgIHJldHVybiBjb3N0OyAvLyByZXR1cm4gY3VycmVudCBjb3N0XG4gICAgfVxuXG4gICAgLy8gZm9yIGRlYnVnZ2luZzogZ3JhZGllbnQgY2hlY2tcbiAgICBwdWJsaWMgZGVidWdHcmFkKCkge1xuICAgICAgY29uc3QgTiA9IHRoaXMuTjtcblxuICAgICAgY29uc3QgY2cgPSB0aGlzLmNvc3RHcmFkKHRoaXMuWSk7IC8vIGV2YWx1YXRlIGdyYWRpZW50XG4gICAgICAvL2NvbnN0IGNvc3QgPSBjZy5jb3N0O1xuICAgICAgY29uc3QgZ3JhZCA9IGNnLmdyYWQ7XG5cbiAgICAgIGNvbnN0IGUgPSAxZS01O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCB0aGlzLmRpbTsgZCsrKSB7XG4gICAgICAgICAgY29uc3QgeW9sZCA9IHRoaXMuWVtpXVtkXTtcblxuICAgICAgICAgIHRoaXMuWVtpXVtkXSA9IHlvbGQgKyBlO1xuICAgICAgICAgIGNvbnN0IGNnMCA9IHRoaXMuY29zdEdyYWQodGhpcy5ZKTtcblxuICAgICAgICAgIHRoaXMuWVtpXVtkXSA9IHlvbGQgLSBlO1xuICAgICAgICAgIGNvbnN0IGNnMSA9IHRoaXMuY29zdEdyYWQodGhpcy5ZKTtcblxuICAgICAgICAgIGNvbnN0IGFuYWx5dGljID0gZ3JhZFtpXVtkXTtcbiAgICAgICAgICBjb25zdCBudW1lcmljYWwgPSAoY2cwLmNvc3QgLSBjZzEuY29zdCkgLyAoMiAqIGUpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGkgKyAnLCcgKyBkICsgJzogZ3JhZGNoZWNrIGFuYWx5dGljOiAnICsgYW5hbHl0aWMgKyAnIHZzLiBudW1lcmljYWw6ICcgKyBudW1lcmljYWwpO1xuXG4gICAgICAgICAgdGhpcy5ZW2ldW2RdID0geW9sZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcXVBcnI/OiBGbG9hdDMyQXJyYXk7XG4gICAgLy8gcmV0dXJuIGNvc3QgYW5kIGdyYWRpZW50LCBnaXZlbiBhbiBhcnJhbmdlbWVudFxuICAgIHB1YmxpYyBjb3N0R3JhZChZOiBudW1iZXJbXVtdKSB7XG4gICAgICBjb25zdCBOID0gdGhpcy5OO1xuICAgICAgY29uc3QgZGltID0gdGhpcy5kaW07IC8vIGRpbSBvZiBvdXRwdXQgc3BhY2VcbiAgICAgIGNvbnN0IFAgPSB0aGlzLlA7XG5cbiAgICAgIGNvbnN0IHBtdWwgPSB0aGlzLml0ZXIgPCAxMDAgPyA0IDogMTsgLy8gdHJpY2sgdGhhdCBoZWxwcyB3aXRoIGxvY2FsIG9wdGltYVxuXG4gICAgICAvLyBjb21wdXRlIGN1cnJlbnQgUSBkaXN0cmlidXRpb24sIHVubm9ybWFsaXplZCBmaXJzdFxuICAgICAgdGhpcy5xdUFyciA/Pz0gdGhpcy56ZXJvcyhOICogTik7XG4gICAgICBsZXQgcXN1bSA9IDAuMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IE47IGorKykge1xuICAgICAgICAgIGNvbnN0IGRzdW0gPSBuZXcgQXJyYXkoZGltKS5yZWR1Y2UoKHByZXYsIF8sIGQpID0+IHByZXYgKyBNYXRoLnBvdyhZW2ldW2RdIC0gWVtqXVtkXSwgMiksIDApO1xuICAgICAgICAgIGNvbnN0IHF1ID0gMS4wIC8gKDEuMCArIGRzdW0pOyAvLyBTdHVkZW50IHQtZGlzdHJpYnV0aW9uXG4gICAgICAgICAgdGhpcy5xdUFycltpICogTiArIGpdID0gcXU7XG4gICAgICAgICAgdGhpcy5xdUFycltqICogTiArIGldID0gcXU7XG4gICAgICAgICAgcXN1bSArPSAyICogcXU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG5vcm1hbGl6ZSBRIGRpc3RyaWJ1dGlvbiB0byBzdW0gdG8gMVxuICAgICAgLy9jb25zdCBOTiA9IE4gKiBOO1xuICAgICAgLy9jb25zdCBRID0gdGhpcy56ZXJvcyhOTik7XG4gICAgICBsZXQgY29zdCA9IDAuMDtcbiAgICAgIGNvbnN0IGdyYWQgPSBuZXcgQXJyYXkoTikuZmlsbChudWxsKS5tYXAoKCkgPT4gKG5ldyBGbG9hdDMyQXJyYXkoZGltKSkuZmlsbCgwLjApKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgIC8vIGNvbnN0IGdzdW0gPSBuZXcgRmxvYXQzMkFycmF5KGRpbSkuZmlsbCgwLjApOyAvLyBpbml0IGdyYWQgZm9yIHBvaW50IGlcbiAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgTjsgaisrKSB7XG4gICAgICAgICAgY29uc3QgUSA9IE1hdGgubWF4KHRoaXMucXVBcnJbaSAqIE4gKyBqXSAvIHFzdW0sIDFlLTEwMCk7XG4gICAgICAgICAgY29zdCArPSAoLSBQW2kgKiBOICsgal0gKiBNYXRoLmxvZyhRKSkgKiAyOyAvLyBhY2N1bXVsYXRlIGNvc3QgKHRoZSBub24tY29uc3RhbnQgcG9ydGlvbiBhdCBsZWFzdC4uLilcbiAgICAgICAgICBjb25zdCBwcmVtdWx0ID0gNCAqIChwbXVsICogUFtpICogTiArIGpdIC0gUSkgKiB0aGlzLnF1QXJyW2kgKiBOICsgal07XG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhwcmVtdWx0LCBRLCBpLCBqKTtcbiAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGRpbTsgZCsrKSB7XG4gICAgICAgICAgICBncmFkW2ldW2RdICs9IHByZW11bHQgKiAoWVtpXVtkXSAtIFlbal1bZF0pO1xuICAgICAgICAgICAgZ3JhZFtqXVtkXSArPSBwcmVtdWx0ICogKFlbal1bZF0gLSBZW2ldW2RdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9ncmFkW2ldID0gZ3N1bTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtjb3N0LCBncmFkfTtcbiAgICB9XG59XG4iXX0=","/** 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 { Vector } from '@datagrok-libraries/utils/src/type-declarations';\nimport { AvailableMetrics, Measure, isBitArrayMetric } from '../typed-metrics';\nimport { DistanceMatrixService } from '../distance-matrix';\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';\n//import {TSNE} from '@keckelt/tsne';\nimport { TSNE } from '../t-sne/t-sne';\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 progressFunc;\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 const randomSeed = options.randomSeed ?? Date();\n const randomFn = seedRandom(randomSeed);\n options.random = randomFn;\n this.reducer = new TSNE(options);\n this.iterations = options?.iterations ?? this.reducer.getIterSize(this.data[0].length);\n this.distanceFnames = options.distanceFnames;\n this.distanceFns = options.distanceFns;\n this.distanceFnArgs = options.distanceFnArgs;\n this.progressFunc = options.progressFunc;\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: Array<Float32Array> = [];\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 distance = await matrixService.calcMulti(this.data, this.distanceFnames, false, this.distanceFnArgs, this.weights, this.aggregationMethod);\n matrixService.terminate();\n // const matrixProxy = distanceMatrixProxy(distance, this.data[0].length);\n this.reducer.initDataDist(distance, this.data[0].length);\n for (let i = 0; i < this.iterations; ++i) {\n this.reducer.step(); // every time you call this, solution gets better\n if (this.progressFunc)\n this.progressFunc(i, this.iterations, []);\n }\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 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 <= (options.nNeighbors ?? 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktY29sdW1uLWRpbS1yZWR1Y2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibXVsdGktY29sdW1uLWRpbS1yZWR1Y2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBK0MsTUFBTSxFQUFVLE1BQy9ELGlEQUFpRCxDQUFDO0FBQ3pELE9BQU8sRUFBcUIsZ0JBQWdCLEVBQWdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQy9HLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRXpELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUN4RixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUU3RSxPQUFPLFFBQVEsTUFBTSx5Q0FBeUMsQ0FBQztBQUMvRCxPQUFPLFVBQVUsTUFBTSxZQUFZLENBQUM7QUFDcEMscUNBQXFDO0FBQ3JDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQThCcEMsTUFBZSxrQkFBa0I7SUFDbkIsSUFBSSxDQUFZO0lBQ2hCLE9BQU8sQ0FBVztJQUNsQixpQkFBaUIsQ0FBNEI7SUFDdkQsWUFBWSxPQUFnQjtRQUMxQixJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7SUFDckQsQ0FBQztDQUtKO0FBRUQsTUFBTSxXQUFZLFNBQVEsa0JBQWtCO0lBQzlCLE9BQU8sQ0FBTztJQUNkLFVBQVUsQ0FBUztJQUNuQixjQUFjLENBQWlCO0lBQy9CLFdBQVcsQ0FBaUM7SUFDNUMsY0FBYyxDQUF1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QzNCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Nvb3JkaW5hdGVzLCBEaXN0YW5jZU1ldHJpYywgTWF0cml4LCBPcHRpb25zLCBWZWN0b3IsIFZlY3RvcnN9XG4gIGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7QXZhaWxhYmxlRGF0YVR5cGVzLCBBdmFpbGFibGVNZXRyaWNzLCBLbm93bk1ldHJpY3MsIE1lYXN1cmUsIGlzQml0QXJyYXlNZXRyaWN9IGZyb20gJy4uL3R5cGVkLW1ldHJpY3MnO1xuaW1wb3J0IHtEaXN0YW5jZU1hdHJpeFNlcnZpY2V9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeCc7XG5pbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2R9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC90eXBlcyc7XG5pbXBvcnQge1VNQVB9IGZyb20gJy4uL3VtYXAnO1xuaW1wb3J0IHthc3NlcnQsIHRyYW5zcG9zZU1hdHJpeH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdmVjdG9yLW9wZXJhdGlvbnMnO1xuaW1wb3J0IHtTcGFyc2VNYXRyaXhTZXJ2aWNlfSBmcm9tICcuLi9kaXN0YW5jZS1tYXRyaXgvc3BhcnNlLW1hdHJpeC1zZXJ2aWNlJztcbmltcG9ydCB7RGltUmVkdWN0aW9uTWV0aG9kc30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgQml0QXJyYXkgZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvYml0LWFycmF5JztcbmltcG9ydCBzZWVkUmFuZG9tIGZyb20gJ3NlZWRyYW5kb20nO1xuLy9pbXBvcnQge1RTTkV9IGZyb20gJ0BrZWNrZWx0L3RzbmUnO1xuaW1wb3J0IHtUU05FfSBmcm9tICcuLi90LXNuZS90LXNuZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVNQVBPcHRpb25zIHtcbiAgICBsZWFybmluZ1JhdGU/OiBudW1iZXI7XG4gICAgbkNvbXBvbmVudHM/OiBudW1iZXI7XG4gICAgbkVwb2Nocz86IG51bWJlcjtcbiAgICBuTmVpZ2hib3JzPzogbnVtYmVyO1xuICAgIHNwcmVhZD86IG51bWJlcjtcbiAgICBtaW5EaXN0PzogbnVtYmVyO1xuICAgIHByb2dyZXNzRnVuYz86IChlcG9jOiBudW1iZXIsIGVwb2Noc0xlbmd0aDogbnVtYmVyLCBlbWJlZGRpbmdzOiBudW1iZXJbXVtdKSA9PiB2b2lkO1xuICAgIHJhbmRvbVNlZWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRTTkVPcHRpb25zIHtcbiAgICBlcHNpbG9uPzogbnVtYmVyO1xuICAgIHBlcnBsZXhpdHk/OiBudW1iZXI7XG4gICAgZGltPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEaW1SZWR1Y3Rpb25QYXJhbTxUIGV4dGVuZHMgbnVtYmVyIHwgc3RyaW5nID0gbnVtYmVyPiB7XG4gICAgdWlOYW1lOiBzdHJpbmc7XG4gICAgdmFsdWU6IChUIGV4dGVuZHMgbnVtYmVyID8gbnVtYmVyIDogc3RyaW5nKSB8IG51bGw7XG4gICAgdG9vbHRpcDogc3RyaW5nO1xuICAgIHR5cGU/OiBUIGV4dGVuZHMgbnVtYmVyID8gJ251bWJlcicgOiAnc3RyaW5nJztcbiAgICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgICBtaW4/OiBudW1iZXI7XG4gICAgbWF4PzogbnVtYmVyO1xuICAgIHN0ZXA/OiBudW1iZXI7XG59XG5cbmFic3RyYWN0IGNsYXNzIE11bHRpQ29sdW1uUmVkdWNlciB7XG4gICAgcHJvdGVjdGVkIGRhdGE6IFZlY3RvcnNbXTtcbiAgICBwcm90ZWN0ZWQgd2VpZ2h0czogbnVtYmVyW107XG4gICAgcHJvdGVjdGVkIGFnZ3JlZ2F0aW9uTWV0aG9kOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgIHRoaXMuZGF0YSA9IG9wdGlvbnMuZGF0YTtcbiAgICAgIHRoaXMud2VpZ2h0cyA9IG9wdGlvbnMud2VpZ2h0cztcbiAgICAgIHRoaXMuYWdncmVnYXRpb25NZXRob2QgPSBvcHRpb25zLmFnZ3JlZ2F0aW9uTWV0aG9kO1xuICAgIH1cblxuICAgIC8qKiBFbWJlZHMgdGhlIGRhdGEgZ2l2ZW4gaW50byB0aGUgdHdvLWRpbWVuc2lvbmFsIHNwYWNlLlxuICAgICAqIEByZXR1cm4ge2FueX0gQ2FydGVzaWFuIGNvb3JkaW5hdGUgb2YgdGhpcyBlbWJlZGRpbmcgYW5kIGRpc3RhbmNlIG1hdHJpeCB3aGVyZSBhcHBsaWNhYmxlLiAqL1xuICAgIGFic3RyYWN0IHRyYW5zZm9ybSgpOiBQcm9taXNlPE1hdHJpeD47XG59XG5cbmNsYXNzIFRTTkVSZWR1Y2VyIGV4dGVuZHMgTXVsdGlDb2x1bW5SZWR1Y2VyIHtcbiAgICBwcm90ZWN0ZWQgcmVkdWNlcjogVFNORTtcbiAgICBwcm90ZWN0ZWQgaXRlcmF0aW9uczogbnVtYmVyO1xuICAgIHByb3RlY3RlZCBkaXN0YW5jZUZuYW1lczogS25vd25NZXRyaWNzW107XG4gICAgcHJvdGVjdGVkIGRpc3RhbmNlRm5zOiAoKGE6IGFueSwgYjogYW55KSA9PiBudW1iZXIpW107XG4gICAgcHJvdGVjdGVkIGRpc3RhbmNlRm5BcmdzOiB7W186IHN0cmluZ106IGFueX1bXTtcbiAgICBwcm90ZWN0ZWQgcHJvZ3Jlc3NGdW5jPzogKGVwb2M6IG51bWJlciwgZXBvY2hzTGVuZ3RoOiBudW1iZXIsIGVtYmVkZGluZ3M/OiBudW1iZXJbXVtdKSA9PiB2b2lkO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgVFNORVJlZHVjZXIuXG4gICAgICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgICogQG1lbWJlcm9mIFRTTkVSZWR1Y2VyXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucykge1xuICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICBjb25zdCByYW5kb21TZWVkOiBzdHJpbmcgPSBvcHRpb25zLnJhbmRvbVNlZWQgPz8gRGF0ZSgpO1xuICAgICAgY29uc3QgcmFuZG9tRm4gPSBzZWVkUmFuZG9tKHJhbmRvbVNlZWQpO1xuICAgICAgb3B0aW9ucy5yYW5kb20gPSByYW5kb21GbjtcbiAgICAgIHRoaXMucmVkdWNlciA9IG5ldyBUU05FKG9wdGlvbnMpO1xuICAgICAgdGhpcy5pdGVyYXRpb25zID0gb3B0aW9ucz8uaXRlcmF0aW9ucyA/PyB0aGlzLnJlZHVjZXIuZ2V0SXRlclNpemUodGhpcy5kYXRhWzBdLmxlbmd0aCk7XG4gICAgICB0aGlzLmRpc3RhbmNlRm5hbWVzID0gb3B0aW9ucy5kaXN0YW5jZUZuYW1lcztcbiAgICAgIHRoaXMuZGlzdGFuY2VGbnMgPSBvcHRpb25zLmRpc3RhbmNlRm5zO1xuICAgICAgdGhpcy5kaXN0YW5jZUZuQXJncyA9IG9wdGlvbnMuZGlzdGFuY2VGbkFyZ3M7XG4gICAgICB0aGlzLnByb2dyZXNzRnVuYyA9IG9wdGlvbnMucHJvZ3Jlc3NGdW5jO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgdC1TTkUgbWV0aG9kLlxcXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcGFyYWxsZWxEaXN0YW5jZVdvcmtlcnNdIFdoZXRoZXIgdG8gdXNlIHBhcmFsbGVsIGRpc3RhbmNlIHdvcmtlcnMuXG4gICAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZyBhbmQgZGlzdGFuY2UgbWF0cml4IHdoZXJlIGFwcGxpY2FibGUuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHRyYW5zZm9ybSgpOiBQcm9taXNlPE1hdHJpeD4ge1xuICAgICAgaWYgKHRoaXMuZGF0YVswXS5sZW5ndGggPiAxMDAwMClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIG51bWJlciBvZiBzYW1wbGVzIGZvciBULVNORSBpcyAxMDAwMCcpO1xuICAgICAgY29uc3QgbWF0cml4U2VydmljZSA9IG5ldyBEaXN0YW5jZU1hdHJpeFNlcnZpY2UodHJ1ZSwgZmFsc2UpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gY29uc3QgYWdncmVnYXRlID0gZ2V0QWdncmVnYXRpb25GdW5jdGlvbih0aGlzLmFnZ3JlZ2F0aW9uTWV0aG9kLCB0aGlzLndlaWdodHMpO1xuICAgICAgICAvLyBjb25zdCBkaXN0YW5jZXM6IEFycmF5PEZsb2F0MzJBcnJheT4gPSBbXTtcbiAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgLy8gICBjb25zdCBkaXN0ID0gYXdhaXQgbWF0cml4U2VydmljZS5jYWxjKHRoaXMuZGF0YVtpXSwgdGhpcy5kaXN0YW5jZUZuYW1lc1tpXSwgZmFsc2UsIHRoaXMuZGlzdGFuY2VGbkFyZ3NbaV0pO1xuICAgICAgICAvLyAgIGRpc3RhbmNlcy5wdXNoKGRpc3QpO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGNvbnN0IGRpc3RhbmNlID0gbmV3IEZsb2F0MzJBcnJheShkaXN0YW5jZXNbMF0ubGVuZ3RoKS5maWxsKDApO1xuICAgICAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3RhbmNlc1swXS5sZW5ndGg7ICsraSlcbiAgICAgICAgLy8gICBkaXN0YW5jZVtpXSA9IGFnZ3JlZ2F0ZShkaXN0YW5jZXMubWFwKChkKSA9PiBkW2ldKSk7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gYXdhaXQgbWF0cml4U2VydmljZS5jYWxjTXVsdGkodGhpcy5kYXRhLCB0aGlzLmRpc3RhbmNlRm5hbWVzLCBmYWxzZSwgdGhpcy5kaXN0YW5jZUZuQXJncyxcbiAgICAgICAgICB0aGlzLndlaWdodHMsIHRoaXMuYWdncmVnYXRpb25NZXRob2QpO1xuICAgICAgICBtYXRyaXhTZXJ2aWNlLnRlcm1pbmF0ZSgpO1xuICAgICAgICAvLyBjb25zdCBtYXRyaXhQcm94eSA9IGRpc3RhbmNlTWF0cml4UHJveHkoZGlzdGFuY2UsIHRoaXMuZGF0YVswXS5sZW5ndGgpO1xuICAgICAgICB0aGlzLnJlZHVjZXIuaW5pdERhdGFEaXN0KGRpc3RhbmNlLCB0aGlzLmRhdGFbMF0ubGVuZ3RoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaXRlcmF0aW9uczsgKytpKSB7XG4gICAgICAgICAgdGhpcy5yZWR1Y2VyLnN0ZXAoKTsgLy8gZXZlcnkgdGltZSB5b3UgY2FsbCB0aGlzLCBzb2x1dGlvbiBnZXRzIGJldHRlclxuICAgICAgICAgIGlmICh0aGlzLnByb2dyZXNzRnVuYylcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NGdW5jKGksIHRoaXMuaXRlcmF0aW9ucywgW10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlZHVjZXIuZ2V0U29sdXRpb24oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbWF0cml4U2VydmljZS50ZXJtaW5hdGUoKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFVNQVBSZWR1Y2VyIGV4dGVuZHMgTXVsdGlDb2x1bW5SZWR1Y2VyIHtcbiAgICBwcm90ZWN0ZWQgcmVkdWNlcjogVU1BUDtcbiAgICBwcm90ZWN0ZWQgZGlzdGFuY2VGbmFtZXM6IEtub3duTWV0cmljc1tdO1xuICAgIHByb3RlY3RlZCBkaXN0YW5jZUZuczogRnVuY3Rpb25bXTtcbiAgICBwcm90ZWN0ZWQgdmVjdG9yczogbnVtYmVyW107XG4gICAgcHJvdGVjdGVkIHByb2dyZXNzRnVuYz86IChlcG9jOiBudW1iZXIsIGVwb2Noc0xlbmd0aDogbnVtYmVyLCBlbWJlZGRpbmc6IG51bWJlcltdW10pID0+IHZvaWQ7XG4gICAgcHJvdGVjdGVkIGRpc3RhbmNlRm5BcmdzOiB7W186IHN0cmluZ106IGFueX1bXTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFVNQVBSZWR1Y2VyLlxuICAgICAqIEBwYXJhbSB7T3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqIEBtZW1iZXJvZiBVTUFQUmVkdWNlclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJhbmRvbVNlZWQ6IHN0cmluZyA9IG9wdGlvbnMucmFuZG9tU2VlZCA/PyBEYXRlKCk7XG4gICAgICBjb25zdCByYW5kb21GbiA9IHNlZWRSYW5kb20ocmFuZG9tU2VlZCk7XG4gICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgIGFzc2VydCgnZGlzdGFuY2VGbmFtZXMnIGluIG9wdGlvbnMpO1xuICAgICAgYXNzZXJ0KCdkaXN0YW5jZUZucycgaW4gb3B0aW9ucyk7XG4gICAgICB0aGlzLmRpc3RhbmNlRm5BcmdzID0gb3B0aW9ucy5kaXN0YW5jZUZuQXJncztcbiAgICAgIHRoaXMuZGlzdGFuY2VGbnMgPSBvcHRpb25zLmRpc3RhbmNlRm5zITtcbiAgICAgIHRoaXMucHJvZ3Jlc3NGdW5jID0gb3B0aW9ucy5wcm9ncmVzc0Z1bmM7XG5cbiAgICAgIHRoaXMuZGlzdGFuY2VGbmFtZXMgPSBvcHRpb25zLmRpc3RhbmNlRm5hbWVzITtcbiAgICAgIC8vVW1hcCB1c2VzIHZlY3RvciBpbmRleGluZywgc28gd2UgbmVlZCB0byBjcmVhdGUgYW4gYXJyYXkgb2YgdmVjdG9ycyBhcyBpbmRlY2VzLlxuICAgICAgdGhpcy52ZWN0b3JzID0gbmV3IEFycmF5KHRoaXMuZGF0YVswXS5sZW5ndGgpLmZpbGwoMCkubWFwKChfLCBpKSA9PiBpKTtcblxuICAgICAgaWYgKHRoaXMuZGF0YVswXS5sZW5ndGggPD0gKG9wdGlvbnMubk5laWdoYm9ycyA/PyAxNSkpXG4gICAgICAgIG9wdGlvbnMubk5laWdoYm9ycyA9IHRoaXMuZGF0YVswXS5sZW5ndGggLSAxO1xuICAgICAgb3B0aW9ucy5yYW5kb20gPSByYW5kb21GbjtcbiAgICAgIHRoaXMucmVkdWNlciA9IG5ldyBVTUFQKG9wdGlvbnMpO1xuICAgICAgLy8gdGhpcy5yZWR1Y2VyLmRpc3RhbmNlRm4gPSB0aGlzLl9lbmNvZGVkRGlzdGFuY2UuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWJlZHMgdGhlIGRhdGEgZ2l2ZW4gaW50byB0aGUgdHdvLWRpbWVuc2lvbmFsIHNwYWNlIHVzaW5nIFVNQVAgbWV0aG9kLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW19wYXJhbGxlbERpc3RhbmNlV29ya2Vyc10gV2hldGhlciB0byB1c2UgcGFyYWxsZWwgZGlzdGFuY2UgbWF0cml4IHdvcmtlcnMuXG4gICAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdHJhbnNmb3JtKF9wYXJhbGxlbERpc3RhbmNlV29ya2Vycz86IGJvb2xlYW4pOiBQcm9taXNlPE1hdHJpeD4ge1xuICAgICAgY29uc29sZS50aW1lKCdrbm4gZ3JhcGgnKTtcbiAgICAgIGNvbnN0IGtublJlcyA9IGF3YWl0IG5ldyBTcGFyc2VNYXRyaXhTZXJ2aWNlKClcbiAgICAgICAgLm11bHRpQ29sdW1uS05OKHRoaXMuZGF0YSwgdGhpcy5kaXN0YW5jZUZuYW1lcywgdGhpcy5yZWR1Y2VyLm5laWdoYm9ycyxcbiAgICAgICAgICB0aGlzLmRpc3RhbmNlRm5BcmdzLCB0aGlzLndlaWdodHMsIHRoaXMuYWdncmVnYXRpb25NZXRob2QpO1xuICAgICAgY29uc29sZS50aW1lRW5kKCdrbm4gZ3JhcGgnKTtcbiAgICAgIHRoaXMucmVkdWNlci5zZXRQcmVjb21wdXRlZEtOTihrbm5SZXMua25uSW5kZXhlcywga25uUmVzLmtubkRpc3RhbmNlcyk7XG5cbiAgICAgIC8vIG5lZWRlZCBzbyB0aGF0IGdhcmJhZ2UgY29sbGVjdG9yIGNhbiBmcmVlIG1lbW9yeSBmcm9tIGRpc3RhbmNlIG1hdHJpeFxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LCAzMDApO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVtYmVkZGluZyA9IGF3YWl0IHRoaXMucmVkdWNlci5maXRBc3luYyh0aGlzLnZlY3RvcnMsIChlcG9jKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnByb2dyZXNzRnVuYylcbiAgICAgICAgICB0aGlzLnByb2dyZXNzRnVuYyhlcG9jLCB0aGlzLnJlZHVjZXIuZ2V0TkVwb2NocygpLCB0aGlzLnJlZHVjZXIuZ2V0RW1iZWRkaW5nKCkpO1xuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIGFycmF5Q2FzdDJDb29yZGluYXRlcyhkYXRhOiBudW1iZXJbXVtdKTogQ29vcmRpbmF0ZXMge1xuICAgICAgICByZXR1cm4gbmV3IEFycmF5KGRhdGEubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaSkgPT4gKFZlY3Rvci5mcm9tKGRhdGFbaV0pKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcnJheUNhc3QyQ29vcmRpbmF0ZXMoZW1iZWRkaW5nKTtcbiAgICB9XG59XG5cbmNvbnN0IEF2YWlsYWJsZVJlZHVjZXJzID0ge1xuICAnVU1BUCc6IFVNQVBSZWR1Y2VyLFxuICAndC1TTkUnOiBUU05FUmVkdWNlcixcbn07XG5cbmV4cG9ydCB0eXBlIEtub3duTWV0aG9kcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVSZWR1Y2VycztcblxuZXhwb3J0IGNsYXNzIE11bHRpQ29sRGltUmVkdWNlciB7XG4gICAgcHJpdmF0ZSByZWR1Y2VyOiBNdWx0aUNvbHVtblJlZHVjZXIgfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyLlxuICAgKiBAcGFyYW0ge2FueVtdfSBkYXRhIFZlY3RvcnMgdG8gZW1iZWQuXG4gICAqIEBwYXJhbSB7S25vd25NZXRob2RzfSBtZXRob2QgRW1iZWRkaW5nIG1ldGhvZCB0byBiZSBhcHBsaWVkXG4gICAqIEBwYXJhbSB7S25vd25NZXRyaWNzfSBtZXRyaWMgRGlzdGFuY2UgbWV0cmljIHRvIGJlIGNvbXB1dGVkIGJldHdlZW4gZWFjaCBvZiB0aGUgdmVjdG9ycy5cbiAgICogQHBhcmFtIHtPcHRpb25zfSBbb3B0aW9uc10gT3B0aW9ucyB0byBwYXNzIHRvIHRoZSBpbXBsZW1lbnRpbmcgZW1iZWRkZXJzLlxuICAgKiBAbWVtYmVyb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyXG4gICAqL1xuICAgIGNvbnN0cnVjdG9yKGRhdGE6IEFycmF5PGFueVtdPiwgbWV0aG9kOiBEaW1SZWR1Y3Rpb25NZXRob2RzLCBtZXRyaWNzOiBLbm93bk1ldHJpY3NbXSxcbiAgICAgIHdlaWdodHM6IG51bWJlcltdLCBkaXN0YW5jZUFnZ3JlZ2F0aW9uOiBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kLCBvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICBjb25zdCBtZWFzdXJlczogRGlzdGFuY2VNZXRyaWNbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgbWV0cmljcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgIGNvbnN0IG1lYXN1cmUgPSBuZXcgTWVhc3VyZShtZXRyaWNzW2lkeF0pLmdldE1lYXN1cmUob3B0aW9ucy5kaXN0YW5jZUZuQXJnc1tpZHhdKTtcbiAgICAgICAgbWVhc3VyZXMucHVzaChtZWFzdXJlKTtcbiAgICAgICAgbGV0IGJpdEFycmF5TGVuZ3RoID0gMjA0ODtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhW2lkeF0ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBpZiAoZGF0YVtpZHhdW2ldICYmIGRhdGFbaWR4XVtpXS5fbGVuZ3RoKSB7XG4gICAgICAgICAgICBiaXRBcnJheUxlbmd0aCA9IGRhdGFbaWR4XVtpXS5fbGVuZ3RoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0JpdEFycmF5TWV0cmljKG1ldHJpY3NbaWR4XSkpIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFbaWR4XS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKGRhdGFbaWR4XVtpXSAmJiBkYXRhW2lkeF1baV0uX2RhdGEpXG4gICAgICAgICAgICAgIGRhdGFbaWR4XVtpXSA9IG5ldyBCaXRBcnJheShkYXRhW2lkeF1baV0uX2RhdGEsIGRhdGFbaWR4XVtpXS5fbGVuZ3RoKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgZGF0YVtpZHhdW2ldID0gbmV3IEJpdEFycmF5KGJpdEFycmF5TGVuZ3RoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG1ldGhvZCA9PSAnVU1BUCcpIHtcbiAgICAgICAgdGhpcy5yZWR1Y2VyID0gbmV3IFVNQVBSZWR1Y2VyKHtcbiAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgIGRpc3RhbmNlRm5hbWVzOiBtZXRyaWNzLFxuICAgICAgICAgIGRpc3RhbmNlRm5zOiBtZWFzdXJlcyxcbiAgICAgICAgICBkaXN0YW5jZUZuQXJnczogb3B0aW9ucy5kaXN0YW5jZUZuQXJncyxcbiAgICAgICAgICB3ZWlnaHRzOiB3ZWlnaHRzLFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uTWV0aG9kOiBkaXN0YW5jZUFnZ3JlZ2F0aW9uLFxuICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PSAndC1TTkUnKSB7XG4gICAgICAgIHRoaXMucmVkdWNlciA9IG5ldyBUU05FUmVkdWNlcih7XG4gICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICBkaXN0YW5jZUZuYW1lczogbWV0cmljcyxcbiAgICAgICAgICBkaXN0YW5jZUZuczogbWVhc3VyZXMsXG4gICAgICAgICAgZGlzdGFuY2VGbkFyZ3M6IG9wdGlvbnMuZGlzdGFuY2VGbkFyZ3MsXG4gICAgICAgICAgd2VpZ2h0czogd2VpZ2h0cyxcbiAgICAgICAgICBhZ2dyZWdhdGlvbk1ldGhvZDogZGlzdGFuY2VBZ2dyZWdhdGlvbixcbiAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgKiBFbWJlZHMgdGhlIGRhdGEgZ2l2ZW4gaW50byB0aGUgdHdvLWRpbWVuc2lvbmFsIHNwYWNlIHVzaW5nIHRoZSBjaG9zZW4gbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHRyYW5zcG9zZSBXaGV0aGVyIHRvIHRyYW5zZm9ybSBjb29yZGluYXRlcyB0byBoYXZlIGNvbHVtbnMtZmlyc3Qgb3JpZW50YXRpb24uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYWxsZWxEaXN0YW5jZVdvcmtlcnMgV2hldGhlciB0byB1c2UgcGFyYWxsZWwgZGlzdGFuY2UgY29tcHV0YXRpb24uXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZW1iZWRkaW5nIG1ldGhvZCB3YXMgbm90IGZvdW5kLlxuICAgKiBAcmV0dXJuIHthbnl9IENhcnRlc2lhbiBjb29yZGluYXRlIG9mIHRoaXMgZW1iZWRkaW5nIGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZS5cbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdHJhbnNmb3JtKHRyYW5zcG9zZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxNYXRyaXg+IHtcbiAgICAgIGlmICh0aGlzLnJlZHVjZXIgPT09IHVuZGVmaW5lZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWR1Y2VyIHdhcyBub3QgZGVmaW5lZC4nKTtcblxuICAgICAgbGV0IGVtYmVkZGluZyA9IGF3YWl0IHRoaXMucmVkdWNlci50cmFuc2Zvcm0oKTtcblxuICAgICAgaWYgKHRyYW5zcG9zZSlcbiAgICAgICAgZW1iZWRkaW5nID0gdHJhbnNwb3NlTWF0cml4KGVtYmVkZGluZyk7XG5cbiAgICAgIHJldHVybiBlbWJlZGRpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAqIFJldHVybnMgbWV0cmljcyBhdmFpbGFibGUgYnkgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHtBdmFpbGFibGVEYXRhVHlwZXN9IHR5cGVOYW1lIHR5cGUgbmFtZVxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gTWV0cmljIG5hbWVzIHdoaWNoIGV4cGVjdHMgdGhlIGdpdmVuIGRhdGEgdHlwZVxuICAgKiBAbWVtYmVyb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyXG4gICAqL1xuICAgIHN0YXRpYyBhdmFpbGFibGVNZXRyaWNzQnlUeXBlKHR5cGVOYW1lOiBBdmFpbGFibGVEYXRhVHlwZXMpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVNZXRyaWNzW3R5cGVOYW1lXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAqIFJldHVybnMgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIG1ldGhvZHMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcmVhZG9ubHlcbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgICBzdGF0aWMgZ2V0IGF2YWlsYWJsZU1ldGhvZHMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoQXZhaWxhYmxlUmVkdWNlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgKiBSZXR1cm5zIG1ldHJpY3MgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcmVhZG9ubHlcbiAgICogQG1lbWJlcm9mIERpbWVuc2lvbmFsaXR5UmVkdWNlclxuICAgKi9cbiAgICBzdGF0aWMgZ2V0IGF2YWlsYWJsZU1ldHJpY3MoKSB7XG4gICAgICBsZXQgYW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgT2JqZWN0LnZhbHVlcyhBdmFpbGFibGVNZXRyaWNzKS5mb3JFYWNoKChvYmopID0+IHtcbiAgICAgICAgY29uc3QgYXJyYXkgPSBPYmplY3QudmFsdWVzKG9iaik7XG4gICAgICAgIGFucyA9IFsuLi5hbnMsIC4uLmFycmF5XTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFucztcbiAgICB9XG59XG4iXX0=","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==","// 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":["isNil","x","insertSmaller","distancesAr","indexes","num","index","length","newPosition","findIndex","v","pop","splice","Float32Array","assert","condition","message","Error","vectorDistanceMetricsMethods","Euclidean","p","q","result","len","i","Math","pow","sqrt","stringDistanceMetricsMethods","Levenshtein","JaroWinkler","Manhattan","s1","s2","dist","Onehot","bitArrayDistanceMetricsMethods","Tanimoto","Dice","Asymmetric","BraunBlanquet","Cosine","Kulczynski","McConnaughey","RogotGoldberg","Russel","Sokal","Hamming","intArrayDistanceMetricsMethods","TanimotoIntArray","numberDistanceMetricsMethods","Difference","AvailableMetrics","Vector","String","BitArray","MacroMolecule","HAMMING","LEVENSHTEIN","NEEDLEMANN_WUNSCH","MONOMER_CHEMICAL_DISTANCE","Number","IntArray","MetricToDataType","Object","keys","reduce","ret","key","val","Measure","method","dataType","constructor","this","getMeasure","opts","dict","hasOwnProperty","name","toString","isNumericMetric","static","availableMeasures","DistanceMatrixService","_workers","_workerCount","_terminateOnComplete","useConcurrentWorkers","terminateOnComplete","threadCount","navigator","hardwareConcurrency","max","Array","fill","map","Worker","URL","async","values","fnName","normalize","calcMulti","MANHATTAN","fnNames","weights","aggregationMethod","Promise","resolve","reject","promises","totalLength","min","chunkSize","distanceMatrix","endRow","endCol","lmin","lmax","MIN_VALUE","start","floor","end","startRow","startCol","postMessage","chunckSize","resolveWorker","rejectWorker","onmessage","data","error","distanceMatrixData","setTimeout","terminate","set","all","forEach","value","e","worker","tauRandInt","n","random","tauRand","empty","output","push","undefined","range","_","filled","zeros","mean","input","sum","rejectionSample","nSamples","poolSize","rejectSample","j","broken","k","reshape2d","a","b","rows","col","makeHeap","nPoints","size","makeArrays","fillValue","heap","Infinity","heapPush","row","weight","flag","indices","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","defaultValue","getAll","ordered","rowColValues","sort","getDims","getRows","from","_key","getCols","getValues","fn","vals","toArray","matrix","oldRows","oldCols","oldVals","matlen","Int32Array","pairwiseMultiply","elementWise","y","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","abs","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","newData","newMatrix","column","interval","round","l","matrix1","matrix2","checkMatrix","isMatrix","klass","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","echelonForm","clone","h","iMax","swapRows","tmp","reducedEchelonForm","maxRow","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","temp","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","other","Bcolj","Float64Array","s","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","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","expm1","fround","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","count","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","init","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","err","clipValue","TSNE","perplexity","epsilon","N","P","gains","ystep","getopt","opt","field","defaultval","returnV","vValue","gaussRandom","u","randn","mu","std","ArrayBuffer","arr","randn2d","uses","l2","x1","x2","D","x1i","x2i","xtod","getIterSize","rowSize","d2p","indexer","hTarget","prow","betamin","betamax","beta","done","maxtries","pj","nHere","pOut","N2","initDataRaw","dists","initSolution","initDataDist","time","timeEnd","getSolution","cg","costGrad","cost","grad","ymean","gid","sid","gainid","newgain","newsid","debugGrad","yold","cg0","cg1","analytic","numerical","quArr","pmul","qsum","qu","prev","Q","premult","MultiColumnReducer","TSNEReducer","reducer","distanceFnames","distanceFns","distanceFnArgs","progressFunc","randomSeed","Date","randomFn","matrixService","UMAPReducer","vectors","_parallelDistanceWorkers","knnRes","multiColumnKNN","knnIndexes","fitAsync","epoc","AvailableReducers","MultiColDimReducer","metrics","distanceAggregation","measures","measure","bitArrayLength","_length","_data","typeName","availableMethods","availableMetrics","obj","epochNum","epochsLength","self","columnsData","distanceMetrics","onMessage","alea","xor128","xorwow","xorshift7","xor4096","tychei","sr","module","exports","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","mask","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":""}
1
+ {"version":3,"file":"895.js","mappings":"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","sources":["webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/utils.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://bio/./node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/typed-metrics/typed-metrics.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/t-sne/t-sne.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/multi-column-dim-reducer.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/mulit-column-dim-reducer-worker.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":["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=","/**\n * Denotes a vector of floating poit values.\n *\n * @export\n * @class Vector\n * @extends {Float32Array}\n */\nexport class Vector extends Float32Array {\n}\n/**\n * Denotes a two-dimensional matrix.\n *\n * @export\n * @class Matrix\n * @extends {Array<Vector>}\n */\nexport class Matrix extends Array {\n}\n/**\n * Denotes cartesian coordinates.\n *\n * @export\n * @class Coordinates\n * @extends {Matrix}\n */\nexport class Coordinates extends Matrix {\n}\n/**\n * Denotes an array of arbitrary-typed vectors.\n *\n * @export\n * @class Vectors\n * @extends {Array<any>}\n */\nexport class Vectors extends Array {\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLWRlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbi8qKlxuICogRGVub3RlcyBhIHZlY3RvciBvZiBmbG9hdGluZyBwb2l0IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVmVjdG9yXG4gKiBAZXh0ZW5kcyB7RmxvYXQzMkFycmF5fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yIGV4dGVuZHMgRmxvYXQzMkFycmF5IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIHR3by1kaW1lbnNpb25hbCBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE1hdHJpeFxuICogQGV4dGVuZHMge0FycmF5PFZlY3Rvcj59XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBcnJheTxWZWN0b3I+IHt9XG5cbi8qKlxuICogRGVub3RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvb3JkaW5hdGVzXG4gKiBAZXh0ZW5kcyB7TWF0cml4fVxuICovXG5leHBvcnQgY2xhc3MgQ29vcmRpbmF0ZXMgZXh0ZW5kcyBNYXRyaXgge31cblxuLyoqXG4gKiBEZW5vdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeS10eXBlZCB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBWZWN0b3JzXG4gKiBAZXh0ZW5kcyB7QXJyYXk8YW55Pn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcnMgZXh0ZW5kcyBBcnJheTxhbnk+IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBmdW5jdGlvbiBvcHRpb25zLlxuICpcbiAqIEBleHBvcnRcbiAqIEB0eXBlIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcbiAqIEBwYXJhbSB7YW55fSB2MSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHthbnl9IHYyIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBEaXN0YW5jZU1ldHJpYyA9ICh2MTogYW55LCB2MjogYW55KSA9PiAobnVtYmVyKTtcblxuLyoqXG4gKiBEZW5vdGVzIGEgc2ltcGxlIHN0cmluZyB0byBzdHJpbmcgZGljdGlvbmFyeS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdHlwZSBTdHJpbmdEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0RpY3Rpb25hcnkgPSB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcblxuXG5leHBvcnQgdHlwZSBDb2x1bW5JbnB1dE9wdGlvbnMgPSB7XG4gICAgZmlsdGVyPzogKGNvbDogREcuQ29sdW1uKSA9PiBib29sZWFuIHwgbnVsbDtcbn07XG4iXX0=","import { Vector } from './type-declarations';\nimport { randomFloat, randomInt } from './random';\n/**\n * Asserts a condition by throwing an Error.\n *\n * @export\n * @param {boolean} [condition=false] Condition to assert.\n * @param {string} [message='Assertion error.'] Message to output.\n * @throws {Error}\n */\nexport function assert(condition = false, message = 'Assertion error.') {\n if (!condition)\n throw new Error(message);\n}\n/**\n * Creates new two-dimensional array and fills it with the value given.\n *\n * @param {number} dimension1 The first dimension of the coordinates (number of rows).\n * @param {number} dimension2 The second dimension of the coordinates (number of columns).\n * @param {number} [fill=0] A value to fill the coordinates with.\n * @return {Coordinates} A two-dimensional filled with the value given.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function initCoordinates(dimension1, dimension2, fill = 0) {\n return new Array(dimension1).fill(fill).map(() => (new Vector(dimension2).fill(fill)));\n}\n/**\n * Transpose matrix.\n *\n * @export\n * @param {Matrix} matrix The matrix to be transposed.\n * @return {Matrix} Transposed matrix.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function transposeMatrix(matrix) {\n return new Array(matrix[0].length).fill(0)\n .map((_, i) => (new Vector(matrix.length).fill(0).map((_, j) => (matrix[j][i]))));\n}\n/**\n * Adds two vectors with the second one to be multiplied by the given ratio.\n *\n * @export\n * @param {Vector} p The first vector to add.\n * @param {Vector} q The second vector to add.\n * @param {number} [multiplier=1] A multiplier to be used before the second vector is added.\n * @return {Vector} New vector contained the result of operation p+multiplier*q.\n */\nexport function vectorAdd(p, q, multiplier = 1) {\n const nItems = p.length;\n assert(nItems == q.length, 'Vector lengths do not match.');\n const total = new Vector(nItems);\n for (let i = 0; i < p.length; ++i)\n total[i] = p[i] + multiplier * q[i];\n return total;\n}\n/**\n * Sums the vector's items.\n *\n * @param {Vector} v The vector to be summed.\n * @return {number} The vector's items sum.\n */\nfunction itemsSum(v) {\n let total = 0;\n for (let i = 0; i < v.length; ++i)\n total += v[i];\n return total;\n}\n/**\n * Suqares the vector's items.\n *\n * @param {Vector} v The vector to square.\n * @return {Vector} A new vector containing the original's items squared.\n */\nfunction vectorSquare(v) {\n const nItems = v.length;\n const total = new Vector(nItems);\n for (let i = 0; i < v.length; ++i)\n total[i] = v[i] * v[i];\n return total;\n}\nexport function vectorLength(v) {\n let sqrSum = 0;\n for (let i = 0; i < v.length; i++)\n sqrSum += v[i] * v[i];\n return Math.sqrt(sqrSum);\n}\nexport function vectorDotProduct(v1, v2) {\n if (v1.length != v2.length)\n throw new Error('The dimensionality of the vectors must match');\n let prod = 0;\n for (let i = 0; i < v1.length; i++)\n prod += v1[i] * v2[i];\n return prod;\n}\n/**\n * Creates a matrix filled with random floating point values.\n *\n * @export\n * @param {number} dimension1 The first dimension of the matrix.\n * @param {number} dimension2 The second dimension of the matrix.\n * @param {number} [scale=1.] Max value given by random generator.\n * @return {Matrix} A new matrix filled with random floating point values.\n */\nexport function fillRandomMatrix(dimension1, dimension2, scale = 1.) {\n const matrix = initCoordinates(dimension1, dimension2);\n for (let i = 0; i < dimension1; ++i) {\n for (let j = 0; j < dimension2; ++j)\n matrix[i][j] = randomFloat(scale);\n }\n return matrix;\n}\n/**\n * Calculates Euclidean distance between two vectors.\n *\n * @export\n * @param {Vector} p The first vector.\n * @param {Vector} q The second vector.\n * @return {number} Euclidean distance between the given vectors.\n */\nexport function calculateEuclideanDistance(p, q) {\n let result = 0;\n const len = p.length;\n if (len !== q.length)\n throw new Error('The dimensionality of the vectors must match');\n for (let i = 0; i < len; ++i)\n result += Math.pow((p[i] - q[i]), 2);\n return Math.sqrt(result);\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n }\n }\n return matrix;\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcNormalizedDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n let max = Number.MIN_VALUE;\n let min = Number.MAX_VALUE;\n for (let i = 0; i < nItems; ++i) {\n for (let j = i; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null || i === j) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n if (d > max)\n max = d;\n if (d < min)\n min = d;\n }\n }\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j)\n matrix[i][j] = matrix[j][i] = (matrix[i][j] - min) / (max - min);\n }\n return matrix;\n}\n/** Generates array from a range [begin; end] or [begin; end) if endExclusive. **/\nexport function genRange(begin, end, endExclusive = false) {\n const nItems = end - begin + (endExclusive ? 0 : 1);\n const series = new Int32Array(nItems);\n for (let i = 0; i < nItems; ++i)\n series[i] = begin + i;\n return series;\n}\n/**\n * Returns order of values as if they are sorted.\n *\n * @export\n * @param {any[]} values Input array.\n * @param {boolean} [reverse=false] Whether to return reversed order.\n * @return {number[]} The order computed.\n */\nexport function argSort(values, reverse = false) {\n const sortfn = reverse ? (a, b) => (b[0] - a[0]) : (a, b) => (a[0] - b[0]);\n const decor = (v, i) => [v, i]; // set index to value\n const undecor = (a) => a[1]; // leave only index\n const _argsort = (arr) => arr.map(decor).sort(sortfn).map(undecor);\n return _argsort(values);\n}\n/**\n * Returns the indexes of the most diverse objects according to the dist function\n * @param {number} length total number of objects\n * @param {number} n number of diverse elements to find\n * @param {(i1: number, i2: number) => number} dist a function which calculates distance between\n * two objects using their indexes\n * @returns {number[]} The indexes of the most diverse objects\n */\nexport function getDiverseSubset(length, n, dist) {\n function maxBy(values, orderBy) {\n let maxValue = null;\n let maxOrderBy = null;\n for (const element of values) {\n const elementOrderBy = orderBy(element);\n if (maxOrderBy == null || elementOrderBy > maxOrderBy) {\n maxValue = element;\n maxOrderBy = elementOrderBy;\n }\n }\n return maxValue;\n }\n const subset = [randomInt(length - 1)];\n const complement = new Set();\n for (let i = 0; i < length; ++i) {\n if (!subset.includes(i))\n complement.add(i);\n }\n while (subset.length < n) {\n const idx = maxBy(complement.values(), (i) => Math.min.apply(Math, subset.map(function (val, index) {\n return dist(i, val);\n })));\n if (idx) {\n subset.push(idx);\n complement.delete(idx);\n }\n }\n return subset;\n}\n/**\n * Returns normalized vector.\n *\n * @export\n * @param {Vector} data numerical array\n */\nexport function normalize(data) {\n const len = data.length;\n let sum = 0;\n let sumOfSquares = 0;\n for (let i = 0; i < len; ++i) {\n sum += data[i];\n sumOfSquares += Math.pow(data[i], 2);\n }\n const mean = sum / len;\n const stdDevInverse = 1.0 / Math.sqrt(sumOfSquares / len - Math.pow(mean, 2));\n for (let i = 0; i < len; ++i)\n data[i] = (data[i] - mean) * stdDevInverse;\n return data;\n}\n/**\n * Finds set difference between two lists.\n * @param {any[]} a The first list.\n * @param {any[]} b The second list.\n * @return {any[]}\n */\nexport function setDifference(a, b) {\n const bSet = new Set(b);\n return Array.from(new Set(a.filter((x) => !bSet.has(x))).values());\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsVUFBa0IsRUFBRSxVQUFrQixFQUFFLE9BQWUsQ0FBQztJQUN0RixPQUFPLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFjO0lBQzVDLE9BQU8sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDdkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENB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QUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNYXRyaXgsIFZlY3RvciwgQ29vcmRpbmF0ZXMsIFZlY3RvcnMsIERpc3RhbmNlTWV0cmljfSBmcm9tICcuL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7cmFuZG9tRmxvYXQsIHJhbmRvbUludH0gZnJvbSAnLi9yYW5kb20nO1xuXG4vKipcbiAqIEFzc2VydHMgYSBjb25kaXRpb24gYnkgdGhyb3dpbmcgYW4gRXJyb3IuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtib29sZWFufSBbY29uZGl0aW9uPWZhbHNlXSBDb25kaXRpb24gdG8gYXNzZXJ0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPSdBc3NlcnRpb24gZXJyb3IuJ10gTWVzc2FnZSB0byBvdXRwdXQuXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb246IGJvb2xlYW4gPSBmYWxzZSwgbWVzc2FnZTogc3RyaW5nID0gJ0Fzc2VydGlvbiBlcnJvci4nKSB7XG4gIGlmICghY29uZGl0aW9uKVxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIG5ldyB0d28tZGltZW5zaW9uYWwgYXJyYXkgYW5kIGZpbGxzIGl0IHdpdGggdGhlIHZhbHVlIGdpdmVuLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBkaW1lbnNpb24xIFRoZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhlIGNvb3JkaW5hdGVzIChudW1iZXIgb2Ygcm93cykuXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgY29vcmRpbmF0ZXMgKG51bWJlciBvZiBjb2x1bW5zKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbD0wXSBBIHZhbHVlIHRvIGZpbGwgdGhlIGNvb3JkaW5hdGVzIHdpdGguXG4gKiBAcmV0dXJuIHtDb29yZGluYXRlc30gQSB0d28tZGltZW5zaW9uYWwgZmlsbGVkIHdpdGggdGhlIHZhbHVlIGdpdmVuLlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIGZpbGw6IG51bWJlciA9IDApOiBDb29yZGluYXRlcyB7XG4gIHJldHVybiBuZXcgQXJyYXkoZGltZW5zaW9uMSkuZmlsbChmaWxsKS5tYXAoKCkgPT4gKG5ldyBWZWN0b3IoZGltZW5zaW9uMikuZmlsbChmaWxsKSkpO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBNYXRyaXgge1xuICByZXR1cm4gbmV3IEFycmF5KG1hdHJpeFswXS5sZW5ndGgpLmZpbGwoMClcbiAgICAubWFwKChfLCBpKSA9PiAobmV3IFZlY3RvcihtYXRyaXgubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaikgPT4gKG1hdHJpeFtqXVtpXSkpKSk7XG59XG5cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocDogVmVjdG9yLCBxOiBWZWN0b3IsIG11bHRpcGxpZXI6IG51bWJlciA9IDEpOiBWZWN0b3Ige1xuICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcblxuICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuXG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHBbaV0gKyBtdWx0aXBsaWVyICogcVtpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbi8qKlxuICogU3VtcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBiZSBzdW1tZWQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2ZWN0b3IncyBpdGVtcyBzdW0uXG4gKi9cbmZ1bmN0aW9uIGl0ZW1zU3VtKHY6IFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgIHRvdGFsICs9IHZbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1cWFyZXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gc3F1YXJlLlxuICogQHJldHVybiB7VmVjdG9yfSBBIG5ldyB2ZWN0b3IgY29udGFpbmluZyB0aGUgb3JpZ2luYWwncyBpdGVtcyBzcXVhcmVkLlxuICovXG5mdW5jdGlvbiB2ZWN0b3JTcXVhcmUodjogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3Rvckxlbmd0aCh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgc3FyU3VtOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICBzcXJTdW0gKz0gdltpXSAqIHZbaV07XG4gIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvckRvdFByb2R1Y3QodjE6IFZlY3RvciwgdjI6IFZlY3Rvcik6IG51bWJlciB7XG4gIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSB2ZWN0b3JzIG11c3QgbWF0Y2gnKTtcbiAgbGV0IHByb2Q6IG51bWJlciA9IDA7XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKylcbiAgICBwcm9kICs9IHYxW2ldICogdjJbaV07XG4gIHJldHVybiBwcm9kO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xLl0gTWF4IHZhbHVlIGdpdmVuIGJ5IHJhbmRvbSBnZW5lcmF0b3IuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IEEgbmV3IG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSYW5kb21NYXRyaXgoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIHNjYWxlOiBudW1iZXIgPSAxLik6IE1hdHJpeCB7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhkaW1lbnNpb24xLCBkaW1lbnNpb24yKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbWVuc2lvbjE7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UocDogVmVjdG9yLCBxOiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgcmVzdWx0ID0gMDtcbiAgY29uc3QgbGVuID0gcC5sZW5ndGg7XG5cbiAgaWYgKGxlbiAhPT0gcS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZGltZW5zaW9uYWxpdHkgb2YgdGhlIHZlY3RvcnMgbXVzdCBtYXRjaCcpO1xuICBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICByZXN1bHQgKz0gKHBbaV0gLSBxW2ldKSAqKiAyO1xuICBcbiAgcmV0dXJuIE1hdGguc3FydChyZXN1bHQpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgYSBjdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3JzfSBkYXRhIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy5cbiAqIEBwYXJhbSB7RGlzdGFuY2VNZXRyaWN9IGRpc3RhbmNlIEN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge01hdHJpeH0gQ2FsY3VsYXRlZCBjdXN0b20gZGlzdGFuY2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY0Rpc3RhbmNlTWF0cml4KGRhdGE6IFZlY3RvcnMsIGRpc3RhbmNlOiBEaXN0YW5jZU1ldHJpYyk6IE1hdHJpeCB7XG4gIGNvbnN0IG5JdGVtcyA9IGRhdGEubGVuZ3RoO1xuICBjb25zdCBtYXRyaXggPSBpbml0Q29vcmRpbmF0ZXMobkl0ZW1zLCBuSXRlbXMsIDApO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBuSXRlbXM7ICsraikge1xuICAgICAgY29uc3QgZDogbnVtYmVyID0gKGRhdGFbaV0gPT0gbnVsbCkgfHwgKGRhdGFbal0gPT0gbnVsbCkgPyAwIDogZGlzdGFuY2UoZGF0YVtpXSwgZGF0YVtqXSk7XG4gICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbal1baV0gPSBkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWF0cml4O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgYSBjdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3JzfSBkYXRhIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy5cbiAqIEBwYXJhbSB7RGlzdGFuY2VNZXRyaWN9IGRpc3RhbmNlIEN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge01hdHJpeH0gQ2FsY3VsYXRlZCBjdXN0b20gZGlzdGFuY2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY05vcm1hbGl6ZWREaXN0YW5jZU1hdHJpeChkYXRhOiBWZWN0b3JzLCBkaXN0YW5jZTogRGlzdGFuY2VNZXRyaWMpOiBNYXRyaXgge1xuICBjb25zdCBuSXRlbXMgPSBkYXRhLmxlbmd0aDtcbiAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcbiAgbGV0IG1heCA9IE51bWJlci5NSU5fVkFMVUU7XG4gIGxldCBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGk7IGogPCBuSXRlbXM7ICsraikge1xuICAgICAgY29uc3QgZDogbnVtYmVyID0gKGRhdGFbaV0gPT0gbnVsbCkgfHwgKGRhdGFbal0gPT0gbnVsbCB8fCBpID09PSBqKSA/IDAgOiBkaXN0YW5jZShkYXRhW2ldLCBkYXRhW2pdKTtcbiAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtqXVtpXSA9IGQ7XG4gICAgICBpZiAoZCA+IG1heCkgbWF4ID0gZDtcbiAgICAgIGlmIChkIDwgbWluKSBtaW4gPSBkO1xuICAgIH1cbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbkl0ZW1zOyArK2opXG4gICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbal1baV0gPSAobWF0cml4W2ldW2pdIC0gbWluKSAvIChtYXggLSBtaW4pO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKiBHZW5lcmF0ZXMgYXJyYXkgZnJvbSBhIHJhbmdlIFtiZWdpbjsgZW5kXSBvciBbYmVnaW47IGVuZCkgaWYgZW5kRXhjbHVzaXZlLiAqKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5SYW5nZShiZWdpbjogbnVtYmVyLCBlbmQ6IG51bWJlciwgZW5kRXhjbHVzaXZlID0gZmFsc2UpOiBJbnQzMkFycmF5IHtcbiAgY29uc3Qgbkl0ZW1zID0gZW5kIC0gYmVnaW4gKyAoZW5kRXhjbHVzaXZlID8gMCA6IDEpO1xuICBjb25zdCBzZXJpZXMgPSBuZXcgSW50MzJBcnJheShuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpXG4gICAgc2VyaWVzW2ldID0gYmVnaW4gKyBpO1xuXG4gIHJldHVybiBzZXJpZXM7XG59XG5cbi8qKlxuICogUmV0dXJucyBvcmRlciBvZiB2YWx1ZXMgYXMgaWYgdGhleSBhcmUgc29ydGVkLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7YW55W119IHZhbHVlcyBJbnB1dCBhcnJheS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldmVyc2U9ZmFsc2VdIFdoZXRoZXIgdG8gcmV0dXJuIHJldmVyc2VkIG9yZGVyLlxuICogQHJldHVybiB7bnVtYmVyW119IFRoZSBvcmRlciBjb21wdXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFyZ1NvcnQodmFsdWVzOiBhbnlbXSwgcmV2ZXJzZSA9IGZhbHNlKTogbnVtYmVyW10ge1xuICBjb25zdCBzb3J0Zm4gPSByZXZlcnNlID8gKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGJbMF0gLSBhWzBdKSA6IChhOiBhbnlbXSwgYjogYW55W10pID0+IChhWzBdIC0gYlswXSk7XG4gIGNvbnN0IGRlY29yID0gKHY6IGFueSwgaTogbnVtYmVyKSA9PiBbdiwgaV07IC8vIHNldCBpbmRleCB0byB2YWx1ZVxuICBjb25zdCB1bmRlY29yID0gKGE6IGFueVtdKSA9PiBhWzFdOyAvLyBsZWF2ZSBvbmx5IGluZGV4XG4gIGNvbnN0IF9hcmdzb3J0ID0gKGFycjogYW55W10pID0+IGFyci5tYXAoZGVjb3IpLnNvcnQoc29ydGZuKS5tYXAodW5kZWNvcik7XG4gIHJldHVybiBfYXJnc29ydCh2YWx1ZXMpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4ZXMgb2YgdGhlIG1vc3QgZGl2ZXJzZSBvYmplY3RzIGFjY29yZGluZyB0byB0aGUgZGlzdCBmdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCB0b3RhbCBudW1iZXIgb2Ygb2JqZWN0c1xuICogQHBhcmFtIHtudW1iZXJ9IG4gbnVtYmVyIG9mIGRpdmVyc2UgZWxlbWVudHMgdG8gZmluZFxuICogQHBhcmFtIHsoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyfSBkaXN0IGEgZnVuY3Rpb24gd2hpY2ggY2FsY3VsYXRlcyBkaXN0YW5jZSBiZXR3ZWVuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvIG9iamVjdHMgdXNpbmcgdGhlaXIgaW5kZXhlc1xuICogQHJldHVybnMge251bWJlcltdfSBUaGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpdmVyc2VTdWJzZXQobGVuZ3RoOiBudW1iZXIsIG46IG51bWJlciwgZGlzdDogKGkxOiBudW1iZXIsIGkyOiBudW1iZXIpID0+IG51bWJlcik6IG51bWJlcltdIHtcbiAgZnVuY3Rpb24gbWF4QnkodmFsdWVzOiBJdGVyYWJsZUl0ZXJhdG9yPG51bWJlcj4sIG9yZGVyQnk6IChpOiBudW1iZXIpID0+IG51bWJlcikge1xuICAgIGxldCBtYXhWYWx1ZSA9IG51bGw7XG4gICAgbGV0IG1heE9yZGVyQnkgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHZhbHVlcykge1xuICAgICAgY29uc3QgZWxlbWVudE9yZGVyQnkgPSBvcmRlckJ5KGVsZW1lbnQpO1xuICAgICAgaWYgKG1heE9yZGVyQnkgPT0gbnVsbCB8fCBlbGVtZW50T3JkZXJCeSA+IG1heE9yZGVyQnkpIHtcbiAgICAgICAgbWF4VmFsdWUgPSBlbGVtZW50O1xuICAgICAgICBtYXhPcmRlckJ5ID0gZWxlbWVudE9yZGVyQnk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXhWYWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHN1YnNldCA9IFtyYW5kb21JbnQobGVuZ3RoIC0gMSldO1xuICBjb25zdCBjb21wbGVtZW50ID0gbmV3IFNldCgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoIXN1YnNldC5pbmNsdWRlcyhpKSlcbiAgICAgIGNvbXBsZW1lbnQuYWRkKGkpO1xuICB9XG5cbiAgd2hpbGUgKHN1YnNldC5sZW5ndGggPCBuKSB7XG4gICAgY29uc3QgaWR4ID0gbWF4QnkoXG4gICAgICBjb21wbGVtZW50LnZhbHVlcygpIGFzIEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPixcbiAgICAgIChpKSA9PiBNYXRoLm1pbi5hcHBseShNYXRoLCBzdWJzZXQubWFwKGZ1bmN0aW9uKHZhbCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGRpc3QoaSwgdmFsKTtcbiAgICAgIH0pKSk7XG4gICAgaWYgKGlkeCkge1xuICAgICAgc3Vic2V0LnB1c2goaWR4KTtcbiAgICAgIGNvbXBsZW1lbnQuZGVsZXRlKGlkeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdWJzZXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBub3JtYWxpemVkIHZlY3Rvci5cbiAqIFxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3J9IGRhdGEgbnVtZXJpY2FsIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUoZGF0YTogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGg7XG4gIGxldCBzdW0gPSAwO1xuICBsZXQgc3VtT2ZTcXVhcmVzID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgc3VtICs9IGRhdGFbaV07XG4gICAgc3VtT2ZTcXVhcmVzICs9IGRhdGFbaV0gKiogMjtcbiAgfVxuXG4gIGNvbnN0IG1lYW4gPSBzdW0gLyBsZW47XG4gIGNvbnN0IHN0ZERldkludmVyc2UgPSAxLjAgLyBNYXRoLnNxcnQoc3VtT2ZTcXVhcmVzIC8gbGVuIC0gbWVhbiAqKiAyKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pICogc3RkRGV2SW52ZXJzZTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBGaW5kcyBzZXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBsaXN0cy5cbiAqIEBwYXJhbSB7YW55W119IGEgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge2FueVtdfSBiIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge2FueVtdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGlmZmVyZW5jZShhOiBhbnlbXSwgYjogYW55W10pOiBhbnlbXSB7XG4gIGNvbnN0IGJTZXQgPSBuZXcgU2V0KGIpO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGEuZmlsdGVyKCh4KSA9PiAhYlNldC5oYXMoeCkpKS52YWx1ZXMoKSk7XG59XG4iXX0=","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, inverseCommonItemsCount, } 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, NumberArrayMetricsNames } 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 numberArrayDistanceMetrics = {\n [NumberArrayMetricsNames.CommonItems]: inverseCommonItemsCount,\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 [DistanceMetricsSubjects.NumberArray]: {\n [NumberArrayMetricsNames.CommonItems]: numberArrayDistanceMetrics[NumberArrayMetricsNames.CommonItems],\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}\nexport function isNumericMetric(name) {\n return MetricToDataType[name] == DistanceMetricsSubjects.Number.toString();\n}\nexport function isNumberArrayMetric(name) {\n return MetricToDataType[name] == DistanceMetricsSubjects.NumberArray.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 /**\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 true if the metric needs arguments to be calculated.\n * @param {KnownMetrics} method Metric to check if it needs arguments.\n * @return {boolean} True if the metric needs arguments.\n * @memberof Measure\n */\n metricNeedsArgs(method) {\n return isMacroMoleculeMetric(method) || isNumericMetric(method) || isNumberArrayMetric(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 this.metricNeedsArgs(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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWQtbWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInR5cGVkLW1ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsY0FBYyxFQUNkLFlBQVksRUFDWixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZix3QkFBd0IsRUFDeEIsdUJBQXVCLEdBQ3hCLE1BQU0sNkJBQTZCLENBQUM7QUFFckMsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0saURBQWlELENBQUM7QUFHM0YsT0FBTyxFQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDbEcsT0FBTyxFQUFDLHVCQUF1QixFQUFFLG9CQUFvQixFQUNuRCxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFDaEYsdUJBQXVCLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFHM0MsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQXlEO0lBQ2hHLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsMEJBQTBCO0NBQzNELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBeUQ7SUFDaEcsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUTtJQUM3QyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxFQUFFLFdBQVc7SUFDN0MsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxpQkFBaUI7SUFDakQsQ0FBQyxrQkFBa0Is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QUFDLE1BQU0sQ0FBQyxJQUFJLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFDRDs7Ozs7T0FLRztJQUNJLFVBQVUsQ0FBQyxJQUFVO1FBQzFCLE1BQU0sSUFBSSxHQUVOLGdCQUFnQixDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDekYsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLE1BQU0sa0JBQWtCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ25GLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQXFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQW1CLENBQUM7SUFDdkQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQTRCO1FBQzVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sS0FBSyxpQkFBaUI7UUFDMUIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZmwgZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5pbXBvcnQge2phcm9XaW5rbGVyfSBmcm9tICdqYXJvLXdpbmtsZXItdHlwZXNjcmlwdCc7XG5pbXBvcnQge0Rpc3RhbmNlTWV0cmljfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge1xuICBhc3ltbWV0cmljRGlzdGFuY2UsXG4gIGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgY29zaW5lRGlzdGFuY2UsXG4gIGRpY2VEaXN0YW5jZSxcbiAgZXVjbGlkZWFuRGlzdGFuY2UsXG4gIGhhbW1pbmdEaXN0YW5jZSxcbiAga3VsY3p5bnNraURpc3RhbmNlLFxuICBtY0Nvbm5hdWdoZXlEaXN0YW5jZSxcbiAgcm9nb3RHb2xkYmVyZ0Rpc3RhbmNlLFxuICBydXNzZWxEaXN0YW5jZSxcbiAgc29rYWxEaXN0YW5jZSxcbiAgdGFuaW1vdG9EaXN0YW5jZSxcbiAgbnVtZXJpY0Rpc3RhbmNlLFxuICB0YW5pbW90b0Rpc3RhbmNlSW50QXJyYXksXG4gIGludmVyc2VDb21tb25JdGVtc0NvdW50LFxufSBmcm9tICcuLi9kaXN0YW5jZS1tZXRyaWNzLW1ldGhvZHMnO1xuXG5pbXBvcnQge2NhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy92ZWN0b3Itb3BlcmF0aW9ucyc7XG5pbXBvcnQgQml0QXJyYXkgZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvYml0LWFycmF5JztcbmltcG9ydCB7VmVjdG9yLCBTdHJpbmdEaWN0aW9uYXJ5fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge21tRGlzdGFuY2VGdW5jdGlvbnMsIE1tRGlzdGFuY2VGdW5jdGlvbnNOYW1lc30gZnJvbSAnLi4vbWFjcm9tb2xlY3VsZS1kaXN0YW5jZS1mdW5jdGlvbnMnO1xuaW1wb3J0IHtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cywgQml0QXJyYXlNZXRyaWNzTmFtZXMsXG4gIFN0cmluZ01ldHJpY3NOYW1lcywgVmVjdG9yTWV0cmljc05hbWVzLCBOdW1iZXJNZXRyaWNzTmFtZXMsIEludEFycmF5TWV0cmljc05hbWVzLFxuICBOdW1iZXJBcnJheU1ldHJpY3NOYW1lc30gZnJvbSAnLi9jb25zdHMnO1xuXG5cbmV4cG9ydCBjb25zdCB2ZWN0b3JEaXN0YW5jZU1ldHJpY3NNZXRob2RzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogVmVjdG9yLCB5OiBWZWN0b3IpID0+IG51bWJlciB9ID0ge1xuICBbVmVjdG9yTWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGNhbGN1bGF0ZUV1Y2xpZGVhbkRpc3RhbmNlLFxufTtcblxuZXhwb3J0IGNvbnN0IHN0cmluZ0Rpc3RhbmNlTWV0cmljc01ldGhvZHM6IHsgW25hbWU6IHN0cmluZ106ICh4OiBzdHJpbmcsIHk6IHN0cmluZykgPT4gbnVtYmVyIH0gPSB7XG4gIFtTdHJpbmdNZXRyaWNzTmFtZXMuTGV2ZW5zaHRlaW5dOiBmbC5kaXN0YW5jZSxcbiAgW1N0cmluZ01ldHJpY3NOYW1lcy5KYXJvV2lua2xlcl06IGphcm9XaW5rbGVyLFxuICBbU3RyaW5nTWV0cmljc05hbWVzLk1hbmhhdHRhbl06IG1hbmhhdHRhbkRpc3RhbmNlLFxuICBbU3RyaW5nTWV0cmljc05hbWVzLk9uZWhvdF06IGNhdGVnb3JpY2FsRGlzdGFuY2UsXG59O1xuXG5leHBvcnQgY29uc3QgYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzOiB7IFtuYW1lOiBzdHJpbmddOiAoeDogQml0QXJyYXksIHk6IEJpdEFycmF5KSA9PiBudW1iZXIgfSA9IHtcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvXTogdGFuaW1vdG9EaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdOiBkaWNlRGlzdGFuY2UsXG4gIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5Bc3ltbWV0cmljXTogYXN5bW1ldHJpY0Rpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuQnJhdW5CbGFucXVldF06IGJyYXVuQmxhbnF1ZXREaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV06IGNvc2luZURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuS3VsY3p5bnNraV06IGt1bGN6eW5za2lEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLk1jQ29ubmF1Z2hleV06IG1jQ29ubmF1Z2hleURpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ106IHJvZ290R29sZGJlcmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF06IHJ1c3NlbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuU29rYWxdOiBzb2thbERpc3RhbmNlLFxuICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuSGFtbWluZ106IGhhbW1pbmdEaXN0YW5jZSxcbiAgW0JpdEFycmF5TWV0cmljc05hbWVzLkV1Y2xpZGVhbl06IGV1Y2xpZGVhbkRpc3RhbmNlLFxufTtcblxuZXhwb3J0IGNvbnN0IGludEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kczogeyBbbmFtZTogc3RyaW5nXTogKHg6IFVpbnQzMkFycmF5LCB5OiBVaW50MzJBcnJheSkgPT4gbnVtYmVyIH0gPSB7XG4gIFtJbnRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b0ludEFycmF5XTogdGFuaW1vdG9EaXN0YW5jZUludEFycmF5LFxufTtcblxuZXhwb3J0IGNvbnN0IG51bWJlckRpc3RhbmNlTWV0cmljc01ldGhvZHM6IHsgW25hbWU6IHN0cmluZ106IChhcmdzOiBhbnkpID0+ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gbnVtYmVyIH0gPSB7XG4gIFtOdW1iZXJNZXRyaWNzTmFtZXMuRGlmZmVyZW5jZV06IG51bWVyaWNEaXN0YW5jZSxcbn07XG5cbmV4cG9ydCBjb25zdCBudW1iZXJBcnJheURpc3RhbmNlTWV0cmljczpcbnsgW25hbWU6IHN0cmluZ106IChhcmdzOiBhbnkpID0+ICh4OiBBcnJheUxpa2U8bnVtYmVyPiwgeTogQXJyYXlMaWtlPG51bWJlcj4pID0+IG51bWJlciB9ID0ge1xuICBbTnVtYmVyQXJyYXlNZXRyaWNzTmFtZXMuQ29tbW9uSXRlbXNdOiBpbnZlcnNlQ29tbW9uSXRlbXNDb3VudCxcbn07XG5cbmV4cG9ydCBjb25zdCBBdmFpbGFibGVNZXRyaWNzID0ge1xuICBbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuVmVjdG9yXToge1xuICAgIFtWZWN0b3JNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXTogdmVjdG9yRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tWZWN0b3JNZXRyaWNzTmFtZXMuRXVjbGlkZWFuXSxcbiAgfSxcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLlN0cmluZ106IHtcbiAgICBbU3RyaW5nTWV0cmljc05hbWVzLkxldmVuc2h0ZWluXTogc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tTdHJpbmdNZXRyaWNzTmFtZXMuTGV2ZW5zaHRlaW5dLFxuICAgIFtTdHJpbmdNZXRyaWNzTmFtZXMuSmFyb1dpbmtsZXJdOiBzdHJpbmdEaXN0YW5jZU1ldHJpY3NNZXRob2RzW1N0cmluZ01ldHJpY3NOYW1lcy5KYXJvV2lua2xlcl0sXG4gICAgW1N0cmluZ01ldHJpY3NOYW1lcy5NYW5oYXR0YW5dOiBzdHJpbmdEaXN0YW5jZU1ldHJpY3NNZXRob2RzW1N0cmluZ01ldHJpY3NOYW1lcy5NYW5oYXR0YW5dLFxuICAgIFtTdHJpbmdNZXRyaWNzTmFtZXMuT25laG90XTogc3RyaW5nRGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tTdHJpbmdNZXRyaWNzTmFtZXMuT25laG90XSxcbiAgfSxcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLkJpdEFycmF5XToge1xuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b106IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5UYW5pbW90b10sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLkRpY2VdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuRGljZV0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLkFzeW1tZXRyaWNdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuQXN5bW1ldHJpY10sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLkJyYXVuQmxhbnF1ZXRdOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuQnJhdW5CbGFucXVldF0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLkNvc2luZV06IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5Db3NpbmVdLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5LdWxjenluc2tpXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLkt1bGN6eW5za2ldLFxuICAgIFtCaXRBcnJheU1ldHJpY3NOYW1lcy5NY0Nvbm5hdWdoZXldOiBiaXRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbQml0QXJyYXlNZXRyaWNzTmFtZXMuTWNDb25uYXVnaGV5XSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUm9nb3RHb2xkYmVyZ106IGJpdEFycmF5RGlzdGFuY2VNZXRyaWNzTWV0aG9kc1tCaXRBcnJheU1ldHJpY3NOYW1lcy5Sb2dvdEdvbGRiZXJnXSxcbiAgICBbQml0QXJyYXlNZXRyaWNzTmFtZXMuUnVzc2VsXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLlJ1c3NlbF0sXG4gICAgW0JpdEFycmF5TWV0cmljc05hbWVzLlNva2FsXTogYml0QXJyYXlEaXN0YW5jZU1ldHJpY3NNZXRob2RzW0JpdEFycmF5TWV0cmljc05hbWVzLlNva2FsXSxcbiAgfSxcbiAgW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLk1hY3JvTW9sZWN1bGVdOiB7IC8vIG9wdGlvbmFsIGFyZ3MgbmVlZGVkIGZvciBtYWNyb21vbGVjdWxlIGZ1bmN0aW9ucyB3aGljaCBpbml0aWFsaXplIHRoZW1cbiAgICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkhBTU1JTkddOiBtbURpc3RhbmNlRnVuY3Rpb25zW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5IQU1NSU5HXSxcbiAgICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkxFVkVOU0hURUlOXTogbW1EaXN0YW5jZUZ1bmN0aW9uc1tNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTEVWRU5TSFRFSU5dLFxuICAgIFtNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMuTkVFRExFTUFOTl9XVU5TQ0hdOiBtbURpc3RhbmNlRnVuY3Rpb25zW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5ORUVETEVNQU5OX1dVTlNDSF0sXG4gICAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5NT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFXTpcbiAgICAgIG1tRGlzdGFuY2VGdW5jdGlvbnNbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLk1PTk9NRVJfQ0hFTUlDQUxfRElTVEFOQ0VdLFxuICB9LFxuICBbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuTnVtYmVyXToge1xuICAgIFtOdW1iZXJNZXRyaWNzTmFtZXMuRGlmZmVyZW5jZV06IG51bWJlckRpc3RhbmNlTWV0cmljc01ldGhvZHNbTnVtYmVyTWV0cmljc05hbWVzLkRpZmZlcmVuY2VdLFxuICB9LFxuICBbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuSW50QXJyYXldOiB7XG4gICAgW0ludEFycmF5TWV0cmljc05hbWVzLlRhbmltb3RvSW50QXJyYXldOiBpbnRBcnJheURpc3RhbmNlTWV0cmljc01ldGhvZHNbSW50QXJyYXlNZXRyaWNzTmFtZXMuVGFuaW1vdG9JbnRBcnJheV0sXG4gIH0sXG4gIFtEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5OdW1iZXJBcnJheV06IHtcbiAgICBbTnVtYmVyQXJyYXlNZXRyaWNzTmFtZXMuQ29tbW9uSXRlbXNdOiBudW1iZXJBcnJheURpc3RhbmNlTWV0cmljc1tOdW1iZXJBcnJheU1ldHJpY3NOYW1lcy5Db21tb25JdGVtc10sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgTWV0cmljVG9EYXRhVHlwZTogU3RyaW5nRGljdGlvbmFyeSA9IE9iamVjdC5rZXlzKEF2YWlsYWJsZU1ldHJpY3MpXG4gIC5yZWR1Y2UoKHJldDogU3RyaW5nRGljdGlvbmFyeSwga2V5KSA9PiB7XG4gICAgZm9yIChjb25zdCB2YWwgb2YgT2JqZWN0LmtleXMoQXZhaWxhYmxlTWV0cmljc1trZXkgYXMgQXZhaWxhYmxlRGF0YVR5cGVzXSkpXG4gICAgICByZXRbdmFsIGFzIEF2YWlsYWJsZURhdGFUeXBlc10gPSBrZXk7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9LCB7fSk7XG5cbmV4cG9ydCB0eXBlIEF2YWlsYWJsZURhdGFUeXBlcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVNZXRyaWNzO1xuZXhwb3J0IHR5cGUgVmVjdG9yTWV0cmljcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVNZXRyaWNzW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLlZlY3Rvcl07XG5leHBvcnQgdHlwZSBTdHJpbmdNZXRyaWNzID0ga2V5b2YgdHlwZW9mIEF2YWlsYWJsZU1ldHJpY3NbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuU3RyaW5nXTtcbmV4cG9ydCB0eXBlIEJpdEFycmF5TWV0cmljcyA9IGtleW9mIHR5cGVvZiBBdmFpbGFibGVNZXRyaWNzW0Rpc3RhbmNlTWV0cmljc1N1YmplY3RzLkJpdEFycmF5XTtcbmV4cG9ydCB0eXBlIE51bWJlck1ldHJpY3MgPSBrZXlvZiB0eXBlb2YgQXZhaWxhYmxlTWV0cmljc1tEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5OdW1iZXJdO1xuZXhwb3J0IHR5cGUgSW50QXJyYXlNZXRyaWNzID0ga2V5b2YgdHlwZW9mIEF2YWlsYWJsZU1ldHJpY3NbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuSW50QXJyYXldO1xuZXhwb3J0IHR5cGUgTnVtYmVyQXJyYXlNZXRyaWNzID0ga2V5b2YgdHlwZW9mIEF2YWlsYWJsZU1ldHJpY3NbRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuTnVtYmVyQXJyYXldO1xuZXhwb3J0IHR5cGUgS25vd25NZXRyaWNzID0gU3RyaW5nTWV0cmljcyB8IEJpdEFycmF5TWV0cmljcyB8IFZlY3Rvck1ldHJpY3MgfFxuICBNbURpc3RhbmNlRnVuY3Rpb25zTmFtZXMgfCBOdW1iZXJNZXRyaWNzTmFtZXMgfCBJbnRBcnJheU1ldHJpY3NOYW1lcyB8IE51bWJlckFycmF5TWV0cmljc05hbWVzO1xuXG5leHBvcnQgdHlwZSBWYWxpZFR5cGVzID1cbiAgeyBkYXRhOiBzdHJpbmdbXSwgbWV0cmljOiBTdHJpbmdNZXRyaWNzIHwgTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzIH0gfFxuICB7IGRhdGE6IFZlY3RvcltdLCBtZXRyaWM6IFZlY3Rvck1ldHJpY3MgfSB8XG4gIHsgZGF0YTogQml0QXJyYXlbXSwgbWV0cmljOiBCaXRBcnJheU1ldHJpY3MgfSB8XG4gIHsgZGF0YTogbnVtYmVyW10sIG1ldHJpYzogTnVtYmVyTWV0cmljc05hbWVzIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZ01ldHJpYyhuYW1lOiBLbm93bk1ldHJpY3MpIHtcbiAgcmV0dXJuIE1ldHJpY1RvRGF0YVR5cGVbbmFtZV0gPT0gJ1N0cmluZyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0JpdEFycmF5TWV0cmljKG5hbWU6IEtub3duTWV0cmljcykge1xuICByZXR1cm4gTWV0cmljVG9EYXRhVHlwZVtuYW1lXSA9PSAnQml0QXJyYXknO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWZWN0b3JNZXRyaWMobmFtZTogS25vd25NZXRyaWNzKSB7XG4gIHJldHVybiBNZXRyaWNUb0RhdGFUeXBlW25hbWVdID09ICdWZWN0b3InO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNNYWNyb01vbGVjdWxlTWV0cmljKG5hbWU6IEtub3duTWV0cmljcykge1xuICByZXR1cm4gTWV0cmljVG9EYXRhVHlwZVtuYW1lXSA9PSBEaXN0YW5jZU1ldHJpY3NTdWJqZWN0cy5NYWNyb01vbGVjdWxlLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWVyaWNNZXRyaWMobmFtZTogS25vd25NZXRyaWNzKSB7XG4gIHJldHVybiBNZXRyaWNUb0RhdGFUeXBlW25hbWVdID09IERpc3RhbmNlTWV0cmljc1N1YmplY3RzLk51bWJlci50b1N0cmluZygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJBcnJheU1ldHJpYyhuYW1lOiBLbm93bk1ldHJpY3MpIHtcbiAgcmV0dXJuIE1ldHJpY1RvRGF0YVR5cGVbbmFtZV0gPT0gRGlzdGFuY2VNZXRyaWNzU3ViamVjdHMuTnVtYmVyQXJyYXkudG9TdHJpbmcoKTtcbn1cblxuLyoqIE1hbmhhdHRhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzZXF1ZW5jZXMgKG1hdGNoIC0gMCwgbWlzbWF0Y2ggLSAxKSBub3JtYWxpemVkIGZvciBsZW5ndGguICovXG5leHBvcnQgZnVuY3Rpb24gbWFuaGF0dGFuRGlzdGFuY2UoczE6IHN0cmluZywgczI6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmIChzMS5sZW5ndGggIT09IHMyLmxlbmd0aCkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIGxldCBkaXN0OiBudW1iZXIgPSAwO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgczEubGVuZ3RoOyBpKyspXG4gICAgICBkaXN0ICs9IHMxW2ldID09IHMyW2ldID8gMCA6IDE7XG4gICAgcmV0dXJuIGRpc3QgLyBzMS5sZW5ndGg7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3JpY2FsRGlzdGFuY2UoczE6IHN0cmluZywgczI6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBzMSA9PT0gczIgPyAwIDogMTtcbn1cblxuLyoqIFVuaWZpZWQgY2xhc3MgaW1wbGVtZW50aW5nIGRpZmZlcmVudCBzdHJpbmcgbWVhc3VyZXMuICovXG5leHBvcnQgY2xhc3MgTWVhc3VyZSB7XG4gIHByb3RlY3RlZCBtZXRob2Q6IEtub3duTWV0cmljcztcbiAgcHJvdGVjdGVkIGRhdGFUeXBlOiBBdmFpbGFibGVEYXRhVHlwZXM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTWVhc3VyZSB3aXRoIC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCBNZXRob2QgdG8gY2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4gc3RyaW5ncy5cbiAgICogQG1lbWJlcm9mIE1lYXN1cmVyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXRob2Q6IEtub3duTWV0cmljcykge1xuICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgIHRoaXMuZGF0YVR5cGUgPSBNZXRyaWNUb0RhdGFUeXBlW21ldGhvZF0gYXMgQXZhaWxhYmxlRGF0YVR5cGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWV0cmljIG5lZWRzIGFyZ3VtZW50cyB0byBiZSBjYWxjdWxhdGVkLlxuICAgKiBAcGFyYW0ge0tub3duTWV0cmljc30gbWV0aG9kIE1ldHJpYyB0byBjaGVjayBpZiBpdCBuZWVkcyBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIG1ldHJpYyBuZWVkcyBhcmd1bWVudHMuXG4gICAqIEBtZW1iZXJvZiBNZWFzdXJlXG4gICAqL1xuICBwdWJsaWMgbWV0cmljTmVlZHNBcmdzKG1ldGhvZDogS25vd25NZXRyaWNzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzTWFjcm9Nb2xlY3VsZU1ldHJpYyhtZXRob2QpIHx8IGlzTnVtZXJpY01ldHJpYyhtZXRob2QpIHx8IGlzTnVtYmVyQXJyYXlNZXRyaWMobWV0aG9kKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBjdXN0b20gc3RyaW5nIGRpc3RhbmNlIGZ1bmN0aW9uIHNwZWNpZmllZC5cbiAgICogQHBhcmFtIHtvcHRzfSBvcHRzIE9wdGlvbnMgZm9yIHRoZSBtZWFzdXJlLiB1c2VkIGZvciBtYWNyb21vbGVjdWxlIGRpc3RhbmNlc1xuICAgKiBAcmV0dXJuIHtEaXN0YW5jZU1ldHJpY30gQ2FsbGJhY2sgb2YgdGhlIG1lYXN1cmUgY2hvc2VuLlxuICAgKiBAbWVtYmVyb2YgTWVhc3VyZXJcbiAgICovXG4gIHB1YmxpYyBnZXRNZWFzdXJlKG9wdHM/OiBhbnkpOiBEaXN0YW5jZU1ldHJpYyB7XG4gICAgY29uc3QgZGljdDogeyBba2V5OiBzdHJpbmddOlxuICAgICAge1trZXkyOiBzdHJpbmddOiBEaXN0YW5jZU1ldHJpYyB8ICgob3B0czogYW55KSA9PiBEaXN0YW5jZU1ldHJpYyl9XG4gICAgfSA9IEF2YWlsYWJsZU1ldHJpY3M7XG4gICAgaWYgKCFkaWN0Lmhhc093blByb3BlcnR5KHRoaXMuZGF0YVR5cGUpIHx8ICFkaWN0W3RoaXMuZGF0YVR5cGVdLmhhc093blByb3BlcnR5KHRoaXMubWV0aG9kKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtZWFzdXJlICR7dGhpcy5tZXRob2R9IGZvciBkYXRhIHR5cGUgJHt0aGlzLmRhdGFUeXBlfWApO1xuICAgIHJldHVybiB0aGlzLm1ldHJpY05lZWRzQXJncyh0aGlzLm1ldGhvZCkgP1xuICAgICAgKGRpY3RbdGhpcy5kYXRhVHlwZV1bdGhpcy5tZXRob2RdIGFzICgob3B0czogYW55KSA9PiBEaXN0YW5jZU1ldHJpYykpKG9wdHMpIDpcbiAgICAgIGRpY3RbdGhpcy5kYXRhVHlwZV1bdGhpcy5tZXRob2RdIGFzIERpc3RhbmNlTWV0cmljO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY3VzdG9tIHN0cmluZyBkaXN0YW5jZSBieSB0aGUgZ2l2ZW4gZGF0YSB0eXBlLlxuICAgKiBAcGFyYW0ge0F2YWlsYWJsZURhdGFUeXBlc30gZGF0YVR5cGUgTWV0cmljJ3MgZGF0YSB0eXBlXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBNZXRyaWMgbmFtZXMgd2hpY2ggZXhwZWN0cyB0aGUgZ2l2ZW4gZGF0YSB0eXBlXG4gICAqIEBtZW1iZXJvZiBNZWFzdXJlclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRNZXRyaWNCeURhdGFUeXBlKGRhdGFUeXBlOiBBdmFpbGFibGVEYXRhVHlwZXMpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKEF2YWlsYWJsZU1ldHJpY3NbZGF0YVR5cGVdKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIG1ldHJpYyBuYW1lcyBhdmFpbGFibGUuXG4gICAqIEBtZW1iZXJvZiBNZWFzdXJlclxuICAgKi9cbiAgc3RhdGljIGdldCBhdmFpbGFibGVNZWFzdXJlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKEF2YWlsYWJsZU1ldHJpY3MpO1xuICB9XG59XG4iXX0=","import { DistanceAggregationMethods } from './types';\nexport class DistanceMatrixService {\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 await this.calcMulti([values], [fnName], normalize, [opts ?? {}], [1], DistanceAggregationMethods.MANHATTAN);\n }\n async calcMulti(values, fnNames, normalize = true, opts = [{}], weights = [1], aggregationMethod = DistanceAggregationMethods.MANHATTAN) {\n if (values.length < 1)\n throw new Error('values must contain at least one array');\n if (fnNames.length !== values.length || opts.length !== values.length || weights.length !== values.length)\n throw new Error('values, fnNames, weights and opts must have the same length');\n return new Promise(async (resolve, reject) => {\n try {\n const len = values[0].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, fnNames, startRow, startCol, chunckSize: end - start, opts, weights, aggregationMethod });\n promises[i] = new Promise((resolveWorker, rejectWorker) => {\n this._workers[i].onmessage = ({ data: { error, distanceMatrixData, min, max } }) => {\n this._terminateOnComplete && setTimeout(() => 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzdGFuY2UtbWF0cml4LXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaXN0YW5jZS1tYXRyaXgtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQTRCLDBCQUEwQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlFLE1BQU0sT0FBTyxxQkFBcUI7SUFJOUIsWUFBbUIsb0JBQW9CLEdBQUcsSUFBSSxFQUFFLG1CQUFtQixHQUFHLElBQUk7UUFDeEUsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLG1CQUFtQixDQUFDO1FBQ2xELElBQUksQ0FBQyxZQUFZLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDcEQsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLDBCQUEwQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxtQkFBbUIsQ0FBQztJQUNsRCxDQUFDO0lBQUEsQ0FBQztJQUVLLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBc0IsRUFBRSxNQUFvQixFQUM1RCxTQUFTLEdBQUcsSUFBSSxFQUFFLElBQXlCO1FBQzNDLE9BQU8sTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQ3ZELENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsMEJBQTBCLENBQUMs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RUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDekI7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDWDtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFNBQVM7UUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtLbm93bk1ldHJpY3N9IGZyb20gJy4uL3R5cGVkLW1ldHJpY3MnO1xuaW1wb3J0IHtEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kLCBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kc30gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBEaXN0YW5jZU1hdHJpeFNlcnZpY2Uge1xuICAgIHByaXZhdGUgX3dvcmtlcnM6IFdvcmtlcltdO1xuICAgIHByaXZhdGUgX3dvcmtlckNvdW50OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfdGVybWluYXRlT25Db21wbGV0ZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IodXNlQ29uY3VycmVudFdvcmtlcnMgPSB0cnVlLCB0ZXJtaW5hdGVPbkNvbXBsZXRlID0gdHJ1ZSkge1xuICAgICAgY29uc3QgdGhyZWFkQ291bnQgPSBuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeTtcbiAgICAgIHRoaXMuX3dvcmtlckNvdW50ID0gdXNlQ29uY3VycmVudFdvcmtlcnMgPyBNYXRoLm1heCh0aHJlYWRDb3VudCAtIDIsIDEpIDogMTtcbiAgICAgIHRoaXMuX3dvcmtlcnMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpLmZpbGwobnVsbClcbiAgICAgICAgLm1hcCgoKSA9PiBuZXcgV29ya2VyKG5ldyBVUkwoJy4vZGlzdGFuY2UtbWF0cml4LXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcbiAgICAgIHRoaXMuX3Rlcm1pbmF0ZU9uQ29tcGxldGUgPSB0ZXJtaW5hdGVPbkNvbXBsZXRlO1xuICAgIH07XG5cbiAgICBwdWJsaWMgYXN5bmMgY2FsYyh2YWx1ZXM6IEFycmF5TGlrZTxhbnk+LCBmbk5hbWU6IEtub3duTWV0cmljcyxcbiAgICAgIG5vcm1hbGl6ZSA9IHRydWUsIG9wdHM/OiB7W186IHN0cmluZ106IGFueX0pOiBQcm9taXNlPEZsb2F0MzJBcnJheT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsY011bHRpKFt2YWx1ZXNdLCBbZm5OYW1lXSwgbm9ybWFsaXplLFxuICAgICAgICBbb3B0cyA/PyB7fV0sIFsxXSwgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMuTUFOSEFUVEFOKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2FsY011bHRpKFxuICAgICAgdmFsdWVzOiBBcnJheUxpa2U8YW55PltdLCBmbk5hbWVzOiBLbm93bk1ldHJpY3NbXSxcbiAgICAgIG5vcm1hbGl6ZSA9IHRydWUsIG9wdHM6IHtbXzogc3RyaW5nXTogYW55fVtdID0gW3t9XSxcbiAgICAgIHdlaWdodHM6IG51bWJlcltdID0gWzFdLCBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLk1BTkhBVFRBTlxuICAgICk6IFByb21pc2U8RmxvYXQzMkFycmF5PiB7XG4gICAgICBpZiAodmFsdWVzLmxlbmd0aCA8IDEpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndmFsdWVzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgYXJyYXknKTtcbiAgICAgIGlmIChmbk5hbWVzLmxlbmd0aCAhPT0gdmFsdWVzLmxlbmd0aCB8fCBvcHRzLmxlbmd0aCAhPT0gdmFsdWVzLmxlbmd0aCB8fCB3ZWlnaHRzLmxlbmd0aCAhPT0gdmFsdWVzLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2YWx1ZXMsIGZuTmFtZXMsIHdlaWdodHMgYW5kIG9wdHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCcpO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBsZW4gPSB2YWx1ZXNbMF0ubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gbmV3IEFycmF5PFByb21pc2U8dm9pZD4+KHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgICAgICBjb25zdCB0b3RhbExlbmd0aCA9IGxlbiAqIChsZW4gLSAxKSAvIDI7IC8vIHNpemUgb2YgcmVkdWNlZCBkaXN0YW5jZSBtYXRyaXhcbiAgICAgICAgICB0aGlzLl93b3JrZXJDb3VudCA9IE1hdGgubWluKHRoaXMuX3dvcmtlckNvdW50LCB0b3RhbExlbmd0aCk7XG4gICAgICAgICAgY29uc3QgY2h1bmtTaXplID0gdG90YWxMZW5ndGggLyB0aGlzLl93b3JrZXJDb3VudDtcbiAgICAgICAgICBjb25zdCBkaXN0YW5jZU1hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkodG90YWxMZW5ndGgpO1xuICAgICAgICAgIGxldCBlbmRSb3cgPSAwO1xuICAgICAgICAgIGxldCBlbmRDb2wgPSAxO1xuICAgICAgICAgIC8vIG1pbm1heCBmb3Igbm9ybWFsaXphdGlvblxuICAgICAgICAgIGxldCBsbWluID0gMDtcbiAgICAgICAgICBsZXQgbG1heCA9IE51bWJlci5NSU5fVkFMVUU7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl93b3JrZXJDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGguZmxvb3IoaSAqIGNodW5rU2l6ZSk7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSAoaSA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxKSA/IHRvdGFsTGVuZ3RoIDogTWF0aC5mbG9vcigoaSArIDEpICogY2h1bmtTaXplKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0Um93ID0gZW5kUm93O1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRDb2wgPSBlbmRDb2w7XG4gICAgICAgICAgICBpZiAoaSAhPT0gdGhpcy5fd29ya2VyQ291bnQgLSAxKSB7XG4gICAgICAgICAgICAgIC8vIFRoZXNlIGZvcm11bGFzIG1hcCB0aGUgbGluZWFyIGluZGV4IHRvIHRoZSB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeCBpbmRpY2VzXG4gICAgICAgICAgICAgIGVuZFJvdyA9IGxlbiAtIDIgLSBNYXRoLmZsb29yKE1hdGguc3FydCgtOCAqIGVuZCArIDQgKiBsZW4gKiAobGVuIC0gMSkgLSA3KSAvIDIgLSAwLjUpO1xuICAgICAgICAgICAgICBlbmRDb2wgPSBlbmQgLSBsZW4gKiBlbmRSb3cgKyBNYXRoLmZsb29yKChlbmRSb3cgKyAxKSAqIChlbmRSb3cgKyAyKSAvIDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fd29ya2Vyc1tpXS5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAge3ZhbHVlcywgZm5OYW1lcywgc3RhcnRSb3csIHN0YXJ0Q29sLCBjaHVuY2tTaXplOiBlbmQgLSBzdGFydCwgb3B0cywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2R9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcHJvbWlzZXNbaV0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZVdvcmtlciwgcmVqZWN0V29ya2VyKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX3dvcmtlcnNbaV0ub25tZXNzYWdlID0gKHtkYXRhOiB7ZXJyb3IsIGRpc3RhbmNlTWF0cml4RGF0YSwgbWluLCBtYXh9fSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmF0ZU9uQ29tcGxldGUgJiYgc2V0VGltZW91dCgoKSA9PiB0aGlzLl93b3JrZXJzW2ldLnRlcm1pbmF0ZSgpKTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIHJlamVjdFdvcmtlcihlcnJvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGRpc3RhbmNlTWF0cml4LnNldChkaXN0YW5jZU1hdHJpeERhdGEsIHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgIGlmIChtaW4gPCBsbWluKVxuICAgICAgICAgICAgICAgICAgICBsbWluID0gbWluO1xuICAgICAgICAgICAgICAgICAgaWYgKG1heCA+IGxtYXgpXG4gICAgICAgICAgICAgICAgICAgIGxtYXggPSBtYXg7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlV29ya2VyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgICBpZiAobm9ybWFsaXplKVxuICAgICAgICAgICAgZGlzdGFuY2VNYXRyaXguZm9yRWFjaCgodmFsdWUsIGluZGV4KSA9PiB7IGRpc3RhbmNlTWF0cml4W2luZGV4XSA9ICh2YWx1ZSAtIGxtaW4pIC8gKGxtYXggLSBsbWluKTsgfSk7XG4gICAgICAgICAgcmVzb2x2ZShkaXN0YW5jZU1hdHJpeCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB0ZXJtaW5hdGUoKTogdm9pZCB7XG4gICAgICB0aGlzLl93b3JrZXJzLmZvckVhY2goKHdvcmtlcikgPT4gd29ya2VyLnRlcm1pbmF0ZSgpKTtcbiAgICB9XG59XG4iXX0=","/**\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhlYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBMkNILE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBSWpDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUMsT0FBZSxFQUFFLElBQVk7SUFDcEQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUU7UUFDdkMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDbkMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLE1BQU0sSUFBSSxHQUFTLEVBQUUsQ0FBQztJQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixRQUFnQixFQUNoQixRQUFnQixFQUNoQixNQUFnQjtJQUVoQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDakMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLE9BQU8sWUFBWSxFQUFFO1lBQ25CLENBQUMsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN2QyxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNuQixNQUFNLEdBQUcsSUFBSSxDQUFDO29CQUNkLE1BQU07aUJBQ1A7YUFDRjtZQUNELElBQUksQ0FBQyxNQUFNO2dCQUFFLFlBQVksR0FBRyxLQUFLLENBQUM7U0FDbkM7UUFDRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ2Y7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FDdEIsSUFBVSxFQUNWLEdBQVcsRUFDWCxNQUFjLEVBQ2QsS0FBYSxFQUNiLElBQVk7SUFFWixHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLDZCQUE2QjtJQUU3QixJQUFJLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxDQUFDO0lBR1gseUNBQXlDO0lBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3ZDLElBQUksS0FBSyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDdEIsT0FBTyxDQUFDLENBQUM7S0FDWjtJQUVELE9BQU8saUJBQWlCLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLElBQVUsRUFDVixHQUFXLEVBQ1gsTUFBYyxFQUNkLEtBQWEsRUFDYixJQUFZO0lBRVosTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFM0IsSUFBSSxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN0QixPQUFPLENBQUMsQ0FBQztJQUdYLDhCQUE4QjtJQUM5QixPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3BCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDbkIsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUVoQix3RUFBd0U7SUFDeEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsT0FBTyxJQUFJLEVBQUU7UUFDWCxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBRXBCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDckMsSUFBSSxHQUFHLElBQUksVUFBVSxFQUFFO1lBQ3JCLE1BQU07U0FDUDthQUFNLElBQUksR0FBRyxJQUFJLFVBQVUsRUFBRTtZQUM1QixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNO2dCQUN2QixLQUFLLEdBQUcsR0FBRyxDQUFDOztnQkFFWixNQUFNO1NBQ1Q7YUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdkMsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDdkIsS0FBSyxHQUFHLEdBQUcsQ0FBQzs7Z0JBRVosTUFBTTtTQUNUO2FBQU07WUFDTCxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO2dCQUN2QixLQUFLLEdBQUcsR0FBRyxDQUFDOztnQkFFWixNQUFNO1NBQ1Q7UUFFRCxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV4QixDQUFDLEdBQUcsS0FBSyxDQUFDO0tBQ1g7SUFFRCxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3BCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDbkIsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNoQixPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsWUFBa0IsRUFDbEIsU0FBaUIsRUFDakIsVUFBa0IsRUFDbEIsYUFBcUIsRUFDckIsTUFBZ0I7SUFFaEIsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzlELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUMzQixTQUFTO1lBRVgsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM3QyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0MsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUMzQjtLQUNGO0lBQ0QsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQVU7SUFDbkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN2QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRTlDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ25DLE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxLQUFLLENBQUM7WUFFOUIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdEMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUVoQyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDL0M7S0FDRjtJQUNELE9BQU8sRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFFBQVEsQ0FDZixLQUFlLEVBQ2YsS0FBZSxFQUNmLE9BQWUsRUFDZixHQUFXO0lBRVgsT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLEVBQUU7UUFDNUIsTUFBTSxTQUFTLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsTUFBTSxVQUFVLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNqQyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7UUFFZixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQ2hDLElBQUksR0FBRyxTQUFTLENBQUM7UUFFbkIsSUFBSSxVQUFVLEdBQUcsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQ3pELElBQUksR0FBRyxVQUFVLENBQUM7UUFHcEIsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO1lBQ2hCLE1BQU07U0FDUDthQUFNO1lBQ0wsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUVwQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLEdBQUcsR0FBRyxJQUFJLENBQUM7U0FDWjtLQUNGO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFVLEVBQUUsR0FBVztJQUNyRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUUxQixJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUM7SUFDdkIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbkMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUU7WUFDdEMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQixXQUFXLEdBQUcsQ0FBQyxDQUFDO1NBQ2pCO0tBQ0Y7SUFFRCxJQUFJLFdBQVcsSUFBSSxDQUFDLEVBQUU7UUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7S0FDckM7U0FBTTtRQUNMLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FDWDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBKYXZhU2NyaXB0IHJlaW1wbGVtZW50YXRpb24gb2YgVU1BUCAob3JpZ2luYWwgbGljZW5zZSBiZWxvdyksIGZyb21cbiAqIHRoZSBweXRob24gaW1wbGVtZW50YXRpb24gZm91bmQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2xtY2lubmVzL3VtYXAuXG4gKlxuICogQGF1dGhvciBhbmR5Y29lbmVuQGdvb2dsZS5jb20gKEFuZHkgQ29lbmVuKVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIEJTRCAzLUNsYXVzZSBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE3LCBMZWxhbmQgTWNJbm5lc1xuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXG4gKiAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG4gKiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG5pbXBvcnQge1JhbmRvbUZufSBmcm9tICcuL3VtYXAnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCB0eXBlIEhlYXAgPSBudW1iZXJbXVtdW107XG5cbi8qKlxuICogIENvbnN0cnVjdG9yIGZvciB0aGUgaGVhcCBvYmplY3RzLiBUaGUgaGVhcHMgYXJlIHVzZWRcbiAqIGZvciBhcHByb3hpbWF0ZSBuZWFyZXN0IG5laWdoYm9yIHNlYXJjaCwgbWFpbnRhaW5pbmcgYSBsaXN0IG9mIHBvdGVudGlhbFxuICogbmVpZ2hib3JzIHNvcnRlZCBieSB0aGVpciBkaXN0YW5jZS4gV2UgYWxzbyBmbGFnIGlmIHBvdGVudGlhbCBuZWlnaGJvcnNcbiAqIGFyZSBuZXdseSBhZGRlZCB0byB0aGUgbGlzdCBvciBub3QuIEludGVybmFsbHkgdGhpcyBpcyBzdG9yZWQgYXNcbiAqIGEgc2luZ2xlIGFycmF5OyB0aGUgZmlyc3QgYXhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgd2UgYXJlIGxvb2tpbmcgYXQgdGhlXG4gKiBhcnJheSBvZiBjYW5kaWRhdGUgaW5kaWNlcywgdGhlIGFycmF5IG9mIGRpc3RhbmNlcywgb3IgdGhlIGZsYWcgYXJyYXkgZm9yXG4gKiB3aGV0aGVyIGVsZW1lbnRzIGFyZSBuZXcgb3Igbm90LiBFYWNoIG9mIHRoZXNlIGFycmF5cyBhcmUgb2Ygc2hhcGVcbiAqIChgYG5Qb2ludHNgYCwgYGBzaXplYGApXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlSGVhcChuUG9pbnRzOiBudW1iZXIsIHNpemU6IG51bWJlcik6IEhlYXAge1xuICBjb25zdCBtYWtlQXJyYXlzID0gKGZpbGxWYWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIHV0aWxzLmVtcHR5KG5Qb2ludHMpLm1hcCgoKSA9PiB7XG4gICAgICByZXR1cm4gdXRpbHMuZmlsbGVkKHNpemUsIGZpbGxWYWx1ZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgaGVhcDogSGVhcCA9IFtdO1xuICBoZWFwLnB1c2gobWFrZUFycmF5cygtMSkpO1xuICBoZWFwLnB1c2gobWFrZUFycmF5cyhJbmZpbml0eSkpO1xuICBoZWFwLnB1c2gobWFrZUFycmF5cygwKSk7XG4gIHJldHVybiBoZWFwO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIG5fc2FtcGxlcyBtYW55IGludGVnZXJzIGZyb20gMCB0byBwb29sX3NpemUgc3VjaCB0aGF0IG5vXG4gKiBpbnRlZ2VyIGlzIHNlbGVjdGVkIHR3aWNlLiBUaGUgZHVwbGljYXRpb24gY29uc3RyYWludCBpcyBhY2hpZXZlZCB2aWFcbiAqIHJlamVjdGlvbiBzYW1wbGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlamVjdGlvblNhbXBsZShcbiAgblNhbXBsZXM6IG51bWJlcixcbiAgcG9vbFNpemU6IG51bWJlcixcbiAgcmFuZG9tOiBSYW5kb21GblxuKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHV0aWxzLnplcm9zKG5TYW1wbGVzKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuU2FtcGxlczsgaSsrKSB7XG4gICAgbGV0IHJlamVjdFNhbXBsZSA9IHRydWU7XG4gICAgbGV0IGogPSAwO1xuICAgIHdoaWxlIChyZWplY3RTYW1wbGUpIHtcbiAgICAgIGogPSB1dGlscy50YXVSYW5kSW50KHBvb2xTaXplLCByYW5kb20pO1xuICAgICAgbGV0IGJyb2tlbiA9IGZhbHNlO1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBpOyBrKyspIHtcbiAgICAgICAgaWYgKGogPT09IHJlc3VsdFtrXSkge1xuICAgICAgICAgIGJyb2tlbiA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghYnJva2VuKSByZWplY3RTYW1wbGUgPSBmYWxzZTtcbiAgICB9XG4gICAgcmVzdWx0W2ldID0gajtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFB1c2ggYSBuZXcgZWxlbWVudCBvbnRvIHRoZSBoZWFwLiBUaGUgaGVhcCBzdG9yZXMgcG90ZW50aWFsIG5laWdoYm9yc1xuICogZm9yIGVhY2ggZGF0YSBwb2ludC4gVGhlIGBgcm93YGAgcGFyYW1ldGVyIGRldGVybWluZXMgd2hpY2ggZGF0YSBwb2ludCB3ZVxuICogYXJlIGFkZHJlc3NpbmcsIHRoZSBgYHdlaWdodGBgIGRldGVybWluZXMgdGhlIGRpc3RhbmNlIChmb3IgaGVhcCBzb3J0aW5nKSxcbiAqIHRoZSBgYGluZGV4YGAgaXMgdGhlIGVsZW1lbnQgdG8gYWRkLCBhbmQgdGhlIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXNcbiAqIGlzIHRvIGJlIGNvbnNpZGVyZWQgYSBuZXcgYWRkaXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZWFwUHVzaChcbiAgaGVhcDogSGVhcCxcbiAgcm93OiBudW1iZXIsXG4gIHdlaWdodDogbnVtYmVyLFxuICBpbmRleDogbnVtYmVyLFxuICBmbGFnOiBudW1iZXJcbik6IG51bWJlciB7XG4gIHJvdyA9IE1hdGguZmxvb3Iocm93KTtcbiAgY29uc3QgaW5kaWNlcyA9IGhlYXBbMF1bcm93XTtcbiAgY29uc3Qgd2VpZ2h0cyA9IGhlYXBbMV1bcm93XTtcbiAgLy9jb25zdCBpc05ldyA9IGhlYXBbMl1bcm93XTtcblxuICBpZiAod2VpZ2h0ID49IHdlaWdodHNbMF0pXG4gICAgcmV0dXJuIDA7XG5cblxuICAvLyBCcmVhayBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBlbGVtZW50LlxuICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaW5kZXggPT09IGluZGljZXNbaV0pXG4gICAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiB1bmNoZWNrZWRIZWFwUHVzaChoZWFwLCByb3csIHdlaWdodCwgaW5kZXgsIGZsYWcpO1xufVxuXG4vKipcbiAqIFB1c2ggYSBuZXcgZWxlbWVudCBvbnRvIHRoZSBoZWFwLiBUaGUgaGVhcCBzdG9yZXMgcG90ZW50aWFsIG5laWdoYm9yc1xuICogZm9yIGVhY2ggZGF0YSBwb2ludC4gVGhlIGBgcm93YGAgcGFyYW1ldGVyIGRldGVybWluZXMgd2hpY2ggZGF0YSBwb2ludCB3ZVxuICogYXJlIGFkZHJlc3NpbmcsIHRoZSBgYHdlaWdodGBgIGRldGVybWluZXMgdGhlIGRpc3RhbmNlIChmb3IgaGVhcCBzb3J0aW5nKSxcbiAqIHRoZSBgYGluZGV4YGAgaXMgdGhlIGVsZW1lbnQgdG8gYWRkLCBhbmQgdGhlIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXNcbiAqIGlzIHRvIGJlIGNvbnNpZGVyZWQgYSBuZXcgYWRkaXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmNoZWNrZWRIZWFwUHVzaChcbiAgaGVhcDogSGVhcCxcbiAgcm93OiBudW1iZXIsXG4gIHdlaWdodDogbnVtYmVyLFxuICBpbmRleDogbnVtYmVyLFxuICBmbGFnOiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IGluZGljZXMgPSBoZWFwWzBdW3Jvd107XG4gIGNvbnN0IHdlaWdodHMgPSBoZWFwWzFdW3Jvd107XG4gIGNvbnN0IGlzTmV3ID0gaGVhcFsyXVtyb3ddO1xuXG4gIGlmICh3ZWlnaHQgPj0gd2VpZ2h0c1swXSlcbiAgICByZXR1cm4gMDtcblxuXG4gIC8vIEluc2VydCB2YWwgYXQgcG9zaXRpb24gemVyb1xuICB3ZWlnaHRzWzBdID0gd2VpZ2h0O1xuICBpbmRpY2VzWzBdID0gaW5kZXg7XG4gIGlzTmV3WzBdID0gZmxhZztcblxuICAvLyBEZXNjZW5kIHRoZSBoZWFwLCBzd2FwcGluZyB2YWx1ZXMgdW50aWwgdGhlIG1heCBoZWFwIGNyaXRlcmlvbiBpcyBtZXRcbiAgbGV0IGkgPSAwO1xuICBsZXQgaVN3YXAgPSAwO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGljMSA9IDIgKiBpICsgMTtcbiAgICBjb25zdCBpYzIgPSBpYzEgKyAxO1xuXG4gICAgY29uc3QgaGVhcFNoYXBlMiA9IGhlYXBbMF1bMF0ubGVuZ3RoO1xuICAgIGlmIChpYzEgPj0gaGVhcFNoYXBlMikge1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmIChpYzIgPj0gaGVhcFNoYXBlMikge1xuICAgICAgaWYgKHdlaWdodHNbaWMxXSA+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 constructor(rows, cols, values, dims) {\n this.entries = new Map();\n this.nRows = 0;\n this.nCols = 0;\n if (rows.length !== cols.length || rows.length !== values.length) {\n throw new Error('rows, cols and values arrays must all have the same length');\n }\n // 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0cml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWF0cml4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVILE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBSWpDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFNdkIsWUFDRSxJQUEyQixFQUMzQixJQUEyQixFQUMzQixNQUErQixFQUMvQixJQUFjO1FBVFIsWUFBTyxHQUFHLElBQUksR0FBRyxFQUFpQixDQUFDO1FBRWxDLFVBQUssR0FBVyxDQUFDLENBQUM7UUFDbEIsVUFBSyxHQUFXLENBQUMsQ0FBQztRQVF6QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDaEUsTUFBTSxJQUFJLEtBQUssQ0FDYiw0REFBNEQsQ0FDN0QsQ0FBQztTQUNIO1FBRUQsb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDekIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxH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RyxDQUFDLENBQUMsQ0FBQztJQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN2QyxNQUFNLEVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSxHQUFHLEtBQUssVUFBVSxFQUFFO1lBQ3RCLFVBQVUsR0FBRyxHQUFHLENBQUM7WUFDakIsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoQjtRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNwQjtJQUVELE9BQU8sRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBQyxDQUFDO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcblxudHlwZSBFbnRyeSA9IHsgdmFsdWU6IG51bWJlcjsgcm93OiBudW1iZXI7IGNvbDogbnVtYmVyIH07XG5cbi8qKlxuICogSW50ZXJuYWwgMi1kaW1lbnNpb25hbCBzcGFyc2UgbWF0cml4IGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBTcGFyc2VNYXRyaXgge1xuICBwcml2YXRlIGVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgRW50cnk+KCk7XG5cbiAgcmVhZG9ubHkgblJvd3M6IG51bWJlciA9IDA7XG4gIHJlYWRvbmx5IG5Db2xzOiBudW1iZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJvd3M6IG51bWJlcltdIHwgSW50MzJBcnJheSxcbiAgICBjb2xzOiBudW1iZXJbXSB8IEludDMyQXJyYXksXG4gICAgdmFsdWVzOiBudW1iZXJbXSB8IEZsb2F0MzJBcnJheSxcbiAgICBkaW1zOiBudW1iZXJbXVxuICApIHtcbiAgICBpZiAocm93cy5sZW5ndGggIT09IGNvbHMubGVuZ3RoIHx8IHJvd3MubGVuZ3RoICE9PSB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdyb3dzLCBjb2xzIGFuZCB2YWx1ZXMgYXJyYXlzIG11c3QgYWxsIGhhdmUgdGhlIHNhbWUgbGVuZ3RoJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBBc3NlcnQgdGhhdCBkaW1zIGFyZSBsZWdpdC5cbiAgICB0aGlzLm5Sb3dzID0gZGltc1swXTtcbiAgICB0aGlzLm5Db2xzID0gZGltc1sxXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgcm93ID0gcm93c1tpXTtcbiAgICAgIGNvbnN0IGNvbCA9IGNvbHNbaV07XG4gICAgICB0aGlzLmNoZWNrRGltcyhyb3csIGNvbCk7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLm1ha2VLZXkocm93LCBjb2wpO1xuICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHt2YWx1ZTogdmFsdWVzW2ldLCByb3csIGNvbH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWFrZUtleShyb3c6IG51bWJlciwgY29sOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtyb3d9OiR7Y29sfWA7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRGltcyhyb3c6IG51bWJlciwgY29sOiBudW1iZXIpIHtcbiAgICBjb25zdCB3aXRoaW5Cb3VuZHMgPSByb3cgPCB0aGlzLm5Sb3dzICYmIGNvbCA8IHRoaXMubkNvbHM7XG4gICAgaWYgKCF3aXRoaW5Cb3VuZHMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JvdyBhbmQvb3IgY29sIHNwZWNpZmllZCBvdXRzaWRlIG9mIG1hdHJpeCBkaW1lbnNpb25zJyk7XG4gIH1cblxuICBzZXQocm93OiBudW1iZXIsIGNvbDogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5jaGVja0RpbXMocm93LCBjb2wpO1xuICAgIGNvbnN0IGtleSA9IHRoaXMubWFrZUtleShyb3csIGNvbCk7XG4gICAgaWYgKCF0aGlzLmVudHJpZXMuaGFzKGtleSkpXG4gICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwge3ZhbHVlLCByb3csIGNvbH0pO1xuICAgIGVsc2VcbiAgICAgIHRoaXMuZW50cmllcy5nZXQoa2V5KSEudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldChyb3c6IG51bWJlciwgY29sOiBudW1iZXIsIGRlZmF1bHRWYWx1ZSA9IDApIHtcbiAgICAvL3RoaXMuY2hlY2tEaW1zKHJvdywgY29sKTtcbiAgICBjb25zdCBrZXkgPSB0aGlzLm1ha2VLZXkocm93LCBjb2wpO1xuICAgIGlmICh0aGlzLmVudHJpZXMuaGFzKGtleSkpXG4gICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmdldChrZXkpIS52YWx1ZTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgZ2V0QWxsKG9yZGVyZWQgPSB0cnVlKTogeyB2YWx1ZTogbnVtYmVyOyByb3c6IG51bWJlcjsgY29sOiBudW1iZXIgfVtdIHtcbiAgICBjb25zdCByb3dDb2xWYWx1ZXM6IEVudHJ5W10gPSBuZXcgQXJyYXkodGhpcy5lbnRyaWVzLnNpemUpLmZpbGwobnVsbCk7XG4gICAgbGV0IGkgPSAwO1xuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgcm93Q29sVmFsdWVzW2krK10gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICBpZiAob3JkZXJlZCkge1xuICAgICAgLy8gT3JkZXJpbmcgdGhlIHJlc3VsdCBpc24ndCByZXF1aXJlZCBmb3IgcHJvY2Vzc2luZyBidXQgaXQgZG9lcyBtYWtlIGl0IGVhc2llciB0byB3cml0ZSB0ZXN0c1xuICAgICAgcm93Q29sVmFsdWVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGEucm93ID09PSBiLnJvdylcbiAgICAgICAgICByZXR1cm4gYS5jb2wgLSBiLmNvbDtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJldHVybiBhLnJvdyAtIGIucm93O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByb3dDb2xWYWx1ZXM7XG4gIH1cblxuICBnZXREaW1zKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gW3RoaXMublJvd3MsIHRoaXMubkNvbHNdO1xuICB9XG5cbiAgZ2V0Um93cygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLCAoW19rZXksIHZhbHVlXSkgPT4gdmFsdWUucm93KTtcbiAgICAvLyByZXR1cm4gdGhpcy5yb3dzIGFzIHVua25vd24gYXMgbnVtYmVyW107XG4gIH1cblxuICBnZXRDb2xzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMsIChbX2tleSwgdmFsdWVdKSA9PiB2YWx1ZS5jb2wpO1xuICAgIC8vIHJldHVybiB0aGlzLmNvbHMgYXMgdW5rbm93biBhcyBudW1iZXJbXTtcbiAgfVxuXG4gIGdldFZhbHVlcygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLCAoW19rZXksIHZhbHVlXSkgPT4gdmFsdWUudmFsdWUpO1xuICAvL3JldHVybiB0aGlzLnZhbHVlcyBhcyB1bmtub3duIGFzIG51bWJlcltdO1xuICB9XG5cbiAgZm9yRWFjaChmbjogKHZhbHVlOiBudW1iZXIsIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKCh2YWx1ZSkgPT4gZm4odmFsdWUudmFsdWUsIHZhbHVlLnJvdywgdmFsdWUuY29sKSk7XG4gIH1cblxuICBtYXAoZm46ICh2YWx1ZTogbnVtYmVyLCByb3c6IG51bWJlciwgY29sOiBudW1iZXIpID0+IG51bWJlcik6IFNwYXJzZU1hdHJpeCB7XG4gICAgY29uc3QgdmFscyA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5lbnRyaWVzLnNpemUpO1xuICAgIGxldCBpID0gMDtcbiAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgIHZhbHNbaSsrXSA9IGZuKHZhbHVlLnZhbHVlLCB2YWx1ZS5yb3csIHZhbHVlLmNvbCk7XG4gICAgfSk7XG4gICAgY29uc3QgZGltcyA9IFt0aGlzLm5Sb3dzLCB0aGlzLm5Db2xzXTtcbiAgICByZXR1cm4gbmV3IFNwYXJzZU1hdHJpeCh0aGlzLmdldFJvd3MoKSwgdGhpcy5nZXRDb2xzKCksIHZhbHMgYXMgdW5rbm93biBhcyBudW1iZXJbXSwgZGltcyk7XG4gIH1cblxuICB0b0FycmF5KCkge1xuICAgIGNvbnN0IHJvd3M6IHVuZGVmaW5lZFtdID0gdXRpbHMuZW1wdHkodGhpcy5uUm93cyk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcm93cy5tYXAoKCkgPT4ge1xuICAgICAgcmV0dXJuIHV0aWxzLnplcm9zKHRoaXMubkNvbHMpO1xuICAgIH0pO1xuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgb3V0cHV0W3ZhbHVlLnJvd11bdmFsdWUuY29sXSA9IHZhbHVlLnZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFuc3Bvc2UgYSBzcGFyc2UgbWF0cml4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2UobWF0cml4OiBTcGFyc2VNYXRyaXgpOiBTcGFyc2VNYXRyaXgge1xuICBjb25zdCBvbGRSb3dzID0gbWF0cml4LmdldFJvd3MoKTtcbiAgY29uc3Qgb2xkQ29scyA9IG1hdHJpeC5nZXRDb2xzKCk7XG4gIGNvbnN0IG9sZFZhbHMgPSBtYXRyaXguZ2V0VmFsdWVzKCk7XG4gIGNvbnN0IG1hdGxlbiA9IG9sZENvbHMubGVuZ3RoO1xuICBjb25zdCBjb2xzID0gbmV3IEludDMyQXJyYXkobWF0bGVuKTtcbiAgY29uc3Qgcm93cyA9IG5ldyBJbnQzMkFycmF5KG1hdGxlbik7XG4gIGNvbnN0IHZhbHMgPSBuZXcgRmxvYXQzMkFycmF5KG1hdGxlbik7XG5cbiAgY29scy5zZXQob2xkUm93cyk7XG4gIHJvd3Muc2V0KG9sZENvbHMpO1xuICB2YWxzLnNldChvbGRWYWxzKTtcbiAgY29uc3QgZGltcyA9IFttYXRyaXgubkNvbHMsIG1hdHJpeC5uUm93c107XG4gIHJldHVybiBuZXcgU3BhcnNlTWF0cml4KHJvd3MsIGNvbHMsIHZhbHMsIGRpbXMpO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBhIHNwYXJzZSBpZGVudGl0eSBtYXRyaXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KHNpemU6IG51bWJlcltdKTogU3BhcnNlTWF0cml4IHtcbiAgY29uc3QgW3Jvd3NdID0gc2l6ZTtcbiAgY29uc3QgbWF0cml4ID0gbmV3IFNwYXJzZU1hdHJpeChbXSwgW10sIFtdLCBzaXplKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzOyBpKyspXG4gICAgbWF0cml4LnNldChpLCBpLCAxKTtcblxuICByZXR1cm4gbWF0cml4O1xufVxuXG4vKipcbiAqIEVsZW1lbnQtd2lzZSBtdWx0aXBsaWNhdGlvbiBvZiB0d28gbWF0cmljZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhaXJ3aXNlTXVsdGlwbHkoXG4gIGE6IFNwYXJzZU1hdHJpeCxcbiAgYjogU3BhcnNlTWF0cml4XG4pOiBTcGFyc2VNYXRyaXgge1xuICByZXR1cm4gZWxlbWVudFdpc2UoYSwgYiwgKHgsIHkpID0+IHggKiB5KTtcbn1cblxuLyoqXG4gKiBFbGVtZW50LXdpc2UgYWRkaXRpb24gb2YgdHdvIG1hdHJpY2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGQoYTogU3BhcnNlTWF0cml4LCBiOiBTcGFyc2VNYXRyaXgpOiBTcGFyc2VNYXRyaXgge1xuICByZXR1cm4gZWxlbWVudFdpc2UoYSwgYiwgKHgsIHkpID0+IHggKyB5KTtcbn1cblxuLyoqXG4gKiBFbGVtZW50LXdpc2Ugc3VidHJhY3Rpb24gb2YgdHdvIG1hdHJpY2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChhOiBTcGFyc2VNYXRyaXgsIGI6IFNwYXJzZU1hdHJpeCk6IFNwYXJzZU1hdHJpeCB7XG4gIHJldHVybiBlbGVtZW50V2lzZShhLCBiLCAoeCwgeSkgPT4geCAtIHkpO1xufVxuXG4vKipcbiAqIEVsZW1lbnQtd2lzZSBtYXhpbXVtIG9mIHR3byBtYXRyaWNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4aW11bShhOiBTcGFyc2VNYXRyaXgsIGI6IFNwYXJzZU1hdHJpeCk6IFNwYXJzZU1hdHJpeCB7XG4gIHJldHVybiBlbGVtZW50V2lzZShhLCBiLCAoeCwgeSkgPT4gKHggPiB5ID8geCA6IHkpKTtcbn1cblxuLyoqXG4gKiBTY2FsYXIgbXVsdGlwbGljYXRpb24gb2YgdHdvIG1hdHJpY2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcihhOiBTcGFyc2VNYXRyaXgsIHNjYWxhcjogbnVtYmVyKTogU3BhcnNlTWF0cml4IHtcbiAgcmV0dXJuIGEubWFwKCh2YWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlICogc2NhbGFyO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IG1hdHJpeCB3aXRoIHplcm8gZW50cmllcyByZW1vdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZWxpbWluYXRlWmVyb3MobTogU3BhcnNlTWF0cml4KSB7XG4gIGNvbnN0IHplcm9JbmRpY2VzID0gbmV3IFNldCgpO1xuICBjb25zdCB2YWx1ZXMgPSBtLmdldFZhbHVlcygpO1xuICBjb25zdCByb3dzID0gbS5nZXRSb3dzKCk7XG4gIGNvbnN0IGNvbHMgPSBtLmdldENvbHMoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodmFsdWVzW2ldID09PSAwKVxuICAgICAgemVyb0luZGljZXMuYWRkKGkpO1xuICB9XG4gIGNvbnN0IHJlbW92ZUJ5WmVyb0luZGV4ID0gKF86IGFueSwgaW5kZXg6IG51bWJlcikgPT4gIXplcm9JbmRpY2VzLmhhcyhpbmRleCk7XG4gIGNvbnN0IG5leHRWYWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHJlbW92ZUJ5WmVyb0luZGV4KTtcbiAgY29uc3QgbmV4dFJvd3MgPSByb3dzLmZpbHRlcihyZW1vdmVCeVplcm9JbmRleCk7XG4gIGNvbnN0IG5leHRDb2xzID0gY29scy5maWx0ZXIocmVtb3ZlQnlaZXJvSW5kZXgpO1xuXG4gIHJldHVybiBuZXcgU3BhcnNlTWF0cml4KG5leHRSb3dzLCBuZXh0Q29scywgbmV4dFZhbHVlcywgbS5nZXREaW1zKCkpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6YXRpb24gb2YgYSBzcGFyc2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG06IFNwYXJzZU1hdHJpeCwgbm9ybVR5cGUgPSBOb3JtVHlwZS5sMikge1xuICBjb25zdCBub3JtRm4gPSBub3JtRm5zW25vcm1UeXBlXTtcblxuICBjb25zdCBjb2xzQnlSb3cgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyW10+KCk7XG4gIG0uZm9yRWFjaCgoXywgcm93LCBjb2wpID0+IHtcbiAgICBjb25zdCBjb2xzID0gY29sc0J5Um93LmdldChyb3cpIHx8IFtdO1xuICAgIGNvbHMucHVzaChjb2wpO1xuICAgIGNvbHNCeVJvdy5zZXQocm93LCBjb2xzKTtcbiAgfSk7XG5cbiAgY29uc3QgbmV4dE1hdHJpeCA9IG5ldyBTcGFyc2VNYXRyaXgoW10sIFtdLCBbXSwgbS5nZXREaW1zKCkpO1xuXG4gIGZvciAoY29uc3Qgcm93IG9mIGNvbHNCeVJvdy5rZXlzKCkpIHtcbiAgICBjb25zdCBjb2xzID0gY29sc0J5Um93LmdldChyb3cpIS5zb3J0KCk7XG5cbiAgICBjb25zdCB2YWxzID0gY29scy5tYXAoKGNvbCkgPT4gbS5nZXQocm93LCBjb2wpKTtcbiAgICBjb25zdCBub3JtID0gbm9ybUZuKHZhbHMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9ybS5sZW5ndGg7IGkrKylcbiAgICAgIG5leHRNYXRyaXguc2V0KHJvdywgY29sc1tpXSwgbm9ybVtpXSk7XG4gIH1cblxuICByZXR1cm4gbmV4dE1hdHJpeDtcbn1cblxuLyoqXG4gKiBWZWN0b3Igbm9ybWFsaXphdGlvbiBmdW5jdGlvbnNcbiAqL1xudHlwZSBOb3JtRm5zID0geyBba2V5IGluIE5vcm1UeXBlXTogKHY6IG51bWJlcltdKSA9PiBudW1iZXJbXSB9O1xuY29uc3Qgbm9ybUZuczogTm9ybUZucyA9IHtcbiAgW05vcm1UeXBlLm1heF06ICh4czogbnVtYmVyW10pID0+IHtcbiAgICBsZXQgbWF4ID0gLUluZmluaXR5O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspXG4gICAgICBtYXggPSB4c1tpXSA+IG1heCA/IHhzW2ldIDogbWF4O1xuXG4gICAgcmV0dXJuIHhzLm1hcCgoeCkgPT4geCAvIG1heCk7XG4gIH0sXG4gIFtOb3JtVHlwZS5sMV06ICh4czogbnVtYmVyW10pID0+IHtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKVxuICAgICAgc3VtICs9IHhzW2ldO1xuXG4gICAgcmV0dXJuIHhzLm1hcCgoeCkgPT4geCAvIHN1bSk7XG4gIH0sXG4gIFtOb3JtVHlwZS5sMl06ICh4czogbnVtYmVyW10pID0+IHtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKVxuICAgICAgc3VtICs9IHhzW2ldICoqIDI7XG5cbiAgICByZXR1cm4geHMubWFwKCh4KSA9PiBNYXRoLnNxcnQoeCAqKiAyIC8gc3VtKSk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgZW51bSBOb3JtVHlwZSB7XG4gIG1heCA9ICdtYXgnLFxuICBsMSA9ICdsMScsXG4gIGwyID0gJ2wyJyxcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGVsZW1lbnQtd2lzZSBvcGVyYXRpb25zLlxuICovXG5mdW5jdGlvbiBlbGVtZW50V2lzZShcbiAgYTogU3BhcnNlTWF0cml4LFxuICBiOiBTcGFyc2VNYXRyaXgsXG4gIG9wOiAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IG51bWJlclxuKTogU3BhcnNlTWF0cml4IHtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCByb3dzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBjb2xzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB2YWxzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGNvbnN0IG9wZXJhdGUgPSAocm93OiBudW1iZXIsIGNvbDogbnVtYmVyKSA9PiB7XG4gICAgcm93cy5wdXNoKHJvdyk7XG4gICAgY29scy5wdXNoKGNvbCk7XG4gICAgY29uc3QgbmV4dFZhbHVlID0gb3AoYS5nZXQocm93LCBjb2wpLCBiLmdldChyb3csIGNvbCkpO1xuICAgIHZhbHMucHVzaChuZXh0VmFsdWUpO1xuICB9O1xuICBjb25zdCB2YWx1ZXNBID0gYS5nZXRWYWx1ZXMoKTtcbiAgY29uc3Qgcm93c0EgPSBhLmdldFJvd3MoKTtcbiAgY29uc3QgY29sc0EgPSBhLmdldENvbHMoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXNBLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgcm93ID0gcm93c0FbaV07XG4gICAgY29uc3QgY29sID0gY29sc0FbaV07XG4gICAgY29uc3Qga2V5ID0gYCR7cm93fToke2NvbH1gO1xuICAgIHZpc2l0ZWQuYWRkKGtleSk7XG4gICAgb3BlcmF0ZShyb3csIGNvbCk7XG4gIH1cblxuICBjb25zdCB2YWx1ZXNCID0gYi5nZXRWYWx1ZXMoKTtcbiAgY29uc3Qgcm93c0IgPSBiLmdldFJvd3MoKTtcbiAgY29uc3QgY29sc0IgPSBiLmdldENvbHMoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXNCLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgcm93ID0gcm93c0JbaV07XG4gICAgY29uc3QgY29sID0gY29sc0JbaV07XG4gICAgY29uc3Qga2V5ID0gYCR7cm93fToke2NvbH1gO1xuICAgIGlmICh2aXNpdGVkLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICBvcGVyYXRlKHJvdywgY29sKTtcbiAgfVxuXG4gIGNvbnN0IGRpbXMgPSBbYS5uUm93cywgYS5uQ29sc107XG4gIHJldHVybiBuZXcgU3BhcnNlTWF0cml4KHJvd3MsIGNvbHMsIHZhbHMsIGRpbXMpO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiBmb3IgZ2V0dGluZyBkYXRhLCBpbmRpY2VzLCBhbmQgaW5wdHIgYXJyYXlzIGZyb20gYSBzcGFyc2VcbiAqIG1hdHJpeCB0byBmb2xsb3cgY3NyIG1hdHJpeCBjb252ZW50aW9ucy4gU3VwZXIgaW5lZmZpY2llbnQgKGFuZCBraW5kIG9mXG4gKiBkZWZlYXRzIHRoZSBwdXJwb3NlIG9mIHRoaXMgY29udmVudGlvbikgYnV0IGEgbG90IG9mIHRoZSBwb3J0ZWQgcHl0aG9uIHRyZWVcbiAqIHNlYXJjaCBsb2dpYyBkZXBlbmRzIG9uIHRoaXMgZGF0YSBmb3JtYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDU1IoeDogU3BhcnNlTWF0cml4KSB7XG4gIGNvbnN0IGVudHJpZXM6IEVudHJ5W10gPSBbXTtcblxuICB4LmZvckVhY2goKHZhbHVlLCByb3csIGNvbCkgPT4ge1xuICAgIGVudHJpZXMucHVzaCh7dmFsdWUsIHJvdywgY29sfSk7XG4gIH0pO1xuXG4gIGVudHJpZXMuc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLnJvdyA9PT0gYi5yb3cpXG4gICAgICByZXR1cm4gYS5jb2wgLSBiLmNvbDtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gYS5yb3cgLSBiLnJvdztcbiAgfSk7XG5cbiAgY29uc3QgaW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgdmFsdWVzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBpbmRwdHI6IG51bWJlcltdID0gW107XG5cbiAgbGV0IGN1cnJlbnRSb3cgPSAtMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qge3JvdywgY29sLCB2YWx1ZX0gPSBlbnRyaWVzW2ldO1xuICAgIGlmIChyb3cgIT09IGN1cnJlbnRSb3cpIHtcbiAgICAgIGN1cnJlbnRSb3cgPSByb3c7XG4gICAgICBpbmRwdHIucHVzaChpKTtcbiAgICB9XG4gICAgaW5kaWNlcy5wdXNoKGNvbCk7XG4gICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIHtpbmRpY2VzLCB2YWx1ZXMsIGluZHB0cn07XG59XG4iXX0=","/**\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 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE9BQU8sS0FBSyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBZWpDLE1BQU0sT0FBTyxRQUFRO0lBQ25CLFlBQ1MsV0FBcUIsRUFDckIsT0FBaUIsRUFDakIsUUFBb0IsRUFDcEIsT0FBbUI7UUFIbkIsZ0JBQVcsR0FBWCxXQUFXLENBQVU7UUFDckIsWUFBTyxHQUFQLE9BQU8sQ0FBVTtRQUNqQixhQUFRLEdBQVIsUUFBUSxDQUFZO1FBQ3BCLFlBQU8sR0FBUCxPQUFPLENBQVk7SUFDekIsQ0FBQztDQUNMO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUN4QixJQUFZLEVBQ1osVUFBa0IsRUFDbEIsTUFBYyxFQUNkLE1BQWdCO0lBRWhCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRTFDLE1BQU0sS0FBSyxHQUFHLEtBQUs7U0FDaEIsS0FBSyxDQUFDLE1BQU0sQ0FBQztTQUNiLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUVoRSxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxRQUFRLENBQ2YsSUFBWSxFQUNaLFFBQVEsR0FBRyxFQUFF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LEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogVGhpcyBpcyBhIEphdmFTY3JpcHQgcmVpbXBsZW1lbnRhdGlvbiBvZiBVTUFQIChvcmlnaW5hbCBsaWNlbnNlIGJlbG93KSwgZnJvbVxuICogdGhlIHB5dGhvbiBpbXBsZW1lbnRhdGlvbiBmb3VuZCBhdCBodHRwczovL2dpdGh1Yi5jb20vbG1jaW5uZXMvdW1hcC5cbiAqXG4gKiBAYXV0aG9yIGFuZHljb2VuZW5AZ29vZ2xlLmNvbSAoQW5keSBDb2VuZW4pXG4gKi9cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQlNEIDMtQ2xhdXNlIExpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcsIExlbGFuZCBNY0lubmVzXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tXG4gKiAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRVxuICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUxcbiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SXG4gKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUlxuICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSxcbiAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtSYW5kb21GbiwgVmVjdG9yfSBmcm9tICcuL3VtYXAnO1xuXG4vKipcbiAqIFRyZWUgZnVuY3Rpb25hbGl0eSBmb3IgYXBwcm94aW1hdGluZyBuZWFyZXN0IG5laWdoYm9yc1xuICovXG5pbnRlcmZhY2UgUmFuZG9tUHJvamVjdGlvblRyZWVOb2RlIHtcbiAgaXNMZWFmOiBib29sZWFuO1xuICBpbmRpY2VzPzogbnVtYmVyW107XG4gIGxlZnRDaGlsZD86IFJhbmRvbVByb2plY3Rpb25UcmVlTm9kZTtcbiAgcmlnaHRDaGlsZD86IFJhbmRvbVByb2plY3Rpb25UcmVlTm9kZTtcbiAgaHlwZXJwbGFuZT86IG51bWJlcjtcbiAgb2Zmc2V0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgRmxhdFRyZWUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaHlwZXJwbGFuZXM6IG51bWJlcltdLFxuICAgIHB1YmxpYyBvZmZzZXRzOiBudW1iZXJbXSxcbiAgICBwdWJsaWMgY2hpbGRyZW46IG51bWJlcltdW10sXG4gICAgcHVibGljIGluZGljZXM6IG51bWJlcltdW11cbiAgKSB7fVxufVxuXG4vKipcbiAqIEJ1aWxkIGEgcmFuZG9tIHByb2plY3Rpb24gZm9yZXN0IHdpdGggYGBuVHJlZXNgYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VGb3Jlc3QoXG4gIGRhdGE6IFZlY3RvcixcbiAgbk5laWdoYm9yczogbnVtYmVyLFxuICBuVHJlZXM6IG51bWJlcixcbiAgcmFuZG9tOiBSYW5kb21GblxuKSB7XG4gIGNvbnN0IGxlYWZTaXplID0gTWF0aC5tYXgoMTAsIG5OZWlnaGJvcnMpO1xuXG4gIGNvbnN0IHRyZWVzID0gdXRpbHNcbiAgICAucmFuZ2UoblRyZWVzKVxuICAgIC5tYXAoKF8sIGkpID0+IG1ha2VUcmVlKGRhdGEsIGxlYWZTaXplLCBpLCByYW5kb20pKTtcbiAgY29uc3QgZm9yZXN0ID0gdHJlZXMubWFwKCh0cmVlKSA9PiBmbGF0dGVuVHJlZSh0cmVlLCBsZWFmU2l6ZSkpO1xuXG4gIHJldHVybiBmb3Jlc3Q7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGEgcmFuZG9tIHByb2plY3Rpb24gdHJlZSBiYXNlZCBvbiBgYGRhdGFgYCB3aXRoIGxlYXZlc1xuICogb2Ygc2l6ZSBhdCBtb3N0IGBgbGVhZlNpemVgYFxuICovXG5mdW5jdGlvbiBtYWtlVHJlZShcbiAgZGF0YTogVmVjdG9yLFxuICBsZWFmU2l6ZSA9IDMwLFxuICBuOiBudW1iZXIsXG4gIHJhbmRvbTogUmFuZG9tRm5cbik6IFJhbmRvbVByb2plY3Rpb25UcmVlTm9kZSB7XG4gIGNvbnN0IGluZGljZXMgPSB1dGlscy5yYW5nZShkYXRhLmxlbmd0aCk7XG4gIGNvbnN0IHRyZWUgPSBtYWtlRXVjbGlkZWFuVHJlZShkYXRhLCBpbmRpY2VzLCBsZWFmU2l6ZSwgbiwgcmFuZG9tKTtcbiAgcmV0dXJuIHRyZWU7XG59XG5cbmZ1bmN0aW9uIG1ha2VFdWNsaWRlYW5UcmVlKFxuICBkYXRhOiBWZWN0b3IsXG4gIGluZGljZXM6IG51bWJlcltdLFxuICBsZWFmU2l6ZSA9IDMwLFxuICBxOiBudW1iZXIsXG4gIHJhbmRvbTogUmFuZG9tRm5cbik6IFJhbmRvbVByb2plY3Rpb25UcmVlTm9kZSB7XG4gIGlmIChpbmRpY2VzLmxlbmd0aCA+IGxlYWZTaXplKSB7XG4gICAgY29uc3Qgc3BsaXRSZXN1bHRzID0gZXVjbGlkZWFuUmFuZG9tUHJvamVjdGlvblNwbGl0KGRhdGEsIGluZGljZXMsIHJhbmRvbSk7XG4gICAgY29uc3Qge2luZGljZXNMZWZ0LCBpbmRpY2VzUmlnaHQsIGh5cGVycGxhbmUsIG9mZnNldH0gPSBzcGxpdFJlc3VsdHM7XG5cbiAgICBjb25zdCBsZWZ0Q2hpbGQgPSBtYWtlRXVjbGlkZWFuVHJlZShcbiAgICAgIGRhdGEsXG4gICAgICBpbmRpY2VzTGVmdCxcbiAgICAgIGxlYWZTaXplLFxuICAgICAgcSArIDEsXG4gICAgICByYW5kb21cbiAgICApO1xuICAgIGNvbnN0IHJpZ2h0Q2hpbGQgPSBtYWtlRXVjbGlkZWFuVHJlZShcbiAgICAgIGRhdGEsXG4gICAgICBpbmRpY2VzUmlnaHQsXG4gICAgICBsZWFmU2l6ZSxcbiAgICAgIHEgKyAxLFxuICAgICAgcmFuZG9tXG4gICAgKTtcblxuICAgIGNvbnN0IG5vZGUgPSB7bGVmdENoaWxkLCByaWdodENoaWxkLCBpc0xlYWY6IGZhbHNlLCBoeXBlcnBsYW5lLCBvZmZzZXR9O1xuICAgIHJldHVybiBub2RlO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG5vZGUgPSB7aW5kaWNlcywgaXNMZWFmOiB0cnVlfTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxufVxuXG4vKipcbiAqIEdpdmVuIGEgc2V0IG9mIGBgaW5kaWNlc2BgIGZvciBkYXRhIHBvaW50cyBmcm9tIGBgZGF0YWBgLCBjcmVhdGVcbiAqIGEgcmFuZG9tIGh5cGVycGxhbmUgdG8gc3BsaXQgdGhlIGRhdGEsIHJldHVybmluZyB0d28gYXJyYXlzIGluZGljZXNcbiAqIHRoYXQgZmFsbCBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgaHlwZXJwbGFuZS4gVGhpcyBpcyB0aGUgYmFzaXMgZm9yIGFcbiAqIHJhbmRvbSBwcm9qZWN0aW9uIHRyZWUsIHdoaWNoIHNpbXBseSB1c2VzIHRoaXMgc3BsaXR0aW5nIHJlY3Vyc2l2ZWx5LlxuICogVGhpcyBwYXJ0aWN1bGFyIHNwbGl0IHVzZXMgZXVjbGlkZWFuIGRpc3RhbmNlIHRvIGRldGVybWluZSB0aGUgaHlwZXJwbGFuZVxuICogYW5kIHdoaWNoIHNpZGUgZWFjaCBkYXRhIHNhbXBsZSBmYWxscyBvbi5cbiAqL1xuZnVuY3Rpb24gZXVjbGlkZWFuUmFuZG9tUHJvamVjdGlvblNwbGl0KFxuICBkYXRhOiBWZWN0b3IsXG4gIGluZGljZXM6IG51bWJlcltdLFxuICByYW5kb206IFJhbmRvbUZuXG4pIHtcbiAgLy9jb25zdCBkaW0gPSAxO1xuXG4gIC8vIFNlbGVjdCB0d28gcmFuZG9tIHBvaW50cywgc2V0IHRoZSBoeXBlcnBsYW5lIGJldHdlZW4gdGhlbVxuICBjb25zdCBsZWZ0SW5kZXggPSB1dGlscy50YXVSYW5kSW50KGluZGljZXMubGVuZ3RoLCByYW5kb20pO1xuICBsZXQgcmlnaHRJbmRleCA9IHV0aWxzLnRhdVJhbmRJbnQoaW5kaWNlcy5sZW5ndGgsIHJhbmRvbSk7XG4gIHJpZ2h0SW5kZXggKz0gbGVmdEluZGV4ID09PSByaWdodEluZGV4ID8gMSA6IDA7XG4gIHJpZ2h0SW5kZXggPSByaWdodEluZGV4ICUgaW5kaWNlcy5sZW5ndGg7XG4gIGNvbnN0IGxlZnQgPSBpbmRpY2VzW2xlZnRJbmRleF07XG4gIGNvbnN0IHJpZ2h0ID0gaW5kaWNlc1tyaWdodEluZGV4XTtcblxuICAvLyBDb21wdXRlIHRoZSBub3JtYWwgdmVjdG9yIHRvIHRoZSBoeXBlcnBsYW5lICh0aGUgdmVjdG9yIGJldHdlZW4gdGhlIHR3b1xuICAvLyBwb2ludHMpIGFuZCB0aGUgb2Zmc2V0IGZyb20gdGhlIG9yaWdpblxuICBsZXQgaHlwZXJwbGFuZU9mZnNldCA9IDA7XG4gIGxldCBoeXBlcnBsYW5lVmVjdG9yID0gMDtcblxuXG4gIGh5cGVycGxhbmVWZWN0b3IgPSBkYXRhW2xlZnRdIC0gZGF0YVtyaWdodF07XG4gIGh5cGVycGxhbmVPZmZzZXQgLT1cbiAgICAoaHlwZXJwbGFuZVZlY3RvciAqIChkYXRhW2xlZnRdICsgZGF0YVtyaWdodF0pKSAvIDIuMDtcblxuXG4gIC8vIEZvciBlYWNoIHBvaW50IGNvbXB1dGUgdGhlIG1hcmdpbiAocHJvamVjdCBpbnRvIG5vcm1hbCB2ZWN0b3IpXG4gIC8vIElmIHdlIGFyZSBvbiBsb3dlciBzaWRlIG9mIHRoZSBoeXBlcnBsYW5lIHB1dCBpbiBvbmUgcGlsZSwgb3RoZXJ3aXNlXG4gIC8vIHB1dCBpdCBpbiB0aGUgb3RoZXIgcGlsZSAoaWYgd2UgaGl0IGh5cGVycGxhbmUgb24gdGhlIG5vc2UsIGZsaXAgYSBjb2luKVxuICBsZXQgbkxlZnQgPSAwO1xuICBsZXQgblJpZ2h0ID0gMDtcbiAgY29uc3Qgc2lkZSA9IHV0aWxzLnplcm9zKGluZGljZXMubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IG1hcmdpbiA9IGh5cGVycGxhbmVPZmZzZXQ7XG5cbiAgICBtYXJnaW4gKz0gaHlwZXJwbGFuZVZlY3RvciAqIGRhdGFbaW5kaWNlc1tpXV07XG5cbiAgICBpZiAobWFyZ2luID09PSAwKSB7XG4gICAgICBzaWRlW2ldID0gdXRpbHMudGF1UmFuZEludCgyLCByYW5kb20pO1xuICAgICAgaWYgKHNpZGVbaV0gPT09IDApXG4gICAgICAgIG5MZWZ0ICs9IDE7XG4gICAgICBlbHNlXG4gICAgICAgIG5SaWdodCArPSAxO1xuICAgIH0gZWxzZSBpZiAobWFyZ2luID4gMCkge1xuICAgICAgc2lkZVtpXSA9IDA7XG4gICAgICBuTGVmdCArPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaWRlW2ldID0gMTtcbiAgICAgIG5SaWdodCArPSAxO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyB0aGF0IHdlIGhhdmUgdGhlIGNvdW50cywgYWxsb2NhdGUgYXJyYXlzXG4gIGNvbnN0IGluZGljZXNMZWZ0ID0gdXRpbHMuemVyb3MobkxlZnQpO1xuICBjb25zdCBpbmRpY2VzUmlnaHQgPSB1dGlscy56ZXJvcyhuUmlnaHQpO1xuXG4gIC8vIFBvcHVsYXRlIHRoZSBhcnJheXMgd2l0aCBpbmRpY2VzIGFjY29yZGluZyB0byB3aGljaCBzaWRlIHRoZXkgZmVsbCBvblxuICBuTGVmdCA9IDA7XG4gIG5SaWdodCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2lkZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzaWRlW2ldID09PSAwKSB7XG4gICAgICBpbmRpY2VzTGVmdFtuTGVmdF0gPSBpbmRpY2VzW2ldO1xuICAgICAgbkxlZnQgKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5kaWNlc1JpZ2h0W25SaWdodF0gPSBpbmRpY2VzW2ldO1xuICAgICAgblJpZ2h0ICs9IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpbmRpY2VzTGVmdCxcbiAgICBpbmRpY2VzUmlnaHQsXG4gICAgaHlwZXJwbGFuZTogaHlwZXJwbGFuZVZlY3RvcixcbiAgICBvZmZzZXQ6IGh5cGVycGxhbmVPZmZzZXQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5UcmVlKHRyZWU6IFJhbmRvbVByb2plY3Rpb25UcmVlTm9kZSwgbGVhZlNpemU6IG51bWJlcikge1xuICBjb25zdCBuTm9kZXMgPSBudW1Ob2Rlcyh0cmVlKTtcbiAgY29uc3QgbkxlYXZlcyA9IG51bUxlYXZlcyh0cmVlKTtcblxuICAvLyBUT0RPOiBWZXJpZnkgdGhhdCBzcGFyc2UgY29kZSBpcyBub3QgcmVsZXZhbnQuLi5cbiAgY29uc3QgaHlwZXJwbGFuZXMgPSB1dGlsc1xuICAgIC5yYW5nZShuTm9kZXMpXG4gICAgLm1hcCgoKSA9PiB0cmVlLmh5cGVycGxhbmUgPyAxIDogMCk7XG5cbiAgY29uc3Qgb2Zmc2V0cyA9IHV0aWxzLnplcm9zKG5Ob2Rlcyk7XG4gIGNvbnN0IGNoaWxkcmVuID0gdXRpbHMucmFuZ2Uobk5vZGVzKS5tYXAoKCkgPT4gWy0xLCAtMV0pO1xuICBjb25zdCBpbmRpY2VzID0gdXRpbHNcbiAgICAucmFuZ2UobkxlYXZlcylcbiAgICAubWFwKCgpID0+IHV0aWxzLnJhbmdlKGxlYWZTaXplKS5tYXAoKCkgPT4gLTEpKTtcbiAgcmVjdXJzaXZlRmxhdHRlbih0cmVlLCBoeXBlcnBsYW5lcywgb2Zmc2V0cywgY2hpbGRyZW4sIGluZGljZXMsIDAsIDApO1xuICByZXR1cm4gbmV3IEZsYXRUcmVlKGh5cGVycGxhbmVzLCBvZmZzZXRzLCBjaGlsZHJlbiwgaW5kaWNlcyk7XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZUZsYXR0ZW4oXG4gIHRyZWU6IFJhbmRvbVByb2plY3Rpb25UcmVlTm9kZSxcbiAgaHlwZXJwbGFuZXM6IG51bWJlcltdLFxuICBvZmZzZXRzOiBudW1iZXJbXSxcbiAgY2hpbGRyZW46IG51bWJlcltdW10sXG4gIGluZGljZXM6IG51bWJlcltdW10sXG4gIG5vZGVOdW06IG51bWJlcixcbiAgbGVhZk51bTogbnVtYmVyXG4pOiB7IG5vZGVOdW06IG51bWJlcjsgbGVhZk51bTogbnVtYmVyIH0ge1xuICBpZiAodHJlZS5pc0xlYWYpIHtcbiAgICBjaGlsZHJlbltub2RlTnVtXVswXSA9IC1sZWFmTnVtO1xuXG4gICAgLy8gVE9ETzogVHJpcGxlIGNoZWNrIHRoaXMgb3BlcmF0aW9uIGNvcnJlc3BvbmRzIHRvXG4gICAgLy8gaW5kaWNlc1tsZWFmTnVtIDogdHJlZS5pbmRpY2VzLnNoYXBlWzBdXSA9IHRyZWUuaW5kaWNlc1xuICAgIGluZGljZXNbbGVhZk51bV0uc3BsaWNlKDAsIHRyZWUuaW5kaWNlcyEubGVuZ3RoLCAuLi50cmVlLmluZGljZXMhKTtcbiAgICBsZWFmTnVtICs9IDE7XG4gICAgcmV0dXJuIHtub2RlTnVtLCBsZWFmTnVtfTtcbiAgfSBlbHNlIHtcbiAgICBoeXBlcnBsYW5lc1tub2RlTnVtXSA9IHRyZWUuaHlwZXJwbGFuZSE7XG4gICAgb2Zmc2V0c1tub2RlTnVtXSA9IHRyZWUub2Zmc2V0ITtcbiAgICBjaGlsZHJlbltub2RlTnVtXVswXSA9IG5vZGVOdW0gKyAxO1xuICAgIGNvbnN0IG9sZE5vZGVOdW0gPSBub2RlTnVtO1xuXG4gICAgbGV0IHJlcyA9IHJlY3Vyc2l2ZUZsYXR0ZW4oXG4gICAgICB0cmVlLmxlZnRDaGlsZCEsXG4gICAgICBoeXBlcnBsYW5lcyxcbiAgICAgIG9mZnNldHMsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGluZGljZXMsXG4gICAgICBub2RlTnVtICsgMSxcbiAgICAgIGxlYWZOdW1cbiAgICApO1xuICAgIG5vZGVOdW0gPSByZXMubm9kZU51bTtcbiAgICBsZWFmTnVtID0gcmVzLmxlYWZOdW07XG5cbiAgICBjaGlsZHJlbltvbGROb2RlTnVtXVsxXSA9IG5vZGVOdW0gKyAxO1xuXG4gICAgcmVzID0gcmVjdXJzaXZlRmxhdHRlbihcbiAgICAgIHRyZWUucmlnaHRDaGlsZCEsXG4gICAgICBoeXBlcnBsYW5lcyxcbiAgICAgIG9mZnNldHMsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGluZGljZXMsXG4gICAgICBub2RlTnVtICsgMSxcbiAgICAgIGxlYWZOdW1cbiAgICApO1xuICAgIHJldHVybiB7bm9kZU51bTogcmVzLm5vZGVOdW0sIGxlYWZOdW06IHJlcy5sZWFmTnVtfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBudW1Ob2Rlcyh0cmVlOiBSYW5kb21Qcm9qZWN0aW9uVHJlZU5vZGUpOiBudW1iZXIge1xuICBpZiAodHJlZS5pc0xlYWYpXG4gICAgcmV0dXJuIDE7XG4gIGVsc2VcbiAgICByZXR1cm4gMSArIG51bU5vZGVzKHRyZWUubGVmdENoaWxkISkgKyBudW1Ob2Rlcyh0cmVlLnJpZ2h0Q2hpbGQhKTtcbn1cblxuZnVuY3Rpb24gbnVtTGVhdmVzKHRyZWU6IFJhbmRvbVByb2plY3Rpb25UcmVlTm9kZSk6IG51bWJlciB7XG4gIGlmICh0cmVlLmlzTGVhZilcbiAgICByZXR1cm4gMTtcbiAgZWxzZVxuICAgIHJldHVybiBudW1MZWF2ZXModHJlZS5sZWZ0Q2hpbGQhKSArIG51bUxlYXZlcyh0cmVlLnJpZ2h0Q2hpbGQhKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhbiBhcnJheSBvZiBzZXRzIG9mIGNhbmRpZGF0ZSBuZWFyZXN0IG5laWdoYm9ycyBieVxuICogY29uc3RydWN0aW5nIGEgcmFuZG9tIHByb2plY3Rpb24gZm9yZXN0IGFuZCB0YWtpbmcgdGhlIGxlYXZlcyBvZiBhbGwgdGhlXG4gKiB0cmVlcy4gQW55IGdpdmVuIHRyZWUgaGFzIGxlYXZlcyB0aGF0IGFyZSBhIHNldCBvZiBwb3RlbnRpYWwgbmVhcmVzdFxuICogbmVpZ2hib3JzLiBHaXZlbiBlbm91Z2ggdHJlZXMgdGhlIHNldCBvZiBhbGwgc3VjaCBsZWF2ZXMgZ2l2ZXMgYSBnb29kXG4gKiBsaWtlbGlob29kIG9mIGdldHRpbmcgYSBnb29kIHNldCBvZiBuZWFyZXN0IG5laWdoYm9ycyBpbiBjb21wb3NpdGUuIFNpbmNlXG4gKiBzdWNoIGEgcmFuZG9tIHByb2plY3Rpb24gZm9yZXN0IGlzIGluZXhwZW5zaXZlIHRvIGNvbXB1dGUsIHRoaXMgY2FuIGJlIGFcbiAqIHVzZWZ1bCBtZWFucyBvZiBzZWVkaW5nIG90aGVyIG5lYXJlc3QgbmVpZ2hib3IgYWxnb3JpdGhtcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VMZWFmQXJyYXkocnBGb3Jlc3Q6IEZsYXRUcmVlW10pOiBudW1iZXJbXVtdIHtcbiAgaWYgKHJwRm9yZXN0Lmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBvdXRwdXQ6IG51bWJlcltdW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRyZWUgb2YgcnBGb3Jlc3QpXG4gICAgICBvdXRwdXQucHVzaCguLi50cmVlLmluZGljZXMhKTtcblxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFtbLTFdXTtcbiAgfVxufVxuXG4vKipcbiAqIFNlbGVjdHMgdGhlIHNpZGUgb2YgdGhlIHRyZWUgdG8gc2VhcmNoIGR1cmluZyBmbGF0IHRyZWUgc2VhcmNoLlxuICovXG5mdW5jdGlvbiBzZWxlY3RTaWRlKFxuICBoeXBlcnBsYW5lOiBudW1iZXIsXG4gIG9mZnNldDogbnVtYmVyLFxuICBwb2ludDogbnVtYmVyLFxuICByYW5kb206IFJhbmRvbUZuXG4pIHtcbiAgbGV0IG1hcmdpbiA9IG9mZnNldDtcblxuICBtYXJnaW4gKz0gaHlwZXJwbGFuZSAqIHBvaW50O1xuXG5cbiAgaWYgKG1hcmdpbiA9PT0gMCkge1xuICAgIGNvbnN0IHNpZGUgPSB1dGlscy50YXVSYW5kSW50KDIsIHJhbmRvbSk7XG4gICAgcmV0dXJuIHNpZGU7XG4gIH0gZWxzZSBpZiAobWFyZ2luID4gMCkge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAxO1xuICB9XG59XG5cbi8qKlxuICogU2VhcmNoZXMgYSBmbGF0dGVuZWQgcnAtdHJlZSBmb3IgYSBwb2ludC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaEZsYXRUcmVlKFxuICBwb2ludDogbnVtYmVyLFxuICB0cmVlOiBGbGF0VHJlZSxcbiAgcmFuZG9tOiBSYW5kb21GblxuKSB7XG4gIGxldCBub2RlID0gMDtcbiAgd2hpbGUgKHRyZWUuY2hpbGRyZW5bbm9kZV1bMF0gPiAwKSB7XG4gICAgY29uc3Qgc2lkZSA9IHNlbGVjdFNpZGUoXG4gICAgICB0cmVlLmh5cGVycGxhbmVzW25vZGVdLFxuICAgICAgdHJlZS5vZmZzZXRzW25vZGVdLFxuICAgICAgcG9pbnQsXG4gICAgICByYW5kb21cbiAgICApO1xuICAgIGlmIChzaWRlID09PSAwKVxuICAgICAgbm9kZSA9IHRyZWUuY2hpbGRyZW5bbm9kZV1bMF07XG4gICAgZWxzZVxuICAgICAgbm9kZSA9IHRyZWUuY2hpbGRyZW5bbm9kZV1bMV07XG4gIH1cblxuICBjb25zdCBpbmRleCA9IC0xICogdHJlZS5jaGlsZHJlbltub2RlXVswXTtcbiAgcmV0dXJuIHRyZWUuaW5kaWNlc1tpbmRleF07XG59XG4iXX0=","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 get neighbors() {\n return this.nNeighbors;\n }\n constructor(params = {}) {\n this.learningRate = 1.0;\n this.localConnectivity = 1.0;\n this.minDist = 0.1;\n this.nComponents = 2;\n this.nEpochs = 0;\n this.nNeighbors = 15;\n this.negativeSampleRate = 5;\n this.random = Math.random;\n this.repulsionStrength = 1.0;\n this.setOpMixRatio = 1.0;\n this.spread = 1.0;\n this.transformQueueSize = 4.0;\n // Supervised projection params\n this.targetMetric = \"categorical\" /* TargetMetric.categorical */;\n this.targetWeight = 0.5;\n this.targetNNeighbors = 15;\n this.distanceFn = numeric;\n this.isInitialized = false;\n this.rpForest = [];\n // Projected embedding\n this.embedding = [];\n this.optimizationState = new OptimizationState();\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 constructor() {\n this.currentEpoch = 0;\n // Data tracked during optimization steps.\n this.headEmbedding = [];\n this.tailEmbedding = [];\n this.head = [];\n this.tail = [];\n this.epochsPerSample = [];\n this.epochOfNextSample = [];\n this.epochOfNextNegativeSample = [];\n this.epochsPerNegativeSample = [];\n this.moveOther = true;\n this.initialAlpha = 1.0;\n this.alpha = 1.0;\n this.gamma = 1.0;\n this.a = 1.5769434603113077;\n this.b = 0.8950608779109733;\n this.dim = 2;\n this.nEpochs = 500;\n this.nVertices = 0;\n }\n}\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInVtYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNEJBQTRCO0FBQzVCOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFFSCxPQUFPLEtBQUssSUFBSSxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEtBQUssTUFBTSxNQUFNLFVBQVUsQ0FBQztBQUNuQyxPQUFPLEtBQUssU0FBUyxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEtBQUssSUFBSSxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEtBQUssS0FBSyxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQWF4QyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQztBQUNoQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQW1IOUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLE9BQU8sSUFBSTtJQTJDZixJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUNELFlBQVksU0FBeUIsRUFBRTtRQTdDL0IsaUJBQVksR0FBRyxHQUFHLENBQUM7UUFDbkIsc0JBQWlCLEdBQUcsR0FBRyxDQUFDO1FBQ3hCLFlBQU8sR0FBRyxHQUFHLENBQUM7UUFDZCxnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUNoQixZQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ1osZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNoQix1QkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDdkIsV0FBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDckIsc0JBQWlCLEdBQUcsR0FBRyxDQUFDO1FBQ3hCLGtCQUFhLEdBQUcsR0FBRyxDQUFDO1FBQ3BCLFdBQU0sR0FBRyxHQUFHLENBQUM7UUFD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RjtLQUNGO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogVGhpcyBpcyBhIEphdmFTY3JpcHQgcmVpbXBsZW1lbnRhdGlvbiBvZiBVTUFQIChvcmlnaW5hbCBsaWNlbnNlIGJlbG93KSwgZnJvbVxuICogdGhlIHB5dGhvbiBpbXBsZW1lbnRhdGlvbiBmb3VuZCBhdCBodHRwczovL2dpdGh1Yi5jb20vbG1jaW5uZXMvdW1hcC5cbiAqXG4gKiBAYXV0aG9yIGFuZHljb2VuZW5AZ29vZ2xlLmNvbSAoQW5keSBDb2VuZW4pXG4gKi9cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQlNEIDMtQ2xhdXNlIExpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcsIExlbGFuZCBNY0lubmVzXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tXG4gKiAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRVxuICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUxcbiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SXG4gKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUlxuICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSxcbiAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbmltcG9ydCAqIGFzIGhlYXAgZnJvbSAnLi9oZWFwJztcbmltcG9ydCAqIGFzIG1hdHJpeCBmcm9tICcuL21hdHJpeCc7XG5pbXBvcnQgKiBhcyBubkRlc2NlbnQgZnJvbSAnLi9ubl9kZXNjZW50JztcbmltcG9ydCAqIGFzIHRyZWUgZnJvbSAnLi90cmVlJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IExNIGZyb20gJ21sLWxldmVuYmVyZy1tYXJxdWFyZHQnO1xuXG5leHBvcnQgdHlwZSBEaXN0YW5jZUZuID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiBudW1iZXI7XG5leHBvcnQgdHlwZSBSYW5kb21GbiA9ICgpID0+IG51bWJlcjtcbmV4cG9ydCB0eXBlIEVwb2NoQ2FsbGJhY2sgPSAoZXBvY2g6IG51bWJlcikgPT4gYm9vbGVhbiB8IHZvaWQ7XG5leHBvcnQgdHlwZSBWZWN0b3IgPSBudW1iZXJbXTtcbmV4cG9ydCB0eXBlIFZlY3RvcnMgPSBWZWN0b3JbXTtcbmV4cG9ydCBjb25zdCBlbnVtIFRhcmdldE1ldHJpYyB7XG4gIGNhdGVnb3JpY2FsID0gJ2NhdGVnb3JpY2FsJyxcbiAgbDEgPSAnbDEnLFxuICBsMiA9ICdsMicsXG59XG5cbmNvbnN0IFNNT09USF9LX1RPTEVSQU5DRSA9IDFlLTU7XG5jb25zdCBNSU5fS19ESVNUX1NDQUxFID0gMWUtMztcblxuZXhwb3J0IGludGVyZmFjZSBVTUFQUGFyYW1ldGVycyB7XG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnVuY3Rpb24gd2l0aCB3aGljaCB0byBhc3Nlc3MgbmVhcmVzdCBuZWlnaGJvcnMsIGRlZmF1bHRzXG4gICAqIHRvIGV1Y2xpZGVhbiBkaXN0YW5jZS5cbiAgICovXG4gIGRpc3RhbmNlRm4/OiBEaXN0YW5jZUZuO1xuICAvKipcbiAgICogVGhlIGluaXRpYWwgbGVhcm5pbmcgcmF0ZSBmb3IgdGhlIGVtYmVkZGluZyBvcHRpbWl6YXRpb24uXG4gICAqL1xuICBsZWFybmluZ1JhdGU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbG9jYWwgY29ubmVjdGl2aXR5IHJlcXVpcmVkIC0tIGkuZS4gdGhlIG51bWJlciBvZiBuZWFyZXN0XG4gICAqIG5laWdoYm9ycyB0aGF0IHNob3VsZCBiZSBhc3N1bWVkIHRvIGJlIGNvbm5lY3RlZCBhdCBhIGxvY2FsIGxldmVsLlxuICAgKiBUaGUgaGlnaGVyIHRoaXMgdmFsdWUgdGhlIG1vcmUgY29ubmVjdGVkIHRoZSBtYW5pZm9sZCBiZWNvbWVzXG4gICAqIGxvY2FsbHkuIEluIHByYWN0aWNlIHRoaXMgc2hvdWxkIGJlIG5vdCBtb3JlIHRoYW4gdGhlIGxvY2FsIGludHJpbnNpY1xuICAgKiBkaW1lbnNpb24gb2YgdGhlIG1hbmlmb2xkLlxuICAgKi9cbiAgbG9jYWxDb25uZWN0aXZpdHk/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgZWZmZWN0aXZlIG1pbmltdW0gZGlzdGFuY2UgYmV0d2VlbiBlbWJlZGRlZCBwb2ludHMuIFNtYWxsZXIgdmFsdWVzXG4gICAqIHdpbGwgcmVzdWx0IGluIGEgbW9yZSBjbHVzdGVyZWQvY2x1bXBlZCBlbWJlZGRpbmcgd2hlcmUgbmVhcmJ5IHBvaW50c1xuICAgKiBvbiB0aGUgbWFuaWZvbGQgYXJlIGRyYXduIGNsb3NlciB0b2dldGhlciwgd2hpbGUgbGFyZ2VyIHZhbHVlcyB3aWxsXG4gICAqIHJlc3VsdCBvbiBhIG1vcmUgZXZlbiBkaXNwZXJzYWwgb2YgcG9pbnRzLiBUaGUgdmFsdWUgc2hvdWxkIGJlIHNldFxuICAgKiByZWxhdGl2ZSB0byB0aGUgYGBzcHJlYWRgYCB2YWx1ZSwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgc2NhbGUgYXQgd2hpY2hcbiAgICogZW1iZWRkZWQgcG9pbnRzIHdpbGwgYmUgc3ByZWFkIG91dC5cbiAgICovXG4gIG1pbkRpc3Q/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgZGltZW5zaW9uIG9mIHRoZSBzcGFjZSB0byBlbWJlZCBpbnRvLiBUaGlzIGRlZmF1bHRzIHRvIDIgdG9cbiAgICogcHJvdmlkZSBlYXN5IHZpc3VhbGl6YXRpb24sIGJ1dCBjYW4gcmVhc29uYWJseSBiZSBzZXQgdG8gYW55XG4gICAqIGludGVnZXIgdmFsdWUgaW4gdGhlIHJhbmdlIDIgdG8gMTAwLlxuICAgKi9cbiAgbkNvbXBvbmVudHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHRyYWluaW5nIGVwb2NocyB0byBiZSB1c2VkIGluIG9wdGltaXppbmcgdGhlXG4gICAqIGxvdyBkaW1lbnNpb25hbCBlbWJlZGRpbmcuIExhcmdlciB2YWx1ZXMgcmVzdWx0IGluIG1vcmUgYWNjdXJhdGVcbiAgICogZW1iZWRkaW5ncy4gSWYgTm9uZSBpcyBzcGVjaWZpZWQgYSB2YWx1ZSB3aWxsIGJlIHNlbGVjdGVkIGJhc2VkIG9uXG4gICAqIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBkYXRhc2V0ICgyMDAgZm9yIGxhcmdlIGRhdGFzZXRzLCA1MDAgZm9yIHNtYWxsKS5cbiAgICovXG4gIG5FcG9jaHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiBsb2NhbCBuZWlnaGJvcmhvb2QgKGluIHRlcm1zIG9mIG51bWJlciBvZiBuZWlnaGJvcmluZ1xuICAgKiBzYW1wbGUgcG9pbnRzKSB1c2VkIGZvciBtYW5pZm9sZCBhcHByb3hpbWF0aW9uLiBMYXJnZXIgdmFsdWVzXG4gICAqIHJlc3VsdCBpbiBtb3JlIGdsb2JhbCB2aWV3cyBvZiB0aGUgbWFuaWZvbGQsIHdoaWxlIHNtYWxsZXJcbiAgICogdmFsdWVzIHJlc3VsdCBpbiBtb3JlIGxvY2FsIGRhdGEgYmVpbmcgcHJlc2VydmVkLiBJbiBnZW5lcmFsXG4gICAqIHZhbHVlcyBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDIgdG8gMTAwLlxuICAgKi9cbiAgbk5laWdoYm9ycz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgbmVnYXRpdmUgc2FtcGxlcyB0byBzZWxlY3QgcGVyIHBvc2l0aXZlIHNhbXBsZVxuICAgKiBpbiB0aGUgb3B0aW1pemF0aW9uIHByb2Nlc3MuIEluY3JlYXNpbmcgdGhpcyB2YWx1ZSB3aWxsIHJlc3VsdFxuICAgKiBpbiBncmVhdGVyIHJlcHVsc2l2ZSBmb3JjZSBiZWluZyBhcHBsaWVkLCBncmVhdGVyIG9wdGltaXphdGlvblxuICAgKiBjb3N0LCBidXQgc2xpZ2h0bHkgbW9yZSBhY2N1cmFjeS5cbiAgICovXG4gIG5lZ2F0aXZlU2FtcGxlUmF0ZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdlaWdodGluZyBhcHBsaWVkIHRvIG5lZ2F0aXZlIHNhbXBsZXMgaW4gbG93IGRpbWVuc2lvbmFsIGVtYmVkZGluZ1xuICAgKiBvcHRpbWl6YXRpb24uIFZhbHVlcyBoaWdoZXIgdGhhbiBvbmUgd2lsbCByZXN1bHQgaW4gZ3JlYXRlciB3ZWlnaHRcbiAgICogYmVpbmcgZ2l2ZW4gdG8gbmVnYXRpdmUgc2FtcGxlcy5cbiAgICovXG4gIHJlcHVsc2lvblN0cmVuZ3RoPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvciB1c2VkIGJ5IHRoZSBzdG9jaGFzdGljIHBhcnRzIG9mIHRoZVxuICAgKiBhbGdvcml0aG0uXG4gICAqL1xuICByYW5kb20/OiBSYW5kb21GbjtcbiAgLyoqXG4gICAqIEludGVycG9sYXRlIGJldHdlZW4gKGZ1enp5KSB1bmlvbiBhbmQgaW50ZXJzZWN0aW9uIGFzIHRoZSBzZXQgb3BlcmF0aW9uXG4gICAqIHVzZWQgdG8gY29tYmluZSBsb2NhbCBmdXp6eSBzaW1wbGljaWFsIHNldHMgdG8gb2J0YWluIGEgZ2xvYmFsIGZ1enp5XG4gICAqIHNpbXBsaWNpYWwgc2V0cy4gQm90aCBmdXp6eSBzZXQgb3BlcmF0aW9ucyB1c2UgdGhlIHByb2R1Y3QgdC1ub3JtLlxuICAgKiBUaGUgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIgc2hvdWxkIGJlIGJldHdlZW4gMC4wIGFuZCAxLjA7IGEgdmFsdWUgb2ZcbiAgICogMS4wIHdpbGwgdXNlIGEgcHVyZSBmdXp6eSB1bmlvbiwgd2hpbGUgMC4wIHdpbGwgdXNlIGEgcHVyZSBmdXp6eVxuICAgKiBpbnRlcnNlY3Rpb24uXG4gICAqL1xuICBzZXRPcE1peFJhdGlvPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGVmZmVjdGl2ZSBzY2FsZSBvZiBlbWJlZGRlZCBwb2ludHMuIEluIGNvbWJpbmF0aW9uIHdpdGggYGBtaW5fZGlzdGBgXG4gICAqIHRoaXMgZGV0ZXJtaW5lcyBob3cgY2x1c3RlcmVkL2NsdW1wZWQgdGhlIGVtYmVkZGVkIHBvaW50cyBhcmUuXG4gICAqL1xuICBzcHJlYWQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGb3IgdHJhbnNmb3JtIG9wZXJhdGlvbnMgKGVtYmVkZGluZyBuZXcgcG9pbnRzIHVzaW5nIGEgdHJhaW5lZCBtb2RlbClcbiAgICogdGhpcyB3aWxsIGNvbnRyb2wgaG93IGFnZ3Jlc3NpdmVseSB0byBzZWFyY2ggZm9yIG5lYXJlc3QgbmVpZ2hib3JzLlxuICAgKiBMYXJnZXIgdmFsdWVzIHdpbGwgcmVzdWx0IGluIHNsb3dlciBwZXJmb3JtYW5jZSBidXQgbW9yZSBhY2N1cmF0ZVxuICAgKiBuZWFyZXN0IG5laWdoYm9yIGV2YWx1YXRpb24uXG4gICAqL1xuICB0cmFuc2Zvcm1RdWV1ZVNpemU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVU1BUFN1cGVydmlzZWRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG1ldHJpYyB1c2VkIHRvIG1lYXN1cmUgZGlzdGFuY2UgZm9yIGEgdGFyZ2V0IGFycmF5IGlzIHVzaW5nIHN1cGVydmlzZWRcbiAgICogZGltZW5zaW9uIHJlZHVjdGlvbi4gQnkgZGVmYXVsdCB0aGlzIGlzICdjYXRlZ29yaWNhbCcgd2hpY2ggd2lsbCBtZWFzdXJlXG4gICAqIGRpc3RhbmNlIGluIHRlcm1zIG9mIHdoZXRoZXIgY2F0ZWdvcmllcyBtYXRjaCBvciBhcmUgZGlmZmVyZW50LiBGdXJ0aGVybW9yZSxcbiAgICogaWYgc2VtaS1zdXBlcnZpc2VkIGlzIHJlcXVpcmVkIHRhcmdldCB2YWx1ZXMgb2YgLTEgd2lsbCBiZSB0cmVhdGVkIGFzXG4gICAqIHVubGFiZWxsZWQgdW5kZXIgdGhlICdjYXRlZ29yaWNhbCcgbWV0cmljLiBJZiB0aGUgdGFyZ2V0IGFycmF5IHRha2VzXG4gICAqIGNvbnRpbnVvdXMgdmFsdWVzIChlLmcuIGZvciBhIHJlZ3Jlc3Npb24gcHJvYmxlbSkgdGhlbiBtZXRyaWMgb2YgJ2wxJ1xuICAgKiBvciAnbDInIGlzIHByb2JhYmx5IG1vcmUgYXBwcm9wcmlhdGUuXG4gICAqL1xuICB0YXJnZXRNZXRyaWM/OiBUYXJnZXRNZXRyaWM7XG4gIC8qKlxuICAgKiBXZWlnaHRpbmcgZmFjdG9yIGJldHdlZW4gZGF0YSB0b3BvbG9neSBhbmQgdGFyZ2V0IHRvcG9sb2d5LiBBIHZhbHVlIG9mXG4gICAqIDAuMCB3ZWlnaHRzIGVudGlyZWx5IG9uIGRhdGEsIGEgdmFsdWUgb2YgMS4wIHdlaWdodHMgZW50aXJlbHkgb24gdGFyZ2V0LlxuICAgKiBUaGUgZGVmYXVsdCBvZiAwLjUgYmFsYW5jZXMgdGhlIHdlaWdodGluZyBlcXVhbGx5IGJldHdlZW4gZGF0YSBhbmQgdGFyZ2V0LlxuICAgKi9cbiAgdGFyZ2V0V2VpZ2h0PzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBuZWFyZXN0IG5laWdoYm9ycyB0byB1c2UgdG8gY29uc3RydWN0IHRoZSB0YXJnZXQgc2ltcGxjaWFsXG4gICAqIHNldC4gRGVmYXVsdHMgdG8gdGhlIGBuZWFyZXN0TmVpZ2hib3JzYCBwYXJhbWV0ZXIuXG4gICAqL1xuICB0YXJnZXROTmVpZ2hib3JzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFVNQVAgcHJvamVjdGlvbiBzeXN0ZW0sIGJhc2VkIG9uIHRoZSBweXRob24gaW1wbGVtZW50YXRpb24gZnJvbSBNY0lubmVzLCBMLFxuICogSGVhbHksIEosIFVNQVA6IFVuaWZvcm0gTWFuaWZvbGQgQXBwcm94aW1hdGlvbiBhbmQgUHJvamVjdGlvbiBmb3IgRGltZW5zaW9uXG4gKiBSZWR1Y3Rpb24gKGh0dHBzOi8vZ2l0aHViLmNvbS9sbWNpbm5lcy91bWFwKS5cbiAqXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIGRpZmZlcnMgaW4gYSBmZXcgcmVnYXJkczpcbiAqIGEpIFRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZW1iZWRkaW5nIGZvciBvcHRpbWl6YXRpb24gaXMgbm90IGNvbXB1dGVkIHVzaW5nXG4gKiAgICBhIHNwZWN0cmFsIG1ldGhvZCwgcmF0aGVyIGl0IGlzIGluaXRpYWxpemVkIHJhbmRvbWx5LiBUaGlzIGF2b2lkcyBzb21lXG4gKiAgICBjb21wdXRhdGlvbmFsbHkgaW50ZW5zaXZlIG1hdHJpeCBlaWdlbiBjb21wdXRhdGlvbnMgdGhhdCBhcmVuJ3QgZWFzaWx5XG4gKiAgICBwb3J0ZWQgdG8gSmF2YVNjcmlwdC5cbiAqIGIpIEEgbG90IG9mIFwiZXh0cmFcIiBmdW5jdGlvbmFsaXR5IGhhcyBiZWVuIG9taXR0ZWQgZnJvbSB0aGlzIGltcGxlbWVudGF0aW9uLFxuICogICAgbW9zdCBub3RhYmx5IGEgZ3JlYXQgZGVhbCBvZiBhbHRlcm5hdGUgZGlzdGFuY2UgZnVuY3Rpb25zLlxuICpcbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgdGhyZWUgbWV0aG9kcyBvZiByZWR1Y2luZyBkaW1lbnNpb25hbGl0eTpcbiAqIDEpIGZpdDogZml0IHRoZSBkYXRhIHN5bmNocm9ub3VzbHlcbiAqIDIpIGZpdEFzeW5jOiBmaXQgdGhlIGRhdGEgYXN5bmNocm9ub3VzbHksIHdpdGggYSBjYWxsYmFjayBmdW5jdGlvbiBwcm92aWRlZFxuICogICAgICB0aGF0IGlzIGludm9rZWQgb24gZWFjaCBvcHRpbWl6YXRpb24gc3RlcC5cbiAqIDMpIGluaXRpYWxpemVGaXQgLyBzdGVwOiBtYW51YWxseSBpbml0aWFsaXplIHRoZSBhbGdvcml0aG0gdGhlbiBleHBsaWN0bHlcbiAqICAgICAgc3RlcCB0aHJvdWdoIGVhY2ggZXBvY2ggb2YgdGhlIFNHRCBvcHRpbWl6YXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFVNQVAge1xuICBwcml2YXRlIGxlYXJuaW5nUmF0ZSA9IDEuMDtcbiAgcHJpdmF0ZSBsb2NhbENvbm5lY3Rpdml0eSA9IDEuMDtcbiAgcHJpdmF0ZSBtaW5EaXN0ID0gMC4xO1xuICBwcml2YXRlIG5Db21wb25lbnRzID0gMjtcbiAgcHJpdmF0ZSBuRXBvY2hzID0gMDtcbiAgcHJpdmF0ZSBuTmVpZ2hib3JzID0gMTU7XG4gIHByaXZhdGUgbmVnYXRpdmVTYW1wbGVSYXRlID0gNTtcbiAgcHJpdmF0ZSByYW5kb20gPSBNYXRoLnJhbmRvbTtcbiAgcHJpdmF0ZSByZXB1bHNpb25TdHJlbmd0aCA9IDEuMDtcbiAgcHJpdmF0ZSBzZXRPcE1peFJhdGlvID0gMS4wO1xuICBwcml2YXRlIHNwcmVhZCA9IDEuMDtcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1RdWV1ZVNpemUgPSA0LjA7XG5cbiAgLy8gU3VwZXJ2aXNlZCBwcm9qZWN0aW9uIHBhcmFtc1xuICBwcml2YXRlIHRhcmdldE1ldHJpYyA9IFRhcmdldE1ldHJpYy5jYXRlZ29yaWNhbDtcbiAgcHJpdmF0ZSB0YXJnZXRXZWlnaHQgPSAwLjU7XG4gIHByaXZhdGUgdGFyZ2V0Tk5laWdoYm9ycyA9IDE1O1xuXG4gIHByaXZhdGUgZGlzdGFuY2VGbjogRGlzdGFuY2VGbiA9IG51bWVyaWM7XG5cbiAgLy8gS05OIHN0YXRlIChjYW4gYmUgcHJlY29tcHV0ZWQgYW5kIHN1cHBsaWVkIHZpYSBpbml0aWFsaXplRml0KVxuICBwcml2YXRlIGtubkluZGljZXM/OiBudW1iZXJbXVtdO1xuICBwcml2YXRlIGtubkRpc3RhbmNlcz86IG51bWJlcltdW107XG5cbiAgLy8gSW50ZXJuYWwgZ3JhcGggY29ubmVjdGl2aXR5IHJlcHJlc2VudGF0aW9uXG4gIHByaXZhdGUgZ3JhcGghOiBtYXRyaXguU3BhcnNlTWF0cml4O1xuICBwcml2YXRlIFghOiBWZWN0b3I7XG4gIHByaXZhdGUgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIHJwRm9yZXN0OiB0cmVlLkZsYXRUcmVlW10gPSBbXTtcbiAgcHJpdmF0ZSBpbml0RnJvbVJhbmRvbSE6IG5uRGVzY2VudC5Jbml0RnJvbVJhbmRvbUZuO1xuICBwcml2YXRlIGluaXRGcm9tVHJlZSE6IG5uRGVzY2VudC5Jbml0RnJvbVRyZWVGbjtcbiAgcHJpdmF0ZSBzZWFyY2ghOiBubkRlc2NlbnQuU2VhcmNoRm47XG4gIHByaXZhdGUgc2VhcmNoR3JhcGghOiBtYXRyaXguU3BhcnNlTWF0cml4O1xuXG4gIC8vIFN1cGVydmlzZWQgcHJvamVjdGlvbiBsYWJlbHMgLyB0YXJnZXRzXG4gIHByaXZhdGUgWT86IG51bWJlcltdO1xuXG4gIC8vIFByb2plY3RlZCBlbWJlZGRpbmdcbiAgcHJpdmF0ZSBlbWJlZGRpbmc6IG51bWJlcltdW10gPSBbXTtcbiAgcHJpdmF0ZSBvcHRpbWl6YXRpb25TdGF0ZSA9IG5ldyBPcHRpbWl6YXRpb25TdGF0ZSgpO1xuXG5cbiAgZ2V0IG5laWdoYm9ycygpIHtcbiAgICByZXR1cm4gdGhpcy5uTmVpZ2hib3JzO1xuICB9XG4gIGNvbnN0cnVjdG9yKHBhcmFtczogVU1BUFBhcmFtZXRlcnMgPSB7fSkge1xuICAgIGNvbnN0IHNldFBhcmFtID0gKGtleToga2V5b2YgVU1BUFBhcmFtZXRlcnMpID0+IHtcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgaWYgKHBhcmFtc1trZXldICE9PSB1bmRlZmluZWQpIHRoaXNba2V5XSA9IHBhcmFtc1trZXldO1xuICAgIH07XG5cbiAgICBzZXRQYXJhbSgnZGlzdGFuY2VGbicpO1xuICAgIHNldFBhcmFtKCdsZWFybmluZ1JhdGUnKTtcbiAgICBzZXRQYXJhbSgnbG9jYWxDb25uZWN0aXZpdHknKTtcbiAgICBzZXRQYXJhbSgnbWluRGlzdCcpO1xuICAgIHNldFBhcmFtKCduQ29tcG9uZW50cycpO1xuICAgIHNldFBhcmFtKCduRXBvY2hzJyk7XG4gICAgc2V0UGFyYW0oJ25OZWlnaGJvcnMnKTtcbiAgICBzZXRQYXJhbSgnbmVnYXRpdmVTYW1wbGVSYXRlJyk7XG4gICAgc2V0UGFyYW0oJ3JhbmRvbScpO1xuICAgIHNldFBhcmFtKCdyZXB1bHNpb25TdHJlbmd0aCcpO1xuICAgIHNldFBhcmFtKCdzZXRPcE1peFJhdGlvJyk7XG4gICAgc2V0UGFyYW0oJ3NwcmVhZCcpO1xuICAgIHNldFBhcmFtKCd0cmFuc2Zvcm1RdWV1ZVNpemUnKTtcbiAgICB0aGlzLnRhcmdldE5OZWlnaGJvcnMgPSBwYXJhbXMubk5laWdoYm9ycyB8fCB0aGlzLm5OZWlnaGJvcnMgfHwgdGhpcy50YXJnZXROTmVpZ2hib3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpdCB0aGUgZGF0YSB0byBhIHByb2plY3RlZCBlbWJlZGRpbmcgc3BhY2Ugc3luY2hyb25vdXNseS5cbiAgICovXG4gIGZpdChYOiBWZWN0b3IpIHtcbiAgICB0aGlzLmluaXRpYWxpemVGaXQoWCk7XG4gICAgdGhpcy5vcHRpbWl6ZUxheW91dCgpO1xuXG4gICAgcmV0dXJuIHRoaXMuZW1iZWRkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpdCB0aGUgZGF0YSB0byBhIHByb2plY3RlZCBlbWJlZGRpbmcgc3BhY2UgYXN5bmNocm9ub3VzbHksIHdpdGggYSBjYWxsYmFja1xuICAgKiBmdW5jdGlvbiBpbnZva2VkIG9uIGV2ZXJ5IGVwb2NoIG9mIG9wdGltaXphdGlvbi5cbiAgICovXG4gIGFzeW5jIGZpdEFzeW5jKFxuICAgIFg6IFZlY3RvcixcbiAgICBjYWxsYmFjazogKGVwb2NoTnVtYmVyOiBudW1iZXIpID0+IHZvaWQgfCBib29sZWFuID0gKCkgPT4gdHJ1ZVxuICApIHtcbiAgICB0aGlzLmluaXRpYWxpemVGaXQoWCk7XG5cbiAgICBhd2FpdCB0aGlzLm9wdGltaXplTGF5b3V0QXN5bmMoY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzLmVtYmVkZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBwYXJhbWV0ZXJzIG5lZWRlZCBmb3Igc3VwZXJ2aXNlZCBwcm9qZWN0aW9uLlxuICAgKi9cbiAgc2V0U3VwZXJ2aXNlZFByb2plY3Rpb24oWTogbnVtYmVyW10sIHBhcmFtczogVU1BUFN1cGVydmlzZWRQYXJhbXMgPSB7fSkge1xuICAgIHRoaXMuWSA9IFk7XG4gICAgdGhpcy50YXJnZXRNZXRyaWMgPSBwYXJhbXMudGFyZ2V0TWV0cmljIHx8IHRoaXMudGFyZ2V0TWV0cmljO1xuICAgIHRoaXMudGFyZ2V0V2VpZ2h0ID0gcGFyYW1zLnRhcmdldFdlaWdodCB8fCB0aGlzLnRhcmdldFdlaWdodDtcbiAgICB0aGlzLnRhcmdldE5OZWlnaGJvcnMgPSBwYXJhbXMudGFyZ2V0Tk5laWdoYm9ycyB8fCB0aGlzLnRhcmdldE5OZWlnaGJvcnM7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdW1hcCB3aXRoIHByZWNvbXB1dGVkIEtOTiBpbmRpY2VzIGFuZCBkaXN0YW5jZXMuXG4gICAqL1xuICBzZXRQcmVjb21wdXRlZEtOTihrbm5JbmRpY2VzOiBudW1iZXJbXVtdLCBrbm5EaXN0YW5jZXM6IG51bWJlcltdW10pIHtcbiAgICB0aGlzLmtubkluZGljZXMgPSBrbm5JbmRpY2VzO1xuICAgIHRoaXMua25uRGlzdGFuY2VzID0ga25uRGlzdGFuY2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGZpdCBieSBjb21wdXRpbmcgS05OIGFuZCBhIGZ1enp5IHNpbXBsaWNpYWwgc2V0LCBhcyB3ZWxsIGFzXG4gICAqIGluaXRpYWxpemluZyB0aGUgcHJvamVjdGVkIGVtYmVkZGluZ3MuIFNldHMgdGhlIG9wdGltaXphdGlvbiBzdGF0ZSBhaGVhZFxuICAgKiBvZiBvcHRpbWl6YXRpb24gc3RlcHMuIFJldHVybnMgdGhlIG51bWJlciBvZiBlcG9jaHMgdG8gYmUgdXNlZCBmb3IgdGhlXG4gICAqIFNHRCBvcHRpbWl6YXRpb24uXG4gICAqL1xuICBpbml0aWFsaXplRml0KFg6IFZlY3Rvcik6IG51bWJlciB7XG4gICAgaWYgKFgubGVuZ3RoIDw9IHRoaXMubk5laWdoYm9ycylcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm90IGVub3VnaCBkYXRhIHBvaW50cyAoJHtYLmxlbmd0aH0pIHRvIGNyZWF0ZSBuTmVpZ2hib3JzOiAke3RoaXMubk5laWdoYm9yc30uICBBZGQgbW9yZSBkYXRhIHBvaW50cyBvciBhZGp1c3QgdGhlIGNvbmZpZ3VyYXRpb24uYCk7XG5cblxuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmVpbml0aWFsaXplIGlmIHdlJ3ZlIGFscmVhZHkgaW5pdGlhbGl6ZWQgZm9yIHRoaXMgZGF0YS5cbiAgICBpZiAodGhpcy5YID09PSBYICYmIHRoaXMuaXNJbml0aWFsaXplZClcbiAgICAgIHJldHVybiB0aGlzLmdldE5FcG9jaHMoKTtcblxuXG4gICAgdGhpcy5YID0gWDtcblxuICAgIGlmICghdGhpcy5rbm5JbmRpY2VzICYmICF0aGlzLmtubkRpc3RhbmNlcykge1xuICAgICAgY29uc3Qga25uUmVzdWx0cyA9IHRoaXMubmVhcmVzdE5laWdoYm9ycyhYKTtcbiAgICAgIHRoaXMua25uSW5kaWNlcyA9IGtublJlc3VsdHMua25uSW5kaWNlcztcbiAgICAgIHRoaXMua25uRGlzdGFuY2VzID0ga25uUmVzdWx0cy5rbm5EaXN0YW5jZXM7XG4gICAgfVxuXG4gICAgdGhpcy5ncmFwaCA9IHRoaXMuZnV6enlTaW1wbGljaWFsU2V0KFxuICAgICAgWCxcbiAgICAgIHRoaXMubk5laWdoYm9ycyxcbiAgICAgIHRoaXMuc2V0T3BNaXhSYXRpb1xuICAgICk7XG5cbiAgICAvLyBTZXQgdXAgdGhlIHNlYXJjaCBncmFwaCBmb3Igc3Vic2VxdWVudCB0cmFuc2Zvcm1hdGlvbi5cbiAgICB0aGlzLm1ha2VTZWFyY2hGbnMoKTtcbiAgICB0aGlzLnNlYXJjaEdyYXBoID0gdGhpcy5tYWtlU2VhcmNoR3JhcGgoWCk7XG5cbiAgICAvLyBDaGVjayBpZiBzdXBlcnZpc2VkIHByb2plY3Rpb24sIHRoZW4gYWRqdXN0IHRoZSBncmFwaC5cbiAgICB0aGlzLnByb2Nlc3NHcmFwaEZvclN1cGVydmlzZWRQcm9qZWN0aW9uKCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBoZWFkLFxuICAgICAgdGFpbCxcbiAgICAgIGVwb2Noc1BlclNhbXBsZSxcbiAgICB9ID0gdGhpcy5pbml0aWFsaXplU2ltcGxpY2lhbFNldEVtYmVkZGluZygpO1xuXG4gICAgLy8gU2V0IHRoZSBvcHRpbWl6YXRpb24gcm91dGluZSBzdGF0ZVxuICAgIHRoaXMub3B0aW1pemF0aW9uU3RhdGUuaGVhZCA9IGhlYWQ7XG4gICAgdGhpcy5vcHRpbWl6YXRpb25TdGF0ZS50YWlsID0gdGFpbDtcbiAgICB0aGlzLm9wdGltaXphdGlvblN0YXRlLmVwb2Noc1BlclNhbXBsZSA9IGVwb2Noc1BlclNhbXBsZTtcblxuICAgIC8vIE5vdywgaW5pdGlhbGl6ZSB0aGUgb3B0aW1pemF0aW9uIHN0ZXBzXG4gICAgdGhpcy5pbml0aWFsaXplT3B0aW1pemF0aW9uKCk7XG4gICAgdGhpcy5wcmVwYXJlRm9yT3B0aW1pemF0aW9uTG9vcCgpO1xuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRORXBvY2hzKCk7XG4gIH1cblxuICBwcml2YXRlIG1ha2VTZWFyY2hGbnMoKSB7XG4gICAgY29uc3Qge2luaXRGcm9tVHJlZSwgaW5pdEZyb21SYW5kb219ID0gbm5EZXNjZW50Lm1ha2VJbml0aWFsaXphdGlvbnMoXG4gICAgICB0aGlzLmRpc3RhbmNlRm5cbiAgICApO1xuICAgIHRoaXMuaW5pdEZyb21UcmVlID0gaW5pdEZyb21UcmVlO1xuICAgIHRoaXMuaW5pdEZyb21SYW5kb20gPSBpbml0RnJvbVJhbmRvbTtcbiAgICB0aGlzLnNlYXJjaCA9IG5uRGVzY2VudC5tYWtlSW5pdGlhbGl6ZWROTlNlYXJjaCh0aGlzLmRpc3RhbmNlRm4pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlU2VhcmNoR3JhcGgoWDogVmVjdG9yKSB7XG4gICAgY29uc3Qga25uSW5kaWNlcyA9IHRoaXMua25uSW5kaWNlcyE7XG4gICAgY29uc3Qga25uRGlzdGFuY2VzID0gdGhpcy5rbm5EaXN0YW5jZXMhO1xuICAgIGNvbnN0IGRpbXMgPSBbWC5sZW5ndGgsIFgubGVuZ3RoXTtcbiAgICBjb25zdCBzZWFyY2hHcmFwaCA9IG5ldyBtYXRyaXguU3BhcnNlTWF0cml4KFtdLCBbXSwgW10sIGRpbXMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga25uSW5kaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga25uID0ga25uSW5kaWNlc1tpXTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlcyA9IGtubkRpc3RhbmNlc1tpXTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwga25uLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNvbnN0IG5laWdoYm9yID0ga25uW2pdO1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGRpc3RhbmNlc1tqXTtcbiAgICAgICAgaWYgKGRpc3RhbmNlID4gMClcbiAgICAgICAgICBzZWFyY2hHcmFwaC5zZXQoaSwgbmVpZ2hib3IsIGRpc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc3Bvc2UgPSBtYXRyaXgudHJhbnNwb3NlKHNlYXJjaEdyYXBoKTtcbiAgICByZXR1cm4gbWF0cml4Lm1heGltdW0oc2VhcmNoR3JhcGgsIHRyYW5zcG9zZSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtcyBkYXRhIHRvIHRoZSBleGlzdGluZyBlbWJlZGRpbmcgc3BhY2UuXG4gICAqL1xuICB0cmFuc2Zvcm0odG9UcmFuc2Zvcm06IFZlY3Rvcikge1xuICAgIC8vIFVzZSB0aGUgcHJldmlvdXMgcmF3RGF0YVxuICAgIGNvbnN0IHJhd0RhdGEgPSB0aGlzLlg7XG4gICAgaWYgKHJhd0RhdGEgPT09IHVuZGVmaW5lZCB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBoYXMgYmVlbiBmaXQuJyk7XG5cblxuICAgIGxldCBuTmVpZ2hib3JzID0gTWF0aC5mbG9vcih0aGlzLm5OZWlnaGJvcnMgKiB0aGlzLnRyYW5zZm9ybVF1ZXVlU2l6ZSk7XG4gICAgbk5laWdoYm9ycyA9IE1hdGgubWluKHJhd0RhdGEubGVuZ3RoLCBuTmVpZ2hib3JzKTtcbiAgICBjb25zdCBpbml0ID0gbm5EZXNjZW50LmluaXRpYWxpemVTZWFyY2goXG4gICAgICB0aGlzLnJwRm9yZXN0LFxuICAgICAgcmF3RGF0YSxcbiAgICAgIHRvVHJhbnNmb3JtLFxuICAgICAgbk5laWdoYm9ycyxcbiAgICAgIHRoaXMuaW5pdEZyb21SYW5kb20sXG4gICAgICB0aGlzLmluaXRGcm9tVHJlZSxcbiAgICAgIHRoaXMucmFuZG9tXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VhcmNoKHJhd0RhdGEsIHRoaXMuc2VhcmNoR3JhcGgsIGluaXQsIHRvVHJhbnNmb3JtKTtcblxuICAgIGxldCB7aW5kaWNlcywgd2VpZ2h0czogZGlzdGFuY2VzfSA9IGhlYXAuZGVoZWFwU29ydChyZXN1bHQpO1xuXG4gICAgaW5kaWNlcyA9IGluZGljZXMubWFwKCh4KSA9PiB4LnNsaWNlKDAsIHRoaXMubk5laWdoYm9ycykpO1xuICAgIGRpc3RhbmNlcyA9IGRpc3RhbmNlcy5tYXAoKHgpID0+IHguc2xpY2UoMCwgdGhpcy5uTmVpZ2hib3JzKSk7XG5cbiAgICBjb25zdCBhZGp1c3RlZExvY2FsQ29ubmVjdGl2aXR5ID0gTWF0aC5tYXgoMCwgdGhpcy5sb2NhbENvbm5lY3Rpdml0eSAtIDEpO1xuICAgIGNvbnN0IHtzaWdtYXMsIHJob3N9ID0gdGhpcy5zbW9vdGhLTk5EaXN0YW5jZShcbiAgICAgIGRpc3RhbmNlcyxcbiAgICAgIHRoaXMubk5laWdoYm9ycyxcbiAgICAgIGFkanVzdGVkTG9jYWxDb25uZWN0aXZpdHlcbiAgICApO1xuXG4gICAgY29uc3Qge3Jvd3MsIGNvbHMsIHZhbHN9ID0gdGhpcy5jb21wdXRlTWVtYmVyc2hpcFN0cmVuZ3RocyhcbiAgICAgIGluZGljZXMsXG4gICAgICBkaXN0YW5jZXMsXG4gICAgICBzaWdtYXMsXG4gICAgICByaG9zXG4gICAgKTtcblxuICAgIGNvbnN0IHNpemUgPSBbdG9UcmFuc2Zvcm0ubGVuZ3RoLCByYXdEYXRhLmxlbmd0aF07XG4gICAgbGV0IGdyYXBoID0gbmV3IG1hdHJpeC5TcGFyc2VNYXRyaXgocm93cywgY29scywgdmFscywgc2l6ZSk7XG5cbiAgICAvLyBUaGlzIHdhcyBhIHZlcnkgc3BlY2lhbGx5IGNvbnN0cnVjdGVkIGdyYXBoIHdpdGggY29uc3RhbnQgZGVncmVlLlxuICAgIC8vIFRoYXQgbGV0cyB1cyBkbyBmYW5jeSB1bnBhY2tpbmcgYnkgcmVzaGFwaW5nIHRoZSBjc3IgbWF0cml4IGluZGljZXNcbiAgICAvLyBhbmQgZGF0YS4gRG9pbmcgc28gcmVsaWVzIG9uIHRoZSBjb25zdGFudCBkZWdyZWUgYXNzdW1wdGlvbiFcblxuICAgIGNvbnN0IG5vcm1lZCA9IG1hdHJpeC5ub3JtYWxpemUoZ3JhcGgsIG1hdHJpeC5Ob3JtVHlwZS5sMSk7XG5cbiAgICBjb25zdCBjc3JNYXRyaXggPSBtYXRyaXguZ2V0Q1NSKG5vcm1lZCk7XG4gICAgY29uc3QgblBvaW50cyA9IHRvVHJhbnNmb3JtLmxlbmd0aDtcblxuICAgIGNvbnN0IGVJbmRpY2VzID0gdXRpbHMucmVzaGFwZTJkKFxuICAgICAgY3NyTWF0cml4LmluZGljZXMsXG4gICAgICBuUG9pbnRzLFxuICAgICAgdGhpcy5uTmVpZ2hib3JzXG4gICAgKTtcblxuICAgIGNvbnN0IGVXZWlnaHRzID0gdXRpbHMucmVzaGFwZTJkKFxuICAgICAgY3NyTWF0cml4LnZhbHVlcyxcbiAgICAgIG5Qb2ludHMsXG4gICAgICB0aGlzLm5OZWlnaGJvcnNcbiAgICApO1xuXG4gICAgY29uc3QgZW1iZWRkaW5nID0gaW5pdFRyYW5zZm9ybShlSW5kaWNlcywgZVdlaWdodHMsIHRoaXMuZW1iZWRkaW5nKTtcblxuICAgIGNvbnN0IG5FcG9jaHMgPSB0aGlzLm5FcG9jaHMgP1xuICAgICAgdGhpcy5uRXBvY2hzIC8gMyA6XG4gICAgICBncmFwaC5uUm93cyA8PSAxMDAwMCA/XG4gICAgICAgIDEwMCA6XG4gICAgICAgIDMwO1xuXG4gICAgY29uc3QgZ3JhcGhNYXggPSBncmFwaFxuICAgICAgLmdldFZhbHVlcygpXG4gICAgICAucmVkdWNlKChtYXgsIHZhbCkgPT4gKHZhbCA+IG1heCA/IHZhbCA6IG1heCksIDApO1xuICAgIGdyYXBoID0gZ3JhcGgubWFwKCh2YWx1ZSkgPT4gKHZhbHVlIDwgZ3JhcGhNYXggLyBuRXBvY2hzID8gMCA6IHZhbHVlKSk7XG4gICAgZ3JhcGggPSBtYXRyaXguZWxpbWluYXRlWmVyb3MoZ3JhcGgpO1xuXG4gICAgY29uc3QgZXBvY2hzUGVyU2FtcGxlID0gdGhpcy5tYWtlRXBvY2hzUGVyU2FtcGxlKFxuICAgICAgZ3JhcGguZ2V0VmFsdWVzKCksXG4gICAgICBuRXBvY2hzXG4gICAgKTtcbiAgICBjb25zdCBoZWFkID0gZ3JhcGguZ2V0Um93cygpO1xuICAgIGNvbnN0IHRhaWwgPSBncmFwaC5nZXRDb2xzKCk7XG5cbiAgICAvLyBJbml0aWFsaXplIG9wdGltaXphdGlvbiBzbGlnaHRseSBkaWZmZXJlbnRseSB0aGFuIHRoZSBmaXQgbWV0aG9kLlxuICAgIHRoaXMuYXNzaWduT3B0aW1pemF0aW9uU3RhdGVQYXJhbWV0ZXJzKHtcbiAgICAgIGhlYWRFbWJlZGRpbmc6IGVtYmVkZGluZyxcbiAgICAgIHRhaWxFbWJlZGRpbmc6IHRoaXMuZW1iZWRkaW5nLFxuICAgICAgaGVhZCxcbiAgICAgIHRhaWwsXG4gICAgICBjdXJyZW50RXBvY2g6IDAsXG4gICAgICBuRXBvY2hzLFxuICAgICAgblZlcnRpY2VzOiBncmFwaC5nZXREaW1zKClbMV0sXG4gICAgICBlcG9jaHNQZXJTYW1wbGUsXG4gICAgfSk7XG4gICAgdGhpcy5wcmVwYXJlRm9yT3B0aW1pemF0aW9uTG9vcCgpO1xuXG4gICAgcmV0dXJuIHRoaXMub3B0aW1pemVMYXlvdXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgd2UncmUgdXNpbmcgc3VwZXJ2aXNlZCBwcm9qZWN0aW9uLCB0aGVuIHByb2Nlc3MgdGhlIGdyYXBoXG4gICAqIGFjY29yZGluZ2x5LlxuICAgKi9cbiAgcHJpdmF0ZSBwcm9jZXNzR3JhcGhGb3JTdXBlcnZpc2VkUHJvamVjdGlvbigpIHtcbiAgICBjb25zdCB7WSwgWH0gPSB0aGlzO1xuICAgIGlmIChZKSB7XG4gICAgICBpZiAoWS5sZW5ndGggIT09IFgubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xlbmd0aCBvZiBYIGFuZCB5IG11c3QgYmUgZXF1YWwnKTtcblxuXG4gICAgICBpZiAodGhpcy50YXJnZXRNZXRyaWMgPT09IFRhcmdldE1ldHJpYy5jYXRlZ29yaWNhbCkge1xuICAgICAgICBjb25zdCBsdCA9IHRoaXMudGFyZ2V0V2VpZ2h0IDwgMS4wO1xuICAgICAgICBjb25zdCBmYXJEaXN0ID0gbHQgPyAyLjUgKiAoMS4wIC8gKDEuMCAtIHRoaXMudGFyZ2V0V2VpZ2h0KSkgOiAxLjBlMTI7XG4gICAgICAgIHRoaXMuZ3JhcGggPSB0aGlzLmNhdGVnb3JpY2FsU2ltcGxpY2lhbFNldEludGVyc2VjdGlvbihcbiAgICAgICAgICB0aGlzLmdyYXBoLFxuICAgICAgICAgIFksXG4gICAgICAgICAgZmFyRGlzdFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETyAoYW5keWNvZW5lbkApOiBhZGQgbm9uLWNhdGVnb3JpY2FsIHN1cGVydmlzZWQgZW1iZWRkaW5ncy5cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFudWFsbHkgc3RlcCB0aHJvdWdoIHRoZSBvcHRpbWl6YXRpb24gcHJvY2VzcyBvbmUgZXBvY2ggYXQgYSB0aW1lLlxuICAgKi9cbiAgc3RlcCgpIHtcbiAgICBjb25zdCB7Y3VycmVudEVwb2NofSA9IHRoaXMub3B0aW1pemF0aW9uU3RhdGU7XG5cbiAgICBpZiAoY3VycmVudEVwb2NoIDwgdGhpcy5nZXRORXBvY2hzKCkpXG4gICAgICB0aGlzLm9wdGltaXplTGF5b3V0U3RlcChjdXJyZW50RXBvY2gpO1xuXG4gICAgcmV0dXJuIHRoaXMub3B0aW1pemF0aW9uU3RhdGUuY3VycmVudEVwb2NoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbXB1dGVkIHByb2plY3RlZCBlbWJlZGRpbmcuXG4gICAqL1xuICBnZXRFbWJlZGRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1iZWRkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgdGhlIGBgbk5laWdoYm9yc2BgIG5lYXJlc3QgcG9pbnRzIGZvciBlYWNoIGRhdGEgcG9pbnQgaW4gYGBYYGBcbiAgICogVGhpcyBtYXkgYmUgZXhhY3QsIGJ1dCBtb3JlIGxpa2VseSBpcyBhcHByb3hpbWF0ZWQgdmlhIG5lYXJlc3QgbmVpZ2hib3JcbiAgICogZGVzY2VudC5cbiAgICovXG4gIHByaXZhdGUgbmVhcmVzdE5laWdoYm9ycyhYOiBWZWN0b3IpIHtcbiAgICBjb25zdCB7ZGlzdGFuY2VGbiwgbk5laWdoYm9yc30gPSB0aGlzO1xuICAgIGNvbnN0IGxvZzIgPSAobjogbnVtYmVyKSA9PiBNYXRoLmxvZyhuKSAvIE1hdGgubG9nKDIpO1xuICAgIGNvbnN0IG1ldHJpY05ORGVzY2VudCA9IG5uRGVzY2VudC5tYWtlTk5EZXNjZW50KGRpc3RhbmNlRm4sIHRoaXMucmFuZG9tKTtcblxuICAgIC8vIEhhbmRsZSBweXRob24zIHJvdW5kaW5nIGRvd24gZnJvbSAwLjUgZGlzY3JwYW5jeVxuICAgIGNvbnN0IHJvdW5kID0gKG46IG51bWJlcikgPT4ge1xuICAgICAgcmV0dXJuIG4gPT09IDAuNSA/IDAgOiBNYXRoLnJvdW5kKG4pO1xuICAgIH07XG5cbiAgICBjb25zdCBuVHJlZXMgPSA1ICsgTWF0aC5mbG9vcihyb3VuZChYLmxlbmd0aCAqKiAwLjUgLyAyMC4wKSk7XG4gICAgY29uc3Qgbkl0ZXJzID0gTWF0aC5tYXgoNSwgTWF0aC5mbG9vcihNYXRoLnJvdW5kKGxvZzIoWC5sZW5ndGgpKSkpO1xuXG4gICAgdGhpcy5ycEZvcmVzdCA9IHRyZWUubWFrZUZvcmVzdChYLCBuTmVpZ2hib3JzLCBuVHJlZXMsIHRoaXMucmFuZG9tKTtcblxuICAgIGNvbnN0IGxlYWZBcnJheSA9IHRyZWUubWFrZUxlYWZBcnJheSh0aGlzLnJwRm9yZXN0KTtcbiAgICBjb25zdCB7aW5kaWNlcywgd2VpZ2h0c30gPSBtZXRyaWNOTkRlc2NlbnQoXG4gICAgICBYLFxuICAgICAgbGVhZkFycmF5LFxuICAgICAgbk5laWdoYm9ycyxcbiAgICAgIG5JdGVyc1xuICAgICk7XG4gICAgcmV0dXJuIHtrbm5JbmRpY2VzOiBpbmRpY2VzLCBrbm5EaXN0YW5jZXM6IHdlaWdodHN9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgc2V0IG9mIGRhdGEgWCwgYSBuZWlnaGJvcmhvb2Qgc2l6ZSwgYW5kIGEgbWVhc3VyZSBvZiBkaXN0YW5jZVxuICAgKiBjb21wdXRlIHRoZSBmdXp6eSBzaW1wbGljaWFsIHNldCAoaGVyZSByZXByZXNlbnRlZCBhcyBhIGZ1enp5IGdyYXBoIGluXG4gICAqIHRoZSBmb3JtIG9mIGEgc3BhcnNlIG1hdHJpeCkgYXNzb2NpYXRlZCB0byB0aGUgZGF0YS4gVGhpcyBpcyBkb25lIGJ5XG4gICAqIGxvY2FsbHkgYXBwcm94aW1hdGluZyBnZW9kZXNpYyBkaXN0YW5jZSBhdCBlYWNoIHBvaW50LCBjcmVhdGluZyBhIGZ1enp5XG4gICAqIHNpbXBsaWNpYWwgc2V0IGZvciBlYWNoIHN1Y2ggcG9pbnQsIGFuZCB0aGVuIGNvbWJpbmluZyBhbGwgdGhlIGxvY2FsXG4gICAqIGZ1enp5IHNpbXBsaWNpYWwgc2V0cyBpbnRvIGEgZ2xvYmFsIG9uZSB2aWEgYSBmdXp6eSB1bmlvbi5cbiAgICovXG4gIHByaXZhdGUgZnV6enlTaW1wbGljaWFsU2V0KFxuICAgIFg6IFZlY3RvcixcbiAgICBuTmVpZ2hib3JzOiBudW1iZXIsXG4gICAgc2V0T3BNaXhSYXRpbyA9IDEuMFxuICApIHtcbiAgICBjb25zdCB7a25uSW5kaWNlcyA9IFtdLCBrbm5EaXN0YW5jZXMgPSBbXSwgbG9jYWxDb25uZWN0aXZpdHl9ID0gdGhpcztcblxuICAgIGNvbnN0IHtzaWdtYXMsIHJob3N9ID0gdGhpcy5zbW9vdGhLTk5EaXN0YW5jZShcbiAgICAgIGtubkRpc3RhbmNlcyxcbiAgICAgIG5OZWlnaGJvcnMsXG4gICAgICBsb2NhbENvbm5lY3Rpdml0eVxuICAgICk7XG5cbiAgICBjb25zdCB7cm93cywgY29scywgdmFsc30gPSB0aGlzLmNvbXB1dGVNZW1iZXJzaGlwU3RyZW5ndGhzKFxuICAgICAga25uSW5kaWNlcyxcbiAgICAgIGtubkRpc3RhbmNlcyxcbiAgICAgIHNpZ21hcyxcbiAgICAgIHJob3NcbiAgICApO1xuXG4gICAgY29uc3Qgc2l6ZSA9IFtYLmxlbmd0aCwgWC5sZW5ndGhdO1xuICAgIGNvbnN0IHNwYXJzZU1hdHJpeCA9IG5ldyBtYXRyaXguU3BhcnNlTWF0cml4KHJvd3MsIGNvbHMsIHZhbHMsIHNpemUpO1xuXG4gICAgY29uc3QgdHJhbnNwb3NlID0gbWF0cml4LnRyYW5zcG9zZShzcGFyc2VNYXRyaXgpO1xuICAgIGNvbnN0IHByb2RNYXRyaXggPSBtYXRyaXgucGFpcndpc2VNdWx0aXBseShzcGFyc2VNYXRyaXgsIHRyYW5zcG9zZSk7XG5cbiAgICBjb25zdCBhID0gbWF0cml4LnN1YnRyYWN0KG1hdHJpeC5hZGQoc3BhcnNlTWF0cml4LCB0cmFuc3Bvc2UpLCBwcm9kTWF0cml4KTtcbiAgICBjb25zdCBiID0gbWF0cml4Lm11bHRpcGx5U2NhbGFyKGEsIHNldE9wTWl4UmF0aW8pO1xuICAgIGNvbnN0IGMgPSBtYXRyaXgubXVsdGlwbHlTY2FsYXIocHJvZE1hdHJpeCwgMS4wIC0gc2V0T3BNaXhSYXRpbyk7XG4gICAgY29uc3QgcmVzdWx0ID0gbWF0cml4LmFkZChiLCBjKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29tYmluZSBhIGZ1enp5IHNpbXBsaWNpYWwgc2V0IHdpdGggYW5vdGhlciBmdXp6eSBzaW1wbGljaWFsIHNldFxuICAgKiBnZW5lcmF0ZWQgZnJvbSBjYXRlZ29yaWNhbCBkYXRhIHVzaW5nIGNhdGVnb3JpY2FsIGRpc3RhbmNlcy4gVGhlIHRhcmdldFxuICAgKiBkYXRhIGlzIGFzc3VtZWQgdG8gYmUgY2F0ZWdvcmljYWwgbGFiZWwgZGF0YSAoYSB2ZWN0b3Igb2YgbGFiZWxzKSxcbiAgICogYW5kIHRoaXMgd2lsbCB1cGRhdGUgdGhlIGZ1enp5IHNpbXBsaWNpYWwgc2V0IHRvIHJlc3BlY3QgdGhhdCBsYWJlbCBkYXRhLlxuICAgKi9cbiAgcHJpdmF0ZSBjYXRlZ29yaWNhbFNpbXBsaWNpYWxTZXRJbnRlcnNlY3Rpb24oXG4gICAgc2ltcGxpY2lhbFNldDogbWF0cml4LlNwYXJzZU1hdHJpeCxcbiAgICB0YXJnZXQ6IG51bWJlcltdLFxuICAgIGZhckRpc3Q6IG51bWJlcixcbiAgICB1bmtub3duRGlzdCA9IDEuMFxuICApIHtcbiAgICBsZXQgaW50ZXJzZWN0aW9uID0gZmFzdEludGVyc2VjdGlvbihcbiAgICAgIHNpbXBsaWNpYWxTZXQsXG4gICAgICB0YXJnZXQsXG4gICAgICB1bmtub3duRGlzdCxcbiAgICAgIGZhckRpc3RcbiAgICApO1xuICAgIGludGVyc2VjdGlvbiA9IG1hdHJpeC5lbGltaW5hdGVaZXJvcyhpbnRlcnNlY3Rpb24pO1xuICAgIHJldHVybiByZXNldExvY2FsQ29ubmVjdGl2aXR5KGludGVyc2VjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZSBhIGNvbnRpbnVvdXMgdmVyc2lvbiBvZiB0aGUgZGlzdGFuY2UgdG8gdGhlIGt0aCBuZWFyZXN0XG4gICAqIG5laWdoYm9yLiBUaGF0IGlzLCB0aGlzIGlzIHNpbWlsYXIgdG8ga25uLWRpc3RhbmNlIGJ1dCBhbGxvd3MgY29udGludW91c1xuICAgKiBrIHZhbHVlcyByYXRoZXIgdGhhbiByZXF1aXJpbmcgYW4gaW50ZWdyYWwgay4gSW4gZXNzY2VuY2Ugd2UgYXJlIHNpbXBseVxuICAgKiBjb21wdXRpbmcgdGhlIGRpc3RhbmNlIHN1Y2ggdGhhdCB0aGUgY2FyZGluYWxpdHkgb2YgZnV6enkgc2V0IHdlIGdlbmVyYXRlXG4gICAqIGlzIGsuXG4gICAqL1xuICBwcml2YXRlIHNtb290aEtOTkRpc3RhbmNlKFxuICAgIGRpc3RhbmNlczogVmVjdG9ycyxcbiAgICBrOiBudW1iZXIsXG4gICAgbG9jYWxDb25uZWN0aXZpdHkgPSAxLjAsXG4gICAgbkl0ZXIgPSA2NCxcbiAgICBiYW5kd2lkdGggPSAxLjBcbiAgKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gKE1hdGgubG9nKGspIC8gTWF0aC5sb2coMikpICogYmFuZHdpZHRoO1xuICAgIGNvbnN0IHJobyA9IHV0aWxzLnplcm9zKGRpc3RhbmNlcy5sZW5ndGgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHV0aWxzLnplcm9zKGRpc3RhbmNlcy5sZW5ndGgpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXN0YW5jZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBsbyA9IDAuMDtcbiAgICAgIGxldCBoaSA9IEluZmluaXR5O1xuICAgICAgbGV0IG1pZCA9IDEuMDtcblxuICAgICAgLy8gVE9ETzogVGhpcyBpcyB2ZXJ5IGluZWZmaWNpZW50LCBidXQgd2lsbCBkbyBmb3Igbm93LiBGSVhNRVxuICAgICAgY29uc3QgaXRoRGlzdGFuY2VzID0gZGlzdGFuY2VzW2ldO1xuICAgICAgY29uc3Qgbm9uWmVyb0Rpc3RzID0gaXRoRGlzdGFuY2VzLmZpbHRlcigoZCkgPT4gZCA+IDAuMCk7XG5cbiAgICAgIGlmIChub25aZXJvRGlzdHMubGVuZ3RoID49IGxvY2FsQ29ubmVjdGl2aXR5KSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gTWF0aC5mbG9vcihsb2NhbENvbm5lY3Rpdml0eSk7XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRpb24gPSBsb2NhbENvbm5lY3Rpdml0eSAtIGluZGV4O1xuICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgcmhvW2ldID0gbm9uWmVyb0Rpc3RzW2luZGV4IC0gMV07XG4gICAgICAgICAgaWYgKGludGVycG9sYXRpb24gPiBTTU9PVEhfS19UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgIHJob1tpXSArPVxuICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uICogKG5vblplcm9EaXN0c1tpbmRleF0gLSBub25aZXJvRGlzdHNbaW5kZXggLSAxXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJob1tpXSA9IGludGVycG9sYXRpb24gKiBub25aZXJvRGlzdHNbMF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9uWmVyb0Rpc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmhvW2ldID0gdXRpbHMubWF4KG5vblplcm9EaXN0cyk7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbkl0ZXI7IG4rKykge1xuICAgICAgICBsZXQgcHN1bSA9IDAuMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDE7IGogPCBkaXN0YW5jZXNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBjb25zdCBkID0gZGlzdGFuY2VzW2ldW2pdIC0gcmhvW2ldO1xuICAgICAgICAgIGlmIChkID4gMClcbiAgICAgICAgICAgIHBzdW0gKz0gTWF0aC5leHAoLShkIC8gbWlkKSk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgcHN1bSArPSAxLjA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoTWF0aC5hYnMocHN1bSAtIHRhcmdldCkgPCBTTU9PVEhfS19UT0xFUkFOQ0UpXG4gICAgICAgICAgYnJlYWs7XG5cblxuICAgICAgICBpZiAocHN1bSA+IHRhcmdldCkge1xuICAgICAgICAgIGhpID0gbWlkO1xuICAgICAgICAgIG1pZCA9IChsbyArIGhpKSAvIDIuMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsbyA9IG1pZDtcbiAgICAgICAgICBpZiAoaGkgPT09IEluZmluaXR5KVxuICAgICAgICAgICAgbWlkICo9IDI7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgbWlkID0gKGxvICsgaGkpIC8gMi4wO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdFtpXSA9IG1pZDtcblxuICAgICAgLy8gVE9ETzogVGhpcyBpcyB2ZXJ5IGluZWZmaWNpZW50LCBidXQgd2lsbCBkbyBmb3Igbm93LiBGSVhNRVxuICAgICAgaWYgKHJob1tpXSA+IDAuMCkge1xuICAgICAgICBjb25zdCBtZWFuSXRoRGlzdGFuY2VzID0gdXRpbHMubWVhbihpdGhEaXN0YW5jZXMpO1xuICAgICAgICBpZiAocmVzdWx0W2ldIDwgTUlOX0tfRElTVF9TQ0FMRSAqIG1lYW5JdGhEaXN0YW5jZXMpXG4gICAgICAgICAgcmVzdWx0W2ldID0gTUlOX0tfRElTVF9TQ0FMRSAqIG1lYW5JdGhEaXN0YW5jZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtZWFuRGlzdGFuY2VzID0gdXRpbHMubWVhbihkaXN0YW5jZXMubWFwKHV0aWxzLm1lYW4pKTtcbiAgICAgICAgaWYgKHJlc3VsdFtpXSA8IE1JTl9LX0RJU1RfU0NBTEUgKiBtZWFuRGlzdGFuY2VzKVxuICAgICAgICAgIHJlc3VsdFtpXSA9IE1JTl9LX0RJU1RfU0NBTEUgKiBtZWFuRGlzdGFuY2VzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7c2lnbWFzOiByZXN1bHQsIHJob3M6IHJob307XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0IHRoZSBtZW1iZXJzaGlwIHN0cmVuZ3RoIGRhdGEgZm9yIHRoZSAxLXNrZWxldG9uIG9mIGVhY2ggbG9jYWxcbiAgICogZnV6enkgc2ltcGxpY2lhbCBzZXQgLS0gdGhpcyBpcyBmb3JtZWQgYXMgYSBzcGFyc2UgbWF0cml4IHdoZXJlIGVhY2ggcm93IGlzXG4gICAqIGEgbG9jYWwgZnV6enkgc2ltcGxpY2lhbCBzZXQsIHdpdGggYSBtZW1iZXJzaGlwIHN0cmVuZ3RoIGZvciB0aGVcbiAgICogMS1zaW1wbGV4IHRvIGVhY2ggb3RoZXIgZGF0YSBwb2ludC5cbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZU1lbWJlcnNoaXBTdHJlbmd0aHMoXG4gICAga25uSW5kaWNlczogVmVjdG9ycyxcbiAgICBrbm5EaXN0YW5jZXM6IFZlY3RvcnMsXG4gICAgc2lnbWFzOiBudW1iZXJbXSxcbiAgICByaG9zOiBudW1iZXJbXVxuICApOiB7IHJvd3M6IG51bWJlcltdOyBjb2xzOiBudW1iZXJbXTsgdmFsczogbnVtYmVyW10gfSB7XG4gICAgY29uc3QgblNhbXBsZXMgPSBrbm5JbmRpY2VzLmxlbmd0aDtcbiAgICBjb25zdCBuTmVpZ2hib3JzID0ga25uSW5kaWNlc1swXS5sZW5ndGg7XG5cbiAgICBjb25zdCByb3dzID0gdXRpbHMuemVyb3MoblNhbXBsZXMgKiBuTmVpZ2hib3JzKTtcbiAgICBjb25zdCBjb2xzID0gdXRpbHMuemVyb3MoblNhbXBsZXMgKiBuTmVpZ2hib3JzKTtcbiAgICBjb25zdCB2YWxzID0gdXRpbHMuemVyb3MoblNhbXBsZXMgKiBuTmVpZ2hib3JzKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblNhbXBsZXM7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuTmVpZ2hib3JzOyBqKyspIHtcbiAgICAgICAgbGV0IHZhbCA9IDA7XG4gICAgICAgIGlmIChrbm5JbmRpY2VzW2ldW2pdID09PSAtMSlcbiAgICAgICAgICBjb250aW51ZTsgLy8gV2UgZGlkbid0IGdldCB0aGUgZnVsbCBrbm4gZm9yIGlcblxuICAgICAgICBpZiAoa25uSW5kaWNlc1tpXVtqXSA9PT0gaSlcbiAgICAgICAgICB2YWwgPSAwLjA7XG4gICAgICAgIGVsc2UgaWYgKGtubkRpc3RhbmNlc1tpXVtqXSAtIHJob3NbaV0gPD0gMC4wKVxuICAgICAgICAgIHZhbCA9IDEuMDtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHZhbCA9IE1hdGguZXhwKC0oKGtubkRpc3RhbmNlc1tpXVtqXSAtIHJob3NbaV0pIC8gc2lnbWFzW2ldKSk7XG5cblxuICAgICAgICByb3dzW2kgKiBuTmVpZ2hib3JzICsgal0gPSBpO1xuICAgICAgICBjb2xzW2kgKiBuTmVpZ2hib3JzICsgal0gPSBrbm5JbmRpY2VzW2ldW2pdO1xuICAgICAgICB2YWxzW2kgKiBuTmVpZ2hib3JzICsgal0gPSB2YWw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtyb3dzLCBjb2xzLCB2YWxzfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGEgZnV6enkgc2ltcGxpY2lhbCBzZXQgZW1iZWRkaW5nLCB1c2luZyBhIHNwZWNpZmllZFxuICAgKiBpbml0aWFsaXNhdGlvbiBtZXRob2QgYW5kIHRoZW4gbWluaW1pemluZyB0aGUgZnV6enkgc2V0IGNyb3NzIGVudHJvcHlcbiAgICogYmV0d2VlbiB0aGUgMS1za2VsZXRvbnMgb2YgdGhlIGhpZ2ggYW5kIGxvdyBkaW1lbnNpb25hbCBmdXp6eSBzaW1wbGljaWFsXG4gICAqIHNldHMuXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemVTaW1wbGljaWFsU2V0RW1iZWRkaW5nKCkge1xuICAgIGNvbnN0IG5FcG9jaHMgPSB0aGlzLmdldE5FcG9jaHMoKTtcblxuICAgIGNvbnN0IHtuQ29tcG9uZW50c30gPSB0aGlzO1xuICAgIGNvbnN0IGdyYXBoVmFsdWVzID0gdGhpcy5ncmFwaC5nZXRWYWx1ZXMoKTtcbiAgICBsZXQgZ3JhcGhNYXggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JhcGhWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ3JhcGhWYWx1ZXNbaV07XG4gICAgICBpZiAoZ3JhcGhNYXggPCBncmFwaFZhbHVlc1tpXSlcbiAgICAgICAgZ3JhcGhNYXggPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBncmFwaCA9IHRoaXMuZ3JhcGgubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlIDwgZ3JhcGhNYXggLyBuRXBvY2hzKVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuXG4gICAgLy8gV2UncmUgbm90IGNvbXB1dGluZyB0aGUgc3BlY3RyYWwgaW5pdGlhbGl6YXRpb24gaW4gdGhpcyBpbXBsZW1lbnRhdGlvblxuICAgIC8vIHVudGlsIHdlIGRldGVybWluZSBhIGJldHRlciBlaWdlbnZhbHVlL2VpZ2VudmVjdG9yIGNvbXB1dGF0aW9uXG4gICAgLy8gYXBwcm9hY2hcbiAgICB0aGlzLmVtYmVkZGluZyA9IHV0aWxzLnplcm9zKGdyYXBoLm5Sb3dzKS5tYXAoKCkgPT4ge1xuICAgICAgcmV0dXJuIHV0aWxzLnplcm9zKG5Db21wb25lbnRzKS5tYXAoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdXRpbHMudGF1UmFuZCh0aGlzLnJhbmRvbSkgKiAyMCArIC0xMDsgLy8gUmFuZG9tIGZyb20gLTEwIHRvIDEwXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEdldCBncmFwaCBkYXRhIGluIG9yZGVyZWQgd2F5Li4uXG4gICAgY29uc3Qgd2VpZ2h0czogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBoZWFkOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IHRhaWw6IG51bWJlcltdID0gW107XG4gICAgY29uc3Qgcm93Q29sVmFsdWVzID0gZ3JhcGguZ2V0QWxsKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dDb2xWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gcm93Q29sVmFsdWVzW2ldO1xuICAgICAgaWYgKGVudHJ5LnZhbHVlKSB7XG4gICAgICAgIHdlaWdodHMucHVzaChlbnRyeS52YWx1ZSk7XG4gICAgICAgIHRhaWwucHVzaChlbnRyeS5yb3cpO1xuICAgICAgICBoZWFkLnB1c2goZW50cnkuY29sKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZXBvY2hzUGVyU2FtcGxlID0gdGhpcy5tYWtlRXBvY2hzUGVyU2FtcGxlKHdlaWdodHMsIG5FcG9jaHMpO1xuXG4gICAgcmV0dXJuIHtoZWFkLCB0YWlsLCBlcG9jaHNQZXJTYW1wbGV9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgc2V0IG9mIHdlaWdodHMgYW5kIG51bWJlciBvZiBlcG9jaHMgZ2VuZXJhdGUgdGhlIG51bWJlciBvZlxuICAgKiBlcG9jaHMgcGVyIHNhbXBsZSBmb3IgZWFjaCB3ZWlnaHQuXG4gICAqL1xuICBwcml2YXRlIG1ha2VFcG9jaHNQZXJTYW1wbGUod2VpZ2h0czogbnVtYmVyW10sIG5FcG9jaHM6IG51bWJlcikge1xuICAgIGNvbnN0IHJlc3VsdCA9IHV0aWxzLmZpbGxlZCh3ZWlnaHRzLmxlbmd0aCwgLTEuMCk7XG4gICAgY29uc3QgbWF4ID0gdXRpbHMubWF4KHdlaWdodHMpO1xuICAgIGNvbnN0IG5TYW1wbGVzID0gd2VpZ2h0cy5tYXAoKHcpID0+ICh3IC8gbWF4KSAqIG5FcG9jaHMpO1xuICAgIG5TYW1wbGVzLmZvckVhY2goKG4sIGkpID0+IHtcbiAgICAgIGlmIChuID4gMCkgcmVzdWx0W2ldID0gbkVwb2NocyAvIG5TYW1wbGVzW2ldO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQXNzaWducyBvcHRpbWl6YXRpb24gc3RhdGUgcGFyYW1ldGVycyBmcm9tIGEgcGFydGlhbCBvcHRpbWl6YXRpb24gc3RhdGUuXG4gICAqL1xuICBwcml2YXRlIGFzc2lnbk9wdGltaXphdGlvblN0YXRlUGFyYW1ldGVycyhzdGF0ZTogUGFydGlhbDxPcHRpbWl6YXRpb25TdGF0ZT4pIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW1pemF0aW9uU3RhdGUsIHN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgZmV3IG9wdGltaXphdGlvbiBzdGF0ZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIG5lY2Vzc2FyeSBiZWZvcmUgZW50ZXJpbmdcbiAgICogdGhlIG9wdGltaXphdGlvbiBzdGVwIGxvb3AuXG4gICAqL1xuICBwcml2YXRlIHByZXBhcmVGb3JPcHRpbWl6YXRpb25Mb29wKCkge1xuICAgIC8vIEh5cGVycGFyYW1ldGVyc1xuICAgIGNvbnN0IHtyZXB1bHNpb25TdHJlbmd0aCwgbGVhcm5pbmdSYXRlLCBuZWdhdGl2ZVNhbXBsZVJhdGV9ID0gdGhpcztcblxuICAgIGNvbnN0IHtcbiAgICAgIGVwb2Noc1BlclNhbXBsZSxcbiAgICAgIGhlYWRFbWJlZGRpbmcsXG4gICAgICB0YWlsRW1iZWRkaW5nLFxuICAgIH0gPSB0aGlzLm9wdGltaXphdGlvblN0YXRlO1xuXG4gICAgY29uc3QgZGltID0gaGVhZEVtYmVkZGluZ1swXS5sZW5ndGg7XG4gICAgY29uc3QgbW92ZU90aGVyID0gaGVhZEVtYmVkZGluZy5sZW5ndGggPT09IHRhaWxFbWJlZGRpbmcubGVuZ3RoO1xuXG4gICAgY29uc3QgZXBvY2hzUGVyTmVnYXRpdmVTYW1wbGUgPSBlcG9jaHNQZXJTYW1wbGUubWFwKFxuICAgICAgKGUpID0+IGUgLyBuZWdhdGl2ZVNhbXBsZVJhdGVcbiAgICApO1xuICAgIGNvbnN0IGVwb2NoT2ZOZXh0TmVnYXRpdmVTYW1wbGUgPSBbLi4uZXBvY2hzUGVyTmVnYXRpdmVTYW1wbGVdO1xuICAgIGNvbnN0IGVwb2NoT2ZOZXh0U2FtcGxlID0gWy4uLmVwb2Noc1BlclNhbXBsZV07XG5cbiAgICB0aGlzLmFzc2lnbk9wdGltaXphdGlvblN0YXRlUGFyYW1ldGVycyh7XG4gICAgICBlcG9jaE9mTmV4dFNhbXBsZSxcbiAgICAgIGVwb2NoT2ZOZXh0TmVnYXRpdmVTYW1wbGUsXG4gICAgICBlcG9jaHNQZXJOZWdhdGl2ZVNhbXBsZSxcbiAgICAgIG1vdmVPdGhlcixcbiAgICAgIGluaXRpYWxBbHBoYTogbGVhcm5pbmdSYXRlLFxuICAgICAgYWxwaGE6IGxlYXJuaW5nUmF0ZSxcbiAgICAgIGdhbW1hOiByZXB1bHNpb25TdHJlbmd0aCxcbiAgICAgIGRpbSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBvcHRpbWl6YXRpb24gc3RhdGUgZm9yIHN0ZXB3aXNlIG9wdGltaXphdGlvbi5cbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZU9wdGltaXphdGlvbigpIHtcbiAgICAvLyBBbGdvcml0aG0gc3RhdGVcbiAgICBjb25zdCBoZWFkRW1iZWRkaW5nID0gdGhpcy5lbWJlZGRpbmc7XG4gICAgY29uc3QgdGFpbEVtYmVkZGluZyA9IHRoaXMuZW1iZWRkaW5nO1xuXG4gICAgLy8gSW5pdGlhbGl6ZWQgaW4gaW5pdGlhbGl6ZVNpbXBsaWNpYWxTZXRFbWJlZGRpbmcoKVxuICAgIGNvbnN0IHtoZWFkLCB0YWlsLCBlcG9jaHNQZXJTYW1wbGV9ID0gdGhpcy5vcHRpbWl6YXRpb25TdGF0ZTtcblxuICAgIGNvbnN0IG5FcG9jaHMgPSB0aGlzLmdldE5FcG9jaHMoKTtcbiAgICBjb25zdCBuVmVydGljZXMgPSB0aGlzLmdyYXBoLm5Db2xzO1xuXG4gICAgY29uc3Qge2EsIGJ9ID0gZmluZEFCUGFyYW1zKHRoaXMuc3ByZWFkLCB0aGlzLm1pbkRpc3QpO1xuXG4gICAgdGhpcy5hc3NpZ25PcHRpbWl6YXRpb25TdGF0ZVBhcmFtZXRlcnMoe1xuICAgICAgaGVhZEVtYmVkZGluZyxcbiAgICAgIHRhaWxFbWJlZGRpbmcsXG4gICAgICBoZWFkLFxuICAgICAgdGFpbCxcbiAgICAgIGVwb2Noc1BlclNhbXBsZSxcbiAgICAgIGEsXG4gICAgICBiLFxuICAgICAgbkVwb2NocyxcbiAgICAgIG5WZXJ0aWNlcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXByb3ZlIGFuIGVtYmVkZGluZyB1c2luZyBzdG9jaGFzdGljIGdyYWRpZW50IGRlc2NlbnQgdG8gbWluaW1pemUgdGhlXG4gICAqIGZ1enp5IHNldCBjcm9zcyBlbnRyb3B5IGJldHdlZW4gdGhlIDEtc2tlbGV0b25zIG9mIHRoZSBoaWdoIGRpbWVuc2lvbmFsXG4gICAqIGFuZCBsb3cgZGltZW5zaW9uYWwgZnV6enkgc2ltcGxpY2lhbCBzZXRzLiBJbiBwcmFjdGljZSB0aGlzIGlzIGRvbmUgYnlcbiAgICogc2FtcGxpbmcgZWRnZXMgYmFzZWQgb24gdGhlaXIgbWVtYmVyc2hpcCBzdHJlbmd0aCAod2l0aCB0aGUgKDEtcCkgdGVybXNcbiAgICogY29taW5nIGZyb20gbmVnYXRpdmUgc2FtcGxpbmcgc2ltaWxhciB0byB3b3JkMnZlYykuXG4gICAqL1xuICBwcml2YXRlIG9wdGltaXplTGF5b3V0U3RlcChuOiBudW1iZXIpIHtcbiAgICBjb25zdCB7b3B0aW1pemF0aW9uU3RhdGV9ID0gdGhpcztcbiAgICBjb25zdCB7XG4gICAgICBoZWFkLFxuICAgICAgdGFpbCxcbiAgICAgIGhlYWRFbWJlZGRpbmcsXG4gICAgICB0YWlsRW1iZWRkaW5nLFxuICAgICAgZXBvY2hzUGVyU2FtcGxlLFxuICAgICAgZXBvY2hPZk5leHRTYW1wbGUsXG4gICAgICBlcG9jaE9mTmV4dE5lZ2F0aXZlU2FtcGxlLFxuICAgICAgZXBvY2hzUGVyTmVnYXRpdmVTYW1wbGUsXG4gICAgICBtb3ZlT3RoZXIsXG4gICAgICBpbml0aWFsQWxwaGEsXG4gICAgICBhbHBoYSxcbiAgICAgIGdhbW1hLFxuICAgICAgYSxcbiAgICAgIGIsXG4gICAgICBkaW0sXG4gICAgICBuRXBvY2hzLFxuICAgICAgblZlcnRpY2VzLFxuICAgIH0gPSBvcHRpbWl6YXRpb25TdGF0ZTtcblxuICAgIGNvbnN0IGNsaXBWYWx1ZSA9IDQuMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXBvY2hzUGVyU2FtcGxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZXBvY2hPZk5leHRTYW1wbGVbaV0gPiBuKVxuICAgICAgICBjb250aW51ZTtcblxuXG4gICAgICBjb25zdCBqID0gaGVhZFtpXTtcbiAgICAgIGNvbnN0IGsgPSB0YWlsW2ldO1xuXG4gICAgICBjb25zdCBjdXJyZW50ID0gaGVhZEVtYmVkZGluZ1tqXTtcbiAgICAgIGNvbnN0IG90aGVyID0gdGFpbEVtYmVkZGluZ1trXTtcblxuICAgICAgY29uc3QgZGlzdFNxdWFyZWQgPSByRGlzdChjdXJyZW50LCBvdGhlcik7XG5cbiAgICAgIGxldCBncmFkQ29lZmYgPSAwO1xuICAgICAgaWYgKGRpc3RTcXVhcmVkID4gMCkge1xuICAgICAgICBncmFkQ29lZmYgPSAtMi4wICogYSAqIGIgKiBNYXRoLnBvdyhkaXN0U3F1YXJlZCwgYiAtIDEuMCk7XG4gICAgICAgIGdyYWRDb2VmZiAvPSBhICogTWF0aC5wb3coZGlzdFNxdWFyZWQsIGIpICsgMS4wO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGRpbTsgZCsrKSB7XG4gICAgICAgIGNvbnN0IGdyYWREID0gY2xpcChncmFkQ29lZmYgKiAoY3VycmVudFtkXSAtIG90aGVyW2RdKSwgY2xpcFZhbHVlKTtcbiAgICAgICAgY3VycmVudFtkXSArPSBncmFkRCAqIGFscGhhO1xuICAgICAgICBpZiAobW92ZU90aGVyKVxuICAgICAgICAgIG90aGVyW2RdICs9IC1ncmFkRCAqIGFscGhhO1xuICAgICAgfVxuXG4gICAgICBlcG9jaE9mTmV4dFNhbXBsZVtpXSArPSBlcG9jaHNQZXJTYW1wbGVbaV07XG5cbiAgICAgIGNvbnN0IG5OZWdTYW1wbGVzID0gTWF0aC5mbG9vcihcbiAgICAgICAgKG4gLSBlcG9jaE9mTmV4dE5lZ2F0aXZlU2FtcGxlW2ldKSAvIGVwb2Noc1Blck5lZ2F0aXZlU2FtcGxlW2ldXG4gICAgICApO1xuXG4gICAgICBmb3IgKGxldCBwID0gMDsgcCA8IG5OZWdTYW1wbGVzOyBwKyspIHtcbiAgICAgICAgY29uc3QgayA9IHV0aWxzLnRhdVJhbmRJbnQoblZlcnRpY2VzLCB0aGlzLnJhbmRvbSk7XG4gICAgICAgIGNvbnN0IG90aGVyID0gdGFpbEVtYmVkZGluZ1trXTtcblxuICAgICAgICBjb25zdCBkaXN0U3F1YXJlZCA9IHJEaXN0KGN1cnJlbnQsIG90aGVyKTtcblxuICAgICAgICBsZXQgZ3JhZENvZWZmID0gMC4wO1xuICAgICAgICBpZiAoZGlzdFNxdWFyZWQgPiAwLjApIHtcbiAgICAgICAgICBncmFkQ29lZmYgPSAyLjAgKiBnYW1tYSAqIGI7XG4gICAgICAgICAgZ3JhZENvZWZmIC89XG4gICAgICAgICAgICAoMC4wMDEgKyBkaXN0U3F1YXJlZCkgKiAoYSAqIE1hdGgucG93KGRpc3RTcXVhcmVkLCBiKSArIDEpO1xuICAgICAgICB9IGVsc2UgaWYgKGogPT09IGspIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgZGltOyBkKyspIHtcbiAgICAgICAgICBsZXQgZ3JhZEQgPSA0LjA7XG4gICAgICAgICAgaWYgKGdyYWRDb2VmZiA+IDAuMClcbiAgICAgICAgICAgIGdyYWREID0gY2xpcChncmFkQ29lZmYgKiAoY3VycmVudFtkXSAtIG90aGVyW2RdKSwgY2xpcFZhbHVlKTtcblxuICAgICAgICAgIGN1cnJlbnRbZF0gKz0gZ3JhZEQgKiBhbHBoYTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZXBvY2hPZk5leHROZWdhdGl2ZVNhbXBsZVtpXSArPSBuTmVnU2FtcGxlcyAqIGVwb2Noc1Blck5lZ2F0aXZlU2FtcGxlW2ldO1xuICAgIH1cbiAgICBvcHRpbWl6YXRpb25TdGF0ZS5hbHBoYSA9IGluaXRpYWxBbHBoYSAqICgxLjAgLSBuIC8gbkVwb2Nocyk7XG5cbiAgICBvcHRpbWl6YXRpb25TdGF0ZS5jdXJyZW50RXBvY2ggKz0gMTtcbiAgICByZXR1cm4gaGVhZEVtYmVkZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXByb3ZlIGFuIGVtYmVkZGluZyB1c2luZyBzdG9jaGFzdGljIGdyYWRpZW50IGRlc2NlbnQgdG8gbWluaW1pemUgdGhlXG4gICAqIGZ1enp5IHNldCBjcm9zcyBlbnRyb3B5IGJldHdlZW4gdGhlIDEtc2tlbGV0b25zIG9mIHRoZSBoaWdoIGRpbWVuc2lvbmFsXG4gICAqIGFuZCBsb3cgZGltZW5zaW9uYWwgZnV6enkgc2ltcGxpY2lhbCBzZXRzLiBJbiBwcmFjdGljZSB0aGlzIGlzIGRvbmUgYnlcbiAgICogc2FtcGxpbmcgZWRnZXMgYmFzZWQgb24gdGhlaXIgbWVtYmVyc2hpcCBzdHJlbmd0aCAod2l0aCB0aGUgKDEtcCkgdGVybXNcbiAgICogY29taW5nIGZyb20gbmVnYXRpdmUgc2FtcGxpbmcgc2ltaWxhciB0byB3b3JkMnZlYykuXG4gICAqL1xuICBwcml2YXRlIG9wdGltaXplTGF5b3V0QXN5bmMoXG4gICAgZXBvY2hDYWxsYmFjazogKGVwb2NoTnVtYmVyOiBudW1iZXIpID0+IHZvaWQgfCBib29sZWFuID0gKCkgPT4gdHJ1ZVxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc3RlcCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7bkVwb2NocywgY3VycmVudEVwb2NofSA9IHRoaXMub3B0aW1pemF0aW9uU3RhdGU7XG4gICAgICAgICAgdGhpcy5lbWJlZGRpbmcgPSB0aGlzLm9wdGltaXplTGF5b3V0U3RlcChjdXJyZW50RXBvY2gpO1xuICAgICAgICAgIGNvbnN0IGVwb2NoQ29tcGxldGVkID0gdGhpcy5vcHRpbWl6YXRpb25TdGF0ZS5jdXJyZW50RXBvY2g7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkU3RvcCA9IGVwb2NoQ2FsbGJhY2soZXBvY2hDb21wbGV0ZWQpID09PSBmYWxzZTtcbiAgICAgICAgICBjb25zdCBpc0ZpbmlzaGVkID0gZXBvY2hDb21wbGV0ZWQgPT09IG5FcG9jaHM7XG4gICAgICAgICAgaWYgKCFzaG91bGRTdG9wICYmICFpc0ZpbmlzaGVkKVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBzdGVwKCksIDApO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGlzRmluaXNoZWQpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gc3RlcCgpLCAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXByb3ZlIGFuIGVtYmVkZGluZyB1c2luZyBzdG9jaGFzdGljIGdyYWRpZW50IGRlc2NlbnQgdG8gbWluaW1pemUgdGhlXG4gICAqIGZ1enp5IHNldCBjcm9zcyBlbnRyb3B5IGJldHdlZW4gdGhlIDEtc2tlbGV0b25zIG9mIHRoZSBoaWdoIGRpbWVuc2lvbmFsXG4gICAqIGFuZCBsb3cgZGltZW5zaW9uYWwgZnV6enkgc2ltcGxpY2lhbCBzZXRzLiBJbiBwcmFjdGljZSB0aGlzIGlzIGRvbmUgYnlcbiAgICogc2FtcGxpbmcgZWRnZXMgYmFzZWQgb24gdGhlaXIgbWVtYmVyc2hpcCBzdHJlbmd0aCAod2l0aCB0aGUgKDEtcCkgdGVybXNcbiAgICogY29taW5nIGZyb20gbmVnYXRpdmUgc2FtcGxpbmcgc2ltaWxhciB0byB3b3JkMnZlYykuXG4gICAqL1xuICBwcml2YXRlIG9wdGltaXplTGF5b3V0KFxuICAgIGVwb2NoQ2FsbGJhY2s6IChlcG9jaE51bWJlcjogbnVtYmVyKSA9PiB2b2lkIHwgYm9vbGVhbiA9ICgpID0+IHRydWVcbiAgKTogVmVjdG9ycyB7XG4gICAgbGV0IGlzRmluaXNoZWQgPSBmYWxzZTtcbiAgICBsZXQgZW1iZWRkaW5nOiBWZWN0b3JzID0gW107XG4gICAgd2hpbGUgKCFpc0ZpbmlzaGVkKSB7XG4gICAgICBjb25zdCB7bkVwb2NocywgY3VycmVudEVwb2NofSA9IHRoaXMub3B0aW1pemF0aW9uU3RhdGU7XG4gICAgICBlbWJlZGRpbmcgPSB0aGlzLm9wdGltaXplTGF5b3V0U3RlcChjdXJyZW50RXBvY2gpO1xuICAgICAgY29uc3QgZXBvY2hDb21wbGV0ZWQgPSB0aGlzLm9wdGltaXphdGlvblN0YXRlLmN1cnJlbnRFcG9jaDtcbiAgICAgIGNvbnN0IHNob3VsZFN0b3AgPSBlcG9jaENhbGxiYWNrKGVwb2NoQ29tcGxldGVkKSA9PT0gZmFsc2U7XG4gICAgICBpc0ZpbmlzaGVkID0gZXBvY2hDb21wbGV0ZWQgPT09IG5FcG9jaHMgfHwgc2hvdWxkU3RvcDtcbiAgICB9XG4gICAgcmV0dXJuIGVtYmVkZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgZXBvY2hzIGZvciBvcHRpbWl6aW5nIHRoZSBwcm9qZWN0aW9uLlxuICAgKiBOT1RFOiBUaGlzIGhldXJpc3RpYyBkaWZmZXJzIGZyb20gdGhlIHB5dGhvbiB2ZXJzaW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0TkVwb2NocygpIHtcbiAgICBjb25zdCBncmFwaCA9IHRoaXMuZ3JhcGg7XG5cbiAgICBpZiAodGhpcy5uRXBvY2hzID4gMClcbiAgICAgIHJldHVybiB0aGlzLm5FcG9jaHM7XG5cblxuICAgIGlmICghZ3JhcGgpXG4gICAgICByZXR1cm4gMjAwO1xuXG5cbiAgICBjb25zdCBsZW5ndGggPSBncmFwaC5uUm93cztcbiAgICBpZiAobGVuZ3RoIDw9IDI1MDApXG4gICAgICByZXR1cm4gNTAwO1xuICAgIGVsc2UgaWYgKGxlbmd0aCA8PSA1MDAwKVxuICAgICAgcmV0dXJuIDQwMDtcbiAgICBlbHNlIGlmIChsZW5ndGggPD0gNzUwMClcbiAgICAgIHJldHVybiAzMDA7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIDIwMDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXVjbGlkZWFuKHg6IFZlY3RvciwgeTogVmVjdG9yKSB7XG4gIGxldCByZXN1bHQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspXG4gICAgcmVzdWx0ICs9ICh4W2ldIC0geVtpXSkgKiogMjtcblxuICByZXR1cm4gTWF0aC5zcXJ0KHJlc3VsdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBudW1lcmljKHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gIGNvbnN0IHJlc3VsdCA9IE1hdGguYWJzKHggLSB5KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvc2luZSh4OiBWZWN0b3IsIHk6IFZlY3Rvcikge1xuICBsZXQgcmVzdWx0ID0gMC4wO1xuICBsZXQgbm9ybVggPSAwLjA7XG4gIGxldCBub3JtWSA9IDAuMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICByZXN1bHQgKz0geFtpXSAqIHlbaV07XG4gICAgbm9ybVggKz0geFtpXSAqKiAyO1xuICAgIG5vcm1ZICs9IHlbaV0gKiogMjtcbiAgfVxuXG4gIGlmIChub3JtWCA9PT0gMCAmJiBub3JtWSA9PT0gMClcbiAgICByZXR1cm4gMDtcbiAgZWxzZSBpZiAobm9ybVggPT09IDAgfHwgbm9ybVkgPT09IDApXG4gICAgcmV0dXJuIDEuMDtcbiAgZWxzZVxuICAgIHJldHVybiAxLjAgLSByZXN1bHQgLyBNYXRoLnNxcnQobm9ybVggKiBub3JtWSk7XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIHJlcHJlc2VudGluZyB0aGUgb3B0aW1pemF0aW9uIHN0YXRlIHRyYWNrZWQgYmV0d2VlbiBzdGVwcyBvZlxuICogdGhlIFNHRCBvcHRpbWl6YXRpb25cbiAqL1xuY2xhc3MgT3B0aW1pemF0aW9uU3RhdGUge1xuICBjdXJyZW50RXBvY2ggPSAwO1xuXG4gIC8vIERhdGEgdHJhY2tlZCBkdXJpbmcgb3B0aW1pemF0aW9uIHN0ZXBzLlxuICBoZWFkRW1iZWRkaW5nOiBudW1iZXJbXVtdID0gW107XG4gIHRhaWxFbWJlZGRpbmc6IG51bWJlcltdW10gPSBbXTtcbiAgaGVhZDogbnVtYmVyW10gPSBbXTtcbiAgdGFpbDogbnVtYmVyW10gPSBbXTtcbiAgZXBvY2hzUGVyU2FtcGxlOiBudW1iZXJbXSA9IFtdO1xuICBlcG9jaE9mTmV4dFNhbXBsZTogbnVtYmVyW10gPSBbXTtcbiAgZXBvY2hPZk5leHROZWdhdGl2ZVNhbXBsZTogbnVtYmVyW10gPSBbXTtcbiAgZXBvY2hzUGVyTmVnYXRpdmVTYW1wbGU6IG51bWJlcltdID0gW107XG4gIG1vdmVPdGhlciA9IHRydWU7XG4gIGluaXRpYWxBbHBoYSA9IDEuMDtcbiAgYWxwaGEgPSAxLjA7XG4gIGdhbW1hID0gMS4wO1xuICBhID0gMS41NzY5NDM0NjAzMTEzMDc3O1xuICBiID0gMC44OTUwNjA4Nzc5MTA5NzMzO1xuICBkaW0gPSAyO1xuICBuRXBvY2hzID0gNTAwO1xuICBuVmVydGljZXMgPSAwO1xufVxuXG4vKipcbiAqIFN0YW5kYXJkIGNsYW1waW5nIG9mIGEgdmFsdWUgaW50byBhIGZpeGVkIHJhbmdlXG4gKi9cbmZ1bmN0aW9uIGNsaXAoeDogbnVtYmVyLCBjbGlwVmFsdWU6IG51bWJlcikge1xuICBpZiAoeCA+IGNsaXBWYWx1ZSkgcmV0dXJuIGNsaXBWYWx1ZTtcbiAgZWxzZSBpZiAoeCA8IC1jbGlwVmFsdWUpIHJldHVybiAtY2xpcFZhbHVlO1xuICBlbHNlIHJldHVybiB4O1xufVxuXG4vKipcbiAqIFJlZHVjZWQgRXVjbGlkZWFuIGRpc3RhbmNlLlxuICovXG5mdW5jdGlvbiByRGlzdCh4OiBudW1iZXJbXSwgeTogbnVtYmVyW10pIHtcbiAgbGV0IHJlc3VsdCA9IDAuMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKVxuICAgIHJlc3VsdCArPSBNYXRoLnBvdyh4W2ldIC0geVtpXSwgMik7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBGaXQgYSwgYiBwYXJhbXMgZm9yIHRoZSBkaWZmZXJlbnRpYWJsZSBjdXJ2ZSB1c2VkIGluIGxvd2VyXG4gKiBkaW1lbnNpb25hbCBmdXp6eSBzaW1wbGljaWFsIGNvbXBsZXggY29uc3RydWN0aW9uLiBXZSB3YW50IHRoZVxuICogc21vb3RoIGN1cnZlIChmcm9tIGEgcHJlLWRlZmluZWQgZmFtaWx5IHdpdGggc2ltcGxlIGdyYWRpZW50KSB0aGF0XG4gKiBiZXN0IG1hdGNoZXMgYW4gb2Zmc2V0IGV4cG9uZW50aWFsIGRlY2F5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEFCUGFyYW1zKHNwcmVhZDogbnVtYmVyLCBtaW5EaXN0OiBudW1iZXIpIHtcbiAgY29uc3QgY3VydmUgPSAoW2EsIGJdOiBudW1iZXJbXSkgPT4gKHg6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiAxLjAgLyAoMS4wICsgYSAqIHggKiogKDIgKiBiKSk7XG4gIH07XG5cbiAgY29uc3QgeHYgPSB1dGlsc1xuICAgIC5saW5lYXIoMCwgc3ByZWFkICogMywgMzAwKVxuICAgIC5tYXAoKHZhbCkgPT4gKHZhbCA8IG1pbkRpc3QgPyAxLjAgOiB2YWwpKTtcblxuICBjb25zdCB5diA9IHV0aWxzLnplcm9zKHh2Lmxlbmd0aCkubWFwKCh2YWwsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZ3RlID0geHZbaW5kZXhdID49IG1pbkRpc3Q7XG4gICAgcmV0dXJuIGd0ZSA/IE1hdGguZXhwKC0oeHZbaW5kZXhdIC0gbWluRGlzdCkgLyBzcHJlYWQpIDogdmFsO1xuICB9KTtcblxuICBjb25zdCBpbml0aWFsVmFsdWVzID0gWzAuNSwgMC41XTtcbiAgY29uc3QgZGF0YSA9IHt4OiB4diwgeTogeXZ9O1xuXG4gIC8vIERlZmF1bHQgb3B0aW9ucyBmb3IgdGhlIGFsZ29yaXRobSAoZnJvbSBnaXRodWIgZXhhbXBsZSlcbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICBkYW1waW5nOiAxLjUsXG4gICAgaW5pdGlhbFZhbHVlcyxcbiAgICBncmFkaWVudERpZmZlcmVuY2U6IDEwZS0yLFxuICAgIG1heEl0ZXJhdGlvbnM6IDEwMCxcbiAgICBlcnJvclRvbGVyYW5jZTogMTBlLTMsXG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcbiAgY29uc3Qge3BhcmFtZXRlclZhbHVlc30gPSBMTShkYXRhLCBjdXJ2ZSwgb3B0aW9ucyk7XG4gIGNvbnN0IFthLCBiXSA9IHBhcmFtZXRlclZhbHVlcyBhcyBudW1iZXJbXTtcbiAgcmV0dXJuIHthLCBifTtcbn1cblxuLyoqXG4gKiBVbmRlciB0aGUgYXNzdW1wdGlvbiBvZiBjYXRlZ29yaWNhbCBkaXN0YW5jZSBmb3IgdGhlIGludGVyc2VjdGluZ1xuICogc2ltcGxpY2lhbCBzZXQgcGVyZm9ybSBhIGZhc3QgaW50ZXJzZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFzdEludGVyc2VjdGlvbihcbiAgZ3JhcGg6IG1hdHJpeC5TcGFyc2VNYXRyaXgsXG4gIHRhcmdldDogbnVtYmVyW10sXG4gIHVua25vd25EaXN0ID0gMS4wLFxuICBmYXJEaXN0ID0gNS4wXG4pIHtcbiAgcmV0dXJuIGdyYXBoLm1hcCgodmFsdWUsIHJvdywgY29sKSA9PiB7XG4gICAgaWYgKHRhcmdldFtyb3ddID09PSAtMSB8fCB0YXJnZXRbY29sXSA9PT0gLTEpXG4gICAgICByZXR1cm4gdmFsdWUgKiBNYXRoLmV4cCgtdW5rbm93bkRpc3QpO1xuICAgIGVsc2UgaWYgKHRhcmdldFtyb3ddICE9PSB0YXJnZXRbY29sXSlcbiAgICAgIHJldHVybiB2YWx1ZSAqIE1hdGguZXhwKC1mYXJEaXN0KTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdmFsdWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc2V0IHRoZSBsb2NhbCBjb25uZWN0aXZpdHkgcmVxdWlyZW1lbnQgLS0gZWFjaCBkYXRhIHNhbXBsZSBzaG91bGRcbiAqIGhhdmUgY29tcGxldGUgY29uZmlkZW5jZSBpbiBhdCBsZWFzdCBvbmUgMS1zaW1wbGV4IGluIHRoZSBzaW1wbGljaWFsIHNldC5cbiAqIFdlIGNhbiBlbmZvcmNlIHRoaXMgYnkgbG9jYWxseSByZXNjYWxpbmcgY29uZmlkZW5jZXMsIGFuZCB0aGVuIHJlbWVyZ2luZyB0aGVcbiAqIGRpZmZlcmVudCBsb2NhbCBzaW1wbGljaWFsIHNldHMgdG9nZXRoZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldExvY2FsQ29ubmVjdGl2aXR5KHNpbXBsaWNpYWxTZXQ6IG1hdHJpeC5TcGFyc2VNYXRyaXgpIHtcbiAgc2ltcGxpY2lhbFNldCA9IG1hdHJpeC5ub3JtYWxpemUoc2ltcGxpY2lhbFNldCwgbWF0cml4Lk5vcm1UeXBlLm1heCk7XG4gIGNvbnN0IHRyYW5zcG9zZSA9IG1hdHJpeC50cmFuc3Bvc2Uoc2ltcGxpY2lhbFNldCk7XG4gIGNvbnN0IHByb2RNYXRyaXggPSBtYXRyaXgucGFpcndpc2VNdWx0aXBseSh0cmFuc3Bvc2UsIHNpbXBsaWNpYWxTZXQpO1xuICBzaW1wbGljaWFsU2V0ID0gbWF0cml4LmFkZChcbiAgICBzaW1wbGljaWFsU2V0LFxuICAgIG1hdHJpeC5zdWJ0cmFjdCh0cmFuc3Bvc2UsIHByb2RNYXRyaXgpXG4gICk7XG4gIHJldHVybiBtYXRyaXguZWxpbWluYXRlWmVyb3Moc2ltcGxpY2lhbFNldCk7XG59XG5cbi8qKlxuICogR2l2ZW4gaW5kaWNlcyBhbmQgd2VpZ2h0cyBhbmQgYW4gb3JpZ2luYWwgZW1iZWRkaW5nc1xuICogaW5pdGlhbGl6ZSB0aGUgcG9zaXRpb25zIG9mIG5ldyBwb2ludHMgcmVsYXRpdmUgdG8gdGhlXG4gKiBpbmRpY2VzIGFuZCB3ZWlnaHRzIChvZiB0aGVpciBuZWlnaGJvcnMgaW4gdGhlIHNvdXJjZSBkYXRhKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRUcmFuc2Zvcm0oXG4gIGluZGljZXM6IG51bWJlcltdW10sXG4gIHdlaWdodHM6IG51bWJlcltdW10sXG4gIGVtYmVkZGluZzogVmVjdG9yc1xuKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHV0aWxzXG4gICAgLnplcm9zKGluZGljZXMubGVuZ3RoKVxuICAgIC5tYXAoKF96KSA9PiB1dGlscy56ZXJvcyhlbWJlZGRpbmdbMF0ubGVuZ3RoKSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbmRpY2VzWzBdLmxlbmd0aDsgaisrKSB7XG4gICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGVtYmVkZGluZ1swXS5sZW5ndGg7IGQrKykge1xuICAgICAgICBjb25zdCBhID0gaW5kaWNlc1tpXVtqXTtcbiAgICAgICAgcmVzdWx0W2ldW2RdICs9IHdlaWdodHNbaV1bal0gKiBlbWJlZGRpbmdbYV1bZF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG4iXX0=","/**\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 { dmLinearIndex } from '../distance-matrix';\nexport class TSNE {\n assert(condition, message) {\n if (!condition)\n throw message || 'Assertion failed';\n }\n // syntax sugar\n getopt(opt, field, defaultval) {\n if (opt.hasOwnProperty(field))\n return opt[field];\n else\n return defaultval;\n }\n gaussRandom() {\n if (this.returnV) {\n this.returnV = false;\n return this.vValue;\n }\n const u = 2 * this.random() - 1;\n const v = 2 * this.random() - 1;\n const r = u * u + v * v;\n if (r === 0 || r > 1)\n return this.gaussRandom();\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) {\n return mu + this.gaussRandom() * std;\n }\n // utilitity that creates contiguous vector of zeros of size n\n zeros(n) {\n if (typeof (n) === 'undefined' || isNaN(n))\n return new Float32Array();\n if (typeof ArrayBuffer === 'undefined') {\n // lacking browser support\n const arr = new Float32Array(n);\n for (let i = 0; i < n; i++)\n arr[i] = 0;\n return arr;\n }\n else {\n return new Float32Array(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 = (new Array(n)).fill(null).map(() => new Float32Array(d));\n if (uses) {\n for (let i = 0; i < n; i++)\n x[i] = new Float32Array(d).fill(s);\n }\n else {\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < d; j++)\n x[i][j] = this.randn(0.0, 1e-4);\n }\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 getIterSize(rowSize) {\n if (rowSize <= 2000)\n return 100;\n else if (rowSize <= 3000)\n return 90;\n else if (rowSize <= 5000)\n return 80;\n else\n return 70;\n }\n // compute (p_{i|j} + p_{j|i})/(2n)\n d2p(D, perplexity, tol, rowSize) {\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 indexer = dmLinearIndex(rowSize);\n const distances = new Float32Array(rowSize * rowSize);\n for (let i = 0; i < rowSize; i++) {\n for (let j = i + 1; j < rowSize; j++)\n distances[i * rowSize + j] = distances[j * rowSize + i] = D[indexer(i, j)];\n }\n const n = rowSize;\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 = Math.floor(this.getIterSize(rowSize) / 5);\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 const pj = i === j ? 0 : Math.exp(-distances[i * n + j] * beta);\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 else\n pj = prow[j] / psum;\n prow[j] = pj;\n if (pj > 1e-7)\n nHere -= pj * Math.log(pj);\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 else\n beta = (beta + betamax) / 2;\n }\n else {\n // converse case. make distrubtion less peaky\n betamax = beta;\n if (betamin === -Infinity)\n beta = beta / 2;\n else\n beta = (beta + betamin) / 2;\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 if (num >= maxtries)\n done = true;\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 } // 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 return pOut;\n }\n // helper function\n sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }\n constructor(opt) {\n this.iter = 0;\n this.random = Math.random;\n // return 0 mean unit standard deviation random number\n this.returnV = false;\n this.vValue = 0.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 this.random = this.getopt(opt, 'random', Math.random); // random number generator\n }\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, D); // 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, rowSize) {\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 // dists.forEach((d) => console.log(d));\n console.time('distances to matrix');\n this.P = this.d2p(D, this.perplexity, 1e-4, rowSize);\n console.timeEnd('distances to matrix');\n this.N = rowSize;\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; // 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 //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 this.quArr ?? (this.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 const dsum = new Array(dim).reduce((prev, _, d) => prev + Math.pow(Y[i][d] - Y[j][d], 2), 0);\n const qu = 1.0 / (1.0 + dsum); // Student t-distribution\n this.quArr[i * N + j] = qu;\n this.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 let cost = 0.0;\n const grad = new Array(N).fill(null).map(() => (new Float32Array(dim)).fill(0.0));\n for (let i = 0; i < N; i++) {\n // const gsum = new Float32Array(dim).fill(0.0); // init grad for point i\n for (let j = i + 1; j < N; j++) {\n const Q = Math.max(this.quArr[i * N + j] / qsum, 1e-100);\n cost += (-P[i * N + j] * Math.log(Q)) * 2; // accumulate cost (the non-constant portion at least...)\n const premult = 4 * (pmul * P[i * N + j] - Q) * this.quArr[i * N + j];\n //console.log(premult, Q, i, j);\n for (let d = 0; d < dim; d++) {\n grad[i][d] += premult * (Y[i][d] - Y[j][d]);\n grad[j][d] += premult * (Y[j][d] - Y[i][d]);\n }\n }\n //grad[i] = gsum;\n }\n return { cost, grad };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidC1zbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0LXNuZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHakQsTUFBTSxPQUFPLElBQUk7SUFXUCxNQUFNLENBQUMsU0FBYyxFQUFFLE9BQVk7UUFDekMsSUFBSSxDQUFDLFNBQVM7WUFBRSxNQUFNLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQztJQUN0RCxDQUFDO0lBRUQsZUFBZTtJQUNQLE1BQU0sQ0FBQyxHQUF1QixFQUFFLEtBQWEsRUFBRSxVQUFlO1FBQ3BFLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFDM0IsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7O1lBRWxCLE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFLQyxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUNwQjtRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENB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QUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RFLGdDQUFnQztnQkFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDNUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0M7YUFDRjtZQUNELGlCQUFpQjtTQUNsQjtRQUVELE9BQU8sRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFDdEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtkbUxpbmVhckluZGV4fSBmcm9tICcuLi9kaXN0YW5jZS1tYXRyaXgnO1xuXG5cbmV4cG9ydCBjbGFzcyBUU05FIHtcbiAgcHJpdmF0ZSBwZXJwbGV4aXR5OiBudW1iZXI7XG4gIHByaXZhdGUgZGltOiBudW1iZXI7XG4gIHByaXZhdGUgZXBzaWxvbjogbnVtYmVyO1xuICBwcml2YXRlIGl0ZXIgPSAwO1xuICBwcml2YXRlIE4hOiBudW1iZXI7XG4gIHByaXZhdGUgUCE6IEZsb2F0MzJBcnJheTtcbiAgcHJpdmF0ZSBZITogYW55W107XG4gIHByaXZhdGUgZ2FpbnMhOiBhbnlbXTtcbiAgcHJpdmF0ZSB5c3RlcCE6IGFueVtdO1xuICBwcml2YXRlIHJhbmRvbTogKCkgPT4gbnVtYmVyID0gTWF0aC5yYW5kb207XG4gIHByaXZhdGUgYXNzZXJ0KGNvbmRpdGlvbjogYW55LCBtZXNzYWdlOiBhbnkpIHtcbiAgICBpZiAoIWNvbmRpdGlvbikgdGhyb3cgbWVzc2FnZSB8fCAnQXNzZXJ0aW9uIGZhaWxlZCc7XG4gIH1cblxuICAvLyBzeW50YXggc3VnYXJcbiAgcHJpdmF0ZSBnZXRvcHQob3B0OiB7W186IHN0cmluZ106IGFueX0sIGZpZWxkOiBzdHJpbmcsIGRlZmF1bHR2YWw6IGFueSkge1xuICAgIGlmIChvcHQuaGFzT3duUHJvcGVydHkoZmllbGQpKVxuICAgICAgcmV0dXJuIG9wdFtmaWVsZF07XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIGRlZmF1bHR2YWw7XG4gIH1cblxuICAgIC8vIHJldHVybiAwIG1lYW4gdW5pdCBzdGFuZGFyZCBkZXZpYXRpb24gcmFuZG9tIG51bWJlclxuICAgIHByaXZhdGUgcmV0dXJuViA9IGZhbHNlO1xuICAgIHByaXZhdGUgdlZhbHVlID0gMC4wO1xuICAgIGdhdXNzUmFuZG9tKCk6IG51bWJlciB7XG4gICAgICBpZiAodGhpcy5yZXR1cm5WKSB7XG4gICAgICAgIHRoaXMucmV0dXJuViA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy52VmFsdWU7XG4gICAgICB9XG4gICAgICBjb25zdCB1ID0gMiAqIHRoaXMucmFuZG9tKCkgLSAxO1xuICAgICAgY29uc3QgdiA9IDIgKiB0aGlzLnJhbmRvbSgpIC0gMTtcbiAgICAgIGNvbnN0IHIgPSB1ICogdSArIHYgKiB2O1xuICAgICAgaWYgKHIgPT09IDAgfHwgciA+IDEpIHJldHVybiB0aGlzLmdhdXNzUmFuZG9tKCk7XG4gICAgICBjb25zdCBjID0gTWF0aC5zcXJ0KC0yICogTWF0aC5sb2cocikgLyByKTtcbiAgICAgIHRoaXMudlZhbHVlID0gdiAqIGM7IC8vIGNhY2hlIHRoaXMgZm9yIG5leHQgZnVuY3Rpb24gY2FsbCBmb3IgZWZmaWNpZW5jeVxuICAgICAgdGhpcy5yZXR1cm5WID0gdHJ1ZTtcbiAgICAgIHJldHVybiB1ICogYztcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gcmFuZG9tIG5vcm1hbCBudW1iZXJcbiAgICBwcml2YXRlIHJhbmRuKG11OiBudW1iZXIsIHN0ZDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gbXUgKyB0aGlzLmdhdXNzUmFuZG9tKCkgKiBzdGQ7XG4gICAgfVxuXG4gICAgLy8gdXRpbGl0aXR5IHRoYXQgY3JlYXRlcyBjb250aWd1b3VzIHZlY3RvciBvZiB6ZXJvcyBvZiBzaXplIG5cbiAgICBwcml2YXRlIHplcm9zKG46IG51bWJlcikge1xuICAgICAgaWYgKHR5cGVvZiAobikgPT09ICd1bmRlZmluZWQnIHx8IGlzTmFOKG4pKSByZXR1cm4gbmV3IEZsb2F0MzJBcnJheSgpO1xuICAgICAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gbGFja2luZyBicm93c2VyIHN1cHBvcnRcbiAgICAgICAgY29uc3QgYXJyID0gbmV3IEZsb2F0MzJBcnJheShuKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIGFycltpXSA9IDA7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShuKTsgLy8gdHlwZWQgYXJyYXlzIGFyZSBmYXN0ZXJcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB1dGlsaXR5IHRoYXQgcmV0dXJucyAyZCBhcnJheSBmaWxsZWQgd2l0aCByYW5kb20gbnVtYmVyc1xuICAgIC8vIG9yIHdpdGggdmFsdWUgcywgaWYgcHJvdmlkZWRcbiAgICBwcml2YXRlIHJhbmRuMmQobjogbnVtYmVyLCBkOiBudW1iZXIsIHM/OiBudW1iZXIpIHtcbiAgICAgIGNvbnN0IHVzZXMgPSB0eXBlb2YgcyAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgICBjb25zdCB4ID0gKG5ldyBBcnJheShuKSkuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IEZsb2F0MzJBcnJheShkKSk7XG4gICAgICBpZiAodXNlcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKylcbiAgICAgICAgICB4W2ldID0gbmV3IEZsb2F0MzJBcnJheShkKS5maWxsKHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGQ7IGorKylcbiAgICAgICAgICAgIHhbaV1bal0gPSB0aGlzLnJhbmRuKDAuMCwgMWUtNCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB4O1xuICAgIH1cblxuICAgIC8vIGNvbXB1dGUgTDIgZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjdG9yc1xuICAgIHByaXZhdGUgbDIoeDE6IG51bWJlcltdLCB4MjogbnVtYmVyW10pIHtcbiAgICAgIGNvbnN0IEQgPSB4MS5sZW5ndGg7XG4gICAgICBsZXQgZCA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IEQ7IGkrKykge1xuICAgICAgICBjb25zdCB4MWkgPSB4MVtpXTtcbiAgICAgICAgY29uc3QgeDJpID0geDJbaV07XG4gICAgICAgIGQgKz0gKHgxaSAtIHgyaSkgKiAoeDFpIC0geDJpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkO1xuICAgIH1cblxuICAgIC8vIGNvbXB1dGUgcGFpcndpc2UgZGlzdGFuY2UgaW4gYWxsIHZlY3RvcnMgaW4gWFxuICAgIHByaXZhdGUgeHRvZChYOiBBcnJheTwgQXJyYXk8bnVtYmVyPiA+KSB7XG4gICAgICBjb25zdCBOID0gWC5sZW5ndGg7XG4gICAgICBjb25zdCBkaXN0ID0gdGhpcy56ZXJvcyhOICogTik7IC8vIGFsbG9jYXRlIGNvbnRpZ3VvdXMgYXJyYXlcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IE47IGorKykge1xuICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmwyKFhbaV0sIFhbal0pO1xuICAgICAgICAgIGRpc3RbaSAqIE4gKyBqXSA9IGQ7XG4gICAgICAgICAgZGlzdFtqICogTiArIGldID0gZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRpc3Q7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEl0ZXJTaXplKHJvd1NpemU6IG51bWJlcikge1xuICAgICAgaWYgKHJvd1NpemUgPD0gMjAwMClcbiAgICAgICAgcmV0dXJuIDEwMDtcbiAgICAgIGVsc2UgaWYgKHJvd1NpemUgPD0gMzAwMClcbiAgICAgICAgcmV0dXJuIDkwO1xuICAgICAgZWxzZSBpZiAocm93U2l6ZSA8PSA1MDAwKVxuICAgICAgICByZXR1cm4gODA7XG4gICAgICBlbHNlXG4gICAgICAgIHJldHVybiA3MDtcbiAgICB9XG5cbiAgICAvLyBjb21wdXRlIChwX3tpfGp9ICsgcF97anxpfSkvKDJuKVxuICAgIHByaXZhdGUgZDJwKEQ6IEZsb2F0MzJBcnJheSwgcGVycGxleGl0eTogbnVtYmVyLCB0b2w6IG51bWJlciwgcm93U2l6ZTogbnVtYmVyKSB7XG4gICAgICAvLyBjb25zdCBuZiA9IE1hdGguc3FydChELmxlbmd0aCk7IC8vIHRoaXMgYmV0dGVyIGJlIGFuIGludGVnZXJcbiAgICAgIC8vIGNvbnN0IG4gPSBNYXRoLmZsb29yKG5mKTtcbiAgICAgIC8vIHRoaXMuYXNzZXJ0KG4gPT09IG5mLCAnRCBzaG91bGQgaGF2ZSBzcXVhcmUgbnVtYmVyIG9mIGVsZW1lbnRzLicpO1xuICAgICAgY29uc3QgaW5kZXhlciA9IGRtTGluZWFySW5kZXgocm93U2l6ZSk7XG4gICAgICBjb25zdCBkaXN0YW5jZXMgPSBuZXcgRmxvYXQzMkFycmF5KHJvd1NpemUgKiByb3dTaXplKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93U2l6ZTsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IHJvd1NpemU7IGorKylcbiAgICAgICAgICBkaXN0YW5jZXNbaSAqIHJvd1NpemUgKyBqXSA9IGRpc3RhbmNlc1tqICogcm93U2l6ZSArIGldID0gRFtpbmRleGVyKGksIGopXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG4gPSByb3dTaXplO1xuICAgICAgY29uc3QgaFRhcmdldCA9IE1hdGgubG9nKHBlcnBsZXhpdHkpOyAvLyB0YXJnZXQgZW50cm9weSBvZiBkaXN0cmlidXRpb25cbiAgICAgIGNvbnN0IFAgPSB0aGlzLnplcm9zKG4gKiBuKTsgLy8gdGVtcG9yYXJ5IHByb2JhYmlsaXR5IG1hdHJpeFxuICAgICAgY29uc3QgcHJvdyA9IHRoaXMuemVyb3Mobik7IC8vIGEgdGVtcG9yYXJ5IHN0b3JhZ2UgY29tcGFydG1lbnRcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGxldCBiZXRhbWluID0gLUluZmluaXR5O1xuICAgICAgICBsZXQgYmV0YW1heCA9IEluZmluaXR5O1xuICAgICAgICBsZXQgYmV0YSA9IDE7IC8vIGluaXRpYWwgdmFsdWUgb2YgcHJlY2lzaW9uXG4gICAgICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG1heHRyaWVzID0gTWF0aC5mbG9vcih0aGlzLmdldEl0ZXJTaXplKHJvd1NpemUpIC8gNSk7XG5cbiAgICAgICAgLy8gcGVyZm9ybSBiaW5hcnkgc2VhcmNoIHRvIGZpbmQgYSBzdWl0YWJsZSBwcmVjaXNpb24gYmV0YVxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBlbnRyb3B5IG9mIHRoZSBkaXN0cmlidXRpb24gaXMgYXBwcm9wcmlhdGVcbiAgICAgICAgbGV0IG51bSA9IDA7XG4gICAgICAgIHdoaWxlICghZG9uZSkge1xuICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAvLyBjb21wdXRlIGVudHJvcHkgYW5kIGtlcm5lbCByb3cgd2l0aCBiZXRhIHByZWNpc2lvblxuICAgICAgICAgIGxldCBwc3VtID0gMC4wO1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbjsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBwaiA9IGkgPT09IGogPyAwIDogTWF0aC5leHAoLSBkaXN0YW5jZXNbaSAqIG4gKyBqXSAqIGJldGEpO1xuICAgICAgICAgICAgcHJvd1tqXSA9IHBqO1xuICAgICAgICAgICAgcHN1bSArPSBwajtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gbm9ybWFsaXplIHAgYW5kIGNvbXB1dGUgZW50cm9weVxuICAgICAgICAgIGxldCBuSGVyZSA9IDAuMDtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgICAgICAgbGV0IHBqO1xuICAgICAgICAgICAgaWYgKHBzdW0gPT09IDApXG4gICAgICAgICAgICAgIHBqID0gMDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgcGogPSBwcm93W2pdIC8gcHN1bTtcblxuICAgICAgICAgICAgcHJvd1tqXSA9IHBqO1xuICAgICAgICAgICAgaWYgKHBqID4gMWUtNykgbkhlcmUgLT0gcGogKiBNYXRoLmxvZyhwaik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gYWRqdXN0IGJldGEgYmFzZWQgb24gcmVzdWx0XG4gICAgICAgICAgaWYgKG5IZXJlID4gaFRhcmdldCkge1xuICAgICAgICAgICAgLy8gZW50cm9weSB3YXMgdG9vIGhpZ2ggKGRpc3RyaWJ1dGlvbiB0b28gZGlmZnVzZSlcbiAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gaW5jcmVhc2UgdGhlIHByZWNpc2lvbiBmb3IgbW9yZSBwZWFreSBkaXN0cmlidXRpb25cbiAgICAgICAgICAgIGJldGFtaW4gPSBiZXRhOyAvLyBtb3ZlIHVwIHRoZSBib3VuZHNcbiAgICAgICAgICAgIGlmIChiZXRhbWF4ID09PSBJbmZpbml0eSkgYmV0YSA9IGJldGEgKiAyOyBlbHNlIGJldGEgPSAoYmV0YSArIGJldGFtYXgpIC8gMjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY29udmVyc2UgY2FzZS4gbWFrZSBkaXN0cnVidGlvbiBsZXNzIHBlYWt5XG4gICAgICAgICAgICBiZXRhbWF4ID0gYmV0YTtcbiAgICAgICAgICAgIGlmIChiZXRhbWluID09PSAtSW5maW5pdHkpIGJldGEgPSBiZXRhIC8gMjsgZWxzZSBiZXRhID0gKGJldGEgKyBiZXRhbWluKSAvIDI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gc3RvcHBpbmcgY29uZGl0aW9uczogdG9vIG1hbnkgdHJpZXMgb3IgZ290IGEgZ29vZCBwcmVjaXNpb25cbiAgICAgICAgICBudW0rKztcbiAgICAgICAgICBpZiAoTWF0aC5hYnMobkhlcmUgLSBoVGFyZ2V0KSA8IHRvbCkgZG9uZSA9IHRydWU7XG4gICAgICAgICAgaWYgKG51bSA+PSBtYXh0cmllcykgZG9uZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25zb2xlLmxvZygnZGF0YSBwb2ludCAnICsgaSArICcgZ2V0cyBwcmVjaXNpb24gJyArIGJldGEgKyAnIGFmdGVyICcgKyBudW0gKyAnIGJpbmFyeSBzZWFyY2ggc3RlcHMuJyk7XG4gICAgICAgIC8vIGNvcHkgb3ZlciB0aGUgZmluYWwgcHJvdyB0byBQIGF0IHJvdyBpXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbjsgaisrKSBQW2kgKiBuICsgal0gPSBwcm93W2pdO1xuICAgICAgfSAvLyBlbmQgbG9vcCBvdmVyIGV4YW1wbGVzIGlcblxuICAgICAgLy8gc3ltbWV0cml6ZSBQIGFuZCBub3JtYWxpemUgaXQgdG8gc3VtIHRvIDEgb3ZlciBhbGwgaWpcbiAgICAgIGNvbnN0IHBPdXQgPSB0aGlzLnplcm9zKG4gKiBuKTtcbiAgICAgIGNvbnN0IE4yID0gbiAqIDI7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG47IGorKylcbiAgICAgICAgICBwT3V0W2kgKiBuICsgal0gPSBNYXRoLm1heCgoUFtpICogbiArIGpdICsgUFtqICogbiArIGldKSAvIE4yLCAxZS0xMDApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcE91dDtcbiAgICB9XG5cbiAgICAvLyBoZWxwZXIgZnVuY3Rpb25cbiAgICBwcml2YXRlIHNpZ24oeDogbnVtYmVyKSB7IHJldHVybiB4ID4gMCA/IDEgOiB4IDwgMCA/IC0xIDogMDsgfVxuXG4gICAgY29uc3RydWN0b3Iob3B0OiB7W186IHN0cmluZ106IGFueX0pIHtcbiAgICAgIG9wdCA9IG9wdCB8fCB7fTtcbiAgICAgIHRoaXMucGVycGxleGl0eSA9IHRoaXMuZ2V0b3B0KG9wdCwgJ3BlcnBsZXhpdHknLCAzMCk7IC8vIGVmZmVjdGl2ZSBudW1iZXIgb2YgbmVhcmVzdCBuZWlnaGJvcnNcbiAgICAgIHRoaXMuZGltID0gdGhpcy5nZXRvcHQob3B0LCAnZGltJywgMik7IC8vIGJ5IGRlZmF1bHQgMi1EIHRTTkVcbiAgICAgIHRoaXMuZXBzaWxvbiA9IHRoaXMuZ2V0b3B0KG9wdCwgJ2Vwc2lsb24nLCAxMCk7IC8vIGxlYXJuaW5nIHJhdGVcbiAgICAgIHRoaXMucmFuZG9tID0gdGhpcy5nZXRvcHQob3B0LCAncmFuZG9tJywgTWF0aC5yYW5kb20pOyAvLyByYW5kb20gbnVtYmVyIGdlbmVyYXRvclxuICAgIH1cblxuICAgIC8vIHRoaXMgZnVuY3Rpb24gdGFrZXMgYSBzZXQgb2YgaGlnaC1kaW1lbnNpb25hbCBwb2ludHNcbiAgICAvLyBhbmQgY3JlYXRlcyBtYXRyaXggUCBmcm9tIHRoZW0gdXNpbmcgZ2F1c3NpYW4ga2VybmVsXG4gICAgcHVibGljIGluaXREYXRhUmF3KFg6IEFycmF5PEFycmF5PGFueT4+KSB7XG4gICAgICBjb25zdCBOID0gWC5sZW5ndGg7XG4gICAgICBjb25zdCBEID0gWFswXS5sZW5ndGg7XG4gICAgICB0aGlzLmFzc2VydChOID4gMCwgJyBYIGlzIGVtcHR5PyBZb3UgbXVzdCBoYXZlIHNvbWUgZGF0YSEnKTtcbiAgICAgIHRoaXMuYXNzZXJ0KEQgPiAwLCAnIFhbMF0gaXMgZW1wdHk/IFdoZXJlIGlzIHRoZSBkYXRhPycpO1xuICAgICAgY29uc3QgZGlzdHMgPSB0aGlzLnh0b2QoWCk7IC8vIGNvbnZlcnQgWCB0byBkaXN0YW5jZXMgdXNpbmcgZ2F1c3NpYW4ga2VybmVsXG4gICAgICB0aGlzLlAgPSB0aGlzLmQycChkaXN0cywgdGhpcy5wZXJwbGV4aXR5LCAxZS00LCBEKTsgLy8gYXR0YWNoIHRvIG9iamVjdFxuICAgICAgdGhpcy5OID0gTjsgLy8gYmFjayB1cCB0aGUgc2l6ZSBvZiB0aGUgZGF0YXNldFxuICAgICAgdGhpcy5pbml0U29sdXRpb24oKTsgLy8gcmVmcmVzaCB0aGlzXG4gICAgfVxuXG4gICAgLy8gdGhpcyBmdW5jdGlvbiB0YWtlcyBhIGdpdmVuIGRpc3RhbmNlIG1hdHJpeCBhbmQgY3JlYXRlc1xuICAgIC8vIG1hdHJpeCBQIGZyb20gdGhlbS5cbiAgICAvLyBEIGlzIGFzc3VtZWQgdG8gYmUgcHJvdmlkZWQgYXMgYSBsaXN0IG9mIGxpc3RzLCBhbmQgc2hvdWxkIGJlIHN5bW1ldHJpY1xuICAgIHB1YmxpYyBpbml0RGF0YURpc3QoRDogRmxvYXQzMkFycmF5LCByb3dTaXplOiBudW1iZXIpIHtcbiAgICAgIGNvbnN0IE4gPSBELmxlbmd0aDtcbiAgICAgIHRoaXMuYXNzZXJ0KE4gPiAwLCAnIFggaXMgZW1wdHk/IFlvdSBtdXN0IGhhdmUgc29tZSBkYXRhIScpO1xuICAgICAgLy8gY29udmVydCBEIHRvIGEgKGZhc3QpIHR5cGVkIGFycmF5IHZlcnNpb25cbiAgICAgIC8vIGRpc3RzLmZvckVhY2goKGQpID0+IGNvbnNvbGUubG9nKGQpKTtcbiAgICAgIGNvbnNvbGUudGltZSgnZGlzdGFuY2VzIHRvIG1hdHJpeCcpO1xuICAgICAgdGhpcy5QID0gdGhpcy5kMnAoRCwgdGhpcy5wZXJwbGV4aXR5LCAxZS00LCByb3dTaXplKTtcbiAgICAgIGNvbnNvbGUudGltZUVuZCgnZGlzdGFuY2VzIHRvIG1hdHJpeCcpO1xuICAgICAgdGhpcy5OID0gcm93U2l6ZTtcbiAgICAgIHRoaXMuaW5pdFNvbHV0aW9uKCk7IC8vIHJlZnJlc2ggdGhpc1xuICAgIH1cblxuICAgIC8vIChyZSlpbml0aWFsaXplcyB0aGUgc29sdXRpb24gdG8gcmFuZG9tXG4gICAgcHVibGljIGluaXRTb2x1dGlvbigpIHtcbiAgICAgIC8vIGdlbmVyYXRlIHJhbmRvbSBzb2x1dGlvbiB0byB0LVNORVxuICAgICAgdGhpcy5ZID0gdGhpcy5yYW5kbjJkKHRoaXMuTiwgdGhpcy5kaW0pOyAvLyB0aGUgc29sdXRpb25cbiAgICAgIHRoaXMuZ2FpbnMgPSB0aGlzLnJhbmRuMmQodGhpcy5OLCB0aGlzLmRpbSwgMS4wKTsgLy8gc3RlcCBnYWlucyB0byBhY2NlbGVyYXRlIHByb2dyZXNzIGluIHVuY2hhbmdpbmcgZGlyZWN0aW9uc1xuICAgICAgdGhpcy55c3RlcCA9IHRoaXMucmFuZG4yZCh0aGlzLk4sIHRoaXMuZGltLCAwLjApOyAvLyBtb21lbnR1bSBhY2N1bXVsYXRvclxuICAgICAgdGhpcy5pdGVyID0gMDtcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gcG9pbnRlciB0byBjdXJyZW50IHNvbHV0aW9uXG4gICAgcHVibGljIGdldFNvbHV0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuWTtcbiAgICB9XG5cbiAgICAvLyBwZXJmb3JtIGEgc2luZ2xlIHN0ZXAgb2Ygb3B0aW1pemF0aW9uIHRvIGltcHJvdmUgdGhlIGVtYmVkZGluZ1xuICAgIHB1YmxpYyBzdGVwKCkge1xuICAgICAgdGhpcy5pdGVyICs9IDE7XG4gICAgICBjb25zdCBOID0gdGhpcy5OO1xuICAgICAgY29uc3QgY2cgPSB0aGlzLmNvc3RHcmFkKHRoaXMuWSk7IC8vIGV2YWx1YXRlIGdyYWRpZW50XG4gICAgICBjb25zdCBjb3N0ID0gY2cuY29zdDtcbiAgICAgIGNvbnN0IGdyYWQgPSBjZy5ncmFkO1xuXG4gICAgICAvLyBwZXJmb3JtIGdyYWRpZW50IHN0ZXBcbiAgICAgIGNvbnN0IHltZWFuID0gdGhpcy56ZXJvcyh0aGlzLmRpbSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IHRoaXMuZGltOyBkKyspIHtcbiAgICAgICAgICBjb25zdCBnaWQgPSBncmFkW2ldW2RdO1xuICAgICAgICAgIGNvbnN0IHNpZCA9IHRoaXMueXN0ZXBbaV1bZF07XG4gICAgICAgICAgY29uc3QgZ2FpbmlkID0gdGhpcy5nYWluc1tpXVtkXTtcblxuICAgICAgICAgIC8vIGNvbXB1dGUgZ2FpbiB1cGRhdGVcbiAgICAgICAgICBsZXQgbmV3Z2FpbiA9IHRoaXMuc2lnbihnaWQpID09PSB0aGlzLnNpZ24oc2lkKSA/IGdhaW5pZCAqIDAuOCA6IGdhaW5pZCArIDAuMjtcbiAgICAgICAgICBpZiAobmV3Z2FpbiA8IDAuMDEpIG5ld2dhaW4gPSAwLjAxOyAvLyBjbGFtcFxuICAgICAgICAgIHRoaXMuZ2FpbnNbaV1bZF0gPSBuZXdnYWluOyAvLyBzdG9yZSBmb3IgbmV4dCB0dXJuXG5cbiAgICAgICAgICAvLyBjb21wdXRlIG1vbWVudHVtIHN0ZXAgZGlyZWN0aW9uXG4gICAgICAgICAgY29uc3QgbW9tdmFsID0gdGhpcy5pdGVyIDwgMjUwID8gMC41IDogMC44O1xuICAgICAgICAgIGNvbnN0IG5ld3NpZCA9IG1vbXZhbCAqIHNpZCAtIHRoaXMuZXBzaWxvbiAqIG5ld2dhaW4gKiBncmFkW2ldW2RdO1xuICAgICAgICAgIHRoaXMueXN0ZXBbaV1bZF0gPSBuZXdzaWQ7IC8vIHJlbWVtYmVyIHRoZSBzdGVwIHdlIHRvb2tcblxuICAgICAgICAgIC8vIHN0ZXAhXG4gICAgICAgICAgdGhpcy5ZW2ldW2RdICs9IG5ld3NpZDtcblxuICAgICAgICAgIHltZWFuW2RdICs9IHRoaXMuWVtpXVtkXTsgLy8gYWNjdW11bGF0ZSBtZWFuIHNvIHRoYXQgd2UgY2FuIGNlbnRlciBsYXRlclxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHJlcHJvamVjdCBZIHRvIGJlIHplcm8gbWVhblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCB0aGlzLmRpbTsgZCsrKVxuICAgICAgICAgIHRoaXMuWVtpXVtkXSAtPSB5bWVhbltkXSAvIE47XG4gICAgICB9XG5cbiAgICAgIC8vaWYodGhpcy5pdGVyJTEwMD09PTApIGNvbnNvbGUubG9nKCdpdGVyICcgKyB0aGlzLml0ZXIgKyAnLCBjb3N0OiAnICsgY29zdCk7XG4gICAgICByZXR1cm4gY29zdDsgLy8gcmV0dXJuIGN1cnJlbnQgY29zdFxuICAgIH1cblxuICAgIC8vIGZvciBkZWJ1Z2dpbmc6IGdyYWRpZW50IGNoZWNrXG4gICAgcHVibGljIGRlYnVnR3JhZCgpIHtcbiAgICAgIGNvbnN0IE4gPSB0aGlzLk47XG5cbiAgICAgIGNvbnN0IGNnID0gdGhpcy5jb3N0R3JhZCh0aGlzLlkpOyAvLyBldmFsdWF0ZSBncmFkaWVudFxuICAgICAgLy9jb25zdCBjb3N0ID0gY2cuY29zdDtcbiAgICAgIGNvbnN0IGdyYWQgPSBjZy5ncmFkO1xuXG4gICAgICBjb25zdCBlID0gMWUtNTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgdGhpcy5kaW07IGQrKykge1xuICAgICAgICAgIGNvbnN0IHlvbGQgPSB0aGlzLllbaV1bZF07XG5cbiAgICAgICAgICB0aGlzLllbaV1bZF0gPSB5b2xkICsgZTtcbiAgICAgICAgICBjb25zdCBjZzAgPSB0aGlzLmNvc3RHcmFkKHRoaXMuWSk7XG5cbiAgICAgICAgICB0aGlzLllbaV1bZF0gPSB5b2xkIC0gZTtcbiAgICAgICAgICBjb25zdCBjZzEgPSB0aGlzLmNvc3RHcmFkKHRoaXMuWSk7XG5cbiAgICAgICAgICBjb25zdCBhbmFseXRpYyA9IGdyYWRbaV1bZF07XG4gICAgICAgICAgY29uc3QgbnVtZXJpY2FsID0gKGNnMC5jb3N0IC0gY2cxLmNvc3QpIC8gKDIgKiBlKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhpICsgJywnICsgZCArICc6IGdyYWRjaGVjayBhbmFseXRpYzogJyArIGFuYWx5dGljICsgJyB2cy4gbnVtZXJpY2FsOiAnICsgbnVtZXJpY2FsKTtcblxuICAgICAgICAgIHRoaXMuWVtpXVtkXSA9IHlvbGQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHF1QXJyPzogRmxvYXQzMkFycmF5O1xuICAgIC8vIHJldHVybiBjb3N0IGFuZCBncmFkaWVudCwgZ2l2ZW4gYW4gYXJyYW5nZW1lbnRcbiAgICBwdWJsaWMgY29zdEdyYWQoWTogbnVtYmVyW11bXSkge1xuICAgICAgY29uc3QgTiA9IHRoaXMuTjtcbiAgICAgIGNvbnN0IGRpbSA9IHRoaXMuZGltOyAvLyBkaW0gb2Ygb3V0cHV0IHNwYWNlXG4gICAgICBjb25zdCBQID0gdGhpcy5QO1xuXG4gICAgICBjb25zdCBwbXVsID0gdGhpcy5pdGVyIDwgMTAwID8gNCA6IDE7IC8vIHRyaWNrIHRoYXQgaGVscHMgd2l0aCBsb2NhbCBvcHRpbWFcblxuICAgICAgLy8gY29tcHV0ZSBjdXJyZW50IFEgZGlzdHJpYnV0aW9uLCB1bm5vcm1hbGl6ZWQgZmlyc3RcbiAgICAgIHRoaXMucXVBcnIgPz89IHRoaXMuemVyb3MoTiAqIE4pO1xuICAgICAgbGV0IHFzdW0gPSAwLjA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBOOyBqKyspIHtcbiAgICAgICAgICBjb25zdCBkc3VtID0gbmV3IEFycmF5KGRpbSkucmVkdWNlKChwcmV2LCBfLCBkKSA9PiBwcmV2ICsgTWF0aC5wb3coWVtpXVtkXSAtIFlbal1bZF0sIDIpLCAwKTtcbiAgICAgICAgICBjb25zdCBxdSA9IDEuMCAvICgxLjAgKyBkc3VtKTsgLy8gU3R1ZGVudCB0LWRpc3RyaWJ1dGlvblxuICAgICAgICAgIHRoaXMucXVBcnJbaSAqIE4gKyBqXSA9IHF1O1xuICAgICAgICAgIHRoaXMucXVBcnJbaiAqIE4gKyBpXSA9IHF1O1xuICAgICAgICAgIHFzdW0gKz0gMiAqIHF1O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBub3JtYWxpemUgUSBkaXN0cmlidXRpb24gdG8gc3VtIHRvIDFcbiAgICAgIC8vY29uc3QgTk4gPSBOICogTjtcbiAgICAgIC8vY29uc3QgUSA9IHRoaXMuemVyb3MoTk4pO1xuICAgICAgbGV0IGNvc3QgPSAwLjA7XG4gICAgICBjb25zdCBncmFkID0gbmV3IEFycmF5KE4pLmZpbGwobnVsbCkubWFwKCgpID0+IChuZXcgRmxvYXQzMkFycmF5KGRpbSkpLmZpbGwoMC4wKSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgICAvLyBjb25zdCBnc3VtID0gbmV3IEZsb2F0MzJBcnJheShkaW0pLmZpbGwoMC4wKTsgLy8gaW5pdCBncmFkIGZvciBwb2ludCBpXG4gICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IE47IGorKykge1xuICAgICAgICAgIGNvbnN0IFEgPSBNYXRoLm1heCh0aGlzLnF1QXJyW2kgKiBOICsgal0gLyBxc3VtLCAxZS0xMDApO1xuICAgICAgICAgIGNvc3QgKz0gKC0gUFtpICogTiArIGpdICogTWF0aC5sb2coUSkpICogMjsgLy8gYWNjdW11bGF0ZSBjb3N0ICh0aGUgbm9uLWNvbnN0YW50IHBvcnRpb24gYXQgbGVhc3QuLi4pXG4gICAgICAgICAgY29uc3QgcHJlbXVsdCA9IDQgKiAocG11bCAqIFBbaSAqIE4gKyBqXSAtIFEpICogdGhpcy5xdUFycltpICogTiArIGpdO1xuICAgICAgICAgIC8vY29uc29sZS5sb2cocHJlbXVsdCwgUSwgaSwgaik7XG4gICAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBkaW07IGQrKykge1xuICAgICAgICAgICAgZ3JhZFtpXVtkXSArPSBwcmVtdWx0ICogKFlbaV1bZF0gLSBZW2pdW2RdKTtcbiAgICAgICAgICAgIGdyYWRbal1bZF0gKz0gcHJlbXVsdCAqIChZW2pdW2RdIC0gWVtpXVtkXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vZ3JhZFtpXSA9IGdzdW07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7Y29zdCwgZ3JhZH07XG4gICAgfVxufVxuIl19","/** 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 { Vector } from '@datagrok-libraries/utils/src/type-declarations';\nimport { AvailableMetrics, Measure, isBitArrayMetric } from '../typed-metrics';\nimport { DistanceMatrixService } from '../distance-matrix';\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';\n//import {TSNE} from '@keckelt/tsne';\nimport { TSNE } from '../t-sne/t-sne';\nclass MultiColumnReducer {\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 /**\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 const randomSeed = options.randomSeed ?? Date();\n const randomFn = seedRandom(randomSeed);\n options.random = randomFn;\n this.reducer = new TSNE(options);\n this.iterations = options?.iterations ?? this.reducer.getIterSize(this.data[0].length);\n this.distanceFnames = options.distanceFnames;\n this.distanceFns = options.distanceFns;\n this.distanceFnArgs = options.distanceFnArgs;\n this.progressFunc = options.progressFunc;\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: Array<Float32Array> = [];\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 distance = await matrixService.calcMulti(this.data, this.distanceFnames, false, this.distanceFnArgs, this.weights, this.aggregationMethod);\n matrixService.terminate();\n // const matrixProxy = distanceMatrixProxy(distance, this.data[0].length);\n this.reducer.initDataDist(distance, this.data[0].length);\n for (let i = 0; i < this.iterations; ++i) {\n this.reducer.step(); // every time you call this, solution gets better\n if (this.progressFunc)\n this.progressFunc(i, this.iterations, []);\n }\n return this.reducer.getSolution();\n }\n catch (e) {\n matrixService.terminate();\n throw e;\n }\n }\n}\nclass UMAPReducer extends MultiColumnReducer {\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 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 <= (options.nNeighbors ?? 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 /**\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktY29sdW1uLWRpbS1yZWR1Y2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibXVsdGktY29sdW1uLWRpbS1yZWR1Y2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBK0MsTUFBTSxFQUFVLE1BQy9ELGlEQUFpRCxDQUFDO0FBQ3pELE9BQU8sRUFBcUIsZ0JBQWdCLEVBQWdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQy9HLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRXpELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUN4RixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUU3RSxPQUFPLFFBQVEsTUFBTSx5Q0FBeUMsQ0FBQztBQUMvRCxPQUFPLFVBQVUsTUFBTSxZQUFZLENBQUM7QUFDcEMscUNBQXFDO0FBQ3JDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQThCcEMsTUFBZSxrQkFBa0I7SUFJN0IsWUFBWSxPQUFnQjtRQUMxQixJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7SUFDckQsQ0FBQztDQUtKO0FBRUQsTUFBTSxXQUFZLFNBQVEsa0JBQWtCO0lBT3hDOzs7O09BSUc7SUFDSCxZQUFZLE9BQWdCO1FBQzFCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLE1BQU0sVUFBVSxHQUFXLE9BQU8sQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFLENBQUM7UUFDeEQsTUFBTSxRQUFR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QUEwQixDQUFDLENBQUM7UUFFOUMsSUFBSSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRS9DLElBQUksU0FBUztZQUNYLFNBQVMsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFekMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7Ozs7S0FNQztJQUNELE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxRQUE0QjtRQUN4RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7O0tBS0M7SUFDRCxNQUFNLEtBQUssZ0JBQWdCO1FBQ3pCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7S0FLQztJQUNELE1BQU0sS0FBSyxnQkFBZ0I7UUFDekIsSUFBSSxHQUFHLEdBQWEsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM5QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29vcmRpbmF0ZXMsIERpc3RhbmNlTWV0cmljLCBNYXRyaXgsIE9wdGlvbnMsIFZlY3RvciwgVmVjdG9yc31cbiAgZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdHlwZS1kZWNsYXJhdGlvbnMnO1xuaW1wb3J0IHtBdmFpbGFibGVEYXRhVHlwZXMsIEF2YWlsYWJsZU1ldHJpY3MsIEtub3duTWV0cmljcywgTWVhc3VyZSwgaXNCaXRBcnJheU1ldHJpY30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5pbXBvcnQge0Rpc3RhbmNlTWF0cml4U2VydmljZX0gZnJvbSAnLi4vZGlzdGFuY2UtbWF0cml4JztcbmltcG9ydCB7RGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZH0gZnJvbSAnLi4vZGlzdGFuY2UtbWF0cml4L3R5cGVzJztcbmltcG9ydCB7VU1BUH0gZnJvbSAnLi4vdW1hcCc7XG5pbXBvcnQge2Fzc2VydCwgdHJhbnNwb3NlTWF0cml4fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy92ZWN0b3Itb3BlcmF0aW9ucyc7XG5pbXBvcnQge1NwYXJzZU1hdHJpeFNlcnZpY2V9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC9zcGFyc2UtbWF0cml4LXNlcnZpY2UnO1xuaW1wb3J0IHtEaW1SZWR1Y3Rpb25NZXRob2RzfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCBCaXRBcnJheSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy9iaXQtYXJyYXknO1xuaW1wb3J0IHNlZWRSYW5kb20gZnJvbSAnc2VlZHJhbmRvbSc7XG4vL2ltcG9ydCB7VFNORX0gZnJvbSAnQGtlY2tlbHQvdHNuZSc7XG5pbXBvcnQge1RTTkV9IGZyb20gJy4uL3Qtc25lL3Qtc25lJztcblxuZXhwb3J0IGludGVyZmFjZSBJVU1BUE9wdGlvbnMge1xuICAgIGxlYXJuaW5nUmF0ZT86IG51bWJlcjtcbiAgICBuQ29tcG9uZW50cz86IG51bWJlcjtcbiAgICBuRXBvY2hzPzogbnVtYmVyO1xuICAgIG5OZWlnaGJvcnM/OiBudW1iZXI7XG4gICAgc3ByZWFkPzogbnVtYmVyO1xuICAgIG1pbkRpc3Q/OiBudW1iZXI7XG4gICAgcHJvZ3Jlc3NGdW5jPzogKGVwb2M6IG51bWJlciwgZXBvY2hzTGVuZ3RoOiBudW1iZXIsIGVtYmVkZGluZ3M6IG51bWJlcltdW10pID0+IHZvaWQ7XG4gICAgcmFuZG9tU2VlZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVFNORU9wdGlvbnMge1xuICAgIGVwc2lsb24/OiBudW1iZXI7XG4gICAgcGVycGxleGl0eT86IG51bWJlcjtcbiAgICBkaW0/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpbVJlZHVjdGlvblBhcmFtPFQgZXh0ZW5kcyBudW1iZXIgfCBzdHJpbmcgPSBudW1iZXI+IHtcbiAgICB1aU5hbWU6IHN0cmluZztcbiAgICB2YWx1ZTogKFQgZXh0ZW5kcyBudW1iZXIgPyBudW1iZXIgOiBzdHJpbmcpIHwgbnVsbDtcbiAgICB0b29sdGlwOiBzdHJpbmc7XG4gICAgdHlwZT86IFQgZXh0ZW5kcyBudW1iZXIgPyAnbnVtYmVyJyA6ICdzdHJpbmcnO1xuICAgIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAgIG1pbj86IG51bWJlcjtcbiAgICBtYXg/OiBudW1iZXI7XG4gICAgc3RlcD86IG51bWJlcjtcbn1cblxuYWJzdHJhY3QgY2xhc3MgTXVsdGlDb2x1bW5SZWR1Y2VyIHtcbiAgICBwcm90ZWN0ZWQgZGF0YTogVmVjdG9yc1tdO1xuICAgIHByb3RlY3RlZCB3ZWlnaHRzOiBudW1iZXJbXTtcbiAgICBwcm90ZWN0ZWQgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2Q7XG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucykge1xuICAgICAgdGhpcy5kYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgICAgdGhpcy53ZWlnaHRzID0gb3B0aW9ucy53ZWlnaHRzO1xuICAgICAgdGhpcy5hZ2dyZWdhdGlvbk1ldGhvZCA9IG9wdGlvbnMuYWdncmVnYXRpb25NZXRob2Q7XG4gICAgfVxuXG4gICAgLyoqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UuXG4gICAgICogQHJldHVybiB7YW55fSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZiB0aGlzIGVtYmVkZGluZyBhbmQgZGlzdGFuY2UgbWF0cml4IHdoZXJlIGFwcGxpY2FibGUuICovXG4gICAgYWJzdHJhY3QgdHJhbnNmb3JtKCk6IFByb21pc2U8TWF0cml4Pjtcbn1cblxuY2xhc3MgVFNORVJlZHVjZXIgZXh0ZW5kcyBNdWx0aUNvbHVtblJlZHVjZXIge1xuICAgIHByb3RlY3RlZCByZWR1Y2VyOiBUU05FO1xuICAgIHByb3RlY3RlZCBpdGVyYXRpb25zOiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIGRpc3RhbmNlRm5hbWVzOiBLbm93bk1ldHJpY3NbXTtcbiAgICBwcm90ZWN0ZWQgZGlzdGFuY2VGbnM6ICgoYTogYW55LCBiOiBhbnkpID0+IG51bWJlcilbXTtcbiAgICBwcm90ZWN0ZWQgZGlzdGFuY2VGbkFyZ3M6IHtbXzogc3RyaW5nXTogYW55fVtdO1xuICAgIHByb3RlY3RlZCBwcm9ncmVzc0Z1bmM/OiAoZXBvYzogbnVtYmVyLCBlcG9jaHNMZW5ndGg6IG51bWJlciwgZW1iZWRkaW5ncz86IG51bWJlcltdW10pID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBUU05FUmVkdWNlci5cbiAgICAgKiBAcGFyYW0ge09wdGlvbnN9IG9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBAbWVtYmVyb2YgVFNORVJlZHVjZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgIGNvbnN0IHJhbmRvbVNlZWQ6IHN0cmluZyA9IG9wdGlvbnMucmFuZG9tU2VlZCA/PyBEYXRlKCk7XG4gICAgICBjb25zdCByYW5kb21GbiA9IHNlZWRSYW5kb20ocmFuZG9tU2VlZCk7XG4gICAgICBvcHRpb25zLnJhbmRvbSA9IHJhbmRvbUZuO1xuICAgICAgdGhpcy5yZWR1Y2VyID0gbmV3IFRTTkUob3B0aW9ucyk7XG4gICAgICB0aGlzLml0ZXJhdGlvbnMgPSBvcHRpb25zPy5pdGVyYXRpb25zID8/IHRoaXMucmVkdWNlci5nZXRJdGVyU2l6ZSh0aGlzLmRhdGFbMF0ubGVuZ3RoKTtcbiAgICAgIHRoaXMuZGlzdGFuY2VGbmFtZXMgPSBvcHRpb25zLmRpc3RhbmNlRm5hbWVzO1xuICAgICAgdGhpcy5kaXN0YW5jZUZucyA9IG9wdGlvbnMuZGlzdGFuY2VGbnM7XG4gICAgICB0aGlzLmRpc3RhbmNlRm5BcmdzID0gb3B0aW9ucy5kaXN0YW5jZUZuQXJncztcbiAgICAgIHRoaXMucHJvZ3Jlc3NGdW5jID0gb3B0aW9ucy5wcm9ncmVzc0Z1bmM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1iZWRzIHRoZSBkYXRhIGdpdmVuIGludG8gdGhlIHR3by1kaW1lbnNpb25hbCBzcGFjZSB1c2luZyB0LVNORSBtZXRob2QuXFxcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwYXJhbGxlbERpc3RhbmNlV29ya2Vyc10gV2hldGhlciB0byB1c2UgcGFyYWxsZWwgZGlzdGFuY2Ugd29ya2Vycy5cbiAgICAgKiBAcmV0dXJuIHthbnl9IENhcnRlc2lhbiBjb29yZGluYXRlIG9mIHRoaXMgZW1iZWRkaW5nIGFuZCBkaXN0YW5jZSBtYXRyaXggd2hlcmUgYXBwbGljYWJsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdHJhbnNmb3JtKCk6IFByb21pc2U8TWF0cml4PiB7XG4gICAgICBpZiAodGhpcy5kYXRhWzBdLmxlbmd0aCA+IDEwMDAwKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01heGltdW0gbnVtYmVyIG9mIHNhbXBsZXMgZm9yIFQtU05FIGlzIDEwMDAwJyk7XG4gICAgICBjb25zdCBtYXRyaXhTZXJ2aWNlID0gbmV3IERpc3RhbmNlTWF0cml4U2VydmljZSh0cnVlLCBmYWxzZSk7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBjb25zdCBhZ2dyZWdhdGUgPSBnZXRBZ2dyZWdhdGlvbkZ1bmN0aW9uKHRoaXMuYWdncmVnYXRpb25NZXRob2QsIHRoaXMud2VpZ2h0cyk7XG4gICAgICAgIC8vIGNvbnN0IGRpc3RhbmNlczogQXJyYXk8RmxvYXQzMkFycmF5PiA9IFtdO1xuICAgICAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7ICsraSkge1xuICAgICAgICAvLyAgIGNvbnN0IGRpc3QgPSBhd2FpdCBtYXRyaXhTZXJ2aWNlLmNhbGModGhpcy5kYXRhW2ldLCB0aGlzLmRpc3RhbmNlRm5hbWVzW2ldLCBmYWxzZSwgdGhpcy5kaXN0YW5jZUZuQXJnc1tpXSk7XG4gICAgICAgIC8vICAgZGlzdGFuY2VzLnB1c2goZGlzdCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gY29uc3QgZGlzdGFuY2UgPSBuZXcgRmxvYXQzMkFycmF5KGRpc3RhbmNlc1swXS5sZW5ndGgpLmZpbGwoMCk7XG4gICAgICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgZGlzdGFuY2VzWzBdLmxlbmd0aDsgKytpKVxuICAgICAgICAvLyAgIGRpc3RhbmNlW2ldID0gYWdncmVnYXRlKGRpc3RhbmNlcy5tYXAoKGQpID0+IGRbaV0pKTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBhd2FpdCBtYXRyaXhTZXJ2aWNlLmNhbGNNdWx0aSh0aGlzLmRhdGEsIHRoaXMuZGlzdGFuY2VGbmFtZXMsIGZhbHNlLCB0aGlzLmRpc3RhbmNlRm5BcmdzLFxuICAgICAgICAgIHRoaXMud2VpZ2h0cywgdGhpcy5hZ2dyZWdhdGlvbk1ldGhvZCk7XG4gICAgICAgIG1hdHJpeFNlcnZpY2UudGVybWluYXRlKCk7XG4gICAgICAgIC8vIGNvbnN0IG1hdHJpeFByb3h5ID0gZGlzdGFuY2VNYXRyaXhQcm94eShkaXN0YW5jZSwgdGhpcy5kYXRhWzBdLmxlbmd0aCk7XG4gICAgICAgIHRoaXMucmVkdWNlci5pbml0RGF0YURpc3QoZGlzdGFuY2UsIHRoaXMuZGF0YVswXS5sZW5ndGgpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVyYXRpb25zOyArK2kpIHtcbiAgICAgICAgICB0aGlzLnJlZHVjZXIuc3RlcCgpOyAvLyBldmVyeSB0aW1lIHlvdSBjYWxsIHRoaXMsIHNvbHV0aW9uIGdldHMgYmV0dGVyXG4gICAgICAgICAgaWYgKHRoaXMucHJvZ3Jlc3NGdW5jKVxuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0Z1bmMoaSwgdGhpcy5pdGVyYXRpb25zLCBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVkdWNlci5nZXRTb2x1dGlvbigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBtYXRyaXhTZXJ2aWNlLnRlcm1pbmF0ZSgpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgVU1BUFJlZHVjZXIgZXh0ZW5kcyBNdWx0aUNvbHVtblJlZHVjZXIge1xuICAgIHByb3RlY3RlZCByZWR1Y2VyOiBVTUFQO1xuICAgIHByb3RlY3RlZCBkaXN0YW5jZUZuYW1lczogS25vd25NZXRyaWNzW107XG4gICAgcHJvdGVjdGVkIGRpc3RhbmNlRm5zOiBGdW5jdGlvbltdO1xuICAgIHByb3RlY3RlZCB2ZWN0b3JzOiBudW1iZXJbXTtcbiAgICBwcm90ZWN0ZWQgcHJvZ3Jlc3NGdW5jPzogKGVwb2M6IG51bWJlciwgZXBvY2hzTGVuZ3RoOiBudW1iZXIsIGVtYmVkZGluZzogbnVtYmVyW11bXSkgPT4gdm9pZDtcbiAgICBwcm90ZWN0ZWQgZGlzdGFuY2VGbkFyZ3M6IHtbXzogc3RyaW5nXTogYW55fVtdO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgVU1BUFJlZHVjZXIuXG4gICAgICogQHBhcmFtIHtPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgICogQG1lbWJlcm9mIFVNQVBSZWR1Y2VyXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucykge1xuICAgICAgY29uc3QgcmFuZG9tU2VlZDogc3RyaW5nID0gb3B0aW9ucy5yYW5kb21TZWVkID8/IERhdGUoKTtcbiAgICAgIGNvbnN0IHJhbmRvbUZuID0gc2VlZFJhbmRvbShyYW5kb21TZWVkKTtcbiAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgYXNzZXJ0KCdkaXN0YW5jZUZuYW1lcycgaW4gb3B0aW9ucyk7XG4gICAgICBhc3NlcnQoJ2Rpc3RhbmNlRm5zJyBpbiBvcHRpb25zKTtcbiAgICAgIHRoaXMuZGlzdGFuY2VGbkFyZ3MgPSBvcHRpb25zLmRpc3RhbmNlRm5BcmdzO1xuICAgICAgdGhpcy5kaXN0YW5jZUZucyA9IG9wdGlvbnMuZGlzdGFuY2VGbnMhO1xuICAgICAgdGhpcy5wcm9ncmVzc0Z1bmMgPSBvcHRpb25zLnByb2dyZXNzRnVuYztcblxuICAgICAgdGhpcy5kaXN0YW5jZUZuYW1lcyA9IG9wdGlvbnMuZGlzdGFuY2VGbmFtZXMhO1xuICAgICAgLy9VbWFwIHVzZXMgdmVjdG9yIGluZGV4aW5nLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhbiBhcnJheSBvZiB2ZWN0b3JzIGFzIGluZGVjZXMuXG4gICAgICB0aGlzLnZlY3RvcnMgPSBuZXcgQXJyYXkodGhpcy5kYXRhWzBdLmxlbmd0aCkuZmlsbCgwKS5tYXAoKF8sIGkpID0+IGkpO1xuXG4gICAgICBpZiAodGhpcy5kYXRhWzBdLmxlbmd0aCA8PSAob3B0aW9ucy5uTmVpZ2hib3JzID8/IDE1KSlcbiAgICAgICAgb3B0aW9ucy5uTmVpZ2hib3JzID0gdGhpcy5kYXRhWzBdLmxlbmd0aCAtIDE7XG4gICAgICBvcHRpb25zLnJhbmRvbSA9IHJhbmRvbUZuO1xuICAgICAgdGhpcy5yZWR1Y2VyID0gbmV3IFVNQVAob3B0aW9ucyk7XG4gICAgICAvLyB0aGlzLnJlZHVjZXIuZGlzdGFuY2VGbiA9IHRoaXMuX2VuY29kZWREaXN0YW5jZS5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgVU1BUCBtZXRob2QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbX3BhcmFsbGVsRGlzdGFuY2VXb3JrZXJzXSBXaGV0aGVyIHRvIHVzZSBwYXJhbGxlbCBkaXN0YW5jZSBtYXRyaXggd29ya2Vycy5cbiAgICAgKiBAcmV0dXJuIHthbnl9IENhcnRlc2lhbiBjb29yZGluYXRlIG9mIHRoaXMgZW1iZWRkaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB0cmFuc2Zvcm0oX3BhcmFsbGVsRGlzdGFuY2VXb3JrZXJzPzogYm9vbGVhbik6IFByb21pc2U8TWF0cml4PiB7XG4gICAgICBjb25zb2xlLnRpbWUoJ2tubiBncmFwaCcpO1xuICAgICAgY29uc3Qga25uUmVzID0gYXdhaXQgbmV3IFNwYXJzZU1hdHJpeFNlcnZpY2UoKVxuICAgICAgICAubXVsdGlDb2x1bW5LTk4odGhpcy5kYXRhLCB0aGlzLmRpc3RhbmNlRm5hbWVzLCB0aGlzLnJlZHVjZXIubmVpZ2hib3JzLFxuICAgICAgICAgIHRoaXMuZGlzdGFuY2VGbkFyZ3MsIHRoaXMud2VpZ2h0cywgdGhpcy5hZ2dyZWdhdGlvbk1ldGhvZCk7XG4gICAgICBjb25zb2xlLnRpbWVFbmQoJ2tubiBncmFwaCcpO1xuICAgICAgdGhpcy5yZWR1Y2VyLnNldFByZWNvbXB1dGVkS05OKGtublJlcy5rbm5JbmRleGVzLCBrbm5SZXMua25uRGlzdGFuY2VzKTtcblxuICAgICAgLy8gbmVlZGVkIHNvIHRoYXQgZ2FyYmFnZSBjb2xsZWN0b3IgY2FuIGZyZWUgbWVtb3J5IGZyb20gZGlzdGFuY2UgbWF0cml4XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sIDMwMCk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZW1iZWRkaW5nID0gYXdhaXQgdGhpcy5yZWR1Y2VyLmZpdEFzeW5jKHRoaXMudmVjdG9ycywgKGVwb2MpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHJvZ3Jlc3NGdW5jKVxuICAgICAgICAgIHRoaXMucHJvZ3Jlc3NGdW5jKGVwb2MsIHRoaXMucmVkdWNlci5nZXRORXBvY2hzKCksIHRoaXMucmVkdWNlci5nZXRFbWJlZGRpbmcoKSk7XG4gICAgICB9KTtcblxuICAgICAgZnVuY3Rpb24gYXJyYXlDYXN0MkNvb3JkaW5hdGVzKGRhdGE6IG51bWJlcltdW10pOiBDb29yZGluYXRlcyB7XG4gICAgICAgIHJldHVybiBuZXcgQXJyYXkoZGF0YS5sZW5ndGgpLmZpbGwoMCkubWFwKChfLCBpKSA9PiAoVmVjdG9yLmZyb20oZGF0YVtpXSkpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFycmF5Q2FzdDJDb29yZGluYXRlcyhlbWJlZGRpbmcpO1xuICAgIH1cbn1cblxuY29uc3QgQXZhaWxhYmxlUmVkdWNlcnMgPSB7XG4gICdVTUFQJzogVU1BUFJlZHVjZXIsXG4gICd0LVNORSc6IFRTTkVSZWR1Y2VyLFxufTtcblxuZXhwb3J0IHR5cGUgS25vd25NZXRob2RzID0ga2V5b2YgdHlwZW9mIEF2YWlsYWJsZVJlZHVjZXJzO1xuXG5leHBvcnQgY2xhc3MgTXVsdGlDb2xEaW1SZWR1Y2VyIHtcbiAgICBwcml2YXRlIHJlZHVjZXI6IE11bHRpQ29sdW1uUmVkdWNlciB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBEaW1lbnNpb25hbGl0eVJlZHVjZXIuXG4gICAqIEBwYXJhbSB7YW55W119IGRhdGEgVmVjdG9ycyB0byBlbWJlZC5cbiAgICogQHBhcmFtIHtLbm93bk1ldGhvZHN9IG1ldGhvZCBFbWJlZGRpbmcgbWV0aG9kIHRvIGJlIGFwcGxpZWRcbiAgICogQHBhcmFtIHtLbm93bk1ldHJpY3N9IG1ldHJpYyBEaXN0YW5jZSBtZXRyaWMgdG8gYmUgY29tcHV0ZWQgYmV0d2VlbiBlYWNoIG9mIHRoZSB2ZWN0b3JzLlxuICAgKiBAcGFyYW0ge09wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGltcGxlbWVudGluZyBlbWJlZGRlcnMuXG4gICAqIEBtZW1iZXJvZiBEaW1lbnNpb25hbGl0eVJlZHVjZXJcbiAgICovXG4gICAgY29uc3RydWN0b3IoZGF0YTogQXJyYXk8YW55W10+LCBtZXRob2Q6IERpbVJlZHVjdGlvbk1ldGhvZHMsIG1ldHJpY3M6IEtub3duTWV0cmljc1tdLFxuICAgICAgd2VpZ2h0czogbnVtYmVyW10sIGRpc3RhbmNlQWdncmVnYXRpb246IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsIG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IG1lYXN1cmVzOiBEaXN0YW5jZU1ldHJpY1tdID0gW107XG4gICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBtZXRyaWNzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgY29uc3QgbWVhc3VyZSA9IG5ldyBNZWFzdXJlKG1ldHJpY3NbaWR4XSkuZ2V0TWVhc3VyZShvcHRpb25zLmRpc3RhbmNlRm5BcmdzW2lkeF0pO1xuICAgICAgICBtZWFzdXJlcy5wdXNoKG1lYXN1cmUpO1xuICAgICAgICBsZXQgYml0QXJyYXlMZW5ndGggPSAyMDQ4O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFbaWR4XS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGlmIChkYXRhW2lkeF1baV0gJiYgZGF0YVtpZHhdW2ldLl9sZW5ndGgpIHtcbiAgICAgICAgICAgIGJpdEFycmF5TGVuZ3RoID0gZGF0YVtpZHhdW2ldLl9sZW5ndGg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQml0QXJyYXlNZXRyaWMobWV0cmljc1tpZHhdKSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YVtpZHhdLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoZGF0YVtpZHhdW2ldICYmIGRhdGFbaWR4XVtpXS5fZGF0YSlcbiAgICAgICAgICAgICAgZGF0YVtpZHhdW2ldID0gbmV3IEJpdEFycmF5KGRhdGFbaWR4XVtpXS5fZGF0YSwgZGF0YVtpZHhdW2ldLl9sZW5ndGgpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBkYXRhW2lkeF1baV0gPSBuZXcgQml0QXJyYXkoYml0QXJyYXlMZW5ndGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobWV0aG9kID09ICdVTUFQJykge1xuICAgICAgICB0aGlzLnJlZHVjZXIgPSBuZXcgVU1BUFJlZHVjZXIoe1xuICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgZGlzdGFuY2VGbmFtZXM6IG1ldHJpY3MsXG4gICAgICAgICAgZGlzdGFuY2VGbnM6IG1lYXN1cmVzLFxuICAgICAgICAgIGRpc3RhbmNlRm5BcmdzOiBvcHRpb25zLmRpc3RhbmNlRm5BcmdzLFxuICAgICAgICAgIHdlaWdodHM6IHdlaWdodHMsXG4gICAgICAgICAgYWdncmVnYXRpb25NZXRob2Q6IGRpc3RhbmNlQWdncmVnYXRpb24sXG4gICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09ICd0LVNORScpIHtcbiAgICAgICAgdGhpcy5yZWR1Y2VyID0gbmV3IFRTTkVSZWR1Y2VyKHtcbiAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgIGRpc3RhbmNlRm5hbWVzOiBtZXRyaWNzLFxuICAgICAgICAgIGRpc3RhbmNlRm5zOiBtZWFzdXJlcyxcbiAgICAgICAgICBkaXN0YW5jZUZuQXJnczogb3B0aW9ucy5kaXN0YW5jZUZuQXJncyxcbiAgICAgICAgICB3ZWlnaHRzOiB3ZWlnaHRzLFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uTWV0aG9kOiBkaXN0YW5jZUFnZ3JlZ2F0aW9uLFxuICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAqIEVtYmVkcyB0aGUgZGF0YSBnaXZlbiBpbnRvIHRoZSB0d28tZGltZW5zaW9uYWwgc3BhY2UgdXNpbmcgdGhlIGNob3NlbiBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdHJhbnNwb3NlIFdoZXRoZXIgdG8gdHJhbnNmb3JtIGNvb3JkaW5hdGVzIHRvIGhhdmUgY29sdW1ucy1maXJzdCBvcmllbnRhdGlvbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbGxlbERpc3RhbmNlV29ya2VycyBXaGV0aGVyIHRvIHVzZSBwYXJhbGxlbCBkaXN0YW5jZSBjb21wdXRhdGlvbi5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBlbWJlZGRpbmcgbWV0aG9kIHdhcyBub3QgZm91bmQuXG4gICAqIEByZXR1cm4ge2FueX0gQ2FydGVzaWFuIGNvb3JkaW5hdGUgb2YgdGhpcyBlbWJlZGRpbmcgYW5kIGRpc3RhbmNlIG1hdHJpeCB3aGVyZSBhcHBsaWNhYmxlLlxuICAgKiBAbWVtYmVyb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyXG4gICAqL1xuICAgIHB1YmxpYyBhc3luYyB0cmFuc2Zvcm0odHJhbnNwb3NlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPE1hdHJpeD4ge1xuICAgICAgaWYgKHRoaXMucmVkdWNlciA9PT0gdW5kZWZpbmVkKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZHVjZXIgd2FzIG5vdCBkZWZpbmVkLicpO1xuXG4gICAgICBsZXQgZW1iZWRkaW5nID0gYXdhaXQgdGhpcy5yZWR1Y2VyLnRyYW5zZm9ybSgpO1xuXG4gICAgICBpZiAodHJhbnNwb3NlKVxuICAgICAgICBlbWJlZGRpbmcgPSB0cmFuc3Bvc2VNYXRyaXgoZW1iZWRkaW5nKTtcblxuICAgICAgcmV0dXJuIGVtYmVkZGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICogUmV0dXJucyBtZXRyaWNzIGF2YWlsYWJsZSBieSB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0ge0F2YWlsYWJsZURhdGFUeXBlc30gdHlwZU5hbWUgdHlwZSBuYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBNZXRyaWMgbmFtZXMgd2hpY2ggZXhwZWN0cyB0aGUgZ2l2ZW4gZGF0YSB0eXBlXG4gICAqIEBtZW1iZXJvZiBEaW1lbnNpb25hbGl0eVJlZHVjZXJcbiAgICovXG4gICAgc3RhdGljIGF2YWlsYWJsZU1ldHJpY3NCeVR5cGUodHlwZU5hbWU6IEF2YWlsYWJsZURhdGFUeXBlcykge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKEF2YWlsYWJsZU1ldHJpY3NbdHlwZU5hbWVdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICogUmV0dXJucyBkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24gbWV0aG9kcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEByZWFkb25seVxuICAgKiBAbWVtYmVyb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyXG4gICAqL1xuICAgIHN0YXRpYyBnZXQgYXZhaWxhYmxlTWV0aG9kcygpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhBdmFpbGFibGVSZWR1Y2Vycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAqIFJldHVybnMgbWV0cmljcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEByZWFkb25seVxuICAgKiBAbWVtYmVyb2YgRGltZW5zaW9uYWxpdHlSZWR1Y2VyXG4gICAqL1xuICAgIHN0YXRpYyBnZXQgYXZhaWxhYmxlTWV0cmljcygpIHtcbiAgICAgIGxldCBhbnM6IHN0cmluZ1tdID0gW107XG4gICAgICBPYmplY3QudmFsdWVzKEF2YWlsYWJsZU1ldHJpY3MpLmZvckVhY2goKG9iaikgPT4ge1xuICAgICAgICBjb25zdCBhcnJheSA9IE9iamVjdC52YWx1ZXMob2JqKTtcbiAgICAgICAgYW5zID0gWy4uLmFucywgLi4uYXJyYXldO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYW5zO1xuICAgIH1cbn1cbiJdfQ==","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==","// 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":["isNil","x","insertSmaller","distancesAr","indexes","num","index","length","newPosition","findIndex","v","pop","splice","Float32Array","assert","condition","message","Error","vectorDistanceMetricsMethods","Euclidean","p","q","result","len","i","Math","pow","sqrt","stringDistanceMetricsMethods","Levenshtein","JaroWinkler","Manhattan","s1","s2","dist","Onehot","bitArrayDistanceMetricsMethods","Tanimoto","Dice","Asymmetric","BraunBlanquet","Cosine","Kulczynski","McConnaughey","RogotGoldberg","Russel","Sokal","Hamming","intArrayDistanceMetricsMethods","TanimotoIntArray","numberDistanceMetricsMethods","Difference","numberArrayDistanceMetrics","CommonItems","AvailableMetrics","Vector","String","BitArray","MacroMolecule","HAMMING","LEVENSHTEIN","NEEDLEMANN_WUNSCH","MONOMER_CHEMICAL_DISTANCE","Number","IntArray","NumberArray","MetricToDataType","Object","keys","reduce","ret","key","val","Measure","constructor","method","this","dataType","metricNeedsArgs","toString","name","isNumberArrayMetric","getMeasure","opts","dict","hasOwnProperty","static","availableMeasures","DistanceMatrixService","useConcurrentWorkers","terminateOnComplete","threadCount","navigator","hardwareConcurrency","_workerCount","max","_workers","Array","fill","map","Worker","URL","_terminateOnComplete","async","values","fnName","normalize","calcMulti","MANHATTAN","fnNames","weights","aggregationMethod","Promise","resolve","reject","promises","totalLength","min","chunkSize","distanceMatrix","endRow","endCol","lmin","lmax","MIN_VALUE","start","floor","end","startRow","startCol","postMessage","chunckSize","resolveWorker","rejectWorker","onmessage","data","error","distanceMatrixData","setTimeout","terminate","set","all","forEach","value","e","worker","tauRandInt","n","random","tauRand","empty","output","push","undefined","range","_","filled","zeros","mean","input","sum","rejectionSample","nSamples","poolSize","rejectSample","j","broken","k","reshape2d","a","b","rows","col","makeHeap","nPoints","size","makeArrays","fillValue","heap","Infinity","heapPush","row","weight","flag","indices","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","cols","dims","entries","Map","nRows","nCols","checkDims","makeKey","has","get","defaultValue","getAll","ordered","rowColValues","sort","getDims","getRows","from","_key","getCols","getValues","fn","vals","toArray","matrix","oldRows","oldCols","oldVals","matlen","Int32Array","pairwiseMultiply","elementWise","y","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","abs","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","newData","newMatrix","column","interval","round","l","matrix1","matrix2","checkMatrix","isMatrix","klass","apply","callback","to2DArray","copy","toJSON","isRowVector","isColumnVector","isVector","isSquare","isSymmetric","isEchelonForm","previousColumn","checked","isReducedEchelonForm","echelonForm","clone","h","iMax","swapRows","tmp","reducedEchelonForm","maxRow","pivot","setSubMatrix","neg","mulS","getRow","getRowVector","rowVector","setRow","row1","row2","temp","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","other","Bcolj","Float64Array","s","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","and","andS","andM","or","orS","orM","xor","xorS","xorM","leftShift","leftShiftS","leftShiftM","signPropagatingRightShift","signPropagatingRightShiftS","signPropagatingRightShiftM","rightShift","rightShiftS","rightShiftM","zeroFillRightShift","zeroFillRightShiftS","zeroFillRightShiftM","not","acos","acosh","asin","asinh","atan","atanh","cbrt","clz32","cos","cosh","expm1","fround","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","count","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","neighbors","learningRate","localConnectivity","nComponents","nEpochs","negativeSampleRate","repulsionStrength","setOpMixRatio","spread","transformQueueSize","targetMetric","targetWeight","targetNNeighbors","distanceFn","numeric","isInitialized","rpForest","embedding","optimizationState","OptimizationState","setParam","fit","initializeFit","optimizeLayout","optimizeLayoutAsync","setSupervisedProjection","setPrecomputedKNN","knnIndices","knnDistances","getNEpochs","knnResults","nearestNeighbors","graph","fuzzySimplicialSet","makeSearchFns","searchGraph","makeSearchGraph","processGraphForSupervisedProjection","head","tail","epochsPerSample","initializeSimplicialSetEmbedding","initializeOptimization","prepareForOptimizationLoop","initFromTree","initFromRandom","queryPoints","_heap","_tree","search","initialization","tried","vertex","candidates","candidate","knn","distances","neighbor","distance","transform","toTransform","rawData","init","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","err","clipValue","TSNE","getopt","opt","field","defaultval","gaussRandom","returnV","vValue","u","randn","mu","std","ArrayBuffer","arr","randn2d","uses","l2","x1","x2","D","x1i","x2i","xtod","N","getIterSize","rowSize","d2p","perplexity","indexer","hTarget","P","prow","betamin","betamax","beta","done","maxtries","pj","nHere","pOut","N2","epsilon","initDataRaw","dists","initSolution","initDataDist","time","timeEnd","gains","ystep","getSolution","cg","costGrad","cost","grad","ymean","gid","sid","gainid","newgain","newsid","debugGrad","yold","cg0","cg1","analytic","numerical","pmul","quArr","qsum","qu","prev","Q","premult","MultiColumnReducer","TSNEReducer","randomSeed","Date","randomFn","reducer","distanceFnames","distanceFns","distanceFnArgs","progressFunc","matrixService","UMAPReducer","vectors","_parallelDistanceWorkers","knnRes","multiColumnKNN","knnIndexes","fitAsync","epoc","AvailableReducers","MultiColDimReducer","metrics","distanceAggregation","measures","measure","bitArrayLength","_length","_data","typeName","availableMethods","availableMetrics","obj","epochNum","epochsLength","self","columnsData","distanceMetrics","onMessage","alea","xor128","xorwow","xorshift7","xor4096","tychei","sr","module","exports","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","mask","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":""}